You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by ra...@apache.org on 2017/09/08 03:38:21 UTC

[incubator-openwhisk] branch master updated: Fix endless collapsing of failed pulls. (#2713)

This is an automated email from the ASF dual-hosted git repository.

rabbah pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-openwhisk.git


The following commit(s) were added to refs/heads/master by this push:
     new 5f84bb9  Fix endless collapsing of failed pulls. (#2713)
5f84bb9 is described below

commit 5f84bb9d46452dd2df23ca1dc92b9b17eb95efc5
Author: Markus Thömmes <ma...@me.com>
AuthorDate: Fri Sep 8 05:38:18 2017 +0200

    Fix endless collapsing of failed pulls. (#2713)
    
    The pull-future needs to be removed from the caching Map once the underlying runCmd finishes, either successfully or failed.
---
 .../core/containerpool/docker/DockerClient.scala   |  2 +-
 .../docker/test/DockerClientTests.scala            | 32 +++++++++++++++++++++-
 2 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/core/invoker/src/main/scala/whisk/core/containerpool/docker/DockerClient.scala b/core/invoker/src/main/scala/whisk/core/containerpool/docker/DockerClient.scala
index 8ab2a86..915e7f6 100644
--- a/core/invoker/src/main/scala/whisk/core/containerpool/docker/DockerClient.scala
+++ b/core/invoker/src/main/scala/whisk/core/containerpool/docker/DockerClient.scala
@@ -97,7 +97,7 @@ class DockerClient(dockerHost: Option[String] = None)(executionContext: Executio
   private val pullsInFlight = TrieMap[String, Future[Unit]]()
   def pull(image: String)(implicit transid: TransactionId): Future[Unit] =
     pullsInFlight.getOrElseUpdate(image, {
-      runCmd("pull", image).map(_ => pullsInFlight.remove(image))
+      runCmd("pull", image).map(_ => ()).andThen { case _ => pullsInFlight.remove(image) }
     })
 
   private def runCmd(args: String*)(implicit transid: TransactionId): Future[String] = {
diff --git a/tests/src/test/scala/whisk/core/containerpool/docker/test/DockerClientTests.scala b/tests/src/test/scala/whisk/core/containerpool/docker/test/DockerClientTests.scala
index 3ad8f06..9146034 100644
--- a/tests/src/test/scala/whisk/core/containerpool/docker/test/DockerClientTests.scala
+++ b/tests/src/test/scala/whisk/core/containerpool/docker/test/DockerClientTests.scala
@@ -48,7 +48,8 @@ class DockerClientTests extends FlatSpec with Matchers with StreamLogging with B
   implicit val transid = TransactionId.testing
   val id = ContainerId("Id")
 
-  def await[A](f: Future[A], timeout: FiniteDuration = 500.milliseconds) = Await.result(f, timeout)
+  val commandTimeout = 500.milliseconds
+  def await[A](f: Future[A], timeout: FiniteDuration = commandTimeout) = Await.result(f, timeout)
 
   val dockerCommand = "docker"
 
@@ -112,6 +113,35 @@ class DockerClientTests extends FlatSpec with Matchers with StreamLogging with B
     }
   }
 
+  it should "properly clean up failed pulls" in {
+    // Delay execution of the pull command
+    val pullPromise = Promise[String]()
+    var commandsRun = 0
+    val dc = dockerClient {
+      commandsRun += 1
+      pullPromise.future
+    }
+
+    val image = "testimage"
+
+    // Pull first, command should be run
+    dc.pull(image)
+    commandsRun shouldBe 1
+
+    // Pull again, command should not be run
+    dc.pull(image)
+    commandsRun shouldBe 1
+
+    // Finish the pulls above
+    pullPromise.failure(new Throwable())
+
+    retry {
+      // Pulling again should execute the command again
+      Await.ready(dc.pull(image), commandTimeout)
+      commandsRun shouldBe 2
+    }
+  }
+
   it should "write proper log markers on a successful command" in {
     // a dummy string works here as we do not assert any output
     // from the methods below

-- 
To stop receiving notification emails like this one, please contact
['"commits@openwhisk.apache.org" <co...@openwhisk.apache.org>'].