[65464133]: Update tests for handling concurrent writes. Add Unlocking of Mutex in Negative case.
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..e7d5478 100644 --- a/data/data_test.go +++ b/data/data_test.go
@@ -48,7 +48,19 @@ _, err = apid.Data().DBVersionForID("common", "base") Expect(err).To(HaveOccurred()) }) + It("DB Begin Txn failure handled", func() { + var numRows int + db, err := apid.Data().DBForID("test") + db.SetMaxOpenConns(1) + db.SetMaxIdleConns(1) + err = db.QueryRow(`SELECT count(*) FROM test_2`).Scan(&numRows) + Expect(err).To(HaveOccurred()) + tx, err := db.Begin() + Expect(err).NotTo(HaveOccurred()) + tx.Commit() + + }) It("should be able to change versions of a datbase", func() { var versions []string var dbs []apid.DB @@ -84,6 +96,8 @@ It("should handle concurrent read & serialized write", func() { db, err := apid.Data().DBForID("test") + db.SetMaxOpenConns(1) + db.SetMaxIdleConns(1) Expect(err).NotTo(HaveOccurred()) setup(db) finished := make(chan bool, count+1) @@ -104,11 +118,14 @@ for i := 0; i < count+1; i++ { <-finished + Expect(db.Stats().OpenConnections).To(Equal(1)) } }, 10) It("should handle concurrent write", func() { db, err := apid.Data().DBForID("test_write") + db.SetMaxOpenConns(1) + db.SetMaxIdleConns(1) Expect(err).NotTo(HaveOccurred()) setup(db) finished := make(chan bool, count) @@ -122,6 +139,7 @@ for i := 0; i < count; i++ { <-finished + 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