Skip to content

Commit 8555dab

Browse files
committed
change semantics of find frame
1 parent 3522e1a commit 8555dab

4 files changed

Lines changed: 15 additions & 14 deletions

File tree

libsql-wal/src/storage/backend/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#![allow(dead_code)]
22
use std::sync::Arc;
3-
use std::{future::Future, path::Path};
3+
use std::future::Future;
44

55
use chrono::{DateTime, Utc};
66
use fst::Map;
@@ -31,9 +31,10 @@ pub struct DbMeta {
3131
pub max_frame_no: u64,
3232
}
3333

34+
#[derive(Debug, Clone, Copy)]
3435
pub enum FindSegmentReq {
3536
/// returns a segment containing this frame
36-
Frame(u64),
37+
EndFrameNoLessThan(u64),
3738
/// Returns the segment with closest timestamp less than or equal to the requested timestamp
3839
Timestamp(DateTime<Utc>),
3940
}

libsql-wal/src/storage/backend/s3.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ impl<IO: Io> S3Backend<IO> {
210210
frame_no: u64,
211211
) -> Result<Option<SegmentKey>> {
212212
let lookup_key_prefix = s3_segment_index_lookup_key_prefix(&folder_key);
213-
let lookup_key = s3_segment_index_lookup_key(&folder_key, frame_no);
213+
let lookup_key = s3_segment_index_ends_before_lookup_key(&folder_key, frame_no);
214214

215215
let objects = self
216216
.client
@@ -527,7 +527,8 @@ impl fmt::Display for SegmentIndexLookupKey<'_> {
527527
}
528528
}
529529

530-
fn s3_segment_index_lookup_key<'a>(
530+
/// return the biggest segment whose end frame number is less than frame_no
531+
fn s3_segment_index_ends_before_lookup_key<'a>(
531532
folder_key: &'a FolderKey,
532533
frame_no: u64,
533534
) -> SegmentIndexLookupKey<'a> {
@@ -658,14 +659,14 @@ where
658659
};
659660

660661
match req {
661-
FindSegmentReq::Frame(frame_no) => self
662+
FindSegmentReq::EndFrameNoLessThan(frame_no) => self
662663
.find_segment_by_frame_no(config, &folder_key, frame_no)
663664
.await?
664-
.ok_or_else(|| Error::FrameNotFound(frame_no)),
665+
.ok_or_else(|| Error::SegmentNotFound(req)),
665666
FindSegmentReq::Timestamp(ts) => self
666667
.find_segment_by_timestamp(config, &folder_key, ts)
667668
.await?
668-
.ok_or_else(|| Error::SegmentNotFoundTimestamp(ts)),
669+
.ok_or_else(|| Error::SegmentNotFound(req)),
669670
}
670671
}
671672

libsql-wal/src/storage/error.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::panic::Location;
22

3-
use chrono::{DateTime, Utc};
3+
use super::backend::FindSegmentReq;
44

55
#[derive(thiserror::Error, Debug)]
66
pub enum Error {
@@ -10,10 +10,8 @@ pub enum Error {
1010
Store(String),
1111
#[error("error compacting segment: {0}")]
1212
Compact(#[from] crate::error::Error),
13-
#[error("frame not {0} found")]
14-
FrameNotFound(u64),
15-
#[error("No satisfying segment found for timestamp {0}")]
16-
SegmentNotFoundTimestamp(DateTime<Utc>),
13+
#[error("segment not found for request {0:?}")]
14+
SegmentNotFound(FindSegmentReq),
1715
#[error("unhandled storage error: {error}, in {context}")]
1816
UnhandledStorageError {
1917
error: Box<dyn std::error::Error + Send + Sync + 'static>,

libsql-wal/src/storage/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -569,9 +569,10 @@ impl<IO: Io> Storage for TestStorage<IO> {
569569
) -> Result<SegmentKey> {
570570
let inner = self.inner.lock().await;
571571
if inner.store {
572+
let FindSegmentReq::EndFrameNoLessThan(fno) = req else { panic!("unsupported lookup by ts") };
572573
if let Some(segs) = inner.stored.get(namespace) {
573-
let Some((key, _path)) = segs.iter().find(|(k, _)| k.includes(frame_no)) else {
574-
return Err(Error::FrameNotFound(frame_no));
574+
let Some((key, _path)) = segs.iter().find(|(k, _)| k.includes(fno)) else {
575+
return Err(Error::SegmentNotFound(req));
575576
};
576577
return Ok(*key);
577578
} else {

0 commit comments

Comments
 (0)