You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by lq...@apache.org on 2016/09/29 12:05:30 UTC

svn commit: r1762758 - in /qpid/java/trunk: broker-codegen/src/main/java/org/apache/qpid/server/model/ broker-core/src/main/java/org/apache/qpid/server/model/ broker-core/src/main/java/org/apache/qpid/server/security/ broker-core/src/main/java/org/apac...

Author: lquack
Date: Thu Sep 29 12:05:30 2016
New Revision: 1762758

URL: http://svn.apache.org/viewvc?rev=1762758&view=rev
Log:
QPID-7438: [Java Broker] Adjust which ManagedOperations are executed on the config thread

Modified:
    qpid/java/trunk/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryGenerator.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SiteSpecificTrustStore.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SiteSpecificTrustStoreImpl.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
    qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AbstractCommonRuleBasedAccessControlProvider.java

Modified: qpid/java/trunk/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryGenerator.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryGenerator.java?rev=1762758&r1=1762757&r2=1762758&view=diff
==============================================================================
--- qpid/java/trunk/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryGenerator.java (original)
+++ qpid/java/trunk/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryGenerator.java Thu Sep 29 12:05:30 2016
@@ -24,8 +24,10 @@ import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.io.StringWriter;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -325,6 +327,7 @@ public class ConfiguredObjectFactoryGene
                    + boxedReturnTypeName
                    + ">, RuntimeException>()");
         pw.println("            {");
+        pw.println("                private String _args;");
         pw.println("                @Override");
         pw.println("                public ListenableFuture<"
                    + boxedReturnTypeName
@@ -364,7 +367,28 @@ public class ConfiguredObjectFactoryGene
         pw.println("                @Override");
         pw.println("                public String getArguments()");
         pw.println("                {");
-        pw.println("                    return null;");
+        if (!methodElement.getParameters().isEmpty())
+        {
+            pw.println("                    if (_args == null)");
+            pw.println("                    {");
+            boolean first = true;
+            String args = "_args = ";
+            for (VariableElement param : methodElement.getParameters())
+            {
+                if (!first)
+                {
+                    args += " + \",\" + ";
+                }
+                else
+                {
+                    first = false;
+                }
+                args += "\"" + getParamName(param) + "=\" + " + getParamName(param);
+            }
+            pw.println("                        " + args + ";");
+            pw.println("                    }");
+        }
+        pw.println("                    return _args;");
         pw.println("                }");
 
         pw.println("            }));");

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java?rev=1762758&r1=1762757&r2=1762758&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java Thu Sep 29 12:05:30 2016
@@ -228,12 +228,12 @@ public interface VirtualHost<X extends V
     @ManagedOperation(nonModifying = true,
             description = "Extract message store content",
             secure = true,
-            changesConfiguredObjectState = true)
+            changesConfiguredObjectState = false)
     Content exportMessageStore();
 
     @ManagedOperation(description = "Import message store content",
             secure = true,
-            changesConfiguredObjectState = true)
+            changesConfiguredObjectState = false)
     void importMessageStore(@Param(name="source", description = "Extract file")String source);
 
 

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SiteSpecificTrustStore.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SiteSpecificTrustStore.java?rev=1762758&r1=1762757&r2=1762758&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SiteSpecificTrustStore.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SiteSpecificTrustStore.java Thu Sep 29 12:05:30 2016
@@ -59,6 +59,6 @@ public interface SiteSpecificTrustStore<
     Date getCertificateValidUntilDate();
 
     @ManagedOperation(description = "Re-download the certificate from the URL",
-            changesConfiguredObjectState = false)
+            changesConfiguredObjectState = false /* This should really be true but pragmatically it is set to false because we do not want to block the config thread while getting the certificate from the remote host */)
     void refreshCertificate();
 }

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SiteSpecificTrustStoreImpl.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SiteSpecificTrustStoreImpl.java?rev=1762758&r1=1762757&r2=1762758&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SiteSpecificTrustStoreImpl.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SiteSpecificTrustStoreImpl.java Thu Sep 29 12:05:30 2016
@@ -31,6 +31,7 @@ import java.security.cert.CertificateFac
 import java.security.cert.X509Certificate;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -45,6 +46,8 @@ import javax.xml.bind.DatatypeConverter;
 
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
+
+import org.apache.qpid.server.configuration.updater.Task;
 import org.apache.qpid.server.logging.EventLogger;
 import org.apache.qpid.server.logging.messages.TrustStoreMessages;
 import org.slf4j.Logger;
@@ -88,7 +91,7 @@ public class SiteSpecificTrustStoreImpl
     private volatile TrustManager[] _trustManagers = new TrustManager[0];
 
 
-    private X509Certificate _x509Certificate;
+    private volatile X509Certificate _x509Certificate;
 
     @ManagedObjectFactoryConstructor
     public SiteSpecificTrustStoreImpl(final Map<String, Object> attributes, Broker<?> broker)
@@ -231,11 +234,36 @@ public class SiteSpecificTrustStoreImpl
                 final Certificate[] certificateChain = socket.getSession().getPeerCertificates();
                 if (certificateChain != null && certificateChain.length != 0 && certificateChain[0] instanceof X509Certificate)
                 {
-                    _x509Certificate = (X509Certificate) certificateChain[0];
-
-                    final String certificate = getCertificate();
-                    attributeSet(CERTIFICATE, certificate, certificate);
-
+                    runTask(new Task<Void, RuntimeException>()
+                    {
+                        @Override
+                        public Void execute() throws RuntimeException
+                        {
+                            _x509Certificate = (X509Certificate) certificateChain[0];
+
+                            final String certificate = getCertificate();
+                            attributeSet(CERTIFICATE, certificate, certificate);
+                            return null;
+                        }
+
+                        @Override
+                        public String getObject()
+                        {
+                            return SiteSpecificTrustStoreImpl.this.getName();
+                        }
+
+                        @Override
+                        public String getAction()
+                        {
+                            return "downloadCertificate";
+                        }
+
+                        @Override
+                        public String getArguments()
+                        {
+                            return null;
+                        }
+                    });
                 }
                 else
                 {

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java?rev=1762758&r1=1762757&r2=1762758&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java Thu Sep 29 12:05:30 2016
@@ -862,23 +862,43 @@ public abstract class AbstractVirtualHos
     }
 
     @Override
-    public Map<String, Object> exportConfig(boolean includeSecureAttributes)
+    public Map<String, Object> exportConfig(final boolean includeSecureAttributes)
     {
-        return (new ConfigurationExtractor()).extractConfig(this, includeSecureAttributes);
+        return doSync(doOnConfigThread(new Task<ListenableFuture<Map<String,Object>>, RuntimeException>()
+        {
+            @Override
+            public ListenableFuture<Map<String, Object>> execute() throws RuntimeException
+            {
+                ConfigurationExtractor configExtractor = new ConfigurationExtractor();
+                Map<String, Object> config = configExtractor.extractConfig(AbstractVirtualHost.this,
+                                                                           includeSecureAttributes);
+                return Futures.immediateFuture(config);
+            }
+
+            @Override
+            public String getObject()
+            {
+                return AbstractVirtualHost.this.toString();
+            }
+
+            @Override
+            public String getAction()
+            {
+                return "exportConfig";
+            }
+
+            @Override
+            public String getArguments()
+            {
+                return "includeSecureAttributes=" + String.valueOf(includeSecureAttributes);
+            }
+        }));
     }
 
     @Override
     public Content exportMessageStore()
     {
-        if(getState() == State.STOPPED)
-        {
-            return new MessageStoreContent();
-        }
-        else
-        {
-            throw new IllegalArgumentException("The extractMessageStore operation can only be called when the virtual host is stopped");
-        }
-
+        return new MessageStoreContent();
     }
 
     private class MessageStoreContent implements Content, CustomRestHeaders
@@ -887,32 +907,68 @@ public abstract class AbstractVirtualHos
         @Override
         public void write(final OutputStream outputStream) throws IOException
         {
-            _messageStore.openMessageStore(AbstractVirtualHost.this);
-            final Map<UUID, String> queueMap = new HashMap<>();
-            getDurableConfigurationStore().reload(new ConfiguredObjectRecordHandler()
+            doSync(doOnConfigThread(new Task<ListenableFuture<Void>, IOException>()
             {
                 @Override
-                public void handle(final ConfiguredObjectRecord record)
+                public ListenableFuture<Void> execute() throws IOException
                 {
-                    if(record.getType().equals(Queue.class.getSimpleName()))
+                    if (getState() != State.STOPPED)
                     {
-                        queueMap.put(record.getId(), (String) record.getAttributes().get(ConfiguredObject.NAME));
+                        throw new IllegalArgumentException(
+                                "The exportMessageStore operation can only be called when the virtual host is stopped");
                     }
+
+                    _messageStore.openMessageStore(AbstractVirtualHost.this);
+                    try
+                    {
+                        final Map<UUID, String> queueMap = new HashMap<>();
+                        getDurableConfigurationStore().reload(new ConfiguredObjectRecordHandler()
+                        {
+                            @Override
+                            public void handle(final ConfiguredObjectRecord record)
+                            {
+                                if(record.getType().equals(Queue.class.getSimpleName()))
+                                {
+                                    queueMap.put(record.getId(), (String) record.getAttributes().get(ConfiguredObject.NAME));
+                                }
+                            }
+                        });
+                        MessageStoreSerializer serializer = new QpidServiceLoader().getInstancesByType(MessageStoreSerializer.class).get(MessageStoreSerializer.LATEST);
+                        MessageStore.MessageStoreReader reader = _messageStore.newMessageStoreReader();
+                        serializer.serialize(queueMap, reader, outputStream);
+                    }
+                    finally
+                    {
+                        _messageStore.closeMessageStore();
+                    }
+                    return null;
+                }
+
+                @Override
+                public String getObject()
+                {
+                    return AbstractVirtualHost.this.toString();
+                }
+
+                @Override
+                public String getAction()
+                {
+                    return "exportMessageStore";
                 }
-            });
-            MessageStoreSerializer serializer = new QpidServiceLoader().getInstancesByType(MessageStoreSerializer.class).get(MessageStoreSerializer.LATEST);
-            MessageStore.MessageStoreReader reader = _messageStore.newMessageStoreReader();
-            serializer.serialize(queueMap, reader, outputStream);
 
+                @Override
+                public String getArguments()
+                {
+                    return null;
+                }
+            }));
         }
 
         @Override
         public void release()
         {
-            _messageStore.closeMessageStore();
         }
 
-
         @RestContentHeader("Content-Type")
         public String getContentType()
         {
@@ -948,57 +1004,90 @@ public abstract class AbstractVirtualHos
     @Override
     public void importMessageStore(final String source)
     {
-        if(getState() == State.STOPPED)
+        try
         {
+            final URL url = convertStringToURL(source);
 
-            try
+            try (InputStream input = url.openStream();
+                 BufferedInputStream bufferedInputStream = new BufferedInputStream(input);
+                 DataInputStream data = new DataInputStream(bufferedInputStream))
             {
-                URL url = convertStringToURL(source);
 
-                try (InputStream input = url.openStream();
-                     BufferedInputStream bufferedInputStream = new BufferedInputStream(input);
-                     DataInputStream data = new DataInputStream(bufferedInputStream))
-                {
-
-                    MessageStoreSerializer serializer = MessageStoreSerializer.FACTORY.newInstance(data);
+                final MessageStoreSerializer serializer = MessageStoreSerializer.FACTORY.newInstance(data);
 
-                    try
+                doSync(doOnConfigThread(new Task<ListenableFuture<Void>, IOException>()
+                {
+                    @Override
+                    public ListenableFuture<Void> execute() throws IOException
                     {
+                        if (getState() != State.STOPPED)
+                        {
+                            throw new IllegalArgumentException(
+                                    "The importMessageStore operation can only be called when the virtual host is stopped");
+                        }
 
-                        _messageStore.openMessageStore(AbstractVirtualHost.this);
-                        checkMessageStoreEmpty();
-                        final Map<String, UUID> queueMap = new HashMap<>();
-                        getDurableConfigurationStore().reload(new ConfiguredObjectRecordHandler()
+                        try
                         {
-                            @Override
-                            public void handle(final ConfiguredObjectRecord record)
+                            _messageStore.openMessageStore(AbstractVirtualHost.this);
+                            checkMessageStoreEmpty();
+                            final Map<String, UUID> queueMap = new HashMap<>();
+                            getDurableConfigurationStore().reload(new ConfiguredObjectRecordHandler()
                             {
-                                if (record.getType().equals(Queue.class.getSimpleName()))
+                                @Override
+                                public void handle(final ConfiguredObjectRecord record)
                                 {
-                                    queueMap.put((String) record.getAttributes().get(ConfiguredObject.NAME),
-                                                 record.getId());
+                                    if (record.getType().equals(Queue.class.getSimpleName()))
+                                    {
+                                        queueMap.put((String) record.getAttributes().get(ConfiguredObject.NAME),
+                                                     record.getId());
+                                    }
                                 }
-                            }
-                        });
+                            });
 
-                        serializer.deserialize(queueMap, _messageStore, data);
+                            serializer.deserialize(queueMap, _messageStore, data);
+                        }
+                        finally
+                        {
+                            _messageStore.closeMessageStore();
+                        }
+                        return null;
                     }
-                    finally
+
+                    @Override
+                    public String getObject()
                     {
-                        _messageStore.closeMessageStore();
+                        return AbstractVirtualHost.this.toString();
                     }
-                }
-            }
-            catch (IOException e)
-            {
-                throw new IllegalConfigurationException("Cannot convert '" + source + "' to a readable resource", e);
+
+                    @Override
+                    public String getAction()
+                    {
+                        return "importMessageStore";
+                    }
+
+                    @Override
+                    public String getArguments()
+                    {
+                        if (url.getProtocol().equalsIgnoreCase("http") || url.getProtocol().equalsIgnoreCase("https") || url.getProtocol().equalsIgnoreCase("file"))
+                        {
+                            return "source=" + source;
+                        }
+                        else if (url.getProtocol().equalsIgnoreCase("data"))
+                        {
+                            return "source=<data stream>";
+                        }
+                        else
+                        {
+                            return "source=<unknown source type>";
+                        }
+                    }
+                }));
             }
         }
-        else
+        catch (IOException e)
         {
-            throw new IllegalArgumentException("The extractMessageStore operation can only be called when the virtual host is stopped");
+            throw new IllegalConfigurationException("Cannot convert '" + source + "' to a readable resource", e);
         }
-
     }
 
     private void checkMessageStoreEmpty()

Modified: qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AbstractCommonRuleBasedAccessControlProvider.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AbstractCommonRuleBasedAccessControlProvider.java?rev=1762758&r1=1762757&r2=1762758&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AbstractCommonRuleBasedAccessControlProvider.java (original)
+++ qpid/java/trunk/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/plugins/AbstractCommonRuleBasedAccessControlProvider.java Thu Sep 29 12:05:30 2016
@@ -57,7 +57,7 @@ abstract class AbstractCommonRuleBasedAc
     @ManagedAttributeField
     private Result _defaultResult;
     @ManagedAttributeField
-    private List<AclRule> _rules;
+    private volatile List<AclRule> _rules;
 
     AbstractCommonRuleBasedAccessControlProvider(final Map<String, Object> attributes, final T parent)
     {



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org