diff options
| author | Russ Cox <rsc@golang.org> | 2016-10-20 17:14:47 -0400 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2016-10-29 18:23:59 +0000 |
| commit | 03d641b990bf83b0553d723a2b8764af48de4e11 (patch) | |
| tree | 50d31945a92ed88a6b5c92564dd4865eeb989abb /src/net/writev_test.go | |
| parent | 21a1fe4ddf77a49fee1d82d1891e66b1dce932bb (diff) | |
| download | go-03d641b990bf83b0553d723a2b8764af48de4e11.tar.xz | |
net: break up >1GB reads and writes on stream connections
Also fix behavior of Buffers.WriteTo when writev returns an error.
Fixes #16266.
Change-Id: Idc9503408ce2cb460663768fab86035cbab11aef
Reviewed-on: https://go-review.googlesource.com/31584
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/net/writev_test.go')
| -rw-r--r-- | src/net/writev_test.go | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/net/writev_test.go b/src/net/writev_test.go index cc53adcdd1..385cc12503 100644 --- a/src/net/writev_test.go +++ b/src/net/writev_test.go @@ -169,3 +169,44 @@ func testBuffer_writeTo(t *testing.T, chunks int, useCopy bool) { return nil }) } + +func TestWritevError(t *testing.T) { + ln, err := newLocalListener("tcp") + if err != nil { + t.Fatal(err) + } + defer ln.Close() + + ch := make(chan Conn, 1) + go func() { + defer close(ch) + c, err := ln.Accept() + if err != nil { + t.Error(err) + return + } + ch <- c + }() + c1, err := Dial("tcp", ln.Addr().String()) + if err != nil { + t.Fatal(err) + } + defer c1.Close() + c2 := <-ch + if c2 == nil { + t.Fatal("no server side connection") + } + c2.Close() + + // 1 GB of data should be enough to notice the connection is gone. + // Just a few bytes is not enough. + // Arrange to reuse the same 1 MB buffer so that we don't allocate much. + buf := make([]byte, 1<<20) + buffers := make(Buffers, 1<<10) + for i := range buffers { + buffers[i] = buf + } + if _, err := buffers.WriteTo(c1); err == nil { + t.Fatalf("Buffers.WriteTo(closed conn) succeeded, want error", err) + } +} |
