aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid du Colombier <0intro@gmail.com>2018-05-13 22:58:31 +0200
committerDavid du Colombier <0intro@gmail.com>2018-05-13 21:28:12 +0000
commit66a67ee6b4831816ee86f1ea9e5bd555d3a13e16 (patch)
treeade956b217099081db9023e206d33d462002220d
parent3636d53c6119fd1b8a5f9e309fdf65c79952d398 (diff)
downloadgo-66a67ee6b4831816ee86f1ea9e5bd555d3a13e16.tar.xz
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 <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
-rw-r--r--src/net/lookup_plan9.go70
1 files 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) {