From 7371feb185388d4bedda4ac10ee7c78a17023a7e Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Tue, 20 May 2014 14:44:19 +0000 Subject: 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 --- .../replication/ReplicatedEnvironmentFacade.java | 5 +- .../berkeleydb/BDBHARemoteReplicationNodeImpl.java | 7 +- .../berkeleydb/BDBHAVirtualHostNodeImpl.java | 41 ++++++- .../qpid/management/virtualhostnode/bdb_ha/show.js | 12 +- .../store/berkeleydb/BDBHAVirtualHostNodeTest.java | 123 +++++++++++++++++++++ 5 files changed, 179 insertions(+), 9 deletions(-) (limited to 'qpid/java/bdbstore/src') 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 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 getRemoteNodeAddresses() + { + Set helpers = new HashSet(); + @SuppressWarnings("rawtypes") + Collection 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 node1Attributes = new HashMap(); + node1Attributes.put(BDBHAVirtualHostNode.ID, UUID.randomUUID()); + node1Attributes.put(BDBHAVirtualHostNode.TYPE, "BDB_HA"); + node1Attributes.put(BDBHAVirtualHostNode.NAME, "node1"); + node1Attributes.put(BDBHAVirtualHostNode.GROUP_NAME, groupName); + node1Attributes.put(BDBHAVirtualHostNode.ADDRESS, helperAddress); + node1Attributes.put(BDBHAVirtualHostNode.HELPER_ADDRESS, helperAddress); + node1Attributes.put(BDBHAVirtualHostNode.STORE_PATH, _bdbStorePath + File.separator + "1"); + + BDBHAVirtualHostNode node1 = createHaVHN(node1Attributes); + node1.start(); + assertEquals("Failed to activate node", State.ACTIVE, node1.getState()); + + int node2PortNumber = getNextAvailable(node1PortNumber+1); + + Map node2Attributes = new HashMap(); + node2Attributes.put(BDBHAVirtualHostNode.ID, UUID.randomUUID()); + node2Attributes.put(BDBHAVirtualHostNode.TYPE, "BDB_HA"); + node2Attributes.put(BDBHAVirtualHostNode.NAME, "node2"); + node2Attributes.put(BDBHAVirtualHostNode.GROUP_NAME, groupName); + node2Attributes.put(BDBHAVirtualHostNode.ADDRESS, "localhost:" + node2PortNumber); + node2Attributes.put(BDBHAVirtualHostNode.HELPER_ADDRESS, helperAddress); + node2Attributes.put(BDBHAVirtualHostNode.STORE_PATH, _bdbStorePath + File.separator + "2"); + + BDBHAVirtualHostNode node2 = createHaVHN(node2Attributes); + node2.start(); + assertEquals("Failed to activate node2", State.ACTIVE, node2.getState()); + + int node3PortNumber = getNextAvailable(node2PortNumber+1); + Map node3Attributes = new HashMap(); + node3Attributes.put(BDBHAVirtualHostNode.ID, UUID.randomUUID()); + node3Attributes.put(BDBHAVirtualHostNode.TYPE, "BDB_HA"); + node3Attributes.put(BDBHAVirtualHostNode.NAME, "node3"); + node3Attributes.put(BDBHAVirtualHostNode.GROUP_NAME, groupName); + node3Attributes.put(BDBHAVirtualHostNode.ADDRESS, "localhost:" + node3PortNumber); + node3Attributes.put(BDBHAVirtualHostNode.HELPER_ADDRESS, helperAddress); + node3Attributes.put(BDBHAVirtualHostNode.STORE_PATH, _bdbStorePath + File.separator + "3"); + BDBHAVirtualHostNode node3 = createHaVHN(node3Attributes); + node3.start(); + assertEquals("Failed to activate node3", State.ACTIVE, node3.getState()); + + BDBHAVirtualHostNode master = awaitAndFindNodeInRole("MASTER"); + awaitRemoteNodes(master, 2); + + BDBHAVirtualHostNode replica = awaitAndFindNodeInRole("REPLICA"); + + assertNotNull("Remote node " + replica.getName() + " is not found", findRemoteNode( master, replica.getName())); + replica.delete(); + + awaitRemoteNodes(master, 1); + + assertNull("Remote node " + replica.getName() + " is not found", findRemoteNode( master, replica.getName())); + } + + private BDBHARemoteReplicationNode findRemoteNode(BDBHAVirtualHostNode node, String name) + { + for (RemoteReplicationNode remoteNode : node.getRemoteReplicationNodes()) + { + if (remoteNode.getName().equals(name)) + { + return (BDBHARemoteReplicationNode)remoteNode; + } + } + return null; + } + + private void awaitRemoteNodes(BDBHAVirtualHostNode node, int expectedNodeNumber) throws InterruptedException + { + int counter = 0; + + @SuppressWarnings("rawtypes") + Collection remoteNodes = null; + do + { + remoteNodes = node.getRemoteReplicationNodes(); + if (counter > 0) + { + Thread.sleep(100); + } + counter++; + } + while(remoteNodes.size() != expectedNodeNumber && counter<50); + assertEquals("Unexpected node number", expectedNodeNumber, node.getRemoteReplicationNodes().size()); + } + + private BDBHAVirtualHostNode awaitAndFindNodeInRole(String role) throws InterruptedException + { + BDBHAVirtualHostNode replica = null; + int findReplicaCount = 0; + while(replica == null) + { + replica = findNodeInRole(role); + if (replica == null) + { + Thread.sleep(100); + } + if (findReplicaCount > 50) + { + fail("Could not find a node in replica role"); + } + findReplicaCount++; + } + return replica; + } + + private BDBHAVirtualHostNode findNodeInRole(String role) + { + for (BDBHAVirtualHostNode node : _nodes) + { + if (role.equals(node.getRole())) + { + return node; + } + } + return null; + } + private BDBHAVirtualHostNode createHaVHN(Map attributes) { BDBHAVirtualHostNode node = (BDBHAVirtualHostNode) _objectFactory.create(VirtualHostNode.class, attributes, _broker); -- cgit v1.2.1