From 2d1c796947dff6370dc5de27abdc789c1f9dd338 Mon Sep 17 00:00:00 2001 From: edef Date: Mon, 25 Apr 2022 00:11:33 +0000 Subject: ripple/fossil: store bao outboard tree in the blob metadata One step closer to genuine incremental blob reads. Change-Id: I796710820c1b69baad91a6dc65f9d7f0dee311d3 --- ripple/fossil/src/lib.rs | 53 ++++++++++++++++++++----------------------- ripple/fossil/src/store.proto | 1 + 2 files changed, 26 insertions(+), 28 deletions(-) (limited to 'ripple/fossil') diff --git a/ripple/fossil/src/lib.rs b/ripple/fossil/src/lib.rs index 8c182eb..4c747e8 100644 --- a/ripple/fossil/src/lib.rs +++ b/ripple/fossil/src/lib.rs @@ -108,10 +108,11 @@ impl Store { } fn write_blob(&self, data: &[u8]) -> Digest { - let ident = { - let mut h = blake3::Hasher::new(); - h.update_rayon(data); - h.finalize() + let mut outboard = Vec::new(); + let ident: blake3::Hash = { + let mut encoder = bao::encode::Encoder::new_outboard(io::Cursor::new(&mut outboard)); + encoder.write_all(&data).unwrap(); + encoder.finalize().unwrap() }; if self.db.contains_key(&*ident.as_bytes()).unwrap() { @@ -132,6 +133,7 @@ impl Store { let blob_buf = store::Blob { offset, length: data.len() as u64, + bao_inline: outboard, } .encode_to_vec(); @@ -155,37 +157,32 @@ impl Store { } pub fn read_blob(&self, ident: Digest) -> Vec { - let mut buffer = Vec::new(); - self.raw_blob(ident).read_to_end(&mut buffer).unwrap(); - - let mut outboard = Vec::new(); - let computed_ident: blake3::Hash = { - let mut encoder = bao::encode::Encoder::new_outboard(io::Cursor::new(&mut outboard)); - encoder.write_all(&buffer).unwrap(); - encoder.finalize().unwrap() - }; - - if computed_ident != ident { - panic!("hash mismatch"); - } - - buffer - } - - fn raw_blob(&self, ident: Digest) -> RawBlob<'_> { let buf = self .db .get(&*ident.as_bytes()) .unwrap() .expect("blob not found"); - let store::Blob { offset, length } = store::Blob::decode(&*buf).unwrap(); + let store::Blob { + offset, + length, + bao_inline, + } = store::Blob::decode(&*buf).unwrap(); + + let mut blob = bao::decode::Decoder::new_outboard( + RawBlob { + store: self, + slice: Slice { offset, length }, + position: 0, + }, + io::Cursor::new(bao_inline), + &ident, + ); + + let mut buffer = Vec::new(); + blob.read_to_end(&mut buffer).unwrap(); - RawBlob { - store: self, - slice: Slice { offset, length }, - position: 0, - } + buffer } } diff --git a/ripple/fossil/src/store.proto b/ripple/fossil/src/store.proto index cbbbbf1..cbeb16d 100644 --- a/ripple/fossil/src/store.proto +++ b/ripple/fossil/src/store.proto @@ -32,4 +32,5 @@ message LinkNode { message Blob { uint64 offset = 1; uint64 length = 2; + bytes bao_inline = 3; } -- cgit 1.4.1