diff --git a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/ContainerPool.scala b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/ContainerPool.scala index 4327ad160fb..92f058bf1fe 100644 --- a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/ContainerPool.scala +++ b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/ContainerPool.scala @@ -125,9 +125,12 @@ class ContainerPool(childFactory: ActorRefFactory => ActorRef, //remove from resent tracking - it may get resent again, or get processed resent = None } + val kind = r.action.exec.kind + val memory = r.action.limits.memory.megabytes.MB + val createdContainer = // Is there enough space on the invoker for this action to be executed. - if (hasPoolSpaceFor(busyPool, r.action.limits.memory.megabytes.MB)) { + if (hasPoolSpaceFor(busyPool ++ prewarmedPool, memory)) { // Schedule a job to a warm container ContainerPool .schedule(r.action, r.msg.user.namespace.name, freePool) @@ -136,12 +139,12 @@ class ContainerPool(childFactory: ActorRefFactory => ActorRef, // There was no warm/warming/warmingCold container. Try to take a prewarm container or a cold container. // Is there enough space to create a new container or do other containers have to be removed? - if (hasPoolSpaceFor(busyPool ++ freePool, r.action.limits.memory.megabytes.MB)) { + if (hasPoolSpaceFor(busyPool ++ freePool ++ prewarmedPool, memory)) { takePrewarmContainer(r.action) .map(container => (container, "prewarmed")) .orElse { - val container = Some(createContainer(r.action.limits.memory.megabytes.MB), "cold") - incrementColdStartCount(r.action.exec.kind, r.action.limits.memory.megabytes.MB) + val container = Some(createContainer(memory), "cold") + incrementColdStartCount(kind, memory) container } } else None) @@ -158,8 +161,8 @@ class ContainerPool(childFactory: ActorRefFactory => ActorRef, takePrewarmContainer(r.action) .map(container => (container, "recreatedPrewarm")) .getOrElse { - val container = (createContainer(r.action.limits.memory.megabytes.MB), "recreated") - incrementColdStartCount(r.action.exec.kind, r.action.limits.memory.megabytes.MB) + val container = (createContainer(memory), "recreated") + incrementColdStartCount(kind, memory) container })) diff --git a/tests/src/test/scala/org/apache/openwhisk/core/containerpool/test/ContainerPoolTests.scala b/tests/src/test/scala/org/apache/openwhisk/core/containerpool/test/ContainerPoolTests.scala index 63930fef799..3fd04143c06 100644 --- a/tests/src/test/scala/org/apache/openwhisk/core/containerpool/test/ContainerPoolTests.scala +++ b/tests/src/test/scala/org/apache/openwhisk/core/containerpool/test/ContainerPoolTests.scala @@ -329,9 +329,8 @@ class ContainerPoolTests val feed = TestProbe() val pool = - system.actorOf( - ContainerPool - .props(factory, poolConfig(MemoryLimit.STD_MEMORY), feed.ref, List(PrewarmingConfig(1, exec, memoryLimit)))) + system.actorOf(ContainerPool + .props(factory, poolConfig(MemoryLimit.STD_MEMORY * 2), feed.ref, List(PrewarmingConfig(1, exec, memoryLimit)))) containers(0).expectMsg(Start(exec, memoryLimit)) containers(0).send(pool, NeedWork(preWarmedData(exec.kind))) pool ! runMessage @@ -365,7 +364,7 @@ class ContainerPoolTests ContainerPool .props( factory, - poolConfig(MemoryLimit.STD_MEMORY), + poolConfig(MemoryLimit.STD_MEMORY * 2), feed.ref, List(PrewarmingConfig(1, alternativeExec, memoryLimit)))) containers(0).expectMsg(Start(alternativeExec, memoryLimit)) // container0 was prewarmed @@ -385,7 +384,7 @@ class ContainerPoolTests ContainerPool .props( factory, - poolConfig(MemoryLimit.STD_MEMORY), + poolConfig(MemoryLimit.STD_MEMORY * 2), feed.ref, List(PrewarmingConfig(1, exec, alternativeLimit)))) containers(0).expectMsg(Start(exec, alternativeLimit)) // container0 was prewarmed