diff options
author | Alex Auvolat <alex@adnab.me> | 2021-02-23 20:25:15 +0100 |
---|---|---|
committer | Alex Auvolat <alex@adnab.me> | 2021-02-23 20:25:15 +0100 |
commit | bf25c95fe2fda4ded2e3ca14499e3991e7243532 (patch) | |
tree | 889ced32b11186e69caba5af740b26de3e3b0659 /src/model/version_table.rs | |
parent | 28bc967c837c38ba416d9b19fd1ae96cbb292074 (diff) | |
download | garage-bf25c95fe2fda4ded2e3ca14499e3991e7243532.tar.gz garage-bf25c95fe2fda4ded2e3ca14499e3991e7243532.zip |
Make updated() be a sync function that doesn't fail
Diffstat (limited to 'src/model/version_table.rs')
-rw-r--r-- | src/model/version_table.rs | 37 |
1 files changed, 18 insertions, 19 deletions
diff --git a/src/model/version_table.rs b/src/model/version_table.rs index 0d831998..cf9fbe98 100644 --- a/src/model/version_table.rs +++ b/src/model/version_table.rs @@ -1,10 +1,8 @@ -use async_trait::async_trait; use serde::{Deserialize, Serialize}; use std::sync::Arc; use garage_util::background::BackgroundRunner; use garage_util::data::*; -use garage_util::error::Error; use garage_table::table_sharded::*; use garage_table::*; @@ -112,31 +110,32 @@ pub struct VersionTable { pub block_ref_table: Arc<Table<BlockRefTable, TableShardedReplication>>, } -#[async_trait] impl TableSchema for VersionTable { type P = Hash; type S = EmptyKey; type E = Version; type Filter = DeletedFilter; - async fn updated(&self, old: Option<Self::E>, new: Option<Self::E>) -> Result<(), Error> { + fn updated(&self, old: Option<Self::E>, new: Option<Self::E>) { let block_ref_table = self.block_ref_table.clone(); - if let (Some(old_v), Some(new_v)) = (old, new) { - // Propagate deletion of version blocks - if new_v.deleted && !old_v.deleted { - let deleted_block_refs = old_v - .blocks - .iter() - .map(|vb| BlockRef { - block: vb.hash, - version: old_v.uuid, - deleted: true, - }) - .collect::<Vec<_>>(); - block_ref_table.insert_many(&deleted_block_refs[..]).await?; + self.background.spawn(async move { + if let (Some(old_v), Some(new_v)) = (old, new) { + // Propagate deletion of version blocks + if new_v.deleted && !old_v.deleted { + let deleted_block_refs = old_v + .blocks + .iter() + .map(|vb| BlockRef { + block: vb.hash, + version: old_v.uuid, + deleted: true, + }) + .collect::<Vec<_>>(); + block_ref_table.insert_many(&deleted_block_refs[..]).await?; + } } - } - Ok(()) + Ok(()) + }) } fn matches_filter(entry: &Self::E, filter: &Self::Filter) -> bool { |