diff options
author | Trinity Pointard <trinity.pointard@gmail.com> | 2021-04-06 22:25:58 +0200 |
---|---|---|
committer | Trinity Pointard <trinity.pointard@gmail.com> | 2021-04-08 15:42:14 +0200 |
commit | aeadb071c68ff4309aa35bc19482724c04c4f67e (patch) | |
tree | 8e0087c6d1c9f7d913cc2681c07a78c22b4ed2d1 /src | |
parent | 4d5263ccf36518e1efec3a37ea5bc285a83fe8d2 (diff) | |
download | garage-aeadb071c68ff4309aa35bc19482724c04c4f67e.tar.gz garage-aeadb071c68ff4309aa35bc19482724c04c4f67e.zip |
delete plain block when getting a compressed one
Diffstat (limited to 'src')
-rw-r--r-- | src/model/block.rs | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/src/model/block.rs b/src/model/block.rs index 0308c611..090ffbc2 100644 --- a/src/model/block.rs +++ b/src/model/block.rs @@ -57,6 +57,15 @@ pub enum BlockData { Compressed(#[serde(with = "serde_bytes")] Vec<u8>), } +impl BlockData { + pub fn is_compressed(&self) -> bool { + match self { + BlockData::Plain(_) => false, + BlockData::Compressed(_) => true, + } + } +} + impl RpcMessage for Message {} /// The block manager, handling block exchange between nodes, and block storage on local node @@ -155,9 +164,12 @@ impl BlockManager { /// Write a block to disk pub async fn write_block(&self, hash: &Hash, data: &BlockData) -> Result<Message, Error> { - if self.is_block_compressed(hash).await.is_ok() { - return Ok(Message::Ok); - } + let clean_plain = match self.is_block_compressed(hash).await { + Ok(true) => return Ok(Message::Ok), + Ok(false) if !data.is_compressed() => return Ok(Message::Ok), // we have a plain block, and the provided block is not compressed either + Ok(false) => true, + Err(_) => false, + }; let mut path = self.block_dir(hash); @@ -177,11 +189,16 @@ impl BlockManager { path.set_extension("zst_b2"); } - let mut f = fs::File::create(path).await?; + let mut f = fs::File::create(path.clone()).await?; f.write_all(&buffer).await?; if let Some(checksum) = checksum { f.write_all(checksum.as_slice()).await?; } + + if clean_plain { + path.set_extension(""); + fs::remove_file(path).await?; + } drop(f); Ok(Message::Ok) |