From 39a0db6ecf1d9a899d935c354f1d8fa96b4ffb0a Mon Sep 17 00:00:00 2001 From: zeripath Date: Wed, 27 Apr 2022 09:05:52 +0100 Subject: [PATCH] Prevent dangling archiver goroutine (#19516) (#19526) Backport #19516 Within doArchive there is a service goroutine that performs the archiving function. This goroutine reports its error using a `chan error` called `done`. Prior to this PR this channel had 0 capacity meaning that the goroutine would block until the `done` channel was cleared - however there are a couple of ways in which this channel might not be read. The simplest solution is to add a single space of capacity to the goroutine which will mean that the goroutine will always complete and even if the `done` channel is not read it will be simply garbage collected away. (The PR also contains two other places when setting up the indexers which do not leak but where the blocking of the sending goroutine is also unnecessary and so we should just add a small amount of capacity and let the sending goroutine complete as soon as it can.) Signed-off-by: Andrew Thornton Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: 6543 <6543@obermui.de> --- modules/indexer/code/indexer.go | 2 +- modules/indexer/issues/indexer.go | 2 +- services/repository/archiver/archiver.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/indexer/code/indexer.go b/modules/indexer/code/indexer.go index a616d0e66..983f4843a 100644 --- a/modules/indexer/code/indexer.go +++ b/modules/indexer/code/indexer.go @@ -130,7 +130,7 @@ func Init() { log.Info("PID: %d Repository Indexer closed", os.Getpid()) }) - waitChannel := make(chan time.Duration) + waitChannel := make(chan time.Duration, 1) // Create the Queue switch setting.Indexer.RepoType { diff --git a/modules/indexer/issues/indexer.go b/modules/indexer/issues/indexer.go index 6aa4d8185..d7f738652 100644 --- a/modules/indexer/issues/indexer.go +++ b/modules/indexer/issues/indexer.go @@ -98,7 +98,7 @@ var ( // InitIssueIndexer initialize issue indexer, syncReindex is true then reindex until // all issue index done. func InitIssueIndexer(syncReindex bool) { - waitChannel := make(chan time.Duration) + waitChannel := make(chan time.Duration, 1) // Create the Queue switch setting.Indexer.IssueType { diff --git a/services/repository/archiver/archiver.go b/services/repository/archiver/archiver.go index 16ee532f7..7f0390b50 100644 --- a/services/repository/archiver/archiver.go +++ b/services/repository/archiver/archiver.go @@ -169,7 +169,7 @@ func doArchive(r *ArchiveRequest) (*repo_model.RepoArchiver, error) { w.Close() rd.Close() }() - var done = make(chan error) + done := make(chan error, 1) // Ensure that there is some capacity which will ensure that the goroutine below can always finish repo, err := repo_model.GetRepositoryByID(archiver.RepoID) if err != nil { return nil, fmt.Errorf("archiver.LoadRepo failed: %v", err)