Hotlistid 741888 (#16)
* [65464133]: Update tests for handling concurrent writes. Add Unlocking of Mutex in Negative case.
* Fix testcase for testing concurrency.
* Add couple more tests.
* Fix test to cover more cases.
diff --git a/data/data.go b/data/data.go
index 537ffe0..8eded28 100644
--- a/data/data.go
+++ b/data/data.go
@@ -63,6 +63,18 @@
return d.db.Ping()
}
+func (d *ApidDb) SetMaxIdleConns(n int) {
+ d.db.SetMaxIdleConns(n)
+}
+
+func (d *ApidDb) SetMaxOpenConns(n int) {
+ d.db.SetMaxOpenConns(n)
+}
+
+func (d *ApidDb) SetConnMaxLifetime(du time.Duration) {
+ d.db.SetConnMaxLifetime(du)
+}
+
func (d *ApidDb) Prepare(query string) (*sql.Stmt, error) {
return d.db.Prepare(query)
}
@@ -83,6 +95,7 @@
d.mutex.Lock()
tx, err := d.db.Begin()
if err != nil {
+ d.mutex.Unlock()
return nil, err
}
return &Tx{
diff --git a/data/data_test.go b/data/data_test.go
index 71dfb26..f17511b 100644
--- a/data/data_test.go
+++ b/data/data_test.go
@@ -26,7 +26,7 @@
)
const (
- count = 5000
+ count = 500
setupSql = `
CREATE TABLE test_1 (id INTEGER PRIMARY KEY, counter TEXT);
CREATE TABLE test_2 (id INTEGER PRIMARY KEY, counter TEXT);`
@@ -48,7 +48,6 @@
_, err = apid.Data().DBVersionForID("common", "base")
Expect(err).To(HaveOccurred())
})
-
It("should be able to change versions of a datbase", func() {
var versions []string
var dbs []apid.DB
@@ -82,8 +81,10 @@
Expect(data.DBPath(id)).ShouldNot(BeAnExistingFile())
})
- It("should handle concurrent read & serialized write", func() {
+ It("should handle concurrent read & serialized write, and throttle", func() {
db, err := apid.Data().DBForID("test")
+ db.SetMaxOpenConns(10)
+ db.SetMaxIdleConns(10)
Expect(err).NotTo(HaveOccurred())
setup(db)
finished := make(chan bool, count+1)
@@ -104,11 +105,15 @@
for i := 0; i < count+1; i++ {
<-finished
+ // Since conns are shared, will always be <= 10
+ Expect(db.Stats().OpenConnections).Should(BeNumerically("<=", 10))
}
}, 10)
It("should handle concurrent write", func() {
db, err := apid.Data().DBForID("test_write")
+ db.SetMaxOpenConns(10)
+ db.SetMaxIdleConns(10)
Expect(err).NotTo(HaveOccurred())
setup(db)
finished := make(chan bool, count)
@@ -122,6 +127,8 @@
for i := 0; i < count; i++ {
<-finished
+ // Only one connection should get opened, as connections are serialized.
+ Expect(db.Stats().OpenConnections).To(Equal(1))
}
}, 10)
})
diff --git a/data_service.go b/data_service.go
index c606e10..355566d 100644
--- a/data_service.go
+++ b/data_service.go
@@ -17,6 +17,7 @@
import (
"context"
"database/sql"
+ "time"
)
type DataService interface {
@@ -40,6 +41,9 @@
QueryRow(query string, args ...interface{}) *sql.Row
Begin() (Tx, error)
Stats() sql.DBStats
+ SetConnMaxLifetime(d time.Duration)
+ SetMaxIdleConns(n int)
+ SetMaxOpenConns(n int)
//Close() error
//Stats() sql.DBStats
//Driver() driver.Driver