From 232c0ea37e443098103233112631340ac7c4202b Mon Sep 17 00:00:00 2001 From: Nathan LeClaire Date: Fri, 18 Dec 2015 18:54:09 -0800 Subject: [PATCH] Fix truncated plugin binary logs Signed-off-by: Nathan LeClaire --- .../drivers/plugin/localbinary/plugin.go | 29 ++++++++++--------- libmachine/drivers/plugin/register_driver.go | 3 ++ libmachine/drivers/rpc/client_driver.go | 12 ++++---- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/libmachine/drivers/plugin/localbinary/plugin.go b/libmachine/drivers/plugin/localbinary/plugin.go index 4c0685eec9..03f2a9251d 100644 --- a/libmachine/drivers/plugin/localbinary/plugin.go +++ b/libmachine/drivers/plugin/localbinary/plugin.go @@ -79,6 +79,7 @@ type Plugin struct { type Executor struct { pluginStdout, pluginStderr io.ReadCloser DriverName string + cmd *exec.Cmd binaryPath string } @@ -124,14 +125,14 @@ func (lbe *Executor) Start() (*bufio.Scanner, *bufio.Scanner, error) { log.Debugf("Launching plugin server for driver %s", lbe.DriverName) - cmd := exec.Command(lbe.binaryPath) + lbe.cmd = exec.Command(lbe.binaryPath) - lbe.pluginStdout, err = cmd.StdoutPipe() + lbe.pluginStdout, err = lbe.cmd.StdoutPipe() if err != nil { return nil, nil, fmt.Errorf("Error getting cmd stdout pipe: %s", err) } - lbe.pluginStderr, err = cmd.StderrPipe() + lbe.pluginStderr, err = lbe.cmd.StderrPipe() if err != nil { return nil, nil, fmt.Errorf("Error getting cmd stderr pipe: %s", err) } @@ -142,7 +143,7 @@ func (lbe *Executor) Start() (*bufio.Scanner, *bufio.Scanner, error) { os.Setenv(PluginEnvKey, PluginEnvVal) os.Setenv(PluginEnvDriverName, lbe.DriverName) - if err := cmd.Start(); err != nil { + if err := lbe.cmd.Start(); err != nil { return nil, nil, fmt.Errorf("Error starting plugin binary: %s", err) } @@ -150,34 +151,34 @@ func (lbe *Executor) Start() (*bufio.Scanner, *bufio.Scanner, error) { } func (lbe *Executor) Close() error { + if err := lbe.cmd.Wait(); err != nil { + return fmt.Errorf("Error waiting for binary close: %s", err) + } + if err := lbe.pluginStdout.Close(); err != nil { - return err + return fmt.Errorf("Error closing plugin stdout: %s", err) } if err := lbe.pluginStderr.Close(); err != nil { - return err + return fmt.Errorf("Error closing plugin stderr: %s", err) } return nil } func stream(scanner *bufio.Scanner, streamOutCh chan<- string, stopCh <-chan bool) { - lines := make(chan string) - go func() { - for scanner.Scan() { - lines <- scanner.Text() - } - }() for { select { case <-stopCh: close(streamOutCh) return - case line := <-lines: - streamOutCh <- strings.Trim(line, "\n") + default: + scanner.Scan() + line := scanner.Text() if err := scanner.Err(); err != nil { log.Warnf("Scanning stream: %s", err) } + streamOutCh <- strings.Trim(line, "\n") } } } diff --git a/libmachine/drivers/plugin/register_driver.go b/libmachine/drivers/plugin/register_driver.go index 23ebe3ae96..27e0dbc33d 100644 --- a/libmachine/drivers/plugin/register_driver.go +++ b/libmachine/drivers/plugin/register_driver.go @@ -30,6 +30,7 @@ Please use this plugin through the main 'docker-machine' binary. } log.SetDebug(true) + os.Setenv("MACHINE_DEBUG", "1") rpcd := rpcdriver.NewRPCServerDriver(d) rpc.RegisterName(rpcdriver.RPCServiceNameV0, rpcd) @@ -50,10 +51,12 @@ Please use this plugin through the main 'docker-machine' binary. for { select { case <-rpcd.CloseCh: + log.Debug("Closing plugin on server side") os.Exit(0) case <-rpcd.HeartbeatCh: continue case <-time.After(heartbeatTimeout): + // TODO: Add heartbeat retry logic os.Exit(1) } } diff --git a/libmachine/drivers/rpc/client_driver.go b/libmachine/drivers/rpc/client_driver.go index d04c91ab34..1c06876f7e 100644 --- a/libmachine/drivers/rpc/client_driver.go +++ b/libmachine/drivers/rpc/client_driver.go @@ -189,12 +189,6 @@ func (c *RPCClientDriver) close() error { c.heartbeatDoneCh <- true close(c.heartbeatDoneCh) - log.Debug("Making call to close connection to plugin binary") - - if err := c.plugin.Close(); err != nil { - return err - } - log.Debug("Making call to close driver server") if err := c.Client.Call(CloseMethod, struct{}{}, nil); err != nil { @@ -203,6 +197,12 @@ func (c *RPCClientDriver) close() error { log.Debug("Successfully made call to close driver server") + log.Debug("Making call to close connection to plugin binary") + + if err := c.plugin.Close(); err != nil { + return err + } + return nil }