2 #include "rsm_client.h"
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));
11 LOG("rsm_client: done");
14 void rsm_client::primary_failure(lock &) {
15 primary = known_mems.back();
16 known_mems.pop_back();
19 rsm_protocol::status rsm_client::invoke(unsigned int proc, string &rep, const string &req) {
20 lock ml(rsm_client_mutex);
22 LOG("rsm_client::invoke proc " << hex << proc << " primary " << primary);
26 rpcc *cl = h.safebind();
27 auto ret = rsm_client_protocol::OK;
29 ret = (rsm_client_protocol::status)cl->call_timeout(rsm_client_protocol::invoke, rpcc::to(5000), rep, proc, req);
35 LOG("rsm_client::invoke proc " << hex << proc << " primary " << primary << " ret " << dec << ret);
36 if (ret == rsm_client_protocol::OK)
37 return rsm_protocol::OK;
38 if (ret == rsm_client_protocol::BUSY) {
39 LOG("rsm is busy " << primary);
43 if (ret == rsm_client_protocol::NOTPRIMARY) {
44 LOG("primary " << primary << " isn't the primary--let's get a complete list of mems");
49 LOG("primary " << primary << " failed ret " << dec << ret);
51 LOG("rsm_client::invoke: retry new primary " << primary);
55 bool rsm_client::init_members(lock & rsm_client_mutex_lock) {
56 LOG("rsm_client::init_members get members!");
58 int ret = rsm_client_protocol::ERR;
61 rsm_client_mutex_lock.unlock();
64 ret = cl->call_timeout(rsm_client_protocol::members, rpcc::to(1000), known_mems, 0);
65 rsm_client_mutex_lock.lock();
67 if (cl == 0 || ret != rsm_protocol::OK)
69 if (known_mems.size() < 1) {
70 LOG("rsm_client::init_members do not know any members!");
74 primary = known_mems.back();
75 known_mems.pop_back();
77 LOG("rsm_client::init_members: primary " << primary);