From 8f39f7698ed5a8b28f72090e333f2adc504a9d7c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 24 Jun 2026 21:00:21 +0000 Subject: [PATCH 1/2] Initial plan From 8c384b72f97c58772d8e285af5a983e9cc85855a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 24 Jun 2026 21:09:17 +0000 Subject: [PATCH 2/2] Avoid clearing store flags on rollback Co-authored-by: achamayou <4016369+achamayou@users.noreply.github.com> --- src/kv/store.h | 1 - src/kv/test/kv_test.cpp | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/kv/store.h b/src/kv/store.h index 3bfd840829de..52213a6f806d 100644 --- a/src/kv/store.h +++ b/src/kv/store.h @@ -647,7 +647,6 @@ namespace ccf::kv // In practice rollback is only called at signature seqnos, so // clamping here restores the latest committable entry last_committable = std::min(last_committable, tx_id.seqno); - unset_flag_unsafe(StoreFlag::SNAPSHOT_AT_NEXT_SIGNATURE); rollback_count++; pending_txs.clear(); auto e = get_encryptor(); diff --git a/src/kv/test/kv_test.cpp b/src/kv/test/kv_test.cpp index a356b968e6d1..5b9ce5a4cc0b 100644 --- a/src/kv/test/kv_test.cpp +++ b/src/kv/test/kv_test.cpp @@ -3512,6 +3512,24 @@ TEST_CASE("Ledger entry chunk request") store.set_flag( ccf::kv::AbstractStore::StoreFlag::SNAPSHOT_AT_NEXT_SIGNATURE); + INFO("Roll back a transaction without clearing the snapshot flag"); + { + MapTypes::StringString map("public:map"); + auto tx = store.create_tx(); + + auto h1 = tx.rw(map); + h1->put("key", "value"); + REQUIRE(tx.commit() == ccf::kv::CommitResult::SUCCESS); + + store.rollback( + {store.commit_view(), store.current_version() - 1}, + store.commit_view()); + + REQUIRE(store.flag_enabled( + ccf::kv::AbstractStore::StoreFlag::SNAPSHOT_AT_NEXT_SIGNATURE)); + REQUIRE(store.should_create_ledger_chunk(store.current_version())); + } + INFO("Add a signature that triggers a snapshot"); { auto txid = store.next_txid();