Vendor c/storage 1.13.3

Pull in fixes to avoid double locking the mounts list when
doing a save or cleanup.

Signed-off-by: Urvashi Mohnani <umohnani@redhat.com>
This commit is contained in:
Urvashi Mohnani
2019-09-16 14:52:24 -04:00
parent 143caa98bf
commit 518d59182e
8 changed files with 69 additions and 53 deletions

2
go.mod
View File

@ -17,7 +17,7 @@ require (
github.com/containers/conmon v0.3.0 // indirect github.com/containers/conmon v0.3.0 // indirect
github.com/containers/image v3.0.2+incompatible github.com/containers/image v3.0.2+incompatible
github.com/containers/psgo v1.3.1 github.com/containers/psgo v1.3.1
github.com/containers/storage v1.13.2 github.com/containers/storage v1.13.3
github.com/coreos/bbolt v1.3.3 // indirect github.com/coreos/bbolt v1.3.3 // indirect
github.com/coreos/etcd v3.3.13+incompatible // indirect github.com/coreos/etcd v3.3.13+incompatible // indirect
github.com/coreos/go-iptables v0.4.2 // indirect github.com/coreos/go-iptables v0.4.2 // indirect

2
go.sum
View File

@ -108,6 +108,8 @@ github.com/containers/storage v1.13.1 h1:rjVirLS9fCGkUFlLDZEoGDDUugtIf46DufWvJu0
github.com/containers/storage v1.13.1/go.mod h1:6D8nK2sU9V7nEmAraINRs88ZEscM5C5DK+8Npp27GeA= github.com/containers/storage v1.13.1/go.mod h1:6D8nK2sU9V7nEmAraINRs88ZEscM5C5DK+8Npp27GeA=
github.com/containers/storage v1.13.2 h1:UXZ0Ckmk6+6+4vj2M2ywruVtH97pnRoAhTG8ctd+yQI= github.com/containers/storage v1.13.2 h1:UXZ0Ckmk6+6+4vj2M2ywruVtH97pnRoAhTG8ctd+yQI=
github.com/containers/storage v1.13.2/go.mod h1:6D8nK2sU9V7nEmAraINRs88ZEscM5C5DK+8Npp27GeA= github.com/containers/storage v1.13.2/go.mod h1:6D8nK2sU9V7nEmAraINRs88ZEscM5C5DK+8Npp27GeA=
github.com/containers/storage v1.13.3 h1:9EzTXZXG/8SGD9MnkSCe/jLq3QldcE1QlgW7vePEsjw=
github.com/containers/storage v1.13.3/go.mod h1:6D8nK2sU9V7nEmAraINRs88ZEscM5C5DK+8Npp27GeA=
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=

View File

@ -1,4 +1,5 @@
export GO111MODULE=off export GO111MODULE=off
export GOPROXY=https://proxy.golang.org
.PHONY: \ .PHONY: \
all \ all \

View File

@ -1 +1 @@
1.13.3-dev 1.13.3

View File

@ -372,7 +372,7 @@ func (r *imageStore) ClearFlag(id string, flag string) error {
} }
image, ok := r.lookup(id) image, ok := r.lookup(id)
if !ok { if !ok {
return ErrImageUnknown return errors.Wrapf(ErrImageUnknown, "error locating image with ID %q", id)
} }
delete(image.Flags, flag) delete(image.Flags, flag)
return r.Save() return r.Save()
@ -384,7 +384,7 @@ func (r *imageStore) SetFlag(id string, flag string, value interface{}) error {
} }
image, ok := r.lookup(id) image, ok := r.lookup(id)
if !ok { if !ok {
return ErrImageUnknown return errors.Wrapf(ErrImageUnknown, "error locating image with ID %q", id)
} }
if image.Flags == nil { if image.Flags == nil {
image.Flags = make(map[string]interface{}) image.Flags = make(map[string]interface{})
@ -456,14 +456,14 @@ func (r *imageStore) addMappedTopLayer(id, layer string) error {
image.MappedTopLayers = append(image.MappedTopLayers, layer) image.MappedTopLayers = append(image.MappedTopLayers, layer)
return r.Save() return r.Save()
} }
return ErrImageUnknown return errors.Wrapf(ErrImageUnknown, "error locating image with ID %q", id)
} }
func (r *imageStore) Metadata(id string) (string, error) { func (r *imageStore) Metadata(id string) (string, error) {
if image, ok := r.lookup(id); ok { if image, ok := r.lookup(id); ok {
return image.Metadata, nil return image.Metadata, nil
} }
return "", ErrImageUnknown return "", errors.Wrapf(ErrImageUnknown, "error locating image with ID %q", id)
} }
func (r *imageStore) SetMetadata(id, metadata string) error { func (r *imageStore) SetMetadata(id, metadata string) error {
@ -474,7 +474,7 @@ func (r *imageStore) SetMetadata(id, metadata string) error {
image.Metadata = metadata image.Metadata = metadata
return r.Save() return r.Save()
} }
return ErrImageUnknown return errors.Wrapf(ErrImageUnknown, "error locating image with ID %q", id)
} }
func (r *imageStore) removeName(image *Image, name string) { func (r *imageStore) removeName(image *Image, name string) {
@ -499,7 +499,7 @@ func (r *imageStore) SetNames(id string, names []string) error {
image.Names = names image.Names = names
return r.Save() return r.Save()
} }
return ErrImageUnknown return errors.Wrapf(ErrImageUnknown, "error locating image with ID %q", id)
} }
func (r *imageStore) Delete(id string) error { func (r *imageStore) Delete(id string) error {
@ -508,7 +508,7 @@ func (r *imageStore) Delete(id string) error {
} }
image, ok := r.lookup(id) image, ok := r.lookup(id)
if !ok { if !ok {
return ErrImageUnknown return errors.Wrapf(ErrImageUnknown, "error locating image with ID %q", id)
} }
id = image.ID id = image.ID
toDeleteIndex := -1 toDeleteIndex := -1
@ -551,14 +551,14 @@ func (r *imageStore) Get(id string) (*Image, error) {
if image, ok := r.lookup(id); ok { if image, ok := r.lookup(id); ok {
return copyImage(image), nil return copyImage(image), nil
} }
return nil, ErrImageUnknown return nil, errors.Wrapf(ErrImageUnknown, "error locating image with ID %q", id)
} }
func (r *imageStore) Lookup(name string) (id string, err error) { func (r *imageStore) Lookup(name string) (id string, err error) {
if image, ok := r.lookup(name); ok { if image, ok := r.lookup(name); ok {
return image.ID, nil return image.ID, nil
} }
return "", ErrImageUnknown return "", errors.Wrapf(ErrImageUnknown, "error locating image with ID %q", id)
} }
func (r *imageStore) Exists(id string) bool { func (r *imageStore) Exists(id string) bool {
@ -570,7 +570,7 @@ func (r *imageStore) ByDigest(d digest.Digest) ([]*Image, error) {
if images, ok := r.bydigest[d]; ok { if images, ok := r.bydigest[d]; ok {
return copyImageSlice(images), nil return copyImageSlice(images), nil
} }
return nil, ErrImageUnknown return nil, errors.Wrapf(ErrImageUnknown, "error locating image with digest %q", d)
} }
func (r *imageStore) BigData(id, key string) ([]byte, error) { func (r *imageStore) BigData(id, key string) ([]byte, error) {
@ -579,7 +579,7 @@ func (r *imageStore) BigData(id, key string) ([]byte, error) {
} }
image, ok := r.lookup(id) image, ok := r.lookup(id)
if !ok { if !ok {
return nil, ErrImageUnknown return nil, errors.Wrapf(ErrImageUnknown, "error locating image with ID %q", id)
} }
return ioutil.ReadFile(r.datapath(image.ID, key)) return ioutil.ReadFile(r.datapath(image.ID, key))
} }
@ -590,7 +590,7 @@ func (r *imageStore) BigDataSize(id, key string) (int64, error) {
} }
image, ok := r.lookup(id) image, ok := r.lookup(id)
if !ok { if !ok {
return -1, ErrImageUnknown return -1, errors.Wrapf(ErrImageUnknown, "error locating image with ID %q", id)
} }
if image.BigDataSizes == nil { if image.BigDataSizes == nil {
image.BigDataSizes = make(map[string]int64) image.BigDataSizes = make(map[string]int64)
@ -610,7 +610,7 @@ func (r *imageStore) BigDataDigest(id, key string) (digest.Digest, error) {
} }
image, ok := r.lookup(id) image, ok := r.lookup(id)
if !ok { if !ok {
return "", ErrImageUnknown return "", errors.Wrapf(ErrImageUnknown, "error locating image with ID %q", id)
} }
if image.BigDataDigests == nil { if image.BigDataDigests == nil {
image.BigDataDigests = make(map[string]digest.Digest) image.BigDataDigests = make(map[string]digest.Digest)
@ -624,7 +624,7 @@ func (r *imageStore) BigDataDigest(id, key string) (digest.Digest, error) {
func (r *imageStore) BigDataNames(id string) ([]string, error) { func (r *imageStore) BigDataNames(id string) ([]string, error) {
image, ok := r.lookup(id) image, ok := r.lookup(id)
if !ok { if !ok {
return nil, ErrImageUnknown return nil, errors.Wrapf(ErrImageUnknown, "error locating image with ID %q", id)
} }
return copyStringSlice(image.BigDataNames), nil return copyStringSlice(image.BigDataNames), nil
} }
@ -649,7 +649,7 @@ func (r *imageStore) SetBigData(id, key string, data []byte, digestManifest func
} }
image, ok := r.lookup(id) image, ok := r.lookup(id)
if !ok { if !ok {
return ErrImageUnknown return errors.Wrapf(ErrImageUnknown, "error locating image with ID %q", id)
} }
err := os.MkdirAll(r.datadir(image.ID), 0700) err := os.MkdirAll(r.datadir(image.ID), 0700)
if err != nil { if err != nil {

View File

@ -363,7 +363,7 @@ func (r *layerStore) Load() error {
} }
if cleanup, ok := layer.Flags[incompleteFlag]; ok { if cleanup, ok := layer.Flags[incompleteFlag]; ok {
if b, ok := cleanup.(bool); ok && b { if b, ok := cleanup.(bool); ok && b {
err = r.Delete(layer.ID) err = r.deleteInternal(layer.ID)
if err != nil { if err != nil {
break break
} }
@ -372,7 +372,7 @@ func (r *layerStore) Load() error {
} }
} }
if shouldSave { if shouldSave {
return r.Save() return r.saveLayers()
} }
} }
return err return err
@ -416,6 +416,16 @@ func (r *layerStore) loadMounts() error {
} }
func (r *layerStore) Save() error { func (r *layerStore) Save() error {
r.mountsLockfile.Lock()
defer r.mountsLockfile.Unlock()
defer r.mountsLockfile.Touch()
if err := r.saveLayers(); err != nil {
return err
}
return r.saveMounts()
}
func (r *layerStore) saveLayers() error {
if !r.IsReadWrite() { if !r.IsReadWrite() {
return errors.Wrapf(ErrStoreIsReadOnly, "not allowed to modify the layer store at %q", r.layerspath()) return errors.Wrapf(ErrStoreIsReadOnly, "not allowed to modify the layer store at %q", r.layerspath())
} }
@ -431,13 +441,7 @@ func (r *layerStore) Save() error {
return err return err
} }
defer r.Touch() defer r.Touch()
if err := ioutils.AtomicWriteFile(rpath, jldata, 0600); err != nil { return ioutils.AtomicWriteFile(rpath, jldata, 0600)
return err
}
r.mountsLockfile.Lock()
defer r.mountsLockfile.Unlock()
defer r.mountsLockfile.Touch()
return r.saveMounts()
} }
func (r *layerStore) saveMounts() error { func (r *layerStore) saveMounts() error {
@ -954,7 +958,7 @@ func (r *layerStore) tspath(id string) string {
return filepath.Join(r.layerdir, id+tarSplitSuffix) return filepath.Join(r.layerdir, id+tarSplitSuffix)
} }
func (r *layerStore) Delete(id string) error { func (r *layerStore) deleteInternal(id string) error {
if !r.IsReadWrite() { if !r.IsReadWrite() {
return errors.Wrapf(ErrStoreIsReadOnly, "not allowed to delete layers at %q", r.layerspath()) return errors.Wrapf(ErrStoreIsReadOnly, "not allowed to delete layers at %q", r.layerspath())
} }
@ -963,23 +967,7 @@ func (r *layerStore) Delete(id string) error {
return ErrLayerUnknown return ErrLayerUnknown
} }
id = layer.ID id = layer.ID
// The layer may already have been explicitly unmounted, but if not, we err := r.driver.Remove(id)
// should try to clean that up before we start deleting anything at the
// driver level.
mountCount, err := r.Mounted(id)
if err != nil {
return errors.Wrapf(err, "error checking if layer %q is still mounted", id)
}
for mountCount > 0 {
if _, err := r.Unmount(id, false); err != nil {
return err
}
mountCount, err = r.Mounted(id)
if err != nil {
return errors.Wrapf(err, "error checking if layer %q is still mounted", id)
}
}
err = r.driver.Remove(id)
if err == nil { if err == nil {
os.Remove(r.tspath(id)) os.Remove(r.tspath(id))
delete(r.byid, id) delete(r.byid, id)
@ -1015,13 +1003,38 @@ func (r *layerStore) Delete(id string) error {
label.ReleaseLabel(mountLabel) label.ReleaseLabel(mountLabel)
} }
} }
if err = r.Save(); err != nil {
return err
}
} }
return err return err
} }
func (r *layerStore) Delete(id string) error {
layer, ok := r.lookup(id)
if !ok {
return ErrLayerUnknown
}
id = layer.ID
// The layer may already have been explicitly unmounted, but if not, we
// should try to clean that up before we start deleting anything at the
// driver level.
mountCount, err := r.Mounted(id)
if err != nil {
return errors.Wrapf(err, "error checking if layer %q is still mounted", id)
}
for mountCount > 0 {
if _, err := r.Unmount(id, false); err != nil {
return err
}
mountCount, err = r.Mounted(id)
if err != nil {
return errors.Wrapf(err, "error checking if layer %q is still mounted", id)
}
}
if err := r.deleteInternal(id); err != nil {
return err
}
return r.Save()
}
func (r *layerStore) Lookup(name string) (id string, err error) { func (r *layerStore) Lookup(name string) (id string, err error) {
if layer, ok := r.lookup(name); ok { if layer, ok := r.lookup(name); ok {
return layer.ID, nil return layer.ID, nil

View File

@ -1202,7 +1202,7 @@ func (s *store) CreateContainer(id string, names []string, image, layer, metadat
} }
} }
if cimage == nil { if cimage == nil {
return nil, ErrImageUnknown return nil, errors.Wrapf(ErrImageUnknown, "error locating image with ID %q", id)
} }
imageID = cimage.ID imageID = cimage.ID
@ -1437,7 +1437,7 @@ func (s *store) ListImageBigData(id string) ([]string, error) {
return bigDataNames, err return bigDataNames, err
} }
} }
return nil, ErrImageUnknown return nil, errors.Wrapf(ErrImageUnknown, "error locating image with ID %q", id)
} }
func (s *store) ImageBigDataSize(id, key string) (int64, error) { func (s *store) ImageBigDataSize(id, key string) (int64, error) {
@ -1516,7 +1516,7 @@ func (s *store) ImageBigData(id, key string) ([]byte, error) {
return data, nil return data, nil
} }
} }
return nil, ErrImageUnknown return nil, errors.Wrapf(ErrImageUnknown, "error locating image with ID %q", id)
} }
func (s *store) SetImageBigData(id, key string, data []byte, digestManifest func([]byte) (digest.Digest, error)) error { func (s *store) SetImageBigData(id, key string, data []byte, digestManifest func([]byte) (digest.Digest, error)) error {
@ -2891,7 +2891,7 @@ func (s *store) Image(id string) (*Image, error) {
return image, nil return image, nil
} }
} }
return nil, ErrImageUnknown return nil, errors.Wrapf(ErrImageUnknown, "error locating image with ID %q", id)
} }
func (s *store) ImagesByTopLayer(id string) ([]*Image, error) { func (s *store) ImagesByTopLayer(id string) ([]*Image, error) {
@ -2953,7 +2953,7 @@ func (s *store) ImagesByDigest(d digest.Digest) ([]*Image, error) {
} }
} }
imageList, err := store.ByDigest(d) imageList, err := store.ByDigest(d)
if err != nil && err != ErrImageUnknown { if err != nil && errors.Cause(err) != ErrImageUnknown {
return nil, err return nil, err
} }
images = append(images, imageList...) images = append(images, imageList...)

2
vendor/modules.txt vendored
View File

@ -109,7 +109,7 @@ github.com/containers/psgo/internal/dev
github.com/containers/psgo/internal/proc github.com/containers/psgo/internal/proc
github.com/containers/psgo/internal/process github.com/containers/psgo/internal/process
github.com/containers/psgo/internal/host github.com/containers/psgo/internal/host
# github.com/containers/storage v1.13.2 # github.com/containers/storage v1.13.3
github.com/containers/storage github.com/containers/storage
github.com/containers/storage/pkg/archive github.com/containers/storage/pkg/archive
github.com/containers/storage/pkg/chrootarchive github.com/containers/storage/pkg/chrootarchive