fuweid / embedshim

Provide task runtime implementation with pidfd and eBPF sched_process_exit tracepoint to manage deamonless container with low overhead.
Apache License 2.0
117 stars 11 forks source link

execing command in container: error stream protocol error: invalid exit code value 4294967295 #34

Open 113xiaoji opened 9 months ago

113xiaoji commented 9 months ago

When using crictl to execute the exec command, there is an intermittent error reported:

execing command in container: error stream protocol error: invalid exit code value 4294967295

The relevant Go code snippet is as follows:

        return pidMonitor.pidPoller.Add(pidFD, func() error {
            execPid := e.Pid()

            status := 256

            event, err := execExitStore.GetExitedEvent(e.traceEventID)

            if err == nil && event.Pid == uint32(execPid) {
                status = int(event.ExitCode)
            }
            execExitStore.DeleteExitedEvent(e.traceEventID)

            e.SetExited(status)
            return nil
        })

When event, err := execExitStore.GetExitedEvent(e.traceEventID) encounters an error, the status is set to 256. The setExited method then calls unix.WaitStatus(status).ExitStatus(), as shown here:

func (e *execProcess) setExited(status int) {
    e.status = unix.WaitStatus(status).ExitStatus()
    e.exited = time.Now()

    if e.parent.platform != nil {
       e.parent.platform.ShutdownConsole(context.Background(), e.console)
    }
    close(e.waitBlock)
}

According to the source code, this will return -1:

func (w WaitStatus) ExitStatus() int {
    if !w.Exited() {
        return -1
    }
    return int(w>>shift) & 0xFF
}

As a result, the error message is generated:

execing command in container: error stream protocol error: invalid exit code value 4294967295