1 #include "rsm_client.h"
6 rsm_client::rsm_client(string dst) : primary(dst) {
7 LOG("create rsm_client");
8 lock ml(rsm_client_mutex);
9 VERIFY (init_members(ml));
13 void rsm_client::primary_failure(lock &) {
14 primary = known_mems.back();
15 known_mems.pop_back();
18 rsm_protocol::status rsm_client::invoke(unsigned int proc, string &rep, const string &req) {
19 lock ml(rsm_client_mutex);
21 LOG("proc " << hex << proc << " primary " << primary);
25 rpcc *cl = h.safebind();
26 auto ret = rsm_client_protocol::OK;
28 ret = (rsm_client_protocol::status)cl->call_timeout(rsm_client_protocol::invoke, milliseconds(500), rep, proc, req);
34 LOG("proc " << hex << proc << " primary " << primary << " ret " << dec << ret);
35 if (ret == rsm_client_protocol::OK)
36 return rsm_protocol::OK;
37 if (ret == rsm_client_protocol::BUSY) {
38 LOG("rsm is busy " << primary);
42 if (ret == rsm_client_protocol::NOTPRIMARY) {
43 LOG("primary " << primary << " isn't the primary--let's get a complete list of mems");
48 LOG("primary " << primary << " failed ret " << dec << ret);
50 LOG("retry new primary " << primary);
54 bool rsm_client::init_members(lock & rsm_client_mutex_lock) {
57 int ret = rsm_client_protocol::ERR;
60 rsm_client_mutex_lock.unlock();
63 ret = cl->call_timeout(rsm_client_protocol::members, milliseconds(100), known_mems, 0);
64 rsm_client_mutex_lock.lock();
66 if (cl == 0 || ret != rsm_protocol::OK)
68 if (known_mems.size() < 1) {
69 LOG("do not know any members!");
73 primary = known_mems.back();
74 known_mems.pop_back();
76 LOG("primary " << primary);