From: Matt Joiner Date: Thu, 17 Jul 2014 06:03:59 +0000 (+1000) Subject: dht: Timeout goroutines waiting for transaction responses X-Git-Tag: v1.0.0~1659 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=99bec9ac587332568a4538daf5dcb0a8c689741a;p=btrtrc.git dht: Timeout goroutines waiting for transaction responses --- diff --git a/dht/dht.go b/dht/dht.go index 672e77c4..93537d0b 100644 --- a/dht/dht.go +++ b/dht/dht.go @@ -78,9 +78,16 @@ type transaction struct { t string Response chan Msg onResponse func(Msg) + done chan struct{} +} + +func (t *transaction) timeout() { + close(t.Response) + close(t.done) } func (t *transaction) handleResponse(m Msg) { + close(t.done) if t.onResponse != nil { t.onResponse(m) } @@ -337,6 +344,23 @@ func (s *Server) IDString() string { return s.ID } +func (s *Server) timeoutTransaction(t *transaction) { + select { + case <-t.done: + return + case <-time.After(time.Minute): + } + s.mu.Lock() + defer s.mu.Unlock() + select { + case <-t.done: + return + default: + } + t.timeout() + s.removeTransaction(t) +} + func (s *Server) query(node *net.UDPAddr, q string, a map[string]string) (t *transaction, err error) { tid := s.nextTransactionID() if a == nil { @@ -357,12 +381,15 @@ func (s *Server) query(node *net.UDPAddr, q string, a map[string]string) (t *tra remoteAddr: node, t: tid, Response: make(chan Msg, 1), + done: make(chan struct{}), } s.addTransaction(t) err = s.writeToNode(b, node) if err != nil { s.removeTransaction(t) + return } + go s.timeoutTransaction(t) return }