@@ -6,11 +6,12 @@ use std::path::Path;
66use std:: sync:: { Arc , Mutex } ;
77
88use crate :: local_cache:: LocalCache ;
9- use crate :: rpc:: Frame ;
9+ use crate :: rpc:: { ErrorCode , Frame } ;
1010use libsql_sys:: ffi:: { SQLITE_ABORT , SQLITE_BUSY } ;
1111use libsql_sys:: name:: { NamespaceName , NamespaceResolver } ;
1212use libsql_sys:: rusqlite;
1313use libsql_sys:: wal:: { Result , Vfs , Wal , WalManager } ;
14+ use prost:: Message ;
1415use rpc:: storage_client:: StorageClient ;
1516use tonic:: transport:: Channel ;
1617use tracing:: { error, trace, warn} ;
@@ -365,10 +366,13 @@ impl Wal for DurableWal {
365366 let resp = binding. insert_frames ( req) ;
366367 let resp = tokio:: task:: block_in_place ( || rt. block_on ( resp) ) ;
367368 if let Err ( e) = resp {
368- if e. code ( ) == tonic:: Code :: Aborted {
369- return Err ( rusqlite:: ffi:: Error :: new ( SQLITE_BUSY ) ) ;
370- }
371- return Err ( rusqlite:: ffi:: Error :: new ( SQLITE_ABORT ) ) ;
369+ let error_code = rpc:: ErrorDetails :: decode ( e. details ( ) )
370+ . ok ( )
371+ . and_then ( |details| rpc:: ErrorCode :: try_from ( details. code ) . ok ( ) ) ;
372+ return match error_code {
373+ Some ( ErrorCode :: WriteConflict ) => Err ( rusqlite:: ffi:: Error :: new ( SQLITE_BUSY ) ) ,
374+ _ => Err ( rusqlite:: ffi:: Error :: new ( SQLITE_ABORT ) ) ,
375+ } ;
372376 }
373377 // TODO: fix parity with storage server frame num with local cache
374378 self . local_cache
0 commit comments