You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by ma...@apache.org on 2019/04/02 11:34:00 UTC
[incubator-openwhisk] branch master updated: Turn method 'remove'
into tail recursive. (#4421)
This is an automated email from the ASF dual-hosted git repository.
markusthoemmes 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 6453def Turn method 'remove' into tail recursive. (#4421)
6453def is described below
commit 6453def3a8fe71a0cfdeade056ecedad4bad93b5
Author: Lin <ys...@gmail.com>
AuthorDate: Tue Apr 2 19:33:53 2019 +0800
Turn method 'remove' into tail recursive. (#4421)
---
.../apache/openwhisk/core/containerpool/ContainerPool.scala | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
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 390eea8..77b1903 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
@@ -22,6 +22,8 @@ import org.apache.openwhisk.common.{AkkaLogging, LoggingMarkers, TransactionId}
import org.apache.openwhisk.core.connector.MessageFeed
import org.apache.openwhisk.core.entity._
import org.apache.openwhisk.core.entity.size._
+
+import scala.annotation.tailrec
import scala.collection.immutable
import scala.concurrent.duration._
import scala.util.Try
@@ -375,7 +377,10 @@ object ContainerPool {
* @param memory the amount of memory that has to be freed up
* @return a list of containers to be removed iff found
*/
- protected[containerpool] def remove[A](pool: Map[A, ContainerData], memory: ByteSize): List[A] = {
+ @tailrec
+ protected[containerpool] def remove[A](pool: Map[A, ContainerData],
+ memory: ByteSize,
+ toRemove: List[A] = List.empty): List[A] = {
// Try to find a Free container that does NOT have any active activations AND is initialized with any OTHER action
val freeContainers = pool.collect {
// Only warm containers will be removed. Prewarmed containers will stay always.
@@ -391,13 +396,13 @@ object ContainerPool {
val (ref, data) = freeContainers.minBy(_._2.lastUsed)
// Catch exception if remaining memory will be negative
val remainingMemory = Try(memory - data.memoryLimit).getOrElse(0.B)
- List(ref) ++ remove(freeContainers - ref, remainingMemory)
+ remove(freeContainers - ref, remainingMemory, toRemove ++ List(ref))
} else {
// If this is the first call: All containers are in use currently, or there is more memory needed than
// containers can be removed.
// Or, if this is one of the recursions: Enough containers are found to get the memory, that is
// necessary. -> Abort recursion
- List.empty
+ toRemove
}
}