1 #include "include/rsm_client.h"
5 using namespace std::chrono;
7 rsm_client::rsm_client(string dst) : primary(dst) {
8 LOG << "create rsm_client";
9 lock ml(rsm_client_mutex);
10 VERIFY (init_members(ml));
14 rsm_protocol::status rsm_client::invoke(rpc_protocol::proc_id_t proc, string & rep, const string & req) {
15 lock ml(rsm_client_mutex);
17 LOG << "proc " << std::hex << proc << " primary " << primary;
18 string prim = primary;
21 auto cl = rpcc::bind_cached(prim);
22 auto ret = rsm_client_protocol::OK;
24 ret = (rsm_client_protocol::status)cl->call_timeout(rsm_client_protocol::invoke, 500ms, rep, proc, req);
30 LOG << "proc " << std::hex << proc << " primary " << prim << " ret " << std::dec << ret;
31 if (ret == rsm_client_protocol::OK)
32 return rsm_protocol::OK;
33 if (ret == rsm_client_protocol::BUSY) {
34 LOG << "rsm is busy " << prim;
35 std::this_thread::sleep_for(300ms);
38 if (ret == rsm_client_protocol::NOTPRIMARY) {
39 LOG << "primary " << prim << " isn't the primary--let's get a complete list of mems";
44 LOG << "primary " << prim << " failed ret " << std::dec << ret;
45 primary = known_mems.back();
46 known_mems.pop_back();
47 LOG << "retry new primary " << prim;
51 bool rsm_client::init_members(lock & rsm_client_mutex_lock) {
52 LOG << "get members!";
53 string prim = primary;
54 int ret = rsm_client_protocol::ERR;
57 rsm_client_mutex_lock.unlock();
58 if ((cl = rpcc::bind_cached(prim)))
59 ret = cl->call_timeout(rsm_client_protocol::members, 100ms, known_mems, 0);
60 rsm_client_mutex_lock.lock();
62 if (ret != rsm_protocol::OK)
64 if (!known_mems.size()) {
65 LOG << "do not know any members!";
69 primary = known_mems.back();
70 known_mems.pop_back();
72 LOG << "primary " << primary;