From d0e1949d2280533a57170c9e457ee700fb924ab9 Mon Sep 17 00:00:00 2001 From: Darren Stahl Date: Thu, 10 Nov 2016 14:06:57 -0800 Subject: [PATCH 1/2] Vendor update hcsshim to v0.5.8 Signed-off-by: Darren Stahl --- vendor.conf | 2 +- vendor/github.com/Microsoft/hcsshim/container.go | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/vendor.conf b/vendor.conf index bf4effa8db..5158e68924 100644 --- a/vendor.conf +++ b/vendor.conf @@ -1,6 +1,6 @@ # the following lines are in sorted order, FYI github.com/Azure/go-ansiterm 388960b655244e76e24c75f48631564eaefade62 -github.com/Microsoft/hcsshim v0.5.7 +github.com/Microsoft/hcsshim v0.5.8 github.com/Microsoft/go-winio v0.3.6 github.com/Sirupsen/logrus f76d643702a30fbffecdfe50831e11881c96ceb3 https://github.com/aaronlehmann/logrus github.com/davecgh/go-spew 6d212800a42e8ab5c146b8ace3490ee17e5225f9 diff --git a/vendor/github.com/Microsoft/hcsshim/container.go b/vendor/github.com/Microsoft/hcsshim/container.go index 48a7549704..ba3faeb206 100644 --- a/vendor/github.com/Microsoft/hcsshim/container.go +++ b/vendor/github.com/Microsoft/hcsshim/container.go @@ -192,6 +192,10 @@ func GetContainers(q ComputeSystemQuery) ([]ContainerProperties, error) { ) err = hcsEnumerateComputeSystems(query, &computeSystemsp, &resultp) err = processHcsResult(err, resultp) + if err != nil { + return nil, err + } + if computeSystemsp == nil { return nil, ErrUnexpectedValue } From d4095a5902b62181d49ef07db18610975cb49d08 Mon Sep 17 00:00:00 2001 From: Darren Stahl Date: Thu, 10 Nov 2016 14:07:11 -0800 Subject: [PATCH 2/2] Fix failure to get containers when deleting a layer Signed-off-by: Darren Stahl --- daemon/graphdriver/windows/windows.go | 28 +++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/daemon/graphdriver/windows/windows.go b/daemon/graphdriver/windows/windows.go index 1c0b4b1681..09ea6c7333 100644 --- a/daemon/graphdriver/windows/windows.go +++ b/daemon/graphdriver/windows/windows.go @@ -17,6 +17,7 @@ import ( "strings" "sync" "syscall" + "time" "unsafe" "github.com/Microsoft/go-winio" @@ -260,10 +261,29 @@ func (d *Driver) Remove(id string) error { return err } - // Get and terminate any template VMs that are currently using the layer - computeSystems, err := hcsshim.GetContainers(hcsshim.ComputeSystemQuery{}) - if err != nil { - return err + // This retry loop is due to a bug in Windows (Internal bug #9432268) + // if GetContainers fails with ErrVmcomputeOperationInvalidState + // it is a transient error. Retry until it succeeds. + var computeSystems []hcsshim.ContainerProperties + retryCount := 0 + for { + // Get and terminate any template VMs that are currently using the layer + computeSystems, err = hcsshim.GetContainers(hcsshim.ComputeSystemQuery{}) + if err != nil { + if err == hcsshim.ErrVmcomputeOperationInvalidState { + if retryCount >= 5 { + // If we are unable to get the list of containers + // go ahead and attempt to delete the layer anyway + // as it will most likely work. + break + } + retryCount++ + time.Sleep(2 * time.Second) + continue + } + return err + } + break } for _, computeSystem := range computeSystems {