From 66a67ee6b4831816ee86f1ea9e5bd555d3a13e16 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sun, 13 May 2018 22:58:31 +0200 Subject: [PATCH] net: implement cancellable lookup on Plan 9 This change implements cancellable lookup on Plan 9. The query function has been modified to return when the ctx.Done channel is closed. Fixes #25361. Change-Id: I544b779ceec8d69975bc7363045849c21cbfd59e Reviewed-on: https://go-review.googlesource.com/112981 Run-TryBot: David du Colombier <0intro@gmail.com> TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/net/lookup_plan9.go | 70 +++++++++++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 23 deletions(-) diff --git a/src/net/lookup_plan9.go b/src/net/lookup_plan9.go index 1037b81a3b..e0b38c69b9 100644 --- a/src/net/lookup_plan9.go +++ b/src/net/lookup_plan9.go @@ -11,34 +11,58 @@ import ( "os" ) -func query(ctx context.Context, filename, query string, bufSize int) (res []string, err error) { - file, err := os.OpenFile(filename, os.O_RDWR, 0) - if err != nil { - return - } - defer file.Close() +func query(ctx context.Context, filename, query string, bufSize int) (addrs []string, err error) { + queryAddrs := func() (addrs []string, err error) { + file, err := os.OpenFile(filename, os.O_RDWR, 0) + if err != nil { + return nil, err + } + defer file.Close() - _, err = file.Seek(0, io.SeekStart) - if err != nil { - return - } - _, err = file.WriteString(query) - if err != nil { - return + _, err = file.Seek(0, io.SeekStart) + if err != nil { + return nil, err + } + _, err = file.WriteString(query) + if err != nil { + return nil, err + } + _, err = file.Seek(0, io.SeekStart) + if err != nil { + return nil, err + } + buf := make([]byte, bufSize) + for { + n, _ := file.Read(buf) + if n <= 0 { + break + } + addrs = append(addrs, string(buf[:n])) + } + return addrs, nil } - _, err = file.Seek(0, io.SeekStart) - if err != nil { - return + + type ret struct { + addrs []string + err error } - buf := make([]byte, bufSize) - for { - n, _ := file.Read(buf) - if n <= 0 { - break + + ch := make(chan ret, 1) + go func() { + addrs, err := queryAddrs() + ch <- ret{addrs: addrs, err: err} + }() + + select { + case r := <-ch: + return r.addrs, r.err + case <-ctx.Done(): + return nil, &DNSError{ + Name: query, + Err: ctx.Err().Error(), + IsTimeout: ctx.Err() == context.DeadlineExceeded, } - res = append(res, string(buf[:n])) } - return } func queryCS(ctx context.Context, net, host, service string) (res []string, err error) { -- 2.50.0