This was done by making List not populate the cache.
fixes #21403
Signed-off-by: Viktor Stanchev <me@viktorstanchev.com>
... | ... |
@@ -127,9 +127,8 @@ func (s *VolumeStore) List() ([]volume.Volume, []string, error) { |
127 | 127 |
|
128 | 128 |
s.locks.Lock(name) |
129 | 129 |
storedV, exists := s.getNamed(name) |
130 |
- if !exists { |
|
131 |
- s.setNamed(v, "") |
|
132 |
- } |
|
130 |
+ // Note: it's not safe to populate the cache here because the volume may have been |
|
131 |
+ // deleted before we acquire a lock on its name |
|
133 | 132 |
if exists && storedV.DriverName() != v.DriverName() { |
134 | 133 |
logrus.Warnf("Volume name %s already exists for driver %s, not including volume returned by %s", v.Name(), storedV.DriverName(), v.DriverName()) |
135 | 134 |
s.locks.Unlock(v.Name()) |
... | ... |
@@ -26,19 +26,20 @@ func (NoopVolume) Unmount() error { return nil } |
26 | 26 |
|
27 | 27 |
// FakeVolume is a fake volume with a random name |
28 | 28 |
type FakeVolume struct { |
29 |
- name string |
|
29 |
+ name string |
|
30 |
+ driverName string |
|
30 | 31 |
} |
31 | 32 |
|
32 | 33 |
// NewFakeVolume creates a new fake volume for testing |
33 |
-func NewFakeVolume(name string) volume.Volume { |
|
34 |
- return FakeVolume{name: name} |
|
34 |
+func NewFakeVolume(name string, driverName string) volume.Volume { |
|
35 |
+ return FakeVolume{name: name, driverName: driverName} |
|
35 | 36 |
} |
36 | 37 |
|
37 | 38 |
// Name is the name of the volume |
38 | 39 |
func (f FakeVolume) Name() string { return f.name } |
39 | 40 |
|
40 | 41 |
// DriverName is the name of the driver |
41 |
-func (FakeVolume) DriverName() string { return "fake" } |
|
42 |
+func (f FakeVolume) DriverName() string { return f.driverName } |
|
42 | 43 |
|
43 | 44 |
// Path is the filesystem path to the volume |
44 | 45 |
func (FakeVolume) Path() string { return "fake" } |
... | ... |
@@ -72,7 +73,7 @@ func (d *FakeDriver) Create(name string, opts map[string]string) (volume.Volume, |
72 | 72 |
if opts != nil && opts["error"] != "" { |
73 | 73 |
return nil, fmt.Errorf(opts["error"]) |
74 | 74 |
} |
75 |
- v := NewFakeVolume(name) |
|
75 |
+ v := NewFakeVolume(name, d.name) |
|
76 | 76 |
d.vols[name] = v |
77 | 77 |
return v, nil |
78 | 78 |
} |