@@ -1308,6 +1308,15 @@ impl VfsContext {
13081308 {
13091309 Ok ( outcome) => outcome,
13101310 Err ( err) => {
1311+ tracing:: error!(
1312+ actor_id = %self . actor_id,
1313+ generation = request. generation,
1314+ expected_head_txid = request. expected_head_txid,
1315+ new_db_size_pages = request. new_db_size_pages,
1316+ dirty_pages = request. dirty_pages. len( ) ,
1317+ ?err,
1318+ "sqlite flush commit failed"
1319+ ) ;
13111320 mark_dead_for_non_fence_commit_error ( self , & err) ;
13121321 return Err ( err) ;
13131322 }
@@ -1387,6 +1396,15 @@ impl VfsContext {
13871396 {
13881397 Ok ( outcome) => outcome,
13891398 Err ( err) => {
1399+ tracing:: error!(
1400+ actor_id = %self . actor_id,
1401+ generation = request. generation,
1402+ expected_head_txid = request. expected_head_txid,
1403+ new_db_size_pages = request. new_db_size_pages,
1404+ dirty_pages = request. dirty_pages. len( ) ,
1405+ ?err,
1406+ "sqlite atomic commit failed"
1407+ ) ;
13901408 mark_dead_for_non_fence_commit_error ( self , & err) ;
13911409 return Err ( err) ;
13921410 }
@@ -1460,13 +1478,28 @@ fn assert_batch_atomic_probe(db: *mut sqlite3, vfs: &SqliteVfs) -> std::result::
14601478 ";
14611479
14621480 if let Err ( err) = sqlite_exec ( db, probe_sql) {
1481+ let last_error = vfs. clone_last_error ( ) ;
1482+ tracing:: error!(
1483+ %err,
1484+ last_error = ?last_error,
1485+ commit_atomic_before,
1486+ "sqlite batch atomic probe failed"
1487+ ) ;
14631488 cleanup_batch_atomic_probe ( db) ;
1489+ if let Some ( last_error) = last_error {
1490+ return Err ( format ! (
1491+ "batch atomic probe failed: {err}; vfs last_error: {last_error}"
1492+ ) ) ;
1493+ }
14641494 return Err ( format ! ( "batch atomic probe failed: {err}" ) ) ;
14651495 }
14661496
14671497 let commit_atomic_after = vfs. commit_atomic_count ( ) ;
14681498 if commit_atomic_after == commit_atomic_before {
14691499 tracing:: error!(
1500+ commit_atomic_before,
1501+ commit_atomic_after,
1502+ last_error = ?vfs. clone_last_error( ) ,
14701503 "batch atomic writes not active for sqlite, SQLITE_ENABLE_BATCH_ATOMIC_WRITE may be missing"
14711504 ) ;
14721505 cleanup_batch_atomic_probe ( db) ;
@@ -2215,6 +2248,12 @@ unsafe extern "C" fn io_sync(p_file: *mut sqlite3_file, _flags: c_int) -> c_int
22152248 match ctx. flush_dirty_pages( ) {
22162249 Ok ( _) => SQLITE_OK ,
22172250 Err ( err) => {
2251+ tracing:: error!(
2252+ actor_id = %ctx. actor_id,
2253+ last_error = ?ctx. clone_last_error( ) ,
2254+ ?err,
2255+ "sqlite sync failed"
2256+ ) ;
22182257 mark_dead_from_fence_commit_error( ctx, & err) ;
22192258 SQLITE_IOERR_FSYNC
22202259 }
@@ -2280,6 +2319,12 @@ unsafe extern "C" fn io_file_control(
22802319 SQLITE_OK
22812320 }
22822321 Err ( err) => {
2322+ tracing:: error!(
2323+ actor_id = %ctx. actor_id,
2324+ last_error = ?ctx. clone_last_error( ) ,
2325+ ?err,
2326+ "sqlite atomic write file control failed"
2327+ ) ;
22832328 mark_dead_from_fence_commit_error( ctx, & err) ;
22842329 SQLITE_IOERR
22852330 }
@@ -2532,6 +2577,10 @@ impl SqliteVfs {
25322577 unsafe { ( * self . ctx_ptr ) . take_last_error ( ) }
25332578 }
25342579
2580+ fn clone_last_error ( & self ) -> Option < String > {
2581+ unsafe { ( * self . ctx_ptr ) . clone_last_error ( ) }
2582+ }
2583+
25352584 fn register_with_transport (
25362585 name : & str ,
25372586 transport : SqliteTransport ,
@@ -2659,6 +2708,13 @@ pub fn open_database(
26592708 } ;
26602709 if rc != SQLITE_OK {
26612710 let message = sqlite_error_message ( db) ;
2711+ tracing:: error!(
2712+ file_name,
2713+ rc,
2714+ %message,
2715+ last_error = ?vfs. clone_last_error( ) ,
2716+ "failed to open sqlite database with custom VFS"
2717+ ) ;
26622718 if !db. is_null ( ) {
26632719 unsafe {
26642720 sqlite3_close ( db) ;
@@ -2676,6 +2732,13 @@ pub fn open_database(
26762732 "PRAGMA locking_mode = EXCLUSIVE;" ,
26772733 ] {
26782734 if let Err ( err) = sqlite_exec ( db, pragma) {
2735+ tracing:: error!(
2736+ file_name,
2737+ pragma,
2738+ %err,
2739+ last_error = ?vfs. clone_last_error( ) ,
2740+ "failed to configure sqlite database"
2741+ ) ;
26792742 unsafe {
26802743 sqlite3_close ( db) ;
26812744 }
@@ -2684,6 +2747,12 @@ pub fn open_database(
26842747 }
26852748
26862749 if let Err ( err) = assert_batch_atomic_probe ( db, & vfs) {
2750+ tracing:: error!(
2751+ file_name,
2752+ %err,
2753+ last_error = ?vfs. clone_last_error( ) ,
2754+ "failed to verify sqlite batch atomic writes"
2755+ ) ;
26872756 unsafe {
26882757 sqlite3_close ( db) ;
26892758 }
0 commit comments