diff options
| author | Shireesh Anjal <shireesh@gluster.com> | 2011-06-01 21:01:28 +0530 |
|---|---|---|
| committer | Shireesh Anjal <shireesh@gluster.com> | 2011-06-03 15:17:12 +0530 |
| commit | 1e8eaa76b26d66fef187f1cd87cedb8665b06bd3 (patch) | |
| tree | 16603bdd46aff59294b57c06665238954eb47751 /src | |
| parent | bce75132c78b118fc842ed602ecc9f8766351c0a (diff) | |
Design changes - introducing cluster-server mapping on gateway
Diffstat (limited to 'src')
8 files changed, 70 insertions, 37 deletions
diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java index a5e480af..9a27b085 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java @@ -317,6 +317,11 @@ public class GlusterDataModelManager { for (ClusterListener listener : listeners) { listener.serverRemoved(server); } + + // add it to discovered servers list + Server removedServer = new Server(); + removedServer.copyFrom(server); + addDiscoveredServer(removedServer); } public void deleteVolume(Volume volume) { diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java index 060b3c38..b0b863ab 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java @@ -28,14 +28,13 @@ import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.GlusterServersClient; import com.gluster.storage.management.core.model.Cluster; import com.gluster.storage.management.core.model.GlusterServer; -import com.gluster.storage.management.core.model.Server; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.utils.StringUtil; public class RemoveServerAction extends AbstractActionDelegate { - private Server server; + private GlusterServer server; private GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance(); @Override @@ -64,9 +63,6 @@ public class RemoveServerAction extends AbstractActionDelegate { showInfoDialog(actionDesc, "Server removed successfully"); GlusterServer glusterServer = (GlusterServer) server; GlusterDataModelManager.getInstance().removeGlusterServer(glusterServer); - if (glusterServer.isOnline()) { - GlusterDataModelManager.getInstance().addDiscoveredServer(server); - } } else { showErrorDialog(actionDesc, "Server could not be removed. Error: [" + status + "]"); } @@ -94,8 +90,8 @@ public class RemoveServerAction extends AbstractActionDelegate { @Override public void selectionChanged(IAction action, ISelection selection) { super.selectionChanged(action, selection); - if (selectedEntity instanceof Server) { - server = (Server) selectedEntity; + if (selectedEntity instanceof GlusterServer) { + server = (GlusterServer) selectedEntity; } } } diff --git a/src/com.gluster.storage.management.server/.project b/src/com.gluster.storage.management.server/.project index 259b3726..86d34a3b 100644 --- a/src/com.gluster.storage.management.server/.project +++ b/src/com.gluster.storage.management.server/.project @@ -37,5 +37,6 @@ <nature>org.eclipse.wst.common.project.facet.core.nature</nature> <nature>org.eclipse.jdt.core.javanature</nature> <nature>org.eclipse.wst.jsdt.core.jsNature</nature> + <nature>org.python.pydev.pythonNature</nature> </natures> </projectDescription> diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/PersistenceDao.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/PersistenceDao.java index 1534e78c..85fefcdf 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/PersistenceDao.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/PersistenceDao.java @@ -107,7 +107,7 @@ public class PersistenceDao<T> { return getEntityManager().merge(obj); } - public void delete(T obj) { + public void delete(Object obj) { getEntityManager().remove(obj); } } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ClustersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ClustersResource.java index c5f2da69..86af26fb 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ClustersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ClustersResource.java @@ -126,6 +126,7 @@ public class ClustersResource { } cluster.setServers(servers); clusterDao.save(cluster); + txn.commit(); return Status.STATUS_SUCCESS; } catch(Exception e) { txn.rollback(); diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java index 90692634..8afc23a1 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java @@ -38,10 +38,6 @@ import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.response.GenericResponse; import com.gluster.storage.management.core.response.ServerListResponse; import com.gluster.storage.management.core.response.StringListResponse; -import com.gluster.storage.management.server.data.ClusterInfo; -import com.gluster.storage.management.server.data.PersistenceDao; -import com.gluster.storage.management.server.utils.ServerUtil; -import com.sun.jersey.api.core.InjectParam; import com.sun.jersey.spi.resource.Singleton; @Component @@ -53,7 +49,6 @@ public class DiscoveredServersResource extends AbstractServersResource { public List<String> getDiscoveredServerNames() { return discoveredServerNames; } - @GET @Produces(MediaType.TEXT_XML) diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java index 2650b226..20152691 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java @@ -275,6 +275,7 @@ public class GlusterServersResource extends AbstractServersResource { for(ServerInfo server : servers) { if(server.getName().equals(serverName)) { servers.remove(server); + clusterDao.delete(server); break; } } @@ -302,32 +303,57 @@ public class GlusterServersResource extends AbstractServersResource { @Path("{" + PATH_PARAM_SERVER_NAME + "}") public Status removeServer(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, @PathParam(PATH_PARAM_SERVER_NAME) String serverName) { - GlusterServer onlineServer = getOnlineServer(clusterName); - if(onlineServer == null) { - return new Status(Status.STATUS_CODE_FAILURE, - "No online server found in cluster [" + clusterName + "]"); + ClusterInfo cluster = getCluster(clusterName); + if(cluster == null) { + return new Status(Status.STATUS_CODE_FAILURE, "Cluster [" + clusterName + "] doesn't exist!"); } - - Status status; - try { - return glusterUtil.removeServer(onlineServer.getName(), serverName); - } catch(ConnectionException e) { - onlineServer = getNewOnlineServer(clusterName); - if(onlineServer == null) { - return new Status(Status.STATUS_CODE_FAILURE, - "No online server found in cluster [" + clusterName + "]"); - } - status = glusterUtil.removeServer(onlineServer.getName(), serverName); + + List<ServerInfo> servers = cluster.getServers(); + if(servers == null || servers.isEmpty()) { + return new Status(Status.STATUS_CODE_FAILURE, "Server [" + serverName + "] is not attached to cluster [" + + clusterName + "]!"); } - if (status.isSuccess()) { + Status status = Status.STATUS_SUCCESS; + if(servers.size() == 1) { + // Only one server mapped to the cluster, no "peer detach" required. + // remove the cached online server for this cluster if present + clusterServerCache.remove(clusterName); + } else { + GlusterServer onlineServer = getOnlineServer(clusterName); + + if (onlineServer == null) { + return new Status(Status.STATUS_CODE_FAILURE, "No online server found in cluster [" + clusterName + "]"); + } + try { - removeServerFromCluster(clusterName, serverName); - } catch (Exception e) { - return new Status(Status.STATUS_CODE_PART_SUCCESS, e.getMessage()); + return glusterUtil.removeServer(onlineServer.getName(), serverName); + } catch (ConnectionException e) { + // online server has gone offline! try with a different one. + onlineServer = getNewOnlineServer(clusterName); + if (onlineServer == null) { + return new Status(Status.STATUS_CODE_FAILURE, "No online server found in cluster [" + clusterName + + "]"); + } + status = glusterUtil.removeServer(onlineServer.getName(), serverName); + if(!status.isSuccess()) { + return status; + } + } + + if(onlineServer.getName().equals(serverName)) { + // since the cached server has been removed from the cluster, remove it from the cache + clusterServerCache.remove(clusterName); } } + + try { + removeServerFromCluster(clusterName, serverName); + } catch (Exception e) { + return new Status(Status.STATUS_CODE_PART_SUCCESS, e.getMessage()); + } + return status; } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/ServerDiscoveryTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/ServerDiscoveryTask.java index 480b9bb4..7e992dc8 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/ServerDiscoveryTask.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/ServerDiscoveryTask.java @@ -21,7 +21,6 @@ package com.gluster.storage.management.server.tasks; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; @@ -29,6 +28,8 @@ import org.springframework.stereotype.Component; import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.utils.ProcessResult; +import com.gluster.storage.management.server.data.ClusterInfo; +import com.gluster.storage.management.server.data.PersistenceDao; import com.gluster.storage.management.server.resources.DiscoveredServersResource; import com.gluster.storage.management.server.utils.ServerUtil; import com.sun.jersey.spi.resource.Singleton; @@ -51,18 +52,26 @@ public class ServerDiscoveryTask { @Autowired private String environment; + + @Autowired + private PersistenceDao<ClusterInfo> clusterDao; public void discoverServers() { List<String> serverNameList = new ArrayList<String>(); ProcessResult result = serverUtil.executeGlusterScript(true, environment + SCRIPT_NAME_SFX, new ArrayList<String>()); if(result.isSuccess()) { + List<String> existingServers = clusterDao.findBySQL("select name from server_info"); String serverNames = result.getOutput(); String[] parts = serverNames.split(CoreConstants.NEWLINE); - serverNameList = Arrays.asList(parts); - } else { - // TODO: User logger to log the message - System.err.println("Server Discovery Script failed: " + result); + for(String serverName : parts) { + // The server discovery mechanism will return every server that has not been "peer probed". However we + // need to filter out those servers that are the "first" server of a new cluster, and hence are still + // not peer probed. + if(!existingServers.contains(serverName)) { + serverNameList.add(serverName); + } + } } discoveredServersResource.setDiscoveredServerNames(serverNameList); |
