in glean-core/src/event_database/mod.rs [223:263]
fn load_events_from_disk(
&self,
glean: &Glean,
trim_data_to_registered_pings: bool,
) -> Result<()> {
// NOTE: The order of locks here is important.
// In other code parts we might acquire the `file_lock` when we already have acquired
// a lock on `event_stores`.
// This is a potential lock-order-inversion.
let mut db = self.event_stores.write().unwrap(); // safe unwrap, only error case is poisoning
let _lock = self.file_lock.lock().unwrap(); // safe unwrap, only error case is poisoning
for entry in fs::read_dir(&self.path)? {
let entry = entry?;
if entry.file_type()?.is_file() {
let store_name = entry.file_name().into_string()?;
log::info!("Loading events for {}", store_name);
if trim_data_to_registered_pings && glean.get_ping_by_name(&store_name).is_none() {
log::warn!("Trimming {}'s events", store_name);
if let Err(err) = fs::remove_file(entry.path()) {
match err.kind() {
std::io::ErrorKind::NotFound => {
// silently drop this error, the file was already non-existing
}
_ => log::warn!("Error trimming events file '{}': {}", store_name, err),
}
}
continue;
}
let file = BufReader::new(File::open(entry.path())?);
db.insert(
store_name,
file.lines()
.map_while(Result::ok)
.filter_map(|line| serde_json::from_str::<StoredEvent>(&line).ok())
.collect(),
);
}
}
Ok(())
}