diff --git a/pkg/storage/testdata/mvcc_histories/range_tombstone_gets_complex b/pkg/storage/testdata/mvcc_histories/range_tombstone_gets_complex new file mode 100644 index 000000000000..274f6e6e9608 --- /dev/null +++ b/pkg/storage/testdata/mvcc_histories/range_tombstone_gets_complex @@ -0,0 +1,276 @@ +# Tests MVCC gets across range tombstones, with a more complex dataset. +# +# Sets up the following dataset, where x is tombstone, o-o is range tombstone, [] is intent. +# +# T +# 7 [d7] [f7] [j7] +# 6 f6 +# 5 o-------------------o k5 o-----------o +# 4 x x d4 f4 g4 +# 3 o-------o e3 o-------oh3 o---o +# 2 a2 d2 f2 g2 +# 1 o-------------------o o-----------o +# a b c d e f g h i j k l m n o p +# +run ok +put_rangekey k=a end=f ts=1 +put_rangekey k=h end=k ts=1 +put_rangekey k=b end=d ts=3 +put_rangekey k=n end=o ts=3 +put_rangekey k=l end=o ts=5 +put k=a ts=2 v=a2 +del k=a ts=4 +del k=b ts=4 +put k=d ts=2 v=d2 +put k=d ts=4 v=d4 +put k=e ts=3 v=e3 +put k=f ts=2 v=f2 +put k=g ts=2 v=g2 +put_rangekey k=f end=h ts=3 localTs=4 +put k=f ts=4 v=f4 +put k=f ts=6 v=f6 +put k=g ts=4 v=g4 +put_rangekey k=c end=h ts=5 +put k=h ts=3 v=h3 +put k=k ts=5 v=k5 +with t=A + txn_begin ts=7 + put k=d v=d7 + put k=f v=f7 + put k=j v=j7 +---- +del: "a": found key true +del: "b": found key false +>> at end: +txn: "A" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} lock=true stat=PENDING rts=7.000000000,0 wto=false gul=0,0 +rangekey: {a-b}/[1.000000000,0=/] +rangekey: {b-c}/[3.000000000,0=/ 1.000000000,0=/] +rangekey: {c-d}/[5.000000000,0=/ 3.000000000,0=/ 1.000000000,0=/] +rangekey: {d-f}/[5.000000000,0=/ 1.000000000,0=/] +rangekey: {f-h}/[5.000000000,0=/ 3.000000000,0={localTs=4.000000000,0}/] +rangekey: {h-k}/[1.000000000,0=/] +rangekey: {l-n}/[5.000000000,0=/] +rangekey: {n-o}/[5.000000000,0=/ 3.000000000,0=/] +data: "a"/4.000000000,0 -> / +data: "a"/2.000000000,0 -> /BYTES/a2 +data: "b"/4.000000000,0 -> / +meta: "d"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} ts=7.000000000,0 del=false klen=12 vlen=7 mergeTs= txnDidNotUpdateMeta=true +data: "d"/7.000000000,0 -> /BYTES/d7 +data: "d"/4.000000000,0 -> /BYTES/d4 +data: "d"/2.000000000,0 -> /BYTES/d2 +data: "e"/3.000000000,0 -> /BYTES/e3 +meta: "f"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} ts=7.000000000,0 del=false klen=12 vlen=7 mergeTs= txnDidNotUpdateMeta=true +data: "f"/7.000000000,0 -> /BYTES/f7 +data: "f"/6.000000000,0 -> /BYTES/f6 +data: "f"/4.000000000,0 -> /BYTES/f4 +data: "f"/2.000000000,0 -> /BYTES/f2 +data: "g"/4.000000000,0 -> /BYTES/g4 +data: "g"/2.000000000,0 -> /BYTES/g2 +data: "h"/3.000000000,0 -> /BYTES/h3 +meta: "j"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} ts=7.000000000,0 del=false klen=12 vlen=7 mergeTs= txnDidNotUpdateMeta=true +data: "j"/7.000000000,0 -> /BYTES/j7 +data: "k"/5.000000000,0 -> /BYTES/k5 + +# Run gets for all keys at all timestamps, with tombstones and intents. +run ok +get k=a ts=1 tombstones inconsistent +get k=a ts=2 tombstones inconsistent +get k=a ts=3 tombstones inconsistent +get k=a ts=4 tombstones inconsistent +get k=a ts=5 tombstones inconsistent +---- +get: "a" -> / @1.000000000,0 +get: "a" -> /BYTES/a2 @2.000000000,0 +get: "a" -> /BYTES/a2 @2.000000000,0 +get: "a" -> / @4.000000000,0 +get: "a" -> / @4.000000000,0 + +run ok +get k=b ts=1 tombstones inconsistent +get k=b ts=2 tombstones inconsistent +get k=b ts=3 tombstones inconsistent +get k=b ts=4 tombstones inconsistent +get k=b ts=5 tombstones inconsistent +---- +get: "b" -> / @1.000000000,0 +get: "b" -> / @1.000000000,0 +get: "b" -> / @3.000000000,0 +get: "b" -> / @4.000000000,0 +get: "b" -> / @4.000000000,0 + +run ok +get k=c ts=1 tombstones inconsistent +get k=c ts=2 tombstones inconsistent +get k=c ts=3 tombstones inconsistent +get k=c ts=4 tombstones inconsistent +get k=c ts=5 tombstones inconsistent +get k=c ts=6 tombstones inconsistent +---- +get: "c" -> / @1.000000000,0 +get: "c" -> / @1.000000000,0 +get: "c" -> / @3.000000000,0 +get: "c" -> / @3.000000000,0 +get: "c" -> / @5.000000000,0 +get: "c" -> / @5.000000000,0 + +run ok +get k=d ts=1 tombstones inconsistent +get k=d ts=2 tombstones inconsistent +get k=d ts=3 tombstones inconsistent +get k=d ts=4 tombstones inconsistent +get k=d ts=5 tombstones inconsistent +get k=d ts=6 tombstones inconsistent +get k=d ts=7 tombstones inconsistent +get k=d ts=8 tombstones inconsistent +---- +get: "d" -> / @1.000000000,0 +get: "d" -> /BYTES/d2 @2.000000000,0 +get: "d" -> /BYTES/d2 @2.000000000,0 +get: "d" -> /BYTES/d4 @4.000000000,0 +get: "d" -> / @5.000000000,0 +get: "d" -> / @5.000000000,0 +get: "d" -> intent {id=00000000 key=/Min pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} +get: "d" -> / @5.000000000,0 +get: "d" -> intent {id=00000000 key=/Min pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} +get: "d" -> / @5.000000000,0 + +run ok +get k=e ts=1 tombstones inconsistent +get k=e ts=2 tombstones inconsistent +get k=e ts=3 tombstones inconsistent +get k=e ts=4 tombstones inconsistent +get k=e ts=5 tombstones inconsistent +get k=e ts=6 tombstones inconsistent +---- +get: "e" -> / @1.000000000,0 +get: "e" -> / @1.000000000,0 +get: "e" -> /BYTES/e3 @3.000000000,0 +get: "e" -> /BYTES/e3 @3.000000000,0 +get: "e" -> / @5.000000000,0 +get: "e" -> / @5.000000000,0 + +run ok +get k=f ts=1 tombstones inconsistent +get k=f ts=2 tombstones inconsistent +get k=f ts=3 tombstones inconsistent +get k=f ts=4 tombstones inconsistent +get k=f ts=5 tombstones inconsistent +get k=f ts=6 tombstones inconsistent +get k=f ts=7 tombstones inconsistent +get k=f ts=8 tombstones inconsistent +---- +get: "f" -> +get: "f" -> /BYTES/f2 @2.000000000,0 +get: "f" -> / @3.000000000,0 +get: "f" -> /BYTES/f4 @4.000000000,0 +get: "f" -> / @5.000000000,0 +get: "f" -> /BYTES/f6 @6.000000000,0 +get: "f" -> intent {id=00000000 key=/Min pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} +get: "f" -> /BYTES/f6 @6.000000000,0 +get: "f" -> intent {id=00000000 key=/Min pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} +get: "f" -> /BYTES/f6 @6.000000000,0 + +run ok +get k=g ts=1 tombstones inconsistent +get k=g ts=2 tombstones inconsistent +get k=g ts=3 tombstones inconsistent +get k=g ts=4 tombstones inconsistent +get k=g ts=5 tombstones inconsistent +get k=g ts=6 tombstones inconsistent +---- +get: "g" -> +get: "g" -> /BYTES/g2 @2.000000000,0 +get: "g" -> / @3.000000000,0 +get: "g" -> /BYTES/g4 @4.000000000,0 +get: "g" -> / @5.000000000,0 +get: "g" -> / @5.000000000,0 + +run ok +get k=h ts=1 tombstones inconsistent +get k=h ts=2 tombstones inconsistent +get k=h ts=3 tombstones inconsistent +get k=h ts=4 tombstones inconsistent +get k=h ts=5 tombstones inconsistent +get k=h ts=6 tombstones inconsistent +---- +get: "h" -> / @1.000000000,0 +get: "h" -> / @1.000000000,0 +get: "h" -> /BYTES/h3 @3.000000000,0 +get: "h" -> /BYTES/h3 @3.000000000,0 +get: "h" -> /BYTES/h3 @3.000000000,0 +get: "h" -> /BYTES/h3 @3.000000000,0 + +run ok +get k=i ts=1 tombstones inconsistent +get k=i ts=2 tombstones inconsistent +---- +get: "i" -> / @1.000000000,0 +get: "i" -> / @1.000000000,0 + +run ok +get k=j ts=1 tombstones inconsistent +get k=j ts=2 tombstones inconsistent +get k=j ts=6 tombstones inconsistent +get k=j ts=7 tombstones inconsistent +get k=j ts=8 tombstones inconsistent +---- +get: "j" -> / @1.000000000,0 +get: "j" -> / @1.000000000,0 +get: "j" -> / @1.000000000,0 +get: "j" -> intent {id=00000000 key=/Min pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} +get: "j" -> / @1.000000000,0 +get: "j" -> intent {id=00000000 key=/Min pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} +get: "j" -> / @1.000000000,0 + +run ok +get k=k ts=4 tombstones inconsistent +get k=k ts=5 tombstones inconsistent +get k=k ts=6 tombstones inconsistent +---- +get: "k" -> +get: "k" -> /BYTES/k5 @5.000000000,0 +get: "k" -> /BYTES/k5 @5.000000000,0 + +run ok +get k=l ts=4 tombstones inconsistent +get k=l ts=5 tombstones inconsistent +get k=l ts=6 tombstones inconsistent +---- +get: "l" -> +get: "l" -> / @5.000000000,0 +get: "l" -> / @5.000000000,0 + +run ok +get k=m ts=4 tombstones inconsistent +get k=m ts=5 tombstones inconsistent +get k=m ts=6 tombstones inconsistent +---- +get: "m" -> +get: "m" -> / @5.000000000,0 +get: "m" -> / @5.000000000,0 + +run ok +get k=n ts=2 tombstones inconsistent +get k=n ts=3 tombstones inconsistent +get k=n ts=4 tombstones inconsistent +get k=n ts=5 tombstones inconsistent +get k=n ts=6 tombstones inconsistent +---- +get: "n" -> +get: "n" -> / @3.000000000,0 +get: "n" -> / @3.000000000,0 +get: "n" -> / @5.000000000,0 +get: "n" -> / @5.000000000,0 + +run ok +get k=o ts=2 tombstones inconsistent +get k=o ts=3 tombstones inconsistent +get k=o ts=4 tombstones inconsistent +get k=o ts=5 tombstones inconsistent +get k=o ts=6 tombstones inconsistent +---- +get: "o" -> +get: "o" -> +get: "o" -> +get: "o" -> +get: "o" -> diff --git a/pkg/storage/testdata/mvcc_histories/range_tombstone_scans_complex b/pkg/storage/testdata/mvcc_histories/range_tombstone_scans_complex new file mode 100644 index 000000000000..125b7b029765 --- /dev/null +++ b/pkg/storage/testdata/mvcc_histories/range_tombstone_scans_complex @@ -0,0 +1,367 @@ +# Tests MVCC scans across range tombstones, with a more complex dataset. +# +# Sets up the following dataset, where x is tombstone, o-o is range tombstone, [] is intent. +# +# T +# 7 [d7] [f7] [j7] +# 6 f6 +# 5 o-------------------o k5 o-----------o +# 4 x x d4 f4 g4 +# 3 o-------o e3 o-------oh3 o---o +# 2 a2 d2 f2 g2 +# 1 o-------------------o o-----------o +# a b c d e f g h i j k l m n o p +# +run ok +put_rangekey k=a end=f ts=1 +put_rangekey k=h end=k ts=1 +put_rangekey k=b end=d ts=3 +put_rangekey k=n end=o ts=3 +put_rangekey k=l end=o ts=5 +put k=a ts=2 v=a2 +del k=a ts=4 +del k=b ts=4 +put k=d ts=2 v=d2 +put k=d ts=4 v=d4 +put k=e ts=3 v=e3 +put k=f ts=2 v=f2 +put k=g ts=2 v=g2 +put_rangekey k=f end=h ts=3 localTs=4 +put k=f ts=4 v=f4 +put k=f ts=6 v=f6 +put k=g ts=4 v=g4 +put_rangekey k=c end=h ts=5 +put k=h ts=3 v=h3 +put k=k ts=5 v=k5 +with t=A + txn_begin ts=7 + put k=d v=d7 + put k=f v=f7 + put k=j v=j7 +---- +del: "a": found key true +del: "b": found key false +>> at end: +txn: "A" meta={id=00000000 key=/Min pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} lock=true stat=PENDING rts=7.000000000,0 wto=false gul=0,0 +rangekey: {a-b}/[1.000000000,0=/] +rangekey: {b-c}/[3.000000000,0=/ 1.000000000,0=/] +rangekey: {c-d}/[5.000000000,0=/ 3.000000000,0=/ 1.000000000,0=/] +rangekey: {d-f}/[5.000000000,0=/ 1.000000000,0=/] +rangekey: {f-h}/[5.000000000,0=/ 3.000000000,0={localTs=4.000000000,0}/] +rangekey: {h-k}/[1.000000000,0=/] +rangekey: {l-n}/[5.000000000,0=/] +rangekey: {n-o}/[5.000000000,0=/ 3.000000000,0=/] +data: "a"/4.000000000,0 -> / +data: "a"/2.000000000,0 -> /BYTES/a2 +data: "b"/4.000000000,0 -> / +meta: "d"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} ts=7.000000000,0 del=false klen=12 vlen=7 mergeTs= txnDidNotUpdateMeta=true +data: "d"/7.000000000,0 -> /BYTES/d7 +data: "d"/4.000000000,0 -> /BYTES/d4 +data: "d"/2.000000000,0 -> /BYTES/d2 +data: "e"/3.000000000,0 -> /BYTES/e3 +meta: "f"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} ts=7.000000000,0 del=false klen=12 vlen=7 mergeTs= txnDidNotUpdateMeta=true +data: "f"/7.000000000,0 -> /BYTES/f7 +data: "f"/6.000000000,0 -> /BYTES/f6 +data: "f"/4.000000000,0 -> /BYTES/f4 +data: "f"/2.000000000,0 -> /BYTES/f2 +data: "g"/4.000000000,0 -> /BYTES/g4 +data: "g"/2.000000000,0 -> /BYTES/g2 +data: "h"/3.000000000,0 -> /BYTES/h3 +meta: "j"/0,0 -> txn={id=00000000 key=/Min pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} ts=7.000000000,0 del=false klen=12 vlen=7 mergeTs= txnDidNotUpdateMeta=true +data: "j"/7.000000000,0 -> /BYTES/j7 +data: "k"/5.000000000,0 -> /BYTES/k5 + +# Forward scans at all timestamps. +run ok +scan k=a end=z ts=1 +---- +scan: "a"-"z" -> + +run ok +scan k=a end=z ts=2 +---- +scan: "a" -> /BYTES/a2 @2.000000000,0 +scan: "d" -> /BYTES/d2 @2.000000000,0 +scan: "f" -> /BYTES/f2 @2.000000000,0 +scan: "g" -> /BYTES/g2 @2.000000000,0 + +run ok +scan k=a end=z ts=3 +---- +scan: "a" -> /BYTES/a2 @2.000000000,0 +scan: "d" -> /BYTES/d2 @2.000000000,0 +scan: "e" -> /BYTES/e3 @3.000000000,0 +scan: "h" -> /BYTES/h3 @3.000000000,0 + +run ok +scan k=a end=z ts=4 +---- +scan: "d" -> /BYTES/d4 @4.000000000,0 +scan: "e" -> /BYTES/e3 @3.000000000,0 +scan: "f" -> /BYTES/f4 @4.000000000,0 +scan: "g" -> /BYTES/g4 @4.000000000,0 +scan: "h" -> /BYTES/h3 @3.000000000,0 + +run ok +scan k=a end=z ts=5 +---- +scan: "h" -> /BYTES/h3 @3.000000000,0 +scan: "k" -> /BYTES/k5 @5.000000000,0 + +run ok +scan k=a end=z ts=6 +---- +scan: "f" -> /BYTES/f6 @6.000000000,0 +scan: "h" -> /BYTES/h3 @3.000000000,0 +scan: "k" -> /BYTES/k5 @5.000000000,0 + +# Forward scans at all timestamps with tombstones and intents. +run ok +scan k=a end=z ts=1 tombstones inconsistent +---- +scan: "a" -> / @1.000000000,0 +scan: "b" -> / @1.000000000,0 +scan: "c" -> / @1.000000000,0 +scan: "d" -> / @1.000000000,0 +scan: "h" -> / @1.000000000,0 + +run ok +scan k=a end=z ts=2 tombstones inconsistent +---- +scan: "a" -> /BYTES/a2 @2.000000000,0 +scan: "b" -> / @1.000000000,0 +scan: "c" -> / @1.000000000,0 +scan: "d" -> /BYTES/d2 @2.000000000,0 +scan: "f" -> /BYTES/f2 @2.000000000,0 +scan: "g" -> /BYTES/g2 @2.000000000,0 +scan: "h" -> / @1.000000000,0 + +run ok +scan k=a end=z ts=3 tombstones inconsistent +---- +scan: "a" -> /BYTES/a2 @2.000000000,0 +scan: "b" -> / @3.000000000,0 +scan: "c" -> / @3.000000000,0 +scan: "d" -> /BYTES/d2 @2.000000000,0 +scan: "e" -> /BYTES/e3 @3.000000000,0 +scan: "f" -> / @3.000000000,0 +scan: "g" -> / @3.000000000,0 +scan: "h" -> /BYTES/h3 @3.000000000,0 +scan: "n" -> / @3.000000000,0 + +run ok +scan k=a end=z ts=4 tombstones inconsistent +---- +scan: "a" -> / @4.000000000,0 +scan: "b" -> / @4.000000000,0 +scan: "c" -> / @3.000000000,0 +scan: "d" -> /BYTES/d4 @4.000000000,0 +scan: "e" -> /BYTES/e3 @3.000000000,0 +scan: "f" -> /BYTES/f4 @4.000000000,0 +scan: "g" -> /BYTES/g4 @4.000000000,0 +scan: "h" -> /BYTES/h3 @3.000000000,0 +scan: "n" -> / @3.000000000,0 + +run ok +scan k=a end=z ts=5 tombstones inconsistent +---- +scan: "a" -> / @4.000000000,0 +scan: "b" -> / @4.000000000,0 +scan: "c" -> / @5.000000000,0 +scan: "d" -> / @5.000000000,0 +scan: "e" -> / @5.000000000,0 +scan: "f" -> / @5.000000000,0 +scan: "g" -> / @5.000000000,0 +scan: "h" -> /BYTES/h3 @3.000000000,0 +scan: "k" -> /BYTES/k5 @5.000000000,0 +scan: "l" -> / @5.000000000,0 +scan: "n" -> / @5.000000000,0 + +run ok +scan k=a end=z ts=6 tombstones inconsistent +---- +scan: "a" -> / @4.000000000,0 +scan: "b" -> / @4.000000000,0 +scan: "c" -> / @5.000000000,0 +scan: "d" -> / @5.000000000,0 +scan: "e" -> / @5.000000000,0 +scan: "f" -> /BYTES/f6 @6.000000000,0 +scan: "g" -> / @5.000000000,0 +scan: "h" -> /BYTES/h3 @3.000000000,0 +scan: "k" -> /BYTES/k5 @5.000000000,0 +scan: "l" -> / @5.000000000,0 +scan: "n" -> / @5.000000000,0 + +run ok +scan k=a end=z ts=7 tombstones inconsistent +---- +scan: intent "d" {id=00000000 key=/Min pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} +scan: intent "f" {id=00000000 key=/Min pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} +scan: intent "j" {id=00000000 key=/Min pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} +scan: "a" -> / @4.000000000,0 +scan: "b" -> / @4.000000000,0 +scan: "c" -> / @5.000000000,0 +scan: "d" -> / @5.000000000,0 +scan: "e" -> / @5.000000000,0 +scan: "f" -> /BYTES/f6 @6.000000000,0 +scan: "g" -> / @5.000000000,0 +scan: "h" -> /BYTES/h3 @3.000000000,0 +scan: "k" -> /BYTES/k5 @5.000000000,0 +scan: "l" -> / @5.000000000,0 +scan: "n" -> / @5.000000000,0 + +# Reverse scans at all timestamps. +run ok +scan k=a end=z ts=1 reverse +---- +scan: "a"-"z" -> + +run ok +scan k=a end=z ts=2 reverse +---- +scan: "g" -> /BYTES/g2 @2.000000000,0 +scan: "f" -> /BYTES/f2 @2.000000000,0 +scan: "d" -> /BYTES/d2 @2.000000000,0 +scan: "a" -> /BYTES/a2 @2.000000000,0 + +run ok +scan k=a end=z ts=3 reverse +---- +scan: "h" -> /BYTES/h3 @3.000000000,0 +scan: "e" -> /BYTES/e3 @3.000000000,0 +scan: "d" -> /BYTES/d2 @2.000000000,0 +scan: "a" -> /BYTES/a2 @2.000000000,0 + +run ok +scan k=a end=z ts=4 reverse +---- +scan: "h" -> /BYTES/h3 @3.000000000,0 +scan: "g" -> /BYTES/g4 @4.000000000,0 +scan: "f" -> /BYTES/f4 @4.000000000,0 +scan: "e" -> /BYTES/e3 @3.000000000,0 +scan: "d" -> /BYTES/d4 @4.000000000,0 + +run ok +scan k=a end=z ts=5 reverse +---- +scan: "k" -> /BYTES/k5 @5.000000000,0 +scan: "h" -> /BYTES/h3 @3.000000000,0 + +run ok +scan k=a end=z ts=6 reverse +---- +scan: "k" -> /BYTES/k5 @5.000000000,0 +scan: "h" -> /BYTES/h3 @3.000000000,0 +scan: "f" -> /BYTES/f6 @6.000000000,0 + +# Reverse scans at all timestamps with tombstones and intents. +run ok +scan k=a end=z ts=1 reverse tombstones inconsistent +---- +scan: "h" -> / @1.000000000,0 +scan: "d" -> / @1.000000000,0 +scan: "c" -> / @1.000000000,0 +scan: "b" -> / @1.000000000,0 +scan: "a" -> / @1.000000000,0 + +run ok +scan k=a end=z ts=2 reverse tombstones inconsistent +---- +scan: "h" -> / @1.000000000,0 +scan: "g" -> /BYTES/g2 @2.000000000,0 +scan: "f" -> /BYTES/f2 @2.000000000,0 +scan: "d" -> /BYTES/d2 @2.000000000,0 +scan: "c" -> / @1.000000000,0 +scan: "b" -> / @1.000000000,0 +scan: "a" -> /BYTES/a2 @2.000000000,0 + +run ok +scan k=a end=z ts=3 reverse tombstones inconsistent +---- +scan: "n" -> / @3.000000000,0 +scan: "h" -> /BYTES/h3 @3.000000000,0 +scan: "g" -> / @3.000000000,0 +scan: "f" -> / @3.000000000,0 +scan: "e" -> /BYTES/e3 @3.000000000,0 +scan: "d" -> /BYTES/d2 @2.000000000,0 +scan: "c" -> / @3.000000000,0 +scan: "b" -> / @3.000000000,0 +scan: "a" -> /BYTES/a2 @2.000000000,0 + +run ok +scan k=a end=z ts=4 reverse tombstones inconsistent +---- +scan: "n" -> / @3.000000000,0 +scan: "h" -> /BYTES/h3 @3.000000000,0 +scan: "g" -> /BYTES/g4 @4.000000000,0 +scan: "f" -> /BYTES/f4 @4.000000000,0 +scan: "e" -> /BYTES/e3 @3.000000000,0 +scan: "d" -> /BYTES/d4 @4.000000000,0 +scan: "c" -> / @3.000000000,0 +scan: "b" -> / @4.000000000,0 +scan: "a" -> / @4.000000000,0 + +run ok +scan k=a end=z ts=5 reverse tombstones inconsistent +---- +scan: "n" -> / @5.000000000,0 +scan: "l" -> / @5.000000000,0 +scan: "k" -> /BYTES/k5 @5.000000000,0 +scan: "h" -> /BYTES/h3 @3.000000000,0 +scan: "g" -> / @5.000000000,0 +scan: "f" -> / @5.000000000,0 +scan: "e" -> / @5.000000000,0 +scan: "d" -> / @5.000000000,0 +scan: "c" -> / @5.000000000,0 +scan: "b" -> / @4.000000000,0 +scan: "a" -> / @4.000000000,0 + +run ok +scan k=a end=z ts=6 reverse tombstones inconsistent +---- +scan: "n" -> / @5.000000000,0 +scan: "l" -> / @5.000000000,0 +scan: "k" -> /BYTES/k5 @5.000000000,0 +scan: "h" -> /BYTES/h3 @3.000000000,0 +scan: "g" -> / @5.000000000,0 +scan: "f" -> /BYTES/f6 @6.000000000,0 +scan: "e" -> / @5.000000000,0 +scan: "d" -> / @5.000000000,0 +scan: "c" -> / @5.000000000,0 +scan: "b" -> / @4.000000000,0 +scan: "a" -> / @4.000000000,0 + +run ok +scan k=a end=z ts=7 reverse tombstones inconsistent +---- +scan: intent "j" {id=00000000 key=/Min pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} +scan: intent "f" {id=00000000 key=/Min pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} +scan: intent "d" {id=00000000 key=/Min pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} +scan: "n" -> / @5.000000000,0 +scan: "l" -> / @5.000000000,0 +scan: "k" -> /BYTES/k5 @5.000000000,0 +scan: "h" -> /BYTES/h3 @3.000000000,0 +scan: "g" -> / @5.000000000,0 +scan: "f" -> /BYTES/f6 @6.000000000,0 +scan: "e" -> / @5.000000000,0 +scan: "d" -> / @5.000000000,0 +scan: "c" -> / @5.000000000,0 +scan: "b" -> / @4.000000000,0 +scan: "a" -> / @4.000000000,0 + +# Start scan at bare point key. +run ok +scan k=k end=z ts=7 tombstones inconsistent +---- +scan: "k" -> /BYTES/k5 @5.000000000,0 +scan: "l" -> / @5.000000000,0 +scan: "n" -> / @5.000000000,0 + +# Start and end scan in the middle of a bare range key. +run ok +scan k=ddd end=ggg ts=4 tombstones inconsistent +---- +scan: "ddd" -> / @1.000000000,0 +scan: "e" -> /BYTES/e3 @3.000000000,0 +scan: "f" -> /BYTES/f4 @4.000000000,0 +scan: "g" -> /BYTES/g4 @4.000000000,0