src/api2/admin/datastore/backup.rs: verify chunk offset

This clearly shows that the current approach does not work - seems we get
chunks out of order.
This commit is contained in:
Dietmar Maurer
2019-05-24 10:05:22 +02:00
parent 34114e2606
commit 417cb0731e
4 changed files with 40 additions and 14 deletions

View File

@ -123,7 +123,7 @@ impl BackupEnvironment {
}
/// Append chunk to dynamic writer
pub fn dynamic_writer_append_chunk(&self, wid: usize, size: u32, digest: &[u8; 32]) -> Result<(), Error> {
pub fn dynamic_writer_append_chunk(&self, wid: usize, offset: u64, size: u32, digest: &[u8; 32]) -> Result<(), Error> {
let mut state = self.state.lock().unwrap();
state.ensure_unfinished()?;
@ -136,6 +136,11 @@ impl BackupEnvironment {
data.offset += size as u64;
data.chunk_count += 1;
if data.offset != offset {
bail!("dynamic writer '{}' append chunk failed - got strange chunk offset ({} != {})",
data.name, data.offset, offset);
}
data.index.add_chunk(data.offset, digest)?;
Ok(())

View File

@ -62,6 +62,9 @@ pub fn api_method_upload_dynamic_chunk() -> ApiAsyncMethod {
.minimum(1)
.maximum(256)
)
.required("offset", IntegerSchema::new("Chunk offset (end of chunk).")
.minimum(0)
)
.required("size", IntegerSchema::new("Chunk size.")
.minimum(1)
.maximum(1024*1024*16)
@ -78,8 +81,10 @@ fn upload_dynamic_chunk(
) -> Result<BoxFut, Error> {
let size = tools::required_integer_param(&param, "size")? as u32;
let offset = tools::required_integer_param(&param, "offset")? as u64;
let wid = tools::required_integer_param(&param, "wid")? as usize;
println!("upload_dynamic_chunk: {} bytes, offset {}", size, offset);
let env: &BackupEnvironment = rpcenv.as_ref();
@ -91,7 +96,7 @@ fn upload_dynamic_chunk(
let result = result.and_then(|(digest, size)| {
env.register_chunk(digest, size)?;
env.dynamic_writer_append_chunk(wid, size, &digest)?;
env.dynamic_writer_append_chunk(wid, offset, size, &digest)?;
Ok(json!(tools::digest_to_hex(&digest)))
});