From 5b6b8df0c1b5a54ae9a717810eedf9fc971e1321 Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Fri, 6 May 2016 13:09:45 -0700 Subject: [PATCH] Add reference counting to aufs Signed-off-by: Michael Crosby --- daemon/graphdriver/aufs/aufs.go | 8 ++++++++ daemon/graphdriver/counter.go | 3 --- daemon/graphdriver/devmapper/driver.go | 2 +- daemon/graphdriver/driver.go | 6 ++++++ daemon/graphdriver/driver_linux.go | 12 ++++++------ 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/daemon/graphdriver/aufs/aufs.go b/daemon/graphdriver/aufs/aufs.go index 83380e1143..044351b7ee 100644 --- a/daemon/graphdriver/aufs/aufs.go +++ b/daemon/graphdriver/aufs/aufs.go @@ -70,6 +70,7 @@ type Driver struct { root string uidMaps []idtools.IDMap gidMaps []idtools.IDMap + ctr *graphdriver.RefCounter pathCacheLock sync.Mutex pathCache map[string]string } @@ -108,6 +109,7 @@ func Init(root string, options []string, uidMaps, gidMaps []idtools.IDMap) (grap uidMaps: uidMaps, gidMaps: gidMaps, pathCache: make(map[string]string), + ctr: graphdriver.NewRefCounter(graphdriver.NewFsChecker(graphdriver.FsMagicAufs)), } rootUID, rootGID, err := idtools.GetRootUIDGID(uidMaps, gidMaps) @@ -320,6 +322,9 @@ func (a *Driver) Get(id, mountLabel string) (string, error) { m = a.getMountpoint(id) } } + if count := a.ctr.Increment(m); count > 1 { + return m, nil + } // If a dir does not have a parent ( no layers )do not try to mount // just return the diff path to the data @@ -344,6 +349,9 @@ func (a *Driver) Put(id string) error { a.pathCache[id] = m } a.pathCacheLock.Unlock() + if count := a.ctr.Decrement(m); count > 0 { + return nil + } err := a.unmount(m) if err != nil { diff --git a/daemon/graphdriver/counter.go b/daemon/graphdriver/counter.go index 2de80b7e1e..5ea604f5b6 100644 --- a/daemon/graphdriver/counter.go +++ b/daemon/graphdriver/counter.go @@ -16,9 +16,6 @@ type RefCounter struct { // NewRefCounter returns a new RefCounter func NewRefCounter(c Checker) *RefCounter { - if c == nil { - c = &defaultChecker{} - } return &RefCounter{ checker: c, counts: make(map[string]*minfo), diff --git a/daemon/graphdriver/devmapper/driver.go b/daemon/graphdriver/devmapper/driver.go index 9b58dba66d..38fa3ece70 100644 --- a/daemon/graphdriver/devmapper/driver.go +++ b/daemon/graphdriver/devmapper/driver.go @@ -47,7 +47,7 @@ func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (grap home: home, uidMaps: uidMaps, gidMaps: gidMaps, - ctr: graphdriver.NewRefCounter(nil), + ctr: graphdriver.NewRefCounter(graphdriver.NewDefaultChecker()), } return graphdriver.NewNaiveDiffDriver(d, uidMaps, gidMaps), nil diff --git a/daemon/graphdriver/driver.go b/daemon/graphdriver/driver.go index 495bac2cf5..79f6789f99 100644 --- a/daemon/graphdriver/driver.go +++ b/daemon/graphdriver/driver.go @@ -113,6 +113,12 @@ type FileGetCloser interface { Close() error } +// Checker makes checks on specified filesystems. +type Checker interface { + // IsMounted returns true if the provided path is mounted for the specific checker + IsMounted(path string) bool +} + func init() { drivers = make(map[string]InitFunc) } diff --git a/daemon/graphdriver/driver_linux.go b/daemon/graphdriver/driver_linux.go index 10a1abcf0d..70b2ce22f1 100644 --- a/daemon/graphdriver/driver_linux.go +++ b/daemon/graphdriver/driver_linux.go @@ -91,12 +91,6 @@ func GetFSMagic(rootpath string) (FsMagic, error) { return FsMagic(buf.Type), nil } -// Checker makes checks on specified filesystems. -type Checker interface { - // IsMounted returns true if the provided path is mounted for the specific checker - IsMounted(path string) bool -} - // NewFsChecker returns a checker configured for the provied FsMagic func NewFsChecker(t FsMagic) Checker { return &fsChecker{ @@ -113,6 +107,12 @@ func (c *fsChecker) IsMounted(path string) bool { return m } +// NewDefaultChecker returns a check that parses /proc/mountinfo to check +// if the specified path is mounted. +func NewDefaultChecker() Checker { + return &defaultChecker{} +} + type defaultChecker struct { }