From a7e096832123280d26df3c121ecad8dd012060b9 Mon Sep 17 00:00:00 2001 From: Derek McGowan Date: Mon, 14 Dec 2015 16:52:15 -0800 Subject: [PATCH] Add metadata function to layer store Add function to get metadata from layer store for a mutable layer fixes #18614 Signed-off-by: Derek McGowan (github: dmcgowan) --- daemon/container_operations_windows.go | 2 +- daemon/inspect.go | 13 +------------ distribution/xfer/download_test.go | 4 ++++ integration-cli/docker_cli_inspect_test.go | 5 +++++ layer/layer.go | 1 + layer/layer_store.go | 11 +++++++++++ layer/layer_windows.go | 18 ------------------ 7 files changed, 23 insertions(+), 31 deletions(-) diff --git a/daemon/container_operations_windows.go b/daemon/container_operations_windows.go index e25866b4ca..ea18fcde3e 100644 --- a/daemon/container_operations_windows.go +++ b/daemon/container_operations_windows.go @@ -92,7 +92,7 @@ func (daemon *Daemon) populateCommand(c *container.Container, env []string) erro } } - m, err := layer.RWLayerMetadata(daemon.layerStore, c.ID) + m, err := daemon.layerStore.Metadata(c.ID) if err != nil { return derr.ErrorCodeGetLayerMetadata.WithArgs(err) } diff --git a/daemon/inspect.go b/daemon/inspect.go index 562ad78741..60bebcc598 100644 --- a/daemon/inspect.go +++ b/daemon/inspect.go @@ -10,7 +10,6 @@ import ( "github.com/docker/docker/container" "github.com/docker/docker/daemon/exec" "github.com/docker/docker/daemon/network" - "github.com/docker/docker/layer" "github.com/docker/docker/pkg/version" ) @@ -164,17 +163,7 @@ func (daemon *Daemon) getInspectData(container *container.Container, size bool) contJSONBase.GraphDriver.Name = container.Driver - image, err := daemon.imageStore.Get(container.ImageID) - if err != nil { - return nil, err - } - l, err := daemon.layerStore.Get(image.RootFS.ChainID()) - if err != nil { - return nil, err - } - defer layer.ReleaseAndLog(daemon.layerStore, l) - - graphDriverData, err := l.Metadata() + graphDriverData, err := daemon.layerStore.Metadata(container.ID) if err != nil { return nil, err } diff --git a/distribution/xfer/download_test.go b/distribution/xfer/download_test.go index ff665df344..a09cd244e1 100644 --- a/distribution/xfer/download_test.go +++ b/distribution/xfer/download_test.go @@ -132,6 +132,10 @@ func (ls *mockLayerStore) Changes(id string) ([]archive.Change, error) { return nil, errors.New("not implemented") } +func (ls *mockLayerStore) Metadata(id string) (map[string]string, error) { + return nil, errors.New("not implemented") +} + type mockDownloadDescriptor struct { currentDownloads *int32 id string diff --git a/integration-cli/docker_cli_inspect_test.go b/integration-cli/docker_cli_inspect_test.go index 355cff2b00..2da0b3ca3d 100644 --- a/integration-cli/docker_cli_inspect_test.go +++ b/integration-cli/docker_cli_inspect_test.go @@ -209,9 +209,14 @@ func (s *DockerSuite) TestInspectContainerGraphDriver(c *check.C) { return } + imageDeviceID, err := inspectField("busybox", "GraphDriver.Data.DeviceId") + c.Assert(err, checker.IsNil) + deviceID, err := inspectField(out, "GraphDriver.Data.DeviceId") c.Assert(err, checker.IsNil) + c.Assert(imageDeviceID, checker.Not(checker.Equals), deviceID) + _, err = strconv.Atoi(deviceID) c.Assert(err, checker.IsNil, check.Commentf("failed to inspect DeviceId of the image: %s, %v", deviceID, err)) diff --git a/layer/layer.go b/layer/layer.go index 73b922e345..eed5937e1e 100644 --- a/layer/layer.go +++ b/layer/layer.go @@ -151,6 +151,7 @@ type Store interface { Unmount(id string) error DeleteMount(id string) ([]Metadata, error) Changes(id string) ([]archive.Change, error) + Metadata(id string) (map[string]string, error) } // MetadataTransaction represents functions for setting layer metadata diff --git a/layer/layer_store.go b/layer/layer_store.go index a5f9523d3f..8216113f1e 100644 --- a/layer/layer_store.go +++ b/layer/layer_store.go @@ -621,6 +621,17 @@ func (ls *layerStore) assembleTar(graphID string, metadata io.ReadCloser, size * return pR, nil } +// Metadata returns the low level metadata from the mount with the given name +func (ls *layerStore) Metadata(name string) (map[string]string, error) { + ls.mountL.Lock() + m := ls.mounts[name] + ls.mountL.Unlock() + if m == nil { + return nil, ErrMountDoesNotExist + } + return ls.driver.GetMetadata(m.mountID) +} + type naiveDiffPathDriver struct { graphdriver.Driver } diff --git a/layer/layer_windows.go b/layer/layer_windows.go index 2779995927..369281448a 100644 --- a/layer/layer_windows.go +++ b/layer/layer_windows.go @@ -34,24 +34,6 @@ func GetLayerPath(s Store, layer ChainID) (string, error) { return path, nil } -// RWLayerMetadata returns the graph metadata for the provided -// mount name. -func RWLayerMetadata(s Store, name string) (map[string]string, error) { - ls, ok := s.(*layerStore) - if !ok { - return nil, errors.New("unsupported layer store") - } - ls.mountL.Lock() - defer ls.mountL.Unlock() - - ml, ok := ls.mounts[name] - if !ok { - return nil, errors.New("mount does not exist") - } - - return ls.driver.GetMetadata(ml.mountID) -} - func (ls *layerStore) RegisterDiffID(graphID string, size int64) (Layer, error) { var err error // this is used for cleanup in existingLayer case diffID, err := digest.FromBytes([]byte(graphID))