From 4e08d8ef03426a63ea70dd83332f9c63b4145149 Mon Sep 17 00:00:00 2001 From: Brian Goff Date: Fri, 9 Dec 2016 12:53:10 -0500 Subject: [PATCH] Fix issues with plugin and `--live-restore` Fixes an issue when starting the daemon with live-restore where previously it was not set, plugins are not running. Fixes an issue when starting the daemon with live-restore, the plugin client (for interacting with the plugins HTTP interface) is not set, causing a panic when the plugin is called. Signed-off-by: Brian Goff (cherry picked from commit cb6633175c0de0a7ae155c4d378cd2379681554b) Signed-off-by: Victor Vieux --- .../docker_cli_daemon_plugins_test.go | 7 ++++- plugin/manager_linux.go | 26 +++++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/integration-cli/docker_cli_daemon_plugins_test.go b/integration-cli/docker_cli_daemon_plugins_test.go index 6061a98c8a..961a6fb078 100644 --- a/integration-cli/docker_cli_daemon_plugins_test.go +++ b/integration-cli/docker_cli_daemon_plugins_test.go @@ -145,7 +145,7 @@ func (s *DockerDaemonSuite) TestDaemonShutdownLiveRestoreWithPlugins(c *check.C) // TestDaemonShutdownWithPlugins shuts down running plugins. func (s *DockerDaemonSuite) TestDaemonShutdownWithPlugins(c *check.C) { - testRequires(c, IsAmd64, Network) + testRequires(c, IsAmd64, Network, SameHostDaemon) if err := s.d.Start(); err != nil { c.Fatalf("Could not start daemon: %v", err) @@ -180,6 +180,11 @@ func (s *DockerDaemonSuite) TestDaemonShutdownWithPlugins(c *check.C) { if out, ec, err := runCommandWithOutput(cmd); ec != 1 { c.Fatalf("Expected exit code '1', got %d err: %v output: %s ", ec, err, out) } + + s.d.Start("--live-restore") + cmd = exec.Command("pgrep", "-f", pluginProcessName) + out, _, err := runCommandWithOutput(cmd) + c.Assert(err, checker.IsNil, check.Commentf(out)) } // TestVolumePlugin tests volume creation using a plugin. diff --git a/plugin/manager_linux.go b/plugin/manager_linux.go index 20ea0c3bcc..340ea5a7c1 100644 --- a/plugin/manager_linux.go +++ b/plugin/manager_linux.go @@ -49,6 +49,10 @@ func (pm *Manager) enable(p *v2.Plugin, c *controller, force bool) error { return err } + return pm.pluginPostStart(p, c) +} + +func (pm *Manager) pluginPostStart(p *v2.Plugin, c *controller) error { client, err := plugins.NewClientWithTimeout("unix://"+filepath.Join(p.GetRuntimeSourcePath(), p.GetSocket()), nil, c.timeoutInSecs) if err != nil { c.restart = false @@ -59,12 +63,30 @@ func (pm *Manager) enable(p *v2.Plugin, c *controller, force bool) error { p.SetPClient(client) pm.pluginStore.SetState(p, true) pm.pluginStore.CallHandler(p) - return nil } func (pm *Manager) restore(p *v2.Plugin) error { - return pm.containerdClient.Restore(p.GetID(), attachToLog(p.GetID())) + if err := pm.containerdClient.Restore(p.GetID(), attachToLog(p.GetID())); err != nil { + return err + } + + if pm.liveRestore { + c := &controller{} + if pids, _ := pm.containerdClient.GetPidsForContainer(p.GetID()); len(pids) == 0 { + // plugin is not running, so follow normal startup procedure + return pm.enable(p, c, true) + } + + c.exitChan = make(chan bool) + c.restart = true + pm.mu.Lock() + pm.cMap[p] = c + pm.mu.Unlock() + return pm.pluginPostStart(p, c) + } + + return nil } func shutdownPlugin(p *v2.Plugin, c *controller, containerdClient libcontainerd.Client) {