From 20f2d30ab8f3063b0f867561e0b087a9c78febc4 Mon Sep 17 00:00:00 2001 From: fupan Date: Mon, 10 Dec 2018 18:17:36 +0800 Subject: [PATCH] virtcontainers: share the agent's client between factory's VM and sandbox When agent is configured as longLive, the VM's agent created by factory will not close it's client once it connected, thus the sandbox's agent cannot re-connect successfully. Sharing the agent's client between VM's agent and sandbox can fix this issue. Fixes: #995 Signed-off-by: fupan --- virtcontainers/agent.go | 3 +++ virtcontainers/hyperstart_agent.go | 11 +++++++++++ virtcontainers/kata_agent.go | 11 +++++++++++ virtcontainers/noop_agent.go | 5 +++++ virtcontainers/vm.go | 4 ++++ 5 files changed, 34 insertions(+) diff --git a/virtcontainers/agent.go b/virtcontainers/agent.go index d95cdbf635..d1044bd76c 100644 --- a/virtcontainers/agent.go +++ b/virtcontainers/agent.go @@ -152,6 +152,9 @@ type agent interface { // get agent url getAgentURL() (string, error) + // update the agent using some elements from another agent + reuseAgent(agent agent) error + // createSandbox will tell the agent to perform necessary setup for a Sandbox. createSandbox(sandbox *Sandbox) error diff --git a/virtcontainers/hyperstart_agent.go b/virtcontainers/hyperstart_agent.go index 34b381b135..b338369c24 100644 --- a/virtcontainers/hyperstart_agent.go +++ b/virtcontainers/hyperstart_agent.go @@ -964,6 +964,17 @@ func (h *hyper) getAgentURL() (string, error) { return "", nil } +func (h *hyper) reuseAgent(agent agent) error { + a, ok := agent.(*hyper) + if !ok { + return fmt.Errorf("Bug: get a wrong type of agent") + } + + h.client = a.client + + return nil +} + func (h *hyper) setProxy(sandbox *Sandbox, proxy proxy, pid int, url string) error { if url == "" { return fmt.Errorf("invalid empty proxy url") diff --git a/virtcontainers/kata_agent.go b/virtcontainers/kata_agent.go index e96ec088a2..335a0a7812 100644 --- a/virtcontainers/kata_agent.go +++ b/virtcontainers/kata_agent.go @@ -537,6 +537,17 @@ func (k *kataAgent) getAgentURL() (string, error) { return k.agentURL() } +func (k *kataAgent) reuseAgent(agent agent) error { + a, ok := agent.(*kataAgent) + if !ok { + return fmt.Errorf("Bug: get a wrong type of agent") + } + + k.installReqFunc(a.client) + k.client = a.client + return nil +} + func (k *kataAgent) setProxy(sandbox *Sandbox, proxy proxy, pid int, url string) error { if url == "" { var err error diff --git a/virtcontainers/noop_agent.go b/virtcontainers/noop_agent.go index f9e447f2d3..86d5abe5a9 100644 --- a/virtcontainers/noop_agent.go +++ b/virtcontainers/noop_agent.go @@ -184,6 +184,11 @@ func (n *noopAgent) reseedRNG(data []byte) error { return nil } +// reuseAgent is the Noop agent reuser. It does nothing. +func (n *noopAgent) reuseAgent(agent agent) error { + return nil +} + // getAgentURL is the Noop agent url getter. It returns nothing. func (n *noopAgent) getAgentURL() (string, error) { return "", nil diff --git a/virtcontainers/vm.go b/virtcontainers/vm.go index 534a78c5af..ac22d92835 100644 --- a/virtcontainers/vm.go +++ b/virtcontainers/vm.go @@ -319,6 +319,10 @@ func (v *VM) assignSandbox(s *Sandbox) error { return err } + if err := s.agent.reuseAgent(v.agent); err != nil { + return err + } + // First make sure the symlinks do not exist os.RemoveAll(sbSharePath) os.RemoveAll(sbSockDir)