1 #include "rsm_client.h"
7 #include "lang/verify.h"
10 rsm_client::rsm_client(std::string dst) {
11 printf("create rsm_client\n");
12 std::vector<std::string> mems;
15 make_sockaddr(dst.c_str(), &dstsock);
19 lock ml(rsm_client_mutex);
20 VERIFY (init_members());
22 printf("rsm_client: done\n");
25 // Assumes caller holds rsm_client_mutex
26 void rsm_client::primary_failure() {
27 primary = known_mems.back();
28 known_mems.pop_back();
31 rsm_protocol::status rsm_client::invoke(int proc, std::string req, std::string &rep) {
33 lock ml(rsm_client_mutex);
35 printf("rsm_client::invoke proc %x primary %s\n", proc, primary.c_str());
39 rpcc *cl = h.safebind();
41 ret = cl->call(rsm_client_protocol::invoke, proc, req, rep, rpcc::to(5000));
47 printf("rsm_client::invoke proc %x primary %s ret %d\n", proc,
48 primary.c_str(), ret);
49 if (ret == rsm_client_protocol::OK)
51 if (ret == rsm_client_protocol::BUSY) {
52 printf("rsm is busy %s\n", primary.c_str());
56 if (ret == rsm_client_protocol::NOTPRIMARY) {
57 printf("primary %s isn't the primary--let's get a complete list of mems\n",
63 printf("primary %s failed ret %d\n", primary.c_str(), ret);
65 printf ("rsm_client::invoke: retry new primary %s\n", primary.c_str());
70 bool rsm_client::init_members() {
71 printf("rsm_client::init_members get members!\n");
76 adopt_lock ml(rsm_client_mutex);
80 ret = cl->call(rsm_client_protocol::members, 0, known_mems,
85 if (cl == 0 || ret != rsm_protocol::OK)
87 if (known_mems.size() < 1) {
88 printf("rsm_client::init_members do not know any members!\n");
92 primary = known_mems.back();
93 known_mems.pop_back();
95 printf("rsm_client::init_members: primary %s\n", primary.c_str());