From 4f460736eb621dca3aec1f8ddc0db50284db2f92 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 18 Jun 2012 20:53:48 -0700 Subject: [PATCH 01/20] to160 was broken, and we don't use it. So remove it. --- src/Conversion.cpp | 7 ------- src/uint256.h | 2 -- 2 files changed, 9 deletions(-) diff --git a/src/Conversion.cpp b/src/Conversion.cpp index a0ac3c1e91..7f9de9029b 100644 --- a/src/Conversion.cpp +++ b/src/Conversion.cpp @@ -42,13 +42,6 @@ bool u160ToHuman(uint160& buf, std::string& retStr) #endif -base_uint160 uint256::to160() const -{ - uint160 m; - memcpy(m.begin(), begin(), m.size()); - return m; -} - base_uint256 uint160::to256() const { uint256 m; diff --git a/src/uint256.h b/src/uint256.h index 3e89222070..a13c814dc3 100644 --- a/src/uint256.h +++ b/src/uint256.h @@ -511,8 +511,6 @@ public: zero(); } } - - base_uint160 to160() const; }; From 22302319f45056fce1c2a040732c7def0e09ec5e Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 18 Jun 2012 21:00:48 -0700 Subject: [PATCH 02/20] Supression table. --- src/Application.h | 4 ++++ src/Suppression.cpp | 37 +++++++++++++++++++++++++++++++++++++ src/Suppression.h | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 src/Suppression.cpp create mode 100644 src/Suppression.h diff --git a/src/Application.h b/src/Application.h index 7d9ada8ea5..ec00b94e89 100644 --- a/src/Application.h +++ b/src/Application.h @@ -14,6 +14,7 @@ #include "NetworkOPs.h" #include "TaggedCache.h" #include "ValidationCollection.h" +#include "Suppression.h" #include "../database/database.h" @@ -46,6 +47,7 @@ class Application NetworkOPs mNetOps; NodeCache mNodeCache; ValidationCollection mValidations; + SuppressionTable mSuppressions; DatabaseCon *mTxnDB, *mLedgerDB, *mWalletDB, *mHashNodeDB, *mNetNodeDB; @@ -77,6 +79,8 @@ public: TransactionMaster& getMasterTransaction() { return mMasterTransaction; } NodeCache& getNodeCache() { return mNodeCache; } ValidationCollection& getValidations() { return mValidations; } + bool suppress(const uint256& s) { return mSuppressions.addSuppression(s); } + bool suppress(const uint160& s) { return mSuppressions.addSuppression(s); } DatabaseCon* getTxnDB() { return mTxnDB; } DatabaseCon* getLedgerDB() { return mLedgerDB; } diff --git a/src/Suppression.cpp b/src/Suppression.cpp new file mode 100644 index 0000000000..7ed36b5676 --- /dev/null +++ b/src/Suppression.cpp @@ -0,0 +1,37 @@ + +#include "Suppression.h" + +bool SuppressionTable::addSuppression(const uint160& suppression) +{ + boost::mutex::scoped_lock sl(mSuppressionMutex); + + if (mSuppressionMap.find(suppression) != mSuppressionMap.end()) + return false; + + time_t now = time(NULL); + + boost::unordered_map< time_t, std::list >::iterator it = mSuppressionTimes.begin(); + while (it != mSuppressionTimes.end()) + { + if ((it->first + mHoldTime) < now) + { + for (std::list::iterator lit = it->second.begin(), end = it->second.end(); + lit != end; ++lit) + mSuppressionMap.erase(*lit); + mSuppressionTimes.erase(it++); + } + else ++it; + } + + mSuppressionMap[suppression] = now; + mSuppressionTimes[now].push_back(suppression); + + return true; +} + +bool SuppressionTable::addSuppression(const uint256& suppression) +{ + uint160 u; + memcpy(u.begin(), suppression.begin() + (suppression.size() - u.size()), u.size()); + return addSuppression(u); +} diff --git a/src/Suppression.h b/src/Suppression.h new file mode 100644 index 0000000000..608a57d733 --- /dev/null +++ b/src/Suppression.h @@ -0,0 +1,34 @@ +#ifndef __SUPPRESSION__ +#define __SUPPRESSION__ + +#include + +#include +#include + +#include "uint256.h" + +extern std::size_t hash_value(const uint160& u); + +class SuppressionTable +{ +protected: + + boost::mutex mSuppressionMutex; + + // Stores all suppressed hashes and their expiration time + boost::unordered_map mSuppressionMap; + + // Stores all expiration times and the hashes indexed for them + boost::unordered_map< time_t, std::list > mSuppressionTimes; + + int mHoldTime; + +public: + SuppressionTable(int holdTime = 120) : mHoldTime(holdTime) { ; } + + bool addSuppression(const uint256& suppression); + bool addSuppression(const uint160& suppression); +}; + +#endif From e5249dd585e5e91a091112991915cbddbc1ef977 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 18 Jun 2012 21:07:49 -0700 Subject: [PATCH 03/20] Relay transactions with supression when not fully validating. --- src/NetworkOPs.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/NetworkOPs.cpp b/src/NetworkOPs.cpp index ffe901c1ac..540efeca45 100644 --- a/src/NetworkOPs.cpp +++ b/src/NetworkOPs.cpp @@ -98,6 +98,18 @@ Transaction::pointer NetworkOPs::processTransaction(Transaction::pointer trans, } Log(lsDEBUG) << "Status other than success " << r ; + if ((mMode != omFULL) && (theApp->suppress(trans->getID()))) + { + newcoin::TMTransaction tx; + Serializer s; + trans->getSTransaction()->add(s); + tx.set_rawtransaction(&s.getData().front(), s.getLength()); + tx.set_status(newcoin::tsCURRENT); + tx.set_receivetimestamp(getNetworkTimeNC()); + tx.set_ledgerindexpossible(tgtLedger); + PackedMessage::pointer packet = boost::make_shared(tx, newcoin::mtTRANSACTION); + theApp->getConnectionPool().relayMessage(source, packet); + } trans->setStatus(INVALID); return trans; @@ -472,10 +484,11 @@ bool NetworkOPs::recvPropose(uint32 proposeSeq, const uint256& proposeHash, // XXX Take a vuc for pubkey. NewcoinAddress naPeerPublic = NewcoinAddress::createNodePublic(strCopy(pubKey)); - if (mMode != omFULL) // FIXME: Should we relay? + if (mMode != omFULL) { Log(lsINFO) << "Received proposal when not full: " << mMode; - return false; // FIXME: Need suppression table + Serializer s(signature); + return theApp->suppress(s.getSHA512Half()); } if (!mConsensus) { From ea837ff819a5f87fe64900c85a45316a4629fe39 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 18 Jun 2012 21:12:35 -0700 Subject: [PATCH 04/20] Clean up some logging that was confusing. --- src/LedgerConsensus.cpp | 15 ++++++++------- src/LedgerConsensus.h | 2 +- src/NetworkOPs.cpp | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/LedgerConsensus.cpp b/src/LedgerConsensus.cpp index 7c84b258cf..3193dd7582 100644 --- a/src/LedgerConsensus.cpp +++ b/src/LedgerConsensus.cpp @@ -217,7 +217,7 @@ void LedgerConsensus::takeInitialPosition(Ledger::pointer initialLedger) mOurPosition = boost::make_shared (theConfig.VALIDATION_SEED, initialLedger->getParentHash(), txSet); - mapComplete(txSet, initialSet); + mapComplete(txSet, initialSet, false); propose(std::vector(), std::vector()); } @@ -241,9 +241,10 @@ void LedgerConsensus::createDisputes(SHAMap::pointer m1, SHAMap::pointer m2) } } -void LedgerConsensus::mapComplete(const uint256& hash, SHAMap::pointer map) +void LedgerConsensus::mapComplete(const uint256& hash, SHAMap::pointer map, bool acquired) { - Log(lsINFO) << "We have acquired TXS " << hash.GetHex(); + if (acquired) + Log(lsINFO) << "We have acquired TXS " << hash.GetHex(); mAcquiring.erase(hash); if (!map) @@ -281,8 +282,8 @@ void LedgerConsensus::mapComplete(const uint256& hash, SHAMap::pointer map) } if (!peers.empty()) adjustCount(map, peers); - else if (!hash) - Log(lsWARNING) << "By the time we got the map, no peers were proposing it"; + else if (acquired) + Log(lsWARNING) << "By the time we got the map " << hash.GetHex() << " no peers were proposing it"; sendHaveTxSet(hash, true); } @@ -448,7 +449,7 @@ bool LedgerConsensus::updateOurPositions(int sinceClose) uint256 newHash = ourPosition->getHash(); mOurPosition->changePosition(newHash); propose(addedTx, removedTx); - mapComplete(newHash, ourPosition); + mapComplete(newHash, ourPosition, false); Log(lsINFO) << "We change our position to " << newHash.GetHex(); } @@ -468,7 +469,7 @@ SHAMap::pointer LedgerConsensus::getTransactionTree(const uint256& hash, bool do if (!hash) { SHAMap::pointer empty = boost::make_shared(); - mapComplete(hash, empty); + mapComplete(hash, empty, false); return empty; } acquiring = boost::make_shared(hash); diff --git a/src/LedgerConsensus.h b/src/LedgerConsensus.h index a02bbce88a..60d4c27962 100644 --- a/src/LedgerConsensus.h +++ b/src/LedgerConsensus.h @@ -138,7 +138,7 @@ public: SHAMap::pointer getTransactionTree(const uint256& hash, bool doAcquire); TransactionAcquire::pointer getAcquiring(const uint256& hash); - void mapComplete(const uint256& hash, SHAMap::pointer map); + void mapComplete(const uint256& hash, SHAMap::pointer map, bool acquired); void abort(); int timerEntry(); diff --git a/src/NetworkOPs.cpp b/src/NetworkOPs.cpp index 540efeca45..e38cb2b243 100644 --- a/src/NetworkOPs.cpp +++ b/src/NetworkOPs.cpp @@ -541,7 +541,7 @@ bool NetworkOPs::hasTXSet(boost::shared_ptr peer, const uint256& set, newc void NetworkOPs::mapComplete(const uint256& hash, SHAMap::pointer map) { if (mConsensus) - mConsensus->mapComplete(hash, map); + mConsensus->mapComplete(hash, map, true); } void NetworkOPs::endConsensus() From 4afa11a6a6176bfee03dc0acd74973a3e3fe1816 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 18 Jun 2012 22:22:47 -0700 Subject: [PATCH 05/20] Reduce log chattiness. --- src/LedgerConsensus.cpp | 14 +++++++------- src/RPCServer.cpp | 13 ++++--------- src/rpc.cpp | 3 ++- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/LedgerConsensus.cpp b/src/LedgerConsensus.cpp index 3193dd7582..1742148129 100644 --- a/src/LedgerConsensus.cpp +++ b/src/LedgerConsensus.cpp @@ -506,7 +506,7 @@ void LedgerConsensus::startAcquiring(TransactionAcquire::pointer acquire) void LedgerConsensus::propose(const std::vector& added, const std::vector& removed) { - Log(lsDEBUG) << "We propose: " << mOurPosition->getCurrentHash().GetHex(); + Log(lsTRACE) << "We propose: " << mOurPosition->getCurrentHash().GetHex(); newcoin::TMProposeSet prop; prop.set_currenttxhash(mOurPosition->getCurrentHash().begin(), 256 / 8); prop.set_proposeseq(mOurPosition->getProposeSeq()); @@ -643,7 +643,7 @@ void LedgerConsensus::applyTransaction(TransactionEngine& engine, SerializedTran } else if (result == 0) { - Log(lsDEBUG) << " success"; + Log(lsTRACE) << " success"; assert(ledger->hasTransaction(txn->getTransactionID())); } else @@ -729,7 +729,7 @@ void LedgerConsensus::accept(SHAMap::pointer set) Log(lsTRACE) << "newLCL before transactions"; Json::Value p; newLCL->addJson(p, LEDGER_JSON_DUMP_TXNS | LEDGER_JSON_DUMP_STATE); - ssw.write(std::cerr, p); + ssw.write(Log(lsTRACE).ref(), p); } #endif @@ -747,7 +747,7 @@ void LedgerConsensus::accept(SHAMap::pointer set) Log(lsTRACE) << "newLCL after transactions"; Json::Value p; newLCL->addJson(p, LEDGER_JSON_DUMP_TXNS | LEDGER_JSON_DUMP_STATE); - ssw.write(std::cerr, p); + ssw.write(Log(lsTRACE).ref(), p); } #endif @@ -759,14 +759,14 @@ void LedgerConsensus::accept(SHAMap::pointer set) Log(lsTRACE) << "newOL before transactions"; Json::Value p; newOL->addJson(p, LEDGER_JSON_DUMP_TXNS | LEDGER_JSON_DUMP_STATE); - ssw.write(std::cerr, p); + ssw.write(Log(lsTRACE).ref(), p); } if (1) { Log(lsTRACE) << "current ledger"; Json::Value p; theApp->getMasterLedger().getCurrentLedger()->addJson(p, LEDGER_JSON_DUMP_TXNS | LEDGER_JSON_DUMP_STATE); - ssw.write(std::cerr, p); + ssw.write(Log(lsTRACE).ref(), p); } #endif @@ -804,7 +804,7 @@ void LedgerConsensus::accept(SHAMap::pointer set) Log(lsTRACE) << "newOL after current ledger transactions"; Json::Value p; newOL->addJson(p, LEDGER_JSON_DUMP_TXNS | LEDGER_JSON_DUMP_STATE); - ssw.write(std::cerr, p); + ssw.write(Log(lsTRACE).ref(), p); } #endif diff --git a/src/RPCServer.cpp b/src/RPCServer.cpp index 0395d52a2a..b524681f6e 100644 --- a/src/RPCServer.cpp +++ b/src/RPCServer.cpp @@ -23,6 +23,7 @@ #include "AccountState.h" #include "NicknameState.h" #include "utils.h" +#include "Log.h" RPCServer::RPCServer(boost::asio::io_service& io_service , NetworkOPs* nopNetwork) : mNetOps(nopNetwork), mSocket(io_service) @@ -162,16 +163,10 @@ std::string RPCServer::handleRequest(const std::string& requestStr) else if (!valParams.isArray()) return(HTTPReply(400, "")); -#ifdef DEBUG Json::StyledStreamWriter w; - w.write(std::cerr, valParams); -#endif - + w.write(Log(lsTRACE).ref(), valParams); Json::Value result(doCommand(strMethod, valParams)); - -#ifdef DEBUG - w.write(std::cerr, result); -#endif + w.write(Log(lsTRACE).ref(), result); std::string strReply = JSONRPCReply(result, Json::Value(), id); return( HTTPReply(200, strReply) ); @@ -1966,7 +1961,7 @@ Json::Value RPCServer::doStop(Json::Value& params) { Json::Value RPCServer::doCommand(const std::string& command, Json::Value& params) { - std::cerr << "RPC:" << command << std::endl; + Log(lsTRACE) << "RPC:" << command; static struct { const char* pCommand; diff --git a/src/rpc.cpp b/src/rpc.cpp index b55ea15672..77a414cc4b 100644 --- a/src/rpc.cpp +++ b/src/rpc.cpp @@ -14,6 +14,7 @@ #include "RPC.h" #include "BitcoinUtil.h" #include "Config.h" +#include "Log.h" using namespace boost; using namespace boost::asio; @@ -71,7 +72,7 @@ std::string rfc1123Time() std::string HTTPReply(int nStatus, const std::string& strMsg) { - std::cout << "HTTP Reply " << nStatus << " " << strMsg << std::endl; + Log(lsTRACE) << "HTTP Reply " << nStatus << " " << strMsg; if (nStatus == 401) return strprintf("HTTP/1.0 401 Authorization Required\r\n" From a2cde8b462d15cbbdbdecf0c97fd44f8126e5cec Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 18 Jun 2012 22:54:26 -0700 Subject: [PATCH 06/20] Change default log level. --- src/Log.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Log.cpp b/src/Log.cpp index 5efe21a890..bdd56959b2 100644 --- a/src/Log.cpp +++ b/src/Log.cpp @@ -7,7 +7,7 @@ boost::recursive_mutex Log::sLock; -LogSeverity Log::sMinSeverity = lsWARNING; +LogSeverity Log::sMinSeverity = lsINFO; std::ofstream* Log::outStream = NULL; From 1b014f098e76f7a14786cebf86a5ee0c2f0cf7ee Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 18 Jun 2012 22:54:34 -0700 Subject: [PATCH 07/20] Remove chatty log. --- src/ConnectionPool.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/ConnectionPool.cpp b/src/ConnectionPool.cpp index cfdad9432a..1f46ec8b71 100644 --- a/src/ConnectionPool.cpp +++ b/src/ConnectionPool.cpp @@ -1,9 +1,5 @@ #include "ConnectionPool.h" -#include "Config.h" -#include "Peer.h" -#include "Application.h" -#include "utils.h" #include #include @@ -11,6 +7,13 @@ #include #include +#include "Config.h" +#include "Peer.h" +#include "Application.h" +#include "utils.h" +#include "Log.h" + + // How often to enforce policies. #define POLICY_INTERVAL_SECONDS 5 @@ -163,7 +166,7 @@ void ConnectionPool::policyEnforce() { boost::posix_time::ptime tpNow = boost::posix_time::second_clock::universal_time(); - std::cerr << "policyEnforce: begin: " << tpNow << std::endl; + Log(lsTRACE) << "policyEnforce: begin: " << tpNow; // Cancel any in progrss timer. (void) mPolicyTimer.cancel(); @@ -176,7 +179,7 @@ void ConnectionPool::policyEnforce() tpNext = boost::posix_time::second_clock::universal_time()+boost::posix_time::seconds(POLICY_INTERVAL_SECONDS); - std::cerr << "policyEnforce: schedule : " << tpNext << std::endl; + Log(lsTRACE) << "policyEnforce: schedule : " << tpNext; mPolicyTimer.expires_at(tpNext); mPolicyTimer.async_wait(boost::bind(&ConnectionPool::policyHandler, this, _1)); From 916a6e96f34d42ee313d86618e5c08da5e2cee9b Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 18 Jun 2012 22:54:51 -0700 Subject: [PATCH 08/20] Spelling error. --- src/TransactionEngine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TransactionEngine.cpp b/src/TransactionEngine.cpp index 88b8efe05f..14902bf23f 100644 --- a/src/TransactionEngine.cpp +++ b/src/TransactionEngine.cpp @@ -455,7 +455,7 @@ TransactionEngineResult TransactionEngine::applyTransaction(const SerializedTran if (!sleSrc) { - std::cerr << str(boost::format("applyTransaction: Delay transaction: source account does not exisit: %s") % txn.getSourceAccount().humanAccountID()) << std::endl; + std::cerr << str(boost::format("applyTransaction: Delay transaction: source account does not exist: %s") % txn.getSourceAccount().humanAccountID()) << std::endl; result = terNO_ACCOUNT; } From 718d078d48d02e0313143cfa71ee6c74dd8b1604 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 18 Jun 2012 22:55:07 -0700 Subject: [PATCH 09/20] Fix the timing of adding accepted ledgers. --- src/Ledger.h | 1 + src/LedgerConsensus.cpp | 2 +- src/LedgerHistory.cpp | 4 +++- src/LedgerMaster.cpp | 5 +++-- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Ledger.h b/src/Ledger.h index 64ae24a6d5..1f9c8b6c60 100644 --- a/src/Ledger.h +++ b/src/Ledger.h @@ -99,6 +99,7 @@ public: void setImmutable() { updateHash(); mImmutable = true; } bool isClosed() { return mClosed; } bool isAccepted() { return mAccepted; } + bool isImmutable() { return mImmutable; } // This ledger has closed, will never be accepted, and is accepting // new transactions to be re-repocessed when do accept a new last-closed ledger diff --git a/src/LedgerConsensus.cpp b/src/LedgerConsensus.cpp index 1742148129..dcead92135 100644 --- a/src/LedgerConsensus.cpp +++ b/src/LedgerConsensus.cpp @@ -256,7 +256,7 @@ void LedgerConsensus::mapComplete(const uint256& hash, SHAMap::pointer map, bool if (mComplete.find(hash) != mComplete.end()) { - Log(lsERROR) << "Which we already had"; + Log(lsERROR) << "Got TXS we already had " << hash.GetHex(); return; // we already have this map } diff --git a/src/LedgerHistory.cpp b/src/LedgerHistory.cpp index ad357139ab..f20a7ae53a 100644 --- a/src/LedgerHistory.cpp +++ b/src/LedgerHistory.cpp @@ -32,6 +32,7 @@ void LedgerHistory::addAcceptedLedger(Ledger::pointer ledger) uint256 h(ledger->getHash()); boost::recursive_mutex::scoped_lock sl(mLedgersByHash.peekMutex()); mLedgersByHash.canonicalize(h, ledger); + assert(ledger && ledger->isAccepted() && ledger->isImmutable()); mLedgersByIndex.insert(std::make_pair(ledger->getLedgerSeq(), ledger)); boost::thread thread(boost::bind(&Ledger::saveAcceptedLedger, ledger)); thread.detach(); @@ -71,6 +72,7 @@ Ledger::pointer LedgerHistory::getLedgerByHash(const uint256& hash) Ledger::pointer LedgerHistory::canonicalizeLedger(Ledger::pointer ledger, bool save) { + assert(ledger->isImmutable()); uint256 h(ledger->getHash()); if (!save) @@ -83,7 +85,7 @@ Ledger::pointer LedgerHistory::canonicalizeLedger(Ledger::pointer ledger, bool s // save input ledger in map if not in map, otherwise return corresponding map ledger boost::recursive_mutex::scoped_lock sl(mLedgersByHash.peekMutex()); mLedgersByHash.canonicalize(h, ledger); - if (ledger->isAccepted()) mLedgersByIndex[ledger->getLedgerSeq()]=ledger; + if (ledger->isAccepted()) mLedgersByIndex[ledger->getLedgerSeq()] = ledger; return ledger; } // vim:ts=4 diff --git a/src/LedgerMaster.cpp b/src/LedgerMaster.cpp index 3d1f1858c3..ea1b4bdce7 100644 --- a/src/LedgerMaster.cpp +++ b/src/LedgerMaster.cpp @@ -40,13 +40,14 @@ void LedgerMaster::pushLedger(Ledger::pointer newLCL, Ledger::pointer newOL) assert(newLCL->isClosed() && newLCL->isAccepted()); assert(!newOL->isClosed() && !newOL->isAccepted()); - ScopedLock sl(mLock); - if (mFinalizedLedger && mFinalizedLedger->isAccepted()) + if (newLCL->isAccepted()) { mLedgerHistory.addAcceptedLedger(mFinalizedLedger); Log(lsINFO) << "StashAccepted: " << mFinalizedLedger->getHash().GetHex(); } + mFinalizedLedger = newLCL; + ScopedLock sl(mLock); mCurrentLedger = newOL; mEngine.setLedger(newOL); } From 409340e921fa02ae7dd4dc71ef0b956af02f7f0a Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 18 Jun 2012 22:56:02 -0700 Subject: [PATCH 10/20] Cleanup. --- src/LedgerConsensus.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/LedgerConsensus.cpp b/src/LedgerConsensus.cpp index dcead92135..a1aa85ef3e 100644 --- a/src/LedgerConsensus.cpp +++ b/src/LedgerConsensus.cpp @@ -255,10 +255,7 @@ void LedgerConsensus::mapComplete(const uint256& hash, SHAMap::pointer map, bool } if (mComplete.find(hash) != mComplete.end()) - { - Log(lsERROR) << "Got TXS we already had " << hash.GetHex(); return; // we already have this map - } if (mOurPosition && (map->getHash() != mOurPosition->getCurrentHash())) { // this could create disputed transactions From f6f64aac75288e5ad70c068446b12e36c0271b4f Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 18 Jun 2012 23:00:26 -0700 Subject: [PATCH 11/20] Log unknown messages in detail. --- src/Peer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Peer.cpp b/src/Peer.cpp index 662e234192..9cbaa4f93a 100644 --- a/src/Peer.cpp +++ b/src/Peer.cpp @@ -508,6 +508,7 @@ void Peer::processReadBuffer() default: std::cerr << "Unknown Msg: " << type << std::endl; + std::cerr << strHex(&mReadbuf[0], mReadbuf.size()); } } } From 12076bcb59af9d33b9e812ecfa4621dcb76a4136 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 18 Jun 2012 23:06:40 -0700 Subject: [PATCH 12/20] Some logging improvements. --- src/Peer.cpp | 2 +- src/TransactionEngine.cpp | 61 ++++++++++++++++++++------------------- 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/src/Peer.cpp b/src/Peer.cpp index 9cbaa4f93a..df3ea8fa78 100644 --- a/src/Peer.cpp +++ b/src/Peer.cpp @@ -60,7 +60,7 @@ void Peer::handle_write(const boost::system::error_code& error, size_t bytes_tra void Peer::detach(const char *rsn) { #ifdef DEBUG - std::cerr << "DETACHING PEER: " << rsn << std::endl; + Log(lsTRACE) << "DETACHING PEER: " << rsn; #endif boost::system::error_code ecCancel; diff --git a/src/TransactionEngine.cpp b/src/TransactionEngine.cpp index 14902bf23f..2235ff1bd4 100644 --- a/src/TransactionEngine.cpp +++ b/src/TransactionEngine.cpp @@ -40,12 +40,12 @@ TransactionEngineResult TransactionEngine::dirAdd( sleRoot->setIndex(uRootIndex); - std::cerr << "dirAdd: Creating dir index: " << sleRoot->getIndex().ToString() << std::endl; + Log(lsTRACE) << "dirAdd: Creating dir index: " << sleRoot->getIndex().ToString(); sleRoot->setIFieldU64(sfFirstNode, uNodeDir); sleRoot->setIFieldU64(sfLastNode, uNodeDir); - std::cerr << "dirAdd: first & last: " << strHex(uNodeDir) << std::endl; + Log(lsTRACE) << "dirAdd: first & last: " << strHex(uNodeDir); accounts.push_back(std::make_pair(taaCREATE, sleRoot)); } @@ -64,9 +64,9 @@ TransactionEngineResult TransactionEngine::dirAdd( { // Last node is not full, append. - std::cerr << "dirAdd: appending: PREV: " << svIndexes.peekValue()[0].ToString() << std::endl; - std::cerr << "dirAdd: appending: Node: " << strHex(uNodeDir) << std::endl; - std::cerr << "dirAdd: appending: Entry: " << uLedgerIndex.ToString() << std::endl; + Log(lsTRACE) << "dirAdd: appending: PREV: " << svIndexes.peekValue()[0].ToString(); + Log(lsTRACE) << "dirAdd: appending: Node: " << strHex(uNodeDir); + Log(lsTRACE) << "dirAdd: appending: Entry: " << uLedgerIndex.ToString(); svIndexes.peekValue().push_back(uLedgerIndex); sleNode->setIFieldV256(sfIndexes, svIndexes); @@ -83,7 +83,7 @@ TransactionEngineResult TransactionEngine::dirAdd( // Record new last node. sleNode = SLE::pointer(); - std::cerr << "dirAdd: last: " << strHex(uNodeDir) << std::endl; + Log(lsTRACE) << "dirAdd: last: " << strHex(uNodeDir); sleRoot->setIFieldU64(sfLastNode, uNodeDir); @@ -97,7 +97,7 @@ TransactionEngineResult TransactionEngine::dirAdd( sleNode = boost::make_shared(ltDIR_NODE); sleNode->setIndex(uNodeIndex); - std::cerr << "dirAdd: Creating dir node: " << sleNode->getIndex().ToString() << std::endl; + Log(lsTRACE) << "dirAdd: Creating dir node: " << sleNode->getIndex().ToString(); STVector256 svIndexes; @@ -123,7 +123,7 @@ TransactionEngineResult TransactionEngine::dirDelete( if (!sleNode) { - std::cerr << "dirDelete: no such node" << std::endl; + Log(lsWARNING) << "dirDelete: no such node"; return terNODE_NOT_FOUND; } else @@ -135,7 +135,7 @@ TransactionEngineResult TransactionEngine::dirDelete( it = std::find(vuiIndexes.begin(), vuiIndexes.end(), uLedgerIndex); if (vuiIndexes.end() == it) { - std::cerr << "dirDelete: node not mentioned" << std::endl; + Log(lsWARNING) << "dirDelete: node not mentioned"; return terNODE_NOT_MENTIONED; } else @@ -146,7 +146,7 @@ TransactionEngineResult TransactionEngine::dirDelete( if (!sleRoot) { - std::cerr << "dirDelete: root node is missing" << std::endl; + Log(lsWARNING) << "dirDelete: root node is missing"; return terNODE_NO_ROOT; } @@ -242,7 +242,7 @@ TransactionEngineResult TransactionEngine::setAuthorized(const SerializedTransac if (!naAccountPublic.accountPublicVerify(Serializer::getSHA512Half(vucCipher), vucSignature)) { - std::cerr << "createGenerator: bad signature unauthorized generator claim" << std::endl; + Log(lsWARNING) << "createGenerator: bad signature unauthorized generator claim"; return tenBAD_GEN_AUTH; } @@ -254,7 +254,7 @@ TransactionEngineResult TransactionEngine::setAuthorized(const SerializedTransac SLE::pointer sleGen = mLedger->getGenerator(qry, hGeneratorID); if (!sleGen) { - std::cerr << "createGenerator: creating generator" << std::endl; + Log(lsTRACE) << "createGenerator: creating generator"; // Create the generator. sleGen = boost::make_shared(ltGENERATOR_MAP); @@ -268,7 +268,7 @@ TransactionEngineResult TransactionEngine::setAuthorized(const SerializedTransac { // Doing a claim. Must set generator. // Generator is already in use. Regular passphrases limited to one wallet. - std::cerr << "createGenerator: generator already in use" << std::endl; + Log(lsWARNING) << "createGenerator: generator already in use"; return tenGEN_IN_USE; } @@ -288,7 +288,7 @@ TransactionEngineResult TransactionEngine::setAuthorized(const SerializedTransac TransactionEngineResult TransactionEngine::applyTransaction(const SerializedTransaction& txn, TransactionEngineParams params, uint32 targetLedger) { - std::cerr << "applyTransaction>" << std::endl; + Log(lsTRACE) << "applyTransaction>"; mLedger = mDefaultLedger; assert(mLedger); @@ -308,7 +308,7 @@ TransactionEngineResult TransactionEngine::applyTransaction(const SerializedTran SerializedTransaction s2(sit); if (!s2.isEquivalent(txn)) { - std::cerr << "Transaction serdes mismatch" << std::endl; + Log(lsFATAL) << "Transaction serdes mismatch"; Json::StyledStreamWriter ssw; ssw.write(Log(lsINFO).ref(), txn.getJson(0)); ssw.write(Log(lsFATAL).ref(), s2.getJson(0)); @@ -322,7 +322,7 @@ TransactionEngineResult TransactionEngine::applyTransaction(const SerializedTran uint256 txID = txn.getTransactionID(); if (!txID) { - std::cerr << "applyTransaction: invalid transaction id" << std::endl; + Log(lsWARNING) << "applyTransaction: invalid transaction id"; result = tenINVALID; } @@ -344,7 +344,7 @@ TransactionEngineResult TransactionEngine::applyTransaction(const SerializedTran // Consistency: really signed. if (terSUCCESS == result && !txn.checkSign(naSigningPubKey)) { - std::cerr << "applyTransaction: Invalid transaction: bad signature" << std::endl; + Log(lsWARNING) << "applyTransaction: Invalid transaction: bad signature"; result = tenINVALID; } @@ -389,12 +389,12 @@ TransactionEngineResult TransactionEngine::applyTransaction(const SerializedTran break; case ttINVALID: - std::cerr << "applyTransaction: Invalid transaction: ttINVALID transaction type" << std::endl; + Log(lsWARNING) << "applyTransaction: Invalid transaction: ttINVALID transaction type"; result = tenINVALID; break; default: - std::cerr << "applyTransaction: Invalid transaction: unknown transaction type" << std::endl; + Log(lsWARNING) << "applyTransaction: Invalid transaction: unknown transaction type"; result = tenUNKNOWN; break; } @@ -408,7 +408,7 @@ TransactionEngineResult TransactionEngine::applyTransaction(const SerializedTran { if (saPaid < saCost) { - std::cerr << "applyTransaction: insufficient fee" << std::endl; + Log(lsINFO) << "applyTransaction: insufficient fee"; result = tenINSUF_FEE_P; } @@ -418,7 +418,7 @@ TransactionEngineResult TransactionEngine::applyTransaction(const SerializedTran if (!saPaid.isZero()) { // Transaction is malformed. - std::cerr << "applyTransaction: fee not allowed" << std::endl; + Log(lsWARNING) << "applyTransaction: fee not allowed"; result = tenINSUF_FEE_P; } @@ -429,7 +429,7 @@ TransactionEngineResult TransactionEngine::applyTransaction(const SerializedTran uint160 srcAccountID = txn.getSourceAccount().getAccountID(); if (terSUCCESS == result && !srcAccountID) { - std::cerr << "applyTransaction: bad source id" << std::endl; + Log(lsWARNING) << "applyTransaction: bad source id"; result = tenINVALID; } @@ -455,7 +455,8 @@ TransactionEngineResult TransactionEngine::applyTransaction(const SerializedTran if (!sleSrc) { - std::cerr << str(boost::format("applyTransaction: Delay transaction: source account does not exist: %s") % txn.getSourceAccount().humanAccountID()) << std::endl; + Log(lsTRACE) << str(boost::format("applyTransaction: Delay transaction: source account does not exist: %s") % + txn.getSourceAccount().humanAccountID()); result = terNO_ACCOUNT; } @@ -473,7 +474,7 @@ TransactionEngineResult TransactionEngine::applyTransaction(const SerializedTran case ttCLAIM: if (bHaveAuthKey) { - std::cerr << "applyTransaction: Account already claimed." << std::endl; + Log(lsWARNING) << "applyTransaction: Account already claimed."; result = tenCLAIMED; } @@ -496,8 +497,8 @@ TransactionEngineResult TransactionEngine::applyTransaction(const SerializedTran if (naSigningPubKey.getAccountID() != srcAccountID) { // Signing Pub Key must be for Source Account ID. - std::cerr << "sourceAccountID: " << naSigningPubKey.humanAccountID() << std::endl; - std::cerr << "txn accountID: " << txn.getSourceAccount().humanAccountID() << std::endl; + Log(lsWARNING) << "sourceAccountID: " << naSigningPubKey.humanAccountID(); + Log(lsWARNING) << "txn accountID: " << txn.getSourceAccount().humanAccountID(); result = tenBAD_CLAIM_ID; } @@ -509,8 +510,8 @@ TransactionEngineResult TransactionEngine::applyTransaction(const SerializedTran if (naSigningPubKey.getAccountID() != srcAccountID) { // Signing Pub Key must be for Source Account ID. - std::cerr << "sourceAccountID: " << naSigningPubKey.humanAccountID() << std::endl; - std::cerr << "txn accountID: " << txn.getSourceAccount().humanAccountID() << std::endl; + Log(lsWARNING) << "sourceAccountID: " << naSigningPubKey.humanAccountID(); + Log(lsWARNING) << "txn accountID: " << txn.getSourceAccount().humanAccountID(); result = tenBAD_SET_ID; } @@ -573,12 +574,12 @@ TransactionEngineResult TransactionEngine::applyTransaction(const SerializedTran else if (!saCost.isZero()) { uint32 a_seq = sleSrc->getIFieldU32(sfSequence); - Log(lsINFO) << "Aseq=" << a_seq << ", Tseq=" << t_seq; + Log(lsTRACE) << "Aseq=" << a_seq << ", Tseq=" << t_seq; if (t_seq != a_seq) { if (a_seq < t_seq) { - std::cerr << "applyTransaction: future sequence number" << std::endl; + Log(lsTRACE) << "applyTransaction: future sequence number"; result = terPRE_SEQ; } From b72129f401b80c2a7c3de5667cb5b66bab08647f Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 19 Jun 2012 01:28:05 -0700 Subject: [PATCH 13/20] Don't relay to peers that are not fully established. --- src/ConnectionPool.cpp | 2 +- src/Peer.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ConnectionPool.cpp b/src/ConnectionPool.cpp index 1f46ec8b71..90bae25ebc 100644 --- a/src/ConnectionPool.cpp +++ b/src/ConnectionPool.cpp @@ -211,7 +211,7 @@ void ConnectionPool::relayMessage(Peer* fromPeer, PackedMessage::pointer msg) Peer::pointer peer = pair.second; if (!peer) std::cerr << "CP::RM null peer in list" << std::endl; - else if (!fromPeer || !(peer.get() == fromPeer)) + else if ((!fromPeer || !(peer.get() == fromPeer)) && peer->isConnected()) peer->sendPacket(msg); } } diff --git a/src/Peer.h b/src/Peer.h index 959876915e..d458b05886 100644 --- a/src/Peer.h +++ b/src/Peer.h @@ -124,6 +124,7 @@ public: void punishPeer(PeerPunish pp); Json::Value getJson(); + bool isConnected() const { return mConnected; } //static PackedMessage::pointer createFullLedger(Ledger::pointer ledger); static PackedMessage::pointer createLedgerProposal(Ledger::pointer ledger); From 12dffac101c5118815ccaff958b4a1d8275ddaf0 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 19 Jun 2012 04:52:38 -0700 Subject: [PATCH 14/20] Fix some broken traverses. --- src/LedgerAcquire.cpp | 2 +- src/Suppression.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/LedgerAcquire.cpp b/src/LedgerAcquire.cpp index be389a4eb1..a94c0e0302 100644 --- a/src/LedgerAcquire.cpp +++ b/src/LedgerAcquire.cpp @@ -254,7 +254,7 @@ void PeerSet::sendRequest(const newcoin::TMGetLedger& tmGL) while (it != mPeers.end()) { if (it->expired()) - mPeers.erase(it++); + it = mPeers.erase(it); else { // FIXME: Track last peer sent to and time sent diff --git a/src/Suppression.cpp b/src/Suppression.cpp index 7ed36b5676..c285d5f349 100644 --- a/src/Suppression.cpp +++ b/src/Suppression.cpp @@ -18,7 +18,7 @@ bool SuppressionTable::addSuppression(const uint160& suppression) for (std::list::iterator lit = it->second.begin(), end = it->second.end(); lit != end; ++lit) mSuppressionMap.erase(*lit); - mSuppressionTimes.erase(it++); + it = mSuppressionTimes.erase(it); } else ++it; } From 117077a4a5257a5d74722b7adc8051f1cd5c9443 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 19 Jun 2012 04:59:57 -0700 Subject: [PATCH 15/20] Change 'eraseInc' to 'erase'. --- src/CanonicalTXSet.cpp | 8 +++++--- src/CanonicalTXSet.h | 3 +-- src/LedgerConsensus.cpp | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/CanonicalTXSet.cpp b/src/CanonicalTXSet.cpp index 93ed79ccd4..c46c089374 100644 --- a/src/CanonicalTXSet.cpp +++ b/src/CanonicalTXSet.cpp @@ -44,10 +44,12 @@ void CanonicalTXSet::push_back(SerializedTransaction::pointer txn) mMap.insert(std::make_pair(CanonicalTXKey(effectiveAccount, txn->getSequence(), txn->getTransactionID()), txn)); } -void CanonicalTXSet::eraseInc(iterator& it) +CanonicalTXSet::iterator CanonicalTXSet::erase(const iterator& it) { - iterator tmp = it++; - mMap.erase(tmp); + iterator tmp = it; + ++tmp; + mMap.erase(it); + return tmp; } diff --git a/src/CanonicalTXSet.h b/src/CanonicalTXSet.h index f78c580cd9..6978859af7 100644 --- a/src/CanonicalTXSet.h +++ b/src/CanonicalTXSet.h @@ -39,8 +39,7 @@ public: CanonicalTXSet(const uint256& lclHash) : mSetHash(lclHash) { ; } void push_back(SerializedTransaction::pointer txn); - void erase(const iterator& it) { mMap.erase(it); } - void eraseInc(iterator& it); + iterator erase(const iterator& it); iterator begin() { return mMap.begin(); } iterator end() { return mMap.end(); } diff --git a/src/LedgerConsensus.cpp b/src/LedgerConsensus.cpp index a1aa85ef3e..ca556745b1 100644 --- a/src/LedgerConsensus.cpp +++ b/src/LedgerConsensus.cpp @@ -694,7 +694,7 @@ void LedgerConsensus::applyTransactions(SHAMap::pointer set, Ledger::pointer led if (result <= 0) { if (result == 0) ++successes; - failedTransactions.eraseInc(it); + it = failedTransactions.erase(it); } else { @@ -704,7 +704,7 @@ void LedgerConsensus::applyTransactions(SHAMap::pointer set, Ledger::pointer led catch (...) { Log(lsWARNING) << " Throws"; - failedTransactions.eraseInc(it); + it = failedTransactions.erase(it); } } } while (successes > 0); From 7467407dfe0f029d3f5280e94abbf38c87c86ed6 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 19 Jun 2012 05:30:07 -0700 Subject: [PATCH 16/20] Cleanups. --- src/ConnectionPool.cpp | 8 ++------ src/LedgerAcquire.cpp | 4 ++-- src/LedgerAcquire.h | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/ConnectionPool.cpp b/src/ConnectionPool.cpp index 90bae25ebc..6e7302586b 100644 --- a/src/ConnectionPool.cpp +++ b/src/ConnectionPool.cpp @@ -352,9 +352,7 @@ void ConnectionPool::peerDisconnected(Peer::pointer peer, const ipPort& ipPeer, if (naPeer.isValid()) { - boost::unordered_map::iterator itCm; - - itCm = mConnectedMap.find(naPeer); + boost::unordered_map::iterator itCm = mConnectedMap.find(naPeer); if (itCm == mConnectedMap.end()) { @@ -369,9 +367,7 @@ void ConnectionPool::peerDisconnected(Peer::pointer peer, const ipPort& ipPeer, } } - boost::unordered_map::iterator itIp; - - itIp = mIpMap.find(ipPeer); + boost::unordered_map::iterator itIp = mIpMap.find(ipPeer); if (itIp == mIpMap.end()) { diff --git a/src/LedgerAcquire.cpp b/src/LedgerAcquire.cpp index a94c0e0302..92e849b18d 100644 --- a/src/LedgerAcquire.cpp +++ b/src/LedgerAcquire.cpp @@ -370,10 +370,10 @@ bool LedgerAcquireMaster::hasLedger(const uint256& hash) return mLedgers.find(hash) != mLedgers.end(); } -bool LedgerAcquireMaster::dropLedger(const uint256& hash) +void LedgerAcquireMaster::dropLedger(const uint256& hash) { boost::mutex::scoped_lock sl(mLock); - return mLedgers.erase(hash); + mLedgers.erase(hash); } bool LedgerAcquireMaster::gotLedgerData(newcoin::TMLedgerData& packet, Peer::pointer peer) diff --git a/src/LedgerAcquire.h b/src/LedgerAcquire.h index 211567d320..681d4bd0e0 100644 --- a/src/LedgerAcquire.h +++ b/src/LedgerAcquire.h @@ -128,7 +128,7 @@ public: LedgerAcquire::pointer findCreate(const uint256& hash); LedgerAcquire::pointer find(const uint256& hash); bool hasLedger(const uint256& ledgerHash); - bool dropLedger(const uint256& ledgerHash); + void dropLedger(const uint256& ledgerHash); bool gotLedgerData(newcoin::TMLedgerData& packet, Peer::pointer); }; From 64f99820a89c902b0b671cc3309eeed2ce2e352f Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 19 Jun 2012 05:50:30 -0700 Subject: [PATCH 17/20] server_info command. --- src/NetworkOPs.cpp | 18 ++++++++++++++++++ src/NetworkOPs.h | 1 + src/RPCServer.cpp | 6 ++++++ src/RPCServer.h | 1 + 4 files changed, 26 insertions(+) diff --git a/src/NetworkOPs.cpp b/src/NetworkOPs.cpp index e38cb2b243..396e4cd271 100644 --- a/src/NetworkOPs.cpp +++ b/src/NetworkOPs.cpp @@ -596,4 +596,22 @@ bool NetworkOPs::recvValidation(SerializedValidation::pointer val) return theApp->getValidations().addValidation(val); } +Json::Value NetworkOPs::getServerInfo() +{ + Json::Value info = Json::objectValue; + switch(mMode) + { + case omDISCONNECTED: info["network_state"] = "disconected"; break; + case omCONNECTED: info["network_state"] = "connected"; break; + case omTRACKING: info["network_state"] = "tracking"; break; + case omFULL: info["network_state"] = "validating"; break; + default: info["network_state"] = "unknown"; + } + + if (!theConfig.VALIDATION_SEED.isValid()) info["validation_seed"] = "none"; + else info["validation_seed"] = theConfig.VALIDATION_SEED.humanNodePublic(); + + return info; +} + // vim:ts=4 diff --git a/src/NetworkOPs.h b/src/NetworkOPs.h index 5fdea311ed..2e7f1d531c 100644 --- a/src/NetworkOPs.h +++ b/src/NetworkOPs.h @@ -127,6 +127,7 @@ public: int beginConsensus(Ledger::pointer closingLedger); void endConsensus(); void setStateTimer(int seconds); + Json::Value getServerInfo(); // client information retrieval functions std::vector< std::pair > diff --git a/src/RPCServer.cpp b/src/RPCServer.cpp index b524681f6e..d3b84fb753 100644 --- a/src/RPCServer.cpp +++ b/src/RPCServer.cpp @@ -1231,6 +1231,11 @@ Json::Value RPCServer::doSend(Json::Value& params) } } +Json::Value RPCServer::doServerInfo(Json::Value& params) +{ + return theApp->getOPs().getServerInfo(); +} + // transit_set Json::Value RPCServer::doTransitSet(Json::Value& params) { @@ -1988,6 +1993,7 @@ Json::Value RPCServer::doCommand(const std::string& command, Json::Value& params { "password_set", &RPCServer::doPasswordSet, 2, 3, optNetwork }, { "peers", &RPCServer::doPeers, 0, 0, }, { "send", &RPCServer::doSend, 3, 7, optCurrent }, + { "server_info", &RPCServer::doServerInfo, 0, 0, }, { "stop", &RPCServer::doStop, 0, 0, }, { "transit_set", &RPCServer::doTransitSet, 5, 5, optCurrent }, { "tx", &RPCServer::doTx, 1, 1, }, diff --git a/src/RPCServer.h b/src/RPCServer.h index af9274e514..ef5640ea94 100644 --- a/src/RPCServer.h +++ b/src/RPCServer.h @@ -127,6 +127,7 @@ private: Json::Value doPasswordSet(Json::Value& params); Json::Value doPeers(Json::Value& params); Json::Value doSend(Json::Value& params); + Json::Value doServerInfo(Json::Value& params); Json::Value doSessionClose(Json::Value& params); Json::Value doSessionOpen(Json::Value& params); Json::Value doStop(Json::Value& params); From 5c12b29e17c57b4d74c840ab3e574f707b76d0d5 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 19 Jun 2012 06:01:15 -0700 Subject: [PATCH 18/20] server_info bug --- src/NetworkOPs.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/NetworkOPs.cpp b/src/NetworkOPs.cpp index 396e4cd271..20a0ce386c 100644 --- a/src/NetworkOPs.cpp +++ b/src/NetworkOPs.cpp @@ -599,7 +599,8 @@ bool NetworkOPs::recvValidation(SerializedValidation::pointer val) Json::Value NetworkOPs::getServerInfo() { Json::Value info = Json::objectValue; - switch(mMode) + + switch (mMode) { case omDISCONNECTED: info["network_state"] = "disconected"; break; case omCONNECTED: info["network_state"] = "connected"; break; @@ -609,7 +610,7 @@ Json::Value NetworkOPs::getServerInfo() } if (!theConfig.VALIDATION_SEED.isValid()) info["validation_seed"] = "none"; - else info["validation_seed"] = theConfig.VALIDATION_SEED.humanNodePublic(); + else info["validation_seed"] = NewcoinAddress::createNodePublic(theConfig.VALIDATION_SEED).humanNodePublic(); return info; } From e793381c1670a94f523736d23be43cb1b7b3db6c Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 19 Jun 2012 06:15:58 -0700 Subject: [PATCH 19/20] Missing status change broadcast. --- src/NetworkOPs.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/NetworkOPs.cpp b/src/NetworkOPs.cpp index 20a0ce386c..b9558ec8d8 100644 --- a/src/NetworkOPs.cpp +++ b/src/NetworkOPs.cpp @@ -420,6 +420,12 @@ void NetworkOPs::checkState(const boost::system::error_code& result) // check if the ledger is bad enough to go to omTRACKING } + if (mMode != omFULL) + { + setStateTimer(4); + return; + } + int secondsToClose = theApp->getMasterLedger().getCurrentLedger()->getCloseTimeNC() - theApp->getOPs().getNetworkTimeNC(); if ((!mConsensus) && (secondsToClose < LEDGER_WOBBLE_TIME)) // pre close wobble @@ -444,12 +450,15 @@ void NetworkOPs::switchLastClosedLedger(Ledger::pointer newLedger) Ledger::pointer openLedger = boost::make_shared(false, boost::ref(*newLedger)); mLedgerMaster->switchLedgers(newLedger, openLedger); - if (getNetworkTimeNC() > openLedger->getCloseTimeNC()) - { // this ledger has already closed - } - + newcoin::TMStatusChange s; + s.set_newevent(newcoin::neSWITCHED_LEDGER); + s.set_ledgerseq(newLedger->getLedgerSeq()); + s.set_networktime(theApp->getOPs().getNetworkTimeNC()); + uint256 plhash = newLedger->getParentHash(); + s.set_previousledgerhash(plhash.begin(), plhash.size()); + PackedMessage::pointer packet = boost::make_shared(s, newcoin::mtSTATUS_CHANGE); + theApp->getConnectionPool().relayMessage(NULL, packet); } -// vim:ts=4 int NetworkOPs::beginConsensus(Ledger::pointer closingLedger) { From cc0d1f60ab3d26af63b9cf1733cc43fcb8e5470a Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 19 Jun 2012 06:33:21 -0700 Subject: [PATCH 20/20] Fix some timing and logic problems with sequencing to full mode. --- src/NetworkOPs.cpp | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/NetworkOPs.cpp b/src/NetworkOPs.cpp index b9558ec8d8..e96a0d4306 100644 --- a/src/NetworkOPs.cpp +++ b/src/NetworkOPs.cpp @@ -246,15 +246,17 @@ RippleState::pointer NetworkOPs::getRippleState(const uint256& uLedger, const ui void NetworkOPs::setStateTimer(int sec) { // set timer early if ledger is closing - uint64 consensusTime = mLedgerMaster->getCurrentLedger()->getCloseTimeNC() - LEDGER_WOBBLE_TIME; - uint64 now = getNetworkTimeNC(); - - if ((mMode == omFULL) && !mConsensus) + if (!mConsensus && ((mMode == omFULL) || (mMode == omTRACKING))) { - if (now >= consensusTime) sec = 0; - else if (sec > (consensusTime - now)) sec = (consensusTime - now); - } + uint64 consensusTime = mLedgerMaster->getCurrentLedger()->getCloseTimeNC() - LEDGER_WOBBLE_TIME; + uint64 now = getNetworkTimeNC(); + if ((mMode == omFULL) && !mConsensus) + { + if (now >= consensusTime) sec = 0; + else if (sec > (consensusTime - now)) sec = (consensusTime - now); + } + } mNetTimer.expires_from_now(boost::posix_time::seconds(sec)); mNetTimer.async_wait(boost::bind(&NetworkOPs::checkState, this, boost::asio::placeholders::error)); } @@ -366,9 +368,9 @@ void NetworkOPs::checkState(const boost::system::error_code& result) if (switchLedgers) { Log(lsWARNING) << "We are not running on the consensus ledger"; - Log(lsINFO) << "Our LCL " << currentClosed->getHash().GetHex() ; - Log(lsINFO) << "Net LCL " << closedLedger.GetHex() ; - if ((mMode == omTRACKING) || (mMode == omFULL)) setMode(omTRACKING); + Log(lsINFO) << "Our LCL " << currentClosed->getHash().GetHex(); + Log(lsINFO) << "Net LCL " << closedLedger.GetHex(); + if ((mMode == omTRACKING) || (mMode == omFULL)) setMode(omCONNECTED); Ledger::pointer consensus = mLedgerMaster->getLedgerByHash(closedLedger); if (!consensus) { @@ -412,7 +414,14 @@ void NetworkOPs::checkState(const boost::system::error_code& result) // check if the ledger is good enough to go to omFULL // Note: Do not go to omFULL if we don't have the previous ledger // check if the ledger is bad enough to go to omCONNECTED -- TODO - if ((!switchLedgers) && theConfig.VALIDATION_SEED.isValid()) setMode(omFULL); + if ((!switchLedgers) && theConfig.VALIDATION_SEED.isValid()) + { + if (theApp->getOPs().getNetworkTimeNC() < + (theApp->getMasterLedger().getCurrentLedger()->getCloseTimeNC() + 4)) + setMode(omFULL); + else + Log(lsWARNING) << "Too late to go to full, try next ledger"; + } } if (mMode == omFULL)