Compare commits

...

40 commits

Author SHA1 Message Date
Eric Eastwood b559e2326b Merge branch 'develop' into madlittlemods/return-historical-events-in-order-from-backfill
Conflicts:
	synapse/rest/client/room_batch.py
2021-11-11 00:56:50 -06:00
Eric Eastwood d771fbd3b1 Only run the tests package to get streaming Complement output 2021-11-11 00:49:57 -06:00
Eric Eastwood 363aed60e7 Revert unused refactor to get PDU raw
Code split out into https://github.com/matrix-org/synapse/pull/11242
2021-11-03 18:31:32 -05:00
Eric Eastwood bc0ba8c094 Protect from no auth events for non-existent provided prev_event 2021-11-03 02:39:39 -05:00
Eric Eastwood ec35be57e0 Merge branch 'develop' into madlittlemods/return-historical-events-in-order-from-backfill
Conflicts:
	scripts-dev/complement.sh
	synapse/handlers/federation_event.py
	synapse/handlers/message.py
	synapse/storage/databases/main/event_federation.py
2021-11-03 02:10:07 -05:00
Eric Eastwood 246278e9a3 Fix lints 2021-11-03 01:29:26 -05:00
Eric Eastwood 7f2105ad06 Remove topological sort when receiving backfill events
See https://github.com/matrix-org/synapse/pull/11114#discussion_r741517138
2021-11-03 01:14:55 -05:00
Eric Eastwood f3b7b3e882 Add better explanatory comment
See https://github.com/matrix-org/synapse/pull/11114#discussion_r741304767
2021-11-03 01:07:35 -05:00
Eric Eastwood e96fd5c3fd Add comment docs 2021-11-03 00:51:05 -05:00
Eric Eastwood 5db717ab85 Always process marker events regardless if backfilled
Before, we could rely on the `connected_insertion_event_query`
to navigate the and find the historical branch. But now
we solely rely on the marker event to point out the
historical branch. So we need to make sure to add
the insertion event extremeties whenever we see a marker event.
Whether it be a live event or backfilled.
2021-11-02 21:27:08 -05:00
Eric Eastwood 15c3282be7 Remove the new backfill implementation and pull some good parts of the refactor 2021-11-02 18:18:56 -05:00
Eric Eastwood 321f9ea68b Move back to the old get_backfill_events and simplify backfill.
We now rely on the marker events to backfill the base insertion event
which puts it as a insertion event extremity. This functionality was
already in place (see `handle_marker_event`) and was an easy transition.
This way, remote federated homeserver will have the insertion extremity
to ask about in backfill and goes down the historical branch no problem
because of the depth order and the rest of the DAG navigation happens as
normal. Yay simplification!

The key breakthrough was discussing all the ways we can find connected insertion events.
https://docs.google.com/document/d/1KCEmpnGr4J-I8EeaVQ8QJZKBDu53ViI7V62y5BzfXr0/edit#bookmark=id.1hbt9acs963h

The three options we came up were:

 - Find by insertion event prev_events (this is what we were doing before)
 - Find connected insertion events by depth
 - Find connected insertion events by the marker event
    - This made the most sense since we already backfill the insertion event
      when a marker event is processed (see `handle_marker_event`).
    - Gets rid of the extra insertion event lookup in backfill because we
      know it's already backfilled from the marker processing.
    - And gets rid of the extra federated lookup we added in this to PR
      to ask whether the homeserver requesting backfill already has the
      insertion event (deciding whether we fork
      to the history branch before we go down the "live" DAG)
2021-11-02 17:27:04 -05:00
Eric Eastwood 3529449310 Fix lints 2021-10-30 01:07:26 -05:00
Eric Eastwood 76d454f81d Some backfill receive sorting fixes but not using it yet 2021-10-30 00:46:02 -05:00
Eric Eastwood e0ff66dfd9 Fix backfill being able to cleanly branch into history and back to "live"
Fix https://github.com/matrix-org/synapse/pull/11114#discussion_r731363046

 - When we see a connected insertion event indicating a branch of history,
   we now don't accidentally leak the base event we're branching from
   in the backfill chunk until all of the events in the historical brach
   are exhausted.
 - Backfill will now check whether the federating homeserver asking
   has a given insertion event when we see one connected to the DAG.
   This allows backfill to initially decide to give all the historical
   messages in the branch, then next time when the base event we branched
   from comes up in backfill again, it sees that federated homeserver
   already has the insertion event, and we can continue down the normal
   DAG prev_event path instead.

Example Backfill response (in order yay):

Overview:
```
eventIDsAfter
batch0
batch1
eventIDsBefore
```

```
new implementation backfill events(100)=[
  "event_id=$q3w2dF5mWBkgUF1ADdVgS_bX7YQuqODJ2HC33bln4Ho,depth=11,body=Message 1 (eventIDsAfter),prevs=['$Com3-ZIR35FvYcBQvHdpxGsS1iW-DO_Z5x1zZ5R5Az8']",
  "event_id=$Com3-ZIR35FvYcBQvHdpxGsS1iW-DO_Z5x1zZ5R5Az8,depth=10,body=Message 0 (eventIDsAfter),prevs=['$T5-OUXAW3CCYAHskqk5s0V2ZzJoQy5D8lQJ7LZFWvTI']",
  "event_id=$78Yy5bqa9XuQ5fhcw9AF36Xf4W5EDcjsraSInif7nYU,depth=10,body=org.matrix.msc2716.insertion,prevs=['$T5-OUXAW3CCYAHskqk5s0V2ZzJoQy5D8lQJ7LZFWvTI']",
  "event_id=$GEzF4euV8StAtdCDCtWmpdhxRE3KQWgreyr1_ePqlpM,depth=10,body=org.matrix.msc2716.batch,prevs=['$ot97LEPqM55EV1ka8YM445c6q-ny4jBBRxjgQnGxihQ']",
  "event_id=$ot97LEPqM55EV1ka8YM445c6q-ny4jBBRxjgQnGxihQ,depth=10,body=Historical 99 (batch=0),prevs=['$i53GQczFiX-tqXgcxudp5AWR9C-A0yJiET_ZXe9D49I']",
  "event_id=$i53GQczFiX-tqXgcxudp5AWR9C-A0yJiET_ZXe9D49I,depth=10,body=Historical 98 (batch=0),prevs=['$lqjhSBLzbi2WfWNAIm1mngStqsPfQJUwPO0NAFtB8lo']",
  "event_id=$lqjhSBLzbi2WfWNAIm1mngStqsPfQJUwPO0NAFtB8lo,depth=10,body=Historical 97 (batch=0),prevs=['$k8OC791p_vB-Hz36Byn-o3vK9x_rc0qkVufBpxYRcaA']",
  "event_id=$k8OC791p_vB-Hz36Byn-o3vK9x_rc0qkVufBpxYRcaA,depth=10,body=Historical 96 (batch=0),prevs=['$9obrnkfP2HpDfKUkWyHrtHML5_31MZ3T9sKQOb6eUV8']",
  "event_id=$9obrnkfP2HpDfKUkWyHrtHML5_31MZ3T9sKQOb6eUV8,depth=10,body=Historical 95 (batch=0),prevs=['$PSNLMD1RhBvR9ffpbEOKtUHE9PUUiacJ2g8_DA9nSjM']",
  "event_id=$PSNLMD1RhBvR9ffpbEOKtUHE9PUUiacJ2g8_DA9nSjM,depth=10,body=Historical 94 (batch=0),prevs=['$vGkUiP049MLeapDGHegqdiGZRkuc6WxEJ-iOAN7mqr4']",
  "event_id=$vGkUiP049MLeapDGHegqdiGZRkuc6WxEJ-iOAN7mqr4,depth=10,body=Historical 93 (batch=0),prevs=['$reYXzhTXHlqqk6XMLK_mEIFQGIesn4NJ70JYa7EziQc']",
  "event_id=$reYXzhTXHlqqk6XMLK_mEIFQGIesn4NJ70JYa7EziQc,depth=10,body=Historical 92 (batch=0),prevs=['$dg8ZPPPqh1SbIhcg-GMvEGz49h53TUMoZ8yO4zbfA4U']",
  "event_id=$dg8ZPPPqh1SbIhcg-GMvEGz49h53TUMoZ8yO4zbfA4U,depth=10,body=Historical 91 (batch=0),prevs=['$QW7wied5SyHtJElJTo4SUkc-zNLlAh6tbCiAa5EJXg4']",
  "event_id=$QW7wied5SyHtJElJTo4SUkc-zNLlAh6tbCiAa5EJXg4,depth=10,body=Historical 90 (batch=0),prevs=['$COQuVmW8z0geXFZ2fPdo_kW0q1NK1LLZSI7fZNIwvgM']",
  "event_id=$COQuVmW8z0geXFZ2fPdo_kW0q1NK1LLZSI7fZNIwvgM,depth=10,body=Historical 89 (batch=0),prevs=['$04k2wOdm-L41JDQ73KPpDe1njG3L9FYjOsNVamFsDQ0']",
  "event_id=$04k2wOdm-L41JDQ73KPpDe1njG3L9FYjOsNVamFsDQ0,depth=10,body=Historical 88 (batch=0),prevs=['$70BsBGyeg4Pf3VhGhXjtk4N5XKNNSit4vjnrirwTmic']",
  "event_id=$70BsBGyeg4Pf3VhGhXjtk4N5XKNNSit4vjnrirwTmic,depth=10,body=Historical 87 (batch=0),prevs=['$Y_6AET6hMZY42rPki4r0GxMfs8E_TCJyepNL1Vfwnh4']",
  "event_id=$Y_6AET6hMZY42rPki4r0GxMfs8E_TCJyepNL1Vfwnh4,depth=10,body=Historical 86 (batch=0),prevs=['$jSk0bO6PFUcqxHsjTvFPyJZoXL4N9nEGex7I-yyvBj8']",
  "event_id=$jSk0bO6PFUcqxHsjTvFPyJZoXL4N9nEGex7I-yyvBj8,depth=10,body=Historical 85 (batch=0),prevs=['$wPV_BB23RIolkHz0yGTvwt1-TJbqpGPqZc33vR5DUMw']",
  "event_id=$wPV_BB23RIolkHz0yGTvwt1-TJbqpGPqZc33vR5DUMw,depth=10,body=Historical 84 (batch=0),prevs=['$X2FJ_Jmoy5sx9u0UWTN1bkds6diO0uDxxRGco4r9Msw']",
  "event_id=$X2FJ_Jmoy5sx9u0UWTN1bkds6diO0uDxxRGco4r9Msw,depth=10,body=Historical 83 (batch=0),prevs=['$jrmzKa3aDmpZg5HgDHQqQ_lgl9L4rDWiWk7xd1igfAE']",
  "event_id=$jrmzKa3aDmpZg5HgDHQqQ_lgl9L4rDWiWk7xd1igfAE,depth=10,body=Historical 82 (batch=0),prevs=['$8Ov9djlzX3ixwCWaULf6-SJNBuV8eeslfBVvt5b1Uds']",
  "event_id=$8Ov9djlzX3ixwCWaULf6-SJNBuV8eeslfBVvt5b1Uds,depth=10,body=Historical 81 (batch=0),prevs=['$Xflk7Gara-ISOAblxE3Vh5qbRDxJal8NLWSD6BC3wfY']",
  "event_id=$Xflk7Gara-ISOAblxE3Vh5qbRDxJal8NLWSD6BC3wfY,depth=10,body=Historical 80 (batch=0),prevs=['$cd4vq5xB0kqHa7HziMmI1U5njSwDr6NOz0qkvCrUeiA']",
  "event_id=$cd4vq5xB0kqHa7HziMmI1U5njSwDr6NOz0qkvCrUeiA,depth=10,body=Historical 79 (batch=0),prevs=['$xblwBKeHnnXlcK9nusq0mWw712br9ySr3elpt5vqYG8']",
  "event_id=$xblwBKeHnnXlcK9nusq0mWw712br9ySr3elpt5vqYG8,depth=10,body=Historical 78 (batch=0),prevs=['$cAnav2OUp8QsmQRbPc-PcX6A4rRW9UUsGFEGb1lgSyI']",
  "event_id=$cAnav2OUp8QsmQRbPc-PcX6A4rRW9UUsGFEGb1lgSyI,depth=10,body=Historical 77 (batch=0),prevs=['$3janYqE-QmrenClP9K2jxr-TM2AvG5H-kcgkM6F9UgA']",
  "event_id=$3janYqE-QmrenClP9K2jxr-TM2AvG5H-kcgkM6F9UgA,depth=10,body=Historical 76 (batch=0),prevs=['$UqMZVF90ZR0kzwt5q2noHEGCS8UFp_IAN4EbiMYVl4o']",
  "event_id=$UqMZVF90ZR0kzwt5q2noHEGCS8UFp_IAN4EbiMYVl4o,depth=10,body=Historical 75 (batch=0),prevs=['$D6IL83wLN4nkNwwikin8olaPEZCpzUh7-1PAOdD7HSY']",
  "event_id=$D6IL83wLN4nkNwwikin8olaPEZCpzUh7-1PAOdD7HSY,depth=10,body=Historical 74 (batch=0),prevs=['$MWVNPcLeQ_INUKlCdoOaySGlGeP5WwDt0myistqnTVk']",
  "event_id=$MWVNPcLeQ_INUKlCdoOaySGlGeP5WwDt0myistqnTVk,depth=10,body=Historical 73 (batch=0),prevs=['$Co1eNgILBaxBR_Gt7Vz_tIs0LutTc9CPvtYRyElNMj8']",
  "event_id=$Co1eNgILBaxBR_Gt7Vz_tIs0LutTc9CPvtYRyElNMj8,depth=10,body=Historical 72 (batch=0),prevs=['$ahJyDyEY1Oo8OAkrMZAeYDeTWNzx0B36GsQxcZWchFE']",
  "event_id=$ahJyDyEY1Oo8OAkrMZAeYDeTWNzx0B36GsQxcZWchFE,depth=10,body=Historical 71 (batch=0),prevs=['$JfGy5KmG-3KFMJFfcHsci6YvhvLq9pWok6GgcZlaXX8']",
  "event_id=$JfGy5KmG-3KFMJFfcHsci6YvhvLq9pWok6GgcZlaXX8,depth=10,body=Historical 70 (batch=0),prevs=['$VEfiWOEPPyCpN9z305k4IJySpEj5tl4InJb5mhFs7EA']",
  "event_id=$VEfiWOEPPyCpN9z305k4IJySpEj5tl4InJb5mhFs7EA,depth=10,body=Historical 69 (batch=0),prevs=['$FZswJ09DFvJSzGDFiA3JIdLuzFnG_TfObeEOES1fVTA']",
  "event_id=$FZswJ09DFvJSzGDFiA3JIdLuzFnG_TfObeEOES1fVTA,depth=10,body=Historical 68 (batch=0),prevs=['$fnzsLJ8duVIJ_S74QIozUaEwOp4G7j7fN5yRV-bzDHQ']",
  "event_id=$fnzsLJ8duVIJ_S74QIozUaEwOp4G7j7fN5yRV-bzDHQ,depth=10,body=Historical 67 (batch=0),prevs=['$vBWTNsLkJHP9bK0L1Wx3HdND6Rh8HhPmxBtXP7klwvE']",
  "event_id=$vBWTNsLkJHP9bK0L1Wx3HdND6Rh8HhPmxBtXP7klwvE,depth=10,body=Historical 66 (batch=0),prevs=['$y5PGi9vY9UcTEwTzeE18JB6-bjhf1GVeSEOph4ko-SE']",
  "event_id=$y5PGi9vY9UcTEwTzeE18JB6-bjhf1GVeSEOph4ko-SE,depth=10,body=Historical 65 (batch=0),prevs=['$7pM8GWYvhzxZ3zGkc76RLtsw7w02IT-sAiV8JkKeQCU']",
  "event_id=$7pM8GWYvhzxZ3zGkc76RLtsw7w02IT-sAiV8JkKeQCU,depth=10,body=Historical 64 (batch=0),prevs=['$wKaeK8hHhwLb1zHZaRJFE1C-n2kOtWnf076sNeWqaMc']",
  "event_id=$wKaeK8hHhwLb1zHZaRJFE1C-n2kOtWnf076sNeWqaMc,depth=10,body=Historical 63 (batch=0),prevs=['$8OHC-bni0whbdGfis5cfWL3--JACd0fx-pUBs5LuBXM']",
  "event_id=$8OHC-bni0whbdGfis5cfWL3--JACd0fx-pUBs5LuBXM,depth=10,body=Historical 62 (batch=0),prevs=['$nZ1WO04o85g1lkLQYlb72bZfx195YwuA-mQ3SsLEsuI']",
  "event_id=$nZ1WO04o85g1lkLQYlb72bZfx195YwuA-mQ3SsLEsuI,depth=10,body=Historical 61 (batch=0),prevs=['$rdA6ksM5YpvBrm9vHREi-d7x5AJCPZzrAAqxNN5I2ms']",
  "event_id=$rdA6ksM5YpvBrm9vHREi-d7x5AJCPZzrAAqxNN5I2ms,depth=10,body=Historical 60 (batch=0),prevs=['$v-3prgvdtmX8ySVzXby4Lw6zrncPxKdiLrDnM94y3K4']",
  "event_id=$v-3prgvdtmX8ySVzXby4Lw6zrncPxKdiLrDnM94y3K4,depth=10,body=Historical 59 (batch=0),prevs=['$ahhYJXd-_gSSZ_mROiEvBI37nYgYCi4WsrvG8sfEQ6g']",
  "event_id=$ahhYJXd-_gSSZ_mROiEvBI37nYgYCi4WsrvG8sfEQ6g,depth=10,body=Historical 58 (batch=0),prevs=['$JHFT5ugpxzbU6MmFJZ3wXN0hK33EX3-9As0MemxjsX0']",
  "event_id=$JHFT5ugpxzbU6MmFJZ3wXN0hK33EX3-9As0MemxjsX0,depth=10,body=Historical 57 (batch=0),prevs=['$JYLcmedG2JdmtBQnnXbIEI34QyeaJrMGLAJt_Mi_vuY']",
  "event_id=$JYLcmedG2JdmtBQnnXbIEI34QyeaJrMGLAJt_Mi_vuY,depth=10,body=Historical 56 (batch=0),prevs=['$nFeaEcPilAYFoXcid_5mz5jDEqIyvTZLYX4erRf2jlM']",
  "event_id=$nFeaEcPilAYFoXcid_5mz5jDEqIyvTZLYX4erRf2jlM,depth=10,body=Historical 55 (batch=0),prevs=['$ig5cEWTkkNG-ox84UUjG35G6WEHu-qpqAwYKQSOwHxQ']",
  "event_id=$ig5cEWTkkNG-ox84UUjG35G6WEHu-qpqAwYKQSOwHxQ,depth=10,body=Historical 54 (batch=0),prevs=['$2MDm0b5ztPCyLlAThSBT38Ie3F0ZG3sAE0r3to3yhtc']",
  "event_id=$2MDm0b5ztPCyLlAThSBT38Ie3F0ZG3sAE0r3to3yhtc,depth=10,body=Historical 53 (batch=0),prevs=['$gZ_e1ws9bh_uKzY4UskhVCO4IFikMi-waYooJbSJAOI']",
  "event_id=$gZ_e1ws9bh_uKzY4UskhVCO4IFikMi-waYooJbSJAOI,depth=10,body=Historical 52 (batch=0),prevs=['$pOBdCutp83GhxQkP9_tCyYeaN7YvEo0fuf5MiRsu_ew']",
  "event_id=$pOBdCutp83GhxQkP9_tCyYeaN7YvEo0fuf5MiRsu_ew,depth=10,body=Historical 51 (batch=0),prevs=['$HCC02P42Zfcn-vYaZrhQu1IdHOMVQrsc6XsfIGPrWNE']",
  "event_id=$HCC02P42Zfcn-vYaZrhQu1IdHOMVQrsc6XsfIGPrWNE,depth=10,body=Historical 50 (batch=0),prevs=['$R4sIu0EhjycD9c7qHb1Sfdw34PqzIFOiTzCsPs_Z-Fk']",
  "event_id=$R4sIu0EhjycD9c7qHb1Sfdw34PqzIFOiTzCsPs_Z-Fk,depth=10,body=Historical 49 (batch=0),prevs=['$Gdo7IK1ZUK3pHvHvOETByF8J_PLqVP6BDk1qI_3AZ90']",
  "event_id=$Gdo7IK1ZUK3pHvHvOETByF8J_PLqVP6BDk1qI_3AZ90,depth=10,body=Historical 48 (batch=0),prevs=['$VJ5qpulzoG4vkhkWnbwpgtBMHAMQSmhUB76lrI_2KXc']",
  "event_id=$VJ5qpulzoG4vkhkWnbwpgtBMHAMQSmhUB76lrI_2KXc,depth=10,body=Historical 47 (batch=0),prevs=['$-h0DqfdRxhEi6RMiaoKEHqzRDqA5Qy8ZskPGAp5rUI0']",
  "event_id=$-h0DqfdRxhEi6RMiaoKEHqzRDqA5Qy8ZskPGAp5rUI0,depth=10,body=Historical 46 (batch=0),prevs=['$_L-oB9rLJsXOnJkjnUQNDUL1C3jw2-YNbTBDiKG958Q']",
  "event_id=$_L-oB9rLJsXOnJkjnUQNDUL1C3jw2-YNbTBDiKG958Q,depth=10,body=Historical 45 (batch=0),prevs=['$iQeszxPn42bPGUQknk5TCYIWxVqnGDG-h4Bk1JFH_-4']",
  "event_id=$iQeszxPn42bPGUQknk5TCYIWxVqnGDG-h4Bk1JFH_-4,depth=10,body=Historical 44 (batch=0),prevs=['$raFQyAel7PT5FUymMwF3SIOXxuMpX7aJyRFDfsyFTpo']",
  "event_id=$raFQyAel7PT5FUymMwF3SIOXxuMpX7aJyRFDfsyFTpo,depth=10,body=Historical 43 (batch=0),prevs=['$bYfZTSvNiI6nOE7NvnwsaJBlDt8eGifjNWiBoOd-4JQ']",
  "event_id=$bYfZTSvNiI6nOE7NvnwsaJBlDt8eGifjNWiBoOd-4JQ,depth=10,body=Historical 42 (batch=0),prevs=['$iflmqGrv2ERr58y8QWMW8cAYjIwctoOqc_S8Zpxf2LE']",
  "event_id=$iflmqGrv2ERr58y8QWMW8cAYjIwctoOqc_S8Zpxf2LE,depth=10,body=Historical 41 (batch=0),prevs=['$84bhYzG__UwK-Rc1T4UGKzQUcLGOTMB9cWikG6Np_hM']",
  "event_id=$84bhYzG__UwK-Rc1T4UGKzQUcLGOTMB9cWikG6Np_hM,depth=10,body=Historical 40 (batch=0),prevs=['$xqS8HMfkjk_9j2aHTisNv8oeocOq38nxxU8MrepqgMU']",
  "event_id=$xqS8HMfkjk_9j2aHTisNv8oeocOq38nxxU8MrepqgMU,depth=10,body=Historical 39 (batch=0),prevs=['$EChQxibb9iOk8GqNnZRL3dQ0EfcXJpbl942hiEf1uxo']",
  "event_id=$EChQxibb9iOk8GqNnZRL3dQ0EfcXJpbl942hiEf1uxo,depth=10,body=Historical 38 (batch=0),prevs=['$bzBMsp8mhPIhbhv8RBjSP8zwvJ6ix2HYoEeourkeRJE']",
  "event_id=$bzBMsp8mhPIhbhv8RBjSP8zwvJ6ix2HYoEeourkeRJE,depth=10,body=Historical 37 (batch=0),prevs=['$lDNy6ds20jjt077dA_f9nFJrAu6reMkA-a9cZaW6cpI']",
  "event_id=$lDNy6ds20jjt077dA_f9nFJrAu6reMkA-a9cZaW6cpI,depth=10,body=Historical 36 (batch=0),prevs=['$yMQY-EQTPizmc_vOIsWIcY-Acp7dBNJew27NlfDHduo']",
  "event_id=$yMQY-EQTPizmc_vOIsWIcY-Acp7dBNJew27NlfDHduo,depth=10,body=Historical 35 (batch=0),prevs=['$Y9NaQWbjDCwqc8TxXbCduEp2FWGNDwUA_ElYWF148T8']",
  "event_id=$Y9NaQWbjDCwqc8TxXbCduEp2FWGNDwUA_ElYWF148T8,depth=10,body=Historical 34 (batch=0),prevs=['$_if1SSgNjDIT1YefAeoQ0z2aH6pe2jynJUDraBZOCjc']",
  "event_id=$_if1SSgNjDIT1YefAeoQ0z2aH6pe2jynJUDraBZOCjc,depth=10,body=Historical 33 (batch=0),prevs=['$_JgwcI13PE8e2MuebXSLBIyd_MaIorlEZtF_z_uIVHo']",
  "event_id=$_JgwcI13PE8e2MuebXSLBIyd_MaIorlEZtF_z_uIVHo,depth=10,body=Historical 32 (batch=0),prevs=['$CRZ4J3otfULJ7Iw1MaAQvIeakECsoZQs1Ehh-xeaC_k']",
  "event_id=$CRZ4J3otfULJ7Iw1MaAQvIeakECsoZQs1Ehh-xeaC_k,depth=10,body=Historical 31 (batch=0),prevs=['$qaIW_OYBoW7I03J5DnXMEJkRMKtnOOO5ttQjniYzHnI']",
  "event_id=$qaIW_OYBoW7I03J5DnXMEJkRMKtnOOO5ttQjniYzHnI,depth=10,body=Historical 30 (batch=0),prevs=['$9VNFmDvQZiJo50kQf1qPTAQyCPsdHjx23qC0DT34wY0']",
  "event_id=$9VNFmDvQZiJo50kQf1qPTAQyCPsdHjx23qC0DT34wY0,depth=10,body=Historical 29 (batch=0),prevs=['$gFbNkb60KtE_SzR9oi16tpkKE9k4hijC2A6dt66Al4k']",
  "event_id=$gFbNkb60KtE_SzR9oi16tpkKE9k4hijC2A6dt66Al4k,depth=10,body=Historical 28 (batch=0),prevs=['$Mq-dMSTxKEwHS3gPvYwU-Obqs3-Tp3SWjRPUq2VDvJg']",
  "event_id=$Mq-dMSTxKEwHS3gPvYwU-Obqs3-Tp3SWjRPUq2VDvJg,depth=10,body=Historical 27 (batch=0),prevs=['$5EC7XJFkyMLzhujTLI_m9UXNEnn-4NKZj-DCouBgyt8']",
  "event_id=$5EC7XJFkyMLzhujTLI_m9UXNEnn-4NKZj-DCouBgyt8,depth=10,body=Historical 26 (batch=0),prevs=['$UxlPuejLS1jHkUNCMRe2vNmc2tcuut-G2N8q6RFTfVQ']",
  "event_id=$UxlPuejLS1jHkUNCMRe2vNmc2tcuut-G2N8q6RFTfVQ,depth=10,body=Historical 25 (batch=0),prevs=['$BNqTjoMam0rgznru1lqk1U8cCqlJRA4GwORVLBeFYTU']",
  "event_id=$BNqTjoMam0rgznru1lqk1U8cCqlJRA4GwORVLBeFYTU,depth=10,body=Historical 24 (batch=0),prevs=['$7SdwqRy6BHBnNb_sQtj2Rph9era4F68ZM6mGPzjJthA']",
  "event_id=$7SdwqRy6BHBnNb_sQtj2Rph9era4F68ZM6mGPzjJthA,depth=10,body=Historical 23 (batch=0),prevs=['$HiveBkhuxr5NIgx9wGhfrmttnGOi0VpeesmqtjpkqE4']",
  "event_id=$HiveBkhuxr5NIgx9wGhfrmttnGOi0VpeesmqtjpkqE4,depth=10,body=Historical 22 (batch=0),prevs=['$m7iJp9s_Stodzk1I1Lf8egDLbIdyvgJPjAxomFguHb4']",
  "event_id=$m7iJp9s_Stodzk1I1Lf8egDLbIdyvgJPjAxomFguHb4,depth=10,body=Historical 21 (batch=0),prevs=['$KRSKtmQJHl80Hn7UR3emVczq4-QgKycVop3lkSeppIs']",
  "event_id=$KRSKtmQJHl80Hn7UR3emVczq4-QgKycVop3lkSeppIs,depth=10,body=Historical 20 (batch=0),prevs=['$ZCZKQrCeoKEC6oKqwjhK_8EQqwq75b7fEop-GgYCTiU']",
  "event_id=$ZCZKQrCeoKEC6oKqwjhK_8EQqwq75b7fEop-GgYCTiU,depth=10,body=Historical 19 (batch=0),prevs=['$9pZEcOtzeGWbnmRS_zAQAhdCIE8DZ6_cJAR0tm2AG1k']",
  "event_id=$9pZEcOtzeGWbnmRS_zAQAhdCIE8DZ6_cJAR0tm2AG1k,depth=10,body=Historical 18 (batch=0),prevs=['$FFXzuSEKR53_PpJ6EBGp8FEBi5Aig2MIq-F1opufK10']",
  "event_id=$FFXzuSEKR53_PpJ6EBGp8FEBi5Aig2MIq-F1opufK10,depth=10,body=Historical 17 (batch=0),prevs=['$hr0MEvZerIeshwxLzAGbqMXQGOXU_u9H1wUPtzqa6gY']",
  "event_id=$hr0MEvZerIeshwxLzAGbqMXQGOXU_u9H1wUPtzqa6gY,depth=10,body=Historical 16 (batch=0),prevs=['$hjP2ryNx-yqznW3EKrBZE1DaGSbvK8lB_3cWUDDGTVk']",
  "event_id=$hjP2ryNx-yqznW3EKrBZE1DaGSbvK8lB_3cWUDDGTVk,depth=10,body=Historical 15 (batch=0),prevs=['$E24xBJItDTqteFc11s2kk2JuvpQjZ2fd-vEWJ7QS784']",
  "event_id=$E24xBJItDTqteFc11s2kk2JuvpQjZ2fd-vEWJ7QS784,depth=10,body=Historical 14 (batch=0),prevs=['$eOuhBaOKitgobbzyU5XVieMLzgoCITj9eG-ewSMDB9I']",
  "event_id=$eOuhBaOKitgobbzyU5XVieMLzgoCITj9eG-ewSMDB9I,depth=10,body=Historical 13 (batch=0),prevs=['$4F4Xhu7QKpLM-n_aFmCLrKRP6zw7lrDLAYFTPKn8jYo']",
  "event_id=$4F4Xhu7QKpLM-n_aFmCLrKRP6zw7lrDLAYFTPKn8jYo,depth=10,body=Historical 12 (batch=0),prevs=['$e0wqSykOpA8Y0yipT9643SVVQ3DMOnW11yxvqAj9JrE']",
  "event_id=$e0wqSykOpA8Y0yipT9643SVVQ3DMOnW11yxvqAj9JrE,depth=10,body=Historical 11 (batch=0),prevs=['$u5gxt1eo59odS1XqVS-kV2GcaitrzorppcqVj3scevI']",
  "event_id=$u5gxt1eo59odS1XqVS-kV2GcaitrzorppcqVj3scevI,depth=10,body=Historical 10 (batch=0),prevs=['$Z1E79_z_FcAnw4G9NOvx3WhyL2ACyYPgy6zLhomKVks']",
  "event_id=$Z1E79_z_FcAnw4G9NOvx3WhyL2ACyYPgy6zLhomKVks,depth=10,body=Historical 9 (batch=0),prevs=['$USyjgdL7fwX4BvmblVs2cicGO3WDRB-ox56298yZmAA']",
  "event_id=$USyjgdL7fwX4BvmblVs2cicGO3WDRB-ox56298yZmAA,depth=10,body=Historical 8 (batch=0),prevs=['$tggu2uQEL2BWVJiwqsqwCJUca3SEFeylCAbPw5DrIdo']",
  "event_id=$tggu2uQEL2BWVJiwqsqwCJUca3SEFeylCAbPw5DrIdo,depth=10,body=Historical 7 (batch=0),prevs=['$M0iINx5TifxVTJ6pz-lio7xIeSla1RIV_N9WIK5sf4c']",
  "event_id=$M0iINx5TifxVTJ6pz-lio7xIeSla1RIV_N9WIK5sf4c,depth=10,body=Historical 6 (batch=0),prevs=['$hEs6MN2xyjXqHRcWV53_23NeNm--al9b_5BnMYYDPMY']",
  "event_id=$hEs6MN2xyjXqHRcWV53_23NeNm--al9b_5BnMYYDPMY,depth=10,body=Historical 5 (batch=0),prevs=['$L0BJu5ZOx2l8AMivXMBCqrvymVu_nCQM4ZO23uv5tBU']",
  "event_id=$L0BJu5ZOx2l8AMivXMBCqrvymVu_nCQM4ZO23uv5tBU,depth=10,body=Historical 4 (batch=0),prevs=['$V5BZU5LpCbW6XvPLGls0QGRbo98uuf1KpMZ0fg8k_-o']"]

new implementation backfill events(100)=[
  "event_id=$V5BZU5LpCbW6XvPLGls0QGRbo98uuf1KpMZ0fg8k_-o,depth=10,body=Historical 3 (batch=0),prevs=['$lF2XlCU-QmhC0YF8Wn8Q-EfQXqDxF_usgPIZ28rNhII']",
  "event_id=$lF2XlCU-QmhC0YF8Wn8Q-EfQXqDxF_usgPIZ28rNhII,depth=10,body=Historical 2 (batch=0),prevs=['$Ghnwsm4CqaWopAMGjKm8piFuTEqSaWgl1X7esubZOco']",
  "event_id=$Ghnwsm4CqaWopAMGjKm8piFuTEqSaWgl1X7esubZOco,depth=10,body=Historical 1 (batch=0),prevs=['$WRV7zPTr4KknEcYUvPlfxMdxcmlrQSsXAfTTlSBpjko']",
  "event_id=$WRV7zPTr4KknEcYUvPlfxMdxcmlrQSsXAfTTlSBpjko,depth=10,body=Historical 0 (batch=0),prevs=['$30VmrbC0AauqzWQ9F2g_KTPUdJhH_r79olOmfZYe0Pg']",
  "event_id=$30VmrbC0AauqzWQ9F2g_KTPUdJhH_r79olOmfZYe0Pg,depth=10,body=org.matrix.msc2716.insertion,prevs=['$an2lLzRXApWnCuRNrb1jTfMY9lWbz909AxyIRWy5-C0']",
  "event_id=$CmUx1RcXqn9QwVSKFKGmwVXwEFE9sHpnac5xvCgm-Co,depth=10,body=org.matrix.msc2716.batch,prevs=['$Kt2_lR2GlI6YoDY7q1ttaoIUv_s8WsjKgce6PT8utIA']",
  "event_id=$Kt2_lR2GlI6YoDY7q1ttaoIUv_s8WsjKgce6PT8utIA,depth=10,body=Historical 99 (batch=1),prevs=['$eaZav6ZipscONXQMtzaWQrTmiw9yo6_ifeaiI2VTJJM']",
  "event_id=$eaZav6ZipscONXQMtzaWQrTmiw9yo6_ifeaiI2VTJJM,depth=10,body=Historical 98 (batch=1),prevs=['$sSIhVeKMkHlwvQmCdUxouZyc0A7oBK_IcTYYPhQHniY']",
  "event_id=$sSIhVeKMkHlwvQmCdUxouZyc0A7oBK_IcTYYPhQHniY,depth=10,body=Historical 97 (batch=1),prevs=['$tQ6z1P58SRR3qqS6UnjWn85zP6CoU882ehdCkNcwhA8']",
  "event_id=$tQ6z1P58SRR3qqS6UnjWn85zP6CoU882ehdCkNcwhA8,depth=10,body=Historical 96 (batch=1),prevs=['$mh2o2cBnVjU5uQr0UAMPAWPpGsRzIKKpzc54Q2Z9JGY']",
  "event_id=$mh2o2cBnVjU5uQr0UAMPAWPpGsRzIKKpzc54Q2Z9JGY,depth=10,body=Historical 95 (batch=1),prevs=['$O_SPFvep-jjnHsW2484GzRYIDZkJhZYVgmCstDR3Qn0']",
  "event_id=$O_SPFvep-jjnHsW2484GzRYIDZkJhZYVgmCstDR3Qn0,depth=10,body=Historical 94 (batch=1),prevs=['$MkZU6zPnF5L4Mb9Y0AkOlWSG6S5yKhyVsFPm_WPc7EU']",
  "event_id=$MkZU6zPnF5L4Mb9Y0AkOlWSG6S5yKhyVsFPm_WPc7EU,depth=10,body=Historical 93 (batch=1),prevs=['$lts-3h-4-93qb12QQ8PwkvSu4bSJVKulvj_N2UPRhvs']",
  "event_id=$lts-3h-4-93qb12QQ8PwkvSu4bSJVKulvj_N2UPRhvs,depth=10,body=Historical 92 (batch=1),prevs=['$abLL8g1D70BE9EqtgSGoVjtbVK6QKG0KZhgBeJmEAuw']",
  "event_id=$abLL8g1D70BE9EqtgSGoVjtbVK6QKG0KZhgBeJmEAuw,depth=10,body=Historical 91 (batch=1),prevs=['$H2-ZSHXeJII1Jc3XvEjFfmjGUZgpsmlay7YuKKlF7JQ']",
  "event_id=$H2-ZSHXeJII1Jc3XvEjFfmjGUZgpsmlay7YuKKlF7JQ,depth=10,body=Historical 90 (batch=1),prevs=['$VsrkCzgyKUyPT4XpS0pa-K-CwRJ7MeNu9ictxOHPZo4']",
  "event_id=$VsrkCzgyKUyPT4XpS0pa-K-CwRJ7MeNu9ictxOHPZo4,depth=10,body=Historical 89 (batch=1),prevs=['$NSVKzqK5ucXWwWq7j4yfADj5m-8GqWFCWeqo2hvUDWg']",
  "event_id=$NSVKzqK5ucXWwWq7j4yfADj5m-8GqWFCWeqo2hvUDWg,depth=10,body=Historical 88 (batch=1),prevs=['$y5lPUOYBw0g12eIgDUdTn5QnmXD2QeFks61Ivpha1XA']",
  "event_id=$y5lPUOYBw0g12eIgDUdTn5QnmXD2QeFks61Ivpha1XA,depth=10,body=Historical 87 (batch=1),prevs=['$BdehWtfVHIxjlD3-pWh-6kcb1w2oPhAhgCWxNUkKAD8']",
  "event_id=$BdehWtfVHIxjlD3-pWh-6kcb1w2oPhAhgCWxNUkKAD8,depth=10,body=Historical 86 (batch=1),prevs=['$B0afYanjEywl1q1fYru7nL2RmjjZpF0gjTVQ7n9fY6k']",
  "event_id=$B0afYanjEywl1q1fYru7nL2RmjjZpF0gjTVQ7n9fY6k,depth=10,body=Historical 85 (batch=1),prevs=['$F2cOk9oSDKNSlrMoJioWtLi8AdhMkS-QpVwZw2qhWgM']",
  "event_id=$F2cOk9oSDKNSlrMoJioWtLi8AdhMkS-QpVwZw2qhWgM,depth=10,body=Historical 84 (batch=1),prevs=['$QGCvZWFsgW4KTskjaSqxjTenOa3TbbpBDWVyXESXDGI']",
  "event_id=$QGCvZWFsgW4KTskjaSqxjTenOa3TbbpBDWVyXESXDGI,depth=10,body=Historical 83 (batch=1),prevs=['$5evMhA_hLx02z7ydMm_cRfSUsC9OX0MJLayMydLrzN0']",
  "event_id=$5evMhA_hLx02z7ydMm_cRfSUsC9OX0MJLayMydLrzN0,depth=10,body=Historical 82 (batch=1),prevs=['$4jmsKkx-6NRVMCflN_s6sOfC053Zw1wOfCCM0bWlIX8']",
  "event_id=$4jmsKkx-6NRVMCflN_s6sOfC053Zw1wOfCCM0bWlIX8,depth=10,body=Historical 81 (batch=1),prevs=['$sTtp0fKA9BG4GDkJ8CUBQVNqpDDcf_a-PkGhJkGqzrw']",
  "event_id=$sTtp0fKA9BG4GDkJ8CUBQVNqpDDcf_a-PkGhJkGqzrw,depth=10,body=Historical 80 (batch=1),prevs=['$96go7TqZzPq75eOOLiDY0FkylHrmAGly0MTwX4_McMs']",
  "event_id=$96go7TqZzPq75eOOLiDY0FkylHrmAGly0MTwX4_McMs,depth=10,body=Historical 79 (batch=1),prevs=['$kUiJWkPHn1nPrUDzZJvWhTz1T8UBVELMlEdJGOEB_Qo']",
  "event_id=$kUiJWkPHn1nPrUDzZJvWhTz1T8UBVELMlEdJGOEB_Qo,depth=10,body=Historical 78 (batch=1),prevs=['$5GCJZEmchNvy0ikP7K7ZlvFb9FS6aVKRedx-08ZAF3s']",
  "event_id=$5GCJZEmchNvy0ikP7K7ZlvFb9FS6aVKRedx-08ZAF3s,depth=10,body=Historical 77 (batch=1),prevs=['$A3r2LkTKaHxBQh1Ailt4dCtaESyo53Ss1u1s3QiE_k0']",
  "event_id=$A3r2LkTKaHxBQh1Ailt4dCtaESyo53Ss1u1s3QiE_k0,depth=10,body=Historical 76 (batch=1),prevs=['$R7RRyXo6Msc3-368vZpiG84DfqOAiKLiSbV0ECGv6Oo']",
  "event_id=$R7RRyXo6Msc3-368vZpiG84DfqOAiKLiSbV0ECGv6Oo,depth=10,body=Historical 75 (batch=1),prevs=['$jmkYlZN6-oiQOi-bJfs0whVS7kKeJJUN6YJQfubbaEU']",
  "event_id=$jmkYlZN6-oiQOi-bJfs0whVS7kKeJJUN6YJQfubbaEU,depth=10,body=Historical 74 (batch=1),prevs=['$IuGVv6TZj5ZoOP4HHqZsKPWQ9HDTHS4QV7oFHk4kl7o']",
  "event_id=$IuGVv6TZj5ZoOP4HHqZsKPWQ9HDTHS4QV7oFHk4kl7o,depth=10,body=Historical 73 (batch=1),prevs=['$sNds_pVGUFf41AJwHmA1Sy7MUX1N9MtHGfw9ye6EItM']",
  "event_id=$sNds_pVGUFf41AJwHmA1Sy7MUX1N9MtHGfw9ye6EItM,depth=10,body=Historical 72 (batch=1),prevs=['$u0R7zUNs4BpneteeM7PWgGZE4XzQJuAwUtFSQGwTNI0']",
  "event_id=$u0R7zUNs4BpneteeM7PWgGZE4XzQJuAwUtFSQGwTNI0,depth=10,body=Historical 71 (batch=1),prevs=['$VthGtqcIDd04US7pMNTr0gSmR7PIOPLmDOljx1qNleQ']",
  "event_id=$VthGtqcIDd04US7pMNTr0gSmR7PIOPLmDOljx1qNleQ,depth=10,body=Historical 70 (batch=1),prevs=['$qYlzglfNCN1Br-4UkajF4c-SKYI0By5gExUxczeDsg4']",
  "event_id=$qYlzglfNCN1Br-4UkajF4c-SKYI0By5gExUxczeDsg4,depth=10,body=Historical 69 (batch=1),prevs=['$BsxtZqcTIs1aqFRsXtapKXYF6w2GiUEswpl6kH6S_4o']",
  "event_id=$BsxtZqcTIs1aqFRsXtapKXYF6w2GiUEswpl6kH6S_4o,depth=10,body=Historical 68 (batch=1),prevs=['$PmOzgtCDJCyGowxB8gWcYbfA2KUX0MCJ3xTE48FhAyY']",
  "event_id=$PmOzgtCDJCyGowxB8gWcYbfA2KUX0MCJ3xTE48FhAyY,depth=10,body=Historical 67 (batch=1),prevs=['$vZq13XMjZRJdFefxBg0L1U9shZq1TbArtR43YkQG7i8']",
  "event_id=$vZq13XMjZRJdFefxBg0L1U9shZq1TbArtR43YkQG7i8,depth=10,body=Historical 66 (batch=1),prevs=['$526Rm38ribM0XL3HltTbjVCUa3cDUdBh0V-9AMPtsYY']",
  "event_id=$526Rm38ribM0XL3HltTbjVCUa3cDUdBh0V-9AMPtsYY,depth=10,body=Historical 65 (batch=1),prevs=['$-sPB5z3uyN5tr4KezPKt6xu_yoaqgSDKhkzTJ0Um7yI']",
  "event_id=$-sPB5z3uyN5tr4KezPKt6xu_yoaqgSDKhkzTJ0Um7yI,depth=10,body=Historical 64 (batch=1),prevs=['$y5mX5SlScEAyPbUx1UA2-_ml0abbh0nGFYgJzF0XzZ0']",
  "event_id=$y5mX5SlScEAyPbUx1UA2-_ml0abbh0nGFYgJzF0XzZ0,depth=10,body=Historical 63 (batch=1),prevs=['$erT1ogi6tp9tF33_N3ZBLpIMBXOunszhADMYjs8U5AE']",
  "event_id=$erT1ogi6tp9tF33_N3ZBLpIMBXOunszhADMYjs8U5AE,depth=10,body=Historical 62 (batch=1),prevs=['$d9qTo4Ray7GJWJPm-CHkfZmZC0WmD8-K6Z1Riyot3fw']",
  "event_id=$d9qTo4Ray7GJWJPm-CHkfZmZC0WmD8-K6Z1Riyot3fw,depth=10,body=Historical 61 (batch=1),prevs=['$TVgdscs2fWtvx0ak6V0ljabU_4cc6UH18Y1r3OvDLYc']",
  "event_id=$TVgdscs2fWtvx0ak6V0ljabU_4cc6UH18Y1r3OvDLYc,depth=10,body=Historical 60 (batch=1),prevs=['$eMi_3TfsgYw2Fs99AJpr_9KAapZq3uwtv2fUDQ2weTc']",
  "event_id=$eMi_3TfsgYw2Fs99AJpr_9KAapZq3uwtv2fUDQ2weTc,depth=10,body=Historical 59 (batch=1),prevs=['$UBL_4l45DMvVTE12gyRaSDMw_fi_biDx1dL_gWz_v-g']",
  "event_id=$UBL_4l45DMvVTE12gyRaSDMw_fi_biDx1dL_gWz_v-g,depth=10,body=Historical 58 (batch=1),prevs=['$A6-UMuau--ffdnOA0NqWQK9uO0NBCB_rwVCvu_hSAOw']",
  "event_id=$A6-UMuau--ffdnOA0NqWQK9uO0NBCB_rwVCvu_hSAOw,depth=10,body=Historical 57 (batch=1),prevs=['$Eia3O1ptxGtKhINTEVX_FxBU3TjL0MBp1XdeFCStcCg']",
  "event_id=$Eia3O1ptxGtKhINTEVX_FxBU3TjL0MBp1XdeFCStcCg,depth=10,body=Historical 56 (batch=1),prevs=['$Pb5OyRAHNrXDyPt8F1dTWVGi-Zvqkf-HqzCwcu0salY']",
  "event_id=$Pb5OyRAHNrXDyPt8F1dTWVGi-Zvqkf-HqzCwcu0salY,depth=10,body=Historical 55 (batch=1),prevs=['$c1KPN_U0VF8G3jGnD6UpQob_h9X_KQfXv4lciJUb4PQ']",
  "event_id=$c1KPN_U0VF8G3jGnD6UpQob_h9X_KQfXv4lciJUb4PQ,depth=10,body=Historical 54 (batch=1),prevs=['$fwWir53iSGaGEMRt-mQe6hYmkwIQGjDojFO08zlzgX4']",
  "event_id=$fwWir53iSGaGEMRt-mQe6hYmkwIQGjDojFO08zlzgX4,depth=10,body=Historical 53 (batch=1),prevs=['$TmacWSD6J8y8vERZfA-IdRpDeMS_4A1HFNUBg_W5MaA']",
  "event_id=$TmacWSD6J8y8vERZfA-IdRpDeMS_4A1HFNUBg_W5MaA,depth=10,body=Historical 52 (batch=1),prevs=['$_xBvb_mIUJgyvA-rgBppyjXVZ3SXn03isQ0axMOtThc']",
  "event_id=$_xBvb_mIUJgyvA-rgBppyjXVZ3SXn03isQ0axMOtThc,depth=10,body=Historical 51 (batch=1),prevs=['$AYD-cd4lrJLbW35mCK8dKZEZI705gOsA1iiyW3uqDWk']",
  "event_id=$AYD-cd4lrJLbW35mCK8dKZEZI705gOsA1iiyW3uqDWk,depth=10,body=Historical 50 (batch=1),prevs=['$KK1BXAZ3E-U7qKWhO6Y6DfXedQ04BhwuA_bNI5Nee8g']",
  "event_id=$KK1BXAZ3E-U7qKWhO6Y6DfXedQ04BhwuA_bNI5Nee8g,depth=10,body=Historical 49 (batch=1),prevs=['$_oLPTYdg92q_l3c6vxV4tO9ioR9nPrk1lyb2qiLIPOk']",
  "event_id=$_oLPTYdg92q_l3c6vxV4tO9ioR9nPrk1lyb2qiLIPOk,depth=10,body=Historical 48 (batch=1),prevs=['$RZ0Mzvftn99rU6XFl32jKHs0R6YYaMPy_HJy41tK4ig']",
  "event_id=$RZ0Mzvftn99rU6XFl32jKHs0R6YYaMPy_HJy41tK4ig,depth=10,body=Historical 47 (batch=1),prevs=['$mloZAG1tKqfjIBQhJk8Mn7M5ER84cJ7bC0TW3rOsKpU']",
  "event_id=$mloZAG1tKqfjIBQhJk8Mn7M5ER84cJ7bC0TW3rOsKpU,depth=10,body=Historical 46 (batch=1),prevs=['$RY6YWeTkTc8aQP6ZkPq_vL0qs1kg53QeDcKmrLi0ASw']",
  "event_id=$RY6YWeTkTc8aQP6ZkPq_vL0qs1kg53QeDcKmrLi0ASw,depth=10,body=Historical 45 (batch=1),prevs=['$5A2e6qJj9n9ejvUW6TcVkm6-cuHghnRKQDW3T3a4eqI']",
  "event_id=$5A2e6qJj9n9ejvUW6TcVkm6-cuHghnRKQDW3T3a4eqI,depth=10,body=Historical 44 (batch=1),prevs=['$KDMWnrkM1ezjDXlSrXjvhZS-RRuJc6_hrX-Msh0gP7o']",
  "event_id=$KDMWnrkM1ezjDXlSrXjvhZS-RRuJc6_hrX-Msh0gP7o,depth=10,body=Historical 43 (batch=1),prevs=['$9Q6SSr_YMaQ6oc9w7lYs-bRw0cNESLPTE45Fg2_Zzv4']",
  "event_id=$9Q6SSr_YMaQ6oc9w7lYs-bRw0cNESLPTE45Fg2_Zzv4,depth=10,body=Historical 42 (batch=1),prevs=['$b2QYayqOOaCxQqs655Tve2OKeXrT9CJeVIchVUn00hI']",
  "event_id=$b2QYayqOOaCxQqs655Tve2OKeXrT9CJeVIchVUn00hI,depth=10,body=Historical 41 (batch=1),prevs=['$xQQBp4Dwm-3lxCWkJsck9bXuQoCKsdPIortpc79nTtw']",
  "event_id=$xQQBp4Dwm-3lxCWkJsck9bXuQoCKsdPIortpc79nTtw,depth=10,body=Historical 40 (batch=1),prevs=['$RgTwPhV6RzdVBmuqoYBNblHPZ-qpYuTCshDBrfpwvds']",
  "event_id=$RgTwPhV6RzdVBmuqoYBNblHPZ-qpYuTCshDBrfpwvds,depth=10,body=Historical 39 (batch=1),prevs=['$RWyv_RX_EoNzCDnHSCfx6fDnJrhWl46iWYomZSS2GsQ']",
  "event_id=$RWyv_RX_EoNzCDnHSCfx6fDnJrhWl46iWYomZSS2GsQ,depth=10,body=Historical 38 (batch=1),prevs=['$Sj78rQcr9DuCnhtcYuZjWS6o1ZiFDd3ZQxDtJKxjeNg']",
  "event_id=$Sj78rQcr9DuCnhtcYuZjWS6o1ZiFDd3ZQxDtJKxjeNg,depth=10,body=Historical 37 (batch=1),prevs=['$KePkqP3sJgnC8wVMyRFd0v7Fsu-8LiLTZbhx0JsWfnY']",
  "event_id=$KePkqP3sJgnC8wVMyRFd0v7Fsu-8LiLTZbhx0JsWfnY,depth=10,body=Historical 36 (batch=1),prevs=['$QdyPRKCNju-Rzm1u530j3N7AEcRFA5mAO3sVbBZunkQ']",
  "event_id=$QdyPRKCNju-Rzm1u530j3N7AEcRFA5mAO3sVbBZunkQ,depth=10,body=Historical 35 (batch=1),prevs=['$dd3HF7wo7YRhA6e0j5I9eGZtaH1rMK7dAriiNTQd7-Y']",
  "event_id=$dd3HF7wo7YRhA6e0j5I9eGZtaH1rMK7dAriiNTQd7-Y,depth=10,body=Historical 34 (batch=1),prevs=['$l6q9M7E_yWQID_v4YZMYZfNevVqhK0Pm6qIDABcx7ag']",
  "event_id=$l6q9M7E_yWQID_v4YZMYZfNevVqhK0Pm6qIDABcx7ag,depth=10,body=Historical 33 (batch=1),prevs=['$GAdAhlUMns9H8jeNH6yrfNp1c4_-lhQKyBnmAkQNZ5A']",
  "event_id=$GAdAhlUMns9H8jeNH6yrfNp1c4_-lhQKyBnmAkQNZ5A,depth=10,body=Historical 32 (batch=1),prevs=['$6liLB-IPWtTynCd27je2vCoHfDK_S3pwlRe5GoUsLY8']",
  "event_id=$6liLB-IPWtTynCd27je2vCoHfDK_S3pwlRe5GoUsLY8,depth=10,body=Historical 31 (batch=1),prevs=['$9C_ywoPrhy68x4-MurcodrKje7FOw5GuG9yMJ6W2ObM']",
  "event_id=$9C_ywoPrhy68x4-MurcodrKje7FOw5GuG9yMJ6W2ObM,depth=10,body=Historical 30 (batch=1),prevs=['$QyvDk3PQ4dEDxHb0ihFqAwWpqH-NQ86GV_w5njGNOSY']",
  "event_id=$QyvDk3PQ4dEDxHb0ihFqAwWpqH-NQ86GV_w5njGNOSY,depth=10,body=Historical 29 (batch=1),prevs=['$c2ee8wW8tAvev6UB1yOZMA56j-BFcxZJQqPbXxiqmeg']",
  "event_id=$c2ee8wW8tAvev6UB1yOZMA56j-BFcxZJQqPbXxiqmeg,depth=10,body=Historical 28 (batch=1),prevs=['$psirWB7VB7WUVg7IjiG1XX2WMOAiN_FFcdo8crQ3KF0']",
  "event_id=$psirWB7VB7WUVg7IjiG1XX2WMOAiN_FFcdo8crQ3KF0,depth=10,body=Historical 27 (batch=1),prevs=['$AMyblWA-Jny9Nobd-ghaFit6ZDG6OOg3rTxwEIn6zkQ']",
  "event_id=$AMyblWA-Jny9Nobd-ghaFit6ZDG6OOg3rTxwEIn6zkQ,depth=10,body=Historical 26 (batch=1),prevs=['$EtDL8yGxA03ZO5pTeztYOQvHxUaMCCz9Nj7oGgM0CL8']",
  "event_id=$EtDL8yGxA03ZO5pTeztYOQvHxUaMCCz9Nj7oGgM0CL8,depth=10,body=Historical 25 (batch=1),prevs=['$zmqDOTVLDS_khXDmPiPvJ7745wI_yuEAsxS_fyDroIo']",
  "event_id=$zmqDOTVLDS_khXDmPiPvJ7745wI_yuEAsxS_fyDroIo,depth=10,body=Historical 24 (batch=1),prevs=['$lMcNfcLZKCtmrGISzGo3M_lxJapImAmdky9Lezij6TI']",
  "event_id=$lMcNfcLZKCtmrGISzGo3M_lxJapImAmdky9Lezij6TI,depth=10,body=Historical 23 (batch=1),prevs=['$i4vpa73GXD7wZB2r2t-8nV--pGq_GdKCotM2-wpVJ10']",
  "event_id=$i4vpa73GXD7wZB2r2t-8nV--pGq_GdKCotM2-wpVJ10,depth=10,body=Historical 22 (batch=1),prevs=['$9BA_P9uGh-cLjLau5nToTmpsnxdaPkT2RjMf9ZYglNI']",
  "event_id=$9BA_P9uGh-cLjLau5nToTmpsnxdaPkT2RjMf9ZYglNI,depth=10,body=Historical 21 (batch=1),prevs=['$ySO1DPJTl_IiFwv4d6jbNy43a1go9rD_86A2EPIGVZE']",
  "event_id=$ySO1DPJTl_IiFwv4d6jbNy43a1go9rD_86A2EPIGVZE,depth=10,body=Historical 20 (batch=1),prevs=['$XOyDGiQEhlEoT8UGl4HIod5Zb29R3Op2BFIaVeiCRyY']",
  "event_id=$XOyDGiQEhlEoT8UGl4HIod5Zb29R3Op2BFIaVeiCRyY,depth=10,body=Historical 19 (batch=1),prevs=['$XDqJHr3kmi2Z9hpNX2Vz7o524cLEMkjKwk-_V2A3U1U']",
  "event_id=$XDqJHr3kmi2Z9hpNX2Vz7o524cLEMkjKwk-_V2A3U1U,depth=10,body=Historical 18 (batch=1),prevs=['$hlXaBZDCY4XSg-qjuzkAWhYqoBpdX8ehIFZd5M_9rRM']",
  "event_id=$hlXaBZDCY4XSg-qjuzkAWhYqoBpdX8ehIFZd5M_9rRM,depth=10,body=Historical 17 (batch=1),prevs=['$LMLomCl3U7zYXi4sIHHDnfznJkns0-DLRDGMbhJ1AAo']",
  "event_id=$LMLomCl3U7zYXi4sIHHDnfznJkns0-DLRDGMbhJ1AAo,depth=10,body=Historical 16 (batch=1),prevs=['$d0pjrKi7Ws1QM-XyB1_d9Yrg0AGY8MD6JLJqrnaaoJM']",
  "event_id=$d0pjrKi7Ws1QM-XyB1_d9Yrg0AGY8MD6JLJqrnaaoJM,depth=10,body=Historical 15 (batch=1),prevs=['$hx2dBPyOh6KnEzdpw7CnvoSOkiYTKJp82MXaWA_77N0']",
  "event_id=$hx2dBPyOh6KnEzdpw7CnvoSOkiYTKJp82MXaWA_77N0,depth=10,body=Historical 14 (batch=1),prevs=['$-y0R8tPCI4n4L0t2j4Ua3QIfau7n4kqPXgnQjb4e1qk']",
  "event_id=$-y0R8tPCI4n4L0t2j4Ua3QIfau7n4kqPXgnQjb4e1qk,depth=10,body=Historical 13 (batch=1),prevs=['$Af85_d8_UkHp8r8KzOnjCCI0whyMQB7U3G5u8NlMk4I']",
  "event_id=$Af85_d8_UkHp8r8KzOnjCCI0whyMQB7U3G5u8NlMk4I,depth=10,body=Historical 12 (batch=1),prevs=['$1nQJC9ULuCVGYWU_umE58wq5wHmmFx2GdgF6nmQt5VU']",
  "event_id=$1nQJC9ULuCVGYWU_umE58wq5wHmmFx2GdgF6nmQt5VU,depth=10,body=Historical 11 (batch=1),prevs=['$SdAp6h2pjv7aIxDSZJxwQbolYrqzUGf1gHOeBnqAULU']",
  "event_id=$SdAp6h2pjv7aIxDSZJxwQbolYrqzUGf1gHOeBnqAULU,depth=10,body=Historical 10 (batch=1),prevs=['$YDMkSKMoYDtwMd-nKvgAIk38uzc1UejIyBvXNoJ_RFM']",
  "event_id=$YDMkSKMoYDtwMd-nKvgAIk38uzc1UejIyBvXNoJ_RFM,depth=10,body=Historical 9 (batch=1),prevs=['$a8nvUo95cOf-cO4hcgfO1sT0kyWKq8XPUDmJe0DbxNE']",
  "event_id=$a8nvUo95cOf-cO4hcgfO1sT0kyWKq8XPUDmJe0DbxNE,depth=10,body=Historical 8 (batch=1),prevs=['$LunwOlIdMiDjrcQazQ6I3n0T8aLfmSA24fIEeth1hHs']",
  "event_id=$LunwOlIdMiDjrcQazQ6I3n0T8aLfmSA24fIEeth1hHs,depth=10,body=Historical 7 (batch=1),prevs=['$UOvHOp4SKtZqSDWZvD0s3VGdU23-6YqiWy_742cqY-8']",
  "event_id=$UOvHOp4SKtZqSDWZvD0s3VGdU23-6YqiWy_742cqY-8,depth=10,body=Historical 6 (batch=1),prevs=['$W-c9syEfTTufHnNBpuMUIk621ecs9W6bTeLW0OgWFfY']\n"]

new implementation backfill events(17)=[
  "event_id=$W-c9syEfTTufHnNBpuMUIk621ecs9W6bTeLW0OgWFfY,depth=10,body=Historical 5 (batch=1),prevs=['$Gq8-foARgSoEzcEwXhOsiey2pefpCX3vjnCLtsIdvU0']",
  "event_id=$Gq8-foARgSoEzcEwXhOsiey2pefpCX3vjnCLtsIdvU0,depth=10,body=Historical 4 (batch=1),prevs=['$toIu3hsoBDXkVJs91nUG0hodf3nuFkbidY7ztVPrtCM']",
  "event_id=$toIu3hsoBDXkVJs91nUG0hodf3nuFkbidY7ztVPrtCM,depth=10,body=Historical 3 (batch=1),prevs=['$SRcKQ-ggRujFzHbJC44rWvslb4YBKgieWahZakx3zMw']",
  "event_id=$SRcKQ-ggRujFzHbJC44rWvslb4YBKgieWahZakx3zMw,depth=10,body=Historical 2 (batch=1),prevs=['$Pgqvjn_rkQb6eEdQDeKclO-l_ODlnplF7S-rT1i_-64']",
  "event_id=$Pgqvjn_rkQb6eEdQDeKclO-l_ODlnplF7S-rT1i_-64,depth=10,body=Historical 1 (batch=1),prevs=['$jEW2Smmgh5tIh1QMtEqmluy-o3FrcVhNAH5e3R4jMoo']",
  "event_id=$jEW2Smmgh5tIh1QMtEqmluy-o3FrcVhNAH5e3R4jMoo,depth=10,body=Historical 0 (batch=1),prevs=['$1bbHCIrQLToHvum-PGxpIKhCmZ5MYLusAy_gJm7IWTw']",
  "event_id=$1bbHCIrQLToHvum-PGxpIKhCmZ5MYLusAy_gJm7IWTw,depth=10,body=org.matrix.msc2716.insertion,prevs=['$758TrMVR2MlE4EhpRUvCYZFcp11cbE27edQcwKaUSI8']",
  "event_id=$T5-OUXAW3CCYAHskqk5s0V2ZzJoQy5D8lQJ7LZFWvTI,depth=9,body=Message 1 (eventIDsBefore),prevs=['$WYEMee2J5PcH1yM2XDnD2XIhyMS_HHDdYXop6BOL69E']",
  "event_id=$WYEMee2J5PcH1yM2XDnD2XIhyMS_HHDdYXop6BOL69E,depth=8,body=Message 0 (eventIDsBefore),prevs=['$jTD4_ZLQQgXienBOsHMwSqyuuYtXQq4WYj7hnPbRC0o']",
  "event_id=$jTD4_ZLQQgXienBOsHMwSqyuuYtXQq4WYj7hnPbRC0o,depth=7,body=m.room.member,prevs=['$d9EI1fE4ArZLYeQPs3P6dlqTmtskwjJWtlfNEZTdSoA']",
  "event_id=$d9EI1fE4ArZLYeQPs3P6dlqTmtskwjJWtlfNEZTdSoA,depth=6,body=m.room.name,prevs=['$VvA6Hhp67rDLix7Pg9tZs6DDDh0gq_Mw-qr9wd5cO2k']",
  "event_id=$VvA6Hhp67rDLix7Pg9tZs6DDDh0gq_Mw-qr9wd5cO2k,depth=5,body=m.room.history_visibility,prevs=['$7fkTDT3EgbweX381_HInASE-jAzhxcQfkzOWuXxXO7U']",
  "event_id=$7fkTDT3EgbweX381_HInASE-jAzhxcQfkzOWuXxXO7U,depth=4,body=m.room.join_rules,prevs=['$uvO6_KB-CJtOtomqSgSAWLL59mJK0JW2U33ebFTuoK4']",
  "event_id=$uvO6_KB-CJtOtomqSgSAWLL59mJK0JW2U33ebFTuoK4,depth=3,body=m.room.power_levels,prevs=['$HjRQ8RpCPPWO4Ufq6bSCTqa_tSlKez15KvZRMpvvskc']",
  "event_id=$HjRQ8RpCPPWO4Ufq6bSCTqa_tSlKez15KvZRMpvvskc,depth=2,body=m.room.member,prevs=['$yXLeDjVhdX5jmjLVxmsxKhG_rjfA9ujL8Cd8eHNha6U']",
  'event_id=$758TrMVR2MlE4EhpRUvCYZFcp11cbE27edQcwKaUSI8,depth=1,body=m.room.member,prevs=[]',
  'event_id=$yXLeDjVhdX5jmjLVxmsxKhG_rjfA9ujL8Cd8eHNha6U,depth=1,body=m.room.create,prevs=[]'
]
```
2021-10-29 17:27:38 -05:00
Eric Eastwood c772b35a25 Implement backfill in handler so we can do fetching later
Old and new implementation seem to perform the same :)

```
old implementation backfill events=[
  "event_id=$BU66ZRqOvMEH-wRgx3hruEBKH1tcUUD0rWdGnUEAcuQ,depth=11,body=Message 1 (eventIDsAfter),prevs=['$r7UcvfwqKAnhqAesYovjSEWaC4aOcXWJMWQ0W7LhBok']",
  "event_id=$r7UcvfwqKAnhqAesYovjSEWaC4aOcXWJMWQ0W7LhBok,depth=10,body=Message 0 (eventIDsAfter),prevs=['$9JuhSj0h0AbHvky0T3tSRfq_lxg1k2LTHY-J-MW6FfA']",
  "event_id=$jX7MRv7WeXx79_r44I45EC8peZ0eKgbN12wolz0_ueA,depth=10,body=org.matrix.msc2716.insertion,prevs=['$9JuhSj0h0AbHvky0T3tSRfq_lxg1k2LTHY-J-MW6FfA']",
  "event_id=$HG6XjFmFFO5O2-JW-kaayz2qJTwhzrtICjHdV9j0RMU,depth=10,body=org.matrix.msc2716.batch,prevs=['$d-z0eDSnU4PhbnisRLC7OIvoQFXlfnwhElh5mA1gFFo']",
  "event_id=$d-z0eDSnU4PhbnisRLC7OIvoQFXlfnwhElh5mA1gFFo,depth=10,body=Historical 99 (batch=0),prevs=['$z8iHeSZupiT5NOYzhhyOEFwrPMFI3vN2iDFpijniw6Q']",
  "event_id=$z8iHeSZupiT5NOYzhhyOEFwrPMFI3vN2iDFpijniw6Q,depth=10,body=Historical 98 (batch=0),prevs=['$ddn3uR4QbOH8imNzXy-_xz9Kn63qAJhC9NjFOUvu-_w']",
  "event_id=$ddn3uR4QbOH8imNzXy-_xz9Kn63qAJhC9NjFOUvu-_w,depth=10,body=Historical 97 (batch=0),prevs=['$BRTaYbuvXTnBpC-Dhee2UUBY-LePaWLTMd60sa82c_I']",
  "event_id=$BRTaYbuvXTnBpC-Dhee2UUBY-LePaWLTMd60sa82c_I,depth=10,body=Historical 96 (batch=0),prevs=['$HC1catch1Ti3NWcGWWXJ7doMinWfU-SNkCYJC7v_RxA']",
  "event_id=$HC1catch1Ti3NWcGWWXJ7doMinWfU-SNkCYJC7v_RxA,depth=10,body=Historical 95 (batch=0),prevs=['$DL3D99BYS_Cn047L6XxUvHN86icB69Yi9jttmxnepVo']",
  "event_id=$DL3D99BYS_Cn047L6XxUvHN86icB69Yi9jttmxnepVo,depth=10,body=Historical 94 (batch=0),prevs=['$bqDvvvMj2a4x4FUh_Iy6aA9sejqunlPQxjgDhM9-2CY']",
  "event_id=$bqDvvvMj2a4x4FUh_Iy6aA9sejqunlPQxjgDhM9-2CY,depth=10,body=Historical 93 (batch=0),prevs=['$CUhTzLqLabAzjqNbh9_SKSX1Re7z581D7BF90a3jE-0']",
  "event_id=$CUhTzLqLabAzjqNbh9_SKSX1Re7z581D7BF90a3jE-0,depth=10,body=Historical 92 (batch=0),prevs=['$3l6A4siERlLreAmXGH1KFagDjb9G8i4_TrxLErZS4FY']",
  "event_id=$3l6A4siERlLreAmXGH1KFagDjb9G8i4_TrxLErZS4FY,depth=10,body=Historical 91 (batch=0),prevs=['$BSosTk20sS031k33sDi_kMkrGMVjSUnCzT1wvZo0dcg']",
  "event_id=$BSosTk20sS031k33sDi_kMkrGMVjSUnCzT1wvZo0dcg,depth=10,body=Historical 90 (batch=0),prevs=['$XoyyYG9ngSu_sJ_npwDgrwLVQt0E6kDAxW_f0MzaIKs']",
  "event_id=$XoyyYG9ngSu_sJ_npwDgrwLVQt0E6kDAxW_f0MzaIKs,depth=10,body=Historical 89 (batch=0),prevs=['$8j7g564Kma7kqrgkqru2Nw21Ez2xZoyqBXtgrwYtbIU']",
  "event_id=$8j7g564Kma7kqrgkqru2Nw21Ez2xZoyqBXtgrwYtbIU,depth=10,body=Historical 88 (batch=0),prevs=['$FlIO19qRDZggQ3ZIMd4OhF4kGNpiipB4BR7sqQnG5xU']",
  "event_id=$FlIO19qRDZggQ3ZIMd4OhF4kGNpiipB4BR7sqQnG5xU,depth=10,body=Historical 87 (batch=0),prevs=['$reiGLF3R8Q5wqm_KJKOTQGFQ6PHIExRrV1nmB7lw5WA']",
  "event_id=$reiGLF3R8Q5wqm_KJKOTQGFQ6PHIExRrV1nmB7lw5WA,depth=10,body=Historical 86 (batch=0),prevs=['$7JRXCFtNfXY_TNZTZSjr7dPnKAMz39E8K2DQfhrxk0s']",
  "event_id=$7JRXCFtNfXY_TNZTZSjr7dPnKAMz39E8K2DQfhrxk0s,depth=10,body=Historical 85 (batch=0),prevs=['$8Z6-6uE22VHh3KoN2wGa9SAPhf0_MXPz3y_O2G8A9Bo']",
  "event_id=$8Z6-6uE22VHh3KoN2wGa9SAPhf0_MXPz3y_O2G8A9Bo,depth=10,body=Historical 84 (batch=0),prevs=['$CETAr2-SIsfT_exUgUY9El4PL6WOFnr7_6Hv86BuZUQ']",
  "event_id=$CETAr2-SIsfT_exUgUY9El4PL6WOFnr7_6Hv86BuZUQ,depth=10,body=Historical 83 (batch=0),prevs=['$dMOfVXcWxuoNS9di9AHyocIzAAucNG2v2aXqZWK7oA0']",
  "event_id=$dMOfVXcWxuoNS9di9AHyocIzAAucNG2v2aXqZWK7oA0,depth=10,body=Historical 82 (batch=0),prevs=['$4UjX4-4EejV7e0umXczxoqx9eHMvu2fFDIPGlY4zdrQ']",
  "event_id=$4UjX4-4EejV7e0umXczxoqx9eHMvu2fFDIPGlY4zdrQ,depth=10,body=Historical 81 (batch=0),prevs=['$e5d87r41P1lFrfM8iEp3waCi21lKx-bFBTEMhUMDJhE']",
  "event_id=$e5d87r41P1lFrfM8iEp3waCi21lKx-bFBTEMhUMDJhE,depth=10,body=Historical 80 (batch=0),prevs=['$ez0-Q4agOvUQbWUELiTJEEJWwZYj-TnaQTnNc3Vil8M']",
  "event_id=$ez0-Q4agOvUQbWUELiTJEEJWwZYj-TnaQTnNc3Vil8M,depth=10,body=Historical 79 (batch=0),prevs=['$zaMM-ZtQMADqFNsjrQrl_u0FIjxVHSEbdICkI5kph14']",
  "event_id=$zaMM-ZtQMADqFNsjrQrl_u0FIjxVHSEbdICkI5kph14,depth=10,body=Historical 78 (batch=0),prevs=['$jhDwZ4C8aCS7xm0D7xwQYKYXxE9yrnV_jnXWs7yj97A']",
  "event_id=$jhDwZ4C8aCS7xm0D7xwQYKYXxE9yrnV_jnXWs7yj97A,depth=10,body=Historical 77 (batch=0),prevs=['$794zi7lECGaZqgi-mVDTuAcCVxQRcasLEWHNQk_T5Qo']",
  "event_id=$794zi7lECGaZqgi-mVDTuAcCVxQRcasLEWHNQk_T5Qo,depth=10,body=Historical 76 (batch=0),prevs=['$RYc7Epu2beVamNOISGEPPzYPnqNr8OPpy6srKUDCNaY']",
  "event_id=$RYc7Epu2beVamNOISGEPPzYPnqNr8OPpy6srKUDCNaY,depth=10,body=Historical 75 (batch=0),prevs=['$NxzF542rsM0WMKZonV9YxmaJ5PLpVWK1TUfcLFP4VT8']",
  "event_id=$NxzF542rsM0WMKZonV9YxmaJ5PLpVWK1TUfcLFP4VT8,depth=10,body=Historical 74 (batch=0),prevs=['$YbcfMO7DOlq6owFILKIGpLSrvpMiDmIp77TCmafFxUU']",
  "event_id=$YbcfMO7DOlq6owFILKIGpLSrvpMiDmIp77TCmafFxUU,depth=10,body=Historical 73 (batch=0),prevs=['$RmlFFGojIl8VSc115lgQwk0NeAIAQT7CuLv3ajIv2X0']",
  "event_id=$RmlFFGojIl8VSc115lgQwk0NeAIAQT7CuLv3ajIv2X0,depth=10,body=Historical 72 (batch=0),prevs=['$lGGzpQOPdmzBqXIFF5HZfyGQCmXJOnmkZCRFRzxqJkw']",
  "event_id=$lGGzpQOPdmzBqXIFF5HZfyGQCmXJOnmkZCRFRzxqJkw,depth=10,body=Historical 71 (batch=0),prevs=['$TcSzi68MSFf1W0843Zi0iRq5vXFs8FhdtI9NfNCY5DM']",
  "event_id=$TcSzi68MSFf1W0843Zi0iRq5vXFs8FhdtI9NfNCY5DM,depth=10,body=Historical 70 (batch=0),prevs=['$iKaFgZ_aeN-ZJUNJEYj4WjY31RPm8PXs27n-u2LnlCE']",
  "event_id=$iKaFgZ_aeN-ZJUNJEYj4WjY31RPm8PXs27n-u2LnlCE,depth=10,body=Historical 69 (batch=0),prevs=['$n52R-hna5danKau87AHkwXDV5CuUTIZ960gtHr9X8hw']",
  "event_id=$n52R-hna5danKau87AHkwXDV5CuUTIZ960gtHr9X8hw,depth=10,body=Historical 68 (batch=0),prevs=['$Fr3wnWXII8LpE3VyF1pLWuLpSCyxu7jC1i4ggMqH1kE']",
  "event_id=$Fr3wnWXII8LpE3VyF1pLWuLpSCyxu7jC1i4ggMqH1kE,depth=10,body=Historical 67 (batch=0),prevs=['$ebCIN2TL4fFQeTEahzeX-VCkh_YEohAItvRd6LAVP2E']",
  "event_id=$ebCIN2TL4fFQeTEahzeX-VCkh_YEohAItvRd6LAVP2E,depth=10,body=Historical 66 (batch=0),prevs=['$CFeaKxHxgPCSUufJChertFT4au4P9Y1a_tTdN2wmo3Q']",
  "event_id=$CFeaKxHxgPCSUufJChertFT4au4P9Y1a_tTdN2wmo3Q,depth=10,body=Historical 65 (batch=0),prevs=['$MctpfuMG5AhhCb9aPRG-4V6VKxxNUzALNLq3BVJKejU']",
  "event_id=$MctpfuMG5AhhCb9aPRG-4V6VKxxNUzALNLq3BVJKejU,depth=10,body=Historical 64 (batch=0),prevs=['$ikjtTCZ7KXg1qtwgURuBZ-P5C1RG1oY8U3k2rm9RGxA']",
  "event_id=$ikjtTCZ7KXg1qtwgURuBZ-P5C1RG1oY8U3k2rm9RGxA,depth=10,body=Historical 63 (batch=0),prevs=['$KDbI-rBuoAI7rRhtAjcoDY2PbLQ9gDsK5fRts3OihSA']",
  "event_id=$KDbI-rBuoAI7rRhtAjcoDY2PbLQ9gDsK5fRts3OihSA,depth=10,body=Historical 62 (batch=0),prevs=['$_ZwqRJxNwgcZn4Trb5nrTjRP8ssQuLDq5ThguCm9KzE']",
  "event_id=$_ZwqRJxNwgcZn4Trb5nrTjRP8ssQuLDq5ThguCm9KzE,depth=10,body=Historical 61 (batch=0),prevs=['$hq1xDHEWodibkwlNg73931wjYlD5M29dkFHU0dQB2dk']",
  "event_id=$hq1xDHEWodibkwlNg73931wjYlD5M29dkFHU0dQB2dk,depth=10,body=Historical 60 (batch=0),prevs=['$XPRt_CuI_AXJylRQYbQ0ItkRkMy4ey0XxqS7iIdGLfQ']",
  "event_id=$XPRt_CuI_AXJylRQYbQ0ItkRkMy4ey0XxqS7iIdGLfQ,depth=10,body=Historical 59 (batch=0),prevs=['$Ucd44nYFkYVe_zs5wEqU5slG74IIPdzq_mqEHinIoIo']",
  "event_id=$Ucd44nYFkYVe_zs5wEqU5slG74IIPdzq_mqEHinIoIo,depth=10,body=Historical 58 (batch=0),prevs=['$CtM1TqWoFt3KabPNRKYi1vrpOPGwdpjx-15TpfKgYYA']",
  "event_id=$CtM1TqWoFt3KabPNRKYi1vrpOPGwdpjx-15TpfKgYYA,depth=10,body=Historical 57 (batch=0),prevs=['$Jo8T-m9nSs77uF4uFtkd22CifwnvDlr13Fs14NHcCMw']",
  "event_id=$Jo8T-m9nSs77uF4uFtkd22CifwnvDlr13Fs14NHcCMw,depth=10,body=Historical 56 (batch=0),prevs=['$WW45KevKriYRET0tOmKk8Ha9fFqxJJS_IC8Ih6I3L2A']",
  "event_id=$WW45KevKriYRET0tOmKk8Ha9fFqxJJS_IC8Ih6I3L2A,depth=10,body=Historical 55 (batch=0),prevs=['$G60oGyHZvp-Gim48qnC_epu2JRseKQUCTI5vqZEIbaI']",
  "event_id=$G60oGyHZvp-Gim48qnC_epu2JRseKQUCTI5vqZEIbaI,depth=10,body=Historical 54 (batch=0),prevs=['$R9Z6YaR1K9ulUzF9d6-ZL0QwJmwaEj1wTUPHrTJqFUs']",
  "event_id=$R9Z6YaR1K9ulUzF9d6-ZL0QwJmwaEj1wTUPHrTJqFUs,depth=10,body=Historical 53 (batch=0),prevs=['$CqedFlSaUBYWSHtkJJYmoc-DnxWCAaKVKOai0u5rawM']",
  "event_id=$CqedFlSaUBYWSHtkJJYmoc-DnxWCAaKVKOai0u5rawM,depth=10,body=Historical 52 (batch=0),prevs=['$3Ol33IgZ5lBuVwgELhRBYoFLb6GwkFTha3j6uxvHToY']",
  "event_id=$3Ol33IgZ5lBuVwgELhRBYoFLb6GwkFTha3j6uxvHToY,depth=10,body=Historical 51 (batch=0),prevs=['$wUcLTd2pGhliQunqWxFGvT6yiEZrUXA920-hcjaloSw']",
  "event_id=$wUcLTd2pGhliQunqWxFGvT6yiEZrUXA920-hcjaloSw,depth=10,body=Historical 50 (batch=0),prevs=['$gaO95ghwbwpGttuqBbhMrZJzz9Z440U7L2WOtDy7Hr8']",
  "event_id=$gaO95ghwbwpGttuqBbhMrZJzz9Z440U7L2WOtDy7Hr8,depth=10,body=Historical 49 (batch=0),prevs=['$4TSr_VvZzCV17JYxAob3DN2nQiYDqgW2S_QkW27v7Bg']",
  "event_id=$4TSr_VvZzCV17JYxAob3DN2nQiYDqgW2S_QkW27v7Bg,depth=10,body=Historical 48 (batch=0),prevs=['$bJaLResm_4aAwSjZ0POTvtVx4lnV9HKt8HwiYgP21lM']",
  "event_id=$bJaLResm_4aAwSjZ0POTvtVx4lnV9HKt8HwiYgP21lM,depth=10,body=Historical 47 (batch=0),prevs=['$BouN8LDmbFWiWo9Wc4wQi48YsC-icXewa05KR7byzhM']",
  "event_id=$BouN8LDmbFWiWo9Wc4wQi48YsC-icXewa05KR7byzhM,depth=10,body=Historical 46 (batch=0),prevs=['$n9Cv6EUu7i25OZLCllOE2PU4xjRthDKhkdtp5OtMuVk']",
  "event_id=$n9Cv6EUu7i25OZLCllOE2PU4xjRthDKhkdtp5OtMuVk,depth=10,body=Historical 45 (batch=0),prevs=['$MLVpmxVSSRRpxlcTkwIJT3neo7maqOp_ZLvwXRBY8A8']",
  "event_id=$MLVpmxVSSRRpxlcTkwIJT3neo7maqOp_ZLvwXRBY8A8,depth=10,body=Historical 44 (batch=0),prevs=['$tNv8Se5-lgfW-9MqE_upeBzq3QSPpsn7qOHz49WFs_c']",
  "event_id=$tNv8Se5-lgfW-9MqE_upeBzq3QSPpsn7qOHz49WFs_c,depth=10,body=Historical 43 (batch=0),prevs=['$XCDKybStk9PsquzrY-biUlKOmjk3wTXnsD1htiMdgAM']",
  "event_id=$XCDKybStk9PsquzrY-biUlKOmjk3wTXnsD1htiMdgAM,depth=10,body=Historical 42 (batch=0),prevs=['$iUDAE7nT6DQaNJSemwUpqQs8KvKTPFexcBJLTs2-gnY']",
  "event_id=$iUDAE7nT6DQaNJSemwUpqQs8KvKTPFexcBJLTs2-gnY,depth=10,body=Historical 41 (batch=0),prevs=['$T8NTrB9vQMLW-a0tT3corPl0g6O3UjGIoaHBjkjCD_w']",
  "event_id=$T8NTrB9vQMLW-a0tT3corPl0g6O3UjGIoaHBjkjCD_w,depth=10,body=Historical 40 (batch=0),prevs=['$N7jCLhKYDejMTejtrjJfM2lMRES5OPeowtvN-L4utsE']",
  "event_id=$N7jCLhKYDejMTejtrjJfM2lMRES5OPeowtvN-L4utsE,depth=10,body=Historical 39 (batch=0),prevs=['$Oy9aTfjL0LSnbF_6MRq7-5baaEbfxyRTK1kbVGeNoaU']",
  "event_id=$Oy9aTfjL0LSnbF_6MRq7-5baaEbfxyRTK1kbVGeNoaU,depth=10,body=Historical 38 (batch=0),prevs=['$V4qFDnqO1LrboSWwCoQpQ4dXLyrc74qZbbsaHxqAj4Q']",
  "event_id=$V4qFDnqO1LrboSWwCoQpQ4dXLyrc74qZbbsaHxqAj4Q,depth=10,body=Historical 37 (batch=0),prevs=['$vWdLNDGwj_mBJ6JZ2s01OhsxRuPNSSJAM_bMa6J9Q2c']",
  "event_id=$vWdLNDGwj_mBJ6JZ2s01OhsxRuPNSSJAM_bMa6J9Q2c,depth=10,body=Historical 36 (batch=0),prevs=['$JZt2EdPtKJX6f2MMbj_gSEseVAMa-H5r_J_yvfhHs5k']",
  "event_id=$JZt2EdPtKJX6f2MMbj_gSEseVAMa-H5r_J_yvfhHs5k,depth=10,body=Historical 35 (batch=0),prevs=['$NPzUfUgNfvkezhUeLmcp2utVA_XnW8YzDqbZlznsEN0']",
  "event_id=$NPzUfUgNfvkezhUeLmcp2utVA_XnW8YzDqbZlznsEN0,depth=10,body=Historical 34 (batch=0),prevs=['$NNUjzVtvOSFDYRID_PsMJrUC8gx5p1mPvIoMB7ibDn0']",
  "event_id=$NNUjzVtvOSFDYRID_PsMJrUC8gx5p1mPvIoMB7ibDn0,depth=10,body=Historical 33 (batch=0),prevs=['$dONbCTAYR0kOMVSmxOnM5aQ4bgx9PbKza98_e2Lxxw4']",
  "event_id=$dONbCTAYR0kOMVSmxOnM5aQ4bgx9PbKza98_e2Lxxw4,depth=10,body=Historical 32 (batch=0),prevs=['$dwxZHePgzbtQMO3caex0O9Zdl-gT3fpWRZD5dJ43JmE']",
  "event_id=$dwxZHePgzbtQMO3caex0O9Zdl-gT3fpWRZD5dJ43JmE,depth=10,body=Historical 31 (batch=0),prevs=['$5JOpa9222Y0__S8yfaZBT7ESuRaPeeRz80jleMoa5hE']",
  "event_id=$5JOpa9222Y0__S8yfaZBT7ESuRaPeeRz80jleMoa5hE,depth=10,body=Historical 30 (batch=0),prevs=['$7yIEFZZFs91wjKScsjbG854DUOqomPnV4iGG-EDWK6w']",
  "event_id=$7yIEFZZFs91wjKScsjbG854DUOqomPnV4iGG-EDWK6w,depth=10,body=Historical 29 (batch=0),prevs=['$9pzIrDRB1cuweDiHaPGB6AtTtGeGEOmqyoP59UAa0pI']",
  "event_id=$9pzIrDRB1cuweDiHaPGB6AtTtGeGEOmqyoP59UAa0pI,depth=10,body=Historical 28 (batch=0),prevs=['$EBu0Y6-OdqNUumOlHK__K2eXsN8mAYV21eCRKwGmkxU']",
  "event_id=$EBu0Y6-OdqNUumOlHK__K2eXsN8mAYV21eCRKwGmkxU,depth=10,body=Historical 27 (batch=0),prevs=['$95FzYeNZk31wyfaCojognGOAkzLhHLrv4_j3eoJawwU']",
  "event_id=$95FzYeNZk31wyfaCojognGOAkzLhHLrv4_j3eoJawwU,depth=10,body=Historical 26 (batch=0),prevs=['$QDGDnSNRXjNZG2lia2gjeD1aEfgfZ0gxI1BzIgjyZq8']",
  "event_id=$QDGDnSNRXjNZG2lia2gjeD1aEfgfZ0gxI1BzIgjyZq8,depth=10,body=Historical 25 (batch=0),prevs=['$tf1GB8ydPyNTNAaGwcTUXaTOSCmNohK6e6MmOnFwrJA']",
  "event_id=$tf1GB8ydPyNTNAaGwcTUXaTOSCmNohK6e6MmOnFwrJA,depth=10,body=Historical 24 (batch=0),prevs=['$n40ks3dofH6DioQlfe84n3exnYrboy8GHHYJ_qBFJMg']",
  "event_id=$n40ks3dofH6DioQlfe84n3exnYrboy8GHHYJ_qBFJMg,depth=10,body=Historical 23 (batch=0),prevs=['$xl8xG3MJiiNP21WNFmDLxOR8Rhy_FLws0snsmDUoAYQ']",
  "event_id=$xl8xG3MJiiNP21WNFmDLxOR8Rhy_FLws0snsmDUoAYQ,depth=10,body=Historical 22 (batch=0),prevs=['$6MxFONk8t5shoQpjjZyxd0ypmfj76LPs9hWKkPAxMcI']",
  "event_id=$6MxFONk8t5shoQpjjZyxd0ypmfj76LPs9hWKkPAxMcI,depth=10,body=Historical 21 (batch=0),prevs=['$XAAn4gMQe4ShIZKvZntEUBRljDM4IxHDVeNOXp3K2Bk']",
  "event_id=$XAAn4gMQe4ShIZKvZntEUBRljDM4IxHDVeNOXp3K2Bk,depth=10,body=Historical 20 (batch=0),prevs=['$Gj3RlKLUMb6hI_JyXdfwuoneWDs1b63qF7WdYYiNDG0']",
  "event_id=$Gj3RlKLUMb6hI_JyXdfwuoneWDs1b63qF7WdYYiNDG0,depth=10,body=Historical 19 (batch=0),prevs=['$yiRe3l3_APWuZt1wfFBxXQp2orQJZJvwv3yk4QNiPxo']",
  "event_id=$yiRe3l3_APWuZt1wfFBxXQp2orQJZJvwv3yk4QNiPxo,depth=10,body=Historical 18 (batch=0),prevs=['$v04Ud2zPqFe5M3jPbiLrqQ6r_QXgFlmRTMMLyVvAsN8']",
  "event_id=$v04Ud2zPqFe5M3jPbiLrqQ6r_QXgFlmRTMMLyVvAsN8,depth=10,body=Historical 17 (batch=0),prevs=['$tO5NiLH2mPBIMRVmrTIza6CUv7v6R0e_tgj0ZKEtpG0']",
  "event_id=$tO5NiLH2mPBIMRVmrTIza6CUv7v6R0e_tgj0ZKEtpG0,depth=10,body=Historical 16 (batch=0),prevs=['$fyQ-akREpz3vpQNqTZ47yxAs_APAw2L_bQ1iAudsPWk']",
  "event_id=$fyQ-akREpz3vpQNqTZ47yxAs_APAw2L_bQ1iAudsPWk,depth=10,body=Historical 15 (batch=0),prevs=['$qddW2HRZA0BudaIWuun6Odt6wDbz7ETRJmSY8wtjMnY']",
  "event_id=$qddW2HRZA0BudaIWuun6Odt6wDbz7ETRJmSY8wtjMnY,depth=10,body=Historical 14 (batch=0),prevs=['$fxl98r0B-sa2T8LDR2q6Wi01Zw6xCPZB5FcMf5x_vxI']",
  "event_id=$fxl98r0B-sa2T8LDR2q6Wi01Zw6xCPZB5FcMf5x_vxI,depth=10,body=Historical 13 (batch=0),prevs=['$1PML_QTo1MK_EuUz3OYyc2vDjfGKKYt-0sUSN9jTeHs']",
  "event_id=$1PML_QTo1MK_EuUz3OYyc2vDjfGKKYt-0sUSN9jTeHs,depth=10,body=Historical 12 (batch=0),prevs=['$YTz-q29BhUU_Ox7_CR7gao1v7mmMqLwbz51WWI0CjHs']",
  "event_id=$YTz-q29BhUU_Ox7_CR7gao1v7mmMqLwbz51WWI0CjHs,depth=10,body=Historical 11 (batch=0),prevs=['$Y3HUk4SiCWUrV5V_ZUcwC1IkVZEPM3V8oGWrWKRcv3I']",
  "event_id=$Y3HUk4SiCWUrV5V_ZUcwC1IkVZEPM3V8oGWrWKRcv3I,depth=10,body=Historical 10 (batch=0),prevs=['$uV5daep6tIdbImy2XEIxdQIuGYc547ulzxMplDyBWfY']",
  "event_id=$uV5daep6tIdbImy2XEIxdQIuGYc547ulzxMplDyBWfY,depth=10,body=Historical 9 (batch=0),prevs=['$bVKZ6uRROzC7aNcZc9cUsfhHl5dU_-Vm6Qz5V9X8GsI']",
  "event_id=$bVKZ6uRROzC7aNcZc9cUsfhHl5dU_-Vm6Qz5V9X8GsI,depth=10,body=Historical 8 (batch=0),prevs=['$6zjql7LGgIa3gFpf9owZsKWeFU4FoMUKDtVPpMo7xsM']",
  "event_id=$6zjql7LGgIa3gFpf9owZsKWeFU4FoMUKDtVPpMo7xsM,depth=10,body=Historical 7 (batch=0),prevs=['$w5t7UuOHrrsfZRebkX4adeEeJpPPGv9y6RyhKpxToMc']",
  "event_id=$w5t7UuOHrrsfZRebkX4adeEeJpPPGv9y6RyhKpxToMc,depth=10,body=Historical 6 (batch=0),prevs=['$649goNxH4B0DMta75_xs_TTib6C268A2JiUHvpUMu8g']",
  "event_id=$649goNxH4B0DMta75_xs_TTib6C268A2JiUHvpUMu8g,depth=10,body=Historical 5 (batch=0),prevs=['$mtUwpP0KSNwsn73yxBfQ7imKUe955v_SvI427PC5y2I']",
  "event_id=$9JuhSj0h0AbHvky0T3tSRfq_lxg1k2LTHY-J-MW6FfA,depth=9,body=Message 1 (eventIDsBefore),prevs=['$FcPmU5Fjg57eO_2J4VOK9jOcqRclEED5B9i1FsHNjaE']\"
]
```

```
new implementation backfill events=[
  "event_id=$BU66ZRqOvMEH-wRgx3hruEBKH1tcUUD0rWdGnUEAcuQ,depth=11,body=Message 1 (eventIDsAfter),prevs=['$r7UcvfwqKAnhqAesYovjSEWaC4aOcXWJMWQ0W7LhBok']",
  "event_id=$r7UcvfwqKAnhqAesYovjSEWaC4aOcXWJMWQ0W7LhBok,depth=10,body=Message 0 (eventIDsAfter),prevs=['$9JuhSj0h0AbHvky0T3tSRfq_lxg1k2LTHY-J-MW6FfA']",
  "event_id=$jX7MRv7WeXx79_r44I45EC8peZ0eKgbN12wolz0_ueA,depth=10,body=org.matrix.msc2716.insertion,prevs=['$9JuhSj0h0AbHvky0T3tSRfq_lxg1k2LTHY-J-MW6FfA']",
  "event_id=$HG6XjFmFFO5O2-JW-kaayz2qJTwhzrtICjHdV9j0RMU,depth=10,body=org.matrix.msc2716.batch,prevs=['$d-z0eDSnU4PhbnisRLC7OIvoQFXlfnwhElh5mA1gFFo']",
  "event_id=$d-z0eDSnU4PhbnisRLC7OIvoQFXlfnwhElh5mA1gFFo,depth=10,body=Historical 99 (batch=0),prevs=['$z8iHeSZupiT5NOYzhhyOEFwrPMFI3vN2iDFpijniw6Q']",
  "event_id=$z8iHeSZupiT5NOYzhhyOEFwrPMFI3vN2iDFpijniw6Q,depth=10,body=Historical 98 (batch=0),prevs=['$ddn3uR4QbOH8imNzXy-_xz9Kn63qAJhC9NjFOUvu-_w']",
  "event_id=$ddn3uR4QbOH8imNzXy-_xz9Kn63qAJhC9NjFOUvu-_w,depth=10,body=Historical 97 (batch=0),prevs=['$BRTaYbuvXTnBpC-Dhee2UUBY-LePaWLTMd60sa82c_I']",
  "event_id=$BRTaYbuvXTnBpC-Dhee2UUBY-LePaWLTMd60sa82c_I,depth=10,body=Historical 96 (batch=0),prevs=['$HC1catch1Ti3NWcGWWXJ7doMinWfU-SNkCYJC7v_RxA']",
  "event_id=$HC1catch1Ti3NWcGWWXJ7doMinWfU-SNkCYJC7v_RxA,depth=10,body=Historical 95 (batch=0),prevs=['$DL3D99BYS_Cn047L6XxUvHN86icB69Yi9jttmxnepVo']",
  "event_id=$DL3D99BYS_Cn047L6XxUvHN86icB69Yi9jttmxnepVo,depth=10,body=Historical 94 (batch=0),prevs=['$bqDvvvMj2a4x4FUh_Iy6aA9sejqunlPQxjgDhM9-2CY']",
  "event_id=$bqDvvvMj2a4x4FUh_Iy6aA9sejqunlPQxjgDhM9-2CY,depth=10,body=Historical 93 (batch=0),prevs=['$CUhTzLqLabAzjqNbh9_SKSX1Re7z581D7BF90a3jE-0']",
  "event_id=$CUhTzLqLabAzjqNbh9_SKSX1Re7z581D7BF90a3jE-0,depth=10,body=Historical 92 (batch=0),prevs=['$3l6A4siERlLreAmXGH1KFagDjb9G8i4_TrxLErZS4FY']",
  "event_id=$3l6A4siERlLreAmXGH1KFagDjb9G8i4_TrxLErZS4FY,depth=10,body=Historical 91 (batch=0),prevs=['$BSosTk20sS031k33sDi_kMkrGMVjSUnCzT1wvZo0dcg']",
  "event_id=$BSosTk20sS031k33sDi_kMkrGMVjSUnCzT1wvZo0dcg,depth=10,body=Historical 90 (batch=0),prevs=['$XoyyYG9ngSu_sJ_npwDgrwLVQt0E6kDAxW_f0MzaIKs']",
  "event_id=$XoyyYG9ngSu_sJ_npwDgrwLVQt0E6kDAxW_f0MzaIKs,depth=10,body=Historical 89 (batch=0),prevs=['$8j7g564Kma7kqrgkqru2Nw21Ez2xZoyqBXtgrwYtbIU']",
  "event_id=$8j7g564Kma7kqrgkqru2Nw21Ez2xZoyqBXtgrwYtbIU,depth=10,body=Historical 88 (batch=0),prevs=['$FlIO19qRDZggQ3ZIMd4OhF4kGNpiipB4BR7sqQnG5xU']",
  "event_id=$FlIO19qRDZggQ3ZIMd4OhF4kGNpiipB4BR7sqQnG5xU,depth=10,body=Historical 87 (batch=0),prevs=['$reiGLF3R8Q5wqm_KJKOTQGFQ6PHIExRrV1nmB7lw5WA']",
  "event_id=$reiGLF3R8Q5wqm_KJKOTQGFQ6PHIExRrV1nmB7lw5WA,depth=10,body=Historical 86 (batch=0),prevs=['$7JRXCFtNfXY_TNZTZSjr7dPnKAMz39E8K2DQfhrxk0s']",
  "event_id=$7JRXCFtNfXY_TNZTZSjr7dPnKAMz39E8K2DQfhrxk0s,depth=10,body=Historical 85 (batch=0),prevs=['$8Z6-6uE22VHh3KoN2wGa9SAPhf0_MXPz3y_O2G8A9Bo']",
  "event_id=$8Z6-6uE22VHh3KoN2wGa9SAPhf0_MXPz3y_O2G8A9Bo,depth=10,body=Historical 84 (batch=0),prevs=['$CETAr2-SIsfT_exUgUY9El4PL6WOFnr7_6Hv86BuZUQ']",
  "event_id=$CETAr2-SIsfT_exUgUY9El4PL6WOFnr7_6Hv86BuZUQ,depth=10,body=Historical 83 (batch=0),prevs=['$dMOfVXcWxuoNS9di9AHyocIzAAucNG2v2aXqZWK7oA0']",
  "event_id=$dMOfVXcWxuoNS9di9AHyocIzAAucNG2v2aXqZWK7oA0,depth=10,body=Historical 82 (batch=0),prevs=['$4UjX4-4EejV7e0umXczxoqx9eHMvu2fFDIPGlY4zdrQ']",
  "event_id=$4UjX4-4EejV7e0umXczxoqx9eHMvu2fFDIPGlY4zdrQ,depth=10,body=Historical 81 (batch=0),prevs=['$e5d87r41P1lFrfM8iEp3waCi21lKx-bFBTEMhUMDJhE']",
  "event_id=$e5d87r41P1lFrfM8iEp3waCi21lKx-bFBTEMhUMDJhE,depth=10,body=Historical 80 (batch=0),prevs=['$ez0-Q4agOvUQbWUELiTJEEJWwZYj-TnaQTnNc3Vil8M']",
  "event_id=$ez0-Q4agOvUQbWUELiTJEEJWwZYj-TnaQTnNc3Vil8M,depth=10,body=Historical 79 (batch=0),prevs=['$zaMM-ZtQMADqFNsjrQrl_u0FIjxVHSEbdICkI5kph14']",
  "event_id=$zaMM-ZtQMADqFNsjrQrl_u0FIjxVHSEbdICkI5kph14,depth=10,body=Historical 78 (batch=0),prevs=['$jhDwZ4C8aCS7xm0D7xwQYKYXxE9yrnV_jnXWs7yj97A']",
  "event_id=$jhDwZ4C8aCS7xm0D7xwQYKYXxE9yrnV_jnXWs7yj97A,depth=10,body=Historical 77 (batch=0),prevs=['$794zi7lECGaZqgi-mVDTuAcCVxQRcasLEWHNQk_T5Qo']",
  "event_id=$794zi7lECGaZqgi-mVDTuAcCVxQRcasLEWHNQk_T5Qo,depth=10,body=Historical 76 (batch=0),prevs=['$RYc7Epu2beVamNOISGEPPzYPnqNr8OPpy6srKUDCNaY']",
  "event_id=$RYc7Epu2beVamNOISGEPPzYPnqNr8OPpy6srKUDCNaY,depth=10,body=Historical 75 (batch=0),prevs=['$NxzF542rsM0WMKZonV9YxmaJ5PLpVWK1TUfcLFP4VT8']",
  "event_id=$NxzF542rsM0WMKZonV9YxmaJ5PLpVWK1TUfcLFP4VT8,depth=10,body=Historical 74 (batch=0),prevs=['$YbcfMO7DOlq6owFILKIGpLSrvpMiDmIp77TCmafFxUU']",
  "event_id=$YbcfMO7DOlq6owFILKIGpLSrvpMiDmIp77TCmafFxUU,depth=10,body=Historical 73 (batch=0),prevs=['$RmlFFGojIl8VSc115lgQwk0NeAIAQT7CuLv3ajIv2X0']",
  "event_id=$RmlFFGojIl8VSc115lgQwk0NeAIAQT7CuLv3ajIv2X0,depth=10,body=Historical 72 (batch=0),prevs=['$lGGzpQOPdmzBqXIFF5HZfyGQCmXJOnmkZCRFRzxqJkw']",
  "event_id=$lGGzpQOPdmzBqXIFF5HZfyGQCmXJOnmkZCRFRzxqJkw,depth=10,body=Historical 71 (batch=0),prevs=['$TcSzi68MSFf1W0843Zi0iRq5vXFs8FhdtI9NfNCY5DM']",
  "event_id=$TcSzi68MSFf1W0843Zi0iRq5vXFs8FhdtI9NfNCY5DM,depth=10,body=Historical 70 (batch=0),prevs=['$iKaFgZ_aeN-ZJUNJEYj4WjY31RPm8PXs27n-u2LnlCE']",
  "event_id=$iKaFgZ_aeN-ZJUNJEYj4WjY31RPm8PXs27n-u2LnlCE,depth=10,body=Historical 69 (batch=0),prevs=['$n52R-hna5danKau87AHkwXDV5CuUTIZ960gtHr9X8hw']",
  "event_id=$n52R-hna5danKau87AHkwXDV5CuUTIZ960gtHr9X8hw,depth=10,body=Historical 68 (batch=0),prevs=['$Fr3wnWXII8LpE3VyF1pLWuLpSCyxu7jC1i4ggMqH1kE']",
  "event_id=$Fr3wnWXII8LpE3VyF1pLWuLpSCyxu7jC1i4ggMqH1kE,depth=10,body=Historical 67 (batch=0),prevs=['$ebCIN2TL4fFQeTEahzeX-VCkh_YEohAItvRd6LAVP2E']",
  "event_id=$ebCIN2TL4fFQeTEahzeX-VCkh_YEohAItvRd6LAVP2E,depth=10,body=Historical 66 (batch=0),prevs=['$CFeaKxHxgPCSUufJChertFT4au4P9Y1a_tTdN2wmo3Q']",
  "event_id=$CFeaKxHxgPCSUufJChertFT4au4P9Y1a_tTdN2wmo3Q,depth=10,body=Historical 65 (batch=0),prevs=['$MctpfuMG5AhhCb9aPRG-4V6VKxxNUzALNLq3BVJKejU']",
  "event_id=$MctpfuMG5AhhCb9aPRG-4V6VKxxNUzALNLq3BVJKejU,depth=10,body=Historical 64 (batch=0),prevs=['$ikjtTCZ7KXg1qtwgURuBZ-P5C1RG1oY8U3k2rm9RGxA']",
  "event_id=$ikjtTCZ7KXg1qtwgURuBZ-P5C1RG1oY8U3k2rm9RGxA,depth=10,body=Historical 63 (batch=0),prevs=['$KDbI-rBuoAI7rRhtAjcoDY2PbLQ9gDsK5fRts3OihSA']",
  "event_id=$KDbI-rBuoAI7rRhtAjcoDY2PbLQ9gDsK5fRts3OihSA,depth=10,body=Historical 62 (batch=0),prevs=['$_ZwqRJxNwgcZn4Trb5nrTjRP8ssQuLDq5ThguCm9KzE']",
  "event_id=$_ZwqRJxNwgcZn4Trb5nrTjRP8ssQuLDq5ThguCm9KzE,depth=10,body=Historical 61 (batch=0),prevs=['$hq1xDHEWodibkwlNg73931wjYlD5M29dkFHU0dQB2dk']",
  "event_id=$hq1xDHEWodibkwlNg73931wjYlD5M29dkFHU0dQB2dk,depth=10,body=Historical 60 (batch=0),prevs=['$XPRt_CuI_AXJylRQYbQ0ItkRkMy4ey0XxqS7iIdGLfQ']",
  "event_id=$XPRt_CuI_AXJylRQYbQ0ItkRkMy4ey0XxqS7iIdGLfQ,depth=10,body=Historical 59 (batch=0),prevs=['$Ucd44nYFkYVe_zs5wEqU5slG74IIPdzq_mqEHinIoIo']",
  "event_id=$Ucd44nYFkYVe_zs5wEqU5slG74IIPdzq_mqEHinIoIo,depth=10,body=Historical 58 (batch=0),prevs=['$CtM1TqWoFt3KabPNRKYi1vrpOPGwdpjx-15TpfKgYYA']",
  "event_id=$CtM1TqWoFt3KabPNRKYi1vrpOPGwdpjx-15TpfKgYYA,depth=10,body=Historical 57 (batch=0),prevs=['$Jo8T-m9nSs77uF4uFtkd22CifwnvDlr13Fs14NHcCMw']",
  "event_id=$Jo8T-m9nSs77uF4uFtkd22CifwnvDlr13Fs14NHcCMw,depth=10,body=Historical 56 (batch=0),prevs=['$WW45KevKriYRET0tOmKk8Ha9fFqxJJS_IC8Ih6I3L2A']",
  "event_id=$WW45KevKriYRET0tOmKk8Ha9fFqxJJS_IC8Ih6I3L2A,depth=10,body=Historical 55 (batch=0),prevs=['$G60oGyHZvp-Gim48qnC_epu2JRseKQUCTI5vqZEIbaI']",
  "event_id=$G60oGyHZvp-Gim48qnC_epu2JRseKQUCTI5vqZEIbaI,depth=10,body=Historical 54 (batch=0),prevs=['$R9Z6YaR1K9ulUzF9d6-ZL0QwJmwaEj1wTUPHrTJqFUs']",
  "event_id=$R9Z6YaR1K9ulUzF9d6-ZL0QwJmwaEj1wTUPHrTJqFUs,depth=10,body=Historical 53 (batch=0),prevs=['$CqedFlSaUBYWSHtkJJYmoc-DnxWCAaKVKOai0u5rawM']",
  "event_id=$CqedFlSaUBYWSHtkJJYmoc-DnxWCAaKVKOai0u5rawM,depth=10,body=Historical 52 (batch=0),prevs=['$3Ol33IgZ5lBuVwgELhRBYoFLb6GwkFTha3j6uxvHToY']",
  "event_id=$3Ol33IgZ5lBuVwgELhRBYoFLb6GwkFTha3j6uxvHToY,depth=10,body=Historical 51 (batch=0),prevs=['$wUcLTd2pGhliQunqWxFGvT6yiEZrUXA920-hcjaloSw']",
  "event_id=$wUcLTd2pGhliQunqWxFGvT6yiEZrUXA920-hcjaloSw,depth=10,body=Historical 50 (batch=0),prevs=['$gaO95ghwbwpGttuqBbhMrZJzz9Z440U7L2WOtDy7Hr8']",
  "event_id=$gaO95ghwbwpGttuqBbhMrZJzz9Z440U7L2WOtDy7Hr8,depth=10,body=Historical 49 (batch=0),prevs=['$4TSr_VvZzCV17JYxAob3DN2nQiYDqgW2S_QkW27v7Bg']",
  "event_id=$4TSr_VvZzCV17JYxAob3DN2nQiYDqgW2S_QkW27v7Bg,depth=10,body=Historical 48 (batch=0),prevs=['$bJaLResm_4aAwSjZ0POTvtVx4lnV9HKt8HwiYgP21lM']",
  "event_id=$bJaLResm_4aAwSjZ0POTvtVx4lnV9HKt8HwiYgP21lM,depth=10,body=Historical 47 (batch=0),prevs=['$BouN8LDmbFWiWo9Wc4wQi48YsC-icXewa05KR7byzhM']",
  "event_id=$BouN8LDmbFWiWo9Wc4wQi48YsC-icXewa05KR7byzhM,depth=10,body=Historical 46 (batch=0),prevs=['$n9Cv6EUu7i25OZLCllOE2PU4xjRthDKhkdtp5OtMuVk']",
  "event_id=$n9Cv6EUu7i25OZLCllOE2PU4xjRthDKhkdtp5OtMuVk,depth=10,body=Historical 45 (batch=0),prevs=['$MLVpmxVSSRRpxlcTkwIJT3neo7maqOp_ZLvwXRBY8A8']",
  "event_id=$MLVpmxVSSRRpxlcTkwIJT3neo7maqOp_ZLvwXRBY8A8,depth=10,body=Historical 44 (batch=0),prevs=['$tNv8Se5-lgfW-9MqE_upeBzq3QSPpsn7qOHz49WFs_c']",
  "event_id=$tNv8Se5-lgfW-9MqE_upeBzq3QSPpsn7qOHz49WFs_c,depth=10,body=Historical 43 (batch=0),prevs=['$XCDKybStk9PsquzrY-biUlKOmjk3wTXnsD1htiMdgAM']",
  "event_id=$XCDKybStk9PsquzrY-biUlKOmjk3wTXnsD1htiMdgAM,depth=10,body=Historical 42 (batch=0),prevs=['$iUDAE7nT6DQaNJSemwUpqQs8KvKTPFexcBJLTs2-gnY']",
  "event_id=$iUDAE7nT6DQaNJSemwUpqQs8KvKTPFexcBJLTs2-gnY,depth=10,body=Historical 41 (batch=0),prevs=['$T8NTrB9vQMLW-a0tT3corPl0g6O3UjGIoaHBjkjCD_w']",
  "event_id=$T8NTrB9vQMLW-a0tT3corPl0g6O3UjGIoaHBjkjCD_w,depth=10,body=Historical 40 (batch=0),prevs=['$N7jCLhKYDejMTejtrjJfM2lMRES5OPeowtvN-L4utsE']",
  "event_id=$N7jCLhKYDejMTejtrjJfM2lMRES5OPeowtvN-L4utsE,depth=10,body=Historical 39 (batch=0),prevs=['$Oy9aTfjL0LSnbF_6MRq7-5baaEbfxyRTK1kbVGeNoaU']",
  "event_id=$Oy9aTfjL0LSnbF_6MRq7-5baaEbfxyRTK1kbVGeNoaU,depth=10,body=Historical 38 (batch=0),prevs=['$V4qFDnqO1LrboSWwCoQpQ4dXLyrc74qZbbsaHxqAj4Q']",
  "event_id=$V4qFDnqO1LrboSWwCoQpQ4dXLyrc74qZbbsaHxqAj4Q,depth=10,body=Historical 37 (batch=0),prevs=['$vWdLNDGwj_mBJ6JZ2s01OhsxRuPNSSJAM_bMa6J9Q2c']",
  "event_id=$vWdLNDGwj_mBJ6JZ2s01OhsxRuPNSSJAM_bMa6J9Q2c,depth=10,body=Historical 36 (batch=0),prevs=['$JZt2EdPtKJX6f2MMbj_gSEseVAMa-H5r_J_yvfhHs5k']",
  "event_id=$JZt2EdPtKJX6f2MMbj_gSEseVAMa-H5r_J_yvfhHs5k,depth=10,body=Historical 35 (batch=0),prevs=['$NPzUfUgNfvkezhUeLmcp2utVA_XnW8YzDqbZlznsEN0']",
  "event_id=$NPzUfUgNfvkezhUeLmcp2utVA_XnW8YzDqbZlznsEN0,depth=10,body=Historical 34 (batch=0),prevs=['$NNUjzVtvOSFDYRID_PsMJrUC8gx5p1mPvIoMB7ibDn0']",
  "event_id=$NNUjzVtvOSFDYRID_PsMJrUC8gx5p1mPvIoMB7ibDn0,depth=10,body=Historical 33 (batch=0),prevs=['$dONbCTAYR0kOMVSmxOnM5aQ4bgx9PbKza98_e2Lxxw4']",
  "event_id=$dONbCTAYR0kOMVSmxOnM5aQ4bgx9PbKza98_e2Lxxw4,depth=10,body=Historical 32 (batch=0),prevs=['$dwxZHePgzbtQMO3caex0O9Zdl-gT3fpWRZD5dJ43JmE']",
  "event_id=$dwxZHePgzbtQMO3caex0O9Zdl-gT3fpWRZD5dJ43JmE,depth=10,body=Historical 31 (batch=0),prevs=['$5JOpa9222Y0__S8yfaZBT7ESuRaPeeRz80jleMoa5hE']",
  "event_id=$5JOpa9222Y0__S8yfaZBT7ESuRaPeeRz80jleMoa5hE,depth=10,body=Historical 30 (batch=0),prevs=['$7yIEFZZFs91wjKScsjbG854DUOqomPnV4iGG-EDWK6w']",
  "event_id=$7yIEFZZFs91wjKScsjbG854DUOqomPnV4iGG-EDWK6w,depth=10,body=Historical 29 (batch=0),prevs=['$9pzIrDRB1cuweDiHaPGB6AtTtGeGEOmqyoP59UAa0pI']",
  "event_id=$9pzIrDRB1cuweDiHaPGB6AtTtGeGEOmqyoP59UAa0pI,depth=10,body=Historical 28 (batch=0),prevs=['$EBu0Y6-OdqNUumOlHK__K2eXsN8mAYV21eCRKwGmkxU']",
  "event_id=$EBu0Y6-OdqNUumOlHK__K2eXsN8mAYV21eCRKwGmkxU,depth=10,body=Historical 27 (batch=0),prevs=['$95FzYeNZk31wyfaCojognGOAkzLhHLrv4_j3eoJawwU']",
  "event_id=$95FzYeNZk31wyfaCojognGOAkzLhHLrv4_j3eoJawwU,depth=10,body=Historical 26 (batch=0),prevs=['$QDGDnSNRXjNZG2lia2gjeD1aEfgfZ0gxI1BzIgjyZq8']",
  "event_id=$QDGDnSNRXjNZG2lia2gjeD1aEfgfZ0gxI1BzIgjyZq8,depth=10,body=Historical 25 (batch=0),prevs=['$tf1GB8ydPyNTNAaGwcTUXaTOSCmNohK6e6MmOnFwrJA']",
  "event_id=$tf1GB8ydPyNTNAaGwcTUXaTOSCmNohK6e6MmOnFwrJA,depth=10,body=Historical 24 (batch=0),prevs=['$n40ks3dofH6DioQlfe84n3exnYrboy8GHHYJ_qBFJMg']",
  "event_id=$n40ks3dofH6DioQlfe84n3exnYrboy8GHHYJ_qBFJMg,depth=10,body=Historical 23 (batch=0),prevs=['$xl8xG3MJiiNP21WNFmDLxOR8Rhy_FLws0snsmDUoAYQ']",
  "event_id=$xl8xG3MJiiNP21WNFmDLxOR8Rhy_FLws0snsmDUoAYQ,depth=10,body=Historical 22 (batch=0),prevs=['$6MxFONk8t5shoQpjjZyxd0ypmfj76LPs9hWKkPAxMcI']",
  "event_id=$6MxFONk8t5shoQpjjZyxd0ypmfj76LPs9hWKkPAxMcI,depth=10,body=Historical 21 (batch=0),prevs=['$XAAn4gMQe4ShIZKvZntEUBRljDM4IxHDVeNOXp3K2Bk']",
  "event_id=$XAAn4gMQe4ShIZKvZntEUBRljDM4IxHDVeNOXp3K2Bk,depth=10,body=Historical 20 (batch=0),prevs=['$Gj3RlKLUMb6hI_JyXdfwuoneWDs1b63qF7WdYYiNDG0']",
  "event_id=$Gj3RlKLUMb6hI_JyXdfwuoneWDs1b63qF7WdYYiNDG0,depth=10,body=Historical 19 (batch=0),prevs=['$yiRe3l3_APWuZt1wfFBxXQp2orQJZJvwv3yk4QNiPxo']",
  "event_id=$yiRe3l3_APWuZt1wfFBxXQp2orQJZJvwv3yk4QNiPxo,depth=10,body=Historical 18 (batch=0),prevs=['$v04Ud2zPqFe5M3jPbiLrqQ6r_QXgFlmRTMMLyVvAsN8']",
  "event_id=$v04Ud2zPqFe5M3jPbiLrqQ6r_QXgFlmRTMMLyVvAsN8,depth=10,body=Historical 17 (batch=0),prevs=['$tO5NiLH2mPBIMRVmrTIza6CUv7v6R0e_tgj0ZKEtpG0']",
  "event_id=$tO5NiLH2mPBIMRVmrTIza6CUv7v6R0e_tgj0ZKEtpG0,depth=10,body=Historical 16 (batch=0),prevs=['$fyQ-akREpz3vpQNqTZ47yxAs_APAw2L_bQ1iAudsPWk']",
  "event_id=$fyQ-akREpz3vpQNqTZ47yxAs_APAw2L_bQ1iAudsPWk,depth=10,body=Historical 15 (batch=0),prevs=['$qddW2HRZA0BudaIWuun6Odt6wDbz7ETRJmSY8wtjMnY']",
  "event_id=$qddW2HRZA0BudaIWuun6Odt6wDbz7ETRJmSY8wtjMnY,depth=10,body=Historical 14 (batch=0),prevs=['$fxl98r0B-sa2T8LDR2q6Wi01Zw6xCPZB5FcMf5x_vxI']",
  "event_id=$fxl98r0B-sa2T8LDR2q6Wi01Zw6xCPZB5FcMf5x_vxI,depth=10,body=Historical 13 (batch=0),prevs=['$1PML_QTo1MK_EuUz3OYyc2vDjfGKKYt-0sUSN9jTeHs']",
  "event_id=$1PML_QTo1MK_EuUz3OYyc2vDjfGKKYt-0sUSN9jTeHs,depth=10,body=Historical 12 (batch=0),prevs=['$YTz-q29BhUU_Ox7_CR7gao1v7mmMqLwbz51WWI0CjHs']",
  "event_id=$YTz-q29BhUU_Ox7_CR7gao1v7mmMqLwbz51WWI0CjHs,depth=10,body=Historical 11 (batch=0),prevs=['$Y3HUk4SiCWUrV5V_ZUcwC1IkVZEPM3V8oGWrWKRcv3I']",
  "event_id=$Y3HUk4SiCWUrV5V_ZUcwC1IkVZEPM3V8oGWrWKRcv3I,depth=10,body=Historical 10 (batch=0),prevs=['$uV5daep6tIdbImy2XEIxdQIuGYc547ulzxMplDyBWfY']",
  "event_id=$uV5daep6tIdbImy2XEIxdQIuGYc547ulzxMplDyBWfY,depth=10,body=Historical 9 (batch=0),prevs=['$bVKZ6uRROzC7aNcZc9cUsfhHl5dU_-Vm6Qz5V9X8GsI']",
  "event_id=$bVKZ6uRROzC7aNcZc9cUsfhHl5dU_-Vm6Qz5V9X8GsI,depth=10,body=Historical 8 (batch=0),prevs=['$6zjql7LGgIa3gFpf9owZsKWeFU4FoMUKDtVPpMo7xsM']",
  "event_id=$6zjql7LGgIa3gFpf9owZsKWeFU4FoMUKDtVPpMo7xsM,depth=10,body=Historical 7 (batch=0),prevs=['$w5t7UuOHrrsfZRebkX4adeEeJpPPGv9y6RyhKpxToMc']",
  "event_id=$w5t7UuOHrrsfZRebkX4adeEeJpPPGv9y6RyhKpxToMc,depth=10,body=Historical 6 (batch=0),prevs=['$649goNxH4B0DMta75_xs_TTib6C268A2JiUHvpUMu8g']",
  "event_id=$649goNxH4B0DMta75_xs_TTib6C268A2JiUHvpUMu8g,depth=10,body=Historical 5 (batch=0),prevs=['$mtUwpP0KSNwsn73yxBfQ7imKUe955v_SvI427PC5y2I']",
  "event_id=$9JuhSj0h0AbHvky0T3tSRfq_lxg1k2LTHY-J-MW6FfA,depth=9,body=Message 1 (eventIDsBefore),prevs=['$FcPmU5Fjg57eO_2J4VOK9jOcqRclEED5B9i1FsHNjaE']"
]
```
2021-10-29 15:34:38 -05:00
Eric Eastwood fb8e2814f1 Fix direction of fake edges
- batch -> insertion fake edge
 - Connecting insertion events' `prev_events` successors -> insertion event

---

 - batch -> insertion fake edge
 - Connecting insertion events' `prev_events` successors -> insertion event

```
backfill sorted_events=[
  "event_id=$RQU5oBY9oHveDdx1X4FZs6BWzBqrGnbxQCZfNF4OEmw,depth=11,body=Message 1 (eventIDsAfter),prevs=['$44dIgrZ6WEBaxnCxiulvFQmLRlgIF2c2LHxwVZ39BhY']",
  "event_id=$44dIgrZ6WEBaxnCxiulvFQmLRlgIF2c2LHxwVZ39BhY,depth=10,body=Message 0 (eventIDsAfter),prevs=['$G00qI6L-Jem6u0rM73WAgtl3e27WFREG_IqXBK3rBVY']",
  "event_id=$Bb7NKUT_EJEIYJucAJvsm3IGWOHPV5HjT9sFBH4cgJ0,depth=10,body=org.matrix.msc2716.insertion,prevs=['$G00qI6L-Jem6u0rM73WAgtl3e27WFREG_IqXBK3rBVY']",
  "event_id=$DD2ibvlCDuylHLA5XHpzbWgplgANwmvy_qRGIz6obgU,depth=10,body=org.matrix.msc2716.batch,prevs=['$JfIXG5RA3SubwPx3qekrP7p7TL84M-EMXyrWUPGEJqE']",
  "event_id=$JfIXG5RA3SubwPx3qekrP7p7TL84M-EMXyrWUPGEJqE,depth=10,body=Historical 99 (batch=0),prevs=['$JMMtj_q0q-o3sgMjGtUDot_vjIBS1fu7pMFIVIKW8XU']",
  "event_id=$JMMtj_q0q-o3sgMjGtUDot_vjIBS1fu7pMFIVIKW8XU,depth=10,body=Historical 98 (batch=0),prevs=['$lCpKjiG2aZzjSvL4mu3BijwjsuGADKfP6CmB6S_9TeI']",
  "event_id=$lCpKjiG2aZzjSvL4mu3BijwjsuGADKfP6CmB6S_9TeI,depth=10,body=Historical 97 (batch=0),prevs=['$2e-t0QWqLfVJz2fdwbwAuT7HpT2awCyFhtR35VPUx0Q']",
  "event_id=$2e-t0QWqLfVJz2fdwbwAuT7HpT2awCyFhtR35VPUx0Q,depth=10,body=Historical 96 (batch=0),prevs=['$3tMaM3-QgXlRaGWzkcKg8VOooUETwADMmvC8LgPHi3k']",
  "event_id=$3tMaM3-QgXlRaGWzkcKg8VOooUETwADMmvC8LgPHi3k,depth=10,body=Historical 95 (batch=0),prevs=['$sWNiiKCpV6jaMOBrJPKSnmhfm1HvzQX5reT9cNGTgkk']",
  "event_id=$sWNiiKCpV6jaMOBrJPKSnmhfm1HvzQX5reT9cNGTgkk,depth=10,body=Historical 94 (batch=0),prevs=['$b23cNluaxei15QPBanvua5F690RJdnL4yCq-3MAbKyc']",
  "event_id=$b23cNluaxei15QPBanvua5F690RJdnL4yCq-3MAbKyc,depth=10,body=Historical 93 (batch=0),prevs=['$mlWvqR2MWITXVBZfeVLcujmVAzBvkkDdP6oSz3eSwUg']",
  "event_id=$mlWvqR2MWITXVBZfeVLcujmVAzBvkkDdP6oSz3eSwUg,depth=10,body=Historical 92 (batch=0),prevs=['$wlVdFpoXlPWoajb33gizlhlft5k-tVwGUpmMsmcoHPU']",
  "event_id=$wlVdFpoXlPWoajb33gizlhlft5k-tVwGUpmMsmcoHPU,depth=10,body=Historical 91 (batch=0),prevs=['$v6VMFCnyQkl16tZCVu7J_-Nst_NRXXaQd2efn2TUpEE']",
  "event_id=$v6VMFCnyQkl16tZCVu7J_-Nst_NRXXaQd2efn2TUpEE,depth=10,body=Historical 90 (batch=0),prevs=['$ooH_Jq5JLVIkIB9TpsltyHtqtn7KNxDIc_xYUcBUsAA']",
  "event_id=$ooH_Jq5JLVIkIB9TpsltyHtqtn7KNxDIc_xYUcBUsAA,depth=10,body=Historical 89 (batch=0),prevs=['$iK_6DSB9OgXzFNQ1qEZo_42ifWrX1xwUKs_qFKZT8Uo']",
  "event_id=$iK_6DSB9OgXzFNQ1qEZo_42ifWrX1xwUKs_qFKZT8Uo,depth=10,body=Historical 88 (batch=0),prevs=['$LKnAV4et1stXQRkd_dg0XOK5kNXFyFYQOgx5wdSQB34']",
  "event_id=$LKnAV4et1stXQRkd_dg0XOK5kNXFyFYQOgx5wdSQB34,depth=10,body=Historical 87 (batch=0),prevs=['$vvtLzYBovfNjm-aU5o5JF6TumBAzrBbzrMVrqA43cmE']",
  "event_id=$vvtLzYBovfNjm-aU5o5JF6TumBAzrBbzrMVrqA43cmE,depth=10,body=Historical 86 (batch=0),prevs=['$yYyBW-D_3XN6aYyXeRJKQYN1hJyswh9kUe2Q3kk_auA']",
  "event_id=$yYyBW-D_3XN6aYyXeRJKQYN1hJyswh9kUe2Q3kk_auA,depth=10,body=Historical 85 (batch=0),prevs=['$_1yK-Gzkabr_ZKMRFHlJMat943MjCznY2YN2WPExrtY']",
  "event_id=$_1yK-Gzkabr_ZKMRFHlJMat943MjCznY2YN2WPExrtY,depth=10,body=Historical 84 (batch=0),prevs=['$CZSLI1NUX9gWptZT_i52oyCfQpH5rOlPFSgmSjD4a-Q']",
  "event_id=$CZSLI1NUX9gWptZT_i52oyCfQpH5rOlPFSgmSjD4a-Q,depth=10,body=Historical 83 (batch=0),prevs=['$093Wua4ZaJLX4uRYuL89y3t47jntwceo0ReVGM-_WNE']",
  "event_id=$093Wua4ZaJLX4uRYuL89y3t47jntwceo0ReVGM-_WNE,depth=10,body=Historical 82 (batch=0),prevs=['$wA7OKTWe6BMbXustd4WBLTJ2fBIY4RLeOstoKaaiIwg']",
  "event_id=$wA7OKTWe6BMbXustd4WBLTJ2fBIY4RLeOstoKaaiIwg,depth=10,body=Historical 81 (batch=0),prevs=['$ZUVoXb9Or3HAeZVM5nKYUp1-mcizUyGuQHuUaRTEf8s']",
  "event_id=$ZUVoXb9Or3HAeZVM5nKYUp1-mcizUyGuQHuUaRTEf8s,depth=10,body=Historical 80 (batch=0),prevs=['$ul_NFiXrTv6S-YseztgF5fpKx-_gXeQ7C9XF_TdcCqM']",
  "event_id=$ul_NFiXrTv6S-YseztgF5fpKx-_gXeQ7C9XF_TdcCqM,depth=10,body=Historical 79 (batch=0),prevs=['$9zzm0Mr6wn2W5EKl7t0AmGqJntslGV9Telo6rP9DeZg']",
  "event_id=$9zzm0Mr6wn2W5EKl7t0AmGqJntslGV9Telo6rP9DeZg,depth=10,body=Historical 78 (batch=0),prevs=['$LsfJ_IpS4y1mWjdLFsod16JBS2B2j0XO3BCMEtXaigk']",
  "event_id=$LsfJ_IpS4y1mWjdLFsod16JBS2B2j0XO3BCMEtXaigk,depth=10,body=Historical 77 (batch=0),prevs=['$hfdqS5ARU7roPsWgGS8RXsog_m0P7vOc1UMdmKju0aw']",
  "event_id=$hfdqS5ARU7roPsWgGS8RXsog_m0P7vOc1UMdmKju0aw,depth=10,body=Historical 76 (batch=0),prevs=['$h4ZA91X45b8aNuMjz_xC1457mw2h6_MTSqvv6MVH8tU']",
  "event_id=$h4ZA91X45b8aNuMjz_xC1457mw2h6_MTSqvv6MVH8tU,depth=10,body=Historical 75 (batch=0),prevs=['$qvxKJlvqC0gaRP7mRjO-yMD4Zzt42dkd7dqZSs-v-Fk']",
  "event_id=$qvxKJlvqC0gaRP7mRjO-yMD4Zzt42dkd7dqZSs-v-Fk,depth=10,body=Historical 74 (batch=0),prevs=['$kgMcrid7-aqUIzDzjouB3HQKIGh2h-6Iop6WK08KCkc']",
  "event_id=$kgMcrid7-aqUIzDzjouB3HQKIGh2h-6Iop6WK08KCkc,depth=10,body=Historical 73 (batch=0),prevs=['$_ssYYwoWm7OOjhYwkZxQKOMq7maygenjjLJBypuA3N8']",
  "event_id=$_ssYYwoWm7OOjhYwkZxQKOMq7maygenjjLJBypuA3N8,depth=10,body=Historical 72 (batch=0),prevs=['$1OAjmvRdC67suR_wlrgbQDzOFJZxAnE4RZyKt4Khq9M']",
  "event_id=$1OAjmvRdC67suR_wlrgbQDzOFJZxAnE4RZyKt4Khq9M,depth=10,body=Historical 71 (batch=0),prevs=['$1cpjOXZwqsZzZ643qAkcnEc3Mjgl1n_WPfeVaovxE0g']",
  "event_id=$1cpjOXZwqsZzZ643qAkcnEc3Mjgl1n_WPfeVaovxE0g,depth=10,body=Historical 70 (batch=0),prevs=['$qYsfdlkVwJDtvjGHQtJATjglCIUzj11Cu7Kt70Qpa00']",
  "event_id=$qYsfdlkVwJDtvjGHQtJATjglCIUzj11Cu7Kt70Qpa00,depth=10,body=Historical 69 (batch=0),prevs=['$xwkLzZQX2w1rS9IbSburCCNy9g_3GA5cxR2Dd1AiDEo']",
  "event_id=$xwkLzZQX2w1rS9IbSburCCNy9g_3GA5cxR2Dd1AiDEo,depth=10,body=Historical 68 (batch=0),prevs=['$RUjVghSfYx0Rz-HMW7pFUjVL7gjnDh5FhrzmizwRSg4']",
  "event_id=$RUjVghSfYx0Rz-HMW7pFUjVL7gjnDh5FhrzmizwRSg4,depth=10,body=Historical 67 (batch=0),prevs=['$xFM3GD0jHQ2sV_w-m996lYIj6bBy3e4zoo4zba7KK94']",
  "event_id=$xFM3GD0jHQ2sV_w-m996lYIj6bBy3e4zoo4zba7KK94,depth=10,body=Historical 66 (batch=0),prevs=['$P9rG_KsdrP29_nrUhVNwDXxEj6TtcAHYMiEPjTECuyI']",
  "event_id=$P9rG_KsdrP29_nrUhVNwDXxEj6TtcAHYMiEPjTECuyI,depth=10,body=Historical 65 (batch=0),prevs=['$fG9vXCIp3ymBUSQGfxuQyHjXvwfaz0i-Al5PZER5q6Y']",
  "event_id=$fG9vXCIp3ymBUSQGfxuQyHjXvwfaz0i-Al5PZER5q6Y,depth=10,body=Historical 64 (batch=0),prevs=['$ZppkvSCfh7zKOSOIaAzzOM13xzO3c46HlvAt1ogqxSI']",
  "event_id=$ZppkvSCfh7zKOSOIaAzzOM13xzO3c46HlvAt1ogqxSI,depth=10,body=Historical 63 (batch=0),prevs=['$XJgjPkRjlTh04CAXr_7doyRn9uP6Q2BRBS5ogIxxgq4']",
  "event_id=$XJgjPkRjlTh04CAXr_7doyRn9uP6Q2BRBS5ogIxxgq4,depth=10,body=Historical 62 (batch=0),prevs=['$iiC9E-Xbw8DqYLkca_3SYXKP0fyjAO3Rulzl_UMlg_U']",
  "event_id=$iiC9E-Xbw8DqYLkca_3SYXKP0fyjAO3Rulzl_UMlg_U,depth=10,body=Historical 61 (batch=0),prevs=['$JQrY-1YX4u1WLM8pf-YV45wOig2GZmXyLRzQd16lNRY']",
  "event_id=$JQrY-1YX4u1WLM8pf-YV45wOig2GZmXyLRzQd16lNRY,depth=10,body=Historical 60 (batch=0),prevs=['$EZwD8zE9aSg6UYGfT93gAB22vf1EbG2m4rXNWYtDoMM']",
  "event_id=$EZwD8zE9aSg6UYGfT93gAB22vf1EbG2m4rXNWYtDoMM,depth=10,body=Historical 59 (batch=0),prevs=['$MXdmxSkN7gpzy28Rg6Ond0DyVu4a6_NA2PAEh2RGhWE']",
  "event_id=$MXdmxSkN7gpzy28Rg6Ond0DyVu4a6_NA2PAEh2RGhWE,depth=10,body=Historical 58 (batch=0),prevs=['$3qKPpnyChlt2O24cqwF2zHORIvm4zbVwugRtKxkAQAo']",
  "event_id=$3qKPpnyChlt2O24cqwF2zHORIvm4zbVwugRtKxkAQAo,depth=10,body=Historical 57 (batch=0),prevs=['$fZwZ3KIY2HpkBh_-GX762uJlvSDjKx_jkKBmO4XMXbU']",
  "event_id=$fZwZ3KIY2HpkBh_-GX762uJlvSDjKx_jkKBmO4XMXbU,depth=10,body=Historical 56 (batch=0),prevs=['$6S5Ni1dMs9cIWmlGAToAXq9HD19IC3VzPsA6Mpv-99k']",
  "event_id=$6S5Ni1dMs9cIWmlGAToAXq9HD19IC3VzPsA6Mpv-99k,depth=10,body=Historical 55 (batch=0),prevs=['$H_iqXiAxOxF6cEFG8uBIOA4daNZRS-n5BkyIO2TJB1M']",
  "event_id=$H_iqXiAxOxF6cEFG8uBIOA4daNZRS-n5BkyIO2TJB1M,depth=10,body=Historical 54 (batch=0),prevs=['$M_jaKYkmwpIOh5WbYKo7OABADOIde2GL_UpYgy5DKJE']",
  "event_id=$M_jaKYkmwpIOh5WbYKo7OABADOIde2GL_UpYgy5DKJE,depth=10,body=Historical 53 (batch=0),prevs=['$_tY_1OYdYB2e4mX0psdoZXQqbr_nJvdxNErra3vIRHw']",
  "event_id=$_tY_1OYdYB2e4mX0psdoZXQqbr_nJvdxNErra3vIRHw,depth=10,body=Historical 52 (batch=0),prevs=['$8x0ZzHjqduS1SlqKk1F6x1G71bKCFPWbx0nYU90GS8g']",
  "event_id=$8x0ZzHjqduS1SlqKk1F6x1G71bKCFPWbx0nYU90GS8g,depth=10,body=Historical 51 (batch=0),prevs=['$hYNHRnZ2AktMkxjbiPP_yofAOMmRJLy4nN5K-81-yj8']",
  "event_id=$hYNHRnZ2AktMkxjbiPP_yofAOMmRJLy4nN5K-81-yj8,depth=10,body=Historical 50 (batch=0),prevs=['$Aje2Qa0CHNWiAw1HiK-1djoycAhh4UliroN1vAdKIU4']",
  "event_id=$Aje2Qa0CHNWiAw1HiK-1djoycAhh4UliroN1vAdKIU4,depth=10,body=Historical 49 (batch=0),prevs=['$hbkSA7qbBPpEQH77YE2h-XKVgS3qhI3xse3Yg08smuc']",
  "event_id=$hbkSA7qbBPpEQH77YE2h-XKVgS3qhI3xse3Yg08smuc,depth=10,body=Historical 48 (batch=0),prevs=['$N80_1es0l8LAcvslhrbTOddyQ76W3_VLPnXnG5IBEn4']",
  "event_id=$N80_1es0l8LAcvslhrbTOddyQ76W3_VLPnXnG5IBEn4,depth=10,body=Historical 47 (batch=0),prevs=['$rvz1DpQx9HZLbHgZj5Jq3TVoH1WComOP6AWbytDKClQ']",
  "event_id=$rvz1DpQx9HZLbHgZj5Jq3TVoH1WComOP6AWbytDKClQ,depth=10,body=Historical 46 (batch=0),prevs=['$a6ifNO0AizTsP4HnVPD3Zkuqvo-8PnarenXKDUJZvGE']",
  "event_id=$a6ifNO0AizTsP4HnVPD3Zkuqvo-8PnarenXKDUJZvGE,depth=10,body=Historical 45 (batch=0),prevs=['$1WL7whQmdncf8CJ5l38dn_J8PVztPTNNMNS82gltKhw']",
  "event_id=$1WL7whQmdncf8CJ5l38dn_J8PVztPTNNMNS82gltKhw,depth=10,body=Historical 44 (batch=0),prevs=['$yCLNJyVjv2ti71ORpJI1wuyiWWOCG857If5M24eK2c4']",
  "event_id=$yCLNJyVjv2ti71ORpJI1wuyiWWOCG857If5M24eK2c4,depth=10,body=Historical 43 (batch=0),prevs=['$LV_gqx1bl9NHYdifp_v5JA1QE79nwblPe9dY_MKWuFo']",
  "event_id=$LV_gqx1bl9NHYdifp_v5JA1QE79nwblPe9dY_MKWuFo,depth=10,body=Historical 42 (batch=0),prevs=['$TT41-KXnRahtw3bBlgFkaLEvnGtC7BPispoy9LVoSTE']",
  "event_id=$TT41-KXnRahtw3bBlgFkaLEvnGtC7BPispoy9LVoSTE,depth=10,body=Historical 41 (batch=0),prevs=['$X0wtHayfehEhB59jCSI2NSX5LSdgQfMYBy5D5IXerrg']",
  "event_id=$X0wtHayfehEhB59jCSI2NSX5LSdgQfMYBy5D5IXerrg,depth=10,body=Historical 40 (batch=0),prevs=['$ERk1O6FQFNndKxopemlDrzWV_SZ9zvPaK-7cDWc9hOo']",
  "event_id=$ERk1O6FQFNndKxopemlDrzWV_SZ9zvPaK-7cDWc9hOo,depth=10,body=Historical 39 (batch=0),prevs=['$8EltMIaFXj0HYOUsfGwDXs6--yrfI5NvQHbv8okNMbI']",
  "event_id=$8EltMIaFXj0HYOUsfGwDXs6--yrfI5NvQHbv8okNMbI,depth=10,body=Historical 38 (batch=0),prevs=['$8S8FjedOebUYwPFtb7vb-ZzMeYDp7vJRk-OUzau1RlY']",
  "event_id=$8S8FjedOebUYwPFtb7vb-ZzMeYDp7vJRk-OUzau1RlY,depth=10,body=Historical 37 (batch=0),prevs=['$s06MJYSVrGYW73z6hpTeCPDxnuFLkJXWvyym-4RqTXg']",
  "event_id=$s06MJYSVrGYW73z6hpTeCPDxnuFLkJXWvyym-4RqTXg,depth=10,body=Historical 36 (batch=0),prevs=['$fXsHFdVTchw-xmD41v9KC2ZxC5j6-VYRHGdRTw4AxRQ']",
  "event_id=$fXsHFdVTchw-xmD41v9KC2ZxC5j6-VYRHGdRTw4AxRQ,depth=10,body=Historical 35 (batch=0),prevs=['$ETgS3ZdUq57PzCK0ki-oV21XqFBs1nSgv6CHVl1nddw']",
  "event_id=$ETgS3ZdUq57PzCK0ki-oV21XqFBs1nSgv6CHVl1nddw,depth=10,body=Historical 34 (batch=0),prevs=['$GyrVy70TxEH3ARdy1tf-ZuxyWTqY8M4GeD-e0O4bXTs']",
  "event_id=$GyrVy70TxEH3ARdy1tf-ZuxyWTqY8M4GeD-e0O4bXTs,depth=10,body=Historical 33 (batch=0),prevs=['$etOVbOEtwqS-iLZfOWwAWeaf7Nq4h6B0aLTcsL3Fqb4']",
  "event_id=$etOVbOEtwqS-iLZfOWwAWeaf7Nq4h6B0aLTcsL3Fqb4,depth=10,body=Historical 32 (batch=0),prevs=['$jkugW9wPO5-ZTu3pulbPyYUs7MT08q24rSit47W2aiE']",
  "event_id=$jkugW9wPO5-ZTu3pulbPyYUs7MT08q24rSit47W2aiE,depth=10,body=Historical 31 (batch=0),prevs=['$xl5SAerMsKP7xYH7e9B0QyjNGVu1zYN037WcMl6eM7I']",
  "event_id=$xl5SAerMsKP7xYH7e9B0QyjNGVu1zYN037WcMl6eM7I,depth=10,body=Historical 30 (batch=0),prevs=['$epCIEu5hsIrjVfAQ8xwG_w7l2L_GVswFGlOgvKuBOv4']",
  "event_id=$epCIEu5hsIrjVfAQ8xwG_w7l2L_GVswFGlOgvKuBOv4,depth=10,body=Historical 29 (batch=0),prevs=['$W-r7mxy0Yaj7M33JPu3WwCGHZ4zy-r_UsuuSiSbaBNI']",
  "event_id=$W-r7mxy0Yaj7M33JPu3WwCGHZ4zy-r_UsuuSiSbaBNI,depth=10,body=Historical 28 (batch=0),prevs=['$j4NztVmkOMiN4_drb1Hm0EOEh5kDM1r7Vo1jKPlz5iY']",
  "event_id=$j4NztVmkOMiN4_drb1Hm0EOEh5kDM1r7Vo1jKPlz5iY,depth=10,body=Historical 27 (batch=0),prevs=['$QhtQWlhor0qS81fOCmF2UmYSZXrCY2YabQ3Ysk1pvQ8']",
  "event_id=$QhtQWlhor0qS81fOCmF2UmYSZXrCY2YabQ3Ysk1pvQ8,depth=10,body=Historical 26 (batch=0),prevs=['$ICyGlEHUQ2VNNkGL8KfN5v9rbuLZzYQ_LmH-XpKXi-w']",
  "event_id=$ICyGlEHUQ2VNNkGL8KfN5v9rbuLZzYQ_LmH-XpKXi-w,depth=10,body=Historical 25 (batch=0),prevs=['$4WvejXMuOtnrR_npONQHcEptKDb7oeAdzlguCFafXw8']",
  "event_id=$4WvejXMuOtnrR_npONQHcEptKDb7oeAdzlguCFafXw8,depth=10,body=Historical 24 (batch=0),prevs=['$1dQvQ9CXC8jvDir8Qv_qWD1P6669n5Dt2e9MQzWMmus']",
  "event_id=$1dQvQ9CXC8jvDir8Qv_qWD1P6669n5Dt2e9MQzWMmus,depth=10,body=Historical 23 (batch=0),prevs=['$VqYi4klnvQoQapuwcRhVOGpnd8b5JZbhpr0J8bIVq6s']",
  "event_id=$VqYi4klnvQoQapuwcRhVOGpnd8b5JZbhpr0J8bIVq6s,depth=10,body=Historical 22 (batch=0),prevs=['$caikDgtNzU_-uPQvliFV0LaXeD5KxfT42bbYT-tBuz4']",
  "event_id=$caikDgtNzU_-uPQvliFV0LaXeD5KxfT42bbYT-tBuz4,depth=10,body=Historical 21 (batch=0),prevs=['$tAmrVFwIE67VdJdTELUy9dCLX7UnwEQWJQ0szLMLj1I']",
  "event_id=$tAmrVFwIE67VdJdTELUy9dCLX7UnwEQWJQ0szLMLj1I,depth=10,body=Historical 20 (batch=0),prevs=['$moO383nMlO3xQcIcBJRa1ob23aKG_3BboL0VzaEuV9M']",
  "event_id=$moO383nMlO3xQcIcBJRa1ob23aKG_3BboL0VzaEuV9M,depth=10,body=Historical 19 (batch=0),prevs=['$1ZC20pJmFEnjdsp1WeF3Vb786YGxRUN7lVgBuGtbTh0']",
  "event_id=$1ZC20pJmFEnjdsp1WeF3Vb786YGxRUN7lVgBuGtbTh0,depth=10,body=Historical 18 (batch=0),prevs=['$CR5eEOqcjN4M-V4z4pmcGuj4DDZvIXsXJuCGKFCL2bo']",
  "event_id=$CR5eEOqcjN4M-V4z4pmcGuj4DDZvIXsXJuCGKFCL2bo,depth=10,body=Historical 17 (batch=0),prevs=['$5Nt4QouUaxCemiakDvgSau0Awaq2eLiuf_zAotPHrEk']",
  "event_id=$5Nt4QouUaxCemiakDvgSau0Awaq2eLiuf_zAotPHrEk,depth=10,body=Historical 16 (batch=0),prevs=['$bQGGb7wF69JaRvAgcy8YXA--vZxVwIFoQwBxz1JNcc0']",
  "event_id=$bQGGb7wF69JaRvAgcy8YXA--vZxVwIFoQwBxz1JNcc0,depth=10,body=Historical 15 (batch=0),prevs=['$5NTrpJdUTplsV5Pv0h81f10Od7r8b7MByhNP-Hgo5XI']",
  "event_id=$5NTrpJdUTplsV5Pv0h81f10Od7r8b7MByhNP-Hgo5XI,depth=10,body=Historical 14 (batch=0),prevs=['$RlE8jSspaoHviQ64oGYupPalY6iiEOfm6SVKxCFcj5Q']",
  "event_id=$RlE8jSspaoHviQ64oGYupPalY6iiEOfm6SVKxCFcj5Q,depth=10,body=Historical 13 (batch=0),prevs=['$fAjxrhPzB4YdRFSVUrY4dyUX2rs_Og61PlIxutf4cPw']",
  "event_id=$fAjxrhPzB4YdRFSVUrY4dyUX2rs_Og61PlIxutf4cPw,depth=10,body=Historical 12 (batch=0),prevs=['$AiIInms6FQzl0GHYZw38stEFC72Bl9uoW5r7sLBOdiw']",
  "event_id=$AiIInms6FQzl0GHYZw38stEFC72Bl9uoW5r7sLBOdiw,depth=10,body=Historical 11 (batch=0),prevs=['$l5uuVWnK1HYmBpL-X8XGLG-0FzXmrAVDAdFojpD_BnY']",
  "event_id=$l5uuVWnK1HYmBpL-X8XGLG-0FzXmrAVDAdFojpD_BnY,depth=10,body=Historical 10 (batch=0),prevs=['$bq2Cmy1rMLmJRWRek0azb5SE-CBPj-QJ1GB2F6X6pos']",
  "event_id=$bq2Cmy1rMLmJRWRek0azb5SE-CBPj-QJ1GB2F6X6pos,depth=10,body=Historical 9 (batch=0),prevs=['$fNL5PyiTg-FuQaq3rBdqAzVLev7MPo89u5nUGdP5CdY']",
  "event_id=$fNL5PyiTg-FuQaq3rBdqAzVLev7MPo89u5nUGdP5CdY,depth=10,body=Historical 8 (batch=0),prevs=['$FZvdy85_rIB-TgSq2irIGp8TPz3vt3DdEsTlmklxHfE']",
  "event_id=$FZvdy85_rIB-TgSq2irIGp8TPz3vt3DdEsTlmklxHfE,depth=10,body=Historical 7 (batch=0),prevs=['$gibUQn3wnIHPf2CzXr4rVaDd0ozucmpZLTXi69kT4v0']",
  "event_id=$gibUQn3wnIHPf2CzXr4rVaDd0ozucmpZLTXi69kT4v0,depth=10,body=Historical 6 (batch=0),prevs=['$EtLYRN3xJoYCG2f6l3ZNzeFDBVgT0sJSO-5_CWfk62E']",
  "event_id=$G00qI6L-Jem6u0rM73WAgtl3e27WFREG_IqXBK3rBVY,depth=9,body=Message 1 (eventIDsBefore),prevs=['$E9W0RVZ5jf054fUIQPlls4AXPlFcS5sF6iSwdsgpEZ0']",
  "event_id=$EtLYRN3xJoYCG2f6l3ZNzeFDBVgT0sJSO-5_CWfk62E,depth=10,body=Historical 5 (batch=0),prevs=['$6f7SVRgiDAaiqWanvIsjBfJieMdK8fP_t8qalpWDTKo']"
]
```

When only connecting batch -> insertion event:

 - batch -> insertion fake edge

```
backfill sorted_events=[
  "event_id=$vDdCr0f90ey6Pjpw8Ugl2HQf09Rww5x_M8LanATK8VM,depth=10,body=org.matrix.msc2716.insertion,prevs=['$n9kq5qDGfNxKw7_Cb8kIC-9BrQ0Kg_sTWn9_nLwovA4']",
  "event_id=$h9x6BgpQVHF8Jr33ovBjTxDvXYuR6aNyxw2sKWKqu5U,depth=10,body=org.matrix.msc2716.batch,prevs=['$KU7hS3FmvoQaZkOjdWqyuBqBwFvcWdqJEbKvsXAxWgg']",
  "event_id=$KU7hS3FmvoQaZkOjdWqyuBqBwFvcWdqJEbKvsXAxWgg,depth=10,body=Historical 99 (batch=0),prevs=['$N0bxYWNt4qrh3B4ns78nzD_BRSFzMHt1KTynmuIjztQ']",
  "event_id=$N0bxYWNt4qrh3B4ns78nzD_BRSFzMHt1KTynmuIjztQ,depth=10,body=Historical 98 (batch=0),prevs=['$D9gUbM3vrg7KAVDrXowcP0jmzjX_VM2OHArxGZy6wc8']",
  "event_id=$D9gUbM3vrg7KAVDrXowcP0jmzjX_VM2OHArxGZy6wc8,depth=10,body=Historical 97 (batch=0),prevs=['$fUs553QBZQ-3MqELA3X6pmCL6F9HsEGc0eAyIQ5w-KQ']",
  "event_id=$fUs553QBZQ-3MqELA3X6pmCL6F9HsEGc0eAyIQ5w-KQ,depth=10,body=Historical 96 (batch=0),prevs=['$Txz5IQUjGCf1ewtLvxmPKS0MrGD2LYoh6JwoQcXPYYI']",
  "event_id=$Txz5IQUjGCf1ewtLvxmPKS0MrGD2LYoh6JwoQcXPYYI,depth=10,body=Historical 95 (batch=0),prevs=['$kC7jJEVaeGxRbaGAECrje-j_rUWodeKtXT5TByOR3_0']",
  "event_id=$kC7jJEVaeGxRbaGAECrje-j_rUWodeKtXT5TByOR3_0,depth=10,body=Historical 94 (batch=0),prevs=['$qQ_Qw4R3XJ65ftHFvt7WyUg1-TrJ5ubgw4ln93O3qSE']",
  "event_id=$qQ_Qw4R3XJ65ftHFvt7WyUg1-TrJ5ubgw4ln93O3qSE,depth=10,body=Historical 93 (batch=0),prevs=['$z6Sohu4b39SVOiprB26Ke9XNo1EWuzZysQ-jyc80oXs']",
  "event_id=$z6Sohu4b39SVOiprB26Ke9XNo1EWuzZysQ-jyc80oXs,depth=10,body=Historical 92 (batch=0),prevs=['$CP4JNyEaRikkHIC-1OpoXhw3y3s_0_s-rqnKu_63aFg']",
  "event_id=$CP4JNyEaRikkHIC-1OpoXhw3y3s_0_s-rqnKu_63aFg,depth=10,body=Historical 91 (batch=0),prevs=['$nCjxeXj_OF05JtxM8YUdUlx_moibUUy6QrosWt8R_Us']",
  "event_id=$nCjxeXj_OF05JtxM8YUdUlx_moibUUy6QrosWt8R_Us,depth=10,body=Historical 90 (batch=0),prevs=['$8sFfCVGCb97FXd1etQLR70vmJDjk6RNsgbo5ughLXl8']",
  "event_id=$8sFfCVGCb97FXd1etQLR70vmJDjk6RNsgbo5ughLXl8,depth=10,body=Historical 89 (batch=0),prevs=['$45AU3xVc6xF4qfrdJMh68kZIc-PF9hqkFmuOoxA_j08']",
  "event_id=$45AU3xVc6xF4qfrdJMh68kZIc-PF9hqkFmuOoxA_j08,depth=10,body=Historical 88 (batch=0),prevs=['$9JhvBwk32ygq52H9mKPryUxX3ildrK47p8bAECnMkcI']",
  "event_id=$9JhvBwk32ygq52H9mKPryUxX3ildrK47p8bAECnMkcI,depth=10,body=Historical 87 (batch=0),prevs=['$rXBGwIxCzRUCCQpNvMNiePqrKk6daAOb5nN2AuACDcg']",
  "event_id=$rXBGwIxCzRUCCQpNvMNiePqrKk6daAOb5nN2AuACDcg,depth=10,body=Historical 86 (batch=0),prevs=['$Iebf12p8JQRuVHfWIgVwyc8cqDkPwTvod2HJIAfaaXY']",
  "event_id=$Iebf12p8JQRuVHfWIgVwyc8cqDkPwTvod2HJIAfaaXY,depth=10,body=Historical 85 (batch=0),prevs=['$8CV6t9Yg5RrYzy1-t72ez47xVAgc45iM_nBcEr0r5u8']",
  "event_id=$8CV6t9Yg5RrYzy1-t72ez47xVAgc45iM_nBcEr0r5u8,depth=10,body=Historical 84 (batch=0),prevs=['$jF0yFS-VkCntnui9esPytzncMQ4vbpoI4dEtbnqm2zM']",
  "event_id=$jF0yFS-VkCntnui9esPytzncMQ4vbpoI4dEtbnqm2zM,depth=10,body=Historical 83 (batch=0),prevs=['$rEfXGwUAl6BfF0t_PtOoqnyiC02ACeOKB9zrWaB2k9w']",
  "event_id=$rEfXGwUAl6BfF0t_PtOoqnyiC02ACeOKB9zrWaB2k9w,depth=10,body=Historical 82 (batch=0),prevs=['$7sjkdcEQOMDA7bXvNadBsscUPsvgwHgF7lHq6qT5SCQ']",
  "event_id=$7sjkdcEQOMDA7bXvNadBsscUPsvgwHgF7lHq6qT5SCQ,depth=10,body=Historical 81 (batch=0),prevs=['$Ee4Zn_bD2_qgutvjVpmTLduivzstgTmaXoG4QYsk9kI']",
  "event_id=$Ee4Zn_bD2_qgutvjVpmTLduivzstgTmaXoG4QYsk9kI,depth=10,body=Historical 80 (batch=0),prevs=['$O1NfL_xO7qhf9XtZfwYPQJHRTgcP9UJZ_CU6UfnyTmI']",
  "event_id=$O1NfL_xO7qhf9XtZfwYPQJHRTgcP9UJZ_CU6UfnyTmI,depth=10,body=Historical 79 (batch=0),prevs=['$lSviYdCQKQye2QgoDaj7Ax1uKSp55bvUlS_Ax7vocPA']",
  "event_id=$lSviYdCQKQye2QgoDaj7Ax1uKSp55bvUlS_Ax7vocPA,depth=10,body=Historical 78 (batch=0),prevs=['$ES3Mz4RnN5yj2mv6HIloRnAQlryyAToscQP_74X0R3E']",
  "event_id=$ES3Mz4RnN5yj2mv6HIloRnAQlryyAToscQP_74X0R3E,depth=10,body=Historical 77 (batch=0),prevs=['$G6S-j3AT0tMMHoTXDRYJYGHmVSpy3I7qMPJp71PvqsE']",
  "event_id=$G6S-j3AT0tMMHoTXDRYJYGHmVSpy3I7qMPJp71PvqsE,depth=10,body=Historical 76 (batch=0),prevs=['$n2IZJ9fG-t9cVol8slIDErGnNdbPeacvAWCDlTGYpJk']",
  "event_id=$n2IZJ9fG-t9cVol8slIDErGnNdbPeacvAWCDlTGYpJk,depth=10,body=Historical 75 (batch=0),prevs=['$WxYHgWQRH2CKo5fXTiwH5zMrc7xuI3nsiBgDDSFFBbY']",
  "event_id=$WxYHgWQRH2CKo5fXTiwH5zMrc7xuI3nsiBgDDSFFBbY,depth=10,body=Historical 74 (batch=0),prevs=['$4SxomALNe4fQrzh990LW2MVe2hAh41hefUN96WklLwA']",
  "event_id=$4SxomALNe4fQrzh990LW2MVe2hAh41hefUN96WklLwA,depth=10,body=Historical 73 (batch=0),prevs=['$7jcugB1rv_Jp4wntQhdW_LrwAHjV4flw_uZ3A0rrKVY']",
  "event_id=$7jcugB1rv_Jp4wntQhdW_LrwAHjV4flw_uZ3A0rrKVY,depth=10,body=Historical 72 (batch=0),prevs=['$0JOxrvf7ZArMCYzB1qSz76-akAdDtf0B-ferG4uI3vo']",
  "event_id=$0JOxrvf7ZArMCYzB1qSz76-akAdDtf0B-ferG4uI3vo,depth=10,body=Historical 71 (batch=0),prevs=['$Vd0nksOUDQ92s-Kkn37Zhhj204cAUynybHuHrgtROTs']",
  "event_id=$Vd0nksOUDQ92s-Kkn37Zhhj204cAUynybHuHrgtROTs,depth=10,body=Historical 70 (batch=0),prevs=['$CCDHZGKctXGPB5bAoEbrNk7cXCUiDtIL7PJ1VQGwIS0']",
  "event_id=$CCDHZGKctXGPB5bAoEbrNk7cXCUiDtIL7PJ1VQGwIS0,depth=10,body=Historical 69 (batch=0),prevs=['$3w0P2g8VdVb1ar52A_9XXeON3vmWb6sr_Lctjcyp11A']",
  "event_id=$3w0P2g8VdVb1ar52A_9XXeON3vmWb6sr_Lctjcyp11A,depth=10,body=Historical 68 (batch=0),prevs=['$-fRkdzIZbqczQ85DLuNk9l9DlYgtroT3Sj2hY4PjK3Y']",
  "event_id=$-fRkdzIZbqczQ85DLuNk9l9DlYgtroT3Sj2hY4PjK3Y,depth=10,body=Historical 67 (batch=0),prevs=['$jX0KrPhWbDIHoxsFZCKm8VJLiRaz7zbFLRpcPmXrNLU']",
  "event_id=$jX0KrPhWbDIHoxsFZCKm8VJLiRaz7zbFLRpcPmXrNLU,depth=10,body=Historical 66 (batch=0),prevs=['$RZaiBaIb5pXeFu21n3o8agvfPOzYPHZW2pg-NYnK2Wo']",
  "event_id=$RZaiBaIb5pXeFu21n3o8agvfPOzYPHZW2pg-NYnK2Wo,depth=10,body=Historical 65 (batch=0),prevs=['$Ayy7g5q4SVDDI2n4AjMKEhF7JKYekYoezs42uVlqKQo']",
  "event_id=$Ayy7g5q4SVDDI2n4AjMKEhF7JKYekYoezs42uVlqKQo,depth=10,body=Historical 64 (batch=0),prevs=['$Qrtts5rHLUrB3SH__uKCz9M_IzT8dwLEi5cZbL5XSrI']",
  "event_id=$Qrtts5rHLUrB3SH__uKCz9M_IzT8dwLEi5cZbL5XSrI,depth=10,body=Historical 63 (batch=0),prevs=['$GzpO60z90GafGhNpczoL9-_9sA4X9KAIx-oOp3Ak5fs']",
  "event_id=$GzpO60z90GafGhNpczoL9-_9sA4X9KAIx-oOp3Ak5fs,depth=10,body=Historical 62 (batch=0),prevs=['$FoDpnYsHjsEPKpk1aBTznOupi2Nq0pDcwgPup3EuwHY']",
  "event_id=$FoDpnYsHjsEPKpk1aBTznOupi2Nq0pDcwgPup3EuwHY,depth=10,body=Historical 61 (batch=0),prevs=['$x22YRSOcrA__Jj1jlAjUQj7_aDJxmzgXfn03nDgNuAs']",
  "event_id=$x22YRSOcrA__Jj1jlAjUQj7_aDJxmzgXfn03nDgNuAs,depth=10,body=Historical 60 (batch=0),prevs=['$3abKTbz8gCJ7WVGCAX4gdKKjctfq2UBwAq_kZAiMb6o']",
  "event_id=$3abKTbz8gCJ7WVGCAX4gdKKjctfq2UBwAq_kZAiMb6o,depth=10,body=Historical 59 (batch=0),prevs=['$6JgNxTembrNVYP3Ko6VgpHJNILIqIvTXwPpIsds63BA']",
  "event_id=$6JgNxTembrNVYP3Ko6VgpHJNILIqIvTXwPpIsds63BA,depth=10,body=Historical 58 (batch=0),prevs=['$NUENCAs9SSA4UUHind2mtrX_-5_H-GTXJ4DjQ8o0hVo']",
  "event_id=$NUENCAs9SSA4UUHind2mtrX_-5_H-GTXJ4DjQ8o0hVo,depth=10,body=Historical 57 (batch=0),prevs=['$c12ynew3nRtCewk7IvWy1EurV2XHgRh1sRbj9x5OwJA']",
  "event_id=$c12ynew3nRtCewk7IvWy1EurV2XHgRh1sRbj9x5OwJA,depth=10,body=Historical 56 (batch=0),prevs=['$xcqepPdOhubqAJ2xzBBZg0kuoPnfW4DcTJcj0UiRnDU']",
  "event_id=$xcqepPdOhubqAJ2xzBBZg0kuoPnfW4DcTJcj0UiRnDU,depth=10,body=Historical 55 (batch=0),prevs=['$BPlbbeAqGAzwTsSA-B0qOOYkZyovhvESdtcANOsobdk']",
  "event_id=$BPlbbeAqGAzwTsSA-B0qOOYkZyovhvESdtcANOsobdk,depth=10,body=Historical 54 (batch=0),prevs=['$Z40RGtNNkb54tu_EjNyCc3TG3JAzDn2VNFKcogEpquo']",
  "event_id=$Z40RGtNNkb54tu_EjNyCc3TG3JAzDn2VNFKcogEpquo,depth=10,body=Historical 53 (batch=0),prevs=['$K-50fqiUNw5NkQeGMkg3fgaJCwA9bm5WtTM7AWmfbvw']",
  "event_id=$K-50fqiUNw5NkQeGMkg3fgaJCwA9bm5WtTM7AWmfbvw,depth=10,body=Historical 52 (batch=0),prevs=['$71c4Wa_ks9TcN4nwj0403YQGRRVj-6rhJkQlwoIiJf4']",
  "event_id=$71c4Wa_ks9TcN4nwj0403YQGRRVj-6rhJkQlwoIiJf4,depth=10,body=Historical 51 (batch=0),prevs=['$o16ueMl2wNS6UfeDDt1JJDP5GeHDAo3G-mZnc5kFVA8']",
  "event_id=$o16ueMl2wNS6UfeDDt1JJDP5GeHDAo3G-mZnc5kFVA8,depth=10,body=Historical 50 (batch=0),prevs=['$Tf7hucPlbAIsJSJC_SZTerIDhA601DVXdktkmuR5Kw8']",
  "event_id=$Tf7hucPlbAIsJSJC_SZTerIDhA601DVXdktkmuR5Kw8,depth=10,body=Historical 49 (batch=0),prevs=['$sCpJSEbWzgIZaVxLlGb_JkxhYFj2s16ZloJPiafivVs']",
  "event_id=$sCpJSEbWzgIZaVxLlGb_JkxhYFj2s16ZloJPiafivVs,depth=10,body=Historical 48 (batch=0),prevs=['$UrxtBrZ2WrXFjInPAO2dwVtoPwDQxDDQ49GoqT5v6mI']",
  "event_id=$UrxtBrZ2WrXFjInPAO2dwVtoPwDQxDDQ49GoqT5v6mI,depth=10,body=Historical 47 (batch=0),prevs=['$7PoOmq5lSm_3qEm2B5ggpuEqev14pFjMD-T_4BYqZYo']",
  "event_id=$7PoOmq5lSm_3qEm2B5ggpuEqev14pFjMD-T_4BYqZYo,depth=10,body=Historical 46 (batch=0),prevs=['$2DhrL57VVj1KJuWeIP1_UZHrD7VQq2AUksvMDiTPD-4']",
  "event_id=$2DhrL57VVj1KJuWeIP1_UZHrD7VQq2AUksvMDiTPD-4,depth=10,body=Historical 45 (batch=0),prevs=['$8JexHkPI8s_95LGsa-xS7IUA6pPAzl1Wu6HOkezX4hk']",
  "event_id=$8JexHkPI8s_95LGsa-xS7IUA6pPAzl1Wu6HOkezX4hk,depth=10,body=Historical 44 (batch=0),prevs=['$D1BSCRk1kps83i5-Tm34uZGwTCCxNlmPt-QrVzJ3gKQ']",
  "event_id=$D1BSCRk1kps83i5-Tm34uZGwTCCxNlmPt-QrVzJ3gKQ,depth=10,body=Historical 43 (batch=0),prevs=['$2sdel6OjRf9AArfA-Lp-6AxAXMEGvus5j9CupJmPfpk']",
  "event_id=$2sdel6OjRf9AArfA-Lp-6AxAXMEGvus5j9CupJmPfpk,depth=10,body=Historical 42 (batch=0),prevs=['$ts6IiQMG8YyMwDYVUdRplhzpJLQPuzZXE8TIjTm5Qtw']",
  "event_id=$ts6IiQMG8YyMwDYVUdRplhzpJLQPuzZXE8TIjTm5Qtw,depth=10,body=Historical 41 (batch=0),prevs=['$SxPDbdJ_VYhfcIkJe4sUCvZG71gnhDjgne-WM-gOncQ']",
  "event_id=$SxPDbdJ_VYhfcIkJe4sUCvZG71gnhDjgne-WM-gOncQ,depth=10,body=Historical 40 (batch=0),prevs=['$AOpiIZHC5mhpwV1RPzQd_29KHsY-niX0uuL3ofWoTyY']",
  "event_id=$AOpiIZHC5mhpwV1RPzQd_29KHsY-niX0uuL3ofWoTyY,depth=10,body=Historical 39 (batch=0),prevs=['$8vAjOM6qlvKS9JJAXQx4CCOqRSzMP6C9YlNi0ft1Y68']",
  "event_id=$8vAjOM6qlvKS9JJAXQx4CCOqRSzMP6C9YlNi0ft1Y68,depth=10,body=Historical 38 (batch=0),prevs=['$EUgYbcq2DMNLgzY7SaPtpNQAOKKYLKYIoGfNYQb8Y2A']",
  "event_id=$EUgYbcq2DMNLgzY7SaPtpNQAOKKYLKYIoGfNYQb8Y2A,depth=10,body=Historical 37 (batch=0),prevs=['$ibThSro6ruPZeNqjf_9UGXfo1kErnQUcRZTDAunDM-4']",
  "event_id=$ibThSro6ruPZeNqjf_9UGXfo1kErnQUcRZTDAunDM-4,depth=10,body=Historical 36 (batch=0),prevs=['$YcrZi3aSgm17cZUkGZf-MaR8EWzl-RdDf5qYctmnZ1k']",
  "event_id=$YcrZi3aSgm17cZUkGZf-MaR8EWzl-RdDf5qYctmnZ1k,depth=10,body=Historical 35 (batch=0),prevs=['$0BhcUb0o0wtIE4hwVqAs0AC591TPOx54idyv6TCTiEo']",
  "event_id=$0BhcUb0o0wtIE4hwVqAs0AC591TPOx54idyv6TCTiEo,depth=10,body=Historical 34 (batch=0),prevs=['$umgo6IT00-E22uIRr_e4AsclGtanloy1Aw5GzNpBNfc']",
  "event_id=$umgo6IT00-E22uIRr_e4AsclGtanloy1Aw5GzNpBNfc,depth=10,body=Historical 33 (batch=0),prevs=['$aka96B_0Yx9AljoQKr4QitStKb0RkcPucvFKusGdySc']",
  "event_id=$aka96B_0Yx9AljoQKr4QitStKb0RkcPucvFKusGdySc,depth=10,body=Historical 32 (batch=0),prevs=['$OJJa17fRud2uJLkJ0-mF8iQFsAvimrY_efopy6ctqTg']",
  "event_id=$OJJa17fRud2uJLkJ0-mF8iQFsAvimrY_efopy6ctqTg,depth=10,body=Historical 31 (batch=0),prevs=['$pLWU_gcJnZGRmruRUcPIqWcjBJ9zmh1lb2jv39RDipc']",
  "event_id=$pLWU_gcJnZGRmruRUcPIqWcjBJ9zmh1lb2jv39RDipc,depth=10,body=Historical 30 (batch=0),prevs=['$G-kuDTfZY1V23CzLgSXfgdctIvbxmnT0Nx-qUuUhGbw']",
  "event_id=$G-kuDTfZY1V23CzLgSXfgdctIvbxmnT0Nx-qUuUhGbw,depth=10,body=Historical 29 (batch=0),prevs=['$b5NQ52jYrGKU7-5lJojXF3xAyWcANt3P6CJ1_Mpw9hA']",
  "event_id=$b5NQ52jYrGKU7-5lJojXF3xAyWcANt3P6CJ1_Mpw9hA,depth=10,body=Historical 28 (batch=0),prevs=['$4oJCt-e8AZYL8WJuY_uV2COvrCzbTvC7RB8xAvxGvEA']",
  "event_id=$4oJCt-e8AZYL8WJuY_uV2COvrCzbTvC7RB8xAvxGvEA,depth=10,body=Historical 27 (batch=0),prevs=['$lP0kCgxZMRAQL6_zg0JLNvdn1lRf1dLWXaWMa4ZT5Iw']",
  "event_id=$lP0kCgxZMRAQL6_zg0JLNvdn1lRf1dLWXaWMa4ZT5Iw,depth=10,body=Historical 26 (batch=0),prevs=['$b46KcYyRVIQJ2Mf6lc7UC56ViSxV9h43SVeQ5gYQ0MU']",
  "event_id=$b46KcYyRVIQJ2Mf6lc7UC56ViSxV9h43SVeQ5gYQ0MU,depth=10,body=Historical 25 (batch=0),prevs=['$b35VNurzabrSP0KvVCXRB1i-FjbDS8Ly-UZcU5m9RC0']",
  "event_id=$b35VNurzabrSP0KvVCXRB1i-FjbDS8Ly-UZcU5m9RC0,depth=10,body=Historical 24 (batch=0),prevs=['$8b1w7cxe5bdMj9mKrZTD32szDIVDZutWo1iXUsEQBSM']",
  "event_id=$8b1w7cxe5bdMj9mKrZTD32szDIVDZutWo1iXUsEQBSM,depth=10,body=Historical 23 (batch=0),prevs=['$vqlAlL8FDxucbRlZISrTtvtP4G1tSHNzbZwWEzAMbRM']",
  "event_id=$vqlAlL8FDxucbRlZISrTtvtP4G1tSHNzbZwWEzAMbRM,depth=10,body=Historical 22 (batch=0),prevs=['$ACWiMQWRjseJTFI_4yFLcrr-U7qzeHeSJpOlWOm7H2c']",
  "event_id=$ACWiMQWRjseJTFI_4yFLcrr-U7qzeHeSJpOlWOm7H2c,depth=10,body=Historical 21 (batch=0),prevs=['$mkKg3O1vyzZXCJoN0xEDuZYcm-mra3neT8peKSaI-fQ']",
  "event_id=$mkKg3O1vyzZXCJoN0xEDuZYcm-mra3neT8peKSaI-fQ,depth=10,body=Historical 20 (batch=0),prevs=['$Aro7lP7i_onbj9g5-tgTxKR7Xwo2u6H9xMKVb0Q4OQo']",
  "event_id=$Aro7lP7i_onbj9g5-tgTxKR7Xwo2u6H9xMKVb0Q4OQo,depth=10,body=Historical 19 (batch=0),prevs=['$ZT0davtwy-6ltpLlA7xCRDoZTbBKrFEm0xywwBqmI74']",
  "event_id=$ZT0davtwy-6ltpLlA7xCRDoZTbBKrFEm0xywwBqmI74,depth=10,body=Historical 18 (batch=0),prevs=['$LYfu_QQSdd9Murplu_qT56yJXtXNF0PIfJ-4-zj_OK4']",
  "event_id=$LYfu_QQSdd9Murplu_qT56yJXtXNF0PIfJ-4-zj_OK4,depth=10,body=Historical 17 (batch=0),prevs=['$sCjd4Lz7kNCDqKnV4NpyEbxufPa5ygfhMIXD5tvZIVE']",
  "event_id=$sCjd4Lz7kNCDqKnV4NpyEbxufPa5ygfhMIXD5tvZIVE,depth=10,body=Historical 16 (batch=0),prevs=['$7b8cgWaAtDefi5UR74eFaIq-OCAozn1z-095TfJYYWc']",
  "event_id=$7b8cgWaAtDefi5UR74eFaIq-OCAozn1z-095TfJYYWc,depth=10,body=Historical 15 (batch=0),prevs=['$DJ4LuxKnd1pjfsvyqbx5lWFucWgHi-ouH1GoS_8MQXs']",
  "event_id=$DJ4LuxKnd1pjfsvyqbx5lWFucWgHi-ouH1GoS_8MQXs,depth=10,body=Historical 14 (batch=0),prevs=['$GeABTSXvlqx9Ul4j4vQHQ0xHiZqKjRvZbXQQjPpBQZA']",
  "event_id=$GeABTSXvlqx9Ul4j4vQHQ0xHiZqKjRvZbXQQjPpBQZA,depth=10,body=Historical 13 (batch=0),prevs=['$KoqVyBic8-LUcPwfk3cN-xgwPvcHmPL8kUrVCVXl6Q8']",
  "event_id=$KoqVyBic8-LUcPwfk3cN-xgwPvcHmPL8kUrVCVXl6Q8,depth=10,body=Historical 12 (batch=0),prevs=['$Rn3edaeQ2P7DiyOh5y2_dtPK_sg_97neVHHDXCaga0g']",
  "event_id=$Rn3edaeQ2P7DiyOh5y2_dtPK_sg_97neVHHDXCaga0g,depth=10,body=Historical 11 (batch=0),prevs=['$rRXAVfkswED2m4zGvzd3E3msFjbN1RjP08DblJb9kbY']",
  "event_id=$rRXAVfkswED2m4zGvzd3E3msFjbN1RjP08DblJb9kbY,depth=10,body=Historical 10 (batch=0),prevs=['$7NE5L9LaMSqUj2gwxB46vZrCIDKklNRJNEnYhhluC3I']",
  "event_id=$7NE5L9LaMSqUj2gwxB46vZrCIDKklNRJNEnYhhluC3I,depth=10,body=Historical 9 (batch=0),prevs=['$Legp3Fec3qa5Matct10VzlsNU-cCYSfOMpEC1wWRCSw']",
  "event_id=$Legp3Fec3qa5Matct10VzlsNU-cCYSfOMpEC1wWRCSw,depth=10,body=Historical 8 (batch=0),prevs=['$Ot4kjqVOhGVkEWIshCwP9AmsHX9Dw_OG_rAfzF2YYgk']",
  "event_id=$Ot4kjqVOhGVkEWIshCwP9AmsHX9Dw_OG_rAfzF2YYgk,depth=10,body=Historical 7 (batch=0),prevs=['$_NgCYX2d-zby256Pt84Aw4WOtYtH5kaG9Qq5nrSISFo']",
  "event_id=$_NgCYX2d-zby256Pt84Aw4WOtYtH5kaG9Qq5nrSISFo,depth=10,body=Historical 6 (batch=0),prevs=['$wm5gnTie-UwOxwYVM6YYI6qbOO9g_n-IZ900ouJf4yI']",
  "event_id=$wm5gnTie-UwOxwYVM6YYI6qbOO9g_n-IZ900ouJf4yI,depth=10,body=Historical 5 (batch=0),prevs=['$d8O1CwNO3PfEYgODGj_6eHdxs-8H0Nk3UaoBnrJ8QBs']",
  "event_id=$rFNqVLF37MMcg7Dy8DjxnpUIyo8q-GBEs35AHKJRe8c,depth=11,body=Message 1 (eventIDsAfter),prevs=['$-VN0Wx6nnEzZLwFeON19jL9hW07xo1rGS08HsmBtA2g']",
  "event_id=$-VN0Wx6nnEzZLwFeON19jL9hW07xo1rGS08HsmBtA2g,depth=10,body=Message 0 (eventIDsAfter),prevs=['$n9kq5qDGfNxKw7_Cb8kIC-9BrQ0Kg_sTWn9_nLwovA4']",
  "event_id=$n9kq5qDGfNxKw7_Cb8kIC-9BrQ0Kg_sTWn9_nLwovA4,depth=9,body=Message 1 (eventIDsBefore),prevs=['$JdciLNIztkJyL8kE0GAs_JNRKx00ZYkfkT0Hw9bZmTY']"
]
```
2021-10-29 14:10:43 -05:00
Eric Eastwood 3d387f94fc WIP: Sort events topologically when we receive them over backfill 2021-10-29 11:02:09 -05:00
Eric Eastwood 6ea263b73b Revert "WIP: Sort events topologically when we receive them over backfill"
This reverts commit 5afc264dd5.
2021-10-29 02:43:17 -05:00
Eric Eastwood 5afc264dd5 WIP: Sort events topologically when we receive them over backfill 2021-10-29 02:43:08 -05:00
Eric Eastwood 3e09d49000 Revert "WIP: Don't include the event we branch from"
This reverts commit 9a6d8faafe.
2021-10-28 20:40:57 -05:00
Eric Eastwood 9a6d8faafe WIP: Don't include the event we branch from
We want to backfill all of the history before adding the base event.

But then there is a problem of how do we add the base event after
exhausting all of the historical messages. Backfill will give
us that extremity again but the current code will always
choose the historical branch over and over and never move past it.

I wish we could ask the federated homeserver if it already
has the insertion event locally but we can't make any requests
in the store code here :/
2021-10-28 20:24:00 -05:00
Eric Eastwood 4a12304cf7 Put empty prev_events behind new room version
See https://github.com/matrix-org/synapse/pull/11114#discussion_r733475645
2021-10-28 01:42:48 -05:00
Eric Eastwood 1d3f417046 Revert back to string interpolation for SQL boolean value
Maybe fixes the `sqlite3.OperationalError: no such column: FALSE,` problem in CI,
https://github.com/matrix-org/synapse/runs/3962382283#step:4:11038
2021-10-21 18:49:30 -05:00
Eric Eastwood 2fbe3f13ae Merge branch 'develop' into madlittlemods/return-historical-events-in-order-from-backfill 2021-10-21 05:26:04 -05:00
Eric Eastwood 5bfde7bd33 Merge branch 'master' into madlittlemods/return-historical-events-in-order-from-backfill 2021-10-21 04:51:57 -05:00
Eric Eastwood ee47878439 Fix mypy lints 2021-10-21 04:49:28 -05:00
Eric Eastwood 1263c7e2a9 Remove unused import 2021-10-21 04:39:34 -05:00
Eric Eastwood 83474d9158 Put MSC2716 backfill logic behind experimental feature flag 2021-10-21 04:31:10 -05:00
Eric Eastwood 69dfa16dcb Move to sorting the backfill events in the existing sorted 2021-10-21 04:19:36 -05:00
Eric Eastwood 7da8012f31 Remove extra event info 2021-10-21 04:06:03 -05:00
Eric Eastwood f39c1da083 Remove debug logging 2021-10-21 04:05:24 -05:00
Eric Eastwood 4191f5615f Remove fake prev events from historical state chain
Fix https://github.com/matrix-org/synapse/issues/11091

We have to allow creation of events with no prev_events
but do have auth_events.

And since the historical member events are outliers
with no prev_events to resolve them, we want to avoid
putting them as backward extremeties.
2021-10-21 03:44:27 -05:00
Eric Eastwood 477c15df72 Some more debug logging 2021-10-20 22:11:12 -05:00
Eric Eastwood 886071b66b Fix backfill not picking up batch events connected to non-base insertion events
Previously, we would only look for a batch event if the insertion event
was connected to something else by prev_event. This is only the case
for the base insertion event. And instead, we need to look for
a batch event whenever we come across an insertion event.
2021-10-20 16:48:28 -05:00
Eric Eastwood 260ca06f0f Some more trials of trying to get many many events to backfill in order on remote 2021-10-19 01:55:40 -05:00
Eric Eastwood a64bb2e811 Add changelog 2021-10-18 19:30:43 -05:00
Eric Eastwood 4983739156 Avoid constant missing prev_event fetching while backfilling
Persist backfilled event response from oldest -> newest to avoid
having to go fetch missing prev_events which de-outliers every
other event and screws up the stream_ordering. Missing prev_events
aren't fetched as "backfilled" so the stream_ordering was incrementing.

This helps us in MSC2716 land where we can more easily copy a similar
stream_ordering that the originating homeserver has.
2021-10-18 19:27:27 -05:00
Eric Eastwood 438e2226cc Use OrderedDict to gurantee order returned is the same as we were building the list
We are using a Dict over a list to gurantee we don't duplicate the event if it's already in there.
I assume this is why we were using a Set before.
2021-10-18 16:40:04 -05:00
Eric Eastwood f30302db58 Scratch debugging why events appear out of order on remote homeservers 2021-10-18 15:24:19 -05:00
11 changed files with 354 additions and 135 deletions

1
changelog.d/11114.bugfix Normal file
View file

@ -0,0 +1 @@
Fix [MSC2716](https://github.com/matrix-org/matrix-doc/pull/2716) historical messages backfilling in random order on remote homeservers.

View file

@ -65,4 +65,4 @@ if [[ -n "$1" ]]; then
fi
# Run the tests!
go test -v -tags synapse_blacklist,msc2946,msc3083,msc2403,msc2716 -count=1 "${EXTRA_COMPLEMENT_ARGS[@]}" ./tests/...
go test -v -tags synapse_blacklist,msc2946,msc3083,msc2403,msc2716 -count=1 "${EXTRA_COMPLEMENT_ARGS[@]}" ./tests

View file

@ -81,6 +81,8 @@ class RoomVersion:
msc2716_historical = attr.ib(type=bool)
# MSC2716: Adds support for redacting "insertion", "chunk", and "marker" events
msc2716_redactions = attr.ib(type=bool)
# MSC2716: Adds support for events with no `prev_events` but with some `auth_events`
msc2716_empty_prev_events = attr.ib(type=bool)
class RoomVersions:
@ -99,6 +101,7 @@ class RoomVersions:
msc2403_knocking=False,
msc2716_historical=False,
msc2716_redactions=False,
msc2716_empty_prev_events=False,
)
V2 = RoomVersion(
"2",
@ -115,6 +118,7 @@ class RoomVersions:
msc2403_knocking=False,
msc2716_historical=False,
msc2716_redactions=False,
msc2716_empty_prev_events=False,
)
V3 = RoomVersion(
"3",
@ -131,6 +135,7 @@ class RoomVersions:
msc2403_knocking=False,
msc2716_historical=False,
msc2716_redactions=False,
msc2716_empty_prev_events=False,
)
V4 = RoomVersion(
"4",
@ -147,6 +152,7 @@ class RoomVersions:
msc2403_knocking=False,
msc2716_historical=False,
msc2716_redactions=False,
msc2716_empty_prev_events=False,
)
V5 = RoomVersion(
"5",
@ -163,6 +169,7 @@ class RoomVersions:
msc2403_knocking=False,
msc2716_historical=False,
msc2716_redactions=False,
msc2716_empty_prev_events=False,
)
V6 = RoomVersion(
"6",
@ -179,6 +186,7 @@ class RoomVersions:
msc2403_knocking=False,
msc2716_historical=False,
msc2716_redactions=False,
msc2716_empty_prev_events=False,
)
MSC2176 = RoomVersion(
"org.matrix.msc2176",
@ -195,6 +203,7 @@ class RoomVersions:
msc2403_knocking=False,
msc2716_historical=False,
msc2716_redactions=False,
msc2716_empty_prev_events=False,
)
V7 = RoomVersion(
"7",
@ -211,6 +220,7 @@ class RoomVersions:
msc2403_knocking=True,
msc2716_historical=False,
msc2716_redactions=False,
msc2716_empty_prev_events=False,
)
V8 = RoomVersion(
"8",
@ -227,6 +237,7 @@ class RoomVersions:
msc2403_knocking=True,
msc2716_historical=False,
msc2716_redactions=False,
msc2716_empty_prev_events=False,
)
V9 = RoomVersion(
"9",
@ -243,6 +254,7 @@ class RoomVersions:
msc2403_knocking=True,
msc2716_historical=False,
msc2716_redactions=False,
msc2716_empty_prev_events=False,
)
MSC2716v3 = RoomVersion(
"org.matrix.msc2716v3",
@ -259,6 +271,24 @@ class RoomVersions:
msc2403_knocking=True,
msc2716_historical=True,
msc2716_redactions=True,
msc2716_empty_prev_events=False,
)
MSC2716v4 = RoomVersion(
"org.matrix.msc2716v4",
RoomDisposition.UNSTABLE,
EventFormatVersions.V3,
StateResolutionVersions.V2,
enforce_key_validity=True,
special_case_aliases_auth=False,
strict_canonicaljson=True,
limit_notifications_power_levels=True,
msc2176_redaction_rules=False,
msc3083_join_rules=False,
msc3375_redaction_rules=False,
msc2403_knocking=True,
msc2716_historical=True,
msc2716_redactions=True,
msc2716_empty_prev_events=True,
)
@ -276,6 +306,7 @@ KNOWN_ROOM_VERSIONS: Dict[str, RoomVersion] = {
RoomVersions.V8,
RoomVersions.V9,
RoomVersions.MSC2716v3,
RoomVersions.MSC2716v4,
)
}

View file

@ -136,9 +136,14 @@ class FederationHandler:
oldest_events_with_depth = (
await self.store.get_oldest_event_ids_with_depth_in_room(room_id)
)
insertion_events_to_be_backfilled = (
await self.store.get_insertion_event_backwards_extremities_in_room(room_id)
)
insertion_events_to_be_backfilled: Dict[str, int] = {}
if self.hs.config.experimental.msc2716_enabled:
insertion_events_to_be_backfilled = (
await self.store.get_insertion_event_backward_extremities_in_room(
room_id
)
)
logger.debug(
"_maybe_backfill_inner: extremities oldest_events_with_depth=%s insertion_events_to_be_backfilled=%s",
oldest_events_with_depth,
@ -241,11 +246,12 @@ class FederationHandler:
]
logger.debug(
"room_id: %s, backfill: current_depth: %s, limit: %s, max_depth: %s, extrems: %s filtered_sorted_extremeties_tuple: %s",
"room_id: %s, backfill: current_depth: %s, limit: %s, max_depth: %s, extrems (%d): %s filtered_sorted_extremeties_tuple: %s",
room_id,
current_depth,
limit,
max_depth,
len(sorted_extremeties_tuple),
sorted_extremeties_tuple,
filtered_sorted_extremeties_tuple,
)
@ -1047,6 +1053,19 @@ class FederationHandler:
limit = min(limit, 100)
events = await self.store.get_backfill_events(room_id, pdu_list, limit)
logger.debug(
"on_backfill_request: backfill events=%s",
[
"event_id=%s,depth=%d,body=%s,prevs=%s\n"
% (
event.event_id,
event.depth,
event.content.get("body", event.type),
event.prev_event_ids(),
)
for event in events
],
)
events = await filter_events_for_server(self.storage, origin, events)

View file

@ -514,7 +514,11 @@ class FederationEventHandler:
f"room {ev.room_id}, when we were backfilling in {room_id}"
)
await self._process_pulled_events(dest, events, backfilled=True)
await self._process_pulled_events(
dest,
events,
backfilled=True,
)
async def _get_missing_events_for_pdu(
self, origin: str, pdu: EventBase, prevs: Set[str], min_depth: int
@ -632,11 +636,24 @@ class FederationEventHandler:
backfilled: True if this is part of a historical batch of events (inhibits
notification to clients, and validation of device keys.)
"""
logger.debug(
"processing pulled backfilled=%s events=%s",
backfilled,
[
"event_id=%s,depth=%d,body=%s,prevs=%s\n"
% (
event.event_id,
event.depth,
event.content.get("body", event.type),
event.prev_event_ids(),
)
for event in events
],
)
# We want to sort these by depth so we process them and
# tell clients about them in order.
sorted_events = sorted(events, key=lambda x: x.depth)
for ev in sorted_events:
with nested_logging_context(ev.event_id):
await self._process_pulled_event(origin, ev, backfilled=backfilled)
@ -998,6 +1015,8 @@ class FederationEventHandler:
await self._run_push_actions_and_persist_event(event, context, backfilled)
await self._handle_marker_event(origin, event)
if backfilled or context.rejected:
return
@ -1077,8 +1096,6 @@ class FederationEventHandler:
event.sender,
)
await self._handle_marker_event(origin, event)
async def _resync_device(self, sender: str) -> None:
"""We have detected that the device list for the given user may be out
of sync, so we try and resync them.
@ -1325,7 +1342,14 @@ class FederationEventHandler:
return event, context
events_to_persist = (x for x in (prep(event) for event in fetched_events) if x)
await self.persist_events_and_notify(room_id, tuple(events_to_persist))
await self.persist_events_and_notify(
room_id,
tuple(events_to_persist),
# Mark these events backfilled as they're historic events that will
# eventually be backfilled. For example, missing events we fetch
# during backfill should be marked as backfilled as well.
backfilled=True,
)
async def _check_event_auth(
self,

View file

@ -949,14 +949,24 @@ class EventCreationHandler:
else:
prev_event_ids = await self.store.get_prev_events_for_room(builder.room_id)
# we now ought to have some prev_events (unless it's a create event).
#
# do a quick sanity check here, rather than waiting until we've created the
# Do a quick sanity check here, rather than waiting until we've created the
# event and then try to auth it (which fails with a somewhat confusing "No
# create event in auth events")
assert (
builder.type == EventTypes.Create or len(prev_event_ids) > 0
), "Attempting to create an event with no prev_events"
room_version_obj = await self.store.get_room_version(builder.room_id)
if room_version_obj.msc2716_empty_prev_events:
# We allow events with no `prev_events` but it better have some `auth_events`
assert (
builder.type == EventTypes.Create
or len(prev_event_ids) > 0
# Allow an event to have empty list of prev_event_ids
# only if it has auth_event_ids.
or (auth_event_ids and len(auth_event_ids) > 0)
), "Attempting to create an event with no prev_events or auth_event_ids"
else:
# we now ought to have some prev_events (unless it's a create event).
assert (
builder.type == EventTypes.Create or len(prev_event_ids) > 0
), "Attempting to create an event with no prev_events"
event = await builder.build(
prev_event_ids=prev_event_ids,
@ -1504,6 +1514,7 @@ class EventCreationHandler:
next_batch_id = event.content.get(
EventContentFields.MSC2716_NEXT_BATCH_ID
)
conflicting_insertion_event_id = None
if next_batch_id:
conflicting_insertion_event_id = (

View file

@ -13,10 +13,6 @@ if TYPE_CHECKING:
logger = logging.getLogger(__name__)
def generate_fake_event_id() -> str:
return "$fake_" + random_string(43)
class RoomBatchHandler:
def __init__(self, hs: "HomeServer"):
self.hs = hs
@ -184,7 +180,7 @@ class RoomBatchHandler:
# Make the state events float off on their own so we don't have a
# bunch of `@mxid joined the room` noise between each batch
prev_event_id_for_state_chain = generate_fake_event_id()
prev_event_ids_for_state_chain: List[str] = []
for state_event in state_events_at_start:
assert_params_in_dict(
@ -221,7 +217,7 @@ class RoomBatchHandler:
action=membership,
content=event_dict["content"],
outlier=True,
prev_event_ids=[prev_event_id_for_state_chain],
prev_event_ids=prev_event_ids_for_state_chain,
# Make sure to use a copy of this list because we modify it
# later in the loop here. Otherwise it will be the same
# reference and also update in the event when we append later.
@ -240,7 +236,7 @@ class RoomBatchHandler:
),
event_dict,
outlier=True,
prev_event_ids=[prev_event_id_for_state_chain],
prev_event_ids=prev_event_ids_for_state_chain,
# Make sure to use a copy of this list because we modify it
# later in the loop here. Otherwise it will be the same
# reference and also update in the event when we append later.
@ -251,7 +247,7 @@ class RoomBatchHandler:
state_event_ids_at_start.append(event_id)
auth_event_ids.append(event_id)
# Connect all the state in a floating chain
prev_event_id_for_state_chain = event_id
prev_event_ids_for_state_chain = [event_id]
return state_event_ids_at_start

View file

@ -644,7 +644,7 @@ class RoomMemberHandler(metaclass=abc.ABCMeta):
if block_invite:
raise SynapseError(403, "Invites have been disabled on this server")
if prev_event_ids:
if prev_event_ids is not None:
return await self._local_membership_update(
requester=requester,
target=target,

View file

@ -131,6 +131,14 @@ class RoomBatchSendEventRestServlet(RestServlet):
prev_event_ids_from_query
)
if not auth_event_ids:
raise SynapseError(
HTTPStatus.BAD_REQUEST,
"No auth events found for given prev_event query parameter. The prev_event=%s probably does not exist."
% prev_event_ids_from_query,
errcode=Codes.INVALID_PARAM,
)
state_event_ids_at_start = []
# Create and persist all of the state events that float off on their own
# before the batch. These will most likely be all of the invite/member

View file

@ -14,11 +14,21 @@
import itertools
import logging
from queue import Empty, PriorityQueue
from typing import TYPE_CHECKING, Collection, Dict, Iterable, List, Optional, Set, Tuple
from typing import (
TYPE_CHECKING,
Collection,
Dict,
Iterable,
List,
NamedTuple,
Optional,
Set,
Tuple,
)
from prometheus_client import Counter, Gauge
from synapse.api.constants import MAX_DEPTH
from synapse.api.constants import MAX_DEPTH, EventTypes
from synapse.api.errors import StoreError
from synapse.api.room_versions import EventFormatVersions, RoomVersion
from synapse.events import EventBase, make_event_from_dict
@ -56,6 +66,14 @@ pdus_pruned_from_federation_queue = Counter(
logger = logging.getLogger(__name__)
# All the info we need while iterating the DAG while backfilling
class BackfillQueueNavigationItem(NamedTuple):
depth: int
stream_ordering: int
event_id: str
type: str
class _NoChainCoverIndex(Exception):
def __init__(self, room_id: str):
super().__init__("Unexpectedly no chain cover for events in %s" % (room_id,))
@ -65,6 +83,8 @@ class EventFederationWorkerStore(EventsWorkerStore, SignatureWorkerStore, SQLBas
def __init__(self, database: DatabasePool, db_conn, hs: "HomeServer"):
super().__init__(database, db_conn, hs)
self.hs = hs
if hs.config.worker.run_background_tasks:
hs.get_clock().looping_call(
self._delete_old_forward_extrem_cache, 60 * 60 * 1000
@ -728,7 +748,7 @@ class EventFederationWorkerStore(EventsWorkerStore, SignatureWorkerStore, SQLBas
room_id,
)
async def get_insertion_event_backwards_extremities_in_room(
async def get_insertion_event_backward_extremities_in_room(
self, room_id
) -> Dict[str, int]:
"""Get the insertion events we know about that we haven't backfilled yet.
@ -745,7 +765,7 @@ class EventFederationWorkerStore(EventsWorkerStore, SignatureWorkerStore, SQLBas
Map from event_id to depth
"""
def get_insertion_event_backwards_extremities_in_room_txn(txn, room_id):
def get_insertion_event_backward_extremities_in_room_txn(txn, room_id):
sql = """
SELECT b.event_id, MAX(e.depth) FROM insertion_events as i
/* We only want insertion events that are also marked as backwards extremities */
@ -761,8 +781,8 @@ class EventFederationWorkerStore(EventsWorkerStore, SignatureWorkerStore, SQLBas
return dict(txn)
return await self.db_pool.runInteraction(
"get_insertion_event_backwards_extremities_in_room",
get_insertion_event_backwards_extremities_in_room_txn,
"get_insertion_event_backward_extremities_in_room",
get_insertion_event_backward_extremities_in_room_txn,
room_id,
)
@ -988,58 +1008,25 @@ class EventFederationWorkerStore(EventsWorkerStore, SignatureWorkerStore, SQLBas
"get_forward_extremeties_for_room", get_forward_extremeties_for_room_txn
)
async def get_backfill_events(self, room_id: str, event_list: list, limit: int):
"""Get a list of Events for a given topic that occurred before (and
including) the events in event_list. Return a list of max size `limit`
def _get_connected_batch_event_backfill_results_txn(
self, txn: LoggingTransaction, insertion_event_id: str, limit: int
) -> List[BackfillQueueNavigationItem]:
"""
Find any batch connections of a given insertion event.
A batch event points at a insertion event via:
batch_event.content[MSC2716_BATCH_ID] -> insertion_event.content[MSC2716_NEXT_BATCH_ID]
Args:
room_id
event_list
limit
txn: The database transaction to use
insertion_event_id: The event ID to navigate from. We will find
batch events that point back at this insertion event.
limit: Max number of event ID's to query for and return
Returns:
List of batch events that the backfill queue can process
"""
event_ids = await self.db_pool.runInteraction(
"get_backfill_events",
self._get_backfill_events,
room_id,
event_list,
limit,
)
events = await self.get_events_as_list(event_ids)
return sorted(events, key=lambda e: -e.depth)
def _get_backfill_events(self, txn, room_id, event_list, limit):
logger.debug("_get_backfill_events: %s, %r, %s", room_id, event_list, limit)
event_results = set()
# We want to make sure that we do a breadth-first, "depth" ordered
# search.
# Look for the prev_event_id connected to the given event_id
query = """
SELECT depth, prev_event_id FROM event_edges
/* Get the depth of the prev_event_id from the events table */
INNER JOIN events
ON prev_event_id = events.event_id
/* Find an event which matches the given event_id */
WHERE event_edges.event_id = ?
AND event_edges.is_state = ?
LIMIT ?
"""
# Look for the "insertion" events connected to the given event_id
connected_insertion_event_query = """
SELECT e.depth, i.event_id FROM insertion_event_edges AS i
/* Get the depth of the insertion event from the events table */
INNER JOIN events AS e USING (event_id)
/* Find an insertion event which points via prev_events to the given event_id */
WHERE i.insertion_prev_event_id = ?
LIMIT ?
"""
# Find any batch connections of a given insertion event
batch_connection_query = """
SELECT e.depth, c.event_id FROM insertion_events AS i
SELECT e.depth, e.stream_ordering, c.event_id, e.type FROM insertion_events AS i
/* Find the batch that connects to the given insertion event */
INNER JOIN batch_events AS c
ON i.next_batch_id = c.batch_id
@ -1050,81 +1037,214 @@ class EventFederationWorkerStore(EventsWorkerStore, SignatureWorkerStore, SQLBas
LIMIT ?
"""
# Find any batch connections for the given insertion event
txn.execute(
batch_connection_query,
(insertion_event_id, limit),
)
batch_start_event_id_results = txn.fetchall()
return [
BackfillQueueNavigationItem(
depth=row[0],
stream_ordering=row[1],
event_id=row[2],
type=row[3],
)
for row in batch_start_event_id_results
]
def _get_connected_prev_event_backfill_results_txn(
self, txn: LoggingTransaction, event_id: str, limit: int
) -> List[BackfillQueueNavigationItem]:
"""
Find any events connected by prev_event the specified event_id.
Args:
txn: The database transaction to use
event_id: The event ID to navigate from
limit: Max number of event ID's to query for and return
Returns:
List of prev events that the backfill queue can process
"""
# Look for the prev_event_id connected to the given event_id
connected_prev_event_query = """
SELECT depth, stream_ordering, prev_event_id, events.type FROM event_edges
/* Get the depth and stream_ordering of the prev_event_id from the events table */
INNER JOIN events
ON prev_event_id = events.event_id
/* Look for an edge which matches the given event_id */
WHERE event_edges.event_id = ?
AND event_edges.is_state = ?
/* Because we can have many events at the same depth,
* we want to also tie-break and sort on stream_ordering */
ORDER BY depth DESC, stream_ordering DESC
LIMIT ?
"""
txn.execute(
connected_prev_event_query,
(event_id, False, limit),
)
prev_event_id_results = txn.fetchall()
return [
BackfillQueueNavigationItem(
depth=row[0],
stream_ordering=row[1],
event_id=row[2],
type=row[3],
)
for row in prev_event_id_results
]
async def get_backfill_events(
self, room_id: str, seed_event_id_list: list, limit: int
):
"""Get a list of Events for a given topic that occurred before (and
including) the events in seed_event_id_list. Return a list of max size `limit`
Args:
room_id
seed_event_id_list
limit
"""
event_ids = await self.db_pool.runInteraction(
"get_backfill_events",
self._get_backfill_events,
room_id,
seed_event_id_list,
limit,
)
events = await self.get_events_as_list(event_ids)
return sorted(
events, key=lambda e: (-e.depth, -e.internal_metadata.stream_ordering)
)
def _get_backfill_events(self, txn, room_id, seed_event_id_list, limit):
"""
We want to make sure that we do a breadth-first, "depth" ordered search.
We also handle navigating historical branches of history connected by
insertion and batch events.
"""
logger.debug(
"_get_backfill_events(room_id=%s): seeding backfill with seed_event_id_list=%s limit=%s",
room_id,
seed_event_id_list,
limit,
)
event_id_results = set()
# In a PriorityQueue, the lowest valued entries are retrieved first.
# We're using depth as the priority in the queue.
# Depth is lowest at the oldest-in-time message and highest and
# newest-in-time message. We add events to the queue with a negative depth so that
# we process the newest-in-time messages first going backwards in time.
# We're using depth as the priority in the queue and tie-break based on
# stream_ordering. Depth is lowest at the oldest-in-time message and
# highest and newest-in-time message. We add events to the queue with a
# negative depth so that we process the newest-in-time messages first
# going backwards in time. stream_ordering follows the same pattern.
queue = PriorityQueue()
for event_id in event_list:
depth = self.db_pool.simple_select_one_onecol_txn(
for seed_event_id in seed_event_id_list:
event_lookup_result = self.db_pool.simple_select_one_txn(
txn,
table="events",
keyvalues={"event_id": event_id, "room_id": room_id},
retcol="depth",
keyvalues={"event_id": seed_event_id, "room_id": room_id},
retcols=(
"type",
"depth",
"stream_ordering",
),
allow_none=True,
)
if depth:
queue.put((-depth, event_id))
logger.debug(
"_get_backfill_events(room_id=%s): seed_event_id=%s depth=%s stream_ordering=%s type=%s",
room_id,
seed_event_id,
event_lookup_result["depth"],
event_lookup_result["stream_ordering"],
event_lookup_result["type"],
)
while not queue.empty() and len(event_results) < limit:
if event_lookup_result["depth"]:
queue.put(
(
-event_lookup_result["depth"],
-event_lookup_result["stream_ordering"],
seed_event_id,
event_lookup_result["type"],
)
)
while not queue.empty() and len(event_id_results) < limit:
try:
_, event_id = queue.get_nowait()
_, _, event_id, event_type = queue.get_nowait()
except Empty:
break
if event_id in event_results:
if event_id in event_id_results:
continue
event_results.add(event_id)
event_id_results.add(event_id)
# Try and find any potential historical batches of message history.
#
# First we look for an insertion event connected to the current
# event (by prev_event). If we find any, we need to go and try to
# find any batch events connected to the insertion event (by
# batch_id). If we find any, we'll add them to the queue and
# navigate up the DAG like normal in the next iteration of the loop.
txn.execute(
connected_insertion_event_query, (event_id, limit - len(event_results))
)
connected_insertion_event_id_results = txn.fetchall()
logger.debug(
"_get_backfill_events: connected_insertion_event_query %s",
connected_insertion_event_id_results,
)
for row in connected_insertion_event_id_results:
connected_insertion_event_depth = row[0]
connected_insertion_event = row[1]
queue.put((-connected_insertion_event_depth, connected_insertion_event))
if self.hs.config.experimental.msc2716_enabled:
# We need to go and try to find any batch events connected
# to a given insertion event (by batch_id). If we find any, we'll
# add them to the queue and navigate up the DAG like normal in the
# next iteration of the loop.
if event_type == EventTypes.MSC2716_INSERTION:
# Find any batch connections for the given insertion event
connected_batch_event_backfill_results = (
self._get_connected_batch_event_backfill_results_txn(
txn, event_id, limit - len(event_id_results)
)
)
logger.debug(
"_get_backfill_events(room_id=%s): connected_batch_event_backfill_results=%s",
room_id,
connected_batch_event_backfill_results,
)
for (
connected_batch_event_backfill_item
) in connected_batch_event_backfill_results:
if (
connected_batch_event_backfill_item.event_id
not in event_id_results
):
queue.put(
(
-connected_batch_event_backfill_item.depth,
-connected_batch_event_backfill_item.stream_ordering,
connected_batch_event_backfill_item.event_id,
connected_batch_event_backfill_item.type,
)
)
# Find any batch connections for the given insertion event
txn.execute(
batch_connection_query,
(connected_insertion_event, limit - len(event_results)),
# Now we just look up the DAG by prev_events as normal
connected_prev_event_backfill_results = (
self._get_connected_prev_event_backfill_results_txn(
txn, event_id, limit - len(event_id_results)
)
batch_start_event_id_results = txn.fetchall()
logger.debug(
"_get_backfill_events: batch_start_event_id_results %s",
batch_start_event_id_results,
)
for row in batch_start_event_id_results:
if row[1] not in event_results:
queue.put((-row[0], row[1]))
txn.execute(query, (event_id, False, limit - len(event_results)))
prev_event_id_results = txn.fetchall()
logger.debug(
"_get_backfill_events: prev_event_ids %s", prev_event_id_results
)
logger.debug(
"_get_backfill_events(room_id=%s): connected_prev_event_backfill_results=%s",
room_id,
connected_prev_event_backfill_results,
)
for (
connected_prev_event_backfill_item
) in connected_prev_event_backfill_results:
if connected_prev_event_backfill_item.event_id not in event_id_results:
queue.put(
(
-connected_prev_event_backfill_item.depth,
-connected_prev_event_backfill_item.stream_ordering,
connected_prev_event_backfill_item.event_id,
connected_prev_event_backfill_item.type,
)
)
for row in prev_event_id_results:
if row[1] not in event_results:
queue.put((-row[0], row[1]))
return event_results
return event_id_results
async def get_missing_events(self, room_id, earliest_events, latest_events, limit):
ids = await self.db_pool.runInteraction(

View file

@ -2144,9 +2144,14 @@ class PersistEventsStore:
" SELECT 1 FROM event_backward_extremities"
" WHERE event_id = ? AND room_id = ?"
" )"
# 1. Don't add an event as a extremity again if we already persisted it
# as a non-outlier.
# 2. Don't add an outlier as an extremity if it has no prev_events
" AND NOT EXISTS ("
" SELECT 1 FROM events WHERE event_id = ? AND room_id = ? "
" AND outlier = ?"
" SELECT 1 FROM events"
" LEFT JOIN event_edges edge"
" ON edge.event_id = events.event_id"
" WHERE events.event_id = ? AND events.room_id = ? AND (events.outlier = ? OR edge.event_id IS NULL)"
" )"
)
@ -2172,6 +2177,10 @@ class PersistEventsStore:
(ev.event_id, ev.room_id)
for ev in events
if not ev.internal_metadata.is_outlier()
# If we encountered an event with no prev_events, then we might
# as well remove it now because it won't ever have anything else
# to backfill from.
or len(ev.prev_event_ids()) == 0
],
)