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 | 706675d432369def04b47ab935a17adec390e202 (patch) | |
| tree | b4c85415ad3a305e47d4d8af51a43b39bcd5a106 /qpid/java/bdbstore/src/main | |
| parent | 0c801f4ef8be29a0a756bce67651cac7f583a525 (diff) | |
| download | qpid-python-706675d432369def04b47ab935a17adec390e202.tar.gz | |
QPID-4937 : [Java Broker] separate virtualhosts into different types
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1494667 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java/bdbstore/src/main')
6 files changed, 412 insertions, 1 deletions
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java index 3074daa46e..d036a5d39a 100644 --- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java +++ b/qpid/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/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHost.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHost.java new file mode 100644 index 0000000000..0231573053 --- /dev/null +++ b/qpid/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/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java new file mode 100644 index 0000000000..b01aeafb9a --- /dev/null +++ b/qpid/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/qpid/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhost/bdb_ha/addVirtualHost.js b/qpid/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhost/bdb_ha/addVirtualHost.js new file mode 100644 index 0000000000..44ad5fa57a --- /dev/null +++ b/qpid/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/qpid/java/bdbstore/src/main/java/resources/virtualhost/bdb_ha/add.html b/qpid/java/bdbstore/src/main/java/resources/virtualhost/bdb_ha/add.html new file mode 100644 index 0000000000..1727264d41 --- /dev/null +++ b/qpid/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/qpid/java/bdbstore/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.VirtualHostFactory b/qpid/java/bdbstore/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.VirtualHostFactory new file mode 100644 index 0000000000..0f8848cb74 --- /dev/null +++ b/qpid/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 |
