modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/discovery/DiscoveryServerService.java
| 1
modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
| 46 +++++++---
2 files changed, 37 insertions(+), 10 deletions(-)
New commits:
commit f16bf96fe7491e146fe9117aaf623d551f4b1102
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Jan 30 16:08:21 2013 -0500
[BZ 902406] this doesn't work. the getResources call with "false" means
we don't get the children, which we need to recursively process the tree
diff --git
a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
index eaca661..56a372e 100644
---
a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
+++
b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/inventory/InventoryManager.java
@@ -30,10 +30,12 @@ import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.IdentityHashMap;
+import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.Callable;
@@ -2822,13 +2824,16 @@ public class InventoryManager extends AgentService implements
ContainerService,
if (log.isDebugEnabled()) {
log.debug("Merging [" + modifiedResourceIds.size() + "]
modified Resources into local inventory...");
}
- Set<Resource> modifiedResources =
configuration.getServerServices().getDiscoveryServerService()
- .getResources(modifiedResourceIds, false);
- syncSchedules(modifiedResources); // RHQ-792, mtime is the indicator that
schedules should be sync'ed too
- syncDriftDefinitions(modifiedResources);
- for (Resource modifiedResource : modifiedResources) {
- mergeResource(modifiedResource);
+ if (!modifiedResourceIds.isEmpty()) {
+ Set<Resource> modifiedResources =
configuration.getServerServices().getDiscoveryServerService()
+ .getResources(modifiedResourceIds, false);
+ syncSchedules(modifiedResources); // RHQ-792, mtime is the indicator that
schedules should be sync'ed too
+ syncDriftDefinitions(modifiedResources);
+ for (Resource modifiedResource : modifiedResources) {
+ mergeResource(modifiedResource);
+ }
}
+ return;
}
private void mergeUnknownResources(Set<Integer> unknownResourceIds) {
@@ -2839,13 +2844,15 @@ public class InventoryManager extends AgentService implements
ContainerService,
if (!unknownResourceIds.isEmpty()) {
PluginMetadataManager pmm = this.pluginManager.getMetadataManager();
+ DiscoveryServerService dss =
configuration.getServerServices().getDiscoveryServerService();
+ Set<Resource> unknownResources = dss.getResources(unknownResourceIds,
false);
- Set<Resource> unknownResources =
configuration.getServerServices().getDiscoveryServerService()
- .getResources(unknownResourceIds, true);
+ Map<Integer, Set<Integer>> childrenIdsOfUnknownResources;
+ childrenIdsOfUnknownResources = new HashMap<Integer,
Set<Integer>>(unknownResources.size());
Set<Integer> toBeIgnored = new HashSet<Integer>();
-
for (Resource unknownResource : unknownResources) {
+ // merge all the unknown resources (note: we aren't doing the
children)
ResourceType resourceType =
pmm.getType(unknownResource.getResourceType());
if (resourceType != null) {
mergeResource(unknownResource);
@@ -2858,9 +2865,28 @@ public class InventoryManager extends AgentService implements
ContainerService,
+ "] but its type is disabled in the agent; ignoring
it");
}
}
- }
+ // get all the children IDs of the unknown resources we just merged
+ Set<Resource> unknownChildren =
unknownResource.getChildResources();
+ Set<Integer> unknownChildrenIds = new
HashSet<Integer>(unknownChildren.size());
+ for (Resource unknownChild : unknownChildren) {
+ unknownChildrenIds.add(unknownChild.getId());
+ }
+ childrenIdsOfUnknownResources.put(unknownResource.getId(),
unknownChildrenIds);
+ unknownChildren.clear(); // help GC
+ }
unknownResourceIds.removeAll(toBeIgnored);
+
+ // now, do it again recursively so we merge the children
+ Set<Entry<Integer, Set<Integer>>> entrySet =
childrenIdsOfUnknownResources.entrySet();
+ Iterator<Entry<Integer, Set<Integer>>> entrySetIterator =
entrySet.iterator();
+ while (entrySetIterator.hasNext()) {
+ Entry<Integer, Set<Integer>> entry =
entrySetIterator.next();
+ Set<Integer> unknownChildrenIds = entry.getValue();
+ entrySetIterator.remove(); // help GC
+ mergeUnknownResources(unknownChildrenIds);
+ unknownChildrenIds.clear(); // help GC
+ }
}
return;
}
commit abda69f79c03cfe996c2bb3d959647a6829d43b8
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Jan 30 16:07:44 2013 -0500
[BZ 902406] we need to have a limit on getResources since it is a major part of the
inventory sync and can be expensive
diff --git
a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/discovery/DiscoveryServerService.java
b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/discovery/DiscoveryServerService.java
index 6b2fba6..52da745 100644
---
a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/discovery/DiscoveryServerService.java
+++
b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/discovery/DiscoveryServerService.java
@@ -90,6 +90,7 @@ public interface DiscoveryServerService {
* @param includeDescendants
* @return a tree of resources with the latest data
*/
+ @LimitedConcurrency(CONCURRENCY_LIMIT_INVENTORY_SYNC)
Set<Resource> getResources(Set<Integer> resourceIds, boolean
includeDescendants);
/**
Show replies by date