From 427f0aa227563e1d49395f6513ecca50d331dd93 Mon Sep 17 00:00:00 2001 From: Niels Bauman Date: Tue, 8 Jul 2025 20:15:32 -0300 Subject: [PATCH 1/2] Remove `ClusterStateSerializationTests` These tests do not seem valuable anymore, now that multi-project has been merged some time ago. Additionally, creating objects for a cluster state this way is tricky, as those objects might get new features/fields, which would break serialization. Closes #130872 --- muted-tests.yml | 3 - .../ClusterStateSerializationTests.java | 85 ------------------- 2 files changed, 88 deletions(-) delete mode 100644 server/src/test/java/org/elasticsearch/cluster/ClusterStateSerializationTests.java diff --git a/muted-tests.yml b/muted-tests.yml index 796bbb0bfbd17..a8be4745d0b22 100644 --- a/muted-tests.yml +++ b/muted-tests.yml @@ -558,9 +558,6 @@ tests: - class: org.elasticsearch.xpack.slm.SLMFileSettingsIT method: testSettingsApplied issue: https://github.com/elastic/elasticsearch/issues/130853 -- class: org.elasticsearch.cluster.ClusterStateSerializationTests - method: testSerializationPreMultiProject - issue: https://github.com/elastic/elasticsearch/issues/130872 # Examples: # diff --git a/server/src/test/java/org/elasticsearch/cluster/ClusterStateSerializationTests.java b/server/src/test/java/org/elasticsearch/cluster/ClusterStateSerializationTests.java deleted file mode 100644 index 59baef0ebe05a..0000000000000 --- a/server/src/test/java/org/elasticsearch/cluster/ClusterStateSerializationTests.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -package org.elasticsearch.cluster; - -import org.elasticsearch.TransportVersion; -import org.elasticsearch.TransportVersions; -import org.elasticsearch.cluster.metadata.DataStreamTestHelper; -import org.elasticsearch.cluster.metadata.Metadata; -import org.elasticsearch.cluster.metadata.ProjectMetadata; -import org.elasticsearch.cluster.node.DiscoveryNode; -import org.elasticsearch.cluster.node.DiscoveryNodeUtils; -import org.elasticsearch.cluster.node.DiscoveryNodes; -import org.elasticsearch.common.io.stream.NamedWriteableRegistry; -import org.elasticsearch.core.Tuple; -import org.elasticsearch.test.ESTestCase; -import org.elasticsearch.test.MapMatcher; -import org.elasticsearch.test.TransportVersionUtils; -import org.elasticsearch.test.XContentTestUtils; -import org.hamcrest.Matchers; - -import java.io.IOException; -import java.util.List; -import java.util.Set; - -public class ClusterStateSerializationTests extends ESTestCase { - - public void testSerializationInCurrentVersion() throws IOException { - assertSerializationRoundTrip(TransportVersion.current()); - } - - public void testSerializationPreMultiProject() throws IOException { - assertSerializationRoundTrip(TransportVersionUtils.getPreviousVersion(TransportVersions.MULTI_PROJECT)); - } - - private void assertSerializationRoundTrip(TransportVersion transportVersion) throws IOException { - ClusterState original = randomClusterState(transportVersion); - DiscoveryNode node = original.nodes().getLocalNode(); - assertThat(node, Matchers.notNullValue()); - - final ClusterState deserialized = ESTestCase.copyWriteable( - original, - new NamedWriteableRegistry(ClusterModule.getNamedWriteables()), - in -> ClusterState.readFrom(in, node), - transportVersion - ); - assertEquivalent("For transport version: " + transportVersion, original, deserialized); - } - - private void assertEquivalent(String context, ClusterState expected, ClusterState actual) throws IOException { - if (expected == actual) { - return; - } - // The simplest model we have for comparing equivalence is by comparing the XContent of the cluster state - var expectedJson = XContentTestUtils.convertToMap(expected); - var actualJson = XContentTestUtils.convertToMap(actual); - assertThat(context, actualJson, MapMatcher.matchesMap(expectedJson)); - } - - private ClusterState randomClusterState(TransportVersion transportVersion) { - final Set datastreamNames = randomSet(0, 10, () -> randomAlphaOfLengthBetween(4, 18)); - final List> datastreams = datastreamNames.stream() - .map(name -> new Tuple<>(name, randomIntBetween(1, 5))) - .toList(); - final List indices = List.copyOf( - randomSet(0, 10, () -> randomValueOtherThanMany(datastreamNames::contains, () -> randomAlphaOfLengthBetween(3, 12))) - ); - - final DiscoveryNodes.Builder nodes = DiscoveryNodes.builder(); - do { - final String id = randomUUID(); - nodes.add(DiscoveryNodeUtils.create(id)); - nodes.localNodeId(id); - } while (randomBoolean()); - - ProjectMetadata project = DataStreamTestHelper.getProjectWithDataStreams(datastreams, indices); - return ClusterState.builder(ClusterName.DEFAULT).metadata(Metadata.builder().put(project)).nodes(nodes).build(); - } -} From 136360e9196610aa40f3bbc38cd11d32486978cb Mon Sep 17 00:00:00 2001 From: Niels Bauman Date: Tue, 15 Jul 2025 14:34:00 -0300 Subject: [PATCH 2/2] Add new test --- .../cluster/metadata/MetadataTests.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataTests.java index 01e271ff6483b..373831b54804b 100644 --- a/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/metadata/MetadataTests.java @@ -10,6 +10,7 @@ package org.elasticsearch.cluster.metadata; import org.elasticsearch.TransportVersion; +import org.elasticsearch.TransportVersions; import org.elasticsearch.cluster.ClusterModule; import org.elasticsearch.cluster.Diff; import org.elasticsearch.cluster.coordination.CoordinationMetadata; @@ -45,6 +46,7 @@ import org.elasticsearch.persistent.PersistentTasksService; import org.elasticsearch.test.AbstractChunkedSerializingTestCase; import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.test.TransportVersionUtils; import org.elasticsearch.test.index.IndexVersionUtils; import org.elasticsearch.test.rest.ObjectPath; import org.elasticsearch.threadpool.ThreadPool; @@ -613,6 +615,17 @@ public void testMultiProjectSerialization() throws IOException { } } + public void testUnableToSerializeNonDefaultProjectBeforeMultiProject() { + final var projectId = randomUniqueProjectId(); + Metadata metadata = Metadata.builder().put(ProjectMetadata.builder(projectId)).build(); + + try (BytesStreamOutput output = new BytesStreamOutput()) { + output.setTransportVersion(TransportVersionUtils.getPreviousVersion(TransportVersions.MULTI_PROJECT)); + var e = assertThrows(UnsupportedOperationException.class, () -> metadata.writeTo(output)); + assertEquals("There is 1 project, but it has id [" + projectId + "] rather than default", e.getMessage()); + } + } + public void testGetNonExistingProjectThrows() { final List projects = IntStream.range(0, between(1, 3)) .mapToObj(i -> randomProject(ProjectId.fromId("p_" + i), between(0, 5)))