Skip to content

Commit 79058ba

Browse files
authored
Skip the validation when retrieving the index mode during reindexing a time series data stream. (#127824) (#127898)
During reindexing we retrieve the index mode from the template settings. However, we do not fully resolve the settings as we do when validating a template or when creating a data stream. This results on throwing the error reported in #125607. I do not see a reason to not fix this as suggested in #125607 (comment). Fixes: #125607 (cherry picked from commit 077b6b9) # Conflicts: # modules/data-streams/build.gradle # modules/reindex/src/main/java/org/elasticsearch/reindex/Reindexer.java
1 parent 132f9b8 commit 79058ba

File tree

4 files changed

+76
-3
lines changed

4 files changed

+76
-3
lines changed

docs/changelog/127824.yaml

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 127824
2+
summary: Skip the validation when retrieving the index mode during reindexing a time
3+
series data stream
4+
area: TSDB
5+
type: bug
6+
issues: []

modules/data-streams/build.gradle

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,15 @@ esplugin {
1515
restResources {
1616
restApi {
1717
include 'bulk', 'count', 'search', '_common', 'indices', 'index', 'cluster', 'rank_eval', 'reindex', 'update_by_query', 'delete_by_query',
18-
'eql', 'data_stream', 'ingest', 'cat', 'capabilities'
18+
'eql', 'data_stream', 'ingest', 'cat', 'capabilities', 'reindex'
1919
}
2020
}
2121

2222
dependencies {
2323
testImplementation project(path: ':test:test-clusters')
2424
testImplementation project(":modules:mapper-extras")
2525
internalClusterTestImplementation project(":modules:mapper-extras")
26+
internalClusterTestImplementation project(':modules:reindex')
2627
}
2728

2829
tasks.withType(StandaloneRestIntegTestTask).configureEach {

modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/TSDBIndexingIT.java

+65-1
Original file line numberDiff line numberDiff line change
@@ -13,31 +13,40 @@
1313
import org.elasticsearch.action.admin.indices.diskusage.TransportAnalyzeIndexDiskUsageAction;
1414
import org.elasticsearch.action.admin.indices.forcemerge.ForceMergeRequest;
1515
import org.elasticsearch.action.admin.indices.get.GetIndexRequest;
16+
import org.elasticsearch.action.admin.indices.get.GetIndexResponse;
1617
import org.elasticsearch.action.admin.indices.refresh.RefreshRequest;
1718
import org.elasticsearch.action.admin.indices.rollover.RolloverRequest;
1819
import org.elasticsearch.action.admin.indices.segments.IndicesSegmentsRequest;
1920
import org.elasticsearch.action.admin.indices.stats.IndicesStatsRequest;
2021
import org.elasticsearch.action.admin.indices.template.put.PutComponentTemplateAction;
2122
import org.elasticsearch.action.admin.indices.template.put.TransportPutComposableIndexTemplateAction;
2223
import org.elasticsearch.action.bulk.BulkRequest;
24+
import org.elasticsearch.action.bulk.BulkRequestBuilder;
25+
import org.elasticsearch.action.bulk.BulkResponse;
2326
import org.elasticsearch.action.bulk.IndexDocFailureStoreStatus;
2427
import org.elasticsearch.action.get.GetRequest;
2528
import org.elasticsearch.action.index.IndexRequest;
2629
import org.elasticsearch.action.search.SearchRequest;
2730
import org.elasticsearch.action.support.WriteRequest;
2831
import org.elasticsearch.cluster.metadata.ComponentTemplate;
2932
import org.elasticsearch.cluster.metadata.ComposableIndexTemplate;
33+
import org.elasticsearch.cluster.metadata.IndexMetadata;
3034
import org.elasticsearch.cluster.metadata.Template;
3135
import org.elasticsearch.common.Strings;
3236
import org.elasticsearch.common.compress.CompressedXContent;
3337
import org.elasticsearch.common.settings.Settings;
3438
import org.elasticsearch.common.time.DateFormatter;
3539
import org.elasticsearch.common.time.FormatNames;
3640
import org.elasticsearch.common.xcontent.XContentHelper;
41+
import org.elasticsearch.index.IndexMode;
3742
import org.elasticsearch.index.IndexSettings;
3843
import org.elasticsearch.index.query.RangeQueryBuilder;
44+
import org.elasticsearch.index.reindex.BulkByScrollResponse;
45+
import org.elasticsearch.index.reindex.ReindexAction;
46+
import org.elasticsearch.index.reindex.ReindexRequest;
3947
import org.elasticsearch.indices.InvalidIndexTemplateException;
4048
import org.elasticsearch.plugins.Plugin;
49+
import org.elasticsearch.reindex.ReindexPlugin;
4150
import org.elasticsearch.rest.RestStatus;
4251
import org.elasticsearch.search.builder.SearchSourceBuilder;
4352
import org.elasticsearch.test.ESSingleNodeTestCase;
@@ -53,6 +62,7 @@
5362

5463
import static org.elasticsearch.test.MapMatcher.assertMap;
5564
import static org.elasticsearch.test.MapMatcher.matchesMap;
65+
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
5666
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertResponse;
5767
import static org.hamcrest.Matchers.containsString;
5868
import static org.hamcrest.Matchers.equalTo;
@@ -98,7 +108,7 @@ public class TSDBIndexingIT extends ESSingleNodeTestCase {
98108

99109
@Override
100110
protected Collection<Class<? extends Plugin>> getPlugins() {
101-
return List.of(DataStreamsPlugin.class, InternalSettingsPlugin.class);
111+
return List.of(DataStreamsPlugin.class, InternalSettingsPlugin.class, ReindexPlugin.class);
102112
}
103113

104114
@Override
@@ -557,6 +567,60 @@ public void testTrimId() throws Exception {
557567
});
558568
}
559569

570+
public void testReindexing() throws Exception {
571+
String dataStreamName = "my-ds";
572+
String reindexedDataStreamName = "my-reindexed-ds";
573+
var putTemplateRequest = new TransportPutComposableIndexTemplateAction.Request("id");
574+
putTemplateRequest.indexTemplate(
575+
ComposableIndexTemplate.builder()
576+
.indexPatterns(List.of(dataStreamName, reindexedDataStreamName))
577+
.template(
578+
new Template(
579+
Settings.builder().put("index.mode", "time_series").build(),
580+
new CompressedXContent(MAPPING_TEMPLATE),
581+
null
582+
)
583+
)
584+
.dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate(false, false))
585+
.build()
586+
);
587+
assertAcked(client().execute(TransportPutComposableIndexTemplateAction.TYPE, putTemplateRequest));
588+
589+
// index doc
590+
long docCount = randomLongBetween(10, 50);
591+
Instant startTime = Instant.now();
592+
BulkRequestBuilder bulkRequestBuilder = client().prepareBulk();
593+
bulkRequestBuilder.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
594+
for (int i = 0; i < docCount; i++) {
595+
IndexRequest indexRequest = new IndexRequest(dataStreamName).opType(DocWriteRequest.OpType.CREATE);
596+
indexRequest.source(DOC.replace("$time", formatInstant(startTime.plusSeconds(i))), XContentType.JSON);
597+
bulkRequestBuilder.add(indexRequest);
598+
}
599+
BulkResponse bulkResponse = bulkRequestBuilder.get();
600+
assertThat(bulkResponse.hasFailures(), is(false));
601+
602+
BulkByScrollResponse reindexResponse = safeGet(
603+
client().execute(
604+
ReindexAction.INSTANCE,
605+
new ReindexRequest().setSourceIndices(dataStreamName).setDestIndex(reindexedDataStreamName).setDestOpType("create")
606+
)
607+
);
608+
assertThat(reindexResponse.getCreated(), equalTo(docCount));
609+
610+
GetIndexResponse getIndexResponse = safeGet(
611+
indicesAdmin().getIndex(new GetIndexRequest().indices(dataStreamName, reindexedDataStreamName))
612+
);
613+
assertThat(getIndexResponse.getIndices().length, equalTo(2));
614+
var index1 = getIndexResponse.getIndices()[0];
615+
var index2 = getIndexResponse.getIndices()[1];
616+
assertThat(getIndexResponse.getSetting(index1, IndexSettings.MODE.getKey()), equalTo(IndexMode.TIME_SERIES.getName()));
617+
assertThat(getIndexResponse.getSetting(index2, IndexSettings.MODE.getKey()), equalTo(IndexMode.TIME_SERIES.getName()));
618+
assertThat(
619+
getIndexResponse.getSetting(index2, IndexMetadata.INDEX_ROUTING_PATH.getKey()),
620+
equalTo(getIndexResponse.getSetting(index1, IndexMetadata.INDEX_ROUTING_PATH.getKey()))
621+
);
622+
}
623+
560624
static String formatInstant(Instant instant) {
561625
return DateFormatter.forPattern(FormatNames.STRICT_DATE_OPTIONAL_TIME.getName()).format(instant);
562626
}

modules/reindex/src/main/java/org/elasticsearch/reindex/Reindexer.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,9 @@ private IndexMode destinationIndexMode(ClusterState state) {
254254
return IndexMode.STANDARD;
255255
}
256256
Settings settings = MetadataIndexTemplateService.resolveSettings(state.metadata(), template);
257-
return IndexSettings.MODE.get(settings);
257+
// We retrieve the setting without performing any validation because that the template has already been validated
258+
String indexMode = settings.get(IndexSettings.MODE.getKey());
259+
return indexMode == null ? IndexMode.STANDARD : IndexMode.fromString(indexMode);
258260
}
259261

260262
@Override

0 commit comments

Comments
 (0)