From 00551221769ce0f3a1da612c701e3282d244a36c Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 17 Jan 2013 21:08:02 -0800 Subject: [PATCH 1/2] Make sure it's safe to modify acquired ledgers. --- src/cpp/ripple/SHAMapSync.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cpp/ripple/SHAMapSync.cpp b/src/cpp/ripple/SHAMapSync.cpp index 5d99399b0f..41e309eaec 100644 --- a/src/cpp/ripple/SHAMapSync.cpp +++ b/src/cpp/ripple/SHAMapSync.cpp @@ -62,7 +62,7 @@ void SHAMap::getMissingNodes(std::vector& nodeIDs, std::vectorhaveNode(childID, childHash, nodeData)) { SHAMapTreeNode::pointer ptr = - boost::make_shared(childID, nodeData, mSeq, snfPREFIX, childHash); + boost::make_shared(childID, nodeData, mSeq - 1, snfPREFIX, childHash); cLog(lsTRACE) << "Got sync node from cache: " << *d; mTNByID[*ptr] = ptr; d = ptr.get(); @@ -193,7 +193,7 @@ SMAddNode SHAMap::addRootNode(const std::vector& rootNode, SHANod return SMAddNode::okay(); } - SHAMapTreeNode::pointer node = boost::make_shared(SHAMapNode(), rootNode, mSeq, format, uint256()); + SHAMapTreeNode::pointer node = boost::make_shared(SHAMapNode(), rootNode, mSeq - 1, format, uint256()); if (!node) return SMAddNode::invalid(); @@ -231,7 +231,7 @@ SMAddNode SHAMap::addRootNode(const uint256& hash, const std::vector(SHAMapNode(), rootNode, mSeq, format, uint256()); + SHAMapTreeNode::pointer node = boost::make_shared(SHAMapNode(), rootNode, mSeq - 1, format, uint256()); if (!node || node->getNodeHash() != hash) return SMAddNode::invalid(); @@ -308,7 +308,7 @@ SMAddNode SHAMap::addKnownNode(const SHAMapNode& node, const std::vector(node, rawNode, mSeq, snfWIRE, uint256()); + SHAMapTreeNode::pointer newNode = boost::make_shared(node, rawNode, mSeq - 1, snfWIRE, uint256()); if (hash != newNode->getNodeHash()) // these aren't the droids we're looking for return SMAddNode::invalid(); From 8feb9d6c29853e89deb0389317badf5529e01b82 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 17 Jan 2013 21:08:23 -0800 Subject: [PATCH 2/2] Handle an edge case. --- src/cpp/ripple/Ledger.cpp | 43 ++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/src/cpp/ripple/Ledger.cpp b/src/cpp/ripple/Ledger.cpp index 9745e7ba85..2bdf42372e 100644 --- a/src/cpp/ripple/Ledger.cpp +++ b/src/cpp/ripple/Ledger.cpp @@ -415,29 +415,34 @@ void Ledger::saveAcceptedLedger(bool fromConsensus, LoadEvent::pointer event) if (!SQL_EXISTS(db, boost::str(AcctTransExists % item->getTag().GetHex()))) { // Transaction not in AccountTransactions - std::vector accts = meta.getAffectedAccounts(); - - std::string sql = "INSERT INTO AccountTransactions (TransID, Account, LedgerSeq) VALUES "; - bool first = true; - for (std::vector::iterator it = accts.begin(), end = accts.end(); it != end; ++it) + const std::vector accts = meta.getAffectedAccounts(); + if (!accts.empty()) { - if (!first) - sql += ", ('"; - else + + std::string sql = "INSERT INTO AccountTransactions (TransID, Account, LedgerSeq) VALUES "; + bool first = true; + for (std::vector::const_iterator it = accts.begin(), end = accts.end(); it != end; ++it) { - sql += "('"; - first = false; + if (!first) + sql += ", ('"; + else + { + sql += "('"; + first = false; + } + sql += txn.getTransactionID().GetHex(); + sql += "','"; + sql += it->humanAccountID(); + sql += "',"; + sql += boost::lexical_cast(getLedgerSeq()); + sql += ")"; } - sql += txn.getTransactionID().GetHex(); - sql += "','"; - sql += it->humanAccountID(); - sql += "',"; - sql += boost::lexical_cast(getLedgerSeq()); - sql += ")"; + sql += ";"; + Log(lsTRACE) << "ActTx: " << sql; + db->executeSQL(sql); // may already be in there } - sql += ";"; - Log(lsTRACE) << "ActTx: " << sql; - db->executeSQL(sql); // may already be in there + else + cLog(lsWARNING) << "Transaaction in ledger " << mLedgerSeq << " affects not accounts"; } if (SQL_EXISTS(db, boost::str(transExists % txn.getTransactionID().GetHex())))