1 #include "rsm_client.h"
5 rsm_client::rsm_client(string dst) : primary(dst) {
6 LOG << "create rsm_client";
7 lock ml(rsm_client_mutex);
8 VERIFY (init_members(ml));
12 void rsm_client::primary_failure(lock &) {
13 primary = known_mems.back();
14 known_mems.pop_back();
17 rsm_protocol::status rsm_client::invoke(unsigned int proc, string & rep, const string & req) {
18 lock ml(rsm_client_mutex);
20 LOG << "proc " << std::hex << proc << " primary " << primary;
21 string prim = primary;
24 auto cl = rpcc::bind_cached(prim);
25 auto ret = rsm_client_protocol::OK;
27 ret = (rsm_client_protocol::status)cl->call_timeout(rsm_client_protocol::invoke, milliseconds(500), rep, proc, req);
33 LOG << "proc " << std::hex << proc << " primary " << prim << " ret " << std::dec << ret;
34 if (ret == rsm_client_protocol::OK)
35 return rsm_protocol::OK;
36 if (ret == rsm_client_protocol::BUSY) {
37 LOG << "rsm is busy " << prim;
38 std::this_thread::sleep_for(milliseconds(300));
41 if (ret == rsm_client_protocol::NOTPRIMARY) {
42 LOG << "primary " << prim << " isn't the primary--let's get a complete list of mems";
47 LOG << "primary " << prim << " failed ret " << std::dec << ret;
49 LOG << "retry new primary " << prim;
53 bool rsm_client::init_members(lock & rsm_client_mutex_lock) {
54 LOG << "get members!";
55 string prim = primary;
56 int ret = rsm_client_protocol::ERR;
59 rsm_client_mutex_lock.unlock();
60 cl = rpcc::bind_cached(prim);
62 ret = cl->call_timeout(rsm_client_protocol::members, milliseconds(100), known_mems, 0);
63 rsm_client_mutex_lock.lock();
65 if (cl == 0 || ret != rsm_protocol::OK)
67 if (known_mems.size() < 1) {
68 LOG << "do not know any members!";
72 primary = known_mems.back();
73 known_mems.pop_back();
75 LOG << "primary " << primary;