add conduwuit-specific db migration fixing double split db entries

for a few months now we accidentally had double 0xFF splits being
inserted into `roomuserid_joined` cf when membership counts and such
are being updated.

this is a conduwuit-specific db migration and does NOT break conduit
compatibility.

`fix_bad_double_separator_in_state_cache`

Signed-off-by: strawberry <strawberry@puppygock.gay>
This commit is contained in:
strawberry 2024-06-08 16:58:24 -04:00
parent ab5db37851
commit 7f5b59afbb

View file

@ -6,6 +6,7 @@ use std::{
sync::Arc, sync::Arc,
}; };
use conduit::{debug_info, debug_warn};
use database::KeyValueDatabase; use database::KeyValueDatabase;
use itertools::Itertools; use itertools::Itertools;
use ruma::{ use ruma::{
@ -547,6 +548,37 @@ pub(crate) async fn migrations(db: &KeyValueDatabase, config: &Config) -> Result
} }
} }
if db
.global
.get(b"fix_bad_double_separator_in_state_cache")?
.is_none()
{
warn!("Fixing bad double separator in state_cache roomuserid_joined");
let mut iter_count: usize = 0;
for (mut key, value) in db.roomuserid_joined.iter() {
iter_count = iter_count.saturating_add(1);
debug_info!(%iter_count);
let first_sep_index = key.iter().position(|&i| i == 0xFF).unwrap();
if key
.iter()
.get(first_sep_index..=first_sep_index + 1)
.copied()
.collect_vec() == vec![0xFF, 0xFF]
{
debug_warn!("Found bad key: {key:?}");
db.roomuserid_joined.remove(&key)?;
key.remove(first_sep_index);
debug_warn!("Fixed key: {key:?}");
db.roomuserid_joined.insert(&key, &value)?;
}
}
db.global
.insert(b"fix_bad_double_separator_in_state_cache", &[])?;
}
assert_eq!( assert_eq!(
services().globals.database_version().unwrap(), services().globals.database_version().unwrap(),
latest_database_version, latest_database_version,
@ -614,6 +646,9 @@ pub(crate) async fn migrations(db: &KeyValueDatabase, config: &Config) -> Result
.globals .globals
.bump_database_version(latest_database_version)?; .bump_database_version(latest_database_version)?;
db.global
.insert(b"fix_bad_double_separator_in_state_cache", &[])?;
// Create the admin room and server user on first run // Create the admin room and server user on first run
services().admin.create_admin_room().await?; services().admin.create_admin_room().await?;