Liron Ar has uploaded a new change for review.

Change subject: core: allow current master domain to be selected as the new 
master
......................................................................

core: allow current master domain to be selected as the new master

Currently the current master domain cannot be selected as the new
master, which can cause to the system to not be able to recover in case
that it's the only available domain.

This patch allows to perform reconstruct using the master domain in case
that we know that it's accessible -
1. Getting WrongMasterDomain error from vdsm means that we could get to
the master domain metadata.

NOTE: in that case, the reconstruct command will be executed with
parameter indicating that the current master can be selected as the new
master - but the host that return the WrongMasterDomain error or the master
domain id as the master domain id as the id of the domain to reconstruct to 
aren't
being passed to the command - this is being done to avoid possible
issues (for example: failing to reconstruct to that domain although we
can read the metadata, keep trying through the same host..etc).
The intention here is to improve the current situation for most of the
usecases.

2. When the master domain info in the db is different then the
info received from getStoragePoolInfo.

Change-Id: I705298d4f94b4afacc3ca028bb0a4e6080ac5a46
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1016118
Signed-off-by: Liron Aravot <lara...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ReconstructMasterDomainCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ReconstructMasterParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/IVdsEventListener.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java
7 files changed, 73 insertions(+), 40 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/31/22431/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.java
index f8adb51..55c2e0a 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.java
@@ -85,8 +85,16 @@
     }
 
     @Override
-    public EventResult masterDomainNotOperational(Guid storageDomainId, Guid 
storagePoolId, boolean isReconstructToInactiveDomains) {
-        VdcActionParametersBase parameters = new 
ReconstructMasterParameters(storagePoolId, storageDomainId, true, 
isReconstructToInactiveDomains);
+    public EventResult masterDomainNotOperational(Guid storageDomainId,
+            Guid storagePoolId,
+            boolean isReconstructToInactiveDomains,
+            boolean canReconstructToCurrentMaster) {
+        VdcActionParametersBase parameters =
+                new ReconstructMasterParameters(storagePoolId,
+                        storageDomainId,
+                        true,
+                        isReconstructToInactiveDomains,
+                        canReconstructToCurrentMaster);
         boolean isSucceeded = 
Backend.getInstance().runInternalAction(VdcActionType.ReconstructMasterDomain,
                 parameters,
                 ExecutionHandler.createInternalJobContext()).getSucceeded();
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommand.java
index b529f05..1aa97ee 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommand.java
@@ -11,6 +11,7 @@
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.action.StorageDomainPoolParametersBase;
 import org.ovirt.engine.core.common.businessentities.StorageDomain;
+import org.ovirt.engine.core.common.businessentities.StorageDomainStatic;
 import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
 import org.ovirt.engine.core.common.businessentities.StorageDomainType;
 import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap;
@@ -41,11 +42,12 @@
     private StorageDomain _newMaster;
     protected boolean _isLastMaster;
     protected boolean canChooseInactiveDomainAsMaster;
+    protected boolean canChooseCurrentMasterAsNewMaster;
     private VDS spm;
 
     protected StorageDomain getNewMaster(boolean duringReconstruct) {
         if (_newMaster == null && 
Guid.Empty.equals(_newMasterStorageDomainId)) {
-            _newMaster = electNewMaster(duringReconstruct, 
canChooseInactiveDomainAsMaster);
+            _newMaster = electNewMaster(duringReconstruct, 
canChooseInactiveDomainAsMaster, canChooseCurrentMasterAsNewMaster);
         } else if (_newMaster == null) {
             _newMaster = getStorageDomainDAO().get(_newMasterStorageDomainId);
         }
@@ -269,34 +271,35 @@
         if (getStorageDomain().getStorageDomainType() == 
StorageDomainType.Master) {
             final StorageDomain newMaster = getNewMaster(duringReconstruct);
             if (newMaster != null) {
-                // increase master domain version
-                executeInNewTransaction(new TransactionMethod<Object>() {
+                
newMaster.getStorageStaticData().setLastTimeUsedAsMaster(System.currentTimeMillis());
+                _newMasterStorageDomainId = newMaster.getId();
 
-                    @Override
-                    public Object runInTransaction() {
-                        StoragePoolIsoMap newMasterMap = 
newMaster.getStoragePoolIsoMapData();
-                        
newMaster.getStorageStaticData().setLastTimeUsedAsMaster(System.currentTimeMillis());
-                        
getCompensationContext().snapshotEntity(newMaster.getStorageStaticData());
-                        
newMaster.setStorageDomainType(StorageDomainType.Master);
-                        _newMasterStorageDomainId = newMaster.getId();
-                        if (!duringReconstruct) {
-                            
newMasterMap.setStatus(StorageDomainStatus.Unknown);
-                            
getCompensationContext().snapshotEntityStatus(newMasterMap);
-                            newMaster.setStatus(StorageDomainStatus.Locked);
-                            
getStoragePoolIsoMapDAO().updateStatus(newMasterMap.getId(), 
newMasterMap.getStatus());
+                if (newMaster.getStorageDomainType() != 
StorageDomainType.Master) {
+                    executeInNewTransaction(new TransactionMethod<Object>() {
+
+                        @Override
+                        public Object runInTransaction() {
+                            StoragePoolIsoMap newMasterMap = 
newMaster.getStoragePoolIsoMapData();
+                            
getCompensationContext().snapshotEntity(newMaster.getStorageStaticData());
+                            
newMaster.setStorageDomainType(StorageDomainType.Master);
+                            if (!duringReconstruct) {
+                                
newMasterMap.setStatus(StorageDomainStatus.Unknown);
+                                
getCompensationContext().snapshotEntityStatus(newMasterMap);
+                                
newMaster.setStatus(StorageDomainStatus.Locked);
+                                
getStoragePoolIsoMapDAO().updateStatus(newMasterMap.getId(), 
newMasterMap.getStatus());
+                            }
+                            
updateStorageDomainStaticData(newMaster.getStorageStaticData());
+                            
getCompensationContext().snapshotEntity(getStorageDomain().getStorageStaticData());
+                            
getStorageDomain().setStorageDomainType(StorageDomainType.Data);
+                            
updateStorageDomainStaticData(getStorageDomain().getStorageStaticData());
+                            getCompensationContext().stateChanged();
+                            return null;
                         }
-                        DbFacade.getInstance()
-                                .getStorageDomainStaticDao()
-                                .update(newMaster.getStorageStaticData());
-                        
getCompensationContext().snapshotEntity(getStorageDomain().getStorageStaticData());
-                        
getStorageDomain().setStorageDomainType(StorageDomainType.Data);
-                        DbFacade.getInstance()
-                                .getStorageDomainStaticDao()
-                                
.update(getStorageDomain().getStorageStaticData());
-                        getCompensationContext().stateChanged();
-                        return null;
-                    }
-                });
+                    });
+                } else {
+                    
updateStorageDomainStaticData(newMaster.getStorageStaticData());
+                }
+
                 updateStoragePoolMasterDomainVersionInDiffTransaction();
             } else {
                 _isLastMaster = true;
@@ -304,6 +307,12 @@
         }
     }
 
+    private void updateStorageDomainStaticData(StorageDomainStatic 
storageDomainStatic) {
+        DbFacade.getInstance()
+                .getStorageDomainStaticDao()
+                .update(storageDomainStatic);
+    }
+
     @Override
     public AuditLogType getAuditLogTypeValue() {
         return getParameters().getIsInternal() ? getSucceeded() ? 
AuditLogType.SYSTEM_DEACTIVATED_STORAGE_DOMAIN
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ReconstructMasterDomainCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ReconstructMasterDomainCommand.java
index 74856778..642b6a5 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ReconstructMasterDomainCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ReconstructMasterDomainCommand.java
@@ -48,6 +48,7 @@
         super(parameters);
         _newMasterStorageDomainId = parameters.getNewMasterDomainId();
         canChooseInactiveDomainAsMaster = 
parameters.isCanChooseInactiveDomainAsMaster();
+        canChooseCurrentMasterAsNewMaster = 
parameters.isCanChooseCurrentMasterAsNewMaster();
     }
 
     private boolean checkIsDomainLocked(StoragePoolIsoMap domainMap) {
@@ -94,8 +95,8 @@
     protected boolean reconstructMaster() {
         proceedStorageDomainTreatmentByDomainType(true);
 
-        // To issue a reconstructMaster you need to set the domain inactive
-        if (getParameters().isInactive()) {
+        // To issue a reconstructMaster you need to set the domain inactive 
unless the selected domain is the current master
+        if (getParameters().isInactive() && 
!getStorageDomain().getId().equals(_newMasterStorageDomainId)) {
             executeInNewTransaction(new TransactionMethod<Void>() {
                 @Override
                 public Void runInTransaction() {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java
index 957bc1f..4b39812 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java
@@ -265,7 +265,7 @@
      * is set to True, an Inactive domain will be returned in case that no 
domain in Active/Unknown status was found.
      * @return an elected master domain or null
      */
-    protected StorageDomain electNewMaster(boolean duringReconstruct, boolean 
selectInactiveWhenNoActiveUnknownDomains) {
+    protected StorageDomain electNewMaster(boolean duringReconstruct, boolean 
selectInactiveWhenNoActiveUnknownDomains, boolean 
canChooseCurrentMasterAsNewMaster) {
         StorageDomain newMaster = null;
         if (getStoragePool() != null) {
             List<StorageDomain> storageDomains = 
getStorageDomainDAO().getAllForStoragePool(getStoragePool().getId());
@@ -275,7 +275,9 @@
                 for (StorageDomain dbStorageDomain : storageDomains) {
                     if ((storageDomain == null || (duringReconstruct || 
!dbStorageDomain.getId()
                             .equals(storageDomain.getId())))
-                            && dbStorageDomain.getStorageDomainType() == 
StorageDomainType.Data) {
+                            && ((dbStorageDomain.getStorageDomainType() == 
StorageDomainType.Data)
+                            ||
+                            (canChooseCurrentMasterAsNewMaster && 
dbStorageDomain.getStorageDomainType() == StorageDomainType.Master))) {
                         if (dbStorageDomain.getStatus() == 
StorageDomainStatus.Active
                                 || dbStorageDomain.getStatus() == 
StorageDomainStatus.Unknown) {
                             newMaster = dbStorageDomain;
@@ -298,7 +300,7 @@
      * @return an elected master domain or null
      */
     protected StorageDomain electNewMaster(boolean duringReconstruct) {
-        return electNewMaster(duringReconstruct, false);
+        return electNewMaster(duringReconstruct, false, false);
     }
 
     @Override
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ReconstructMasterParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ReconstructMasterParameters.java
index c09fe3c..b7711e8 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ReconstructMasterParameters.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ReconstructMasterParameters.java
@@ -7,6 +7,7 @@
 
     private Guid privateNewMasterDomainId;
     private boolean canChooseInactiveDomainAsMaster;
+    private boolean canChooseCurrentMasterAsNewMaster;
 
     public ReconstructMasterParameters() {
         privateNewMasterDomainId = Guid.Empty;
@@ -18,9 +19,10 @@
         setInactive(isInactive);
     }
 
-    public ReconstructMasterParameters(Guid storagePoolId, Guid 
storageDomainId, boolean isInactive, boolean canChooseInactiveDomainAsMaster) {
+    public ReconstructMasterParameters(Guid storagePoolId, Guid 
storageDomainId, boolean isInactive, boolean canChooseInactiveDomainAsMaster, 
boolean canChooseCurrentMasterAsNewMaster) {
         this(storagePoolId, storageDomainId, isInactive);
         setCanChooseInactiveDomainAsMaster(canChooseInactiveDomainAsMaster);
+        
setCanChooseCurrentMasterAsNewMaster(canChooseCurrentMasterAsNewMaster);
     }
 
     public ReconstructMasterParameters(Guid storagePoolId, Guid 
newMasterDomainId) {
@@ -43,4 +45,12 @@
     public void setNewMasterDomainId(Guid value) {
         privateNewMasterDomainId = value;
     }
+
+    public boolean isCanChooseCurrentMasterAsNewMaster() {
+        return canChooseCurrentMasterAsNewMaster;
+    }
+
+    public void setCanChooseCurrentMasterAsNewMaster(boolean 
canChooseCurrentMasterAsNewMaster) {
+        this.canChooseCurrentMasterAsNewMaster = 
canChooseCurrentMasterAsNewMaster;
+    }
 }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/IVdsEventListener.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/IVdsEventListener.java
index 616fbe2..90447e1 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/IVdsEventListener.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/IVdsEventListener.java
@@ -23,7 +23,7 @@
 
     EventResult storageDomainNotOperational(Guid storageDomainId, Guid 
storagePoolId); // BLL
 
-    EventResult masterDomainNotOperational(Guid storageDomainId, Guid 
storagePoolId, boolean isReconstructToInactiveDomains); // BLL
+    EventResult masterDomainNotOperational(Guid storageDomainId, Guid 
storagePoolId, boolean isReconstructToInactiveDomains, boolean 
canReconstructToCurrentMaster); // BLL
 
     void processOnVmStop(Guid vmId);
 
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 6466382..1d7723c 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
@@ -467,7 +467,7 @@
 
                             return ResourceManager.getInstance()
                                     .getEventListener()
-                                    
.masterDomainNotOperational(masterDomainId, storagePoolId, false);
+                                    
.masterDomainNotOperational(masterDomainId, storagePoolId, false, true);
 
                         }
                     });
@@ -1325,7 +1325,7 @@
                     log.warnFormat("Domain {0} was reported by all hosts in 
status UP as problematic. Not moving the domain to NonOperational because it is 
being reconstructed now.",
                             domainIdTuple);
                     result = ResourceManager.getInstance()
-                            
.getEventListener().masterDomainNotOperational(domainId, _storagePoolId, false);
+                            
.getEventListener().masterDomainNotOperational(domainId, _storagePoolId, false, 
false);
                 }
             }
 
@@ -1543,7 +1543,8 @@
                 log.errorFormat("IrsBroker::Failed::{0}", getCommandName());
                 log.errorFormat("Exception: {0}", ex.getMessage());
 
-                if (getCurrentIrsProxyData().getHasVdssForSpmSelection()) {
+                if ((ex.getVdsError() == null || ex.getVdsError().getCode() != 
VdcBllErrors.StoragePoolWrongMaster)
+                        && 
getCurrentIrsProxyData().getHasVdssForSpmSelection()) {
                     failover();
                 } else {
                     isStartReconstruct = true;
@@ -1614,7 +1615,9 @@
                         public EventResult call() {
                             return ResourceManager.getInstance()
                                     
.getEventListener().masterDomainNotOperational(
-                                            masterDomainId, 
getParameters().getStoragePoolId(), true);
+                                            masterDomainId, 
getParameters().getStoragePoolId(), true,
+                                            getVDSReturnValue().getVdsError() 
!= null &&
+                                                    
getVDSReturnValue().getVdsError().getCode() == 
VdcBllErrors.StoragePoolWrongMaster);
                         }
                     });
         } else {


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I705298d4f94b4afacc3ca028bb0a4e6080ac5a46
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.3
Gerrit-Owner: Liron Ar <lara...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to