# # # patch "cmd_netsync.cc" # from [f521c38b701d44d4e650c1c2ce1ff3291aeb1f2f] # to [f6886ec310273d68d851a5befdc51e8d1b328339] # # patch "netsync.cc" # from [7e2ab1d800ce5a89fff62b23cefd1fb86cae13a0] # to [23b3d65718b94c552bcbb12beb74b3a44f0c8b5e] # # patch "netsync.hh" # from [589643774744dce35d42ad5acd58adcb092a39b3] # to [8011f174b4ff35bd68978807447ed216b96fe85e] # # patch "network/connection_info.cc" # from [7ce0811e2070b448da20d59f881192a9285ca467] # to [eb5d6b6e5200db58bbc7e98ffdc0395da3170f20] # # patch "network/connection_info.hh" # from [eec1ebb3e3d8de7755a8a65f9cae6440518c93b6] # to [a6fa98483898157e39bf562165b952aa1a86f1a2] # # patch "network/netsync_session.cc" # from [ac76090394d359b49edc3e3d6a4ed7784b4191a2] # to [a76ea07d29575f71bfb47e68f4ba1371a72e3028] # # patch "network/netsync_session.hh" # from [9923bf206a2dd21156b3b2d09aaf09beb45edc39] # to [dc2518ca378ed077216bb1630c5c89509ef5830b] # # patch "network/session.cc" # from [04f99fb3516968474cde97892d9b219ea0d5505e] # to [83293a5ca55e7cec0d9a139cbc6b63cb500223b1] # ============================================================ --- netsync.cc 7e2ab1d800ce5a89fff62b23cefd1fb86cae13a0 +++ netsync.cc 23b3d65718b94c552bcbb12beb74b3a44f0c8b5e @@ -100,7 +100,8 @@ call_server(app_state & app, project_t & project, key_store & keys, protocol_role role, - shared_conn_info const & info) + shared_conn_info const & info, + shared_conn_counts const & counts) { Netxx::PipeCompatibleProbe probe; transaction_guard guard(project.db); @@ -130,7 +131,7 @@ call_server(app_state & app, keys, role, info->client.get_include_pattern(), info->client.get_exclude_pattern(), - info)); + counts)); break; case automate_connection: wrapped.reset(new automate_session(app, sess.get(), @@ -233,7 +234,7 @@ session_from_server_sync_item(app_state keys, request.role, info->client.get_include_pattern(), info->client.get_exclude_pattern(), - shared_conn_info(), + connection_counts::create(), true)); sess->set_inner(wrapped); return sess; @@ -379,7 +380,8 @@ run_netsync_protocol(app_state & app, project_t & project, key_store & keys, protocol_voice voice, protocol_role role, - shared_conn_info & info) + shared_conn_info & info, + shared_conn_counts const & counts) { // We do not want to be killed by SIGPIPE from a network disconnect. ignore_sigpipe(); @@ -405,7 +407,7 @@ run_netsync_protocol(app_state & app, else { I(voice == client_voice); - call_server(app, project, keys, role, info); + call_server(app, project, keys, role, info, counts); info->client.set_connection_successful(); } } ============================================================ --- cmd_netsync.cc f521c38b701d44d4e650c1c2ce1ff3291aeb1f2f +++ cmd_netsync.cc f6886ec310273d68d851a5befdc51e8d1b328339 @@ -139,7 +139,8 @@ CMD_AUTOMATE_NO_STDIO(remote_stdio, info->client.set_output_stream(os); run_netsync_protocol(app, app.opts, app.lua, project, keys, - client_voice, source_and_sink_role, info); + client_voice, source_and_sink_role, info, + connection_counts::create()); } // shamelessly copied and adapted from option.cc @@ -266,43 +267,44 @@ CMD_AUTOMATE_NO_STDIO(remote, info->client.set_output_stream(os); run_netsync_protocol(app, app.opts, app.lua, project, keys, - client_voice, source_and_sink_role, info); + client_voice, source_and_sink_role, info, + connection_counts::create()); E(os.get_error() == 0, origin::network, F("received remote error code %d") % os.get_error()); } void print_dryrun_info(protocol_role role, - shared_conn_info info, + shared_conn_counts counts, project_t & project) { if (role != source_role) { - if (info->keys_in.can_have_more_than_min) + if (counts->keys_in.can_have_more_than_min) { P(F("would receive %d revisions, %d certs, and at least %d keys") - % info->revs_in.min_count - % info->certs_in.min_count - % info->keys_in.min_count); + % counts->revs_in.min_count + % counts->certs_in.min_count + % counts->keys_in.min_count); } else { P(F("would receive %d revisions, %d certs, and %d keys") - % info->revs_in.min_count - % info->certs_in.min_count - % info->keys_in.min_count); + % counts->revs_in.min_count + % counts->certs_in.min_count + % counts->keys_in.min_count); } } if (role != sink_role) { P(F("would send %d certs and %d keys") - % info->certs_out.min_count - % info->keys_out.min_count); + % counts->certs_out.min_count + % counts->keys_out.min_count); P(F("would send %d revisions:") - % info->revs_out.min_count); + % counts->revs_out.min_count); map branch_counts; - for (vector::const_iterator i = info->revs_out.items.begin(); - i != info->revs_out.items.end(); ++i) + for (vector::const_iterator i = counts->revs_out.items.begin(); + i != counts->revs_out.items.end(); ++i) { set my_branches; project.get_revision_branches(*i, my_branches); @@ -337,10 +339,11 @@ CMD(push, "push", "", CMD_REF(network), extract_client_connection_info(app.opts, project, keys, app.lua, netsync_connection, args, info); + shared_conn_counts counts = connection_counts::create(); run_netsync_protocol(app, app.opts, app.lua, project, keys, - client_voice, source_role, info); + client_voice, source_role, info, counts); if (app.opts.dryrun) - print_dryrun_info(source_role, info, project); + print_dryrun_info(source_role, counts, project); } CMD_AUTOMATE(push, N_("[URL]\n[ADDRESS[:PORTNUMBER] [PATTERN ...]]"), @@ -359,10 +362,11 @@ CMD_AUTOMATE(push, N_("[URL]\n[ADDRESS[: extract_client_connection_info(app.opts, project, keys, app.lua, netsync_connection, args, info); + shared_conn_counts counts = connection_counts::create(); run_netsync_protocol(app, app.opts, app.lua, project, keys, - client_voice, source_role, info); + client_voice, source_role, info, counts); if (app.opts.dryrun) - print_dryrun_info(source_role, info, project); + print_dryrun_info(source_role, counts, project); } CMD(pull, "pull", "", CMD_REF(network), @@ -387,12 +391,13 @@ CMD(pull, "pull", "", CMD_REF(network), if (!keys.have_signing_key()) P(F("doing anonymous pull; use -kKEYNAME if you need authentication")); + shared_conn_counts counts = connection_counts::create(); run_netsync_protocol(app, app.opts, app.lua, project, keys, - client_voice, sink_role, info); + client_voice, sink_role, info, counts); updater.maybe_do_update(); if (app.opts.dryrun) - print_dryrun_info(sink_role, info, project); + print_dryrun_info(sink_role, counts, project); } CMD_AUTOMATE(pull, N_("[URL]\n[ADDRESS[:PORTNUMBER] [PATTERN ...]]"), @@ -411,10 +416,11 @@ CMD_AUTOMATE(pull, N_("[URL]\n[ADDRESS[: extract_client_connection_info(app.opts, project, keys, app.lua, netsync_connection, args, info, key_optional); + shared_conn_counts counts = connection_counts::create(); run_netsync_protocol(app, app.opts, app.lua, project, keys, - client_voice, sink_role, info); + client_voice, sink_role, info, counts); if (app.opts.dryrun) - print_dryrun_info(sink_role, info, project); + print_dryrun_info(sink_role, counts, project); } CMD(sync, "sync", "", CMD_REF(network), @@ -444,12 +450,13 @@ CMD(sync, "sync", "", CMD_REF(network), workspace::set_options(app.opts, app.lua); } + shared_conn_counts counts = connection_counts::create(); run_netsync_protocol(app, app.opts, app.lua, project, keys, - client_voice, source_and_sink_role, info); + client_voice, source_and_sink_role, info, counts); updater.maybe_do_update(); if (app.opts.dryrun) - print_dryrun_info(source_and_sink_role, info, project); + print_dryrun_info(source_and_sink_role, counts, project); } CMD_AUTOMATE(sync, N_("[URL]\n[ADDRESS[:PORTNUMBER] [PATTERN ...]]"), @@ -474,10 +481,11 @@ CMD_AUTOMATE(sync, N_("[URL]\n[ADDRESS[: workspace::set_options(app.opts, app.lua); } + shared_conn_counts counts = connection_counts::create(); run_netsync_protocol(app, app.opts, app.lua, project, keys, - client_voice, source_and_sink_role, info); + client_voice, source_and_sink_role, info, counts); if (app.opts.dryrun) - print_dryrun_info(source_and_sink_role, info, project); + print_dryrun_info(source_and_sink_role, counts, project); } CMD_NO_WORKSPACE(clone, "clone", "", CMD_REF(network), @@ -610,7 +618,8 @@ CMD_NO_WORKSPACE(clone, "clone", "", CMD change_current_working_dir(start_dir); run_netsync_protocol(app, app.opts, app.lua, project, keys, - client_voice, sink_role, info); + client_voice, sink_role, info, + connection_counts::create()); change_current_working_dir(workspace_dir); @@ -726,7 +735,8 @@ CMD_NO_WORKSPACE(serve, "serve", "", CMD } run_netsync_protocol(app, app.opts, app.lua, project, keys, - server_voice, source_and_sink_role, info); + server_voice, source_and_sink_role, info, + connection_counts::create()); } // Local Variables: ============================================================ --- network/netsync_session.cc ac76090394d359b49edc3e3d6a4ed7784b4191a2 +++ network/netsync_session.cc a76ea07d29575f71bfb47e68f4ba1371a72e3028 @@ -75,7 +75,7 @@ netsync_session::netsync_session(session protocol_role role, globish const & our_include_pattern, globish const & our_exclude_pattern, - shared_conn_info info, + shared_conn_counts counts, bool initiated_by_server) : wrapped_session(owner), role(role), @@ -102,12 +102,11 @@ netsync_session::netsync_session(session rev_refiner(revision_item, get_voice(), *this), is_dry_run(opts.dryrun), dry_run_keys_refined(false), - conn_info(info), + counts(counts), rev_enumerator(project, *this), initiated_by_server(initiated_by_server) { - if (!conn_info) - conn_info = netsync_connection_info::create_empty(); + I(counts); for (vector::const_iterator i = opts.keys_to_push.begin(); i != opts.keys_to_push.end(); ++i) @@ -143,11 +142,11 @@ void netsync_session::on_end(size_t iden vector unattached_written_certs; map > rev_written_certs; - for (vector::const_iterator i = conn_info->revs_in.items.begin(); - i != conn_info->revs_in.items.end(); ++i) + for (vector::const_iterator i = counts->revs_in.items.begin(); + i != counts->revs_in.items.end(); ++i) rev_written_certs.insert(make_pair(*i, vector())); - for (vector::const_iterator i = conn_info->certs_in.items.begin(); - i != conn_info->certs_in.items.end(); ++i) + for (vector::const_iterator i = counts->certs_in.items.begin(); + i != counts->certs_in.items.end(); ++i) { map >::iterator j; j = rev_written_certs.find(revision_id(i->ident)); @@ -157,14 +156,14 @@ void netsync_session::on_end(size_t iden j->second.push_back(*i); } - if (!conn_info->revs_in.items.empty() - || !conn_info->keys_in.items.empty() - || !conn_info->certs_in.items.empty()) + if (!counts->revs_in.items.empty() + || !counts->keys_in.items.empty() + || !counts->certs_in.items.empty()) { //Keys - for (vector::const_iterator i = conn_info->keys_in.items.begin(); - i != conn_info->keys_in.items.end(); ++i) + for (vector::const_iterator i = counts->keys_in.items.begin(); + i != counts->keys_in.items.end(); ++i) { key_identity_info identity; identity.id = *i; @@ -173,8 +172,8 @@ void netsync_session::on_end(size_t iden } //Revisions - for (vector::const_iterator i = conn_info->revs_in.items.begin(); - i != conn_info->revs_in.items.end(); ++i) + for (vector::const_iterator i = counts->revs_in.items.begin(); + i != counts->revs_in.items.end(); ++i) { vector & ctmp(rev_written_certs[*i]); set > > certs; @@ -205,18 +204,18 @@ void netsync_session::on_end(size_t iden } } - if (!conn_info->keys_out.items.empty() - || !conn_info->revs_out.items.empty() - || !conn_info->certs_out.items.empty()) + if (!counts->keys_out.items.empty() + || !counts->revs_out.items.empty() + || !counts->certs_out.items.empty()) { vector unattached_sent_certs; map > rev_sent_certs; - for (vector::const_iterator i = conn_info->revs_out.items.begin(); - i != conn_info->revs_out.items.end(); ++i) + for (vector::const_iterator i = counts->revs_out.items.begin(); + i != counts->revs_out.items.end(); ++i) rev_sent_certs.insert(make_pair(*i, vector())); - for (vector::const_iterator i = conn_info->certs_out.items.begin(); - i != conn_info->certs_out.items.end(); ++i) + for (vector::const_iterator i = counts->certs_out.items.begin(); + i != counts->certs_out.items.end(); ++i) { map >::iterator j; j = rev_sent_certs.find(revision_id(i->ident)); @@ -227,8 +226,8 @@ void netsync_session::on_end(size_t iden } //Keys - for (vector::const_iterator i = conn_info->keys_out.items.begin(); - i != conn_info->keys_out.items.end(); ++i) + for (vector::const_iterator i = counts->keys_out.items.begin(); + i != counts->keys_out.items.end(); ++i) { key_identity_info identity; identity.id = *i; @@ -237,8 +236,8 @@ void netsync_session::on_end(size_t iden } //Revisions - for (vector::const_iterator i = conn_info->revs_out.items.begin(); - i != conn_info->revs_out.items.end(); ++i) + for (vector::const_iterator i = counts->revs_out.items.begin(); + i != counts->revs_out.items.end(); ++i) { vector & ctmp(rev_sent_certs[*i]); set > > certs; @@ -334,7 +333,7 @@ netsync_session::note_rev(revision_id co data tmp; write_revision(rs, tmp); queue_data_cmd(revision_item, rev.inner(), tmp()); - conn_info->revs_out.add_item(rev); + counts->revs_out.add_item(rev); } void @@ -357,7 +356,7 @@ netsync_session::note_cert(id const & i) c.marshal_for_netio_v6(keyname, str); } queue_data_cmd(cert_item, i, str); - conn_info->certs_out.add_item(c); + counts->certs_out.add_item(c); } @@ -450,14 +449,14 @@ netsync_session::dry_run_finished() cons if (all) { - conn_info->revs_in.set_count(rev_refiner.items_to_receive, false); - conn_info->certs_in.set_count(cert_refiner.items_to_receive, false); - conn_info->keys_in.set_count(key_refiner.min_items_to_receive, - key_refiner.may_receive_more_than_min); + counts->revs_in.set_count(rev_refiner.items_to_receive, false); + counts->certs_in.set_count(cert_refiner.items_to_receive, false); + counts->keys_in.set_count(key_refiner.min_items_to_receive, + key_refiner.may_receive_more_than_min); - conn_info->revs_out.set_items(rev_refiner.items_to_send); - conn_info->certs_out.set_count(cert_refiner.items_to_send.size(), false); - conn_info->keys_out.set_items(key_refiner.items_to_send); + counts->revs_out.set_items(rev_refiner.items_to_send); + counts->certs_out.set_count(cert_refiner.items_to_send.size(), false); + counts->keys_out.set_items(key_refiner.items_to_send); } return all; @@ -891,7 +890,7 @@ netsync_session::load_data(netcmd_item_t project.db.get_pubkey(key_id(item), keyid, pub); L(FL("public key '%s' is also called '%s'") % item % keyid); write_pubkey(keyid, pub, out); - conn_info->keys_out.add_item(key_id(item)); + counts->keys_out.add_item(key_id(item)); } break; @@ -1018,7 +1017,7 @@ netsync_session::process_data_cmd(netcmd % tmp); } if (project.db.put_key(keyid, pub)) - conn_info->keys_in.add_item(key_id(item)); + counts->keys_in.add_item(key_id(item)); else error(error_codes::partial_transfer, (F("Received duplicate key %s") % keyid).str()); @@ -1062,7 +1061,7 @@ netsync_session::process_data_cmd(netcmd if (! (tmp == item)) throw bad_decode(F("hash check failed for revision cert '%s'") % hitem()); if (project.db.put_revision_cert(c)) - conn_info->certs_in.add_item(c); + counts->certs_in.add_item(c); } } break; @@ -1078,7 +1077,7 @@ netsync_session::process_data_cmd(netcmd revision_t rev; read_revision(d, rev); if (project.db.put_revision(revision_id(item), rev)) - conn_info->revs_in.add_item(revision_id(item)); + counts->revs_in.add_item(revision_id(item)); } break; ============================================================ --- network/netsync_session.hh 9923bf206a2dd21156b3b2d09aaf09beb45edc39 +++ network/netsync_session.hh dc2518ca378ed077216bb1630c5c89509ef5830b @@ -66,7 +66,7 @@ netsync_session: // dry-run info bool is_dry_run; bool dry_run_keys_refined; - shared_conn_info conn_info; + shared_conn_counts counts; bool dry_run_finished() const; // Interface to ancestry grovelling. @@ -91,7 +91,7 @@ public: protocol_role role, globish const & our_include_pattern, globish const & our_exclude_pattern, - shared_conn_info info, + shared_conn_counts counts, bool initiated_by_server = false); virtual ~netsync_session(); ============================================================ --- network/session.cc 04f99fb3516968474cde97892d9b219ea0d5505e +++ network/session.cc 83293a5ca55e7cec0d9a139cbc6b63cb500223b1 @@ -661,7 +661,7 @@ bool session::handle_service_request() corresponding_role(role), their_include, their_exclude, - shared_conn_info())); + connection_counts::create())); break; case is_automate: wrapped.reset(new automate_session(app, this, 0, 0)); ============================================================ --- network/connection_info.cc 7ce0811e2070b448da20d59f881192a9285ca467 +++ network/connection_info.cc eb5d6b6e5200db58bbc7e98ffdc0395da3170f20 @@ -28,15 +28,16 @@ using boost::lexical_cast; using std::string; using boost::lexical_cast; +connection_counts::connection_counts() { } +shared_conn_counts connection_counts::create() +{ + return shared_conn_counts(new connection_counts()); +} + netsync_connection_info::netsync_connection_info(database & d, options const & o) : client(d, o) { } -netsync_connection_info::Client::Client() - : connection_successful(false), - db(*(database*)0) // horrible, horrible thing that needs to go away -{ } - netsync_connection_info::Client::Client(database & d, options const & o) : connection_successful(false), use_argv(false), @@ -506,14 +507,6 @@ netsync_connection_info::setup_for_serve "in combination with --stdio")); } -netsync_connection_info::netsync_connection_info() { } - -shared_conn_info -netsync_connection_info::create_empty() -{ - return shared_conn_info(new netsync_connection_info); -} - // Local Variables: // mode: C++ // fill-column: 76 ============================================================ --- network/connection_info.hh eec1ebb3e3d8de7755a8a65f9cae6440518c93b6 +++ network/connection_info.hh a6fa98483898157e39bf562165b952aa1a86f1a2 @@ -66,6 +66,23 @@ public: } }; +class connection_counts; +typedef boost::shared_ptr shared_conn_counts; + +class connection_counts +{ + connection_counts(); +public: + static shared_conn_counts create(); + + future_set keys_in; + future_set certs_in; + future_set revs_in; + future_set keys_out; + future_set certs_out; + future_set revs_out; +}; + struct netsync_connection_info { class Server @@ -94,7 +111,6 @@ struct netsync_connection_info options opts; Client(database & d, options const & o); - Client(); ~Client(); void set_raw_uri(std::string const & uri); @@ -120,13 +136,6 @@ struct netsync_connection_info void set_connection_successful(); } client; - future_set keys_in; - future_set certs_in; - future_set revs_in; - future_set keys_out; - future_set certs_out; - future_set revs_out; - static void setup_default(options const & opts, database & db, @@ -165,10 +174,7 @@ struct netsync_connection_info lua_hooks & lua, shared_conn_info & info); - static shared_conn_info create_empty(); - private: - netsync_connection_info(); netsync_connection_info(database & d, options const & o); static void ============================================================ --- netsync.hh 589643774744dce35d42ad5acd58adcb092a39b3 +++ netsync.hh 8011f174b4ff35bd68978807447ed216b96fe85e @@ -27,7 +27,8 @@ void run_netsync_protocol(app_state & ap project_t & project, key_store & keys, protocol_voice voice, protocol_role role, - shared_conn_info & info); + shared_conn_info & info, + shared_conn_counts const & counts); #endif