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
