diff options
Diffstat (limited to 'src')
11 files changed, 127 insertions, 96 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 6db98ed4..8a684c57 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 @@ -25,6 +25,7 @@ import java.util.Map.Entry; import java.util.Set; import org.apache.log4j.Logger; +import org.eclipse.core.runtime.IProgressMonitor; import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.model.Brick; @@ -92,7 +93,7 @@ public class GlusterDataModelManager { model = fetchData(clusterName); } - public GlusterDataModel fetchData(String clusterName) { + private GlusterDataModel fetchData(String clusterName) { GlusterDataModel model = new GlusterDataModel("Gluster Data Model"); Cluster cluster = new Cluster(clusterName, model); @@ -100,7 +101,6 @@ public class GlusterDataModelManager { initializeVolumes(cluster); initializeAutoDiscoveredServers(cluster); - // initializeDisks(); initializeTasks(cluster); initializeAlerts(cluster); initializeVolumeOptionsDefaults(); @@ -109,27 +109,50 @@ public class GlusterDataModelManager { return model; } - public void refreshModel() { + public GlusterDataModel fetchModel(IProgressMonitor monitor) { synchronized (syncInProgress) { if(syncInProgress) { logger.info("Previous data sync is still running. Skipping this one."); - return; + return null; } syncInProgress = true; } - - logger.info("Starting data sync"); + try { - updateModel(fetchData(clusterName)); - } catch(Exception e) { + logger.info("Starting data sync"); + GlusterDataModel model = new GlusterDataModel("Gluster Data Model"); + Cluster cluster = new Cluster(clusterName, model); + model.addCluster(cluster); + + monitor.beginTask("Data Sync", 4); + + monitor.setTaskName("Syncing servers..."); + initializeGlusterServers(cluster); + monitor.worked(1); + + monitor.setTaskName("Syncing volumes..."); + initializeVolumes(cluster); + monitor.worked(1); + + monitor.setTaskName("Syncing discovered servers..."); + initializeAutoDiscoveredServers(cluster); + monitor.worked(1); + + monitor.setTaskName("Syncing tasks..."); + initializeTasks(cluster); + monitor.worked(1); + + monitor.done(); + return model; + } catch(RuntimeException e) { logger.error("Error in data sync!", e); + return null; } finally { syncInProgress = false; } } - - private void updateModel(GlusterDataModel model) { + public void updateModel(GlusterDataModel model) { updateVolumes(model); updateGlusterServers(model); updateDiscoveredServers(model); diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Application.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Application.java index 2c49a1e2..43287c62 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Application.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Application.java @@ -23,6 +23,7 @@ import java.util.Collections; import java.util.List; import org.eclipse.core.databinding.observable.Realm; +import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.jobs.JobChangeAdapter; @@ -51,7 +52,6 @@ public class Application implements IApplication { private static Application instance; private List<IEntityListener> entityListeners = Collections.synchronizedList(new ArrayList<IEntityListener>()); private IStatusLineManager statusLineManager; - private Job syncJob; public Application() { instance = this; @@ -95,8 +95,6 @@ public class Application implements IApplication { return IApplication.EXIT_OK; } try { - setupBackgroundJobs(); - int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor()); if (returnCode == PlatformUI.RETURN_RESTART) { return IApplication.EXIT_RESTART; @@ -108,24 +106,6 @@ public class Application implements IApplication { } } - private void setupBackgroundJobs() { - // 1 minute delay for first run - final IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore(); - final long JOB_INTERVAL = preferenceStore.getLong(PreferenceConstants.P_DATA_SYNC_INTERVAL) * 1000; - - syncJob = new DataSyncJob("Syncing cluster data in background"); - syncJob.setPriority(Job.DECORATE); - syncJob.schedule(JOB_INTERVAL); - syncJob.addJobChangeListener(new JobChangeAdapter() { - @Override - public void done(IJobChangeEvent event) { - super.done(event); - // job done. schedule again after the pre-defined interval - syncJob.schedule(JOB_INTERVAL); - } - }); - } - private void setSystemProperties() { // TODO: Trying this to avoid the webstart authentication dialog // to be tested, and removed if this doesn't work. @@ -144,7 +124,6 @@ public class Application implements IApplication { final Display display = workbench.getDisplay(); display.syncExec(new Runnable() { public void run() { - syncJob.cancel(); if (!display.isDisposed()) workbench.close(); } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/ApplicationWorkbenchAdvisor.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/ApplicationWorkbenchAdvisor.java index 07e20466..73a10b01 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/ApplicationWorkbenchAdvisor.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/ApplicationWorkbenchAdvisor.java @@ -18,16 +18,25 @@ *******************************************************************************/ package com.gluster.storage.management.gui; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.jobs.IJobChangeEvent; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.core.runtime.jobs.JobChangeAdapter; +import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.ui.application.IWorkbenchConfigurer; import org.eclipse.ui.application.IWorkbenchWindowConfigurer; import org.eclipse.ui.application.WorkbenchAdvisor; import org.eclipse.ui.application.WorkbenchWindowAdvisor; +import com.gluster.storage.management.gui.jobs.DataSyncJob; +import com.gluster.storage.management.gui.preferences.PreferenceConstants; + /** * This workbench advisor creates the window advisor, and specifies * the perspective id for the initial window. */ public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor { + private Job syncJob; public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) { return new ApplicationWorkbenchWindowAdvisor(configurer); @@ -42,4 +51,27 @@ public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor { super.initialize(configurer); configurer.setSaveAndRestore(false); // we don't need save/restore as of now } + + @Override + public void postStartup() { + super.postStartup(); + setupBackgroundJobs(); + } + + private void setupBackgroundJobs() { + final IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore(); + final long JOB_INTERVAL = preferenceStore.getLong(PreferenceConstants.P_DATA_SYNC_INTERVAL) * 1000; + + syncJob = new DataSyncJob("Cluster Data Sync"); + syncJob.schedule(JOB_INTERVAL); + syncJob.addJobChangeListener(new JobChangeAdapter() { + @Override + public void done(IJobChangeEvent event) { + super.done(event); + + // job done. schedule again after the pre-defined interval + syncJob.schedule(JOB_INTERVAL); + } + }); + } } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AbstractActionDelegate.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AbstractActionDelegate.java index 6498d902..b9d57de7 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AbstractActionDelegate.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AbstractActionDelegate.java @@ -100,7 +100,7 @@ public abstract class AbstractActionDelegate implements IWorkbenchWindowActionDe MessageDialog.openError(getShell(), title, message); } - protected synchronized boolean showConfirmDialog(final String title, final String message) { + protected boolean showConfirmDialog(final String title, final String message) { return MessageDialog.openQuestion(getShell(), title, message); } } 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 fe358caa..6bcbc066 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,20 +20,17 @@ package com.gluster.storage.management.gui.actions; import org.eclipse.jface.action.IAction; -import com.gluster.storage.management.client.GlusterDataModelManager; +import com.gluster.storage.management.gui.jobs.DataSyncJob; /** * */ public class RefreshDataAction extends AbstractActionDelegate { - /* (non-Javadoc) * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose() */ @Override public void dispose() { - // TODO Auto-generated method stub - } /* (non-Javadoc) @@ -41,6 +38,6 @@ public class RefreshDataAction extends AbstractActionDelegate { */ @Override protected void performAction(IAction action) { - GlusterDataModelManager.getInstance().refreshModel(); + new DataSyncJob("Cluster Data Sync").schedule(); } } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/jobs/DataSyncJob.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/jobs/DataSyncJob.java index f6fd1ba4..aff62a92 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/jobs/DataSyncJob.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/jobs/DataSyncJob.java @@ -18,6 +18,7 @@ *******************************************************************************/ package com.gluster.storage.management.gui.jobs; +import org.apache.log4j.Logger; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; @@ -25,31 +26,43 @@ import org.eclipse.core.runtime.jobs.Job; import org.eclipse.swt.widgets.Display; import com.gluster.storage.management.client.GlusterDataModelManager; -import com.gluster.storage.management.gui.utils.GUIHelper; +import com.gluster.storage.management.core.model.GlusterDataModel; /** * */ public class DataSyncJob extends Job { + private static final Logger logger = Logger.getLogger(DataSyncJob.class); + public DataSyncJob(String name) { - super(name); + super(name); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor) */ @Override - protected IStatus run(IProgressMonitor monitor) { + protected IStatus run(final IProgressMonitor monitor) { + final GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance(); + + // fetch the latest model + final GlusterDataModel model = modelManager.fetchModel(monitor); + if(model == null) { + return Status.CANCEL_STATUS; + } + + monitor.beginTask("Notify views", 1); Display.getDefault().asyncExec(new Runnable() { - @Override public void run() { - GUIHelper.getInstance().setStatusMessage("Data sync in progress..."); - GlusterDataModelManager.getInstance().refreshModel(); - GUIHelper.getInstance().setStatusMessage(null); + modelManager.updateModel(model); } }); - + monitor.worked(1); + monitor.done(); + return Status.OK_STATUS; } -} +}
\ No newline at end of file diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java index f9526ef9..30072b97 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java @@ -92,8 +92,6 @@ public class GlusterServerSummaryView extends ViewPart { } private void updateServerDetails() { - // TODO Auto-generated method stub - } @Override @@ -108,7 +106,7 @@ public class GlusterServerSummaryView extends ViewPart { createServerSummarySection(server, toolkit, form); if (server.getStatus() == SERVER_STATUS.ONLINE) { - Composite section = createNetworkInterfacesSection(server, toolkit, form); + createNetworkInterfacesSection(server, toolkit, form); } parent.layout(); // IMP: lays out the form properly diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java index 8acb4a75..14f999e7 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java @@ -50,6 +50,7 @@ public class NavigationView extends ViewPart implements ISelectionListener { private GlusterToolbarManager toolbarManager; private Entity entity; private GlusterViewsManager viewsManager; + private DefaultClusterListener clusterListener; @Override public void createPartControl(Composite parent) { @@ -80,8 +81,7 @@ public class NavigationView extends ViewPart implements ISelectionListener { // register as selection provider so that other views can listen to any selection events on the tree getSite().setSelectionProvider(treeViewer); - // Refresh the navigation tree whenever there is a change to the data model - GlusterDataModelManager.getInstance().addClusterListener(new DefaultClusterListener() { + clusterListener = new DefaultClusterListener() { public void modelChanged() { treeViewer.refresh(); } @@ -91,7 +91,8 @@ public class NavigationView extends ViewPart implements ISelectionListener { super.volumeChanged(volume, event); selectEntity(volume); // this makes sure that the toolbar buttons get updated according to new status } - }); + }; + GlusterDataModelManager.getInstance().addClusterListener(clusterListener); } private void setupContextMenu() { @@ -129,4 +130,10 @@ public class NavigationView extends ViewPart implements ISelectionListener { } } } + + @Override + public void dispose() { + super.dispose(); + GlusterDataModelManager.getInstance().removeClusterListener(clusterListener); + } } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java index e0df170b..d3eb7f6c 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java @@ -93,11 +93,6 @@ public class VolumeSummaryView extends ViewPart { GlusterDataModelManager.getInstance().addClusterListener(volumeChangedListener); } - /* - * (non-Javadoc) - * - * @see org.eclipse.ui.part.WorkbenchPart#dispose() - */ @Override public void dispose() { super.dispose(); diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractTableViewerPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractTableViewerPage.java index 5aaf7094..e8db61dc 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractTableViewerPage.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractTableViewerPage.java @@ -64,6 +64,7 @@ public abstract class AbstractTableViewerPage<T> extends Composite implements IS protected IWorkbenchSite site; private Hyperlink linkAll, linkNone; + private ClusterListener clusterListener; public AbstractTableViewerPage(IWorkbenchSite site, final Composite parent, int style, boolean useChechboxes, boolean multiSelection, Object model) { super(parent, style); @@ -139,17 +140,15 @@ public abstract class AbstractTableViewerPage<T> extends Composite implements IS } }); - final ClusterListener clusterListener = createClusterListener(); - - final GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance(); - modelManager.addClusterListener(clusterListener); - - addDisposeListener(new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - toolkit.dispose(); - modelManager.removeClusterListener(clusterListener); - } - }); + clusterListener = createClusterListener(); + GlusterDataModelManager.getInstance().addClusterListener(clusterListener); + } + + @Override + public void dispose() { + super.dispose(); + toolkit.dispose(); + GlusterDataModelManager.getInstance().removeClusterListener(clusterListener); } protected abstract ClusterListener createClusterListener(); diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumeOptionsPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumeOptionsPage.java index ff94d7e0..2d1e7e98 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumeOptionsPage.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumeOptionsPage.java @@ -117,21 +117,22 @@ public class VolumeOptionsPage extends Composite { private Button createAddButton() { return toolkit.createButton(this, "&Add", SWT.FLAT); } + + @Override + public void dispose() { + super.dispose(); + toolkit.dispose(); + + if (!(addTopButton.isEnabled() || addBottomButton.isEnabled())) { + // user has selected key, but not added value. Since this is not a valid entry, + // remove the last option (without value) from the volume + volume.getOptions().remove(keyEditingSupport.getEntryBeingAdded().getKey()); + } - private void registerListeners(final Composite parent) { - addDisposeListener(new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - if (!(addTopButton.isEnabled() || addBottomButton.isEnabled())) { - // user has selected key, but not added value. Since this is not a valid entry, - // remove the last option (without value) from the volume - volume.getOptions().remove(keyEditingSupport.getEntryBeingAdded().getKey()); - } - - GlusterDataModelManager.getInstance().removeClusterListener(clusterListener); - toolkit.dispose(); - } - }); + GlusterDataModelManager.getInstance().removeClusterListener(clusterListener); + } + private void registerListeners(final Composite parent) { /** * Ideally not required. However the table viewer is not getting laid out properly on performing * "maximize + restore" So this is a hack to make sure that the table is laid out again on re-size of the window @@ -144,19 +145,6 @@ public class VolumeOptionsPage extends Composite { } }); - parent.addDisposeListener(new DisposeListener() { - - @Override - public void widgetDisposed(DisposeEvent e) { - if (!(addTopButton.isEnabled() || addBottomButton.isEnabled())) { - // user has selected key, but not added value. Since this is not a valid entry, - // remove the last option (without value) from the volume - VolumeOption entryBeingAdded = keyEditingSupport.getEntryBeingAdded(); - volume.getOptions().remove(entryBeingAdded.getKey()); - } - } - }); - clusterListener = new DefaultClusterListener() { @Override public void volumeChanged(Volume volume, Event event) { |
