Skip to content

Commit 85cf0e6

Browse files
Node repurpose tool
Changed NodeRepurposeCommandIT to be more specific about which node it runs the tool on rather than just try all. Fixed NodeToolCli messaging.
1 parent 4df583c commit 85cf0e6

3 files changed

Lines changed: 22 additions & 27 deletions

File tree

qa/vagrant/src/main/java/org/elasticsearch/packaging/test/ArchiveTestCase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ public void test110ElasticsearchNodeCliPackaging() {
343343
Platforms.PlatformAction action = () -> {
344344
final Result result = sh.run(bin.elasticsearchNode + " -h");
345345
assertThat(result.stdout,
346-
containsString("A CLI tool to unsafely recover a cluster after the permanent loss of too many master-eligible nodes"));
346+
containsString("A CLI tool to do unsafe cluster and index manipulations on current node"));
347347
};
348348

349349
if (distribution().equals(Distribution.DEFAULT_LINUX) || distribution().equals(Distribution.DEFAULT_WINDOWS)) {

server/src/main/java/org/elasticsearch/cluster/coordination/NodeToolCli.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@
3333
public class NodeToolCli extends MultiCommand {
3434

3535
public NodeToolCli() {
36-
super("A CLI tool to unsafely recover a cluster after the permanent loss of too many master-eligible nodes", ()->{});
36+
super("A CLI tool to do unsafe cluster and index manipulations on current node",
37+
()->{});
3738
CommandLoggingConfigurator.configureLoggingWithoutConfig();
3839
subcommands.put("unsafe-bootstrap", new UnsafeBootstrapMasterCommand());
3940
subcommands.put("detach-cluster", new DetachClusterCommand());

server/src/test/java/org/elasticsearch/env/NodeRepurposeCommandIT.java

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import org.elasticsearch.test.ESIntegTestCase;
2525
import org.hamcrest.Matcher;
2626

27-
import java.util.stream.IntStream;
27+
import java.util.List;
2828

2929
import static org.hamcrest.Matchers.allOf;
3030
import static org.hamcrest.Matchers.containsString;
@@ -38,7 +38,7 @@ public void testRepurpose() throws Exception {
3838
final String indexName = "test-repurpose";
3939

4040
logger.info("--> starting two nodes");
41-
internalCluster().startNodes(2);
41+
List<String> nodes = internalCluster().startNodes(2);
4242

4343
logger.info("--> creating index");
4444
prepareCreate(indexName, Settings.builder()
@@ -67,34 +67,28 @@ public void testRepurpose() throws Exception {
6767
() -> internalCluster().startNode(noMasterNoDataSettings)
6868
);
6969

70+
int runningOrdinal = nodes.indexOf(internalCluster().getNodeNames()[0]);
71+
int stoppedOrdinal = 1-runningOrdinal;
72+
7073
logger.info("--> Repurposing node");
71-
executeRepurposeCommand(noMasterNoDataSettings, indexUUID);
74+
executeRepurposeCommandForOrdinal(noMasterNoDataSettings, indexUUID, stoppedOrdinal);
75+
76+
ElasticsearchException lockedException = expectThrows(ElasticsearchException.class,
77+
() -> executeRepurposeCommandForOrdinal(noMasterNoDataSettings, indexUUID, runningOrdinal)
78+
);
79+
80+
assertThat(lockedException.getMessage(), containsString(NodeRepurposeCommand.FAILED_TO_OBTAIN_NODE_LOCK_MSG));
7281

7382
logger.info("--> Starting node after repurpose");
7483
internalCluster().startNode(noMasterNoDataSettings);
7584
}
7685

77-
private void executeRepurposeCommand(Settings settings, String indexUUID) throws Exception {
78-
assertEquals("Exactly one node folder/ordinal must succeed", 1,
79-
IntStream.range(0, 2).filter(i -> executeRepurposeCommandForOrdinal(settings, indexUUID, i)).count());
80-
}
81-
82-
private boolean executeRepurposeCommandForOrdinal(Settings settings, String indexUUID, int ordinal) {
83-
try {
84-
boolean verbose = randomBoolean();
85-
Matcher<String> matcher = allOf(
86-
containsString(NodeRepurposeCommand.noMasterMessage(1, 1, TestEnvironment.newEnvironment(settings).dataFiles().length)),
87-
not(contains(NodeRepurposeCommand.PRE_V7_MESSAGE)),
88-
NodeRepurposeCommandTests.conditionalNot(containsString(indexUUID), verbose == false));
89-
NodeRepurposeCommandTests.verifySuccess(settings, matcher, verbose, ordinal);
90-
return true;
91-
} catch (ElasticsearchException e) {
92-
if (e.getMessage().contains(NodeRepurposeCommand.FAILED_TO_OBTAIN_NODE_LOCK_MSG))
93-
return false;
94-
else
95-
throw e;
96-
} catch (Exception e) {
97-
throw new RuntimeException(e);
98-
}
86+
private void executeRepurposeCommandForOrdinal(Settings settings, String indexUUID, int ordinal) throws Exception {
87+
boolean verbose = randomBoolean();
88+
Matcher<String> matcher = allOf(
89+
containsString(NodeRepurposeCommand.noMasterMessage(1, 1, TestEnvironment.newEnvironment(settings).dataFiles().length)),
90+
not(contains(NodeRepurposeCommand.PRE_V7_MESSAGE)),
91+
NodeRepurposeCommandTests.conditionalNot(containsString(indexUUID), verbose == false));
92+
NodeRepurposeCommandTests.verifySuccess(settings, matcher, verbose, ordinal);
9993
}
10094
}

0 commit comments

Comments
 (0)