aboutsummaryrefslogtreecommitdiff
path: root/simulation_test.go
diff options
context:
space:
mode:
authorBen Johnson <benbjohnson@yahoo.com>2014-07-26 14:44:04 -0600
committerBen Johnson <benbjohnson@yahoo.com>2014-07-26 14:44:04 -0600
commitca2339d7cbb4fe99571bd1c80c8b3dbb1979c4d4 (patch)
treed9de61bd5e7a434a41c032ee2495e538e1334ed4 /simulation_test.go
parentRemove withTempPath() helper. (diff)
downloaddedo-ca2339d7cbb4fe99571bd1c80c8b3dbb1979c4d4.tar.gz
dedo-ca2339d7cbb4fe99571bd1c80c8b3dbb1979c4d4.tar.xz
Remove wrapping test closures.
Diffstat (limited to 'simulation_test.go')
-rw-r--r--simulation_test.go132
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)