summaryrefslogtreecommitdiff
path: root/cmd/btrfs-rec/util.go
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2022-12-28 18:49:09 -0700
committerLuke Shumaker <lukeshu@lukeshu.com>2023-01-05 19:48:17 -0700
commit8efc82d0b1a167830970135c78d173667080b116 (patch)
tree2dca71998f517fc80448ed6cdd3a6753a86926fa /cmd/btrfs-rec/util.go
parent52c1eb7a44f425b22f89e63a11aeb089f856a680 (diff)
rebuildnodes: Support graceful shutdown
Diffstat (limited to 'cmd/btrfs-rec/util.go')
-rw-r--r--cmd/btrfs-rec/util.go17
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
}