Skip to content

Commit 3568ab8

Browse files
authored
Migrate RepositoriesMetadata to ProjectCustom (#125398)
This PR migrates RepositoriesMetadata from Metadata#ClusterCustom to Metadata#ProjectCustom and handles wire BWC. Resolves: ES-10477
1 parent a256773 commit 3568ab8

File tree

17 files changed

+877
-62
lines changed

17 files changed

+877
-62
lines changed

server/src/internalClusterTest/java/org/elasticsearch/snapshots/RepositoriesIT.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public void testRepositoryCreation() throws Exception {
8383
.setMetadata(true)
8484
.get();
8585
Metadata metadata = clusterStateResponse.getState().getMetadata();
86-
RepositoriesMetadata repositoriesMetadata = metadata.custom(RepositoriesMetadata.TYPE);
86+
RepositoriesMetadata repositoriesMetadata = metadata.getProject().custom(RepositoriesMetadata.TYPE);
8787
assertThat(repositoriesMetadata, notNullValue());
8888
assertThat(repositoriesMetadata.repository("test-repo-1"), notNullValue());
8989
assertThat(repositoriesMetadata.repository("test-repo-1").type(), equalTo("fs"));
@@ -94,7 +94,7 @@ public void testRepositoryCreation() throws Exception {
9494
logger.info("--> check that both repositories are in cluster state");
9595
clusterStateResponse = client.admin().cluster().prepareState(TEST_REQUEST_TIMEOUT).clear().setMetadata(true).get();
9696
metadata = clusterStateResponse.getState().getMetadata();
97-
repositoriesMetadata = metadata.custom(RepositoriesMetadata.TYPE);
97+
repositoriesMetadata = metadata.getProject().custom(RepositoriesMetadata.TYPE);
9898
assertThat(repositoriesMetadata, notNullValue());
9999
assertThat(repositoriesMetadata.repositories().size(), equalTo(2));
100100
assertThat(repositoriesMetadata.repository("test-repo-1"), notNullValue());

server/src/main/java/org/elasticsearch/TransportVersions.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ static TransportVersion def(int id) {
207207
public static final TransportVersion RESCORE_VECTOR_ALLOW_ZERO = def(9_039_0_00);
208208
public static final TransportVersion PROJECT_ID_IN_SNAPSHOT = def(9_040_0_00);
209209
public static final TransportVersion INDEX_STATS_AND_METADATA_INCLUDE_PEAK_WRITE_LOAD = def(9_041_0_00);
210+
public static final TransportVersion REPOSITORIES_METADATA_AS_PROJECT_CUSTOM = def(9_042_0_00);
210211

211212
/*
212213
* STOP! READ THIS FIRST! No, really,

server/src/main/java/org/elasticsearch/cluster/ClusterModule.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ public static List<Entry> getNamedWriteables() {
226226
RepositoryCleanupInProgress::readDiffFrom
227227
);
228228
// Metadata
229-
registerMetadataCustom(entries, RepositoriesMetadata.TYPE, RepositoriesMetadata::new, RepositoriesMetadata::readDiffFrom);
229+
registerProjectCustom(entries, RepositoriesMetadata.TYPE, RepositoriesMetadata::new, RepositoriesMetadata::readDiffFrom);
230230
registerProjectCustom(entries, IngestMetadata.TYPE, IngestMetadata::new, IngestMetadata::readDiffFrom);
231231
registerProjectCustom(entries, ScriptMetadata.TYPE, ScriptMetadata::new, ScriptMetadata::readDiffFrom);
232232
registerProjectCustom(entries, IndexGraveyard.TYPE, IndexGraveyard::new, IndexGraveyard::readDiffFrom);
@@ -283,7 +283,7 @@ public static List<NamedXContentRegistry.Entry> getNamedXWriteables() {
283283
// Metadata
284284
entries.add(
285285
new NamedXContentRegistry.Entry(
286-
Metadata.ClusterCustom.class,
286+
Metadata.ProjectCustom.class,
287287
new ParseField(RepositoriesMetadata.TYPE),
288288
RepositoriesMetadata::fromXContent
289289
)

server/src/main/java/org/elasticsearch/cluster/DiffableUtils.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.util.Map;
2828
import java.util.Objects;
2929
import java.util.Set;
30+
import java.util.function.BiFunction;
3031
import java.util.function.Consumer;
3132
import java.util.function.Function;
3233
import java.util.function.Predicate;
@@ -98,6 +99,18 @@ public static <K, T, M extends Map<K, T>> MapDiff<K, T, M> emptyDiff() {
9899
return (MapDiff<K, T, M>) EMPTY;
99100
}
100101

102+
/**
103+
* Merges two map diffs into one unified diff with write-only value serializer.
104+
*/
105+
@SuppressWarnings("unchecked")
106+
public static <K, T extends Diffable<T>, T1 extends T, T2 extends T, M extends Map<K, T>> MapDiff<K, T, M> merge(
107+
MapDiff<K, T1, ? extends ImmutableOpenMap<K, T1>> diff1,
108+
MapDiff<K, T2, ? extends ImmutableOpenMap<K, T2>> diff2,
109+
KeySerializer<K> keySerializer
110+
) {
111+
return merge(diff1, diff2, keySerializer, DiffableValueSerializer.getWriteOnlyInstance());
112+
}
113+
101114
/**
102115
* Merges two map diffs into one unified diff.
103116
*/
@@ -146,6 +159,39 @@ public static <K, T, M extends Map<K, T>> boolean hasKey(MapDiff<K, T, M> diff,
146159
return false;
147160
}
148161

162+
/**
163+
* Create a new MapDiff from the specified MapDiff by transforming its diffs with the provided diffUpdateFunction as well as
164+
* transforming its upserts with the provided upsertUpdateFunction. Whether an entry should be transformed is determined by
165+
* the specified keyPredicate.
166+
* @param diff The original MapDiff
167+
* @param keyPredicate Determines whether an entry should be transformed
168+
* @param diffUpdateFunction A function to transform a Diff entry
169+
* @param upsertUpdateFunction A function to transform an upsert entry
170+
* @return A new MapDiff as a result of the transformation
171+
*/
172+
public static <K, T, M extends Map<K, T>> MapDiff<K, T, M> updateDiffsAndUpserts(
173+
MapDiff<K, T, M> diff,
174+
Predicate<K> keyPredicate,
175+
BiFunction<K, Diff<T>, Diff<T>> diffUpdateFunction,
176+
BiFunction<K, T, T> upsertUpdateFunction
177+
) {
178+
final var newDiffs = diff.getDiffs().stream().map(entry -> {
179+
if (keyPredicate.test(entry.getKey()) == false) {
180+
return entry;
181+
}
182+
return Map.entry(entry.getKey(), diffUpdateFunction.apply(entry.getKey(), entry.getValue()));
183+
}).toList();
184+
185+
final var newUpserts = diff.getUpserts().stream().map(entry -> {
186+
if (keyPredicate.test(entry.getKey()) == false) {
187+
return entry;
188+
}
189+
return Map.entry(entry.getKey(), upsertUpdateFunction.apply(entry.getKey(), entry.getValue()));
190+
}).toList();
191+
192+
return new MapDiff<>(diff.keySerializer, diff.valueSerializer, diff.deletes, newDiffs, newUpserts, diff.builderCtor);
193+
}
194+
149195
/**
150196
* Create a new JDK map backed MapDiff by transforming the keys with the provided keyFunction.
151197
* @param diff Original MapDiff to transform

0 commit comments

Comments
 (0)