anmolbabu has uploaded a new change for review. Change subject: engine: Mount-Broker setup changes ......................................................................
engine: Mount-Broker setup changes Previously mount broker setup used to be done on all nodes of slave volume. But, it was observed that with latest glusterfs nightly it suffices to do it on any one node in slave volume. And if its done on all nodes of slave volume, the glusterds enter a race condition as all of them simultaneously also try to set up mount broker on other nodes. However root-mount broker folder with appropriate privileges need to be cerated on all nodes. This is in accordance with modification in VDSM verb that takes a boolean flag 'partial'. Change-Id: I09f44f8f12e5a49a85b3542793aa5f476ab0ccb3 Signed-off-by: Anmol Babu <anb...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeGeoRepSessionCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/SetupGlusterGeoRepMountBrokerInternalCommand.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/SetUpMountBrokerParameters.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/gluster/SetUpGlusterGeoRepMountBrokerVDSParameters.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/SetupGlusterGeoRepMountBrokerVDSCommand.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java 9 files changed, 128 insertions(+), 46 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/85/42285/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeGeoRepSessionCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeGeoRepSessionCommand.java index 503d196..9121629 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeGeoRepSessionCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CreateGlusterVolumeGeoRepSessionCommand.java @@ -29,6 +29,7 @@ import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeGeoRepSessionVDSParameters; +import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.gluster.GlusterGeoRepDao; import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil; @@ -123,32 +124,67 @@ protected void executeCommand() { boolean rootSession = getParameters().getUserName().equalsIgnoreCase("root"); boolean succeeded = true; + Set<Guid> remoteServerIds = getServerIds(remoteServersSet); + Guid slaveHostId = getParameters().getSlaveHostId(); if (!rootSession) { - succeeded = setUpMountBrokerOnSlaves(); + succeeded = setUpMountBrokerOnSlave(); + remoteServerIds.remove(slaveHostId); + succeeded = setUpPartialMountBrokerOnSlaves(remoteServerIds); } if (succeeded) { - succeeded = setUpPasswordlessSSHAndCreateSession(); + remoteServerIds.add(slaveHostId); + succeeded = setUpPasswordlessSSH(upServer.getId(), remoteServerIds, getParameters().getUserName()); if (succeeded) { - GlusterGeoRepSyncJob.getInstance().refreshGeoRepDataForVolume(getGlusterVolume()); + succeeded = + createGeoRepSession(upServer.getId(), + getGlusterVolumeName(), + getVdsDAO().get(slaveHostId).getHostName(), + getParameters().getSlaveVolumeName(), + getParameters().getUserName(), + getParameters().isForce(), + true); + if (succeeded) { + GlusterGeoRepSyncJob.getInstance().refreshGeoRepDataForVolume(getGlusterVolume()); + } } } } - private boolean setUpMountBrokerOnSlaves() { - List<Callable<Boolean>> mountBrokerSetupReturnStatuses = new ArrayList<>(); - for (final VDS currentSlaveServer : remoteServersSet) { - mountBrokerSetupReturnStatuses.add(new Callable<Boolean>() { + private Set<Guid> getServerIds(Set<VDS> remoteServersSet) { + Set<Guid> remoteServerIds = new HashSet<Guid>(); + for (VDS currentVds : remoteServersSet) { + remoteServerIds.add(currentVds.getId()); + } + return remoteServerIds; + } + + protected boolean setUpMountBrokerOnSlave() { + return getBackend().runInternalAction(VdcActionType.SetupGlusterGeoRepMountBrokerInternal, + new SetUpMountBrokerParameters(getParameters().getSlaveHostId(), + getParameters().getSlaveVolumeName(), + getParameters().getUserName(), + getParameters().getUserGroup())).getSucceeded(); + } + + protected boolean setUpPartialMountBrokerOnSlaves(Set<Guid> remoteServerIds) { + if (remoteServerIds == null || remoteServerIds.isEmpty()) { + return true; + } + List<Callable<Boolean>> mountBrokerPartialSetupReturnStatuses = new ArrayList<Callable<Boolean>>(); + for (final Guid currentSlaveServerId : remoteServerIds) { + mountBrokerPartialSetupReturnStatuses.add(new Callable<Boolean>() { @Override public Boolean call() throws Exception { return getBackend().runInternalAction(VdcActionType.SetupGlusterGeoRepMountBrokerInternal, - new SetUpMountBrokerParameters(currentSlaveServer.getId(), - getParameters().getSlaveVolumeName(), - getParameters().getUserName(), - getParameters().getUserGroup())).getSucceeded(); + new SetUpMountBrokerParameters(currentSlaveServerId, + getParameters().getSlaveVolumeName(), + getParameters().getUserName(), + getParameters().getUserGroup(), + true)).getSucceeded(); } }); } - List<Boolean> returnStatuses = ThreadPoolUtil.invokeAll(mountBrokerSetupReturnStatuses); + List<Boolean> returnStatuses = ThreadPoolUtil.invokeAll(mountBrokerPartialSetupReturnStatuses); for (Boolean currentReturnStatus : returnStatuses) { if (!currentReturnStatus) { return false; @@ -157,27 +193,26 @@ return true; } - private boolean setUpPasswordlessSSHAndCreateSession() { - List<String> pubKeys = readPubKey(); + protected boolean setUpPasswordlessSSH(Guid masterUpServerId, Set<Guid> remoteServerSet, String userName) { + List<String> pubKeys = readPubKey(masterUpServerId); boolean canProceed = pubKeys != null && pubKeys.size() > 0; if (canProceed) { - canProceed = updatePubKeysToRemoteHosts(pubKeys); - if (canProceed) { - canProceed = createGeoRepSession(); - } + canProceed = updatePubKeysToRemoteHosts(pubKeys, remoteServerSet, userName); } return canProceed; } - private boolean updatePubKeysToRemoteHosts(final List<String> pubKeys) { - List<Callable<Boolean>> slaveWritePubKeyList = new ArrayList<>(); - for (final VDS currentRemoteHost : remoteServersSet) { + private boolean updatePubKeysToRemoteHosts(final List<String> pubKeys, + Set<Guid> remoteServersSet, + final String userName) { + List<Callable<Boolean>> slaveWritePubKeyList = new ArrayList<Callable<Boolean>>(); + for (final Guid currentRemoteHostId : remoteServersSet) { slaveWritePubKeyList.add(new Callable<Boolean>() { @Override public Boolean call() throws Exception { return getBackend().runInternalAction(VdcActionType.UpdateGlusterHostPubKeyToSlaveInternal, - new UpdateGlusterHostPubKeyToSlaveParameters(currentRemoteHost.getId(), - pubKeys, getParameters().getUserName())).getSucceeded(); + new UpdateGlusterHostPubKeyToSlaveParameters(currentRemoteHostId, + pubKeys, userName)).getSucceeded(); } }); } @@ -191,25 +226,32 @@ } @SuppressWarnings("unchecked") - private List<String> readPubKey() { + private List<String> readPubKey(Guid upServerId) { VdcQueryReturnValue readPubKeyReturnvalue = - runInternalQuery(VdcQueryType.GetGlusterHostPublicKeys, new IdQueryParameters(upServer.getId())); + runInternalQuery(VdcQueryType.GetGlusterHostPublicKeys, new IdQueryParameters(upServerId)); if (readPubKeyReturnvalue.getSucceeded()) { return (List<String>) readPubKeyReturnvalue.getReturnValue(); } else { - handleVdsError(AuditLogType.GLUSTER_GEO_REP_PUB_KEY_FETCH_FAILED, readPubKeyReturnvalue.getExceptionString()); + handleVdsError(AuditLogType.GLUSTER_GEO_REP_PUB_KEY_FETCH_FAILED, + readPubKeyReturnvalue.getExceptionString()); return null; } } - private boolean createGeoRepSession() { + protected boolean createGeoRepSession(Guid upServerId, + String masterVolumeName, + String remoteHost, + String remoteVolumeName, + String userName, + Boolean force, + Boolean handleError) { GlusterVolumeGeoRepSessionVDSParameters params = - new GlusterVolumeGeoRepSessionVDSParameters(upServer.getId(), - getGlusterVolumeName(), - slaveHost.getHostName(), - getParameters().getSlaveVolumeName(), - getParameters().getUserName(), - getParameters().isForce()); + new GlusterVolumeGeoRepSessionVDSParameters(upServerId, + masterVolumeName, + remoteHost, + remoteVolumeName, + userName, + force); VDSReturnValue createSessionReturnValue = runVdsCommand(VDSCommandType.CreateGlusterVolumeGeoRepSession, params); if (createSessionReturnValue.getSucceeded()) { @@ -217,14 +259,16 @@ return true; } else { setSucceeded(false); - handleVdsError(AuditLogType.GLUSTER_GEOREP_SESSION_CREATE_FAILED, createSessionReturnValue.getVdsError() - .getMessage()); + if (handleError) { + handleVdsError(AuditLogType.GLUSTER_GEOREP_SESSION_CREATE_FAILED, + createSessionReturnValue.getVdsError().getMessage()); + } return false; } } private Set<VDS> fetchRemoteServers() { - Set<VDS> remoteServers = new HashSet<>(); + Set<VDS> remoteServers = new HashSet<VDS>(); List<GlusterBrickEntity> slaveBricks = slaveVolume.getBricks(); for (GlusterBrickEntity currentBrick : slaveBricks) { remoteServers.add(getVdsDAO().get(currentBrick.getServerId())); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/SetupGlusterGeoRepMountBrokerInternalCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/SetupGlusterGeoRepMountBrokerInternalCommand.java index 514f439..3cb3dbe1 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/SetupGlusterGeoRepMountBrokerInternalCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/SetupGlusterGeoRepMountBrokerInternalCommand.java @@ -96,7 +96,8 @@ new SetUpGlusterGeoRepMountBrokerVDSParameters(getParameters().getId(), parameters.getRemoteUserName(), parameters.getRemoteUserGroup(), - parameters.getRemoteVolumeName())); + parameters.getRemoteVolumeName(), + parameters.isPartial())); if (mountBrokerReturnValue.getSucceeded()) { VDSReturnValue restartGlusterdReturnValue = restartGlusterd(getParameters().getId()); if (!restartGlusterdReturnValue.getSucceeded()) { diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/SetUpMountBrokerParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/SetUpMountBrokerParameters.java index d3a655a..1098820 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/SetUpMountBrokerParameters.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/gluster/SetUpMountBrokerParameters.java @@ -10,16 +10,25 @@ private String remoteVolumeName; private String remoteUserName; private String remoteUserGroup; + private boolean partial; public SetUpMountBrokerParameters() { super(); } public SetUpMountBrokerParameters(Guid remoteHostId, String remoteVolumeName, String remoteUserName, String remoteUserGroup) { + this(remoteHostId, remoteVolumeName, remoteUserName, remoteUserGroup, false); + } + + public SetUpMountBrokerParameters(Guid remoteHostId, String remoteVolumeName, + String remoteUserName, + String remoteUserGroup, + boolean partial) { super(remoteHostId); + this.remoteVolumeName = remoteVolumeName; this.remoteUserName = remoteUserName; this.remoteUserGroup = remoteUserGroup; - this.setRemoteVolumeName(remoteVolumeName); + this.partial = partial; } public String getRemoteUserName() { @@ -45,4 +54,12 @@ public void setRemoteVolumeName(String remoteVolumeName) { this.remoteVolumeName = remoteVolumeName; } + + public boolean isPartial() { + return partial; + } + + public void setPartial(boolean partial) { + this.partial = partial; + } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/gluster/SetUpGlusterGeoRepMountBrokerVDSParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/gluster/SetUpGlusterGeoRepMountBrokerVDSParameters.java index 2b2639a..497cdae 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/gluster/SetUpGlusterGeoRepMountBrokerVDSParameters.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/gluster/SetUpGlusterGeoRepMountBrokerVDSParameters.java @@ -7,16 +7,26 @@ private String remoteUserName; private String remoteGroupName; private String remoteVolumeName; + private boolean partial; public SetUpGlusterGeoRepMountBrokerVDSParameters() { } public SetUpGlusterGeoRepMountBrokerVDSParameters(Guid vdsId, String userName, String userGroup, String remoteVolumeName) { + this(vdsId, userName, userGroup, remoteVolumeName, false); + } + + public SetUpGlusterGeoRepMountBrokerVDSParameters(Guid vdsId, + String remoteUserName, + String remoteGroupName, + String remoteVolumeName, + boolean partial) { super(vdsId); - this.remoteUserName = userName; - this.remoteGroupName = userGroup; + this.remoteUserName = remoteUserName; + this.remoteGroupName = remoteGroupName; this.remoteVolumeName = remoteVolumeName; + this.partial = partial; } public String getRemoteUserName() { @@ -42,4 +52,12 @@ public void setRemoteVolumeName(String remoteVolumeName) { this.remoteVolumeName = remoteVolumeName; } + + public boolean isPartial() { + return partial; + } + + public void setPartial(boolean partial) { + this.partial = partial; + } } diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/SetupGlusterGeoRepMountBrokerVDSCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/SetupGlusterGeoRepMountBrokerVDSCommand.java index 8036e6a..2e1a2ef 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/SetupGlusterGeoRepMountBrokerVDSCommand.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/SetupGlusterGeoRepMountBrokerVDSCommand.java @@ -14,7 +14,7 @@ status = getBroker().glusterGeoRepMountBrokerSetup(parameters.getRemoteVolumeName(), parameters.getRemoteUserName(), - parameters.getRemoteGroupName()); + parameters.getRemoteGroupName(), parameters.isPartial()); proceedProxyReturnValue(); } diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java index 316cd81..1088125 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java @@ -1210,9 +1210,10 @@ } @Override - public StatusOnlyReturnForXmlRpc glusterGeoRepMountBrokerSetup(String remoteVolumeName, String userName, String remoteGroupName) { + public StatusOnlyReturnForXmlRpc glusterGeoRepMountBrokerSetup(String remoteVolumeName, String userName, String remoteGroupName, Boolean partial) { JsonRpcRequest request = new RequestBuilder("GlusterVolume.geoRepMountBrokerSetup").withParameter("remoteVolumeName", remoteVolumeName) + .withParameter("partial", partial) .withOptionalParameter("remoteUserName", userName) .withOptionalParameter("remoteGroupName", remoteGroupName).build(); Map<String, Object> response = new FutureMap(this.client, request); diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java index e21b20e8..cf13723 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java @@ -325,7 +325,7 @@ StatusOnlyReturnForXmlRpc glusterGeoRepMountBrokerSetup(String remoteVolumeName, String userName, - String remoteGroupName); + String remoteGroupName, Boolean partial); StatusOnlyReturnForXmlRpc glusterVolumeGeoRepSessionCreate(String volumeName, String remoteHost, diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java index f68aa4c..053a181 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java @@ -298,7 +298,8 @@ public Map<String, Object> glusterGeoRepMountBrokerSetup(String userName, String remoteGroupName, - String remoteVolumeName); + String remoteVolumeName, + Boolean partial); public Map<String, Object> glusterVolumeGeoRepSessionCreate(String volumeName, String remoteHost, diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java index 5c5c16f..4862912 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java @@ -1144,9 +1144,9 @@ } @Override - public StatusOnlyReturnForXmlRpc glusterGeoRepMountBrokerSetup(String remoteVolumeName, String userName, String remoteGroupName) { + public StatusOnlyReturnForXmlRpc glusterGeoRepMountBrokerSetup(String remoteVolumeName, String userName, String remoteGroupName, Boolean partial) { try { - Map<String, Object> xmlRpcReturnValue = vdsServer.glusterGeoRepMountBrokerSetup(userName, remoteGroupName, remoteVolumeName); + Map<String, Object> xmlRpcReturnValue = vdsServer.glusterGeoRepMountBrokerSetup(userName, remoteGroupName, remoteVolumeName, partial); StatusOnlyReturnForXmlRpc wrapper = new StatusOnlyReturnForXmlRpc(xmlRpcReturnValue); return wrapper; } catch (UndeclaredThrowableException ute) { -- To view, visit https://gerrit.ovirt.org/42285 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I09f44f8f12e5a49a85b3542793aa5f476ab0ccb3 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.5-gluster Gerrit-Owner: anmolbabu <anb...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches