| // +build !experimental |
| |
| package libcontainerd |
| |
| import ( |
| "syscall" |
| "time" |
| |
| "github.com/Sirupsen/logrus" |
| ) |
| |
| func (clnt *client) Restore(containerID string, options ...CreateOption) error { |
| w := clnt.getOrCreateExitNotifier(containerID) |
| defer w.close() |
| cont, err := clnt.getContainerdContainer(containerID) |
| if err == nil && cont.Status != "stopped" { |
| clnt.lock(cont.Id) |
| container := clnt.newContainer(cont.BundlePath) |
| container.systemPid = systemPid(cont) |
| clnt.appendContainer(container) |
| clnt.unlock(cont.Id) |
| |
| if err := clnt.Signal(containerID, int(syscall.SIGTERM)); err != nil { |
| logrus.Errorf("error sending sigterm to %v: %v", containerID, err) |
| } |
| select { |
| case <-time.After(10 * time.Second): |
| if err := clnt.Signal(containerID, int(syscall.SIGKILL)); err != nil { |
| logrus.Errorf("error sending sigkill to %v: %v", containerID, err) |
| } |
| select { |
| case <-time.After(2 * time.Second): |
| case <-w.wait(): |
| return nil |
| } |
| case <-w.wait(): |
| return nil |
| } |
| } |
| return clnt.setExited(containerID) |
| } |