Add fast path for fsmagic supported drivers

For things that we can check if they are mounted by using their fsmagic
we should use that and for others do it the slow way.

Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
This commit is contained in:
Michael Crosby 2016-05-06 12:04:26 -07:00
Родитель 31e903b0e1
Коммит 1ba05cdb6a
5 изменённых файлов: 49 добавлений и 16 удалений

Просмотреть файл

@ -1,10 +1,6 @@
package graphdriver
import (
"sync"
"github.com/docker/docker/pkg/mount"
)
import "sync"
type minfo struct {
check bool
@ -13,13 +9,20 @@ type minfo struct {
// RefCounter is a generic counter for use by graphdriver Get/Put calls
type RefCounter struct {
counts map[string]*minfo
mu sync.Mutex
counts map[string]*minfo
mu sync.Mutex
checker Checker
}
// NewRefCounter returns a new RefCounter
func NewRefCounter() *RefCounter {
return &RefCounter{counts: make(map[string]*minfo)}
func NewRefCounter(c Checker) *RefCounter {
if c == nil {
c = &defaultChecker{}
}
return &RefCounter{
checker: c,
counts: make(map[string]*minfo),
}
}
// Increment increaes the ref count for the given id and returns the current count
@ -35,8 +38,7 @@ func (c *RefCounter) Increment(path string) int {
// count if it is mounted as it is in use.
if !m.check {
m.check = true
mntd, _ := mount.Mounted(path)
if mntd {
if c.checker.IsMounted(path) {
m.count++
}
}
@ -58,8 +60,7 @@ func (c *RefCounter) Decrement(path string) int {
// count if it is mounted as it is in use.
if !m.check {
m.check = true
mntd, _ := mount.Mounted(path)
if mntd {
if c.checker.IsMounted(path) {
m.count++
}
}

Просмотреть файл

@ -47,7 +47,7 @@ func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (grap
home: home,
uidMaps: uidMaps,
gidMaps: gidMaps,
ctr: graphdriver.NewRefCounter(),
ctr: graphdriver.NewRefCounter(nil),
}
return graphdriver.NewNaiveDiffDriver(d, uidMaps, gidMaps), nil

Просмотреть файл

@ -5,6 +5,8 @@ package graphdriver
import (
"path/filepath"
"syscall"
"github.com/docker/docker/pkg/mount"
)
const (
@ -89,6 +91,36 @@ 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{
t: t,
}
}
type fsChecker struct {
t FsMagic
}
func (c *fsChecker) IsMounted(path string) bool {
m, _ := Mounted(c.t, path)
return m
}
type defaultChecker struct {
}
func (c *defaultChecker) IsMounted(path string) bool {
m, _ := mount.Mounted(path)
return m
}
// Mounted checks if the given path is mounted as the fs type
func Mounted(fsType FsMagic, mountPath string) (bool, error) {
var buf syscall.Statfs_t

Просмотреть файл

@ -141,7 +141,7 @@ func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (grap
home: home,
uidMaps: uidMaps,
gidMaps: gidMaps,
ctr: graphdriver.NewRefCounter(),
ctr: graphdriver.NewRefCounter(graphdriver.NewFsChecker(graphdriver.FsMagicOverlay)),
}
return NaiveDiffDriverWithApply(d, uidMaps, gidMaps), nil

Просмотреть файл

@ -105,7 +105,7 @@ func Init(base string, opt []string, uidMaps, gidMaps []idtools.IDMap) (graphdri
filesystemsCache: filesystemsCache,
uidMaps: uidMaps,
gidMaps: gidMaps,
ctr: graphdriver.NewRefCounter(),
ctr: graphdriver.NewRefCounter(graphdriver.NewFsChecker(graphdriver.FsMagicZfs)),
}
return graphdriver.NewNaiveDiffDriver(d, uidMaps, gidMaps), nil
}