Fix an issue where turning off manual LB breaks AtSync 99/4999/2
authorEric Mikida <epmikida@hpccharm.com>
Mon, 4 Mar 2019 21:32:59 +0000 (16:32 -0500)
committerEvan Ramos <evan@hpccharm.com>
Fri, 8 Mar 2019 23:05:15 +0000 (17:05 -0600)
The problem previously was that when manual LB is on, all check-ins to the
barrier (including from the batsyncer) were entirely ignored. So if then manual
LB was turned off, those calls were lost forever and the barrier would never be
satisfied. This change preserves the calls to the barrier, but keeps the barrier
off until manual LB is turned off.

Change-Id: I0738abcf07af4bc922d73cda40a4c8bf3ddd676b

src/ck-ldb/LBDBManager.C
src/ck-ldb/LBDBManager.h

index be152a6..7c68aa3 100644 (file)
@@ -212,14 +212,14 @@ void LBDB::DoneRegisteringObjects(LDOMHandle _h)
   // for an unregistered anonymous OM to join and control the barrier
   if (_h.id.id.idx == 0) {
     oms_registering--;
-    if (oms_registering == 0)
+    if (oms_registering == 0 && useBarrier)
       localBarrier.TurnOn();
   }
   else {
   LBOM* om = oms[_h.handle];
   if (om->RegisteringObjs()) {
     oms_registering--;
-    if (oms_registering == 0)
+    if (oms_registering == 0 && useBarrier)
       localBarrier.TurnOn();
     om->SetRegisteringObjs(false);
   }
index 05a73aa..60ee0ac 100644 (file)
@@ -147,9 +147,9 @@ public:
   void RemoveNotifyMigrated(int handle);
 
   inline void TurnManualLBOn() 
-       { useBarrier = false; }
+       { useBarrier = false; LocalBarrierOff(); }
   inline void TurnManualLBOff() 
-       { useBarrier = true; }
+       { useBarrier = true; if (oms_registering == 0) LocalBarrierOn(); }
 
   int AddStartLBFn(LDStartLBFn fn, void* data);
   void TurnOnStartLBFn(int handle)
@@ -200,9 +200,9 @@ public:
   inline void TurnOffBarrierReceiver(LDBarrierReceiver h) 
        { localBarrier.TurnOffReceiver(h); };
   inline void AtLocalBarrier(LDBarrierClient h) 
-       { if (useBarrier) localBarrier.AtBarrier(h); };
+       { localBarrier.AtBarrier(h); };
   inline void DecreaseLocalBarrier(LDBarrierClient h, int c) 
-       { if (useBarrier) localBarrier.DecreaseBarrier(h, c); };
+       { localBarrier.DecreaseBarrier(h, c); };
   inline void ResumeClients() 
        { localBarrier.ResumeClients(); };
   inline void MeasuredObjTime(double wtime, double ctime) {