|
115 | 115 | import static org.elasticsearch.datastreams.lifecycle.DataStreamLifecycleService.TARGET_MERGE_FACTOR_VALUE;
|
116 | 116 | import static org.elasticsearch.test.ClusterServiceUtils.createClusterService;
|
117 | 117 | import static org.elasticsearch.test.ClusterServiceUtils.setState;
|
| 118 | +import static org.hamcrest.Matchers.contains; |
118 | 119 | import static org.hamcrest.Matchers.containsInAnyOrder;
|
119 | 120 | import static org.hamcrest.Matchers.containsString;
|
| 121 | +import static org.hamcrest.Matchers.empty; |
120 | 122 | import static org.hamcrest.Matchers.equalTo;
|
121 | 123 | import static org.hamcrest.Matchers.instanceOf;
|
122 | 124 | import static org.hamcrest.Matchers.is;
|
@@ -329,7 +331,7 @@ public void testRetentionSkippedWhilstDownsamplingInProgress() {
|
329 | 331 | .put(indexMetadata.getSettings())
|
330 | 332 | .put(
|
331 | 333 | IndexMetadata.INDEX_DOWNSAMPLE_STATUS_KEY,
|
332 |
| - randomValueOtherThan(UNKNOWN, () -> randomFrom(IndexMetadata.DownsampleTaskStatus.values())) |
| 334 | + STARTED // See: See TransportDownsampleAction#createDownsampleIndex(...) |
333 | 335 | )
|
334 | 336 | );
|
335 | 337 | indexMetaBuilder.putCustom(
|
@@ -1415,6 +1417,76 @@ public void testTrackingTimeStats() {
|
1415 | 1417 | assertThat(service.getTimeBetweenStarts(), is(2 * delta));
|
1416 | 1418 | }
|
1417 | 1419 |
|
| 1420 | + public void testMaybeExecuteRetentionSuccessfulDownsampledIndex() { |
| 1421 | + String dataStreamName = randomAlphaOfLength(10).toLowerCase(Locale.ROOT); |
| 1422 | + ClusterState state = downsampleSetup(dataStreamName, SUCCESS); |
| 1423 | + DataStream dataStream = state.metadata().dataStreams().get(dataStreamName); |
| 1424 | + String firstGenIndexName = DataStream.getDefaultBackingIndexName(dataStreamName, 1); |
| 1425 | + |
| 1426 | + // Executing the method to be tested: |
| 1427 | + Set<Index> indicesToBeRemoved = dataStreamLifecycleService.maybeExecuteRetention(clusterService.state(), dataStream, Set.of()); |
| 1428 | + assertThat(indicesToBeRemoved, contains(state.getMetadata().index(firstGenIndexName).getIndex())); |
| 1429 | + } |
| 1430 | + |
| 1431 | + public void testMaybeExecuteRetentionDownsampledIndexInProgress() { |
| 1432 | + String dataStreamName = randomAlphaOfLength(10).toLowerCase(Locale.ROOT); |
| 1433 | + ClusterState state = downsampleSetup(dataStreamName, STARTED); |
| 1434 | + DataStream dataStream = state.metadata().dataStreams().get(dataStreamName); |
| 1435 | + String firstGenIndexName = DataStream.getDefaultBackingIndexName(dataStreamName, 1); |
| 1436 | + |
| 1437 | + // Executing the method to be tested: |
| 1438 | + Set<Index> indicesToBeRemoved = dataStreamLifecycleService.maybeExecuteRetention(clusterService.state(), dataStream, Set.of()); |
| 1439 | + assertThat(indicesToBeRemoved, empty()); |
| 1440 | + } |
| 1441 | + |
| 1442 | + public void testMaybeExecuteRetentionDownsampledUnknown() { |
| 1443 | + String dataStreamName = randomAlphaOfLength(10).toLowerCase(Locale.ROOT); |
| 1444 | + ClusterState state = downsampleSetup(dataStreamName, UNKNOWN); |
| 1445 | + DataStream dataStream = state.metadata().dataStreams().get(dataStreamName); |
| 1446 | + String firstGenIndexName = DataStream.getDefaultBackingIndexName(dataStreamName, 1); |
| 1447 | + |
| 1448 | + // Executing the method to be tested: |
| 1449 | + Set<Index> indicesToBeRemoved = dataStreamLifecycleService.maybeExecuteRetention(clusterService.state(), dataStream, Set.of()); |
| 1450 | + assertThat(indicesToBeRemoved, contains(state.getMetadata().index(firstGenIndexName).getIndex())); |
| 1451 | + } |
| 1452 | + |
| 1453 | + private ClusterState downsampleSetup(String dataStreamName, IndexMetadata.DownsampleTaskStatus status) { |
| 1454 | + // Base setup: |
| 1455 | + Metadata.Builder builder = Metadata.builder(); |
| 1456 | + DataStream dataStream = createDataStream( |
| 1457 | + builder, |
| 1458 | + dataStreamName, |
| 1459 | + 2, |
| 1460 | + settings(IndexVersion.current()).put(IndexSettings.MODE.getKey(), IndexMode.TIME_SERIES) |
| 1461 | + .put("index.routing_path", "@timestamp"), |
| 1462 | + DataStreamLifecycle.newBuilder() |
| 1463 | + .downsampling( |
| 1464 | + new Downsampling( |
| 1465 | + List.of(new Round(TimeValue.timeValueMillis(0), new DownsampleConfig(new DateHistogramInterval("5m")))) |
| 1466 | + ) |
| 1467 | + ) |
| 1468 | + .dataRetention(TimeValue.timeValueMillis(1)) |
| 1469 | + .build(), |
| 1470 | + now |
| 1471 | + ); |
| 1472 | + builder.put(dataStream); |
| 1473 | + |
| 1474 | + // Update the first backing index so that is appears to have been downsampled: |
| 1475 | + String firstGenIndexName = DataStream.getDefaultBackingIndexName(dataStreamName, 1); |
| 1476 | + var imd = builder.get(firstGenIndexName); |
| 1477 | + var imdBuilder = new IndexMetadata.Builder(imd); |
| 1478 | + imdBuilder.settings(Settings.builder().put(imd.getSettings()).put(IndexMetadata.INDEX_DOWNSAMPLE_STATUS.getKey(), status).build()); |
| 1479 | + builder.put(imdBuilder); |
| 1480 | + |
| 1481 | + // Attaching state: |
| 1482 | + String nodeId = "localNode"; |
| 1483 | + DiscoveryNodes.Builder nodesBuilder = buildNodes(nodeId); |
| 1484 | + nodesBuilder.masterNodeId(nodeId); |
| 1485 | + ClusterState state = ClusterState.builder(ClusterName.DEFAULT).metadata(builder).nodes(nodesBuilder).build(); |
| 1486 | + setState(clusterService, state); |
| 1487 | + return state; |
| 1488 | + } |
| 1489 | + |
1418 | 1490 | /*
|
1419 | 1491 | * Creates a test cluster state with the given indexName. If customDataStreamLifecycleMetadata is not null, it is added as the value
|
1420 | 1492 | * of the index's custom metadata named "data_stream_lifecycle".
|
|
0 commit comments