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

Change-Id: I705298d4f94b4afacc3ca028bb0a4e6080ac5a46
Signed-off-by: Liron Aravot <[email protected]>
---
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, 43 insertions(+), 26 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/16/22016/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 8f16fa4..3b0b6d1 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
@@ -86,7 +86,7 @@
     }
 
     @Override
-    public EventResult masterDomainNotOperational(Guid storageDomainId, Guid 
storagePoolId, boolean isReconstructToInactiveDomains) {
+    public EventResult masterDomainNotOperational(Guid storageDomainId, Guid 
storagePoolId, boolean isReconstructToInactiveDomains, boolean 
canReconstructToCurrentMaster) {
         VdcActionParametersBase parameters = new 
ReconstructMasterParameters(storagePoolId, storageDomainId, true, 
isReconstructToInactiveDomains);
         boolean isSucceeded = 
Backend.getInstance().runInternalAction(VdcActionType.ReconstructMasterDomain,
                 parameters,
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..af7c272 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
@@ -41,11 +41,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);
         }
@@ -276,24 +277,27 @@
                     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) {
+                            
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());
+                            }
+                            DbFacade.getInstance()
+                                    .getStorageDomainStaticDao()
+                                    .update(newMaster.getStorageStaticData());
+                            
getCompensationContext().snapshotEntity(getStorageDomain().getStorageStaticData());
+                            
getStorageDomain().setStorageDomainType(StorageDomainType.Data);
+                            getCompensationContext().stateChanged();
                         }
-                        DbFacade.getInstance()
-                                .getStorageDomainStaticDao()
-                                .update(newMaster.getStorageStaticData());
-                        
getCompensationContext().snapshotEntity(getStorageDomain().getStorageStaticData());
-                        
getStorageDomain().setStorageDomainType(StorageDomainType.Data);
+
                         DbFacade.getInstance()
                                 .getStorageDomainStaticDao()
                                 
.update(getStorageDomain().getStorageStaticData());
-                        getCompensationContext().stateChanged();
                         return null;
                     }
                 });
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 67d6f8c..1cefba2 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() && 
!getNewMaster(true).getId().equals(getStorageDomain().getId())) {
             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 19a7d37..805130d 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
@@ -310,7 +310,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());
@@ -320,7 +320,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;
@@ -343,7 +345,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..99a9359 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;
@@ -43,4 +44,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 b4b23c8..e9876e5 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
@@ -22,7 +22,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 7bc4b95..e45cf4a 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
@@ -466,7 +466,7 @@
 
                             return ResourceManager.getInstance()
                                     .getEventListener()
-                                    
.masterDomainNotOperational(masterDomainId, storagePoolId, false);
+                                    
.masterDomainNotOperational(masterDomainId, storagePoolId, false, true);
 
                         }
                     });
@@ -1324,7 +1324,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);
                 }
             }
 
@@ -1542,7 +1542,7 @@
                 log.errorFormat("IrsBroker::Failed::{0}", getCommandName());
                 log.errorFormat("Exception: {0}", ex.getMessage());
 
-                if (getCurrentIrsProxyData().getHasVdssForSpmSelection()) {
+                if (ex.getVdsError().getCode() != 
VdcBllErrors.StoragePoolWrongMaster && 
getCurrentIrsProxyData().getHasVdssForSpmSelection()) {
                     failover();
                 } else {
                     isStartReconstruct = true;
@@ -1613,7 +1613,8 @@
                         public EventResult call() {
                             return ResourceManager.getInstance()
                                     
.getEventListener().masterDomainNotOperational(
-                                            masterDomainId, 
getParameters().getStoragePoolId(), true);
+                                            masterDomainId, 
getParameters().getStoragePoolId(), true,
+                                            
getVDSReturnValue().getVdsError().getCode() == 
VdcBllErrors.StoragePoolWrongMaster);
                         }
                     });
         } else {


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

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

Reply via email to