From b882b48dcb2425bb16f6f4b6a67102aca11e7bc9 Mon Sep 17 00:00:00 2001 From: Phillip LeBlanc Date: Mon, 16 Sep 2024 21:32:43 +0900 Subject: [PATCH] Ignore CHECKPOINT errors --- src/duckdb.rs | 5 ----- src/duckdb/write.rs | 11 +++++++---- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/duckdb.rs b/src/duckdb.rs index 2d07091..3ff516b 100644 --- a/src/duckdb.rs +++ b/src/duckdb.rs @@ -90,11 +90,6 @@ pub enum Error { #[snafu(display("Unable to commit transaction: {source}"))] UnableToCommitTransaction { source: duckdb::Error }, - #[snafu(display("Unable to checkpoint duckdb: {source}"))] - UnableToCheckpoint { - source: Box, - }, - #[snafu(display("Unable to begin duckdb transaction: {source}"))] UnableToBeginTransaction { source: duckdb::Error }, diff --git a/src/duckdb/write.rs b/src/duckdb/write.rs index a7eb3ce..00d40cb 100644 --- a/src/duckdb/write.rs +++ b/src/duckdb/write.rs @@ -214,12 +214,15 @@ impl DataSink for DuckDBDataSink { match duckdb_write_handle.await { Ok(result) => { - // before returning the result, CHECKPOINT to flush the WAL to disk + // before returning the result, attempt to CHECKPOINT to flush the WAL to disk let mut conn = self.duckdb.connect_sync().map_err(to_datafusion_error)?; let conn = DuckDB::duckdb_conn(&mut conn).map_err(to_datafusion_error)?; - conn.execute("CHECKPOINT", &[]).map_err(|err| { - to_datafusion_error(super::Error::UnableToCheckpoint { source: err }) - })?; + + // This may fail if multiple transactions are active (i.e. actively writing data) + // we can ignore the error since it will be written once the last transaction finishes. + if let Err(e) = conn.execute("CHECKPOINT", &[]) { + tracing::trace!("DuckDB CHECKPOINT failed - this is expected if there are multiple active transactions: {e}"); + }; result }