use std::fs;
use super::RangeIndexManager;
use crate::{error::Result, stub::RangeIndexStub};
impl RangeIndexManager {
pub fn on_flush(&self, key: &[u8], stub: &mut RangeIndexStub) -> Result<()> {
self.on_flush_internal(key, stub, None)
}
pub fn on_flush_address(
&self,
key: &[u8],
stub: &mut RangeIndexStub,
logical_address: i64,
) -> Result<()> {
self.on_flush_internal(key, stub, Some(logical_address))
}
fn on_flush_internal(
&self,
key: &[u8],
stub: &mut RangeIndexStub,
logical_address: Option<i64>,
) -> Result<()> {
if stub.is_transferred() {
return Ok(());
}
let key_id = Self::key_id_of(key);
let hash_prefix = Self::base32_prefix_of(key);
let flush_path = match logical_address {
Some(addr) => {
self.notice_addr_flush_files();
self.log_flush_path(&hash_prefix, addr)
}
None => self.bare_flush_path(&hash_prefix),
};
if let Some((entry, tree)) = self.live_tree_of(key_id) {
entry.snapshot_under_claim(&tree, &flush_path)?;
stub.set_flushed(true);
return Ok(());
}
let key_hash = Self::key_hash_of(key);
let _stripe_lock = self.locks.read(key_hash);
if let Some((entry, tree)) = self.live_tree_of(key_id) {
entry.snapshot_under_claim(&tree, &flush_path)?;
stub.set_flushed(true);
return Ok(());
}
let data_path = self.data_file_path(&hash_prefix);
if data_path.exists() {
fs::copy(&data_path, &flush_path)?;
stub.set_flushed(true);
}
Ok(())
}
}