diff options
Diffstat (limited to 'src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/DeleteVolumeAction.java')
-rw-r--r-- | src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/DeleteVolumeAction.java | 111 |
1 files changed, 69 insertions, 42 deletions
diff --git a/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/DeleteVolumeAction.java b/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/DeleteVolumeAction.java index d764dcc0..6d784676 100644 --- a/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/DeleteVolumeAction.java +++ b/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/DeleteVolumeAction.java @@ -42,7 +42,6 @@ public class DeleteVolumeAction extends AbstractMonitoredActionDelegate { private List<String> onlineVolumeNames = new ArrayList<String>(); private List<String> deletedVolumeNames = new ArrayList<String>(); private List<Volume> failedVolumes = new ArrayList<Volume>(); - private List<String> failedVolumeNames = new ArrayList<String>(); @Override protected void performAction(final IAction action, IProgressMonitor monitor) { @@ -72,85 +71,113 @@ public class DeleteVolumeAction extends AbstractMonitoredActionDelegate { warningMessage = "Are you sure to delete the volumes " + selectedVolumeNames + " ?"; } - final Integer directoryDeleteOption = new MessageDialog(getShell(), "Delete Volume", GUIHelper.getInstance() + final Integer deleteOption = new MessageDialog(getShell(), "Delete Volume", GUIHelper.getInstance() .getImage(IImageKeys.VOLUME_16x16), warningMessage, MessageDialog.QUESTION, new String[] { "Cancel", "Delete volume and data", "Delete volume, keep data" }, -1).open(); - if (directoryDeleteOption <= 0) { // By Cancel button(0) or Escape key(-1) + if (deleteOption <= 0) { // By Cancel button(0) or Escape key(-1) return; } - String errorMessage = performDeleteVolume(monitor,selectedVolumes, directoryDeleteOption, false); + String errorMessage = deleteVolumes(selectedVolumes, deleteOption, monitor); // Display the success or failure info if (deletedVolumeNames.size() == 0) { // No volume(s) deleted successfully - String message = "volumes " + failedVolumeNames + " could not be delete! " + CoreConstants.NEWLINE - + "Error: [" + errorMessage + "]"; - errorMessage = performForceStopAndDeleteVolume(monitor, actionDesc, failedVolumes, directoryDeleteOption, - message); + if (!errorMessage.isEmpty()) { + showErrorDialog(actionDesc, "Volume(s) could not be deleted! " + CoreConstants.NEWLINE + errorMessage); + } } else { - String info = "Volumes " + deletedVolumeNames + " deleted successfully!"; - if (!errorMessage.equals("")) { - String message = info + CoreConstants.NEWLINE + CoreConstants.NEWLINE + "Volumes " + failedVolumeNames - + " could not be deleted! [" + errorMessage + "]"; - errorMessage = performForceStopAndDeleteVolume(monitor, actionDesc, failedVolumes, - directoryDeleteOption, message); + String info = "Volume(s) " + deletedVolumeNames + " deleted successfully!"; + if (!errorMessage.isEmpty()) { + info += CoreConstants.NEWLINE + CoreConstants.NEWLINE + "Volumes " + failedVolumes + + " could not be deleted!" + errorMessage; } - if (errorMessage.equals("")) { - errorMessage = info; + if (selectedVolumes.size() == deletedVolumeNames.size()) { + showInfoDialog(actionDesc, info); + } else { + showWarningDialog(actionDesc, info); } } - showInfoDialog(actionDesc, errorMessage); } - private String performForceStopAndDeleteVolume(IProgressMonitor monitor, String actionDesc, List<Volume> volumesToDelete, - Integer directoryDeleteOption, String message) { - boolean forceStop = showConfirmDialog(actionDesc, message + CoreConstants.NEWLINE + CoreConstants.NEWLINE - + "Do you want to stop forcefully and delete?"); - if (!forceStop) { - return ""; - } - return performDeleteVolume(monitor, volumesToDelete, directoryDeleteOption, true); - } - - private String performDeleteVolume(IProgressMonitor monitor, List<Volume> volumeNeedsToDelete, - final Integer directoryDeleteOption, Boolean force) { + private String deleteVolumes(List<Volume> volumes, final Integer deleteOption, IProgressMonitor monitor) { deletedVolumeNames.clear(); - failedVolumeNames.clear(); failedVolumes.clear(); VolumesClient vc = new VolumesClient(); - boolean confirmDeleteDir = (directoryDeleteOption == 1) ? true : false; + boolean confirmDeleteDir = (deleteOption == 1) ? true : false; String errorMessage = ""; - monitor.beginTask("Deleting Selected Volumes...", volumeNeedsToDelete.size()); - for (Volume volume : volumeNeedsToDelete.toArray(new Volume[0])) { - try { - monitor.setTaskName("Deleting volume [" + volume.getName() + "]"); - if (volume.getStatus() == VOLUME_STATUS.ONLINE) { // stop if online volume - vc.stopVolume(volume.getName(), force); + // To calculate the total work we need to sum volumes size + online volumes (because we treat stop and delete as + // separate steps) + List<Volume> onlineVolumes = getOnlineVolumes(volumes); + monitor.beginTask("Deleting Selected Volumes...", volumes.size() + onlineVolumes.size()); + + // Deletion of a volume results in changes to the model, and ultimately updates the "selectedVolumes" list, + // over which we are iterating, thus resulting in ConcurrentModificationException. To avoid this, we iterate + // over an array obtained from the list. + for (Volume volume : volumes.toArray(new Volume[0])) { + if (volume.getStatus() == VOLUME_STATUS.ONLINE) { // stop if online volume + monitor.setTaskName("Stopping volume [" + volume.getName() + "]"); + try { + vc.stopVolume(volume.getName(), false); + } catch (Exception e1) { + // try again with force = true + try { + vc.stopVolume(volume.getName(), true); + } catch(Exception e2) { + // force stop also failed. + // Mark as deletion failed, append error message. + errorMessage += CoreConstants.NEWLINE + "Stop[" + volume.getName() + "] : [" + e2.getMessage() + + "]"; + failedVolumes.add(volume); + + // since we are not going to perform delete on this volume, + // mark the deletion task as worked + monitor.worked(1); + + // continue to next volume without trying to delete this one + continue; + } + } finally { + // worked for "stop" operation + monitor.worked(1); } + } + + monitor.setTaskName("Deleting volume [" + volume.getName() + "]"); + try { vc.deleteVolume(volume.getName(), confirmDeleteDir); modelManager.deleteVolume(volume); deletedVolumeNames.add(volume.getName()); } catch (Exception e) { // Volume delete succeeded and post delete operation (directory cleanup, CIFS etc) may fail if (vc.volumeExists(volume.getName())) { - errorMessage += CoreConstants.NEWLINE + "[" + volume.getName() + "] : [" + e.getMessage() + "]"; - failedVolumeNames.add(volume.getName()); + errorMessage += CoreConstants.NEWLINE + "Delete [" + volume.getName() + "] : [" + e.getMessage() + "]"; failedVolumes.add(volume); } else { - errorMessage += CoreConstants.NEWLINE + "Volume deleted, but following error occured: [" - + e.getMessage() + "]"; + errorMessage += CoreConstants.NEWLINE + "Volume [" + volume.getName() + + "] deleted, but following error occured: [" + e.getMessage() + "]"; modelManager.deleteVolume(volume); deletedVolumeNames.add(volume.getName()); } + } finally { + monitor.worked(1); } - monitor.worked(1); } monitor.done(); return errorMessage; } + private List<Volume> getOnlineVolumes(List<Volume> volumes) { + List<Volume> onlineVolumes = new ArrayList<Volume>(); + for (Volume volume : volumes) { + if (volume.getStatus() == VOLUME_STATUS.ONLINE) { + onlineVolumes.add(volume); + } + } + return onlineVolumes; + } + private void collectVolumeNames() { selectedVolumeNames.clear(); onlineVolumeNames.clear(); |