Introduce new default entity passivation strategy (#30968)

This commit is contained in:
Peter Vlugter 2021-12-10 01:04:27 +13:00 committed by GitHub
parent 35c128b7d8
commit 3a7201183d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 673 additions and 688 deletions

View file

@ -14,8 +14,11 @@ object LeastRecentlyUsedSpec {
val config: Config = ConfigFactory.parseString("""
akka.cluster.sharding {
passivation {
strategy = least-recently-used
least-recently-used.limit = 10
strategy = lru
lru {
active-entity-limit = 10
replacement.policy = least-recently-used
}
}
}
""").withFallback(EntityPassivationSpec.config)
@ -23,12 +26,17 @@ object LeastRecentlyUsedSpec {
val segmentedConfig: Config = ConfigFactory.parseString("""
akka.cluster.sharding {
passivation {
strategy = least-recently-used
least-recently-used {
limit = 10
segmented {
levels = 2
proportions = [0.2, 0.8]
strategy = slru
slru {
active-entity-limit = 10
replacement {
policy = least-recently-used
least-recently-used {
segmented {
levels = 2
proportions = [0.2, 0.8]
}
}
}
}
}
@ -38,10 +46,11 @@ object LeastRecentlyUsedSpec {
val idleConfig: Config = ConfigFactory.parseString("""
akka.cluster.sharding {
passivation {
strategy = least-recently-used
least-recently-used {
limit = 3
idle.timeout = 1s
strategy = lru-idle
lru-idle {
active-entity-limit = 3
replacement.policy = least-recently-used
idle-entity.timeout = 1s
}
}
}
@ -238,19 +247,17 @@ class LeastRecentlyUsedWithIdleSpec
"passivate entities when they haven't seen messages for the configured timeout" in {
val region = start()
val idleTimeout = settings.passivationStrategySettings.leastRecentlyUsedSettings.idleSettings.get.timeout
val lastSendNanoTime1 = System.nanoTime()
region ! Envelope(shard = 1, id = 1, message = "A")
region ! Envelope(shard = 1, id = 2, message = "B")
// keep entity 3 active to prevent idle passivation
region ! Envelope(shard = 1, id = 3, message = "C")
Thread.sleep((idleTimeout / 2).toMillis)
Thread.sleep((configuredIdleTimeout / 2).toMillis)
region ! Envelope(shard = 1, id = 3, message = "D")
Thread.sleep((idleTimeout / 2).toMillis)
Thread.sleep((configuredIdleTimeout / 2).toMillis)
region ! Envelope(shard = 1, id = 3, message = "E")
Thread.sleep((idleTimeout / 2).toMillis)
Thread.sleep((configuredIdleTimeout / 2).toMillis)
val lastSendNanoTime2 = System.nanoTime()
region ! Envelope(shard = 1, id = 3, message = "F")
@ -262,13 +269,13 @@ class LeastRecentlyUsedWithIdleSpec
expectReceived(id = 3, message = "F")
val passivate1 = expectReceived(id = 1, message = Stop)
val passivate2 = expectReceived(id = 2, message = Stop)
val passivate3 = expectReceived(id = 3, message = Stop, within = idleTimeout * 2)
val passivate3 = expectReceived(id = 3, message = Stop, within = configuredIdleTimeout * 2)
// note: touched timestamps are when the shard receives the message, not the entity itself
// so look at the time from before sending the last message until receiving the passivate message
(passivate1.nanoTime - lastSendNanoTime1).nanos should be > idleTimeout
(passivate2.nanoTime - lastSendNanoTime1).nanos should be > idleTimeout
(passivate3.nanoTime - lastSendNanoTime2).nanos should be > idleTimeout
(passivate1.nanoTime - lastSendNanoTime1).nanos should be > configuredIdleTimeout
(passivate2.nanoTime - lastSendNanoTime1).nanos should be > configuredIdleTimeout
(passivate3.nanoTime - lastSendNanoTime2).nanos should be > configuredIdleTimeout
}
}
}