Merge pull request #5195 from fuweid/fix-5173
runtime/v2/runc: fix leaking socket path
This commit is contained in:
		| @@ -153,6 +153,11 @@ func (s *service) StartShim(ctx context.Context, id, containerdBinary, container | |||||||
| 			_ = shim.RemoveSocket(address) | 			_ = shim.RemoveSocket(address) | ||||||
| 		} | 		} | ||||||
| 	}() | 	}() | ||||||
|  | 	// make sure that reexec shim-v2 binary use the value if need | ||||||
|  | 	if err := shim.WriteAddress("address", address); err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	f, err := socket.File() | 	f, err := socket.File() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", err | 		return "", err | ||||||
| @@ -174,9 +179,6 @@ func (s *service) StartShim(ctx context.Context, id, containerdBinary, container | |||||||
| 	if err := shim.WritePidFile("shim.pid", cmd.Process.Pid); err != nil { | 	if err := shim.WritePidFile("shim.pid", cmd.Process.Pid); err != nil { | ||||||
| 		return "", err | 		return "", err | ||||||
| 	} | 	} | ||||||
| 	if err := shim.WriteAddress("address", address); err != nil { |  | ||||||
| 		return "", err |  | ||||||
| 	} |  | ||||||
| 	if data, err := ioutil.ReadAll(os.Stdin); err == nil { | 	if data, err := ioutil.ReadAll(os.Stdin); err == nil { | ||||||
| 		if len(data) > 0 { | 		if len(data) > 0 { | ||||||
| 			var any ptypes.Any | 			var any ptypes.Any | ||||||
| @@ -209,6 +211,12 @@ func (s *service) StartShim(ctx context.Context, id, containerdBinary, container | |||||||
| } | } | ||||||
|  |  | ||||||
| func (s *service) Cleanup(ctx context.Context) (*taskAPI.DeleteResponse, error) { | func (s *service) Cleanup(ctx context.Context) (*taskAPI.DeleteResponse, error) { | ||||||
|  | 	if address, err := shim.ReadAddress("address"); err == nil { | ||||||
|  | 		if err = shim.RemoveSocket(address); err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	path, err := os.Getwd() | 	path, err := os.Getwd() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| @@ -562,11 +570,10 @@ func (s *service) Connect(ctx context.Context, r *taskAPI.ConnectRequest) (*task | |||||||
| } | } | ||||||
|  |  | ||||||
| func (s *service) Shutdown(ctx context.Context, r *taskAPI.ShutdownRequest) (*ptypes.Empty, error) { | func (s *service) Shutdown(ctx context.Context, r *taskAPI.ShutdownRequest) (*ptypes.Empty, error) { | ||||||
|  | 	// please make sure that temporary resource has been cleanup | ||||||
|  | 	// before shutdown service. | ||||||
| 	s.cancel() | 	s.cancel() | ||||||
| 	close(s.events) | 	close(s.events) | ||||||
| 	if address, err := shim.ReadAddress("address"); err == nil { |  | ||||||
| 		_ = shim.RemoveSocket(address) |  | ||||||
| 	} |  | ||||||
| 	return empty, nil | 	return empty, nil | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -220,6 +220,12 @@ func (s *service) StartShim(ctx context.Context, id, containerdBinary, container | |||||||
| 			_ = shim.RemoveSocket(address) | 			_ = shim.RemoveSocket(address) | ||||||
| 		} | 		} | ||||||
| 	}() | 	}() | ||||||
|  |  | ||||||
|  | 	// make sure that reexec shim-v2 binary use the value if need | ||||||
|  | 	if err := shim.WriteAddress("address", address); err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	f, err := socket.File() | 	f, err := socket.File() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", err | 		return "", err | ||||||
| @@ -238,9 +244,6 @@ func (s *service) StartShim(ctx context.Context, id, containerdBinary, container | |||||||
| 	}() | 	}() | ||||||
| 	// make sure to wait after start | 	// make sure to wait after start | ||||||
| 	go cmd.Wait() | 	go cmd.Wait() | ||||||
| 	if err := shim.WriteAddress("address", address); err != nil { |  | ||||||
| 		return "", err |  | ||||||
| 	} |  | ||||||
| 	if data, err := ioutil.ReadAll(os.Stdin); err == nil { | 	if data, err := ioutil.ReadAll(os.Stdin); err == nil { | ||||||
| 		if len(data) > 0 { | 		if len(data) > 0 { | ||||||
| 			var any ptypes.Any | 			var any ptypes.Any | ||||||
| @@ -290,6 +293,7 @@ func (s *service) Cleanup(ctx context.Context) (*taskAPI.DeleteResponse, error) | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	path := filepath.Join(filepath.Dir(cwd), s.id) | 	path := filepath.Join(filepath.Dir(cwd), s.id) | ||||||
| 	ns, err := namespaces.NamespaceRequired(ctx) | 	ns, err := namespaces.NamespaceRequired(ctx) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -668,15 +672,19 @@ func (s *service) Shutdown(ctx context.Context, r *taskAPI.ShutdownRequest) (*pt | |||||||
| 	if len(s.containers) > 0 { | 	if len(s.containers) > 0 { | ||||||
| 		return empty, nil | 		return empty, nil | ||||||
| 	} | 	} | ||||||
| 	s.cancel() |  | ||||||
| 	close(s.events) |  | ||||||
|  |  | ||||||
| 	if s.platform != nil { | 	if s.platform != nil { | ||||||
| 		s.platform.Close() | 		s.platform.Close() | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if s.shimAddress != "" { | 	if s.shimAddress != "" { | ||||||
| 		_ = shim.RemoveSocket(s.shimAddress) | 		_ = shim.RemoveSocket(s.shimAddress) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	// please make sure that temporary resource has been cleanup | ||||||
|  | 	// before shutdown service. | ||||||
|  | 	s.cancel() | ||||||
|  | 	close(s.events) | ||||||
| 	return empty, nil | 	return empty, nil | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -239,6 +239,13 @@ func run(id string, initFunc Init, config Config) error { | |||||||
| 				return err | 				return err | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		// NOTE: If the shim server is down(like oom killer), the address | ||||||
|  | 		// socket might be leaking. | ||||||
|  | 		if address, err := ReadAddress("address"); err == nil { | ||||||
|  | 			_ = RemoveSocket(address) | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		select { | 		select { | ||||||
| 		case <-publisher.Done(): | 		case <-publisher.Done(): | ||||||
| 			return nil | 			return nil | ||||||
| @@ -299,15 +306,11 @@ func serve(ctx context.Context, server *ttrpc.Server, path string) error { | |||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	go func() { | 	go func() { | ||||||
|  | 		defer l.Close() | ||||||
| 		if err := server.Serve(ctx, l); err != nil && | 		if err := server.Serve(ctx, l); err != nil && | ||||||
| 			!strings.Contains(err.Error(), "use of closed network connection") { | 			!strings.Contains(err.Error(), "use of closed network connection") { | ||||||
| 			logrus.WithError(err).Fatal("containerd-shim: ttrpc server failure") | 			logrus.WithError(err).Fatal("containerd-shim: ttrpc server failure") | ||||||
| 		} | 		} | ||||||
| 		l.Close() |  | ||||||
| 		if address, err := ReadAddress("address"); err == nil { |  | ||||||
| 			_ = RemoveSocket(address) |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 	}() | 	}() | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Phil Estes
					Phil Estes