fix(fs): deadlock when get link error (#963)

This commit is contained in:
j2rong4cn
2025-08-02 17:49:53 +08:00
committed by GitHub
parent 58dbf088f9
commit 6b096bcad4
2 changed files with 2 additions and 2 deletions

View File

@ -295,7 +295,6 @@ func Link(ctx context.Context, storage driver.Driver, path string, args model.Li
fn := func() (*model.Link, error) { fn := func() (*model.Link, error) {
link, err := storage.Link(ctx, file, args) link, err := storage.Link(ctx, file, args)
if err != nil { if err != nil {
linkG.Forget(key)
return nil, errors.Wrapf(err, "failed get link") return nil, errors.Wrapf(err, "failed get link")
} }
if link.Expiration != nil { if link.Expiration != nil {

View File

@ -74,6 +74,7 @@ type Group[T any] struct {
mu sync.Mutex // protects m mu sync.Mutex // protects m
m map[string]*call[T] // lazily initialized m map[string]*call[T] // lazily initialized
// Won't remember error
Remember bool Remember bool
} }
@ -158,7 +159,7 @@ func (g *Group[T]) doCall(c *call[T], key string, fn func() (T, error)) {
g.mu.Lock() g.mu.Lock()
defer g.mu.Unlock() defer g.mu.Unlock()
c.wg.Done() c.wg.Done()
if !g.Remember && g.m[key] == c { if (!g.Remember || c.err != nil) && g.m[key] == c {
delete(g.m, key) delete(g.m, key)
} }