aboutsummaryrefslogtreecommitdiff
path: root/db_test.go
diff options
context:
space:
mode:
authorBen Johnson <benbjohnson@yahoo.com>2015-05-20 16:10:07 -0600
committerBen Johnson <benbjohnson@yahoo.com>2015-05-20 16:10:07 -0600
commite929eba364732aa3a7eb76e2c9c38b7d23b8a980 (patch)
tree48f4fe99a2c0c68768fcb329842b4b1e95f84347 /db_test.go
parentMerge pull request #376 from ryanuber/readme-consul (diff)
downloaddedo-e929eba364732aa3a7eb76e2c9c38b7d23b8a980.tar.gz
dedo-e929eba364732aa3a7eb76e2c9c38b7d23b8a980.tar.xz
Wait for pending tx on close.
This commit fixes the DB.Close() function so that it waits for any open transactions to finish before closing.
Diffstat (limited to 'db_test.go')
-rw-r--r--db_test.go45
1 files changed, 44 insertions, 1 deletions
diff --git a/db_test.go b/db_test.go
index 6af6423..dddf22b 100644
--- a/db_test.go
+++ b/db_test.go
@@ -324,6 +324,49 @@ func TestDB_BeginRW_Closed(t *testing.T) {
assert(t, tx == nil, "")
}
+func TestDB_Close_PendingTx_RW(t *testing.T) { testDB_Close_PendingTx(t, true) }
+func TestDB_Close_PendingTx_RO(t *testing.T) { testDB_Close_PendingTx(t, false) }
+
+// Ensure that a database cannot close while transactions are open.
+func testDB_Close_PendingTx(t *testing.T, writable bool) {
+ db := NewTestDB()
+ defer db.Close()
+
+ // Start transaction.
+ tx, err := db.Begin(true)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Open update in separate goroutine.
+ done := make(chan struct{})
+ go func() {
+ db.Close()
+ close(done)
+ }()
+
+ // Ensure database hasn't closed.
+ time.Sleep(100 * time.Millisecond)
+ select {
+ case <-done:
+ t.Fatal("database closed too early")
+ default:
+ }
+
+ // Commit transaction.
+ if err := tx.Commit(); err != nil {
+ t.Fatal(err)
+ }
+
+ // Ensure database closed now.
+ time.Sleep(100 * time.Millisecond)
+ select {
+ case <-done:
+ default:
+ t.Fatal("database did not close")
+ }
+}
+
// Ensure a database can provide a transactional block.
func TestDB_Update(t *testing.T) {
db := NewTestDB()
@@ -748,7 +791,7 @@ func (db *TestDB) PrintStats() {
// MustCheck runs a consistency check on the database and panics if any errors are found.
func (db *TestDB) MustCheck() {
- db.View(func(tx *bolt.Tx) error {
+ db.Update(func(tx *bolt.Tx) error {
// Collect all the errors.
var errors []error
for err := range tx.Check() {