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