From 75f1df66dd0fa1452c7f847d2929aaf5786639df Mon Sep 17 00:00:00 2001 From: Wei Fu Date: Thu, 18 Apr 2024 22:50:45 +0800 Subject: [PATCH] server/storage: update currentRev if scheduledCompact > currentRev Signed-off-by: Wei Fu --- server/storage/mvcc/kvstore.go | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/server/storage/mvcc/kvstore.go b/server/storage/mvcc/kvstore.go index 0edf0b72d3b3..206aae0c55be 100644 --- a/server/storage/mvcc/kvstore.go +++ b/server/storage/mvcc/kvstore.go @@ -388,6 +388,17 @@ func (s *store) restore() error { } } + // NOTE: Last compaction could delete all the related revisions but it + // didn't have chance to update it finished state. When revisions in + // [N, `scheduledCompact`] are tombstone, the `currentRev` will be less + // than scheduledCompact. The next following `compactLockfree` call + // will return ErrFutureRev. Since we force-commit scheduledCompact + // rev, it's trusted value. We should update `currentRev` to align with + // `scheduledCompact` just in case that the revision is decreased. + if scheduledCompact != 0 && s.currentRev < scheduledCompact { + s.currentRev = scheduledCompact + } + tx.RUnlock() s.lg.Info("kvstore restored", zap.Int64("current-rev", s.currentRev)) @@ -395,12 +406,12 @@ func (s *store) restore() error { if scheduledCompact != 0 { if _, err := s.compactLockfree(scheduledCompact); err != nil { s.lg.Warn("compaction encountered error", zap.Error(err)) + } else { + s.lg.Info( + "resume scheduled compaction", + zap.Int64("scheduled-compact-revision", scheduledCompact), + ) } - - s.lg.Info( - "resume scheduled compaction", - zap.Int64("scheduled-compact-revision", scheduledCompact), - ) } return nil