take prewarmed container's memory as used memory (#4911)
* take prewarmed container's memory as used memory
* Don't filter prewarmpool for other kinds
* Fix test case error
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 4327ad1..92f058b 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 @@
//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 @@
// 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 @@
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 63930fe..3fd0414 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 @@
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 @@
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 @@
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