Merge pull request #28989 from chbatey/issue-38972

This commit is contained in:
Renato Cavalcanti 2020-05-06 13:53:54 +02:00 committed by GitHub
commit f04559de66
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -37,6 +37,7 @@ import akka.remote.testkit.MultiNodeConfig
import akka.remote.testkit.MultiNodeSpec import akka.remote.testkit.MultiNodeSpec
import akka.remote.testkit.PerfFlamesSupport import akka.remote.testkit.PerfFlamesSupport
import akka.serialization.jackson.CborSerializable import akka.serialization.jackson.CborSerializable
import akka.actor.typed.scaladsl.LoggerOps
object DeliveryThroughputSpec extends MultiNodeConfig { object DeliveryThroughputSpec extends MultiNodeConfig {
val first = role("first") val first = role("first")
@ -232,6 +233,7 @@ object DeliveryThroughputSpec extends MultiNodeConfig {
case object Run extends Command case object Run extends Command
private case class WrappedRequestNext(r: ShardingProducerController.RequestNext[Consumer.Command]) extends Command private case class WrappedRequestNext(r: ShardingProducerController.RequestNext[Consumer.Command]) extends Command
private case object PrintStatus extends Command
def apply( def apply(
producerController: ActorRef[ShardingProducerController.Command[Consumer.Command]], producerController: ActorRef[ShardingProducerController.Command[Consumer.Command]],
@ -240,35 +242,54 @@ object DeliveryThroughputSpec extends MultiNodeConfig {
resultReporter: BenchmarkFileReporter): Behavior[Command] = { resultReporter: BenchmarkFileReporter): Behavior[Command] = {
val numberOfMessages = testSettings.totalMessages val numberOfMessages = testSettings.totalMessages
Behaviors.setup { context => Behaviors.withTimers { timers =>
val requestNextAdapter = Behaviors.setup { context =>
context.messageAdapter[ShardingProducerController.RequestNext[Consumer.Command]](WrappedRequestNext(_)) timers.startTimerWithFixedDelay(PrintStatus, 1.second)
var startTime = System.nanoTime() val requestNextAdapter =
var remaining = numberOfMessages + context.system.settings.config context.messageAdapter[ShardingProducerController.RequestNext[Consumer.Command]](WrappedRequestNext(_))
.getInt("akka.reliable-delivery.sharding.consumer-controller.flow-control-window") var startTime = System.nanoTime()
var remaining = numberOfMessages + context.system.settings.config
.getInt("akka.reliable-delivery.sharding.consumer-controller.flow-control-window")
var latestDemand: ShardingProducerController.RequestNext[Consumer.Command] = null
var messagesSentToEachEntity: Map[String, Long] = Map.empty[String, Long].withDefaultValue(0L)
Behaviors.receiveMessage { Behaviors.receiveMessage {
case WrappedRequestNext(next) => case WrappedRequestNext(next) =>
remaining -= 1 latestDemand = next
if (remaining == 0) { remaining -= 1
context.log.info("Completed {} messages", numberOfMessages) if (remaining == 0) {
Producer.reportEnd(startTime, testSettings, plotRef, resultReporter) context.log.info("Completed {} messages", numberOfMessages)
Behaviors.stopped Producer.reportEnd(startTime, testSettings, plotRef, resultReporter)
} else { Behaviors.stopped
val entityId = (remaining % testSettings.numberOfConsumers).toString } else {
if (next.entitiesWithDemand(entityId) || !next.bufferedForEntitiesWithoutDemand.contains(entityId)) val entityId = (remaining % testSettings.numberOfConsumers).toString
next.sendNextTo ! ShardingEnvelope(entityId, Consumer.TheMessage) if (next.entitiesWithDemand(entityId) || !next.bufferedForEntitiesWithoutDemand.contains(entityId)) {
messagesSentToEachEntity =
messagesSentToEachEntity.updated(entityId, messagesSentToEachEntity(entityId) + 1L)
next.sendNextTo ! ShardingEnvelope(entityId, Consumer.TheMessage)
}
Behaviors.same
}
case Run =>
context.log.info("Starting {} messages", numberOfMessages)
startTime = System.nanoTime()
producerController ! ShardingProducerController.Start(requestNextAdapter)
Behaviors.same Behaviors.same
}
case Run => case PrintStatus =>
context.log.info("Starting {} messages", numberOfMessages) context.log.infoN(
startTime = System.nanoTime() "Remaining {}. Latest demand {}. Messages sent {}. Expecting demand from {}",
producerController ! ShardingProducerController.Start(requestNextAdapter) remaining,
Behaviors.same latestDemand,
messagesSentToEachEntity,
(remaining % testSettings.numberOfConsumers))
Behaviors.same
}
} }
} }
} }
} }
final case class TestSettings(testName: String, totalMessages: Long, numberOfConsumers: Int) final case class TestSettings(testName: String, totalMessages: Long, numberOfConsumers: Int)