From 5a3ef953ebe37651064fbf56a2c120998e2a0a2c Mon Sep 17 00:00:00 2001 From: Benjamin Wang Date: Fri, 11 Nov 2022 10:57:15 +0800 Subject: [PATCH] etcdserver: call the OnPreCommitUnsafe in unsafeCommit `unsafeCommit` is called by both `(*batchTxBuffered) commit` and `(*backend) defrag`. When users perform the defragmentation operation, etcd doesn't update the consistent index. If etcd crashes(e.g. panicking) in the process for whatever reason, then etcd replays the WAL entries starting from the latest snapshot, accordingly it may re-apply entries which might have already been applied, eventually the revision isn't consistent with other members. Refer to discussion in https://github.com/etcd-io/etcd/pull/14685 Signed-off-by: Benjamin Wang --- server/storage/backend/batch_tx.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server/storage/backend/batch_tx.go b/server/storage/backend/batch_tx.go index c8fa55954..4ee05810f 100644 --- a/server/storage/backend/batch_tx.go +++ b/server/storage/backend/batch_tx.go @@ -329,10 +329,6 @@ func (t *batchTxBuffered) CommitAndStop() { } func (t *batchTxBuffered) commit(stop bool) { - if t.backend.hooks != nil { - t.backend.hooks.OnPreCommitUnsafe(t) - } - // all read txs must be closed to acquire boltdb commit rwlock t.backend.readTx.Lock() t.unsafeCommit(stop) @@ -340,6 +336,10 @@ func (t *batchTxBuffered) commit(stop bool) { } func (t *batchTxBuffered) unsafeCommit(stop bool) { + if t.backend.hooks != nil { + t.backend.hooks.OnPreCommitUnsafe(t) + } + if t.backend.readTx.tx != nil { // wait all store read transactions using the current boltdb tx to finish, // then close the boltdb tx