1 #include "rsm_client.h"
7 #include "lang/verify.h"
11 rsm_client::rsm_client(std::string dst) {
12 LOG("create rsm_client");
13 std::vector<std::string> mems;
16 make_sockaddr(dst.c_str(), &dstsock);
20 lock ml(rsm_client_mutex);
21 VERIFY (init_members());
23 LOG("rsm_client: done");
26 // Assumes caller holds rsm_client_mutex
27 void rsm_client::primary_failure() {
28 primary = known_mems.back();
29 known_mems.pop_back();
32 rsm_protocol::status rsm_client::invoke(unsigned int proc, std::string &rep, const std::string &req) {
34 lock ml(rsm_client_mutex);
36 LOG("rsm_client::invoke proc " << std::hex << proc << " primary " << primary);
40 rpcc *cl = h.safebind();
42 ret = cl->call_timeout(rsm_client_protocol::invoke, rpcc::to(5000), rep, proc, req);
48 LOG("rsm_client::invoke proc " << std::hex << proc << " primary " << primary << " ret " << std::dec << ret);
49 if (ret == rsm_client_protocol::OK)
51 if (ret == rsm_client_protocol::BUSY) {
52 LOG("rsm is busy " << primary);
56 if (ret == rsm_client_protocol::NOTPRIMARY) {
57 LOG("primary " << primary << " isn't the primary--let's get a complete list of mems");
62 LOG("primary " << primary << " failed ret " << std::dec << ret);
64 LOG("rsm_client::invoke: retry new primary " << primary);
69 bool rsm_client::init_members() {
70 LOG("rsm_client::init_members get members!");
72 int ret = rsm_client_protocol::ERR;
75 adopt_lock ml(rsm_client_mutex);
79 ret = cl->call_timeout(rsm_client_protocol::members, rpcc::to(1000), known_mems, 0);
82 if (cl == 0 || ret != rsm_protocol::OK)
84 if (known_mems.size() < 1) {
85 LOG("rsm_client::init_members do not know any members!");
89 primary = known_mems.back();
90 known_mems.pop_back();
92 LOG("rsm_client::init_members: primary " << primary);