Roy Golan has uploaded a new change for review.

Change subject: core: monitoring - make Vm a managed resource
......................................................................

core: monitoring - make Vm a managed resource

- Introduce VmManger state object
- responsible for getting dynamic,statistics and saving to db
- holds the last changed status
- holds a lock to co-ordinate execution of commands or monitoring

Change-Id: Ia711cc2d69082ecc03325362291faa4a38aa6c0a
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1099068
Signed-off-by: Roy Golan <[email protected]>
---
A 
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/ResourceManager.java
A 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VmManager.java
3 files changed, 112 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/86/32586/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
new file mode 100644
index 0000000..8c5f10e
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ManagingVmCommand.java
@@ -0,0 +1,24 @@
+package org.ovirt.engine.core.vdsbroker;
+
+import org.ovirt.engine.core.common.vdscommands.VdsAndVmIDVDSParametersBase;
+
+public abstract class ManagingVmCommand<P extends VdsAndVmIDVDSParametersBase> 
extends VDSCommandBase<P> {
+
+    protected final VmManager vmManager;
+
+    public ManagingVmCommand(P parameters) {
+        super(parameters);
+        vmManager = 
ResourceManager.getInstance().getVmManager(parameters.getVmId());
+    }
+
+    protected void executeVDSCommand() {
+        vmManager.lock();
+        try {
+            executeVmCommand();
+        } finally {
+            vmManager.unlock();
+        }
+    }
+
+    protected abstract void executeVmCommand();
+}
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.java
index 0d2f296..f36343a 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.java
@@ -52,6 +52,7 @@
     private final Map<Guid, VdsManager> vdsManagersDict = new 
ConcurrentHashMap<>();
     private final Set<Guid> asyncRunningVms =
             Collections.newSetFromMap(new ConcurrentHashMap<Guid, Boolean>());
+    private ConcurrentHashMap<Guid, VmManager> vmManagers = new 
ConcurrentHashMap<>();
 
     private static final String VDSCommandPrefix = "VDSCommand";
 
@@ -431,4 +432,12 @@
 
         return null;
     }
+
+    public VmManager getVmManager(Guid vmId) {
+        return vmManagers.putIfAbsent(vmId, new VmManager(vmId));
+    }
+
+    public void onVmDelete(Guid vmId) {
+        vmManagers.remove(vmId);
+    }
 }
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
new file mode 100644
index 0000000..9996bec
--- /dev/null
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VmManager.java
@@ -0,0 +1,79 @@
+package org.ovirt.engine.core.vdsbroker;
+
+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.Guid;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.dao.VmDynamicDAO;
+import org.ovirt.engine.core.dao.VmStatisticsDAO;
+import org.ovirt.engine.core.dao.network.VmNetworkStatisticsDao;
+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();
+
+    public VmManager(Guid id) {
+        this.id = id;
+    }
+
+    public void lock() {
+        lock.lock();
+    }
+
+    public void unlock() {
+        lock.unlock();
+    }
+
+    public boolean trylock() {
+        return lock.tryLock();
+    }
+
+    public void update(VmDynamic dynamic) {
+        getVmDynamicDao().update(dynamic);
+    }
+
+    public void update(VmStatistics statistics) {
+        getVmStatisticsDao().update(statistics);
+    }
+
+    public void update(VmNetworkStatistics networkStatistics) {
+        getVmNetworkStatisticsDao().update(networkStatistics);
+    }
+
+    public void succededToHibernate() {
+        TransactionSupport.executeInNewTransaction(
+                new TransactionMethod<Object>() {
+                    @Override
+                    public Object runInTransaction() {
+                        VmDynamic vmDynamic = db().getVmDynamicDao().get(id);
+                        vmDynamic.setStatus(VMStatus.SavingState);
+                        update(vmDynamic);
+                        return null;
+                    }
+                }
+        );
+    }
+
+    private VmDynamicDAO getVmDynamicDao() {
+        return db().getVmDynamicDao();
+    }
+
+    private VmStatisticsDAO getVmStatisticsDao() {
+        return db().getVmStatisticsDao();
+    }
+
+    private VmNetworkStatisticsDao getVmNetworkStatisticsDao() {
+        return db().getVmNetworkStatisticsDao();
+    }
+
+    protected DbFacade db() {
+        return DbFacade.getInstance();
+    }
+}


-- 
To view, visit http://gerrit.ovirt.org/32586
To unsubscribe, visit http://gerrit.ovirt.org/settings

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

Reply via email to