diff --git a/ecstore/src/erasure.rs b/ecstore/src/erasure.rs index 0f4baa4f..f0983aac 100644 --- a/ecstore/src/erasure.rs +++ b/ecstore/src/erasure.rs @@ -67,34 +67,36 @@ impl Erasure { ); let mut total: usize = 0; + loop { - let new_len = { - let remain = total_size - total; - if remain > self.block_size { - self.block_size - } else { - remain - } - }; - - if new_len == 0 { - break; - } - - self.buf.resize(new_len, 0u8); - - match reader.read_exact(&mut self.buf).await { - Ok(res) => res, - Err(e) => { - if let ErrorKind::UnexpectedEof = e.kind() { - break; + if total_size > 0 { + let new_len = { + let remain = total_size - total; + if remain > self.block_size { + self.block_size } else { - return Err(Error::new(e)); + remain } - } - }; + }; - total += self.buf.len(); + if new_len == 0 && total > 0 { + break; + } + + self.buf.resize(new_len, 0u8); + + match reader.read_exact(&mut self.buf).await { + Ok(res) => res, + Err(e) => { + if let ErrorKind::UnexpectedEof = e.kind() { + break; + } else { + return Err(Error::new(e)); + } + } + }; + total += self.buf.len(); + } let blocks = self.encode_data(&self.buf)?; let mut errs = Vec::new(); @@ -112,6 +114,9 @@ impl Erasure { let none_count = errs.iter().filter(|&x| x.is_none()).count(); if none_count >= write_quorum { + if total_size == 0 { + break; + } continue; } @@ -119,6 +124,10 @@ impl Erasure { warn!("Erasure encode errs {:?}", &errs); return Err(err); } + + if total_size == 0 { + break; + } } Ok(total) diff --git a/rustfs/src/storage/ecfs.rs b/rustfs/src/storage/ecfs.rs index 5ae401e4..3334bda0 100644 --- a/rustfs/src/storage/ecfs.rs +++ b/rustfs/src/storage/ecfs.rs @@ -588,7 +588,7 @@ impl S3 for FS { let Some(body) = body else { return Err(s3_error!(IncompleteBody)) }; - let Some(content_length) = content_length else { return Err(s3_error!(IncompleteBody)) }; + let content_length = content_length.unwrap_or_default(); let mut reader = PutObjReader::new(body, content_length as usize); @@ -677,7 +677,7 @@ impl S3 for FS { // let upload_id = let body = body.ok_or_else(|| s3_error!(IncompleteBody))?; - let content_length = content_length.ok_or_else(|| s3_error!(IncompleteBody))?; + let content_length = content_length.unwrap_or_default(); // mc cp step 4 let mut data = PutObjReader::new(body, content_length as usize);