From 8f18cbae3afe8c94eab773eba613e72aecd5f255 Mon Sep 17 00:00:00 2001 From: bel Date: Sat, 17 May 2025 20:53:15 -0600 Subject: [PATCH] fix small Read() big rate for slow.Reader --- src/asses/one.go | 16 +++++++++++++++- src/asses/one_test.go | 4 ++++ src/slow/reader.go | 22 ++++++++++++++-------- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/asses/one.go b/src/asses/one.go index 208917d..4e2aa3a 100644 --- a/src/asses/one.go +++ b/src/asses/one.go @@ -11,9 +11,23 @@ import ( "os" "path" "show-rss/src/slow" + "strconv" + "golang.org/x/time/rate" "time" ) +var EnvCksumBPS = func() int { + s := os.Getenv("CKSUM_BPS") + if s == "" { + return 50_000_000 + } + n, err := strconv.Atoi(s) + if err != nil || n < 1 { + panic(err) + } + return n +}() + func One(ctx context.Context, p string) error { shortp := path.Join("...", path.Base(path.Dir(p)), path.Base(p)) @@ -86,6 +100,6 @@ func Cksum(ctx context.Context, p string) (string, error) { defer f.Close() hasher := md5.New() - _, err = io.Copy(hasher, slow.NewReader(ctx, 50_000_000, f)) + _, err = io.Copy(hasher, slow.NewReader(ctx, rate.Limit(EnvCksumBPS), f)) return base64.StdEncoding.EncodeToString(hasher.Sum(nil)), err } diff --git a/src/asses/one_test.go b/src/asses/one_test.go index 0777525..dc07070 100644 --- a/src/asses/one_test.go +++ b/src/asses/one_test.go @@ -17,20 +17,24 @@ func TestOne(t *testing.T) { p := path.Join(d, "f.mkv") os.WriteFile(p, b, os.ModePerm) + t.Logf("initial cksum...") cksum, _ := asses.Cksum(context.Background(), p) + t.Logf("one && one...") if err := asses.One(ctx, p); err != nil { t.Fatal(err) } else if err := asses.One(ctx, p); err != nil { t.Fatal(err) } + t.Logf("test -f...") if _, err := os.Stat(p); err != nil { t.Fatalf("lost original mkv: %v", err) } else if _, err := os.Stat(path.Join(d, "f.srt")); err != nil { t.Fatalf("no new srt: %v", err) } + t.Logf("final cksum...") newCksum, _ := asses.Cksum(context.Background(), p) if cksum == newCksum { t.Fatalf("cksum unchanged") diff --git a/src/slow/reader.go b/src/slow/reader.go index ac9ddf8..26a2aa1 100644 --- a/src/slow/reader.go +++ b/src/slow/reader.go @@ -9,30 +9,36 @@ import ( type Reader struct { ctx context.Context - limiter *rate.Limiter + limiter rate.Limiter r io.Reader } -var _ io.Reader = Reader{} +var _ io.Reader = &Reader{} -func NewReader(ctx context.Context, bps rate.Limit, r io.Reader) Reader { - return Reader{ +func NewReader(ctx context.Context, bps rate.Limit, r io.Reader) *Reader { + return &Reader{ ctx: ctx, - limiter: rate.NewLimiter(bps, int(bps)), + limiter: *rate.NewLimiter(bps, int(bps)), r: r, } } -func (r Reader) Read(b []byte) (int, error) { +func (r *Reader) Read(b []byte) (int, error) { n, err := r.r.Read(b) m := 0 burst := r.limiter.Burst() for m < n { - if err := r.limiter.WaitN(r.ctx, burst); err != nil { + page := burst + if left := n - m; page > left { + page = left + } + + if err := r.limiter.WaitN(r.ctx, page); err != nil { return n, err } - m += burst + + m += page } return n, err