# This test creates raft events which have different (partial) MsgApps for each
# replica. This test is meant to exercise send queue tracking while in push
# mode, as opposed to pulling entries from Raft.
init
range_id=1 tenant_id=1 local_replica_id=1 next_raft_index=1
  store_id=1 replica_id=1 type=VOTER_FULL state=StateReplicate next=1
  store_id=2 replica_id=2 type=VOTER_FULL state=StateReplicate next=1
  store_id=3 replica_id=3 type=VOTER_FULL state=StateReplicate next=1
----
r1: [(n1,s1):1*,(n2,s2):2,(n3,s3):3]
t1/s1: eval reg=+16 MiB/+16 MiB ela=+8.0 MiB/+8.0 MiB
       send reg=+16 MiB/+16 MiB ela=+8.0 MiB/+8.0 MiB
t1/s2: eval reg=+16 MiB/+16 MiB ela=+8.0 MiB/+8.0 MiB
       send reg=+16 MiB/+16 MiB ela=+8.0 MiB/+8.0 MiB
t1/s3: eval reg=+16 MiB/+16 MiB ela=+8.0 MiB/+8.0 MiB
       send reg=+16 MiB/+16 MiB ela=+8.0 MiB/+8.0 MiB

# Create MsgApps with different entries for each replica.
raft_event
range_id=1
  entries
    term=1 index=1 pri=NormalPri size=1MiB
    term=1 index=2 pri=NormalPri size=1MiB
    term=1 index=3 pri=NormalPri size=1MiB
  sending
    replica_id=1 [1,4)
    replica_id=2 [1,3)
    replica_id=3 [1,2)
----
t1/s1: eval reg=+13 MiB/+16 MiB ela=+5.0 MiB/+8.0 MiB
       send reg=+13 MiB/+16 MiB ela=+5.0 MiB/+8.0 MiB
t1/s2: eval reg=+13 MiB/+16 MiB ela=+5.0 MiB/+8.0 MiB
       send reg=+14 MiB/+16 MiB ela=+6.0 MiB/+8.0 MiB
t1/s3: eval reg=+13 MiB/+16 MiB ela=+5.0 MiB/+8.0 MiB
       send reg=+15 MiB/+16 MiB ela=+7.0 MiB/+8.0 MiB

# Note how r1 tracks all the entries, as its MsgApp contains all the entries,
# while r2 and r3 have partial entry tracking.
stream_state range_id=1
----
(n1,s1):1: state=replicate closed=false inflight=[1,4) (3.0 MiB) send_queue=[4,4) precise_q_size=+0 B
eval deducted: reg=+3.0 MiB ela=+0 B
eval original in send-q: reg=+0 B ela=+0 B
NormalPri:
  term=1 index=1  tokens=1048576
  term=1 index=2  tokens=1048576
  term=1 index=3  tokens=1048576
++++
(n2,s2):2: state=replicate closed=false inflight=[1,3) (2.0 MiB) send_queue=[3,4) precise_q_size=+1.0 MiB
eval deducted: reg=+3.0 MiB ela=+0 B
eval original in send-q: reg=+1.0 MiB ela=+0 B
NormalPri:
  term=1 index=1  tokens=1048576
  term=1 index=2  tokens=1048576
++++
(n3,s3):3: state=replicate closed=false inflight=[1,2) (1.0 MiB) send_queue=[2,4) precise_q_size=+2.0 MiB
eval deducted: reg=+3.0 MiB ela=+0 B
eval original in send-q: reg=+2.0 MiB ela=+0 B
NormalPri:
  term=1 index=1  tokens=1048576
++++

# Send another event, this time r2 and r3 will recreate the send queue state
# because the sending entries contain a regression. r2 is being sent a MsgApp
# with entries [2,5) intersecting than the last send range [1,3), so it will
# recreate the send stream and additionally track the new entry (4). r3
# recreates the send stream as well, for the same reason, as indexToSend (2) !=
# the first MsgApp index [1,4). r3 doesn't track entry (3) because it's not in
# entries added here.
raft_event
range_id=1
  entries
    term=1 index=4 pri=NormalPri size=1MiB
    term=1 index=5 pri=NormalPri size=1MiB
  sending
    replica_id=1 [4,6)
    replica_id=2 [2,5)
    replica_id=3 [1,4)
----
t1/s1: eval reg=+11 MiB/+16 MiB ela=+3.0 MiB/+8.0 MiB
       send reg=+11 MiB/+16 MiB ela=+3.0 MiB/+8.0 MiB
t1/s2: eval reg=+14 MiB/+16 MiB ela=+6.0 MiB/+8.0 MiB
       send reg=+15 MiB/+16 MiB ela=+7.0 MiB/+8.0 MiB
t1/s3: eval reg=+14 MiB/+16 MiB ela=+6.0 MiB/+8.0 MiB
       send reg=+16 MiB/+16 MiB ela=+8.0 MiB/+8.0 MiB

stream_state range_id=1
----
(n1,s1):1: state=replicate closed=false inflight=[1,6) (5.0 MiB) send_queue=[6,6) precise_q_size=+0 B
eval deducted: reg=+5.0 MiB ela=+0 B
eval original in send-q: reg=+0 B ela=+0 B
NormalPri:
  term=1 index=1  tokens=1048576
  term=1 index=2  tokens=1048576
  term=1 index=3  tokens=1048576
  term=1 index=4  tokens=1048576
  term=1 index=5  tokens=1048576
++++
(n2,s2):2: state=replicate closed=false inflight=[1,5) (4.0 MiB) send_queue=[5,6) precise_q_size=+1.0 MiB
eval deducted: reg=+2.0 MiB ela=+0 B
eval original in send-q: reg=+1.0 MiB ela=+0 B
NormalPri:
  term=1 index=4  tokens=1048576
++++
(n3,s3):3: state=replicate closed=false inflight=[1,4) (3.0 MiB) send_queue=[4,6) precise_q_size=+2.0 MiB
eval deducted: reg=+2.0 MiB ela=+0 B
eval original in send-q: reg=+2.0 MiB ela=+0 B
++++

# Partially admit the entries, with r3 lagging by one entry. Expect to see the
# corresponding tracked deductions returned up to each replica's respective
# to_index.
admit
range_id=1
  store_id=1 term=1 to_index=4 pri=NormalPri
  store_id=2 term=1 to_index=4 pri=NormalPri
  store_id=3 term=1 to_index=3 pri=NormalPri
----
t1/s1: eval reg=+15 MiB/+16 MiB ela=+7.0 MiB/+8.0 MiB
       send reg=+15 MiB/+16 MiB ela=+7.0 MiB/+8.0 MiB
t1/s2: eval reg=+15 MiB/+16 MiB ela=+7.0 MiB/+8.0 MiB
       send reg=+16 MiB/+16 MiB ela=+8.0 MiB/+8.0 MiB
t1/s3: eval reg=+14 MiB/+16 MiB ela=+6.0 MiB/+8.0 MiB
       send reg=+16 MiB/+16 MiB ela=+8.0 MiB/+8.0 MiB

# Send an empty event so that replicaSendStreams are aware of the update to
# match.
raft_event
range_id=1
----
t1/s1: eval reg=+15 MiB/+16 MiB ela=+7.0 MiB/+8.0 MiB
       send reg=+15 MiB/+16 MiB ela=+7.0 MiB/+8.0 MiB
t1/s2: eval reg=+15 MiB/+16 MiB ela=+7.0 MiB/+8.0 MiB
       send reg=+16 MiB/+16 MiB ela=+8.0 MiB/+8.0 MiB
t1/s3: eval reg=+14 MiB/+16 MiB ela=+6.0 MiB/+8.0 MiB
       send reg=+16 MiB/+16 MiB ela=+8.0 MiB/+8.0 MiB

stream_state range_id=1
----
(n1,s1):1: state=replicate closed=false inflight=[5,6) (1.0 MiB) send_queue=[6,6) precise_q_size=+0 B
eval deducted: reg=+1.0 MiB ela=+0 B
eval original in send-q: reg=+0 B ela=+0 B
NormalPri:
  term=1 index=5  tokens=1048576
++++
(n2,s2):2: state=replicate closed=false inflight=[5,5) send_queue=[5,6) precise_q_size=+1.0 MiB
eval deducted: reg=+1.0 MiB ela=+0 B
eval original in send-q: reg=+1.0 MiB ela=+0 B
++++
(n3,s3):3: state=replicate closed=false inflight=[4,4) send_queue=[4,6) precise_q_size=+2.0 MiB
eval deducted: reg=+2.0 MiB ela=+0 B
eval original in send-q: reg=+2.0 MiB ela=+0 B
++++

# Send a raft_event that contains the unsent entries for each replica, in
# addition to the next entry added here. No replicas should recreate their send
# stream.
raft_event
range_id=1
    term=1 index=6 pri=NormalPri size=1MiB
  sending
    replica_id=1 [6,7)
    replica_id=2 [5,7)
    replica_id=3 [4,7)
----
t1/s1: eval reg=+14 MiB/+16 MiB ela=+6.0 MiB/+8.0 MiB
       send reg=+14 MiB/+16 MiB ela=+6.0 MiB/+8.0 MiB
t1/s2: eval reg=+14 MiB/+16 MiB ela=+6.0 MiB/+8.0 MiB
       send reg=+14 MiB/+16 MiB ela=+6.0 MiB/+8.0 MiB
t1/s3: eval reg=+13 MiB/+16 MiB ela=+5.0 MiB/+8.0 MiB
       send reg=+13 MiB/+16 MiB ela=+5.0 MiB/+8.0 MiB

stream_state range_id=1
----
(n1,s1):1: state=replicate closed=false inflight=[5,7) (2.0 MiB) send_queue=[7,7) precise_q_size=+0 B
eval deducted: reg=+2.0 MiB ela=+0 B
eval original in send-q: reg=+0 B ela=+0 B
NormalPri:
  term=1 index=5  tokens=1048576
  term=1 index=6  tokens=1048576
++++
(n2,s2):2: state=replicate closed=false inflight=[5,7) (2.0 MiB) send_queue=[7,7) precise_q_size=+0 B
eval deducted: reg=+2.0 MiB ela=+0 B
eval original in send-q: reg=+0 B ela=+0 B
NormalPri:
  term=1 index=5  tokens=1048576
  term=1 index=6  tokens=1048576
++++
(n3,s3):3: state=replicate closed=false inflight=[4,7) (3.0 MiB) send_queue=[7,7) precise_q_size=+0 B
eval deducted: reg=+3.0 MiB ela=+0 B
eval original in send-q: reg=+0 B ela=+0 B
NormalPri:
  term=1 index=4  tokens=1048576
  term=1 index=5  tokens=1048576
  term=1 index=6  tokens=1048576
++++

# Lastly, admit all the entries. We should have all tokens returned.
admit
range_id=1
  store_id=1 term=1 to_index=6 pri=NormalPri
  store_id=2 term=1 to_index=6 pri=NormalPri
  store_id=3 term=1 to_index=6 pri=NormalPri
----
t1/s1: eval reg=+16 MiB/+16 MiB ela=+8.0 MiB/+8.0 MiB
       send reg=+16 MiB/+16 MiB ela=+8.0 MiB/+8.0 MiB
t1/s2: eval reg=+16 MiB/+16 MiB ela=+8.0 MiB/+8.0 MiB
       send reg=+16 MiB/+16 MiB ela=+8.0 MiB/+8.0 MiB
t1/s3: eval reg=+16 MiB/+16 MiB ela=+8.0 MiB/+8.0 MiB
       send reg=+16 MiB/+16 MiB ela=+8.0 MiB/+8.0 MiB

# Send an empty event so that replicaSendStreams are aware of the update to
# match.
raft_event
range_id=1
----
t1/s1: eval reg=+16 MiB/+16 MiB ela=+8.0 MiB/+8.0 MiB
       send reg=+16 MiB/+16 MiB ela=+8.0 MiB/+8.0 MiB
t1/s2: eval reg=+16 MiB/+16 MiB ela=+8.0 MiB/+8.0 MiB
       send reg=+16 MiB/+16 MiB ela=+8.0 MiB/+8.0 MiB
t1/s3: eval reg=+16 MiB/+16 MiB ela=+8.0 MiB/+8.0 MiB
       send reg=+16 MiB/+16 MiB ela=+8.0 MiB/+8.0 MiB

stream_state range_id=1
----
(n1,s1):1: state=replicate closed=false inflight=[7,7) send_queue=[7,7) precise_q_size=+0 B
eval deducted: reg=+0 B ela=+0 B
eval original in send-q: reg=+0 B ela=+0 B
++++
(n2,s2):2: state=replicate closed=false inflight=[7,7) send_queue=[7,7) precise_q_size=+0 B
eval deducted: reg=+0 B ela=+0 B
eval original in send-q: reg=+0 B ela=+0 B
++++
(n3,s3):3: state=replicate closed=false inflight=[7,7) send_queue=[7,7) precise_q_size=+0 B
eval deducted: reg=+0 B ela=+0 B
eval original in send-q: reg=+0 B ela=+0 B
++++

close_rcs
----
range_id=1 tenant_id={1} local_replica_id=1
