Skip to content

Commit 791a8fb

Browse files
committed
feat: support for sqlite retries
1 parent dd0ea4f commit 791a8fb

1 file changed

Lines changed: 23 additions & 0 deletions

File tree

retry.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,36 @@ func DefaultRetry(backoffs []time.Duration, run func() error) error {
4949
return nil
5050
}
5151

52+
// errorCoder is satisfied by database driver error types that expose a numeric
53+
// error code (e.g., modernc.org/sqlite's *Error).
54+
type errorCoder interface {
55+
Code() int
56+
}
57+
58+
const (
59+
sqliteBusy = 5 // SQLITE_BUSY
60+
sqliteLocked = 6 // SQLITE_LOCKED
61+
)
62+
5263
func isRetryable(err error) bool {
64+
if err == nil {
65+
return false
66+
}
67+
5368
switch {
5469
case errors.Is(err, context.DeadlineExceeded),
5570
errors.Is(err, net.ErrClosed),
5671
errors.Is(err, os.ErrDeadlineExceeded):
5772
return true
5873
}
5974

75+
var coded errorCoder
76+
if errors.As(err, &coded) {
77+
switch coded.Code() {
78+
case sqliteBusy, sqliteLocked:
79+
return true
80+
}
81+
}
82+
6083
return false
6184
}

0 commit comments

Comments
 (0)