Liron Aravot has uploaded a new change for review.

Change subject: core: ReconstructMasterDomain -connect/disconnect hosts 
simultaneously
......................................................................

core: ReconstructMasterDomain -connect/disconnect hosts simultaneously

When running ReconstructMasterDomain/RecoveryStoragePool commands - any
connect/disconnect operations can be done simultaneously by different
threads in order to improve the run time.

Change-Id: Ic9226a36ceb82ec117b359608547001ff71327e0
Signed-off-by: Liron Aravot <lara...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ReconstructMasterDomainCommand.java
1 file changed, 63 insertions(+), 37 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/40/10040/1

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 cf3fb37..eb558ea 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
@@ -2,6 +2,7 @@
 
 import java.text.MessageFormat;
 import java.util.List;
+import java.util.concurrent.RejectedExecutionException;
 
 import org.ovirt.engine.core.bll.Backend;
 import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute;
@@ -33,6 +34,8 @@
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.VdcBllMessages;
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.utils.ThreadUtils;
+import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil;
 import org.ovirt.engine.core.utils.transaction.TransactionMethod;
 
 @SuppressWarnings("serial")
@@ -217,49 +220,72 @@
     }
 
     private void connectAndRefreshAllUpHosts(final boolean commandSucceeded) {
-        for (VDS vds : getAllRunningVdssInPool()) {
-            try {
-                if (!_isLastMaster && commandSucceeded && 
connectVdsToNewMaster(vds)) {
-                    try {
-                        runVdsCommand(
-                                VDSCommandType.RefreshStoragePool,
-                                new 
RefreshStoragePoolVDSCommandParameters(vds.getId(),
-                                        getStoragePool().getId(),
-                                        _newMasterStorageDomainId,
-                                        
getStoragePool().getmaster_domain_version()));
-                    } catch (VdcBLLException ex) {
-                        if (VdcBllErrors.StoragePoolUnknown == 
ex.getVdsError().getCode()) {
-                            VDSReturnValue returnVal = runVdsCommand(
-                                    VDSCommandType.ConnectStoragePool,
-                                    new 
ConnectStoragePoolVDSCommandParameters(vds.getId(),
-                                            getStoragePool().getId(), 
vds.getvds_spm_id(),
-                                            _newMasterStorageDomainId, 
getStoragePool()
-                                                    
.getmaster_domain_version()));
-                            if (!returnVal.getSucceeded()) {
-                                log.errorFormat("Post reconstruct actions 
(connectPool) did not complete on host {0} in the pool. error {1}",
-                                        vds.getId(),
-                                        returnVal.getVdsError().getMessage());
+        final boolean isPerformConnectOps = !_isLastMaster && commandSucceeded;
+        final boolean isPerformDisconnect = !getParameters().isInactive();
+        if (isPerformConnectOps || isPerformDisconnect) {
+            for (VDS host : getAllRunningVdssInPool()) {
+                final VDS vds = host;
+                Runnable task = new Runnable() {
+                    @Override
+                    public void run() {
+                        try {
+                            if (isPerformConnectOps && 
connectVdsToNewMaster(vds)) {
+                                try {
+                                    runVdsCommand(
+                                            VDSCommandType.RefreshStoragePool,
+                                            new 
RefreshStoragePoolVDSCommandParameters(vds.getId(),
+                                                    getStoragePool().getId(),
+                                                    _newMasterStorageDomainId,
+                                                    
getStoragePool().getmaster_domain_version()));
+                                } catch (VdcBLLException ex) {
+                                    if (VdcBllErrors.StoragePoolUnknown == 
ex.getVdsError().getCode()) {
+                                        VDSReturnValue returnVal = 
runVdsCommand(
+                                                
VDSCommandType.ConnectStoragePool,
+                                                new 
ConnectStoragePoolVDSCommandParameters(vds.getId(),
+                                                        
getStoragePool().getId(), vds.getvds_spm_id(),
+                                                        
_newMasterStorageDomainId, getStoragePool()
+                                                                
.getmaster_domain_version()));
+                                        if (!returnVal.getSucceeded()) {
+                                            log.errorFormat("Post reconstruct 
actions (connectPool) did not complete on host {0} in pool {1}. error {2}",
+                                                    vds.getId(),
+                                                    getStoragePool().getId(),
+                                                    
returnVal.getVdsError().getMessage());
+                                        }
+                                    } else {
+                                        log.errorFormat("Post reconstruct 
actions (refreshPool)"
+                                                + " did not complete on host 
{0} in pool {1}. error {2}",
+                                                vds.getId(),
+                                                getStoragePool().getId(),
+                                                ex.getMessage());
+                                    }
+                                }
                             }
-                        } else {
-                            log.errorFormat("Post reconstruct actions 
(refreshPool)"
+                            // only if we deactivate the storage domain we 
want to disconnect from it.
+                            if (isPerformDisconnect) {
+                                StorageHelperDirector.getInstance()
+                                        
.getItem(getStorageDomain().getstorage_type())
+                                        
.DisconnectStorageFromDomainByVdsId(getStorageDomain(), vds.getId());
+                            }
+
+                        } catch (Exception e) {
+                            log.errorFormat("Post reconstruct actions 
(connectPool,refreshPool,disconnect storage)"
                                     + " did not complete on host {0} in the 
pool. error {1}",
                                     vds.getId(),
-                                    ex.getMessage());
+                                    e.getMessage());
                         }
                     }
+                };
+                boolean succeededExecuteRunnable = false;
+                // to avoid a situation in which the connect/disconnect 
commands aren't being executed
+                // for a host, we need to try until the task is being 
submitted.
+                while (!succeededExecuteRunnable) {
+                    try {
+                        ThreadPoolUtil.execute(task);
+                        succeededExecuteRunnable = true;
+                    } catch (RejectedExecutionException e) {
+                        ThreadUtils.sleep(1000);
+                    }
                 }
-                // only if we deactivate the storage domain we want to 
disconnect from it.
-                if (!getParameters().isInactive()) {
-                    StorageHelperDirector.getInstance()
-                            .getItem(getStorageDomain().getstorage_type())
-                            
.DisconnectStorageFromDomainByVdsId(getStorageDomain(), vds.getId());
-                }
-
-            } catch (Exception e) {
-                log.errorFormat("Post reconstruct actions 
(connectPool,refreshPool,disconnect storage)"
-                        + " did not complete on host {0} in the pool. error 
{1}",
-                        vds.getId(),
-                        e.getMessage());
             }
         }
     }


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

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

Reply via email to