diff --git a/docs/changelog/95740.yaml b/docs/changelog/95740.yaml new file mode 100644 index 0000000000000..a477efcbd83cb --- /dev/null +++ b/docs/changelog/95740.yaml @@ -0,0 +1,6 @@ +pr: 95740 +summary: Include search idle info to shard stats +area: "Search" +type: enhancement +issues: + - 95727 diff --git a/docs/changelog/96213.yaml b/docs/changelog/96213.yaml new file mode 100644 index 0000000000000..431d21748b7c4 --- /dev/null +++ b/docs/changelog/96213.yaml @@ -0,0 +1,5 @@ +pr: 96213 +summary: Search idle info transport version bump +area: "Search" +type: enhancement +issues: [] diff --git a/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/indices.stats/100_search_idle.yml b/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/indices.stats/100_search_idle.yml new file mode 100644 index 0000000000000..226458ce475bb --- /dev/null +++ b/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/indices.stats/100_search_idle.yml @@ -0,0 +1,28 @@ +--- +setup: + - do: + indices.create: + index: test + body: + settings: + number_of_shards: 2 + number_of_replicas: 0 + index: + search: + idle: + after: 60s + +--- +"Search idle stats": + - skip: + version: " - 8.8.99" + reason: "search idle stats added in 8.9.0" + + - do: + indices.stats: { level: shards } + + - is_false: indices.test.shards.0.0.search_idle + - gte: { indices.test.shards.0.0.search_idle_time: 0 } + + - is_false: indices.test.shards.1.0.search_idle + - gte: { indices.test.shards.1.0.search_idle_time: 0 } diff --git a/server/src/internalClusterTest/java/org/elasticsearch/index/shard/SearchIdleIT.java b/server/src/internalClusterTest/java/org/elasticsearch/index/shard/SearchIdleIT.java index f49a44cd05f72..beed104d6b2f2 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/index/shard/SearchIdleIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/index/shard/SearchIdleIT.java @@ -9,9 +9,13 @@ package org.elasticsearch.index.shard; import org.elasticsearch.action.ActionListener; +import org.elasticsearch.action.admin.indices.stats.IndicesStatsRequest; +import org.elasticsearch.action.admin.indices.stats.IndicesStatsResponse; +import org.elasticsearch.action.admin.indices.stats.ShardStats; import org.elasticsearch.action.get.GetRequest; import org.elasticsearch.action.get.MultiGetRequest; import org.elasticsearch.action.index.IndexResponse; +import org.elasticsearch.cluster.metadata.IndexMetadata; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.core.TimeValue; import org.elasticsearch.index.IndexService; @@ -21,9 +25,11 @@ import org.elasticsearch.xcontent.XContentType; import java.util.Arrays; +import java.util.Locale; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Phaser; import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.IntToLongFunction; @@ -127,6 +133,12 @@ public void onFailure(Exception e) { } indexingDone.await(); t.join(); + final IndicesStatsResponse statsResponse = client().admin().indices().stats(new IndicesStatsRequest()).actionGet(); + for (ShardStats shardStats : statsResponse.getShards()) { + if (randomTimeValue != null && shardStats.isSearchIdle()) { + assertTrue(shardStats.getSearchIdleTime() >= randomTimeValue.millis()); + } + } } public void testPendingRefreshWithIntervalChange() throws Exception { @@ -167,6 +179,12 @@ public void testPendingRefreshWithIntervalChange() throws Exception { assertFalse(shard.hasRefreshPending()); assertTrue(shard.isSearchIdle()); assertHitCount(client().prepareSearch().get(), 3); + final IndicesStatsResponse statsResponse = client().admin().indices().stats(new IndicesStatsRequest()).actionGet(); + for (ShardStats shardStats : statsResponse.getShards()) { + if (shardStats.isSearchIdle()) { + assertTrue(shardStats.getSearchIdleTime() >= TimeValue.ZERO.millis()); + } + } } private void ensureNoPendingScheduledRefresh(ThreadPool threadPool) { @@ -182,4 +200,27 @@ private void ensureNoPendingScheduledRefresh(ThreadPool threadPool) { barrier.arriveAndAwaitAdvance(); } + public void testSearchIdleStats() throws InterruptedException { + int searchIdleAfter = randomIntBetween(2, 5); + final String indexName = randomAlphaOfLength(5).toLowerCase(Locale.ROOT); + client().admin() + .indices() + .prepareCreate(indexName) + .setSettings( + Settings.builder() + .put(IndexSettings.INDEX_SEARCH_IDLE_AFTER.getKey(), searchIdleAfter + "s") + .put(IndexMetadata.SETTING_NUMBER_OF_SHARDS, randomIntBetween(2, 7)) + ) + .get(); + waitUntil( + () -> Arrays.stream(client().admin().indices().prepareStats(indexName).get().getShards()).allMatch(ShardStats::isSearchIdle), + searchIdleAfter, + TimeUnit.SECONDS + ); + + final IndicesStatsResponse statsResponse = client().admin().indices().prepareStats(indexName).get(); + assertTrue(Arrays.stream(statsResponse.getShards()).allMatch(ShardStats::isSearchIdle)); + assertTrue(Arrays.stream(statsResponse.getShards()).allMatch(x -> x.getSearchIdleTime() >= searchIdleAfter)); + } + } diff --git a/server/src/main/java/org/elasticsearch/TransportVersion.java b/server/src/main/java/org/elasticsearch/TransportVersion.java index b691eea932897..c4c970f2288d9 100644 --- a/server/src/main/java/org/elasticsearch/TransportVersion.java +++ b/server/src/main/java/org/elasticsearch/TransportVersion.java @@ -124,12 +124,13 @@ private static TransportVersion registerTransportVersion(int id, String uniqueId public static final TransportVersion V_8_500_001 = registerTransportVersion(8_500_001, "c943cfe5-c89d-4eae-989f-f5f4537e84e0"); public static final TransportVersion V_8_500_002 = registerTransportVersion(8_500_002, "055dd314-ff40-4313-b4c6-9fccddfa42a8"); public static final TransportVersion V_8_500_003 = registerTransportVersion(8_500_003, "30adbe0c-8614-40dd-81b5-44e9c657bb77"); + public static final TransportVersion V_8_500_004 = registerTransportVersion(8_500_004, "6a00db6a-fd66-42a9-97ea-f6cc53169110"); /** * Reference to the most recent transport version. * This should be the transport version with the highest id. */ - public static final TransportVersion CURRENT = V_8_500_003; + public static final TransportVersion CURRENT = V_8_500_004; /** * Reference to the earliest compatible transport version to this version of the codebase. diff --git a/server/src/main/java/org/elasticsearch/action/admin/cluster/stats/TransportClusterStatsAction.java b/server/src/main/java/org/elasticsearch/action/admin/cluster/stats/TransportClusterStatsAction.java index 9710950414c37..0ac93db4557e0 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/cluster/stats/TransportClusterStatsAction.java +++ b/server/src/main/java/org/elasticsearch/action/admin/cluster/stats/TransportClusterStatsAction.java @@ -222,7 +222,9 @@ protected ClusterStatsNodeResponse nodeOperation(ClusterStatsNodeRequest nodeReq CommonStats.getShardLevelStats(indicesService.getIndicesQueryCache(), indexShard, SHARD_STATS_FLAGS), commitStats, seqNoStats, - retentionLeaseStats + retentionLeaseStats, + indexShard.isSearchIdle(), + indexShard.searchIdleTime() ) ); } diff --git a/server/src/main/java/org/elasticsearch/action/admin/indices/stats/ShardStats.java b/server/src/main/java/org/elasticsearch/action/admin/indices/stats/ShardStats.java index d5a7d17f2a4b5..f96a800ea9964 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/indices/stats/ShardStats.java +++ b/server/src/main/java/org/elasticsearch/action/admin/indices/stats/ShardStats.java @@ -41,6 +41,10 @@ public class ShardStats implements Writeable, ToXContentFragment { private final String statePath; private final boolean isCustomDataPath; + private final boolean isSearchIdle; + + private final long searchIdleTime; + public ShardStats(StreamInput in) throws IOException { shardRouting = new ShardRouting(in); commonStats = new CommonStats(in); @@ -54,26 +58,13 @@ public ShardStats(StreamInput in) throws IOException { isCustomDataPath = in.readBoolean(); seqNoStats = in.readOptionalWriteable(SeqNoStats::new); retentionLeaseStats = in.readOptionalWriteable(RetentionLeaseStats::new); - } - - public ShardStats( - final ShardRouting shardRouting, - final ShardPath shardPath, - final CommonStats commonStats, - final CommitStats commitStats, - final SeqNoStats seqNoStats, - final RetentionLeaseStats retentionLeaseStats - ) { - this( - shardRouting, - commonStats, - commitStats, - seqNoStats, - retentionLeaseStats, - shardPath.getRootDataPath().toString(), - shardPath.getRootStatePath().toString(), - shardPath.isCustomDataPath() - ); + if (in.getTransportVersion().onOrAfter(TransportVersion.V_8_500_004)) { + isSearchIdle = in.readBoolean(); + searchIdleTime = in.readVLong(); + } else { + isSearchIdle = false; + searchIdleTime = 0; + } } public ShardStats( @@ -84,7 +75,9 @@ public ShardStats( RetentionLeaseStats retentionLeaseStats, String dataPath, String statePath, - boolean isCustomDataPath + boolean isCustomDataPath, + boolean isSearchIdle, + long searchIdleTime ) { this.shardRouting = shardRouting; this.commonStats = commonStats; @@ -94,6 +87,32 @@ public ShardStats( this.dataPath = dataPath; this.statePath = statePath; this.isCustomDataPath = isCustomDataPath; + this.isSearchIdle = isSearchIdle; + this.searchIdleTime = searchIdleTime; + } + + public ShardStats( + final ShardRouting shardRouting, + final ShardPath shardPath, + final CommonStats commonStats, + final CommitStats commitStats, + final SeqNoStats seqNoStats, + final RetentionLeaseStats retentionLeaseStats, + boolean isSearchIdle, + long searchIdleTime + ) { + this( + shardRouting, + commonStats, + commitStats, + seqNoStats, + retentionLeaseStats, + shardPath.getRootDataPath().toString(), + shardPath.getRootStatePath().toString(), + shardPath.isCustomDataPath(), + isSearchIdle, + searchIdleTime + ); } @Override @@ -108,12 +127,25 @@ public boolean equals(Object o) { && Objects.equals(commitStats, that.commitStats) && Objects.equals(commonStats, that.commonStats) && Objects.equals(seqNoStats, that.seqNoStats) - && Objects.equals(retentionLeaseStats, that.retentionLeaseStats); + && Objects.equals(retentionLeaseStats, that.retentionLeaseStats) + && Objects.equals(isSearchIdle, that.isSearchIdle) + && Objects.equals(searchIdleTime, that.searchIdleTime); } @Override public int hashCode() { - return Objects.hash(shardRouting, dataPath, statePath, isCustomDataPath, commitStats, commonStats, seqNoStats, retentionLeaseStats); + return Objects.hash( + shardRouting, + dataPath, + statePath, + isCustomDataPath, + commitStats, + commonStats, + seqNoStats, + retentionLeaseStats, + isSearchIdle, + searchIdleTime + ); } /** @@ -158,6 +190,14 @@ public boolean isCustomDataPath() { return isCustomDataPath; } + public boolean isSearchIdle() { + return isSearchIdle; + } + + public long getSearchIdleTime() { + return searchIdleTime; + } + @Override public void writeTo(StreamOutput out) throws IOException { shardRouting.writeTo(out); @@ -172,6 +212,10 @@ public void writeTo(StreamOutput out) throws IOException { out.writeBoolean(isCustomDataPath); out.writeOptionalWriteable(seqNoStats); out.writeOptionalWriteable(retentionLeaseStats); + if (out.getTransportVersion().onOrAfter(TransportVersion.V_8_500_004)) { + out.writeBoolean(isSearchIdle); + out.writeVLong(searchIdleTime); + } } @Override @@ -198,6 +242,8 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws builder.field(Fields.DATA_PATH, dataPath); builder.field(Fields.IS_CUSTOM_DATA_PATH, isCustomDataPath); builder.endObject(); + builder.field(Fields.SEARCH_IDLE, isSearchIdle); + builder.field(Fields.SEARCH_IDLE_TIME, searchIdleTime); return builder; } @@ -211,6 +257,8 @@ static final class Fields { static final String PRIMARY = "primary"; static final String NODE = "node"; static final String RELOCATING_NODE = "relocating_node"; + static final String SEARCH_IDLE = "search_idle"; + static final String SEARCH_IDLE_TIME = "search_idle_time"; } } diff --git a/server/src/main/java/org/elasticsearch/action/admin/indices/stats/TransportIndicesStatsAction.java b/server/src/main/java/org/elasticsearch/action/admin/indices/stats/TransportIndicesStatsAction.java index 3d799e7efc423..d7c00bfb00f65 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/indices/stats/TransportIndicesStatsAction.java +++ b/server/src/main/java/org/elasticsearch/action/admin/indices/stats/TransportIndicesStatsAction.java @@ -135,7 +135,9 @@ protected void shardOperation(IndicesStatsRequest request, ShardRouting shardRou commonStats, commitStats, seqNoStats, - retentionLeaseStats + retentionLeaseStats, + indexShard.isSearchIdle(), + indexShard.searchIdleTime() ); }); } diff --git a/server/src/main/java/org/elasticsearch/index/shard/IndexShard.java b/server/src/main/java/org/elasticsearch/index/shard/IndexShard.java index 4b53f52438174..d08fe8367fbca 100644 --- a/server/src/main/java/org/elasticsearch/index/shard/IndexShard.java +++ b/server/src/main/java/org/elasticsearch/index/shard/IndexShard.java @@ -3752,6 +3752,10 @@ public final boolean isSearchIdle() { return (threadPool.relativeTimeInMillis() - lastSearcherAccess.get()) >= indexSettings.getSearchIdleAfter().getMillis(); } + public long searchIdleTime() { + return threadPool.relativeTimeInMillis() - lastSearcherAccess.get(); + } + /** * Returns the last timestamp the searcher was accessed. This is a relative timestamp in milliseconds. */ diff --git a/server/src/main/java/org/elasticsearch/indices/IndicesService.java b/server/src/main/java/org/elasticsearch/indices/IndicesService.java index 1da1e0cbbf22c..ba21653b880a7 100644 --- a/server/src/main/java/org/elasticsearch/indices/IndicesService.java +++ b/server/src/main/java/org/elasticsearch/indices/IndicesService.java @@ -537,7 +537,9 @@ IndexShardStats indexShardStats(final IndicesService indicesService, final Index CommonStats.getShardLevelStats(indicesService.getIndicesQueryCache(), indexShard, flags), commitStats, seqNoStats, - retentionLeaseStats + retentionLeaseStats, + indexShard.isSearchIdle(), + indexShard.searchIdleTime() ) } ); } diff --git a/server/src/test/java/org/elasticsearch/action/admin/cluster/node/stats/NodeStatsTests.java b/server/src/test/java/org/elasticsearch/action/admin/cluster/node/stats/NodeStatsTests.java index 098f853ec1071..f53b79df67fc4 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/cluster/node/stats/NodeStatsTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/cluster/node/stats/NodeStatsTests.java @@ -703,7 +703,7 @@ private static ShardStats createShardStats(ShardId shardId) { .resolve(shardRouting.shardId().getIndex().getUUID()) .resolve(String.valueOf(shardRouting.shardId().id())); ShardPath shardPath = new ShardPath(false, path, path, shardRouting.shardId()); - return new ShardStats(shardRouting, shardPath, createShardLevelCommonStats(), null, null, null); + return new ShardStats(shardRouting, shardPath, createShardLevelCommonStats(), null, null, null, false, 0); } public static NodeStats createNodeStats() { diff --git a/server/src/test/java/org/elasticsearch/action/admin/cluster/stats/VersionStatsTests.java b/server/src/test/java/org/elasticsearch/action/admin/cluster/stats/VersionStatsTests.java index 463471799c796..4348aedc1b12c 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/cluster/stats/VersionStatsTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/cluster/stats/VersionStatsTests.java @@ -117,7 +117,9 @@ public void testCreation() { CommonStats.getShardLevelStats(null, indexShard, new CommonStatsFlags(CommonStatsFlags.Flag.Store)), null, null, - null + null, + false, + 0 ); ClusterStatsNodeResponse nodeResponse = new ClusterStatsNodeResponse( TestDiscoveryNode.create("id"), diff --git a/server/src/test/java/org/elasticsearch/action/admin/indices/rollover/TransportRolloverActionTests.java b/server/src/test/java/org/elasticsearch/action/admin/indices/rollover/TransportRolloverActionTests.java index 1e0d6409ca875..f7292d5600a6f 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/indices/rollover/TransportRolloverActionTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/indices/rollover/TransportRolloverActionTests.java @@ -490,7 +490,7 @@ public static IndicesStatsResponse randomIndicesStatsResponse(final IndexMetadat stats.get = new GetStats(); stats.flush = new FlushStats(); stats.warmer = new WarmerStats(); - shardStats.add(new ShardStats(shardRouting, new ShardPath(false, path, path, shardId), stats, null, null, null)); + shardStats.add(new ShardStats(shardRouting, new ShardPath(false, path, path, shardId), stats, null, null, null, false, 0)); } } return IndicesStatsTests.newIndicesStatsResponse( diff --git a/server/src/test/java/org/elasticsearch/action/admin/indices/stats/IndicesStatsResponseTests.java b/server/src/test/java/org/elasticsearch/action/admin/indices/stats/IndicesStatsResponseTests.java index 453343ae28057..a1280f7658804 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/indices/stats/IndicesStatsResponseTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/indices/stats/IndicesStatsResponseTests.java @@ -75,7 +75,7 @@ public void testGetIndices() { Path path = createTempDir().resolve("indices").resolve(index.getUUID()).resolve(String.valueOf(shardId)); ShardPath shardPath = new ShardPath(false, path, path, shId); ShardRouting routing = createShardRouting(shId, (shardId == 0)); - shards.add(new ShardStats(routing, shardPath, null, null, null, null)); + shards.add(new ShardStats(routing, shardPath, null, null, null, null, false, 0)); AtomicLong primaryShardsCounter = expectedIndexToPrimaryShardsCount.computeIfAbsent( index.getName(), k -> new AtomicLong(0L) @@ -124,7 +124,7 @@ public void testChunkedEncodingPerIndex() throws IOException { Path path = createTempDir().resolve("indices").resolve(shId.getIndex().getUUID()).resolve(String.valueOf(shId.id())); ShardPath shardPath = new ShardPath(false, path, path, shId); ShardRouting routing = createShardRouting(shId, (shId.id() == 0)); - stats.add(new ShardStats(routing, shardPath, new CommonStats(), null, null, null)); + stats.add(new ShardStats(routing, shardPath, new CommonStats(), null, null, null, false, 0)); } final IndicesStatsResponse indicesStatsResponse = new IndicesStatsResponse( stats.toArray(new ShardStats[0]), diff --git a/server/src/test/java/org/elasticsearch/cluster/DiskUsageTests.java b/server/src/test/java/org/elasticsearch/cluster/DiskUsageTests.java index 77e7f2a2b7b70..e3cbc26534ac3 100644 --- a/server/src/test/java/org/elasticsearch/cluster/DiskUsageTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/DiskUsageTests.java @@ -123,9 +123,18 @@ public void testFillShardLevelInfo() { CommonStats commonStats2 = new CommonStats(); commonStats2.store = new StoreStats(1000, 999, 0L); ShardStats[] stats = new ShardStats[] { - new ShardStats(test_0, new ShardPath(false, test0Path, test0Path, test_0.shardId()), commonStats0, null, null, null), - new ShardStats(test_1, new ShardPath(false, test1Path, test1Path, test_1.shardId()), commonStats1, null, null, null), - new ShardStats(test_1, new ShardPath(false, test1Path, test1Path, test_1.shardId()), commonStats2, null, null, null) }; + new ShardStats(test_0, new ShardPath(false, test0Path, test0Path, test_0.shardId()), commonStats0, null, null, null, false, 0), + new ShardStats(test_1, new ShardPath(false, test1Path, test1Path, test_1.shardId()), commonStats1, null, null, null, false, 0), + new ShardStats( + test_1, + new ShardPath(false, test1Path, test1Path, test_1.shardId()), + commonStats2, + null, + null, + null, + false, + 0 + ) }; Map shardSizes = new HashMap<>(); Map shardDataSetSizes = new HashMap<>(); Map routingToPath = new HashMap<>(); diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexMetadataStatsTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexMetadataStatsTests.java index 227d5d1ab4487..1a76b62575002 100644 --- a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexMetadataStatsTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexMetadataStatsTests.java @@ -114,6 +114,6 @@ private ShardStats createShardStats( .add( new IndexingStats.Stats(0, 0, 0, 0, 0, 0, 0, 0, false, 0, totalIndexingTimeSinceShardStartedInNanos, totalActiveTimeInNanos) ); - return new ShardStats(shardRouting, commonStats, null, null, null, null, null, false); + return new ShardStats(shardRouting, commonStats, null, null, null, null, null, false, false, 0); } } diff --git a/server/src/test/java/org/elasticsearch/index/shard/IndexShardTests.java b/server/src/test/java/org/elasticsearch/index/shard/IndexShardTests.java index 5d847247ac30d..e9fefbfcce942 100644 --- a/server/src/test/java/org/elasticsearch/index/shard/IndexShardTests.java +++ b/server/src/test/java/org/elasticsearch/index/shard/IndexShardTests.java @@ -1543,7 +1543,9 @@ public void testShardStats() throws IOException { CommonStats.getShardLevelStats(new IndicesQueryCache(Settings.EMPTY), shard, new CommonStatsFlags()), shard.commitStats(), shard.seqNoStats(), - shard.getRetentionLeaseStats() + shard.getRetentionLeaseStats(), + shard.isSearchIdle(), + shard.searchIdleTime() ); assertEquals(shard.shardPath().getRootDataPath().toString(), stats.getDataPath()); assertEquals(shard.shardPath().getRootStatePath().toString(), stats.getStatePath()); @@ -3693,22 +3695,26 @@ public void testIsSearchIdle() throws Exception { scopedSettings.applySettings(settings); assertFalse(primary.isSearchIdle()); - settings = Settings.builder() - .put(settings) - .put(IndexSettings.INDEX_SEARCH_IDLE_AFTER.getKey(), TimeValue.timeValueMillis(10)) - .build(); + TimeValue tenMillis = TimeValue.timeValueMillis(10); + settings = Settings.builder().put(settings).put(IndexSettings.INDEX_SEARCH_IDLE_AFTER.getKey(), tenMillis).build(); scopedSettings.applySettings(settings); assertBusy(() -> assertTrue(primary.isSearchIdle())); do { // now loop until we are fast enough... shouldn't take long primary.awaitShardSearchActive(aBoolean -> {}); + if (primary.isSearchIdle()) { + assertTrue(primary.searchIdleTime() >= tenMillis.millis()); + } } while (primary.isSearchIdle()); assertBusy(() -> assertTrue(primary.isSearchIdle())); do { // now loop until we are fast enough... shouldn't take long primary.acquireSearcher("test").close(); + if (primary.isSearchIdle()) { + assertTrue(primary.searchIdleTime() >= tenMillis.millis()); + } } while (primary.isSearchIdle()); closeShards(primary); } @@ -3772,6 +3778,7 @@ public void testScheduledRefresh() throws Exception { indexDoc(primary, "_doc", "2", "{\"foo\" : \"bar\"}"); assertFalse(primary.scheduledRefresh()); assertTrue(primary.isSearchIdle()); + assertTrue(primary.searchIdleTime() >= TimeValue.ZERO.millis()); primary.flushOnIdle(0); assertTrue(primary.scheduledRefresh()); // make sure we refresh once the shard is inactive try (Engine.Searcher searcher = primary.acquireSearcher("test")) { diff --git a/server/src/test/java/org/elasticsearch/rest/action/cat/RestShardsActionTests.java b/server/src/test/java/org/elasticsearch/rest/action/cat/RestShardsActionTests.java index 03d3ae5ad28cf..21bc8d4ac77dc 100644 --- a/server/src/test/java/org/elasticsearch/rest/action/cat/RestShardsActionTests.java +++ b/server/src/test/java/org/elasticsearch/rest/action/cat/RestShardsActionTests.java @@ -58,7 +58,9 @@ public void testBuildTable() { null, null, null, - null + null, + false, + 0 ); shardStatsMap.put(shardRouting, shardStats); shardRoutings.add(shardRouting); diff --git a/test/framework/src/main/java/org/elasticsearch/cluster/MockInternalClusterInfoService.java b/test/framework/src/main/java/org/elasticsearch/cluster/MockInternalClusterInfoService.java index 713da088b85bb..b310f3fc89894 100644 --- a/test/framework/src/main/java/org/elasticsearch/cluster/MockInternalClusterInfoService.java +++ b/test/framework/src/main/java/org/elasticsearch/cluster/MockInternalClusterInfoService.java @@ -119,7 +119,9 @@ ShardStats[] adjustShardStats(ShardStats[] shardsStats) { shardStats.getRetentionLeaseStats(), shardStats.getDataPath(), shardStats.getStatePath(), - shardStats.isCustomDataPath() + shardStats.isCustomDataPath(), + shardStats.isSearchIdle(), + shardStats.getSearchIdleTime() ); }).toArray(ShardStats[]::new); } diff --git a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/DataTiersUsageTransportActionTests.java b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/DataTiersUsageTransportActionTests.java index 125d0d43ae5c5..76793dc0c7fe8 100644 --- a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/DataTiersUsageTransportActionTests.java +++ b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/DataTiersUsageTransportActionTests.java @@ -774,7 +774,7 @@ private static ShardStats shardStat(long byteCount, long docCount, ShardRouting Path fakePath = PathUtils.get("test/dir/" + routing.shardId().getIndex().getUUID() + "/" + routing.shardId().id()); ShardPath fakeShardPath = new ShardPath(false, fakePath, fakePath, routing.shardId()); - return new ShardStats(routing, fakeShardPath, commonStats, null, null, null); + return new ShardStats(routing, fakeShardPath, commonStats, null, null, null, false, 0); } private static NodeStats mockNodeStats(DiscoveryNode node, NodeIndicesStats indexStats) { diff --git a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ilm/WaitForNoFollowersStepTests.java b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ilm/WaitForNoFollowersStepTests.java index f57e16aa5bf27..9c94c909e3152 100644 --- a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ilm/WaitForNoFollowersStepTests.java +++ b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ilm/WaitForNoFollowersStepTests.java @@ -184,7 +184,7 @@ public void testNoShardStats() { .numberOfReplicas(randomIntBetween(1, 10)) .build(); - ShardStats sStats = new ShardStats(null, mockShardPath(), null, null, null, null); + ShardStats sStats = new ShardStats(null, mockShardPath(), null, null, null, null, false, 0); ShardStats[] shardStats = new ShardStats[1]; shardStats[0] = sStats; @@ -293,7 +293,7 @@ private IndexStats randomIndexStats(boolean isLeaderIndex, int numOfShards) { } private ShardStats randomShardStats(boolean isLeaderIndex) { - return new ShardStats(null, mockShardPath(), null, null, null, randomRetentionLeaseStats(isLeaderIndex)); + return new ShardStats(null, mockShardPath(), null, null, null, randomRetentionLeaseStats(isLeaderIndex), false, 0); } private RetentionLeaseStats randomRetentionLeaseStats(boolean isLeaderIndex) { diff --git a/x-pack/plugin/monitoring/src/test/java/org/elasticsearch/xpack/monitoring/collector/indices/IndicesStatsMonitoringDocTests.java b/x-pack/plugin/monitoring/src/test/java/org/elasticsearch/xpack/monitoring/collector/indices/IndicesStatsMonitoringDocTests.java index 8ae1c79d3b3f4..c6f02637a8bde 100644 --- a/x-pack/plugin/monitoring/src/test/java/org/elasticsearch/xpack/monitoring/collector/indices/IndicesStatsMonitoringDocTests.java +++ b/x-pack/plugin/monitoring/src/test/java/org/elasticsearch/xpack/monitoring/collector/indices/IndicesStatsMonitoringDocTests.java @@ -55,10 +55,10 @@ public void setUp() throws Exception { null, new ShardStats[] { // Primaries - new ShardStats(mockShardRouting(true), mockShardPath(), mockCommonStats(), null, null, null), - new ShardStats(mockShardRouting(true), mockShardPath(), mockCommonStats(), null, null, null), + new ShardStats(mockShardRouting(true), mockShardPath(), mockCommonStats(), null, null, null, false, 0), + new ShardStats(mockShardRouting(true), mockShardPath(), mockCommonStats(), null, null, null, false, 0), // Replica - new ShardStats(mockShardRouting(false), mockShardPath(), mockCommonStats(), null, null, null) } + new ShardStats(mockShardRouting(false), mockShardPath(), mockCommonStats(), null, null, null, false, 0) } ) ); } diff --git a/x-pack/plugin/transform/src/internalClusterTest/java/org/elasticsearch/xpack/transform/checkpoint/TransformCheckpointServiceNodeTests.java b/x-pack/plugin/transform/src/internalClusterTest/java/org/elasticsearch/xpack/transform/checkpoint/TransformCheckpointServiceNodeTests.java index af29c04f07168..941477765ff45 100644 --- a/x-pack/plugin/transform/src/internalClusterTest/java/org/elasticsearch/xpack/transform/checkpoint/TransformCheckpointServiceNodeTests.java +++ b/x-pack/plugin/transform/src/internalClusterTest/java/org/elasticsearch/xpack/transform/checkpoint/TransformCheckpointServiceNodeTests.java @@ -384,7 +384,9 @@ private static ShardStats[] createShardStats(Map checkpoints) { ); Path path = createTempDir().resolve("indices").resolve(index.getUUID()).resolve(String.valueOf(i)); - shardStats.add(new ShardStats(shardRouting, new ShardPath(false, path, path, shardId), stats, null, seqNoStats, null)); + shardStats.add( + new ShardStats(shardRouting, new ShardPath(false, path, path, shardId), stats, null, seqNoStats, null, false, 0) + ); } } diff --git a/x-pack/plugin/transform/src/test/java/org/elasticsearch/xpack/transform/checkpoint/TransformsCheckpointServiceTests.java b/x-pack/plugin/transform/src/test/java/org/elasticsearch/xpack/transform/checkpoint/TransformsCheckpointServiceTests.java index bb4f0450f0514..a894dadc24afc 100644 --- a/x-pack/plugin/transform/src/test/java/org/elasticsearch/xpack/transform/checkpoint/TransformsCheckpointServiceTests.java +++ b/x-pack/plugin/transform/src/test/java/org/elasticsearch/xpack/transform/checkpoint/TransformsCheckpointServiceTests.java @@ -237,11 +237,29 @@ private static ShardStats[] createRandomShardStats( globalCheckpoint - randomLongBetween(10L, 100L) ); shardStats.add( - new ShardStats(shardRouting, new ShardPath(false, path, path, shardId), stats, null, invalidSeqNoStats, null) + new ShardStats( + shardRouting, + new ShardPath(false, path, path, shardId), + stats, + null, + invalidSeqNoStats, + null, + false, + 0 + ) ); } else { shardStats.add( - new ShardStats(shardRouting, new ShardPath(false, path, path, shardId), stats, null, validSeqNoStats, null) + new ShardStats( + shardRouting, + new ShardPath(false, path, path, shardId), + stats, + null, + validSeqNoStats, + null, + false, + 0 + ) ); } }