mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-02-10 06:55:32 +00:00
Move IndicesService.canDeleteShardContent to use IndexSettings
Just a minor cleanup/simplification Closes #15059 Closes #15150
This commit is contained in:
parent
6ff82260a7
commit
9930e6883d
@ -461,7 +461,7 @@ public class IndicesService extends AbstractLifecycleComponent<IndicesService> i
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* This method deletes the shard contents on disk for the given shard ID. This method will fail if the shard deleting
|
* This method deletes the shard contents on disk for the given shard ID. This method will fail if the shard deleting
|
||||||
* is prevented by {@link #canDeleteShardContent(org.elasticsearch.index.shard.ShardId, org.elasticsearch.cluster.metadata.IndexMetaData)}
|
* is prevented by {@link #canDeleteShardContent(ShardId, IndexSettings)}
|
||||||
* of if the shards lock can not be acquired.
|
* of if the shards lock can not be acquired.
|
||||||
*
|
*
|
||||||
* On data nodes, if the deleted shard is the last shard folder in its index, the method will attempt to remove the index folder as well.
|
* On data nodes, if the deleted shard is the last shard folder in its index, the method will attempt to remove the index folder as well.
|
||||||
@ -529,18 +529,10 @@ public class IndicesService extends AbstractLifecycleComponent<IndicesService> i
|
|||||||
* </ul>
|
* </ul>
|
||||||
*
|
*
|
||||||
* @param shardId the shard to delete.
|
* @param shardId the shard to delete.
|
||||||
* @param metaData the shards index metadata. This is required to access the indexes settings etc.
|
* @param indexSettings the shards's relevant {@link IndexSettings}. This is required to access the indexes settings etc.
|
||||||
*/
|
*/
|
||||||
public boolean canDeleteShardContent(ShardId shardId, IndexMetaData metaData) {
|
public boolean canDeleteShardContent(ShardId shardId, IndexSettings indexSettings) {
|
||||||
// we need the metadata here since we have to build the complete settings
|
assert shardId.getIndex().equals(indexSettings.getIndex().name());
|
||||||
// to decide where the shard content lives. In the future we might even need more info here ie. for shadow replicas
|
|
||||||
// The plan was to make it harder to miss-use and ask for metadata instead of simple settings
|
|
||||||
assert shardId.getIndex().equals(metaData.getIndex());
|
|
||||||
final IndexSettings indexSettings = buildIndexSettings(metaData);
|
|
||||||
return canDeleteShardContent(shardId, indexSettings);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean canDeleteShardContent(ShardId shardId, IndexSettings indexSettings) {
|
|
||||||
final IndexService indexService = this.indices.get(shardId.getIndex());
|
final IndexService indexService = this.indices.get(shardId.getIndex());
|
||||||
if (indexSettings.isOnSharedFilesystem() == false) {
|
if (indexSettings.isOnSharedFilesystem() == false) {
|
||||||
if (indexService != null && nodeEnv.hasNodeFile()) {
|
if (indexService != null && nodeEnv.hasNodeFile()) {
|
||||||
|
@ -33,6 +33,7 @@ import org.elasticsearch.common.settings.Settings;
|
|||||||
import org.elasticsearch.common.unit.TimeValue;
|
import org.elasticsearch.common.unit.TimeValue;
|
||||||
import org.elasticsearch.common.util.concurrent.EsRejectedExecutionException;
|
import org.elasticsearch.common.util.concurrent.EsRejectedExecutionException;
|
||||||
import org.elasticsearch.index.IndexService;
|
import org.elasticsearch.index.IndexService;
|
||||||
|
import org.elasticsearch.index.IndexSettings;
|
||||||
import org.elasticsearch.index.shard.IndexShard;
|
import org.elasticsearch.index.shard.IndexShard;
|
||||||
import org.elasticsearch.index.shard.IndexShardState;
|
import org.elasticsearch.index.shard.IndexShardState;
|
||||||
import org.elasticsearch.index.shard.ShardId;
|
import org.elasticsearch.index.shard.ShardId;
|
||||||
@ -43,6 +44,7 @@ import org.elasticsearch.transport.*;
|
|||||||
import java.io.Closeable;
|
import java.io.Closeable;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
@ -97,11 +99,12 @@ public class IndicesStore extends AbstractComponent implements ClusterStateListe
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (IndexRoutingTable indexRoutingTable : event.state().routingTable()) {
|
for (IndexRoutingTable indexRoutingTable : event.state().routingTable()) {
|
||||||
|
IndexSettings indexSettings = new IndexSettings(event.state().getMetaData().index(indexRoutingTable.index()), settings, Collections.emptyList());
|
||||||
// Note, closed indices will not have any routing information, so won't be deleted
|
// Note, closed indices will not have any routing information, so won't be deleted
|
||||||
for (IndexShardRoutingTable indexShardRoutingTable : indexRoutingTable) {
|
for (IndexShardRoutingTable indexShardRoutingTable : indexRoutingTable) {
|
||||||
if (shardCanBeDeleted(event.state(), indexShardRoutingTable)) {
|
if (shardCanBeDeleted(event.state(), indexShardRoutingTable)) {
|
||||||
ShardId shardId = indexShardRoutingTable.shardId();
|
ShardId shardId = indexShardRoutingTable.shardId();
|
||||||
if (indicesService.canDeleteShardContent(shardId, event.state().getMetaData().index(shardId.getIndex()))) {
|
if (indicesService.canDeleteShardContent(shardId, indexSettings)) {
|
||||||
deleteShardIfExistElseWhere(event.state(), indexShardRoutingTable);
|
deleteShardIfExistElseWhere(event.state(), indexShardRoutingTable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -72,12 +72,13 @@ public class IndicesServiceTests extends ESSingleNodeTestCase {
|
|||||||
IndicesService indicesService = getIndicesService();
|
IndicesService indicesService = getIndicesService();
|
||||||
IndexMetaData meta = IndexMetaData.builder("test").settings(settings(Version.CURRENT)).numberOfShards(1).numberOfReplicas(
|
IndexMetaData meta = IndexMetaData.builder("test").settings(settings(Version.CURRENT)).numberOfShards(1).numberOfReplicas(
|
||||||
1).build();
|
1).build();
|
||||||
assertFalse("no shard location", indicesService.canDeleteShardContent(new ShardId("test", 0), meta));
|
IndexSettings indexSettings = IndexSettingsModule.newIndexSettings("test", meta.getSettings());
|
||||||
|
assertFalse("no shard location", indicesService.canDeleteShardContent(new ShardId("test", 0), indexSettings));
|
||||||
IndexService test = createIndex("test");
|
IndexService test = createIndex("test");
|
||||||
assertTrue(test.hasShard(0));
|
assertTrue(test.hasShard(0));
|
||||||
assertFalse("shard is allocated", indicesService.canDeleteShardContent(new ShardId("test", 0), meta));
|
assertFalse("shard is allocated", indicesService.canDeleteShardContent(new ShardId("test", 0), indexSettings));
|
||||||
test.removeShard(0, "boom");
|
test.removeShard(0, "boom");
|
||||||
assertTrue("shard is removed", indicesService.canDeleteShardContent(new ShardId("test", 0), meta));
|
assertTrue("shard is removed", indicesService.canDeleteShardContent(new ShardId("test", 0), indexSettings));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testDeleteIndexStore() throws Exception {
|
public void testDeleteIndexStore() throws Exception {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user