aboutsummaryrefslogtreecommitdiffstats
path: root/sql
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2019-08-08 17:23:58 +0200
committerMartin Polden <mpolden@mpolden.no>2019-08-10 12:16:51 +0200
commitade617300cd238a3d560b6189a10e07bac5d76cd (patch)
treeeb49f22d9cb4b6c45d60b2f0d6ea85476aced00e /sql
parent92213f96a6bb79e7d224872fc5f7c6d7f24d7e33 (diff)
Fix race condition
Diffstat (limited to 'sql')
-rw-r--r--sql/sql.go2
-rw-r--r--sql/sql_test.go24
2 files changed, 26 insertions, 0 deletions
diff --git a/sql/sql.go b/sql/sql.go
index 76f8417..45d969b 100644
--- a/sql/sql.go
+++ b/sql/sql.go
@@ -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)
+ }
+}