X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/06282fd37814c4a9d53bca089b048709b368f5b3..869c0cc91d8f6b2bb80026616372d16450b64d9f:/rsm.cc diff --git a/rsm.cc b/rsm.cc index cb986fe..711f0ad 100644 --- a/rsm.cc +++ b/rsm.cc @@ -79,7 +79,6 @@ // upcalls, but can keep its locks when calling down. #include "rsm.h" -#include "handle.h" #include "rsm_client.h" #include @@ -202,13 +201,12 @@ bool rsm::sync_with_primary(lock & rsm_mutex_lock) { bool rsm::statetransfer(const string & m, lock & rsm_mutex_lock) { rsm_protocol::transferres r; - handle h(m); int ret = 0; LOG << "contact " << m << " w. my last_myvs(" << last_myvs.vid << "," << last_myvs.seqno << ")"; - rpcc *cl; + shared_ptr cl; { rsm_mutex_lock.unlock(); - cl = h.safebind(); + cl = rpcc::bind_cached(m); if (cl) { ret = cl->call_timeout(rsm_protocol::transferreq, milliseconds(100), r, cfg->myaddr(), last_myvs, vid_insync); @@ -229,10 +227,8 @@ bool rsm::statetransfer(const string & m, lock & rsm_mutex_lock) bool rsm::statetransferdone(const string & m, lock & rsm_mutex_lock) { rsm_mutex_lock.unlock(); - handle h(m); - rpcc *cl = h.safebind(); bool done = false; - if (cl) { + if (auto cl = rpcc::bind_cached(m)) { int r; auto ret = (rsm_protocol::status)cl->call(rsm_protocol::transferdonereq, r, cfg->myaddr(), vid_insync); done = (ret == rsm_protocol::OK); @@ -243,21 +239,16 @@ bool rsm::statetransferdone(const string & m, lock & rsm_mutex_lock) { bool rsm::join(const string & m, lock & rsm_mutex_lock) { - handle h(m); int ret = 0; string log; LOG << "contacting " << m << " mylast (" << last_myvs.vid << "," << last_myvs.seqno << ")"; - rpcc *cl; - { - rsm_mutex_lock.unlock(); - cl = h.safebind(); - if (cl != 0) { - ret = cl->call_timeout(rsm_protocol::joinreq, milliseconds(12000), log, - cfg->myaddr(), last_myvs); - } - rsm_mutex_lock.lock(); - } + + rsm_mutex_lock.unlock(); + auto cl = rpcc::bind_cached(m); + if (cl) + ret = cl->call_timeout(rsm_protocol::joinreq, milliseconds(12000), log, cfg->myaddr(), last_myvs); + rsm_mutex_lock.lock(); if (cl == 0 || ret != rsm_protocol::OK) { LOG << "couldn't reach " << m << " " << std::hex << cl << " " << std::dec << ret; @@ -342,9 +333,8 @@ rsm_client_protocol::status rsm::client_invoke(string & r, rpc_protocol::proc_id for (unsigned i = 0; i < m.size(); i++) { if (m[i] != myaddr) { // if invoke on slave fails, return rsm_client_protocol::BUSY - handle h(m[i]); LOG << "Sending invoke to " << m[i]; - rpcc *cl = h.safebind(); + auto cl = rpcc::bind_cached(m[i]); if (!cl) return rsm_client_protocol::BUSY; int ignored_rval; @@ -523,9 +513,9 @@ void rsm::net_repair(bool heal, lock & rsm_mutex_lock) { cfg->get_view(vid_commit, m); for (unsigned i = 0; i < m.size(); i++) { if (m[i] != cfg->myaddr()) { - handle h(m[i]); LOG << "member " << m[i] << " " << heal; - if (h.safebind()) h.safebind()->set_reachable(heal); + if (auto cl = rpcc::bind_cached(m[i])) + cl->set_reachable(heal); } } rsmrpc->set_reachable(heal);