modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
| 47 ++++++----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
| 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
| 8 +
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
| 6 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
| 12 ++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
| 14 ++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
| 8 +
7 files changed, 76 insertions(+), 21 deletions(-)
New commits:
commit 3ddf5894f46a62d894a099d20db329e599fac42d
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Dec 20 15:07:06 2010 -0500
BZ 606530 to avoid db deadlock during bundle deletion, add new
"deletebundles" SLSB API that the client can use
this enables the client to not have to do multiple async calls to the single
"deletebundle" api.
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
index e06b795..c6a9cdc 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
@@ -18,6 +18,7 @@
*/
package org.rhq.enterprise.gui.coregui.client.bundle.list;
+import java.util.ArrayList;
import java.util.Set;
import com.google.gwt.user.client.rpc.AsyncCallback;
@@ -44,6 +45,7 @@ import org.rhq.enterprise.gui.coregui.client.components.table.Table;
import org.rhq.enterprise.gui.coregui.client.components.table.TableActionEnablement;
import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.ErrorHandler;
import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
@@ -133,25 +135,37 @@ public class BundlesListView extends
Table<RPCDataSource<BundleWithLatestVersion
addTableAction(extendLocatorId("Delete"),
MSG.common_button_delete(), MSG.common_msg_areYouSure(),
new AbstractTableAction((hasAuth) ? TableActionEnablement.ANY :
TableActionEnablement.NEVER) {
public void executeAction(ListGridRecord[] selections, Object
actionValue) {
+ if (selections == null || selections.length == 0) {
+ return;
+ }
+
BundlesWithLatestVersionDataSource ds =
(BundlesWithLatestVersionDataSource) getDataSource();
+ final ArrayList<String> doomedNames = new
ArrayList<String>(selections.length);
+ int[] doomedIds = new int[selections.length];
+ int i = 0;
for (ListGridRecord selection : selections) {
- BundleGWTServiceAsync bundleManager =
GWTServiceLookup.getBundleService();
- final BundleWithLatestVersionComposite object =
ds.copyValues(selection);
- bundleManager.deleteBundle(object.getBundleId(), new
AsyncCallback<Void>() {
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(
-
MSG.view_bundle_list_deleteFailure(object.getBundleName()), caught);
- }
-
- public void onSuccess(Void result) {
- CoreGUI.getMessageCenter().notify(
- new
Message(MSG.view_bundle_list_deleteSuccessful(object.getBundleName()),
- Severity.Info));
-
- CoreGUI.refresh();
- }
- });
+ BundleWithLatestVersionComposite object =
ds.copyValues(selection);
+ doomedNames.add(object.getBundleName());
+ doomedIds[i++] = object.getBundleId();
}
+
+ BundleGWTServiceAsync bundleManager =
GWTServiceLookup.getBundleService();
+ bundleManager.deleteBundles(doomedIds, new
AsyncCallback<Void>() {
+ public void onFailure(Throwable caught) {
+ String names = doomedNames.toString();
+ String error = ErrorHandler.getAllMessages(caught);
+ Message m = new
Message(MSG.view_bundle_list_deletesFailure(), names + "<br/>\n"
+ + error, Severity.Error);
+ CoreGUI.getMessageCenter().notify(m);
+ }
+
+ public void onSuccess(Void result) {
+ Message m = new
Message(MSG.view_bundle_list_deletesSuccessful(), doomedNames
+ .toString(), Severity.Info);
+ CoreGUI.getMessageCenter().notify(m);
+ CoreGUI.refresh();
+ }
+ });
}
});
@@ -191,5 +205,4 @@ public class BundlesListView extends
Table<RPCDataSource<BundleWithLatestVersion
}
}
-
}
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
index ad56819..0f58c44 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
@@ -55,6 +55,8 @@ public interface BundleGWTService extends RemoteService {
BundleDestination createBundleDestination(int bundleId, String name, String
description, String deployDir,
int groupId) throws Exception;
+ void deleteBundles(int[] bundleIds) throws Exception;
+
void deleteBundle(int bundleId) throws Exception;
void deleteBundleDeployment(int bundleDeploymentId) throws Exception;
diff --git
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
index cfb8d18..103fcac 100644
---
a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
+++
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
@@ -101,6 +101,14 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl
implements Bund
}
}
+ public void deleteBundles(int[] bundleIds) throws Exception {
+ try {
+ bundleManager.deleteBundles(getSessionSubject(), bundleIds);
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
public void deleteBundle(int bundleId) throws Exception {
try {
bundleManager.deleteBundle(getSessionSubject(), bundleId);
diff --git
a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
index 3ed25bb..4e12244 100644
---
a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
+++
b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
@@ -942,9 +942,11 @@ view_bundleVersion_loadFailure = Failed to load bundle version data
view_bundle_list_backToAll = Back to All Bundles
view_bundle_list_tagUpdateFailure = Failed to update bundle tags
view_bundle_list_tagUpdateSuccessful = You have successfully updated the bundle tags
-view_bundle_list_deleteConfirm = Are you sure you want to delete this bundle?
+view_bundle_list_deleteConfirm = Are you sure you want to delete the selected bundles?
+view_bundle_list_deletesFailure = Failed to delete the bundles
+view_bundle_list_deletesSuccessful = You successfully deleted the bundles
view_bundle_list_deleteFailure = Failed to delete the bundle [{0}]
-view_bundle_list_deleteSuccessful = You successfully deleted the bundle named [{0}]
+view_bundle_list_deleteSuccessful = You successfully deleted the bundle [{0}]
view_bundle_list_error1 = Failed to load bundle to deploy [{0}]
view_bundle_list_error2 = Failed to get a single bundle to deploy [{0}]
view_bundle_list_error3 = Failed to load bundle
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
index b1f65cf..a57b618 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
@@ -1219,6 +1219,18 @@ public class BundleManagerBean implements BundleManagerLocal,
BundleManagerRemot
return results;
}
+ // to avoid deadlocks, you cannot delete multiple bundles concurrently (see BZ
606530)
+ // instead, this simple method just loops over the given array and deletes them
serially
+ // note they all get deleted in their own transaction; this method is never in a tx
itself
+ @TransactionAttribute(TransactionAttributeType.NEVER)
+ public void deleteBundles(Subject subject, int[] bundleIds) throws Exception {
+ if (bundleIds != null) {
+ for (int bundleId : bundleIds) {
+ bundleManager.deleteBundle(subject, bundleId);
+ }
+ }
+ }
+
@SuppressWarnings("unchecked")
@RequiredPermission(Permission.MANAGE_BUNDLE)
public void deleteBundle(Subject subject, int bundleId) throws Exception {
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
index 3ce410d..e8fdd8f 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
@@ -210,6 +210,20 @@ public interface BundleManagerRemote {
@WebParam(name = "distributionFileUrl") String distributionFileUrl)
throws Exception;
/**
+ * Remove everything associated with the Bundles with the exception of files laid
down by related deployments.
+ * Deployed files are left as is on the deployment platforms but the bundle mechanism
will no longer track
+ * the deployment of all bundles that have been deleted.
+ *
+ * @param subject
+ * @param bundleIds IDs of all bundles to be deleted
+ * @throws Exception if any part of the removal fails.
+ */
+ @WebMethod
+ void deleteBundles( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "bundleIds") int[] bundleIds) throws Exception;
+
+ /**
* Remove everything associated with the Bundle with the exception of files laid down
by related deployments.
* Deployed files are left as is on the deployment platforms but the bundle mechanism
will no longer track
* the deployment.
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
index 6e4f1a6..484a751 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
@@ -105,6 +105,8 @@ import
org.rhq.core.domain.measurement.composite.MeasurementDataNumericHighLowCo
import org.rhq.core.domain.operation.GroupOperationHistory;
import org.rhq.core.domain.operation.OperationDefinition;
import org.rhq.core.domain.operation.ResourceOperationHistory;
+import org.rhq.core.domain.operation.bean.GroupOperationSchedule;
+import org.rhq.core.domain.operation.bean.ResourceOperationSchedule;
import org.rhq.core.domain.resource.CreateResourceHistory;
import org.rhq.core.domain.resource.DeleteResourceHistory;
import org.rhq.core.domain.resource.Resource;
@@ -140,9 +142,7 @@ import
org.rhq.enterprise.server.measurement.MeasurementDataManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementDefinitionManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementProblemManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementScheduleManagerLocal;
-import org.rhq.core.domain.operation.bean.GroupOperationSchedule;
import org.rhq.enterprise.server.operation.OperationManagerLocal;
-import org.rhq.core.domain.operation.bean.ResourceOperationSchedule;
import org.rhq.enterprise.server.resource.ResourceFactoryManagerLocal;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
import org.rhq.enterprise.server.resource.ResourceNotFoundException;
@@ -307,6 +307,10 @@ public class WebservicesManagerBean implements WebservicesRemote {
return bundleManager.createBundleVersionViaURL(subject, distributionFileUrl);
}
+ public void deleteBundles(Subject subject, int[] bundleIds) throws Exception {
+ bundleManager.deleteBundles(subject, bundleIds);
+ }
+
public void deleteBundle(Subject subject, int bundleId) throws Exception {
bundleManager.deleteBundle(subject, bundleId);
}