|
@@ -80,7 +80,6 @@ type containerMonitor struct {
|
|
// StartMonitor initializes a containerMonitor for this container with the provided supervisor and restart policy
|
|
// StartMonitor initializes a containerMonitor for this container with the provided supervisor and restart policy
|
|
// and starts the container's process.
|
|
// and starts the container's process.
|
|
func (container *Container) StartMonitor(s supervisor, policy container.RestartPolicy) error {
|
|
func (container *Container) StartMonitor(s supervisor, policy container.RestartPolicy) error {
|
|
- container.Lock()
|
|
|
|
container.monitor = &containerMonitor{
|
|
container.monitor = &containerMonitor{
|
|
supervisor: s,
|
|
supervisor: s,
|
|
container: container,
|
|
container: container,
|
|
@@ -89,7 +88,6 @@ func (container *Container) StartMonitor(s supervisor, policy container.RestartP
|
|
stopChan: make(chan struct{}),
|
|
stopChan: make(chan struct{}),
|
|
startSignal: make(chan struct{}),
|
|
startSignal: make(chan struct{}),
|
|
}
|
|
}
|
|
- container.Unlock()
|
|
|
|
|
|
|
|
return container.monitor.wait()
|
|
return container.monitor.wait()
|
|
}
|
|
}
|
|
@@ -159,8 +157,6 @@ func (m *containerMonitor) start() error {
|
|
}
|
|
}
|
|
m.Close()
|
|
m.Close()
|
|
}()
|
|
}()
|
|
-
|
|
|
|
- m.container.Lock()
|
|
|
|
// reset stopped flag
|
|
// reset stopped flag
|
|
if m.container.HasBeenManuallyStopped {
|
|
if m.container.HasBeenManuallyStopped {
|
|
m.container.HasBeenManuallyStopped = false
|
|
m.container.HasBeenManuallyStopped = false
|
|
@@ -175,20 +171,16 @@ func (m *containerMonitor) start() error {
|
|
if err := m.supervisor.StartLogging(m.container); err != nil {
|
|
if err := m.supervisor.StartLogging(m.container); err != nil {
|
|
m.resetContainer(false)
|
|
m.resetContainer(false)
|
|
|
|
|
|
- m.container.Unlock()
|
|
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
|
|
pipes := execdriver.NewPipes(m.container.Stdin(), m.container.Stdout(), m.container.Stderr(), m.container.Config.OpenStdin)
|
|
pipes := execdriver.NewPipes(m.container.Stdin(), m.container.Stdout(), m.container.Stderr(), m.container.Config.OpenStdin)
|
|
- m.container.Unlock()
|
|
|
|
|
|
|
|
m.logEvent("start")
|
|
m.logEvent("start")
|
|
|
|
|
|
m.lastStartTime = time.Now()
|
|
m.lastStartTime = time.Now()
|
|
|
|
|
|
- // don't lock Run because m.callback has own lock
|
|
|
|
if exitStatus, err = m.supervisor.Run(m.container, pipes, m.callback); err != nil {
|
|
if exitStatus, err = m.supervisor.Run(m.container, pipes, m.callback); err != nil {
|
|
- m.container.Lock()
|
|
|
|
// if we receive an internal error from the initial start of a container then lets
|
|
// if we receive an internal error from the initial start of a container then lets
|
|
// return it instead of entering the restart loop
|
|
// return it instead of entering the restart loop
|
|
// set to 127 for container cmd not found/does not exist)
|
|
// set to 127 for container cmd not found/does not exist)
|
|
@@ -198,7 +190,6 @@ func (m *containerMonitor) start() error {
|
|
if m.container.RestartCount == 0 {
|
|
if m.container.RestartCount == 0 {
|
|
m.container.ExitCode = 127
|
|
m.container.ExitCode = 127
|
|
m.resetContainer(false)
|
|
m.resetContainer(false)
|
|
- m.container.Unlock()
|
|
|
|
return derr.ErrorCodeCmdNotFound
|
|
return derr.ErrorCodeCmdNotFound
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -207,7 +198,6 @@ func (m *containerMonitor) start() error {
|
|
if m.container.RestartCount == 0 {
|
|
if m.container.RestartCount == 0 {
|
|
m.container.ExitCode = 126
|
|
m.container.ExitCode = 126
|
|
m.resetContainer(false)
|
|
m.resetContainer(false)
|
|
- m.container.Unlock()
|
|
|
|
return derr.ErrorCodeCmdCouldNotBeInvoked
|
|
return derr.ErrorCodeCmdCouldNotBeInvoked
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -216,13 +206,11 @@ func (m *containerMonitor) start() error {
|
|
m.container.ExitCode = -1
|
|
m.container.ExitCode = -1
|
|
m.resetContainer(false)
|
|
m.resetContainer(false)
|
|
|
|
|
|
- m.container.Unlock()
|
|
|
|
return derr.ErrorCodeCantStart.WithArgs(m.container.ID, utils.GetErrorMessage(err))
|
|
return derr.ErrorCodeCantStart.WithArgs(m.container.ID, utils.GetErrorMessage(err))
|
|
}
|
|
}
|
|
|
|
|
|
- m.container.Unlock()
|
|
|
|
logrus.Errorf("Error running container: %s", err)
|
|
logrus.Errorf("Error running container: %s", err)
|
|
- } // end if
|
|
|
|
|
|
+ }
|
|
|
|
|
|
// here container.Lock is already lost
|
|
// here container.Lock is already lost
|
|
afterRun = true
|
|
afterRun = true
|
|
@@ -243,14 +231,13 @@ func (m *containerMonitor) start() error {
|
|
if m.shouldStop {
|
|
if m.shouldStop {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
- m.container.Lock()
|
|
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
|
|
|
|
m.logEvent("die")
|
|
m.logEvent("die")
|
|
m.resetContainer(true)
|
|
m.resetContainer(true)
|
|
return err
|
|
return err
|
|
- } // end for
|
|
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
// resetMonitor resets the stateful fields on the containerMonitor based on the
|
|
// resetMonitor resets the stateful fields on the containerMonitor based on the
|
|
@@ -331,7 +318,7 @@ func (m *containerMonitor) callback(processConfig *execdriver.ProcessConfig, pid
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- m.container.SetRunningLocking(pid)
|
|
|
|
|
|
+ m.container.SetRunning(pid)
|
|
|
|
|
|
// signal that the process has started
|
|
// signal that the process has started
|
|
// close channel only if not closed
|
|
// close channel only if not closed
|