Skip to content

Commit 678c2fd

Browse files
committed
UX: don't reverse progress-bars when rolling back
Commit https://github.com/moby/moby//commit/330a0035334871d92207b583c1c36d52a244753f introduced "synchronous" service update and rollback, using progress bars to show current status for each task. As part of that change, progress bars were "reversed" when doing a rollback, to indicate that status was rolled back to a previous state. Reversing direction is somewhat confusing, as progress bars now return to their "initial" state to indicate it was "completed"; for an "automatic" rollback, this may be somewhat clear (progress bars "move to the right", then "roll back" if the update failed), but when doing a manual rollback, it feels counter-intuitive (rolling back is the _expected_ outcome). This patch removes the code to reverse the direction of progress-bars, and makes progress-bars always move from left ("start") to right ("finished"). Before this patch ---------------------------------------- 1. create a service with automatic rollback on failure $ docker service create --update-failure-action=rollback --name foo --tty --replicas=5 nginx:alpine 9xi1w3mv5sqtyexsuh78qg0cb overall progress: 5 out of 5 tasks 1/5: running [==================================================>] 2/5: running [==================================================>] 3/5: running [==================================================>] 4/5: running [==================================================>] 5/5: running [==================================================>] verify: Waiting 2 seconds to verify that tasks are stable... 2. update the service, making it fail after 3 seconds $ docker service update --entrypoint="/bin/sh -c 'sleep 3; exit 1'" foo overall progress: rolling back update: 2 out of 5 tasks 1/5: running [==================================================>] 2/5: running [==================================================>] 3/5: starting [============================================> ] 4/5: running [==================================================>] 5/5: running [==================================================>] 3. Once the service starts failing, automatic rollback is started; progress-bars now move in the reverse direction; overall progress: rolling back update: 3 out of 5 tasks 1/5: ready [===========> ] 2/5: ready [===========> ] 3/5: running [> ] 4/5: running [> ] 5/5: running [> ] 4. When the rollback is completed, the progressbars are at the "start" to indicate they completed; overall progress: rolling back update: 5 out of 5 tasks 1/5: running [> ] 2/5: running [> ] 3/5: running [> ] 4/5: running [> ] 5/5: running [> ] rollback: update rolled back due to failure or early termination of task bndiu8a998agr8s6sjlg9tnrw verify: Service converged After this patch ---------------------------------------- Progress bars always go from left to right; also in a rollback situation; After updating to the "faulty" entrypoint, task are deployed: $ docker service update --entrypoint="/bin/sh -c 'sleep 3; exit 1'" foo foo overall progress: 1 out of 5 tasks 1/5: 2/5: running [==================================================>] 3/5: ready [======================================> ] 4/5: 5/5: Once tasks start failing, rollback is started, and presented the same as a regular update; progress bars go from left to right; overall progress: rolling back update: 3 out of 5 tasks 1/5: ready [======================================> ] 2/5: starting [============================================> ] 3/5: running [==================================================>] 4/5: running [==================================================>] 5/5: running [==================================================>] rollback: update rolled back due to failure or early termination of task c11dxd7ud3d5pq8g45qkb4rjx Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
1 parent 12e8782 commit 678c2fd

1 file changed

Lines changed: 6 additions & 13 deletions

File tree

cli/command/service/progress/progress.go

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,6 @@ func terminalState(state swarm.TaskState) bool {
6767
return numberedStates[state] > numberedStates[swarm.TaskStateRunning]
6868
}
6969

70-
func stateToProgress(state swarm.TaskState, rollback bool) int64 {
71-
if !rollback {
72-
return numberedStates[state]
73-
}
74-
return numberedStates[swarm.TaskStateRunning] - numberedStates[state]
75-
}
76-
7770
// ServiceProgress outputs progress information for convergence of a service.
7871
// nolint: gocyclo
7972
func ServiceProgress(ctx context.Context, client client.APIClient, serviceID string, progressWriter io.WriteCloser) error {
@@ -343,7 +336,7 @@ func (u *replicatedProgressUpdater) update(service swarm.Service, tasks []swarm.
343336
running++
344337
}
345338

346-
u.writeTaskProgress(task, mappedSlot, replicas, rollback)
339+
u.writeTaskProgress(task, mappedSlot, replicas)
347340
}
348341

349342
if !u.done {
@@ -389,7 +382,7 @@ func (u *replicatedProgressUpdater) tasksBySlot(tasks []swarm.Task, activeNodes
389382
return tasksBySlot
390383
}
391384

392-
func (u *replicatedProgressUpdater) writeTaskProgress(task swarm.Task, mappedSlot int, replicas uint64, rollback bool) {
385+
func (u *replicatedProgressUpdater) writeTaskProgress(task swarm.Task, mappedSlot int, replicas uint64) {
393386
if u.done || replicas > maxProgressBars || uint64(mappedSlot) > replicas {
394387
return
395388
}
@@ -406,7 +399,7 @@ func (u *replicatedProgressUpdater) writeTaskProgress(task swarm.Task, mappedSlo
406399
u.progressOut.WriteProgress(progress.Progress{
407400
ID: fmt.Sprintf("%d/%d", mappedSlot, replicas),
408401
Action: fmt.Sprintf("%-[1]*s", longestState, task.Status.State),
409-
Current: stateToProgress(task.Status.State, rollback),
402+
Current: numberedStates[task.Status.State],
410403
Total: maxProgress,
411404
HideCounts: true,
412405
})
@@ -463,7 +456,7 @@ func (u *globalProgressUpdater) update(service swarm.Service, tasks []swarm.Task
463456
running++
464457
}
465458

466-
u.writeTaskProgress(task, nodeCount, rollback)
459+
u.writeTaskProgress(task, nodeCount)
467460
}
468461
}
469462

@@ -507,7 +500,7 @@ func (u *globalProgressUpdater) tasksByNode(tasks []swarm.Task) map[string]swarm
507500
return tasksByNode
508501
}
509502

510-
func (u *globalProgressUpdater) writeTaskProgress(task swarm.Task, nodeCount int, rollback bool) {
503+
func (u *globalProgressUpdater) writeTaskProgress(task swarm.Task, nodeCount int) {
511504
if u.done || nodeCount > maxProgressBars {
512505
return
513506
}
@@ -524,7 +517,7 @@ func (u *globalProgressUpdater) writeTaskProgress(task swarm.Task, nodeCount int
524517
u.progressOut.WriteProgress(progress.Progress{
525518
ID: stringid.TruncateID(task.NodeID),
526519
Action: fmt.Sprintf("%-[1]*s", longestState, task.Status.State),
527-
Current: stateToProgress(task.Status.State, rollback),
520+
Current: numberedStates[task.Status.State],
528521
Total: maxProgress,
529522
HideCounts: true,
530523
})

0 commit comments

Comments
 (0)