Fixed a race condition!
[invirt/third/libt4.git] / rsm_client.cc
index 310d1ad..ae88169 100644 (file)
@@ -19,25 +19,25 @@ void rsm_client::primary_failure(lock &) {
 rsm_protocol::status rsm_client::invoke(unsigned int proc, string &rep, const string &req) {
     lock ml(rsm_client_mutex);
     while (1) {
-        LOG("rsm_client::invoke proc " << hex << proc << " primary " << primary);
+        LOG("proc " << hex << proc << " primary " << primary);
         handle h(primary);
 
         ml.unlock();
         rpcc *cl = h.safebind();
         auto ret = rsm_client_protocol::OK;
         if (cl)
-            ret = (rsm_client_protocol::status)cl->call_timeout(rsm_client_protocol::invoke, rpcc::to(5000), rep, proc, req);
+            ret = (rsm_client_protocol::status)cl->call_timeout(rsm_client_protocol::invoke, milliseconds(500), rep, proc, req);
         ml.lock();
 
         if (!cl)
             goto prim_fail;
 
-        LOG("rsm_client::invoke proc " << hex << proc << " primary " << primary << " ret " << dec << ret);
+        LOG("proc " << hex << proc << " primary " << primary << " ret " << dec << ret);
         if (ret == rsm_client_protocol::OK)
             return rsm_protocol::OK;
         if (ret == rsm_client_protocol::BUSY) {
             LOG("rsm is busy " << primary);
-            sleep(3);
+            usleep(300000);
             continue;
         }
         if (ret == rsm_client_protocol::NOTPRIMARY) {
@@ -48,12 +48,12 @@ rsm_protocol::status rsm_client::invoke(unsigned int proc, string &rep, const st
 prim_fail:
         LOG("primary " << primary << " failed ret " << dec << ret);
         primary_failure(ml);
-        LOG("rsm_client::invoke: retry new primary " << primary);
+        LOG("retry new primary " << primary);
     }
 }
 
 bool rsm_client::init_members(lock & rsm_client_mutex_lock) {
-    LOG("rsm_client::init_members get members!");
+    LOG("get members!");
     handle h(primary);
     int ret = rsm_client_protocol::ERR;
     rpcc *cl;
@@ -61,20 +61,20 @@ bool rsm_client::init_members(lock & rsm_client_mutex_lock) {
         rsm_client_mutex_lock.unlock();
         cl = h.safebind();
         if (cl)
-            ret = cl->call_timeout(rsm_client_protocol::members, rpcc::to(1000), known_mems, 0);
+            ret = cl->call_timeout(rsm_client_protocol::members, milliseconds(100), known_mems, 0);
         rsm_client_mutex_lock.lock();
     }
     if (cl == 0 || ret != rsm_protocol::OK)
         return false;
     if (known_mems.size() < 1) {
-        LOG("rsm_client::init_members do not know any members!");
+        LOG("do not know any members!");
         VERIFY(0);
     }
 
     primary = known_mems.back();
     known_mems.pop_back();
 
-    LOG("rsm_client::init_members: primary " << primary);
+    LOG("primary " << primary);
 
     return true;
 }