diff options
| author | Shulhan <ms@kilabit.info> | 2018-09-25 09:58:56 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2018-09-25 09:58:56 +0700 |
| commit | af219eca7a9b4609b288103530cafc73f52c1266 (patch) | |
| tree | 703df0dca139740e7bee4d504cb5060fde1ffaf2 | |
| parent | 5dc5ef6577ca1bf41588126c0b0e68f6c139c063 (diff) | |
| download | pakakeh.go-af219eca7a9b4609b288103530cafc73f52c1266.tar.xz | |
lib/dns: remove request pooling
Since implementation of DNS over HTTP, the request contains channel for
waiting response from DNS server. The channel message cause data race
due to request can be closed on the other side (handler of DNS request).
For temporary fix, we disable request pooling until we found the simple
way to manage DoH response.
| -rw-r--r-- | lib/dns/dns_test.go | 2 | ||||
| -rw-r--r-- | lib/dns/request.go | 21 | ||||
| -rw-r--r-- | lib/dns/server.go | 24 |
3 files changed, 13 insertions, 34 deletions
diff --git a/lib/dns/dns_test.go b/lib/dns/dns_test.go index 7917a2b1..17940b72 100644 --- a/lib/dns/dns_test.go +++ b/lib/dns/dns_test.go @@ -176,8 +176,6 @@ func (h *serverHandler) ServeDNS(req *Request) { } else if req.ChanMessage != nil { req.ChanMessage <- res } - - _testServer.FreeRequest(req) } func TestMain(m *testing.M) { diff --git a/lib/dns/request.go b/lib/dns/request.go index 54a84d82..077aea54 100644 --- a/lib/dns/request.go +++ b/lib/dns/request.go @@ -6,18 +6,8 @@ package dns import ( "net" - "sync" ) -var _requestPool = sync.Pool{ - New: func() interface{} { - req := &Request{ - Message: NewMessage(), - } - return req - }, -} - // // Request contains UDP address and DNS query message from client. // @@ -29,11 +19,20 @@ type Request struct { } // +// NewRequest create and initialize request. +// +func NewRequest() *Request { + return &Request{ + Message: NewMessage(), + ChanMessage: make(chan *Message, 1), + } +} + +// // Reset message and UDP address in request. // func (req *Request) Reset() { req.Message.Reset() req.UDPAddr = nil req.Sender = nil - req.ChanMessage = nil } diff --git a/lib/dns/server.go b/lib/dns/server.go index 28ab67d8..635005be 100644 --- a/lib/dns/server.go +++ b/lib/dns/server.go @@ -147,9 +147,7 @@ func (srv *Server) handleDoHPost(w http.ResponseWriter, r *http.Request) { } func (srv *Server) handleDoHRequest(raw []byte, w http.ResponseWriter) { - req := _requestPool.Get().(*Request) - req.Reset() - req.ChanMessage = make(chan *Message, 1) + req := NewRequest() req.Message.Packet = append(req.Message.Packet[:0], raw...) req.Message.UnpackHeaderQuestion() @@ -208,7 +206,6 @@ func (srv *Server) ListenAndServeUDP(udpAddr *net.UDPAddr) error { var ( n int err error - req *Request ) srv.udp, err = net.ListenUDP("udp", udpAddr) @@ -222,10 +219,7 @@ func (srv *Server) ListenAndServeUDP(udpAddr *net.UDPAddr) error { } for { - if req == nil { - req = _requestPool.Get().(*Request) - } - req.Reset() + req := NewRequest() n, req.UDPAddr, err = srv.udp.ReadFromUDP(req.Message.Packet) if err != nil { @@ -247,13 +241,9 @@ func (srv *Server) serveTCPClient(cl *TCPClient) { var ( n int err error - req *Request ) for { - if req == nil { - req = _requestPool.Get().(*Request) - } - req.Reset() + req := NewRequest() for { n, err = cl.Recv(req.Message) @@ -262,7 +252,6 @@ func (srv *Server) serveTCPClient(cl *TCPClient) { } if err != nil { if err == io.EOF { - _requestPool.Put(req) break } if n != 0 { @@ -288,10 +277,3 @@ func (srv *Server) serveTCPClient(cl *TCPClient) { log.Println("serveTCPClient: conn.Close:", err) } } - -// -// FreeRequest put the request back to the pool. -// -func (srv *Server) FreeRequest(req *Request) { - _requestPool.Put(req) -} |
