Federico Simoncelli has uploaded a new change for review. Change subject: core: add the domain detaching state ......................................................................
core: add the domain detaching state A domain is effectively detached only when all hosts of the pool are not reporting it as attached. This patch adds the new "Detaching" state used while we wait for all the hosts to detach the domain. Most of the operations on the storage domain must be prohibited in the Detaching. Change-Id: I5732ef00a67ef1381ee0b6f29d08ab39cf63a1bf Signed-off-by: Federico Simoncelli <fsimo...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DetachStorageDomainFromPoolCommand.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/VdcActionUtils.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainStatus.java M backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/StorageDomainStatus.java M backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/StorageDomainMapper.java M backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/StoragePoolDomainHelper.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/StorageDomainStatusColumn.java 9 files changed, 47 insertions(+), 41 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/56/23556/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DetachStorageDomainFromPoolCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DetachStorageDomainFromPoolCommand.java index 78b1ea9..6ea303f 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DetachStorageDomainFromPoolCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DetachStorageDomainFromPoolCommand.java @@ -5,17 +5,12 @@ import org.ovirt.engine.core.common.action.DetachStorageDomainFromPoolParameters; import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.StorageDomainType; -import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMapId; -import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap; import org.ovirt.engine.core.common.errors.VdcBllMessages; import org.ovirt.engine.core.common.vdscommands.DetachStorageDomainVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.IrsBaseVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.compat.Guid; -import org.ovirt.engine.core.dal.dbbroker.DbFacade; -import org.ovirt.engine.core.utils.transaction.TransactionMethod; -import org.ovirt.engine.core.utils.transaction.TransactionSupport; @NonTransactiveCommandAttribute(forceCompensation=true) public class DetachStorageDomainFromPoolCommand<T extends DetachStorageDomainFromPoolParameters> extends @@ -38,7 +33,7 @@ protected void executeCommand() { log.info("Start detach storage domain"); changeStorageDomainStatusInTransaction(getStorageDomain().getStoragePoolIsoMapData(), - StorageDomainStatus.Locked); + StorageDomainStatus.Detaching); log.info(" Detach storage domain: before connect"); connectAllHostsToPool(); @@ -52,20 +47,6 @@ log.info(" Detach storage domain: after detach in vds"); disconnectAllHostsInPool(); - log.info(" Detach storage domain: after disconnect storage"); - TransactionSupport.executeInNewTransaction(new TransactionMethod<Object>() { - @Override - public Object runInTransaction() { - StoragePoolIsoMap mapToRemove = getStorageDomain().getStoragePoolIsoMapData(); - getCompensationContext().snapshotEntity(mapToRemove); - DbFacade.getInstance() - .getStoragePoolIsoMapDao() - .remove(new StoragePoolIsoMapId(mapToRemove.getstorage_id(), - mapToRemove.getstorage_pool_id())); - getCompensationContext().stateChanged(); - return null; - } - }); if (returnValue.getSucceeded() && getStorageDomain().getStorageDomainType() == StorageDomainType.ISO) { // reset iso for this pool in vdsBroker cache runVdsCommand(VDSCommandType.ResetISOPath, diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/VdcActionUtils.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/VdcActionUtils.java index 044865d..fa300df 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/VdcActionUtils.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/VdcActionUtils.java @@ -300,6 +300,10 @@ storageDomainMatrix.put( StorageDomainStatus.MovingToMaintenance, EnumSet.of(VdcActionType.DetachStorageDomainFromPool, VdcActionType.DeactivateStorageDomain)); + storageDomainMatrix.put( + StorageDomainStatus.Detaching, + EnumSet.of(VdcActionType.DetachStorageDomainFromPool, + VdcActionType.DeactivateStorageDomain, VdcActionType.ActivateStorageDomain)); _matrix.put(StorageDomain.class, storageDomainMatrix); } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainStatus.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainStatus.java index 3ae56c4..8048c72 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainStatus.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainStatus.java @@ -8,7 +8,8 @@ InActive, Locked, Maintenance, - MovingToMaintenance; + MovingToMaintenance, + Detaching; public int getValue() { return this.ordinal(); @@ -19,6 +20,6 @@ } public boolean isLocked() { - return this == Locked || this == MovingToMaintenance; + return this == Locked || this == MovingToMaintenance || this == Detaching; } } diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/StorageDomainStatus.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/StorageDomainStatus.java index b2d7063..20868b1 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/StorageDomainStatus.java +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/StorageDomainStatus.java @@ -25,6 +25,7 @@ UNATTACHED, MAINTENANCE, MOVINGTOMAINTENANCE, + DETACHING, UNKNOWN; public String value() { diff --git a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/StorageDomainMapper.java b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/StorageDomainMapper.java index 293f82f..baa80e2 100644 --- a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/StorageDomainMapper.java +++ b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/StorageDomainMapper.java @@ -394,6 +394,8 @@ return StorageDomainStatus.LOCKED; case MovingToMaintenance: return StorageDomainStatus.MOVINGTOMAINTENANCE; + case Detaching: + return StorageDomainStatus.DETACHING; case Maintenance: return StorageDomainStatus.MAINTENANCE; case Unknown: diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/StoragePoolDomainHelper.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/StoragePoolDomainHelper.java index e2463e6..1d2301b 100644 --- a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/StoragePoolDomainHelper.java +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/StoragePoolDomainHelper.java @@ -17,7 +17,7 @@ if (domain.getStatus() == StorageDomainStatus.Maintenance || domain.getStatus() == StorageDomainStatus.MovingToMaintenance) { storageDomains.put(domain.getstorage_id().toString(), "attached"); - } else { + } else if (domain.getStatus() != StorageDomainStatus.Detaching) { storageDomains.put(domain.getstorage_id().toString(), StorageDomainStatus.Active.toString().toLowerCase()); } diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java index 6cae7c9..94c1366 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java @@ -293,20 +293,6 @@ domainsInVds.add(domainData.getId()); proceedStorageDomain(domainData, masterVersion, storagePool); } - List<StorageDomain> domainsInDb = DbFacade.getInstance().getStorageDomainDao() - .getAllForStoragePool(_storagePoolId); - - for (final StorageDomain domainInDb : domainsInDb) { - if (domainInDb.getStorageDomainType() != StorageDomainType.Master - && domainInDb.getStatus() != StorageDomainStatus.Locked - && !domainsInVds.contains(domainInDb.getId())) { - // domain not attached to pool anymore - DbFacade.getInstance() - .getStoragePoolIsoMapDao() - .remove(new StoragePoolIsoMapId(domainInDb.getId(), - _storagePoolId)); - } - } } } @@ -1050,12 +1036,15 @@ domainStatus = DomainVisibility.Status.MAINTENANCE; if (poolDomain.getStatus() == StorageDomainStatus.MovingToMaintenance) { moveDomainToMaintenance(poolDomain); + } else if (poolDomain.getStatus() == StorageDomainStatus.Detaching) { + detachDomainFromPool(poolDomain); } } } else { domainStatus = isDomainReportedAsProblematic(domainData, false) ? DomainVisibility.Status.UNREACHABLE : DomainVisibility.Status.ACTIVE; - if (poolDomain.getStatus() == StorageDomainStatus.MovingToMaintenance) { + if (poolDomain.getStatus() == StorageDomainStatus.MovingToMaintenance + || poolDomain.getStatus() == StorageDomainStatus.Maintenance) { vdsNeedsRefresh = true; } } @@ -1074,8 +1063,9 @@ domainsVisibility.setVdsDomainStatus(vds.getId(), poolDomain.getId(), domainStatus); - if (domainStatus == DomainVisibility.Status.UNREPORTED - || domainStatus == DomainVisibility.Status.UNREACHABLE) { + if (poolDomain.getStatus() != StorageDomainStatus.Detaching + && (domainStatus == DomainVisibility.Status.UNREPORTED + || domainStatus == DomainVisibility.Status.UNREACHABLE)) { setTimerIfAbsent(poolDomain.getId()); } else if (domainsVisibility.getDomainProblematicVds(poolDomain.getId()).size() == 0) { clearTimer(poolDomain.getId()); @@ -1115,6 +1105,30 @@ } } + private void detachDomainFromPool(StorageDomain domain) { + if (domain.getStatus() != StorageDomainStatus.Detaching) { + return; + } + + for (VDS hosts : DbFacade.getInstance().getVdsDao().getAllForStoragePool(_storagePoolId)) { + // Skip vds that are in maintenance + if (hosts.getStatus() == VDSStatus.Maintenance) { + continue; + } + + if (domainsVisibility.getDomainStatusByVds(domain.getId(), hosts.getId()) + != DomainVisibility.Status.MAINTENANCE) { + // Domain is still reachable by one vds, cannot be detached + return; + } + } + + log.infoFormat("Detaching domain {0} from pool", domain.getId(), _storagePoolId); + StoragePoolIsoMap mapToRemove = domain.getStoragePoolIsoMapData(); + DbFacade.getInstance().getStoragePoolIsoMapDao().remove( + new StoragePoolIsoMapId(mapToRemove.getstorage_id(), mapToRemove.getstorage_pool_id())); + } + private void moveDomainToMaintenance(StorageDomain domain) { // This is relevant only for domains that are in the process of being moved to maintenance if (domain.getStatus() != StorageDomainStatus.MovingToMaintenance) { diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java index ae97051..260ad05 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java @@ -480,6 +480,7 @@ || storage.getStorageDomainType() == StorageDomainType.Master) && (storage.getStatus() == StorageDomainStatus.Maintenance || storage.getStatus() == StorageDomainStatus.MovingToMaintenance + || storage.getStatus() == StorageDomainStatus.Detaching || storage.getStorageDomainSharedStatus() == StorageDomainSharedStatus.Unattached)); } return false; @@ -1155,7 +1156,8 @@ || storageDomain.getStorageDomainSharedStatus() == StorageDomainSharedStatus.Mixed; boolean isInMaintenance = (storageDomain.getStatus() == StorageDomainStatus.Maintenance || storageDomain.getStatus() == StorageDomainStatus.MovingToMaintenance); - boolean isUnattached = (storageDomain.getStorageDomainSharedStatus() == StorageDomainSharedStatus.Unattached); + boolean isUnattached = (storageDomain.getStorageDomainSharedStatus() == StorageDomainSharedStatus.Unattached + || storageDomain.getStatus() == StorageDomainStatus.Detaching); boolean isDataDomain = (storageDomain.getStorageDomainType() == StorageDomainType.Data) || (storageDomain.getStorageDomainType() == StorageDomainType.Master); boolean isBlockStorage = storageDomain.getStorageType().isBlockDomain(); diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/StorageDomainStatusColumn.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/StorageDomainStatusColumn.java index ca35614..3feebc8 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/StorageDomainStatusColumn.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/StorageDomainStatusColumn.java @@ -25,6 +25,7 @@ return getApplicationResources().unconfiguredImage(); case Locked: case MovingToMaintenance: + case Detaching: return getApplicationResources().lockImage(); default: return getApplicationResources().downImage(); -- To view, visit http://gerrit.ovirt.org/23556 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I5732ef00a67ef1381ee0b6f29d08ab39cf63a1bf Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Federico Simoncelli <fsimo...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches