diff --git a/pkg/kv/kvserver/batcheval/cmd_get.go b/pkg/kv/kvserver/batcheval/cmd_get.go index 10466fdd6f12..7108ae3af083 100644 --- a/pkg/kv/kvserver/batcheval/cmd_get.go +++ b/pkg/kv/kvserver/batcheval/cmd_get.go @@ -33,8 +33,9 @@ func Get( h := cArgs.Header reply := resp.(*kvpb.GetResponse) - if err := maybeDisallowSkipLockedRequest(h, args.KeyLockingStrength); err != nil { - return result.Result{}, err + var lockTableForSkipLocked storage.LockTableView + if h.WaitPolicy == lock.WaitPolicy_SkipLocked { + lockTableForSkipLocked = newRequestBoundLockTableView(cArgs.Concurrency, args.KeyLockingStrength) } getRes, err := storage.MVCCGet(ctx, readWriter, args.Key, h.Timestamp, storage.MVCCGetOptions{ @@ -45,7 +46,7 @@ func Get( ScanStats: cArgs.ScanStats, Uncertainty: cArgs.Uncertainty, MemoryAccount: cArgs.EvalCtx.GetResponseMemoryAccount(), - LockTable: cArgs.Concurrency, + LockTable: lockTableForSkipLocked, DontInterleaveIntents: cArgs.DontInterleaveIntents, MaxKeys: cArgs.Header.MaxSpanRequestKeys, TargetBytes: cArgs.Header.TargetBytes, diff --git a/pkg/kv/kvserver/batcheval/cmd_reverse_scan.go b/pkg/kv/kvserver/batcheval/cmd_reverse_scan.go index 172e54b25769..d61a588cc04c 100644 --- a/pkg/kv/kvserver/batcheval/cmd_reverse_scan.go +++ b/pkg/kv/kvserver/batcheval/cmd_reverse_scan.go @@ -35,8 +35,9 @@ func ReverseScan( h := cArgs.Header reply := resp.(*kvpb.ReverseScanResponse) - if err := maybeDisallowSkipLockedRequest(h, args.KeyLockingStrength); err != nil { - return result.Result{}, err + var lockTableForSkipLocked storage.LockTableView + if h.WaitPolicy == lock.WaitPolicy_SkipLocked { + lockTableForSkipLocked = newRequestBoundLockTableView(cArgs.Concurrency, args.KeyLockingStrength) } var res result.Result @@ -58,7 +59,7 @@ func ReverseScan( FailOnMoreRecent: args.KeyLockingStrength != lock.None, Reverse: true, MemoryAccount: cArgs.EvalCtx.GetResponseMemoryAccount(), - LockTable: cArgs.Concurrency, + LockTable: lockTableForSkipLocked, DontInterleaveIntents: cArgs.DontInterleaveIntents, ReadCategory: readCategory, } diff --git a/pkg/kv/kvserver/batcheval/cmd_scan.go b/pkg/kv/kvserver/batcheval/cmd_scan.go index 846567976507..5209657f6525 100644 --- a/pkg/kv/kvserver/batcheval/cmd_scan.go +++ b/pkg/kv/kvserver/batcheval/cmd_scan.go @@ -38,8 +38,9 @@ func Scan( h := cArgs.Header reply := resp.(*kvpb.ScanResponse) - if err := maybeDisallowSkipLockedRequest(h, args.KeyLockingStrength); err != nil { - return result.Result{}, err + var lockTableForSkipLocked storage.LockTableView + if h.WaitPolicy == lock.WaitPolicy_SkipLocked { + lockTableForSkipLocked = newRequestBoundLockTableView(cArgs.Concurrency, args.KeyLockingStrength) } var res result.Result @@ -61,7 +62,7 @@ func Scan( FailOnMoreRecent: args.KeyLockingStrength != lock.None, Reverse: false, MemoryAccount: cArgs.EvalCtx.GetResponseMemoryAccount(), - LockTable: cArgs.Concurrency, + LockTable: lockTableForSkipLocked, DontInterleaveIntents: cArgs.DontInterleaveIntents, ReadCategory: readCategory, } @@ -157,22 +158,6 @@ func maybeInterceptDisallowedSkipLockedUsage(h kvpb.Header, err error) error { return err } -// maybeDisallowSkipLockedRequest returns an error if the skip locked wait -// policy is used in conjunction with shared locks. -// -// TODO(arul): this won't be needed once -// https://github.com/cockroachdb/cockroach/issues/110743 is addressed. Until -// then, we return unimplemented errors. -func maybeDisallowSkipLockedRequest(h kvpb.Header, str lock.Strength) error { - if h.WaitPolicy == lock.WaitPolicy_SkipLocked && str == lock.Shared { - return MarkSkipLockedUnsupportedError(errors.UnimplementedError( - errors.IssueLink{IssueURL: build.MakeIssueURL(110743)}, - "usage of shared locks in conjunction with skip locked wait policy is currently unsupported", - )) - } - return nil -} - // SkipLockedUnsupportedError is used to mark errors resulting from unsupported // (currently unimplemented) uses of the skip locked wait policy. type SkipLockedUnsupportedError struct{} diff --git a/pkg/kv/kvserver/batcheval/lock.go b/pkg/kv/kvserver/batcheval/lock.go index 3e626a62ca8c..c9f8ae781029 100644 --- a/pkg/kv/kvserver/batcheval/lock.go +++ b/pkg/kv/kvserver/batcheval/lock.go @@ -224,3 +224,33 @@ func copyKey(k roachpb.Key) roachpb.Key { copy(k2, k) return k2 } + +// txnBoundLockTableView is a transaction-bound view into an in-memory +// collections of key-level locks. +type txnBoundLockTableView interface { + IsKeyLockedByConflictingTxn( + roachpb.Key, lock.Strength, + ) (bool, *enginepb.TxnMeta, error) +} + +// requestBoundLockTableView combines a txnBoundLockTableView with the lock +// strength that an individual request is attempting to acquire. +type requestBoundLockTableView struct { + ltv txnBoundLockTableView + str lock.Strength +} + +// newRequestBoundLockTableView creates a new requestBoundLockTableView. +func newRequestBoundLockTableView( + ltv txnBoundLockTableView, str lock.Strength, +) *requestBoundLockTableView { + return &requestBoundLockTableView{ltv: ltv, str: str} +} + +// IsKeyLockedByConflictingTxn implements the storage.LockTableView interface. +func (ltv *requestBoundLockTableView) IsKeyLockedByConflictingTxn( + key roachpb.Key, +) (bool, *enginepb.TxnMeta, error) { + // TODO(arul): look for replicated lock conflicts. + return ltv.ltv.IsKeyLockedByConflictingTxn(key, ltv.str) +} diff --git a/pkg/kv/kvserver/batcheval/lock_test.go b/pkg/kv/kvserver/batcheval/lock_test.go index ef29090ffd96..9417b19f7091 100644 --- a/pkg/kv/kvserver/batcheval/lock_test.go +++ b/pkg/kv/kvserver/batcheval/lock_test.go @@ -16,13 +16,16 @@ import ( "github.com/cockroachdb/cockroach/pkg/kv/kvpb" "github.com/cockroachdb/cockroach/pkg/kv/kvserver/concurrency/isolation" + "github.com/cockroachdb/cockroach/pkg/kv/kvserver/concurrency/lock" "github.com/cockroachdb/cockroach/pkg/roachpb" "github.com/cockroachdb/cockroach/pkg/settings/cluster" "github.com/cockroachdb/cockroach/pkg/storage" + "github.com/cockroachdb/cockroach/pkg/storage/enginepb" "github.com/cockroachdb/cockroach/pkg/testutils" "github.com/cockroachdb/cockroach/pkg/util/hlc" "github.com/cockroachdb/cockroach/pkg/util/leaktest" "github.com/cockroachdb/cockroach/pkg/util/log" + "github.com/cockroachdb/cockroach/pkg/util/uuid" "github.com/stretchr/testify/require" ) @@ -169,3 +172,106 @@ func TestCollectIntentsUsesSameIterator(t *testing.T) { }) } } + +func TestRequestBoundLockTableView(t *testing.T) { + lockHolderTxnID := uuid.MakeV4() + keyA := roachpb.Key("a") + keyB := roachpb.Key("b") + keyC := roachpb.Key("c") + + m := newMockTxnBoundLockTableView(lockHolderTxnID) + m.addLock(keyA, lock.Shared) + m.addLock(keyB, lock.Exclusive) + + // Non-locking request. + ltView := newRequestBoundLockTableView(m, lock.None) + locked, _, err := ltView.IsKeyLockedByConflictingTxn(keyA) + require.NoError(t, err) + require.False(t, locked) + + locked, _, err = ltView.IsKeyLockedByConflictingTxn(keyB) + require.NoError(t, err) + require.False(t, locked) + + locked, _, err = ltView.IsKeyLockedByConflictingTxn(keyC) + require.NoError(t, err) + require.False(t, locked) + + // Shared locking request. + ltView = newRequestBoundLockTableView(m, lock.Shared) + locked, _, err = ltView.IsKeyLockedByConflictingTxn(keyA) + require.NoError(t, err) + require.False(t, locked) + + locked, txn, err := ltView.IsKeyLockedByConflictingTxn(keyB) + require.NoError(t, err) + require.True(t, locked) + require.Equal(t, txn.ID, lockHolderTxnID) + + locked, _, err = ltView.IsKeyLockedByConflictingTxn(keyC) + require.NoError(t, err) + require.False(t, locked) + + // Exclusive locking request. + ltView = newRequestBoundLockTableView(m, lock.Exclusive) + locked, txn, err = ltView.IsKeyLockedByConflictingTxn(keyA) + require.NoError(t, err) + require.True(t, locked) + require.Equal(t, txn.ID, lockHolderTxnID) + + locked, txn, err = ltView.IsKeyLockedByConflictingTxn(keyB) + require.NoError(t, err) + require.True(t, locked) + require.Equal(t, txn.ID, lockHolderTxnID) + + locked, _, err = ltView.IsKeyLockedByConflictingTxn(keyC) + require.NoError(t, err) + require.False(t, locked) +} + +// mockTxnBoundLockTableView is a mocked version of the txnBoundLockTableView +// interface. +type mockTxnBoundLockTableView struct { + locks map[string]lock.Strength + lockHolderTxnID uuid.UUID // txnID of all held locks +} + +var _ txnBoundLockTableView = &mockTxnBoundLockTableView{} + +// newMockTxnBoundLockTableView constructs and returns a +// mockTxnBoundLockTableView. +func newMockTxnBoundLockTableView(lockHolderTxnID uuid.UUID) *mockTxnBoundLockTableView { + return &mockTxnBoundLockTableView{ + locks: make(map[string]lock.Strength), + lockHolderTxnID: lockHolderTxnID, + } +} + +// addLock adds a lock on the supplied key with the given lock strength. The +// lock is held by m.TxnID. +func (m mockTxnBoundLockTableView) addLock(key roachpb.Key, str lock.Strength) { + m.locks[key.String()] = str +} + +// IsKeyLockedByConflictingTxn implements the txnBoundLockTableView interface. +func (m mockTxnBoundLockTableView) IsKeyLockedByConflictingTxn( + key roachpb.Key, str lock.Strength, +) (bool, *enginepb.TxnMeta, error) { + lockStr, locked := m.locks[key.String()] + if !locked { + return false, nil, nil + } + switch str { + case lock.None: + return false, nil, nil + case lock.Shared: + if lockStr == lock.Shared { + return false, nil, nil + } + return true, &enginepb.TxnMeta{ID: m.lockHolderTxnID}, nil + case lock.Exclusive: + return true, &enginepb.TxnMeta{ID: m.lockHolderTxnID}, nil + default: + panic("unknown lock strength") + } +} diff --git a/pkg/sql/logictest/testdata/logic_test/select_for_share b/pkg/sql/logictest/testdata/logic_test/select_for_share index db835a848a1c..3da421aeb4a5 100644 --- a/pkg/sql/logictest/testdata/logic_test/select_for_share +++ b/pkg/sql/logictest/testdata/logic_test/select_for_share @@ -107,12 +107,44 @@ COMMIT statement ok SET enable_shared_locking_for_serializable = true -statement error usage of shared locks in conjunction with skip locked wait policy is currently unsupported +statement ok +BEGIN + +query I +SELECT * FROM t WHERE a = 2 FOR SHARE +---- +2 + +user testuser2 + +statement ok +SET enable_shared_locking_for_serializable = true + +query TTTTTTTBB colnames,retry,rowsort +SELECT database_name, schema_name, table_name, lock_key_pretty, lock_strength, durability, isolation_level, granted, contended FROM crdb_internal.cluster_locks +---- +database_name schema_name table_name lock_key_pretty lock_strength durability isolation_level granted contended +test public t /Table/106/1/2/0 Shared Unreplicated SERIALIZABLE true false + +statement ok +BEGIN; + +query I SELECT * FROM t FOR SHARE SKIP LOCKED +---- +2 + +user root + +query TTTTTTTBB colnames,retry,rowsort +SELECT database_name, schema_name, table_name, lock_key_pretty, lock_strength, durability, isolation_level, granted, contended FROM crdb_internal.cluster_locks +---- +database_name schema_name table_name lock_key_pretty lock_strength durability isolation_level granted contended +test public t /Table/106/1/2/0 Shared Unreplicated SERIALIZABLE true false +test public t /Table/106/1/2/0 Shared Unreplicated SERIALIZABLE true false + # TODO(arul): Add a test to show that the session setting doesn't apply to read # committed transactions. We currently can't issue SELECT FOR SHARE statements # in read committed transactions because durable locking hasn't been fully # hooked up. - - diff --git a/pkg/storage/mvcc.go b/pkg/storage/mvcc.go index 45151395a575..5685830c5af7 100644 --- a/pkg/storage/mvcc.go +++ b/pkg/storage/mvcc.go @@ -1167,7 +1167,7 @@ func MVCCBlindPutInlineWithPrev( return err } -// LockTableView is a transaction-bound view into an in-memory collections of +// LockTableView is a request-bound snapshot into an in-memory collections of // key-level locks. The set of per-key locks stored in the in-memory lock table // structure overlaps with those stored in the persistent lock table keyspace // (i.e. intents produced by an MVCCKeyAndIntentsIterKind iterator), but one is @@ -1176,20 +1176,13 @@ func MVCCBlindPutInlineWithPrev( // table keyspace (i.e. replicated locks that have yet to be "discovered"). type LockTableView interface { // IsKeyLockedByConflictingTxn returns whether the specified key is locked by - // a conflicting transaction in the lockTableGuard's snapshot of the lock - // table, given the caller's own desired locking strength. If so, true is - // returned and so is the lock holder. If the lock is held by the transaction - // itself, there's no conflict to speak of, so false is returned. + // a conflicting transaction in the request's snapshot of the lock table, + // given the request's own desired locking strength. If so, true is returned + // and so is the lock holder. Otherwise, false is returned. // // This method is used by requests in conjunction with the SkipLocked wait // policy to determine which keys they should skip over during evaluation. - // - // If the supplied lock strength is locking (!= lock.None), then any queued - // locking requests that came before the lockTableGuard will also be checked - // for conflicts. This helps prevent a stream of locking SKIP LOCKED requests - // from starving out regular locking requests. In such cases, true is - // returned, but so is nil. - IsKeyLockedByConflictingTxn(roachpb.Key, lock.Strength) (bool, *enginepb.TxnMeta, error) + IsKeyLockedByConflictingTxn(roachpb.Key) (bool, *enginepb.TxnMeta, error) } // MVCCGetOptions bundles options for the MVCCGet family of functions. diff --git a/pkg/storage/mvcc_history_test.go b/pkg/storage/mvcc_history_test.go index b42dbf4e7336..a2ef9a65cfd8 100644 --- a/pkg/storage/mvcc_history_test.go +++ b/pkg/storage/mvcc_history_test.go @@ -410,9 +410,9 @@ func TestMVCCHistories(t *testing.T) { } sort.Strings(ks) for _, k := range ks { - txn := e.unreplLocks[k] + info := e.unreplLocks[k] buf.Printf("lock (%s): %v/%s -> %+v\n", - lock.Unreplicated, k, lock.Exclusive, txn) + lock.Unreplicated, k, info.str, info.txn) } } return nil @@ -1152,7 +1152,11 @@ func cmdCheckIntent(e *evalCtx) error { func cmdAddUnreplicatedLock(e *evalCtx) error { txn := e.getTxn(mandatory) key := e.getKey() - e.unreplLocks[string(key)] = &txn.TxnMeta + str := lock.Exclusive // assume exclusive locks unless told otherwise + if e.hasArg("str") { + str = e.getStrength() + } + e.unreplLocks[string(key)] = unreplicatedLockInfo{txn: &txn.TxnMeta, str: str} return nil } @@ -1481,7 +1485,7 @@ func cmdGet(e *evalCtx) error { } if e.hasArg("skipLocked") { opts.SkipLocked = true - opts.LockTable = e.newLockTableView(txn, ts) + opts.LockTable = e.newLockTableView(txn, ts, e.getStrength()) } if e.hasArg("tombstones") { opts.Tombstones = true @@ -1787,7 +1791,7 @@ func cmdScan(e *evalCtx) error { } if e.hasArg("skipLocked") { opts.SkipLocked = true - opts.LockTable = e.newLockTableView(txn, ts) + opts.LockTable = e.newLockTableView(txn, ts, e.getStrength()) } if e.hasArg("tombstones") { opts.Tombstones = true @@ -2418,7 +2422,7 @@ type evalCtx struct { td *datadriven.TestData txns map[string]*roachpb.Transaction txnCounter uint32 - unreplLocks map[string]*enginepb.TxnMeta + unreplLocks map[string]unreplicatedLockInfo ms *enginepb.MVCCStats sstWriter *storage.SSTWriter sstFile *storage.MemObject @@ -2434,7 +2438,7 @@ func newEvalCtx(ctx context.Context, engine storage.Engine) *evalCtx { st: cluster.MakeTestingClusterSettings(), engine: engine, txns: make(map[string]*roachpb.Transaction), - unreplLocks: make(map[string]*enginepb.TxnMeta), + unreplLocks: make(map[string]unreplicatedLockInfo), } } @@ -2787,32 +2791,59 @@ func (e *evalCtx) lookupTxn(txnName string) (*roachpb.Transaction, error) { } func (e *evalCtx) newLockTableView( - txn *roachpb.Transaction, ts hlc.Timestamp, + txn *roachpb.Transaction, ts hlc.Timestamp, str lock.Strength, ) storage.LockTableView { - return &mockLockTableView{unreplLocks: e.unreplLocks, txn: txn, ts: ts} + return &mockLockTableView{unreplLocks: e.unreplLocks, txn: txn, ts: ts, str: str} } // mockLockTableView is a mock implementation of LockTableView. type mockLockTableView struct { - unreplLocks map[string]*enginepb.TxnMeta + unreplLocks map[string]unreplicatedLockInfo txn *roachpb.Transaction ts hlc.Timestamp + str lock.Strength } func (lt *mockLockTableView) IsKeyLockedByConflictingTxn( - k roachpb.Key, s lock.Strength, + k roachpb.Key, ) (bool, *enginepb.TxnMeta, error) { - holder, ok := lt.unreplLocks[string(k)] + info, ok := lt.unreplLocks[string(k)] if !ok { return false, nil, nil } + holder := info.txn + heldStr := info.str if lt.txn != nil && lt.txn.ID == holder.ID { return false, nil, nil } - if s == lock.None && lt.ts.Less(holder.WriteTimestamp) { - return false, nil, nil + + switch lt.str { + case lock.None: + switch heldStr { + case lock.Shared: + return false, nil, nil + case lock.Exclusive: + if lt.ts.Less(holder.WriteTimestamp) { + return false, nil, nil + } + return true, holder, nil + default: + panic(fmt.Sprintf("unexpected held strength %s", heldStr)) + } + case lock.Shared: + switch heldStr { + case lock.Shared: + return false, nil, nil + case lock.Exclusive: + return true, holder, nil + default: + panic(fmt.Sprintf("unexpected held strength %s", heldStr)) + } + case lock.Exclusive: + return true, holder, nil + default: + panic(fmt.Sprintf("unexpected lock strength %s", lt.str)) } - return true, holder, nil } func (e *evalCtx) visitWrappedIters(fn func(it storage.SimpleMVCCIterator) (done bool)) { @@ -3003,3 +3034,10 @@ type noopCloseReader struct { } func (noopCloseReader) Close() {} + +// unreplicatedLockInfo captures information about an unreplicated lock. It +// represents an unreplicated lock when associated with a key. +type unreplicatedLockInfo struct { + txn *enginepb.TxnMeta + str lock.Strength +} diff --git a/pkg/storage/pebble_mvcc_scanner.go b/pkg/storage/pebble_mvcc_scanner.go index 91db8ba03509..810fe6ce2167 100644 --- a/pkg/storage/pebble_mvcc_scanner.go +++ b/pkg/storage/pebble_mvcc_scanner.go @@ -19,7 +19,6 @@ import ( "github.com/cockroachdb/cockroach/pkg/keys" "github.com/cockroachdb/cockroach/pkg/kv/kvpb" - "github.com/cockroachdb/cockroach/pkg/kv/kvserver/concurrency/lock" "github.com/cockroachdb/cockroach/pkg/kv/kvserver/uncertainty" "github.com/cockroachdb/cockroach/pkg/roachpb" "github.com/cockroachdb/cockroach/pkg/storage/enginepb" @@ -1805,11 +1804,7 @@ func (p *pebbleMVCCScanner) isKeyLockedByConflictingTxn( p.err = err return false, false } - strength := lock.None - if p.failOnMoreRecent { - strength = lock.Exclusive - } - ok, txn, err := p.lockTable.IsKeyLockedByConflictingTxn(key, strength) + ok, txn, err := p.lockTable.IsKeyLockedByConflictingTxn(key) if err != nil { p.err = err return false, false diff --git a/pkg/storage/testdata/mvcc_histories/skip_locked b/pkg/storage/testdata/mvcc_histories/skip_locked index b3c0591bbf3a..561e88bfecd9 100644 --- a/pkg/storage/testdata/mvcc_histories/skip_locked +++ b/pkg/storage/testdata/mvcc_histories/skip_locked @@ -2,14 +2,18 @@ # Setup: # -# k1: value @ ts 11 -# k2: value @ ts 12 -# k2: intent @ ts 13 -# k3: intent @ ts 14 -# k4: value @ ts 15 -# k4: lock @ ts 16 -# k5: value @ ts 17 -# +# k1: value @ ts 11 +# k2: value @ ts 12 +# k2: intent @ ts 13 +# k3: intent @ ts 14 +# k4: value @ ts 15 +# k4: [u] exclusive lock @ ts 16 +# k5: value @ ts 17 +# k6: value @ ts 13 +# k6: [u] shared lock @ ts 15 +# TODO(arul): In the future, we should extend the test to include: +# k7: [r] exclusive lock @ ts15 +# k8: [r] shared lock run ok txn_begin t=A ts=12,0 @@ -28,7 +32,9 @@ put k=k2 v=v3 ts=13,0 t=B put k=k3 v=v4 ts=14,0 t=C put k=k4 v=v5 ts=15,0 put k=k5 v=v6 ts=17,0 -add_unreplicated_lock k=k4 t=E +put k=k6 v=v7 ts=13,0 +add_unreplicated_lock k=k4 t=E str=exclusive +add_unreplicated_lock k=k6 t=D str=shared ---- put: lock acquisition = {k2 id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0 Replicated Intent []} put: lock acquisition = {k3 id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0 Replicated Intent []} @@ -41,11 +47,13 @@ meta: "k3"/0,0 -> txn={id=00000003 key=/Min iso=Serializable pri=0.00000000 epo= data: "k3"/14.000000000,0 -> /BYTES/v4 data: "k4"/15.000000000,0 -> /BYTES/v5 data: "k5"/17.000000000,0 -> /BYTES/v6 +data: "k6"/13.000000000,0 -> /BYTES/v7 lock (Unreplicated): k4/Exclusive -> id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0 +lock (Unreplicated): k6/Shared -> id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=15.000000000,0 min=0,0 seq=0 # Test cases: # -# for failOnMoreRecent in (true, false): +# for strength in (none, exclusive, shared): # for ts in (10, 11, 12, 13, 14, 15, 16, 17, 18): # for txn in (nil, A, B, C, D, E): # if txn != nil && txn.read_ts != ts: continue @@ -53,1143 +61,1986 @@ lock (Unreplicated): k4/Exclusive -> id=00000005 key=/Min iso=Serializable pri=0 # testCase() # +#------------------------------------------------------------------------------- +# str=none +#------------------------------------------------------------------------------- + run ok -get ts=10 k=k1 skipLocked +get ts=10 k=k1 skipLocked str=none ---- get: "k1" -> run ok -get ts=10 k=k2 skipLocked +get ts=10 k=k2 skipLocked str=none ---- get: "k2" -> run ok -get ts=10 k=k3 skipLocked +get ts=10 k=k3 skipLocked str=none ---- get: "k3" -> run ok -get ts=10 k=k4 skipLocked +get ts=10 k=k4 skipLocked str=none ---- get: "k4" -> run ok -get ts=10 k=k5 skipLocked +get ts=10 k=k5 skipLocked str=none ---- get: "k5" -> run ok -scan ts=10 k=k1 end=k6 skipLocked +get ts=10 k=k6 skipLocked str=none +---- +get: "k6" -> + +run ok +scan ts=10 k=k1 end=k9 skipLocked str=none ---- -scan: "k1"-"k6" -> +scan: "k1"-"k9" -> run ok -scan ts=10 k=k1 end=k6 reverse skipLocked +scan ts=10 k=k1 end=k9 reverse skipLocked str=none ---- -scan: "k1"-"k6" -> +scan: "k1"-"k9" -> run ok -get ts=11 k=k1 skipLocked +get ts=11 k=k1 skipLocked str=none ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=11 k=k2 skipLocked +get ts=11 k=k2 skipLocked str=none ---- get: "k2" -> run ok -get ts=11 k=k3 skipLocked +get ts=11 k=k3 skipLocked str=none ---- get: "k3" -> run ok -get ts=11 k=k4 skipLocked +get ts=11 k=k4 skipLocked str=none ---- get: "k4" -> run ok -get ts=11 k=k5 skipLocked +get ts=11 k=k5 skipLocked str=none ---- get: "k5" -> run ok -scan ts=11 k=k1 end=k6 skipLocked +get ts=11 k=k6 skipLocked str=none +---- +get: "k6" -> + +run ok +scan ts=11 k=k1 end=k9 skipLocked str=none ---- scan: "k1" -> /BYTES/v1 @11.000000000,0 run ok -scan ts=11 k=k1 end=k6 reverse skipLocked +scan ts=11 k=k1 end=k9 reverse skipLocked str=none ---- scan: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=12 k=k1 skipLocked +get ts=12 k=k1 skipLocked str=none ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=12 k=k2 skipLocked +get ts=12 k=k2 skipLocked str=none ---- get: "k2" -> /BYTES/v2 @12.000000000,0 run ok -get ts=12 k=k3 skipLocked +get ts=12 k=k3 skipLocked str=none ---- get: "k3" -> run ok -get ts=12 k=k4 skipLocked +get ts=12 k=k4 skipLocked str=none ---- get: "k4" -> run ok -get ts=12 k=k5 skipLocked +get ts=12 k=k5 skipLocked str=none ---- get: "k5" -> run ok -scan ts=12 k=k1 end=k6 skipLocked +get ts=12 k=k6 skipLocked str=none +---- +get: "k6" -> + +run ok +scan ts=12 k=k1 end=k9 skipLocked str=none ---- scan: "k1" -> /BYTES/v1 @11.000000000,0 scan: "k2" -> /BYTES/v2 @12.000000000,0 run ok -scan ts=12 k=k1 end=k6 reverse skipLocked +scan ts=12 k=k1 end=k9 reverse skipLocked str=none ---- scan: "k2" -> /BYTES/v2 @12.000000000,0 scan: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=12 t=A k=k1 skipLocked +get ts=12 t=A k=k1 skipLocked str=none ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=12 t=A k=k2 skipLocked +get ts=12 t=A k=k2 skipLocked str=none ---- get: "k2" -> /BYTES/v2 @12.000000000,0 run ok -get ts=12 t=A k=k3 skipLocked +get ts=12 t=A k=k3 skipLocked str=none ---- get: "k3" -> run ok -get ts=12 t=A k=k4 skipLocked +get ts=12 t=A k=k4 skipLocked str=none ---- get: "k4" -> run ok -get ts=12 t=A k=k5 skipLocked +get ts=12 t=A k=k5 skipLocked str=none ---- get: "k5" -> run ok -scan ts=12 t=A k=k1 end=k6 skipLocked +get ts=12 t=A k=k6 skipLocked str=none +---- +get: "k6" -> + +run ok +scan ts=12 t=A k=k1 end=k9 skipLocked str=none ---- scan: "k1" -> /BYTES/v1 @11.000000000,0 scan: "k2" -> /BYTES/v2 @12.000000000,0 run ok -scan ts=12 t=A k=k1 end=k6 reverse skipLocked +scan ts=12 t=A k=k1 end=k9 reverse skipLocked str=none ---- scan: "k2" -> /BYTES/v2 @12.000000000,0 scan: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=13 k=k1 skipLocked +get ts=13 k=k1 skipLocked str=none ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=13 k=k2 skipLocked +get ts=13 k=k2 skipLocked str=none ---- get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} get: "k2" -> run ok -get ts=13 k=k3 skipLocked +get ts=13 k=k3 skipLocked str=none ---- get: "k3" -> run ok -get ts=13 k=k4 skipLocked +get ts=13 k=k4 skipLocked str=none ---- get: "k4" -> run ok -get ts=13 k=k5 skipLocked +get ts=13 k=k5 skipLocked str=none ---- get: "k5" -> run ok -scan ts=13 k=k1 end=k6 skipLocked +get ts=13 k=k6 skipLocked str=none +---- +get: "k6" -> /BYTES/v7 @13.000000000,0 + +run ok +scan ts=13 k=k1 end=k9 skipLocked str=none ---- scan: intent "k2" {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} scan: "k1" -> /BYTES/v1 @11.000000000,0 +scan: "k6" -> /BYTES/v7 @13.000000000,0 run ok -scan ts=13 k=k1 end=k6 reverse skipLocked +scan ts=13 k=k1 end=k9 reverse skipLocked str=none ---- scan: intent "k2" {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +scan: "k6" -> /BYTES/v7 @13.000000000,0 scan: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=13 t=B k=k1 skipLocked +get ts=13 t=B k=k1 skipLocked str=none ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=13 t=B k=k2 skipLocked +get ts=13 t=B k=k2 skipLocked str=none ---- get: "k2" -> /BYTES/v3 @13.000000000,0 run ok -get ts=13 t=B k=k3 skipLocked +get ts=13 t=B k=k3 skipLocked str=none ---- get: "k3" -> run ok -get ts=13 t=B k=k4 skipLocked +get ts=13 t=B k=k4 skipLocked str=none ---- get: "k4" -> run ok -get ts=13 t=B k=k5 skipLocked +get ts=13 t=B k=k5 skipLocked str=none ---- get: "k5" -> run ok -scan ts=13 t=B k=k1 end=k6 skipLocked +get ts=13 t=B k=k6 skipLocked str=none +---- +get: "k6" -> /BYTES/v7 @13.000000000,0 + +run ok +scan ts=13 t=B k=k1 end=k9 skipLocked str=none ---- scan: "k1" -> /BYTES/v1 @11.000000000,0 scan: "k2" -> /BYTES/v3 @13.000000000,0 +scan: "k6" -> /BYTES/v7 @13.000000000,0 run ok -scan ts=13 t=B k=k1 end=k6 reverse skipLocked +scan ts=13 t=B k=k1 end=k9 reverse skipLocked str=none ---- +scan: "k6" -> /BYTES/v7 @13.000000000,0 scan: "k2" -> /BYTES/v3 @13.000000000,0 scan: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=14 k=k1 skipLocked +get ts=14 k=k1 skipLocked str=none ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=14 k=k2 skipLocked +get ts=14 k=k2 skipLocked str=none ---- get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} get: "k2" -> run ok -get ts=14 k=k3 skipLocked +get ts=14 k=k3 skipLocked str=none ---- get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} get: "k3" -> run ok -get ts=14 k=k4 skipLocked +get ts=14 k=k4 skipLocked str=none ---- get: "k4" -> run ok -get ts=14 k=k5 skipLocked +get ts=14 k=k5 skipLocked str=none ---- get: "k5" -> run ok -scan ts=14 k=k1 end=k6 skipLocked +get ts=14 k=k6 skipLocked str=none +---- +get: "k6" -> /BYTES/v7 @13.000000000,0 + +run ok +scan ts=14 k=k1 end=k9 skipLocked str=none ---- scan: intent "k2" {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} scan: intent "k3" {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} scan: "k1" -> /BYTES/v1 @11.000000000,0 +scan: "k6" -> /BYTES/v7 @13.000000000,0 run ok -scan ts=14 k=k1 end=k6 reverse skipLocked +scan ts=14 k=k1 end=k9 reverse skipLocked str=none ---- scan: intent "k3" {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} scan: intent "k2" {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +scan: "k6" -> /BYTES/v7 @13.000000000,0 scan: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=14 t=C k=k1 skipLocked +get ts=14 t=C k=k1 skipLocked str=none ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=14 t=C k=k2 skipLocked +get ts=14 t=C k=k2 skipLocked str=none ---- get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} get: "k2" -> run ok -get ts=14 t=C k=k3 skipLocked +get ts=14 t=C k=k3 skipLocked str=none ---- get: "k3" -> /BYTES/v4 @14.000000000,0 run ok -get ts=14 t=C k=k4 skipLocked +get ts=14 t=C k=k4 skipLocked str=none ---- get: "k4" -> run ok -get ts=14 t=C k=k5 skipLocked +get ts=14 t=C k=k5 skipLocked str=none ---- get: "k5" -> run ok -scan ts=14 t=C k=k1 end=k6 skipLocked +get ts=14 t=C k=k6 skipLocked str=none +---- +get: "k6" -> /BYTES/v7 @13.000000000,0 + +run ok +scan ts=14 t=C k=k1 end=k9 skipLocked str=none ---- scan: intent "k2" {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} scan: "k1" -> /BYTES/v1 @11.000000000,0 scan: "k3" -> /BYTES/v4 @14.000000000,0 +scan: "k6" -> /BYTES/v7 @13.000000000,0 run ok -scan ts=14 t=C k=k1 end=k6 reverse skipLocked +scan ts=14 t=C k=k1 end=k9 reverse skipLocked str=none ---- scan: intent "k2" {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +scan: "k6" -> /BYTES/v7 @13.000000000,0 scan: "k3" -> /BYTES/v4 @14.000000000,0 scan: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=15 k=k1 skipLocked +get ts=15 k=k1 skipLocked str=none ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=15 k=k2 skipLocked +get ts=15 k=k2 skipLocked str=none ---- get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} get: "k2" -> run ok -get ts=15 k=k3 skipLocked +get ts=15 k=k3 skipLocked str=none ---- get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} get: "k3" -> run ok -get ts=15 k=k4 skipLocked +get ts=15 k=k4 skipLocked str=none ---- get: "k4" -> /BYTES/v5 @15.000000000,0 run ok -get ts=15 k=k5 skipLocked +get ts=15 k=k5 skipLocked str=none ---- get: "k5" -> run ok -scan ts=15 k=k1 end=k6 skipLocked +get ts=15 k=k6 skipLocked str=none +---- +get: "k6" -> /BYTES/v7 @13.000000000,0 + +run ok +scan ts=15 k=k1 end=k9 skipLocked str=none ---- scan: intent "k2" {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} scan: intent "k3" {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} scan: "k1" -> /BYTES/v1 @11.000000000,0 scan: "k4" -> /BYTES/v5 @15.000000000,0 +scan: "k6" -> /BYTES/v7 @13.000000000,0 run ok -scan ts=15 k=k1 end=k6 reverse skipLocked +scan ts=15 k=k1 end=k9 reverse skipLocked str=none ---- scan: intent "k3" {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} scan: intent "k2" {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +scan: "k6" -> /BYTES/v7 @13.000000000,0 scan: "k4" -> /BYTES/v5 @15.000000000,0 scan: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=15 t=D k=k1 skipLocked +get ts=15 t=D k=k1 skipLocked str=none ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=15 t=D k=k2 skipLocked +get ts=15 t=D k=k2 skipLocked str=none ---- get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} get: "k2" -> run ok -get ts=15 t=D k=k3 skipLocked +get ts=15 t=D k=k3 skipLocked str=none ---- get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} get: "k3" -> run ok -get ts=15 t=D k=k4 skipLocked +get ts=15 t=D k=k4 skipLocked str=none ---- get: "k4" -> /BYTES/v5 @15.000000000,0 run ok -get ts=15 t=D k=k5 skipLocked +get ts=15 t=D k=k5 skipLocked str=none ---- get: "k5" -> run ok -scan ts=15 t=D k=k1 end=k6 skipLocked +get ts=15 t=D k=k6 skipLocked str=none +---- +get: "k6" -> /BYTES/v7 @13.000000000,0 + +run ok +scan ts=15 t=D k=k1 end=k9 skipLocked str=none ---- scan: intent "k2" {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} scan: intent "k3" {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} scan: "k1" -> /BYTES/v1 @11.000000000,0 scan: "k4" -> /BYTES/v5 @15.000000000,0 +scan: "k6" -> /BYTES/v7 @13.000000000,0 run ok -scan ts=15 t=D k=k1 end=k6 reverse skipLocked +scan ts=15 t=D k=k1 end=k9 reverse skipLocked str=none ---- scan: intent "k3" {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} scan: intent "k2" {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +scan: "k6" -> /BYTES/v7 @13.000000000,0 scan: "k4" -> /BYTES/v5 @15.000000000,0 scan: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=16 k=k1 skipLocked +get ts=16 k=k1 skipLocked str=none ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=16 k=k2 skipLocked +get ts=16 k=k2 skipLocked str=none ---- get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} get: "k2" -> run ok -get ts=16 k=k3 skipLocked +get ts=16 k=k3 skipLocked str=none ---- get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} get: "k3" -> run ok -get ts=16 k=k4 skipLocked +get ts=16 k=k4 skipLocked str=none ---- get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} get: "k4" -> run ok -get ts=16 k=k5 skipLocked +get ts=16 k=k5 skipLocked str=none ---- get: "k5" -> run ok -scan ts=16 k=k1 end=k6 skipLocked +get ts=16 k=k6 skipLocked str=none +---- +get: "k6" -> /BYTES/v7 @13.000000000,0 + +run ok +scan ts=16 k=k1 end=k9 skipLocked str=none ---- scan: intent "k2" {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} scan: intent "k3" {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} scan: intent "k4" {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} scan: "k1" -> /BYTES/v1 @11.000000000,0 +scan: "k6" -> /BYTES/v7 @13.000000000,0 run ok -scan ts=16 k=k1 end=k6 reverse skipLocked +scan ts=16 k=k1 end=k9 reverse skipLocked str=none ---- scan: intent "k4" {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} scan: intent "k3" {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} scan: intent "k2" {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +scan: "k6" -> /BYTES/v7 @13.000000000,0 scan: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=16 t=E k=k1 skipLocked +get ts=16 t=E k=k1 skipLocked str=none ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=16 t=E k=k2 skipLocked +get ts=16 t=E k=k2 skipLocked str=none ---- get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} get: "k2" -> run ok -get ts=16 t=E k=k3 skipLocked +get ts=16 t=E k=k3 skipLocked str=none ---- get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} get: "k3" -> run ok -get ts=16 t=E k=k4 skipLocked +get ts=16 t=E k=k4 skipLocked str=none ---- get: "k4" -> /BYTES/v5 @15.000000000,0 run ok -get ts=16 t=E k=k5 skipLocked +get ts=16 t=E k=k5 skipLocked str=none ---- get: "k5" -> run ok -scan ts=16 t=E k=k1 end=k6 skipLocked +get ts=16 t=E k=k6 skipLocked str=none +---- +get: "k6" -> /BYTES/v7 @13.000000000,0 + +run ok +scan ts=16 t=E k=k1 end=k9 skipLocked str=none ---- scan: intent "k2" {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} scan: intent "k3" {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} scan: "k1" -> /BYTES/v1 @11.000000000,0 scan: "k4" -> /BYTES/v5 @15.000000000,0 +scan: "k6" -> /BYTES/v7 @13.000000000,0 run ok -scan ts=16 t=E k=k1 end=k6 reverse skipLocked +scan ts=16 t=E k=k1 end=k9 reverse skipLocked str=none ---- scan: intent "k3" {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} scan: intent "k2" {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +scan: "k6" -> /BYTES/v7 @13.000000000,0 scan: "k4" -> /BYTES/v5 @15.000000000,0 scan: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=17 k=k1 skipLocked +get ts=17 k=k1 skipLocked str=none ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=17 k=k2 skipLocked +get ts=17 k=k2 skipLocked str=none ---- get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} get: "k2" -> run ok -get ts=17 k=k3 skipLocked +get ts=17 k=k3 skipLocked str=none ---- get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} get: "k3" -> run ok -get ts=17 k=k4 skipLocked +get ts=17 k=k4 skipLocked str=none ---- get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} get: "k4" -> run ok -get ts=17 k=k5 skipLocked +get ts=17 k=k5 skipLocked str=none ---- get: "k5" -> /BYTES/v6 @17.000000000,0 run ok -scan ts=17 k=k1 end=k6 skipLocked +get ts=17 k=k6 skipLocked str=none +---- +get: "k6" -> /BYTES/v7 @13.000000000,0 + +run ok +scan ts=17 k=k1 end=k9 skipLocked str=none ---- scan: intent "k2" {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} scan: intent "k3" {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} scan: intent "k4" {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} scan: "k1" -> /BYTES/v1 @11.000000000,0 scan: "k5" -> /BYTES/v6 @17.000000000,0 +scan: "k6" -> /BYTES/v7 @13.000000000,0 run ok -scan ts=17 k=k1 end=k6 reverse skipLocked +scan ts=17 k=k1 end=k9 reverse skipLocked str=none ---- scan: intent "k4" {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} scan: intent "k3" {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} scan: intent "k2" {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +scan: "k6" -> /BYTES/v7 @13.000000000,0 scan: "k5" -> /BYTES/v6 @17.000000000,0 scan: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=18 k=k1 skipLocked +get ts=18 k=k1 skipLocked str=none ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=18 k=k2 skipLocked +get ts=18 k=k2 skipLocked str=none ---- get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} get: "k2" -> run ok -get ts=18 k=k3 skipLocked +get ts=18 k=k3 skipLocked str=none ---- get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} get: "k3" -> run ok -get ts=18 k=k4 skipLocked +get ts=18 k=k4 skipLocked str=none ---- get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} get: "k4" -> run ok -get ts=18 k=k5 skipLocked +get ts=18 k=k5 skipLocked str=none ---- get: "k5" -> /BYTES/v6 @17.000000000,0 run ok -scan ts=18 k=k1 end=k6 skipLocked +get ts=18 k=k6 skipLocked str=none +---- +get: "k6" -> /BYTES/v7 @13.000000000,0 + +run ok +scan ts=18 k=k1 end=k9 skipLocked str=none ---- scan: intent "k2" {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} scan: intent "k3" {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} scan: intent "k4" {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} scan: "k1" -> /BYTES/v1 @11.000000000,0 scan: "k5" -> /BYTES/v6 @17.000000000,0 +scan: "k6" -> /BYTES/v7 @13.000000000,0 run ok -scan ts=18 k=k1 end=k6 reverse skipLocked +scan ts=18 k=k1 end=k9 reverse skipLocked str=none ---- scan: intent "k4" {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} scan: intent "k3" {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} scan: intent "k2" {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +scan: "k6" -> /BYTES/v7 @13.000000000,0 scan: "k5" -> /BYTES/v6 @17.000000000,0 scan: "k1" -> /BYTES/v1 @11.000000000,0 +#------------------------------------------------------------------------------- +# str=shared +#------------------------------------------------------------------------------- + run error -get ts=10 k=k1 skipLocked failOnMoreRecent +get ts=10 k=k1 skipLocked failOnMoreRecent str=shared ---- get: "k1" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k1" at timestamp 10.000000000,0 too old; must write at or above 11.000000000,1 run ok -get ts=10 k=k2 skipLocked failOnMoreRecent +get ts=10 k=k2 skipLocked failOnMoreRecent str=shared ---- get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} get: "k2" -> run ok -get ts=10 k=k3 skipLocked failOnMoreRecent +get ts=10 k=k3 skipLocked failOnMoreRecent str=shared ---- get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} get: "k3" -> run ok -get ts=10 k=k4 skipLocked failOnMoreRecent +get ts=10 k=k4 skipLocked failOnMoreRecent str=shared ---- get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} get: "k4" -> run error -get ts=10 k=k5 skipLocked failOnMoreRecent +get ts=10 k=k5 skipLocked failOnMoreRecent str=shared ---- get: "k5" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 10.000000000,0 too old; must write at or above 17.000000000,1 run error -scan ts=10 k=k1 end=k6 skipLocked failOnMoreRecent +get ts=10 k=k6 skipLocked failOnMoreRecent str=shared +---- +get: "k6" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k6" at timestamp 10.000000000,0 too old; must write at or above 13.000000000,1 + +run error +scan ts=10 k=k1 end=k9 skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> +scan: "k1"-"k9" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k1" at timestamp 10.000000000,0 too old; must write at or above 17.000000000,1 run error -scan ts=10 k=k1 end=k6 reverse skipLocked failOnMoreRecent +scan ts=10 k=k1 end=k9 reverse skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> -error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 10.000000000,0 too old; must write at or above 17.000000000,1 +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k6" at timestamp 10.000000000,0 too old; must write at or above 17.000000000,1 run error -get ts=11 k=k1 skipLocked failOnMoreRecent +get ts=11 k=k1 skipLocked failOnMoreRecent str=shared ---- get: "k1" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k1" at timestamp 11.000000000,0 too old; must write at or above 11.000000000,1 run ok -get ts=11 k=k2 skipLocked failOnMoreRecent +get ts=11 k=k2 skipLocked failOnMoreRecent str=shared ---- get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} get: "k2" -> run ok -get ts=11 k=k3 skipLocked failOnMoreRecent +get ts=11 k=k3 skipLocked failOnMoreRecent str=shared ---- get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} get: "k3" -> run ok -get ts=11 k=k4 skipLocked failOnMoreRecent +get ts=11 k=k4 skipLocked failOnMoreRecent str=shared ---- get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} get: "k4" -> run error -get ts=11 k=k5 skipLocked failOnMoreRecent +get ts=11 k=k5 skipLocked failOnMoreRecent str=shared ---- get: "k5" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 11.000000000,0 too old; must write at or above 17.000000000,1 run error -scan ts=11 k=k1 end=k6 skipLocked failOnMoreRecent +get ts=11 k=k6 skipLocked failOnMoreRecent str=shared +---- +get: "k6" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k6" at timestamp 11.000000000,0 too old; must write at or above 13.000000000,1 + +run error +scan ts=11 k=k1 end=k9 skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> +scan: "k1"-"k9" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k1" at timestamp 11.000000000,0 too old; must write at or above 17.000000000,1 run error -scan ts=11 k=k1 end=k6 reverse skipLocked failOnMoreRecent +scan ts=11 k=k1 end=k9 reverse skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> -error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 11.000000000,0 too old; must write at or above 17.000000000,1 +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k6" at timestamp 11.000000000,0 too old; must write at or above 17.000000000,1 run ok -get ts=12 k=k1 skipLocked failOnMoreRecent +get ts=12 k=k1 skipLocked failOnMoreRecent str=shared ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=12 k=k2 skipLocked failOnMoreRecent +get ts=12 k=k2 skipLocked failOnMoreRecent str=shared ---- get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} get: "k2" -> run ok -get ts=12 k=k3 skipLocked failOnMoreRecent +get ts=12 k=k3 skipLocked failOnMoreRecent str=shared ---- get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} get: "k3" -> run ok -get ts=12 k=k4 skipLocked failOnMoreRecent +get ts=12 k=k4 skipLocked failOnMoreRecent str=shared ---- get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} get: "k4" -> run error -get ts=12 k=k5 skipLocked failOnMoreRecent +get ts=12 k=k5 skipLocked failOnMoreRecent str=shared ---- get: "k5" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 12.000000000,0 too old; must write at or above 17.000000000,1 run error -scan ts=12 k=k1 end=k6 skipLocked failOnMoreRecent +get ts=12 k=k6 skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> -error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 12.000000000,0 too old; must write at or above 17.000000000,1 +get: "k6" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k6" at timestamp 12.000000000,0 too old; must write at or above 13.000000000,1 run error -scan ts=12 k=k1 end=k6 reverse skipLocked failOnMoreRecent +scan ts=12 k=k1 end=k9 skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> +scan: "k1"-"k9" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 12.000000000,0 too old; must write at or above 17.000000000,1 +run error +scan ts=12 k=k1 end=k9 reverse skipLocked failOnMoreRecent str=shared +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k6" at timestamp 12.000000000,0 too old; must write at or above 17.000000000,1 + run ok -get ts=12 t=A k=k1 skipLocked failOnMoreRecent +get ts=12 t=A k=k1 skipLocked failOnMoreRecent str=shared ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=12 t=A k=k2 skipLocked failOnMoreRecent +get ts=12 t=A k=k2 skipLocked failOnMoreRecent str=shared ---- get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} get: "k2" -> run ok -get ts=12 t=A k=k3 skipLocked failOnMoreRecent +get ts=12 t=A k=k3 skipLocked failOnMoreRecent str=shared ---- get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} get: "k3" -> run ok -get ts=12 t=A k=k4 skipLocked failOnMoreRecent +get ts=12 t=A k=k4 skipLocked failOnMoreRecent str=shared ---- get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} get: "k4" -> run error -get ts=12 t=A k=k5 skipLocked failOnMoreRecent +get ts=12 t=A k=k5 skipLocked failOnMoreRecent str=shared ---- get: "k5" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 12.000000000,0 too old; must write at or above 17.000000000,1 run error -scan ts=12 t=A k=k1 end=k6 skipLocked failOnMoreRecent +get ts=12 t=A k=k6 skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> -error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 12.000000000,0 too old; must write at or above 17.000000000,1 +get: "k6" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k6" at timestamp 12.000000000,0 too old; must write at or above 13.000000000,1 run error -scan ts=12 t=A k=k1 end=k6 reverse skipLocked failOnMoreRecent +scan ts=12 t=A k=k1 end=k9 skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> +scan: "k1"-"k9" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 12.000000000,0 too old; must write at or above 17.000000000,1 +run error +scan ts=12 t=A k=k1 end=k9 reverse skipLocked failOnMoreRecent str=shared +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k6" at timestamp 12.000000000,0 too old; must write at or above 17.000000000,1 + run ok -get ts=13 k=k1 skipLocked failOnMoreRecent +get ts=13 k=k1 skipLocked failOnMoreRecent str=shared ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=13 k=k2 skipLocked failOnMoreRecent +get ts=13 k=k2 skipLocked failOnMoreRecent str=shared ---- get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} get: "k2" -> run ok -get ts=13 k=k3 skipLocked failOnMoreRecent +get ts=13 k=k3 skipLocked failOnMoreRecent str=shared ---- get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} get: "k3" -> run ok -get ts=13 k=k4 skipLocked failOnMoreRecent +get ts=13 k=k4 skipLocked failOnMoreRecent str=shared ---- get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} get: "k4" -> run error -get ts=13 k=k5 skipLocked failOnMoreRecent +get ts=13 k=k5 skipLocked failOnMoreRecent str=shared ---- get: "k5" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 13.000000000,0 too old; must write at or above 17.000000000,1 run error -scan ts=13 k=k1 end=k6 skipLocked failOnMoreRecent +get ts=13 k=k6 skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> -error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 13.000000000,0 too old; must write at or above 17.000000000,1 +get: "k6" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k6" at timestamp 13.000000000,0 too old; must write at or above 13.000000000,1 run error -scan ts=13 k=k1 end=k6 reverse skipLocked failOnMoreRecent +scan ts=13 k=k1 end=k9 skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> +scan: "k1"-"k9" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 13.000000000,0 too old; must write at or above 17.000000000,1 +run error +scan ts=13 k=k1 end=k9 reverse skipLocked failOnMoreRecent str=shared +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k6" at timestamp 13.000000000,0 too old; must write at or above 17.000000000,1 + run ok -get ts=13 t=B k=k1 skipLocked failOnMoreRecent +get ts=13 t=B k=k1 skipLocked failOnMoreRecent str=shared ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=13 t=B k=k2 skipLocked failOnMoreRecent +get ts=13 t=B k=k2 skipLocked failOnMoreRecent str=shared ---- get: "k2" -> /BYTES/v3 @13.000000000,0 run ok -get ts=13 t=B k=k3 skipLocked failOnMoreRecent +get ts=13 t=B k=k3 skipLocked failOnMoreRecent str=shared ---- get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} get: "k3" -> run ok -get ts=13 t=B k=k4 skipLocked failOnMoreRecent +get ts=13 t=B k=k4 skipLocked failOnMoreRecent str=shared ---- get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} get: "k4" -> run error -get ts=13 t=B k=k5 skipLocked failOnMoreRecent +get ts=13 t=B k=k5 skipLocked failOnMoreRecent str=shared ---- get: "k5" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 13.000000000,0 too old; must write at or above 17.000000000,1 run error -scan ts=13 t=B k=k1 end=k6 skipLocked failOnMoreRecent +get ts=13 t=B k=k6 skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> -error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 13.000000000,0 too old; must write at or above 17.000000000,1 +get: "k6" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k6" at timestamp 13.000000000,0 too old; must write at or above 13.000000000,1 run error -scan ts=13 t=B k=k1 end=k6 reverse skipLocked failOnMoreRecent +scan ts=13 t=B k=k1 end=k9 skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> +scan: "k1"-"k9" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 13.000000000,0 too old; must write at or above 17.000000000,1 +run error +scan ts=13 t=B k=k1 end=k9 reverse skipLocked failOnMoreRecent str=shared +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k6" at timestamp 13.000000000,0 too old; must write at or above 17.000000000,1 + run ok -get ts=14 k=k1 skipLocked failOnMoreRecent +get ts=14 k=k1 skipLocked failOnMoreRecent str=shared ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=14 k=k2 skipLocked failOnMoreRecent +get ts=14 k=k2 skipLocked failOnMoreRecent str=shared ---- get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} get: "k2" -> run ok -get ts=14 k=k3 skipLocked failOnMoreRecent +get ts=14 k=k3 skipLocked failOnMoreRecent str=shared ---- get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} get: "k3" -> run ok -get ts=14 k=k4 skipLocked failOnMoreRecent +get ts=14 k=k4 skipLocked failOnMoreRecent str=shared ---- get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} get: "k4" -> run error -get ts=14 k=k5 skipLocked failOnMoreRecent +get ts=14 k=k5 skipLocked failOnMoreRecent str=shared ---- get: "k5" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 14.000000000,0 too old; must write at or above 17.000000000,1 +run ok +get ts=14 k=k6 skipLocked failOnMoreRecent str=shared +---- +get: "k6" -> /BYTES/v7 @13.000000000,0 + run error -scan ts=14 k=k1 end=k6 skipLocked failOnMoreRecent +scan ts=14 k=k1 end=k9 skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> +scan: "k1"-"k9" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 14.000000000,0 too old; must write at or above 17.000000000,1 run error -scan ts=14 k=k1 end=k6 reverse skipLocked failOnMoreRecent +scan ts=14 k=k1 end=k9 reverse skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> +scan: "k1"-"k9" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 14.000000000,0 too old; must write at or above 17.000000000,1 run ok -get ts=14 t=C k=k1 skipLocked failOnMoreRecent +get ts=14 t=C k=k1 skipLocked failOnMoreRecent str=shared ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=14 t=C k=k2 skipLocked failOnMoreRecent +get ts=14 t=C k=k2 skipLocked failOnMoreRecent str=shared ---- get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} get: "k2" -> run ok -get ts=14 t=C k=k3 skipLocked failOnMoreRecent +get ts=14 t=C k=k3 skipLocked failOnMoreRecent str=shared ---- get: "k3" -> /BYTES/v4 @14.000000000,0 run ok -get ts=14 t=C k=k4 skipLocked failOnMoreRecent +get ts=14 t=C k=k4 skipLocked failOnMoreRecent str=shared ---- get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} get: "k4" -> run error -get ts=14 t=C k=k5 skipLocked failOnMoreRecent +get ts=14 t=C k=k5 skipLocked failOnMoreRecent str=shared ---- get: "k5" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 14.000000000,0 too old; must write at or above 17.000000000,1 +run ok +get ts=14 t=C k=k6 skipLocked failOnMoreRecent str=shared +---- +get: "k6" -> /BYTES/v7 @13.000000000,0 + run error -scan ts=14 t=C k=k1 end=k6 skipLocked failOnMoreRecent +scan ts=14 t=C k=k1 end=k9 skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> +scan: "k1"-"k9" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 14.000000000,0 too old; must write at or above 17.000000000,1 run error -scan ts=14 t=C k=k1 end=k6 reverse skipLocked failOnMoreRecent +scan ts=14 t=C k=k1 end=k9 reverse skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> +scan: "k1"-"k9" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 14.000000000,0 too old; must write at or above 17.000000000,1 run ok -get ts=15 k=k1 skipLocked failOnMoreRecent +get ts=15 k=k1 skipLocked failOnMoreRecent str=shared ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=15 k=k2 skipLocked failOnMoreRecent +get ts=15 k=k2 skipLocked failOnMoreRecent str=shared ---- get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} get: "k2" -> run ok -get ts=15 k=k3 skipLocked failOnMoreRecent +get ts=15 k=k3 skipLocked failOnMoreRecent str=shared ---- get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} get: "k3" -> run ok -get ts=15 k=k4 skipLocked failOnMoreRecent +get ts=15 k=k4 skipLocked failOnMoreRecent str=shared ---- get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} get: "k4" -> run error -get ts=15 k=k5 skipLocked failOnMoreRecent +get ts=15 k=k5 skipLocked failOnMoreRecent str=shared ---- get: "k5" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 15.000000000,0 too old; must write at or above 17.000000000,1 +run ok +get ts=15 k=k6 skipLocked failOnMoreRecent str=shared +---- +get: "k6" -> /BYTES/v7 @13.000000000,0 + run error -scan ts=15 k=k1 end=k6 skipLocked failOnMoreRecent +scan ts=15 k=k1 end=k9 skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> +scan: "k1"-"k9" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 15.000000000,0 too old; must write at or above 17.000000000,1 run error -scan ts=15 k=k1 end=k6 reverse skipLocked failOnMoreRecent +scan ts=15 k=k1 end=k9 reverse skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> +scan: "k1"-"k9" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 15.000000000,0 too old; must write at or above 17.000000000,1 run ok -get ts=15 t=D k=k1 skipLocked failOnMoreRecent +get ts=15 t=D k=k1 skipLocked failOnMoreRecent str=shared ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=15 t=D k=k2 skipLocked failOnMoreRecent +get ts=15 t=D k=k2 skipLocked failOnMoreRecent str=shared ---- get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} get: "k2" -> run ok -get ts=15 t=D k=k3 skipLocked failOnMoreRecent +get ts=15 t=D k=k3 skipLocked failOnMoreRecent str=shared ---- get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} get: "k3" -> run ok -get ts=15 t=D k=k4 skipLocked failOnMoreRecent +get ts=15 t=D k=k4 skipLocked failOnMoreRecent str=shared ---- get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} get: "k4" -> run error -get ts=15 t=D k=k5 skipLocked failOnMoreRecent +get ts=15 t=D k=k5 skipLocked failOnMoreRecent str=shared ---- get: "k5" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 15.000000000,0 too old; must write at or above 17.000000000,1 +run ok +get ts=15 t=D k=k6 skipLocked failOnMoreRecent str=shared +---- +get: "k6" -> /BYTES/v7 @13.000000000,0 + run error -scan ts=15 t=D k=k1 end=k6 skipLocked failOnMoreRecent +scan ts=15 t=D k=k1 end=k9 skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> +scan: "k1"-"k9" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 15.000000000,0 too old; must write at or above 17.000000000,1 run error -scan ts=15 t=D k=k1 end=k6 reverse skipLocked failOnMoreRecent +scan ts=15 t=D k=k1 end=k9 reverse skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> +scan: "k1"-"k9" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 15.000000000,0 too old; must write at or above 17.000000000,1 run ok -get ts=16 k=k1 skipLocked failOnMoreRecent +get ts=16 k=k1 skipLocked failOnMoreRecent str=shared ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=16 k=k2 skipLocked failOnMoreRecent +get ts=16 k=k2 skipLocked failOnMoreRecent str=shared ---- get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} get: "k2" -> run ok -get ts=16 k=k3 skipLocked failOnMoreRecent +get ts=16 k=k3 skipLocked failOnMoreRecent str=shared ---- get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} get: "k3" -> run ok -get ts=16 k=k4 skipLocked failOnMoreRecent +get ts=16 k=k4 skipLocked failOnMoreRecent str=shared ---- get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} get: "k4" -> run error -get ts=16 k=k5 skipLocked failOnMoreRecent +get ts=16 k=k5 skipLocked failOnMoreRecent str=shared ---- get: "k5" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 16.000000000,0 too old; must write at or above 17.000000000,1 +run ok +get ts=16 k=k6 skipLocked failOnMoreRecent str=shared +---- +get: "k6" -> /BYTES/v7 @13.000000000,0 + run error -scan ts=16 k=k1 end=k6 skipLocked failOnMoreRecent +scan ts=16 k=k1 end=k9 skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> +scan: "k1"-"k9" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 16.000000000,0 too old; must write at or above 17.000000000,1 run error -scan ts=16 k=k1 end=k6 reverse skipLocked failOnMoreRecent +scan ts=16 k=k1 end=k9 reverse skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> +scan: "k1"-"k9" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 16.000000000,0 too old; must write at or above 17.000000000,1 run ok -get ts=16 t=E k=k1 skipLocked failOnMoreRecent +get ts=16 t=E k=k1 skipLocked failOnMoreRecent str=shared ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=16 t=E k=k2 skipLocked failOnMoreRecent +get ts=16 t=E k=k2 skipLocked failOnMoreRecent str=shared ---- get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} get: "k2" -> run ok -get ts=16 t=E k=k3 skipLocked failOnMoreRecent +get ts=16 t=E k=k3 skipLocked failOnMoreRecent str=shared ---- get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} get: "k3" -> run ok -get ts=16 t=E k=k4 skipLocked failOnMoreRecent +get ts=16 t=E k=k4 skipLocked failOnMoreRecent str=shared ---- get: "k4" -> /BYTES/v5 @15.000000000,0 run error -get ts=16 t=E k=k5 skipLocked failOnMoreRecent +get ts=16 t=E k=k5 skipLocked failOnMoreRecent str=shared ---- get: "k5" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 16.000000000,0 too old; must write at or above 17.000000000,1 +run ok +get ts=16 t=E k=k6 skipLocked failOnMoreRecent str=shared +---- +get: "k6" -> /BYTES/v7 @13.000000000,0 + run error -scan ts=16 t=E k=k1 end=k6 skipLocked failOnMoreRecent +scan ts=16 t=E k=k1 end=k9 skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> +scan: "k1"-"k9" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 16.000000000,0 too old; must write at or above 17.000000000,1 run error -scan ts=16 t=E k=k1 end=k6 reverse skipLocked failOnMoreRecent +scan ts=16 t=E k=k1 end=k9 reverse skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> +scan: "k1"-"k9" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 16.000000000,0 too old; must write at or above 17.000000000,1 run ok -get ts=17 k=k1 skipLocked failOnMoreRecent +get ts=17 k=k1 skipLocked failOnMoreRecent str=shared ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=17 k=k2 skipLocked failOnMoreRecent +get ts=17 k=k2 skipLocked failOnMoreRecent str=shared ---- get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} get: "k2" -> run ok -get ts=17 k=k3 skipLocked failOnMoreRecent +get ts=17 k=k3 skipLocked failOnMoreRecent str=shared ---- get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} get: "k3" -> run ok -get ts=17 k=k4 skipLocked failOnMoreRecent +get ts=17 k=k4 skipLocked failOnMoreRecent str=shared ---- get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} get: "k4" -> run error -get ts=17 k=k5 skipLocked failOnMoreRecent +get ts=17 k=k5 skipLocked failOnMoreRecent str=shared ---- get: "k5" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 17.000000000,0 too old; must write at or above 17.000000000,1 +run ok +get ts=17 k=k6 skipLocked failOnMoreRecent str=shared +---- +get: "k6" -> /BYTES/v7 @13.000000000,0 + run error -scan ts=17 k=k1 end=k6 skipLocked failOnMoreRecent +scan ts=17 k=k1 end=k9 skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> +scan: "k1"-"k9" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 17.000000000,0 too old; must write at or above 17.000000000,1 run error -scan ts=17 k=k1 end=k6 reverse skipLocked failOnMoreRecent +scan ts=17 k=k1 end=k9 reverse skipLocked failOnMoreRecent str=shared ---- -scan: "k1"-"k6" -> +scan: "k1"-"k9" -> error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 17.000000000,0 too old; must write at or above 17.000000000,1 run ok -get ts=18 k=k1 skipLocked failOnMoreRecent +get ts=18 k=k1 skipLocked failOnMoreRecent str=shared ---- get: "k1" -> /BYTES/v1 @11.000000000,0 run ok -get ts=18 k=k2 skipLocked failOnMoreRecent +get ts=18 k=k2 skipLocked failOnMoreRecent str=shared ---- get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} get: "k2" -> run ok -get ts=18 k=k3 skipLocked failOnMoreRecent +get ts=18 k=k3 skipLocked failOnMoreRecent str=shared ---- get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} get: "k3" -> run ok -get ts=18 k=k4 skipLocked failOnMoreRecent +get ts=18 k=k4 skipLocked failOnMoreRecent str=shared ---- get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} get: "k4" -> run ok -get ts=18 k=k5 skipLocked failOnMoreRecent +get ts=18 k=k5 skipLocked failOnMoreRecent str=shared ---- get: "k5" -> /BYTES/v6 @17.000000000,0 run ok -scan ts=18 k=k1 end=k6 skipLocked failOnMoreRecent +get ts=18 k=k6 skipLocked failOnMoreRecent str=shared +---- +get: "k6" -> /BYTES/v7 @13.000000000,0 + +run ok +scan ts=18 k=k1 end=k9 skipLocked failOnMoreRecent str=shared +---- +scan: intent "k2" {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +scan: intent "k3" {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} +scan: intent "k4" {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} +scan: "k1" -> /BYTES/v1 @11.000000000,0 +scan: "k5" -> /BYTES/v6 @17.000000000,0 +scan: "k6" -> /BYTES/v7 @13.000000000,0 + +run ok +scan ts=18 k=k1 end=k9 reverse skipLocked failOnMoreRecent str=shared +---- +scan: intent "k4" {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} +scan: intent "k3" {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} +scan: intent "k2" {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +scan: "k6" -> /BYTES/v7 @13.000000000,0 +scan: "k5" -> /BYTES/v6 @17.000000000,0 +scan: "k1" -> /BYTES/v1 @11.000000000,0 + +#------------------------------------------------------------------------------- +# str=exclusive +#------------------------------------------------------------------------------- + +run error +get ts=10 k=k1 skipLocked failOnMoreRecent str=exclusive +---- +get: "k1" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k1" at timestamp 10.000000000,0 too old; must write at or above 11.000000000,1 + +run ok +get ts=10 k=k2 skipLocked failOnMoreRecent str=exclusive +---- +get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +get: "k2" -> + +run ok +get ts=10 k=k3 skipLocked failOnMoreRecent str=exclusive +---- +get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} +get: "k3" -> + +run ok +get ts=10 k=k4 skipLocked failOnMoreRecent str=exclusive +---- +get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} +get: "k4" -> + +run error +get ts=10 k=k5 skipLocked failOnMoreRecent str=exclusive +---- +get: "k5" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 10.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=10 k=k6 skipLocked failOnMoreRecent str=exclusive +---- +get: "k6" -> intent {id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=15.000000000,0 min=0,0 seq=0} +get: "k6" -> + +run error +scan ts=10 k=k1 end=k9 skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k1" at timestamp 10.000000000,0 too old; must write at or above 17.000000000,1 + +run error +scan ts=10 k=k1 end=k9 reverse skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 10.000000000,0 too old; must write at or above 17.000000000,1 + +run error +get ts=11 k=k1 skipLocked failOnMoreRecent str=exclusive +---- +get: "k1" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k1" at timestamp 11.000000000,0 too old; must write at or above 11.000000000,1 + +run ok +get ts=11 k=k2 skipLocked failOnMoreRecent str=exclusive +---- +get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +get: "k2" -> + +run ok +get ts=11 k=k3 skipLocked failOnMoreRecent str=exclusive +---- +get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} +get: "k3" -> + +run ok +get ts=11 k=k4 skipLocked failOnMoreRecent str=exclusive +---- +get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} +get: "k4" -> + +run error +get ts=11 k=k5 skipLocked failOnMoreRecent str=exclusive +---- +get: "k5" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 11.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=11 k=k6 skipLocked failOnMoreRecent str=exclusive +---- +get: "k6" -> intent {id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=15.000000000,0 min=0,0 seq=0} +get: "k6" -> + +run error +scan ts=11 k=k1 end=k9 skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k1" at timestamp 11.000000000,0 too old; must write at or above 17.000000000,1 + +run error +scan ts=11 k=k1 end=k9 reverse skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 11.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=12 k=k1 skipLocked failOnMoreRecent str=exclusive +---- +get: "k1" -> /BYTES/v1 @11.000000000,0 + +run ok +get ts=12 k=k2 skipLocked failOnMoreRecent str=exclusive +---- +get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +get: "k2" -> + +run ok +get ts=12 k=k3 skipLocked failOnMoreRecent str=exclusive +---- +get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} +get: "k3" -> + +run ok +get ts=12 k=k4 skipLocked failOnMoreRecent str=exclusive +---- +get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} +get: "k4" -> + +run error +get ts=12 k=k5 skipLocked failOnMoreRecent str=exclusive +---- +get: "k5" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 12.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=12 k=k6 skipLocked failOnMoreRecent str=exclusive +---- +get: "k6" -> intent {id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=15.000000000,0 min=0,0 seq=0} +get: "k6" -> + +run error +scan ts=12 k=k1 end=k9 skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 12.000000000,0 too old; must write at or above 17.000000000,1 + +run error +scan ts=12 k=k1 end=k9 reverse skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 12.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=12 t=A k=k1 skipLocked failOnMoreRecent str=exclusive +---- +get: "k1" -> /BYTES/v1 @11.000000000,0 + +run ok +get ts=12 t=A k=k2 skipLocked failOnMoreRecent str=exclusive +---- +get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +get: "k2" -> + +run ok +get ts=12 t=A k=k3 skipLocked failOnMoreRecent str=exclusive +---- +get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} +get: "k3" -> + +run ok +get ts=12 t=A k=k4 skipLocked failOnMoreRecent str=exclusive +---- +get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} +get: "k4" -> + +run error +get ts=12 t=A k=k5 skipLocked failOnMoreRecent str=exclusive +---- +get: "k5" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 12.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=12 t=A k=k6 skipLocked failOnMoreRecent str=exclusive +---- +get: "k6" -> intent {id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=15.000000000,0 min=0,0 seq=0} +get: "k6" -> + +run error +scan ts=12 t=A k=k1 end=k9 skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 12.000000000,0 too old; must write at or above 17.000000000,1 + +run error +scan ts=12 t=A k=k1 end=k9 reverse skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 12.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=13 k=k1 skipLocked failOnMoreRecent str=exclusive +---- +get: "k1" -> /BYTES/v1 @11.000000000,0 + +run ok +get ts=13 k=k2 skipLocked failOnMoreRecent str=exclusive +---- +get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +get: "k2" -> + +run ok +get ts=13 k=k3 skipLocked failOnMoreRecent str=exclusive +---- +get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} +get: "k3" -> + +run ok +get ts=13 k=k4 skipLocked failOnMoreRecent str=exclusive +---- +get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} +get: "k4" -> + +run error +get ts=13 k=k5 skipLocked failOnMoreRecent str=exclusive +---- +get: "k5" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 13.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=13 k=k6 skipLocked failOnMoreRecent str=exclusive +---- +get: "k6" -> intent {id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=15.000000000,0 min=0,0 seq=0} +get: "k6" -> + +run error +scan ts=13 k=k1 end=k9 skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 13.000000000,0 too old; must write at or above 17.000000000,1 + +run error +scan ts=13 k=k1 end=k9 reverse skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 13.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=13 t=B k=k1 skipLocked failOnMoreRecent str=exclusive +---- +get: "k1" -> /BYTES/v1 @11.000000000,0 + +run ok +get ts=13 t=B k=k2 skipLocked failOnMoreRecent str=exclusive +---- +get: "k2" -> /BYTES/v3 @13.000000000,0 + +run ok +get ts=13 t=B k=k3 skipLocked failOnMoreRecent str=exclusive +---- +get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} +get: "k3" -> + +run ok +get ts=13 t=B k=k4 skipLocked failOnMoreRecent str=exclusive +---- +get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} +get: "k4" -> + +run error +get ts=13 t=B k=k5 skipLocked failOnMoreRecent str=exclusive +---- +get: "k5" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 13.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=13 t=B k=k6 skipLocked failOnMoreRecent str=exclusive +---- +get: "k6" -> intent {id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=15.000000000,0 min=0,0 seq=0} +get: "k6" -> + +run error +scan ts=13 t=B k=k1 end=k9 skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 13.000000000,0 too old; must write at or above 17.000000000,1 + +run error +scan ts=13 t=B k=k1 end=k9 reverse skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 13.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=14 k=k1 skipLocked failOnMoreRecent str=exclusive +---- +get: "k1" -> /BYTES/v1 @11.000000000,0 + +run ok +get ts=14 k=k2 skipLocked failOnMoreRecent str=exclusive +---- +get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +get: "k2" -> + +run ok +get ts=14 k=k3 skipLocked failOnMoreRecent str=exclusive +---- +get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} +get: "k3" -> + +run ok +get ts=14 k=k4 skipLocked failOnMoreRecent str=exclusive +---- +get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} +get: "k4" -> + +run error +get ts=14 k=k5 skipLocked failOnMoreRecent str=exclusive +---- +get: "k5" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 14.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=14 k=k6 skipLocked failOnMoreRecent str=exclusive +---- +get: "k6" -> intent {id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=15.000000000,0 min=0,0 seq=0} +get: "k6" -> + +run error +scan ts=14 k=k1 end=k9 skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 14.000000000,0 too old; must write at or above 17.000000000,1 + +run error +scan ts=14 k=k1 end=k9 reverse skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 14.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=14 t=C k=k1 skipLocked failOnMoreRecent str=exclusive +---- +get: "k1" -> /BYTES/v1 @11.000000000,0 + +run ok +get ts=14 t=C k=k2 skipLocked failOnMoreRecent str=exclusive +---- +get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +get: "k2" -> + +run ok +get ts=14 t=C k=k3 skipLocked failOnMoreRecent str=exclusive +---- +get: "k3" -> /BYTES/v4 @14.000000000,0 + +run ok +get ts=14 t=C k=k4 skipLocked failOnMoreRecent str=exclusive +---- +get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} +get: "k4" -> + +run error +get ts=14 t=C k=k5 skipLocked failOnMoreRecent str=exclusive +---- +get: "k5" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 14.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=14 t=C k=k6 skipLocked failOnMoreRecent str=exclusive +---- +get: "k6" -> intent {id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=15.000000000,0 min=0,0 seq=0} +get: "k6" -> + +run error +scan ts=14 t=C k=k1 end=k9 skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 14.000000000,0 too old; must write at or above 17.000000000,1 + +run error +scan ts=14 t=C k=k1 end=k9 reverse skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 14.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=15 k=k1 skipLocked failOnMoreRecent str=exclusive +---- +get: "k1" -> /BYTES/v1 @11.000000000,0 + +run ok +get ts=15 k=k2 skipLocked failOnMoreRecent str=exclusive +---- +get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +get: "k2" -> + +run ok +get ts=15 k=k3 skipLocked failOnMoreRecent str=exclusive +---- +get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} +get: "k3" -> + +run ok +get ts=15 k=k4 skipLocked failOnMoreRecent str=exclusive +---- +get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} +get: "k4" -> + +run error +get ts=15 k=k5 skipLocked failOnMoreRecent str=exclusive +---- +get: "k5" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 15.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=15 k=k6 skipLocked failOnMoreRecent str=exclusive +---- +get: "k6" -> intent {id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=15.000000000,0 min=0,0 seq=0} +get: "k6" -> + +run error +scan ts=15 k=k1 end=k9 skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 15.000000000,0 too old; must write at or above 17.000000000,1 + +run error +scan ts=15 k=k1 end=k9 reverse skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 15.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=15 t=D k=k1 skipLocked failOnMoreRecent str=exclusive +---- +get: "k1" -> /BYTES/v1 @11.000000000,0 + +run ok +get ts=15 t=D k=k2 skipLocked failOnMoreRecent str=exclusive +---- +get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +get: "k2" -> + +run ok +get ts=15 t=D k=k3 skipLocked failOnMoreRecent str=exclusive +---- +get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} +get: "k3" -> + +run ok +get ts=15 t=D k=k4 skipLocked failOnMoreRecent str=exclusive +---- +get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} +get: "k4" -> + +run error +get ts=15 t=D k=k5 skipLocked failOnMoreRecent str=exclusive +---- +get: "k5" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 15.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=15 t=D k=k6 skipLocked failOnMoreRecent str=exclusive +---- +get: "k6" -> /BYTES/v7 @13.000000000,0 + +run error +scan ts=15 t=D k=k1 end=k9 skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 15.000000000,0 too old; must write at or above 17.000000000,1 + +run error +scan ts=15 t=D k=k1 end=k9 reverse skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 15.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=16 k=k1 skipLocked failOnMoreRecent str=exclusive +---- +get: "k1" -> /BYTES/v1 @11.000000000,0 + +run ok +get ts=16 k=k2 skipLocked failOnMoreRecent str=exclusive +---- +get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +get: "k2" -> + +run ok +get ts=16 k=k3 skipLocked failOnMoreRecent str=exclusive +---- +get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} +get: "k3" -> + +run ok +get ts=16 k=k4 skipLocked failOnMoreRecent str=exclusive +---- +get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} +get: "k4" -> + +run error +get ts=16 k=k5 skipLocked failOnMoreRecent str=exclusive +---- +get: "k5" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 16.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=16 k=k6 skipLocked failOnMoreRecent str=exclusive +---- +get: "k6" -> intent {id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=15.000000000,0 min=0,0 seq=0} +get: "k6" -> + +run error +scan ts=16 k=k1 end=k9 skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 16.000000000,0 too old; must write at or above 17.000000000,1 + +run error +scan ts=16 k=k1 end=k9 reverse skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 16.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=16 t=E k=k1 skipLocked failOnMoreRecent str=exclusive +---- +get: "k1" -> /BYTES/v1 @11.000000000,0 + +run ok +get ts=16 t=E k=k2 skipLocked failOnMoreRecent str=exclusive +---- +get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +get: "k2" -> + +run ok +get ts=16 t=E k=k3 skipLocked failOnMoreRecent str=exclusive +---- +get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} +get: "k3" -> + +run ok +get ts=16 t=E k=k4 skipLocked failOnMoreRecent str=exclusive +---- +get: "k4" -> /BYTES/v5 @15.000000000,0 + +run error +get ts=16 t=E k=k5 skipLocked failOnMoreRecent str=exclusive +---- +get: "k5" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 16.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=16 t=E k=k6 skipLocked failOnMoreRecent str=exclusive +---- +get: "k6" -> intent {id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=15.000000000,0 min=0,0 seq=0} +get: "k6" -> + +run error +scan ts=16 t=E k=k1 end=k9 skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 16.000000000,0 too old; must write at or above 17.000000000,1 + +run error +scan ts=16 t=E k=k1 end=k9 reverse skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 16.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=17 k=k1 skipLocked failOnMoreRecent str=exclusive +---- +get: "k1" -> /BYTES/v1 @11.000000000,0 + +run ok +get ts=17 k=k2 skipLocked failOnMoreRecent str=exclusive +---- +get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +get: "k2" -> + +run ok +get ts=17 k=k3 skipLocked failOnMoreRecent str=exclusive +---- +get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} +get: "k3" -> + +run ok +get ts=17 k=k4 skipLocked failOnMoreRecent str=exclusive +---- +get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} +get: "k4" -> + +run error +get ts=17 k=k5 skipLocked failOnMoreRecent str=exclusive +---- +get: "k5" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 17.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=17 k=k6 skipLocked failOnMoreRecent str=exclusive +---- +get: "k6" -> intent {id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=15.000000000,0 min=0,0 seq=0} +get: "k6" -> + +run error +scan ts=17 k=k1 end=k9 skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 17.000000000,0 too old; must write at or above 17.000000000,1 + +run error +scan ts=17 k=k1 end=k9 reverse skipLocked failOnMoreRecent str=exclusive +---- +scan: "k1"-"k9" -> +error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "k5" at timestamp 17.000000000,0 too old; must write at or above 17.000000000,1 + +run ok +get ts=18 k=k1 skipLocked failOnMoreRecent str=exclusive +---- +get: "k1" -> /BYTES/v1 @11.000000000,0 + +run ok +get ts=18 k=k2 skipLocked failOnMoreRecent str=exclusive +---- +get: "k2" -> intent {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} +get: "k2" -> + +run ok +get ts=18 k=k3 skipLocked failOnMoreRecent str=exclusive +---- +get: "k3" -> intent {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} +get: "k3" -> + +run ok +get ts=18 k=k4 skipLocked failOnMoreRecent str=exclusive +---- +get: "k4" -> intent {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} +get: "k4" -> + +run ok +get ts=18 k=k5 skipLocked failOnMoreRecent str=exclusive +---- +get: "k5" -> /BYTES/v6 @17.000000000,0 + +run ok +get ts=18 k=k6 skipLocked failOnMoreRecent str=exclusive +---- +get: "k6" -> intent {id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=15.000000000,0 min=0,0 seq=0} +get: "k6" -> + +run ok +scan ts=18 k=k1 end=k9 skipLocked failOnMoreRecent str=exclusive ---- scan: intent "k2" {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0} scan: intent "k3" {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} scan: intent "k4" {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} +scan: intent "k6" {id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=15.000000000,0 min=0,0 seq=0} scan: "k1" -> /BYTES/v1 @11.000000000,0 scan: "k5" -> /BYTES/v6 @17.000000000,0 run ok -scan ts=18 k=k1 end=k6 reverse skipLocked failOnMoreRecent +scan ts=18 k=k1 end=k9 reverse skipLocked failOnMoreRecent str=exclusive ---- +scan: intent "k6" {id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=15.000000000,0 min=0,0 seq=0} scan: intent "k4" {id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=16.000000000,0 min=0,0 seq=0} scan: intent "k3" {id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=0} scan: intent "k2" {id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=13.000000000,0 min=0,0 seq=0}