Increase reaper buffer size and non-blocking send
Fixes #2709 This increases the buffer size for process exit subscribers. It also implements a non-blocking send on the subscriber channel. It is better to drop an exit even than it is to block a shim for one slow subscriber. Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
This commit is contained in:
		| @@ -26,12 +26,13 @@ import ( | ||||
| 	"github.com/containerd/containerd/sys" | ||||
| 	runc "github.com/containerd/go-runc" | ||||
| 	"github.com/pkg/errors" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| ) | ||||
|  | ||||
| // ErrNoSuchProcess is returned when the process no longer exists | ||||
| var ErrNoSuchProcess = errors.New("no such process") | ||||
|  | ||||
| const bufferSize = 32 | ||||
| const bufferSize = 2048 | ||||
|  | ||||
| // Reap should be called when the process receives an SIGCHLD.  Reap will reap | ||||
| // all exited processes and close their wait channels | ||||
| @@ -41,13 +42,20 @@ func Reap() error { | ||||
| 	Default.Lock() | ||||
| 	for c := range Default.subscribers { | ||||
| 		for _, e := range exits { | ||||
| 			c <- runc.Exit{ | ||||
| 			select { | ||||
| 			case c <- runc.Exit{ | ||||
| 				Timestamp: now, | ||||
| 				Pid:       e.Pid, | ||||
| 				Status:    e.Status, | ||||
| 			}: | ||||
| 			default: | ||||
| 				logrus.WithFields(logrus.Fields{ | ||||
| 					"subscriber": c, | ||||
| 					"pid":        e.Pid, | ||||
| 					"status":     e.Status, | ||||
| 				}).Warn("failed to send exit to subscriber") | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
| 	Default.Unlock() | ||||
| 	return err | ||||
|   | ||||
| @@ -26,12 +26,13 @@ import ( | ||||
| 	"github.com/containerd/containerd/sys" | ||||
| 	runc "github.com/containerd/go-runc" | ||||
| 	"github.com/pkg/errors" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| ) | ||||
|  | ||||
| // ErrNoSuchProcess is returned when the process no longer exists | ||||
| var ErrNoSuchProcess = errors.New("no such process") | ||||
|  | ||||
| const bufferSize = 32 | ||||
| const bufferSize = 2048 | ||||
|  | ||||
| // Reap should be called when the process receives an SIGCHLD.  Reap will reap | ||||
| // all exited processes and close their wait channels | ||||
| @@ -41,13 +42,20 @@ func Reap() error { | ||||
| 	Default.Lock() | ||||
| 	for c := range Default.subscribers { | ||||
| 		for _, e := range exits { | ||||
| 			c <- runc.Exit{ | ||||
| 			select { | ||||
| 			case c <- runc.Exit{ | ||||
| 				Timestamp: now, | ||||
| 				Pid:       e.Pid, | ||||
| 				Status:    e.Status, | ||||
| 			}: | ||||
| 			default: | ||||
| 				logrus.WithFields(logrus.Fields{ | ||||
| 					"subscriber": c, | ||||
| 					"pid":        e.Pid, | ||||
| 					"status":     e.Status, | ||||
| 				}).Warn("failed to send exit to subscriber") | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
| 	Default.Unlock() | ||||
| 	return err | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Michael Crosby
					Michael Crosby