use std::path::PathBuf;
use bytes::Bytes;
use crate::error::RemoteStorageError;
use crate::metadata::{CustomMetadata, RemoteLogSegmentMetadata};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum IndexType {
Offset,
Timestamp,
ProducerSnapshot,
LeaderEpoch,
Transaction,
}
impl IndexType {
#[must_use]
pub fn suffix(self) -> &'static str {
match self {
IndexType::Offset => ".index",
IndexType::Timestamp => ".timeindex",
IndexType::ProducerSnapshot => ".snapshot",
IndexType::LeaderEpoch => ".leader-epoch-checkpoint",
IndexType::Transaction => ".txnindex",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct LogSegmentData {
pub log_segment: PathBuf,
pub offset_index: PathBuf,
pub time_index: PathBuf,
pub transaction_index: Option<PathBuf>,
pub producer_snapshot_index: Option<PathBuf>,
pub leader_epoch_index: Bytes,
}
pub trait RemoteStorageManager: Send + Sync {
fn copy_log_segment_data(
&self,
metadata: &RemoteLogSegmentMetadata,
data: &LogSegmentData,
) -> Result<Option<CustomMetadata>, RemoteStorageError>;
fn fetch_log_segment(
&self,
metadata: &RemoteLogSegmentMetadata,
start_position: u32,
end_position: Option<u32>,
) -> Result<Vec<u8>, RemoteStorageError>;
fn fetch_index(
&self,
metadata: &RemoteLogSegmentMetadata,
index_type: IndexType,
) -> Result<Vec<u8>, RemoteStorageError>;
fn delete_log_segment_data(
&self,
metadata: &RemoteLogSegmentMetadata,
) -> Result<(), RemoteStorageError>;
}