diff --git a/volume/store/store.go b/volume/store/store.go index eece24fc3e..041c1346bb 100644 --- a/volume/store/store.go +++ b/volume/store/store.go @@ -302,16 +302,14 @@ func (s *VolumeStore) Dereference(v volume.Volume, ref string) { s.globalLock.Lock() defer s.globalLock.Unlock() - refs, exists := s.refs[v.Name()] - if !exists { - return - } + var refs []string - for i, r := range refs { - if r == ref { - s.refs[v.Name()] = append(s.refs[v.Name()][:i], s.refs[v.Name()][i+1:]...) + for _, r := range s.refs[v.Name()] { + if r != ref { + refs = append(refs, r) } } + s.refs[v.Name()] = refs } // Refs gets the current list of refs for the given volume diff --git a/volume/store/store_test.go b/volume/store/store_test.go index 83d49821be..7c3f730ef0 100644 --- a/volume/store/store_test.go +++ b/volume/store/store_test.go @@ -157,3 +157,22 @@ func TestFilterByUsed(t *testing.T) { t.Fatalf("expected used volume fake1, got %s", used[0].Name()) } } + +func TestDerefMultipleOfSameRef(t *testing.T) { + volumedrivers.Register(vt.NewFakeDriver("fake"), "fake") + + s := New() + v, err := s.CreateWithRef("fake1", "fake", "volReference", nil) + if err != nil { + t.Fatal(err) + } + + if _, err := s.GetWithRef("fake1", "fake", "volReference"); err != nil { + t.Fatal(err) + } + + s.Dereference(v, "volReference") + if err := s.Remove(v); err != nil { + t.Fatal(err) + } +}