@@ -19,7 +19,7 @@ package org.apache.openwhisk.core.containerpool
19
19
20
20
import akka .actor .{Actor , ActorRef , ActorRefFactory , Props }
21
21
import org .apache .openwhisk .common .{Logging , LoggingMarkers , MetricEmitter , TransactionId }
22
- import org .apache .openwhisk .core .connector .MessageFeed
22
+ import org .apache .openwhisk .core .connector .{ MessageFeed , UserMemoryMessage }
23
23
import org .apache .openwhisk .core .entity .ExecManifest .ReactivePrewarmingConfig
24
24
import org .apache .openwhisk .core .entity ._
25
25
import org .apache .openwhisk .core .entity .size ._
@@ -31,6 +31,8 @@ import scala.util.{Random, Try}
31
31
32
32
case class ColdStartKey (kind : String , memory : ByteSize )
33
33
34
+ object UserMemoryQuery
35
+
34
36
case object EmitMetrics
35
37
36
38
case object AdjustPrewarmedContainer
@@ -68,6 +70,7 @@ class ContainerPool(childFactory: ActorRefFactory => ActorRef,
68
70
var busyPool = immutable.Map .empty[ActorRef , ContainerData ]
69
71
var prewarmedPool = immutable.Map .empty[ActorRef , PreWarmedData ]
70
72
var prewarmStartingPool = immutable.Map .empty[ActorRef , (String , ByteSize )]
73
+ var latestUserMemory = poolConfig.userMemory
71
74
// If all memory slots are occupied and if there is currently no container to be removed, than the actions will be
72
75
// buffered here to keep order of computation.
73
76
// Otherwise actions with small memory-limits could block actions with large memory limits.
@@ -209,7 +212,7 @@ class ContainerPool(childFactory: ActorRefFactory => ActorRef,
209
212
s " Rescheduling Run message, too many message in the pool, " +
210
213
s " freePoolSize: ${freePool.size} containers and ${memoryConsumptionOf(freePool)} MB, " +
211
214
s " busyPoolSize: ${busyPool.size} containers and ${memoryConsumptionOf(busyPool)} MB, " +
212
- s " maxContainersMemory ${poolConfig.userMemory .toMB} MB, " +
215
+ s " maxContainersMemory ${latestUserMemory .toMB} MB, " +
213
216
s " userNamespace: ${r.msg.user.namespace.name}, action: ${r.action}, " +
214
217
s " needed memory: ${r.action.limits.memory.megabytes} MB, " +
215
218
s " waiting messages: ${runBuffer.size}" )(r.msg.transid)
@@ -297,6 +300,13 @@ class ContainerPool(childFactory: ActorRefFactory => ActorRef,
297
300
case RescheduleJob =>
298
301
freePool = freePool - sender()
299
302
busyPool = busyPool - sender()
303
+ case userMemoryMessage : UserMemoryMessage =>
304
+ logging.info(
305
+ this ,
306
+ s " user memory is reconfigured from ${latestUserMemory.toString} to ${userMemoryMessage.userMemory.toString}" )
307
+ latestUserMemory = userMemoryMessage.userMemory
308
+ case UserMemoryQuery =>
309
+ sender() ! latestUserMemory.toString
300
310
case EmitMetrics =>
301
311
emitMetrics()
302
312
@@ -444,7 +454,7 @@ class ContainerPool(childFactory: ActorRefFactory => ActorRef,
444
454
def hasPoolSpaceFor [A ](pool : Map [A , ContainerData ],
445
455
prewarmStartingPool : Map [A , (String , ByteSize )],
446
456
memory : ByteSize ): Boolean = {
447
- memoryConsumptionOf(pool) + prewarmStartingPool.map(_._2._2.toMB).sum + memory.toMB <= poolConfig.userMemory .toMB
457
+ memoryConsumptionOf(pool) + prewarmStartingPool.map(_._2._2.toMB).sum + memory.toMB <= latestUserMemory .toMB
448
458
}
449
459
450
460
/**
0 commit comments