diff options
author | Martin Polden <mpolden@mpolden.no> | 2019-08-08 17:23:58 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2019-08-10 12:16:51 +0200 |
commit | ade617300cd238a3d560b6189a10e07bac5d76cd (patch) | |
tree | eb49f22d9cb4b6c45d60b2f0d6ea85476aced00e /sql | |
parent | 92213f96a6bb79e7d224872fc5f7c6d7f24d7e33 (diff) |
Fix race condition
Diffstat (limited to 'sql')
-rw-r--r-- | sql/sql.go | 2 | ||||
-rw-r--r-- | sql/sql_test.go | 24 |
2 files changed, 26 insertions, 0 deletions
@@ -79,6 +79,8 @@ func New(filename string) (*Client, error) { // ReadLog reads the n most recent entries from the log. func (c *Client) ReadLog(n int) ([]LogEntry, error) { + c.mu.RLock() + defer c.mu.RUnlock() query := ` SELECT time, type, diff --git a/sql/sql_test.go b/sql/sql_test.go index a6e4fb3..f7a7432 100644 --- a/sql/sql_test.go +++ b/sql/sql_test.go @@ -2,6 +2,7 @@ package sql import ( "reflect" + "sync" "testing" "time" ) @@ -117,3 +118,26 @@ func TestDeleteLogBefore(t *testing.T) { t.Errorf("got %d rows for answer %q, want %d", got, question, want) } } + +func TestInterleavedRW(t *testing.T) { + c := testClient() + var wg sync.WaitGroup + wg.Add(1) + ch := make(chan bool, 10) + var err error + go func() { + defer wg.Done() + for range ch { + err = c.WriteLog(time.Now(), 1, "example.com.", "192.0.2.1") + } + }() + ch <- true + close(ch) + if _, err := c.ReadLog(1); err != nil { + t.Fatal(err) + } + wg.Wait() + if err != nil { + t.Fatal(err) + } +} |