diff --git a/src/admin/debug/commands.rs b/src/admin/debug/commands.rs index e6d92fca..8cc207eb 100644 --- a/src/admin/debug/commands.rs +++ b/src/admin/debug/commands.rs @@ -922,7 +922,11 @@ pub(super) async fn trim_memory(&self) -> Result { } #[admin_command] -pub(super) async fn force_append_latest_extremity(&self, room_id: OwnedRoomId) -> Result { +pub(super) async fn force_append_latest_extremity( + &self, + room_id: OwnedRoomId, + event_id: Option, +) -> Result { let lock = self.services.rooms.state.mutex.lock(&*room_id).await; let mut extremities: Vec<&EventId> = self .services @@ -932,17 +936,21 @@ pub(super) async fn force_append_latest_extremity(&self, room_id: OwnedRoomId) - .collect() .await; - let latest_pdu = self - .services - .rooms - .timeline - .latest_pdu_in_room(&room_id) - .await - .map_err(|_| err!(Database("Failed to find the latest PDU in database")))?; + let selected_id = if let Some(event_id) = event_id { + event_id + } else { + self.services + .rooms + .timeline + .latest_pdu_in_room(&room_id) + .await + .map_err(|_| err!(Database("Failed to find the latest PDU in database")))? + .event_id() + .to_owned() + }; - let pdu_id = latest_pdu.event_id(); - if !extremities.contains(&pdu_id) { - extremities.push(pdu_id); + if !extremities.contains(&selected_id.as_ref()) { + extremities.push(&selected_id); } self.services diff --git a/src/admin/debug/mod.rs b/src/admin/debug/mod.rs index b924bf4f..1253540e 100644 --- a/src/admin/debug/mod.rs +++ b/src/admin/debug/mod.rs @@ -237,9 +237,14 @@ pub enum DebugCommand { level: Option, }, + /// - Forcefully add the latest known event in the specified room as a + /// forward extremity. Use with caution. ForceAppendLatestExtremity { /// The room ID room_id: OwnedRoomId, + /// If set, forcefully picks an event ID to use as an extremity. Is not + /// validated. + event_id: Option, }, /// - Developer test stubs