Omer Frenkel has uploaded a new change for review.

Change subject: core: sync first host-vm monitoring cycle
......................................................................

core: sync first host-vm monitoring cycle

currently, the ResourceManager.HandleVdsFinishedInit method is called
after first host monitoring cycle, inside it is processing vms that
moved to down.

this was safe until we split the host monitoring and vm monitoring to different
threads, and now the init can be called before the vm monitoring
finished, which cause processing vms that are not down as down.

this patch adds a new host-init-lock that makes sure both host and vms
monitoring finished first cycle before calling HandleVdsFinishedInit.

Change-Id: I109dcbe221526c2503f26307cef93aac8a94d689
Signed-off-by: Omer Frenkel <[email protected]>
---
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsManager.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VmsMonitoring.java
2 files changed, 48 insertions(+), 2 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/50/38850/1

diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsManager.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsManager.java
index 592de1b..dd8a0b0 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsManager.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsManager.java
@@ -10,6 +10,9 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
 
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.FeatureSupported;
@@ -87,6 +90,9 @@
     private HostMonitoring hostMonitoring;
     private boolean monitoringNeeded;
     private List<Pair<VM, VmInternalData>> lastVmsList = 
Collections.emptyList();
+    private final Lock hostInitLock = new ReentrantLock();
+    private final Condition hostMonitoringFinished = 
hostInitLock.newCondition();
+    private final Condition vmsMonitoringFinished = 
hostInitLock.newCondition();
 
     public VdsManager(VDS vds, AuditLogDirector auditLogDirector) {
         this.auditLogDirector = auditLogDirector;
@@ -170,6 +176,30 @@
                 connectionTimeOut,
                 clientRetries,
                 heartbeat);
+        hostInitFinished();
+    }
+
+    private void hostInitFinished() {
+        ThreadPoolUtil.execute(new Runnable() {
+            @Override
+            public void run() {
+                hostInitLock.lock();
+                try {
+                    hostMonitoringFinished.await();
+                    vmsMonitoringFinished.await();
+                    log.info("Initializing finished for Host: '{}:{}'", 
cachedVds.getName(), cachedVds.getId());
+                    
ResourceManager.getInstance().HandleVdsFinishedInit(cachedVds.getId());
+                    setInitialized(true);
+                } catch (InterruptedException ex) {
+                    log.error("Failed to finish initialization of host 
'{}:{}'",
+                            cachedVds.getName(),
+                            cachedVds.getId());
+                    log.error("Exception", ex);
+                } finally {
+                    hostInitLock.unlock();
+                }
+            }
+        });
     }
 
     @OnTimerMethodAnnotation("onTimer")
@@ -204,8 +234,7 @@
                                 && cachedVds.getStatus() != 
VDSStatus.PendingApproval
                                 && cachedVds.getStatus() != 
VDSStatus.InstallingOS) {
                             log.info("Initializing Host: '{}'", 
cachedVds.getName());
-                            
ResourceManager.getInstance().HandleVdsFinishedInit(cachedVds.getId());
-                            setInitialized(true);
+                            setHostMonitoringFinished();
                         }
                     } catch (VDSNetworkException e) {
                         logNetworkException(e);
@@ -272,6 +301,8 @@
                     fetcher.getVmsWithChangedDevices(),
                     auditLogDirector
             ).perform();
+        } else {
+            setVmsMonitoringFinished();
         }
     }
 
@@ -953,4 +984,18 @@
     public void setLastVmsList(List<Pair<VM, VmInternalData>> lastVmsList) {
         this.lastVmsList = lastVmsList;
     }
+
+    public void setVmsMonitoringFinished() {
+        if (!isInitialized()) {
+            hostInitLock.lock();
+            vmsMonitoringFinished.signal();
+            hostInitLock.unlock();
+        }
+    }
+
+    public void setHostMonitoringFinished() {
+        hostInitLock.lock();
+        hostMonitoringFinished.signal();
+        hostInitLock.unlock();
+    }
 }
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VmsMonitoring.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VmsMonitoring.java
index 4f0d20d..4fa3805 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VmsMonitoring.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VmsMonitoring.java
@@ -130,6 +130,7 @@
             refreshVmStats();
             afterVMsRefreshTreatment();
         } finally {
+            vdsManager.setVmsMonitoringFinished();
             unlockVmsManager();
         }
 


-- 
To view, visit https://gerrit.ovirt.org/38850
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I109dcbe221526c2503f26307cef93aac8a94d689
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Omer Frenkel <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to