From 8b0df758f371bd588d741ae5aab171708448dfec Mon Sep 17 00:00:00 2001 From: David Schwartz Date: Tue, 24 Sep 2013 14:38:48 -0700 Subject: [PATCH] calcNodeAdvance fix. --- src/ripple_app/paths/PathState.h | 1 + src/ripple_app/paths/RippleCalc.cpp | 20 ++++++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/ripple_app/paths/PathState.h b/src/ripple_app/paths/PathState.h index 539608737..e03de8481 100644 --- a/src/ripple_app/paths/PathState.h +++ b/src/ripple_app/paths/PathState.h @@ -55,6 +55,7 @@ public: uint256 uDirectTip; // Current directory. uint256 uDirectEnd; // Next order book. bool bDirectAdvance; // Need to advance directory. + bool bDirectRestart; // Need to restart directory. SLE::pointer sleDirectDir; STAmount saOfrRate; // For correct ratio. diff --git a/src/ripple_app/paths/RippleCalc.cpp b/src/ripple_app/paths/RippleCalc.cpp index e96635879..5ca7144af 100644 --- a/src/ripple_app/paths/RippleCalc.cpp +++ b/src/ripple_app/paths/RippleCalc.cpp @@ -34,6 +34,7 @@ TER RippleCalc::calcNodeAdvance ( uint256& uDirectTip = pnCur.uDirectTip; uint256& uDirectEnd = pnCur.uDirectEnd; bool& bDirectAdvance = pnCur.bDirectAdvance; + bool& bDirectRestart = pnCur.bDirectRestart; SLE::pointer& sleDirectDir = pnCur.sleDirectDir; STAmount& saOfrRate = pnCur.saOfrRate; @@ -73,17 +74,20 @@ TER RippleCalc::calcNodeAdvance ( sleDirectDir = lesActive.entryCache (ltDIR_NODE, uDirectTip); bDirectDirDirty = !!sleDirectDir; // Associated vars are dirty, if found it. bDirectAdvance = !sleDirectDir; // Advance, if didn't find it. Normal not to be unable to lookup firstdirectory. Maybe even skip this lookup. + bDirectRestart = false; WriteLog (lsTRACE, RippleCalc) << boost::str (boost::format ("calcNodeAdvance: Initialize node: uDirectTip=%s uDirectEnd=%s bDirectAdvance=%d") % uDirectTip % uDirectEnd % bDirectAdvance); } - if (bDirectAdvance) + if (bDirectAdvance || bDirectRestart) { // Get next quality. - uDirectTip = lesActive.getNextLedgerIndex (uDirectTip, uDirectEnd); + if (bDirectAdvance) + uDirectTip = lesActive.getNextLedgerIndex (uDirectTip, uDirectEnd); bDirectDirDirty = true; bDirectAdvance = false; + bDirectRestart = false; if (!!uDirectTip) { @@ -344,8 +348,12 @@ TER RippleCalc::calcNodeDeliverRev ( STAmount& saPrvDlvReq = pnPrv.saRevDeliver; // Accumulation of what the previous node must deliver. uint256& uDirectTip = pnCur.uDirectTip; + bool& bDirectRestart = pnCur.bDirectRestart; - uDirectTip = 0; // Restart book searching. + if (bMultiQuality) + uDirectTip = 0; // Restart book searching. + else + bDirectRestart = true; // Restart at same quality. // YYY Note this gets zeroed on each increment, ideally only on first increment, then it could be a limit on the forward pass. saOutAct.zero (saOutReq); @@ -636,8 +644,12 @@ TER RippleCalc::calcNodeDeliverFwd ( STAmount& saCurDeliverAct = pnCur.saFwdDeliver; // Zeroed in reverse pass. uint256& uDirectTip = pnCur.uDirectTip; + bool& bDirectRestart = pnCur.bDirectRestart; - uDirectTip = 0; // Restart book searching. + if (bMultiQuality) + uDirectTip = 0; // Restart book searching. + else + bDirectRestart = true; // Restart at same quality. saInAct.zero (saInReq); saInFees.zero (saInReq);