From dbf62f327337f9bab93df576696a630e0bf149a0 Mon Sep 17 00:00:00 2001 From: Zhenchi Date: Wed, 7 Feb 2024 00:03:03 +0800 Subject: [PATCH] chore(index): add BiError to fulfil the requirement of returning two errors (#3291) Signed-off-by: Zhenchi --- src/mito2/src/error.rs | 8 ++++++++ src/mito2/src/sst/index/creator.rs | 19 ++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/mito2/src/error.rs b/src/mito2/src/error.rs index 0d5d262ceb..7d230981a9 100644 --- a/src/mito2/src/error.rs +++ b/src/mito2/src/error.rs @@ -549,6 +549,13 @@ pub enum Error { source: common_recordbatch::error::Error, location: Location, }, + + #[snafu(display("BiError, first: {first}, second: {second}"))] + BiError { + first: Box, + second: Box, + location: Location, + }, } pub type Result = std::result::Result; @@ -650,6 +657,7 @@ impl ErrorExt for Error { StaleLogEntry { .. } => StatusCode::Unexpected, FilterRecordBatch { source, .. } => source.status_code(), Upload { .. } => StatusCode::StorageUnavailable, + BiError { .. } => StatusCode::Internal, } } diff --git a/src/mito2/src/sst/index/creator.rs b/src/mito2/src/sst/index/creator.rs index bb4ee19f22..51e4e67f38 100644 --- a/src/mito2/src/sst/index/creator.rs +++ b/src/mito2/src/sst/index/creator.rs @@ -32,7 +32,7 @@ use tokio::io::duplex; use tokio_util::compat::{TokioAsyncReadCompatExt, TokioAsyncWriteCompatExt}; use crate::error::{ - IndexFinishSnafu, OperateAbortedIndexSnafu, PuffinAddBlobSnafu, PuffinFinishSnafu, + BiSnafu, IndexFinishSnafu, OperateAbortedIndexSnafu, PuffinAddBlobSnafu, PuffinFinishSnafu, PushIndexValueSnafu, Result, }; use crate::metrics::{ @@ -249,8 +249,21 @@ impl SstIndexCreator { self.index_creator.finish(&mut index_writer), puffin_writer.add_blob(blob) ); - index_finish.context(IndexFinishSnafu)?; - puffin_add_blob.context(PuffinAddBlobSnafu)?; + + match ( + puffin_add_blob.context(PuffinAddBlobSnafu), + index_finish.context(IndexFinishSnafu), + ) { + (Err(e1), Err(e2)) => BiSnafu { + first: Box::new(e1), + second: Box::new(e2), + } + .fail()?, + + (Ok(_), e @ Err(_)) => e?, + (e @ Err(_), Ok(_)) => e?, + _ => {} + } let byte_count = puffin_writer.finish().await.context(PuffinFinishSnafu)?; guard.inc_byte_count(byte_count);