Merge pull request #1560 from weaveworks/1542-proxy-bug-weave-not-running

LGTM. Fixes #1542
This commit is contained in:
Bryan Boreham committed 2015-10-22 10:19:32 +01:00
commit acdc70f72a
3 files changed
+32 -21

No files matched your search

+19 -19
View File
@@ -59,7 +59,8 @@ type Config struct {
type wait struct {
ident string
ch chan struct{}
ch chan error
done bool
}
type Proxy struct {
@@ -296,19 +297,17 @@ func (proxy *Proxy) listen(protoAndAddr string) (net.Listener, string, error) {
// weavedocker.ContainerObserver interface
func (proxy *Proxy) ContainerStarted(ident string) {
container, err := proxy.client.InspectContainer(ident)
if err != nil {
if _, ok := err.(*docker.NoSuchContainer); !ok {
Log.Warningf("unable to attach new container %s since inspecting it failed: %v", ident, err)
if err == nil {
if containerShouldAttach(container) {
err = proxy.attach(container, true)
} else if containerIsWeaveRouter(container) {
err = proxy.attachRouter(container)
}
return
}
// If this was a container we modified the entrypoint for, attach it to the network
if containerShouldAttach(container) {
proxy.attach(container, true)
} else if containerIsWeaveRouter(container) {
proxy.attachRouter(container)
if _, ok := err.(*docker.NoSuchContainer); err != nil && !ok {
Log.Warningf("unable to attach new container %s since inspecting it failed: %v", ident, err)
}
proxy.notifyWaiters(container.ID)
proxy.notifyWaiters(ident, err)
}
func containerShouldAttach(container *docker.Container) bool {
@@ -321,8 +320,7 @@ func containerIsWeaveRouter(container *docker.Container) bool {
func (proxy *Proxy) createWait(r *http.Request, ident string) {
proxy.Lock()
ch := make(chan struct{})
proxy.waiters[r] = &wait{ident: ident, ch: ch}
proxy.waiters[r] = &wait{ident: ident, ch: make(chan error, 1)}
proxy.Unlock()
}
@@ -332,19 +330,20 @@ func (proxy *Proxy) removeWait(r *http.Request) {
proxy.Unlock()
}
func (proxy *Proxy) notifyWaiters(ident string) {
func (proxy *Proxy) notifyWaiters(ident string, err error) {
proxy.Lock()
for _, wait := range proxy.waiters {
if ident == wait.ident && wait.ch != nil {
if ident == wait.ident && !wait.done {
wait.ch <- err
close(wait.ch)
wait.ch = nil
wait.done = true
}
}
proxy.Unlock()
}
func (proxy *Proxy) waitForStart(r *http.Request) {
var ch chan struct{}
func (proxy *Proxy) waitForStart(r *http.Request) error {
var ch chan error
proxy.Lock()
wait, found := proxy.waiters[r]
if found {
@@ -353,8 +352,9 @@ func (proxy *Proxy) waitForStart(r *http.Request) {
proxy.Unlock()
if ch != nil {
Log.Debugf("Wait for start of container %s", wait.ident)
<-ch
return <-ch
}
return nil
}
func (proxy *Proxy) ContainerDied(ident string) {
+1 -2
View File
@@ -53,6 +53,5 @@ func (i *startContainerInterceptor) InterceptResponse(r *http.Response) error {
if r.StatusCode < 200 || r.StatusCode >= 300 { // Docker didn't do the start
return nil
}
i.proxy.waitForStart(r.Request)
return nil
return i.proxy.waitForStart(r.Request)
}
+12
View File
@@ -0,0 +1,12 @@
#! /bin/bash
. ./config.sh
start_suite "Proxy failure modes"
# docker run should fail when weave router is not running
weave_on $HOST1 launch-proxy
assert_raises "proxy docker_on $HOST1 run --rm $SMALL_IMAGE true" 1
assert_raises "proxy docker_on $HOST1 run --rm $SMALL_IMAGE true 2>&1 1>/dev/null | grep 'Error response from daemon: weave container is not present. Have you launched it?'"
end_suite