42
42
import org .opensearch .cluster .metadata .IndexMetadata ;
43
43
import org .opensearch .cluster .metadata .Metadata ;
44
44
import org .opensearch .cluster .metadata .RepositoriesMetadata ;
45
+ import org .opensearch .cluster .metadata .RepositoryMetadata ;
45
46
import org .opensearch .cluster .node .DiscoveryNode ;
46
47
import org .opensearch .cluster .node .DiscoveryNodes ;
47
48
import org .opensearch .cluster .routing .RerouteService ;
57
58
import java .util .Collection ;
58
59
import java .util .Collections ;
59
60
import java .util .HashMap ;
61
+ import java .util .LinkedHashMap ;
60
62
import java .util .List ;
61
63
import java .util .Locale ;
62
64
import java .util .Map ;
@@ -185,11 +187,30 @@ public ClusterTasksResult<Task> execute(ClusterState currentState, List<Task> jo
185
187
// for every set of node join task which we can optimize to not compute if cluster state already has
186
188
// repository information.
187
189
Optional <DiscoveryNode > remoteDN = currentNodes .getNodes ().values ().stream ().filter (DiscoveryNode ::isRemoteStoreNode ).findFirst ();
188
- DiscoveryNode dn = remoteDN .orElseGet (() -> (currentNodes .getNodes ().values ()).stream ().findFirst ().get ());
189
- RepositoriesMetadata repositoriesMetadata = remoteStoreNodeService .updateRepositoriesMetadata (
190
- dn ,
191
- currentState .getMetadata ().custom (RepositoriesMetadata .TYPE )
192
- );
190
+ Optional <DiscoveryNode > remotePublicationDN = currentNodes .getNodes ()
191
+ .values ()
192
+ .stream ()
193
+ .filter (DiscoveryNode ::isRemoteStatePublicationEnabled )
194
+ .findFirst ();
195
+ RepositoriesMetadata existingRepositoriesMetadata = currentState .getMetadata ().custom (RepositoriesMetadata .TYPE );
196
+ Map <String , RepositoryMetadata > repositories = new LinkedHashMap <>();
197
+ if (existingRepositoriesMetadata != null ) {
198
+ existingRepositoriesMetadata .repositories ().forEach (r -> repositories .putIfAbsent (r .name (), r ));
199
+ }
200
+ if (remoteDN .isPresent ()) {
201
+ RepositoriesMetadata repositoriesMetadata = remoteStoreNodeService .updateRepositoriesMetadata (
202
+ remoteDN .get (),
203
+ existingRepositoriesMetadata
204
+ );
205
+ repositoriesMetadata .repositories ().forEach (r -> repositories .putIfAbsent (r .name (), r ));
206
+ }
207
+ if (remotePublicationDN .isPresent ()) {
208
+ RepositoriesMetadata repositoriesMetadata = remoteStoreNodeService .updateRepositoriesMetadata (
209
+ remotePublicationDN .get (),
210
+ existingRepositoriesMetadata
211
+ );
212
+ repositoriesMetadata .repositories ().forEach (r -> repositories .putIfAbsent (r .name (), r ));
213
+ }
193
214
194
215
assert nodesBuilder .isLocalNodeElectedClusterManager ();
195
216
@@ -219,15 +240,16 @@ public ClusterTasksResult<Task> execute(ClusterState currentState, List<Task> jo
219
240
ensureNodeCommissioned (node , currentState .metadata ());
220
241
nodesBuilder .add (node );
221
242
222
- if (remoteDN .isEmpty () && node .isRemoteStoreNode ()) {
243
+ if ((remoteDN .isEmpty () && node .isRemoteStoreNode ())
244
+ || (remotePublicationDN .isEmpty () && node .isRemoteStatePublicationEnabled ())) {
223
245
// This is hit only on cases where we encounter first remote node
224
246
logger .info ("Updating system repository now for remote store" );
225
- repositoriesMetadata = remoteStoreNodeService .updateRepositoriesMetadata (
247
+ RepositoriesMetadata repositoriesMetadata = remoteStoreNodeService .updateRepositoriesMetadata (
226
248
node ,
227
- currentState . getMetadata (). custom ( RepositoriesMetadata . TYPE )
249
+ existingRepositoriesMetadata
228
250
);
251
+ repositoriesMetadata .repositories ().forEach (r -> repositories .putIfAbsent (r .name (), r ));
229
252
}
230
-
231
253
nodesChanged = true ;
232
254
minClusterNodeVersion = Version .min (minClusterNodeVersion , node .getVersion ());
233
255
maxClusterNodeVersion = Version .max (maxClusterNodeVersion , node .getVersion ());
@@ -241,7 +263,7 @@ public ClusterTasksResult<Task> execute(ClusterState currentState, List<Task> jo
241
263
}
242
264
results .success (joinTask );
243
265
}
244
-
266
+ RepositoriesMetadata repositoriesMetadata = new RepositoriesMetadata ( new ArrayList <>( repositories . values ()));
245
267
if (nodesChanged ) {
246
268
rerouteService .reroute (
247
269
"post-join reroute" ,
0 commit comments