diff options
| author | Alex Rudyy <orudyy@apache.org> | 2014-05-20 14:44:19 +0000 |
|---|---|---|
| committer | Alex Rudyy <orudyy@apache.org> | 2014-05-20 14:44:19 +0000 |
| commit | 7371feb185388d4bedda4ac10ee7c78a17023a7e (patch) | |
| tree | e766336a1e3f668a4c9ea1bb25a1d035d2a874da /qpid/java/bdbstore/src/main | |
| parent | b8ea492a1651b86fde5ae93d4e40c3987b9eaa4a (diff) | |
| download | qpid-python-7371feb185388d4bedda4ac10ee7c78a17023a7e.tar.gz | |
QPID-5715: On BDB HA virtual host node deletion invoke ReplicationGroupAdmin#removeMember to remove node from the group
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1596273 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java/bdbstore/src/main')
4 files changed, 56 insertions, 9 deletions
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java index cde00a8804..91e73324bc 100644 --- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java +++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java @@ -23,12 +23,10 @@ package org.apache.qpid.server.store.berkeleydb.replication; import java.io.File; import java.io.IOException; import java.net.InetSocketAddress; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.Callable; @@ -75,6 +73,7 @@ import com.sleepycat.je.rep.StateChangeEvent; import com.sleepycat.je.rep.StateChangeListener; import com.sleepycat.je.rep.util.DbPing; import com.sleepycat.je.rep.util.ReplicationGroupAdmin; +import com.sleepycat.je.rep.utilint.HostPortPair; import com.sleepycat.je.rep.utilint.ServiceDispatcher.ServiceConnectFailedException; import com.sleepycat.je.rep.vlsn.VLSNRange; import com.sleepycat.je.utilint.PropUtil; @@ -720,7 +719,7 @@ public class ReplicatedEnvironmentFacade implements EnvironmentFacade, StateChan helpers.addAll(_environment.getRepConfig().getHelperSockets()); final ReplicationConfig repConfig = _environment.getRepConfig(); - helpers.add(InetSocketAddress.createUnresolved(repConfig.getNodeHostname(), repConfig.getNodePort())); + helpers.add(HostPortPair.getSocket(HostPortPair.getString(repConfig.getNodeHostname(), repConfig.getNodePort()))); return new ReplicationGroupAdmin(_configuration.getGroupName(), helpers); } diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHARemoteReplicationNodeImpl.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHARemoteReplicationNodeImpl.java index d1e6b39bcc..20c80ad765 100644 --- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHARemoteReplicationNodeImpl.java +++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHARemoteReplicationNodeImpl.java @@ -21,7 +21,6 @@ package org.apache.qpid.server.virtualhostnode.berkeleydb; -import java.io.File; import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicReference; @@ -98,6 +97,12 @@ public class BDBHARemoteReplicationNodeImpl extends AbstractConfiguredObject<BDB return _lastTransactionId; } + @Override + public void deleted() + { + super.deleted(); + } + @StateTransition(currentState = {State.ACTIVE, State.STOPPED}, desiredState = State.DELETED) private void doDelete() { diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java index 9602c2c29c..c019465176 100644 --- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java +++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java @@ -20,9 +20,11 @@ */ package org.apache.qpid.server.virtualhostnode.berkeleydb; +import java.net.InetSocketAddress; import java.security.PrivilegedAction; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutionException; @@ -32,11 +34,14 @@ import java.util.concurrent.atomic.AtomicReference; import javax.security.auth.Subject; +import com.sleepycat.je.DatabaseException; import com.sleepycat.je.rep.NodeState; import com.sleepycat.je.rep.ReplicatedEnvironment; import com.sleepycat.je.rep.ReplicationNode; import com.sleepycat.je.rep.StateChangeEvent; import com.sleepycat.je.rep.StateChangeListener; +import com.sleepycat.je.rep.util.ReplicationGroupAdmin; +import com.sleepycat.je.rep.utilint.HostPortPair; import org.apache.log4j.Logger; import org.apache.qpid.server.logging.messages.ConfigStoreMessages; @@ -340,6 +345,39 @@ public class BDBHAVirtualHostNodeImpl extends AbstractVirtualHostNode<BDBHAVirtu } } + @StateTransition( currentState = { State.ACTIVE, State.STOPPED, State.ERRORED}, desiredState = State.DELETED ) + protected void doDelete() + { + Set<InetSocketAddress> helpers = getRemoteNodeAddresses(); + super.doDelete(); + if (getState() == State.DELETED && !helpers.isEmpty()) + { + try + { + new ReplicationGroupAdmin(_groupName, helpers).removeMember(getName()); + } + catch(DatabaseException e) + { + LOGGER.warn("The deletion of node " + this + " on remote nodes failed due to: " + e.getMessage() + + ". To finish deletion a removal of the node from any of remote nodes (" + helpers + ") is required."); + } + } + } + + private Set<InetSocketAddress> getRemoteNodeAddresses() + { + Set<InetSocketAddress> helpers = new HashSet<InetSocketAddress>(); + @SuppressWarnings("rawtypes") + Collection<? extends RemoteReplicationNode> remoteNodes = getRemoteReplicationNodes(); + for (RemoteReplicationNode<?> node : remoteNodes) + { + BDBHARemoteReplicationNode<?> bdbHaRemoteReplicationNode = (BDBHARemoteReplicationNode<?>)node; + String remoteNodeAddress = bdbHaRemoteReplicationNode.getAddress(); + helpers.add(HostPortPair.getSocket(remoteNodeAddress)); + } + return helpers; + } + protected void onClose() { try @@ -626,8 +664,7 @@ public class BDBHAVirtualHostNodeImpl extends AbstractVirtualHostNode<BDBHAVirtu BDBHARemoteReplicationNodeImpl remoteNode = getChildByName(BDBHARemoteReplicationNodeImpl.class, node.getName()); if (remoteNode != null) { - remoteNode.delete(); - childRemoved(remoteNode); + remoteNode.deleted(); } } diff --git a/qpid/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhostnode/bdb_ha/show.js b/qpid/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhostnode/bdb_ha/show.js index c4ac3f3d91..9dbebc9d7d 100644 --- a/qpid/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhostnode/bdb_ha/show.js +++ b/qpid/java/bdbstore/src/main/java/resources/js/qpid/management/virtualhostnode/bdb_ha/show.js @@ -148,7 +148,7 @@ define(["dojo/_base/xhr", { var data = that.membersGrid.grid.selection.getSelected(); that.transferMasterButton.set("disabled", data.length != 1|| data[0].role != "REPLICA"); - that.removeNodeButton.set("disabled", data.length != 1 || data[0].role == "MASTER" || data[0].name == that.data.name); + that.removeNodeButton.set("disabled", data.length != 1 || data[0].role == "MASTER"); }; connect.connect(this.membersGrid.grid.selection, 'onSelected', nodeControlsToggler); connect.connect(this.membersGrid.grid.selection, 'onDeselected', nodeControlsToggler); @@ -170,8 +170,14 @@ define(["dojo/_base/xhr", var data = that.membersGrid.grid.selection.getSelected(); if (data.length == 1 && confirm("Are you sure you would like to delete node '" + data[0].name + "'?")) { - sendRequest(that.data.name, data[0].name, "DELETE"); - that.membersGrid.grid.selection.clear(); + if (sendRequest(that.data.name, data[0].name, "DELETE")) + { + that.membersGrid.grid.selection.clear(); + if (data[0].name == that.data.name) + { + that.parent.destroy(); + } + } } } ); |
