Skip to content

Commit aa50970

Browse files
committed
remotecache: add merge keys for loops
Signed-off-by: Tonis Tiigi <[email protected]>
1 parent daa2537 commit aa50970

File tree

1 file changed

+47
-20
lines changed

1 file changed

+47
-20
lines changed

cache/remotecache/v1/chains.go

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -104,34 +104,61 @@ func (c *CacheChains) Add(dgst digest.Digest, deps [][]solver.CacheLink, results
104104
}
105105
}
106106
items := IntersectAll(matchDeps)
107-
if len(items) > 0 {
108-
if len(items) > 1 {
109-
return nil, false, errors.Errorf("TODO: multiple matching dependencies for %s: %v", dgst, items) // merge?
107+
108+
if len(items) > 1 {
109+
var main *item
110+
for it := range items {
111+
main = it
112+
break
110113
}
111114
for it := range items {
112-
r = it
113-
for _, rr := range results {
114-
r.addResult(rr)
115-
}
116-
117-
// make sure that none of the deps are childeren of r
118-
allChildren := map[*item]struct{}{}
119-
if err := r.walkChildren(func(i *item) error {
120-
allChildren[i] = struct{}{}
121-
return nil
122-
}, map[*item]struct{}{}); err != nil {
123-
return nil, false, errors.Wrapf(err, "failed to walk children of %s", dgst)
115+
if it == main {
116+
continue
124117
}
125-
for i, dd := range deps {
126-
for j, d := range dd {
127-
if _, ok := allChildren[d.Src.(*item)]; ok {
128-
deps[i][j].Src = nil
118+
for l, m := range it.children {
119+
for ch := range m {
120+
main.children[l][ch] = struct{}{}
121+
for i, links := range ch.parents {
122+
newlinks := map[link]struct{}{}
123+
for l := range links {
124+
if l.src == it {
125+
l.src = main
126+
}
127+
newlinks[l] = struct{}{}
128+
}
129+
main.parents[i] = newlinks
129130
}
130131
}
131132
}
133+
for _, rr := range it.results {
134+
main.addResult(rr)
135+
}
136+
}
137+
items = map[*item]struct{}{main: {}}
138+
}
132139

133-
break
140+
for it := range items {
141+
r = it
142+
for _, rr := range results {
143+
r.addResult(rr)
144+
}
145+
146+
// make sure that none of the deps are childeren of r
147+
allChildren := map[*item]struct{}{}
148+
if err := r.walkChildren(func(i *item) error {
149+
allChildren[i] = struct{}{}
150+
return nil
151+
}, map[*item]struct{}{}); err != nil {
152+
return nil, false, errors.Wrapf(err, "failed to walk children of %s", dgst)
134153
}
154+
for i, dd := range deps {
155+
for j, d := range dd {
156+
if _, ok := allChildren[d.Src.(*item)]; ok {
157+
deps[i][j].Src = nil
158+
}
159+
}
160+
}
161+
break
135162
}
136163
for i, dd := range deps {
137164
for _, d := range dd {

0 commit comments

Comments
 (0)