mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-22 19:31:44 +00:00
fix data race in device manager plugin hander
This commit is contained in:
parent
9ac6b3af5f
commit
0ec7e38ef0
@ -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]
|
||||||
|
}
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user