# -------------------------------------------------------------
# In this test we acquire the same lock multiple times at different
# transaction sequence numbers. The test cases correspond closely
# to those in TestReplicaTxnIdempotency.
# -------------------------------------------------------------

new-lock-table maxlocks=10000
----

# -------------------------------------------------------------
# Acquire locks with sequence numbers 1, 2, and 4
# -------------------------------------------------------------

new-txn txn=txn1 ts=10,1 epoch=0 seq=1
----

new-request r=req1 txn=txn1 ts=10,1 spans=exclusive@a
----

scan r=req1
----
start-waiting: false

acquire r=req1 k=a durability=u strength=exclusive
----
num=1
 lock: "a"
  holder: txn: 00000000-0000-0000-0000-000000000001 epoch: 0, iso: Serializable, ts: 10.000000000,1, info: unrepl [(str: Exclusive seq: 1)]

dequeue r=req1
----
num=1
 lock: "a"
  holder: txn: 00000000-0000-0000-0000-000000000001 epoch: 0, iso: Serializable, ts: 10.000000000,1, info: unrepl [(str: Exclusive seq: 1)]

new-txn txn=txn1 ts=10,1 epoch=0 seq=2
----

new-request r=req2 txn=txn1 ts=10,1 spans=exclusive@a
----

scan r=req2
----
start-waiting: false

acquire r=req2 k=a durability=u strength=exclusive
----
num=1
 lock: "a"
  holder: txn: 00000000-0000-0000-0000-000000000001 epoch: 0, iso: Serializable, ts: 10.000000000,1, info: unrepl [(str: Exclusive seq: 1)]

dequeue r=req2
----
num=1
 lock: "a"
  holder: txn: 00000000-0000-0000-0000-000000000001 epoch: 0, iso: Serializable, ts: 10.000000000,1, info: unrepl [(str: Exclusive seq: 1)]

new-txn txn=txn1 ts=10,1 epoch=0 seq=4
----

new-request r=req3 txn=txn1 ts=10,1 spans=exclusive@a
----

scan r=req3
----
start-waiting: false

acquire r=req3 k=a durability=u strength=exclusive
----
num=1
 lock: "a"
  holder: txn: 00000000-0000-0000-0000-000000000001 epoch: 0, iso: Serializable, ts: 10.000000000,1, info: unrepl [(str: Exclusive seq: 1)]

dequeue r=req3
----
num=1
 lock: "a"
  holder: txn: 00000000-0000-0000-0000-000000000001 epoch: 0, iso: Serializable, ts: 10.000000000,1, info: unrepl [(str: Exclusive seq: 1)]

# -------------------------------------------------------------
# Re-Acquire lock with sequence number 4
# -------------------------------------------------------------

new-txn txn=txn1 ts=10,1 epoch=0 seq=4
----

new-request r=req3 txn=txn1 ts=10,1 spans=exclusive@a
----

scan r=req3
----
start-waiting: false

acquire r=req3 k=a durability=u strength=exclusive
----
num=1
 lock: "a"
  holder: txn: 00000000-0000-0000-0000-000000000001 epoch: 0, iso: Serializable, ts: 10.000000000,1, info: unrepl [(str: Exclusive seq: 1)]

dequeue r=req3
----
num=1
 lock: "a"
  holder: txn: 00000000-0000-0000-0000-000000000001 epoch: 0, iso: Serializable, ts: 10.000000000,1, info: unrepl [(str: Exclusive seq: 1)]

# -------------------------------------------------------------
# Re-Acquire lock with sequence number 2
# -------------------------------------------------------------

new-txn txn=txn1 ts=10,1 epoch=0 seq=2
----

new-request r=req4 txn=txn1 ts=10,1 spans=exclusive@a
----

scan r=req4
----
start-waiting: false

acquire r=req4 k=a durability=u strength=exclusive
----
num=1
 lock: "a"
  holder: txn: 00000000-0000-0000-0000-000000000001 epoch: 0, iso: Serializable, ts: 10.000000000,1, info: unrepl [(str: Exclusive seq: 1)]

dequeue r=req4
----
num=1
 lock: "a"
  holder: txn: 00000000-0000-0000-0000-000000000001 epoch: 0, iso: Serializable, ts: 10.000000000,1, info: unrepl [(str: Exclusive seq: 1)]

# -------------------------------------------------------------
# Try to acquire lock with sequence number 3. Should update the
# lock's sequence history because the sequence does not already
# exist in the sequence history.
# -------------------------------------------------------------

new-txn txn=txn1 ts=10,1 epoch=0 seq=3
----

new-request r=req5 txn=txn1 ts=10,1 spans=exclusive@a
----

scan r=req5
----
start-waiting: false

acquire r=req5 k=a durability=u strength=exclusive
----
num=1
 lock: "a"
  holder: txn: 00000000-0000-0000-0000-000000000001 epoch: 0, iso: Serializable, ts: 10.000000000,1, info: unrepl [(str: Exclusive seq: 1)]

dequeue r=req5
----
num=1
 lock: "a"
  holder: txn: 00000000-0000-0000-0000-000000000001 epoch: 0, iso: Serializable, ts: 10.000000000,1, info: unrepl [(str: Exclusive seq: 1)]

# -------------------------------------------------------------
# Acquire lock with sequence numbers 5
# -------------------------------------------------------------

new-txn txn=txn1 ts=10,1 epoch=0 seq=5
----

new-request r=req6 txn=txn1 ts=10,1 spans=exclusive@a
----

scan r=req6
----
start-waiting: false

acquire r=req6 k=a durability=u strength=exclusive
----
num=1
 lock: "a"
  holder: txn: 00000000-0000-0000-0000-000000000001 epoch: 0, iso: Serializable, ts: 10.000000000,1, info: unrepl [(str: Exclusive seq: 1)]

dequeue r=req6
----
num=1
 lock: "a"
  holder: txn: 00000000-0000-0000-0000-000000000001 epoch: 0, iso: Serializable, ts: 10.000000000,1, info: unrepl [(str: Exclusive seq: 1)]

# ------------------------------------------------------------------------------
# Ensure that trying to acquire a lock at a lower sequence number than what it
# is held with returns the appropriate error.
# ------------------------------------------------------------------------------

clear
----
num=0

new-txn txn=txn1 ts=10,1 epoch=0 seq=5
----

new-request r=req7 txn=txn1 ts=10,1 spans=exclusive@a
----

acquire r=req7 k=a durability=u strength=exclusive
----
num=1
 lock: "a"
  holder: txn: 00000000-0000-0000-0000-000000000001 epoch: 0, iso: Serializable, ts: 10.000000000,1, info: unrepl [(str: Exclusive seq: 5)]

new-txn txn=txn1 ts=10,1 epoch=0 seq=3
----

new-request r=req8 txn=txn1 ts=10,1 spans=exclusive@a
----

acquire r=req8 k=a durability=u strength=exclusive
----
cannot acquire lock with strength Exclusive at seq number 3, already tracked at higher seq number 5
