From d00974a9aa9aad90ef6a3bb9e026f010dec186a5 Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Fri, 3 Sep 2021 13:00:02 +0200 Subject: [PATCH] chunked: cache all the files with the same digest this is a preparation change for the next commit. Signed-off-by: Giuseppe Scrivano --- pkg/chunked/storage_linux.go | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/pkg/chunked/storage_linux.go b/pkg/chunked/storage_linux.go index f2f64b5e7..f62d266ef 100644 --- a/pkg/chunked/storage_linux.go +++ b/pkg/chunked/storage_linux.go @@ -112,14 +112,14 @@ func copyFileContent(srcFd int, destFile string, dirfd int, mode os.FileMode, us return dstFile, st.Size(), err } -func prepareOtherLayersCache(layersMetadata map[string][]internal.FileMetadata) map[string]map[string]*internal.FileMetadata { - maps := make(map[string]map[string]*internal.FileMetadata) +func prepareOtherLayersCache(layersMetadata map[string][]internal.FileMetadata) map[string]map[string][]*internal.FileMetadata { + maps := make(map[string]map[string][]*internal.FileMetadata) for layerID, v := range layersMetadata { - r := make(map[string]*internal.FileMetadata) + r := make(map[string][]*internal.FileMetadata) for i := range v { if v[i].Digest != "" { - r[v[i].Digest] = &v[i] + r[v[i].Digest] = append(r[v[i].Digest], &v[i]) } } maps[layerID] = r @@ -243,20 +243,21 @@ func copyFileFromOtherLayer(file internal.FileMetadata, source string, otherFile // layersMetadata contains the metadata for each layer in the storage. // layersTarget maps each layer to its checkout on disk. // useHardLinks defines whether the deduplication can be performed using hard links. -func findFileInOtherLayers(file internal.FileMetadata, dirfd int, layersMetadata map[string]map[string]*internal.FileMetadata, layersTarget map[string]string, useHardLinks bool) (bool, *os.File, int64, error) { +func findFileInOtherLayers(file internal.FileMetadata, dirfd int, layersMetadata map[string]map[string][]*internal.FileMetadata, layersTarget map[string]string, useHardLinks bool) (bool, *os.File, int64, error) { // this is ugly, needs to be indexed for layerID, checksums := range layersMetadata { m, found := checksums[file.Digest] if !found { continue } - source, ok := layersTarget[layerID] - if !ok { + if !ok || len(source) == 0 { continue } - found, dstFile, written, err := copyFileFromOtherLayer(file, source, m, dirfd, useHardLinks) + otherFile := m[0] + + found, dstFile, written, err := copyFileFromOtherLayer(file, source, otherFile, dirfd, useHardLinks) if found && err == nil { return found, dstFile, written, err }