mirror of
https://github.com/GopeedLab/gopeed.git
synced 2026-11-15 04:43:41 +00:00
fix:current writes map (#182)
This commit is contained in:
1 parent
85ef8d3be4
commit
e63cfca82a
1 file changed
+15
-5
@@ -47,8 +47,9 @@ type Downloader struct {
|
|||||||
tasks []*Task
|
tasks []*Task
|
||||||
listener Listener
|
listener Listener
|
||||||
|
|
||||||
lock *sync.Mutex
|
lock *sync.Mutex
|
||||||
closed atomic.Bool
|
fetcherMapLock *sync.RWMutex
|
||||||
|
closed atomic.Bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDownloader(cfg *DownloaderConfig) *Downloader {
|
func NewDownloader(cfg *DownloaderConfig) *Downloader {
|
||||||
@@ -63,8 +64,9 @@ func NewDownloader(cfg *DownloaderConfig) *Downloader {
|
|||||||
fetchBuilders: make(map[string]fetcher.FetcherBuilder),
|
fetchBuilders: make(map[string]fetcher.FetcherBuilder),
|
||||||
fetcherMap: make(map[string]fetcher.Fetcher),
|
fetcherMap: make(map[string]fetcher.Fetcher),
|
||||||
|
|
||||||
storage: cfg.Storage,
|
storage: cfg.Storage,
|
||||||
lock: &sync.Mutex{},
|
lock: &sync.Mutex{},
|
||||||
|
fetcherMapLock: &sync.RWMutex{},
|
||||||
}
|
}
|
||||||
for _, f := range cfg.FetchBuilders {
|
for _, f := range cfg.FetchBuilders {
|
||||||
for _, p := range f.Schemes() {
|
for _, p := range f.Schemes() {
|
||||||
@@ -198,7 +200,9 @@ func (d *Downloader) Resolve(req *base.Request) (rr *ResolveResult, err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
d.fetcherMapLock.Lock()
|
||||||
d.fetcherMap[rrId] = fetcher
|
d.fetcherMap[rrId] = fetcher
|
||||||
|
d.fetcherMapLock.Unlock()
|
||||||
rr = &ResolveResult{
|
rr = &ResolveResult{
|
||||||
ID: rrId,
|
ID: rrId,
|
||||||
Res: fetcher.Meta().Res,
|
Res: fetcher.Meta().Res,
|
||||||
@@ -218,11 +222,17 @@ func (d *Downloader) Create(rrId string, opts *base.Options) (taskId string, err
|
|||||||
if opts == nil {
|
if opts == nil {
|
||||||
opts = &base.Options{}
|
opts = &base.Options{}
|
||||||
}
|
}
|
||||||
|
d.fetcherMapLock.RLock()
|
||||||
fetcher, ok := d.fetcherMap[rrId]
|
fetcher, ok := d.fetcherMap[rrId]
|
||||||
|
d.fetcherMapLock.RUnlock()
|
||||||
if !ok {
|
if !ok {
|
||||||
return "", errors.New("invalid resource id")
|
return "", errors.New("invalid resource id")
|
||||||
}
|
}
|
||||||
defer delete(d.fetcherMap, rrId)
|
defer func() {
|
||||||
|
d.fetcherMapLock.Lock()
|
||||||
|
delete(d.fetcherMap, rrId)
|
||||||
|
d.fetcherMapLock.Unlock()
|
||||||
|
}()
|
||||||
|
|
||||||
meta := fetcher.Meta()
|
meta := fetcher.Meta()
|
||||||
meta.Opts = opts
|
meta.Opts = opts
|
||||||
|
|||||||
Reference in new issue
Block a user