Skip to content

Commit 4134bdf

Browse files
committed
fix: use temp error
Signed-off-by: yihong0618 <zouzou0208@gmail.com>
1 parent 5584928 commit 4134bdf

File tree

1 file changed

+30
-11
lines changed

1 file changed

+30
-11
lines changed

core/src/services/sqlite/backend.rs

+30-11
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ use futures::Stream;
2727
use futures::StreamExt;
2828
use ouroboros::self_referencing;
2929
use sqlx::sqlite::SqliteConnectOptions;
30-
use sqlx::sqlite::SqlitePoolOptions;
3130
use sqlx::SqlitePool;
3231
use tokio::sync::OnceCell;
3332

@@ -137,12 +136,11 @@ impl Builder for SqliteBuilder {
137136
}
138137
};
139138

140-
let config: SqliteConnectOptions =
141-
SqliteConnectOptions::from_str(&conn).map_err(|err| {
142-
Error::new(ErrorKind::ConfigInvalid, "connection_string is invalid")
143-
.with_context("service", Scheme::Sqlite)
144-
.set_source(err)
145-
})?;
139+
let config = SqliteConnectOptions::from_str(&conn).map_err(|err| {
140+
Error::new(ErrorKind::ConfigInvalid, "connection_string is invalid")
141+
.with_context("service", Scheme::Sqlite)
142+
.set_source(err)
143+
})?;
146144

147145
let table = match self.config.table {
148146
Some(v) => v,
@@ -188,9 +186,7 @@ impl Adapter {
188186
async fn get_client(&self) -> Result<&SqlitePool> {
189187
self.pool
190188
.get_or_try_init(|| async {
191-
let pool = SqlitePoolOptions::new()
192-
.max_connections(1)
193-
.connect_with(self.config.clone())
189+
let pool = SqlitePool::connect_with(self.config.clone())
194190
.await
195191
.map_err(parse_sqlite_error)?;
196192
Ok(pool)
@@ -312,5 +308,28 @@ impl kv::Adapter for Adapter {
312308
}
313309

314310
fn parse_sqlite_error(err: sqlx::Error) -> Error {
315-
Error::new(ErrorKind::Unexpected, "unhandled error from sqlite").set_source(err)
311+
let (message, is_temporary) = match &err {
312+
sqlx::Error::Database(db_err) => {
313+
let error_code = db_err.code();
314+
if let Some(code) = error_code {
315+
match code.as_ref() {
316+
"5" => ("database is locked, retry may succeed", true),
317+
"6" => ("database is busy, retry may succeed", true),
318+
_ => ("unhandled error from sqlite", false),
319+
}
320+
} else {
321+
("unhandled error from sqlite", false)
322+
}
323+
}
324+
_ => ("unhandled error from sqlite", false),
325+
};
326+
327+
let mut error = Error::new(ErrorKind::Unexpected, message)
328+
.set_source(err);
329+
330+
if is_temporary {
331+
error = error.set_temporary();
332+
}
333+
334+
error
316335
}

0 commit comments

Comments
 (0)