diff --git a/src/ripple/app/ledger/LedgerMaster.h b/src/ripple/app/ledger/LedgerMaster.h index a97332ade..50f67befa 100644 --- a/src/ripple/app/ledger/LedgerMaster.h +++ b/src/ripple/app/ledger/LedgerMaster.h @@ -337,6 +337,8 @@ private: int mPathFindThread {0}; // Pathfinder jobs dispatched bool mPathFindNewRequest {false}; + std::atomic_flag mGotFetchPackThread = ATOMIC_FLAG_INIT; // GotFetchPack jobs dispatched + std::atomic mPubLedgerClose {0}; std::atomic mPubLedgerSeq {0}; std::atomic mValidLedgerSign {0}; diff --git a/src/ripple/app/ledger/impl/LedgerMaster.cpp b/src/ripple/app/ledger/impl/LedgerMaster.cpp index 8569bcc19..0768022a8 100644 --- a/src/ripple/app/ledger/impl/LedgerMaster.cpp +++ b/src/ripple/app/ledger/impl/LedgerMaster.cpp @@ -1790,13 +1790,16 @@ LedgerMaster::gotFetchPack ( bool progress, std::uint32_t seq) { - // FIXME: Calling this function more than once will result in - // InboundLedgers::gotFetchPack being called more than once - // which is expensive. A flag should track whether we've already dispatched - - app_.getJobQueue().addJob ( - jtLEDGER_DATA, "gotFetchPack", - [&] (Job&) { app_.getInboundLedgers().gotFetchPack(); }); + if (!mGotFetchPackThread.test_and_set(std::memory_order_acquire)) + { + app_.getJobQueue().addJob ( + jtLEDGER_DATA, "gotFetchPack", + [&] (Job&) + { + app_.getInboundLedgers().gotFetchPack(); + mGotFetchPackThread.clear(std::memory_order_release); + }); + } } void