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

Reply via email to