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