39
39
import org .opensearch .cluster .ClusterStateTaskExecutor ;
40
40
import org .opensearch .cluster .NotClusterManagerException ;
41
41
import org .opensearch .cluster .block .ClusterBlocks ;
42
+ import org .opensearch .cluster .decommission .DecommissionAttribute ;
43
+ import org .opensearch .cluster .decommission .DecommissionAttributeMetadata ;
44
+ import org .opensearch .cluster .decommission .DecommissionStatus ;
45
+ import org .opensearch .cluster .decommission .NodeDecommissionedException ;
42
46
import org .opensearch .cluster .metadata .IndexMetadata ;
43
47
import org .opensearch .cluster .metadata .Metadata ;
44
48
import org .opensearch .cluster .node .DiscoveryNode ;
@@ -358,6 +362,7 @@ public boolean runOnlyOnClusterManager() {
358
362
359
363
/**
360
364
* a task indicates that the current node should become master
365
+ *
361
366
* @deprecated As of 2.0, because supporting inclusive language, replaced by {@link #newBecomeClusterManagerTask()}
362
367
*/
363
368
@ Deprecated
@@ -384,8 +389,9 @@ public static Task newFinishElectionTask() {
384
389
* Ensures that all indices are compatible with the given node version. This will ensure that all indices in the given metadata
385
390
* will not be created with a newer version of opensearch as well as that all indices are newer or equal to the minimum index
386
391
* compatibility version.
387
- * @see Version#minimumIndexCompatibilityVersion()
392
+ *
388
393
* @throws IllegalStateException if any index is incompatible with the given version
394
+ * @see Version#minimumIndexCompatibilityVersion()
389
395
*/
390
396
public static void ensureIndexCompatibility (final Version nodeVersion , Metadata metadata ) {
391
397
Version supportedIndexVersion = nodeVersion .minimumIndexCompatibilityVersion ();
@@ -415,14 +421,18 @@ public static void ensureIndexCompatibility(final Version nodeVersion, Metadata
415
421
}
416
422
}
417
423
418
- /** ensures that the joining node has a version that's compatible with all current nodes*/
424
+ /**
425
+ * ensures that the joining node has a version that's compatible with all current nodes
426
+ */
419
427
public static void ensureNodesCompatibility (final Version joiningNodeVersion , DiscoveryNodes currentNodes ) {
420
428
final Version minNodeVersion = currentNodes .getMinNodeVersion ();
421
429
final Version maxNodeVersion = currentNodes .getMaxNodeVersion ();
422
430
ensureNodesCompatibility (joiningNodeVersion , minNodeVersion , maxNodeVersion );
423
431
}
424
432
425
- /** ensures that the joining node has a version that's compatible with a given version range */
433
+ /**
434
+ * ensures that the joining node has a version that's compatible with a given version range
435
+ */
426
436
public static void ensureNodesCompatibility (Version joiningNodeVersion , Version minClusterNodeVersion , Version maxClusterNodeVersion ) {
427
437
assert minClusterNodeVersion .onOrBefore (maxClusterNodeVersion ) : minClusterNodeVersion + " > " + maxClusterNodeVersion ;
428
438
if (joiningNodeVersion .isCompatible (maxClusterNodeVersion ) == false ) {
@@ -466,13 +476,34 @@ public static void ensureMajorVersionBarrier(Version joiningNodeVersion, Version
466
476
}
467
477
}
468
478
479
+ public static void ensureNodeCommissioned (DiscoveryNode node , Metadata metadata ) {
480
+ DecommissionAttributeMetadata decommissionAttributeMetadata = metadata .decommissionAttributeMetadata ();
481
+ if (decommissionAttributeMetadata != null ) {
482
+ DecommissionAttribute decommissionAttribute = decommissionAttributeMetadata .decommissionAttribute ();
483
+ DecommissionStatus status = decommissionAttributeMetadata .status ();
484
+ if (decommissionAttribute != null && status != null ) {
485
+ // We will let the node join the cluster if the current status is in FAILED state
486
+ if (node .getAttributes ().get (decommissionAttribute .attributeName ()).equals (decommissionAttribute .attributeValue ())
487
+ && status .equals (DecommissionStatus .FAILED ) == false ) {
488
+ throw new NodeDecommissionedException (
489
+ "node [{}] has decommissioned attribute [{}] with current status of decommissioning [{}]" ,
490
+ node .toString (),
491
+ decommissionAttribute .toString (),
492
+ status .status ()
493
+ );
494
+ }
495
+ }
496
+ }
497
+ }
498
+
469
499
public static Collection <BiConsumer <DiscoveryNode , ClusterState >> addBuiltInJoinValidators (
470
500
Collection <BiConsumer <DiscoveryNode , ClusterState >> onJoinValidators
471
501
) {
472
502
final Collection <BiConsumer <DiscoveryNode , ClusterState >> validators = new ArrayList <>();
473
503
validators .add ((node , state ) -> {
474
504
ensureNodesCompatibility (node .getVersion (), state .getNodes ());
475
505
ensureIndexCompatibility (node .getVersion (), state .getMetadata ());
506
+ ensureNodeCommissioned (node , state .getMetadata ());
476
507
});
477
508
validators .addAll (onJoinValidators );
478
509
return Collections .unmodifiableCollection (validators );
0 commit comments