summaryrefslogtreecommitdiff
path: root/src/database
diff options
context:
space:
mode:
authorTimo Kösters <timo@koesters.xyz>2023-02-21 00:56:26 +0100
committerTimo Kösters <timo@koesters.xyz>2023-03-13 10:39:17 +0100
commit17a6431f5f145f1c28977bda344639f6e93b9699 (patch)
treef6e6f474987f314907a4cae1af293cd482282f3b /src/database
parentfcfb06ffa65c84de3253dbebae98faa5b6025d51 (diff)
downloadconduit-17a6431f5f145f1c28977bda344639f6e93b9699.zip
fix: make backfilled events reachable
Diffstat (limited to 'src/database')
-rw-r--r--src/database/key_value/rooms/timeline.rs137
1 files changed, 75 insertions, 62 deletions
diff --git a/src/database/key_value/rooms/timeline.rs b/src/database/key_value/rooms/timeline.rs
index 9f2c607..7a33e5d 100644
--- a/src/database/key_value/rooms/timeline.rs
+++ b/src/database/key_value/rooms/timeline.rs
@@ -10,28 +10,6 @@ use crate::{database::KeyValueDatabase, service, services, utils, Error, PduEven
use service::rooms::timeline::PduCount;
impl service::rooms::timeline::Data for KeyValueDatabase {
- fn first_pdu_in_room(&self, room_id: &RoomId) -> Result<Option<Arc<PduEvent>>> {
- let prefix = services()
- .rooms
- .short
- .get_shortroomid(room_id)?
- .expect("room exists")
- .to_be_bytes()
- .to_vec();
-
- // Look for PDUs in that room.
- self.pduid_pdu
- .iter_from(&prefix, false)
- .filter(|(k, _)| k.starts_with(&prefix))
- .map(|(_, pdu)| {
- serde_json::from_slice(&pdu)
- .map_err(|_| Error::bad_database("Invalid first PDU in db."))
- .map(Arc::new)
- })
- .next()
- .transpose()
- }
-
fn last_timeline_count(&self, sender_user: &UserId, room_id: &RoomId) -> Result<PduCount> {
match self
.lasttimelinecount_cache
@@ -81,20 +59,18 @@ impl service::rooms::timeline::Data for KeyValueDatabase {
/// Returns the json of a pdu.
fn get_pdu_json(&self, event_id: &EventId) -> Result<Option<CanonicalJsonObject>> {
- self.eventid_pduid
- .get(event_id.as_bytes())?
- .map_or_else(
- || self.eventid_outlierpdu.get(event_id.as_bytes()),
- |pduid| {
- Ok(Some(self.pduid_pdu.get(&pduid)?.ok_or_else(|| {
- Error::bad_database("Invalid pduid in eventid_pduid.")
- })?))
- },
- )?
- .map(|pdu| {
- serde_json::from_slice(&pdu).map_err(|_| Error::bad_database("Invalid PDU in db."))
- })
- .transpose()
+ self.get_non_outlier_pdu_json(event_id)?.map_or_else(
+ || {
+ self.eventid_outlierpdu
+ .get(event_id.as_bytes())?
+ .map(|pdu| {
+ serde_json::from_slice(&pdu)
+ .map_err(|_| Error::bad_database("Invalid PDU in db."))
+ })
+ .transpose()
+ },
+ |x| Ok(Some(x)),
+ )
}
/// Returns the json of a pdu.
@@ -107,6 +83,21 @@ impl service::rooms::timeline::Data for KeyValueDatabase {
.ok_or_else(|| Error::bad_database("Invalid pduid in eventid_pduid."))
})
.transpose()?
+ .map_or_else(
+ || {
+ Ok::<_, Error>(
+ self.eventid_backfillpduid
+ .get(event_id.as_bytes())?
+ .map(|pduid| {
+ self.pduid_backfillpdu.get(&pduid)?.ok_or_else(|| {
+ Error::bad_database("Invalid pduid in eventid_pduid.")
+ })
+ })
+ .transpose()?,
+ )
+ },
+ |x| Ok(Some(x)),
+ )?
.map(|pdu| {
serde_json::from_slice(&pdu).map_err(|_| Error::bad_database("Invalid PDU in db."))
})
@@ -115,7 +106,10 @@ impl service::rooms::timeline::Data for KeyValueDatabase {
/// Returns the pdu's id.
fn get_pdu_id(&self, event_id: &EventId) -> Result<Option<Vec<u8>>> {
- self.eventid_pduid.get(event_id.as_bytes())
+ Ok(self.eventid_pduid.get(event_id.as_bytes())?.map_or_else(
+ || self.eventid_backfillpduid.get(event_id.as_bytes()),
+ |x| Ok(Some(x)),
+ )?)
}
/// Returns the pdu.
@@ -130,6 +124,21 @@ impl service::rooms::timeline::Data for KeyValueDatabase {
.ok_or_else(|| Error::bad_database("Invalid pduid in eventid_pduid."))
})
.transpose()?
+ .map_or_else(
+ || {
+ Ok::<_, Error>(
+ self.eventid_backfillpduid
+ .get(event_id.as_bytes())?
+ .map(|pduid| {
+ self.pduid_backfillpdu.get(&pduid)?.ok_or_else(|| {
+ Error::bad_database("Invalid pduid in eventid_pduid.")
+ })
+ })
+ .transpose()?,
+ )
+ },
+ |x| Ok(Some(x)),
+ )?
.map(|pdu| {
serde_json::from_slice(&pdu).map_err(|_| Error::bad_database("Invalid PDU in db."))
})
@@ -145,22 +154,20 @@ impl service::rooms::timeline::Data for KeyValueDatabase {
}
if let Some(pdu) = self
- .eventid_pduid
- .get(event_id.as_bytes())?
+ .get_non_outlier_pdu(event_id)?
.map_or_else(
- || self.eventid_outlierpdu.get(event_id.as_bytes()),
- |pduid| {
- Ok(Some(self.pduid_pdu.get(&pduid)?.ok_or_else(|| {
- Error::bad_database("Invalid pduid in eventid_pduid.")
- })?))
+ || {
+ self.eventid_outlierpdu
+ .get(event_id.as_bytes())?
+ .map(|pdu| {
+ serde_json::from_slice(&pdu)
+ .map_err(|_| Error::bad_database("Invalid PDU in db."))
+ })
+ .transpose()
},
+ |x| Ok(Some(x)),
)?
- .map(|pdu| {
- serde_json::from_slice(&pdu)
- .map_err(|_| Error::bad_database("Invalid PDU in db."))
- .map(Arc::new)
- })
- .transpose()?
+ .map(Arc::new)
{
self.pdu_cache
.lock()
@@ -176,22 +183,28 @@ impl service::rooms::timeline::Data for KeyValueDatabase {
///
/// This does __NOT__ check the outliers `Tree`.
fn get_pdu_from_id(&self, pdu_id: &[u8]) -> Result<Option<PduEvent>> {
- self.pduid_pdu.get(pdu_id)?.map_or(Ok(None), |pdu| {
- Ok(Some(
- serde_json::from_slice(&pdu)
- .map_err(|_| Error::bad_database("Invalid PDU in db."))?,
- ))
- })
+ self.pduid_pdu
+ .get(pdu_id)?
+ .map_or_else(|| self.pduid_backfillpdu.get(pdu_id), |x| Ok(Some(x)))?
+ .map_or(Ok(None), |pdu| {
+ Ok(Some(
+ serde_json::from_slice(&pdu)
+ .map_err(|_| Error::bad_database("Invalid PDU in db."))?,
+ ))
+ })
}
/// Returns the pdu as a `BTreeMap<String, CanonicalJsonValue>`.
fn get_pdu_json_from_id(&self, pdu_id: &[u8]) -> Result<Option<CanonicalJsonObject>> {
- self.pduid_pdu.get(pdu_id)?.map_or(Ok(None), |pdu| {
- Ok(Some(
- serde_json::from_slice(&pdu)
- .map_err(|_| Error::bad_database("Invalid PDU in db."))?,
- ))
- })
+ self.pduid_pdu
+ .get(pdu_id)?
+ .map_or_else(|| self.pduid_backfillpdu.get(pdu_id), |x| Ok(Some(x)))?
+ .map_or(Ok(None), |pdu| {
+ Ok(Some(
+ serde_json::from_slice(&pdu)
+ .map_err(|_| Error::bad_database("Invalid PDU in db."))?,
+ ))
+ })
}
fn append_pdu(