From 1c1911f078b81662590a68e15f1d916534e7524e Mon Sep 17 00:00:00 2001 From: Dhandapani Date: Fri, 1 Jul 2011 16:36:04 +0530 Subject: Volume Rebalance functionality enhancement --- .../storage/management/client/VolumesClient.java | 6 -- .../server/resources/GlusterServersResource.java | 15 ++--- .../server/resources/VolumesResource.java | 2 +- .../server/tasks/InitializeDiskTask.java | 45 +++++++++++--- .../server/tasks/RebalanceVolumeTask.java | 70 ++++++++++------------ .../storage/management/server/tasks/Task.java | 5 +- .../management/server/utils/GlusterUtil.java | 39 ++++++++++++ 7 files changed, 117 insertions(+), 65 deletions(-) (limited to 'src') diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java index b5d2711a..2866a8e1 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java @@ -241,12 +241,6 @@ public class VolumesClient extends AbstractClient { putRequest(volumeName, form); } - public void rebalanceStatus(String volumeName) { - Form form = new Form(); - form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.TASK_REBALANCE_STATUS); - putRequest(volumeName, form); - } - public void rebalanceStop(String volumeName) { Form form = new Form(); form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.TASK_REBALANCE_STOP); 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 a9ef7fbb..e3bfe158 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 @@ -414,15 +414,12 @@ public class GlusterServersResource extends AbstractServersResource { return badRequestResponse("Disk name must not be empty!"); } - InitializeDiskTask initializeTask = new InitializeDiskTask(clusterService, clusterName, diskName, serverName); - try { - initializeTask.start(); - taskResource.addTask(initializeTask); - return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS + "/" + clusterName + "/" + RESOURCE_TASKS - + "/" + initializeTask.getId()); - } catch (ConnectionException e) { - return errorResponse(e.getMessage()); - } + InitializeDiskTask initializeTask = new InitializeDiskTask(clusterService, clusterName, serverName, diskName); + initializeTask.start(); + taskResource.addTask(initializeTask); + + return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS + "/" + clusterName + "/" + RESOURCE_TASKS + "/" + + initializeTask.getId()); } private void setGlusterUtil(GlusterUtil glusterUtil) { diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java index d568d519..4318945c 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java @@ -978,7 +978,7 @@ public class VolumesResource extends AbstractResource { return rebalanceStart(clusterName, volumeName, layout); } - public String rebalanceStart(String clusterName, String volumeName, String layout) { + private String rebalanceStart(String clusterName, String volumeName, String layout) { RebalanceVolumeTask rebalanceTask = new RebalanceVolumeTask(clusterService, clusterName, volumeName); rebalanceTask.setLayout(layout); rebalanceTask.start(); diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java index 5f3f8e30..40d7877e 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java @@ -20,21 +20,26 @@ */ package com.gluster.storage.management.server.tasks; +import com.gluster.storage.management.core.exceptions.ConnectionException; +import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.model.TaskInfo.TASK_TYPE; import com.gluster.storage.management.core.model.TaskStatus; +import com.gluster.storage.management.core.utils.ProcessResult; import com.gluster.storage.management.server.services.ClusterService; +import com.gluster.storage.management.server.utils.GlusterUtil; import com.gluster.storage.management.server.utils.SshUtil; +import com.sun.jersey.core.util.Base64; public class InitializeDiskTask extends Task { private static final String INITIALIZE_DISK_SCRIPT = "initialize_disk.py"; - private static final String INITIALIZE_DISK_STATUS_SCRIPT = "initialize_disk_status.py"; private String serverName; private String diskName; private SshUtil sshUtil = new SshUtil(); + private GlusterUtil glusterUtil; public InitializeDiskTask(ClusterService clusterService, String clusterName, String serverName, String diskName) { super(clusterService, clusterName, TASK_TYPE.DISK_FORMAT, diskName, "Initialize disk " + serverName + ":" @@ -50,7 +55,7 @@ public class InitializeDiskTask extends Task { @Override public String getId() { - return taskInfo.getType() + "-" + serverName + ":" + diskName; + return new String(Base64.encode(taskInfo.getType() + "-" + serverName + ":" + diskName)); } @Override @@ -85,17 +90,41 @@ public class InitializeDiskTask extends Task { @Override public void start() { - getTaskInfo().setStatus( - new TaskStatus(new Status(sshUtil.executeRemote(getServerName(), INITIALIZE_DISK_SCRIPT + " " - + getDiskName())))); + try { + startInitializeDisk(getOnlineServer().getName()); + } catch(ConnectionException e) { + // online server might have gone offline. try with a new one + startInitializeDisk(getNewOnlineServer().getName()); + } + } + + private void startInitializeDisk(String serverName) { + ProcessResult processResult = sshUtil.executeRemote(serverName, INITIALIZE_DISK_SCRIPT + " " + getDiskName()); + if (processResult.isSuccess()) { + // TODO: Message needs to change according to the script return + if (processResult.getOutput().trim().matches(".*has been successful$")) { + getTaskInfo().setStatus( + new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, processResult.getOutput()))); + return; + } + } + + // if we reach here, it means Initialize disk start failed. + throw new GlusterRuntimeException(processResult.toString()); + } @Override public TaskStatus checkStatus() { - return new TaskStatus(new Status(sshUtil.executeRemote(getServerName(), INITIALIZE_DISK_STATUS_SCRIPT + " " - + getDiskName()))); + + try { + return glusterUtil.checkInitializeDiskStatus(getOnlineServer().getName(), getDiskName()); + } catch(ConnectionException e) { + // online server might have gone offline. try with a new one + return glusterUtil.checkInitializeDiskStatus(getNewOnlineServer().getName(), getDiskName()); + } } - + public void setDiskName(String diskName) { this.diskName = diskName; } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/RebalanceVolumeTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/RebalanceVolumeTask.java index 7f9fb6bf..33655b3f 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/RebalanceVolumeTask.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/RebalanceVolumeTask.java @@ -28,33 +28,40 @@ import com.gluster.storage.management.core.model.TaskInfo.TASK_TYPE; import com.gluster.storage.management.core.model.TaskStatus; import com.gluster.storage.management.core.utils.ProcessResult; import com.gluster.storage.management.server.services.ClusterService; +import com.gluster.storage.management.server.utils.GlusterUtil; import com.gluster.storage.management.server.utils.SshUtil; +import com.sun.jersey.core.util.Base64; public class RebalanceVolumeTask extends Task { private String layout; + private String serverName; private SshUtil sshUtil = new SshUtil(); + private GlusterUtil glusterUtil = new GlusterUtil(); public RebalanceVolumeTask(ClusterService clusterService, String clusterName, TaskInfo taskInfo) { super(clusterService, clusterName, taskInfo); } public RebalanceVolumeTask(ClusterService clusterService, String clusterName, String volumeName) { - super(clusterService, clusterName, TASK_TYPE.VOLUME_REBALANCE, volumeName, "Volume rebalance running on " + volumeName, false, true, false); + super(clusterService, clusterName, TASK_TYPE.VOLUME_REBALANCE, volumeName, "Volume rebalance running on " + + volumeName, false, true, false); } @Override public String getId() { - return taskInfo.getType() + "-" + taskInfo.getReference(); + return new String(Base64.encode(taskInfo.getType() + "-" + taskInfo.getReference())); } @Override public void start() { try { - startRebalance(getOnlineServer().getName()); + serverName = getOnlineServer().getName(); + startRebalance(serverName); } catch(ConnectionException e) { // online server might have gone offline. try with a new one - startRebalance(getNewOnlineServer().getName()); + serverName = getNewOnlineServer().getName(); + startRebalance(serverName); } } @@ -63,7 +70,9 @@ public class RebalanceVolumeTask extends Task { ProcessResult processResult = sshUtil.executeRemote(serverName, command); if (processResult.isSuccess()) { if (processResult.getOutput().trim().matches(".*has been successful$")) { - getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, processResult.getOutput()))); + getTaskInfo().setStatus( + new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, processResult.getOutput()))); + return; } } @@ -74,34 +83,34 @@ public class RebalanceVolumeTask extends Task { @Override public void resume() { getTaskInfo().setStatus( - new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, "Pause/Resume is not supported in Volume Rebalance"))); + new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, + "Pause/Resume is not supported in Volume Rebalance"))); } @Override public void stop() { try { - stopRebalance(getOnlineServer().getName()); - } catch(ConnectionException e) { - // online server might have gone offline. try with a new one - stopRebalance(getNewOnlineServer().getName()); + stopRebalance(serverName); + } catch (ConnectionException e) { + // online server might have gone offline. update the failure status + getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, e.getMessage()))); } } private void stopRebalance(String serverName) { String command = "gluster volume rebalance " + getTaskInfo().getReference() + " stop"; ProcessResult processResult = sshUtil.executeRemote(serverName, command); - TaskStatus taskStatus = new TaskStatus(); + if (processResult.isSuccess()) { if (processResult.getOutput().trim().matches(".*has been successful$")) { - taskStatus.setCode(Status.STATUS_CODE_SUCCESS); - } else { - taskStatus.setCode(Status.STATUS_CODE_FAILURE); + getTaskInfo().setStatus( + new TaskStatus(new Status(Status.STATUS_CODE_SUCCESS, processResult.getOutput()))); + return; } - } else { - taskStatus.setCode(Status.STATUS_CODE_FAILURE); } - taskStatus.setMessage(processResult.getOutput()); // Common - getTaskInfo().setStatus(taskStatus); + + // if we reach here, it means rebalance stop failed. + throw new GlusterRuntimeException(processResult.toString()); } @Override @@ -113,31 +122,14 @@ public class RebalanceVolumeTask extends Task { @Override public TaskStatus checkStatus() { try { - return checkRebalanceStatus(getOnlineServer().getName()); + return glusterUtil.checkRebalanceStatus(serverName, getTaskInfo().getReference()); } catch(ConnectionException e) { - // online server might have gone offline. try with a new one. - return checkRebalanceStatus(getNewOnlineServer().getName()); + // online server might have gone offline. update the failure status + getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, e.getMessage()))); + return getTaskInfo().getStatus(); } } - // TODO: This method should move to glusterUtil - private TaskStatus checkRebalanceStatus(String serverName) { - String command = "gluster volume rebalance " + getTaskInfo().getReference() + " status"; - ProcessResult processResult = sshUtil.executeRemote(serverName, command); - TaskStatus taskStatus = new TaskStatus(); - if (processResult.isSuccess()) { - if (processResult.getOutput().trim().matches(".*rebalance completed$")) { - taskStatus.setCode(Status.STATUS_CODE_SUCCESS); - } else { - taskStatus.setCode(Status.STATUS_CODE_RUNNING); - } - } else { - taskStatus.setCode(Status.STATUS_CODE_FAILURE); - } - taskStatus.setMessage(processResult.getOutput()); // Common - return taskStatus; - } - public void setLayout(String layout) { this.layout = layout; } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/Task.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/Task.java index 49cd0b8b..c16c039a 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/Task.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/Task.java @@ -33,7 +33,8 @@ public abstract class Task { protected String clusterName; private ClusterService clusterService; - public Task(ClusterService clusterService, String clusterName, TASK_TYPE type, String reference, String desc, boolean canPause, boolean canStop, boolean canCommit) { + public Task(ClusterService clusterService, String clusterName, TASK_TYPE type, String reference, String desc, + boolean canPause, boolean canStop, boolean canCommit) { TaskInfo taskInfo = new TaskInfo(); taskInfo.setType(type); taskInfo.setReference(reference); @@ -41,7 +42,7 @@ public abstract class Task { taskInfo.setCanPause(canPause); taskInfo.setCanStop(canStop); taskInfo.setCanCommit(canCommit); - + init(clusterService, clusterName, taskInfo); } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java index 788e3eab..a09c7956 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java @@ -37,6 +37,7 @@ import com.gluster.storage.management.core.model.GlusterServer; import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.TaskInfo; +import com.gluster.storage.management.core.model.TaskStatus; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.model.Volume.TRANSPORT_TYPE; import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS; @@ -71,6 +72,8 @@ public class GlusterUtil { private static final String VOLUME_TYPE_REPLICATE = "Replicate"; private static final GlusterCoreUtil glusterCoreUtil = new GlusterCoreUtil(); + + private static final String INITIALIZE_DISK_STATUS_SCRIPT = "initialize_disk_status.py"; @Autowired private SshUtil sshUtil; @@ -550,6 +553,42 @@ public class GlusterUtil { throw new GlusterRuntimeException("Couldn't remove server [" + serverName + "]! Error: " + result); } } + + public TaskStatus checkRebalanceStatus(String serverName, String volumeName) { + String command = "gluster volume rebalance " + volumeName + " status"; + ProcessResult processResult = sshUtil.executeRemote(serverName, command); + TaskStatus taskStatus = new TaskStatus(); + if (processResult.isSuccess()) { + if (processResult.getOutput().trim().matches("^rebalance completed.*")) { + taskStatus.setCode(Status.STATUS_CODE_SUCCESS); + } else if(processResult.getOutput().trim().matches(".*in progress:.*")) { + taskStatus.setCode(Status.STATUS_CODE_RUNNING); + } else { + taskStatus.setCode(Status.STATUS_CODE_FAILURE); + } + } else { + taskStatus.setCode(Status.STATUS_CODE_FAILURE); + } + taskStatus.setMessage(processResult.getOutput()); // Common + return taskStatus; + } + + public TaskStatus checkInitializeDiskStatus(String serverName, String diskName) { + ProcessResult processResult = sshUtil.executeRemote(serverName, INITIALIZE_DISK_STATUS_SCRIPT + " " + diskName); + TaskStatus taskStatus = new TaskStatus(); + if (processResult.isSuccess()) { + // TODO: Message needs to change according to the script return + if (processResult.getOutput().trim().matches(".*Initailize completed$")) { + taskStatus.setCode(Status.STATUS_CODE_SUCCESS); + } else { + taskStatus.setCode(Status.STATUS_CODE_RUNNING); + } + } else { + taskStatus.setCode(Status.STATUS_CODE_FAILURE); + } + taskStatus.setMessage(processResult.getOutput()); + return taskStatus; + } public static void main(String args[]) { // List names = new GlusterUtil().getGlusterServerNames(); -- cgit From 5cb94f565f49b2a952d941df18507049364a1b6d Mon Sep 17 00:00:00 2001 From: Shireesh Anjal Date: Fri, 1 Jul 2011 20:29:40 +0530 Subject: Task#111 - Auto-refresh of data in views --- .../management/client/GlusterDataModelManager.java | 76 +++++++++++++--------- .../management/core/utils/GlusterCoreUtil.java | 13 ++-- .../management/gui/actions/AddServerAction.java | 1 - .../management/gui/actions/RefreshDataAction.java | 5 +- .../storage/management/server/utils/SshUtil.java | 33 +++++----- 5 files changed, 73 insertions(+), 55 deletions(-) (limited to 'src') 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 be7a9023..f3feb1cb 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 @@ -105,45 +105,50 @@ public class GlusterDataModelManager { return model; } - public void updateModel(GlusterDataModel model) { + public void refreshModel() { + updateModel(fetchData(clusterName)); + } + + private void updateModel(GlusterDataModel model) { updateVolumes(model); + updateServers(model); + // TODO: Update other entities like discovered servers } - private void updateVolumes(GlusterDataModel model) { - List currentVolumes = this.model.getCluster().getVolumes(); - List latestVolumes = model.getCluster().getVolumes(); + private void updateServers(GlusterDataModel newModel) { + List oldServers = model.getCluster().getServers(); + List newServers = newModel.getCluster().getServers(); - List addedVolumes = getAddedVolumes(currentVolumes, latestVolumes); - for(ClusterListener listener : listeners) { - for(Volume addedVolume : addedVolumes) { - listener.volumeAdded(addedVolume); - } + List addedServers = GlusterCoreUtil.getAddedEntities(oldServers, newServers, true); + for (GlusterServer addedServer : addedServers) { + addGlusterServer(addedServer); } - - List removedVolumes = getRemovedVolumes(currentVolumes, latestVolumes); - for(ClusterListener listener : listeners) { - for(Volume removedVolume : addedVolumes) { - listener.volumeRemoved(removedVolume); - } + + List removedServers = GlusterCoreUtil.getAddedEntities(newServers, oldServers, true); + for (GlusterServer removedServer : removedServers) { + removeGlusterServer(removedServer); } - } - - private List getRemovedVolumes(List currentVolumes, List latestVolumes) { - // TODO Auto-generated method stub - return null; + + // TODO: Refresh "modified" servers } - private List getAddedVolumes(List currentVolumes, List newVolumes) { - List addedVolumes = new ArrayList(); - for(Volume newVolume : addedVolumes) { - if(!GlusterCoreUtil.containsEntity(currentVolumes, newVolume, false)) { - // current volume list doesn't contain this volume. mark it. - addedVolumes.add(newVolume); - } + private void updateVolumes(GlusterDataModel newModel) { + List oldVolumes = model.getCluster().getVolumes(); + List newVolumes = newModel.getCluster().getVolumes(); + + List addedVolumes = GlusterCoreUtil.getAddedEntities(oldVolumes, newVolumes, false); + for (Volume addedVolume : addedVolumes) { + addVolume(addedVolume); } - return addedVolumes; + + List removedVolumes = GlusterCoreUtil.getAddedEntities(newVolumes, oldVolumes, false); + for (Volume removedVolume : removedVolumes) { + deleteVolume(removedVolume); + } + + // TODO: Refresh "modified" volumes } - + private void initializeGlusterServers(Cluster cluster) { cluster.setServers(new GlusterServersClient().getServers()); } @@ -323,6 +328,8 @@ public class GlusterDataModelManager { for (ClusterListener listener : listeners) { listener.serverAdded(server); } + + removeDiscoveredServer(server.getName()); } public void addDiscoveredServer(Server server) { @@ -333,6 +340,17 @@ public class GlusterDataModelManager { listener.discoveredServerAdded(server);; } } + + public void removeDiscoveredServer(String serverName) { + Cluster cluster = model.getCluster(); + // TODO: Move auto-discovered servers outside the cluster + for(Server server : cluster.getAutoDiscoveredServers()) { + if(server.getName().toUpperCase().equals(serverName.toUpperCase())) { + removeDiscoveredServer(server); + break; + } + } + } public void removeDiscoveredServer(Server server) { Cluster cluster = model.getCluster(); diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterCoreUtil.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterCoreUtil.java index 20b652f4..76a7fbfc 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterCoreUtil.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterCoreUtil.java @@ -53,12 +53,13 @@ public class GlusterCoreUtil { * * @param oldEntities * @param newEntities + * @param caseInsensitive If true, the entity name comparison will be done in case insensitive manner * @return List of entities that are present only in the second argument newEntities */ - public static List getAddedEntities(List oldEntities, List newEntities) { - List addedEntities = new ArrayList(); - for(Entity newEntity : newEntities) { - if(!containsEntity(oldEntities, newEntity, false)) { + public static List getAddedEntities(List oldEntities, List newEntities, boolean caseInsensitive) { + List addedEntities = new ArrayList(); + for(T newEntity : newEntities) { + if(!containsEntity(oldEntities, newEntity, caseInsensitive)) { // old entity list doesn't contain this entity. mark it as new. addedEntities.add(newEntity); } @@ -66,13 +67,13 @@ public class GlusterCoreUtil { return addedEntities; } - public static boolean containsEntity(List entityList, Entity searchEntity, boolean caseInsensitive) { + public static boolean containsEntity(List entityList, Entity searchEntity, boolean caseInsensitive) { String searchEntityName = searchEntity.getName(); if(caseInsensitive) { searchEntityName = searchEntityName.toUpperCase(); } - for(Entity entity : entityList) { + for(T entity : entityList) { String nextEntityName = entity.getName(); if(caseInsensitive) { nextEntityName = nextEntityName.toUpperCase(); diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java index 4d1a87c9..18731632 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java @@ -55,7 +55,6 @@ public class AddServerAction extends AbstractActionDelegate { try { glusterServersClient.addServer(server); - modelManager.removeDiscoveredServer(server); modelManager.addGlusterServer(glusterServersClient.getGlusterServer(server.getName())); successServers.add(server); } catch(Exception e) { diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RefreshDataAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RefreshDataAction.java index 4a569c50..fe358caa 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RefreshDataAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RefreshDataAction.java @@ -20,6 +20,8 @@ package com.gluster.storage.management.gui.actions; import org.eclipse.jface.action.IAction; +import com.gluster.storage.management.client.GlusterDataModelManager; + /** * */ @@ -39,7 +41,6 @@ public class RefreshDataAction extends AbstractActionDelegate { */ @Override protected void performAction(IAction action) { - // TODO Auto-generated method stub - + GlusterDataModelManager.getInstance().refreshModel(); } } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/SshUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/SshUtil.java index d56cd47c..4f0b04cf 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/SshUtil.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/SshUtil.java @@ -226,6 +226,10 @@ public class SshUtil { return conn; } + private boolean wasTerminated(int condition) { + return ((condition | ChannelCondition.EXIT_SIGNAL) == condition); + } + private boolean hasErrors(int condition, Session session) { return (hasErrorStream(condition) || (exitedGracefully(condition) && exitedWithError(session))); } @@ -239,7 +243,7 @@ public class SshUtil { } private boolean exitedGracefully(int condition) { - return (condition == ChannelCondition.EXIT_STATUS); + return (condition | ChannelCondition.EXIT_STATUS) == condition; } private boolean hasErrorStream(int condition) { @@ -292,24 +296,19 @@ public class SshUtil { private ProcessResult prepareProcessResult(Session session, int condition, String output) { ProcessResult result = null; - switch(condition) { - case ChannelCondition.TIMEOUT: - result = new ProcessResult(ProcessResult.FAILURE, "Command timed out!"); - break; - case ChannelCondition.EXIT_SIGNAL: - // terminated + + if (wasTerminated(condition)) { result = new ProcessResult(ProcessResult.FAILURE, output); - break; - default: - if (hasErrors(condition, session)) { - Integer exitStatus = session.getExitStatus(); - int statusCode = (exitStatus == null ? ProcessResult.FAILURE : exitStatus); - result = new ProcessResult(statusCode, output); - } else { - result = new ProcessResult(ProcessResult.SUCCESS, output); - } - break; + } else if (timedOut(condition)) { + result = new ProcessResult(ProcessResult.FAILURE, "Command timed out!"); + } else if (hasErrors(condition, session)) { + Integer exitStatus = session.getExitStatus(); + int statusCode = (exitStatus == null ? ProcessResult.FAILURE : exitStatus); + result = new ProcessResult(statusCode, output); + } else { + result = new ProcessResult(ProcessResult.SUCCESS, output); } + return result; } -- cgit From 0b60788162f3920df3b62f39088334f0ce90ee41 Mon Sep 17 00:00:00 2001 From: Dhandapani Date: Fri, 1 Jul 2011 16:36:04 +0530 Subject: Volume Rebalance functionality enhancement --- .../server/resources/GlusterServersResource.java | 12 ++++--- .../server/tasks/InitializeDiskTask.java | 37 ++++++++++++---------- .../server/tasks/RebalanceVolumeTask.java | 36 ++++++--------------- .../management/server/utils/GlusterUtil.java | 12 +++++++ 4 files changed, 49 insertions(+), 48 deletions(-) (limited to 'src') 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 e3bfe158..1f4b15de 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 @@ -415,11 +415,15 @@ public class GlusterServersResource extends AbstractServersResource { } InitializeDiskTask initializeTask = new InitializeDiskTask(clusterService, clusterName, serverName, diskName); - initializeTask.start(); - taskResource.addTask(initializeTask); + try { + initializeTask.start(); + taskResource.addTask(initializeTask); - return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS + "/" + clusterName + "/" + RESOURCE_TASKS + "/" - + initializeTask.getId()); + return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS + "/" + clusterName + "/" + RESOURCE_TASKS + "/" + + initializeTask.getId()); + } catch (Exception e) { + return errorResponse(e.getMessage()); + } } private void setGlusterUtil(GlusterUtil glusterUtil) { diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java index 40d7877e..4592b759 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java @@ -55,22 +55,29 @@ public class InitializeDiskTask extends Task { @Override public String getId() { - return new String(Base64.encode(taskInfo.getType() + "-" + serverName + ":" + diskName)); + return new String( + Base64.encode(getClusterName() + "-" + taskInfo.getType() + "-" + serverName + ":" + diskName)); } @Override public void resume() { - getTaskInfo().setStatus( new TaskStatus( new Status(Status.STATUS_CODE_FAILURE, "Can not resume disk initialization"))); + getTaskInfo().setStatus( + new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, + "Stop/Pause/Resume is not supported in Disk Initialization"))); } @Override public void stop() { - getTaskInfo().setStatus( new TaskStatus( new Status(Status.STATUS_CODE_FAILURE, "Can not stop disk initialization"))); + getTaskInfo().setStatus( + new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, + "Stop/Pause/Resume is not supported in Disk Initialization"))); } @Override public void pause() { - getTaskInfo().setStatus( new TaskStatus( new Status(Status.STATUS_CODE_FAILURE, "Can not suspend disk initialization"))); + getTaskInfo().setStatus( + new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, + "Stop/Pause/Resume is not supported in Disk Initialization"))); } @Override @@ -91,24 +98,20 @@ public class InitializeDiskTask extends Task { @Override public void start() { try { - startInitializeDisk(getOnlineServer().getName()); + startInitializeDisk(serverName); } catch(ConnectionException e) { - // online server might have gone offline. try with a new one - startInitializeDisk(getNewOnlineServer().getName()); + // online server might have gone offline. update the failure status + getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, e.getMessage()))); } } private void startInitializeDisk(String serverName) { ProcessResult processResult = sshUtil.executeRemote(serverName, INITIALIZE_DISK_SCRIPT + " " + getDiskName()); if (processResult.isSuccess()) { - // TODO: Message needs to change according to the script return - if (processResult.getOutput().trim().matches(".*has been successful$")) { - getTaskInfo().setStatus( - new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, processResult.getOutput()))); - return; - } + getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, processResult.getOutput()))); + return; } - + // if we reach here, it means Initialize disk start failed. throw new GlusterRuntimeException(processResult.toString()); @@ -118,10 +121,10 @@ public class InitializeDiskTask extends Task { public TaskStatus checkStatus() { try { - return glusterUtil.checkInitializeDiskStatus(getOnlineServer().getName(), getDiskName()); + return glusterUtil.checkInitializeDiskStatus(serverName, getDiskName()); } catch(ConnectionException e) { - // online server might have gone offline. try with a new one - return glusterUtil.checkInitializeDiskStatus(getNewOnlineServer().getName(), getDiskName()); + // online server might have gone offline. update the failure status + return new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, e.getMessage())); } } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/RebalanceVolumeTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/RebalanceVolumeTask.java index 33655b3f..f94613e0 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/RebalanceVolumeTask.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/RebalanceVolumeTask.java @@ -44,13 +44,13 @@ public class RebalanceVolumeTask extends Task { } public RebalanceVolumeTask(ClusterService clusterService, String clusterName, String volumeName) { - super(clusterService, clusterName, TASK_TYPE.VOLUME_REBALANCE, volumeName, "Volume rebalance running on " - + volumeName, false, true, false); + super(clusterService, clusterName, TASK_TYPE.VOLUME_REBALANCE, volumeName, "Volume " + volumeName + + " Rebalance", false, true, false); } @Override public String getId() { - return new String(Base64.encode(taskInfo.getType() + "-" + taskInfo.getReference())); + return new String(Base64.encode(getClusterName() + "-" + taskInfo.getType() + "-" + taskInfo.getReference())); } @Override @@ -69,13 +69,10 @@ public class RebalanceVolumeTask extends Task { String command = "gluster volume rebalance " + getTaskInfo().getReference() + " " + getLayout() + " start"; ProcessResult processResult = sshUtil.executeRemote(serverName, command); if (processResult.isSuccess()) { - if (processResult.getOutput().trim().matches(".*has been successful$")) { - getTaskInfo().setStatus( - new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, processResult.getOutput()))); - return; - } + getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, processResult.getOutput()))); + return; } - + // if we reach here, it means rebalance start failed. throw new GlusterRuntimeException(processResult.toString()); } @@ -90,33 +87,18 @@ public class RebalanceVolumeTask extends Task { @Override public void stop() { try { - stopRebalance(serverName); + glusterUtil.stopRebalance(serverName, getTaskInfo().getReference()); } catch (ConnectionException e) { // online server might have gone offline. update the failure status getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, e.getMessage()))); } } - private void stopRebalance(String serverName) { - String command = "gluster volume rebalance " + getTaskInfo().getReference() + " stop"; - ProcessResult processResult = sshUtil.executeRemote(serverName, command); - - if (processResult.isSuccess()) { - if (processResult.getOutput().trim().matches(".*has been successful$")) { - getTaskInfo().setStatus( - new TaskStatus(new Status(Status.STATUS_CODE_SUCCESS, processResult.getOutput()))); - return; - } - } - - // if we reach here, it means rebalance stop failed. - throw new GlusterRuntimeException(processResult.toString()); - } - @Override public void pause() { getTaskInfo().setStatus( - new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, "Pause/Resume is not supported in Volume Rebalance"))); + new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, + "Pause/Resume is not supported in Volume Rebalance"))); } @Override diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java index a09c7956..1dc5eb1a 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java @@ -573,6 +573,16 @@ public class GlusterUtil { return taskStatus; } + public void stopRebalance(String serverName, String volumeName) { + String command = "gluster volume rebalance " + volumeName + " stop"; + ProcessResult processResult = sshUtil.executeRemote(serverName, command); + TaskStatus taskStatus = new TaskStatus(); + if (processResult.isSuccess()) { + taskStatus.setCode(Status.STATUS_CODE_SUCCESS); + taskStatus.setMessage(processResult.getOutput()); + } + } + public TaskStatus checkInitializeDiskStatus(String serverName, String diskName) { ProcessResult processResult = sshUtil.executeRemote(serverName, INITIALIZE_DISK_STATUS_SCRIPT + " " + diskName); TaskStatus taskStatus = new TaskStatus(); @@ -581,7 +591,9 @@ public class GlusterUtil { if (processResult.getOutput().trim().matches(".*Initailize completed$")) { taskStatus.setCode(Status.STATUS_CODE_SUCCESS); } else { + // TODO: Percentage completed needs to be set, according to the script output taskStatus.setCode(Status.STATUS_CODE_RUNNING); + // taskStatus.setPercentCompleted(processResult.getOutput()); } } else { taskStatus.setCode(Status.STATUS_CODE_FAILURE); -- cgit