From d10dba6b2e34112722e5135211ebc14a1ca126c1 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 26 Sep 2013 15:19:26 -0700 Subject: [PATCH] Fix a case where the AcceptedLedger constructor throws --- src/ripple_app/ledger/Ledger.cpp | 15 ++++++++++++++- src/ripple_app/ledger/LedgerMaster.cpp | 6 ++++++ src/ripple_app/ledger/LedgerMaster.h | 2 ++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/ripple_app/ledger/Ledger.cpp b/src/ripple_app/ledger/Ledger.cpp index 55e247770..dd22c090c 100644 --- a/src/ripple_app/ledger/Ledger.cpp +++ b/src/ripple_app/ledger/Ledger.cpp @@ -576,7 +576,20 @@ void Ledger::saveValidatedLedger (bool current) getApp().getNodeStore ().store (hotLEDGER, mLedgerSeq, s.modData (), mHash); } - AcceptedLedger::pointer aLedger = AcceptedLedger::makeAcceptedLedger (shared_from_this ()); + AcceptedLedger::pointer aLedger; + try + { + aLedger = AcceptedLedger::makeAcceptedLedger (shared_from_this ()); + } + catch (...) + { + WriteLog (lsWARNING, Ledger) << "An accepted ledger was missing nodes"; + getApp().getLedgerMaster().failedSave(mLedgerSeq, mHash); + { // Clients can now trust the database for information about this ledger sequence + StaticScopedLockType sl (sPendingSaveLock, __FILE__, __LINE__); + sPendingSaves.erase(getLedgerSeq()); + } + } { DeprecatedScopedLock sl (getApp().getLedgerDB ()->getDBLock ()); diff --git a/src/ripple_app/ledger/LedgerMaster.cpp b/src/ripple_app/ledger/LedgerMaster.cpp index e0e1212b8..143bb75d9 100644 --- a/src/ripple_app/ledger/LedgerMaster.cpp +++ b/src/ripple_app/ledger/LedgerMaster.cpp @@ -532,6 +532,12 @@ void LedgerMaster::setFullLedger (Ledger::pointer ledger, bool isSynchronous, bo //-------------------------------------------------------------------------- } +void LedgerMaster::failedSave(uint32 seq, uint256 const& hash) +{ + clearLedger(seq); + getApp().getInboundLedgers().findCreate(hash, seq, true); +} + void LedgerMaster::checkAccept (uint256 const& hash) { Ledger::pointer ledger = mLedgerHistory.getLedgerByHash (hash); diff --git a/src/ripple_app/ledger/LedgerMaster.h b/src/ripple_app/ledger/LedgerMaster.h index 78c00e817..e4d27ad16 100644 --- a/src/ripple_app/ledger/LedgerMaster.h +++ b/src/ripple_app/ledger/LedgerMaster.h @@ -119,6 +119,8 @@ public: void switchLedgers (Ledger::pointer lastClosed, Ledger::pointer newCurrent); + void failedSave(uint32 seq, uint256 const& hash); + std::string getCompleteLedgers () { ScopedLockType sl (mCompleteLock, __FILE__, __LINE__);