From 8705d0258dc2f185ba305cd094521a13439a18a5 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 22 Oct 2012 10:31:07 -0700 Subject: [PATCH] Add a "full history" mode that causes the node to try to keep full history going back to the genesis ledger. Not fully implemented yet. --- src/Application.cpp | 10 +++++++++- src/Config.cpp | 6 ++++++ src/Config.h | 3 +++ src/Ledger.cpp | 11 +++++++++++ src/Ledger.h | 1 + src/LedgerMaster.cpp | 4 ++++ src/LedgerMaster.h | 6 ++++++ 7 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/Application.cpp b/src/Application.cpp index d7bc41520..489b33a7d 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -113,6 +113,13 @@ void Application::run() else startNewLedger(); + if (theConfig.FULL_HISTORY && (theConfig.START_UP != Config::LOAD)) + { + Ledger::pointer ledger = Ledger::getLastFullLedger(); + if (ledger) + mMasterLedger.setLastFullLedger(ledger); + } + // // Begin validation and ip maintenance. // - Wallet maintains local information: including identity and network connection persistence information. @@ -215,7 +222,7 @@ void Application::loadOldLedger() { try { - Ledger::pointer lastLedger = Ledger::getSQL("SELECT * from Ledgers order by LedgerSeq desc limit 1;"); + Ledger::pointer lastLedger = Ledger::getLastFullLedger(); if (!lastLedger) { @@ -244,6 +251,7 @@ void Application::loadOldLedger() cLog(lsFATAL) << "Ledger is not sane."; exit(-1); } + mMasterLedger.setLastFullLedger(lastLedger); Ledger::pointer openLedger = boost::make_shared(false, boost::ref(*lastLedger)); mMasterLedger.switchLedgers(lastLedger, openLedger); diff --git a/src/Config.cpp b/src/Config.cpp index e4fb3f79a..12eac4885 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -14,6 +14,7 @@ #define SECTION_FEE_NICKNAME_CREATE "fee_nickname_create" #define SECTION_FEE_OFFER "fee_offer" #define SECTION_FEE_OPERATION "fee_operation" +#define SECTION_FULL_HISTORY "full_history" #define SECTION_IPS "ips" #define SECTION_NETWORK_QUORUM "network_quorum" #define SECTION_PEER_CONNECT_LOW_WATER "peer_connect_low_water" @@ -150,6 +151,8 @@ void Config::setup(const std::string& strConf) FEE_DEFAULT = DEFAULT_FEE_DEFAULT; FEE_CONTRACT_OPERATION = DEFAULT_FEE_OPERATION; + FULL_HISTORY = false; + ACCOUNT_PROBE_MAX = 10; VALIDATORS_SITE = DEFAULT_VALIDATORS_SITE; @@ -266,6 +269,9 @@ void Config::load() if (sectionSingleB(secConfig, SECTION_FEE_OPERATION, strTemp)) FEE_CONTRACT_OPERATION = boost::lexical_cast(strTemp); + if (sectionSingleB(secConfig, SECTION_FULL_HISTORY, strTemp)) + FULL_HISTORY = boost::lexical_cast(strTemp); + if (sectionSingleB(secConfig, SECTION_ACCOUNT_PROBE_MAX, strTemp)) ACCOUNT_PROBE_MAX = boost::lexical_cast(strTemp); diff --git a/src/Config.h b/src/Config.h index c7270e1d7..8c0c5c2f0 100644 --- a/src/Config.h +++ b/src/Config.h @@ -102,6 +102,9 @@ public: uint64 FEE_OFFER; // Rate per day. int FEE_CONTRACT_OPERATION; // fee for each contract operation + // Node storage configuration + bool FULL_HISTORY; + // Client behavior int ACCOUNT_PROBE_MAX; // How far to scan for accounts. diff --git a/src/Ledger.cpp b/src/Ledger.cpp index dd67647b5..4460e2747 100644 --- a/src/Ledger.cpp +++ b/src/Ledger.cpp @@ -429,6 +429,12 @@ void Ledger::saveAcceptedLedger() } theApp->getOPs().pubLedger(shared_from_this()); + + if(theConfig.FULL_HISTORY) + { + // WRITEME: check for seamless ledger history + } + } Ledger::pointer Ledger::getSQL(const std::string& sql) @@ -498,6 +504,11 @@ Ledger::pointer Ledger::loadByHash(const uint256& ledgerHash) return getSQL(sql); } +Ledger::pointer Ledger::getLastFullLedger() +{ + return getSQL("SELECT * from Ledgers order by LedgerSeq desc limit 1;"); +} + void Ledger::addJson(Json::Value& ret, int options) { ret["ledger"] = getJson(options); diff --git a/src/Ledger.h b/src/Ledger.h index 2b03b88ea..7c746843a 100644 --- a/src/Ledger.h +++ b/src/Ledger.h @@ -100,6 +100,7 @@ public: Ledger(Ledger& target, bool isMutable); // snapshot static Ledger::pointer getSQL(const std::string& sqlStatement); + static Ledger::pointer getLastFullLedger(); void updateHash(); void setClosed() { mClosed = true; } diff --git a/src/LedgerMaster.cpp b/src/LedgerMaster.cpp index dd0f6ecca..5553c91b5 100644 --- a/src/LedgerMaster.cpp +++ b/src/LedgerMaster.cpp @@ -32,6 +32,8 @@ void LedgerMaster::pushLedger(Ledger::ref newLedger) mFinalizedLedger = mCurrentLedger; mCurrentLedger = newLedger; mEngine.setLedger(newLedger); + if (mLastFullLedger && (newLedger->getParentHash() == mLastFullLedger->getHash())) + mLastFullLedger = newLedger; } void LedgerMaster::pushLedger(Ledger::ref newLCL, Ledger::ref newOL) @@ -44,6 +46,8 @@ void LedgerMaster::pushLedger(Ledger::ref newLCL, Ledger::ref newOL) assert(newLCL->isClosed()); assert(newLCL->isImmutable()); mLedgerHistory.addAcceptedLedger(newLCL); + if (mLastFullLedger && (newLCL->getParentHash() == mLastFullLedger->getHash())) + mLastFullLedger = newLCL; Log(lsINFO) << "StashAccepted: " << newLCL->getHash(); } diff --git a/src/LedgerMaster.h b/src/LedgerMaster.h index 2f198b884..36f9339db 100644 --- a/src/LedgerMaster.h +++ b/src/LedgerMaster.h @@ -20,6 +20,7 @@ class LedgerMaster Ledger::pointer mCurrentLedger; // The ledger we are currently processiong Ledger::pointer mFinalizedLedger; // The ledger that most recently closed + Ledger::pointer mLastFullLedger; // We have history to this point LedgerHistory mLedgerHistory; @@ -49,6 +50,11 @@ public: void pushLedger(Ledger::ref newLCL, Ledger::ref newOL); void storeLedger(Ledger::ref); + void setLastFullLedger(Ledger::ref ledger) + { + mLastFullLedger = ledger; + } + void switchLedgers(Ledger::ref lastClosed, Ledger::ref newCurrent); Ledger::pointer closeLedger();