summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDhandapani <dhandapani@gluster.com>2011-06-27 16:21:16 +0530
committerDhandapani <dhandapani@gluster.com>2011-06-28 12:47:35 +0530
commiteb58d91bb775a897c39ac7303993b361b48f35a9 (patch)
tree0ec8d05d3d2ec59f32ad3c555f63b7afb70c0dd9 /src
parentc741ee60d0c6ca99a794d4e1fcd5b3911aa9df67 (diff)
Story #1: Rebalance Volume
Diffstat (limited to 'src')
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java14
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java2
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RebalanceVolumeAction.java4
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java66
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/RebalanceVolumeTask.java90
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java41
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) {