From 1b28cdc7f977f265d0d8de53e8ec1d773ed54db1 Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Tue, 19 Nov 2013 02:32:08 -0800 Subject: [PATCH] Handle image metadata when drivers are switched --- graph.go | 12 +++++++++++- graphdriver/aufs/migrate.go | 11 +++++++++++ graphdriver/devmapper/driver.go | 4 ++++ graphdriver/driver.go | 1 + graphdriver/dummy/driver.go | 5 +++++ runtime.go | 2 +- 6 files changed, 33 insertions(+), 2 deletions(-) diff --git a/graph.go b/graph.go index 6e2a5d7a98..f736027274 100644 --- a/graph.go +++ b/graph.go @@ -52,7 +52,9 @@ func (graph *Graph) restore() error { } for _, v := range dir { id := v.Name() - graph.idIndex.Add(id) + if graph.driver.Exists(id) { + graph.idIndex.Add(id) + } } return nil } @@ -137,6 +139,14 @@ func (graph *Graph) Register(jsonData []byte, layerData archive.Archive, img *Im if graph.Exists(img.ID) { return fmt.Errorf("Image %s already exists", img.ID) } + + // Ensure that the image root does not exist on the filesystem + // when it is not registered in the graph. + // This is common when you switch from one graph driver to another + if err := os.RemoveAll(graph.imageRoot(img.ID)); err != nil && !os.IsNotExist(err) { + return err + } + tmp, err := graph.Mktemp("") defer os.RemoveAll(tmp) if err != nil { diff --git a/graphdriver/aufs/migrate.go b/graphdriver/aufs/migrate.go index a37d723976..6018342d6c 100644 --- a/graphdriver/aufs/migrate.go +++ b/graphdriver/aufs/migrate.go @@ -38,6 +38,9 @@ func pathExists(pth string) bool { // symlink. func (a *Driver) Migrate(pth string, setupInit func(p string) error) error { if pathExists(path.Join(pth, "graph")) { + if err := a.migrateRepositories(pth); err != nil { + return err + } if err := a.migrateImages(path.Join(pth, "graph")); err != nil { return err } @@ -46,6 +49,14 @@ func (a *Driver) Migrate(pth string, setupInit func(p string) error) error { return nil } +func (a *Driver) migrateRepositories(pth string) error { + name := path.Join(pth, "repositories") + if err := os.Rename(name, name+"-aufs"); err != nil && !os.IsNotExist(err) { + return err + } + return nil +} + func (a *Driver) migrateContainers(pth string, setupInit func(p string) error) error { fis, err := ioutil.ReadDir(pth) if err != nil { diff --git a/graphdriver/devmapper/driver.go b/graphdriver/devmapper/driver.go index f98c619a5c..55b8e3e720 100644 --- a/graphdriver/devmapper/driver.go +++ b/graphdriver/devmapper/driver.go @@ -121,3 +121,7 @@ func (d *Driver) unmount(id, mountPoint string) error { // Unmount the device return d.DeviceSet.UnmountDevice(id, mountPoint, true) } + +func (d *Driver) Exists(id string) bool { + return d.Devices[id] != nil +} diff --git a/graphdriver/driver.go b/graphdriver/driver.go index a6d075bfb7..211806e6c7 100644 --- a/graphdriver/driver.go +++ b/graphdriver/driver.go @@ -19,6 +19,7 @@ type Driver interface { Remove(id string) error Get(id string) (dir string, err error) + Exists(id string) bool Status() [][2]string diff --git a/graphdriver/dummy/driver.go b/graphdriver/dummy/driver.go index 1b09d324bf..b527a84fd0 100644 --- a/graphdriver/dummy/driver.go +++ b/graphdriver/dummy/driver.go @@ -84,3 +84,8 @@ func (d *Driver) Get(id string) (string, error) { } return dir, nil } + +func (d *Driver) Exists(id string) bool { + _, err := os.Stat(d.dir(id)) + return err == nil +} diff --git a/runtime.go b/runtime.go index 9be57b4cd3..7eb0f2bacc 100644 --- a/runtime.go +++ b/runtime.go @@ -671,7 +671,7 @@ func NewRuntimeFromDirectory(config *DaemonConfig) (*Runtime, error) { if err != nil { return nil, err } - repositories, err := NewTagStore(path.Join(config.Root, "repositories"), g) + repositories, err := NewTagStore(path.Join(config.Root, "repositories-"+driver.String()), g) if err != nil { return nil, fmt.Errorf("Couldn't create Tag store: %s", err) }