diff options
| author | Dhandapani <dhandapani@gluster.com> | 2011-06-27 16:21:16 +0530 |
|---|---|---|
| committer | Dhandapani <dhandapani@gluster.com> | 2011-06-28 12:47:35 +0530 |
| commit | eb58d91bb775a897c39ac7303993b361b48f35a9 (patch) | |
| tree | 0ec8d05d3d2ec59f32ad3c555f63b7afb70c0dd9 /src | |
| parent | c741ee60d0c6ca99a794d4e1fcd5b3911aa9df67 (diff) | |
Story #1: Rebalance Volume
Diffstat (limited to 'src')
6 files changed, 169 insertions, 48 deletions
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 338caf89..4ec3ff13 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 @@ -230,7 +230,7 @@ public class VolumesClient extends AbstractClient { putRequest(volumeName + "/" + RESTConstants.RESOURCE_BRICKS, form); } - public void rebalanceVolume(String volumeName, boolean fixLayout, boolean migrateData, boolean forcedDataMigrate) { + public void rebalanceStart(String volumeName, Boolean fixLayout, Boolean migrateData, Boolean forcedDataMigrate) { Form form = new Form(); form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.TASK_REBALANCE_START); form.add(RESTConstants.FORM_PARAM_FIX_LAYOUT, fixLayout); @@ -238,6 +238,18 @@ public class VolumesClient extends AbstractClient { form.add(RESTConstants.FORM_PARAM_FORCED_DATA_MIGRATE, forcedDataMigrate); 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); + putRequest(volumeName, form); + } public static void main(String[] args) { UsersClient usersClient = new UsersClient(); diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java index abc2d852..527ae2a1 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java @@ -49,6 +49,8 @@ public class RESTConstants { public static final String TASK_STATUS = "status"; public static final String TASK_DELETE = "delete"; public static final String TASK_REBALANCE_START = "rebalanceStart"; + public static final String TASK_REBALANCE_STATUS = "rebalanceStatus"; + public static final String TASK_REBALANCE_STOP = "rebalanceStop"; public static final String FORM_PARAM_VOLUME_NAME = "name"; public static final String FORM_PARAM_VOLUME_TYPE = "volumeType"; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RebalanceVolumeAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RebalanceVolumeAction.java index 9b55e70a..33ca0e5b 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RebalanceVolumeAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RebalanceVolumeAction.java @@ -37,11 +37,11 @@ public class RebalanceVolumeAction extends AbstractActionDelegate { public void run() { final String actionDesc = action.getDescription(); try { - new VolumesClient().rebalanceVolume(volume.getName(), false, false, false); + new VolumesClient().rebalanceStart(volume.getName(), false, false, false); showInfoDialog(actionDesc, "Volume [" + volume.getName() + "] rebalance started successfully!"); } catch (Exception e) { showErrorDialog(actionDesc, - "Volume rebalance cannot started on [" + volume.getName() + "]! Error: [" + e.getMessage() + "]"); + "Volume rebalance could not be started on [" + volume.getName() + "]! Error: [" + e.getMessage() + "]"); } } 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 73d3ccc8..0bb61245 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 @@ -331,7 +331,11 @@ public class VolumesResource extends AbstractResource { } if (operation.equals(RESTConstants.TASK_REBALANCE_START)) { - return rebalanceVolume(clusterName, volumeName, isFixLayout, isMigrateData, isForcedDataMigrate); + return rebalanceStart(clusterName, volumeName, isFixLayout, isMigrateData, isForcedDataMigrate); + } else if (operation.equals(RESTConstants.TASK_REBALANCE_STATUS)) { + return rebalanceStatus(clusterName, volumeName); + } else if (operation.equals(RESTConstants.TASK_REBALANCE_STOP)) { + return rebalanceStop(clusterName, volumeName); } try { @@ -946,12 +950,12 @@ public class VolumesResource extends AbstractResource { return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS, clusterName, RESOURCE_TASKS, taskId); } - private Response rebalanceVolume(String clusterName, String volumeName, Boolean isFixLayout, Boolean isMigrateData, - boolean isForcedDataMigrate) { + private Response rebalanceStart(String clusterName, String volumeName, Boolean isFixLayout, Boolean isMigrateData, + Boolean isForcedDataMigrate) { GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName); if (onlineServer == null) { - return errorResponse("No online servers found in cluster [" + clusterName + "]"); + return notFoundResponse("No online servers found in cluster [" + clusterName + "]"); } String layout = ""; @@ -965,13 +969,13 @@ public class VolumesResource extends AbstractResource { } try { - taskId = glusterUtil.rebalanceVolumeStart(volumeName, layout, onlineServer.getName()); + taskId = glusterUtil.rebalanceStart(volumeName, layout, onlineServer.getName()); } catch (ConnectionException e) { // online server has gone offline! try with a different one. onlineServer = glusterServersResource.getNewOnlineServer(clusterName); try { - taskId = glusterUtil.rebalanceVolumeStart(volumeName, layout, onlineServer.getName()); + taskId = glusterUtil.rebalanceStart(volumeName, layout, onlineServer.getName()); } catch(Exception e1) { return errorResponse(e1.getMessage()); } @@ -981,6 +985,56 @@ public class VolumesResource extends AbstractResource { return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS, clusterName, RESOURCE_TASKS, taskId); } + + private Response rebalanceStatus(String clusterName, String volumeName) { + GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName); + if (onlineServer == null) { + return notFoundResponse("No online servers found in cluster [" + clusterName + "]"); + } + + String taskId = null; + try { + taskId = glusterUtil.rebalanceStatus(volumeName, onlineServer.getName()); + } catch (ConnectionException e) { + // online server has gone offline! try with a different one. + onlineServer = glusterServersResource.getNewOnlineServer(clusterName); + + try { + taskId = glusterUtil.rebalanceStatus(volumeName, onlineServer.getName()); + } catch (Exception e1) { + return errorResponse(e1.getMessage()); + } + } catch(Exception e1) { + return errorResponse(e1.getMessage()); + } + + return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS, clusterName, RESOURCE_TASKS, taskId); + } + + private Response rebalanceStop(String clusterName, String volumeName) { + GlusterServer onlineServer = glusterServersResource.getOnlineServer(clusterName); + if (onlineServer == null) { + return notFoundResponse("No online servers found in cluster [" + clusterName + "]"); + } + + String taskId = null; + try { + taskId = glusterUtil.rebalanceStop(volumeName, onlineServer.getName()); + } catch (ConnectionException e) { + // online server has gone offline! try with a different one. + onlineServer = glusterServersResource.getNewOnlineServer(clusterName); + + try { + taskId = glusterUtil.rebalanceStop(volumeName, onlineServer.getName()); + } catch (Exception e1) { + return errorResponse(e1.getMessage()); + } + } catch(Exception e1) { + return errorResponse(e1.getMessage()); + } + + return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS, clusterName, RESOURCE_TASKS, taskId); + } public static void main(String[] args) throws ClassNotFoundException { VolumesResource vr = new VolumesResource(); 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 697a40be..720c050e 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 @@ -23,7 +23,9 @@ package com.gluster.storage.management.server.tasks; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.Task; 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.utils.SshUtil; public class RebalanceVolumeTask extends Task { @@ -36,60 +38,78 @@ public class RebalanceVolumeTask extends Task { } public RebalanceVolumeTask(String volumeName) { - super(TASK_TYPE.VOLUME_REBALANCE, volumeName); - setTaskDescription(); - getTaskInfo().setCanPause(false); - getTaskInfo().setCanStop(true); + super(TASK_TYPE.VOLUME_REBALANCE, volumeName, "Volume rebalance running on " + volumeName, false, true, false); } @Override public String getId() { - return getTaskInfo().getId(); + return taskInfo.getType() + "-" + taskInfo.getReference(); } @Override - public TaskInfo start() { - getTaskInfo().setStatus( - new TaskStatus(new Status(sshUtil.executeRemote(getOnlineServer(), "gluster volume rebalance " - + getTaskInfo().getReference() + " " + getLayout() + " start")))); - return getTaskInfo(); + public void start() { + String command = "gluster volume rebalance " + getTaskInfo().getReference() + " " + getLayout() + " start"; + 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_RUNNING); + } else { + taskStatus.setCode(Status.STATUS_CODE_FAILURE); + } + } else { + taskStatus.setCode(Status.STATUS_CODE_FAILURE); + } + taskStatus.setMessage(processResult.getOutput()); // Common + getTaskInfo().setStatus(taskStatus); } @Override - public TaskInfo resume() { + public void resume() { getTaskInfo().setStatus( - new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, "Can not suspend volume rebalance"))); - return getTaskInfo(); + new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, "Pause/Resume is not supported in Volume Rebalance"))); } @Override - public TaskInfo stop() { - getTaskInfo().setStatus( - new TaskStatus(new Status(sshUtil.executeRemote(getOnlineServer(), "gluster volume rebalance " - + getTaskInfo().getReference() + " stop")))); - return getTaskInfo(); + public void stop() { + 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); + } + } else { + taskStatus.setCode(Status.STATUS_CODE_FAILURE); + } + taskStatus.setMessage(processResult.getOutput()); // Common + getTaskInfo().setStatus(taskStatus); } @Override - public TaskInfo pause() { + public void pause() { getTaskInfo().setStatus( - new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, "Can not pause volume rebalance"))); - return getTaskInfo(); + new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, "Pause/Resume is not supported in Volume Rebalance"))); } @Override - public TaskInfo status() { - getTaskInfo().setStatus( - new TaskStatus(new Status(sshUtil.executeRemote(getOnlineServer(), "gluster volume rebalance " - + getTaskInfo().getReference() + " status")))); - return getTaskInfo(); - } - - @Override - public void setTaskDescription() { - TaskInfo taskInfo = getTaskInfo(); - getTaskInfo().setDescription("Volume rebalance running on " + taskInfo.getReference()); - + public TaskStatus checkStatus() { + String command = "gluster volume rebalance " + getTaskInfo().getReference() + " status"; + ProcessResult processResult = sshUtil.executeRemote(serverName, command); + TaskStatus taskStatus = new TaskStatus(); + if (processResult.isSuccess()) { + if (processResult.getOutput().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) { @@ -100,4 +120,8 @@ public class RebalanceVolumeTask extends Task { return layout; } + @Override + public void commit() { + // TODO Auto-generated method stub + } } 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 f75810df..767b15c3 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 @@ -36,7 +36,7 @@ import com.gluster.storage.management.core.model.Brick.BRICK_STATUS; 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.TASK_TYPE; +import com.gluster.storage.management.core.model.TaskInfo; 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; @@ -554,18 +554,47 @@ public class GlusterUtil { return migrateDiskTask.getId(); } - public String rebalanceVolumeStart(String volumeName, String layout, String knownServer) { + public String rebalanceStart(String volumeName, String layout, String knownServer) { RebalanceVolumeTask rebalanceTask = new RebalanceVolumeTask(volumeName); rebalanceTask.setOnlineServer(knownServer); rebalanceTask.setLayout(layout); + rebalanceTask.start(); + int status = rebalanceTask.getTaskInfo().getStatus().getCode(); - TaskInfo taskInfo = rebalanceTask.start(); - if(taskInfo.isSuccess()) { + if(status != Status.STATUS_CODE_FAILURE) { + TasksResource taskResource = new TasksResource(); taskResource.addTask(rebalanceTask); + } else { + throw new GlusterRuntimeException( rebalanceTask.getTaskInfo().getStatus().getMessage()); } - - return taskInfo.getId(); + return rebalanceTask.getId(); + } + + public String rebalanceStatus(String volumeName, String knownServer) { + RebalanceVolumeTask rebalanceTask = new RebalanceVolumeTask(volumeName); + rebalanceTask.setOnlineServer(knownServer); + + rebalanceTask.checkStatus(); + int status = rebalanceTask.getTaskInfo().getStatus().getCode(); + + if (status == Status.STATUS_CODE_FAILURE) { + throw new GlusterRuntimeException(rebalanceTask.getTaskInfo().getStatus().getMessage()); + } + return rebalanceTask.getId(); + } + + public String rebalanceStop(String volumeName, String knownServer) { + RebalanceVolumeTask rebalanceTask = new RebalanceVolumeTask(volumeName); + rebalanceTask.setOnlineServer(knownServer); + + rebalanceTask.stop(); + int status = rebalanceTask.getTaskInfo().getStatus().getCode(); + + if (status == Status.STATUS_CODE_FAILURE) { + throw new GlusterRuntimeException(rebalanceTask.getTaskInfo().getStatus().getMessage()); + } + return rebalanceTask.getId(); } public Status removeBricks(String volumeName, List<String> bricks, String knownServer) { |
