use std::collections::HashSet;
use crate::timeline::TimelineValue;
#[derive(Debug, Default)]
pub(crate) struct CbReplayState {
pub partition_keys: Vec<Option<u64>>,
pub partition_last_tv: Vec<Option<TimelineValue>>,
pub partition_slot_keys: Vec<Option<HashSet<u64>>>,
}
impl CbReplayState {
pub fn new() -> Self {
Self::default()
}
pub fn ensure_partition_vecs(&mut self, partition_count: usize) {
if self.partition_keys.len() != partition_count {
self.partition_keys = vec![None; partition_count];
self.partition_slot_keys = vec![None; partition_count];
self.partition_last_tv = vec![None; partition_count];
}
}
pub fn invalidate(&mut self) {
for key in &mut self.partition_keys {
*key = None;
}
for keys in &mut self.partition_slot_keys {
*keys = None;
}
for tv in &mut self.partition_last_tv {
*tv = None;
}
}
pub fn record_last_tv(&mut self, part_idx: usize, tv: TimelineValue) {
self.partition_last_tv[part_idx] = Some(tv);
}
pub fn record_merged_last_tvs(&mut self, part_idx: usize, tv: TimelineValue) {
self.partition_last_tv[part_idx] = Some(tv);
self.partition_last_tv[part_idx + 1] = Some(tv);
}
pub fn last_tvs(&self) -> &[Option<TimelineValue>] {
&self.partition_last_tv
}
pub fn all_backend_keys(&self) -> HashSet<u64> {
let mut keys = HashSet::new();
for key in self.partition_keys.iter().flatten() {
keys.insert(*key);
}
for slot_keys in self.partition_slot_keys.iter().flatten() {
keys.extend(slot_keys.iter().copied());
}
keys
}
pub fn release_backend(&mut self, ctx: &crate::Context) {
let handle = ctx.backend_handle();
let session = ctx.submit_session();
for key in self.all_backend_keys() {
session.evict_retained(handle, key);
}
self.invalidate();
}
}
#[inline]
pub(crate) fn cb_replay_disabled() -> bool {
crate::validation_env::retained_cb_reuse_disabled()
}