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@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); }
rhq-commits@lists.fedorahosted.org