Browse code

pkg: authorization: lock when lazy loading

Signed-off-by: Antonio Murdaca <runcom@redhat.com>

Antonio Murdaca authored on 2016/06/13 00:19:43
Showing 1 changed files
... ...
@@ -1,6 +1,10 @@
1 1
 package authorization
2 2
 
3
-import "github.com/docker/docker/pkg/plugins"
3
+import (
4
+	"sync"
5
+
6
+	"github.com/docker/docker/pkg/plugins"
7
+)
4 8
 
5 9
 // Plugin allows third party plugins to authorize requests and responses
6 10
 // in the context of docker API
... ...
@@ -33,6 +37,7 @@ func NewPlugins(names []string) []Plugin {
33 33
 type authorizationPlugin struct {
34 34
 	plugin *plugins.Plugin
35 35
 	name   string
36
+	once   sync.Once
36 37
 }
37 38
 
38 39
 func newAuthorizationPlugin(name string) Plugin {
... ...
@@ -72,12 +77,11 @@ func (a *authorizationPlugin) AuthZResponse(authReq *Request) (*Response, error)
72 72
 // initPlugin initializes the authorization plugin if needed
73 73
 func (a *authorizationPlugin) initPlugin() error {
74 74
 	// Lazy loading of plugins
75
-	if a.plugin == nil {
76
-		var err error
77
-		a.plugin, err = plugins.Get(a.name, AuthZApiImplements)
78
-		if err != nil {
79
-			return err
75
+	var err error
76
+	a.once.Do(func() {
77
+		if a.plugin == nil {
78
+			a.plugin, err = plugins.Get(a.name, AuthZApiImplements)
80 79
 		}
81
-	}
82
-	return nil
80
+	})
81
+	return err
83 82
 }