|
@@ -44,6 +44,7 @@ import static org.hamcrest.Matchers.hasItem;
|
|
|
import static org.hamcrest.Matchers.hasSize;
|
|
|
import static org.hamcrest.Matchers.is;
|
|
|
import static org.hamcrest.Matchers.lessThanOrEqualTo;
|
|
|
+import static org.hamcrest.Matchers.notNullValue;
|
|
|
|
|
|
public class MetadataDataStreamRolloverServiceTests extends ESTestCase {
|
|
|
|
|
@@ -63,7 +64,7 @@ public class MetadataDataStreamRolloverServiceTests extends ESTestCase {
|
|
|
IndexMode.TIME_SERIES
|
|
|
);
|
|
|
ComposableIndexTemplate template = new ComposableIndexTemplate.Builder().indexPatterns(List.of(dataStream.getName() + "*"))
|
|
|
- .template(new Template(Settings.builder().put("index.mode", "time_series").build(), null, null))
|
|
|
+ .template(new Template(Settings.builder().put("index.routing_path", "uid").build(), null, null))
|
|
|
.dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate(false, false, IndexMode.TIME_SERIES))
|
|
|
.build();
|
|
|
Metadata.Builder builder = Metadata.builder();
|
|
@@ -75,6 +76,7 @@ public class MetadataDataStreamRolloverServiceTests extends ESTestCase {
|
|
|
.put("index.hidden", true)
|
|
|
.put(SETTING_INDEX_UUID, dataStream.getWriteIndex().getUUID())
|
|
|
.put("index.mode", "time_series")
|
|
|
+ .put("index.routing_path", "uid")
|
|
|
.put("index.time_series.start_time", FORMATTER.format(now.minus(4, ChronoUnit.HOURS)))
|
|
|
.put("index.time_series.end_time", FORMATTER.format(now.minus(2, ChronoUnit.HOURS)))
|
|
|
)
|
|
@@ -144,4 +146,183 @@ public class MetadataDataStreamRolloverServiceTests extends ESTestCase {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ public void testRolloverAndMigrateDataStream() throws Exception {
|
|
|
+ Instant now = Instant.now().truncatedTo(ChronoUnit.MILLIS);
|
|
|
+ String dataStreamName = "logs-my-app";
|
|
|
+ IndexMode dsIndexMode = randomBoolean() ? null : IndexMode.STANDARD;
|
|
|
+ final DataStream dataStream = new DataStream(
|
|
|
+ dataStreamName,
|
|
|
+ new DataStream.TimestampField("@timestamp"),
|
|
|
+ List.of(new Index(DataStream.getDefaultBackingIndexName(dataStreamName, 1, now.toEpochMilli()), "uuid")),
|
|
|
+ 1,
|
|
|
+ null,
|
|
|
+ false,
|
|
|
+ false,
|
|
|
+ false,
|
|
|
+ false,
|
|
|
+ dsIndexMode
|
|
|
+ );
|
|
|
+ ComposableIndexTemplate template = new ComposableIndexTemplate.Builder().indexPatterns(List.of(dataStream.getName() + "*"))
|
|
|
+ .template(new Template(Settings.builder().put("index.routing_path", "uid").build(), null, null))
|
|
|
+ .dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate(false, false, IndexMode.TIME_SERIES))
|
|
|
+ .build();
|
|
|
+ Metadata.Builder builder = Metadata.builder();
|
|
|
+ builder.put("template", template);
|
|
|
+ Settings.Builder indexSettings = ESTestCase.settings(Version.CURRENT)
|
|
|
+ .put("index.hidden", true)
|
|
|
+ .put(SETTING_INDEX_UUID, dataStream.getWriteIndex().getUUID());
|
|
|
+ if (dsIndexMode != null) {
|
|
|
+ indexSettings.put("index.mode", dsIndexMode.getName());
|
|
|
+ }
|
|
|
+ builder.put(
|
|
|
+ IndexMetadata.builder(dataStream.getWriteIndex().getName()).settings(indexSettings).numberOfShards(1).numberOfReplicas(0)
|
|
|
+ );
|
|
|
+ builder.put(dataStream);
|
|
|
+ final ClusterState clusterState = ClusterState.builder(new ClusterName("test")).metadata(builder).build();
|
|
|
+
|
|
|
+ ThreadPool testThreadPool = new TestThreadPool(getTestName());
|
|
|
+ try {
|
|
|
+ MetadataRolloverService rolloverService = DataStreamTestHelper.getMetadataRolloverService(
|
|
|
+ dataStream,
|
|
|
+ testThreadPool,
|
|
|
+ Set.of(new DataStreamIndexSettingsProvider()),
|
|
|
+ xContentRegistry()
|
|
|
+ );
|
|
|
+ MaxDocsCondition condition = new MaxDocsCondition(randomNonNegativeLong());
|
|
|
+ List<Condition<?>> metConditions = Collections.singletonList(condition);
|
|
|
+ CreateIndexRequest createIndexRequest = new CreateIndexRequest("_na_");
|
|
|
+
|
|
|
+ MetadataRolloverService.RolloverResult rolloverResult = rolloverService.rolloverClusterState(
|
|
|
+ clusterState,
|
|
|
+ dataStream.getName(),
|
|
|
+ null,
|
|
|
+ createIndexRequest,
|
|
|
+ metConditions,
|
|
|
+ now,
|
|
|
+ randomBoolean(),
|
|
|
+ false
|
|
|
+ );
|
|
|
+
|
|
|
+ String sourceIndexName = DataStream.getDefaultBackingIndexName(dataStream.getName(), dataStream.getGeneration());
|
|
|
+ String newIndexName = DataStream.getDefaultBackingIndexName(dataStream.getName(), dataStream.getGeneration() + 1);
|
|
|
+ assertEquals(sourceIndexName, rolloverResult.sourceIndexName());
|
|
|
+ assertEquals(newIndexName, rolloverResult.rolloverIndexName());
|
|
|
+ Metadata rolloverMetadata = rolloverResult.clusterState().metadata();
|
|
|
+ assertEquals(dataStream.getIndices().size() + 1, rolloverMetadata.indices().size());
|
|
|
+
|
|
|
+ // Assert data stream's index_mode has been changed to time_series.
|
|
|
+ assertThat(rolloverMetadata.dataStreams().get(dataStreamName), notNullValue());
|
|
|
+ assertThat(rolloverMetadata.dataStreams().get(dataStreamName).getIndexMode(), equalTo(IndexMode.TIME_SERIES));
|
|
|
+
|
|
|
+ // Nothing changed for the original backing index:
|
|
|
+ IndexMetadata im = rolloverMetadata.index(rolloverMetadata.dataStreams().get(dataStreamName).getIndices().get(0));
|
|
|
+ assertThat(IndexSettings.MODE.get(im.getSettings()), equalTo(IndexMode.STANDARD));
|
|
|
+ assertThat(IndexSettings.TIME_SERIES_START_TIME.exists(im.getSettings()), is(false));
|
|
|
+ assertThat(IndexSettings.TIME_SERIES_END_TIME.exists(im.getSettings()), is(false));
|
|
|
+ // New backing index is a tsdb index:
|
|
|
+ im = rolloverMetadata.index(rolloverMetadata.dataStreams().get(dataStreamName).getIndices().get(1));
|
|
|
+ assertThat(IndexSettings.MODE.get(im.getSettings()), equalTo(IndexMode.TIME_SERIES));
|
|
|
+ Instant startTime = IndexSettings.TIME_SERIES_START_TIME.get(im.getSettings());
|
|
|
+ Instant endTime = IndexSettings.TIME_SERIES_END_TIME.get(im.getSettings());
|
|
|
+ assertThat(startTime.isBefore(endTime), is(true));
|
|
|
+ assertThat(startTime, equalTo(now.minus(2, ChronoUnit.HOURS)));
|
|
|
+ assertThat(endTime, equalTo(now.plus(2, ChronoUnit.HOURS)));
|
|
|
+ } finally {
|
|
|
+ testThreadPool.shutdown();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testChangingIndexModeFromTimeSeriesToSomethingElseNoEffectOnExistingDataStreams() throws Exception {
|
|
|
+ Instant now = Instant.now().truncatedTo(ChronoUnit.MILLIS);
|
|
|
+ String dataStreamName = "logs-my-app";
|
|
|
+ final DataStream dataStream = new DataStream(
|
|
|
+ dataStreamName,
|
|
|
+ new DataStream.TimestampField("@timestamp"),
|
|
|
+ List.of(new Index(DataStream.getDefaultBackingIndexName(dataStreamName, 1, now.toEpochMilli()), "uuid")),
|
|
|
+ 1,
|
|
|
+ null,
|
|
|
+ false,
|
|
|
+ false,
|
|
|
+ false,
|
|
|
+ false,
|
|
|
+ IndexMode.TIME_SERIES
|
|
|
+ );
|
|
|
+ ComposableIndexTemplate template = new ComposableIndexTemplate.Builder().indexPatterns(List.of(dataStream.getName() + "*"))
|
|
|
+ .template(new Template(Settings.builder().put("index.routing_path", "uid").build(), null, null))
|
|
|
+ .dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate(false, false, randomBoolean() ? IndexMode.STANDARD : null))
|
|
|
+ .build();
|
|
|
+ Metadata.Builder builder = Metadata.builder();
|
|
|
+ builder.put("template", template);
|
|
|
+ builder.put(
|
|
|
+ IndexMetadata.builder(dataStream.getWriteIndex().getName())
|
|
|
+ .settings(
|
|
|
+ ESTestCase.settings(Version.CURRENT)
|
|
|
+ .put("index.hidden", true)
|
|
|
+ .put(SETTING_INDEX_UUID, dataStream.getWriteIndex().getUUID())
|
|
|
+ .put("index.mode", "time_series")
|
|
|
+ .put("index.routing_path", "uid")
|
|
|
+ .put("index.time_series.start_time", FORMATTER.format(now.minus(4, ChronoUnit.HOURS)))
|
|
|
+ .put("index.time_series.end_time", FORMATTER.format(now.minus(2, ChronoUnit.HOURS)))
|
|
|
+ )
|
|
|
+ .numberOfShards(1)
|
|
|
+ .numberOfReplicas(0)
|
|
|
+ );
|
|
|
+ builder.put(dataStream);
|
|
|
+ final ClusterState clusterState = ClusterState.builder(new ClusterName("test")).metadata(builder).build();
|
|
|
+
|
|
|
+ ThreadPool testThreadPool = new TestThreadPool(getTestName());
|
|
|
+ try {
|
|
|
+ MetadataRolloverService rolloverService = DataStreamTestHelper.getMetadataRolloverService(
|
|
|
+ dataStream,
|
|
|
+ testThreadPool,
|
|
|
+ Set.of(new DataStreamIndexSettingsProvider()),
|
|
|
+ xContentRegistry()
|
|
|
+ );
|
|
|
+ MaxDocsCondition condition = new MaxDocsCondition(randomNonNegativeLong());
|
|
|
+ List<Condition<?>> metConditions = Collections.singletonList(condition);
|
|
|
+ CreateIndexRequest createIndexRequest = new CreateIndexRequest("_na_");
|
|
|
+
|
|
|
+ MetadataRolloverService.RolloverResult rolloverResult = rolloverService.rolloverClusterState(
|
|
|
+ clusterState,
|
|
|
+ dataStream.getName(),
|
|
|
+ null,
|
|
|
+ createIndexRequest,
|
|
|
+ metConditions,
|
|
|
+ now,
|
|
|
+ randomBoolean(),
|
|
|
+ false
|
|
|
+ );
|
|
|
+
|
|
|
+ String sourceIndexName = DataStream.getDefaultBackingIndexName(dataStream.getName(), dataStream.getGeneration());
|
|
|
+ String newIndexName = DataStream.getDefaultBackingIndexName(dataStream.getName(), dataStream.getGeneration() + 1);
|
|
|
+ assertEquals(sourceIndexName, rolloverResult.sourceIndexName());
|
|
|
+ assertEquals(newIndexName, rolloverResult.rolloverIndexName());
|
|
|
+ Metadata rolloverMetadata = rolloverResult.clusterState().metadata();
|
|
|
+ assertEquals(dataStream.getIndices().size() + 1, rolloverMetadata.indices().size());
|
|
|
+
|
|
|
+ // Assert data stream's index_mode remains time_series.
|
|
|
+ assertThat(rolloverMetadata.dataStreams().get(dataStreamName), notNullValue());
|
|
|
+ assertThat(rolloverMetadata.dataStreams().get(dataStreamName).getIndexMode(), equalTo(IndexMode.TIME_SERIES));
|
|
|
+
|
|
|
+ // Nothing changed for the original tsdb backing index:
|
|
|
+ IndexMetadata im = rolloverMetadata.index(rolloverMetadata.dataStreams().get(dataStreamName).getIndices().get(0));
|
|
|
+ assertThat(IndexSettings.MODE.exists(im.getSettings()), is(true));
|
|
|
+ Instant startTime = IndexSettings.TIME_SERIES_START_TIME.get(im.getSettings());
|
|
|
+ Instant endTime = IndexSettings.TIME_SERIES_END_TIME.get(im.getSettings());
|
|
|
+ assertThat(startTime.isBefore(endTime), is(true));
|
|
|
+ assertThat(startTime, equalTo(now.minus(4, ChronoUnit.HOURS)));
|
|
|
+ assertThat(endTime, equalTo(now.minus(2, ChronoUnit.HOURS)));
|
|
|
+ // New backing index is also a tsdb index:
|
|
|
+ im = rolloverMetadata.index(rolloverMetadata.dataStreams().get(dataStreamName).getIndices().get(1));
|
|
|
+ assertThat(IndexSettings.MODE.get(im.getSettings()), equalTo(IndexMode.TIME_SERIES));
|
|
|
+ startTime = IndexSettings.TIME_SERIES_START_TIME.get(im.getSettings());
|
|
|
+ endTime = IndexSettings.TIME_SERIES_END_TIME.get(im.getSettings());
|
|
|
+ assertThat(startTime.isBefore(endTime), is(true));
|
|
|
+ assertThat(startTime, equalTo(now.minus(2, ChronoUnit.HOURS)));
|
|
|
+ assertThat(endTime, equalTo(now.plus(2, ChronoUnit.HOURS)));
|
|
|
+ } finally {
|
|
|
+ testThreadPool.shutdown();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|