From e09be2f7ee31a97b615a86e5bdae8ac75ec93ff6 Mon Sep 17 00:00:00 2001
From: Devin Ragotzy <devin.ragotzy@gmail.com>
Date: Sat, 30 Jan 2021 12:43:43 -0500
Subject: [PATCH] Add incoming event to the current room state then resolve

All state snapshots that are used in the resolve call are state after
snapshots, they have the event inserted.
---
 src/server_server.rs | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/src/server_server.rs b/src/server_server.rs
index ad0a1a44e..f55b3774b 100644
--- a/src/server_server.rs
+++ b/src/server_server.rs
@@ -768,9 +768,11 @@ pub async fn send_transaction_message_route<'a>(
         // find the leaves otherwise we would do this sooner
         append_incoming_pdu(&db, &pdu, &extremities, &state_at_event)?;
 
+        // This will create the state after any state snapshot it builds
+        // So current_state will have the incoming event inserted to it
         let mut fork_states = match build_forward_extremity_snapshots(
             &db,
-            pdu.room_id(),
+            pdu.clone(),
             server_name,
             current_state,
             &extremities,
@@ -1195,14 +1197,14 @@ pub(crate) async fn calculate_forward_extremities(
 /// and the sending server).
 pub(crate) async fn build_forward_extremity_snapshots(
     db: &Database,
-    room_id: &RoomId,
+    pdu: Arc<PduEvent>,
     origin: &ServerName,
-    current_state: StateMap<Arc<PduEvent>>,
+    mut current_state: StateMap<Arc<PduEvent>>,
     current_leaves: &[EventId],
     pub_key_map: &PublicKeyMap,
     auth_cache: &mut EventMap<Arc<PduEvent>>,
 ) -> Result<BTreeSet<StateMap<Arc<PduEvent>>>> {
-    let current_hash = db.rooms.current_state_hash(room_id)?;
+    let current_hash = db.rooms.current_state_hash(pdu.room_id())?;
 
     let mut includes_current_state = false;
     let mut fork_states = BTreeSet::new();
@@ -1219,7 +1221,7 @@ pub(crate) async fn build_forward_extremity_snapshots(
 
             let mut state_before = db
                 .rooms
-                .state_full(room_id, &state_hash)?
+                .state_full(pdu.room_id(), &state_hash)?
                 .into_iter()
                 .map(|(k, v)| ((k.0, Some(k.1)), Arc::new(v)))
                 .collect::<StateMap<_>>();
@@ -1238,7 +1240,7 @@ pub(crate) async fn build_forward_extremity_snapshots(
                     &db.globals,
                     origin,
                     get_room_state_ids::v1::Request {
-                        room_id,
+                        room_id: pdu.room_id(),
                         event_id: id,
                     },
                 )
@@ -1269,6 +1271,9 @@ pub(crate) async fn build_forward_extremity_snapshots(
 
     // This guarantees that our current room state is included
     if !includes_current_state && current_hash.is_some() {
+        error!("Did not include current state");
+        current_state.insert((pdu.kind(), pdu.state_key()), pdu);
+
         fork_states.insert(current_state);
     }
 
-- 
GitLab