add tests for currently alter table and read table
diff --git a/data/data.go b/data/data.go
index 8eded28..2b6420d 100644
--- a/data/data.go
+++ b/data/data.go
@@ -64,7 +64,7 @@
}
func (d *ApidDb) SetMaxIdleConns(n int) {
- d.db.SetMaxIdleConns(n)
+ d.db.SetMaxIdleConns(n)
}
func (d *ApidDb) SetMaxOpenConns(n int) {
diff --git a/data/data_test.go b/data/data_test.go
index f17511b..91d3257 100644
--- a/data/data_test.go
+++ b/data/data_test.go
@@ -119,10 +119,10 @@
finished := make(chan bool, count)
for i := 0; i < count; i++ {
- go func() {
- write(db, i)
+ go func(j int) {
+ write(db, j)
finished <- true
- }()
+ }(i)
}
for i := 0; i < count; i++ {
@@ -131,6 +131,92 @@
Expect(db.Stats().OpenConnections).To(Equal(1))
}
}, 10)
+
+ It("should handle concurrent read & write", func() {
+ db, err := apid.Data().DBForID("test_read_write")
+ db.SetMaxOpenConns(10)
+ db.SetMaxIdleConns(10)
+ Expect(err).NotTo(HaveOccurred())
+ setup(db)
+ finished := make(chan bool, 2*count)
+
+ for i := 0; i < count; i++ {
+ go func(j int) {
+ write(db, j)
+ finished <- true
+ }(i)
+ go func() {
+ read(db)
+ finished <- true
+ }()
+ }
+
+ for i := 0; i < 2*count; i++ {
+ <-finished
+ }
+ }, 10)
+
+ It("should handle concurrent alter table by seralizing them", func() {
+ db, err := apid.Data().DBForID("test_alter")
+ db.SetMaxOpenConns(10)
+ db.SetMaxIdleConns(10)
+ Expect(err).NotTo(HaveOccurred())
+ setup(db)
+ alterCount := 50
+ finished := make(chan bool, alterCount)
+
+ for i := 0; i < alterCount; i++ {
+ go func(j int) {
+ alter(db, j)
+ finished <- true
+ }(i)
+ }
+
+ for i := 0; i < alterCount; i++ {
+ <-finished
+ Expect(db.Stats().OpenConnections).To(Equal(1))
+ }
+ }, 10)
+
+ It("should handle seralized read & alter table", func() {
+ db, err := apid.Data().DBForID("test_read_alter")
+ db.SetMaxOpenConns(10)
+ db.SetMaxIdleConns(10)
+ Expect(err).NotTo(HaveOccurred())
+ setup(db)
+ alterCount := 50
+ for i := 0; i < alterCount; i++ {
+ alter(db, i)
+ read(db)
+ }
+ }, 10)
+
+ It("should handle concurrent read & alter table", func() {
+ db, err := apid.Data().DBForID("test_conn_read_alter")
+ db.SetMaxOpenConns(10)
+ db.SetMaxIdleConns(10)
+ Expect(err).NotTo(HaveOccurred())
+ setup(db)
+ alterCount := 50
+ finished := make(chan bool, count+alterCount)
+ for i := 0; i < alterCount; i++ {
+ go func(j int) {
+ alter(db, j)
+ finished <- true
+ }(i)
+ }
+
+ for i := 0; i < count; i++ {
+ go func() {
+ read(db)
+ finished <- true
+ }()
+ }
+
+ for i := 0; i < count+alterCount; i++ {
+ <-finished
+ }
+ }, 10)
})
func setup(db apid.DB) {
@@ -174,3 +260,18 @@
//Expect(err).Should(Succeed())
fmt.Print("+")
}
+
+func alter(db apid.DB, i int) {
+ defer GinkgoRecover()
+ // DB INSERT as a txn
+ tx, err := db.Begin()
+ Expect(err).Should(Succeed())
+ defer tx.Rollback()
+ prep, err := tx.Prepare("ALTER TABLE test_1 ADD COLUMN colname_" + strconv.Itoa(i) + " text DEFAULT ''")
+ Expect(err).Should(Succeed())
+ _, err = prep.Exec()
+ Expect(err).Should(Succeed())
+ Expect(prep.Close()).Should(Succeed())
+ Expect(tx.Commit()).Should(Succeed())
+ fmt.Print("+")
+}