aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Auvolat <alex@adnab.me>2023-05-03 19:21:35 +0200
committerAlex Auvolat <alex@adnab.me>2023-06-09 16:23:37 +0200
commit75a0e013725f984077a6d0fe85138afee82cebcc (patch)
tree70cb8a3262892da5b806ae455ce3358d93d5ae46
parentbb176ebcb87ea77b07480b696c9e87be92136c70 (diff)
downloadgarage-75a0e013725f984077a6d0fe85138afee82cebcc.tar.gz
garage-75a0e013725f984077a6d0fe85138afee82cebcc.zip
fix online repair
-rw-r--r--src/garage/repair/online.rs35
1 files changed, 18 insertions, 17 deletions
diff --git a/src/garage/repair/online.rs b/src/garage/repair/online.rs
index 0e14ed51..9b6b3cad 100644
--- a/src/garage/repair/online.rs
+++ b/src/garage/repair/online.rs
@@ -107,28 +107,29 @@ impl Worker for RepairVersionsWorker {
let version = Version::decode(&item_bytes).ok_or_message("Cannot decode Version")?;
if !version.deleted.get() {
- let object = self
- .garage
- .object_table
- .get(&version.bucket_id, &version.key)
- .await?;
- let version_exists = match object {
- Some(o) => o
- .versions()
- .iter()
- .any(|x| x.uuid == version.uuid && x.state != ObjectVersionState::Aborted),
- None => false,
+ let version_exists = match &version.backlink {
+ VersionBacklink::Object { bucket_id, key } => {
+ let object = self.garage.object_table.get(&bucket_id, &key).await?;
+ match object {
+ Some(o) => o.versions().iter().any(|x| {
+ x.uuid == version.uuid && x.state != ObjectVersionState::Aborted
+ }),
+ None => false,
+ }
+ }
+ VersionBacklink::MultipartUpload { upload_id } => {
+ let mpu = self.garage.mpu_table.get(&upload_id, &EmptyKey).await?;
+ match mpu {
+ Some(u) => !u.deleted.get(),
+ None => false,
+ }
+ }
};
if !version_exists {
info!("Repair versions: marking version as deleted: {:?}", version);
self.garage
.version_table
- .insert(&Version::new(
- version.uuid,
- version.bucket_id,
- version.key,
- true,
- ))
+ .insert(&Version::new(version.uuid, version.backlink, true))
.await?;
}
}