@shinyaz

aurora-dsql-sqlx-connector の retry_on_occ は sqlx::Error を要求する

約1分

Aurora DSQL の Rust コネクタで retry_on_occ を使ったとき、クロージャの戻り値を Ok::<_, anyhow::Error>(()) にしたらコンパイルが通らなかった。

Output
expected `sqlx::Error`, found `anyhow::Error`

retry_on_occ のシグネチャを見ると、クロージャの FutureResult<T, sqlx::Error> を返す必要がある。

Rust (シグネチャ)
pub async fn retry_on_occ<F, Fut, T>(config: &OCCRetryConfig, mut f: F) -> Result<T>
where
    F: FnMut() -> Fut,
    Fut: std::future::Future<Output = std::result::Result<T, sqlx::Error>>,

一方、retry_on_occ 自体の戻り値は Result<T, DsqlError> だ。つまりエラー型が2段階になっている。

  • クロージャ内: sqlx::Error(SQLx の標準エラー)
  • retry_on_occ の戻り値: DsqlError(OCC リトライ失敗時は DsqlError::OCCRetryExhausted

クロージャ内では ?sqlx::Error をそのまま伝播すればよく、anyhow への変換は retry_on_occ の外側で行う。

Rust
let result: Result<(), DsqlError> = retry_on_occ(&config, || async {
    let mut tx = pool.begin().await?; // sqlx::Error を ? で伝播
    sqlx::query("...").execute(&mut *tx).await?;
    tx.commit().await?;
    Ok(())
}).await;
// DsqlError → anyhow::Error への変換はここで
result.map_err(|e| anyhow::anyhow!(e))?;

共有する

田原 慎也

田原 慎也

ソリューションアーキテクト @ AWS

AWS ソリューションアーキテクトとして金融業界のお客様を中心に技術支援をしており、クラウドアーキテクチャや AI/ML に関する学びをこのサイトで発信しています。このサイトの内容は個人の見解であり、所属企業の公式な意見や見解を代表するものではありません。