1 #include "rsm_client.h"
7 #include "lang/verify.h"
9 #include "threaded_log.h"
11 rsm_client::rsm_client(std::string dst) : primary(dst) {
12 LOG("create rsm_client");
13 lock ml(rsm_client_mutex);
14 VERIFY (init_members(ml));
15 LOG("rsm_client: done");
18 void rsm_client::primary_failure(lock &) {
19 primary = known_mems.back();
20 known_mems.pop_back();
23 rsm_protocol::status rsm_client::invoke(unsigned int proc, std::string &rep, const std::string &req) {
24 lock ml(rsm_client_mutex);
26 LOG("rsm_client::invoke proc " << std::hex << proc << " primary " << primary);
30 rpcc *cl = h.safebind();
31 auto ret = rsm_client_protocol::OK;
33 ret = (rsm_client_protocol::status)cl->call_timeout(rsm_client_protocol::invoke, rpcc::to(5000), rep, proc, req);
39 LOG("rsm_client::invoke proc " << std::hex << proc << " primary " << primary << " ret " << std::dec << ret);
40 if (ret == rsm_client_protocol::OK)
41 return rsm_protocol::OK;
42 if (ret == rsm_client_protocol::BUSY) {
43 LOG("rsm is busy " << primary);
47 if (ret == rsm_client_protocol::NOTPRIMARY) {
48 LOG("primary " << primary << " isn't the primary--let's get a complete list of mems");
53 LOG("primary " << primary << " failed ret " << std::dec << ret);
55 LOG("rsm_client::invoke: retry new primary " << primary);
59 bool rsm_client::init_members(lock & rsm_client_mutex_lock) {
60 LOG("rsm_client::init_members get members!");
62 int ret = rsm_client_protocol::ERR;
65 rsm_client_mutex_lock.unlock();
68 ret = cl->call_timeout(rsm_client_protocol::members, rpcc::to(1000), known_mems, 0);
69 rsm_client_mutex_lock.lock();
71 if (cl == 0 || ret != rsm_protocol::OK)
73 if (known_mems.size() < 1) {
74 LOG("rsm_client::init_members do not know any members!");
78 primary = known_mems.back();
79 known_mems.pop_back();
81 LOG("rsm_client::init_members: primary " << primary);