You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rg...@apache.org on 2016/10/15 21:21:37 UTC
svn commit: r1765110 - in /qpid/java/trunk/broker-core/src:
main/java/org/apache/qpid/server/configuration/store/
main/java/org/apache/qpid/server/store/
test/java/org/apache/qpid/server/configuration/store/
Author: rgodfrey
Date: Sat Oct 15 21:21:37 2016
New Revision: 1765110
URL: http://svn.apache.org/viewvc?rev=1765110&view=rev
Log:
QPID-7460 : Improve Json config store performance
Modified:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/configuration/store/StoreConfigurationChangeListener.java
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/store/JsonFileConfigStore.java
qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/configuration/store/StoreConfigurationChangeListenerTest.java
Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/configuration/store/StoreConfigurationChangeListener.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/configuration/store/StoreConfigurationChangeListener.java?rev=1765110&r1=1765109&r2=1765110&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/configuration/store/StoreConfigurationChangeListener.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/configuration/store/StoreConfigurationChangeListener.java Sat Oct 15 21:21:37 2016
@@ -24,6 +24,7 @@ import java.util.Collection;
import org.apache.qpid.server.model.ConfigurationChangeListener;
import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.Model;
import org.apache.qpid.server.model.State;
import org.apache.qpid.server.store.DurableConfigurationStore;
@@ -58,18 +59,24 @@ public class StoreConfigurationChangeLis
{
if(object.isDurable() && child.isDurable())
{
- child.addChangeListener(this);
- _store.update(true, child.asObjectRecord());
+ Model model = child.getModel();
+ Collection<Class<? extends ConfiguredObject>> parentTypes =
+ model.getParentTypes(child.getCategoryClass());
+ if(parentTypes.size() == 1 || parentTypes.iterator().next().equals(object.getCategoryClass()))
+ {
+ child.addChangeListener(this);
+ _store.update(true, child.asObjectRecord());
- Class<? extends ConfiguredObject> categoryClass = child.getCategoryClass();
- Collection<Class<? extends ConfiguredObject>> childTypes =
- child.getModel().getChildTypes(categoryClass);
+ Class<? extends ConfiguredObject> categoryClass = child.getCategoryClass();
+ Collection<Class<? extends ConfiguredObject>> childTypes =
+ model.getChildTypes(categoryClass);
- for (Class<? extends ConfiguredObject> childClass : childTypes)
- {
- for (ConfiguredObject<?> grandchild : child.getChildren(childClass))
+ for (Class<? extends ConfiguredObject> childClass : childTypes)
{
- childAdded(child, grandchild);
+ for (ConfiguredObject<?> grandchild : child.getChildren(childClass))
+ {
+ childAdded(child, grandchild);
+ }
}
}
}
Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/store/JsonFileConfigStore.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/store/JsonFileConfigStore.java?rev=1765110&r1=1765109&r2=1765110&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/store/JsonFileConfigStore.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/store/JsonFileConfigStore.java Sat Oct 15 21:21:37 2016
@@ -33,6 +33,9 @@ import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeMap;
+import java.util.TreeSet;
import java.util.UUID;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -298,13 +301,59 @@ public class JsonFileConfigStore extends
}
else
{
- data = build(_rootClass, rootId);
+ data = build(_rootClass, rootId, createChildMap());
}
save(data);
}
- private Map<String, Object> build(final Class<? extends ConfiguredObject> type, final UUID id)
+ private HashMap<UUID, Map<String, SortedSet<ConfiguredObjectRecord>>> createChildMap()
+ {
+ Model model = _parent.getModel();
+ HashMap<UUID, Map<String, SortedSet<ConfiguredObjectRecord>>> map = new HashMap<>();
+
+ for(ConfiguredObjectRecord record : _objectsById.values())
+ {
+ int parentCount = record.getParents().size();
+ if (parentCount == 0)
+ {
+ continue;
+ }
+ Collection<Class<? extends ConfiguredObject>> parentTypes =
+ model.getParentTypes(_classNameMapping.get(record.getType()));
+ if (parentTypes != null && !parentTypes.isEmpty())
+ {
+
+ final Class<? extends ConfiguredObject> primaryParentCategory =
+ parentTypes.iterator().next();
+
+ String parentCategoryName = primaryParentCategory.getSimpleName();
+
+ UUID parentId = record.getParents().get(parentCategoryName);
+
+ if (parentId != null)
+ {
+ Map<String, SortedSet<ConfiguredObjectRecord>> childMap = map.get(parentId);
+ if (childMap == null)
+ {
+ childMap = new TreeMap<>();
+ map.put(parentId, childMap);
+ }
+ SortedSet<ConfiguredObjectRecord> children = childMap.get(record.getType());
+ if (children == null)
+ {
+ children = new TreeSet<>(CONFIGURED_OBJECT_RECORD_COMPARATOR);
+ childMap.put(record.getType(), children);
+ }
+ children.add(record);
+ }
+ }
+ }
+ return map;
+ }
+
+ private Map<String, Object> build(final Class<? extends ConfiguredObject> type, final UUID id,
+ Map<UUID, Map<String, SortedSet<ConfiguredObjectRecord>>> childMap)
{
ConfiguredObjectRecord record = _objectsById.get(id);
Map<String,Object> map = new LinkedHashMap<String, Object>();
@@ -332,41 +381,24 @@ public class JsonFileConfigStore extends
Collections.sort(childClasses, CATEGORY_CLASS_COMPARATOR);
- for(Class<? extends ConfiguredObject> childClass : childClasses)
+ final Map<String, SortedSet<ConfiguredObjectRecord>> allChildren = childMap.get(id);
+ if(allChildren != null && !allChildren.isEmpty())
{
- // only add if this is the "first" parent
- if(_parent.getModel().getParentTypes(childClass).iterator().next() == type)
+ for(Map.Entry<String, SortedSet<ConfiguredObjectRecord>> entry : allChildren.entrySet())
{
- String singularName = childClass.getSimpleName().toLowerCase();
+ String singularName = entry.getKey().toLowerCase();
String attrName = singularName + (singularName.endsWith("s") ? "es" : "s");
- List<UUID> childIds = _idsByType.get(childClass.getSimpleName());
- if(childIds != null)
- {
- List<Map<String,Object>> entities = new ArrayList<Map<String, Object>>();
- List<ConfiguredObjectRecord> sortedChildren = new ArrayList<>();
- for(UUID childId : childIds)
- {
- ConfiguredObjectRecord childRecord = _objectsById.get(childId);
-
- final UUID parent = childRecord.getParents().get(type.getSimpleName());
- String parentId = parent.toString();
- if(id.toString().equals(parentId))
- {
- sortedChildren.add(childRecord);
- }
- }
+ final SortedSet<ConfiguredObjectRecord> sortedChildren = entry.getValue();
+ List<Map<String,Object>> entities = new ArrayList<Map<String, Object>>();
- Collections.sort(sortedChildren, CONFIGURED_OBJECT_RECORD_COMPARATOR);
-
- for(ConfiguredObjectRecord childRecord : sortedChildren)
- {
- entities.add(build(childClass, childRecord.getId()));
- }
+ for(ConfiguredObjectRecord childRecord : sortedChildren)
+ {
+ entities.add(build(_classNameMapping.get(entry.getKey()), childRecord.getId(), childMap));
+ }
- if(!entities.isEmpty())
- {
- map.put(attrName,entities);
- }
+ if(!entities.isEmpty())
+ {
+ map.put(attrName,entities);
}
}
}
Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/configuration/store/StoreConfigurationChangeListenerTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/configuration/store/StoreConfigurationChangeListenerTest.java?rev=1765110&r1=1765109&r2=1765110&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/configuration/store/StoreConfigurationChangeListenerTest.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/configuration/store/StoreConfigurationChangeListenerTest.java Sat Oct 15 21:21:37 2016
@@ -75,6 +75,7 @@ public class StoreConfigurationChangeLis
when(child.getCategoryClass()).thenReturn(VirtualHost.class);
Model model = mock(Model.class);
when(model.getChildTypes(any(Class.class))).thenReturn(Collections.<Class<? extends ConfiguredObject>>emptyList());
+ when(model.getParentTypes(eq(VirtualHost.class))).thenReturn(Collections.<Class<? extends ConfiguredObject>>singleton(Broker.class));
when(child.getModel()).thenReturn(model);
when(child.isDurable()).thenReturn(true);
_listener.childAdded(broker, child);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org