|
1 | 1 | //! S3 implementation of storage backend |
2 | 2 |
|
3 | | -use std::fmt; |
| 3 | +use std::fmt::{self, Formatter}; |
4 | 4 | use std::mem::size_of; |
5 | 5 | use std::path::Path; |
6 | 6 | use std::pin::Pin; |
@@ -150,24 +150,24 @@ impl<IO: Io> S3Backend<IO> { |
150 | 150 | Ok(header) |
151 | 151 | } |
152 | 152 |
|
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> { |
154 | 154 | Ok(self |
155 | 155 | .client |
156 | 156 | .get_object() |
157 | 157 | .bucket(&config.bucket) |
158 | | - .key(key) |
| 158 | + .key(key.to_string()) |
159 | 159 | .send() |
160 | 160 | .await |
161 | 161 | .map_err(|e| Error::unhandled(e, "error sending s3 GET request"))? |
162 | 162 | .body) |
163 | 163 | } |
164 | 164 |
|
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<()> { |
166 | 166 | self.client |
167 | 167 | .put_object() |
168 | 168 | .bucket(&config.bucket) |
169 | 169 | .body(body) |
170 | | - .key(key) |
| 170 | + .key(key.to_string()) |
171 | 171 | .send() |
172 | 172 | .await |
173 | 173 | .map_err(|e| Error::unhandled(e, "error sending s3 PUT request"))?; |
@@ -212,8 +212,8 @@ impl<IO: Io> S3Backend<IO> { |
212 | 212 | .client |
213 | 213 | .list_objects_v2() |
214 | 214 | .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()) |
217 | 217 | .send() |
218 | 218 | .await |
219 | 219 | .map_err(|e| Error::unhandled(e, "failed to list bucket"))?; |
@@ -325,7 +325,7 @@ impl<IO: Io> S3Backend<IO> { |
325 | 325 | .client |
326 | 326 | .list_objects_v2() |
327 | 327 | .bucket(&config.bucket) |
328 | | - .prefix(lookup_key_prefix.clone()) |
| 328 | + .prefix(lookup_key_prefix.to_string()) |
329 | 329 | .set_continuation_token(continuation_token.take()) |
330 | 330 | .send() |
331 | 331 | .await |
@@ -377,20 +377,52 @@ impl fmt::Display for FolderKey<'_> { |
377 | 377 | } |
378 | 378 | } |
379 | 379 |
|
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 | + } |
382 | 398 | } |
383 | 399 |
|
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) |
386 | 402 | } |
387 | 403 |
|
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 | + } |
390 | 422 | } |
391 | 423 |
|
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) |
394 | 426 | } |
395 | 427 |
|
396 | 428 | impl<IO> Backend for S3Backend<IO> |
|
0 commit comments