// Copyright 2019 The LevelDB-Go and Pebble Authors. All rights reserved. Use
// of this source code is governed by a BSD-style license that can be found in
// the LICENSE file.

package pebble

import (
	"fmt"
	"testing"
	"time"

	"github.com/cockroachdb/pebble/vfs"
	"golang.org/x/exp/rand"
)

func BenchmarkReadState(b *testing.B) {
	d, err := Open("", &Options{
		FS: vfs.NewMem(),
	})
	if err != nil {
		b.Fatal(err)
	}

	for _, updateFrac := range []float32{0, 0.1, 0.5} {
		b.Run(fmt.Sprintf("updates=%.0f", updateFrac*100), func(b *testing.B) {
			b.RunParallel(func(pb *testing.PB) {
				rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano())))

				for pb.Next() {
					if rng.Float32() < updateFrac {
						d.mu.Lock()
						d.updateReadStateLocked(nil)
						d.mu.Unlock()
					} else {
						s := d.loadReadState()
						s.unref()
					}
				}
			})
		})
	}

	if err := d.Close(); err != nil {
		b.Fatal(err)
	}
}