diff options
| author | Shireesh Anjal <anjalshireesh@gmail.com> | 2011-06-30 08:40:13 -0700 |
|---|---|---|
| committer | Shireesh Anjal <anjalshireesh@gmail.com> | 2011-06-30 08:40:13 -0700 |
| commit | d96ded5677e17b4514fe1be67e4138e79714979b (patch) | |
| tree | 0d95fb18d58bb0678cf8c8a4e48fbb7594333a3a | |
| parent | 0c36771b2b372273fed877dab8e7b79d6ee6ee4a (diff) | |
| parent | 9b2290860f9dc5b6bbbe5cfaff785d4eeb617ecd (diff) | |
Merge pull request #92 from Selvasundaram/master
Migrate task and UI updates
17 files changed, 181 insertions, 54 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 87fbed31..9705501a 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 @@ -362,14 +362,28 @@ public class GlusterDataModelManager { } } - public void updateTaskStatus(TaskInfo taskInfo, Status newStatus) { - taskInfo.getStatus().setCode(newStatus.getCode()); - taskInfo.getStatus().setMessage(newStatus.getMessage()); + public void addTask(TaskInfo taskInfo) { + Cluster cluster = model.getCluster(); + cluster.addTaskInfo(taskInfo); + for (ClusterListener listener : listeners) { + listener.taskAdded(taskInfo); + } + } + + // Updating the Task + public void updateTask(TaskInfo taskInfo) { for (ClusterListener listener : listeners) { listener.taskUpdated(taskInfo); } } + public void removeTask(TaskInfo taskInfo) { + Cluster cluster = model.getCluster(); + cluster.removeTaskInfo(taskInfo); + for (ClusterListener listener : listeners) { + listener.taskAdded(taskInfo); + } + } public List<VolumeOptionInfo> getVolumeOptionsDefaults() { return volumeOptionsDefaults; diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/TasksClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/TasksClient.java index deaeee64..46077371 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/TasksClient.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/TasksClient.java @@ -25,7 +25,6 @@ import java.util.List; import javax.ws.rs.core.MultivaluedMap; -import com.gluster.storage.management.client.utils.ClientUtil; import com.gluster.storage.management.core.constants.RESTConstants; import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.response.TaskInfoListResponse; @@ -76,6 +75,13 @@ public class TasksClient extends AbstractClient { putRequest(taskId, form); } + + public void commitTask(String taskId) { + Form form = new Form(); + form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.TASK_COMMIT); + + putRequest(taskId, form); + } public void getTaskStatus(String taskId) { Form form = new Form(); diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java index 0c094e99..d6757cba 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java @@ -115,6 +115,10 @@ public class Cluster extends Entity { public void addTaskInfo(TaskInfo taskInfo) { this.taskInfoList.add(taskInfo); } + + public void removeTaskInfo(TaskInfo taskInfo) { + this.taskInfoList.remove(taskInfo); + } public List<Alert> getAlerts() { return alerts; diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java index 95075f78..701fe426 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java @@ -31,6 +31,7 @@ public class Status { public static final int STATUS_CODE_RUNNING = 3; public static final int STATUS_CODE_PAUSE = 4; public static final int STATUS_CODE_WARNING = 5; + public static final int STATUS_CODE_COMMIT_PENDING = 6; public static final Status STATUS_SUCCESS = new Status(STATUS_CODE_SUCCESS, "Success"); public static final Status STATUS_FAILURE = new Status(STATUS_CODE_FAILURE, "Failure"); diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/TaskStatus.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/TaskStatus.java index 46dc7b31..c1205c0e 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/TaskStatus.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/TaskStatus.java @@ -22,7 +22,7 @@ package com.gluster.storage.management.core.model; public class TaskStatus extends Status { - private boolean isPercentageSupported; + private boolean isPercentageSupported = false; private float percentCompleted; private String description; diff --git a/src/com.gluster.storage.management.gui/plugin.xml b/src/com.gluster.storage.management.gui/plugin.xml index c5c25c33..0addb428 100644 --- a/src/com.gluster.storage.management.gui/plugin.xml +++ b/src/com.gluster.storage.management.gui/plugin.xml @@ -685,6 +685,22 @@ </action> <action allowLabelUpdate="false" + class="com.gluster.storage.management.gui.actions.CommitTaskAction" + definitionId="com.gluster.storage.management.gui.commands.Commit" + icon="icons/stop.png" + id="com.gluster.storage.management.gui.actions.Commit" + label="&Commit TaskTask" + menubarPath="com.gluster.storage.management.gui.menu.cluster/cluster" + mode="FORCE_TEXT" + pulldown="false" + retarget="false" + state="false" + style="push" + toolbarPath="Normal" + tooltip="To Commit the selected task"> + </action> + <action + allowLabelUpdate="false" class="com.gluster.storage.management.gui.actions.StopTaskAction" definitionId="com.gluster.storage.management.gui.commands.Stop" icon="icons/stop_task.png" diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/TasksTableLabelProvider.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/TasksTableLabelProvider.java index 177b069e..82aa1f44 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/TasksTableLabelProvider.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/TasksTableLabelProvider.java @@ -23,12 +23,10 @@ package com.gluster.storage.management.gui; import org.eclipse.swt.graphics.Image; import com.gluster.storage.management.core.model.TaskInfo; -import com.gluster.storage.management.gui.utils.GUIHelper; import com.gluster.storage.management.gui.views.pages.TasksPage.TASK_TABLE_COLUMN_INDICES; public class TasksTableLabelProvider extends TableLabelProviderAdapter { - private GUIHelper guiHelper = GUIHelper.getInstance(); @Override public Image getColumnImage(Object element, int columnIndex) { @@ -42,6 +40,6 @@ public class TasksTableLabelProvider extends TableLabelProviderAdapter { } TaskInfo taskInfo = (TaskInfo) element; - return (columnIndex == TASK_TABLE_COLUMN_INDICES.TASK.ordinal()) ? taskInfo.getDescription() : taskInfo.getStatus().getMessage(); + return (columnIndex == TASK_TABLE_COLUMN_INDICES.TASK.ordinal()) ? taskInfo.getDescription().trim() : taskInfo.getStatus().getMessage().trim(); } } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ClearTaskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ClearTaskAction.java index 75db898d..f1eb8a94 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ClearTaskAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ClearTaskAction.java @@ -25,7 +25,7 @@ public class ClearTaskAction extends AbstractActionDelegate { new TasksClient().resumeTask(taskInfo.getName()); // TODO Update taskInfo in the model // modelManager.updateVolumeStatus(volume, VOLUME_STATUS.OFFLINE); - modelManager.updateTaskStatus(taskInfo, new Status(Status.STATUS_CODE_PART_SUCCESS, taskInfo.getName() + " is cleared from task list")); + modelManager.removeTask(taskInfo); } catch (Exception e) { showErrorDialog(actionDesc, "Task [" + taskInfo.getName() + "] could not be cleared! Error: [" + e.getMessage() + "]"); diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CommitTaskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CommitTaskAction.java new file mode 100644 index 00000000..9655b2b3 --- /dev/null +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CommitTaskAction.java @@ -0,0 +1,54 @@ +package com.gluster.storage.management.gui.actions; + +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.swt.widgets.Display; + +import com.gluster.storage.management.client.GlusterDataModelManager; +import com.gluster.storage.management.client.TasksClient; +import com.gluster.storage.management.core.model.Status; +import com.gluster.storage.management.core.model.TaskInfo; +import com.gluster.storage.management.core.model.TaskStatus; + +public class CommitTaskAction extends AbstractActionDelegate { + private TaskInfo taskInfo; + private GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance(); + + @Override + protected void performAction(final IAction action) { + Display.getDefault().asyncExec(new Runnable() { + + @Override + public void run() { + final String actionDesc = action.getDescription(); + + try { + new TasksClient().commitTask(taskInfo.getName()); + taskInfo.setStatus(new TaskStatus(new Status(Status.STATUS_CODE_SUCCESS, taskInfo.getName() + + " is commited"))); + modelManager.updateTask(taskInfo); + } catch (Exception e) { + showErrorDialog(actionDesc, + "Task [" + taskInfo.getName() + "] could not be Stopped! Error: [" + e.getMessage() + "]"); + } + } + }); + } + + @Override + public void selectionChanged(IAction action, ISelection selection) { + super.selectionChanged(action, selection); + action.setEnabled(false); + if (selectedEntity instanceof TaskInfo) { + taskInfo = (TaskInfo) selectedEntity; + action.setEnabled(taskInfo.canCommit() + && taskInfo.getStatus().getCode() == Status.STATUS_CODE_COMMIT_PENDING); + } + } + + @Override + public void dispose() { + + } + +} diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/PauseTaskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/PauseTaskAction.java index 2bb7261e..b36b7855 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/PauseTaskAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/PauseTaskAction.java @@ -28,6 +28,7 @@ import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.TasksClient; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.TaskInfo; +import com.gluster.storage.management.core.model.TaskStatus; public class PauseTaskAction extends AbstractActionDelegate { @@ -44,9 +45,9 @@ public class PauseTaskAction extends AbstractActionDelegate { try { new TasksClient().pauseTask(taskInfo.getName()); - //TODO Update taskInfo in the model - // modelManager.updateVolumeStatus(volume, VOLUME_STATUS.OFFLINE); - modelManager.updateTaskStatus(taskInfo, new Status( Status.STATUS_CODE_PAUSE, "Paused")); + taskInfo.setStatus(new TaskStatus(new Status(Status.STATUS_CODE_PAUSE, taskInfo.getName() + + " is Paused"))); + modelManager.updateTask(taskInfo); } catch (Exception e) { showErrorDialog(actionDesc, "Task [" + taskInfo.getName() + "] could not be Paused! Error: [" + e.getMessage() + "]"); diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ResumeTaskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ResumeTaskAction.java index 07894c80..fc80b04d 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ResumeTaskAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ResumeTaskAction.java @@ -8,6 +8,7 @@ import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.TasksClient; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.TaskInfo; +import com.gluster.storage.management.core.model.TaskStatus; public class ResumeTaskAction extends AbstractActionDelegate { private TaskInfo taskInfo; @@ -23,9 +24,9 @@ public class ResumeTaskAction extends AbstractActionDelegate { try { new TasksClient().resumeTask(taskInfo.getName()); - // TODO Update taskInfo in the model - // modelManager.updateVolumeStatus(volume, VOLUME_STATUS.OFFLINE); - modelManager.updateTaskStatus(taskInfo, new Status(Status.STATUS_CODE_PAUSE, taskInfo.getName() + " is Resumed")); + taskInfo.setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, taskInfo.getName() + + " is Resumed"))); + modelManager.updateTask(taskInfo); } catch (Exception e) { showErrorDialog(actionDesc, "Task [" + taskInfo.getName() + "] could not be Resumed! Error: [" + e.getMessage() + "]"); diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopTaskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopTaskAction.java index 144e94be..abde4e57 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopTaskAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopTaskAction.java @@ -8,6 +8,7 @@ import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.TasksClient; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.TaskInfo; +import com.gluster.storage.management.core.model.TaskStatus; public class StopTaskAction extends AbstractActionDelegate { private TaskInfo taskInfo; @@ -23,9 +24,8 @@ public class StopTaskAction extends AbstractActionDelegate { try { new TasksClient().resumeTask(taskInfo.getName()); - // TODO Update taskInfo in the model - // modelManager.updateVolumeStatus(volume, VOLUME_STATUS.OFFLINE); - modelManager.updateTaskStatus(taskInfo, new Status(Status.STATUS_CODE_PART_SUCCESS, taskInfo.getName() + " is Stopped")); + taskInfo.setStatus( new TaskStatus( new Status(Status.STATUS_CODE_SUCCESS, taskInfo.getName() + " is Stopped"))); + modelManager.updateTask(taskInfo); } catch (Exception e) { showErrorDialog(actionDesc, "Task [" + taskInfo.getName() + "] could not be Stopped! Error: [" + e.getMessage() + "]"); diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/TasksPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/TasksPage.java index 03c4f7ac..ce68e22f 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/TasksPage.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/TasksPage.java @@ -45,6 +45,7 @@ public class TasksPage extends AbstractTableViewerPage<TaskInfo> { private static final String[] TASK_TABLE_COLUMN_NAMES = new String[] { "Task", "Status"}; + @SuppressWarnings("unchecked") public TasksPage(IWorkbenchSite site, Composite parent, int style, Object taskInfo) { super(site, parent, style, false, false, taskInfo); this.taskInfoList = (List<TaskInfo>) taskInfo; diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/TasksResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/TasksResource.java index 834033d0..53122f11 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/TasksResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/TasksResource.java @@ -126,12 +126,10 @@ public class TasksResource extends AbstractResource { task.pause(); } else if (taskOperation.equals(RESTConstants.TASK_STOP)) { task.stop(); - } else if(taskOperation.equals(RESTConstants.TASK_COMMIT)) { + } else if (taskOperation.equals(RESTConstants.TASK_COMMIT)) { task.commit(); } - // updateTask(taskId, taskOperation); - return (Response) acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS + "/" + clusterName + "/" - + RESOURCE_TASKS + "/" + taskId); + return (Response) noContentResponse(); } catch(GlusterValidationException ve) { return badRequestResponse(ve.getMessage()); } catch (GlusterRuntimeException e) { 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 107d4fb2..3e89b8ca 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 @@ -950,7 +950,7 @@ public class VolumesResource extends AbstractResource { migrateDiskTask.setAutoCommit(autoCommit); migrateDiskTask.start(); taskResource.addTask(migrateDiskTask); - return migrateDiskTask.getId(); + return migrateDiskTask.getTaskInfo().getName(); // Return Task ID } private String rebalanceStart(String clusterName, String volumeName, Boolean isFixLayout, Boolean isMigrateData, @@ -1005,6 +1005,10 @@ public class VolumesResource extends AbstractResource { // System.out.println("Code : " + status.getCode()); // System.out.println("Message " + status.getMessage()); - vr.removeBricks("testCluster", "test", "192.168.1.210:sdb", true); + // vr.removeBricks("testCluster", "test", "192.168.1.210:sdb", true); + + String taskId = vr.migrateBrickStart("myGluster", "students", "devserver1:/export/sdc/students", + "devserver2:/export/sdb/students", true); + } } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateDiskTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateDiskTask.java index 9a31d468..9bdc9c94 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateDiskTask.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateDiskTask.java @@ -22,7 +22,6 @@ 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.GlusterServer; 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; @@ -30,6 +29,7 @@ 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.SshUtil; +import com.sun.jersey.core.util.Base64; public class MigrateDiskTask extends Task { @@ -68,6 +68,7 @@ public class MigrateDiskTask extends Task { + volumeName + "] from [" + fromBrick + "] to [" + toBrick + "]", true, true, true); setFromBrick(fromBrick); setToBrick(toBrick); + taskInfo.setName(getId()); } public MigrateDiskTask(ClusterService clusterService, String clusterName, TaskInfo info) { @@ -76,7 +77,7 @@ public class MigrateDiskTask extends Task { @Override public String getId() { - return taskInfo.getType() + "-" + taskInfo.getReference() + "-" + fromBrick + "-" + toBrick; + return new String( Base64.encode( taskInfo.getType() + "-" + taskInfo.getReference() + "-" + fromBrick + "-" + toBrick )); } @Override @@ -93,13 +94,9 @@ public class MigrateDiskTask extends Task { String command = "gluster volume replace-brick " + getTaskInfo().getReference() + " " + getFromBrick() + " " + getToBrick() + " start"; ProcessResult processResult = sshUtil.executeRemote(onlineServerName, command); - - System.out.println(command); - System.out.println("[" + processResult.getExitValue() + "] " + processResult.getOutput() ); - if (processResult.isSuccess()) { if (processResult.getOutput().trim().matches(".*started successfully$")) { - getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, processResult.getOutput()))); + getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, processResult.getOutput().trim()))); return; } } @@ -125,16 +122,16 @@ public class MigrateDiskTask extends Task { ProcessResult processResult = sshUtil.executeRemote(onlineServer, command); TaskStatus taskStatus = new TaskStatus(); if (processResult.isSuccess()) { - if (processResult.getOutput().matches("*pause")) { + if (processResult.getOutput().matches("*pause")) { //TODO replace correct pattern to identify the pause status taskStatus.setCode(Status.STATUS_CODE_PAUSE); - } else { - taskStatus.setCode(Status.STATUS_CODE_FAILURE); + taskStatus.setMessage(processResult.getOutput()); + getTaskInfo().setStatus(taskStatus); + return; } - } else { - taskStatus.setCode(Status.STATUS_CODE_FAILURE); - } - taskStatus.setMessage(processResult.getOutput()); // Common - getTaskInfo().setStatus(taskStatus); + } + + // if we reach here, it means rebalance start failed. + throw new GlusterRuntimeException(processResult.toString()); } @@ -145,7 +142,12 @@ public class MigrateDiskTask extends Task { @Override public void commit() { - // TODO Auto-generated method stub + try { + commitMigration(getOnlineServer().getName()); + } catch(ConnectionException e) { + // online server might have gone offline. try with a new one. + commitMigration(getNewOnlineServer().getName()); + } } @Override @@ -167,14 +169,14 @@ public class MigrateDiskTask extends Task { if (processResult.isSuccess()) { if (processResult.getOutput().trim().matches(".*aborted successfully$")) { 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); + taskStatus.setMessage(processResult.getOutput()); + getTaskInfo().setStatus(taskStatus); + return; + } + } + + // if we reach here, it means rebalance start failed. + throw new GlusterRuntimeException(processResult.toString()); } @@ -187,6 +189,27 @@ public class MigrateDiskTask extends Task { return checkMigrationStatus(getNewOnlineServer().getName()); } } + + + public void commitMigration(String serverName) { + String command = "gluster volume replace-brick " + getTaskInfo().getReference() + " " + getFromBrick() + " " + + getToBrick() + " commit"; + + ProcessResult processResult = sshUtil.executeRemote(serverName, command); + TaskStatus taskStatus = new TaskStatus(); + if (processResult.isSuccess()) { + if (processResult.getOutput().trim().matches(".*commit successful$")) { + taskStatus.setCode(Status.STATUS_CODE_SUCCESS); + taskStatus.setMessage(processResult.getOutput()); // Common + getTaskInfo().setStatus(taskStatus); + return; + } + } + + // if we reach here, it means rebalance start failed. + throw new GlusterRuntimeException(processResult.toString()); + } + private TaskStatus checkMigrationStatus(String serverName) { String command = "gluster volume replace-brick " + getTaskInfo().getReference() + " " + getFromBrick() + " " @@ -195,7 +218,10 @@ public class MigrateDiskTask extends Task { TaskStatus taskStatus = new TaskStatus(); if (processResult.isSuccess()) { if (processResult.getOutput().trim().matches("^Number of files migrated.*Migration complete$")) { - taskStatus.setCode(Status.STATUS_CODE_SUCCESS); + taskStatus.setCode(Status.STATUS_CODE_COMMIT_PENDING); + if (autoCommit) { + commitMigration(serverName); + } } else if ( processResult.getOutput().trim().matches("^Number of files migrated.*Current file=.*")) { taskStatus.setCode(Status.STATUS_CODE_RUNNING); } else { @@ -204,7 +230,9 @@ public class MigrateDiskTask extends Task { } else { taskStatus.setCode(Status.STATUS_CODE_FAILURE); } - taskStatus.setMessage(processResult.getOutput()); // Common + + taskStatus.setMessage(processResult.getOutput()); // common + taskInfo.setStatus(taskStatus); // Update the task status return taskStatus; } } 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 cdc56400..49cd0b8b 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 @@ -20,11 +20,10 @@ */ package com.gluster.storage.management.server.tasks; -import com.gluster.storage.management.core.exceptions.ConnectionException; import com.gluster.storage.management.core.model.GlusterServer; import com.gluster.storage.management.core.model.TaskInfo; -import com.gluster.storage.management.core.model.TaskStatus; import com.gluster.storage.management.core.model.TaskInfo.TASK_TYPE; +import com.gluster.storage.management.core.model.TaskStatus; import com.gluster.storage.management.server.services.ClusterService; public abstract class Task { @@ -39,10 +38,12 @@ public abstract class Task { taskInfo.setType(type); taskInfo.setReference(reference); taskInfo.setDescription(desc); + taskInfo.setCanPause(canPause); + taskInfo.setCanStop(canStop); + taskInfo.setCanCommit(canCommit); - // IMPORTANT. This call must be in the end since getId may need to use the values set in above statements - taskInfo.setName(getId()); init(clusterService, clusterName, taskInfo); + } public Task(ClusterService clusterService, String clusterName, TaskInfo taskInfo) { |
