libsql icon indicating copy to clipboard operation
libsql copied to clipboard

Recover client from server restarts when handling batons?

Open penberg opened this issue 1 year ago • 2 comments

Currently, I think that when a client holds a server-issued baton and attempts to send it back after a server restart, the request fails with a BatonInvalid error. This error breaks the client's workflow and requires manual intervention.

If this turns out to be the case, let's fix that so thatif a BatonInvalid error occurs and no transaction is in progress, the client should:

  • Automatically restart the stream
  • Obtain a new baton from the server
  • Continue normal operation

penberg avatar Nov 29 '24 18:11 penberg

I was testing the Rust SDK and this only happens if restart happens in the middle of an interactive transaction. We send the following error:

thread 'main' panicked at libsql/examples/example.rs:31:23:
called `Result::unwrap()` on an `Err` value: Hrana(Api("Received an invalid baton"))
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

Which we should improve to tell that the transaction was aborted.

penberg avatar Nov 29 '24 18:11 penberg

I suspected that this would trigger with cursors, but in testing it looks like we recover from restarts fine. Or perhaps I was not trying hard enough to figure out a case where this can happen.

penberg avatar Nov 29 '24 19:11 penberg