stores: Deduplicate parallel stat requests
This commit is contained in:
parent
e793d7e128
commit
1249809283
51
extern/sector-storage/stores/local.go
vendored
51
extern/sector-storage/stores/local.go
vendored
@ -85,9 +85,58 @@ type path struct {
|
|||||||
|
|
||||||
reserved int64
|
reserved int64
|
||||||
reservations map[abi.SectorID]storiface.SectorFileType
|
reservations map[abi.SectorID]storiface.SectorFileType
|
||||||
|
|
||||||
|
statLk sync.Mutex
|
||||||
|
statDone chan struct{}
|
||||||
|
|
||||||
|
lastStat *fsutil.FsStat // nil if no stat / was error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *path) stat(ls LocalStorage) (fsutil.FsStat, error) {
|
func (p *path) stat(ls LocalStorage) (fsutil.FsStat, error) {
|
||||||
|
for {
|
||||||
|
p.statLk.Lock()
|
||||||
|
if p.statDone == nil {
|
||||||
|
p.statDone = make(chan struct{})
|
||||||
|
p.statLk.Unlock()
|
||||||
|
|
||||||
|
st, err := p.doStat(ls)
|
||||||
|
|
||||||
|
p.statLk.Lock()
|
||||||
|
p.lastStat = nil
|
||||||
|
if err == nil {
|
||||||
|
p.lastStat = &st
|
||||||
|
}
|
||||||
|
close(p.statDone)
|
||||||
|
p.statDone = nil
|
||||||
|
p.statLk.Unlock()
|
||||||
|
return st, err
|
||||||
|
}
|
||||||
|
|
||||||
|
doneCh := p.statDone
|
||||||
|
p.statLk.Unlock()
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-doneCh:
|
||||||
|
// todo context?
|
||||||
|
}
|
||||||
|
|
||||||
|
p.statLk.Lock()
|
||||||
|
if p.lastStat == nil {
|
||||||
|
p.statLk.Unlock()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
st := *p.lastStat
|
||||||
|
|
||||||
|
p.statLk.Unlock()
|
||||||
|
|
||||||
|
return st, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *path) doStat(ls LocalStorage) (fsutil.FsStat, error) {
|
||||||
|
start := time.Now()
|
||||||
|
|
||||||
stat, err := ls.Stat(p.local)
|
stat, err := ls.Stat(p.local)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fsutil.FsStat{}, xerrors.Errorf("stat %s: %w", p.local, err)
|
return fsutil.FsStat{}, xerrors.Errorf("stat %s: %w", p.local, err)
|
||||||
@ -155,6 +204,8 @@ func (p *path) stat(ls LocalStorage) (fsutil.FsStat, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.Infow("storage stat", "took", time.Now().Sub(start), "reservations", len(p.reservations))
|
||||||
|
|
||||||
return stat, err
|
return stat, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user