Search in sources :

Example 26 with NodeEnvironment

use of org.elasticsearch.env.NodeEnvironment in project elasticsearch by elastic.

the class GatewayIndexStateIT method testRecoverBrokenIndexMetadata.

/**
     * This test really tests worst case scenario where we have a broken setting or any setting that prevents an index from being
     * allocated in our metadata that we recover. In that case we now have the ability to check the index on local recovery from disk
     * if it is sane and if we can successfully create an IndexService. This also includes plugins etc.
     */
public void testRecoverBrokenIndexMetadata() throws Exception {
    logger.info("--> starting one node");
    internalCluster().startNode();
    logger.info("--> indexing a simple document");
    client().prepareIndex("test", "type1", "1").setSource("field1", "value1").setRefreshPolicy(IMMEDIATE).get();
    logger.info("--> waiting for green status");
    if (usually()) {
        ensureYellow();
    } else {
        internalCluster().startNode();
        client().admin().cluster().health(Requests.clusterHealthRequest().waitForGreenStatus().waitForEvents(Priority.LANGUID).waitForNoRelocatingShards(true).waitForNodes("2")).actionGet();
    }
    ClusterState state = client().admin().cluster().prepareState().get().getState();
    IndexMetaData metaData = state.getMetaData().index("test");
    for (NodeEnvironment services : internalCluster().getInstances(NodeEnvironment.class)) {
        IndexMetaData brokenMeta = IndexMetaData.builder(metaData).settings(Settings.builder().put(metaData.getSettings()).put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT.minimumIndexCompatibilityVersion().id).put("index.similarity.BM25.type", "classic").put("index.analysis.filter.myCollator.type", "icu_collation")).build();
        IndexMetaData.FORMAT.write(brokenMeta, services.indexPaths(brokenMeta.getIndex()));
    }
    internalCluster().fullRestart();
    // ensureGreen(closedIndex) waits for the index to show up in the metadata
    // this is crucial otherwise the state call below might not contain the index yet
    ensureGreen(metaData.getIndex().getName());
    state = client().admin().cluster().prepareState().get().getState();
    assertEquals(IndexMetaData.State.CLOSE, state.getMetaData().index(metaData.getIndex()).getState());
    assertEquals("classic", state.getMetaData().index(metaData.getIndex()).getSettings().get("archived.index.similarity.BM25.type"));
    // try to open it with the broken setting - fail again!
    ElasticsearchException ex = expectThrows(ElasticsearchException.class, () -> client().admin().indices().prepareOpen("test").get());
    assertEquals(ex.getMessage(), "Failed to verify index " + metaData.getIndex());
    assertNotNull(ex.getCause());
    assertEquals(IllegalArgumentException.class, ex.getCause().getClass());
    assertEquals(ex.getCause().getMessage(), "Unknown filter type [icu_collation] for [myCollator]");
}
Also used : ClusterState(org.elasticsearch.cluster.ClusterState) NodeEnvironment(org.elasticsearch.env.NodeEnvironment) ElasticsearchException(org.elasticsearch.ElasticsearchException) IndexMetaData(org.elasticsearch.cluster.metadata.IndexMetaData)

Example 27 with NodeEnvironment

use of org.elasticsearch.env.NodeEnvironment in project elasticsearch by elastic.

the class GatewayIndexStateIT method testRecoverMissingAnalyzer.

/**
     * This test really tests worst case scenario where we have a missing analyzer setting.
     * In that case we now have the ability to check the index on local recovery from disk
     * if it is sane and if we can successfully create an IndexService.
     * This also includes plugins etc.
     */
public void testRecoverMissingAnalyzer() throws Exception {
    logger.info("--> starting one node");
    internalCluster().startNode();
    prepareCreate("test").setSettings(Settings.builder().put("index.analysis.analyzer.test.tokenizer", "keyword").put("index.number_of_shards", "1")).addMapping("type1", "{\n" + "    \"type1\": {\n" + "      \"properties\": {\n" + "        \"field1\": {\n" + "          \"type\": \"text\",\n" + "          \"analyzer\": \"test\"\n" + "        }\n" + "      }\n" + "    }\n" + "  }}", XContentType.JSON).get();
    logger.info("--> indexing a simple document");
    client().prepareIndex("test", "type1", "1").setSource("field1", "value one").setRefreshPolicy(IMMEDIATE).get();
    logger.info("--> waiting for green status");
    if (usually()) {
        ensureYellow();
    } else {
        internalCluster().startNode();
        client().admin().cluster().health(Requests.clusterHealthRequest().waitForGreenStatus().waitForEvents(Priority.LANGUID).waitForNoRelocatingShards(true).waitForNodes("2")).actionGet();
    }
    ClusterState state = client().admin().cluster().prepareState().get().getState();
    IndexMetaData metaData = state.getMetaData().index("test");
    for (NodeEnvironment services : internalCluster().getInstances(NodeEnvironment.class)) {
        IndexMetaData brokenMeta = IndexMetaData.builder(metaData).settings(metaData.getSettings().filter((s) -> "index.analysis.analyzer.test.tokenizer".equals(s) == false)).build();
        IndexMetaData.FORMAT.write(brokenMeta, services.indexPaths(brokenMeta.getIndex()));
    }
    internalCluster().fullRestart();
    // ensureGreen(closedIndex) waits for the index to show up in the metadata
    // this is crucial otherwise the state call below might not contain the index yet
    ensureGreen(metaData.getIndex().getName());
    state = client().admin().cluster().prepareState().get().getState();
    assertEquals(IndexMetaData.State.CLOSE, state.getMetaData().index(metaData.getIndex()).getState());
    // try to open it with the broken setting - fail again!
    ElasticsearchException ex = expectThrows(ElasticsearchException.class, () -> client().admin().indices().prepareOpen("test").get());
    assertEquals(ex.getMessage(), "Failed to verify index " + metaData.getIndex());
    assertNotNull(ex.getCause());
    assertEquals(MapperParsingException.class, ex.getCause().getClass());
    assertThat(ex.getCause().getMessage(), containsString("analyzer [test] not found for field [field1]"));
}
Also used : ClusterState(org.elasticsearch.cluster.ClusterState) NodeEnvironment(org.elasticsearch.env.NodeEnvironment) ElasticsearchException(org.elasticsearch.ElasticsearchException) IndexMetaData(org.elasticsearch.cluster.metadata.IndexMetaData)

Example 28 with NodeEnvironment

use of org.elasticsearch.env.NodeEnvironment in project elasticsearch by elastic.

the class NewPathForShardTests method testSelectNewPathForShard.

public void testSelectNewPathForShard() throws Exception {
    Path path = PathUtils.get(createTempDir().toString());
    // Use 2 data paths:
    String[] paths = new String[] { path.resolve("a").toString(), path.resolve("b").toString() };
    Settings settings = Settings.builder().put(Environment.PATH_HOME_SETTING.getKey(), path).putArray(Environment.PATH_DATA_SETTING.getKey(), paths).build();
    NodeEnvironment nodeEnv = new NodeEnvironment(settings, new Environment(settings));
    // Make sure all our mocking above actually worked:
    NodePath[] nodePaths = nodeEnv.nodePaths();
    assertEquals(2, nodePaths.length);
    assertEquals("mocka", nodePaths[0].fileStore.name());
    assertEquals("mockb", nodePaths[1].fileStore.name());
    // Path a has lots of free space, but b has little, so new shard should go to a:
    aFileStore.usableSpace = 100000;
    bFileStore.usableSpace = 1000;
    ShardId shardId = new ShardId("index", "_na_", 0);
    ShardPath result = ShardPath.selectNewPathForShard(nodeEnv, shardId, INDEX_SETTINGS, 100, Collections.<Path, Integer>emptyMap());
    assertTrue(result.getDataPath().toString().contains(aPathPart));
    // Test the reverse: b has lots of free space, but a has little, so new shard should go to b:
    aFileStore.usableSpace = 1000;
    bFileStore.usableSpace = 100000;
    shardId = new ShardId("index", "_na_", 0);
    result = ShardPath.selectNewPathForShard(nodeEnv, shardId, INDEX_SETTINGS, 100, Collections.<Path, Integer>emptyMap());
    assertTrue(result.getDataPath().toString().contains(bPathPart));
    // Now a and be have equal usable space; we allocate two shards to the node, and each should go to different paths:
    aFileStore.usableSpace = 100000;
    bFileStore.usableSpace = 100000;
    Map<Path, Integer> dataPathToShardCount = new HashMap<>();
    ShardPath result1 = ShardPath.selectNewPathForShard(nodeEnv, shardId, INDEX_SETTINGS, 100, dataPathToShardCount);
    dataPathToShardCount.put(NodeEnvironment.shardStatePathToDataPath(result1.getDataPath()), 1);
    ShardPath result2 = ShardPath.selectNewPathForShard(nodeEnv, shardId, INDEX_SETTINGS, 100, dataPathToShardCount);
    // #11122: this was the original failure: on a node with 2 disks that have nearly equal
    // free space, we would always allocate all N incoming shards to the one path that
    // had the most free space, never using the other drive unless new shards arrive
    // after the first shards started using storage:
    assertNotEquals(result1.getDataPath(), result2.getDataPath());
    nodeEnv.close();
}
Also used : Path(java.nio.file.Path) NodePath(org.elasticsearch.env.NodeEnvironment.NodePath) NodeEnvironment(org.elasticsearch.env.NodeEnvironment) HashMap(java.util.HashMap) NodePath(org.elasticsearch.env.NodeEnvironment.NodePath) Environment(org.elasticsearch.env.Environment) NodeEnvironment(org.elasticsearch.env.NodeEnvironment) Settings(org.elasticsearch.common.settings.Settings) IndexSettings(org.elasticsearch.index.IndexSettings)

Example 29 with NodeEnvironment

use of org.elasticsearch.env.NodeEnvironment in project elasticsearch by elastic.

the class IndexShardTests method testWriteShardState.

public void testWriteShardState() throws Exception {
    try (NodeEnvironment env = newNodeEnvironment()) {
        ShardId id = new ShardId("foo", "fooUUID", 1);
        boolean primary = randomBoolean();
        AllocationId allocationId = randomBoolean() ? null : randomAllocationId();
        ShardStateMetaData state1 = new ShardStateMetaData(primary, "fooUUID", allocationId);
        write(state1, env.availableShardPaths(id));
        ShardStateMetaData shardStateMetaData = load(logger, env.availableShardPaths(id));
        assertEquals(shardStateMetaData, state1);
        ShardStateMetaData state2 = new ShardStateMetaData(primary, "fooUUID", allocationId);
        write(state2, env.availableShardPaths(id));
        shardStateMetaData = load(logger, env.availableShardPaths(id));
        assertEquals(shardStateMetaData, state1);
        ShardStateMetaData state3 = new ShardStateMetaData(primary, "fooUUID", allocationId);
        write(state3, env.availableShardPaths(id));
        shardStateMetaData = load(logger, env.availableShardPaths(id));
        assertEquals(shardStateMetaData, state3);
        assertEquals("fooUUID", state3.indexUUID);
    }
}
Also used : NodeEnvironment(org.elasticsearch.env.NodeEnvironment) AllocationId(org.elasticsearch.cluster.routing.AllocationId)

Example 30 with NodeEnvironment

use of org.elasticsearch.env.NodeEnvironment in project elasticsearch by elastic.

the class ShardPathTests method testLoadShardPath.

public void testLoadShardPath() throws IOException {
    try (NodeEnvironment env = newNodeEnvironment(Settings.builder().build())) {
        Settings.Builder builder = Settings.builder().put(IndexMetaData.SETTING_INDEX_UUID, "0xDEADBEEF").put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT);
        Settings settings = builder.build();
        ShardId shardId = new ShardId("foo", "0xDEADBEEF", 0);
        Path[] paths = env.availableShardPaths(shardId);
        Path path = randomFrom(paths);
        ShardStateMetaData.FORMAT.write(new ShardStateMetaData(true, "0xDEADBEEF", AllocationId.newInitializing()), path);
        ShardPath shardPath = ShardPath.loadShardPath(logger, env, shardId, IndexSettingsModule.newIndexSettings(shardId.getIndex(), settings));
        assertEquals(path, shardPath.getDataPath());
        assertEquals("0xDEADBEEF", shardPath.getShardId().getIndex().getUUID());
        assertEquals("foo", shardPath.getShardId().getIndexName());
        assertEquals(path.resolve("translog"), shardPath.resolveTranslog());
        assertEquals(path.resolve("index"), shardPath.resolveIndex());
    }
}
Also used : Path(java.nio.file.Path) NodeEnvironment(org.elasticsearch.env.NodeEnvironment) Settings(org.elasticsearch.common.settings.Settings)

Aggregations

NodeEnvironment (org.elasticsearch.env.NodeEnvironment)39 IndexMetaData (org.elasticsearch.cluster.metadata.IndexMetaData)19 Path (java.nio.file.Path)17 Settings (org.elasticsearch.common.settings.Settings)15 Index (org.elasticsearch.index.Index)11 MetaData (org.elasticsearch.cluster.metadata.MetaData)10 IndexSettings (org.elasticsearch.index.IndexSettings)7 IOException (java.io.IOException)5 ClusterState (org.elasticsearch.cluster.ClusterState)5 ShardId (org.elasticsearch.index.shard.ShardId)4 ElasticsearchException (org.elasticsearch.ElasticsearchException)3 ClusterService (org.elasticsearch.cluster.service.ClusterService)3 Environment (org.elasticsearch.env.Environment)3 ShardPath (org.elasticsearch.index.shard.ShardPath)3 Matchers.containsString (org.hamcrest.Matchers.containsString)3 ArrayList (java.util.ArrayList)2 HashMap (java.util.HashMap)2 SigarModule (io.crate.module.SigarModule)1 DummyExtendedNodeInfo (io.crate.monitor.DummyExtendedNodeInfo)1 ExtendedNodeInfo (io.crate.monitor.ExtendedNodeInfo)1