Omer Frenkel has uploaded a new change for review. Change subject: core: add timestamp for vm-dynamic updates ......................................................................
core: add timestamp for vm-dynamic updates added a timestamp in VmManager that save the time vm information updated. this is updated by consumers of the VmManager.lock object, and used by VmsMonitoring, which gets vm data at a time and lock at a different time - using this timestamp, monitoring cycle of 'dirty' vm can be skipped. Change-Id: If858993450cf957babdcf337e9b7867a282657bc Signed-off-by: Omer Frenkel <ofren...@redhat.com> --- M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ManagingVmCommand.java 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/VmManager.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VmsListFetcher.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VmsMonitoring.java M backend/manager/modules/vdsbroker/src/test/java/org/ovirt/engine/core/vdsbroker/VmsMonitoringTest.java 6 files changed, 55 insertions(+), 21 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/20/41520/1 diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ManagingVmCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ManagingVmCommand.java index 8c5f10e..9ae8a51 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ManagingVmCommand.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ManagingVmCommand.java @@ -1,5 +1,6 @@ package org.ovirt.engine.core.vdsbroker; +import java.util.Calendar; import org.ovirt.engine.core.common.vdscommands.VdsAndVmIDVDSParametersBase; public abstract class ManagingVmCommand<P extends VdsAndVmIDVDSParametersBase> extends VDSCommandBase<P> { @@ -15,6 +16,7 @@ vmManager.lock(); try { executeVmCommand(); + vmManager.setLastUpdateDate(Calendar.getInstance().getTime()); } finally { vmManager.unlock(); } 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 2d830b8..898f4a5 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 @@ -282,7 +282,8 @@ new VmsMonitoring(this, fetcher.getChangedVms(), fetcher.getVmsWithChangedDevices(), - auditLogDirector + auditLogDirector, + fetcher.getFetchTime() ).perform(); } } diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VmManager.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VmManager.java index 0d4c3f3..146bdcf 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VmManager.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VmManager.java @@ -1,9 +1,12 @@ package org.ovirt.engine.core.vdsbroker; +import java.util.Date; +import java.util.concurrent.locks.ReentrantLock; import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.common.businessentities.VmDynamic; import org.ovirt.engine.core.common.businessentities.VmStatistics; import org.ovirt.engine.core.common.businessentities.network.VmNetworkStatistics; +import org.ovirt.engine.core.compat.DateTime; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dao.VmDynamicDAO; @@ -12,15 +15,15 @@ import org.ovirt.engine.core.utils.transaction.TransactionMethod; import org.ovirt.engine.core.utils.transaction.TransactionSupport; -import java.util.concurrent.locks.ReentrantLock; - public class VmManager { private final Guid id; private final ReentrantLock lock = new ReentrantLock(); + private Date lastUpdateDate; public VmManager(Guid id) { this.id = id; + lastUpdateDate = DateTime.getMinValue(); } public void lock() { @@ -76,4 +79,12 @@ protected DbFacade db() { return DbFacade.getInstance(); } + + public Date getLastUpdateDate() { + return lastUpdateDate; + } + + public void setLastUpdateDate(Date lastUpdateDate) { + this.lastUpdateDate = lastUpdateDate; + } } diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VmsListFetcher.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VmsListFetcher.java index 25bf012..09d0b1b 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VmsListFetcher.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VmsListFetcher.java @@ -1,5 +1,12 @@ package org.ovirt.engine.core.vdsbroker; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Objects; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.common.businessentities.VmDynamic; @@ -15,12 +22,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Objects; - /** * in-charge of fetching vms list together with the db counter-part * and store for analysis on VdsManager @@ -32,6 +33,7 @@ private List<Pair<VM, VmInternalData>> devicesChangedVms; protected Map<Guid, VmInternalData> vdsmVms; private Map<Guid, VM> dbVms; + private Date fetchTime; // dependencies private DbFacade dbFacade; @@ -65,6 +67,7 @@ } protected void onFetchVms() { + fetchTime = Calendar.getInstance().getTime(); dbVms = getVmDao().getAllRunningByVds(vdsManager.getVdsId()); changedVms = new ArrayList<>(); devicesChangedVms = new ArrayList<>(); @@ -165,4 +168,8 @@ public List<Pair<VM, VmInternalData>> getVmsWithChangedDevices() { return devicesChangedVms; } + + public Date getFetchTime() { + return fetchTime; + } } 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 58dcddd..aafa821 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 @@ -1,6 +1,7 @@ package org.ovirt.engine.core.vdsbroker; import java.util.ArrayList; +import java.util.Calendar; import java.util.Collection; import java.util.Collections; import java.util.Date; @@ -54,6 +55,7 @@ */ public class VmsMonitoring { + private final Date fetchTime; private VdsManager vdsManager; /** * The Vms we want to monitor and analyze for changes. @@ -111,11 +113,13 @@ VdsManager vdsManager, List<Pair<VM, VmInternalData>> monitoredVms, List<Pair<VM, VmInternalData>> vmsWithChangedDevices, - AuditLogDirector auditLogDirector) { + AuditLogDirector auditLogDirector, + Date fetchTime) { this.vdsManager = vdsManager; this.monitoredVms = monitoredVms; this.vmsWithChangedDevices = vmsWithChangedDevices; this.auditLogDirector = auditLogDirector; + this.fetchTime = fetchTime; } /** @@ -146,16 +150,27 @@ if (vmId != null) { VmManager vmManager = getResourceManager().getVmManager(vmId); if (vmManager.trylock()) { - // store the locked managers to finally release them at the end of the cycle - vmManagers.put(vmId, vmManager); - return true; + if (vmManager.getLastUpdateDate().compareTo(fetchTime) > 0) { + log.warn("skipping VM '{}' from this monitoring cycle" + + " - the VM data has changed since fetching the data", vmId); + vmManager.unlock(); + } else { + // store the locked managers to finally release them at the end of the cycle + vmManagers.put(vmId, vmManager); + return true; + } + } else { + log.debug("skipping VM '{}' from this monitoring cycle" + + " - the VM is locked by its VmManager ", getVmId(pair)); } } return false; } private void unlockVmsManager() { + Date updateTime = Calendar.getInstance().getTime(); for (VmManager vmManager : vmManagers.values()) { + vmManager.setLastUpdateDate(updateTime); vmManager.unlock(); } } @@ -181,9 +196,6 @@ if (vmAnalyzer.isExternalVm()) { externalVms.add(new Pair<>(vmAnalyzer.getDbVm(), vmAnalyzer.getVdsmVm())); } - } else { - log.debug("skipping VM '{}' from this monitoring cycle" + - " - the VM is locked by its VmManager ", getVmId(pair)); } } diff --git a/backend/manager/modules/vdsbroker/src/test/java/org/ovirt/engine/core/vdsbroker/VmsMonitoringTest.java b/backend/manager/modules/vdsbroker/src/test/java/org/ovirt/engine/core/vdsbroker/VmsMonitoringTest.java index 39af3f0..b1949f7 100644 --- a/backend/manager/modules/vdsbroker/src/test/java/org/ovirt/engine/core/vdsbroker/VmsMonitoringTest.java +++ b/backend/manager/modules/vdsbroker/src/test/java/org/ovirt/engine/core/vdsbroker/VmsMonitoringTest.java @@ -1,14 +1,11 @@ package org.ovirt.engine.core.vdsbroker; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.when; - import java.util.Arrays; +import java.util.Calendar; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; - import org.junit.Before; import org.junit.ClassRule; import org.junit.Ignore; @@ -35,6 +32,9 @@ import org.ovirt.engine.core.utils.MockConfigRule; import org.ovirt.engine.core.utils.MockEJBStrategyRule; import org.ovirt.engine.core.vdsbroker.vdsbroker.entities.VmInternalData; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.when; @Ignore @RunWith(MockitoJUnitRunner.class) @@ -117,7 +117,8 @@ new VmsMonitoring( vdsManager, Arrays.asList(VmTestPairs.MIGRATION_DONE.build()), - Collections.<Pair<VM, VmInternalData>>emptyList(), auditLogDirector) { + Collections.<Pair<VM, VmInternalData>>emptyList(), auditLogDirector, + Calendar.getInstance().getTime()) { @Override public DbFacade getDbFacade() { -- To view, visit https://gerrit.ovirt.org/41520 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: If858993450cf957babdcf337e9b7867a282657bc Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Omer Frenkel <ofren...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches