aboutsummaryrefslogtreecommitdiff
path: root/src/model/s3
diff options
context:
space:
mode:
authorAlex Auvolat <alex@adnab.me>2023-05-03 12:02:59 +0200
committerAlex Auvolat <alex@adnab.me>2023-06-09 16:23:37 +0200
commit82e75c0e296c74c374f3d40feeb1aadcb58398f0 (patch)
tree5449f6cd219e9b6628cb10d70f86a952d5b35382 /src/model/s3
parent38d6ac429506f9f488ac522581b12fa530442a59 (diff)
downloadgarage-82e75c0e296c74c374f3d40feeb1aadcb58398f0.tar.gz
garage-82e75c0e296c74c374f3d40feeb1aadcb58398f0.zip
Adapt S3 API code to use new multipart upload models
- Create and PutPart - completemultipartupload - upload part copy - list_parts
Diffstat (limited to 'src/model/s3')
-rw-r--r--src/model/s3/mpu_table.rs15
-rw-r--r--src/model/s3/version_table.rs11
2 files changed, 26 insertions, 0 deletions
diff --git a/src/model/s3/mpu_table.rs b/src/model/s3/mpu_table.rs
index dc5b5a82..7148be51 100644
--- a/src/model/s3/mpu_table.rs
+++ b/src/model/s3/mpu_table.rs
@@ -3,6 +3,7 @@ use std::sync::Arc;
use garage_db as db;
use garage_util::data::*;
+use garage_util::time::*;
use garage_table::crdt::*;
use garage_table::replication::TableShardedReplication;
@@ -94,6 +95,20 @@ impl MultipartUpload {
key,
}
}
+
+ pub fn next_timestamp(&self, part_number: u64) -> u64 {
+ std::cmp::max(
+ now_msec(),
+ 1 + self
+ .parts
+ .items()
+ .iter()
+ .filter(|(x, _)| x.part_number == part_number)
+ .map(|(x, _)| x.timestamp)
+ .max()
+ .unwrap_or(0),
+ )
+ }
}
impl Entry<Uuid, EmptyKey> for MultipartUpload {
diff --git a/src/model/s3/version_table.rs b/src/model/s3/version_table.rs
index 6cf1cc75..dcf4110a 100644
--- a/src/model/s3/version_table.rs
+++ b/src/model/s3/version_table.rs
@@ -3,6 +3,7 @@ use std::sync::Arc;
use garage_db as db;
use garage_util::data::*;
+use garage_util::error::*;
use garage_table::crdt::*;
use garage_table::replication::TableShardedReplication;
@@ -188,6 +189,16 @@ impl Version {
.binary_search_by(|(k, _)| k.part_number.cmp(&part_number))
.is_ok()
}
+
+ pub fn n_parts(&self) -> Result<u64, Error> {
+ Ok(self
+ .blocks
+ .items()
+ .last()
+ .ok_or_message("version has no parts")?
+ .0
+ .part_number)
+ }
}
impl Ord for VersionBlockKey {