@ -85,6 +85,10 @@ type Config struct {
// SyncRetryInterval is the waiting interval between calls to the main
// SyncRetryInterval is the waiting interval between calls to the main
// handler of a synced block after an error
// handler of a synced block after an error
SyncRetryInterval time . Duration
SyncRetryInterval time . Duration
// PurgeByExtDelInterval is the waiting interval between calls
// to the PurgeByExternalDelete function of the l2db which deletes
// pending txs externally marked by the column `external_delete`
PurgeByExtDelInterval time . Duration
// EthClientAttemptsDelay is delay between attempts do do an eth client
// EthClientAttemptsDelay is delay between attempts do do an eth client
// RPC call
// RPC call
EthClientAttemptsDelay time . Duration
EthClientAttemptsDelay time . Duration
@ -153,6 +157,15 @@ type Coordinator struct {
wg sync . WaitGroup
wg sync . WaitGroup
cancel context . CancelFunc
cancel context . CancelFunc
// mutexL2DBUpdateDelete protects updates to the L2DB so that
// these two processes always happen exclusively:
// - Pipeline taking pending txs, running through the TxProcessor and
// marking selected txs as forging
// - Coordinator deleting pending txs that have been marked with
// `external_delete`.
// Without this mutex, the coordinator could delete a pending txs that
// has just been selected by the TxProcessor in the pipeline.
mutexL2DBUpdateDelete sync . Mutex
pipeline * Pipeline
pipeline * Pipeline
lastNonFailedBatchNum common . BatchNum
lastNonFailedBatchNum common . BatchNum
@ -248,7 +261,8 @@ func (c *Coordinator) BatchBuilder() *batchbuilder.BatchBuilder {
func ( c * Coordinator ) newPipeline ( ctx context . Context ) ( * Pipeline , error ) {
func ( c * Coordinator ) newPipeline ( ctx context . Context ) ( * Pipeline , error ) {
c . pipelineNum ++
c . pipelineNum ++
return NewPipeline ( ctx , c . cfg , c . pipelineNum , c . historyDB , c . l2DB , c . txSelector ,
return NewPipeline ( ctx , c . cfg , c . pipelineNum , c . historyDB , c . l2DB , c . txSelector ,
c . batchBuilder , c . purger , c , c . txManager , c . provers , & c . consts )
c . batchBuilder , & c . mutexL2DBUpdateDelete , c . purger , c , c . txManager ,
c . provers , & c . consts )
}
}
// MsgSyncBlock indicates an update to the Synchronizer stats
// MsgSyncBlock indicates an update to the Synchronizer stats
@ -527,6 +541,24 @@ func (c *Coordinator) Start() {
}
}
}
}
} ( )
} ( )
c . wg . Add ( 1 )
go func ( ) {
for {
select {
case <- c . ctx . Done ( ) :
log . Info ( "Coordinator L2DB.PurgeByExternalDelete loop done" )
c . wg . Done ( )
return
case <- time . After ( c . cfg . PurgeByExtDelInterval ) :
c . mutexL2DBUpdateDelete . Lock ( )
if err := c . l2DB . PurgeByExternalDelete ( ) ; err != nil {
log . Errorw ( "L2DB.PurgeByExternalDelete" , "err" , err )
}
c . mutexL2DBUpdateDelete . Unlock ( )
}
}
} ( )
}
}
const stopCtxTimeout = 200 * time . Millisecond
const stopCtxTimeout = 200 * time . Millisecond