You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fluss.apache.org by yu...@apache.org on 2026/05/08 05:40:23 UTC
(fluss) branch main updated: [kv] Fix flaky KvTabletSnapshotTargetTest.testAddToSnapshotToStoreFail (#3264)
This is an automated email from the ASF dual-hosted git repository.
swuferhong pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fluss.git
The following commit(s) were added to refs/heads/main by this push:
new e3a48fd17 [kv] Fix flaky KvTabletSnapshotTargetTest.testAddToSnapshotToStoreFail (#3264)
e3a48fd17 is described below
commit e3a48fd173ef76607fe30f43bb93bdb744e6fd2e
Author: Kaixuan Duan <98...@users.noreply.github.com>
AuthorDate: Fri May 8 13:40:19 2026 +0800
[kv] Fix flaky KvTabletSnapshotTargetTest.testAddToSnapshotToStoreFail (#3264)
---
.../server/kv/snapshot/KvTabletSnapshotTarget.java | 28 +++++++++++++++-------
1 file changed, 19 insertions(+), 9 deletions(-)
diff --git a/fluss-server/src/main/java/org/apache/fluss/server/kv/snapshot/KvTabletSnapshotTarget.java b/fluss-server/src/main/java/org/apache/fluss/server/kv/snapshot/KvTabletSnapshotTarget.java
index e3e8ede43..fe4591dc7 100644
--- a/fluss-server/src/main/java/org/apache/fluss/server/kv/snapshot/KvTabletSnapshotTarget.java
+++ b/fluss-server/src/main/java/org/apache/fluss/server/kv/snapshot/KvTabletSnapshotTarget.java
@@ -270,18 +270,28 @@ public class KvTabletSnapshotTarget implements PeriodicSnapshotManager.SnapshotT
}
/**
- * Update local state after successful snapshot completion. This includes notifying RocksDB
- * about completion, updating latest snapshot offset/size, and notifying LogTablet about the
- * minimum offset to retain.
+ * Update local state after successful snapshot completion. This includes updating latest
+ * snapshot offset/size, notifying LogTablet about the minimum offset to retain, and finally
+ * notifying RocksDB about completion.
+ *
+ * <p>Order matters: outward-visible state (offset/size + {@code updateMinRetainOffset}
+ * callback) MUST be updated before {@link RocksIncrementalSnapshot#notifySnapshotComplete},
+ * otherwise observers waiting on {@code lastCompletedSnapshotId} may see the completion signal
+ * before the outward state catches up — see FLUSS-2624. The {@code finally} block also
+ * guarantees the internal SST bookkeeping cleanup runs even if any outward update throws.
*/
private void updateStateOnCommitSuccess(long snapshotId, SnapshotResult snapshotResult) {
long flushedLogOffset = snapshotResult.getTabletState().getFlushedLogOffset();
- // notify the snapshot complete
- rocksIncrementalSnapshot.notifySnapshotComplete(snapshotId);
- logOffsetOfLatestSnapshot = flushedLogOffset;
- snapshotSize = snapshotResult.getSnapshotSize();
- // update LogTablet to notify the lowest offset that should be retained
- updateMinRetainOffset.accept(flushedLogOffset);
+ try {
+ logOffsetOfLatestSnapshot = flushedLogOffset;
+ snapshotSize = snapshotResult.getSnapshotSize();
+ // update LogTablet to notify the lowest offset that should be retained
+ updateMinRetainOffset.accept(flushedLogOffset);
+ } finally {
+ // notify the snapshot complete (must run last to preserve the ordering contract above,
+ // and run in finally to guarantee internal SST bookkeeping is always cleaned up).
+ rocksIncrementalSnapshot.notifySnapshotComplete(snapshotId);
+ }
}
/**