Report/track peer ledger changes.

This commit is contained in:
JoelKatz
2012-05-08 04:14:51 -07:00
parent 94d7579deb
commit 9d1cc2b5e5
3 changed files with 57 additions and 14 deletions

View File

@@ -324,6 +324,19 @@ void NetworkOPs::switchLastClosedLedger(Ledger::pointer newLedger, bool normal)
{ // this ledger has already closed { // this ledger has already closed
} }
newcoin::TMStatusChange* s = new newcoin::TMStatusChange();
s->set_newevent(normal ? newcoin::neACCEPTED_LEDGER : newcoin::neSWITCHED_LEDGER);
s->set_ledgerseq(newLedger->getLedgerSeq());
s->set_networktime(getNetworkTimeNC());
uint256 lhash = newLedger->getHash();
s->set_ledgerhash(lhash.begin(), lhash.size());
lhash = newLedger->getParentHash();
s->set_previousledgerhash(lhash.begin(), lhash.size());
PackedMessage::pointer packet =
boost::make_shared<PackedMessage>(PackedMessage::MessagePointer(s), newcoin::mtSTATUS_CHANGE);
theApp->getConnectionPool().relayMessage(NULL, packet);
} }
// FIXME: We have to tell peers when we change our active ledger

View File

@@ -34,7 +34,7 @@ void Peer::handle_write(const boost::system::error_code& error, size_t bytes_tra
std::cerr << "Peer::handle_write bytes: "<< bytes_transferred << std::endl; std::cerr << "Peer::handle_write bytes: "<< bytes_transferred << std::endl;
#endif #endif
mSendingPacket=PackedMessage::pointer(); mSendingPacket = PackedMessage::pointer();
if(error) if(error)
{ {
@@ -400,6 +400,17 @@ void Peer::processReadBuffer()
} }
break; break;
case newcoin::mtSTATUS_CHANGE:
{
newcoin::TMStatusChange msg;
if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
recvStatus(msg);
else std::cerr << "parse error: " << type << std::endl;
}
break;
case newcoin::mtGET_LEDGER: case newcoin::mtGET_LEDGER:
{ {
newcoin::TMGetLedger msg; newcoin::TMGetLedger msg;
@@ -627,33 +638,49 @@ void Peer::recvAccount(newcoin::TMAccount& packet)
{ {
} }
void Peer::recvStatus(newcoin::TMStatusChange& packet)
{
if (packet.has_ledgerhash() && (packet.ledgerhash().size() == (256 / 8)))
{ // a peer has changed ledgers
if (packet.has_previousledgerhash() && (packet.previousledgerhash().size() == (256 / 8)))
memcpy(mPreviousLedgerHash.begin(), packet.previousledgerhash().data(), 256 / 8);
else
mPreviousLedgerHash = mClosedLedgerHash;
memcpy(mClosedLedgerHash.begin(), packet.ledgerhash().data(), 256 / 8);
if (packet.has_networktime())
mClosedLedgerTime = ptFromSeconds(packet.networktime());
else
mClosedLedgerTime = theApp->getOPs().getNetworkTimePT();
}
}
void Peer::recvGetLedger(newcoin::TMGetLedger& packet) void Peer::recvGetLedger(newcoin::TMGetLedger& packet)
{ {
// Figure out what ledger they want // Figure out what ledger they want
Ledger::pointer ledger; Ledger::pointer ledger;
if(packet.has_ledgerhash()) if (packet.has_ledgerhash())
{ {
uint256 ledgerhash; uint256 ledgerhash;
if(packet.ledgerhash().size()!=32) if (packet.ledgerhash().size() != 32)
{ {
punishPeer(PP_INVALID_REQUEST); punishPeer(PP_INVALID_REQUEST);
return; return;
} }
memcpy(&ledgerhash, packet.ledgerhash().data(), 32); memcpy(&ledgerhash, packet.ledgerhash().data(), 32);
ledger=theApp->getMasterLedger().getLedgerByHash(ledgerhash); ledger = theApp->getMasterLedger().getLedgerByHash(ledgerhash);
} }
else if(packet.has_ledgerseq()) else if (packet.has_ledgerseq())
ledger=theApp->getMasterLedger().getLedgerBySeq(packet.ledgerseq()); ledger = theApp->getMasterLedger().getLedgerBySeq(packet.ledgerseq());
else if(packet.has_ltype() && (packet.ltype() == newcoin::ltCURRENT) ) else if (packet.has_ltype() && (packet.ltype() == newcoin::ltCURRENT))
ledger=theApp->getMasterLedger().getCurrentLedger(); ledger = theApp->getMasterLedger().getCurrentLedger();
else if(packet.has_ltype() && (packet.ltype() == newcoin::ltCLOSING) ) else if (packet.has_ltype() && (packet.ltype() == newcoin::ltCLOSING))
{ {
ledger = theApp->getMasterLedger().getClosedLedger(); ledger = theApp->getMasterLedger().getClosedLedger();
} }
else if(packet.has_ltype() && (packet.ltype() == newcoin::ltCLOSED) ) else if (packet.has_ltype() && (packet.ltype() == newcoin::ltCLOSED) )
{ {
ledger = theApp->getMasterLedger().getClosedLedger(); ledger = theApp->getMasterLedger().getClosedLedger();
if(ledger && !ledger->isClosed()) if (ledger && !ledger->isClosed())
ledger = theApp->getMasterLedger().getLedgerBySeq(ledger->getLedgerSeq() - 1); ledger = theApp->getMasterLedger().getLedgerBySeq(ledger->getLedgerSeq() - 1);
} }
else else
@@ -669,8 +696,8 @@ void Peer::recvGetLedger(newcoin::TMGetLedger& packet)
} }
// Figure out what information they want // Figure out what information they want
newcoin::TMLedgerData* data=new newcoin::TMLedgerData; newcoin::TMLedgerData* data =new newcoin::TMLedgerData;
uint256 lHash=ledger->getHash(); uint256 lHash = ledger->getHash();
data->set_ledgerhash(lHash.begin(), lHash.size()); data->set_ledgerhash(lHash.begin(), lHash.size());
data->set_ledgerseq(ledger->getLedgerSeq()); data->set_ledgerseq(ledger->getLedgerSeq());
data->set_type(packet.itype()); data->set_type(packet.itype());
@@ -788,6 +815,8 @@ void Peer::sendHello()
{ {
uint256 hash = closedLedger->getHash(); uint256 hash = closedLedger->getHash();
h->set_closedledger(hash.begin(), hash.GetSerializeSize()); h->set_closedledger(hash.begin(), hash.GetSerializeSize());
hash = closedLedger->getParentHash();
h->set_previousledger(hash.begin(), hash.GetSerializeSize());
} }
PackedMessage::pointer packet = boost::make_shared<PackedMessage> PackedMessage::pointer packet = boost::make_shared<PackedMessage>

View File

@@ -83,6 +83,7 @@ protected:
void recvAccount(newcoin::TMAccount& packet); void recvAccount(newcoin::TMAccount& packet);
void recvGetLedger(newcoin::TMGetLedger& packet); void recvGetLedger(newcoin::TMGetLedger& packet);
void recvLedger(newcoin::TMLedgerData& packet); void recvLedger(newcoin::TMLedgerData& packet);
void recvStatus(newcoin::TMStatusChange& packet);
void getSessionCookie(std::string& strDst); void getSessionCookie(std::string& strDst);