39
39
import org .opensearch .common .settings .Setting .Property ;
40
40
import org .opensearch .common .settings .Settings ;
41
41
import org .opensearch .common .unit .TimeValue ;
42
+ import org .opensearch .common .util .FeatureFlags ;
42
43
import org .opensearch .common .util .io .IOUtils ;
43
44
import org .opensearch .core .action .ActionListener ;
44
45
import org .opensearch .core .common .io .stream .NamedWriteableRegistry ;
88
89
89
90
import static java .util .Collections .emptyList ;
90
91
import static java .util .Collections .emptyMap ;
92
+ import static org .opensearch .common .util .FeatureFlags .REMOTE_PUBLICATION_EXPERIMENTAL ;
91
93
import static org .opensearch .gateway .PersistedClusterStateService .SLOW_WRITE_LOGGING_THRESHOLD ;
92
94
import static org .opensearch .gateway .remote .ClusterMetadataManifest .CODEC_V2 ;
93
95
import static org .opensearch .gateway .remote .RemoteClusterStateAttributesManager .CLUSTER_BLOCKS ;
@@ -159,6 +161,7 @@ public class RemoteClusterStateService implements Closeable {
159
161
private final String METADATA_UPDATE_LOG_STRING = "wrote metadata for [{}] indices and skipped [{}] unchanged "
160
162
+ "indices, coordination metadata updated : [{}], settings metadata updated : [{}], templates metadata "
161
163
+ "updated : [{}], custom metadata updated : [{}], indices routing updated : [{}]" ;
164
+ private final boolean isPublicationEnabled ;
162
165
163
166
// ToXContent Params with gateway mode.
164
167
// We are using gateway context mode to persist all custom metadata.
@@ -201,6 +204,9 @@ public RemoteClusterStateService(
201
204
threadPool
202
205
);
203
206
this .remoteClusterStateCleanupManager = new RemoteClusterStateCleanupManager (this , clusterService , remoteRoutingTableService );
207
+ this .isPublicationEnabled = FeatureFlags .isEnabled (REMOTE_PUBLICATION_EXPERIMENTAL )
208
+ && RemoteStoreNodeAttribute .isRemoteStoreClusterStateEnabled (settings )
209
+ && RemoteStoreNodeAttribute .isRemoteRoutingTableEnabled (settings );
204
210
}
205
211
206
212
/**
@@ -221,15 +227,15 @@ public RemoteClusterStateManifestInfo writeFullMetadata(ClusterState clusterStat
221
227
clusterState ,
222
228
new ArrayList <>(clusterState .metadata ().indices ().values ()),
223
229
emptyMap (),
224
- clusterState .metadata ().customs (),
230
+ RemoteGlobalMetadataManager . filterCustoms ( clusterState .metadata ().customs (), isPublicationEnabled ),
225
231
true ,
226
232
true ,
227
233
true ,
228
- true ,
229
- true ,
230
- true ,
231
- clusterState .customs (),
232
- true ,
234
+ isPublicationEnabled ,
235
+ isPublicationEnabled ,
236
+ isPublicationEnabled ,
237
+ isPublicationEnabled ? clusterState .customs () : Collections . emptyMap (),
238
+ isPublicationEnabled ,
233
239
remoteRoutingTableService .getIndicesRouting (clusterState .getRoutingTable ())
234
240
);
235
241
final RemoteClusterStateManifestInfo manifestDetails = remoteManifestManager .uploadManifest (
@@ -285,28 +291,17 @@ public RemoteClusterStateManifestInfo writeIncrementalMetadata(
285
291
}
286
292
assert previousClusterState .metadata ().coordinationMetadata ().term () == clusterState .metadata ().coordinationMetadata ().term ();
287
293
288
- final Map <String , UploadedMetadataAttribute > customsToBeDeletedFromRemote = new HashMap <>(previousManifest .getCustomMetadataMap ());
289
- final Map <String , Metadata .Custom > customsToUpload = remoteGlobalMetadataManager .getUpdatedCustoms (
290
- clusterState ,
291
- previousClusterState
292
- );
293
- final Map <String , UploadedMetadataAttribute > clusterStateCustomsToBeDeleted = new HashMap <>(
294
+ boolean firstUploadForSplitGlobalMetadata = !previousManifest .hasMetadataAttributesFiles ();
295
+
296
+ final DiffableUtils .MapDiff <String , Metadata .Custom , Map <String , Metadata .Custom >> customsDiff = remoteGlobalMetadataManager
297
+ .getCustomsDiff (clusterState , previousClusterState , firstUploadForSplitGlobalMetadata , isPublicationEnabled );
298
+ final DiffableUtils .MapDiff <String , ClusterState .Custom , Map <String , ClusterState .Custom >> clusterStateCustomsDiff =
299
+ remoteClusterStateAttributesManager .getUpdatedCustoms (clusterState , previousClusterState , isPublicationEnabled , false );
300
+ final Map <String , UploadedMetadataAttribute > allUploadedCustomMap = new HashMap <>(previousManifest .getCustomMetadataMap ());
301
+ final Map <String , UploadedMetadataAttribute > allUploadedClusterStateCustomsMap = new HashMap <>(
294
302
previousManifest .getClusterStateCustomMap ()
295
303
);
296
- final Map <String , ClusterState .Custom > clusterStateCustomsToUpload = remoteClusterStateAttributesManager .getUpdatedCustoms (
297
- clusterState ,
298
- previousClusterState
299
- );
300
- final Map <String , UploadedMetadataAttribute > allUploadedCustomMap = new HashMap <>(previousManifest .getCustomMetadataMap ());
301
- for (final String custom : clusterState .metadata ().customs ().keySet ()) {
302
- // remove all the customs which are present currently
303
- customsToBeDeletedFromRemote .remove (custom );
304
- }
305
304
final Map <String , IndexMetadata > indicesToBeDeletedFromRemote = new HashMap <>(previousClusterState .metadata ().indices ());
306
- for (final String custom : clusterState .customs ().keySet ()) {
307
- // remove all the custom which are present currently
308
- clusterStateCustomsToBeDeleted .remove (custom );
309
- }
310
305
int numIndicesUpdated = 0 ;
311
306
int numIndicesUnchanged = 0 ;
312
307
final Map <String , ClusterMetadataManifest .UploadedIndexMetadata > allUploadedIndexMetadata = previousManifest .getIndices ()
@@ -337,42 +332,44 @@ public RemoteClusterStateManifestInfo writeIncrementalMetadata(
337
332
indicesToBeDeletedFromRemote .remove (indexMetadata .getIndex ().getName ());
338
333
}
339
334
340
- DiffableUtils .MapDiff <String , IndexRoutingTable , Map <String , IndexRoutingTable >> routingTableDiff = remoteRoutingTableService
335
+ final DiffableUtils .MapDiff <String , IndexRoutingTable , Map <String , IndexRoutingTable >> routingTableDiff = remoteRoutingTableService
341
336
.getIndicesRoutingMapDiff (previousClusterState .getRoutingTable (), clusterState .getRoutingTable ());
342
- List <IndexRoutingTable > indicesRoutingToUpload = new ArrayList <>();
337
+ final List <IndexRoutingTable > indicesRoutingToUpload = new ArrayList <>();
343
338
routingTableDiff .getUpserts ().forEach ((k , v ) -> indicesRoutingToUpload .add (v ));
344
339
345
340
UploadedMetadataResults uploadedMetadataResults ;
346
341
// For migration case from codec V0 or V1 to V2, we have added null check on metadata attribute files,
347
342
// If file is empty and codec is 1 then write global metadata.
348
- boolean firstUploadForSplitGlobalMetadata = !previousManifest .hasMetadataAttributesFiles ();
349
343
boolean updateCoordinationMetadata = firstUploadForSplitGlobalMetadata
350
344
|| Metadata .isCoordinationMetadataEqual (previousClusterState .metadata (), clusterState .metadata ()) == false ;
351
345
;
352
346
boolean updateSettingsMetadata = firstUploadForSplitGlobalMetadata
353
347
|| Metadata .isSettingsMetadataEqual (previousClusterState .metadata (), clusterState .metadata ()) == false ;
354
- boolean updateTransientSettingsMetadata = firstUploadForSplitGlobalMetadata
355
- || Metadata .isTransientSettingsMetadataEqual (previousClusterState .metadata (), clusterState .metadata ()) == false ;
348
+ boolean updateTransientSettingsMetadata = Metadata .isTransientSettingsMetadataEqual (
349
+ previousClusterState .metadata (),
350
+ clusterState .metadata ()
351
+ ) == false ;
356
352
boolean updateTemplatesMetadata = firstUploadForSplitGlobalMetadata
357
353
|| Metadata .isTemplatesMetadataEqual (previousClusterState .metadata (), clusterState .metadata ()) == false ;
358
- // ToDo: check if these needs to be updated or not
359
- final boolean updateDiscoveryNodes = clusterState .getNodes ().delta (previousClusterState .getNodes ()).hasChanges ();
360
- final boolean updateClusterBlocks = !clusterState .blocks ().equals (previousClusterState .blocks ());
361
- final boolean updateHashesOfConsistentSettings = firstUploadForSplitGlobalMetadata
354
+
355
+ final boolean updateDiscoveryNodes = isPublicationEnabled
356
+ && clusterState .getNodes ().delta (previousClusterState .getNodes ()).hasChanges ();
357
+ final boolean updateClusterBlocks = isPublicationEnabled && !clusterState .blocks ().equals (previousClusterState .blocks ());
358
+ final boolean updateHashesOfConsistentSettings = isPublicationEnabled
362
359
|| Metadata .isHashesOfConsistentSettingsEqual (previousClusterState .metadata (), clusterState .metadata ()) == false ;
363
360
364
361
uploadedMetadataResults = writeMetadataInParallel (
365
362
clusterState ,
366
363
toUpload ,
367
364
prevIndexMetadataByName ,
368
- firstUploadForSplitGlobalMetadata ? clusterState . metadata (). customs () : customsToUpload ,
365
+ customsDiff . getUpserts () ,
369
366
updateCoordinationMetadata ,
370
367
updateSettingsMetadata ,
371
368
updateTemplatesMetadata ,
372
369
updateDiscoveryNodes ,
373
370
updateClusterBlocks ,
374
371
updateTransientSettingsMetadata ,
375
- clusterStateCustomsToUpload ,
372
+ clusterStateCustomsDiff . getUpserts () ,
376
373
updateHashesOfConsistentSettings ,
377
374
indicesRoutingToUpload
378
375
);
@@ -382,10 +379,11 @@ public RemoteClusterStateManifestInfo writeIncrementalMetadata(
382
379
uploadedIndexMetadata -> allUploadedIndexMetadata .put (uploadedIndexMetadata .getIndexName (), uploadedIndexMetadata )
383
380
);
384
381
allUploadedCustomMap .putAll (uploadedMetadataResults .uploadedCustomMetadataMap );
382
+ allUploadedClusterStateCustomsMap .putAll (uploadedMetadataResults .uploadedClusterStateCustomMetadataMap );
385
383
// remove the data for removed custom/indices
386
- customsToBeDeletedFromRemote . keySet ().forEach (allUploadedCustomMap ::remove );
384
+ customsDiff . getDeletes ().forEach (allUploadedCustomMap ::remove );
387
385
indicesToBeDeletedFromRemote .keySet ().forEach (allUploadedIndexMetadata ::remove );
388
- clusterStateCustomsToBeDeleted . keySet ().forEach (allUploadedCustomMap ::remove );
386
+ clusterStateCustomsDiff . getDeletes ().forEach (allUploadedClusterStateCustomsMap ::remove );
389
387
390
388
if (!updateCoordinationMetadata ) {
391
389
uploadedMetadataResults .uploadedCoordinationMetadata = previousManifest .getCoordinationMetadata ();
@@ -399,31 +397,24 @@ public RemoteClusterStateManifestInfo writeIncrementalMetadata(
399
397
if (!updateTemplatesMetadata ) {
400
398
uploadedMetadataResults .uploadedTemplatesMetadata = previousManifest .getTemplatesMetadata ();
401
399
}
402
- if (!updateDiscoveryNodes && ! firstUploadForSplitGlobalMetadata ) {
400
+ if (!updateDiscoveryNodes ) {
403
401
uploadedMetadataResults .uploadedDiscoveryNodes = previousManifest .getDiscoveryNodesMetadata ();
404
402
}
405
- if (!updateClusterBlocks && ! firstUploadForSplitGlobalMetadata ) {
403
+ if (!updateClusterBlocks ) {
406
404
uploadedMetadataResults .uploadedClusterBlocks = previousManifest .getClusterBlocksMetadata ();
407
405
}
408
- if (!updateHashesOfConsistentSettings && ! firstUploadForSplitGlobalMetadata ) {
406
+ if (!updateHashesOfConsistentSettings ) {
409
407
uploadedMetadataResults .uploadedHashesOfConsistentSettings = previousManifest .getHashesOfConsistentSettings ();
410
408
}
411
- if (!firstUploadForSplitGlobalMetadata && customsToUpload .isEmpty ()) {
412
- uploadedMetadataResults .uploadedCustomMetadataMap = previousManifest .getCustomMetadataMap ();
413
- }
414
- if (!firstUploadForSplitGlobalMetadata && clusterStateCustomsToUpload .isEmpty ()) {
415
- uploadedMetadataResults .uploadedClusterStateCustomMetadataMap = previousManifest .getClusterStateCustomMap ();
416
- }
417
409
uploadedMetadataResults .uploadedCustomMetadataMap = allUploadedCustomMap ;
410
+ uploadedMetadataResults .uploadedClusterStateCustomMetadataMap = allUploadedClusterStateCustomsMap ;
418
411
uploadedMetadataResults .uploadedIndexMetadata = new ArrayList <>(allUploadedIndexMetadata .values ());
419
412
420
- List <ClusterMetadataManifest .UploadedIndexMetadata > allUploadedIndicesRouting = new ArrayList <>();
421
- allUploadedIndicesRouting = remoteRoutingTableService .getAllUploadedIndicesRouting (
413
+ uploadedMetadataResults .uploadedIndicesRoutingMetadata = remoteRoutingTableService .getAllUploadedIndicesRouting (
422
414
previousManifest ,
423
415
uploadedMetadataResults .uploadedIndicesRoutingMetadata ,
424
416
routingTableDiff .getDeletes ()
425
417
);
426
- uploadedMetadataResults .uploadedIndicesRoutingMetadata = allUploadedIndicesRouting ;
427
418
428
419
final RemoteClusterStateManifestInfo manifestDetails = remoteManifestManager .uploadManifest (
429
420
clusterState ,
@@ -448,7 +439,7 @@ public RemoteClusterStateManifestInfo writeIncrementalMetadata(
448
439
updateCoordinationMetadata ,
449
440
updateSettingsMetadata ,
450
441
updateTemplatesMetadata ,
451
- customsToUpload .size (),
442
+ customsDiff . getUpserts () .size (),
452
443
indicesRoutingToUpload .size ()
453
444
);
454
445
if (durationMillis >= slowWriteLoggingThreshold .getMillis ()) {
@@ -464,7 +455,7 @@ public RemoteClusterStateManifestInfo writeIncrementalMetadata(
464
455
updateCoordinationMetadata ,
465
456
updateSettingsMetadata ,
466
457
updateTemplatesMetadata ,
467
- customsToUpload .size ()
458
+ customsDiff . getUpserts () .size ()
468
459
);
469
460
} else {
470
461
logger .info ("{}; {}" , clusterStateUploadTimeMessage , metadataUpdateMessage );
@@ -479,7 +470,7 @@ public RemoteClusterStateManifestInfo writeIncrementalMetadata(
479
470
updateCoordinationMetadata ,
480
471
updateSettingsMetadata ,
481
472
updateTemplatesMetadata ,
482
- customsToUpload .size ()
473
+ customsDiff . getUpserts () .size ()
483
474
);
484
475
}
485
476
return manifestDetails ;
0 commit comments