mirror of
https://github.com/OpenListTeam/OpenList.git
synced 2025-09-19 12:16:24 +08:00
fix(fs): deadlock when get link error (#963)
This commit is contained in:
@ -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 {
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user