Skip to content

Commit

Permalink
Optimize the logic of acquiring or releasing LockManager from the Fre…
Browse files Browse the repository at this point in the history
…eLockManager queue
  • Loading branch information
snower committed Dec 27, 2024
1 parent 724fa19 commit 4031051
Showing 1 changed file with 24 additions and 32 deletions.
56 changes: 24 additions & 32 deletions server/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -1035,24 +1035,20 @@ func (self *LockDB) flushExpriedCheckLock(lock *Lock, doExpriedLocks []*Lock) []
return doExpriedLocks
}

func (self *LockDB) initNewLockManager(dbId uint8) {
func (self *LockDB) initNewLockManager(dbId uint8, freeLockManagerTail uint32) {
for i := uint16(0); i < self.managerMaxGlocks; i++ {
self.managerGlocks[i].HighPriorityMutexWait()
}

self.glock.Lock()
lockManager := self.freeLockManagers[self.freeLockManagerTail%self.maxFreeLockManagerCount]
lockManager := self.freeLockManagers[freeLockManagerTail%self.maxFreeLockManagerCount]
if lockManager != nil {
self.glock.Unlock()
return
}

lockManagers := make([]LockManager, 16)
for i := 0; i < 16; i++ {
if self.freeLockManagers[(self.freeLockManagerHead+1)%self.maxFreeLockManagerCount] != nil {
self.glock.Unlock()
return
}
freeLockManagerHead := atomic.AddUint32(&self.freeLockManagerHead, 1) % self.maxFreeLockManagerCount
if self.freeLockManagers[freeLockManagerHead] != nil {
self.glock.Unlock()
Expand Down Expand Up @@ -1088,7 +1084,7 @@ func (self *LockDB) GetOrNewLockManager(command *protocol.LockCommand) *LockMana
freeLockManagerTail := atomic.AddUint32(&self.freeLockManagerTail, 1) % self.maxFreeLockManagerCount
lockManager := self.freeLockManagers[freeLockManagerTail]
for lockManager == nil {
self.initNewLockManager(command.DbId)
self.initNewLockManager(command.DbId, freeLockManagerTail)
lockManager = self.freeLockManagers[freeLockManagerTail]
}
self.freeLockManagers[freeLockManagerTail] = nil
Expand Down Expand Up @@ -1124,7 +1120,7 @@ func (self *LockDB) GetOrNewLockManager(command *protocol.LockCommand) *LockMana
freeLockManagerTail := atomic.AddUint32(&self.freeLockManagerTail, 1) % self.maxFreeLockManagerCount
lockManager := self.freeLockManagers[freeLockManagerTail]
for lockManager == nil {
self.initNewLockManager(command.DbId)
self.initNewLockManager(command.DbId, freeLockManagerTail)
lockManager = self.freeLockManagers[freeLockManagerTail]
}
self.freeLockManagers[freeLockManagerTail] = nil
Expand Down Expand Up @@ -1178,21 +1174,19 @@ func (self *LockDB) RemoveLockManager(lockManager *LockManager) {
fastValue.manager = nil
atomic.AddUint32(&fastValue.lock, 0xffffffff)

if self.freeLockManagers[(self.freeLockManagerHead+1)%self.maxFreeLockManagerCount] == nil {
freeLockManagerHead := atomic.AddUint32(&self.freeLockManagerHead, 1) % self.maxFreeLockManagerCount
if self.freeLockManagers[freeLockManagerHead] == nil {
self.freeLockManagers[freeLockManagerHead] = lockManager
freeLockManagerHead := atomic.AddUint32(&self.freeLockManagerHead, 1) % self.maxFreeLockManagerCount
if self.freeLockManagers[freeLockManagerHead] == nil {
self.freeLockManagers[freeLockManagerHead] = lockManager

lockManager.locks = nil
if lockManager.waitLocks != nil {
lockManager.waitLocks.Rellac()
}
lockManager.currentData = nil
atomic.AddUint32(&lockManager.state.KeyCount, 0xffffffff)
return
lockManager.locks = nil
if lockManager.waitLocks != nil {
lockManager.waitLocks.Rellac()
}
atomic.AddUint32(&self.freeLockManagerHead, 0xffffffff)
lockManager.currentData = nil
atomic.AddUint32(&lockManager.state.KeyCount, 0xffffffff)
return
}
atomic.AddUint32(&self.freeLockManagerHead, 0xffffffff)

lockManager.currentLock = nil
lockManager.currentData = nil
Expand All @@ -1217,21 +1211,19 @@ func (self *LockDB) RemoveLockManager(lockManager *LockManager) {
0, 0, 0, 0, 0, 0, 0, 0
lockManager.fastKeyValue = nil

if self.freeLockManagers[(self.freeLockManagerHead+1)%self.maxFreeLockManagerCount] == nil {
freeLockManagerHead := atomic.AddUint32(&self.freeLockManagerHead, 1) % self.maxFreeLockManagerCount
if self.freeLockManagers[freeLockManagerHead] == nil {
self.freeLockManagers[freeLockManagerHead] = lockManager
freeLockManagerHead := atomic.AddUint32(&self.freeLockManagerHead, 1) % self.maxFreeLockManagerCount
if self.freeLockManagers[freeLockManagerHead] == nil {
self.freeLockManagers[freeLockManagerHead] = lockManager

lockManager.locks = nil
if lockManager.waitLocks != nil {
lockManager.waitLocks.Rellac()
}
lockManager.currentData = nil
atomic.AddUint32(&lockManager.state.KeyCount, 0xffffffff)
return
lockManager.locks = nil
if lockManager.waitLocks != nil {
lockManager.waitLocks.Rellac()
}
atomic.AddUint32(&self.freeLockManagerHead, 0xffffffff)
lockManager.currentData = nil
atomic.AddUint32(&lockManager.state.KeyCount, 0xffffffff)
return
}
atomic.AddUint32(&self.freeLockManagerHead, 0xffffffff)

lockManager.currentLock = nil
lockManager.currentData = nil
Expand Down

0 comments on commit 4031051

Please sign in to comment.