Author: rgodfrey
Date: Fri May 15 14:12:31 2015
New Revision: 1679569

URL: http://svn.apache.org/r1679569
Log:
QPID-6543 : Coalesce multi attribute updates into single store write (applied 
patch by Lorenz Quack)

Modified:
    
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/NoopConfigurationChangeListener.java
    
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/model/AbstractConfiguredObject.java
    
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfigurationChangeListener.java
    
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java
    
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/TrustStoreMessageSource.java
    
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/TrustStoreMessageSourceCreator.java
    
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecoverer.java
    
qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java
    
qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerSession.java
    
qpid/java/trunk/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQChannel.java
    
qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Session_1_0.java
    
qpid/java/trunk/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java
    
qpid/java/trunk/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/mbeans/VirtualHostMBean.java

Modified: 
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/NoopConfigurationChangeListener.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/NoopConfigurationChangeListener.java?rev=1679569&r1=1679568&r2=1679569&view=diff
==============================================================================
--- 
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/NoopConfigurationChangeListener.java
 (original)
+++ 
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/NoopConfigurationChangeListener.java
 Fri May 15 14:12:31 2015
@@ -50,4 +50,16 @@ public class NoopConfigurationChangeList
                              Object newAttributeValue)
     {
     }
+
+    @Override
+    public void bulkChangeStart(final ConfiguredObject<?> object)
+    {
+
+    }
+
+    @Override
+    public void bulkChangeEnd(final ConfiguredObject<?> object)
+    {
+
+    }
 }

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=1679569&r1=1679568&r2=1679569&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
 Fri May 15 14:12:31 2015
@@ -30,6 +30,7 @@ import org.apache.qpid.server.store.Dura
 public class StoreConfigurationChangeListener implements 
ConfigurationChangeListener
 {
     private final DurableConfigurationStore _store;
+    private boolean _bulkChanges = false;
 
     public StoreConfigurationChangeListener(DurableConfigurationStore store)
     {
@@ -77,6 +78,22 @@ public class StoreConfigurationChangeLis
     }
 
     @Override
+    public void bulkChangeStart(final ConfiguredObject<?> object)
+    {
+        _bulkChanges = true;
+    }
+
+    @Override
+    public void bulkChangeEnd(final ConfiguredObject<?> object)
+    {
+        if (object.isDurable() && _bulkChanges)
+        {
+            _store.update(false, object.asObjectRecord());
+        }
+        _bulkChanges = false;
+    }
+
+    @Override
     public void childRemoved(ConfiguredObject object, ConfiguredObject child)
     {
         if(child.isDurable())
@@ -89,7 +106,7 @@ public class StoreConfigurationChangeLis
     @Override
     public void attributeSet(ConfiguredObject object, String attributeName, 
Object oldAttributeValue, Object newAttributeValue)
     {
-        if(object.isDurable())
+        if (object.isDurable() && !_bulkChanges)
         {
             _store.update(false, object.asObjectRecord());
         }

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java?rev=1679569&r1=1679568&r2=1679569&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
 Fri May 15 14:12:31 2015
@@ -2105,24 +2105,57 @@ public abstract class AbstractConfigured
         }
     }
 
+    private void bulkChangeStart()
+    {
+        synchronized (_changeListeners)
+        {
+            List<ConfigurationChangeListener> copy = new 
ArrayList<ConfigurationChangeListener>(_changeListeners);
+            for(ConfigurationChangeListener listener : copy)
+            {
+                listener.bulkChangeStart(this);
+            }
+        }
+    }
+
+    private void bulkChangeEnd()
+    {
+        synchronized (_changeListeners)
+        {
+            List<ConfigurationChangeListener> copy = new 
ArrayList<ConfigurationChangeListener>(_changeListeners);
+            for(ConfigurationChangeListener listener : copy)
+            {
+                listener.bulkChangeEnd(this);
+            }
+        }
+    }
+
     protected void changeAttributes(final Map<String, Object> attributes)
     {
         Collection<String> names = getAttributeNames();
-        for (String name : names)
+        try
         {
-            if (attributes.containsKey(name))
+            bulkChangeStart();
+            for (Map.Entry<String, Object> entry : attributes.entrySet())
             {
-                Object desired = attributes.get(name);
-                Object expected = getAttribute(name);
-                Object currentValue = _attributes.get(name);
-                if(((currentValue != null && !currentValue.equals(desired))
-                     || (currentValue == null && desired != null))
-                    && changeAttribute(name, expected, desired))
+                String attributeName = entry.getKey();
+                if (names.contains(attributeName))
                 {
-                    attributeSet(name, expected, desired);
+                    Object desired = entry.getValue();
+                    Object expected = getAttribute(attributeName);
+                    Object currentValue = _attributes.get(attributeName);
+                    if (((currentValue != null && 
!currentValue.equals(desired))
+                         || (currentValue == null && desired != null))
+                        && changeAttribute(attributeName, expected, desired))
+                    {
+                        attributeSet(attributeName, expected, desired);
+                    }
                 }
             }
         }
+        finally
+        {
+            bulkChangeEnd();
+        }
     }
 
     protected void validateChange(final ConfiguredObject<?> 
proxyForValidation, final Set<String> changedAttributes)

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfigurationChangeListener.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfigurationChangeListener.java?rev=1679569&r1=1679568&r2=1679569&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfigurationChangeListener.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfigurationChangeListener.java
 Fri May 15 14:12:31 2015
@@ -36,4 +36,26 @@ public interface ConfigurationChangeList
     void childRemoved(ConfiguredObject<?> object, ConfiguredObject<?> child);
 
     void attributeSet(ConfiguredObject<?> object, String attributeName, Object 
oldAttributeValue, Object newAttributeValue);
+
+    /**
+     * Inform the listener that several attributes of an object are about to 
change.
+     *
+     * The listener may choose to defer any action in attributeSet until 
bulkChangeEnd is called.
+     * There should not be multiple calls to bulkChangeStart without matching 
bulkChangeEnd calls in between.
+     * There should be no calls to attributeSet for objects other than the one 
passed as an argument until bulkChangeEnd is called.
+     * There should be no call to childRemove between bulkChangeStart/-End 
calls.
+     * @param object the object whose state is about to change
+     * @see #bulkChangeEnd
+     */
+    void bulkChangeStart(ConfiguredObject<?> object);
+
+    /**
+     * Inform the listener that the changes announced by bulkChangeStart are 
complete.
+     *
+     * The listener who has chosen to defer any action in attributeSet after 
bulkChangeStart was called should now act on those changes.
+     * A call to bulkChangeEnd without a prior matching call to 
bulkChangeStart should have no effect.
+     * @param object the object whose state has changed
+     * @see #bulkChangeStart
+     */
+    void bulkChangeEnd(ConfiguredObject<?> object);
 }

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java?rev=1679569&r1=1679568&r2=1679569&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java
 Fri May 15 14:12:31 2015
@@ -3166,6 +3166,18 @@ public abstract class AbstractQueue<X ex
         {
 
         }
+
+        @Override
+        public void bulkChangeStart(final ConfiguredObject<?> object)
+        {
+
+        }
+
+        @Override
+        public void bulkChangeEnd(final ConfiguredObject<?> object)
+        {
+
+        }
     }
 
     private static class EnqueueRequest

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/TrustStoreMessageSource.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/TrustStoreMessageSource.java?rev=1679569&r1=1679568&r2=1679569&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/TrustStoreMessageSource.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/TrustStoreMessageSource.java
 Fri May 15 14:12:31 2015
@@ -95,6 +95,18 @@ public class TrustStoreMessageSource ext
             {
                 updateCertCache();
             }
+
+            @Override
+            public void bulkChangeStart(final ConfiguredObject<?> object)
+            {
+
+            }
+
+            @Override
+            public void bulkChangeEnd(final ConfiguredObject<?> object)
+            {
+
+            }
         });
         if(_trustStore.getState() == State.ACTIVE)
         {

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/TrustStoreMessageSourceCreator.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/TrustStoreMessageSourceCreator.java?rev=1679569&r1=1679568&r2=1679569&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/TrustStoreMessageSourceCreator.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/TrustStoreMessageSourceCreator.java
 Fri May 15 14:12:31 2015
@@ -99,6 +99,18 @@ public class TrustStoreMessageSourceCrea
             {
 
             }
+
+            @Override
+            public void bulkChangeStart(final ConfiguredObject<?> object)
+            {
+
+            }
+
+            @Override
+            public void bulkChangeEnd(final ConfiguredObject<?> object)
+            {
+
+            }
         });
     }
 
@@ -169,5 +181,17 @@ public class TrustStoreMessageSourceCrea
         {
             updateTrustStoreSourceRegistration(_registry, 
(TrustStore<?>)object);
         }
+
+        @Override
+        public void bulkChangeStart(final ConfiguredObject<?> object)
+        {
+
+        }
+
+        @Override
+        public void bulkChangeEnd(final ConfiguredObject<?> object)
+        {
+
+        }
     }
 }

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecoverer.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecoverer.java?rev=1679569&r1=1679568&r2=1679569&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecoverer.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecoverer.java
 Fri May 15 14:12:31 2015
@@ -608,6 +608,18 @@ public class VirtualHostStoreUpgraderAnd
             {
 
             }
+
+            @Override
+            public void bulkChangeStart(final ConfiguredObject<?> object)
+            {
+
+            }
+
+            @Override
+            public void bulkChangeEnd(final ConfiguredObject<?> object)
+            {
+
+            }
         });
     }
 

Modified: 
qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java?rev=1679569&r1=1679568&r2=1679569&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/singleton/AbstractConfiguredObjectTest.java
 Fri May 15 14:12:31 2015
@@ -559,5 +559,17 @@ public class AbstractConfiguredObjectTes
                                  final Object newAttributeValue)
         {
         }
+
+        @Override
+        public void bulkChangeStart(final ConfiguredObject<?> object)
+        {
+
+        }
+
+        @Override
+        public void bulkChangeEnd(final ConfiguredObject<?> object)
+        {
+
+        }
     }
 }

Modified: 
qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerSession.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerSession.java?rev=1679569&r1=1679568&r2=1679569&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerSession.java
 (original)
+++ 
qpid/java/trunk/broker-plugins/amqp-0-10-protocol/src/main/java/org/apache/qpid/server/protocol/v0_10/ServerSession.java
 Fri May 15 14:12:31 2015
@@ -1217,5 +1217,17 @@ public class ServerSession extends Sessi
         {
 
         }
+
+        @Override
+        public void bulkChangeStart(final ConfiguredObject<?> object)
+        {
+
+        }
+
+        @Override
+        public void bulkChangeEnd(final ConfiguredObject<?> object)
+        {
+
+        }
     }
 }

Modified: 
qpid/java/trunk/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQChannel.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQChannel.java?rev=1679569&r1=1679568&r2=1679569&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQChannel.java
 (original)
+++ 
qpid/java/trunk/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQChannel.java
 Fri May 15 14:12:31 2015
@@ -1920,6 +1920,18 @@ public class AMQChannel
         {
 
         }
+
+        @Override
+        public void bulkChangeStart(final ConfiguredObject<?> object)
+        {
+
+        }
+
+        @Override
+        public void bulkChangeEnd(final ConfiguredObject<?> object)
+        {
+
+        }
     }
 
     private void consumerAdded(final Consumer<?> consumer)

Modified: 
qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Session_1_0.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Session_1_0.java?rev=1679569&r1=1679568&r2=1679569&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Session_1_0.java
 (original)
+++ 
qpid/java/trunk/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Session_1_0.java
 Fri May 15 14:12:31 2015
@@ -958,5 +958,17 @@ public class Session_1_0 implements Sess
         {
 
         }
+
+        @Override
+        public void bulkChangeStart(final ConfiguredObject<?> object)
+        {
+
+        }
+
+        @Override
+        public void bulkChangeEnd(final ConfiguredObject<?> object)
+        {
+
+        }
     }
 }

Modified: 
qpid/java/trunk/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java?rev=1679569&r1=1679568&r2=1679569&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java
 Fri May 15 14:12:31 2015
@@ -522,6 +522,18 @@ public class JMXManagementPluginImpl
                 createObjectMBeans(object);
             }
         }
+
+        @Override
+        public void bulkChangeStart(final ConfiguredObject<?> object)
+        {
+
+        }
+
+        @Override
+        public void bulkChangeEnd(final ConfiguredObject<?> object)
+        {
+
+        }
     }
 
 }

Modified: 
qpid/java/trunk/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/mbeans/VirtualHostMBean.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/mbeans/VirtualHostMBean.java?rev=1679569&r1=1679568&r2=1679569&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/mbeans/VirtualHostMBean.java
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/mbeans/VirtualHostMBean.java
 Fri May 15 14:12:31 2015
@@ -265,4 +265,15 @@ public class VirtualHostMBean extends AM
         // no-op
     }
 
+    @Override
+    public void bulkChangeStart(final ConfiguredObject<?> object)
+    {
+
+    }
+
+    @Override
+    public void bulkChangeEnd(final ConfiguredObject<?> object)
+    {
+
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to