Arik Hadas has uploaded a new change for review. Change subject: core: lock the vds manager while calling hibernate verb ......................................................................
core: lock the vds manager while calling hibernate verb It is needed to lock the vds manager so that no statuses will be updated while calling the hibernate verb in vdsm and setting the status of the VM to SavingState afterwards. The previous HibernateVDSCommand is changed to HibernateBrokerVDSCommand, and a new HibernateVDSCommand that calls it after the vds manager is locked, is added. Change-Id: I2537fffccd15cb5fa30f99793c803373886c633f Bug-Url: https://bugzilla.redhat.com/949281 Signed-off-by: Arik Hadas <[email protected]> --- M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java A backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/HibernateVDSCommand.java R backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/HibernateBrokerVDSCommand.java 3 files changed, 62 insertions(+), 3 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/20/14520/1 diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java index 455a725..c37d6f7 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java @@ -9,7 +9,7 @@ CreateVm("org.ovirt.engine.core.vdsbroker"), DestroyVm("org.ovirt.engine.core.vdsbroker"), Pause("org.ovirt.engine.core.vdsbroker.vdsbroker"), - Hibernate("org.ovirt.engine.core.vdsbroker.vdsbroker"), + Hibernate("org.ovirt.engine.core.vdsbroker"), Resume("org.ovirt.engine.core.vdsbroker"), Migrate("org.ovirt.engine.core.vdsbroker"), MigrateStatus("org.ovirt.engine.core.vdsbroker.vdsbroker"), diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/HibernateVDSCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/HibernateVDSCommand.java new file mode 100644 index 0000000..3c5b087 --- /dev/null +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/HibernateVDSCommand.java @@ -0,0 +1,59 @@ +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.vdscommands.HibernateVDSCommandParameters; +import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; +import org.ovirt.engine.core.utils.transaction.TransactionMethod; +import org.ovirt.engine.core.utils.transaction.TransactionSupport; +import org.ovirt.engine.core.vdsbroker.vdsbroker.HibernateBrokerVDSCommand; + +public class HibernateVDSCommand<P extends HibernateVDSCommandParameters> extends VdsIdVDSCommandBase<P> { + + public HibernateVDSCommand(P parameters) { + super(parameters); + } + + @Override + protected void ExecuteVdsIdCommand() { + if (_vdsManager == null) { + getVDSReturnValue().setSucceeded(false); + return; + } + + VDSReturnValue retVal = runHibernateBrokerVDSCommand(); + if (retVal.getSucceeded()) { + changeVmStatusToSavingState(); + getVDSReturnValue().setSucceeded(true); + } + else { + log.errorFormat("VDS::hibernate Failed hibernate vm '{0}' in vds = {1} : {2}, error = {3}", + getParameters().getVmId(), getVds().getId(), getVds().getName(), retVal.getExceptionString()); + getVDSReturnValue().setSucceeded(false); + getVDSReturnValue().setExceptionString(retVal.getExceptionString()); + getVDSReturnValue().setExceptionObject(retVal.getExceptionObject()); + getVDSReturnValue().setVdsError(retVal.getVdsError()); + } + } + + private VDSReturnValue runHibernateBrokerVDSCommand() { + HibernateBrokerVDSCommand<HibernateVDSCommandParameters> command = + new HibernateBrokerVDSCommand<HibernateVDSCommandParameters>(getParameters()); + command.execute(); + return command.getVDSReturnValue(); + } + + private void changeVmStatusToSavingState() { + TransactionSupport.executeInNewTransaction( + new TransactionMethod<Object>() { + @Override + public Object runInTransaction() { + VmDynamic vmDynamic = DbFacade.getInstance().getVmDynamicDao().get(getParameters().getVmId()); + vmDynamic.setStatus(VMStatus.SavingState); + _vdsManager.UpdateVmDynamic(vmDynamic); + return null; + } + }); + } +} diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/HibernateVDSCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/HibernateBrokerVDSCommand.java similarity index 69% rename from backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/HibernateVDSCommand.java rename to backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/HibernateBrokerVDSCommand.java index 37d6789..8eb1d03 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/HibernateVDSCommand.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/HibernateBrokerVDSCommand.java @@ -2,8 +2,8 @@ import org.ovirt.engine.core.common.vdscommands.*; -public class HibernateVDSCommand<P extends HibernateVDSCommandParameters> extends VdsBrokerCommand<P> { - public HibernateVDSCommand(P parameters) { +public class HibernateBrokerVDSCommand<P extends HibernateVDSCommandParameters> extends VdsBrokerCommand<P> { + public HibernateBrokerVDSCommand(P parameters) { super(parameters); } -- To view, visit http://gerrit.ovirt.org/14520 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I2537fffccd15cb5fa30f99793c803373886c633f Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Arik Hadas <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
