Merge pull request #900 from containous/fix-k8s-panic

Fix k8s panic
This commit is contained in:
Emile Vauge 2016-11-28 12:19:52 +01:00 committed by GitHub
commit e34c364d5e
3 changed files with 17 additions and 10 deletions

View file

@ -511,7 +511,7 @@ address = ":8080"
# To enable digest auth on the webui # To enable digest auth on the webui
# with 2 user/realm/pass: test:traefik:test and test2:traefik:test2 # with 2 user/realm/pass: test:traefik:test and test2:traefik:test2
# You can use htdigest to generate those ones # You can use htdigest to generate those ones
# [web.auth.basic] # [web.auth.digest]
# users = ["test:traefik:a2688e031edb4be6a3797f3882655c05 ", "test2:traefik:518845800f9e2bfb1f1f740ec24f074e"] # users = ["test:traefik:a2688e031edb4be6a3797f3882655c05 ", "test2:traefik:518845800f9e2bfb1f1f740ec24f074e"]
``` ```

View file

@ -7,6 +7,7 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/containous/traefik/log" "github.com/containous/traefik/log"
"github.com/containous/traefik/safe"
"github.com/parnurzeal/gorequest" "github.com/parnurzeal/gorequest"
"net/http" "net/http"
"net/url" "net/url"
@ -160,7 +161,7 @@ func (c *clientImpl) WatchAll(labelSelector string, stopCh <-chan bool) (chan in
if err != nil { if err != nil {
return watchCh, errCh, fmt.Errorf("failed to create watch: %v", err) return watchCh, errCh, fmt.Errorf("failed to create watch: %v", err)
} }
go func() { safe.Go(func() {
defer close(watchCh) defer close(watchCh)
defer close(errCh) defer close(errCh)
defer close(stopIngresses) defer close(stopIngresses)
@ -188,7 +189,7 @@ func (c *clientImpl) WatchAll(labelSelector string, stopCh <-chan bool) (chan in
watchCh <- event watchCh <- event
} }
} }
}() })
return watchCh, errCh, nil return watchCh, errCh, nil
} }
@ -268,11 +269,16 @@ func (c *clientImpl) watch(url string, labelSelector string, stopCh <-chan bool)
return watchCh, errCh, fmt.Errorf("failed to do watch request: GET %q: %v", url, err) return watchCh, errCh, fmt.Errorf("failed to do watch request: GET %q: %v", url, err)
} }
go func() { safe.Go(func() {
EndCh := make(chan bool, 1)
defer close(watchCh) defer close(watchCh)
defer close(errCh) defer close(errCh)
go func() { defer close(EndCh)
safe.Go(func() {
defer res.Body.Close() defer res.Body.Close()
defer func() {
EndCh <- true
}()
for { for {
var eventList interface{} var eventList interface{}
if err := json.NewDecoder(res.Body).Decode(&eventList); err != nil { if err := json.NewDecoder(res.Body).Decode(&eventList); err != nil {
@ -283,11 +289,12 @@ func (c *clientImpl) watch(url string, labelSelector string, stopCh <-chan bool)
} }
watchCh <- eventList watchCh <- eventList
} }
}() })
<-stopCh <-stopCh
go func() { safe.Go(func() {
cancel() // cancel watch request cancel() // cancel watch request
}() })
}() <-EndCh
})
return watchCh, errCh, nil return watchCh, errCh, nil
} }

View file

@ -294,7 +294,7 @@
# To enable digest auth on the webui # To enable digest auth on the webui
# with 2 user/realm/pass: test:traefik:test and test2:traefik:test2 # with 2 user/realm/pass: test:traefik:test and test2:traefik:test2
# You can use htdigest to generate those ones # You can use htdigest to generate those ones
# [web.auth.basic] # [web.auth.digest]
# users = ["test:traefik:a2688e031edb4be6a3797f3882655c05 ", "test2:traefik:518845800f9e2bfb1f1f740ec24f074e"] # users = ["test:traefik:a2688e031edb4be6a3797f3882655c05 ", "test2:traefik:518845800f9e2bfb1f1f740ec24f074e"]