diff --git a/src/ripple/app/rdb/backend/RWDBDatabase.h b/src/ripple/app/rdb/backend/RWDBDatabase.h index 3981691bc..7f335ef8c 100644 --- a/src/ripple/app/rdb/backend/RWDBDatabase.h +++ b/src/ripple/app/rdb/backend/RWDBDatabase.h @@ -65,9 +65,17 @@ public: return {}; std::shared_lock lock(mutex_); + LedgerIndex minSeq = std::numeric_limits::max(); if (transactionMap_.empty()) return std::nullopt; - return transactionMap_.begin()->second.second->getLgrSeq(); + for (const auto& [_, txMeta] : transactionMap_) + { + if (txMeta.second && txMeta.second->getLgrSeq() < minSeq) + minSeq = txMeta.second->getLgrSeq(); + } + return minSeq == std::numeric_limits::max() + ? std::nullopt + : std::optional(minSeq); } std::optional diff --git a/src/test/app/SHAMapStore_test.cpp b/src/test/app/SHAMapStore_test.cpp index 010c83a42..8a3ca0f89 100644 --- a/src/test/app/SHAMapStore_test.cpp +++ b/src/test/app/SHAMapStore_test.cpp @@ -216,6 +216,10 @@ public: } BEAST_EXPECT(store.getLastRotated() == lastRotated); + SQLiteDatabase* const db = + dynamic_cast(&env.app().getRelationalDatabase()); + BEAST_EXPECT(*db->getTransactionsMinLedgerSeq() == 3); + for (auto i = 3; i < deleteInterval + lastRotated; ++i) { ledgers.emplace(