Skip to content

Commit 785c1c3

Browse files
committed
use fmt object rather than key string
avoid a bunch of unecessary clones
1 parent f238723 commit 785c1c3

1 file changed

Lines changed: 48 additions & 16 deletions

File tree

  • libsql-wal/src/storage/backend

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

Lines changed: 48 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! S3 implementation of storage backend
22
3-
use std::fmt;
3+
use std::fmt::{self, Formatter};
44
use std::mem::size_of;
55
use std::path::Path;
66
use std::pin::Pin;
@@ -150,24 +150,24 @@ impl<IO: Io> S3Backend<IO> {
150150
Ok(header)
151151
}
152152

153-
async fn s3_get(&self, config: &S3Config, key: String) -> Result<ByteStream> {
153+
async fn s3_get(&self, config: &S3Config, key: impl ToString) -> Result<GetObjectOutput> {
154154
Ok(self
155155
.client
156156
.get_object()
157157
.bucket(&config.bucket)
158-
.key(key)
158+
.key(key.to_string())
159159
.send()
160160
.await
161161
.map_err(|e| Error::unhandled(e, "error sending s3 GET request"))?
162162
.body)
163163
}
164164

165-
async fn s3_put(&self, config: &S3Config, key: String, body: ByteStream) -> Result<()> {
165+
async fn s3_put(&self, config: &S3Config, key: impl ToString, body: ByteStream) -> Result<()> {
166166
self.client
167167
.put_object()
168168
.bucket(&config.bucket)
169169
.body(body)
170-
.key(key)
170+
.key(key.to_string())
171171
.send()
172172
.await
173173
.map_err(|e| Error::unhandled(e, "error sending s3 PUT request"))?;
@@ -212,8 +212,8 @@ impl<IO: Io> S3Backend<IO> {
212212
.client
213213
.list_objects_v2()
214214
.bucket(&config.bucket)
215-
.prefix(lookup_key_prefix)
216-
.start_after(lookup_key)
215+
.prefix(lookup_key_prefix.to_string())
216+
.start_after(lookup_key.to_string())
217217
.send()
218218
.await
219219
.map_err(|e| Error::unhandled(e, "failed to list bucket"))?;
@@ -325,7 +325,7 @@ impl<IO: Io> S3Backend<IO> {
325325
.client
326326
.list_objects_v2()
327327
.bucket(&config.bucket)
328-
.prefix(lookup_key_prefix.clone())
328+
.prefix(lookup_key_prefix.to_string())
329329
.set_continuation_token(continuation_token.take())
330330
.send()
331331
.await
@@ -377,20 +377,52 @@ impl fmt::Display for FolderKey<'_> {
377377
}
378378
}
379379

380-
fn s3_segment_data_key(folder_key: &FolderKey, segment_key: &SegmentKey) -> String {
381-
format!("{folder_key}/segments/{segment_key}")
380+
pub struct SegmentDataKey<'a>(&'a FolderKey<'a>, &'a SegmentKey);
381+
382+
impl fmt::Display for SegmentDataKey<'_> {
383+
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
384+
write!(f, "{}/segments/{}", self.0, self.1)
385+
}
386+
}
387+
388+
fn s3_segment_data_key<'a>(folder_key: &'a FolderKey, segment_key: &'a SegmentKey) -> SegmentDataKey<'a> {
389+
SegmentDataKey(folder_key, segment_key)
390+
}
391+
392+
pub struct SegmentIndexKey<'a>(&'a FolderKey<'a>, &'a SegmentKey);
393+
394+
impl fmt::Display for SegmentIndexKey<'_> {
395+
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
396+
write!(f, "{}/indexes/{}", self.0, self.1)
397+
}
382398
}
383399

384-
fn s3_segment_index_key(folder_key: &FolderKey, segment_key: &SegmentKey) -> String {
385-
format!("{folder_key}/indexes/{segment_key}")
400+
fn s3_segment_index_key<'a>(folder_key: &'a FolderKey, segment_key: &'a SegmentKey) -> SegmentIndexKey<'a> {
401+
SegmentIndexKey(folder_key, segment_key)
386402
}
387403

388-
fn s3_segment_index_lookup_key_prefix(folder_key: &FolderKey) -> String {
389-
format!("{folder_key}/indexes/")
404+
pub struct SegmentIndexLookupKeyPrefix<'a>(&'a FolderKey<'a>);
405+
406+
impl fmt::Display for SegmentIndexLookupKeyPrefix<'_> {
407+
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
408+
write!(f, "{}/indexes/", self.0)
409+
}
410+
}
411+
412+
fn s3_segment_index_lookup_key_prefix<'a>(folder_key: &'a FolderKey) -> SegmentIndexLookupKeyPrefix<'a> {
413+
SegmentIndexLookupKeyPrefix(folder_key)
414+
}
415+
416+
pub struct SegmentIndexLookupKey<'a>(&'a FolderKey<'a>, u64);
417+
418+
impl fmt::Display for SegmentIndexLookupKey<'_> {
419+
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
420+
write!(f, "{}/indexes/{:020}", self.0, u64::MAX - self.1)
421+
}
390422
}
391423

392-
fn s3_segment_index_lookup_key(folder_key: &FolderKey, frame_no: u64) -> String {
393-
format!("{folder_key}/indexes/{:020}", u64::MAX - frame_no)
424+
fn s3_segment_index_lookup_key<'a>(folder_key: &'a FolderKey, frame_no: u64) -> SegmentIndexLookupKey<'a> {
425+
SegmentIndexLookupKey(folder_key, frame_no)
394426
}
395427

396428
impl<IO> Backend for S3Backend<IO>

0 commit comments

Comments
 (0)