|
@@ -25,6 +25,7 @@ package plugins
|
|
import (
|
|
import (
|
|
"errors"
|
|
"errors"
|
|
"sync"
|
|
"sync"
|
|
|
|
+ "time"
|
|
|
|
|
|
"github.com/Sirupsen/logrus"
|
|
"github.com/Sirupsen/logrus"
|
|
"github.com/docker/docker/pkg/tlsconfig"
|
|
"github.com/docker/docker/pkg/tlsconfig"
|
|
@@ -109,27 +110,45 @@ func (p *Plugin) activateWithLock() error {
|
|
}
|
|
}
|
|
|
|
|
|
func load(name string) (*Plugin, error) {
|
|
func load(name string) (*Plugin, error) {
|
|
- storage.Lock()
|
|
|
|
|
|
+ return loadWithRetry(name, true)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func loadWithRetry(name string, retry bool) (*Plugin, error) {
|
|
registry := newLocalRegistry()
|
|
registry := newLocalRegistry()
|
|
- pl, err := registry.Plugin(name)
|
|
|
|
- if err == nil {
|
|
|
|
|
|
+ start := time.Now()
|
|
|
|
+
|
|
|
|
+ var retries int
|
|
|
|
+ for {
|
|
|
|
+ pl, err := registry.Plugin(name)
|
|
|
|
+ if err != nil {
|
|
|
|
+ if !retry {
|
|
|
|
+ return nil, err
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ timeOff := backoff(retries)
|
|
|
|
+ if abort(start, timeOff) {
|
|
|
|
+ return nil, err
|
|
|
|
+ }
|
|
|
|
+ retries++
|
|
|
|
+ logrus.Warnf("Unable to locate plugin: %s, retrying in %v", name, timeOff)
|
|
|
|
+ time.Sleep(timeOff)
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ storage.Lock()
|
|
storage.plugins[name] = pl
|
|
storage.plugins[name] = pl
|
|
- }
|
|
|
|
- storage.Unlock()
|
|
|
|
|
|
+ storage.Unlock()
|
|
|
|
|
|
- if err != nil {
|
|
|
|
- return nil, err
|
|
|
|
- }
|
|
|
|
|
|
+ err = pl.activate()
|
|
|
|
|
|
- err = pl.activate()
|
|
|
|
|
|
+ if err != nil {
|
|
|
|
+ storage.Lock()
|
|
|
|
+ delete(storage.plugins, name)
|
|
|
|
+ storage.Unlock()
|
|
|
|
+ }
|
|
|
|
|
|
- if err != nil {
|
|
|
|
- storage.Lock()
|
|
|
|
- delete(storage.plugins, name)
|
|
|
|
- storage.Unlock()
|
|
|
|
|
|
+ return pl, err
|
|
}
|
|
}
|
|
-
|
|
|
|
- return pl, err
|
|
|
|
}
|
|
}
|
|
|
|
|
|
func get(name string) (*Plugin, error) {
|
|
func get(name string) (*Plugin, error) {
|