1 #include "rsm_client.h"
6 #include "lang/verify.h"
9 rsm_client::rsm_client(std::string dst) {
10 printf("create rsm_client\n");
11 std::vector<std::string> mems;
13 pthread_mutex_init(&rsm_client_mutex, NULL);
15 make_sockaddr(dst.c_str(), &dstsock);
19 ScopedLock 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 ScopedLock ml(&rsm_client_mutex);
35 printf("rsm_client::invoke proc %x primary %s\n", proc, primary.c_str());
38 VERIFY(pthread_mutex_unlock(&rsm_client_mutex)==0);
39 rpcc *cl = h.safebind();
41 ret = cl->call(rsm_client_protocol::invoke, proc, req, rep, rpcc::to(5000));
42 VERIFY(pthread_mutex_lock(&rsm_client_mutex)==0);
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");
73 VERIFY(pthread_mutex_unlock(&rsm_client_mutex)==0);
75 rpcc *cl = h.safebind();
77 ret = cl->call(rsm_client_protocol::members, 0, known_mems,
80 VERIFY(pthread_mutex_lock(&rsm_client_mutex)==0);
81 if (cl == 0 || ret != rsm_protocol::OK)
83 if (known_mems.size() < 1) {
84 printf("rsm_client::init_members do not know any members!\n");
88 primary = known_mems.back();
89 known_mems.pop_back();
91 printf("rsm_client::init_members: primary %s\n", primary.c_str());