diff --git a/Builds/VisualStudio2015/RippleD.vcxproj b/Builds/VisualStudio2015/RippleD.vcxproj
index 20dd9bceb76..8b8e1a64274 100644
--- a/Builds/VisualStudio2015/RippleD.vcxproj
+++ b/Builds/VisualStudio2015/RippleD.vcxproj
@@ -1431,10 +1431,6 @@
True
True
-
- True
- True
-
True
True
diff --git a/Builds/VisualStudio2015/RippleD.vcxproj.filters b/Builds/VisualStudio2015/RippleD.vcxproj.filters
index 03fc1ae808b..5d4a2e8b81a 100644
--- a/Builds/VisualStudio2015/RippleD.vcxproj.filters
+++ b/Builds/VisualStudio2015/RippleD.vcxproj.filters
@@ -1959,9 +1959,6 @@
ripple\basics\impl
-
- ripple\basics\impl
-
ripple\basics\impl
diff --git a/src/ripple/app/ledger/LedgerMaster.h b/src/ripple/app/ledger/LedgerMaster.h
index d3217073c05..21006d361ea 100644
--- a/src/ripple/app/ledger/LedgerMaster.h
+++ b/src/ripple/app/ledger/LedgerMaster.h
@@ -305,7 +305,7 @@ class LedgerMaster
std::unique_ptr replayData;
std::recursive_mutex mCompleteLock;
- RangeSet mCompleteLedgers;
+ RangeSet mCompleteLedgers;
std::unique_ptr mLedgerCleaner;
diff --git a/src/ripple/app/ledger/impl/LedgerMaster.cpp b/src/ripple/app/ledger/impl/LedgerMaster.cpp
index 6814c1d2e76..4b48a2a7d11 100644
--- a/src/ripple/app/ledger/impl/LedgerMaster.cpp
+++ b/src/ripple/app/ledger/impl/LedgerMaster.cpp
@@ -344,14 +344,14 @@ bool
LedgerMaster::haveLedger (std::uint32_t seq)
{
ScopedLockType sl (mCompleteLock);
- return mCompleteLedgers.hasValue (seq);
+ return boost::icl::contains(mCompleteLedgers, seq);
}
void
LedgerMaster::clearLedger (std::uint32_t seq)
{
ScopedLockType sl (mCompleteLock);
- return mCompleteLedgers.clearValue (seq);
+ mCompleteLedgers.erase (seq);
}
// returns Ledgers we have all the nodes for
@@ -365,15 +365,16 @@ LedgerMaster::getFullValidatedRange (std::uint32_t& minVal, std::uint32_t& maxVa
if (!maxVal)
return false;
+ boost::optional maybeMin;
{
ScopedLockType sl (mCompleteLock);
- minVal = mCompleteLedgers.prevMissing (maxVal);
+ maybeMin = prevMissing(mCompleteLedgers, maxVal);
}
- if (minVal == RangeSet::absent)
+ if (maybeMin == boost::none)
minVal = maxVal;
else
- ++minVal;
+ minVal = 1 + *maybeMin;
return true;
}
@@ -382,23 +383,9 @@ LedgerMaster::getFullValidatedRange (std::uint32_t& minVal, std::uint32_t& maxVa
bool
LedgerMaster::getValidatedRange (std::uint32_t& minVal, std::uint32_t& maxVal)
{
- // Validated ledger is likely not stored in the DB yet so we use the
- // published ledger which is.
- maxVal = mPubLedgerSeq.load();
-
- if (!maxVal)
+ if (!getFullValidatedRange(minVal, maxVal))
return false;
- {
- ScopedLockType sl (mCompleteLock);
- minVal = mCompleteLedgers.prevMissing (maxVal);
- }
-
- if (minVal == RangeSet::absent)
- minVal = maxVal;
- else
- ++minVal;
-
// Remove from the validated range any ledger sequences that may not be
// fully updated in the database yet
@@ -481,8 +468,8 @@ LedgerMaster::tryFill (
return;
{
- ScopedLockType ml (mCompleteLock);
- mCompleteLedgers.setRange (minHas, maxHas);
+ ScopedLockType ml(mCompleteLock);
+ mCompleteLedgers.insert(range(minHas, maxHas));
}
maxHas = minHas;
ledgerHashes = getHashesByIndex ((seq < 500)
@@ -502,7 +489,7 @@ LedgerMaster::tryFill (
{
ScopedLockType ml (mCompleteLock);
- mCompleteLedgers.setRange (minHas, maxHas);
+ mCompleteLedgers.insert(range(minHas, maxHas));
}
{
ScopedLockType ml (m_mutex);
@@ -647,7 +634,7 @@ LedgerMaster::setFullLedger (
{
ScopedLockType ml (mCompleteLock);
- mCompleteLedgers.setValue (ledger->info().seq);
+ mCompleteLedgers.insert (ledger->info().seq);
}
{
@@ -1283,7 +1270,7 @@ std::string
LedgerMaster::getCompleteLedgers ()
{
ScopedLockType sl (mCompleteLock);
- return mCompleteLedgers.toString ();
+ return to_string(mCompleteLedgers);
}
boost::optional
@@ -1447,7 +1434,7 @@ void
LedgerMaster::setLedgerRangePresent (std::uint32_t minV, std::uint32_t maxV)
{
ScopedLockType sl (mCompleteLock);
- mCompleteLedgers.setRange (minV, maxV);
+ mCompleteLedgers.insert(range(minV, maxV));
}
void
@@ -1478,12 +1465,9 @@ LedgerMaster::getPropertySource ()
void
LedgerMaster::clearPriorLedgers (LedgerIndex seq)
{
- ScopedLockType sl (mCompleteLock);
- for (LedgerIndex i = mCompleteLedgers.getFirst(); i < seq; ++i)
- {
- if (haveLedger (i))
- clearLedger (i);
- }
+ ScopedLockType sl(mCompleteLock);
+ if (seq > 0)
+ mCompleteLedgers.erase(range(0u, seq - 1));
}
void
@@ -1547,137 +1531,141 @@ void LedgerMaster::doAdvance ()
(mValidLedgerSeq == mPubLedgerSeq) &&
(getValidatedLedgerAge() < MAX_LEDGER_AGE_ACQUIRE))
{ // We are in sync, so can acquire
- std::uint32_t missing;
+ boost::optional maybeMissing;
{
ScopedLockType sl (mCompleteLock);
- missing = mCompleteLedgers.prevMissing(
- mPubLedger->info().seq);
+ maybeMissing =
+ prevMissing(mCompleteLedgers, mPubLedger->info().seq);
}
- JLOG (m_journal.trace())
- << "tryAdvance discovered missing " << missing;
- if ((missing != RangeSet::absent) && (missing > 0) &&
- shouldAcquire (mValidLedgerSeq, ledger_history_,
- app_.getSHAMapStore ().getCanDelete (), missing) &&
- ((mFillInProgress == 0) || (missing > mFillInProgress)))
+ if (maybeMissing)
{
- JLOG (m_journal.trace())
- << "advanceThread should acquire";
+ std::uint32_t missing = *maybeMissing;
+ JLOG(m_journal.trace())
+ << "tryAdvance discovered missing " << missing;
+ if ((missing > 0) &&
+ shouldAcquire(mValidLedgerSeq, ledger_history_,
+ app_.getSHAMapStore().getCanDelete(), missing) &&
+ ((mFillInProgress == 0) || (missing > mFillInProgress)))
{
- ScopedUnlockType sl(m_mutex);
- auto hash = getLedgerHashForHistory (missing);
- if (hash)
+ JLOG(m_journal.trace())
+ << "advanceThread should acquire";
{
- assert(hash->isNonZero());
- auto ledger = getLedgerByHash (*hash);
- if (!ledger)
+ ScopedUnlockType sl(m_mutex);
+ auto hash = getLedgerHashForHistory(missing);
+ if (hash)
{
- if (!app_.getInboundLedgers().isFailure (
- *hash))
+ assert(hash->isNonZero());
+ auto ledger = getLedgerByHash(*hash);
+ if (!ledger)
{
- ledger =
- app_.getInboundLedgers().acquire(
- *hash, missing,
- InboundLedger::fcHISTORY);
- if (! ledger && (missing > 32600) &&
- shouldFetchPack (missing))
+ if (!app_.getInboundLedgers().isFailure(
+ *hash))
{
- JLOG (m_journal.trace()) <<
- "tryAdvance want fetch pack " <<
- missing;
- fetch_seq_ = missing;
- getFetchPack(*hash, missing);
+ ledger =
+ app_.getInboundLedgers().acquire(
+ *hash, missing,
+ InboundLedger::fcHISTORY);
+ if (!ledger && (missing > 32600) &&
+ shouldFetchPack(missing))
+ {
+ JLOG(m_journal.trace()) <<
+ "tryAdvance want fetch pack " <<
+ missing;
+ fetch_seq_ = missing;
+ getFetchPack(*hash, missing);
+ }
+ else
+ JLOG(m_journal.trace()) <<
+ "tryAdvance no fetch pack for " <<
+ missing;
}
else
- JLOG (m_journal.trace()) <<
- "tryAdvance no fetch pack for " <<
- missing;
+ JLOG(m_journal.debug()) <<
+ "tryAdvance found failed acquire";
}
- else
- JLOG (m_journal.debug()) <<
- "tryAdvance found failed acquire";
- }
- if (ledger)
- {
- auto seq = ledger->info().seq;
- assert(seq == missing);
- JLOG (m_journal.trace())
+ if (ledger)
+ {
+ auto seq = ledger->info().seq;
+ assert(seq == missing);
+ JLOG(m_journal.trace())
<< "tryAdvance acquired "
<< ledger->info().seq;
- setFullLedger(
- ledger,
- false,
- false);
- auto const& parent = ledger->info().parentHash;
-
- int fillInProgress;
- {
- ScopedLockType lock(m_mutex);
- mHistLedger = ledger;
- fillInProgress = mFillInProgress;
- }
+ setFullLedger(
+ ledger,
+ false,
+ false);
+ auto const& parent = ledger->info().parentHash;
- if (fillInProgress == 0 &&
- getHashByIndex(seq - 1, app_) == parent)
- {
+ int fillInProgress;
{
- // Previous ledger is in DB
ScopedLockType lock(m_mutex);
- mFillInProgress = ledger->info().seq;
+ mHistLedger = ledger;
+ fillInProgress = mFillInProgress;
}
- app_.getJobQueue().addJob(
- jtADVANCE, "tryFill",
- [this, ledger] (Job& j) {
+ if (fillInProgress == 0 &&
+ getHashByIndex(seq - 1, app_) == parent)
+ {
+ {
+ // Previous ledger is in DB
+ ScopedLockType lock(m_mutex);
+ mFillInProgress = ledger->info().seq;
+ }
+
+ app_.getJobQueue().addJob(
+ jtADVANCE, "tryFill",
+ [this, ledger](Job& j) {
tryFill(j, ledger);
});
- }
+ }
- progress = true;
- }
- else
- {
- try
+ progress = true;
+ }
+ else
{
- for (int i = 0; i < ledger_fetch_size_; ++i)
+ try
{
- std::uint32_t seq = missing - i;
- auto hash2 =
- getLedgerHashForHistory(seq);
- if (hash2)
+ for (int i = 0; i < ledger_fetch_size_; ++i)
{
- assert(hash2->isNonZero());
- app_.getInboundLedgers().acquire
+ std::uint32_t seq = missing - i;
+ auto hash2 =
+ getLedgerHashForHistory(seq);
+ if (hash2)
+ {
+ assert(hash2->isNonZero());
+ app_.getInboundLedgers().acquire
(*hash2, seq,
InboundLedger::fcHISTORY);
+ }
}
}
- }
- catch (std::exception const&)
- {
- JLOG (m_journal.warn()) <<
- "Threw while prefetching";
+ catch (std::exception const&)
+ {
+ JLOG(m_journal.warn()) <<
+ "Threw while prefetching";
+ }
}
}
+ else
+ {
+ JLOG(m_journal.fatal()) <<
+ "Can't find ledger following prevMissing " <<
+ missing;
+ JLOG(m_journal.fatal()) << "Pub:" <<
+ mPubLedgerSeq << " Val:" << mValidLedgerSeq;
+ JLOG(m_journal.fatal()) << "Ledgers: " <<
+ app_.getLedgerMaster().getCompleteLedgers();
+ clearLedger(missing + 1);
+ progress = true;
+ }
}
- else
+ if (mValidLedgerSeq != mPubLedgerSeq)
{
- JLOG (m_journal.fatal()) <<
- "Can't find ledger following prevMissing " <<
- missing;
- JLOG (m_journal.fatal()) << "Pub:" <<
- mPubLedgerSeq << " Val:" << mValidLedgerSeq;
- JLOG (m_journal.fatal()) << "Ledgers: " <<
- app_.getLedgerMaster().getCompleteLedgers();
- clearLedger (missing + 1);
+ JLOG(m_journal.debug()) <<
+ "tryAdvance found last valid changed";
progress = true;
}
}
- if (mValidLedgerSeq != mPubLedgerSeq)
- {
- JLOG (m_journal.debug()) <<
- "tryAdvance found last valid changed";
- progress = true;
- }
}
}
else
diff --git a/src/ripple/basics/RangeSet.h b/src/ripple/basics/RangeSet.h
index fbbaf5677b5..16b29bd182a 100644
--- a/src/ripple/basics/RangeSet.h
+++ b/src/ripple/basics/RangeSet.h
@@ -20,72 +20,113 @@
#ifndef RIPPLE_BASICS_RANGESET_H_INCLUDED
#define RIPPLE_BASICS_RANGESET_H_INCLUDED
-#include
-#include