solver: add test for input request deadlock
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>docker-18.09
parent
9d0570c6aa
commit
23904e6ffa
|
@ -2947,6 +2947,133 @@ func TestMergedEdgesLookup(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestInputRequestDeadlock(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
ctx := context.TODO()
|
||||||
|
|
||||||
|
s := NewSolver(SolverOpt{
|
||||||
|
ResolveOpFunc: testOpResolver,
|
||||||
|
})
|
||||||
|
defer s.Close()
|
||||||
|
|
||||||
|
j0, err := s.NewJob("job0")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if j0 != nil {
|
||||||
|
j0.Discard()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
g0 := Edge{
|
||||||
|
Vertex: vtx(vtxOpt{
|
||||||
|
name: "v0",
|
||||||
|
cacheKeySeed: "seed0",
|
||||||
|
value: "result0",
|
||||||
|
inputs: []Edge{
|
||||||
|
{
|
||||||
|
Vertex: vtx(vtxOpt{
|
||||||
|
name: "v1",
|
||||||
|
cacheKeySeed: "seed1",
|
||||||
|
value: "result1",
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Vertex: vtx(vtxOpt{
|
||||||
|
name: "v2",
|
||||||
|
cacheKeySeed: "seed2",
|
||||||
|
value: "result2",
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = j0.Build(ctx, g0)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NoError(t, j0.Discard())
|
||||||
|
j0 = nil
|
||||||
|
|
||||||
|
j1, err := s.NewJob("job1")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if j1 != nil {
|
||||||
|
j1.Discard()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
g1 := Edge{
|
||||||
|
Vertex: vtx(vtxOpt{
|
||||||
|
name: "v0",
|
||||||
|
cacheKeySeed: "seed0-1",
|
||||||
|
value: "result0",
|
||||||
|
inputs: []Edge{
|
||||||
|
{
|
||||||
|
Vertex: vtx(vtxOpt{
|
||||||
|
name: "v1",
|
||||||
|
cacheKeySeed: "seed1-1",
|
||||||
|
value: "result1",
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Vertex: vtx(vtxOpt{
|
||||||
|
name: "v2",
|
||||||
|
cacheKeySeed: "seed2-1",
|
||||||
|
value: "result2",
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = j1.Build(ctx, g1)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NoError(t, j1.Discard())
|
||||||
|
j1 = nil
|
||||||
|
|
||||||
|
j2, err := s.NewJob("job2")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if j2 != nil {
|
||||||
|
j2.Discard()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
g2 := Edge{
|
||||||
|
Vertex: vtx(vtxOpt{
|
||||||
|
name: "v0",
|
||||||
|
cacheKeySeed: "seed0-1",
|
||||||
|
value: "result0",
|
||||||
|
inputs: []Edge{
|
||||||
|
{
|
||||||
|
Vertex: vtx(vtxOpt{
|
||||||
|
name: "v1",
|
||||||
|
cacheKeySeed: "seed1",
|
||||||
|
value: "result1",
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Vertex: vtx(vtxOpt{
|
||||||
|
name: "v2",
|
||||||
|
cacheKeySeed: "seed2-1",
|
||||||
|
value: "result2",
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
slowCacheCompute: map[int]ResultBasedCacheFunc{
|
||||||
|
1: digestFromResult,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = j2.Build(ctx, g2)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NoError(t, j2.Discard())
|
||||||
|
j2 = nil
|
||||||
|
}
|
||||||
|
|
||||||
func generateSubGraph(nodes int) (Edge, int) {
|
func generateSubGraph(nodes int) (Edge, int) {
|
||||||
if nodes == 1 {
|
if nodes == 1 {
|
||||||
value := rand.Int() % 500
|
value := rand.Int() % 500
|
||||||
|
|
Loading…
Reference in New Issue