From ccc07e176525dcca2952dceb08007f0253abff32 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 8 May 2012 14:23:51 -0700 Subject: [PATCH] bugfixes. --- src/ConnectionPool.cpp | 15 +++++++++------ src/NetworkOPs.cpp | 39 ++++++++++++++++++++++++++++----------- src/Peer.cpp | 12 ++++++++++-- 3 files changed, 47 insertions(+), 19 deletions(-) diff --git a/src/ConnectionPool.cpp b/src/ConnectionPool.cpp index f1b66b65f..51baf795f 100644 --- a/src/ConnectionPool.cpp +++ b/src/ConnectionPool.cpp @@ -123,8 +123,9 @@ void ConnectionPool::relayMessage(Peer* fromPeer, PackedMessage::pointer msg) BOOST_FOREACH(naPeer pair, mConnectedMap) { Peer::pointer peer = pair.second; - - if(!fromPeer || !(peer.get() == fromPeer)) + if (!peer) + std::cerr << "CP::RM null peer in list" << std::endl; + else if (!fromPeer || !(peer.get() == fromPeer)) peer->sendPacket(msg); } } @@ -208,8 +209,9 @@ Json::Value ConnectionPool::getPeersJson() BOOST_FOREACH(naPeer pair, mConnectedMap) { Peer::pointer peer = pair.second; - - ret.append(peer->getJson()); + if (!peer) + std::cerr << "CP::GPH null peer" << std::endl; + else ret.append(peer->getJson()); } return ret; @@ -218,10 +220,11 @@ Json::Value ConnectionPool::getPeersJson() std::vector ConnectionPool::getPeerVector() { std::vector ret; - ret.resize(mConnectedMap.size()); + ret.reserve(mConnectedMap.size()); BOOST_FOREACH(naPeer pair, mConnectedMap) { + assert(!!pair.second); ret.push_back(pair.second); } @@ -234,7 +237,7 @@ bool ConnectionPool::peerConnected(Peer::pointer peer, const NewcoinAddress& na) bool bSuccess; std::cerr << "ConnectionPool::peerConnected: " << na.humanNodePublic() << std::endl; - + assert(!!peer); if (na == theApp->getWallet().getNodePublic()) { std::cerr << "ConnectionPool::peerConnected: To self." << std::endl; diff --git a/src/NetworkOPs.cpp b/src/NetworkOPs.cpp index 218313844..190d5f112 100644 --- a/src/NetworkOPs.cpp +++ b/src/NetworkOPs.cpp @@ -156,7 +156,7 @@ AccountState::pointer NetworkOPs::getAccountState(const NewcoinAddress& accountI } void NetworkOPs::setStateTimer(int sec) -{ +{ // set timer early if ledger is closing uint64 closedTime = theApp->getMasterLedger().getCurrentLedger()->getCloseTimeNC(); uint64 now = getNetworkTimeNC(); @@ -215,15 +215,22 @@ void NetworkOPs::checkState() for (std::vector::iterator it = peerList.begin(), end = peerList.end(); it != end; ++it) { - uint256 peerLedger = (*it)->getClosedLedgerHash(); - if (!!peerLedger) + if (!*it) { - // FIXME: If we have this ledger, don't count it if it's too far past its close time - ValidationCount& vc = ledgers[peerLedger]; - if ((vc.nodesUsing == 0) || ((*it)->getNodePublic() > vc.highNode)) - vc.highNode = (*it)->getNodePublic(); - ++vc.nodesUsing; - // WRITEME: Validations, trusted peers + std::cerr << "NOP::CS Dead pointer in peer list" << std::endl; + } + else + { + uint256 peerLedger = (*it)->getClosedLedgerHash(); + if (!!peerLedger) + { + // FIXME: If we have this ledger, don't count it if it's too far past its close time + ValidationCount& vc = ledgers[peerLedger]; + if ((vc.nodesUsing == 0) || ((*it)->getNodePublic() > vc.highNode)) + vc.highNode = (*it)->getNodePublic(); + ++vc.nodesUsing; + // WRITEME: Validations, trusted peers + } } } @@ -247,10 +254,15 @@ void NetworkOPs::checkState() } } + if (switchLedgers) { std::cerr << "We are not running on the consensus ledger" << std::endl; - if ( (mMode == omTRACKING) || (mMode == omFULL) ) mMode = omTRACKING; +#ifdef DEBUG + std::cerr << "Our LCL " << currentClosed->getHash().GetHex() << std::endl; + std::cerr << "Net LCL " << closedLedger.GetHex() << std::endl; +#endif + if ((mMode == omTRACKING) || (mMode == omFULL)) mMode = omTRACKING; Ledger::pointer consensus = theApp->getMasterLedger().getLedgerByHash(closedLedger); if (!consensus) { @@ -293,7 +305,7 @@ void NetworkOPs::checkState() } Ledger::pointer currentLedger = theApp->getMasterLedger().getCurrentLedger(); - if (getNetworkTimeNC() > currentLedger->getCloseTimeNC()) + if (getNetworkTimeNC() >= currentLedger->getCloseTimeNC()) { currentLedger->setClosed(); switchLastClosedLedger(currentLedger, true); @@ -335,6 +347,11 @@ void NetworkOPs::switchLastClosedLedger(Ledger::pointer newLedger, bool normal) lhash = newLedger->getParentHash(); s->set_previousledgerhash(lhash.begin(), lhash.size()); + +#ifdef DEBUG + std::cerr << "Broadcasting ledger change" << std::endl; +#endif + PackedMessage::pointer packet = boost::make_shared(PackedMessage::MessagePointer(s), newcoin::mtSTATUS_CHANGE); theApp->getConnectionPool().relayMessage(NULL, packet); diff --git a/src/Peer.cpp b/src/Peer.cpp index 9b318d1f0..e8f3007ff 100644 --- a/src/Peer.cpp +++ b/src/Peer.cpp @@ -98,7 +98,7 @@ void Peer::handleVerifyTimer(const boost::system::error_code& ecResult) // Only takes IP addresses (not domains). void Peer::connect(const std::string strIp, int iPort) { - int iPortAct = iPort < 0 ? SYSTEM_PEER_PORT : iPort; + int iPortAct = (iPort <= 0) ? SYSTEM_PEER_PORT : iPort; mClientConnect = true; @@ -115,6 +115,7 @@ void Peer::connect(const std::string strIp, int iPort) { std::cerr << "Peer::connect: Bad IP" << std::endl; detach(); + return; } else { @@ -125,12 +126,13 @@ void Peer::connect(const std::string strIp, int iPort) { std::cerr << "Peer::connect: Failed to set timer." << std::endl; detach(); + return; } } if (!err) { - std::cerr << "Peer::connect: Connectting: " << mIpPort.first << " " << mIpPort.second << std::endl; + std::cerr << "Peer::connect: Connecting: " << mIpPort.first << " " << mIpPort.second << std::endl; boost::asio::async_connect( mSocketSsl.lowest_layer(), @@ -640,6 +642,9 @@ void Peer::recvAccount(newcoin::TMAccount& packet) void Peer::recvStatus(newcoin::TMStatusChange& packet) { +#ifdef DEBUG + std::cerr << "Received status change from peer" << std::endl; +#endif if (packet.has_ledgerhash() && (packet.ledgerhash().size() == (256 / 8))) { // a peer has changed ledgers if (packet.has_previousledgerhash() && (packet.previousledgerhash().size() == (256 / 8))) @@ -651,6 +656,9 @@ void Peer::recvStatus(newcoin::TMStatusChange& packet) mClosedLedgerTime = ptFromSeconds(packet.networktime()); else mClosedLedgerTime = theApp->getOPs().getNetworkTimePT(); +#ifdef DEBUG + std::cerr << "peer LCL is " << mClosedLedgerHash.GetHex() << std::endl; +#endif } }