diff --git a/rust/lancedb/src/database/listing.rs b/rust/lancedb/src/database/listing.rs index 1357500a4..6b196d61d 100644 --- a/rust/lancedb/src/database/listing.rs +++ b/rust/lancedb/src/database/listing.rs @@ -89,6 +89,14 @@ struct CloneCommitHandler { #[async_trait::async_trait] impl CommitHandler for CloneCommitHandler { + fn is_version_not_found_definitive(&self) -> bool { + self.target.is_version_not_found_definitive() + } + + fn propagate_commit_error_after_success(&self) -> bool { + self.target.propagate_commit_error_after_success() + } + async fn resolve_latest_location( &self, base_path: &ObjectPath, @@ -1554,6 +1562,20 @@ mod tests { } } + #[test] + fn commit_handler_forwards_commit_outcome_capabilities() { + let target: Arc = + Arc::new(lance_table::io::commit::ConditionalPutCommitHandler); + let handler = CloneCommitHandler { + source_base: ObjectPath::from("source"), + source: target.clone(), + target, + }; + + assert!(handler.is_version_not_found_definitive()); + assert!(!handler.propagate_commit_error_after_success()); + } + async fn setup_database() -> (tempfile::TempDir, ListingDatabase) { let tempdir = tempdir().unwrap(); let uri = tempdir.path().to_str().unwrap(); diff --git a/rust/lancedb/src/io/object_store.rs b/rust/lancedb/src/io/object_store.rs index b92befa76..2de2820d6 100644 --- a/rust/lancedb/src/io/object_store.rs +++ b/rust/lancedb/src/io/object_store.rs @@ -54,6 +54,14 @@ struct RootedFileCommitHandler; #[cfg(any(windows, test))] #[async_trait] impl CommitHandler for RootedFileCommitHandler { + fn is_version_not_found_definitive(&self) -> bool { + RenameCommitHandler.is_version_not_found_definitive() + } + + fn propagate_commit_error_after_success(&self) -> bool { + RenameCommitHandler.propagate_commit_error_after_success() + } + async fn resolve_latest_location( &self, base_path: &Path, @@ -443,6 +451,14 @@ mod prefixed_file_store_test { } } + #[test] + fn commit_handler_forwards_commit_outcome_capabilities() { + let handler = RootedFileCommitHandler; + + assert!(handler.is_version_not_found_definitive()); + assert!(!handler.propagate_commit_error_after_success()); + } + #[tokio::test] async fn anchors_new_and_existing_directories_at_a_filesystem_prefix() { let tempdir = tempfile::tempdir().unwrap();