Skip to content

Commit

Permalink
cli: prevent panic on CTRL+C during a question (#19154)
Browse files Browse the repository at this point in the history
Fix a panic when a question receives an interrupt signal before the
signal handler is initialized.
  • Loading branch information
lgfa29 authored Nov 23, 2023
1 parent d2849b8 commit bdac8d9
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 11 deletions.
3 changes: 3 additions & 0 deletions .changelog/19154.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:bug
cli: Fixed a panic when the `nomad job restart` command received an interrupt signal while waiting for an answer
```
22 changes: 11 additions & 11 deletions command/job_restart.go
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,17 @@ func (c *JobRestartCommand) Run(args []string) int {
c.client.SetNamespace(*job.Namespace)
}

// Handle SIGINT to prevent accidental cancellations of the long-lived
// restart loop. activeCh is blocked while a signal is being handled to
// prevent new work from starting while the user is deciding if they want
// to cancel the command or not.
activeCh := make(chan any)
c.sigsCh = make(chan os.Signal, 1)
signal.Notify(c.sigsCh, os.Interrupt)
defer signal.Stop(c.sigsCh)

go c.handleSignal(c.sigsCh, activeCh)

// Confirm that we should restart a multi-region job in a single region.
if job.IsMultiregion() && !c.autoYes && !c.shouldRestartMultiregion() {
c.Ui.Output("\nJob restart canceled.")
Expand Down Expand Up @@ -329,17 +340,6 @@ func (c *JobRestartCommand) Run(args []string) int {
english.Plural(len(restartAllocs), "allocation", "allocations"),
)))

// Handle SIGINT to prevent accidental cancellations of the long-lived
// restart loop. activeCh is blocked while a signal is being handled to
// prevent new work from starting while the user is deciding if they want
// to cancel the command or not.
activeCh := make(chan any)
c.sigsCh = make(chan os.Signal, 1)
signal.Notify(c.sigsCh, os.Interrupt)
defer signal.Stop(c.sigsCh)

go c.handleSignal(c.sigsCh, activeCh)

// restartErr accumulates the errors that happen in each batch.
var restartErr *multierror.Error

Expand Down

0 comments on commit bdac8d9

Please sign in to comment.