Fix a deadlock

pull/115/head
Andy Wang 4 years ago
parent 360f84c5d5
commit d2b17fc9a2

@ -33,10 +33,10 @@ func MakeUserPanel(manager usermanager.UserManager) *userPanel {
// GetBypassUser does the same as GetUser except it unconditionally creates an ActiveUser when the UID isn't already active
func (panel *userPanel) GetBypassUser(UID []byte) (*ActiveUser, error) {
panel.activeUsersM.Lock()
defer panel.activeUsersM.Unlock()
var arrUID [16]byte
copy(arrUID[:], UID)
if user, ok := panel.activeUsers[arrUID]; ok {
panel.activeUsersM.Unlock()
return user, nil
}
user := &ActiveUser{
@ -47,7 +47,6 @@ func (panel *userPanel) GetBypassUser(UID []byte) (*ActiveUser, error) {
}
copy(user.arrUID[:], UID)
panel.activeUsers[user.arrUID] = user
panel.activeUsersM.Unlock()
return user, nil
}
@ -55,16 +54,15 @@ func (panel *userPanel) GetBypassUser(UID []byte) (*ActiveUser, error) {
// UID with UserInfo queried from the UserManger, should the particular UID is allowed to connect
func (panel *userPanel) GetUser(UID []byte) (*ActiveUser, error) {
panel.activeUsersM.Lock()
defer panel.activeUsersM.Unlock()
var arrUID [16]byte
copy(arrUID[:], UID)
if user, ok := panel.activeUsers[arrUID]; ok {
panel.activeUsersM.Unlock()
return user, nil
}
upRate, downRate, err := panel.Manager.AuthenticateUser(UID)
if err != nil {
panel.activeUsersM.Unlock()
return nil, err
}
valve := mux.MakeValve(upRate, downRate)
@ -76,7 +74,6 @@ func (panel *userPanel) GetUser(UID []byte) (*ActiveUser, error) {
copy(user.arrUID[:], UID)
panel.activeUsers[user.arrUID] = user
panel.activeUsersM.Unlock()
return user, nil
}
@ -150,6 +147,7 @@ func (panel *userPanel) updateUsageQueueForOne(user *ActiveUser) {
// and act to each user according to the responses
func (panel *userPanel) commitUpdate() error {
panel.usageUpdateQueueM.Lock()
defer panel.usageUpdateQueueM.Unlock()
statuses := make([]usermanager.StatusUpdate, 0, len(panel.usageUpdateQueue))
for arrUID, usage := range panel.usageUpdateQueue {
panel.activeUsersM.RLock()
@ -188,7 +186,6 @@ func (panel *userPanel) commitUpdate() error {
}
}
panel.usageUpdateQueue = make(map[[16]byte]*usagePair)
panel.usageUpdateQueueM.Unlock()
return nil
}

Loading…
Cancel
Save