mirror of
https://github.com/etcd-io/bbolt.git
synced 2025-05-31 11:42:30 +00:00
test: verify that txids are incremental
Signed-off-by: Benjamin Wang <wachao@vmware.com>
This commit is contained in:
parent
89ed8dcb40
commit
e431258c0d
@ -208,7 +208,8 @@ func runWorkers(t *testing.T,
|
|||||||
|
|
||||||
// start write transaction
|
// start write transaction
|
||||||
g := new(errgroup.Group)
|
g := new(errgroup.Group)
|
||||||
writer := writeWorker{
|
writer := &writeWorker{
|
||||||
|
id: 0,
|
||||||
db: db,
|
db: db,
|
||||||
bucket: bucket,
|
bucket: bucket,
|
||||||
keys: keys,
|
keys: keys,
|
||||||
@ -221,7 +222,7 @@ func runWorkers(t *testing.T,
|
|||||||
t: t,
|
t: t,
|
||||||
}
|
}
|
||||||
g.Go(func() error {
|
g.Go(func() error {
|
||||||
wrs, err := writer.run()
|
wrs, err := runWorker(t, writer, errCh)
|
||||||
mu.Lock()
|
mu.Lock()
|
||||||
rs = append(rs, wrs...)
|
rs = append(rs, wrs...)
|
||||||
mu.Unlock()
|
mu.Unlock()
|
||||||
@ -231,6 +232,7 @@ func runWorkers(t *testing.T,
|
|||||||
// start readonly transactions
|
// start readonly transactions
|
||||||
for i := 0; i < readerCount; i++ {
|
for i := 0; i < readerCount; i++ {
|
||||||
reader := &readWorker{
|
reader := &readWorker{
|
||||||
|
id: i,
|
||||||
db: db,
|
db: db,
|
||||||
bucket: bucket,
|
bucket: bucket,
|
||||||
keys: keys,
|
keys: keys,
|
||||||
@ -242,7 +244,7 @@ func runWorkers(t *testing.T,
|
|||||||
t: t,
|
t: t,
|
||||||
}
|
}
|
||||||
g.Go(func() error {
|
g.Go(func() error {
|
||||||
rrs, err := reader.run()
|
rrs, err := runWorker(t, reader, errCh)
|
||||||
mu.Lock()
|
mu.Lock()
|
||||||
rs = append(rs, rrs...)
|
rs = append(rs, rrs...)
|
||||||
mu.Unlock()
|
mu.Unlock()
|
||||||
@ -265,7 +267,26 @@ func runWorkers(t *testing.T,
|
|||||||
return rs
|
return rs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func runWorker(t *testing.T, w worker, errCh chan error) (historyRecords, error) {
|
||||||
|
rs, err := w.run()
|
||||||
|
if len(rs) > 0 && err == nil {
|
||||||
|
if terr := validateIncrementalTxid(rs); terr != nil {
|
||||||
|
txidErr := fmt.Errorf("[%s]: %w", w.name(), terr)
|
||||||
|
t.Error(txidErr)
|
||||||
|
errCh <- txidErr
|
||||||
|
return rs, txidErr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rs, err
|
||||||
|
}
|
||||||
|
|
||||||
|
type worker interface {
|
||||||
|
name() string
|
||||||
|
run() (historyRecords, error)
|
||||||
|
}
|
||||||
|
|
||||||
type readWorker struct {
|
type readWorker struct {
|
||||||
|
id int
|
||||||
db *btesting.DB
|
db *btesting.DB
|
||||||
|
|
||||||
bucket []byte
|
bucket []byte
|
||||||
@ -279,6 +300,10 @@ type readWorker struct {
|
|||||||
t *testing.T
|
t *testing.T
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (w *readWorker) name() string {
|
||||||
|
return fmt.Sprintf("readWorker-%d", w.id)
|
||||||
|
}
|
||||||
|
|
||||||
func (r *readWorker) run() (historyRecords, error) {
|
func (r *readWorker) run() (historyRecords, error) {
|
||||||
var rs historyRecords
|
var rs historyRecords
|
||||||
for {
|
for {
|
||||||
@ -317,7 +342,7 @@ func (r *readWorker) run() (historyRecords, error) {
|
|||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
readErr := fmt.Errorf("[reader error]: %w", err)
|
readErr := fmt.Errorf("[reader error]: %w", err)
|
||||||
r.t.Log(readErr)
|
r.t.Error(readErr)
|
||||||
r.errCh <- readErr
|
r.errCh <- readErr
|
||||||
return rs, readErr
|
return rs, readErr
|
||||||
}
|
}
|
||||||
@ -325,6 +350,7 @@ func (r *readWorker) run() (historyRecords, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type writeWorker struct {
|
type writeWorker struct {
|
||||||
|
id int
|
||||||
db *btesting.DB
|
db *btesting.DB
|
||||||
|
|
||||||
bucket []byte
|
bucket []byte
|
||||||
@ -339,6 +365,10 @@ type writeWorker struct {
|
|||||||
t *testing.T
|
t *testing.T
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (w *writeWorker) name() string {
|
||||||
|
return fmt.Sprintf("writeWorker-%d", w.id)
|
||||||
|
}
|
||||||
|
|
||||||
func (w *writeWorker) run() (historyRecords, error) {
|
func (w *writeWorker) run() (historyRecords, error) {
|
||||||
var rs historyRecords
|
var rs historyRecords
|
||||||
for {
|
for {
|
||||||
@ -375,7 +405,7 @@ func (w *writeWorker) run() (historyRecords, error) {
|
|||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
writeErr := fmt.Errorf("[writer error]: %w", err)
|
writeErr := fmt.Errorf("[writer error]: %w", err)
|
||||||
w.t.Log(writeErr)
|
w.t.Error(writeErr)
|
||||||
w.errCh <- writeErr
|
w.errCh <- writeErr
|
||||||
return rs, writeErr
|
return rs, writeErr
|
||||||
}
|
}
|
||||||
@ -511,6 +541,19 @@ func (rs historyRecords) Swap(i, j int) {
|
|||||||
rs[i], rs[j] = rs[j], rs[i]
|
rs[i], rs[j] = rs[j], rs[i]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func validateIncrementalTxid(rs historyRecords) error {
|
||||||
|
lastTxid := rs[0].Txid
|
||||||
|
|
||||||
|
for i := 1; i < len(rs); i++ {
|
||||||
|
if (rs[i].OperationType == Write && rs[i].Txid <= lastTxid) || (rs[i].OperationType == Read && rs[i].Txid < lastTxid) {
|
||||||
|
return fmt.Errorf("detected non-incremental txid(%d, %d) in %s mode", lastTxid, rs[i].Txid, rs[i].OperationType)
|
||||||
|
}
|
||||||
|
lastTxid = rs[i].Txid
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func validateSerializable(rs historyRecords) error {
|
func validateSerializable(rs historyRecords) error {
|
||||||
sort.Sort(rs)
|
sort.Sort(rs)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user