diff options
author | 2018-04-20 17:47:46 +0300 | |
---|---|---|
committer | 2018-04-20 17:47:46 +0300 | |
commit | 135377bf776295d8ef86081c1ef581e7b41d26f0 (patch) | |
tree | e09807cdfedfb7b8a6181ad660c42dd6ea0d1f78 /plugin/forward/proxy_test.go | |
parent | ad13d88346d3e4686d92df20efb65af8f97dd7e1 (diff) | |
download | coredns-135377bf776295d8ef86081c1ef581e7b41d26f0.tar.gz coredns-135377bf776295d8ef86081c1ef581e7b41d26f0.tar.zst coredns-135377bf776295d8ef86081c1ef581e7b41d26f0.zip |
plugin/forward: gracefull stop (#1701)
* plugin/forward: gracefull stop
- stop connection manager only when no queries in progress
* minor improvement
* prevent healthcheck on stopped proxy
* revert closing channels
* use standard context
Diffstat (limited to 'plugin/forward/proxy_test.go')
-rw-r--r-- | plugin/forward/proxy_test.go | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/plugin/forward/proxy_test.go b/plugin/forward/proxy_test.go new file mode 100644 index 000000000..8c53f3150 --- /dev/null +++ b/plugin/forward/proxy_test.go @@ -0,0 +1,65 @@ +package forward + +import ( + "context" + "sync" + "testing" + + "github.com/coredns/coredns/plugin/pkg/dnstest" + "github.com/coredns/coredns/plugin/test" + "github.com/coredns/coredns/request" + + "github.com/miekg/dns" +) + +func TestProxyClose(t *testing.T) { + s := dnstest.NewServer(func(w dns.ResponseWriter, r *dns.Msg) { + ret := new(dns.Msg) + ret.SetReply(r) + w.WriteMsg(ret) + }) + defer s.Close() + + req := new(dns.Msg) + req.SetQuestion("example.org.", dns.TypeA) + state := request.Request{W: &test.ResponseWriter{}, Req: req} + ctx := context.TODO() + + repeatCnt := 1000 + for repeatCnt > 0 { + repeatCnt-- + p := NewProxy(s.Addr, nil /* no TLS */) + p.start(hcDuration) + + var wg sync.WaitGroup + wg.Add(5) + go func() { + p.connect(ctx, state, false, false) + wg.Done() + }() + go func() { + p.connect(ctx, state, true, false) + wg.Done() + }() + go func() { + p.close() + wg.Done() + }() + go func() { + p.connect(ctx, state, false, false) + wg.Done() + }() + go func() { + p.connect(ctx, state, true, false) + wg.Done() + }() + wg.Wait() + + if p.inProgress != 0 { + t.Errorf("unexpected query in progress") + } + if p.state != stopped { + t.Errorf("unexpected proxy state, expected %d, got %d", stopped, p.state) + } + } +} |