command/lock: Check for shutdown during lock acquisition. Fixes #800

This commit is contained in:
Armon Dadgar 2015-07-22 16:07:44 -07:00
parent 2b93e5f52c
commit 6f42f6640c
1 changed files with 11 additions and 2 deletions

View File

@ -47,7 +47,7 @@ Usage: consul lock [options] prefix child...
disrupted the child process will be sent a SIGTERM signal and given disrupted the child process will be sent a SIGTERM signal and given
time to gracefully exit. After the grace period expires the process time to gracefully exit. After the grace period expires the process
will be hard terminated. will be hard terminated.
For Consul agents on Windows, the child process is always hard For Consul agents on Windows, the child process is always hard
terminated with a SIGKILL, since Windows has no POSIX compatible terminated with a SIGKILL, since Windows has no POSIX compatible
notion for SIGTERM. notion for SIGTERM.
@ -71,6 +71,7 @@ Options:
} }
func (c *LockCommand) Run(args []string) int { func (c *LockCommand) Run(args []string) int {
var childDone chan struct{}
var name, token string var name, token string
var limit int var limit int
cmdFlags := flag.NewFlagSet("watch", flag.ContinueOnError) cmdFlags := flag.NewFlagSet("watch", flag.ContinueOnError)
@ -147,8 +148,16 @@ func (c *LockCommand) Run(args []string) int {
return 1 return 1
} }
// Check if we were shutdown but managed to still acquire the lock
select {
case <-c.ShutdownCh:
c.Ui.Error("Shutdown triggered during lock acquisition")
goto RELEASE
default:
}
// Start the child process // Start the child process
childDone := make(chan struct{}) childDone = make(chan struct{})
go func() { go func() {
if err := c.startChild(script, childDone); err != nil { if err := c.startChild(script, childDone); err != nil {
c.Ui.Error(fmt.Sprintf("%s", err)) c.Ui.Error(fmt.Sprintf("%s", err))