..

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