diff --git a/components/engine/libcontainerd/queue_unix.go b/components/engine/libcontainerd/queue_unix.go index b848b9872b..66765f75ec 100644 --- a/components/engine/libcontainerd/queue_unix.go +++ b/components/engine/libcontainerd/queue_unix.go @@ -27,5 +27,11 @@ func (q *queue) append(id string, f func()) { } f() close(done) + + q.Lock() + if q.fns[id] == done { + delete(q.fns, id) + } + q.Unlock() }() } diff --git a/components/engine/libcontainerd/queue_unix_test.go b/components/engine/libcontainerd/queue_unix_test.go new file mode 100644 index 0000000000..bb49a5d4c2 --- /dev/null +++ b/components/engine/libcontainerd/queue_unix_test.go @@ -0,0 +1,33 @@ +// +build linux solaris + +package libcontainerd + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestSerialization(t *testing.T) { + var ( + q queue + serialization = 1 + ) + + q.append("aaa", func() { + //simulate a long time task + time.Sleep(10 * time.Millisecond) + require.EqualValues(t, serialization, 1) + serialization = 2 + }) + q.append("aaa", func() { + require.EqualValues(t, serialization, 2) + serialization = 3 + }) + q.append("aaa", func() { + require.EqualValues(t, serialization, 3) + serialization = 4 + }) + time.Sleep(20 * time.Millisecond) +}