
# Perform some writes at various sequence numbers.

run ok
with t=A
  txn_begin ts=11
  txn_step  seq=10
  put       k=k  v=a
  put       k=k/10 v=10
  txn_step  seq=20
  put       k=k  v=b
  put       k=k/20 v=20
  txn_step  seq=30
  put       k=k  v=c
  put       k=k/30 v=30
  txn_step  seq=40
----
put: lock acquisition = {k id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=10 Replicated Intent []}
put: lock acquisition = {k/10 id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=10 Replicated Intent []}
put: lock acquisition = {k id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=20 Replicated Intent []}
put: lock acquisition = {k/20 id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=20 Replicated Intent []}
put: lock acquisition = {k id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=30 Replicated Intent []}
put: lock acquisition = {k/30 id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=30 Replicated Intent []}
>> at end:
txn: "A" meta={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=40} lock=true stat=PENDING rts=11.000000000,0 wto=false gul=0,0
meta: "k"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=30} ts=11.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} mergeTs=<nil> txnDidNotUpdateMeta=false
data: "k"/11.000000000,0 -> /BYTES/c
meta: "k/10"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=10} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/10"/11.000000000,0 -> /BYTES/10
meta: "k/20"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=20} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/20"/11.000000000,0 -> /BYTES/20
meta: "k/30"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=30} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/30"/11.000000000,0 -> /BYTES/30

# Mask a single write.
# The third write should be hidden now.

run ok
with t=A
  txn_ignore_seqs seqs=(25-35)
  scan k=k end=-k
  get  k=k
  txn_ignore_seqs seqs=(30-31)
  get  k=k
  txn_ignore_seqs seqs=(29-30)
  get  k=k
----
scan: "k" -> /BYTES/b @11.000000000,0
scan: "k/10" -> /BYTES/10 @11.000000000,0
scan: "k/20" -> /BYTES/20 @11.000000000,0
get: "k" -> /BYTES/b @11.000000000,0
get: "k" -> /BYTES/b @11.000000000,0
get: "k" -> /BYTES/b @11.000000000,0
>> at end:
txn: "A" meta={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=40} lock=true stat=PENDING rts=11.000000000,0 wto=false gul=0,0 isn=1

# Mask a write in the middle.

run ok
with t=A
  txn_ignore_seqs seqs=(15-25)
  txn_step seq=40
  scan k=k end=-k
  get  k=k
----
scan: "k" -> /BYTES/c @11.000000000,0
scan: "k/10" -> /BYTES/10 @11.000000000,0
scan: "k/30" -> /BYTES/30 @11.000000000,0
get: "k" -> /BYTES/c @11.000000000,0
>> at end:
txn: "A" meta={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=40} lock=true stat=PENDING rts=11.000000000,0 wto=false gul=0,0 isn=1

# Mask all the writes.

run ok
with t=A
  txn_ignore_seqs seqs=(1-35)
  txn_step seq=40
  scan k=k end=-k
  get  k=k
----
scan: "k"-"l" -> <no data>
get: "k" -> <no data>
>> at end:
txn: "A" meta={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=40} lock=true stat=PENDING rts=11.000000000,0 wto=false gul=0,0 isn=1

# Disjoint masks.

run ok
with t=A
  txn_ignore_seqs seqs=(1-15,25-35)
  txn_step seq=40
  scan k=k end=-k
  get  k=k
----
scan: "k" -> /BYTES/b @11.000000000,0
scan: "k/20" -> /BYTES/20 @11.000000000,0
get: "k" -> /BYTES/b @11.000000000,0
>> at end:
txn: "A" meta={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=40} lock=true stat=PENDING rts=11.000000000,0 wto=false gul=0,0 isn=2

# A historical read before the ignored range should retrieve the
# historical value visible at that point.

run ok
with t=A
  txn_ignore_seqs seqs=(15-25)
  txn_step    seq=12
  scan        k=k end=-k
  get         k=k
----
scan: "k" -> /BYTES/a @11.000000000,0
scan: "k/10" -> /BYTES/10 @11.000000000,0
get: "k" -> /BYTES/a @11.000000000,0
>> at end:
txn: "A" meta={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=12} lock=true stat=PENDING rts=11.000000000,0 wto=false gul=0,0 isn=1

# A historical read with an ignored range before it should hide
# the historical value hidden at that point.

run ok
with t=A
  txn_ignore_seqs seqs=(5-15)
  txn_step    seq=22
  scan        k=k end=-k
  get         k=k
----
scan: "k" -> /BYTES/b @11.000000000,0
scan: "k/20" -> /BYTES/20 @11.000000000,0
get: "k" -> /BYTES/b @11.000000000,0
>> at end:
txn: "A" meta={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=22} lock=true stat=PENDING rts=11.000000000,0 wto=false gul=0,0 isn=1

# A historical read with an ignored range that overlaps should hide
# the historical value hidden at that point.

run ok
with t=A
  txn_ignore_seqs seqs=(25-35)
  txn_step    seq=32
  scan        k=k end=-k
  get         k=k
----
scan: "k" -> /BYTES/b @11.000000000,0
scan: "k/10" -> /BYTES/10 @11.000000000,0
scan: "k/20" -> /BYTES/20 @11.000000000,0
get: "k" -> /BYTES/b @11.000000000,0
>> at end:
txn: "A" meta={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=32} lock=true stat=PENDING rts=11.000000000,0 wto=false gul=0,0 isn=1

# Do an intent push by advancing the transaction timestamp, while also having
# a range of ignored seqnums. This should permanently delete the value at seqnum
# 30. This tests the pushed && intentUpdated case in mvccResolveWriteIntents.

run ok
with t=A
  txn_ignore_seqs seqs=(25-35)
  txn_step        seq=32
  check_intent    k=k
  get             k=k
  txn_advance     ts=14
  get             k=k
  resolve_intent  k=k status=PENDING
  check_intent    k=k
  get             k=k
----
meta: "k" -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=30} ts=11.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} mergeTs=<nil> txnDidNotUpdateMeta=false
get: "k" -> /BYTES/b @11.000000000,0
get: "k" -> /BYTES/b @11.000000000,0
resolve_intent: "k" -> resolved key = true
meta: "k" -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=20} ts=14.000000000,0 del=false klen=12 vlen=19 ih={{10 /BYTES/a}} mergeTs=<nil> txnDidNotUpdateMeta=false
get: "k" -> /BYTES/b @14.000000000,0
>> at end:
txn: "A" meta={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=32} lock=true stat=PENDING rts=11.000000000,0 wto=false gul=0,0 isn=1
meta: "k"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=20} ts=14.000000000,0 del=false klen=12 vlen=19 ih={{10 /BYTES/a}} mergeTs=<nil> txnDidNotUpdateMeta=false
data: "k"/14.000000000,0 -> {localTs=11.000000000,0}/BYTES/b
meta: "k/10"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=10} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/10"/11.000000000,0 -> /BYTES/10
meta: "k/20"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=20} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/20"/11.000000000,0 -> /BYTES/20
meta: "k/30"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=30} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/30"/11.000000000,0 -> /BYTES/30

# Ensure that the deleted value doesn't surface. Instead, if we ignore the
# now-newest seq, we get the write before it.

run ok
with t=A
  txn_ignore_seqs seqs=(15-25)
  txn_step        seq=40
  scan            k=k end=-k
  get             k=k
----
scan: "k" -> /BYTES/a @14.000000000,0
scan: "k/10" -> /BYTES/10 @11.000000000,0
scan: "k/30" -> /BYTES/30 @11.000000000,0
get: "k" -> /BYTES/a @14.000000000,0
>> at end:
txn: "A" meta={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=40} lock=true stat=PENDING rts=11.000000000,0 wto=false gul=0,0 isn=1

run ok
with t=A
  txn_ignore_seqs seqs=(26-27)
  txn_step        seq=35
  scan            k=k end=-k
  get             k=k
  txn_step        seq=25
  scan            k=k end=-k
  get             k=k
----
scan: "k" -> /BYTES/b @14.000000000,0
scan: "k/10" -> /BYTES/10 @11.000000000,0
scan: "k/20" -> /BYTES/20 @11.000000000,0
scan: "k/30" -> /BYTES/30 @11.000000000,0
get: "k" -> /BYTES/b @14.000000000,0
scan: "k" -> /BYTES/b @14.000000000,0
scan: "k/10" -> /BYTES/10 @11.000000000,0
scan: "k/20" -> /BYTES/20 @11.000000000,0
get: "k" -> /BYTES/b @14.000000000,0
>> at end:
txn: "A" meta={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=25} lock=true stat=PENDING rts=11.000000000,0 wto=false gul=0,0 isn=1

# Call mvccResolveWriteIntent with status=COMMITTED. This should fold the
# intent while leaving the value unmodified.

run ok
with t=A
  txn_ignore_seqs seqs=(25-35)
  check_intent    k=k
  resolve_intent  k=k status=COMMITTED
with t=B
  txn_begin  ts=20
  get        k=k
----
meta: "k" -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=14.000000000,0 min=0,0 seq=20} ts=14.000000000,0 del=false klen=12 vlen=19 ih={{10 /BYTES/a}} mergeTs=<nil> txnDidNotUpdateMeta=false
resolve_intent: "k" -> resolved key = true
get: "k" -> /BYTES/b @14.000000000,0
>> at end:
txn: "B" meta={id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=20.000000000,0 min=0,0 seq=0} lock=true stat=PENDING rts=20.000000000,0 wto=false gul=0,0
data: "k"/14.000000000,0 -> {localTs=11.000000000,0}/BYTES/b
meta: "k/10"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=10} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/10"/11.000000000,0 -> /BYTES/10
meta: "k/20"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=20} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/20"/11.000000000,0 -> /BYTES/20
meta: "k/30"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=30} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/30"/11.000000000,0 -> /BYTES/30


# Put a couple values at different sequence numbers in this new txn.

run ok
with t=B
  txn_step     seq=10
  put          k=l v=a
  txn_step     seq=20
  put          k=l v=b
  txn_step     seq=30
  put          k=l v=c
  check_intent k=l
  get          k=l
----
put: lock acquisition = {l id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=20.000000000,0 min=0,0 seq=10 Replicated Intent []}
put: lock acquisition = {l id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=20.000000000,0 min=0,0 seq=20 Replicated Intent []}
put: lock acquisition = {l id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=20.000000000,0 min=0,0 seq=30 Replicated Intent []}
meta: "l" -> txn={id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=20.000000000,0 min=0,0 seq=30} ts=20.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} mergeTs=<nil> txnDidNotUpdateMeta=false
get: "l" -> /BYTES/c @20.000000000,0
>> at end:
txn: "B" meta={id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=20.000000000,0 min=0,0 seq=30} lock=true stat=PENDING rts=20.000000000,0 wto=false gul=0,0
data: "k"/14.000000000,0 -> {localTs=11.000000000,0}/BYTES/b
meta: "k/10"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=10} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/10"/11.000000000,0 -> /BYTES/10
meta: "k/20"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=20} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/20"/11.000000000,0 -> /BYTES/20
meta: "k/30"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=30} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/30"/11.000000000,0 -> /BYTES/30
meta: "l"/0,0 -> txn={id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=20.000000000,0 min=0,0 seq=30} ts=20.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} mergeTs=<nil> txnDidNotUpdateMeta=false
data: "l"/20.000000000,0 -> /BYTES/c


# Blow up the entire intent history, then do a commit. No value or intent should
# remain.

run error
with t=B
  txn_step        seq=35
  txn_ignore_seqs seqs=(5-35)
  check_intent    k=l
  get             k=l
  resolve_intent  k=l status=COMMITTED
  check_intent    k=l
----
meta: "l" -> txn={id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=20.000000000,0 min=0,0 seq=30} ts=20.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} mergeTs=<nil> txnDidNotUpdateMeta=false
get: "l" -> <no data>
resolve_intent: "l" -> resolved key = true
>> at end:
txn: "B" meta={id=00000002 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=20.000000000,0 min=0,0 seq=35} lock=true stat=PENDING rts=20.000000000,0 wto=false gul=0,0 isn=1
data: "k"/14.000000000,0 -> {localTs=11.000000000,0}/BYTES/b
meta: "k/10"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=10} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/10"/11.000000000,0 -> /BYTES/10
meta: "k/20"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=20} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/20"/11.000000000,0 -> /BYTES/20
meta: "k/30"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=30} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/30"/11.000000000,0 -> /BYTES/30
error: (*withstack.withStack:) meta: "l" -> expected intent, found none


run ok
with t=C
  txn_begin      ts=30
  get            k=l
----
get: "l" -> <no data>
>> at end:
txn: "C" meta={id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=30.000000000,0 min=0,0 seq=0} lock=true stat=PENDING rts=30.000000000,0 wto=false gul=0,0


# Put some values, then ignore all except the first, then do a commit. The
# first value put should be committed.

run ok
with t=C
  txn_step     seq=10
  put          k=m v=a
  txn_step     seq=20
  put          k=m v=b
  txn_step     seq=30
  put          k=m v=c
  check_intent k=m
  get          k=m
----
put: lock acquisition = {m id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=30.000000000,0 min=0,0 seq=10 Replicated Intent []}
put: lock acquisition = {m id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=30.000000000,0 min=0,0 seq=20 Replicated Intent []}
put: lock acquisition = {m id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=30.000000000,0 min=0,0 seq=30 Replicated Intent []}
meta: "m" -> txn={id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=30.000000000,0 min=0,0 seq=30} ts=30.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} mergeTs=<nil> txnDidNotUpdateMeta=false
get: "m" -> /BYTES/c @30.000000000,0
>> at end:
txn: "C" meta={id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=30.000000000,0 min=0,0 seq=30} lock=true stat=PENDING rts=30.000000000,0 wto=false gul=0,0
data: "k"/14.000000000,0 -> {localTs=11.000000000,0}/BYTES/b
meta: "k/10"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=10} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/10"/11.000000000,0 -> /BYTES/10
meta: "k/20"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=20} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/20"/11.000000000,0 -> /BYTES/20
meta: "k/30"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=30} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/30"/11.000000000,0 -> /BYTES/30
meta: "m"/0,0 -> txn={id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=30.000000000,0 min=0,0 seq=30} ts=30.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} mergeTs=<nil> txnDidNotUpdateMeta=false
data: "m"/30.000000000,0 -> /BYTES/c


run ok
with t=C
  txn_ignore_seqs seqs=(15-35)
  check_intent    k=m
  get             k=m
  resolve_intent  k=m status=COMMITTED
----
meta: "m" -> txn={id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=30.000000000,0 min=0,0 seq=30} ts=30.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} mergeTs=<nil> txnDidNotUpdateMeta=false
get: "m" -> /BYTES/a @30.000000000,0
resolve_intent: "m" -> resolved key = true
>> at end:
txn: "C" meta={id=00000003 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=30.000000000,0 min=0,0 seq=30} lock=true stat=PENDING rts=30.000000000,0 wto=false gul=0,0 isn=1
data: "k"/14.000000000,0 -> {localTs=11.000000000,0}/BYTES/b
meta: "k/10"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=10} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/10"/11.000000000,0 -> /BYTES/10
meta: "k/20"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=20} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/20"/11.000000000,0 -> /BYTES/20
meta: "k/30"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=30} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/30"/11.000000000,0 -> /BYTES/30
data: "m"/30.000000000,0 -> /BYTES/a


run ok
with t=D
  txn_begin    ts=40
  get          k=m
  txn_step     seq=10
  put          k=n v=a
  txn_step     seq=20
  put          k=n v=b
  txn_step     seq=30
  put          k=n v=c
  check_intent k=n
  get          k=n
----
get: "m" -> /BYTES/a @30.000000000,0
put: lock acquisition = {n id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=40.000000000,0 min=0,0 seq=10 Replicated Intent []}
put: lock acquisition = {n id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=40.000000000,0 min=0,0 seq=20 Replicated Intent []}
put: lock acquisition = {n id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=40.000000000,0 min=0,0 seq=30 Replicated Intent []}
meta: "n" -> txn={id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=40.000000000,0 min=0,0 seq=30} ts=40.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} mergeTs=<nil> txnDidNotUpdateMeta=false
get: "n" -> /BYTES/c @40.000000000,0
>> at end:
txn: "D" meta={id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=40.000000000,0 min=0,0 seq=30} lock=true stat=PENDING rts=40.000000000,0 wto=false gul=0,0
data: "k"/14.000000000,0 -> {localTs=11.000000000,0}/BYTES/b
meta: "k/10"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=10} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/10"/11.000000000,0 -> /BYTES/10
meta: "k/20"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=20} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/20"/11.000000000,0 -> /BYTES/20
meta: "k/30"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=30} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/30"/11.000000000,0 -> /BYTES/30
data: "m"/30.000000000,0 -> /BYTES/a
meta: "n"/0,0 -> txn={id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=40.000000000,0 min=0,0 seq=30} ts=40.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} mergeTs=<nil> txnDidNotUpdateMeta=false
data: "n"/40.000000000,0 -> /BYTES/c


# Do a push. The intent should remain, unmodified, save for the timestamp.
run ok
with t=D
  check_intent   k=n
  get            k=n
  txn_advance    ts=45
  resolve_intent k=n status=PENDING
  check_intent   k=n
  get            k=n
----
meta: "n" -> txn={id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=40.000000000,0 min=0,0 seq=30} ts=40.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} mergeTs=<nil> txnDidNotUpdateMeta=false
get: "n" -> /BYTES/c @40.000000000,0
resolve_intent: "n" -> resolved key = true
meta: "n" -> txn={id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=45.000000000,0 min=0,0 seq=30} ts=45.000000000,0 del=false klen=12 vlen=20 ih={{10 /BYTES/a}{20 /BYTES/b}} mergeTs=<nil> txnDidNotUpdateMeta=false
get: "n" -> /BYTES/c @45.000000000,0
>> at end:
txn: "D" meta={id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=45.000000000,0 min=0,0 seq=30} lock=true stat=PENDING rts=40.000000000,0 wto=false gul=0,0
data: "k"/14.000000000,0 -> {localTs=11.000000000,0}/BYTES/b
meta: "k/10"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=10} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/10"/11.000000000,0 -> /BYTES/10
meta: "k/20"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=20} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/20"/11.000000000,0 -> /BYTES/20
meta: "k/30"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=30} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/30"/11.000000000,0 -> /BYTES/30
data: "m"/30.000000000,0 -> /BYTES/a
meta: "n"/0,0 -> txn={id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=45.000000000,0 min=0,0 seq=30} ts=45.000000000,0 del=false klen=12 vlen=20 ih={{10 /BYTES/a}{20 /BYTES/b}} mergeTs=<nil> txnDidNotUpdateMeta=false
data: "n"/45.000000000,0 -> {localTs=40.000000000,0}/BYTES/c

# Ignore sequence numbers other than the current one, then commit. The value
# shouldn't change.
run ok
with t=D
  txn_ignore_seqs seqs=(5-25)
  check_intent    k=n
  get             k=n
  resolve_intent  k=n status=COMMITTED
with t=E
  txn_begin      ts=50
  get            k=n
----
meta: "n" -> txn={id=00000004 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=45.000000000,0 min=0,0 seq=30} ts=45.000000000,0 del=false klen=12 vlen=20 ih={{10 /BYTES/a}{20 /BYTES/b}} mergeTs=<nil> txnDidNotUpdateMeta=false
get: "n" -> /BYTES/c @45.000000000,0
resolve_intent: "n" -> resolved key = true
get: "n" -> /BYTES/c @45.000000000,0
>> at end:
txn: "E" meta={id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=0} lock=true stat=PENDING rts=50.000000000,0 wto=false gul=0,0
data: "k"/14.000000000,0 -> {localTs=11.000000000,0}/BYTES/b
meta: "k/10"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=10} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/10"/11.000000000,0 -> /BYTES/10
meta: "k/20"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=20} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/20"/11.000000000,0 -> /BYTES/20
meta: "k/30"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=30} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/30"/11.000000000,0 -> /BYTES/30
data: "m"/30.000000000,0 -> /BYTES/a
data: "n"/45.000000000,0 -> {localTs=40.000000000,0}/BYTES/c

# Write a couple values at different sequence numbers on this key, then ignore
# them all, then do a resolve_intent while the txn is pending. The intent should
# disappear. Also do the same on a new key.

run ok
with t=E
  get            k=n
  get            k=o
  txn_step       seq=10
  put            k=n v=a
  put            k=o v=a
  txn_step       seq=20
  put            k=n v=b
  put            k=o v=b
  txn_step       seq=30
  put            k=n v=c
  put            k=o v=c
----
get: "n" -> /BYTES/c @45.000000000,0
get: "o" -> <no data>
put: lock acquisition = {n id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=10 Replicated Intent []}
put: lock acquisition = {o id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=10 Replicated Intent []}
put: lock acquisition = {n id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=20 Replicated Intent []}
put: lock acquisition = {o id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=20 Replicated Intent []}
put: lock acquisition = {n id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=30 Replicated Intent []}
put: lock acquisition = {o id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=30 Replicated Intent []}
>> at end:
txn: "E" meta={id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=30} lock=true stat=PENDING rts=50.000000000,0 wto=false gul=0,0
data: "k"/14.000000000,0 -> {localTs=11.000000000,0}/BYTES/b
meta: "k/10"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=10} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/10"/11.000000000,0 -> /BYTES/10
meta: "k/20"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=20} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/20"/11.000000000,0 -> /BYTES/20
meta: "k/30"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=30} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/30"/11.000000000,0 -> /BYTES/30
data: "m"/30.000000000,0 -> /BYTES/a
meta: "n"/0,0 -> txn={id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=30} ts=50.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} mergeTs=<nil> txnDidNotUpdateMeta=false
data: "n"/50.000000000,0 -> /BYTES/c
data: "n"/45.000000000,0 -> {localTs=40.000000000,0}/BYTES/c
meta: "o"/0,0 -> txn={id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=30} ts=50.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} mergeTs=<nil> txnDidNotUpdateMeta=false
data: "o"/50.000000000,0 -> /BYTES/c


run ok
with t=E
  txn_ignore_seqs seqs=(5-35)
  get             k=n
  get             k=o
  resolve_intent  k=n status=PENDING
  resolve_intent  k=o status=PENDING
----
get: "n" -> /BYTES/c @45.000000000,0
get: "o" -> <no data>
resolve_intent: "n" -> resolved key = true
resolve_intent: "o" -> resolved key = true
>> at end:
txn: "E" meta={id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=30} lock=true stat=PENDING rts=50.000000000,0 wto=false gul=0,0 isn=1
data: "k"/14.000000000,0 -> {localTs=11.000000000,0}/BYTES/b
meta: "k/10"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=10} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/10"/11.000000000,0 -> /BYTES/10
meta: "k/20"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=20} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/20"/11.000000000,0 -> /BYTES/20
meta: "k/30"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=30} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/30"/11.000000000,0 -> /BYTES/30
data: "m"/30.000000000,0 -> /BYTES/a
data: "n"/45.000000000,0 -> {localTs=40.000000000,0}/BYTES/c

run ok
with t=E
  get k=n
  get k=o
----
get: "n" -> /BYTES/c @45.000000000,0
get: "o" -> <no data>

# No intent should exist on either value

run error
with t=E
  check_intent k=n
----
error: (*withstack.withStack:) meta: "n" -> expected intent, found none

run error
with t=E
  check_intent k=o
----
error: (*withstack.withStack:) meta: "o" -> expected intent, found none

# Push a transaction forward, while all writes for a key are ignored. The
# ignored value and the intent should be deleted.
run ok
with t=E
  txn_ignore_seqs seqs=(5-6)
  txn_step        seq=10
  put             k=o v=a
  txn_step        seq=20
  put             k=o v=b
  txn_step        seq=30
  put             k=o v=c
  check_intent    k=o
----
put: lock acquisition = {o id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=10 Replicated Intent [{5 6}]}
put: lock acquisition = {o id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=20 Replicated Intent [{5 6}]}
put: lock acquisition = {o id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=30 Replicated Intent [{5 6}]}
meta: "o" -> txn={id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=30} ts=50.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} mergeTs=<nil> txnDidNotUpdateMeta=false
>> at end:
txn: "E" meta={id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=30} lock=true stat=PENDING rts=50.000000000,0 wto=false gul=0,0 isn=1
data: "k"/14.000000000,0 -> {localTs=11.000000000,0}/BYTES/b
meta: "k/10"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=10} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/10"/11.000000000,0 -> /BYTES/10
meta: "k/20"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=20} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/20"/11.000000000,0 -> /BYTES/20
meta: "k/30"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=30} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/30"/11.000000000,0 -> /BYTES/30
data: "m"/30.000000000,0 -> /BYTES/a
data: "n"/45.000000000,0 -> {localTs=40.000000000,0}/BYTES/c
meta: "o"/0,0 -> txn={id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=30} ts=50.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}{20 /BYTES/b}} mergeTs=<nil> txnDidNotUpdateMeta=false
data: "o"/50.000000000,0 -> /BYTES/c


run ok
with t=E
  txn_advance     ts=55
  txn_ignore_seqs seqs=(5-35)
  resolve_intent  k=o status=PENDING
  get             k=o
----
resolve_intent: "o" -> resolved key = true
get: "o" -> <no data>
>> at end:
txn: "E" meta={id=00000005 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=55.000000000,0 min=0,0 seq=30} lock=true stat=PENDING rts=50.000000000,0 wto=false gul=0,0 isn=1
data: "k"/14.000000000,0 -> {localTs=11.000000000,0}/BYTES/b
meta: "k/10"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=10} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/10"/11.000000000,0 -> /BYTES/10
meta: "k/20"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=20} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/20"/11.000000000,0 -> /BYTES/20
meta: "k/30"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=30} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/30"/11.000000000,0 -> /BYTES/30
data: "m"/30.000000000,0 -> /BYTES/a
data: "n"/45.000000000,0 -> {localTs=40.000000000,0}/BYTES/c


run error
with t=E
  check_intent k=o
----
error: (*withstack.withStack:) meta: "o" -> expected intent, found none


run ok
with t=F k=o
  txn_begin    ts=40
  txn_advance  ts=50
  txn_step     seq=10
  put          v=a
  txn_step     seq=20
  put          v=b
  check_intent
  get
----
put: lock acquisition = {o id=00000006 key="o" iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=10 Replicated Intent []}
put: lock acquisition = {o id=00000006 key="o" iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=20 Replicated Intent []}
meta: "o" -> txn={id=00000006 key="o" iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=20} ts=50.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}} mergeTs=<nil> txnDidNotUpdateMeta=false
get: "o" -> /BYTES/b @50.000000000,0
>> at end:
txn: "F" meta={id=00000006 key="o" iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=20} lock=true stat=PENDING rts=40.000000000,0 wto=false gul=0,0
data: "k"/14.000000000,0 -> {localTs=11.000000000,0}/BYTES/b
meta: "k/10"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=10} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/10"/11.000000000,0 -> /BYTES/10
meta: "k/20"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=20} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/20"/11.000000000,0 -> /BYTES/20
meta: "k/30"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=30} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/30"/11.000000000,0 -> /BYTES/30
data: "m"/30.000000000,0 -> /BYTES/a
data: "n"/45.000000000,0 -> {localTs=40.000000000,0}/BYTES/c
meta: "o"/0,0 -> txn={id=00000006 key="o" iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=20} ts=50.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}} mergeTs=<nil> txnDidNotUpdateMeta=false
data: "o"/50.000000000,0 -> /BYTES/b


# Do a push with a lower timestamp and an ignored seqnum. This should delete the
# value at seqnum 20 but should *not* regress the intent's timestamp.

run ok
with t=F k=o
  txn_ignore_seqs seqs=(15-25)
  # the following operation is really a txn_backwards.
  txn_advance    ts=45
  resolve_intent status=PENDING
  check_intent
  get
----
resolve_intent: "o" -> resolved key = true
meta: "o" -> txn={id=00000006 key="o" iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=10} ts=50.000000000,0 del=false klen=12 vlen=6 mergeTs=<nil> txnDidNotUpdateMeta=false
get: "o" -> /BYTES/a @50.000000000,0
>> at end:
txn: "F" meta={id=00000006 key="o" iso=Serializable pri=0.00000000 epo=0 ts=45.000000000,0 min=0,0 seq=20} lock=true stat=PENDING rts=40.000000000,0 wto=false gul=0,0 isn=1
data: "k"/14.000000000,0 -> {localTs=11.000000000,0}/BYTES/b
meta: "k/10"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=10} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/10"/11.000000000,0 -> /BYTES/10
meta: "k/20"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=20} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/20"/11.000000000,0 -> /BYTES/20
meta: "k/30"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=11.000000000,0 min=0,0 seq=30} ts=11.000000000,0 del=false klen=12 vlen=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "k/30"/11.000000000,0 -> /BYTES/30
data: "m"/30.000000000,0 -> /BYTES/a
data: "n"/45.000000000,0 -> {localTs=40.000000000,0}/BYTES/c
meta: "o"/0,0 -> txn={id=00000006 key="o" iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=10} ts=50.000000000,0 del=false klen=12 vlen=6 mergeTs=<nil> txnDidNotUpdateMeta=false
data: "o"/50.000000000,0 -> /BYTES/a

run ok
clear_range k=k end=p
----
>> at end:
<no data>

# Try to update a pending intent with a lower epoch than the resolution.
# The intent should be aborted because the new epoch may not write it again.

run ok
with t=G k=p
  txn_begin    ts=50
  txn_step     seq=10
  put          v=a
  txn_step     seq=20
  put          v=b
  check_intent
  get
----
put: lock acquisition = {p id=00000007 key="p" iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=10 Replicated Intent []}
put: lock acquisition = {p id=00000007 key="p" iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=20 Replicated Intent []}
meta: "p" -> txn={id=00000007 key="p" iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=20} ts=50.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}} mergeTs=<nil> txnDidNotUpdateMeta=false
get: "p" -> /BYTES/b @50.000000000,0
>> at end:
txn: "G" meta={id=00000007 key="p" iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=20} lock=true stat=PENDING rts=50.000000000,0 wto=false gul=0,0
meta: "p"/0,0 -> txn={id=00000007 key="p" iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=20} ts=50.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}} mergeTs=<nil> txnDidNotUpdateMeta=false
data: "p"/50.000000000,0 -> /BYTES/b

run ok log-ops
with t=G k=p
  txn_restart
  txn_ignore_seqs seqs=(15-25)
  resolve_intent status=PENDING
  get
----
resolve_intent: "p" -> resolved key = true
get: "p" -> <no data>
>> at end:
txn: "G" meta={id=00000007 key="p" iso=Serializable pri=0.00000000 epo=1 ts=50.000000000,0 min=0,0 seq=0} lock=true stat=PENDING rts=50.000000000,0 wto=false gul=0,0 isn=1
<no data>
logical op: *enginepb.MVCCAbortIntentOp

run ok
clear_range k=p end=-p
----
>> at end:
<no data>

# Try to update a pending intent with a higher epoch than the resolution's epoch.
# The intent is not pushed, so it is not updated because the intent history
# should be updated only when the epochs match.

run ok
with t=H k=q
  txn_begin    ts=50
  txn_restart  epoch=1
  txn_step     seq=10
  put          v=a
  txn_step     seq=20
  put          v=b
  check_intent
  get
----
put: lock acquisition = {q id=00000008 key="q" iso=Serializable pri=0.00000000 epo=1 ts=50.000000000,0 min=0,0 seq=10 Replicated Intent []}
put: lock acquisition = {q id=00000008 key="q" iso=Serializable pri=0.00000000 epo=1 ts=50.000000000,0 min=0,0 seq=20 Replicated Intent []}
meta: "q" -> txn={id=00000008 key="q" iso=Serializable pri=0.00000000 epo=1 ts=50.000000000,0 min=0,0 seq=20} ts=50.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}} mergeTs=<nil> txnDidNotUpdateMeta=false
get: "q" -> /BYTES/b @50.000000000,0
>> at end:
txn: "H" meta={id=00000008 key="q" iso=Serializable pri=0.00000000 epo=1 ts=50.000000000,0 min=0,0 seq=20} lock=true stat=PENDING rts=50.000000000,0 wto=false gul=0,0
meta: "q"/0,0 -> txn={id=00000008 key="q" iso=Serializable pri=0.00000000 epo=1 ts=50.000000000,0 min=0,0 seq=20} ts=50.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}} mergeTs=<nil> txnDidNotUpdateMeta=false
data: "q"/50.000000000,0 -> /BYTES/b

run ok log-ops
with t=H k=q
  txn_restart epoch=0
  txn_ignore_seqs seqs=(15-25)
  resolve_intent status=PENDING
  check_intent
----
resolve_intent: "q" -> resolved key = false
meta: "q" -> txn={id=00000008 key="q" iso=Serializable pri=0.00000000 epo=1 ts=50.000000000,0 min=0,0 seq=20} ts=50.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}} mergeTs=<nil> txnDidNotUpdateMeta=false
>> at end:
txn: "H" meta={id=00000008 key="q" iso=Serializable pri=0.00000000 epo=0 ts=50.000000000,0 min=0,0 seq=0} lock=true stat=PENDING rts=50.000000000,0 wto=false gul=0,0 isn=1
meta: "q"/0,0 -> txn={id=00000008 key="q" iso=Serializable pri=0.00000000 epo=1 ts=50.000000000,0 min=0,0 seq=20} ts=50.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}} mergeTs=<nil> txnDidNotUpdateMeta=false
data: "q"/50.000000000,0 -> /BYTES/b

run ok
clear_range k=q end=-q
----
>> at end:
<no data>

# Update a pending intent with a higher epoch than the resolution's epoch.
# The intent is pushed, so its timestamp is updated to help the pusher make progress.
# The intent history is not updated because the epochs don't match.

run ok
with t=I k=r
  txn_begin    ts=50
  txn_restart  epoch=1
  txn_step     seq=10
  put          v=a
  txn_step     seq=20
  put          v=b
  check_intent
  get
----
put: lock acquisition = {r id=00000009 key="r" iso=Serializable pri=0.00000000 epo=1 ts=50.000000000,0 min=0,0 seq=10 Replicated Intent []}
put: lock acquisition = {r id=00000009 key="r" iso=Serializable pri=0.00000000 epo=1 ts=50.000000000,0 min=0,0 seq=20 Replicated Intent []}
meta: "r" -> txn={id=00000009 key="r" iso=Serializable pri=0.00000000 epo=1 ts=50.000000000,0 min=0,0 seq=20} ts=50.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}} mergeTs=<nil> txnDidNotUpdateMeta=false
get: "r" -> /BYTES/b @50.000000000,0
>> at end:
txn: "I" meta={id=00000009 key="r" iso=Serializable pri=0.00000000 epo=1 ts=50.000000000,0 min=0,0 seq=20} lock=true stat=PENDING rts=50.000000000,0 wto=false gul=0,0
meta: "r"/0,0 -> txn={id=00000009 key="r" iso=Serializable pri=0.00000000 epo=1 ts=50.000000000,0 min=0,0 seq=20} ts=50.000000000,0 del=false klen=12 vlen=6 ih={{10 /BYTES/a}} mergeTs=<nil> txnDidNotUpdateMeta=false
data: "r"/50.000000000,0 -> /BYTES/b

run ok log-ops
with t=I k=r
  txn_restart epoch=0
  txn_advance ts=60
  txn_ignore_seqs seqs=(15-25)
  resolve_intent status=PENDING
  check_intent
----
resolve_intent: "r" -> resolved key = true
meta: "r" -> txn={id=00000009 key="r" iso=Serializable pri=0.00000000 epo=1 ts=60.000000000,0 min=0,0 seq=20} ts=60.000000000,0 del=false klen=12 vlen=20 ih={{10 /BYTES/a}} mergeTs=<nil> txnDidNotUpdateMeta=false
>> at end:
txn: "I" meta={id=00000009 key="r" iso=Serializable pri=0.00000000 epo=0 ts=60.000000000,0 min=0,0 seq=0} lock=true stat=PENDING rts=50.000000000,0 wto=false gul=0,0 isn=1
meta: "r"/0,0 -> txn={id=00000009 key="r" iso=Serializable pri=0.00000000 epo=1 ts=60.000000000,0 min=0,0 seq=20} ts=60.000000000,0 del=false klen=12 vlen=20 ih={{10 /BYTES/a}} mergeTs=<nil> txnDidNotUpdateMeta=false
data: "r"/60.000000000,0 -> {localTs=50.000000000,0}/BYTES/b
logical op: *enginepb.MVCCUpdateIntentOp
