Skip to content

Commit 07d05f7

Browse files
committed
fix key len bug
1 parent ce63363 commit 07d05f7

3 files changed

Lines changed: 19 additions & 18 deletions

File tree

libsql-wal/src/registry.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -521,7 +521,7 @@ where
521521
let mut seen = RoaringBitmap::new();
522522
let replicator = StorageReplicator::new(storage, shared.namespace().clone());
523523
let stream = replicator
524-
.stream(&mut seen, local_current_frame_no, 1)
524+
.stream(&mut seen, remote_durable_frame_no, 1)
525525
.peekable();
526526
let mut injector = Injector::new(shared.clone(), 10)?;
527527
// use pin to the heap so that we can drop the stream in the loop, and count `seen`.

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

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -198,12 +198,14 @@ impl<IO: Io> S3Backend<IO> {
198198
folder_key: &FolderKey<'_>,
199199
frame_no: u64,
200200
) -> Result<Option<SegmentKey>> {
201+
let lookup_key_prefix = s3_segment_index_lookup_key_prefix(&folder_key);
201202
let lookup_key = s3_segment_index_lookup_key(&folder_key, frame_no);
202203

203204
let objects = self
204205
.client
205206
.list_objects_v2()
206207
.bucket(&config.bucket)
208+
.prefix(lookup_key_prefix)
207209
.start_after(lookup_key)
208210
.send()
209211
.await
@@ -214,15 +216,10 @@ impl<IO: Io> S3Backend<IO> {
214216
};
215217
let key = contents.key().expect("misssing key?");
216218
let key_path: &Path = key.as_ref();
217-
let segment_key: SegmentKey = key_path
218-
.file_stem()
219-
.expect("invalid key")
220-
.to_str()
221-
.expect("invalid key")
222-
.parse()
223-
.expect("invalid key");
224-
225-
Ok(Some(segment_key))
219+
220+
let key = SegmentKey::validate_from_path(key_path, &folder_key.namespace);
221+
222+
Ok(key)
226223
}
227224

228225
// This method could probably be optimized a lot by using indexes and only downloading useful
@@ -335,8 +332,12 @@ fn s3_segment_index_key(folder_key: &FolderKey, segment_key: &SegmentKey) -> Str
335332
format!("{folder_key}/indexes/{segment_key}")
336333
}
337334

335+
fn s3_segment_index_lookup_key_prefix(folder_key: &FolderKey) -> String {
336+
format!("{folder_key}/indexes/")
337+
}
338+
338339
fn s3_segment_index_lookup_key(folder_key: &FolderKey, frame_no: u64) -> String {
339-
format!("{folder_key}/indexes/{:019}", u64::MAX - frame_no)
340+
format!("{folder_key}/indexes/{:020}", u64::MAX - frame_no)
340341
}
341342

342343
impl<IO> Backend for S3Backend<IO>

libsql-wal/src/storage/mod.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,12 @@ pub enum RestoreOptions {
5252
/// let meta = SegmentMeta { start_frame_no: 101, end_frame_no: 1000 };
5353
/// map.insert(SegmentKey(&meta).to_string(), meta);
5454
///
55-
/// map.range(format!("{:019}", u64::MAX - 50)..).next();
56-
/// map.range(format!("{:019}", u64::MAX - 0)..).next();
57-
/// map.range(format!("{:019}", u64::MAX - 1)..).next();
58-
/// map.range(format!("{:019}", u64::MAX - 100)..).next();
59-
/// map.range(format!("{:019}", u64::MAX - 101)..).next();
60-
/// map.range(format!("{:019}", u64::MAX - 5000)..).next();
55+
/// map.range(format!("{:020}", u64::MAX - 50)..).next();
56+
/// map.range(format!("{:020}", u64::MAX - 0)..).next();
57+
/// map.range(format!("{:020}", u64::MAX - 1)..).next();
58+
/// map.range(format!("{:020}", u64::MAX - 100)..).next();
59+
/// map.range(format!("{:020}", u64::MAX - 101)..).next();
60+
/// map.range(format!("{:020}", u64::MAX - 5000)..).next();
6161
/// ```
6262
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6363
pub struct SegmentKey {
@@ -137,7 +137,7 @@ impl fmt::Display for SegmentKey {
137137
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
138138
write!(
139139
f,
140-
"{:019}-{:019}",
140+
"{:020}-{:020}",
141141
u64::MAX - self.start_frame_no,
142142
u64::MAX - self.end_frame_no,
143143
)

0 commit comments

Comments
 (0)