From 1465e0cbb2f9fc5927be51e9be39b4c9bfd6f464 Mon Sep 17 00:00:00 2001 From: Gusted Date: Wed, 27 Apr 2022 15:32:28 +0000 Subject: [PATCH] Fix 64-bit atomic operations on 32-bit machines (#19531) (#19532) - Backport #19531 - Doing 64-bit atomic operations on 32-bit machines is a bit tricky by golang, as they can only be done under certain set of conditions(https://pkg.go.dev/sync/atomic#pkg-note-BUG). - This PR fixes such case whereby the conditions weren't met, it moves the int64 to the first field of the struct, which will 64-bit operations happening on this property on 32-bit machines. - Resolves #19518 --- modules/queue/workerpool.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/queue/workerpool.go b/modules/queue/workerpool.go index 37d518aa8..5f52fef58 100644 --- a/modules/queue/workerpool.go +++ b/modules/queue/workerpool.go @@ -19,6 +19,10 @@ import ( // they use to detect if there is a block and will grow and shrink in // response to demand as per configuration. type WorkerPool struct { + // This field requires to be the first one in the struct. + // This is to allow 64 bit atomic operations on 32-bit machines. + // See: https://pkg.go.dev/sync/atomic#pkg-note-BUG & Gitea issue 19518 + numInQueue int64 lock sync.Mutex baseCtx context.Context baseCtxCancel context.CancelFunc @@ -32,7 +36,6 @@ type WorkerPool struct { blockTimeout time.Duration boostTimeout time.Duration boostWorkers int - numInQueue int64 } // WorkerPoolConfiguration is the basic configuration for a WorkerPool