From 5600a0e617f8f17d592715b76edfc8fa340cc087 Mon Sep 17 00:00:00 2001 From: David Schwartz Date: Wed, 24 Jul 2013 19:44:05 -0700 Subject: [PATCH] DirAdd bug fixes. --- .../ledger/ripple_LedgerEntrySet.cpp | 35 ++++++++----------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/modules/ripple_app/ledger/ripple_LedgerEntrySet.cpp b/modules/ripple_app/ledger/ripple_LedgerEntrySet.cpp index d3d24e28a..9059b8f27 100644 --- a/modules/ripple_app/ledger/ripple_LedgerEntrySet.cpp +++ b/modules/ripple_app/ledger/ripple_LedgerEntrySet.cpp @@ -679,24 +679,9 @@ TER LedgerEntrySet::dirAdd ( } else { - // Have old last point to new node, if it was not root. - if (uNodeDir == 1) - { - // Previous node is root node. - - sleRoot->setFieldU64 (sfIndexNext, uNodeDir); - } - else - { - // Previous node is not root node. - - SLE::pointer slePrevious = entryCache (ltDIR_NODE, Ledger::getDirNodeIndex (uRootIndex, uNodeDir - 1)); - - slePrevious->setFieldU64 (sfIndexNext, uNodeDir); - entryModify (slePrevious); - - sleNode->setFieldU64 (sfIndexPrevious, uNodeDir - 1); - } + // Have old last point to new node + sleNode->setFieldU64 (sfIndexNext, uNodeDir); + entryModify (sleNode); // Have root point to new node. sleRoot->setFieldU64 (sfIndexPrevious, uNodeDir); @@ -704,6 +689,7 @@ TER LedgerEntrySet::dirAdd ( // Create the new node. sleNode = entryCreate (ltDIR_NODE, Ledger::getDirNodeIndex (uRootIndex, uNodeDir)); + sleNode->setFieldU64 (sfIndexPrevious, uNodeDir - 1); sleNode->setFieldH256 (sfRootIndex, uRootIndex); fDescriber (sleNode); @@ -969,21 +955,30 @@ bool LedgerEntrySet::dirNext ( } else { - sleNode = entryCache (ltDIR_NODE, Ledger::getDirNodeIndex (uRootIndex, uNodeNext)); + SLE::pointer sleNext = entryCache (ltDIR_NODE, Ledger::getDirNodeIndex (uRootIndex, uNodeNext)); uDirEntry = 0; - if (!sleNode) + if (!sleNext) { // This should never happen WriteLog (lsFATAL, LedgerEntrySet) << "Corrupt directory: index:" << uRootIndex << " next:" << uNodeNext; +#if 0 + if (!read_only) + { + sleNode->setFieldU64 (sfIndexNext, 0); + entryModify(sleNode); + } +#endif return false; } + sleNode = sleNext; return dirNext (uRootIndex, sleNode, uDirEntry, uEntryIndex); } } uEntryIndex = vuiIndexes[uDirEntry++]; WriteLog (lsTRACE, LedgerEntrySet) << boost::str (boost::format ("dirNext: uDirEntry=%d uEntryIndex=%s") % uDirEntry % uEntryIndex); + // FIXME return true; }