# # # patch "ChangeLog" # from [e2fd0804a517a3c62c2619e07fb1401d4c9c50ee] # to [9de161c117d523d724d6ef971a3a4a3f1b3ac21a] # # patch "netsync.cc" # from [a259724511fd7999b39fe3416291886d24ba4445] # to [92edcc8965d9a45443c912428b3488b586bf65e2] # ============================================================ --- ChangeLog e2fd0804a517a3c62c2619e07fb1401d4c9c50ee +++ ChangeLog 9de161c117d523d724d6ef971a3a4a3f1b3ac21a @@ -1,3 +1,14 @@ +2006-03-18 Richard Levitte + + * netsync.cc (session): Only call the note_netsync hooks if + something has been written to the database. The reason is that + if those hooks are called from a server process and those hooks + are used to update another database (say, for viewmtn), it means + another run will be done with monotone to pull from the server, + which would trigger another call to the hooks, which would cause + another pull, which would cause those hooks to be called again, + ... + 2006-03-17 Richard Levitte * tests/t_netsync_notes.at: New test to check that the ============================================================ --- netsync.cc a259724511fd7999b39fe3416291886d24ba4445 +++ netsync.cc 92edcc8965d9a45443c912428b3488b586bf65e2 @@ -500,7 +500,7 @@ string nonce; for (int i = 0; i < 16; i++) nonce.append(1, letters[Botan::Global_RNG::random(Botan::Nonce) - % sizeof(letters)]); + % (sizeof(letters) - 1)]); vector unattached_certs; map > revcerts; @@ -518,47 +518,52 @@ j->second.push_back(*i); } - //Start - app.lua.hook_note_netsync_start(nonce); - - //Keys - for (vector::iterator i = written_keys.begin(); - i != written_keys.end(); ++i) + // if (role == sink_role || role == source_and_sink_role) + if (!written_keys.empty() + || !written_revisions.empty() + || !written_certs.empty()) { - app.lua.hook_note_netsync_pubkey_received(*i, nonce); - } + //Start + app.lua.hook_note_netsync_start(nonce); - //Revisions - for (vector::iterator i = written_revisions.begin(); - i != written_revisions.end(); ++i) - { - vector & ctmp(revcerts[*i]); - set > > certs; - for (vector::const_iterator j = ctmp.begin(); - j != ctmp.end(); ++j) + //Keys + for (vector::iterator i = written_keys.begin(); + i != written_keys.end(); ++i) { - cert_value vtmp; - decode_base64(j->value, vtmp); - certs.insert(make_pair(j->key, make_pair(j->name, vtmp))); + app.lua.hook_note_netsync_pubkey_received(*i, nonce); } - revision_data rdat; - app.db.get_revision(*i, rdat); - app.lua.hook_note_netsync_revision_received(*i, rdat, certs, nonce); - } - //Certs (not attached to a new revision) - for (vector::iterator i = unattached_certs.begin(); - i != unattached_certs.end(); ++i) - { - cert_value tmp; - decode_base64(i->value, tmp); - app.lua.hook_note_netsync_cert_received(i->ident, i->key, - i->name, tmp, nonce); + //Revisions + for (vector::iterator i = written_revisions.begin(); + i != written_revisions.end(); ++i) + { + vector & ctmp(revcerts[*i]); + set > > certs; + for (vector::const_iterator j = ctmp.begin(); + j != ctmp.end(); ++j) + { + cert_value vtmp; + decode_base64(j->value, vtmp); + certs.insert(make_pair(j->key, make_pair(j->name, vtmp))); + } + revision_data rdat; + app.db.get_revision(*i, rdat); + app.lua.hook_note_netsync_revision_received(*i, rdat, certs, nonce); + } + //Certs (not attached to a new revision) + for (vector::iterator i = unattached_certs.begin(); + i != unattached_certs.end(); ++i) + { + cert_value tmp; + decode_base64(i->value, tmp); + app.lua.hook_note_netsync_cert_received(i->ident, i->key, + i->name, tmp, nonce); + } + + //Start + app.lua.hook_note_netsync_end(nonce); } - - //Start - app.lua.hook_note_netsync_end(nonce); } bool