..
ipfs-cluster的retries设计:以CommitOp为例
ipfs-cluster 中的共识部分,多处用到了 retires 的设计,以 CommitOp 为例看下代码:
func (cc *Consensus) commit(ctx context.Context, op *LogOp, rpcOp string, redirectArg interface{}) error {
var finalErr error
for i := 0; i <= cc.config.CommitRetries; i++ {
cc.shutdownLock.RLock() // do not shut down while committing
_, finalErr = cc.consensus.CommitOp(op)
cc.shutdownLock.RUnlock()
if finalErr != nil {
goto RETRY
}
break
RETRY:
time.Sleep(cc.config.CommitRetryDelay)
}
return finalErr
}
上面就是删掉无关的、简化后的代码。
-
CommitRetries
从配置文件中获取到 retires 的次数进行遍历。 -
goto RETRY
CommitOp 失败后,使用 goto 跳转到 RETRY label。 -
RETRY
在该 label 下,有一个 Delay 的时间设置,定时器结束后重新发起 commit 操作。
其他地方,包括: AddPeer、RmPeer、redirectToLeader等方法。
Nothing