From 221c1f065010515fd732f504f4b23214b72736d6 Mon Sep 17 00:00:00 2001 From: Kushal Babel Date: Thu, 11 Apr 2024 00:46:02 +0530 Subject: [PATCH 1/2] Avoid race condition on conditional variable cannot assume that the if condition is true when Wait returns. best to check in a while loop to avoid race condition. --- services/api/blocksim_ratelimiter.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/api/blocksim_ratelimiter.go b/services/api/blocksim_ratelimiter.go index 51296b54..5f4a595c 100644 --- a/services/api/blocksim_ratelimiter.go +++ b/services/api/blocksim_ratelimiter.go @@ -55,7 +55,7 @@ func NewBlockSimulationRateLimiter(blockSimURL string) *BlockSimulationRateLimit func (b *BlockSimulationRateLimiter) Send(context context.Context, payload *common.BuilderBlockValidationRequest, isHighPrio, fastTrack bool) (requestErr, validationErr error) { b.cv.L.Lock() cnt := atomic.AddInt64(&b.counter, 1) - if maxConcurrentBlocks > 0 && cnt > maxConcurrentBlocks { + for maxConcurrentBlocks > 0 && cnt > maxConcurrentBlocks { b.cv.Wait() } b.cv.L.Unlock() From 9a680960fa65449156a692e082bcaee3793c1010 Mon Sep 17 00:00:00 2001 From: Kushal Babel Date: Thu, 11 Apr 2024 03:08:37 +0530 Subject: [PATCH 2/2] read the atomic counter again after waking up on cond var --- services/api/blocksim_ratelimiter.go | 1 + 1 file changed, 1 insertion(+) diff --git a/services/api/blocksim_ratelimiter.go b/services/api/blocksim_ratelimiter.go index 5f4a595c..2f81a6c8 100644 --- a/services/api/blocksim_ratelimiter.go +++ b/services/api/blocksim_ratelimiter.go @@ -57,6 +57,7 @@ func (b *BlockSimulationRateLimiter) Send(context context.Context, payload *comm cnt := atomic.AddInt64(&b.counter, 1) for maxConcurrentBlocks > 0 && cnt > maxConcurrentBlocks { b.cv.Wait() + cnt = atomic.LoadInt64(&b.counter) } b.cv.L.Unlock()