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

Reply via email to