Merge pull request #1700 from jaffee/reduce-rlock-scope-mutex-check

Reduce rlock scope mutex check
This commit is contained in:
Matthew Jaffee 2021-09-15 09:52:41 -05:00 committed by GitHub
commit 6832b842b4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 3 deletions

View file

@ -1235,9 +1235,14 @@ func (f *Field) MutexCheck(ctx context.Context, qcx *Qcx, details bool, limit in
if f.Type() != FieldTypeMutex {
return nil, errors.New("mutex check only valid for mutex fields")
}
// Rather than deferring the unlock, we grab the standard view
// from the field's viewMap and unlock immediately. This avoids
// holding the rlock for a potentially long time which blocks any
// write lock, and pending write locks block other read locks.
f.mu.RLock()
defer f.mu.RUnlock()
standard := f.viewMap[viewStandard]
f.mu.RUnlock()
if standard == nil {
// no standard view present means we've never needed to create it,
// so it has no bits set, so it has no extra bits set.

View file

@ -301,8 +301,8 @@ func (v *view) Fragment(shard uint64) *fragment {
// allFragments returns a list of all fragments in the view.
func (v *view) allFragments() []*fragment {
v.mu.Lock()
defer v.mu.Unlock()
v.mu.RLock()
defer v.mu.RUnlock()
other := make([]*fragment, 0, len(v.fragments))
for _, fragment := range v.fragments {