# # patch "ChangeLog" # from [e6d610afcc4f92bcbeab2aa860fd84ff8a5bfdb8] # to [a9a9797a127c19452fcfab59861e0d4ff24be637] # # patch "netsync.cc" # from [11c23b266ccccb4742d2c0ae6502fbca9fccd6c5] # to [3356a1e19ea706b038af1c28d74ae55e1e6fc712] # --- ChangeLog +++ ChangeLog @@ -1,5 +1,10 @@ 2005-05-30 Timothy Brownawell + * netsync.cc: Call note_netsync_*_received hooks in the order they're + written to the db (for revisions, gives topological order). + +2005-05-30 Timothy Brownawell + * lua.{cc,hh}: Replace note_netsync_commit with note_netsync_{revision,cert,pubkey}_received * packet.{cc,hh}: Callbacks for cert or key written to the database. --- netsync.cc +++ netsync.cc @@ -236,9 +236,9 @@ auto_ptr revision_out_ticker; auto_ptr revision_checked_ticker; - set written_revisions; - set written_keys; - set written_certs; + vector written_revisions; + vector written_keys; + vector written_certs; map< std::pair, boost::shared_ptr > merkle_tables; @@ -489,57 +489,69 @@ session::~session() { + vector unattached_certs; + map > revcerts; + for(vector::iterator i=written_revisions.begin(); + i!=written_revisions.end(); ++i) + revcerts.insert(make_pair(*i, vector())); + for(vector::iterator i=written_certs.begin(); + i!=written_certs.end(); ++i) + { + map >::iterator j; + j=revcerts.find(i->ident); + if(j==revcerts.end()) + unattached_certs.push_back(*i); + else + j->second.push_back(*i); + } + //Keys - for(set::iterator i=written_keys.begin(); + for(vector::iterator i=written_keys.begin(); i!=written_keys.end(); ++i) { app.lua.hook_note_netsync_pubkey_received(*i); } //Revisions - for(set::iterator i=written_revisions.begin(); + for(vector::iterator i=written_revisions.begin(); i!=written_revisions.end(); ++i) { + vector & ctmp(revcerts[*i]); set > > certs; - vector< revision > ctmp; - app.db.get_revision_certs(*i, ctmp); - for (vector< revision >::const_iterator j = ctmp.begin(); + for (vector::const_iterator j = ctmp.begin(); j != ctmp.end(); ++j) { cert_value vtmp; - decode_base64(j->inner().value, vtmp); - certs.insert(make_pair(j->inner().key, - make_pair(j->inner().name, vtmp))); + decode_base64(j->value, vtmp); + certs.insert(make_pair(j->key, make_pair(j->name, vtmp))); } app.lua.hook_note_netsync_revision_received(*i, certs); } //Certs (not attached to a new revision) - for(set::iterator i=written_certs.begin(); - i!=written_certs.end(); ++i) + for(vector::iterator i = unattached_certs.begin(); + i != unattached_certs.end(); ++i) { - if(written_revisions.find(i->ident)==written_revisions.end()) - { - cert_value tmp; - decode_base64(i->value, tmp); - app.lua.hook_note_netsync_cert_received(i->ident, i->key, - i->name, tmp); - } + cert_value tmp; + decode_base64(i->value, tmp); + app.lua.hook_note_netsync_cert_received(i->ident, i->key, + i->name, tmp); + } } void session::rev_written_callback(revision_id rid) { if(revision_checked_ticker.get()) ++(*revision_checked_ticker); - written_revisions.insert(rid); + written_revisions.push_back(rid); } void session::key_written_callback(rsa_keypair_id kid) { - written_keys.insert(kid); + written_keys.push_back(kid); } void session::cert_written_callback(cert const & c) { - written_certs.insert(c); + written_certs.push_back(c); } id