Skip to content

Commit

Permalink
Disallow multiple data paths for search nodes (#6427) (#6472)
Browse files Browse the repository at this point in the history
Add bootstrap check to avoid search node has multiple data path


(cherry picked from commit ceb3928)

Signed-off-by: Xue Zhou <xuezhou@amazon.com>
Signed-off-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
  • Loading branch information
1 parent 0fa4a61 commit 6a3bd00
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
## [Unreleased 2.x]
### Added
- Add GeoTile and GeoHash Grid aggregations on GeoShapes. ([#5589](https://github.com/opensearch-project/OpenSearch/pull/5589))
- Disallow multiple data paths for search nodes ([#6427](https://github.com/opensearch-project/OpenSearch/pull/6427))

### Dependencies

Expand Down
25 changes: 25 additions & 0 deletions server/src/main/java/org/opensearch/bootstrap/BootstrapChecks.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,18 @@
import org.apache.lucene.util.Constants;
import org.opensearch.bootstrap.jvm.DenyJvmVersionsParser;
import org.opensearch.cluster.coordination.ClusterBootstrapService;
import org.opensearch.cluster.node.DiscoveryNodeRole;
import org.opensearch.common.SuppressForbidden;
import org.opensearch.common.io.PathUtils;
import org.opensearch.common.settings.Setting;
import org.opensearch.common.transport.BoundTransportAddress;
import org.opensearch.common.transport.TransportAddress;
import org.opensearch.discovery.DiscoveryModule;
import org.opensearch.env.Environment;
import org.opensearch.index.IndexModule;
import org.opensearch.monitor.jvm.JvmInfo;
import org.opensearch.monitor.process.ProcessProbe;
import org.opensearch.node.NodeRoleSettings;
import org.opensearch.node.NodeValidationException;

import java.io.BufferedReader;
Expand Down Expand Up @@ -228,6 +231,7 @@ static List<BootstrapCheck> checks() {
checks.add(new JavaVersionCheck());
checks.add(new AllPermissionCheck());
checks.add(new DiscoveryConfiguredCheck());
checks.add(new MultipleDataPathCheck());
return Collections.unmodifiableList(checks);
}

Expand Down Expand Up @@ -751,4 +755,25 @@ public BootstrapCheckResult check(BootstrapContext context) {
);
}
}

/**
* Bootstrap check that if a search node contains multiple data paths
*/
static class MultipleDataPathCheck implements BootstrapCheck {

@Override
public BootstrapCheckResult check(BootstrapContext context) {
if (NodeRoleSettings.NODE_ROLES_SETTING.get(context.settings()).contains(DiscoveryNodeRole.SEARCH_ROLE)
&& Environment.PATH_DATA_SETTING.get(context.settings()).size() > 1) {
return BootstrapCheckResult.failure("Multiple data paths are not allowed for search nodes");
}
return BootstrapCheckResult.success();
}

@Override
public final boolean alwaysEnforce() {
return true;
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,19 +36,24 @@
import org.apache.lucene.util.Constants;
import org.opensearch.cluster.coordination.ClusterBootstrapService;
import org.opensearch.cluster.metadata.Metadata;
import org.opensearch.cluster.node.DiscoveryNodeRole;
import org.opensearch.common.CheckedConsumer;
import org.opensearch.common.io.PathUtils;
import org.opensearch.common.settings.Settings;
import org.opensearch.common.transport.BoundTransportAddress;
import org.opensearch.common.transport.TransportAddress;
import org.opensearch.discovery.DiscoveryModule;
import org.opensearch.discovery.SettingsBasedSeedHostsProvider;
import org.opensearch.env.Environment;
import org.opensearch.monitor.jvm.JvmInfo;
import org.opensearch.node.NodeRoleSettings;
import org.opensearch.node.NodeValidationException;
import org.opensearch.test.AbstractBootstrapCheckTestCase;
import org.hamcrest.Matcher;

import java.lang.Runtime.Version;
import java.net.InetAddress;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
Expand Down Expand Up @@ -774,4 +779,41 @@ Version getVersion() {
version.set(Runtime.version());
BootstrapChecks.check(emptyContext, true, Collections.singletonList(check));
}

public void testMultipleDataPathsForSearchNodeCheck() {
Path path = PathUtils.get(createTempDir().toString());
String[] paths = new String[] { path.resolve("a").toString(), path.resolve("b").toString() };

final NodeValidationException e = expectThrows(
NodeValidationException.class,
() -> performDataPathsCheck(paths, DiscoveryNodeRole.SEARCH_ROLE.roleName())
);
assertThat(e.getMessage(), containsString("Multiple data paths are not allowed for search nodes"));
}

public void testMultipleDataPathsForDataNodeCheck() throws NodeValidationException {
Path path = PathUtils.get(createTempDir().toString());
String[] paths = new String[] { path.resolve("a").toString(), path.resolve("b").toString() };

performDataPathsCheck(paths, DiscoveryNodeRole.DATA_ROLE.roleName());
}

public void testSingleDataPathForSearchNodeCheck() throws NodeValidationException {
Path path = PathUtils.get(createTempDir().toString());
String[] paths = new String[] { path.resolve("a").toString() };

performDataPathsCheck(paths, DiscoveryNodeRole.SEARCH_ROLE.roleName());
}

private void performDataPathsCheck(String[] paths, String roleName) throws NodeValidationException {
final BootstrapContext context = createTestContext(
Settings.builder()
.putList(NodeRoleSettings.NODE_ROLES_SETTING.getKey(), Collections.singletonList(roleName))
.putList(Environment.PATH_DATA_SETTING.getKey(), paths)
.build(),
Metadata.EMPTY_METADATA
);
final List<BootstrapCheck> checks = Collections.singletonList(new BootstrapChecks.MultipleDataPathCheck());
BootstrapChecks.check(context, true, checks);
}
}

0 comments on commit 6a3bd00

Please sign in to comment.