Skip to content

Commit

Permalink
Merge pull request moby#18877 from dnephin/move_graph_driver_to_layer…
Browse files Browse the repository at this point in the history
…_store

Move graph driver to layer store
  • Loading branch information
Arnaud Porterie committed Dec 29, 2015
2 parents a81e438 + 91154e9 commit 7b540ee
Show file tree
Hide file tree
Showing 21 changed files with 199 additions and 122 deletions.
3 changes: 2 additions & 1 deletion daemon/container_operations_unix.go
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,8 @@ func (daemon *Daemon) getSize(container *container.Container) (int64, int64) {

sizeRw, err = container.RWLayer.Size()
if err != nil {
logrus.Errorf("Driver %s couldn't return diff size of container %s: %s", daemon.driver, container.ID, err)
logrus.Errorf("Driver %s couldn't return diff size of container %s: %s",
daemon.GraphDriverName(), container.ID, err)
// FIXME: GetSize should return an error. Not changing it now in case
// there is a side-effect.
sizeRw = -1
Expand Down
72 changes: 33 additions & 39 deletions daemon/daemon.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ import (
"github.com/docker/docker/daemon/exec"
"github.com/docker/docker/daemon/execdriver"
"github.com/docker/docker/daemon/execdriver/execdrivers"
"github.com/docker/docker/daemon/graphdriver"
_ "github.com/docker/docker/daemon/graphdriver/vfs" // register vfs
// register graph drivers
_ "github.com/docker/docker/daemon/graphdriver/register"
"github.com/docker/docker/daemon/logger"
"github.com/docker/docker/daemon/network"
"github.com/docker/docker/distribution"
Expand Down Expand Up @@ -146,7 +146,6 @@ type Daemon struct {
idIndex *truncindex.TruncIndex
configStore *Config
containerGraphDB *graphdb.Database
driver graphdriver.Driver
execDriver execdriver.Driver
statsCollector *statsCollector
defaultLogConfig containertypes.LogConfig
Expand Down Expand Up @@ -297,7 +296,7 @@ func (daemon *Daemon) restore() error {

var (
debug = os.Getenv("DEBUG") != ""
currentDriver = daemon.driver.String()
currentDriver = daemon.GraphDriverName()
containers = make(map[string]*cr)
)

Expand Down Expand Up @@ -520,7 +519,7 @@ func (daemon *Daemon) newContainer(name string, config *containertypes.Config, i
base.ImageID = imgID
base.NetworkSettings = &network.Settings{IsAnonymousEndpoint: noExplicitName}
base.Name = name
base.Driver = daemon.driver.String()
base.Driver = daemon.GraphDriverName()

return base, err
}
Expand Down Expand Up @@ -703,20 +702,9 @@ func NewDaemon(config *Config, registryService *registry.Service) (daemon *Daemo
}
os.Setenv("TMPDIR", realTmp)

// Set the default driver
graphdriver.DefaultDriver = config.GraphDriver

// Load storage driver
driver, err := graphdriver.New(config.Root, config.GraphOptions, uidMaps, gidMaps)
if err != nil {
return nil, fmt.Errorf("error initializing graphdriver: %v", err)
}
logrus.Debugf("Using graph driver %s", driver)

d := &Daemon{}
d.driver = driver

// Ensure the graph driver is shutdown at a later point
// Ensure the daemon is properly shutdown if there is a failure during
// initialization
defer func() {
if err != nil {
if err := d.Shutdown(); err != nil {
Expand All @@ -733,25 +721,32 @@ func NewDaemon(config *Config, registryService *registry.Service) (daemon *Daemo
}
logrus.Debugf("Using default logging driver %s", config.LogConfig.Type)

// Configure and validate the kernels security support
if err := configureKernelSecuritySupport(config, d.driver.String()); err != nil {
return nil, err
}

daemonRepo := filepath.Join(config.Root, "containers")

if err := idtools.MkdirAllAs(daemonRepo, 0700, rootUID, rootGID); err != nil && !os.IsExist(err) {
return nil, err
}

imageRoot := filepath.Join(config.Root, "image", d.driver.String())
fms, err := layer.NewFSMetadataStore(filepath.Join(imageRoot, "layerdb"))
driverName := os.Getenv("DOCKER_DRIVER")
if driverName == "" {
driverName = config.GraphDriver
}
d.layerStore, err = layer.NewStoreFromOptions(layer.StoreOptions{
StorePath: config.Root,
MetadataStorePathTemplate: filepath.Join(config.Root, "image", "%s"),
GraphDriver: driverName,
GraphDriverOptions: config.GraphOptions,
UIDMaps: uidMaps,
GIDMaps: gidMaps,
})
if err != nil {
return nil, err
}

d.layerStore, err = layer.NewStore(fms, d.driver)
if err != nil {
graphDriver := d.layerStore.DriverName()
imageRoot := filepath.Join(config.Root, "image", graphDriver)

// Configure and validate the kernels security support
if err := configureKernelSecuritySupport(config, graphDriver); err != nil {
return nil, err
}

Expand Down Expand Up @@ -797,11 +792,11 @@ func NewDaemon(config *Config, registryService *registry.Service) (daemon *Daemo
return nil, fmt.Errorf("Couldn't create Tag store repositories: %s", err)
}

if err := restoreCustomImage(d.driver, d.imageStore, d.layerStore, referenceStore); err != nil {
if err := restoreCustomImage(d.imageStore, d.layerStore, referenceStore); err != nil {
return nil, fmt.Errorf("Couldn't restore custom images: %s", err)
}

if err := v1.Migrate(config.Root, d.driver.String(), d.layerStore, d.imageStore, referenceStore, distributionMetadataStore); err != nil {
if err := v1.Migrate(config.Root, graphDriver, d.layerStore, d.imageStore, referenceStore, distributionMetadataStore); err != nil {
return nil, err
}

Expand Down Expand Up @@ -953,9 +948,9 @@ func (daemon *Daemon) Shutdown() error {
}
}

if daemon.driver != nil {
if err := daemon.driver.Cleanup(); err != nil {
logrus.Errorf("Error during graph storage driver.Cleanup(): %v", err)
if daemon.layerStore != nil {
if err := daemon.layerStore.Cleanup(); err != nil {
logrus.Errorf("Error during layer Store.Cleanup(): %v", err)
}
}

Expand All @@ -982,7 +977,7 @@ func (daemon *Daemon) Mount(container *container.Container) error {
if container.BaseFS != "" && runtime.GOOS != "windows" {
daemon.Unmount(container)
return fmt.Errorf("Error: driver %s is returning inconsistent paths for container %s ('%s' then '%s')",
daemon.driver, container.ID, container.BaseFS, dir)
daemon.GraphDriverName(), container.ID, container.BaseFS, dir)
}
}
container.BaseFS = dir // TODO: combine these fields
Expand Down Expand Up @@ -1193,7 +1188,7 @@ func (daemon *Daemon) LookupImage(name string) (*types.ImageInspect, error) {
VirtualSize: size, // TODO: field unused, deprecate
}

imageInspect.GraphDriver.Name = daemon.driver.String()
imageInspect.GraphDriver.Name = daemon.GraphDriverName()

imageInspect.GraphDriver.Data = layerMetadata

Expand Down Expand Up @@ -1322,10 +1317,9 @@ func (daemon *Daemon) GetImage(refOrID string) (*image.Image, error) {
return daemon.imageStore.Get(imgID)
}

// GraphDriver returns the currently used driver for processing
// container layers.
func (daemon *Daemon) GraphDriver() graphdriver.Driver {
return daemon.driver
// GraphDriverName returns the name of the graph driver used by the layer.Store
func (daemon *Daemon) GraphDriverName() string {
return daemon.layerStore.DriverName()
}

// ExecutionDriver returns the currently used driver for creating and
Expand Down
3 changes: 1 addition & 2 deletions daemon/daemon_unix.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import (
pblkiodev "github.com/docker/docker/api/types/blkiodev"
containertypes "github.com/docker/docker/api/types/container"
"github.com/docker/docker/container"
"github.com/docker/docker/daemon/graphdriver"
derr "github.com/docker/docker/errors"
"github.com/docker/docker/image"
"github.com/docker/docker/layer"
Expand Down Expand Up @@ -728,7 +727,7 @@ func (daemon *Daemon) conditionalUnmountOnCleanup(container *container.Container
daemon.Unmount(container)
}

func restoreCustomImage(driver graphdriver.Driver, is image.Store, ls layer.Store, rs reference.Store) error {
func restoreCustomImage(is image.Store, ls layer.Store, rs reference.Store) error {
// Unix has no custom images to register
return nil
}
121 changes: 66 additions & 55 deletions daemon/daemon_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,67 +156,78 @@ func (daemon *Daemon) conditionalUnmountOnCleanup(container *container.Container
}
}

func restoreCustomImage(driver graphdriver.Driver, is image.Store, ls layer.Store, rs reference.Store) error {
if wd, ok := driver.(*windows.Driver); ok {
imageInfos, err := wd.GetCustomImageInfos()
func restoreCustomImage(is image.Store, ls layer.Store, rs reference.Store) error {
type graphDriverStore interface {
GraphDriver() graphdriver.Driver
}

gds, ok := ls.(graphDriverStore)
if !ok {
return nil
}

driver := gds.GraphDriver()
wd, ok := driver.(*windows.Driver)
if !ok {
return nil
}

imageInfos, err := wd.GetCustomImageInfos()
if err != nil {
return err
}

// Convert imageData to valid image configuration
for i := range imageInfos {
name := strings.ToLower(imageInfos[i].Name)

type registrar interface {
RegisterDiffID(graphID string, size int64) (layer.Layer, error)
}
r, ok := ls.(registrar)
if !ok {
return errors.New("Layerstore doesn't support RegisterDiffID")
}
if _, err := r.RegisterDiffID(imageInfos[i].ID, imageInfos[i].Size); err != nil {
return err
}
// layer is intentionally not released

rootFS := image.NewRootFS()
rootFS.BaseLayer = filepath.Base(imageInfos[i].Path)

// Create history for base layer
config, err := json.Marshal(&image.Image{
V1Image: image.V1Image{
DockerVersion: dockerversion.Version,
Architecture: runtime.GOARCH,
OS: runtime.GOOS,
Created: imageInfos[i].CreatedTime,
},
RootFS: rootFS,
History: []image.History{},
})

named, err := reference.ParseNamed(name)
if err != nil {
return err
}

// Convert imageData to valid image configuration
for i := range imageInfos {
name := strings.ToLower(imageInfos[i].Name)

type registrar interface {
RegisterDiffID(graphID string, size int64) (layer.Layer, error)
}
r, ok := ls.(registrar)
if !ok {
return errors.New("Layerstore doesn't support RegisterDiffID")
}
if _, err := r.RegisterDiffID(imageInfos[i].ID, imageInfos[i].Size); err != nil {
return err
}
// layer is intentionally not released

rootFS := image.NewRootFS()
rootFS.BaseLayer = filepath.Base(imageInfos[i].Path)

// Create history for base layer
config, err := json.Marshal(&image.Image{
V1Image: image.V1Image{
DockerVersion: dockerversion.Version,
Architecture: runtime.GOARCH,
OS: runtime.GOOS,
Created: imageInfos[i].CreatedTime,
},
RootFS: rootFS,
History: []image.History{},
})

named, err := reference.ParseNamed(name)
if err != nil {
return err
}

ref, err := reference.WithTag(named, imageInfos[i].Version)
if err != nil {
return err
}

id, err := is.Create(config)
if err != nil {
return err
}

if err := rs.AddTag(ref, id, true); err != nil {
return err
}

logrus.Debugf("Registered base layer %s as %s", ref, id)
ref, err := reference.WithTag(named, imageInfos[i].Version)
if err != nil {
return err
}

}
id, err := is.Create(config)
if err != nil {
return err
}

if err := rs.AddTag(ref, id, true); err != nil {
return err
}

logrus.Debugf("Registered base layer %s as %s", ref, id)
}
return nil
}
2 changes: 1 addition & 1 deletion daemon/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ func (daemon *Daemon) cleanupContainer(container *container.Container, forceRemo
metadata, err := daemon.layerStore.ReleaseRWLayer(container.RWLayer)
layer.LogReleaseMetadata(metadata)
if err != nil && err != layer.ErrMountDoesNotExist {
return derr.ErrorCodeRmDriverFS.WithArgs(daemon.driver, container.ID, err)
return derr.ErrorCodeRmDriverFS.WithArgs(daemon.GraphDriverName(), container.ID, err)
}

if err = daemon.execDriver.Clean(container.ID); err != nil {
Expand Down
12 changes: 4 additions & 8 deletions daemon/graphdriver/driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@ const (
)

var (
// DefaultDriver if a storage driver is not specified.
DefaultDriver string
// All registered drivers
drivers map[string]InitFunc

Expand Down Expand Up @@ -130,12 +128,10 @@ func getBuiltinDriver(name, home string, options []string, uidMaps, gidMaps []id
}

// New creates the driver and initializes it at the specified root.
func New(root string, options []string, uidMaps, gidMaps []idtools.IDMap) (driver Driver, err error) {
for _, name := range []string{os.Getenv("DOCKER_DRIVER"), DefaultDriver} {
if name != "" {
logrus.Debugf("[graphdriver] trying provided driver %q", name) // so the logs show specified driver
return GetDriver(name, root, options, uidMaps, gidMaps)
}
func New(root string, name string, options []string, uidMaps, gidMaps []idtools.IDMap) (driver Driver, err error) {
if name != "" {
logrus.Debugf("[graphdriver] trying provided driver %q", name) // so the logs show specified driver
return GetDriver(name, root, options, uidMaps, gidMaps)
}

// Guess for prior driver
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// +build !exclude_graphdriver_aufs,linux

package daemon
package register

import (
// register the aufs graphdriver
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// +build !exclude_graphdriver_btrfs,linux

package daemon
package register

import (
// register the btrfs graphdriver
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// +build !exclude_graphdriver_devicemapper,linux

package daemon
package register

import (
// register the devmapper graphdriver
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// +build !exclude_graphdriver_overlay,linux

package daemon
package register

import (
// register the overlay graphdriver
Expand Down
6 changes: 6 additions & 0 deletions daemon/graphdriver/register/register_vfs.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package register

import (
// register vfs
_ "github.com/docker/docker/daemon/graphdriver/vfs"
)
Loading

0 comments on commit 7b540ee

Please sign in to comment.