Browse code

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 <derek@mcgstyle.net> (github: dmcgowan)

Derek McGowan authored on 2015/12/15 09:52:15
Showing 7 changed files
... ...
@@ -92,7 +92,7 @@ func (daemon *Daemon) populateCommand(c *container.Container, env []string) erro
92 92
 		}
93 93
 	}
94 94
 
95
-	m, err := layer.RWLayerMetadata(daemon.layerStore, c.ID)
95
+	m, err := daemon.layerStore.Metadata(c.ID)
96 96
 	if err != nil {
97 97
 		return derr.ErrorCodeGetLayerMetadata.WithArgs(err)
98 98
 	}
... ...
@@ -10,7 +10,6 @@ import (
10 10
 	"github.com/docker/docker/container"
11 11
 	"github.com/docker/docker/daemon/exec"
12 12
 	"github.com/docker/docker/daemon/network"
13
-	"github.com/docker/docker/layer"
14 13
 	"github.com/docker/docker/pkg/version"
15 14
 )
16 15
 
... ...
@@ -164,17 +163,7 @@ func (daemon *Daemon) getInspectData(container *container.Container, size bool)
164 164
 
165 165
 	contJSONBase.GraphDriver.Name = container.Driver
166 166
 
167
-	image, err := daemon.imageStore.Get(container.ImageID)
168
-	if err != nil {
169
-		return nil, err
170
-	}
171
-	l, err := daemon.layerStore.Get(image.RootFS.ChainID())
172
-	if err != nil {
173
-		return nil, err
174
-	}
175
-	defer layer.ReleaseAndLog(daemon.layerStore, l)
176
-
177
-	graphDriverData, err := l.Metadata()
167
+	graphDriverData, err := daemon.layerStore.Metadata(container.ID)
178 168
 	if err != nil {
179 169
 		return nil, err
180 170
 	}
... ...
@@ -132,6 +132,10 @@ func (ls *mockLayerStore) Changes(id string) ([]archive.Change, error) {
132 132
 	return nil, errors.New("not implemented")
133 133
 }
134 134
 
135
+func (ls *mockLayerStore) Metadata(id string) (map[string]string, error) {
136
+	return nil, errors.New("not implemented")
137
+}
138
+
135 139
 type mockDownloadDescriptor struct {
136 140
 	currentDownloads *int32
137 141
 	id               string
... ...
@@ -209,9 +209,14 @@ func (s *DockerSuite) TestInspectContainerGraphDriver(c *check.C) {
209 209
 		return
210 210
 	}
211 211
 
212
+	imageDeviceID, err := inspectField("busybox", "GraphDriver.Data.DeviceId")
213
+	c.Assert(err, checker.IsNil)
214
+
212 215
 	deviceID, err := inspectField(out, "GraphDriver.Data.DeviceId")
213 216
 	c.Assert(err, checker.IsNil)
214 217
 
218
+	c.Assert(imageDeviceID, checker.Not(checker.Equals), deviceID)
219
+
215 220
 	_, err = strconv.Atoi(deviceID)
216 221
 	c.Assert(err, checker.IsNil, check.Commentf("failed to inspect DeviceId of the image: %s, %v", deviceID, err))
217 222
 
... ...
@@ -151,6 +151,7 @@ type Store interface {
151 151
 	Unmount(id string) error
152 152
 	DeleteMount(id string) ([]Metadata, error)
153 153
 	Changes(id string) ([]archive.Change, error)
154
+	Metadata(id string) (map[string]string, error)
154 155
 }
155 156
 
156 157
 // MetadataTransaction represents functions for setting layer metadata
... ...
@@ -621,6 +621,17 @@ func (ls *layerStore) assembleTar(graphID string, metadata io.ReadCloser, size *
621 621
 	return pR, nil
622 622
 }
623 623
 
624
+// Metadata returns the low level metadata from the mount with the given name
625
+func (ls *layerStore) Metadata(name string) (map[string]string, error) {
626
+	ls.mountL.Lock()
627
+	m := ls.mounts[name]
628
+	ls.mountL.Unlock()
629
+	if m == nil {
630
+		return nil, ErrMountDoesNotExist
631
+	}
632
+	return ls.driver.GetMetadata(m.mountID)
633
+}
634
+
624 635
 type naiveDiffPathDriver struct {
625 636
 	graphdriver.Driver
626 637
 }
... ...
@@ -34,24 +34,6 @@ func GetLayerPath(s Store, layer ChainID) (string, error) {
34 34
 	return path, nil
35 35
 }
36 36
 
37
-// RWLayerMetadata returns the graph metadata for the provided
38
-// mount name.
39
-func RWLayerMetadata(s Store, name string) (map[string]string, error) {
40
-	ls, ok := s.(*layerStore)
41
-	if !ok {
42
-		return nil, errors.New("unsupported layer store")
43
-	}
44
-	ls.mountL.Lock()
45
-	defer ls.mountL.Unlock()
46
-
47
-	ml, ok := ls.mounts[name]
48
-	if !ok {
49
-		return nil, errors.New("mount does not exist")
50
-	}
51
-
52
-	return ls.driver.GetMetadata(ml.mountID)
53
-}
54
-
55 37
 func (ls *layerStore) RegisterDiffID(graphID string, size int64) (Layer, error) {
56 38
 	var err error // this is used for cleanup in existingLayer case
57 39
 	diffID, err := digest.FromBytes([]byte(graphID))