# # # patch "ChangeLog" # from [02b4406d9c09d0e96e4c73f9f6584f61b9c07fa5] # to [36ddfbc60c098baecae82e3be37bb02055100506] # # patch "netsync.cc" # from [a348f76e9aceea332aa00c5f15e861046bb7d13c] # to [4d15f2c47aed8bb45b5dc8267ab60c35703d49e9] # ============================================================ --- ChangeLog 02b4406d9c09d0e96e4c73f9f6584f61b9c07fa5 +++ ChangeLog 36ddfbc60c098baecae82e3be37bb02055100506 @@ -1,5 +1,10 @@ 2006-02-12 Nathaniel Smith + * netsync.cc (serve_connections): Revert garbage that I + accidentally checked in last time... + +2006-02-12 Nathaniel Smith + * NEWS: Add things done since last time I did this... 2006-02-12 Matthew Gregan ============================================================ --- netsync.cc a348f76e9aceea332aa00c5f15e861046bb7d13c +++ netsync.cc 4d15f2c47aed8bb45b5dc8267ab60c35703d49e9 @@ -2579,127 +2579,129 @@ // further down. bool try_again=false; - // have to use a pointer, because StreamServer is non-copyable, but we might - // need to throw our first one out and switch to a different one - std::auto_ptr server; + do + { + try + { + try_again = false; - Netxx::Address addr(use_ipv6); + Netxx::Address addr(use_ipv6); - if (!app.bind_address().empty()) - addr.add_address(app.bind_address().c_str(), default_port); - else - addr.add_all_addresses (default_port); + if (!app.bind_address().empty()) + addr.add_address(app.bind_address().c_str(), default_port); + else + addr.add_all_addresses (default_port); - // If se use IPv6 and the initiasation of server fails, we want - // to try again with IPv4. The reason is that someone may have - // downloaded a IPv6-enabled monotone on a system that doesn't - // have IPv6, and which might fail therefore. - // On failure, Netxx::NetworkException is thrown, and we catch - // it further down. - try_again=use_ipv6; + // If se use IPv6 and the initiasation of server fails, we want + // to try again with IPv4. The reason is that someone may have + // downloaded a IPv6-enabled monotone on a system that doesn't + // have IPv6, and which might fail therefore. + // On failure, Netxx::NetworkException is thrown, and we catch + // it further down. + try_again=use_ipv6; - Netxx::StreamServer server(addr, timeout); + Netxx::StreamServer server(addr, timeout); - // If we came this far, whatever we used (IPv6 or IPv4) was - // accepted, so we don't need to try again any more. - try_again=false; + // If we came this far, whatever we used (IPv6 or IPv4) was + // accepted, so we don't need to try again any more. + try_again=false; - const char *name = addr.get_name(); - P(F("beginning service on %s : %s\n") - % (name != NULL ? name : "all interfaces") - % lexical_cast(addr.get_port())); - - map > sessions; - set armed_sessions; - - shared_ptr guard; - - while (true) - { - probe.clear(); - armed_sessions.clear(); - - if (sessions.size() >= session_limit) - W(F("session limit %d reached, some connections " - "will be refused\n") % session_limit); - else - probe.add(server); - - arm_sessions_and_calculate_probe(probe, sessions, armed_sessions); - - L(FL("i/o probe with %d armed\n") % armed_sessions.size()); - Netxx::Probe::result_type res = probe.ready(sessions.empty() ? forever - : (armed_sessions.empty() ? timeout - : instant)); - Netxx::Probe::ready_type event = res.second; - Netxx::socket_type fd = res.first; + const char *name = addr.get_name(); + P(F("beginning service on %s : %s\n") + % (name != NULL ? name : "all interfaces") + % lexical_cast(addr.get_port())); + + map > sessions; + set armed_sessions; + + shared_ptr guard; - if (!guard) - guard = shared_ptr(new transaction_guard(app.db)); + while (true) + { + probe.clear(); + armed_sessions.clear(); - I(guard); + if (sessions.size() >= session_limit) + W(F("session limit %d reached, some connections " + "will be refused\n") % session_limit); + else + probe.add(server); - if (fd == -1) - { - if (armed_sessions.empty()) - L(FL("timed out waiting for I/O (listening on %s : %s)\n") - % addr.get_name() % lexical_cast(addr.get_port())); - } + arm_sessions_and_calculate_probe(probe, sessions, armed_sessions); - // we either got a new connection - else if (fd == server) - handle_new_connection(addr, server, timeout, role, - include_pattern, exclude_pattern, - sessions, app); + L(FL("i/o probe with %d armed\n") % armed_sessions.size()); + Netxx::Probe::result_type res = probe.ready(sessions.empty() ? forever + : (armed_sessions.empty() ? timeout + : instant)); + Netxx::Probe::ready_type event = res.second; + Netxx::socket_type fd = res.first; - // or an existing session woke up - else - { - map >::iterator i; - i = sessions.find(fd); - if (i == sessions.end()) - { - L(FL("got woken up for action on unknown fd %d\n") % fd); - } - else - { - shared_ptr sess = i->second; - bool live_p = true; + if (!guard) + guard = shared_ptr(new transaction_guard(app.db)); - if (event & Netxx::Probe::ready_read) - handle_read_available(fd, sess, sessions, - armed_sessions, live_p); + I(guard); + + if (fd == -1) + { + if (armed_sessions.empty()) + L(FL("timed out waiting for I/O (listening on %s : %s)\n") + % addr.get_name() % lexical_cast(addr.get_port())); + } + + // we either got a new connection + else if (fd == server) + handle_new_connection(addr, server, timeout, role, + include_pattern, exclude_pattern, + sessions, app); + + // or an existing session woke up + else + { + map >::iterator i; + i = sessions.find(fd); + if (i == sessions.end()) + { + L(FL("got woken up for action on unknown fd %d\n") % fd); + } + else + { + shared_ptr sess = i->second; + bool live_p = true; - if (live_p && (event & Netxx::Probe::ready_write)) - handle_write_available(fd, sess, sessions, live_p); + if (event & Netxx::Probe::ready_read) + handle_read_available(fd, sess, sessions, + armed_sessions, live_p); + + if (live_p && (event & Netxx::Probe::ready_write)) + handle_write_available(fd, sess, sessions, live_p); + + if (live_p && (event & Netxx::Probe::ready_oobd)) + { + P(F("got OOB from peer %s, disconnecting\n") + % sess->peer_id); + sessions.erase(i); + } + } + } + process_armed_sessions(sessions, armed_sessions, *guard); + reap_dead_sessions(sessions, timeout_seconds); - if (live_p && (event & Netxx::Probe::ready_oobd)) - { - P(F("got OOB from peer %s, disconnecting\n") - % sess->peer_id); - sessions.erase(i); - } - } - } - process_armed_sessions(sessions, armed_sessions, *guard); - reap_dead_sessions(sessions, timeout_seconds); - - if (sessions.empty()) - { - // Let the guard die completely if everything's gone quiet. - guard->commit(); - guard.reset(); - } - } - } - catch (Netxx::NetworkException &e) - { - // If we tried with IPv6 and failed, we want to try again using IPv4. - if (try_again) - { - use_ipv6 = false; - } - // In all other cases, just rethrow the exception. + if (sessions.empty()) + { + // Let the guard die completely if everything's gone quiet. + guard->commit(); + guard.reset(); + } + } + } + catch (Netxx::NetworkException &e) + { + // If we tried with IPv6 and failed, we want to try again using IPv4. + if (try_again) + { + use_ipv6 = false; + } + // In all other cases, just rethrow the exception. else throw; }