瀏覽代碼

Do not include desired nodes in snapshots (#87695)

Francisco Fernández Castaño 3 年之前
父節點
當前提交
c5ef3bf8a7

+ 5 - 0
docs/changelog/87695.yaml

@@ -0,0 +1,5 @@
+pr: 87695
+summary: Do not include desired nodes in snapshots
+area: Autoscaling
+type: bug
+issues: []

+ 79 - 0
server/src/internalClusterTest/java/org/elasticsearch/cluster/DesiredNodesSnapshotsIT.java

@@ -0,0 +1,79 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+package org.elasticsearch.cluster;
+
+import org.elasticsearch.Version;
+import org.elasticsearch.action.admin.cluster.desirednodes.GetDesiredNodesAction;
+import org.elasticsearch.action.admin.cluster.desirednodes.UpdateDesiredNodesAction;
+import org.elasticsearch.action.admin.cluster.desirednodes.UpdateDesiredNodesRequest;
+import org.elasticsearch.action.admin.cluster.desirednodes.UpdateDesiredNodesResponse;
+import org.elasticsearch.cluster.metadata.DesiredNode;
+import org.elasticsearch.cluster.metadata.DesiredNodes;
+import org.elasticsearch.common.settings.Settings;
+import org.elasticsearch.common.unit.ByteSizeValue;
+import org.elasticsearch.snapshots.AbstractSnapshotIntegTestCase;
+
+import static org.elasticsearch.node.Node.NODE_NAME_SETTING;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
+
+public class DesiredNodesSnapshotsIT extends AbstractSnapshotIntegTestCase {
+    public void testDesiredNodesAreNotIncludedInSnapshotsClusterState() {
+        final var updateDesiredNodesRequest = randomUpdateDesiredNodesRequest();
+        updateDesiredNodes(updateDesiredNodesRequest);
+
+        final var indexName = "idx";
+        createIndex(indexName);
+
+        final var repositoryName = "my-repo";
+        createRepository(repositoryName, "fs");
+        final var snapshotName = "snapshot";
+        createFullSnapshot(repositoryName, snapshotName);
+
+        client().admin().indices().prepareDelete(indexName).get();
+
+        final var updateDesiredNodesWithNewHistoryRequest = randomUpdateDesiredNodesRequest();
+        final var updateDesiredNodesResponse = updateDesiredNodes(updateDesiredNodesWithNewHistoryRequest);
+        assertThat(updateDesiredNodesResponse.hasReplacedExistingHistoryId(), is(true));
+
+        final var desiredNodesAfterSnapshot = getLatestDesiredNodes();
+
+        client().admin().cluster().prepareRestoreSnapshot(repositoryName, snapshotName).setRestoreGlobalState(true).get();
+
+        final var desiredNodesAfterRestore = getLatestDesiredNodes();
+        assertThat(desiredNodesAfterRestore.historyID(), is(equalTo(desiredNodesAfterSnapshot.historyID())));
+        assertThat(desiredNodesAfterRestore.version(), is(equalTo(desiredNodesAfterSnapshot.version())));
+    }
+
+    private UpdateDesiredNodesResponse updateDesiredNodes(UpdateDesiredNodesRequest updateDesiredNodesRequest) {
+        return client().execute(UpdateDesiredNodesAction.INSTANCE, updateDesiredNodesRequest).actionGet();
+    }
+
+    private DesiredNodes getLatestDesiredNodes() {
+        return client().execute(GetDesiredNodesAction.INSTANCE, new GetDesiredNodesAction.Request()).actionGet().getDesiredNodes();
+    }
+
+    private UpdateDesiredNodesRequest randomUpdateDesiredNodesRequest() {
+        return new UpdateDesiredNodesRequest(
+            randomAlphaOfLength(10),
+            randomIntBetween(1, 10),
+            randomList(
+                1,
+                10,
+                () -> new DesiredNode(
+                    Settings.builder().put(NODE_NAME_SETTING.getKey(), randomAlphaOfLength(10)).build(),
+                    randomIntBetween(1, 10),
+                    ByteSizeValue.ofGb(randomIntBetween(16, 64)),
+                    ByteSizeValue.ofGb(randomIntBetween(128, 256)),
+                    Version.CURRENT
+                )
+            )
+        );
+    }
+}

+ 1 - 1
server/src/main/java/org/elasticsearch/cluster/metadata/DesiredNodesMetadata.java

@@ -83,7 +83,7 @@ public class DesiredNodesMetadata extends AbstractNamedDiffable<Metadata.Custom>
 
     @Override
     public EnumSet<Metadata.XContentContext> context() {
-        return Metadata.ALL_CONTEXTS;
+        return Metadata.API_AND_GATEWAY;
     }
 
     @Override