Skip to content

Commit 9465e00

Browse files
authored
fix: add lock for concurrent map access (#73)
* fix: add lock for concurrent map access * fix: use two locks
1 parent 1c2d379 commit 9465e00

1 file changed

Lines changed: 19 additions & 4 deletions

File tree

server/enforcer.go

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"errors"
2020
"io/ioutil"
2121
"strings"
22+
"sync"
2223

2324
pb "github.com/casbin/casbin-server/proto"
2425
"github.com/casbin/casbin/v2"
@@ -30,6 +31,8 @@ import (
3031
type Server struct {
3132
enforcerMap map[int]*casbin.Enforcer
3233
adapterMap map[int]persist.Adapter
34+
muE sync.RWMutex
35+
muA sync.RWMutex
3336
}
3437

3538
func NewServer() *Server {
@@ -42,28 +45,40 @@ func NewServer() *Server {
4245
}
4346

4447
func (s *Server) getEnforcer(handle int) (*casbin.Enforcer, error) {
45-
if _, ok := s.enforcerMap[handle]; ok {
46-
return s.enforcerMap[handle], nil
48+
s.muE.RLock()
49+
defer s.muE.RUnlock()
50+
51+
if e, ok := s.enforcerMap[handle]; ok {
52+
return e, nil
4753
} else {
4854
return nil, errors.New("enforcer not found")
4955
}
5056
}
5157

5258
func (s *Server) getAdapter(handle int) (persist.Adapter, error) {
53-
if _, ok := s.adapterMap[handle]; ok {
54-
return s.adapterMap[handle], nil
59+
s.muA.RLock()
60+
defer s.muA.RUnlock()
61+
62+
if a, ok := s.adapterMap[handle]; ok {
63+
return a, nil
5564
} else {
5665
return nil, errors.New("adapter not found")
5766
}
5867
}
5968

6069
func (s *Server) addEnforcer(e *casbin.Enforcer) int {
70+
s.muE.Lock()
71+
defer s.muE.Unlock()
72+
6173
cnt := len(s.enforcerMap)
6274
s.enforcerMap[cnt] = e
6375
return cnt
6476
}
6577

6678
func (s *Server) addAdapter(a persist.Adapter) int {
79+
s.muA.Lock()
80+
defer s.muA.Unlock()
81+
6782
cnt := len(s.adapterMap)
6883
s.adapterMap[cnt] = a
6984
return cnt

0 commit comments

Comments
 (0)