diff options
| -rw-r--r-- | tests/defaults/main_test.go | 64 | 
1 files changed, 63 insertions, 1 deletions
| diff --git a/tests/defaults/main_test.go b/tests/defaults/main_test.go index 8c1b7e3..2ea9e12 100644 --- a/tests/defaults/main_test.go +++ b/tests/defaults/main_test.go @@ -3,8 +3,11 @@ package defaults  import (  	"bytes" +	"io"  	"os"  	"os/exec" +	"runtime" +	"sync"  	"syscall"  	"testing" @@ -117,7 +120,7 @@ func TestOpenTruncateRead(t *testing.T) {  	}  } -// TestWORead tries to read from a write-only file. +// TestWORead tries to read from a write-only FD.  func TestWORead(t *testing.T) {  	fn := test_helpers.DefaultPlainDir + "/TestWORead"  	fd, err := os.OpenFile(fn, os.O_CREATE|os.O_WRONLY, 0600) @@ -131,3 +134,62 @@ func TestWORead(t *testing.T) {  		t.Error("Reading from write-only file should fail, but did not")  	}  } + +// xfstests generic/124 triggers this warning: +// cipherSize 18 == header size: interrupted write? +// This test reproduces the problem. +func TestXfs124(t *testing.T) { +	// GOMAXPROCS=8 and N=5000 seem to reliably trigger the problem. With N=1000, +	// the test passes sometimes. +	runtime.GOMAXPROCS(8) +	N := 5000 + +	fn := test_helpers.DefaultPlainDir + "/TestXfs124" +	fd, err := os.Create(fn) +	if err != nil { +		t.Fatal(err) +	} +	defer fd.Close() + +	var wg sync.WaitGroup +	wg.Add(2) + +	go func() { +		buf := make([]byte, 10) +		var err2 error +		for i := 0; i < N; i++ { +			err2 = fd.Truncate(0) +			if err2 != nil { +				panic(err2) +			} +			_, err2 = fd.WriteAt(buf, 0) +			if err2 != nil { +				panic(err2) +			} +		} +		wg.Done() +	}() + +	fd2, err := os.Open(fn) +	if err != nil { +		t.Fatal(err) +	} +	defer fd2.Close() + +	go func() { +		buf := make([]byte, 10) +		var err3 error +		for i := 0; i < N; i++ { +			_, err3 = fd2.ReadAt(buf, 0) +			if err3 == io.EOF { +				continue +			} +			if err3 != nil { +				panic(err3) +			} +		} +		wg.Done() +	}() + +	wg.Wait() +} | 
