fix(metanode): verlist's lock may fall into a deadlock because of lock reentrancy and other lock concurrency

Signed-off-by: leonrayang <chl696@sina.com>
This commit is contained in:
leonrayang 2024-01-23 20:33:55 +08:00 committed by leonrayang
parent bfd3174895
commit 4a7d43e898
2 changed files with 5 additions and 2 deletions

View File

@ -70,11 +70,16 @@ func (mp *metaPartition) fsmRemoveXAttr(reqExtend *Extend) (err error) {
if reqExtend.verSeq == math.MaxUint64 {
reqExtend.verSeq = 0
}
e.versionMu.Lock()
defer e.versionMu.Unlock()
if reqExtend.verSeq < e.GetMinVer() {
return
}
mp.multiVersionList.RWLock.RLock()
defer mp.multiVersionList.RWLock.RUnlock()
if reqExtend.verSeq > e.verSeq {
e.multiVers = append([]*Extend{e.Copy().(*Extend)}, e.multiVers...)
e.verSeq = reqExtend.verSeq

View File

@ -390,8 +390,6 @@ func (v *VolVersionInfoList) GetNextOlderVer(ver uint64) (verSeq uint64, err err
}
func (v *VolVersionInfoList) GetNextNewerVer(ver uint64) (verSeq uint64, err error) {
v.RWLock.RLock()
defer v.RWLock.RUnlock()
log.LogDebugf("getNextOlderVer ver %v", ver)
for idx, info := range v.VerList {
log.LogDebugf("getNextOlderVer id %v ver %v info %v", idx, info.Ver, info)