-
Notifications
You must be signed in to change notification settings - Fork 447
[CELEBORN-2336] Support decommission shutdown for worker scale-down scenarios #3698
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 8 commits
9bc9eb1
ad76e88
c8227df
81d825b
df73277
4cd9d6b
d5ff48c
abc0013
a5ac067
c604d25
de748dd
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -39,8 +39,13 @@ private[celeborn] class WorkerStatusManager(conf: CelebornConf) extends Logging | |
| private var worker: Worker = _ | ||
| private var shutdown: AtomicBoolean = _ | ||
| private var storageManager: StorageManager = _ | ||
| private val decommissionShutdown = conf.workerDecommissionShutdown | ||
| private val gracefulShutdown = conf.workerGracefulShutdown | ||
| if (gracefulShutdown) { | ||
| if (decommissionShutdown) { | ||
| exitEventType = WorkerEventType.Decommission | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
| logInfo("Decommission shutdown enabled, worker will decommission on SIGTERM" + | ||
| " (overrides graceful shutdown)") | ||
| } else if (gracefulShutdown) { | ||
| exitEventType = WorkerEventType.Graceful | ||
| } | ||
|
chenghuichen marked this conversation as resolved.
|
||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -57,24 +57,52 @@ class WorkerStatusManagerSuite extends AnyFunSuite { | |
| statusManager.init(worker) | ||
|
|
||
| statusManager.doTransition(WorkerEventType.DecommissionThenIdle) | ||
| Assert.assertEquals(statusManager.getWorkerState(), PbWorkerStatus.State.InDecommissionThenIdle) | ||
| Assert.assertEquals(PbWorkerStatus.State.InDecommissionThenIdle, statusManager.getWorkerState()) | ||
| Assert.assertEquals( | ||
| worker.workerInfo.getWorkerStatus().getStateValue, | ||
| PbWorkerStatus.State.InDecommissionThenIdle.getNumber) | ||
| PbWorkerStatus.State.InDecommissionThenIdle.getNumber, | ||
| worker.workerInfo.getWorkerStatus().getStateValue) | ||
|
|
||
| // Rerun state Transition | ||
| statusManager.doTransition(WorkerEventType.DecommissionThenIdle) | ||
| Assert.assertEquals(statusManager.getWorkerState(), PbWorkerStatus.State.InDecommissionThenIdle) | ||
| Assert.assertEquals(PbWorkerStatus.State.InDecommissionThenIdle, statusManager.getWorkerState()) | ||
|
|
||
| // Reset shuffleKeys | ||
| shuffleKeys.clear() | ||
| statusManager.doTransition(WorkerEventType.DecommissionThenIdle) | ||
| Assert.assertEquals(statusManager.getWorkerState(), PbWorkerStatus.State.Idle) | ||
| Assert.assertEquals(PbWorkerStatus.State.Idle, statusManager.getWorkerState()) | ||
|
|
||
| statusManager.doTransition(WorkerEventType.Recommission) | ||
| Assert.assertEquals(statusManager.getWorkerState(), PbWorkerStatus.State.Normal) | ||
| Assert.assertEquals(PbWorkerStatus.State.Normal, statusManager.getWorkerState()) | ||
|
|
||
| statusManager.doTransition(WorkerEventType.Recommission) | ||
| Assert.assertEquals(statusManager.getWorkerState(), PbWorkerStatus.State.Normal) | ||
| Assert.assertEquals(PbWorkerStatus.State.Normal, statusManager.getWorkerState()) | ||
| } | ||
|
|
||
| test("Test exitEventType initialization based on config") { | ||
| // Default: neither graceful nor decommission → Immediately | ||
| val conf1 = new CelebornConf() | ||
|
chenghuichen marked this conversation as resolved.
|
||
| val mgr1 = new WorkerStatusManager(conf1) | ||
| Assert.assertEquals(WorkerEventType.Immediately, mgr1.exitEventType) | ||
|
|
||
| // Graceful shutdown only → Graceful | ||
| val conf2 = new CelebornConf() | ||
| conf2.set("celeborn.worker.graceful.shutdown.enabled", "true") | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Non-defensive test setup. |
||
| val mgr2 = new WorkerStatusManager(conf2) | ||
| Assert.assertEquals(WorkerEventType.Graceful, mgr2.exitEventType) | ||
|
|
||
|
chenghuichen marked this conversation as resolved.
|
||
| // Decommission shutdown only → Decommission | ||
| val conf3 = new CelebornConf() | ||
| conf3.set("celeborn.worker.decommission.shutdown.enabled", "true") | ||
| val mgr3 = new WorkerStatusManager(conf3) | ||
| Assert.assertEquals(WorkerEventType.Decommission, mgr3.exitEventType) | ||
|
|
||
| // Both enabled → Decommission overrides graceful | ||
| val conf4 = new CelebornConf() | ||
| conf4.set("celeborn.worker.graceful.shutdown.enabled", "true") | ||
| conf4.set("celeborn.worker.decommission.shutdown.enabled", "true") | ||
| val mgr4 = new WorkerStatusManager(conf4) | ||
| Assert.assertEquals(WorkerEventType.Decommission, mgr4.exitEventType) | ||
|
chenghuichen marked this conversation as resolved.
|
||
| Assert.assertTrue(conf4.workerGracefulShutdown) | ||
| Assert.assertTrue(conf4.workerDecommissionShutdown) | ||
| } | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.