arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
Fix timers resetting in coordinator loops
Eduard S eduard@iden3.io
Tue, 16 Feb 2021 16:43:27 +0100
commit

264f01b5721abe5ac6346bd39d0a2716f096c26d

parent

a21793b2b0786e5a0b3d39dfdeabb5c8de3dbe5d

M coordinator/coordinator.go → coordinator/coordinator.go

@@ -494,7 +494,7 @@ }()

c.wg.Add(1) go func() { - waitDuration := longWaitDuration + waitCh := time.After(longWaitDuration) for { select { case <-c.ctx.Done():

@@ -506,23 +506,24 @@ if err := c.handleMsg(c.ctx, msg); c.ctx.Err() != nil {

continue } else if err != nil { log.Errorw("Coordinator.handleMsg", "err", err) - waitDuration = c.cfg.SyncRetryInterval + waitCh = time.After(c.cfg.SyncRetryInterval) continue } - waitDuration = longWaitDuration - case <-time.After(waitDuration): + waitCh = time.After(longWaitDuration) + case <-waitCh: if !c.stats.Synced() { - waitDuration = longWaitDuration + waitCh = time.After(longWaitDuration) continue } if err := c.syncStats(c.ctx, &c.stats); c.ctx.Err() != nil { + waitCh = time.After(longWaitDuration) continue } else if err != nil { log.Errorw("Coordinator.syncStats", "err", err) - waitDuration = c.cfg.SyncRetryInterval + waitCh = time.After(c.cfg.SyncRetryInterval) continue } - waitDuration = longWaitDuration + waitCh = time.After(longWaitDuration) } } }()
M coordinator/pipeline.go → coordinator/pipeline.go

@@ -253,7 +253,7 @@ batchChSentServerProof := make(chan *BatchInfo, queueSize)

p.wg.Add(1) go func() { - waitDuration := zeroDuration + waitCh := time.After(zeroDuration) for { select { case <-p.ctx.Done():

@@ -263,31 +263,32 @@ return

case statsVars := <-p.statsVarsCh: p.stats = statsVars.Stats p.syncSCVars(statsVars.Vars) - case <-time.After(waitDuration): + case <-waitCh: // Once errAtBatchNum != 0, we stop forging // batches because there's been an error and we // wait for the pipeline to be stopped. if p.getErrAtBatchNum() != 0 { - waitDuration = p.cfg.ForgeRetryInterval + waitCh = time.After(p.cfg.ForgeRetryInterval) continue } batchNum = p.state.batchNum + 1 batchInfo, err := p.handleForgeBatch(p.ctx, batchNum) if p.ctx.Err() != nil { + waitCh = time.After(p.cfg.ForgeRetryInterval) continue } else if tracerr.Unwrap(err) == errLastL1BatchNotSynced || tracerr.Unwrap(err) == errForgeNoTxsBeforeDelay || tracerr.Unwrap(err) == errForgeBeforeDelay { - waitDuration = p.cfg.ForgeRetryInterval + waitCh = time.After(p.cfg.ForgeRetryInterval) continue } else if err != nil { p.setErrAtBatchNum(batchNum) - waitDuration = p.cfg.ForgeRetryInterval p.coord.SendMsg(p.ctx, MsgStopPipeline{ Reason: fmt.Sprintf( "Pipeline.handleForgBatch: %v", err), FailedBatchNum: batchNum, }) + waitCh = time.After(p.cfg.ForgeRetryInterval) continue } p.lastForgeTime = time.Now()

@@ -297,6 +298,7 @@ select {

case batchChSentServerProof <- batchInfo: case <-p.ctx.Done(): } + waitCh = time.After(zeroDuration) } } }()
M coordinator/txmanager.go → coordinator/txmanager.go

@@ -416,7 +416,7 @@ // }

// Run the TxManager func (t *TxManager) Run(ctx context.Context) { - waitDuration := longWaitDuration + waitCh := time.After(longWaitDuration) var statsVars statsVars select {

@@ -471,11 +471,11 @@ Reason: fmt.Sprintf("forgeBatch send: %v", err)})

continue } t.queue.Push(batchInfo) - waitDuration = t.cfg.TxManagerCheckInterval - case <-time.After(waitDuration): + waitCh = time.After(t.cfg.TxManagerCheckInterval) + case <-waitCh: queuePosition, batchInfo := t.queue.Next() if batchInfo == nil { - waitDuration = longWaitDuration + waitCh = time.After(longWaitDuration) continue } if err := t.checkEthTransactionReceipt(ctx, batchInfo); ctx.Err() != nil {
M test/proofserver/proofserver.go → test/proofserver/proofserver.go

@@ -145,7 +145,7 @@

// const provingDuration = 2 * time.Second func (s *Mock) runProver(ctx context.Context) { - waitDuration := longWaitDuration + waitCh := time.After(longWaitDuration) for { select { case <-ctx.Done():

@@ -153,21 +153,21 @@ return

case msg := <-s.msgCh: switch msg.value { case "cancel": - waitDuration = longWaitDuration + waitCh = time.After(longWaitDuration) s.Lock() if !s.status.IsReady() { s.status = prover.StatusCodeAborted } s.Unlock() case "prove": - waitDuration = s.provingDuration + waitCh = time.After(s.provingDuration) s.Lock() s.status = prover.StatusCodeBusy s.Unlock() } msg.ackCh <- true - case <-time.After(waitDuration): - waitDuration = longWaitDuration + case <-waitCh: + waitCh = time.After(longWaitDuration) s.Lock() if s.status != prover.StatusCodeBusy { s.Unlock()