Copy and validatie soft-deletes setting on resize (#33517)
This change copies and validates the soft-deletes setting during resize. If the source enables soft-deletes, the target must also enable it. Closes #33321
This commit is contained in:
parent
b6d68bd805
commit
624b6bb487
|
@ -39,6 +39,7 @@ import org.elasticsearch.cluster.service.ClusterService;
|
|||
import org.elasticsearch.common.inject.Inject;
|
||||
import org.elasticsearch.common.settings.Settings;
|
||||
import org.elasticsearch.index.IndexNotFoundException;
|
||||
import org.elasticsearch.index.IndexSettings;
|
||||
import org.elasticsearch.index.shard.DocsStats;
|
||||
import org.elasticsearch.index.shard.ShardId;
|
||||
import org.elasticsearch.threadpool.ThreadPool;
|
||||
|
@ -171,6 +172,12 @@ public class TransportResizeAction extends TransportMasterNodeAction<ResizeReque
|
|||
throw new IllegalArgumentException("cannot provide index.number_of_routing_shards on resize");
|
||||
}
|
||||
}
|
||||
if (IndexSettings.INDEX_SOFT_DELETES_SETTING.exists(metaData.getSettings()) &&
|
||||
IndexSettings.INDEX_SOFT_DELETES_SETTING.get(metaData.getSettings()) &&
|
||||
IndexSettings.INDEX_SOFT_DELETES_SETTING.exists(targetIndexSettings) &&
|
||||
IndexSettings.INDEX_SOFT_DELETES_SETTING.get(targetIndexSettings) == false) {
|
||||
throw new IllegalArgumentException("Can't disable [index.soft_deletes.enabled] setting on resize");
|
||||
}
|
||||
String cause = resizeRequest.getResizeType().name().toLowerCase(Locale.ROOT) + "_index";
|
||||
targetIndex.cause(cause);
|
||||
Settings.Builder settingsBuilder = Settings.builder().put(targetIndexSettings);
|
||||
|
|
|
@ -749,7 +749,8 @@ public class MetaDataCreateIndexService extends AbstractComponent {
|
|||
}
|
||||
} else {
|
||||
final Predicate<String> sourceSettingsPredicate =
|
||||
(s) -> (s.startsWith("index.similarity.") || s.startsWith("index.analysis.") || s.startsWith("index.sort."))
|
||||
(s) -> (s.startsWith("index.similarity.") || s.startsWith("index.analysis.") ||
|
||||
s.startsWith("index.sort.") || s.equals("index.soft_deletes.enabled"))
|
||||
&& indexSettingsBuilder.keys().contains(s) == false;
|
||||
builder.put(sourceMetaData.getSettings().filter(sourceSettingsPredicate));
|
||||
}
|
||||
|
|
|
@ -47,6 +47,7 @@ import java.util.Collections;
|
|||
import java.util.HashSet;
|
||||
|
||||
import static java.util.Collections.emptyMap;
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
|
||||
public class TransportResizeActionTests extends ESTestCase {
|
||||
|
||||
|
@ -92,6 +93,16 @@ public class TransportResizeActionTests extends ESTestCase {
|
|||
).getMessage().startsWith("Can't merge index with more than [2147483519] docs - too many documents in shards "));
|
||||
|
||||
|
||||
IllegalArgumentException softDeletesError = expectThrows(IllegalArgumentException.class, () -> {
|
||||
ResizeRequest req = new ResizeRequest("target", "source");
|
||||
req.getTargetIndexRequest().settings(Settings.builder().put("index.soft_deletes.enabled", false));
|
||||
ClusterState clusterState = createClusterState("source", 8, 1,
|
||||
Settings.builder().put("index.blocks.write", true).put("index.soft_deletes.enabled", true).build());
|
||||
TransportResizeAction.prepareCreateIndexRequest(req, clusterState,
|
||||
(i) -> new DocsStats(between(10, 1000), between(1, 10), between(1, 10000)), "source", "target");
|
||||
});
|
||||
assertThat(softDeletesError.getMessage(), equalTo("Can't disable [index.soft_deletes.enabled] setting on resize"));
|
||||
|
||||
// create one that won't fail
|
||||
ClusterState clusterState = ClusterState.builder(createClusterState("source", randomIntBetween(2, 10), 0,
|
||||
Settings.builder().put("index.blocks.write", true).build())).nodes(DiscoveryNodes.builder().add(newNode("node1")))
|
||||
|
|
|
@ -261,6 +261,7 @@ public class MetaDataCreateIndexServiceTests extends ESTestCase {
|
|||
.put("index.version.upgraded", upgraded)
|
||||
.put("index.similarity.default.type", "BM25")
|
||||
.put("index.analysis.analyzer.default.tokenizer", "keyword")
|
||||
.put("index.soft_deletes.enabled", "true")
|
||||
.build();
|
||||
runPrepareResizeIndexSettingsTest(
|
||||
indexSettings,
|
||||
|
@ -277,6 +278,7 @@ public class MetaDataCreateIndexServiceTests extends ESTestCase {
|
|||
assertThat(settings.get("index.allocation.max_retries"), equalTo("1"));
|
||||
assertThat(settings.getAsVersion("index.version.created", null), equalTo(version));
|
||||
assertThat(settings.getAsVersion("index.version.upgraded", null), equalTo(upgraded));
|
||||
assertThat(settings.get("index.soft_deletes.enabled"), equalTo("true"));
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -337,6 +339,15 @@ public class MetaDataCreateIndexServiceTests extends ESTestCase {
|
|||
|
||||
}
|
||||
|
||||
public void testDoNotOverrideSoftDeletesSettingOnResize() {
|
||||
runPrepareResizeIndexSettingsTest(
|
||||
Settings.builder().put("index.soft_deletes.enabled", "false").build(),
|
||||
Settings.builder().put("index.soft_deletes.enabled", "true").build(),
|
||||
Collections.emptyList(),
|
||||
randomBoolean(),
|
||||
settings -> assertThat(settings.get("index.soft_deletes.enabled"), equalTo("true")));
|
||||
}
|
||||
|
||||
private void runPrepareResizeIndexSettingsTest(
|
||||
final Settings sourceSettings,
|
||||
final Settings requestSettings,
|
||||
|
|
Loading…
Reference in New Issue