diff options
author | Ben Johnson <benbjohnson@yahoo.com> | 2014-07-26 14:44:04 -0600 |
---|---|---|
committer | Ben Johnson <benbjohnson@yahoo.com> | 2014-07-26 14:44:04 -0600 |
commit | ca2339d7cbb4fe99571bd1c80c8b3dbb1979c4d4 (patch) | |
tree | d9de61bd5e7a434a41c032ee2495e538e1334ed4 /simulation_test.go | |
parent | Remove withTempPath() helper. (diff) | |
download | dedo-ca2339d7cbb4fe99571bd1c80c8b3dbb1979c4d4.tar.gz dedo-ca2339d7cbb4fe99571bd1c80c8b3dbb1979c4d4.tar.xz |
Remove wrapping test closures.
Diffstat (limited to 'simulation_test.go')
-rw-r--r-- | simulation_test.go | 132 |
1 files changed, 67 insertions, 65 deletions
diff --git a/simulation_test.go b/simulation_test.go index 482349f..021d6db 100644 --- a/simulation_test.go +++ b/simulation_test.go @@ -41,78 +41,80 @@ func testSimulate(t *testing.T, threadCount, parallelism int) { var versions = make(map[txid]*QuickDB) versions[1] = NewQuickDB() - withOpenDB(func(db *DB, path string) { - var mutex sync.Mutex - - // Run n threads in parallel, each with their own operation. - var wg sync.WaitGroup - var threads = make(chan bool, parallelism) - var i int - for { - threads <- true - wg.Add(1) - writable := ((rand.Int() % 100) < 20) // 20% writers - - // Choose an operation to execute. - var handler simulateHandler + + db := NewTestDB() + defer db.Close() + + var mutex sync.Mutex + + // Run n threads in parallel, each with their own operation. + var wg sync.WaitGroup + var threads = make(chan bool, parallelism) + var i int + for { + threads <- true + wg.Add(1) + writable := ((rand.Int() % 100) < 20) // 20% writers + + // Choose an operation to execute. + var handler simulateHandler + if writable { + handler = writerHandlers[rand.Intn(len(writerHandlers))] + } else { + handler = readerHandlers[rand.Intn(len(readerHandlers))] + } + + // Execute a thread for the given operation. + go func(writable bool, handler simulateHandler) { + defer wg.Done() + + // Start transaction. + tx, err := db.Begin(writable) + if err != nil { + t.Fatal("tx begin: ", err) + } + + // Obtain current state of the dataset. + mutex.Lock() + var qdb = versions[tx.id()] if writable { - handler = writerHandlers[rand.Intn(len(writerHandlers))] + qdb = versions[tx.id()-1].Copy() + } + mutex.Unlock() + + // Make sure we commit/rollback the tx at the end and update the state. + if writable { + defer func() { + mutex.Lock() + versions[tx.id()] = qdb + mutex.Unlock() + + assert.NoError(t, tx.Commit()) + }() } else { - handler = readerHandlers[rand.Intn(len(readerHandlers))] + defer tx.Rollback() } - // Execute a thread for the given operation. - go func(writable bool, handler simulateHandler) { - defer wg.Done() - - // Start transaction. - tx, err := db.Begin(writable) - if err != nil { - t.Fatal("tx begin: ", err) - } - - // Obtain current state of the dataset. - mutex.Lock() - var qdb = versions[tx.id()] - if writable { - qdb = versions[tx.id()-1].Copy() - } - mutex.Unlock() - - // Make sure we commit/rollback the tx at the end and update the state. - if writable { - defer func() { - mutex.Lock() - versions[tx.id()] = qdb - mutex.Unlock() - - assert.NoError(t, tx.Commit()) - }() - } else { - defer tx.Rollback() - } - - // Ignore operation if we don't have data yet. - if qdb == nil { - return - } - - // Execute handler. - handler(tx, qdb) - - // Release a thread back to the scheduling loop. - <-threads - }(writable, handler) - - i++ - if i > threadCount { - break + // Ignore operation if we don't have data yet. + if qdb == nil { + return } + + // Execute handler. + handler(tx, qdb) + + // Release a thread back to the scheduling loop. + <-threads + }(writable, handler) + + i++ + if i > threadCount { + break } + } - // Wait until all threads are done. - wg.Wait() - }) + // Wait until all threads are done. + wg.Wait() } type simulateHandler func(tx *Tx, qdb *QuickDB) |