Skip to content

Commit 01460f0

Browse files
Fix bug in single threaded writer
Expose an `update_sha` method from ZstdWriter so we can update the rolling SHA256 hash value from SplitStreamWriter Signed-off-by: Pragyan Poudyal <[email protected]>
1 parent 9361a74 commit 01460f0

File tree

2 files changed

+13
-9
lines changed

2 files changed

+13
-9
lines changed

src/splitstream.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,8 +232,10 @@ impl SplitStreamWriter<'_> {
232232
}
233233

234234
None => {
235+
self.flush_inline(padding)?;
236+
self.writer.update_sha(&data);
237+
235238
let id = self.repo.ensure_object(&data)?;
236-
self.writer.flush_inline(&padding)?;
237239
self.writer.write_fragment(0, &id)?;
238240
}
239241
};

src/zstd_encoder.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use anyhow::{bail, Context, Result};
1010
use zstd::Encoder;
1111

1212
use crate::{
13-
fsverity::{FsVerityHashValue, Sha256HashValue},
13+
fsverity::Sha256HashValue,
1414
repository::Repository,
1515
splitstream::{
1616
DigestMap, EnsureObjectMessages, FinishMessage, ResultChannelSender,
@@ -198,15 +198,19 @@ impl ZstdWriter {
198198
Ok(self.writer.write_all(data)?)
199199
}
200200

201+
pub(crate) fn update_sha(&mut self, data: &[u8]) {
202+
if let Some((sha256, ..)) = &mut self.sha256_builder {
203+
sha256.update(&data);
204+
}
205+
}
206+
201207
/// Writes all the data in `inline_content`, updating the internal SHA
202208
pub(crate) fn flush_inline(&mut self, inline_content: &Vec<u8>) -> Result<()> {
203209
if inline_content.is_empty() {
204210
return Ok(());
205211
}
206212

207-
if let Some((sha256, ..)) = &mut self.sha256_builder {
208-
sha256.update(&inline_content);
209-
}
213+
self.update_sha(inline_content);
210214

211215
self.write_fragment(inline_content.len(), &inline_content)?;
212216

@@ -263,8 +267,6 @@ impl ZstdWriter {
263267
pub(crate) fn finalize_sha256_builder(&mut self) -> Result<Sha256HashValue> {
264268
let sha256_builder = std::mem::replace(&mut self.sha256_builder, None);
265269

266-
let mut sha = Sha256HashValue::EMPTY;
267-
268270
if let Some((context, expected)) = sha256_builder {
269271
let final_sha = Into::<Sha256HashValue>::into(context.finalize());
270272

@@ -276,10 +278,10 @@ impl ZstdWriter {
276278
);
277279
}
278280

279-
sha = final_sha;
281+
return Ok(final_sha);
280282
}
281283

282-
return Ok(sha);
284+
bail!("SHA not enabled for writer");
283285
}
284286

285287
/// Calls `finish` on the internal writer

0 commit comments

Comments
 (0)