Make it multiple goroutines friendly
This commit is contained in:
@@ -19,11 +19,17 @@ import (
|
|||||||
|
|
||||||
type localCachedFactory struct {
|
type localCachedFactory struct {
|
||||||
rw sync.Mutex
|
rw sync.Mutex
|
||||||
|
irw sync.Mutex
|
||||||
sessionClient DockerApi
|
sessionClient DockerApi
|
||||||
instanceClients map[string]DockerApi
|
instanceClients map[string]*instanceEntry
|
||||||
storage storage.StorageApi
|
storage storage.StorageApi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type instanceEntry struct {
|
||||||
|
rw sync.Mutex
|
||||||
|
client DockerApi
|
||||||
|
}
|
||||||
|
|
||||||
func (f *localCachedFactory) GetForSession(sessionId string) (DockerApi, error) {
|
func (f *localCachedFactory) GetForSession(sessionId string) (DockerApi, error) {
|
||||||
f.rw.Lock()
|
f.rw.Lock()
|
||||||
defer f.rw.Unlock()
|
defer f.rw.Unlock()
|
||||||
@@ -46,12 +52,22 @@ func (f *localCachedFactory) GetForSession(sessionId string) (DockerApi, error)
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (f *localCachedFactory) GetForInstance(sessionId, instanceName string) (DockerApi, error) {
|
func (f *localCachedFactory) GetForInstance(sessionId, instanceName string) (DockerApi, error) {
|
||||||
f.rw.Lock()
|
key := sessionId + instanceName
|
||||||
defer f.rw.Unlock()
|
|
||||||
|
|
||||||
c, found := f.instanceClients[sessionId+instanceName]
|
f.irw.Lock()
|
||||||
if found {
|
c, found := f.instanceClients[key]
|
||||||
return c, nil
|
if !found {
|
||||||
|
c := &instanceEntry{}
|
||||||
|
f.instanceClients[key] = c
|
||||||
|
}
|
||||||
|
c = f.instanceClients[key]
|
||||||
|
f.irw.Unlock()
|
||||||
|
|
||||||
|
c.rw.Lock()
|
||||||
|
defer c.rw.Unlock()
|
||||||
|
|
||||||
|
if c.client != nil {
|
||||||
|
return c.client, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
instance, err := f.storage.InstanceGet(sessionId, instanceName)
|
instance, err := f.storage.InstanceGet(sessionId, instanceName)
|
||||||
@@ -91,7 +107,7 @@ func (f *localCachedFactory) GetForInstance(sessionId, instanceName string) (Doc
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
dockerClient := NewDocker(dc)
|
dockerClient := NewDocker(dc)
|
||||||
f.instanceClients[sessionId+instance.Name] = dockerClient
|
c.client = dockerClient
|
||||||
|
|
||||||
return dockerClient, nil
|
return dockerClient, nil
|
||||||
}
|
}
|
||||||
@@ -120,7 +136,7 @@ func (f *localCachedFactory) check(c *client.Client) error {
|
|||||||
|
|
||||||
func NewLocalCachedFactory(s storage.StorageApi) *localCachedFactory {
|
func NewLocalCachedFactory(s storage.StorageApi) *localCachedFactory {
|
||||||
return &localCachedFactory{
|
return &localCachedFactory{
|
||||||
instanceClients: make(map[string]DockerApi),
|
instanceClients: make(map[string]*instanceEntry),
|
||||||
storage: s,
|
storage: s,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user