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
を呼び出してください。