// upcalls, but can keep its locks when calling down.
#include "rsm.h"
-#include "handle.h"
#include "rsm_client.h"
#include <unistd.h>
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<rpcc> 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);
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);
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;
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;
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);