From 312e476898a874e453f510dde545844b7b12d133 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 27 Feb 2013 18:23:24 -0800 Subject: [PATCH] Fix a bug where a cached copy of a txn might not have a reference to the ledger it was applied in, causing commands like 'tx' not to return metadata. --- src/cpp/ripple/Ledger.cpp | 2 ++ src/cpp/ripple/TransactionMaster.cpp | 15 +++++++++++++-- src/cpp/ripple/TransactionMaster.h | 1 + 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/cpp/ripple/Ledger.cpp b/src/cpp/ripple/Ledger.cpp index 609f08787e..a43d2bee44 100644 --- a/src/cpp/ripple/Ledger.cpp +++ b/src/cpp/ripple/Ledger.cpp @@ -451,9 +451,11 @@ void Ledger::saveAcceptedLedger(bool fromConsensus, LoadEvent::pointer event) std::string escMeta(sqlEscape(rawMeta.peekData())); SerializerIterator txnIt(rawTxn); + SerializedTransaction txn(txnIt); assert(txn.getTransactionID() == item->getTag()); TransactionMetaSet meta(item->getTag(), mLedgerSeq, rawMeta.peekData()); + theApp->getMasterTransaction().inLedger(item->getTag(), mLedgerSeq); // Make sure transaction is in AccountTransactions. if (!SQL_EXISTS(db, boost::str(AcctTransExists % item->getTag().GetHex()))) diff --git a/src/cpp/ripple/TransactionMaster.cpp b/src/cpp/ripple/TransactionMaster.cpp index d92aa5e90c..3c79913509 100644 --- a/src/cpp/ripple/TransactionMaster.cpp +++ b/src/cpp/ripple/TransactionMaster.cpp @@ -18,13 +18,24 @@ TransactionMaster::TransactionMaster() : mCache("TransactionCache", CACHED_TRANS ; } +bool TransactionMaster::inLedger(const uint256& hash, uint32 ledger) +{ + Transaction::pointer txn = mCache.fetch(hash); + if (!txn) + return false; + txn->setStatus(COMMITTED, ledger); + return true; +} + Transaction::pointer TransactionMaster::fetch(const uint256& txnID, bool checkDisk) { Transaction::pointer txn = mCache.fetch(txnID); - if (!checkDisk || txn) return txn; + if (!checkDisk || txn) + return txn; txn = Transaction::load(txnID); - if (!txn) return txn; + if (!txn) + return txn; mCache.canonicalize(txnID, txn); diff --git a/src/cpp/ripple/TransactionMaster.h b/src/cpp/ripple/TransactionMaster.h index 2db5eb1701..59b486280d 100644 --- a/src/cpp/ripple/TransactionMaster.h +++ b/src/cpp/ripple/TransactionMaster.h @@ -20,6 +20,7 @@ public: bool checkDisk, uint32 uCommitLedger); // return value: true = we had the transaction already + bool inLedger(const uint256& hash, uint32 ledger); bool canonicalize(Transaction::pointer& txn, bool maybeNew); void sweep(void) { mCache.sweep(); } };