feat: add wrap for panic

This commit is contained in:
崔竞宁
2022-09-14 12:19:32 +08:00
parent a63d804054
commit 5e4e39988a
4 changed files with 47 additions and 17 deletions

2
acp.go
View File

@@ -85,7 +85,7 @@ func New(ctx context.Context, opts ...Option) (*Copyer, error) {
}
c.running.Add(1)
go c.run(ctx)
go wrap(ctx, func() { c.run(ctx) })
return c, nil
}

24
copy.go
View File

@@ -30,7 +30,7 @@ func (c *Copyer) copy(ctx context.Context) {
wg := new(sync.WaitGroup)
wg.Add(1)
go func() {
go wrap(ctx, func() {
defer wg.Done()
defer close(c.writePipe)
@@ -43,11 +43,11 @@ func (c *Copyer) copy(ctx context.Context) {
default:
}
}
}()
})
for i := 0; i < c.threads; i++ {
wg.Add(1)
go func() {
go wrap(ctx, func() {
defer wg.Done()
for {
@@ -63,20 +63,20 @@ func (c *Copyer) copy(ctx context.Context) {
return
}
}
}()
})
}
go func() {
go wrap(ctx, func() {
for job := range c.postPipe {
c.post(wg, job)
}
}()
})
finished := make(chan struct{}, 1)
go func() {
go wrap(ctx, func() {
wg.Wait()
finished <- struct{}{}
}()
})
select {
case <-finished:
@@ -154,7 +154,7 @@ func (c *Copyer) write(ctx context.Context, job *writeJob) {
chans = append(chans, ch)
wg.Add(1)
go func() {
go wrap(ctx, func() {
defer wg.Done()
defer sha256Pool.Put(sha)
@@ -163,7 +163,7 @@ func (c *Copyer) write(ctx context.Context, job *writeJob) {
}
job.setHash(sha.Sum(nil))
}()
})
}
var readErr error
@@ -187,7 +187,7 @@ func (c *Copyer) write(ctx context.Context, job *writeJob) {
chans = append(chans, ch)
wg.Add(1)
go func() {
go wrap(ctx, func() {
defer wg.Done()
var rerr error
@@ -230,7 +230,7 @@ func (c *Copyer) write(ctx context.Context, job *writeJob) {
if readErr != nil {
rerr = readErr
}
}()
})
}
if len(chans) == 0 {

View File

@@ -44,7 +44,7 @@ func (c *Copyer) startProgressBar(ctx context.Context) {
ch <- func() { logrus.StandardLogger().Logf(l, format, args...) }
}
go func() {
go wrap(ctx, func() {
copying := make(map[int64]struct{}, c.threads)
for f := range ch {
@@ -77,9 +77,9 @@ func (c *Copyer) startProgressBar(ctx context.Context) {
v()
}
}
}()
})
go func() {
go wrap(ctx, func() {
defer close(ch)
ticker := time.NewTicker(barUpdateInterval) // around 255ms, avoid conflict with progress bar fresh by second
@@ -112,5 +112,5 @@ func (c *Copyer) startProgressBar(ctx context.Context) {
return
}
}
}()
})
}

30
recover.go Normal file
View File

@@ -0,0 +1,30 @@
package acp
import (
"context"
"fmt"
"runtime/debug"
"github.com/sirupsen/logrus"
)
func wrap(ctx context.Context, f func()) {
defer func() {
e := recover()
if e == nil {
return
}
var err error
switch v := e.(type) {
case error:
err = v
default:
err = fmt.Errorf("%v", err)
}
logrus.WithContext(ctx).WithError(err).Errorf("panic: %s", debug.Stack())
}()
f()
}