v1.27.0-a #10

Closed
jonathanface wants to merge 473 commits from v1.27.0-a into master
Showing only changes of commit 5e1d8f661e - Show all commits

View File

@ -461,42 +461,23 @@ func (st *Local) reportStorage(ctx context.Context) {
} }
func (st *Local) Reserve(ctx context.Context, sid storiface.SectorRef, ft storiface.SectorFileType, storageIDs storiface.SectorPaths, overheadTab map[storiface.SectorFileType]int) (release func(), err error) { func (st *Local) Reserve(ctx context.Context, sid storiface.SectorRef, ft storiface.SectorFileType, storageIDs storiface.SectorPaths, overheadTab map[storiface.SectorFileType]int) (release func(), err error) {
ssize, err := sid.ProofType.SectorSize() var ssize abi.SectorSize
ssize, err = sid.ProofType.SectorSize()
if err != nil { if err != nil {
return nil, err return nil, err
} }
release = func() {}
st.localLk.Lock() st.localLk.Lock()
var releaseCalled bool
// double release debug guard
var firstDonebuf []byte
var releaseFuncs []func()
release = func() {
for _, releaseFunc := range releaseFuncs {
releaseFunc()
}
// debug guard against double release call
if releaseCalled {
curStack := make([]byte, 20480)
curStack = curStack[:runtime.Stack(curStack, false)]
log.Errorw("double release call", "sector", sid, "fileType", ft, "prevStack", string(firstDonebuf), "curStack", string(curStack))
}
firstDonebuf = make([]byte, 20480)
firstDonebuf = firstDonebuf[:runtime.Stack(firstDonebuf, false)]
releaseCalled = true
}
cleanupOnError := func() { release() }
defer func() { defer func() {
st.localLk.Unlock() st.localLk.Unlock()
cleanupOnError() if err != nil {
release()
release = func() {}
} else {
release = DoubleCallWrap(release)
}
}() }()
for _, fileType := range ft.AllSet() { for _, fileType := range ft.AllSet() {
@ -531,21 +512,33 @@ func (st *Local) Reserve(ctx context.Context, sid storiface.SectorRef, ft storif
p.reserved += overhead p.reserved += overhead
p.reservations[resID] = overhead p.reservations[resID] = overhead
releaseFuncs = append(releaseFuncs, func() { old_r := release
release = func() {
old_r()
st.localLk.Lock() st.localLk.Lock()
defer st.localLk.Unlock() defer st.localLk.Unlock()
log.Debugw("reserve release", "id", id, "sector", sid, "fileType", fileType, "overhead", overhead, "reserved-before", p.reserved, "reserved-after", p.reserved-overhead) log.Debugw("reserve release", "id", id, "sector", sid, "fileType", fileType, "overhead", overhead, "reserved-before", p.reserved, "reserved-after", p.reserved-overhead)
p.reserved -= overhead p.reserved -= overhead
delete(p.reservations, resID) delete(p.reservations, resID)
}) }
} }
// no errors, don't cleanup, caller will call release return
cleanupOnError = func() {} }
return release, nil // DoubleCallWrap wraps a function to make sure it's not called twice
func DoubleCallWrap(f func()) func() {
var stack []byte
return func() {
curStack := make([]byte, 20480)
curStack = curStack[:runtime.Stack(curStack, false)]
if len(stack) > 0 {
log.Warnf("double call from:\n%s\nBut originally from:", curStack, stack)
return
}
stack = curStack
f()
}
} }
func (st *Local) AcquireSector(ctx context.Context, sid storiface.SectorRef, existing storiface.SectorFileType, allocate storiface.SectorFileType, pathType storiface.PathType, op storiface.AcquireMode, opts ...storiface.AcquireOption) (storiface.SectorPaths, storiface.SectorPaths, error) { func (st *Local) AcquireSector(ctx context.Context, sid storiface.SectorRef, existing storiface.SectorFileType, allocate storiface.SectorFileType, pathType storiface.PathType, op storiface.AcquireMode, opts ...storiface.AcquireOption) (storiface.SectorPaths, storiface.SectorPaths, error) {