Shogo's Blog

Jun 25, 2024 - 1 minute read - go golang

go-retry v2 リリースのお知らせ

shogo82148/go-retry は指数的バックオフを行ってくれるライブラリです。

v2へメジャーバージョンアップをリリースしました。 破壊的な変更が入っているのでお知らせします。

エラーのTemporaryメソッドをチェックしなくなりました

DoメソッドやDoValue関数のエラーハンドリングの挙動が変更になります。

v1 までの挙動

v1のDoメソッドは戻り値のエラーが Temporary メソッドを実装している場合、 その実行結果によってリトライの挙動を変えていました。 Temporary メソッドが true を返した場合はリトライを続行します。 false を返した場合はそれ以上のリトライは無意味と判断し、リトライ処理を中断します。

この挙動は net.Error を参考に実装したものでした。 ネットワーク処理中に回復不可能なエラーが発生した場合に、リトライが自動的に中断されることを期待して実装しました。

v2 からの挙動

しかし、残念ながら Go 1.18 から Temporary メソッドは非推奨になってしまいました。 Temporaryの意味はあいまいで、利用者の意図した通りの結果を得られるとは限りません。 実際に「リトライして欲しいときにリトライしてくれない」という報告を受けました。

そういうわけで、エラーのTemporaryメソッドの戻り値は信用せず、呼ばないよう変更しました。

v1からv2への移行

多くのケースでは、インポートパスを github.com/shogo82148/go-retry から github.com/shogo82148/go-retry/v2 に変更するだけでOKなはずです。

万が一v1と同じ挙動を維持したい場合は、以下のように書き換えてください。

// v1 code
policy.Do(func() error {
    return DoSomething()
})

// v2 code
policy.Do(func() error {
    err := DoSomething()

    interface temporary {
        Temporary() bool
    }
    var tmp temporary
    if errors.As(err, &tmp) && !tmp.Temporary() {
        return retry.MarkPermanent(err)
    }
    return err
})

まとめ

shogo82148/go-retryの v2 をリリースしました。 意図せずリトライが中断される不具合が修正されていますが、破壊的な変更が含まれているので注意してください。 リトライを中断したいときは、明示的に retry.MarkPermanent を呼び出してください。

参考