modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDefinitionManagerBean.java | 22 +-
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/MeasurementMetadataManagerBean.java | 82 +++++-----
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/PurgePluginsJob.java | 30 +++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/PurgeResourceTypesJob.java | 44 ++++-
4 files changed, 116 insertions(+), 62 deletions(-)
New commits:
commit 9118dcdb89cbb9cf7a67802b9890f222849579db
Author: Thomas Segismont <tsegismo(a)redhat.com>
Date: Tue Oct 1 18:51:20 2013 +0200
Bug 1014300 - java.util.NoSuchElementException thrown when deleting RHQ plugins
Do not use the criteria query iterator which is buggy (besides it adds no value here: more lines and less readable code)
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDefinitionManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDefinitionManagerBean.java
index fba8a68..23bcc54 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDefinitionManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDefinitionManagerBean.java
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
+ * Copyright (C) 2005-2013 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -13,8 +13,8 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * along with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
package org.rhq.enterprise.server.measurement;
@@ -51,7 +51,7 @@ import org.rhq.enterprise.server.util.CriteriaQueryRunner;
@Stateless
public class MeasurementDefinitionManagerBean implements MeasurementDefinitionManagerLocal,
MeasurementDefinitionManagerRemote {
- private Log log = LogFactory.getLog(MeasurementDefinitionManagerBean.class);
+ private static final Log LOG = LogFactory.getLog(MeasurementDefinitionManagerBean.class);
@PersistenceContext(unitName = RHQConstants.PERSISTENCE_UNIT_NAME)
private EntityManager entityManager;
@@ -95,15 +95,15 @@ public class MeasurementDefinitionManagerBean implements MeasurementDefinitionMa
entityManager.remove(def);
}
} catch (EntityNotFoundException enfe) {
- if (log.isDebugEnabled()) {
- log.debug("Definition # " + def.getId() + " not found: " + enfe.getMessage());
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Definition # " + def.getId() + " not found: " + enfe.getMessage());
}
} catch (PersistenceException pe) {
- if (log.isDebugEnabled()) {
- log.debug("Exception when deleting Definition # " + def.getId() + ": " + pe.getMessage());
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Exception when deleting Definition # " + def.getId() + ": " + pe.getMessage());
}
} catch (Exception e) {
- log.warn(e.fillInStackTrace());
+ LOG.warn(e.fillInStackTrace());
}
}
@@ -134,10 +134,8 @@ public class MeasurementDefinitionManagerBean implements MeasurementDefinitionMa
public PageList<MeasurementDefinition> findMeasurementDefinitionsByCriteria(Subject subject,
MeasurementDefinitionCriteria criteria) {
CriteriaQueryGenerator generator = new CriteriaQueryGenerator(subject, criteria);
- ;
-
CriteriaQueryRunner<MeasurementDefinition> queryRunner = new CriteriaQueryRunner<MeasurementDefinition>(
criteria, generator, entityManager);
return queryRunner.execute();
}
-}
\ No newline at end of file
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/MeasurementMetadataManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/MeasurementMetadataManagerBean.java
index cf813ca..51d3112 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/MeasurementMetadataManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/metadata/MeasurementMetadataManagerBean.java
@@ -1,8 +1,29 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2013 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
package org.rhq.enterprise.server.resource.metadata;
+import static org.rhq.core.domain.criteria.Criteria.Restriction.COLLECTION_ONLY;
+
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashSet;
-import java.util.Iterator;
import java.util.List;
import java.util.Set;
@@ -26,18 +47,14 @@ import org.rhq.core.domain.measurement.MeasurementUnits;
import org.rhq.core.domain.measurement.NumericType;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementDefinitionManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementScheduleManagerLocal;
-import org.rhq.enterprise.server.util.CriteriaQuery;
-import org.rhq.enterprise.server.util.CriteriaQueryExecutor;
@Stateless
public class MeasurementMetadataManagerBean implements MeasurementMetadataManagerLocal {
-
- private final Log log = LogFactory.getLog(MeasurementMetadataManagerBean.class);
+ private static final Log LOG = LogFactory.getLog(MeasurementMetadataManagerBean.class);
@PersistenceContext(unitName = RHQConstants.PERSISTENCE_UNIT_NAME)
private EntityManager entityMgr;
@@ -54,7 +71,9 @@ public class MeasurementMetadataManagerBean implements MeasurementMetadataManage
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void updateMetadata(ResourceType existingType, ResourceType newType) {
- log.debug("Updating metric definitions for " + existingType);
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Updating metric definitions for " + existingType);
+ }
existingType = entityMgr.find(ResourceType.class, existingType.getId());
Set<MeasurementDefinition> existingDefinitions = existingType.getMetricDefinitions();
@@ -63,15 +82,15 @@ public class MeasurementMetadataManagerBean implements MeasurementMetadataManage
Set<MeasurementDefinition> newTypeMetricDefinitions = getMetricDefinitions(newType);
if (existingDefinitions.isEmpty()) {
- if (log.isDebugEnabled()) {
- log.debug(existingType + " currently does not define any metric definitions.");
- log.debug("New metric definitions to be added: " + newType.getMetricDefinitions());
+ if (LOG.isDebugEnabled()) {
+ LOG.debug(existingType + " currently does not define any metric definitions. "
+ + "New metric definitions to be added: " + newType.getMetricDefinitions());
}
// They're all new.
for (MeasurementDefinition newDefinition : newType.getMetricDefinitions()) {
if (newDefinition.getDefaultInterval() < MeasurementSchedule.MINIMUM_INTERVAL) {
newDefinition.setDefaultInterval(MeasurementSchedule.MINIMUM_INTERVAL);
- log.info("Definition [" + newDefinition
+ LOG.info("Definition [" + newDefinition
+ "] has too short of a default interval, setting to minimum");
}
existingType.addMetricDefinition(newDefinition);
@@ -89,8 +108,8 @@ public class MeasurementMetadataManagerBean implements MeasurementMetadataManage
&& (existingDefinition.isPerMinute() == newDefinition.isPerMinute())) {
found = true;
- if (log.isDebugEnabled()) {
- log.debug("Updating existing metric definition: " + existingDefinition);
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Updating existing metric definition: " + existingDefinition);
}
// We normally protect the user's interval settings. But the Availability metric is
@@ -112,7 +131,7 @@ public class MeasurementMetadataManagerBean implements MeasurementMetadataManage
// but we cannot allow too-short of an interval, so override it if necessary
if (existingDefinition.getDefaultInterval() < MeasurementSchedule.MINIMUM_INTERVAL) {
existingDefinition.setDefaultInterval(MeasurementSchedule.MINIMUM_INTERVAL);
- log.info("Definition [" + existingDefinition
+ LOG.info("Definition [" + existingDefinition
+ "] has too short of a default interval, setting to minimum");
}
@@ -128,7 +147,7 @@ public class MeasurementMetadataManagerBean implements MeasurementMetadataManage
if (!found) {
// It's new - create it
- log.info("Metadata update: Adding new " + newDefinition.getDataType().name().toLowerCase() + " definition ["
+ LOG.info("Metadata update: Adding new " + newDefinition.getDataType().name().toLowerCase() + " definition ["
+ newDefinition.getDisplayName() + "] to type " + existingType + "...");
existingType.addMetricDefinition(newDefinition);
entityMgr.persist(newDefinition);
@@ -150,7 +169,7 @@ public class MeasurementMetadataManagerBean implements MeasurementMetadataManage
// ... and remove them
existingDefinitions.removeAll(definitionsToDelete);
for (MeasurementDefinition definitionToDelete : definitionsToDelete) {
- log.info("Metadata update: Removing " + definitionToDelete.getDataType().name().toLowerCase() + " definition ["
+ LOG.info("Metadata update: Removing " + definitionToDelete.getDataType().name().toLowerCase() + " definition ["
+ definitionToDelete.getDisplayName() + "] from type " + existingType + "...");
measurementDefinitionMgr.removeMeasurementDefinition(definitionToDelete);
}
@@ -215,33 +234,24 @@ public class MeasurementMetadataManagerBean implements MeasurementMetadataManage
@Override
public void deleteMetadata(ResourceType existingType) {
- log.debug("Deleting metric definitions for " + existingType);
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Deleting metric definitions for " + existingType);
+ }
MeasurementDefinitionCriteria criteria = new MeasurementDefinitionCriteria();
criteria.addFilterResourceTypeId(existingType.getId());
-
- //Use CriteriaQuery to automatically chunk/page through criteria query results
- CriteriaQueryExecutor<MeasurementDefinition, MeasurementDefinitionCriteria> queryExecutor = new CriteriaQueryExecutor<MeasurementDefinition, MeasurementDefinitionCriteria>() {
- @Override
- public PageList<MeasurementDefinition> execute(MeasurementDefinitionCriteria criteria) {
- return measurementDefinitionMgr
- .findMeasurementDefinitionsByCriteria(subjectMgr.getOverlord(), criteria);
- }
- };
-
- CriteriaQuery<MeasurementDefinition, MeasurementDefinitionCriteria> definitions = new CriteriaQuery<MeasurementDefinition, MeasurementDefinitionCriteria>(
- criteria, queryExecutor);
+ criteria.setRestriction(COLLECTION_ONLY);
// Remove the type's metric definitions. We do this separately, rather than just relying on cascade
// upon deletion of the ResourceType, because the removeMeasurementDefinition() will also take care
// of removing any associated schedules and those schedules' OOBs.
- if (definitions != null) {
- Iterator<MeasurementDefinition> defIter = definitions.iterator();
- while (defIter.hasNext()) {
- MeasurementDefinition def = defIter.next();
- measurementDefinitionMgr.removeMeasurementDefinition(def);
- defIter.remove();
+ List<MeasurementDefinition> definitions = Collections.emptyList();
+ do {
+ for (MeasurementDefinition definition : definitions) {
+ measurementDefinitionMgr.removeMeasurementDefinition(definition);
}
- }
+ definitions = measurementDefinitionMgr.findMeasurementDefinitionsByCriteria(subjectMgr.getOverlord(),
+ criteria);
+ } while (!definitions.isEmpty());
}
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/PurgePluginsJob.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/PurgePluginsJob.java
index 79e49b7..6aa3517 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/PurgePluginsJob.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/PurgePluginsJob.java
@@ -1,3 +1,22 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2013 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
package org.rhq.enterprise.server.scheduler.jobs;
import java.util.ArrayList;
@@ -19,8 +38,7 @@ import org.rhq.enterprise.server.util.LookupUtil;
* already been purged. Puring resource types is performed by {@link PurgeResourceTypesJob}.
*/
public class PurgePluginsJob extends AbstractStatefulJob {
-
- private static final Log log = LogFactory.getLog(PurgePluginsJob.class);
+ private static final Log LOG = LogFactory.getLog(PurgePluginsJob.class);
@Override
public void executeJobCode(JobExecutionContext context) throws JobExecutionException {
@@ -30,14 +48,18 @@ public class PurgePluginsJob extends AbstractStatefulJob {
for (Plugin plugin : plugins) {
if (pluginMgr.isReadyForPurge(plugin)) {
- log.debug("Preparing to purge plugin [" + plugin.getName() + "]");
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Preparing to purge plugin [" + plugin.getName() + "]");
+ }
pluginsToPurge.add(plugin);
}
}
if (!pluginsToPurge.isEmpty()) {
pluginMgr.purgePlugins(pluginsToPurge);
- log.debug("Purged " + pluginsToPurge.size() + " plugins");
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Purged " + pluginsToPurge.size() + " plugins");
+ }
}
}
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/PurgeResourceTypesJob.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/PurgeResourceTypesJob.java
index febeac2..7b24454 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/PurgeResourceTypesJob.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/PurgeResourceTypesJob.java
@@ -1,16 +1,37 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2013 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
package org.rhq.enterprise.server.scheduler.jobs;
+import java.util.List;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
+
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.enterprise.server.inventory.InventoryManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
-import java.util.List;
-
public class PurgeResourceTypesJob extends AbstractStatefulJob {
+ private static final Log LOG = LogFactory.getLog(PurgeResourceTypesJob.class);
private static class DeletionStats {
int numDeleted;
@@ -22,8 +43,6 @@ public class PurgeResourceTypesJob extends AbstractStatefulJob {
}
}
- private static final Log log = LogFactory.getLog(PurgeResourceTypesJob.class);
-
@Override
public void executeJobCode(JobExecutionContext context) throws JobExecutionException {
InventoryManagerLocal inventoryMgr = LookupUtil.getInventoryManager();
@@ -33,20 +52,25 @@ public class PurgeResourceTypesJob extends AbstractStatefulJob {
List<ResourceType> deletedTypes = inventoryMgr.getDeletedTypes();
for (ResourceType deletedType : deletedTypes) {
if (inventoryMgr.isReadyForPermanentRemoval(deletedType)) {
- log.debug("Permanently removing " + deletedType);
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Permanently removing " + deletedType);
+ }
long startTime = System.currentTimeMillis();
inventoryMgr.purgeDeletedResourceType(deletedType);
long endTime = System.currentTimeMillis();
stats.numDeleted++;
- log.debug("Deleted " + deletedType + " in " + (endTime - startTime) + " ms");
- }
- else {
- log.debug(deletedType + " has been deleted but is not yet ready for permanent removal.");
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Deleted " + deletedType + " in " + (endTime - startTime) + " ms");
+ }
+ } else {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug(deletedType + " has been deleted but is not yet ready for permanent removal.");
+ }
}
}
long stopTotalTime = System.currentTimeMillis();
stats.deletionTime = stopTotalTime - startTotalTime;
- log.debug(stats);
+ LOG.debug(stats);
}