You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ag...@apache.org on 2019/02/26 12:56:36 UTC
[ignite] branch master updated: IGNITE-11332 Added ability to drop
node from discovery through JMX - Fixes #6120.
This is an automated email from the ASF dual-hosted git repository.
agoncharuk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push:
new 9823b0e IGNITE-11332 Added ability to drop node from discovery through JMX - Fixes #6120.
9823b0e is described below
commit 9823b0e8a47fadfaad357c2debc440d679061ab1
Author: Evgeny Stanilovskiy <es...@gridgain.com>
AuthorDate: Tue Feb 26 15:46:26 2019 +0300
IGNITE-11332 Added ability to drop node from discovery through JMX - Fixes #6120.
Signed-off-by: Alexey Goncharuk <al...@gmail.com>
---
.../ignite/spi/discovery/DiscoverySpiMBean.java | 8 ++
.../ignite/spi/discovery/tcp/TcpDiscoverySpi.java | 18 ++++
.../discovery/tcp/TcpDiscoverySpiMBeanTest.java | 97 ++++++++++++++++++++++
.../spi/discovery/zk/ZookeeperDiscoverySpi.java | 18 ++++
4 files changed, 141 insertions(+)
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/DiscoverySpiMBean.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/DiscoverySpiMBean.java
index d86a497..069fdad 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/DiscoverySpiMBean.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/DiscoverySpiMBean.java
@@ -81,4 +81,12 @@ public interface DiscoverySpiMBean {
*/
@MXBeanDescription("Local node formatted as a string.")
public String getLocalNodeFormatted();
+
+ /**
+ * Exclude node from discovery.
+ *
+ * @param nodeId Node id string.
+ */
+ @MXBeanDescription("Exclude node from cluster.")
+ public void excludeNode(String nodeId);
}
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java
index 981a2e4..b5f08a4 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java
@@ -2503,6 +2503,24 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements IgniteDiscovery
}
/** {@inheritDoc} */
+ @Override public void excludeNode(String nodeId) {
+ UUID node;
+
+ try {
+ node = UUID.fromString(nodeId);
+ }
+ catch (IllegalArgumentException e) {
+ U.error(log, "Failed to parse node ID: " + nodeId, e);
+
+ return;
+ }
+
+ String msg = "Node excluded, node=" + nodeId + "using JMX interface, initiator=" + getLocalNodeId();
+
+ impl.failNode(node, msg);
+ }
+
+ /** {@inheritDoc} */
@Override public void dumpDebugInfo() {
impl.dumpDebugInfo(log);
}
diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpiMBeanTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpiMBeanTest.java
index 1a1b6d1..5222897 100644
--- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpiMBeanTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpiMBeanTest.java
@@ -17,18 +17,31 @@
package org.apache.ignite.spi.discovery.tcp;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.events.Event;
import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.util.typedef.G;
import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.lang.IgnitePredicate;
import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
import org.apache.ignite.testframework.GridStringLogger;
+import org.apache.ignite.testframework.GridTestUtils;
import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
import javax.management.JMX;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;
+import java.util.UUID;
+import java.util.concurrent.CountDownLatch;
+
import org.junit.Test;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.apache.ignite.events.EventType.EVT_NODE_FAILED;
+import static org.apache.ignite.events.EventType.EVT_NODE_SEGMENTED;
+
/**
* Tests TcpDiscoverySpiMBean.
*/
@@ -45,6 +58,10 @@ public class TcpDiscoverySpiMBeanTest extends GridCommonAbstractTest {
TcpDiscoverySpi tcpSpi = new TcpDiscoverySpi();
tcpSpi.setIpFinder(IP_FINDER);
cfg.setDiscoverySpi(tcpSpi);
+
+ if ("client".equals(igniteInstanceName))
+ cfg.setClientMode(true);
+
cfg.setGridLogger(strLog);
return cfg;
@@ -81,4 +98,84 @@ public class TcpDiscoverySpiMBeanTest extends GridCommonAbstractTest {
stopAllGrids();
}
}
+
+ /**
+ * Tests TcpDiscoverySpiMBean#excludeNode.
+ *
+ * @throws Exception if fails.
+ */
+ @Test
+ public void testNodeExclusion() throws Exception {
+ try {
+ int srvCnt = 2;
+
+ IgniteEx grid0 = (IgniteEx)startGrids(srvCnt);
+
+ IgniteEx client;
+
+ client = startGrid("client");
+
+ MBeanServer srv = ManagementFactory.getPlatformMBeanServer();
+
+ ObjectName spiName = U.makeMBeanName(grid0.context().igniteInstanceName(), "SPIs",
+ TcpDiscoverySpi.class.getSimpleName());
+
+ TcpDiscoverySpiMBean bean = JMX.newMBeanProxy(srv, spiName, TcpDiscoverySpiMBean.class);
+
+ assertEquals(grid0.cluster().forServers().nodes().size(), srvCnt);
+
+ assertEquals(grid0.cluster().forClients().nodes().size(), 1);
+
+ UUID clientId = client.localNode().id();
+
+ bean.excludeNode(clientId.toString());
+
+ assertTrue(GridTestUtils.waitForCondition(() ->
+ grid0.cluster().forClients().nodes().size() == 1, 5_000));
+
+ assertTrue(GridTestUtils.waitForCondition(() ->
+ grid0.cluster().forClients().node(clientId) == null, 5_000));
+
+ assertTrue(strLog.toString().contains("Node excluded, node="));
+
+ bean.excludeNode(new UUID(0, 0).toString());
+
+ bean.excludeNode("fakeUUID");
+
+ assertEquals(grid0.cluster().forServers().nodes().size(), srvCnt);
+
+ ClusterNode node = grid0.cluster().forServers().nodes().stream().filter(n -> n.id() != grid0.localNode().id())
+ .findFirst().get();
+
+ assertNotNull(node);
+
+ final CountDownLatch cnt = new CountDownLatch(1);
+
+ Ignite segmentedNode = G.allGrids().stream().filter(id -> id.cluster().localNode().id().equals(node.id()))
+ .findAny().get();
+
+ assertNotNull(segmentedNode);
+
+ segmentedNode.events().localListen(new IgnitePredicate<Event>() {
+ @Override public boolean apply(Event evt) {
+ cnt.countDown();
+
+ return false;
+ }
+ }, EVT_NODE_SEGMENTED);
+
+ bean.excludeNode(node.id().toString());
+
+ assertTrue(GridTestUtils.waitForCondition(() ->
+ grid0.cluster().forServers().nodes().size() == srvCnt - 1, 5_000));
+
+ assertTrue("Next node have to be failed within failureDetectionTimeout",
+ cnt.await(grid0.configuration().getFailureDetectionTimeout() + 3000, MILLISECONDS));
+
+ bean.excludeNode(grid0.localNode().id().toString());
+ }
+ finally {
+ stopAllGrids();
+ }
+ }
}
diff --git a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/ZookeeperDiscoverySpi.java b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/ZookeeperDiscoverySpi.java
index 6326770..44ce423 100644
--- a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/ZookeeperDiscoverySpi.java
+++ b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/ZookeeperDiscoverySpi.java
@@ -624,6 +624,24 @@ public class ZookeeperDiscoverySpi extends IgniteSpiAdapter implements IgniteDis
}
/** {@inheritDoc} */
+ @Override public void excludeNode(String nodeId) {
+ UUID node;
+
+ try {
+ node = UUID.fromString(nodeId);
+ }
+ catch (IllegalArgumentException e) {
+ U.error(log, "Failed to parse node ID: " + nodeId, e);
+
+ return;
+ }
+
+ String msg = "Node excluded, node=" + nodeId + "using JMX interface, initiator=" + getLocalNodeId();
+
+ impl.failNode(node, msg);
+ }
+
+ /** {@inheritDoc} */
@Override public String getZkConnectionString() {
return zkConnectionString;
}