runc-shim: only defer init process exits

In order to make sure that we don't publish task exit events for init
processes before we do for execs in that container, we added logic to
`processExits` in 892dc54bd2 to skip these
and let the pending exec's `handleStarted` closure process them.

However, the conditional logic in `processExits` added was faulty - we
should only defer processing of exit events related to init processes,
not other execs. Due to this missing condition,
892dc54bd2 introduced a bug where, if
there are many concurrent execs for the same container/init pid, exec
exits are skipped and then never published, resulting in hanging
clients.

This commit adds the missing logic to `processExits`.

Signed-off-by: Laura Brehm <laurabrehm@hey.com>
This commit is contained in:
Laura Brehm 2024-03-26 13:17:07 +00:00
parent 124456ef83
commit 6d00c3ada8
No known key found for this signature in database
GPG Key ID: CFBF847B4A313468

View File

@ -678,7 +678,8 @@ func (s *service) processExits() {
// process.
var cps, skipped []containerProcess
for _, cp := range s.running[e.Pid] {
if s.pendingExecs[cp.Container] != 0 {
_, init := cp.Process.(*process.Init)
if init && s.pendingExecs[cp.Container] != 0 {
// This exit relates to a container for which we have pending execs. In
// order to ensure order between execs and the init process for a given
// container, skip processing this exit here and let the `handleStarted`