From 4b2eb5ab82d6fc80aac2ab78a0c02d3add245743 Mon Sep 17 00:00:00 2001
From: Devin Ragotzy <d6ragotzy@wmich.edu>
Date: Fri, 15 Jan 2021 11:05:57 -0500
Subject: [PATCH] Fix ALL clippy warnings

---
 src/client_server/account.rs    |  78 ++++------------------
 src/client_server/membership.rs |  40 ++---------
 src/client_server/message.rs    |   6 +-
 src/client_server/profile.rs    |  12 +---
 src/client_server/redact.rs     |   6 +-
 src/client_server/room.rs       |  90 +++++--------------------
 src/client_server/state.rs      |   6 +-
 src/database/admin.rs           |   6 +-
 src/database/rooms.rs           | 113 ++++++++++++++------------------
 src/database/sending.rs         |  19 +++---
 src/error.rs                    |   8 ++-
 src/server_server.rs            |   4 +-
 12 files changed, 106 insertions(+), 282 deletions(-)

diff --git a/src/client_server/account.rs b/src/client_server/account.rs
index 75544b78..6927a53c 100644
--- a/src/client_server/account.rs
+++ b/src/client_server/account.rs
@@ -239,11 +239,7 @@ pub async fn register_route(
             },
             &conduit_user,
             &room_id,
-            &db.globals,
-            &db.sending,
-            &db.admin,
-            &db.account_data,
-            &db.appservice,
+            &db,
         )?;
 
         // 2. Make conduit bot join
@@ -264,11 +260,7 @@ pub async fn register_route(
             },
             &conduit_user,
             &room_id,
-            &db.globals,
-            &db.sending,
-            &db.admin,
-            &db.account_data,
-            &db.appservice,
+            &db,
         )?;
 
         // 3. Power levels
@@ -302,11 +294,7 @@ pub async fn register_route(
             },
             &conduit_user,
             &room_id,
-            &db.globals,
-            &db.sending,
-            &db.admin,
-            &db.account_data,
-            &db.appservice,
+            &db,
         )?;
 
         // 4.1 Join Rules
@@ -323,11 +311,7 @@ pub async fn register_route(
             },
             &conduit_user,
             &room_id,
-            &db.globals,
-            &db.sending,
-            &db.admin,
-            &db.account_data,
-            &db.appservice,
+            &db,
         )?;
 
         // 4.2 History Visibility
@@ -346,11 +330,7 @@ pub async fn register_route(
             },
             &conduit_user,
             &room_id,
-            &db.globals,
-            &db.sending,
-            &db.admin,
-            &db.account_data,
-            &db.appservice,
+            &db,
         )?;
 
         // 4.3 Guest Access
@@ -367,11 +347,7 @@ pub async fn register_route(
             },
             &conduit_user,
             &room_id,
-            &db.globals,
-            &db.sending,
-            &db.admin,
-            &db.account_data,
-            &db.appservice,
+            &db,
         )?;
 
         // 6. Events implied by name and topic
@@ -390,11 +366,7 @@ pub async fn register_route(
             },
             &conduit_user,
             &room_id,
-            &db.globals,
-            &db.sending,
-            &db.admin,
-            &db.account_data,
-            &db.appservice,
+            &db,
         )?;
 
         db.rooms.build_and_append_pdu(
@@ -410,11 +382,7 @@ pub async fn register_route(
             },
             &conduit_user,
             &room_id,
-            &db.globals,
-            &db.sending,
-            &db.admin,
-            &db.account_data,
-            &db.appservice,
+            &db,
         )?;
 
         // Room alias
@@ -436,11 +404,7 @@ pub async fn register_route(
             },
             &conduit_user,
             &room_id,
-            &db.globals,
-            &db.sending,
-            &db.admin,
-            &db.account_data,
-            &db.appservice,
+            &db,
         )?;
 
         db.rooms.set_alias(&alias, Some(&room_id), &db.globals)?;
@@ -463,11 +427,7 @@ pub async fn register_route(
             },
             &conduit_user,
             &room_id,
-            &db.globals,
-            &db.sending,
-            &db.admin,
-            &db.account_data,
-            &db.appservice,
+            &db,
         )?;
         db.rooms.build_and_append_pdu(
             PduBuilder {
@@ -486,11 +446,7 @@ pub async fn register_route(
             },
             &user_id,
             &room_id,
-            &db.globals,
-            &db.sending,
-            &db.admin,
-            &db.account_data,
-            &db.appservice,
+            &db,
         )?;
 
         // Send welcome message
@@ -515,11 +471,7 @@ pub async fn register_route(
             },
             &conduit_user,
             &room_id,
-            &db.globals,
-            &db.sending,
-            &db.admin,
-            &db.account_data,
-        &db.appservice,
+            &db,
         )?;
     }
 
@@ -691,11 +643,7 @@ pub async fn deactivate_route(
             },
             &sender_user,
             &room_id,
-            &db.globals,
-            &db.sending,
-            &db.admin,
-            &db.account_data,
-            &db.appservice,
+            &db,
         )?;
     }
 
diff --git a/src/client_server/membership.rs b/src/client_server/membership.rs
index 40e4183a..70bb480c 100644
--- a/src/client_server/membership.rs
+++ b/src/client_server/membership.rs
@@ -124,11 +124,7 @@ pub async fn leave_room_route(
         },
         &sender_user,
         &body.room_id,
-        &db.globals,
-        &db.sending,
-        &db.admin,
-        &db.account_data,
-        &db.appservice,
+        &db,
     )?;
 
     db.flush().await?;
@@ -164,11 +160,7 @@ pub async fn invite_user_route(
             },
             &sender_user,
             &body.room_id,
-            &db.globals,
-            &db.sending,
-            &db.admin,
-            &db.account_data,
-            &db.appservice,
+            &db,
         )?;
 
         db.flush().await?;
@@ -220,11 +212,7 @@ pub async fn kick_user_route(
         },
         &sender_user,
         &body.room_id,
-        &db.globals,
-        &db.sending,
-        &db.admin,
-        &db.account_data,
-        &db.appservice,
+        &db,
     )?;
 
     db.flush().await?;
@@ -280,11 +268,7 @@ pub async fn ban_user_route(
         },
         &sender_user,
         &body.room_id,
-        &db.globals,
-        &db.sending,
-        &db.admin,
-        &db.account_data,
-        &db.appservice,
+        &db,
     )?;
 
     db.flush().await?;
@@ -332,11 +316,7 @@ pub async fn unban_user_route(
         },
         &sender_user,
         &body.room_id,
-        &db.globals,
-        &db.sending,
-        &db.admin,
-        &db.account_data,
-        &db.appservice,
+        &db,
     )?;
 
     db.flush().await?;
@@ -685,9 +665,7 @@ async fn join_room_by_id_helper(
                 utils::to_canonical_object(&**pdu).expect("Pdu is valid canonical object"),
                 count,
                 pdu_id.clone().into(),
-                &db.globals,
-                &db.account_data,
-                &db.admin,
+                &db,
             )?;
 
             if state_events.contains(ev_id) {
@@ -717,11 +695,7 @@ async fn join_room_by_id_helper(
             },
             &sender_user,
             &room_id,
-            &db.globals,
-            &db.sending,
-            &db.admin,
-            &db.account_data,
-            &db.appservice,
+            &db,
         )?;
     }
 
diff --git a/src/client_server/message.rs b/src/client_server/message.rs
index c56cc944..c64c3900 100644
--- a/src/client_server/message.rs
+++ b/src/client_server/message.rs
@@ -68,11 +68,7 @@ pub async fn send_message_event_route(
         },
         &sender_user,
         &body.room_id,
-        &db.globals,
-        &db.sending,
-        &db.admin,
-        &db.account_data,
-        &db.appservice,
+        &db,
     )?;
 
     db.transaction_ids.add_txnid(
diff --git a/src/client_server/profile.rs b/src/client_server/profile.rs
index 761443d3..21759a86 100644
--- a/src/client_server/profile.rs
+++ b/src/client_server/profile.rs
@@ -63,11 +63,7 @@ pub async fn set_displayname_route(
             },
             &sender_user,
             &room_id,
-            &db.globals,
-            &db.sending,
-            &db.admin,
-            &db.account_data,
-            &db.appservice,
+            &db,
         )?;
 
         // Presence update
@@ -160,11 +156,7 @@ pub async fn set_avatar_url_route(
             },
             &sender_user,
             &room_id,
-            &db.globals,
-            &db.sending,
-            &db.admin,
-            &db.account_data,
-            &db.appservice,
+            &db,
         )?;
 
         // Presence update
diff --git a/src/client_server/redact.rs b/src/client_server/redact.rs
index 212e751d..282c35a3 100644
--- a/src/client_server/redact.rs
+++ b/src/client_server/redact.rs
@@ -31,11 +31,7 @@ pub async fn redact_event_route(
         },
         &sender_user,
         &body.room_id,
-        &db.globals,
-        &db.sending,
-        &db.admin,
-        &db.account_data,
-        &db.appservice,
+        &db,
     )?;
 
     db.flush().await?;
diff --git a/src/client_server/room.rs b/src/client_server/room.rs
index 092e0830..631d87ba 100644
--- a/src/client_server/room.rs
+++ b/src/client_server/room.rs
@@ -65,11 +65,7 @@ pub async fn create_room_route(
         },
         &sender_user,
         &room_id,
-        &db.globals,
-        &db.sending,
-        &db.admin,
-        &db.account_data,
-        &db.appservice,
+        &db,
     )?;
 
     // 2. Let the room creator join
@@ -90,11 +86,7 @@ pub async fn create_room_route(
         },
         &sender_user,
         &room_id,
-        &db.globals,
-        &db.sending,
-        &db.admin,
-        &db.account_data,
-        &db.appservice,
+        &db,
     )?;
 
     // 3. Power levels
@@ -135,11 +127,7 @@ pub async fn create_room_route(
         },
         &sender_user,
         &room_id,
-        &db.globals,
-        &db.sending,
-        &db.admin,
-        &db.account_data,
-        &db.appservice,
+        &db,
     )?;
 
     // 4. Events set by preset
@@ -175,11 +163,7 @@ pub async fn create_room_route(
         },
         &sender_user,
         &room_id,
-        &db.globals,
-        &db.sending,
-        &db.admin,
-        &db.account_data,
-        &db.appservice,
+        &db,
     )?;
 
     // 4.2 History Visibility
@@ -196,11 +180,7 @@ pub async fn create_room_route(
         },
         &sender_user,
         &room_id,
-        &db.globals,
-        &db.sending,
-        &db.admin,
-        &db.account_data,
-        &db.appservice,
+        &db,
     )?;
 
     // 4.3 Guest Access
@@ -225,11 +205,7 @@ pub async fn create_room_route(
         },
         &sender_user,
         &room_id,
-        &db.globals,
-        &db.sending,
-        &db.admin,
-        &db.account_data,
-        &db.appservice,
+        &db,
     )?;
 
     // 5. Events listed in initial_state
@@ -248,11 +224,7 @@ pub async fn create_room_route(
             pdu_builder,
             &sender_user,
             &room_id,
-            &db.globals,
-            &db.sending,
-            &db.admin,
-            &db.account_data,
-            &db.appservice,
+            &db,
         )?;
     }
 
@@ -273,11 +245,7 @@ pub async fn create_room_route(
             },
             &sender_user,
             &room_id,
-            &db.globals,
-            &db.sending,
-            &db.admin,
-            &db.account_data,
-            &db.appservice,
+            &db,
         )?;
     }
 
@@ -295,11 +263,7 @@ pub async fn create_room_route(
             },
             &sender_user,
             &room_id,
-            &db.globals,
-            &db.sending,
-            &db.admin,
-            &db.account_data,
-            &db.appservice,
+            &db,
         )?;
     }
 
@@ -322,11 +286,7 @@ pub async fn create_room_route(
             },
             &sender_user,
             &room_id,
-            &db.globals,
-            &db.sending,
-            &db.admin,
-            &db.account_data,
-            &db.appservice,
+            &db,
         )?;
     }
 
@@ -413,11 +373,7 @@ pub async fn upgrade_room_route(
         },
         sender_user,
         &body.room_id,
-        &db.globals,
-        &db.sending,
-        &db.admin,
-        &db.account_data,
-        &db.appservice,
+        &db,
     )?;
 
     // Get the old room federations status
@@ -457,11 +413,7 @@ pub async fn upgrade_room_route(
         },
         sender_user,
         &replacement_room,
-        &db.globals,
-        &db.sending,
-        &db.admin,
-        &db.account_data,
-        &db.appservice,
+        &db,
     )?;
 
     // Join the new room
@@ -482,11 +434,7 @@ pub async fn upgrade_room_route(
         },
         sender_user,
         &replacement_room,
-        &db.globals,
-        &db.sending,
-        &db.admin,
-        &db.account_data,
-        &db.appservice,
+        &db,
     )?;
 
     // Recommended transferable state events list from the specs
@@ -519,11 +467,7 @@ pub async fn upgrade_room_route(
             },
             sender_user,
             &replacement_room,
-            &db.globals,
-            &db.sending,
-            &db.admin,
-            &db.account_data,
-            &db.appservice,
+            &db,
         )?;
     }
 
@@ -566,11 +510,7 @@ pub async fn upgrade_room_route(
         },
         sender_user,
         &body.room_id,
-        &db.globals,
-        &db.sending,
-        &db.admin,
-        &db.account_data,
-        &db.appservice,
+        &db,
     )?;
 
     db.flush().await?;
diff --git a/src/client_server/state.rs b/src/client_server/state.rs
index faa415de..ae5e2519 100644
--- a/src/client_server/state.rs
+++ b/src/client_server/state.rs
@@ -284,11 +284,7 @@ pub async fn send_state_event_for_key_helper(
         },
         &sender_user,
         &room_id,
-        &db.globals,
-        &db.sending,
-        &db.admin,
-        &db.account_data,
-        &db.appservice,
+        &db,
     )?;
 
     Ok(event_id)
diff --git a/src/database/admin.rs b/src/database/admin.rs
index 1fb19836..501722ee 100644
--- a/src/database/admin.rs
+++ b/src/database/admin.rs
@@ -60,11 +60,7 @@ impl Admin {
                             },
                             &conduit_user,
                             &conduit_room,
-                            &db.globals,
-                            &db.sending,
-                            &db.admin,
-                            &db.account_data,
-                            &db.appservice,
+                            &db,
                         )
                         .unwrap();
                 }
diff --git a/src/database/rooms.rs b/src/database/rooms.rs
index 81abd62d..d62d4b04 100644
--- a/src/database/rooms.rs
+++ b/src/database/rooms.rs
@@ -2,7 +2,7 @@ mod edus;
 
 pub use edus::RoomEdus;
 
-use crate::{pdu::PduBuilder, utils, Error, PduEvent, Result};
+use crate::{pdu::PduBuilder, utils, Database, Error, PduEvent, Result};
 use log::error;
 use regex::Regex;
 use ring::digest;
@@ -447,9 +447,7 @@ impl Rooms {
         mut pdu_json: CanonicalJsonObject,
         count: u64,
         pdu_id: IVec,
-        globals: &super::globals::Globals,
-        account_data: &super::account_data::AccountData,
-        admin: &super::admin::Admin,
+        db: &Database,
     ) -> Result<()> {
         // Make unsigned fields correct. This is not properly documented in the spec, but state
         // events need to have previous content in the unsigned field, so clients can easily
@@ -486,7 +484,7 @@ impl Rooms {
         // Mark as read first so the sending client doesn't get a notification even if appending
         // fails
         self.edus
-            .private_read_set(&pdu.room_id, &pdu.sender, count, &globals)?;
+            .private_read_set(&pdu.room_id, &pdu.sender, count, &db.globals)?;
 
         self.pduid_pdu.insert(
             &pdu_id,
@@ -521,8 +519,8 @@ impl Rooms {
                             )
                         })?,
                         &pdu.sender,
-                        account_data,
-                        globals,
+                        &db.account_data,
+                        &db.globals,
                     )?;
                 }
             }
@@ -540,10 +538,10 @@ impl Rooms {
                         self.tokenids.insert(key, &[])?;
                     }
 
-                    if body.starts_with(&format!("@conduit:{}: ", globals.server_name()))
+                    if body.starts_with(&format!("@conduit:{}: ", db.globals.server_name()))
                         && self
                             .id_from_alias(
-                                &format!("#admins:{}", globals.server_name())
+                                &format!("#admins:{}", db.globals.server_name())
                                     .try_into()
                                     .expect("#admins:server_name is a valid room alias"),
                             )?
@@ -570,10 +568,11 @@ impl Rooms {
                                         );
                                         match parsed_config {
                                             Ok(yaml) => {
-                                                admin.send(AdminCommand::RegisterAppservice(yaml));
+                                                db.admin
+                                                    .send(AdminCommand::RegisterAppservice(yaml));
                                             }
                                             Err(e) => {
-                                                admin.send(AdminCommand::SendMessage(
+                                                db.admin.send(AdminCommand::SendMessage(
                                                     message::MessageEventContent::text_plain(
                                                         format!(
                                                             "Could not parse appservice config: {}",
@@ -584,7 +583,7 @@ impl Rooms {
                                             }
                                         }
                                     } else {
-                                        admin.send(AdminCommand::SendMessage(
+                                        db.admin.send(AdminCommand::SendMessage(
                                             message::MessageEventContent::text_plain(
                                                 "Expected code block in command body.",
                                             ),
@@ -592,10 +591,10 @@ impl Rooms {
                                     }
                                 }
                                 "list_appservices" => {
-                                    admin.send(AdminCommand::ListAppservices);
+                                    db.admin.send(AdminCommand::ListAppservices);
                                 }
                                 _ => {
-                                    admin.send(AdminCommand::SendMessage(
+                                    db.admin.send(AdminCommand::SendMessage(
                                         message::MessageEventContent::text_plain(format!(
                                             "Command: {}, Args: {:?}",
                                             command, args
@@ -696,17 +695,12 @@ impl Rooms {
     }
 
     /// Creates a new persisted data unit and adds it to a room.
-    #[allow(clippy::too_many_arguments)]
     pub fn build_and_append_pdu(
         &self,
         pdu_builder: PduBuilder,
         sender: &UserId,
         room_id: &RoomId,
-        globals: &super::globals::Globals,
-        sending: &super::sending::Sending,
-        admin: &super::admin::Admin,
-        account_data: &super::account_data::AccountData,
-        appservice: &super::appservice::Appservice,
+        db: &Database,
     ) -> Result<EventId> {
         let PduBuilder {
             event_type,
@@ -789,7 +783,7 @@ impl Rooms {
             if !match event_type {
                 EventType::RoomEncryption => {
                     // Only allow encryption events if it's allowed in the config
-                    globals.allow_encryption()
+                    db.globals.allow_encryption()
                 }
                 EventType::RoomMember => {
                     let prev_event = self
@@ -895,13 +889,13 @@ impl Rooms {
         // Add origin because synapse likes that (and it's required in the spec)
         pdu_json.insert(
             "origin".to_owned(),
-            to_canonical_value(globals.server_name())
+            to_canonical_value(db.globals.server_name())
                 .expect("server name is a valid CanonicalJsonValue"),
         );
 
         ruma::signatures::hash_and_sign_event(
-            globals.server_name().as_str(),
-            globals.keypair(),
+            db.globals.server_name().as_str(),
+            db.globals.keypair(),
             &mut pdu_json,
             &RoomVersionId::Version6,
         )
@@ -922,24 +916,16 @@ impl Rooms {
 
         // Increment the last index and use that
         // This is also the next_batch/since value
-        let count = globals.next_count()?;
+        let count = db.globals.next_count()?;
         let mut pdu_id = room_id.as_bytes().to_vec();
         pdu_id.push(0xff);
         pdu_id.extend_from_slice(&count.to_be_bytes());
 
         // We append to state before appending the pdu, so we don't have a moment in time with the
         // pdu without it's state. This is okay because append_pdu can't fail.
-        let statehashid = self.append_to_state(&pdu_id, &pdu, &globals)?;
+        let statehashid = self.append_to_state(&pdu_id, &pdu, &db.globals)?;
 
-        self.append_pdu(
-            &pdu,
-            pdu_json,
-            count,
-            pdu_id.clone().into(),
-            globals,
-            account_data,
-            admin,
-        )?;
+        self.append_pdu(&pdu, pdu_json, count, pdu_id.clone().into(), db)?;
 
         // We set the room state after inserting the pdu, so that we never have a moment in time
         // where events in the current room state do not exist
@@ -948,31 +934,28 @@ impl Rooms {
         for server in self
             .room_servers(room_id)
             .filter_map(|r| r.ok())
-            .filter(|server| &**server != globals.server_name())
+            .filter(|server| &**server != db.globals.server_name())
         {
-            sending.send_pdu(&server, &pdu_id)?;
+            db.sending.send_pdu(&server, &pdu_id)?;
         }
 
-        for appservice in appservice.iter_all().filter_map(|r| r.ok()) {
+        for appservice in db.appservice.iter_all().filter_map(|r| r.ok()) {
             if let Some(namespaces) = appservice.1.get("namespaces") {
                 let users = namespaces
                     .get("users")
                     .and_then(|users| users.as_sequence())
-                    .map_or_else(
-                        || Vec::new(),
-                        |users| {
-                            users
-                                .iter()
-                                .map(|users| {
-                                    users
-                                        .get("regex")
-                                        .and_then(|regex| regex.as_str())
-                                        .and_then(|regex| Regex::new(regex).ok())
-                                })
-                                .filter_map(|o| o)
-                                .collect::<Vec<_>>()
-                        },
-                    );
+                    .map_or_else(Vec::new, |users| {
+                        users
+                            .iter()
+                            .map(|users| {
+                                users
+                                    .get("regex")
+                                    .and_then(|regex| regex.as_str())
+                                    .and_then(|regex| Regex::new(regex).ok())
+                            })
+                            .filter_map(|o| o)
+                            .collect::<Vec<_>>()
+                    });
                 let aliases = namespaces
                     .get("aliases")
                     .and_then(|users| users.get("regex"))
@@ -989,29 +972,31 @@ impl Rooms {
                     .get("sender_localpart")
                     .and_then(|string| string.as_str())
                     .and_then(|string| {
-                        UserId::parse_with_server_name(string, globals.server_name()).ok()
+                        UserId::parse_with_server_name(string, db.globals.server_name()).ok()
                     });
 
-                if bridge_user_id.map_or(false, |bridge_user_id| {
-                    self.is_joined(&bridge_user_id, room_id).unwrap_or(false)
-                }) || users.iter().any(|users| {
+                let user_is_joined =
+                    |bridge_user_id| self.is_joined(&bridge_user_id, room_id).unwrap_or(false);
+                let matching_users = |users: &Regex| {
                     users.is_match(pdu.sender.as_str())
                         || pdu.kind == EventType::RoomMember
                             && pdu
                                 .state_key
                                 .as_ref()
                                 .map_or(false, |state_key| users.is_match(&state_key))
-                }) || aliases.map_or(false, |aliases| {
+                };
+                let matching_aliases = |aliases: Regex| {
                     room_aliases
                         .filter_map(|r| r.ok())
                         .any(|room_alias| aliases.is_match(room_alias.as_str()))
-                }) || rooms.map_or(false, |rooms| rooms.contains(&room_id.as_str().into()))
-                    || self
-                        .room_members(&room_id)
-                        .filter_map(|r| r.ok())
-                        .any(|member| users.iter().any(|regex| regex.is_match(member.as_str())))
+                };
+
+                if bridge_user_id.map_or(false, user_is_joined)
+                    || users.iter().any(matching_users)
+                    || aliases.map_or(false, matching_aliases)
+                    || rooms.map_or(false, |rooms| rooms.contains(&room_id.as_str().into()))
                 {
-                    sending.send_pdu_appservice(&appservice.0, &pdu_id)?;
+                    db.sending.send_pdu_appservice(&appservice.0, &pdu_id)?;
                 }
             }
         }
diff --git a/src/database/sending.rs b/src/database/sending.rs
index e6cdc768..101daf3f 100644
--- a/src/database/sending.rs
+++ b/src/database/sending.rs
@@ -149,6 +149,15 @@ impl Sending {
                             let servernamepduid = key.clone();
                             let mut parts = servernamepduid.splitn(2, |&b| b == 0xff);
 
+                            let exponential_backoff = |(tries, instant): &(u32, Instant)| {
+                                // Fail if a request has failed recently (exponential backoff)
+                                let mut min_elapsed_duration = Duration::from_secs(60) * (*tries) * (*tries);
+                                if min_elapsed_duration > Duration::from_secs(60*60*24) {
+                                    min_elapsed_duration = Duration::from_secs(60*60*24);
+                                }
+
+                                instant.elapsed() < min_elapsed_duration
+                            };
                             if let Some((server, is_appservice, pdu_id)) = utils::string_from_bytes(
                                     parts
                                         .next()
@@ -173,15 +182,7 @@ impl Sending {
                                     .map(|pdu_id| (server, is_appservice, pdu_id))
                                 )
                                 .filter(|(server, is_appservice, _)| {
-                                    if last_failed_try.get(server).map_or(false, |(tries, instant)| {
-                                        // Fail if a request has failed recently (exponential backoff)
-                                        let mut min_elapsed_duration = Duration::from_secs(60) * *tries * *tries;
-                                        if min_elapsed_duration > Duration::from_secs(60*60*24) {
-                                            min_elapsed_duration = Duration::from_secs(60*60*24);
-                                        }
-
-                                        instant.elapsed() < min_elapsed_duration
-                                    }) {
+                                    if last_failed_try.get(server).map_or(false, exponential_backoff) {
                                         return false;
                                     }
 
diff --git a/src/error.rs b/src/error.rs
index fed545ce..13efce67 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -121,10 +121,12 @@ impl log::Log for ConduitLogger {
     fn log(&self, record: &log::Record<'_>) {
         let output = format!("{} - {}", record.level(), record.args());
 
+        let match_mod_path =
+            |path: &str| path.starts_with("conduit::") || path.starts_with("state");
+
         if self.enabled(record.metadata())
-            && (record.module_path().map_or(false, |path| {
-                path.starts_with("conduit::") || path.starts_with("state")
-            }) || record
+            && (record.module_path().map_or(false, match_mod_path)
+                || record
                     .module_path()
                     .map_or(true, |path| !path.starts_with("rocket::")) // Rockets logs are annoying
                     && record.metadata().level() <= log::Level::Warn)
diff --git a/src/server_server.rs b/src/server_server.rs
index 6907e346..ae59583b 100644
--- a/src/server_server.rs
+++ b/src/server_server.rs
@@ -1113,9 +1113,7 @@ fn append_state(db: &Database, pdu: &PduEvent) -> Result<()> {
         utils::to_canonical_object(pdu).expect("Pdu is valid canonical object"),
         count,
         pdu_id.clone().into(),
-        &db.globals,
-        &db.account_data,
-        &db.admin,
+        &db,
     )?;
 
     // We set the room state after inserting the pdu, so that we never have a moment in time