Merge pull request #14089 from brwe/fix-test-access-denied

fix access denied for shard deletion with WindowsFS
This commit is contained in:
Britta Weber 2015-10-19 14:25:26 +02:00
commit 15a63f3ec7
1 changed files with 26 additions and 30 deletions

View File

@ -19,7 +19,6 @@
package org.elasticsearch.gateway; package org.elasticsearch.gateway;
import com.carrotsearch.hppc.cursors.ObjectObjectCursor;
import org.elasticsearch.action.admin.cluster.state.ClusterStateResponse; import org.elasticsearch.action.admin.cluster.state.ClusterStateResponse;
import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsResponse; import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsResponse;
import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.cluster.metadata.IndexMetaData;
@ -27,11 +26,15 @@ import org.elasticsearch.cluster.metadata.MetaData;
import org.elasticsearch.cluster.routing.allocation.decider.FilterAllocationDecider; import org.elasticsearch.cluster.routing.allocation.decider.FilterAllocationDecider;
import org.elasticsearch.common.collect.ImmutableOpenMap; import org.elasticsearch.common.collect.ImmutableOpenMap;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.env.NodeEnvironment;
import org.elasticsearch.index.Index;
import org.elasticsearch.test.ESIntegTestCase; import org.elasticsearch.test.ESIntegTestCase;
import org.elasticsearch.test.ESIntegTestCase.ClusterScope; import org.elasticsearch.test.ESIntegTestCase.ClusterScope;
import org.elasticsearch.test.InternalTestCluster; import org.elasticsearch.test.InternalTestCluster;
import org.junit.Test; import org.junit.Test;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
@ -69,14 +72,14 @@ public class MetaDataWriteDataNodesIT extends ESIntegTestCase {
index(index, "doc", "1", jsonBuilder().startObject().field("text", "some text").endObject()); index(index, "doc", "1", jsonBuilder().startObject().field("text", "some text").endObject());
ensureGreen(); ensureGreen();
assertIndexInMetaState(node1, index); assertIndexInMetaState(node1, index);
assertIndexNotInMetaState(node2, index); assertIndexDirectoryDeleted(node2, index);
assertIndexInMetaState(masterNode, index); assertIndexInMetaState(masterNode, index);
logger.debug("relocating index..."); logger.debug("relocating index...");
client().admin().indices().prepareUpdateSettings(index).setSettings(Settings.builder().put(FilterAllocationDecider.INDEX_ROUTING_INCLUDE_GROUP + "_name", node2)).get(); client().admin().indices().prepareUpdateSettings(index).setSettings(Settings.builder().put(FilterAllocationDecider.INDEX_ROUTING_INCLUDE_GROUP + "_name", node2)).get();
client().admin().cluster().prepareHealth().setWaitForRelocatingShards(0).get(); client().admin().cluster().prepareHealth().setWaitForRelocatingShards(0).get();
ensureGreen(); ensureGreen();
assertIndexNotInMetaState(node1, index); assertIndexDirectoryDeleted(node1, index);
assertIndexInMetaState(node2, index); assertIndexInMetaState(node2, index);
assertIndexInMetaState(masterNode, index); assertIndexInMetaState(masterNode, index);
} }
@ -148,48 +151,41 @@ public class MetaDataWriteDataNodesIT extends ESIntegTestCase {
assertThat(indicesMetaData.get(index).getState(), equalTo(IndexMetaData.State.OPEN)); assertThat(indicesMetaData.get(index).getState(), equalTo(IndexMetaData.State.OPEN));
} }
protected void assertIndexNotInMetaState(String nodeName, String indexName) throws Exception { protected void assertIndexDirectoryDeleted(final String nodeName, final String indexName) throws Exception {
assertMetaState(nodeName, indexName, false); assertBusy(() -> {
logger.info("checking if index directory exists...");
assertFalse("Expecting index directory of " + indexName + " to be deleted from node " + nodeName, indexDirectoryExists(nodeName, indexName));
}
);
} }
protected void assertIndexInMetaState(String nodeName, String indexName) throws Exception { protected void assertIndexInMetaState(final String nodeName, final String indexName) throws Exception {
assertMetaState(nodeName, indexName, true); assertBusy(() -> {
}
private void assertMetaState(final String nodeName, final String indexName, final boolean shouldBe) throws Exception {
awaitBusy(() -> {
logger.info("checking if meta state exists..."); logger.info("checking if meta state exists...");
try { try {
return shouldBe == metaStateExists(nodeName, indexName); assertTrue("Expecting meta state of index " + indexName + " to be on node " + nodeName, getIndicesMetaDataOnNode(nodeName).containsKey(indexName));
} catch (Throwable t) { } catch (Throwable t) {
logger.info("failed to load meta state", t); logger.info("failed to load meta state", t);
// TODO: loading of meta state fails rarely if the state is deleted while we try to load it fail("could not load meta state");
// this here is a hack, would be much better to use for example a WatchService
return false;
} }
});
boolean inMetaSate = metaStateExists(nodeName, indexName);
if (shouldBe) {
assertTrue("expected " + indexName + " in meta state of node " + nodeName, inMetaSate);
} else {
assertFalse("expected " + indexName + " to not be in meta state of node " + nodeName, inMetaSate);
} }
);
} }
private boolean metaStateExists(String nodeName, String indexName) throws Exception {
ImmutableOpenMap<String, IndexMetaData> indices = getIndicesMetaDataOnNode(nodeName); private boolean indexDirectoryExists(String nodeName, String indexName) {
boolean inMetaSate = false; NodeEnvironment nodeEnv = ((InternalTestCluster) cluster()).getInstance(NodeEnvironment.class, nodeName);
for (ObjectObjectCursor<String, IndexMetaData> index : indices) { for (Path path : nodeEnv.indexPaths(new Index(indexName))) {
inMetaSate = inMetaSate || index.key.equals(indexName); if (Files.exists(path)) {
return true;
}
} }
return inMetaSate; return false;
} }
private ImmutableOpenMap<String, IndexMetaData> getIndicesMetaDataOnNode(String nodeName) throws Exception { private ImmutableOpenMap<String, IndexMetaData> getIndicesMetaDataOnNode(String nodeName) throws Exception {
GatewayMetaState nodeMetaState = ((InternalTestCluster) cluster()).getInstance(GatewayMetaState.class, nodeName); GatewayMetaState nodeMetaState = ((InternalTestCluster) cluster()).getInstance(GatewayMetaState.class, nodeName);
MetaData nodeMetaData = null; MetaData nodeMetaData = nodeMetaState.loadMetaState();
nodeMetaData = nodeMetaState.loadMetaState();
return nodeMetaData.getIndices(); return nodeMetaData.getIndices();
} }
} }