diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2022-12-28 18:49:09 -0700 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2023-01-05 19:48:17 -0700 |
commit | 8efc82d0b1a167830970135c78d173667080b116 (patch) | |
tree | 2dca71998f517fc80448ed6cdd3a6753a86926fa /cmd/btrfs-rec/util.go | |
parent | 52c1eb7a44f425b22f89e63a11aeb089f856a680 (diff) |
rebuildnodes: Support graceful shutdown
Diffstat (limited to 'cmd/btrfs-rec/util.go')
-rw-r--r-- | cmd/btrfs-rec/util.go | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/cmd/btrfs-rec/util.go b/cmd/btrfs-rec/util.go index ffc03cc..9a0d60c 100644 --- a/cmd/btrfs-rec/util.go +++ b/cmd/btrfs-rec/util.go @@ -18,6 +18,7 @@ import ( ) type runeScanner struct { + ctx context.Context //nolint:containedctx // For detecting shutdown from methods progress textui.Portion[int64] progressWriter *textui.Progress[textui.Portion[int64]] unreadCnt uint64 @@ -31,6 +32,7 @@ func newRuneScanner(ctx context.Context, fh *os.File) (*runeScanner, error) { return nil, err } ret := &runeScanner{ + ctx: ctx, progress: textui.Portion[int64]{ D: fi.Size(), }, @@ -42,6 +44,9 @@ func newRuneScanner(ctx context.Context, fh *os.File) (*runeScanner, error) { } func (rs *runeScanner) ReadRune() (r rune, size int, err error) { + if err := rs.ctx.Err(); err != nil { + return 0, 0, err + } r, size, err = rs.reader.ReadRune() if rs.unreadCnt > 0 { rs.unreadCnt-- @@ -53,8 +58,14 @@ func (rs *runeScanner) ReadRune() (r rune, size int, err error) { } func (rs *runeScanner) UnreadRune() error { + if err := rs.ctx.Err(); err != nil { + return err + } + if err := rs.reader.UnreadRune(); err != nil { + return err + } rs.unreadCnt++ - return rs.reader.UnreadRune() + return nil } func (rs *runeScanner) Close() error { @@ -69,6 +80,9 @@ func readJSONFile[T any](ctx context.Context, filename string) (T, error) { return zero, err } buf, err := newRuneScanner(dlog.WithField(ctx, "btrfs.read-json-file", filename), fh) + defer func() { + _ = buf.Close() + }() if err != nil { var zero T return zero, err @@ -78,7 +92,6 @@ func readJSONFile[T any](ctx context.Context, filename string) (T, error) { var zero T return zero, err } - _ = buf.Close() return ret, nil } |