Really upgrade fsouza/go-dockerclient pkg to latest revision, so that we can have

Error and OOMKilled from docker ContainerStatus.
This commit is contained in:
Dawn Chen
2014-12-18 11:02:09 -08:00
parent b489757b5a
commit 95e3efdad8
30 changed files with 1041 additions and 155 deletions

View File

@@ -5,6 +5,7 @@
package docker
import (
"crypto/tls"
"encoding/json"
"errors"
"fmt"
@@ -49,6 +50,11 @@ var (
// ErrListenerAlreadyExists is the error returned when the listerner already
// exists.
ErrListenerAlreadyExists = errors.New("listener already exists for docker events")
// EOFEvent is sent when the event listener receives an EOF error.
EOFEvent = &APIEvents{
Status: "EOF",
}
)
// AddEventListener adds a new listener to container events in the Docker API.
@@ -111,6 +117,16 @@ func (eventState *eventMonitoringState) removeListener(listener chan<- *APIEvent
return nil
}
func (eventState *eventMonitoringState) closeListeners() {
eventState.Lock()
defer eventState.Unlock()
for _, l := range eventState.listeners {
close(l)
eventState.Add(-1)
}
eventState.listeners = nil
}
func listenerExists(a chan<- *APIEvents, list *[]chan<- *APIEvents) bool {
for _, b := range *list {
if b == a {
@@ -152,7 +168,7 @@ func (eventState *eventMonitoringState) monitorEvents(c *Client) {
time.Sleep(10 * time.Millisecond)
}
if err = eventState.connectWithRetry(c); err != nil {
eventState.terminate(err)
eventState.terminate()
}
for eventState.isEnabled() {
timeout := time.After(100 * time.Millisecond)
@@ -161,11 +177,16 @@ func (eventState *eventMonitoringState) monitorEvents(c *Client) {
if !ok {
return
}
if ev == EOFEvent {
eventState.closeListeners()
eventState.terminate()
return
}
go eventState.sendEvent(ev)
go eventState.updateLastSeen(ev)
case err = <-eventState.errC:
if err == ErrNoListeners {
eventState.terminate(nil)
eventState.terminate()
return
} else if err != nil {
defer func() { go eventState.monitorEvents(c) }()
@@ -225,7 +246,7 @@ func (eventState *eventMonitoringState) updateLastSeen(e *APIEvents) {
}
}
func (eventState *eventMonitoringState) terminate(err error) {
func (eventState *eventMonitoringState) terminate() {
eventState.disableEventMonitoring()
}
@@ -240,7 +261,13 @@ func (c *Client) eventHijack(startTime int64, eventChan chan *APIEvents, errChan
protocol = "tcp"
address = c.endpointURL.Host
}
dial, err := net.Dial(protocol, address)
var dial net.Conn
var err error
if c.TLSConfig == nil {
dial, err = net.Dial(protocol, address)
} else {
dial, err = tls.Dial(protocol, address, c.TLSConfig)
}
if err != nil {
return err
}
@@ -261,6 +288,10 @@ func (c *Client) eventHijack(startTime int64, eventChan chan *APIEvents, errChan
var event APIEvents
if err = decoder.Decode(&event); err != nil {
if err == io.EOF || err == io.ErrUnexpectedEOF {
if c.eventMonitor.isEnabled() {
// Signal that we're exiting.
eventChan <- EOFEvent
}
break
}
errChan <- err
@@ -271,7 +302,7 @@ func (c *Client) eventHijack(startTime int64, eventChan chan *APIEvents, errChan
if !c.eventMonitor.isEnabled() {
return
}
c.eventMonitor.C <- &event
eventChan <- &event
}
}(res, conn)
return nil