Skip to content

Commit fe6c702

Browse files
committed
Fix potential concurrent map write
1 parent b3191eb commit fe6c702

File tree

1 file changed

+13
-11
lines changed

1 file changed

+13
-11
lines changed

acceptor.go

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ type Acceptor struct {
2828
dynamicQualifier bool
2929
dynamicQualifierCount int
3030
dynamicSessionChan chan *session
31-
sessionAddr map[SessionID]net.Addr
31+
sessionAddr sync.Map
3232
sessionHostPort map[SessionID]int
3333
listeners map[string]net.Listener
3434
connectionValidator ConnectionValidator
@@ -89,13 +89,12 @@ func (a *Acceptor) Start() (err error) {
8989
}
9090
}
9191

92-
for sessionID := range a.sessions {
93-
session := a.sessions[sessionID]
92+
for _, s := range a.sessions {
9493
a.sessionGroup.Add(1)
95-
go func() {
96-
session.run()
94+
go func(s *session) {
95+
s.run()
9796
a.sessionGroup.Done()
98-
}()
97+
}(s)
9998
}
10099
if a.dynamicSessions {
101100
a.dynamicSessionChan = make(chan *session)
@@ -133,8 +132,12 @@ func (a *Acceptor) Stop() {
133132

134133
//Get remote IP address for a given session.
135134
func (a *Acceptor) RemoteAddr(sessionID SessionID) (net.Addr, bool) {
136-
addr, ok := a.sessionAddr[sessionID]
137-
return addr, ok
135+
addr, ok := a.sessionAddr.Load(sessionID)
136+
if !ok || addr == nil {
137+
return nil, false
138+
}
139+
val, ok := addr.(net.Addr)
140+
return val, ok
138141
}
139142

140143
//NewAcceptor creates and initializes a new Acceptor.
@@ -145,7 +148,6 @@ func NewAcceptor(app Application, storeFactory MessageStoreFactory, settings *Se
145148
settings: settings,
146149
logFactory: logFactory,
147150
sessions: make(map[SessionID]*session),
148-
sessionAddr: make(map[SessionID]net.Addr),
149151
sessionHostPort: make(map[SessionID]int),
150152
listeners: make(map[string]net.Listener),
151153
}
@@ -320,7 +322,7 @@ func (a *Acceptor) handleConnection(netConn net.Conn) {
320322
defer session.stop()
321323
}
322324

323-
a.sessionAddr[sessID] = netConn.RemoteAddr()
325+
a.sessionAddr.Store(sessID, netConn.RemoteAddr())
324326
msgIn := make(chan fixIn)
325327
msgOut := make(chan []byte)
326328

@@ -367,7 +369,7 @@ LOOP:
367369
case id := <-complete:
368370
session, ok := sessions[id]
369371
if ok {
370-
delete(a.sessionAddr, session.sessionID)
372+
a.sessionAddr.Delete(session.sessionID)
371373
delete(sessions, id)
372374
} else {
373375
a.globalLog.OnEventf("Missing dynamic session %v!", id)

0 commit comments

Comments
 (0)