|
@@ -15,6 +15,7 @@ import org.elasticsearch.action.admin.cluster.snapshots.get.GetSnapshotsRequest;
|
|
|
import org.elasticsearch.action.admin.cluster.snapshots.get.GetSnapshotsResponse;
|
|
|
import org.elasticsearch.client.Request;
|
|
|
import org.elasticsearch.client.Response;
|
|
|
+import org.elasticsearch.cluster.SnapshotsInProgress;
|
|
|
import org.elasticsearch.common.Strings;
|
|
|
import org.elasticsearch.common.settings.Settings;
|
|
|
import org.elasticsearch.search.sort.SortOrder;
|
|
@@ -35,6 +36,7 @@ import java.util.HashSet;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.Set;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
import static org.elasticsearch.snapshots.AbstractSnapshotIntegTestCase.assertSnapshotListSorted;
|
|
|
import static org.elasticsearch.snapshots.AbstractSnapshotIntegTestCase.matchAllPattern;
|
|
@@ -46,10 +48,20 @@ import static org.hamcrest.Matchers.is;
|
|
|
// TODO: dry up duplication across this suite and org.elasticsearch.snapshots.GetSnapshotsIT more
|
|
|
public class RestGetSnapshotsIT extends AbstractSnapshotRestTestCase {
|
|
|
|
|
|
+ /**
|
|
|
+ * Large snapshot pool settings to set up nodes for tests involving multiple repositories that need to have enough
|
|
|
+ * threads so that blocking some threads on one repository doesn't block other repositories from doing work
|
|
|
+ */
|
|
|
+ private static final Settings LARGE_SNAPSHOT_POOL_SETTINGS = Settings.builder()
|
|
|
+ .put("thread_pool.snapshot.core", 3)
|
|
|
+ .put("thread_pool.snapshot.max", 3)
|
|
|
+ .build();
|
|
|
+
|
|
|
@Override
|
|
|
protected Settings nodeSettings(int nodeOrdinal, Settings otherSettings) {
|
|
|
return Settings.builder()
|
|
|
.put(super.nodeSettings(nodeOrdinal, otherSettings))
|
|
|
+ .put(LARGE_SNAPSHOT_POOL_SETTINGS)
|
|
|
.put(ThreadPool.ESTIMATED_TIME_INTERVAL_SETTING.getKey(), 0) // We have tests that check by-timestamp order
|
|
|
.build();
|
|
|
}
|
|
@@ -156,7 +168,6 @@ public class RestGetSnapshotsIT extends AbstractSnapshotRestTestCase {
|
|
|
assertNull(batch3LargeLimit.next());
|
|
|
}
|
|
|
|
|
|
- @AwaitsFix(bugUrl = "https://github.com/elastic/elasticsearch/issues/79779")
|
|
|
public void testSortAndPaginateWithInProgress() throws Exception {
|
|
|
final String repoName = "test-repo";
|
|
|
AbstractSnapshotIntegTestCase.createRepository(logger, repoName, "mock");
|
|
@@ -176,7 +187,23 @@ public class RestGetSnapshotsIT extends AbstractSnapshotRestTestCase {
|
|
|
inProgressSnapshots.add(AbstractSnapshotIntegTestCase.startFullSnapshot(logger, repoName, snapshotName, false));
|
|
|
}
|
|
|
AbstractSnapshotIntegTestCase.awaitNumberOfSnapshotsInProgress(logger, inProgressCount);
|
|
|
-
|
|
|
+ AbstractSnapshotIntegTestCase.awaitClusterState(logger, state -> {
|
|
|
+ boolean firstIndexSuccessfullySnapshot = state.custom(SnapshotsInProgress.TYPE, SnapshotsInProgress.EMPTY)
|
|
|
+ .asStream()
|
|
|
+ .flatMap(s -> s.shards().stream())
|
|
|
+ .allMatch(
|
|
|
+ e -> e.getKey().getIndexName().equals("test-index-1") == false
|
|
|
+ || e.getValue().state() == SnapshotsInProgress.ShardState.SUCCESS
|
|
|
+ );
|
|
|
+ boolean secondIndexIsBlocked = state.custom(SnapshotsInProgress.TYPE, SnapshotsInProgress.EMPTY)
|
|
|
+ .asStream()
|
|
|
+ .flatMap(s -> s.shards().stream())
|
|
|
+ .filter(e -> e.getKey().getIndexName().equals("test-index-2"))
|
|
|
+ .map(e -> e.getValue().state())
|
|
|
+ .collect(Collectors.groupingBy(e -> e, Collectors.counting()))
|
|
|
+ .equals(Map.of(SnapshotsInProgress.ShardState.INIT, 1L, SnapshotsInProgress.ShardState.QUEUED, (long) inProgressCount - 1));
|
|
|
+ return firstIndexSuccessfullySnapshot && secondIndexIsBlocked;
|
|
|
+ });
|
|
|
assertStablePagination(repoName, allSnapshotNames, GetSnapshotsRequest.SortBy.START_TIME);
|
|
|
assertStablePagination(repoName, allSnapshotNames, GetSnapshotsRequest.SortBy.NAME);
|
|
|
assertStablePagination(repoName, allSnapshotNames, GetSnapshotsRequest.SortBy.INDICES);
|