diff --git a/containers.go b/containers.go index 2182cbb98..0bcdccae6 100644 --- a/containers.go +++ b/containers.go @@ -281,26 +281,30 @@ func (r *containerStore) load(lockedForWriting bool) error { if err != nil && !os.IsNotExist(err) { return err } + containers := []*Container{} - layers := make(map[string]*Container) - idlist := []string{} - ids := make(map[string]*Container) - names := make(map[string]*Container) - if err = json.Unmarshal(data, &containers); len(data) == 0 || err == nil { - idlist = make([]string, 0, len(containers)) - for n, container := range containers { - idlist = append(idlist, container.ID) - ids[container.ID] = containers[n] - layers[container.LayerID] = containers[n] - for _, name := range container.Names { - if conflict, ok := names[name]; ok { - r.removeName(conflict, name) - needSave = true - } - names[name] = containers[n] - } + if len(data) != 0 { + if err := json.Unmarshal(data, &containers); err != nil { + return fmt.Errorf("loading %q: %w", rpath, err) } } + idlist := make([]string, 0, len(containers)) + layers := make(map[string]*Container) + ids := make(map[string]*Container) + names := make(map[string]*Container) + for n, container := range containers { + idlist = append(idlist, container.ID) + ids[container.ID] = containers[n] + layers[container.LayerID] = containers[n] + for _, name := range container.Names { + if conflict, ok := names[name]; ok { + r.removeName(conflict, name) + needSave = true + } + names[name] = containers[n] + } + } + r.containers = containers r.idindex = truncindex.NewTruncIndex(idlist) // Invalid values in idlist are ignored: they are not a reason to refuse processing the whole store. r.byid = ids diff --git a/images.go b/images.go index ea32cc34b..81aef7c9f 100644 --- a/images.go +++ b/images.go @@ -349,37 +349,40 @@ func (r *imageStore) load(lockedForWriting bool) error { if err != nil && !os.IsNotExist(err) { return err } + images := []*Image{} - idlist := []string{} + if len(data) != 0 { + if err := json.Unmarshal(data, &images); err != nil { + return fmt.Errorf("loading %q: %w", rpath, err) + } + } + idlist := make([]string, 0, len(images)) ids := make(map[string]*Image) names := make(map[string]*Image) digests := make(map[digest.Digest][]*Image) - if err = json.Unmarshal(data, &images); len(data) == 0 || err == nil { - idlist = make([]string, 0, len(images)) - for n, image := range images { - ids[image.ID] = images[n] - idlist = append(idlist, image.ID) - for _, name := range image.Names { - if conflict, ok := names[name]; ok { - r.removeName(conflict, name) - shouldSave = true - } + for n, image := range images { + ids[image.ID] = images[n] + idlist = append(idlist, image.ID) + for _, name := range image.Names { + if conflict, ok := names[name]; ok { + r.removeName(conflict, name) + shouldSave = true } - // Compute the digest list. - err = image.recomputeDigests() - if err != nil { - return fmt.Errorf("computing digests for image with ID %q (%v): %w", image.ID, image.Names, err) - } - for _, name := range image.Names { - names[name] = image - } - for _, digest := range image.Digests { - list := digests[digest] - digests[digest] = append(list, image) - } - image.ReadOnly = !r.lockfile.IsReadWrite() } + // Compute the digest list. + if err := image.recomputeDigests(); err != nil { + return fmt.Errorf("computing digests for image with ID %q (%v): %w", image.ID, image.Names, err) + } + for _, name := range image.Names { + names[name] = image + } + for _, digest := range image.Digests { + list := digests[digest] + digests[digest] = append(list, image) + } + image.ReadOnly = !r.lockfile.IsReadWrite() } + if shouldSave && (!r.lockfile.IsReadWrite() || !lockedForWriting) { // Eventually, the callers should be modified to retry with a write lock if IsReadWrite && !lockedForWriting, instead. return ErrDuplicateImageNames diff --git a/layers.go b/layers.go index 032f4683e..2953d3b62 100644 --- a/layers.go +++ b/layers.go @@ -470,8 +470,14 @@ func (r *layerStore) load(lockedForWriting bool) error { if err != nil && !os.IsNotExist(err) { return err } + layers := []*Layer{} - idlist := []string{} + if len(data) != 0 { + if err := json.Unmarshal(data, &layers); err != nil { + return fmt.Errorf("loading %q: %w", rpath, err) + } + } + idlist := make([]string, 0, len(layers)) ids := make(map[string]*Layer) names := make(map[string]*Layer) compressedsums := make(map[digest.Digest][]string) @@ -479,31 +485,28 @@ func (r *layerStore) load(lockedForWriting bool) error { if r.lockfile.IsReadWrite() { selinux.ClearLabels() } - if err = json.Unmarshal(data, &layers); len(data) == 0 || err == nil { - idlist = make([]string, 0, len(layers)) - for n, layer := range layers { - ids[layer.ID] = layers[n] - idlist = append(idlist, layer.ID) - for _, name := range layer.Names { - if conflict, ok := names[name]; ok { - r.removeName(conflict, name) - shouldSave = true - } - names[name] = layers[n] + for n, layer := range layers { + ids[layer.ID] = layers[n] + idlist = append(idlist, layer.ID) + for _, name := range layer.Names { + if conflict, ok := names[name]; ok { + r.removeName(conflict, name) + shouldSave = true } - if layer.CompressedDigest != "" { - compressedsums[layer.CompressedDigest] = append(compressedsums[layer.CompressedDigest], layer.ID) - } - if layer.UncompressedDigest != "" { - uncompressedsums[layer.UncompressedDigest] = append(uncompressedsums[layer.UncompressedDigest], layer.ID) - } - if layer.MountLabel != "" { - selinux.ReserveLabel(layer.MountLabel) - } - layer.ReadOnly = !r.lockfile.IsReadWrite() + names[name] = layers[n] } - err = nil + if layer.CompressedDigest != "" { + compressedsums[layer.CompressedDigest] = append(compressedsums[layer.CompressedDigest], layer.ID) + } + if layer.UncompressedDigest != "" { + uncompressedsums[layer.UncompressedDigest] = append(uncompressedsums[layer.UncompressedDigest], layer.ID) + } + if layer.MountLabel != "" { + selinux.ReserveLabel(layer.MountLabel) + } + layer.ReadOnly = !r.lockfile.IsReadWrite() } + if shouldSave && (!r.lockfile.IsReadWrite() || !lockedForWriting) { // Eventually, the callers should be modified to retry with a write lock if IsReadWrite && !lockedForWriting, instead. return ErrDuplicateLayerNames @@ -519,7 +522,7 @@ func (r *layerStore) load(lockedForWriting bool) error { if r.lockfile.IsReadWrite() { r.mountsLockfile.RLock() defer r.mountsLockfile.Unlock() - if err = r.loadMounts(); err != nil { + if err := r.loadMounts(); err != nil { return err } @@ -545,8 +548,7 @@ func (r *layerStore) load(lockedForWriting bool) error { return r.saveLayers() } } - - return err + return nil } func (r *layerStore) loadMounts() error {