mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-04-02 05:18:49 +00:00
Refresh OpenSearch nodes version in cluster state after upgrade (#865)
Signed-off-by: Shweta Thareja <tharejas@amazon.com> Co-authored-by: Shweta Thareja <tharejas@amazon.com>
This commit is contained in:
parent
4a1add9481
commit
8082604ec2
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* The OpenSearch Contributors require contributions made to
|
||||||
|
* this file be licensed under the Apache-2.0 license or a
|
||||||
|
* compatible open source license.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.opensearch.upgrades;
|
||||||
|
|
||||||
|
import org.opensearch.Version;
|
||||||
|
import org.opensearch.client.Request;
|
||||||
|
import org.opensearch.client.Response;
|
||||||
|
import org.opensearch.common.io.Streams;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class RefreshVersionInClusterStateIT extends AbstractRollingTestCase {
|
||||||
|
|
||||||
|
/*
|
||||||
|
This test ensures that after the upgrade from ElasticSearch/ OpenSearch all nodes report the version on and after 1.0.0
|
||||||
|
*/
|
||||||
|
public void testRefresh() throws IOException {
|
||||||
|
switch (CLUSTER_TYPE) {
|
||||||
|
case OLD:
|
||||||
|
case MIXED:
|
||||||
|
break;
|
||||||
|
case UPGRADED:
|
||||||
|
Response response = client().performRequest(new Request("GET", "/_cat/nodes?h=id,version"));
|
||||||
|
for (String nodeLine : Streams.readAllLines(response.getEntity().getContent())) {
|
||||||
|
String[] elements = nodeLine.split(" +");
|
||||||
|
assertEquals(Version.fromString(elements[1]), Version.CURRENT);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new UnsupportedOperationException("Unknown cluster type [" + CLUSTER_TYPE + "]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -121,7 +121,8 @@ public class JoinHelper {
|
|||||||
this.transportService = transportService;
|
this.transportService = transportService;
|
||||||
this.nodeHealthService = nodeHealthService;
|
this.nodeHealthService = nodeHealthService;
|
||||||
this.joinTimeout = JOIN_TIMEOUT_SETTING.get(settings);
|
this.joinTimeout = JOIN_TIMEOUT_SETTING.get(settings);
|
||||||
this.joinTaskExecutorGenerator = () -> new JoinTaskExecutor(settings, allocationService, logger, rerouteService) {
|
this.joinTaskExecutorGenerator = () -> new JoinTaskExecutor(settings, allocationService, logger, rerouteService,
|
||||||
|
transportService) {
|
||||||
|
|
||||||
private final long term = currentTermSupplier.getAsLong();
|
private final long term = currentTermSupplier.getAsLong();
|
||||||
|
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
package org.opensearch.cluster.coordination;
|
package org.opensearch.cluster.coordination;
|
||||||
|
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.opensearch.LegacyESVersion;
|
||||||
import org.opensearch.Version;
|
import org.opensearch.Version;
|
||||||
import org.opensearch.action.ActionListener;
|
import org.opensearch.action.ActionListener;
|
||||||
import org.opensearch.cluster.ClusterState;
|
import org.opensearch.cluster.ClusterState;
|
||||||
@ -48,6 +49,7 @@ import org.opensearch.common.Priority;
|
|||||||
import org.opensearch.common.settings.Settings;
|
import org.opensearch.common.settings.Settings;
|
||||||
import org.opensearch.discovery.zen.ElectMasterService;
|
import org.opensearch.discovery.zen.ElectMasterService;
|
||||||
import org.opensearch.persistent.PersistentTasksCustomMetadata;
|
import org.opensearch.persistent.PersistentTasksCustomMetadata;
|
||||||
|
import org.opensearch.transport.TransportService;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@ -67,6 +69,7 @@ public class JoinTaskExecutor implements ClusterStateTaskExecutor<JoinTaskExecut
|
|||||||
|
|
||||||
private final Logger logger;
|
private final Logger logger;
|
||||||
private final RerouteService rerouteService;
|
private final RerouteService rerouteService;
|
||||||
|
private final TransportService transportService;
|
||||||
|
|
||||||
private final int minimumMasterNodesOnLocalNode;
|
private final int minimumMasterNodesOnLocalNode;
|
||||||
|
|
||||||
@ -105,11 +108,13 @@ public class JoinTaskExecutor implements ClusterStateTaskExecutor<JoinTaskExecut
|
|||||||
private static final String FINISH_ELECTION_TASK_REASON = "_FINISH_ELECTION_";
|
private static final String FINISH_ELECTION_TASK_REASON = "_FINISH_ELECTION_";
|
||||||
}
|
}
|
||||||
|
|
||||||
public JoinTaskExecutor(Settings settings, AllocationService allocationService, Logger logger, RerouteService rerouteService) {
|
public JoinTaskExecutor(Settings settings, AllocationService allocationService, Logger logger,
|
||||||
|
RerouteService rerouteService, TransportService transportService) {
|
||||||
this.allocationService = allocationService;
|
this.allocationService = allocationService;
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
minimumMasterNodesOnLocalNode = ElectMasterService.DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.get(settings);
|
minimumMasterNodesOnLocalNode = ElectMasterService.DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.get(settings);
|
||||||
this.rerouteService = rerouteService;
|
this.rerouteService = rerouteService;
|
||||||
|
this.transportService = transportService;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -150,7 +155,7 @@ public class JoinTaskExecutor implements ClusterStateTaskExecutor<JoinTaskExecut
|
|||||||
for (final Task joinTask : joiningNodes) {
|
for (final Task joinTask : joiningNodes) {
|
||||||
if (joinTask.isBecomeMasterTask() || joinTask.isFinishElectionTask()) {
|
if (joinTask.isBecomeMasterTask() || joinTask.isFinishElectionTask()) {
|
||||||
// noop
|
// noop
|
||||||
} else if (currentNodes.nodeExistsWithSameRoles(joinTask.node())) {
|
} else if (currentNodes.nodeExistsWithSameRoles(joinTask.node()) && !currentNodes.nodeExistsWithBWCVersion(joinTask.node())) {
|
||||||
logger.debug("received a join request for an existing node [{}]", joinTask.node());
|
logger.debug("received a join request for an existing node [{}]", joinTask.node());
|
||||||
} else {
|
} else {
|
||||||
final DiscoveryNode node = joinTask.node();
|
final DiscoveryNode node = joinTask.node();
|
||||||
@ -222,8 +227,10 @@ public class JoinTaskExecutor implements ClusterStateTaskExecutor<JoinTaskExecut
|
|||||||
nodesBuilder.masterNodeId(currentState.nodes().getLocalNodeId());
|
nodesBuilder.masterNodeId(currentState.nodes().getLocalNodeId());
|
||||||
|
|
||||||
for (final Task joinTask : joiningNodes) {
|
for (final Task joinTask : joiningNodes) {
|
||||||
if (joinTask.isBecomeMasterTask() || joinTask.isFinishElectionTask()) {
|
if (joinTask.isBecomeMasterTask()) {
|
||||||
// noop
|
refreshDiscoveryNodeVersionAfterUpgrade(currentNodes, nodesBuilder);
|
||||||
|
} else if (joinTask.isFinishElectionTask()) {
|
||||||
|
//no-op
|
||||||
} else {
|
} else {
|
||||||
final DiscoveryNode joiningNode = joinTask.node();
|
final DiscoveryNode joiningNode = joinTask.node();
|
||||||
final DiscoveryNode nodeWithSameId = nodesBuilder.get(joiningNode.getId());
|
final DiscoveryNode nodeWithSameId = nodesBuilder.get(joiningNode.getId());
|
||||||
@ -254,6 +261,45 @@ public class JoinTaskExecutor implements ClusterStateTaskExecutor<JoinTaskExecut
|
|||||||
return ClusterState.builder(allocationService.disassociateDeadNodes(tmpState, false, "removed dead nodes on election"));
|
return ClusterState.builder(allocationService.disassociateDeadNodes(tmpState, false, "removed dead nodes on election"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void refreshDiscoveryNodeVersionAfterUpgrade(DiscoveryNodes currentNodes, DiscoveryNodes.Builder nodesBuilder) {
|
||||||
|
// During the upgrade from Elasticsearch, OpenSearch node send their version as 7.10.2 to Elasticsearch master
|
||||||
|
// in order to successfully join the cluster. But as soon as OpenSearch node becomes the master, cluster state
|
||||||
|
// should show the OpenSearch nodes version as 1.x. As the cluster state was carry forwarded from ES master,
|
||||||
|
// version in DiscoveryNode is stale 7.10.2. As soon as OpenSearch node becomes master, it can refresh the
|
||||||
|
// DiscoveryNodes version and publish the updated state while finishing the election. This helps in atomically
|
||||||
|
// updating the version of those node which have connection with the new master.
|
||||||
|
// Note: This should get deprecated with BWC mode logic
|
||||||
|
if(null == transportService) {
|
||||||
|
// this logic is only applicable when OpenSearch node is master and is noop for zen discovery node
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(currentNodes.getMinNodeVersion().before(Version.V_1_0_0)) {
|
||||||
|
Map<String, Version> channelVersions = transportService.getChannelVersion(currentNodes);
|
||||||
|
for (DiscoveryNode node : currentNodes) {
|
||||||
|
if(channelVersions.containsKey(node.getId())) {
|
||||||
|
if (channelVersions.get(node.getId()) != node.getVersion()) {
|
||||||
|
DiscoveryNode tmpNode = nodesBuilder.get(node.getId());
|
||||||
|
nodesBuilder.remove(node.getId());
|
||||||
|
nodesBuilder.add(new DiscoveryNode(tmpNode.getName(), tmpNode.getId(), tmpNode.getEphemeralId(),
|
||||||
|
tmpNode.getHostName(), tmpNode.getHostAddress(), tmpNode.getAddress(), tmpNode.getAttributes(),
|
||||||
|
tmpNode.getRoles(), channelVersions.get(tmpNode.getId())));
|
||||||
|
logger.info("Refreshed the DiscoveryNode version for node {}:{} from {} to {}",
|
||||||
|
node.getId(), node.getAddress(), node.getVersion(), channelVersions.get(tmpNode.getId()));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// in case existing OpenSearch node is present in the cluster and but there is no connection to that node yet,
|
||||||
|
// either that node will send new JoinRequest to the master with version >=1.0, then no issue or
|
||||||
|
// there is an edge case if doesn't send JoinRequest and connection is established,
|
||||||
|
// then it can continue to report version as 7.10.2 instead of actual OpenSearch version. So,
|
||||||
|
// removing the node from cluster state to prevent stale version reporting and let it reconnect.
|
||||||
|
if (node.getVersion().equals(LegacyESVersion.V_7_10_2)) {
|
||||||
|
nodesBuilder.remove(node.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean runOnlyOnMaster() {
|
public boolean runOnlyOnMaster() {
|
||||||
// we validate that we are allowed to change the cluster state during cluster state processing
|
// we validate that we are allowed to change the cluster state during cluster state processing
|
||||||
|
@ -367,7 +367,7 @@ public class DiscoveryNode implements Writeable, ToXContentFragment {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (out.getVersion().before(Version.V_1_0_0)) {
|
if (out.getVersion().before(Version.V_1_0_0) && version.onOrAfter(Version.V_1_0_0)) {
|
||||||
Version.writeVersion(LegacyESVersion.V_7_10_2, out);
|
Version.writeVersion(LegacyESVersion.V_7_10_2, out);
|
||||||
} else {
|
} else {
|
||||||
Version.writeVersion(version, out);
|
Version.writeVersion(version, out);
|
||||||
|
@ -35,6 +35,7 @@ package org.opensearch.cluster.node;
|
|||||||
import com.carrotsearch.hppc.ObjectHashSet;
|
import com.carrotsearch.hppc.ObjectHashSet;
|
||||||
import com.carrotsearch.hppc.cursors.ObjectCursor;
|
import com.carrotsearch.hppc.cursors.ObjectCursor;
|
||||||
import com.carrotsearch.hppc.cursors.ObjectObjectCursor;
|
import com.carrotsearch.hppc.cursors.ObjectObjectCursor;
|
||||||
|
import org.opensearch.LegacyESVersion;
|
||||||
import org.opensearch.Version;
|
import org.opensearch.Version;
|
||||||
import org.opensearch.cluster.AbstractDiffable;
|
import org.opensearch.cluster.AbstractDiffable;
|
||||||
import org.opensearch.cluster.Diff;
|
import org.opensearch.cluster.Diff;
|
||||||
@ -226,6 +227,16 @@ public class DiscoveryNodes extends AbstractDiffable<DiscoveryNodes> implements
|
|||||||
return existing != null && existing.equals(discoveryNode) && existing.getRoles().equals(discoveryNode.getRoles());
|
return existing != null && existing.equals(discoveryNode) && existing.getRoles().equals(discoveryNode.getRoles());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if the given node exists and has the right version. During upgrade from Elasticsearch version as OpenSearch node run in
|
||||||
|
* BWC mode and can have the version as 7.10.2 in cluster state from older master to OpenSearch master.
|
||||||
|
*/
|
||||||
|
public boolean nodeExistsWithBWCVersion(DiscoveryNode discoveryNode) {
|
||||||
|
final DiscoveryNode existing = nodes.get(discoveryNode.getId());
|
||||||
|
return existing != null && existing.equals(discoveryNode) &&
|
||||||
|
existing.getVersion().equals(LegacyESVersion.V_7_10_2) && discoveryNode.getVersion().onOrAfter(Version.V_1_0_0);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the id of the master node
|
* Get the id of the master node
|
||||||
*
|
*
|
||||||
|
@ -77,7 +77,7 @@ public class NodeJoinController {
|
|||||||
public NodeJoinController(Settings settings, MasterService masterService, AllocationService allocationService,
|
public NodeJoinController(Settings settings, MasterService masterService, AllocationService allocationService,
|
||||||
ElectMasterService electMaster, RerouteService rerouteService) {
|
ElectMasterService electMaster, RerouteService rerouteService) {
|
||||||
this.masterService = masterService;
|
this.masterService = masterService;
|
||||||
joinTaskExecutor = new JoinTaskExecutor(settings, allocationService, logger, rerouteService) {
|
joinTaskExecutor = new JoinTaskExecutor(settings, allocationService, logger, rerouteService, null) {
|
||||||
@Override
|
@Override
|
||||||
public void clusterStatePublished(ClusterChangedEvent event) {
|
public void clusterStatePublished(ClusterChangedEvent event) {
|
||||||
electMaster.logMinimumMasterNodesWarningIfNecessary(event.previousState(), event.state());
|
electMaster.logMinimumMasterNodesWarningIfNecessary(event.previousState(), event.state());
|
||||||
|
@ -44,6 +44,7 @@ import org.opensearch.client.Client;
|
|||||||
import org.opensearch.client.transport.TransportClient;
|
import org.opensearch.client.transport.TransportClient;
|
||||||
import org.opensearch.cluster.ClusterName;
|
import org.opensearch.cluster.ClusterName;
|
||||||
import org.opensearch.cluster.node.DiscoveryNode;
|
import org.opensearch.cluster.node.DiscoveryNode;
|
||||||
|
import org.opensearch.cluster.node.DiscoveryNodes;
|
||||||
import org.opensearch.common.Nullable;
|
import org.opensearch.common.Nullable;
|
||||||
import org.opensearch.common.Strings;
|
import org.opensearch.common.Strings;
|
||||||
import org.opensearch.common.component.AbstractLifecycleComponent;
|
import org.opensearch.common.component.AbstractLifecycleComponent;
|
||||||
@ -74,6 +75,7 @@ import java.io.UncheckedIOException;
|
|||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -705,6 +707,18 @@ public class TransportService extends AbstractLifecycleComponent implements Repo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Map<String, Version> getChannelVersion(DiscoveryNodes nodes) {
|
||||||
|
Map<String, Version> nodeChannelVersions = new HashMap<>(nodes.getSize());
|
||||||
|
for (DiscoveryNode node: nodes) {
|
||||||
|
try {
|
||||||
|
nodeChannelVersions.putIfAbsent(node.getId(), connectionManager.getConnection(node).getVersion());
|
||||||
|
} catch (Exception e) {
|
||||||
|
// ignore in case node is not connected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nodeChannelVersions;
|
||||||
|
}
|
||||||
|
|
||||||
public final <T extends TransportResponse> void sendChildRequest(final DiscoveryNode node, final String action,
|
public final <T extends TransportResponse> void sendChildRequest(final DiscoveryNode node, final String action,
|
||||||
final TransportRequest request, final Task parentTask,
|
final TransportRequest request, final Task parentTask,
|
||||||
final TransportRequestOptions options,
|
final TransportRequestOptions options,
|
||||||
|
@ -47,9 +47,13 @@ import org.opensearch.common.collect.List;
|
|||||||
import org.opensearch.common.settings.Settings;
|
import org.opensearch.common.settings.Settings;
|
||||||
import org.opensearch.test.OpenSearchTestCase;
|
import org.opensearch.test.OpenSearchTestCase;
|
||||||
import org.opensearch.test.VersionUtils;
|
import org.opensearch.test.VersionUtils;
|
||||||
|
import org.opensearch.transport.TransportService;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static org.mockito.Matchers.anyBoolean;
|
||||||
import static org.opensearch.test.VersionUtils.getPreviousVersion;
|
import static org.opensearch.test.VersionUtils.getPreviousVersion;
|
||||||
import static org.opensearch.test.VersionUtils.incompatibleFutureVersion;
|
import static org.opensearch.test.VersionUtils.incompatibleFutureVersion;
|
||||||
import static org.opensearch.test.VersionUtils.maxCompatibleVersion;
|
import static org.opensearch.test.VersionUtils.maxCompatibleVersion;
|
||||||
@ -173,7 +177,7 @@ public class JoinTaskExecutorTests extends OpenSearchTestCase {
|
|||||||
when(allocationService.adaptAutoExpandReplicas(any())).then(invocationOnMock -> invocationOnMock.getArguments()[0]);
|
when(allocationService.adaptAutoExpandReplicas(any())).then(invocationOnMock -> invocationOnMock.getArguments()[0]);
|
||||||
final RerouteService rerouteService = (reason, priority, listener) -> listener.onResponse(null);
|
final RerouteService rerouteService = (reason, priority, listener) -> listener.onResponse(null);
|
||||||
|
|
||||||
final JoinTaskExecutor joinTaskExecutor = new JoinTaskExecutor(Settings.EMPTY, allocationService, logger, rerouteService);
|
final JoinTaskExecutor joinTaskExecutor = new JoinTaskExecutor(Settings.EMPTY, allocationService, logger, rerouteService, null);
|
||||||
|
|
||||||
final DiscoveryNode masterNode = new DiscoveryNode(UUIDs.base64UUID(), buildNewFakeTransportAddress(), Version.CURRENT);
|
final DiscoveryNode masterNode = new DiscoveryNode(UUIDs.base64UUID(), buildNewFakeTransportAddress(), Version.CURRENT);
|
||||||
|
|
||||||
@ -196,4 +200,61 @@ public class JoinTaskExecutorTests extends OpenSearchTestCase {
|
|||||||
|
|
||||||
assertThat(result.resultingState.getNodes().get(actualNode.getId()).getRoles(), equalTo(actualNode.getRoles()));
|
assertThat(result.resultingState.getNodes().get(actualNode.getId()).getRoles(), equalTo(actualNode.getRoles()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testUpdatesNodeWithOpenSearchVersionForExistingAndNewNodes() throws Exception {
|
||||||
|
// During the upgrade from Elasticsearch, OpenSearch node send their version as 7.10.2 to Elasticsearch master
|
||||||
|
// in order to successfully join the cluster. But as soon as OpenSearch node becomes the master, cluster state
|
||||||
|
// should show the OpenSearch nodes version as 1.x. As the cluster state was carry forwarded from ES master,
|
||||||
|
// version in DiscoveryNode is stale 7.10.2.
|
||||||
|
final AllocationService allocationService = mock(AllocationService.class);
|
||||||
|
when(allocationService.adaptAutoExpandReplicas(any())).then(invocationOnMock -> invocationOnMock.getArguments()[0]);
|
||||||
|
when(allocationService.disassociateDeadNodes(any(), anyBoolean(), any())).then(
|
||||||
|
invocationOnMock -> invocationOnMock.getArguments()[0]);
|
||||||
|
final RerouteService rerouteService = (reason, priority, listener) -> listener.onResponse(null);
|
||||||
|
Map<String, Version> channelVersions = new HashMap<>();
|
||||||
|
String node_1 = UUIDs.base64UUID(); // OpenSearch node running BWC version
|
||||||
|
String node_2 = UUIDs.base64UUID(); // OpenSearch node running BWC version
|
||||||
|
String node_3 = UUIDs.base64UUID(); // OpenSearch node running BWC version, sending new join request and no active channel
|
||||||
|
String node_4 = UUIDs.base64UUID(); // ES node 7.10.2
|
||||||
|
String node_5 = UUIDs.base64UUID(); // ES node 7.10.2 in cluster but missing channel version
|
||||||
|
String node_6 = UUIDs.base64UUID(); // ES node 7.9.0
|
||||||
|
String node_7 = UUIDs.base64UUID(); // ES node 7.9.0 in cluster but missing channel version
|
||||||
|
channelVersions.put(node_1, LegacyESVersion.CURRENT);
|
||||||
|
channelVersions.put(node_2, LegacyESVersion.CURRENT);
|
||||||
|
channelVersions.put(node_4, LegacyESVersion.V_7_10_2);
|
||||||
|
channelVersions.put(node_6, LegacyESVersion.V_7_9_0);
|
||||||
|
|
||||||
|
final TransportService transportService = mock(TransportService.class);
|
||||||
|
when(transportService.getChannelVersion(any())).thenReturn(channelVersions);
|
||||||
|
DiscoveryNodes.Builder nodes = new DiscoveryNodes.Builder().localNodeId(node_1);
|
||||||
|
nodes.add(new DiscoveryNode(node_1, buildNewFakeTransportAddress(), LegacyESVersion.V_7_10_2));
|
||||||
|
nodes.add(new DiscoveryNode(node_2, buildNewFakeTransportAddress(), LegacyESVersion.V_7_10_2));
|
||||||
|
nodes.add(new DiscoveryNode(node_3, buildNewFakeTransportAddress(), LegacyESVersion.V_7_10_2));
|
||||||
|
nodes.add(new DiscoveryNode(node_4, buildNewFakeTransportAddress(), LegacyESVersion.V_7_10_2));
|
||||||
|
nodes.add(new DiscoveryNode(node_5, buildNewFakeTransportAddress(), LegacyESVersion.V_7_10_2));
|
||||||
|
nodes.add(new DiscoveryNode(node_6, buildNewFakeTransportAddress(), LegacyESVersion.V_7_9_0));
|
||||||
|
nodes.add(new DiscoveryNode(node_7, buildNewFakeTransportAddress(), LegacyESVersion.V_7_9_0));
|
||||||
|
final ClusterState clusterState = ClusterState.builder(ClusterName.DEFAULT).nodes(nodes).build();
|
||||||
|
final JoinTaskExecutor joinTaskExecutor = new JoinTaskExecutor(Settings.EMPTY, allocationService, logger,
|
||||||
|
rerouteService, transportService);
|
||||||
|
final DiscoveryNode existing_node_3 = clusterState.nodes().get(node_3);
|
||||||
|
final DiscoveryNode node_3_new_join = new DiscoveryNode(existing_node_3.getName(), existing_node_3.getId(),
|
||||||
|
existing_node_3.getEphemeralId(), existing_node_3.getHostName(), existing_node_3.getHostAddress(),
|
||||||
|
existing_node_3.getAddress(), existing_node_3.getAttributes(), existing_node_3.getRoles(), Version.CURRENT);
|
||||||
|
|
||||||
|
final ClusterStateTaskExecutor.ClusterTasksResult<JoinTaskExecutor.Task> result
|
||||||
|
= joinTaskExecutor.execute(clusterState, List.of(new JoinTaskExecutor.Task(node_3_new_join, "test"),
|
||||||
|
JoinTaskExecutor.newBecomeMasterTask(), JoinTaskExecutor.newFinishElectionTask()));
|
||||||
|
final ClusterStateTaskExecutor.TaskResult taskResult = result.executionResults.values().iterator().next();
|
||||||
|
assertTrue(taskResult.isSuccess());
|
||||||
|
DiscoveryNodes resultNodes = result.resultingState.getNodes();
|
||||||
|
assertEquals(resultNodes.get(node_1).getVersion(), Version.CURRENT);
|
||||||
|
assertEquals(resultNodes.get(node_2).getVersion(), Version.CURRENT);
|
||||||
|
assertEquals(resultNodes.get(node_3).getVersion(), Version.CURRENT); // 7.10.2 in old state but sent new join and processed
|
||||||
|
assertEquals(resultNodes.get(node_4).getVersion(), LegacyESVersion.V_7_10_2);
|
||||||
|
assertFalse(resultNodes.nodeExists(node_5)); // 7.10.2 node without active channel will be removed and should rejoin
|
||||||
|
assertEquals(resultNodes.get(node_6).getVersion(), LegacyESVersion.V_7_9_0);
|
||||||
|
// 7.9.0 node without active channel but shouldn't get removed
|
||||||
|
assertEquals(resultNodes.get(node_7).getVersion(), LegacyESVersion.V_7_9_0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -420,4 +420,30 @@ public class DiscoveryNodesTests extends OpenSearchTestCase {
|
|||||||
assertEquals( Version.fromString("1.1.0"), build.getMaxNodeVersion());
|
assertEquals( Version.fromString("1.1.0"), build.getMaxNodeVersion());
|
||||||
assertEquals( LegacyESVersion.fromString("5.1.0"), build.getMinNodeVersion());
|
assertEquals( LegacyESVersion.fromString("5.1.0"), build.getMinNodeVersion());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testNodeExistsWithBWCVersion() {
|
||||||
|
DiscoveryNodes.Builder discoBuilder = DiscoveryNodes.builder();
|
||||||
|
DiscoveryNode node_1 = new DiscoveryNode("name_" + 1, "node_" + 1, buildNewFakeTransportAddress(), Collections.emptyMap(),
|
||||||
|
new HashSet<>(randomSubsetOf(DiscoveryNodeRole.BUILT_IN_ROLES)),
|
||||||
|
LegacyESVersion.fromString("7.10.2"));
|
||||||
|
DiscoveryNode node_2 = new DiscoveryNode("name_" + 2, "node_" + 2, buildNewFakeTransportAddress(), Collections.emptyMap(),
|
||||||
|
new HashSet<>(randomSubsetOf(DiscoveryNodeRole.BUILT_IN_ROLES)),
|
||||||
|
LegacyESVersion.fromString("7.9.0"));
|
||||||
|
discoBuilder.add(node_1);
|
||||||
|
discoBuilder.add(node_2);
|
||||||
|
|
||||||
|
discoBuilder.localNodeId("name_1");
|
||||||
|
discoBuilder.masterNodeId("name_2");
|
||||||
|
DiscoveryNodes build = discoBuilder.build();
|
||||||
|
assertTrue(build.nodeExistsWithBWCVersion(buildDiscoveryNodeFromExisting(node_1, Version.CURRENT)));
|
||||||
|
assertFalse(build.nodeExistsWithBWCVersion(buildDiscoveryNodeFromExisting(node_2,
|
||||||
|
LegacyESVersion.fromString("7.10.2"))));
|
||||||
|
assertFalse(build.nodeExistsWithBWCVersion(buildDiscoveryNodeFromExisting(node_1,
|
||||||
|
LegacyESVersion.fromString("6.8.0"))));
|
||||||
|
}
|
||||||
|
|
||||||
|
private DiscoveryNode buildDiscoveryNodeFromExisting(DiscoveryNode existing, Version newVersion) {
|
||||||
|
return new DiscoveryNode(existing.getName(), existing.getId(), existing.getEphemeralId(), existing.getHostName(),
|
||||||
|
existing.getHostAddress(), existing.getAddress(), existing.getAttributes(), existing.getRoles(), newVersion);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -250,7 +250,7 @@ public class ClusterStateChanges {
|
|||||||
transportService, clusterService, threadPool, createIndexService, actionFilters, indexNameExpressionResolver);
|
transportService, clusterService, threadPool, createIndexService, actionFilters, indexNameExpressionResolver);
|
||||||
|
|
||||||
nodeRemovalExecutor = new NodeRemovalClusterStateTaskExecutor(allocationService, logger);
|
nodeRemovalExecutor = new NodeRemovalClusterStateTaskExecutor(allocationService, logger);
|
||||||
joinTaskExecutor = new JoinTaskExecutor(Settings.EMPTY, allocationService, logger, (s, p, r) -> {});
|
joinTaskExecutor = new JoinTaskExecutor(Settings.EMPTY, allocationService, logger, (s, p, r) -> {}, transportService);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ClusterState createIndex(ClusterState state, CreateIndexRequest request) {
|
public ClusterState createIndex(ClusterState state, CreateIndexRequest request) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user