fix data race in device manager plugin hander

This commit is contained in:
Paco Xu 2022-05-06 18:38:14 +08:00
parent 9ac6b3af5f
commit 0ec7e38ef0
2 changed files with 22 additions and 20 deletions

View File

@ -44,10 +44,9 @@ func (s *server) RegisterPlugin(pluginName string, endpoint string, versions []s
func (s *server) DeRegisterPlugin(pluginName string) { func (s *server) DeRegisterPlugin(pluginName string) {
klog.V(2).InfoS("Deregistering plugin", "plugin", pluginName) klog.V(2).InfoS("Deregistering plugin", "plugin", pluginName)
s.mutex.Lock() client := s.getClient(pluginName)
defer s.mutex.Unlock() if client != nil {
if _, exists := s.clients[pluginName]; exists { s.disconnectClient(pluginName, client)
s.disconnectClient(pluginName)
} }
} }
@ -82,8 +81,7 @@ func (s *server) connectClient(name string, socketPath string) error {
return nil return nil
} }
func (s *server) disconnectClient(name string) error { func (s *server) disconnectClient(name string, c Client) error {
c := s.clients[name]
s.deregisterClient(name) s.deregisterClient(name)
return c.Disconnect() return c.Disconnect()
} }
@ -107,14 +105,18 @@ func (s *server) deregisterClient(name string) {
func (s *server) runClient(name string, c Client) { func (s *server) runClient(name string, c Client) {
c.Run() c.Run()
s.mutex.Lock() c = s.getClient(name)
if _, exists := s.clients[name]; !exists { if c == nil {
s.mutex.Unlock()
return return
} }
s.mutex.Unlock()
if err := s.disconnectClient(name); err != nil { if err := s.disconnectClient(name, c); err != nil {
klog.V(2).InfoS("Unable to disconnect client", "resource", name, "client", c, "err", err) klog.V(2).InfoS("Unable to disconnect client", "resource", name, "client", c, "err", err)
} }
} }
func (s *server) getClient(name string) Client {
s.mutex.Lock()
defer s.mutex.Unlock()
return s.clients[name]
}

View File

@ -114,11 +114,11 @@ func (s *server) Start() error {
} }
func (s *server) Stop() error { func (s *server) Stop() error {
for _, r := range s.clientResources() { s.visitClients(func(r string, c Client) {
if err := s.disconnectClient(r); err != nil { if err := s.disconnectClient(r, c); err != nil {
klog.InfoS("Error disconnecting device plugin client", "resourceName", r, "err", err) klog.InfoS("Error disconnecting device plugin client", "resourceName", r, "err", err)
} }
} })
s.mutex.Lock() s.mutex.Lock()
defer s.mutex.Unlock() defer s.mutex.Unlock()
@ -177,12 +177,12 @@ func (s *server) isVersionCompatibleWithPlugin(versions ...string) bool {
return false return false
} }
func (s *server) clientResources() []string { func (s *server) visitClients(visit func(r string, c Client)) {
s.mutex.Lock()
for r, c := range s.clients {
s.mutex.Unlock()
visit(r, c)
s.mutex.Lock() s.mutex.Lock()
defer s.mutex.Unlock()
var resources []string
for r := range s.clients {
resources = append(resources, r)
} }
return resources s.mutex.Unlock()
} }