438717500d
If one thread calls `Flush()` on a gatedwriter while another thread attempts to `Write()` new data to it, strange things will happen. The test I wrote shows that at the very least you can write _while_ flushing, and the call to `Write()` will happen during the internal writes of the buffered data, which is maybe not what is expected. (i.e. the `Write()`'d data will be inserted somewhere in the middle of the data being `Flush()'d`) It's also the case that, because `Write()` only has a read lock, if you had multiple threads trying to write ("read") at the same time you might have data loss because the `w.buf` that was read would not necessarily be up-to-date by the time `p2` was appended to it and it was re-assigned to `w.buf`. You can see this if you run the new gatedwriter tests with `-race` against the old implementation: ``` WARNING: DATA RACE Read at 0x00c0000c0420 by goroutine 11: runtime.growslice() /usr/lib/go/src/runtime/slice.go:125 +0x0 github.com/hashicorp/nomad/helper/gated-writer.(*Writer).Write() /home/hicks/workspace/nomad/helper/gated-writer/writer.go:41 +0x2b6 github.com/hashicorp/nomad/helper/gated-writer.TestWriter_WithMultipleWriters.func1() /home/hicks/workspace/nomad/helper/gated-writer/writer_test.go:90 +0xea ``` This race condition is fixed in this change. |
||
---|---|---|
.. | ||
writer.go | ||
writer_test.go |