From 29b7d0a9a408ffa6c8528daa2c10e0f7bea8c66b Mon Sep 17 00:00:00 2001 From: Steven Normore Date: Sun, 13 Apr 2014 17:57:51 +0000 Subject: [PATCH] fix basic parallel benchmark --- bench.go | 55 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/bench.go b/bench.go index 16e4d7a..a93a27c 100644 --- a/bench.go +++ b/bench.go @@ -1,6 +1,9 @@ package bolt import ( + "errors" + "fmt" + "os" "sync" "testing" ) @@ -28,11 +31,16 @@ func (bm *Benchmark) Run(b *testing.B) { // Open the database. db, err := Open(bm.InputPath, 0600) if err != nil { - panic(err) + b.Fatalf("error: %+v", err) return } defer db.Close() + buckets, err := buckets(db, bm.InputPath) + if err != nil { + b.Fatalf("error: %+v", err) + } + b.ResetTimer() // Keep running a fixed number of parallel reads until we run out of time. @@ -41,15 +49,48 @@ func (bm *Benchmark) Run(b *testing.B) { for j := 0; j < bm.Parallelism; j++ { wg.Add(1) go func() { - if bm.TraversalPattern == BenchRandomTraversal { - // Perform all reads in random order. - // indexes := rand.Perm(total) - } else { - // Perform all reads in sequential order. + defer wg.Done() + if err := bm.runBuckets(b, db, buckets); err != nil { + b.Fatalf("error: %+v", err) } - wg.Done() }() } wg.Wait() } } + +// Run benchmark(s) for each of the given buckets. +func (bm *Benchmark) runBuckets(b *testing.B, db *DB, buckets []string) error { + return db.View(func(tx *Tx) error { + bucketsCount := len(buckets) + for _, bucket := range buckets { + c := tx.Bucket([]byte(bucket)).Cursor() + count := 0 + for k, _ := c.First(); k != nil; k, _ = c.Next() { + count++ + } + if count != bucketsCount { + return errors.New(fmt.Sprintf("wrong count: %d; expected: %d", count, bucketsCount)) + } + } + return nil + }) +} + +func buckets(db *DB, path string) ([]string, error) { + if _, err := os.Stat(path); os.IsNotExist(err) { + return nil, err + } + + buckets := []string{} + + err := db.View(func(tx *Tx) error { + // Iterate over each bucket. + return tx.ForEach(func(name []byte, _ *Bucket) error { + buckets = append(buckets, string(name)) + return nil + }) + }) + + return buckets, err +}