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
