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("+") +}