aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2018-09-25 09:58:56 +0700
committerShulhan <ms@kilabit.info>2018-09-25 09:58:56 +0700
commitaf219eca7a9b4609b288103530cafc73f52c1266 (patch)
tree703df0dca139740e7bee4d504cb5060fde1ffaf2
parent5dc5ef6577ca1bf41588126c0b0e68f6c139c063 (diff)
downloadpakakeh.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.go2
-rw-r--r--lib/dns/request.go21
-rw-r--r--lib/dns/server.go24
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)
-}