diff options
| author | Robert Godfrey <rgodfrey@apache.org> | 2013-06-19 15:51:30 +0000 |
|---|---|---|
| committer | Robert Godfrey <rgodfrey@apache.org> | 2013-06-19 15:51:30 +0000 |
| commit | cd4a28673d27c557bfb756d2a9f2d592ea498efd (patch) | |
| tree | 00796beeeec12c0048a96c4455d701b200e5e362 /java/bdbstore | |
| parent | da9d2156e3137a9575aa0f7b1dc7d52dc4908737 (diff) | |
| download | qpid-python-cd4a28673d27c557bfb756d2a9f2d592ea498efd.tar.gz | |
QPID-4937 : [Java Broker] separate virtualhosts into different types
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1494667 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/bdbstore')
9 files changed, 431 insertions, 4 deletions
diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java index 3074daa46e..d036a5d39a 100644 --- a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java +++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java @@ -75,7 +75,7 @@ import org.apache.qpid.server.store.berkeleydb.tuple.XidBinding; import org.apache.qpid.server.store.berkeleydb.upgrade.Upgrader; import org.apache.qpid.util.FileUtils; -public abstract class AbstractBDBMessageStore implements MessageStore +public abstract class AbstractBDBMessageStore implements MessageStore, DurableConfigurationStore { private static final Logger LOGGER = Logger.getLogger(AbstractBDBMessageStore.class); diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHost.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHost.java new file mode 100644 index 0000000000..0231573053 --- /dev/null +++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHost.java @@ -0,0 +1,198 @@ +package org.apache.qpid.server.store.berkeleydb; +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +import org.apache.qpid.server.configuration.VirtualHostConfiguration; +import org.apache.qpid.server.connection.IConnectionRegistry; +import org.apache.qpid.server.logging.subjects.MessageStoreLogSubject; +import org.apache.qpid.server.stats.StatisticsGatherer; +import org.apache.qpid.server.store.DurableConfigurationStore; +import org.apache.qpid.server.store.Event; +import org.apache.qpid.server.store.EventListener; +import org.apache.qpid.server.store.MessageStore; +import org.apache.qpid.server.store.OperationalLoggingListener; +import org.apache.qpid.server.virtualhost.AbstractVirtualHost; +import org.apache.qpid.server.virtualhost.State; +import org.apache.qpid.server.virtualhost.VirtualHostConfigRecoveryHandler; +import org.apache.qpid.server.virtualhost.VirtualHostRegistry; + +public class BDBHAVirtualHost extends AbstractVirtualHost +{ + private BDBHAMessageStore _messageStore; + + private boolean _inVhostInitiatedClose; + + BDBHAVirtualHost(VirtualHostRegistry virtualHostRegistry, + StatisticsGatherer brokerStatisticsGatherer, + org.apache.qpid.server.security.SecurityManager parentSecurityManager, + VirtualHostConfiguration hostConfig) + throws Exception + { + super(virtualHostRegistry, brokerStatisticsGatherer, parentSecurityManager, hostConfig); + } + + + + protected void initialiseStorage(VirtualHostConfiguration hostConfig) throws Exception + { + _messageStore = new BDBHAMessageStore(); + + final MessageStoreLogSubject storeLogSubject = + new MessageStoreLogSubject(this, _messageStore.getClass().getSimpleName()); + OperationalLoggingListener.listen(_messageStore, storeLogSubject); + + _messageStore.addEventListener(new BeforeActivationListener(), Event.BEFORE_ACTIVATE); + _messageStore.addEventListener(new AfterActivationListener(), Event.AFTER_ACTIVATE); + _messageStore.addEventListener(new BeforeCloseListener(), Event.BEFORE_CLOSE); + + + + _messageStore.addEventListener(new AfterInitialisationListener(), Event.AFTER_INIT); + _messageStore.addEventListener(new BeforePassivationListener(), Event.BEFORE_PASSIVATE); + + VirtualHostConfigRecoveryHandler recoveryHandler = new VirtualHostConfigRecoveryHandler(this); + + _messageStore.configureConfigStore(getName(), + recoveryHandler, + hostConfig.getStoreConfiguration()); + + _messageStore.configureMessageStore(getName(), + recoveryHandler, + recoveryHandler, + hostConfig.getStoreConfiguration()); + } + + + protected void closeStorage() + { + //Close MessageStore + if (_messageStore != null) + { + //Remove MessageStore Interface should not throw Exception + try + { + _inVhostInitiatedClose = true; + getMessageStore().close(); + } + catch (Exception e) + { + getLogger().error("Failed to close message store", e); + } + finally + { + _inVhostInitiatedClose = false; + } + } + } + + @Override + public DurableConfigurationStore getDurableConfigurationStore() + { + return _messageStore; + } + + @Override + public MessageStore getMessageStore() + { + return _messageStore; + } + + private final class AfterInitialisationListener implements EventListener + { + public void event(Event event) + { + setState(State.PASSIVE); + } + + } + + private final class BeforePassivationListener implements EventListener + { + public void event(Event event) + { + State finalState = State.ERRORED; + + try + { + /* the approach here is not ideal as there is a race condition where a + * queue etc could be created while the virtual host is on the way to + * the passivated state. However the store state change from MASTER to UNKNOWN + * is documented as exceptionally rare.. + */ + + getConnectionRegistry().close(IConnectionRegistry.VHOST_PASSIVATE_REPLY_TEXT); + removeHouseKeepingTasks(); + + getQueueRegistry().stopAllAndUnregisterMBeans(); + getExchangeRegistry().clearAndUnregisterMbeans(); + getDtxRegistry().close(); + + finalState = State.PASSIVE; + } + finally + { + setState(finalState); + reportIfError(getState()); + } + } + + } + + + private final class BeforeActivationListener implements EventListener + { + @Override + public void event(Event event) + { + try + { + initialiseModel(getConfiguration()); + } + catch (Exception e) + { + throw new RuntimeException("Failed to initialise virtual host after state change", e); + } + } + } + + private final class AfterActivationListener implements EventListener + { + @Override + public void event(Event event) + { + attainActivation(); + } + } + + private final class BeforeCloseListener implements EventListener + { + @Override + public void event(Event event) + { + if(!_inVhostInitiatedClose) + { + shutdownHouseKeeping(); + } + + } + } + +} diff --git a/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java new file mode 100644 index 0000000000..b01aeafb9a --- /dev/null +++ b/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java @@ -0,0 +1,106 @@ +package org.apache.qpid.server.store.berkeleydb;/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +import java.util.LinkedHashMap; +import java.util.Map; +import org.apache.qpid.server.configuration.VirtualHostConfiguration; +import org.apache.qpid.server.model.adapter.VirtualHostAdapter; +import org.apache.qpid.server.plugin.VirtualHostFactory; +import org.apache.qpid.server.stats.StatisticsGatherer; +import org.apache.qpid.server.virtualhost.VirtualHost; +import org.apache.qpid.server.virtualhost.VirtualHostRegistry; + +public class BDBHAVirtualHostFactory implements VirtualHostFactory +{ + + public static final String TYPE = "BDB_HA"; + + @Override + public String getType() + { + return TYPE; + } + + @Override + public VirtualHost createVirtualHost(VirtualHostRegistry virtualHostRegistry, + StatisticsGatherer brokerStatisticsGatherer, + org.apache.qpid.server.security.SecurityManager parentSecurityManager, + VirtualHostConfiguration hostConfig) throws Exception + { + return new BDBHAVirtualHost(virtualHostRegistry, + brokerStatisticsGatherer, + parentSecurityManager, + hostConfig); + } + + @Override + public void validateAttributes(Map<String, Object> attributes) + { + validateAttribute(org.apache.qpid.server.model.VirtualHost.STORE_PATH, String.class, attributes); + validateAttribute("haGroupName", String.class, attributes); + validateAttribute("haNodeName", String.class, attributes); + validateAttribute("haNodeAddress", String.class, attributes); + validateAttribute("haHelperAddress", String.class, attributes); + } + + private void validateAttribute(String attrName, Class<?> clazz, Map<String, Object> attributes) + { + Object attr = attributes.get(attrName); + if(!clazz.isInstance(attr)) + { + throw new IllegalArgumentException("Attribute '"+ attrName + +"' is required and must be of type "+clazz.getSimpleName()+"."); + } + } + + @Override + public Map<String, Object> createVirtualHostConfiguration(VirtualHostAdapter virtualHostAdapter) + { + LinkedHashMap<String,Object> convertedMap = new LinkedHashMap<String, Object>(); + convertedMap.put("store.environment-path", virtualHostAdapter.getAttribute(org.apache.qpid.server.model.VirtualHost.STORE_PATH)); + convertedMap.put("store.highAvailability.groupName", virtualHostAdapter.getAttribute("haGroupName")); + convertedMap.put("store.highAvailability.nodeName", virtualHostAdapter.getAttribute("haNodeName")); + convertedMap.put("store.highAvailability.nodeHostPort", virtualHostAdapter.getAttribute("haNodeAddress")); + convertedMap.put("store.highAvailability.helperHostPort", virtualHostAdapter.getAttribute("haHelperAddress")); + + final Object haDurability = virtualHostAdapter.getAttribute("haDurability"); + if(haDurability !=null) + { + convertedMap.put("store.highAvailability.durability", haDurability); + } + + final Object designatedPrimary = virtualHostAdapter.getAttribute("haDesignatedPrimary"); + if(designatedPrimary!=null) + { + convertedMap.put("store.highAvailability.designatedPrimary", designatedPrimary); + } + + final Object coalescingSync = virtualHostAdapter.getAttribute("haCoalescingSync"); + if(coalescingSync!=null) + { + convertedMap.put("store.highAvailability.coalescingSync", coalescingSync); + } + + // TODO REP_CONFIG values + + return convertedMap; + } +} diff --git a/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhost/bdb_ha/addVirtualHost.js b/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhost/bdb_ha/addVirtualHost.js new file mode 100644 index 0000000000..44ad5fa57a --- /dev/null +++ b/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhost/bdb_ha/addVirtualHost.js @@ -0,0 +1,51 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +define(["dojo/_base/xhr", + "dojo/dom", + "dojo/dom-construct", + "dojo/_base/window", + "dijit/registry", + "dojo/parser", + "dojo/_base/array", + "dojo/domReady!"], + function (xhr, dom, construct, win, registry, parser, array) { + return { + show: function() { + + var node = dom.byId("addVirtualHost.typeSpecificDiv"); + var that = this; + + array.forEach(registry.toArray(), + function(item) { + if(item.id.substr(0,27) == "formAddVirtualHost.specific") { + item.destroyRecursive(); + } + }); + + xhr.get({url: "virtualhost/bdb_ha/add.html", + sync: true, + load: function(data) { + node.innerHTML = data; + parser.parse(node); + }}); + } + }; + }); diff --git a/java/bdbstore/src/main/java/resources/virtualhost/bdb_ha/add.html b/java/bdbstore/src/main/java/resources/virtualhost/bdb_ha/add.html new file mode 100644 index 0000000000..1727264d41 --- /dev/null +++ b/java/bdbstore/src/main/java/resources/virtualhost/bdb_ha/add.html @@ -0,0 +1,37 @@ +<table class="tableContainer-table tableContainer-table-horiz"> + <tr> + <td class="tableContainer-labelCell" style="width: 300px;"><strong>Path to store location*: </strong></td> + <td class="tableContainer-valueCell"> + <input dojoType="dijit/form/ValidationTextBox" id="formAddVirtualHost.specific.storePath" + required="true" name="storePath" placeholder="/path/to/message/store"/> + </td> + </tr> + <tr> + <td class="tableContainer-labelCell" style="width: 300px;"><strong>Node Name*: </strong></td> + <td class="tableContainer-valueCell"> + <input dojoType="dijit/form/ValidationTextBox" id="formAddVirtualHost.specific.nodeName" + required="true" name="haNodeName" placeholder="node name"/> + </td> + </tr> + <tr> + <td class="tableContainer-labelCell" style="width: 300px;"><strong>Replication Group*: </strong></td> + <td class="tableContainer-valueCell"> + <input dojoType="dijit/form/ValidationTextBox" id="formAddVirtualHost.specific.groupName" + required="true" name="haGroupName" placeholder="group name"/> + </td> + </tr> + <tr> + <td class="tableContainer-labelCell" style="width: 300px;"><strong>Node Address*: </strong></td> + <td class="tableContainer-valueCell"> + <input dojoType="dijit/form/ValidationTextBox" id="formAddVirtualHost.specific.nodeAddress" + required="true" name="haNodeAddress" data-dojo-props="regExp:'([0-9a-zA-Z.-_]|::)+:[0-9]{1,5}', invalidMessage:'Must be of the form host:port'" placeholder="host:port"/> + </td> + </tr> + <tr> + <td class="tableContainer-labelCell" style="width: 300px;"><strong>Helper Address*: </strong></td> + <td class="tableContainer-valueCell"> + <input dojoType="dijit/form/ValidationTextBox" id="formAddVirtualHost.specific.helperAddress" + required="true" name="haHelperAddress" placeholder="host:port"/> + </td> + </tr> +</table> diff --git a/java/bdbstore/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.VirtualHostFactory b/java/bdbstore/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.VirtualHostFactory new file mode 100644 index 0000000000..0f8848cb74 --- /dev/null +++ b/java/bdbstore/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.VirtualHostFactory @@ -0,0 +1,19 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +org.apache.qpid.server.store.berkeleydb.BDBHAVirtualHostFactory diff --git a/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAMessageStoreTest.java b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAMessageStoreTest.java index 8e32a1d113..047b102817 100644 --- a/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAMessageStoreTest.java +++ b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAMessageStoreTest.java @@ -115,6 +115,7 @@ public class BDBHAMessageStoreTest extends QpidTestCase String vhostPrefix = "virtualhosts.virtualhost." + vhostName; _configXml.addProperty("virtualhosts.virtualhost.name", vhostName); + _configXml.addProperty(vhostPrefix + ".type", BDBHAVirtualHostFactory.TYPE); _configXml.addProperty(vhostPrefix + ".store.class", BDBHAMessageStore.class.getName()); _configXml.addProperty(vhostPrefix + ".store.environment-path", _workDir + File.separator + port); diff --git a/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreConfigurationTest.java b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreConfigurationTest.java index 5cc436a22a..6c6145fabb 100644 --- a/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreConfigurationTest.java +++ b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreConfigurationTest.java @@ -20,15 +20,26 @@ */ package org.apache.qpid.server.store.berkeleydb; +import org.apache.qpid.server.store.DurableConfigurationStore; import org.apache.qpid.server.store.DurableConfigurationStoreTest; import org.apache.qpid.server.store.MessageStore; public class BDBMessageStoreConfigurationTest extends DurableConfigurationStoreTest { + + private BDBMessageStore _bdbMessageStore; + @Override - protected MessageStore createStore() throws Exception + protected BDBMessageStore createMessageStore() throws Exception { - return new BDBMessageStore(); + _bdbMessageStore = new BDBMessageStore(); + return _bdbMessageStore; } + // TODO - this only works so long as createConfigStore is called after createMessageStore + @Override + protected DurableConfigurationStore createConfigStore() throws Exception + { + return _bdbMessageStore; + } } diff --git a/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/HATestClusterCreator.java b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/HATestClusterCreator.java index 4c2fa910f5..353c3a0ec5 100644 --- a/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/HATestClusterCreator.java +++ b/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/HATestClusterCreator.java @@ -75,6 +75,7 @@ public class HATestClusterCreator private final int _numberOfNodes; private int _bdbHelperPort; private int _primaryBrokerPort; + private String _vhostConfigKeyPrefix; public HATestClusterCreator(QpidBrokerTestCase testcase, String virtualHostName, int numberOfNodes) { @@ -83,7 +84,8 @@ public class HATestClusterCreator _groupName = "group" + _testcase.getName(); _ipAddressOfBroker = getIpAddressOfBrokerHost(); _numberOfNodes = numberOfNodes; - _vhostStoreConfigKeyPrefix = "virtualhosts.virtualhost." + _virtualHostName + ".store."; + _vhostConfigKeyPrefix = "virtualhosts.virtualhost." + _virtualHostName + "."; + _vhostStoreConfigKeyPrefix = _vhostConfigKeyPrefix + "store."; _bdbHelperPort = 0; } @@ -350,6 +352,8 @@ public class HATestClusterCreator { final String nodeName = getNodeNameForNodeAt(bdbPort); + + _testcase.setVirtualHostConfigurationProperty(_vhostConfigKeyPrefix + "type", BDBHAVirtualHostFactory.TYPE); _testcase.setVirtualHostConfigurationProperty(_vhostStoreConfigKeyPrefix + "class", "org.apache.qpid.server.store.berkeleydb.BDBHAMessageStore"); _testcase.setVirtualHostConfigurationProperty(_vhostStoreConfigKeyPrefix + "highAvailability.groupName", _groupName); |
