···
109
+
fn get_part_opts() -> PartitionCreateOptions {
110
+
PartitionCreateOptions::default()
111
+
.compression(fjall::CompressionType::Miniz(9))
112
+
.compaction_strategy(fjall::compaction::Strategy::Fifo(fjall::compaction::Fifo {
113
+
limit: 5 * 1024 * 1024 * 1024, // 5 gb
114
+
ttl_seconds: Some(60 * 60 * 24 * 30), // 30 days
119
+
fn maybe_run_in_nsid_tree<T>(&self, nsid: &str, f: impl FnOnce(&Partition) -> T) -> Option<T> {
120
+
let _guard = scc::ebr::Guard::new();
121
+
let handle = match self.hits.peek(nsid, &_guard) {
122
+
Some(handle) => handle.clone(),
124
+
if self.inner.partition_exists(nsid) {
127
+
.open_partition(nsid, Self::get_part_opts())
128
+
.expect("cant open partition");
129
+
let _ = self.hits.insert(SmolStr::new(nsid), handle.clone());
···
.entry(SmolStr::new(nsid))
118
-
let opts = PartitionCreateOptions::default()
119
-
.compression(fjall::CompressionType::Miniz(9))
120
-
.compaction_strategy(fjall::compaction::Strategy::Fifo(
121
-
fjall::compaction::Fifo {
122
-
limit: 5 * 1024 * 1024 * 1024, // 5 gb
123
-
ttl_seconds: Some(60 * 60 * 24 * 30), // 30 days
149
+
let opts = Self::get_part_opts();
self.inner.open_partition(nsid, opts).unwrap()
···
range: impl RangeBounds<u64>,
206
-
) -> AppResult<Box<dyn Iterator<Item = AppResult<(u64, NsidHit)>>>> {
230
+
) -> BoxedIter<AppResult<(u64, NsidHit)>> {
let start = range.start_bound().cloned().map(u64::to_be_bytes);
let end = range.end_bound().cloned().map(u64::to_be_bytes);
210
-
let _guard = scc::ebr::Guard::new();
211
-
let Some(tree) = self.hits.peek(nsid, &_guard) else {
212
-
return Ok(Box::new(std::iter::empty()));
215
-
Ok(Box::new(tree.range(TimestampRangeOld { start, end }).map(
234
+
self.maybe_run_in_nsid_tree(nsid, |tree| -> BoxedIter<AppResult<(u64, NsidHit)>> {
235
+
Box::new(tree.range(TimestampRangeOld { start, end }).map(|res| {
res.map_err(AppError::from).map(|(key, val)| {
u64::from_be_bytes(key.as_ref().try_into().unwrap()),
unsafe { rkyv::from_bytes_unchecked::<_, Error>(&val).unwrap_unchecked() },
244
+
.unwrap_or_else(|| Box::new(std::iter::empty()))
pub fn tracking_since(&self) -> AppResult<u64> {
228
-
let _guard = scc::ebr::Guard::new();
// HACK: we should actually store when we started tracking but im lazy
// should be accurate enough
231
-
let Some(tree) = self.hits.peek("app.bsky.feed.like", &_guard) else {
234
-
let Some((timestamp_raw, _)) = tree.first_key_value()? else {
239
-
Ok(u64::from_be_bytes(
240
-
timestamp_raw.as_ref().try_into().unwrap(),
250
+
self.maybe_run_in_nsid_tree("app.bsky.feed.like", |tree| {
251
+
let Some((timestamp_raw, _)) = tree.first_key_value()? else {
254
+
Ok(u64::from_be_bytes(
255
+
timestamp_raw.as_ref().try_into().unwrap(),
···
pub fn tracking_since(&self) -> AppResult<u64> {
535
-
let _guard = scc::ebr::Guard::new();
// HACK: we should actually store when we started tracking but im lazy
// should be accurate enough
538
-
let Some(handle) = self.hits.peek("app.bsky.feed.like", &_guard) else {
541
-
let Some((timestamps_raw, _)) = handle.tree.first_key_value()? else {
546
-
let mut timestamp_reader = Cursor::new(timestamps_raw);
548
-
.read_varint::<u64>()
549
-
.map_err(AppError::from)
554
+
self.maybe_run_in_nsid_tree("app.bsky.feed.like", |handle| {
555
+
let Some((timestamps_raw, _)) = handle.tree.first_key_value()? else {
558
+
let mut timestamp_reader = Cursor::new(timestamps_raw);
560
+
.read_varint::<u64>()
561
+
.map_err(AppError::from)