# Initialize a range with three replicas, none of which have send tokens.
init regular_init=0 elastic_init=0
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=+0 B/+16 MiB ela=+0 B/+8.0 MiB
       send reg=+0 B/+16 MiB ela=+0 B/+8.0 MiB
t1/s2: eval reg=+0 B/+16 MiB ela=+0 B/+8.0 MiB
       send reg=+0 B/+16 MiB ela=+0 B/+8.0 MiB
t1/s3: eval reg=+0 B/+16 MiB ela=+0 B/+8.0 MiB
       send reg=+0 B/+16 MiB ela=+0 B/+8.0 MiB

# Replica 1 is the leader so sending [1,1) is ignored and everything is
# considered sent (the leader does not see MsgApps for itself).
raft_event
range_id=1
  entries
    term=1 index=1 pri=NormalPri size=6MiB
    term=1 index=2 pri=NormalPri size=6MiB
    term=1 index=3 pri=NormalPri size=6MiB
  sending
    replica_id=1 [1,1)
    replica_id=2 [1,1)
    replica_id=3 [1,1)
----
t1/s1: eval reg=-18 MiB/+16 MiB ela=-18 MiB/+8.0 MiB
       send reg=-18 MiB/+16 MiB ela=-18 MiB/+8.0 MiB
t1/s2: eval reg=-18 MiB/+16 MiB ela=-18 MiB/+8.0 MiB
       send reg=+0 B/+16 MiB ela=+0 B/+8.0 MiB
t1/s3: eval reg=-18 MiB/+16 MiB ela=-18 MiB/+8.0 MiB
       send reg=+0 B/+16 MiB ela=+0 B/+8.0 MiB

# Replicas 2 and 3 have a send-queue which is possible in push mode.
stream_state range_id=1
----
(n1,s1):1: state=replicate closed=false inflight=[1,4) (18 MiB) send_queue=[4,4) precise_q_size=+0 B
eval deducted: reg=+18 MiB ela=+0 B
eval original in send-q: reg=+0 B ela=+0 B
NormalPri:
  term=1 index=1  tokens=6291456
  term=1 index=2  tokens=6291456
  term=1 index=3  tokens=6291456
++++
(n2,s2):2: state=replicate closed=false inflight=[1,1) send_queue=[1,4) precise_q_size=+18 MiB
eval deducted: reg=+18 MiB ela=+0 B
eval original in send-q: reg=+18 MiB ela=+0 B
++++
(n3,s3):3: state=replicate closed=false inflight=[1,1) send_queue=[1,4) precise_q_size=+18 MiB
eval deducted: reg=+18 MiB ela=+0 B
eval original in send-q: reg=+18 MiB ela=+0 B
++++

# Force flush up to index 1. Still in push-mode so it has no effect.
set_force_flush_index range_id=1 index=1 push-mode
----
(n1,s1):1: state=replicate closed=false inflight=[1,4) (18 MiB) send_queue=[4,4) precise_q_size=+0 B
eval deducted: reg=+18 MiB ela=+0 B
eval original in send-q: reg=+0 B ela=+0 B
NormalPri:
  term=1 index=1  tokens=6291456
  term=1 index=2  tokens=6291456
  term=1 index=3  tokens=6291456
++++
(n2,s2):2: state=replicate closed=false inflight=[1,1) send_queue=[1,4) precise_q_size=+18 MiB
eval deducted: reg=+18 MiB ela=+0 B
eval original in send-q: reg=+18 MiB ela=+0 B
++++
(n3,s3):3: state=replicate closed=false inflight=[1,1) send_queue=[1,4) precise_q_size=+18 MiB
eval deducted: reg=+18 MiB ela=+0 B
eval original in send-q: reg=+18 MiB ela=+0 B
++++

# Switch to pull mode.
raft_event pull-mode
range_id=1
----
t1/s1: eval reg=-18 MiB/+16 MiB ela=-18 MiB/+8.0 MiB
       send reg=-18 MiB/+16 MiB ela=-18 MiB/+8.0 MiB
t1/s2: eval reg=+0 B/+16 MiB ela=-18 MiB/+8.0 MiB
       send reg=+0 B/+16 MiB ela=+0 B/+8.0 MiB
t1/s3: eval reg=+0 B/+16 MiB ela=-18 MiB/+8.0 MiB
       send reg=+0 B/+16 MiB ela=+0 B/+8.0 MiB

# Replica 3 starts force-flushing with no limit, since it was necessary for
# quorum. Replica 2 is force-flushing up to index 1.
stream_state range_id=1
----
(n1,s1):1: state=replicate closed=false inflight=[1,4) (18 MiB) send_queue=[4,4) precise_q_size=+0 B
eval deducted: reg=+18 MiB ela=+0 B
eval original in send-q: reg=+0 B ela=+0 B
NormalPri:
  term=1 index=1  tokens=6291456
  term=1 index=2  tokens=6291456
  term=1 index=3  tokens=6291456
++++
(n2,s2):2: state=replicate closed=false inflight=[1,1) send_queue=[1,4) precise_q_size=+18 MiB force-flushing (stop=1)
eval deducted: reg=+0 B ela=+18 MiB
eval original in send-q: reg=+18 MiB ela=+0 B
++++
(n3,s3):3: state=replicate closed=false inflight=[1,1) send_queue=[1,4) precise_q_size=+18 MiB force-flushing
eval deducted: reg=+0 B ela=+18 MiB
eval original in send-q: reg=+18 MiB ela=+0 B
++++
schedule-controller-event-count: 1
scheduled-replicas: 2 3

# Update the force-flush index to 2. This propagates to replica 2. Also, since
# replica 2 is seen to be force-flushing, the second-pass decision (see code),
# decides replica 3 does not need to force-flush for quorum. So both have a
# stop index of 2.
set_force_flush_index range_id=1 index=2
----
(n1,s1):1: state=replicate closed=false inflight=[1,4) (18 MiB) send_queue=[4,4) precise_q_size=+0 B
eval deducted: reg=+18 MiB ela=+0 B
eval original in send-q: reg=+0 B ela=+0 B
NormalPri:
  term=1 index=1  tokens=6291456
  term=1 index=2  tokens=6291456
  term=1 index=3  tokens=6291456
++++
(n2,s2):2: state=replicate closed=false inflight=[1,1) send_queue=[1,4) precise_q_size=+18 MiB force-flushing (stop=2)
eval deducted: reg=+0 B ela=+18 MiB
eval original in send-q: reg=+18 MiB ela=+0 B
++++
(n3,s3):3: state=replicate closed=false inflight=[1,1) send_queue=[1,4) precise_q_size=+18 MiB force-flushing (stop=2)
eval deducted: reg=+0 B ela=+18 MiB
eval original in send-q: reg=+18 MiB ela=+0 B
++++
schedule-controller-event-count: 1
scheduled-replicas: 2 3

# Scheduler event. Entry at index 1 is popped from replicas 2, 3.
handle_scheduler_event range_id=1
----
(n1,s1):1: state=replicate closed=false inflight=[1,4) (18 MiB) send_queue=[4,4) precise_q_size=+0 B
eval deducted: reg=+18 MiB ela=+0 B
eval original in send-q: reg=+0 B ela=+0 B
NormalPri:
  term=1 index=1  tokens=6291456
  term=1 index=2  tokens=6291456
  term=1 index=3  tokens=6291456
++++
(n2,s2):2: state=replicate closed=false inflight=[1,2) (6.0 MiB) send_queue=[2,4) precise_q_size=+12 MiB force-flushing (stop=2)
eval deducted: reg=+0 B ela=+18 MiB
eval original in send-q: reg=+12 MiB ela=+0 B
LowPri:
  term=1 index=1  tokens=6291456
++++
(n3,s3):3: state=replicate closed=false inflight=[1,2) (6.0 MiB) send_queue=[2,4) precise_q_size=+12 MiB force-flushing (stop=2)
eval deducted: reg=+0 B ela=+18 MiB
eval original in send-q: reg=+12 MiB ela=+0 B
LowPri:
  term=1 index=1  tokens=6291456
++++
MsgApps sent in pull mode:
 to: 2, lowPri: true entries: [1]
 to: 3, lowPri: true entries: [1]
++++
schedule-controller-event-count: 2
scheduled-replicas: 2 3

# Switch back to push mode. Force-flushing stops.
raft_event
range_id=1
----
t1/s1: eval reg=-18 MiB/+16 MiB ela=-18 MiB/+8.0 MiB
       send reg=-18 MiB/+16 MiB ela=-18 MiB/+8.0 MiB
t1/s2: eval reg=-12 MiB/+16 MiB ela=-18 MiB/+8.0 MiB
       send reg=+0 B/+16 MiB ela=-6.0 MiB/+8.0 MiB
t1/s3: eval reg=-12 MiB/+16 MiB ela=-18 MiB/+8.0 MiB
       send reg=+0 B/+16 MiB ela=-6.0 MiB/+8.0 MiB

stream_state range_id=1
----
(n1,s1):1: state=replicate closed=false inflight=[1,4) (18 MiB) send_queue=[4,4) precise_q_size=+0 B
eval deducted: reg=+18 MiB ela=+0 B
eval original in send-q: reg=+0 B ela=+0 B
NormalPri:
  term=1 index=1  tokens=6291456
  term=1 index=2  tokens=6291456
  term=1 index=3  tokens=6291456
++++
(n2,s2):2: state=replicate closed=false inflight=[1,2) (6.0 MiB) send_queue=[2,4) precise_q_size=+12 MiB
eval deducted: reg=+12 MiB ela=+6.0 MiB
eval original in send-q: reg=+12 MiB ela=+0 B
LowPri:
  term=1 index=1  tokens=6291456
++++
(n3,s3):3: state=replicate closed=false inflight=[1,2) (6.0 MiB) send_queue=[2,4) precise_q_size=+12 MiB
eval deducted: reg=+12 MiB ela=+6.0 MiB
eval original in send-q: reg=+12 MiB ela=+0 B
LowPri:
  term=1 index=1  tokens=6291456
++++
schedule-controller-event-count: 2
scheduled-replicas: 2 3

# Switch back to pull mode. Force-flushing resumes. Replica 3 needs to
# force-flush for quorum, so the stopping point is infinity.
raft_event pull-mode
range_id=1
----
t1/s1: eval reg=-18 MiB/+16 MiB ela=-18 MiB/+8.0 MiB
       send reg=-18 MiB/+16 MiB ela=-18 MiB/+8.0 MiB
t1/s2: eval reg=+0 B/+16 MiB ela=-18 MiB/+8.0 MiB
       send reg=+0 B/+16 MiB ela=-6.0 MiB/+8.0 MiB
t1/s3: eval reg=+0 B/+16 MiB ela=-18 MiB/+8.0 MiB
       send reg=+0 B/+16 MiB ela=-6.0 MiB/+8.0 MiB

stream_state range_id=1
----
(n1,s1):1: state=replicate closed=false inflight=[1,4) (18 MiB) send_queue=[4,4) precise_q_size=+0 B
eval deducted: reg=+18 MiB ela=+0 B
eval original in send-q: reg=+0 B ela=+0 B
NormalPri:
  term=1 index=1  tokens=6291456
  term=1 index=2  tokens=6291456
  term=1 index=3  tokens=6291456
++++
(n2,s2):2: state=replicate closed=false inflight=[1,2) (6.0 MiB) send_queue=[2,4) precise_q_size=+12 MiB force-flushing (stop=2)
eval deducted: reg=+0 B ela=+18 MiB
eval original in send-q: reg=+12 MiB ela=+0 B
LowPri:
  term=1 index=1  tokens=6291456
++++
(n3,s3):3: state=replicate closed=false inflight=[1,2) (6.0 MiB) send_queue=[2,4) precise_q_size=+12 MiB force-flushing
eval deducted: reg=+0 B ela=+18 MiB
eval original in send-q: reg=+12 MiB ela=+0 B
LowPri:
  term=1 index=1  tokens=6291456
++++
schedule-controller-event-count: 2
scheduled-replicas: 2 3

# Scheduler event. Entry at index 2 is popped from replicas 2, 3. Replica 2
# stops force-flushing.
handle_scheduler_event range_id=1
----
(n1,s1):1: state=replicate closed=false inflight=[1,4) (18 MiB) send_queue=[4,4) precise_q_size=+0 B
eval deducted: reg=+18 MiB ela=+0 B
eval original in send-q: reg=+0 B ela=+0 B
NormalPri:
  term=1 index=1  tokens=6291456
  term=1 index=2  tokens=6291456
  term=1 index=3  tokens=6291456
++++
(n2,s2):2: state=replicate closed=false inflight=[1,3) (12 MiB) send_queue=[3,4) precise_q_size=+6.0 MiB watching-for-tokens
eval deducted: reg=+0 B ela=+18 MiB
eval original in send-q: reg=+6.0 MiB ela=+0 B
LowPri:
  term=1 index=1  tokens=6291456
  term=1 index=2  tokens=6291456
++++
(n3,s3):3: state=replicate closed=false inflight=[1,3) (12 MiB) send_queue=[3,4) precise_q_size=+6.0 MiB force-flushing
eval deducted: reg=+0 B ela=+18 MiB
eval original in send-q: reg=+6.0 MiB ela=+0 B
LowPri:
  term=1 index=1  tokens=6291456
  term=1 index=2  tokens=6291456
++++
MsgApps sent in pull mode:
 to: 2, lowPri: true entries: [2]
 to: 3, lowPri: true entries: [2]
++++
schedule-controller-event-count: 3
scheduled-replicas: 3

# Switch back to push mode and then back to pull mode. Replica 2 should not be
# force-flushing and replica 3 should be force-flushing.
raft_event
range_id=1
----
t1/s1: eval reg=-18 MiB/+16 MiB ela=-18 MiB/+8.0 MiB
       send reg=-18 MiB/+16 MiB ela=-18 MiB/+8.0 MiB
t1/s2: eval reg=-6.0 MiB/+16 MiB ela=-18 MiB/+8.0 MiB
       send reg=+0 B/+16 MiB ela=-12 MiB/+8.0 MiB
t1/s3: eval reg=-6.0 MiB/+16 MiB ela=-18 MiB/+8.0 MiB
       send reg=+0 B/+16 MiB ela=-12 MiB/+8.0 MiB

raft_event pull-mode
range_id=1
----
t1/s1: eval reg=-18 MiB/+16 MiB ela=-18 MiB/+8.0 MiB
       send reg=-18 MiB/+16 MiB ela=-18 MiB/+8.0 MiB
t1/s2: eval reg=+0 B/+16 MiB ela=-18 MiB/+8.0 MiB
       send reg=+0 B/+16 MiB ela=-12 MiB/+8.0 MiB
t1/s3: eval reg=+0 B/+16 MiB ela=-18 MiB/+8.0 MiB
       send reg=+0 B/+16 MiB ela=-12 MiB/+8.0 MiB

stream_state range_id=1
----
(n1,s1):1: state=replicate closed=false inflight=[1,4) (18 MiB) send_queue=[4,4) precise_q_size=+0 B
eval deducted: reg=+18 MiB ela=+0 B
eval original in send-q: reg=+0 B ela=+0 B
NormalPri:
  term=1 index=1  tokens=6291456
  term=1 index=2  tokens=6291456
  term=1 index=3  tokens=6291456
++++
(n2,s2):2: state=replicate closed=false inflight=[1,3) (12 MiB) send_queue=[3,4) precise_q_size=+6.0 MiB watching-for-tokens
eval deducted: reg=+0 B ela=+18 MiB
eval original in send-q: reg=+6.0 MiB ela=+0 B
LowPri:
  term=1 index=1  tokens=6291456
  term=1 index=2  tokens=6291456
++++
(n3,s3):3: state=replicate closed=false inflight=[1,3) (12 MiB) send_queue=[3,4) precise_q_size=+6.0 MiB force-flushing
eval deducted: reg=+0 B ela=+18 MiB
eval original in send-q: reg=+6.0 MiB ela=+0 B
LowPri:
  term=1 index=1  tokens=6291456
  term=1 index=2  tokens=6291456
++++
schedule-controller-event-count: 3
scheduled-replicas: 3

# Replica 3 stops force-flushing.
handle_scheduler_event range_id=1
----
(n1,s1):1: state=replicate closed=false inflight=[1,4) (18 MiB) send_queue=[4,4) precise_q_size=+0 B
eval deducted: reg=+18 MiB ela=+0 B
eval original in send-q: reg=+0 B ela=+0 B
NormalPri:
  term=1 index=1  tokens=6291456
  term=1 index=2  tokens=6291456
  term=1 index=3  tokens=6291456
++++
(n2,s2):2: state=replicate closed=false inflight=[1,3) (12 MiB) send_queue=[3,4) precise_q_size=+6.0 MiB watching-for-tokens
eval deducted: reg=+0 B ela=+18 MiB
eval original in send-q: reg=+6.0 MiB ela=+0 B
LowPri:
  term=1 index=1  tokens=6291456
  term=1 index=2  tokens=6291456
++++
(n3,s3):3: state=replicate closed=false inflight=[1,4) (18 MiB) send_queue=[4,4) precise_q_size=+0 B
eval deducted: reg=+0 B ela=+18 MiB
eval original in send-q: reg=+0 B ela=+0 B
LowPri:
  term=1 index=1  tokens=6291456
  term=1 index=2  tokens=6291456
  term=1 index=3  tokens=6291456
++++
MsgApps sent in pull mode:
 to: 3, lowPri: true entries: [3]
++++
schedule-controller-event-count: 3
