From 1d16e847b524a6279c5618cf945c9fa36ef16a28 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Thu, 12 Mar 2020 15:37:16 +0100 Subject: [PATCH] Reliable delivery in Typed, #20984 Different approach than in classic AtLeastOnceDelivery because I would like: * support flow control, with a work pulling approach * be possible to use with or without persistence (without it may loose messages if producer node crashes) * detect lost messages on the consumer side and let that drive resends, instead of aggressively resending from producer side * deliver messages in order and deduplicate resent messages * have an efficient protocol for acknowledgments over the network (not ack each message), but still have a simple one-by-one protocol for the end user * support 3 use cases (building blocks) * point-to-point * work pulling * sharding * optional durable queue, with one event sourced implementation * protobuf serialization * ApiMayChange * reference docs and examples * api docs * doc example code missing so far --- .../delivery/ConsumerControllerSpec.scala | 575 ++ .../DurableProducerControllerSpec.scala | 160 + .../delivery/DurableWorkPullingSpec.scala | 395 + .../delivery/ProducerControllerSpec.scala | 333 + .../delivery/ReliableDeliveryRandomSpec.scala | 200 + .../typed/delivery/ReliableDeliverySpec.scala | 190 + .../actor/typed/delivery/TestConsumer.scala | 116 + .../delivery/TestDurableProducerQueue.scala | 112 + .../actor/typed/delivery/TestProducer.scala | 79 + .../typed/delivery/TestProducerWithAsk.scala | 88 + .../delivery/TestProducerWorkPulling.scala | 57 + .../typed/delivery/WorkPullingSpec.scala | 278 + .../src/main/resources/reference.conf | 44 + .../typed/delivery/ConsumerController.scala | 280 + .../typed/delivery/DurableProducerQueue.scala | 103 + .../typed/delivery/ProducerController.scala | 263 + .../WorkPullingProducerController.scala | 240 + .../internal/ConsumerControllerImpl.scala | 586 ++ .../internal/DeliverySerializable.scala | 12 + .../internal/ProducerControllerImpl.scala | 628 ++ .../WorkPullingProducerControllerImpl.scala | 674 ++ .../src/main/resources/reference.conf | 29 + .../delivery/ShardingConsumerController.scala | 139 + .../delivery/ShardingProducerController.scala | 286 + .../ShardingConsumerControllerImpl.scala | 131 + .../ShardingProducerControllerImpl.scala | 598 ++ .../delivery/PointToPointDocExample.java | 170 + .../jdocs/delivery/ShardingDocExample.java | 445 + .../jdocs/delivery/WorkPullingDocExample.java | 364 + .../src/test/resources/logback-test.xml | 2 +- .../typed/delivery/DurableShardingSpec.scala | 230 + .../ReliableDeliveryShardingSpec.scala | 518 ++ .../delivery/PointToPointDocExample.scala | 108 + .../docs/delivery/ShardingDocExample.scala | 217 + .../docs/delivery/WorkPullingDocExample.scala | 233 + .../internal/protobuf/ReliableDelivery.java | 8034 +++++++++++++++++ .../src/main/protobuf/ReliableDelivery.proto | 74 + .../src/main/resources/reference.conf | 3 + .../delivery/ReliableDeliverySerializer.scala | 241 + .../ReliableDeliverySerializerSpec.scala | 72 + .../src/main/paradox/common/may-change.md | 1 + .../general/message-delivery-reliability.md | 3 +- .../src/main/paradox/includes/cluster.md | 7 + .../typed/cluster-sharding-concepts.md | 7 +- akka-docs/src/main/paradox/typed/cluster.md | 3 + .../paradox/typed/images/delivery-p2p-1.png | Bin 0 -> 82158 bytes .../typed/images/delivery-sharding-1.png | Bin 0 -> 127161 bytes .../typed/images/delivery-sharding-2.png | Bin 0 -> 159012 bytes .../typed/images/delivery-sharding-3.png | Bin 0 -> 187259 bytes .../typed/images/delivery-work-pulling-1.png | Bin 0 -> 135769 bytes .../typed/images/delivery-work-pulling-2.png | Bin 0 -> 171136 bytes .../src/main/paradox/typed/index-cluster.md | 1 + .../main/paradox/typed/reliable-delivery.md | 413 + .../src/main/resources/reference.conf | 29 + .../delivery/EventSourcedProducerQueue.scala | 290 + .../src/test/resources/logback-test.xml | 3 - .../ClusterSingletonPersistenceSpec.scala | 13 +- .../EventSourcedProducerQueueSpec.scala | 284 + ...eryWithEventSourcedProducerQueueSpec.scala | 169 + ...ingWithEventSourcedProducerQueueSpec.scala | 263 + build.sbt | 8 +- 61 files changed, 18783 insertions(+), 18 deletions(-) create mode 100644 akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/ConsumerControllerSpec.scala create mode 100644 akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/DurableProducerControllerSpec.scala create mode 100644 akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/DurableWorkPullingSpec.scala create mode 100644 akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/ProducerControllerSpec.scala create mode 100644 akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/ReliableDeliveryRandomSpec.scala create mode 100644 akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/ReliableDeliverySpec.scala create mode 100644 akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/TestConsumer.scala create mode 100644 akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/TestDurableProducerQueue.scala create mode 100644 akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/TestProducer.scala create mode 100644 akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/TestProducerWithAsk.scala create mode 100644 akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/TestProducerWorkPulling.scala create mode 100644 akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/WorkPullingSpec.scala create mode 100644 akka-actor-typed/src/main/scala/akka/actor/typed/delivery/ConsumerController.scala create mode 100644 akka-actor-typed/src/main/scala/akka/actor/typed/delivery/DurableProducerQueue.scala create mode 100644 akka-actor-typed/src/main/scala/akka/actor/typed/delivery/ProducerController.scala create mode 100644 akka-actor-typed/src/main/scala/akka/actor/typed/delivery/WorkPullingProducerController.scala create mode 100644 akka-actor-typed/src/main/scala/akka/actor/typed/delivery/internal/ConsumerControllerImpl.scala create mode 100644 akka-actor-typed/src/main/scala/akka/actor/typed/delivery/internal/DeliverySerializable.scala create mode 100644 akka-actor-typed/src/main/scala/akka/actor/typed/delivery/internal/ProducerControllerImpl.scala create mode 100644 akka-actor-typed/src/main/scala/akka/actor/typed/delivery/internal/WorkPullingProducerControllerImpl.scala create mode 100644 akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/delivery/ShardingConsumerController.scala create mode 100644 akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/delivery/ShardingProducerController.scala create mode 100644 akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/delivery/internal/ShardingConsumerControllerImpl.scala create mode 100644 akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/delivery/internal/ShardingProducerControllerImpl.scala create mode 100644 akka-cluster-sharding-typed/src/test/java/jdocs/delivery/PointToPointDocExample.java create mode 100644 akka-cluster-sharding-typed/src/test/java/jdocs/delivery/ShardingDocExample.java create mode 100644 akka-cluster-sharding-typed/src/test/java/jdocs/delivery/WorkPullingDocExample.java create mode 100644 akka-cluster-sharding-typed/src/test/scala/akka/cluster/sharding/typed/delivery/DurableShardingSpec.scala create mode 100644 akka-cluster-sharding-typed/src/test/scala/akka/cluster/sharding/typed/delivery/ReliableDeliveryShardingSpec.scala create mode 100644 akka-cluster-sharding-typed/src/test/scala/docs/delivery/PointToPointDocExample.scala create mode 100644 akka-cluster-sharding-typed/src/test/scala/docs/delivery/ShardingDocExample.scala create mode 100644 akka-cluster-sharding-typed/src/test/scala/docs/delivery/WorkPullingDocExample.scala create mode 100644 akka-cluster-typed/src/main/java/akka/cluster/typed/internal/protobuf/ReliableDelivery.java create mode 100644 akka-cluster-typed/src/main/protobuf/ReliableDelivery.proto create mode 100644 akka-cluster-typed/src/main/scala/akka/cluster/typed/internal/delivery/ReliableDeliverySerializer.scala create mode 100644 akka-cluster-typed/src/test/scala/akka/cluster/typed/internal/delivery/ReliableDeliverySerializerSpec.scala create mode 100644 akka-docs/src/main/paradox/typed/images/delivery-p2p-1.png create mode 100644 akka-docs/src/main/paradox/typed/images/delivery-sharding-1.png create mode 100644 akka-docs/src/main/paradox/typed/images/delivery-sharding-2.png create mode 100644 akka-docs/src/main/paradox/typed/images/delivery-sharding-3.png create mode 100644 akka-docs/src/main/paradox/typed/images/delivery-work-pulling-1.png create mode 100644 akka-docs/src/main/paradox/typed/images/delivery-work-pulling-2.png create mode 100644 akka-docs/src/main/paradox/typed/reliable-delivery.md create mode 100644 akka-persistence-typed/src/main/scala/akka/persistence/typed/delivery/EventSourcedProducerQueue.scala rename {akka-cluster-typed/src/test/scala/akka/cluster => akka-persistence-typed/src/test/scala/akka/persistence}/typed/ClusterSingletonPersistenceSpec.scala (89%) create mode 100644 akka-persistence-typed/src/test/scala/akka/persistence/typed/delivery/EventSourcedProducerQueueSpec.scala create mode 100644 akka-persistence-typed/src/test/scala/akka/persistence/typed/delivery/ReliableDeliveryWithEventSourcedProducerQueueSpec.scala create mode 100644 akka-persistence-typed/src/test/scala/akka/persistence/typed/delivery/WorkPullingWithEventSourcedProducerQueueSpec.scala diff --git a/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/ConsumerControllerSpec.scala b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/ConsumerControllerSpec.scala new file mode 100644 index 00000000000..65cc7696ed9 --- /dev/null +++ b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/ConsumerControllerSpec.scala @@ -0,0 +1,575 @@ +/* + * Copyright (C) 2019-2020 Lightbend Inc. + */ + +package akka.actor.typed.delivery + +import akka.actor.testkit.typed.scaladsl.LogCapturing +import akka.actor.testkit.typed.scaladsl.ScalaTestWithActorTestKit +import akka.actor.typed.delivery.ConsumerController.DeliverThenStop +import akka.actor.typed.delivery.internal.ConsumerControllerImpl +import akka.actor.typed.delivery.internal.ProducerControllerImpl +import org.scalatest.wordspec.AnyWordSpecLike + +class ConsumerControllerSpec + extends ScalaTestWithActorTestKit(""" + akka.reliable-delivery.consumer-controller.flow-control-window = 20 + """) + with AnyWordSpecLike + with LogCapturing { + import TestConsumer.sequencedMessage + + private var idCount = 0 + private def nextId(): Int = { + idCount += 1 + idCount + } + + private def producerId: String = s"p-$idCount" + + private val settings = ConsumerController.Settings(system) + import settings.flowControlWindow + + "ConsumerController" must { + "resend RegisterConsumer" in { + nextId() + val consumerController = + spawn(ConsumerController[TestConsumer.Job](), s"consumerController-${idCount}") + val producerControllerProbe = createTestProbe[ProducerControllerImpl.InternalCommand]() + + consumerController ! ConsumerController.RegisterToProducerController(producerControllerProbe.ref) + producerControllerProbe.expectMessage(ProducerController.RegisterConsumer(consumerController)) + // expected resend + producerControllerProbe.expectMessage(ProducerController.RegisterConsumer(consumerController)) + + testKit.stop(consumerController) + } + + "resend RegisterConsumer when changed to different ProducerController" in { + nextId() + val consumerProbe = createTestProbe[ConsumerController.Delivery[TestConsumer.Job]]() + val consumerController = + spawn(ConsumerController[TestConsumer.Job](), s"consumerController-${idCount}") + val producerControllerProbe1 = createTestProbe[ProducerControllerImpl.InternalCommand]() + + consumerController ! ConsumerController.Start(consumerProbe.ref) + consumerController ! ConsumerController.RegisterToProducerController(producerControllerProbe1.ref) + producerControllerProbe1.expectMessage(ProducerController.RegisterConsumer(consumerController)) + consumerController ! sequencedMessage(producerId, 1, producerControllerProbe1.ref) + + // change producer + val producerControllerProbe2 = createTestProbe[ProducerControllerImpl.InternalCommand]() + consumerController ! ConsumerController.RegisterToProducerController(producerControllerProbe2.ref) + producerControllerProbe2.expectMessage(ProducerController.RegisterConsumer(consumerController)) + // expected resend + producerControllerProbe2.expectMessage(ProducerController.RegisterConsumer(consumerController)) + + testKit.stop(consumerController) + } + + "resend initial Request" in { + nextId() + val consumerController = + spawn(ConsumerController[TestConsumer.Job](), s"consumerController-${idCount}") + .unsafeUpcast[ConsumerControllerImpl.InternalCommand] + val producerControllerProbe = createTestProbe[ProducerControllerImpl.InternalCommand]() + + consumerController ! sequencedMessage(producerId, 1, producerControllerProbe.ref) + + val consumerProbe = createTestProbe[ConsumerController.Delivery[TestConsumer.Job]]() + consumerController ! ConsumerController.Start(consumerProbe.ref) + + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]] + + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(0, 20, true, false)) + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(0, 20, true, true)) + + consumerController ! ConsumerController.Confirmed + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(1, 20, true, false)) + + testKit.stop(consumerController) + } + + "send Request after half window size" in { + nextId() + val windowSize = 20 + val consumerController = + spawn(ConsumerController[TestConsumer.Job](), s"consumerController-${idCount}") + .unsafeUpcast[ConsumerControllerImpl.InternalCommand] + val producerControllerProbe = createTestProbe[ProducerControllerImpl.InternalCommand]() + + val consumerProbe = createTestProbe[ConsumerController.Delivery[TestConsumer.Job]]() + consumerController ! ConsumerController.Start(consumerProbe.ref) + + (1 until windowSize / 2).foreach { n => + consumerController ! sequencedMessage(producerId, n, producerControllerProbe.ref) + } + + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(0, windowSize, true, false)) + (1 until windowSize / 2).foreach { n => + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]] + consumerController ! ConsumerController.Confirmed + if (n == 1) + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(1, windowSize, true, false)) + } + + producerControllerProbe.expectNoMessage() + + consumerController ! sequencedMessage(producerId, windowSize / 2, producerControllerProbe.ref) + + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]] + producerControllerProbe.expectNoMessage() + consumerController ! ConsumerController.Confirmed + producerControllerProbe.expectMessage( + ProducerControllerImpl.Request(windowSize / 2, windowSize + windowSize / 2, true, false)) + + testKit.stop(consumerController) + } + + "detect lost message" in { + nextId() + val consumerController = + spawn(ConsumerController[TestConsumer.Job](), s"consumerController-${idCount}") + .unsafeUpcast[ConsumerControllerImpl.InternalCommand] + val producerControllerProbe = createTestProbe[ProducerControllerImpl.InternalCommand]() + + val consumerProbe = createTestProbe[ConsumerController.Delivery[TestConsumer.Job]]() + consumerController ! ConsumerController.Start(consumerProbe.ref) + + consumerController ! sequencedMessage(producerId, 1, producerControllerProbe.ref) + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]] + consumerController ! ConsumerController.Confirmed + + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(0, 20, true, false)) + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(1, 20, true, false)) + + consumerController ! sequencedMessage(producerId, 2, producerControllerProbe.ref) + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]] + consumerController ! ConsumerController.Confirmed + + consumerController ! sequencedMessage(producerId, 5, producerControllerProbe.ref) + producerControllerProbe.expectMessage(ProducerControllerImpl.Resend(3)) + + consumerController ! sequencedMessage(producerId, 3, producerControllerProbe.ref) + consumerController ! sequencedMessage(producerId, 4, producerControllerProbe.ref) + consumerController ! sequencedMessage(producerId, 5, producerControllerProbe.ref) + + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(3) + consumerController ! ConsumerController.Confirmed + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(4) + consumerController ! ConsumerController.Confirmed + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(5) + consumerController ! ConsumerController.Confirmed + + testKit.stop(consumerController) + } + + "resend Request" in { + nextId() + val consumerController = + spawn(ConsumerController[TestConsumer.Job](), s"consumerController-${idCount}") + .unsafeUpcast[ConsumerControllerImpl.InternalCommand] + val producerControllerProbe = createTestProbe[ProducerControllerImpl.InternalCommand]() + + val consumerProbe = createTestProbe[ConsumerController.Delivery[TestConsumer.Job]]() + consumerController ! ConsumerController.Start(consumerProbe.ref) + + consumerController ! sequencedMessage(producerId, 1, producerControllerProbe.ref) + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]] + consumerController ! ConsumerController.Confirmed + + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(0, 20, true, false)) + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(1, 20, true, false)) + + consumerController ! sequencedMessage(producerId, 2, producerControllerProbe.ref) + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]] + consumerController ! ConsumerController.Confirmed + + consumerController ! sequencedMessage(producerId, 3, producerControllerProbe.ref) + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(3) + + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(2, 20, true, true)) + + consumerController ! ConsumerController.Confirmed + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(3, 20, true, true)) + + testKit.stop(consumerController) + } + + "stash while waiting for consumer confirmation" in { + nextId() + val consumerController = + spawn(ConsumerController[TestConsumer.Job](), s"consumerController-${idCount}") + .unsafeUpcast[ConsumerControllerImpl.InternalCommand] + val producerControllerProbe = createTestProbe[ProducerControllerImpl.InternalCommand]() + + val consumerProbe = createTestProbe[ConsumerController.Delivery[TestConsumer.Job]]() + consumerController ! ConsumerController.Start(consumerProbe.ref) + + consumerController ! sequencedMessage(producerId, 1, producerControllerProbe.ref) + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]] + consumerController ! ConsumerController.Confirmed + + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(0, 20, true, false)) + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(1, 20, true, false)) + + consumerController ! sequencedMessage(producerId, 2, producerControllerProbe.ref) + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]] + consumerController ! sequencedMessage(producerId, 3, producerControllerProbe.ref) + consumerController ! sequencedMessage(producerId, 4, producerControllerProbe.ref) + consumerProbe.expectNoMessage() + + consumerController ! ConsumerController.Confirmed + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(3) + consumerController ! ConsumerController.Confirmed + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(4) + consumerController ! ConsumerController.Confirmed + + consumerController ! sequencedMessage(producerId, 5, producerControllerProbe.ref) + consumerController ! sequencedMessage(producerId, 6, producerControllerProbe.ref) + consumerController ! sequencedMessage(producerId, 7, producerControllerProbe.ref) + + // ProducerController may resend unconfirmed + consumerController ! sequencedMessage(producerId, 5, producerControllerProbe.ref) + consumerController ! sequencedMessage(producerId, 6, producerControllerProbe.ref) + consumerController ! sequencedMessage(producerId, 7, producerControllerProbe.ref) + consumerController ! sequencedMessage(producerId, 8, producerControllerProbe.ref) + + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(5) + consumerController ! ConsumerController.Confirmed + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(6) + consumerController ! ConsumerController.Confirmed + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(7) + consumerController ! ConsumerController.Confirmed + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(8) + consumerController ! ConsumerController.Confirmed + + consumerProbe.expectNoMessage() + + testKit.stop(consumerController) + } + + "optionally ack messages" in { + nextId() + val consumerController = + spawn(ConsumerController[TestConsumer.Job](), s"consumerController-${idCount}") + .unsafeUpcast[ConsumerControllerImpl.InternalCommand] + val producerControllerProbe = createTestProbe[ProducerControllerImpl.InternalCommand]() + + val consumerProbe = createTestProbe[ConsumerController.Delivery[TestConsumer.Job]]() + consumerController ! ConsumerController.Start(consumerProbe.ref) + + consumerController ! sequencedMessage(producerId, 1, producerControllerProbe.ref, ack = true) + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]] + consumerController ! ConsumerController.Confirmed + + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(0, 20, true, false)) + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(1, 20, true, false)) + + consumerController ! sequencedMessage(producerId, 2, producerControllerProbe.ref, ack = true) + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]] + consumerController ! ConsumerController.Confirmed + producerControllerProbe.expectMessage(ProducerControllerImpl.Ack(2)) + + consumerController ! sequencedMessage(producerId, 3, producerControllerProbe.ref, ack = true) + consumerController ! sequencedMessage(producerId, 4, producerControllerProbe.ref, ack = false) + consumerController ! sequencedMessage(producerId, 5, producerControllerProbe.ref, ack = true) + + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(3) + consumerController ! ConsumerController.Confirmed + producerControllerProbe.expectMessage(ProducerControllerImpl.Ack(3)) + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(4) + consumerController ! ConsumerController.Confirmed + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(5) + consumerController ! ConsumerController.Confirmed + producerControllerProbe.expectMessage(ProducerControllerImpl.Ack(5)) + + testKit.stop(consumerController) + } + + "allow restart of consumer" in { + nextId() + val consumerController = + spawn(ConsumerController[TestConsumer.Job](), s"consumerController-${idCount}") + .unsafeUpcast[ConsumerControllerImpl.InternalCommand] + val producerControllerProbe = createTestProbe[ProducerControllerImpl.InternalCommand]() + + val consumerProbe1 = createTestProbe[ConsumerController.Delivery[TestConsumer.Job]]() + consumerController ! ConsumerController.Start(consumerProbe1.ref) + + consumerController ! sequencedMessage(producerId, 1, producerControllerProbe.ref) + consumerProbe1.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]] + consumerController ! ConsumerController.Confirmed + + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(0, 20, true, false)) + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(1, 20, true, false)) + + consumerController ! sequencedMessage(producerId, 2, producerControllerProbe.ref) + consumerProbe1.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]] + consumerController ! ConsumerController.Confirmed + + consumerController ! sequencedMessage(producerId, 3, producerControllerProbe.ref) + consumerProbe1.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(3) + + // restart consumer, before Confirmed(3) + val consumerProbe2 = createTestProbe[ConsumerController.Delivery[TestConsumer.Job]]() + consumerController ! ConsumerController.Start(consumerProbe2.ref) + + consumerProbe2.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(3) + consumerController ! ConsumerController.Confirmed + + consumerController ! sequencedMessage(producerId, 4, producerControllerProbe.ref) + consumerProbe2.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(4) + consumerController ! ConsumerController.Confirmed + + testKit.stop(consumerController) + } + + "stop ConsumerController when consumer is stopped" in { + nextId() + val consumerController = + spawn(ConsumerController[TestConsumer.Job](), s"consumerController-${idCount}") + .unsafeUpcast[ConsumerControllerImpl.InternalCommand] + + val producerControllerProbe = createTestProbe[ProducerControllerImpl.InternalCommand]() + + val consumerProbe1 = createTestProbe[ConsumerController.Delivery[TestConsumer.Job]]() + consumerController ! ConsumerController.Start(consumerProbe1.ref) + + consumerController ! sequencedMessage(producerId, 1, producerControllerProbe.ref) + consumerProbe1.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]] + consumerController ! ConsumerController.Confirmed + + consumerProbe1.stop() + createTestProbe().expectTerminated(consumerController) + } + + "stop ConsumerController when consumer is stopped before first message" in { + nextId() + val consumerController = + spawn(ConsumerController[TestConsumer.Job](), s"consumerController-${idCount}") + .unsafeUpcast[ConsumerControllerImpl.InternalCommand] + + val consumerProbe1 = createTestProbe[ConsumerController.Delivery[TestConsumer.Job]]() + consumerController ! ConsumerController.Start(consumerProbe1.ref) + + consumerProbe1.stop() + createTestProbe().expectTerminated(consumerController) + } + + "deduplicate resend of first message" in { + nextId() + val consumerController = + spawn(ConsumerController[TestConsumer.Job](), s"consumerController-${idCount}") + .unsafeUpcast[ConsumerControllerImpl.InternalCommand] + val producerControllerProbe = createTestProbe[ProducerControllerImpl.InternalCommand]() + + val consumerProbe = createTestProbe[ConsumerController.Delivery[TestConsumer.Job]]() + consumerController ! ConsumerController.Start(consumerProbe.ref) + + consumerController ! sequencedMessage(producerId, 1, producerControllerProbe.ref) + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(0, 20, true, false)) + // that Request will typically cancel the resending of first, but in unlucky timing it may happen + consumerController ! sequencedMessage(producerId, 1, producerControllerProbe.ref) + consumerProbe.receiveMessage().confirmTo ! ConsumerController.Confirmed + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(1, 20, true, false)) + consumerController ! sequencedMessage(producerId, 1, producerControllerProbe.ref) + // deduplicated, not delivered again + consumerProbe.expectNoMessage() + + // but if the ProducerController is changed it will not be deduplicated + val producerControllerProbe2 = createTestProbe[ProducerControllerImpl.InternalCommand]() + consumerController ! sequencedMessage(producerId, 1, producerControllerProbe2.ref) + producerControllerProbe2.expectMessage(ProducerControllerImpl.Request(0, 20, true, false)) + consumerProbe.receiveMessage().confirmTo ! ConsumerController.Confirmed + producerControllerProbe2.expectMessage(ProducerControllerImpl.Request(1, 20, true, false)) + + testKit.stop(consumerController) + } + + "request window after first" in { + nextId() + val consumerController = + spawn(ConsumerController[TestConsumer.Job](), s"consumerController-${idCount}") + .unsafeUpcast[ConsumerControllerImpl.InternalCommand] + val producerControllerProbe = createTestProbe[ProducerControllerImpl.InternalCommand]() + + val consumerProbe = createTestProbe[ConsumerController.Delivery[TestConsumer.Job]]() + consumerController ! ConsumerController.Start(consumerProbe.ref) + + consumerController ! sequencedMessage(producerId, 1, producerControllerProbe.ref) + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(0, flowControlWindow, true, false)) + consumerProbe.receiveMessage().confirmTo ! ConsumerController.Confirmed + + // and if the ProducerController is changed + val producerControllerProbe2 = createTestProbe[ProducerControllerImpl.InternalCommand]() + consumerController ! sequencedMessage(producerId, 23, producerControllerProbe2.ref).asFirst + producerControllerProbe2.expectMessage(ProducerControllerImpl.Request(0, 23 + flowControlWindow - 1, true, false)) + consumerProbe.receiveMessage().confirmTo ! ConsumerController.Confirmed + + val producerControllerProbe3 = createTestProbe[ProducerControllerImpl.InternalCommand]() + consumerController ! sequencedMessage(producerId, 7, producerControllerProbe3.ref).asFirst + producerControllerProbe3.expectMessage(ProducerControllerImpl.Request(0, 7 + flowControlWindow - 1, true, false)) + consumerProbe.receiveMessage().confirmTo ! ConsumerController.Confirmed + + testKit.stop(consumerController) + } + + "handle first message when waiting for lost (resending)" in { + nextId() + val consumerController = + spawn(ConsumerController[TestConsumer.Job](), s"consumerController-${idCount}") + .unsafeUpcast[ConsumerControllerImpl.InternalCommand] + val producerControllerProbe = createTestProbe[ProducerControllerImpl.InternalCommand]() + + val consumerProbe = createTestProbe[ConsumerController.Delivery[TestConsumer.Job]]() + + // while waiting for Start the SequencedMessage will be stashed + consumerController ! sequencedMessage(producerId, 44, producerControllerProbe.ref) + consumerController ! sequencedMessage(producerId, 41, producerControllerProbe.ref).asFirst + consumerController ! sequencedMessage(producerId, 45, producerControllerProbe.ref) + + consumerController ! ConsumerController.Start(consumerProbe.ref) + // unstashed 44, 41, 45 + // 44 is not first so will trigger a full Resend + producerControllerProbe.expectMessage(ProducerControllerImpl.Resend(0)) + // and 41 is first, which will trigger the initial Request + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(0, 60, true, false)) + + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(41) + consumerController ! ConsumerController.Confirmed + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(41, 60, true, false)) + + // 45 not expected + producerControllerProbe.expectMessage(ProducerControllerImpl.Resend(42)) + + // from previous Resend request + consumerController ! sequencedMessage(producerId, 42, producerControllerProbe.ref) + consumerController ! sequencedMessage(producerId, 43, producerControllerProbe.ref) + consumerController ! sequencedMessage(producerId, 44, producerControllerProbe.ref) + consumerController ! sequencedMessage(producerId, 45, producerControllerProbe.ref) + + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(42) + consumerController ! ConsumerController.Confirmed + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(43) + consumerController ! ConsumerController.Confirmed + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(44) + consumerController ! ConsumerController.Confirmed + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(45) + consumerController ! ConsumerController.Confirmed + + consumerController ! sequencedMessage(producerId, 46, producerControllerProbe.ref) + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(46) + consumerController ! ConsumerController.Confirmed + + testKit.stop(consumerController) + } + + "send Ack when stopped" in { + nextId() + val consumerController = + spawn(ConsumerController[TestConsumer.Job](), s"consumerController-${idCount}") + .unsafeUpcast[ConsumerControllerImpl.InternalCommand] + + val producerControllerProbe = createTestProbe[ProducerControllerImpl.InternalCommand]() + + val consumerProbe1 = createTestProbe[ConsumerController.Delivery[TestConsumer.Job]]() + consumerController ! ConsumerController.Start(consumerProbe1.ref) + + consumerController ! sequencedMessage(producerId, 1, producerControllerProbe.ref) + consumerProbe1.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]] + producerControllerProbe.expectMessageType[ProducerControllerImpl.Request] + consumerController ! ConsumerController.Confirmed + producerControllerProbe.expectMessageType[ProducerControllerImpl.Request] + + consumerController ! sequencedMessage(producerId, 2, producerControllerProbe.ref) + consumerProbe1.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]] + consumerController ! ConsumerController.Confirmed + + testKit.stop(consumerController) + producerControllerProbe.expectMessage(ProducerControllerImpl.Ack(2L)) + } + + "support graceful stopping" in { + nextId() + val consumerController = + spawn(ConsumerController[TestConsumer.Job](), s"consumerController-${idCount}") + .unsafeUpcast[ConsumerControllerImpl.InternalCommand] + + val producerControllerProbe = createTestProbe[ProducerControllerImpl.InternalCommand]() + + val consumerProbe = createTestProbe[ConsumerController.Delivery[TestConsumer.Job]]() + consumerController ! ConsumerController.Start(consumerProbe.ref) + + consumerController ! sequencedMessage(producerId, 1, producerControllerProbe.ref) + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]] + producerControllerProbe.expectMessageType[ProducerControllerImpl.Request] + consumerController ! ConsumerController.Confirmed + producerControllerProbe.expectMessageType[ProducerControllerImpl.Request] + + consumerController ! sequencedMessage(producerId, 2, producerControllerProbe.ref) + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].message should ===( + TestConsumer.Job("msg-2")) + consumerController ! sequencedMessage(producerId, 3, producerControllerProbe.ref) + consumerController ! sequencedMessage(producerId, 4, producerControllerProbe.ref) + + consumerController ! DeliverThenStop() + + consumerController ! ConsumerController.Confirmed // 2 + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].message should ===( + TestConsumer.Job("msg-3")) + consumerController ! sequencedMessage(producerId, 5, producerControllerProbe.ref) + consumerController ! ConsumerController.Confirmed + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].message should ===( + TestConsumer.Job("msg-4")) + consumerController ! ConsumerController.Confirmed + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].message should ===( + TestConsumer.Job("msg-5")) + consumerController ! ConsumerController.Confirmed + + consumerProbe.expectTerminated(consumerController) + + testKit.stop(consumerController) + // one Ack from postStop, and another from Behaviors.stopped callback after final Confirmed + producerControllerProbe.expectMessage(ProducerControllerImpl.Ack(4L)) + producerControllerProbe.expectMessage(ProducerControllerImpl.Ack(5L)) + } + } + + "ConsumerController without resending" must { + "accept lost message" in { + nextId() + val consumerController = + spawn( + ConsumerController[TestConsumer.Job](ConsumerController.Settings(system).withOnlyFlowControl(true)), + s"consumerController-${idCount}").unsafeUpcast[ConsumerControllerImpl.InternalCommand] + val producerControllerProbe = createTestProbe[ProducerControllerImpl.InternalCommand]() + + val consumerProbe = createTestProbe[ConsumerController.Delivery[TestConsumer.Job]]() + consumerController ! ConsumerController.Start(consumerProbe.ref) + + consumerController ! sequencedMessage(producerId, 1, producerControllerProbe.ref) + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]] + consumerController ! ConsumerController.Confirmed + + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(0, 20, supportResend = false, false)) + producerControllerProbe.expectMessage(ProducerControllerImpl.Request(1, 20, supportResend = false, false)) + + // skipping 2 + consumerController ! sequencedMessage(producerId, 3, producerControllerProbe.ref) + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(3) + consumerController ! ConsumerController.Confirmed + consumerController ! sequencedMessage(producerId, 4, producerControllerProbe.ref) + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(4) + consumerController ! ConsumerController.Confirmed + + // skip many + consumerController ! sequencedMessage(producerId, 35, producerControllerProbe.ref) + consumerProbe.expectMessageType[ConsumerController.Delivery[TestConsumer.Job]].seqNr should ===(35) + consumerController ! ConsumerController.Confirmed + + testKit.stop(consumerController) + } + } + +} diff --git a/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/DurableProducerControllerSpec.scala b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/DurableProducerControllerSpec.scala new file mode 100644 index 00000000000..ba1eb6b0aef --- /dev/null +++ b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/DurableProducerControllerSpec.scala @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2019-2020 Lightbend Inc. + */ + +package akka.actor.typed.delivery + +import java.util.concurrent.atomic.AtomicReference + +import scala.concurrent.duration._ + +import akka.actor.testkit.typed.scaladsl.LogCapturing +import akka.actor.testkit.typed.scaladsl.ScalaTestWithActorTestKit +import DurableProducerQueue.MessageSent +import ProducerController.MessageWithConfirmation +import akka.actor.typed.delivery.internal.ProducerControllerImpl +import org.scalatest.wordspec.AnyWordSpecLike + +class DurableProducerControllerSpec + extends ScalaTestWithActorTestKit(""" + akka.reliable-delivery.consumer-controller.flow-control-window = 20 + """) + with AnyWordSpecLike + with LogCapturing { + import TestConsumer.sequencedMessage + import DurableProducerQueue.NoQualifier + import TestDurableProducerQueue.TestTimestamp + + private var idCount = 0 + private def nextId(): Int = { + idCount += 1 + idCount + } + + private def producerId: String = s"p-$idCount" + + "ProducerController with durable queue" must { + + "load initial state and resend unconfirmed" in { + nextId() + val consumerControllerProbe = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + + val durable = TestDurableProducerQueue[TestConsumer.Job]( + Duration.Zero, + DurableProducerQueue.State( + currentSeqNr = 5, + highestConfirmedSeqNr = 2, + confirmedSeqNr = Map(NoQualifier -> (2L -> TestTimestamp)), + unconfirmed = Vector( + DurableProducerQueue.MessageSent(3, TestConsumer.Job("msg-3"), false, NoQualifier, TestTimestamp), + DurableProducerQueue.MessageSent(4, TestConsumer.Job("msg-4"), false, NoQualifier, TestTimestamp)))) + + val producerController = + spawn(ProducerController[TestConsumer.Job](producerId, Some(durable)), s"producerController-${idCount}") + .unsafeUpcast[ProducerControllerImpl.InternalCommand] + val producerProbe = createTestProbe[ProducerController.RequestNext[TestConsumer.Job]]() + producerController ! ProducerController.Start(producerProbe.ref) + + producerController ! ProducerController.RegisterConsumer(consumerControllerProbe.ref) + + // no request to producer since it has unconfirmed to begin with + producerProbe.expectNoMessage() + + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 3, producerController).asFirst) + consumerControllerProbe.expectNoMessage(50.millis) + producerController ! ProducerControllerImpl.Request(3L, 13L, true, false) + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 4, producerController)) + + val sendTo = producerProbe.receiveMessage().sendNextTo + sendTo ! TestConsumer.Job("msg-5") + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 5, producerController)) + + testKit.stop(producerController) + } + + "store confirmations" in { + nextId() + val consumerControllerProbe = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + + val stateHolder = + new AtomicReference[DurableProducerQueue.State[TestConsumer.Job]](DurableProducerQueue.State.empty) + val durable = TestDurableProducerQueue[TestConsumer.Job]( + Duration.Zero, + stateHolder, + (_: DurableProducerQueue.Command[_]) => false) + + val producerController = + spawn(ProducerController[TestConsumer.Job](producerId, Some(durable)), s"producerController-${idCount}") + .unsafeUpcast[ProducerControllerImpl.InternalCommand] + val producerProbe = createTestProbe[ProducerController.RequestNext[TestConsumer.Job]]() + producerController ! ProducerController.Start(producerProbe.ref) + + producerController ! ProducerController.RegisterConsumer(consumerControllerProbe.ref) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-1") + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 1, producerController)) + producerProbe.awaitAssert { + stateHolder.get() should ===( + DurableProducerQueue.State( + 2, + 0, + Map.empty, + Vector(MessageSent(1, TestConsumer.Job("msg-1"), ack = false, NoQualifier, TestTimestamp)))) + } + producerController ! ProducerControllerImpl.Request(1L, 10L, true, false) + producerProbe.awaitAssert { + stateHolder.get() should ===( + DurableProducerQueue.State(2, 1, Map(NoQualifier -> (1L -> TestTimestamp)), Vector.empty)) + } + + val replyTo = createTestProbe[Long]() + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-2"), replyTo.ref) + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 2, producerController, ack = true)) + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-3"), replyTo.ref) + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 3, producerController, ack = true)) + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-4"), replyTo.ref) + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 4, producerController, ack = true)) + producerController ! ProducerControllerImpl.Ack(3) + producerProbe.awaitAssert { + stateHolder.get() should ===( + DurableProducerQueue.State( + 5, + 3, + Map(NoQualifier -> (3L -> TestTimestamp)), + Vector(MessageSent(4, TestConsumer.Job("msg-4"), ack = true, NoQualifier, TestTimestamp)))) + } + + testKit.stop(producerController) + } + + "reply to MessageWithConfirmation after storage" in { + nextId() + val consumerControllerProbe = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + + val durable = + TestDurableProducerQueue[TestConsumer.Job](Duration.Zero, DurableProducerQueue.State.empty[TestConsumer.Job]) + + val producerController = + spawn(ProducerController[TestConsumer.Job](producerId, Some(durable)), s"producerController-${idCount}") + .unsafeUpcast[ProducerControllerImpl.InternalCommand] + val producerProbe = createTestProbe[ProducerController.RequestNext[TestConsumer.Job]]() + producerController ! ProducerController.Start(producerProbe.ref) + + producerController ! ProducerController.RegisterConsumer(consumerControllerProbe.ref) + + val replyTo = createTestProbe[Long]() + + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-1"), replyTo.ref) + replyTo.expectMessage(1L) + + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 1, producerController, ack = true)) + producerController ! ProducerControllerImpl.Request(1L, 10L, true, false) + + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-2"), replyTo.ref) + replyTo.expectMessage(2L) + + testKit.stop(producerController) + } + } + +} diff --git a/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/DurableWorkPullingSpec.scala b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/DurableWorkPullingSpec.scala new file mode 100644 index 00000000000..082d5c1bee0 --- /dev/null +++ b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/DurableWorkPullingSpec.scala @@ -0,0 +1,395 @@ +/* + * Copyright (C) 2019-2020 Lightbend Inc. + */ + +package akka.actor.typed.delivery + +import java.util.concurrent.atomic.AtomicReference + +import scala.concurrent.duration._ + +import akka.Done +import akka.actor.testkit.typed.scaladsl.LogCapturing +import akka.actor.testkit.typed.scaladsl.ScalaTestWithActorTestKit +import akka.actor.typed.ActorRef +import DurableProducerQueue.MessageSent +import akka.actor.typed.delivery.internal.ProducerControllerImpl +import akka.actor.typed.receptionist.Receptionist +import akka.actor.typed.receptionist.ServiceKey +import org.scalatest.wordspec.AnyWordSpecLike + +class DurableWorkPullingSpec + extends ScalaTestWithActorTestKit(""" + akka.reliable-delivery.consumer-controller.flow-control-window = 20 + """) + with AnyWordSpecLike + with LogCapturing { + import DurableProducerQueue.NoQualifier + import TestDurableProducerQueue.TestTimestamp + + private var idCount = 0 + private def nextId(): Int = { + idCount += 1 + idCount + } + + private def producerId: String = s"p-$idCount" + + private def awaitWorkersRegistered( + controller: ActorRef[WorkPullingProducerController.Command[TestConsumer.Job]], + count: Int): Unit = { + val probe = createTestProbe[WorkPullingProducerController.WorkerStats]() + probe.awaitAssert { + controller ! WorkPullingProducerController.GetWorkerStats(probe.ref) + probe.receiveMessage().numberOfWorkers should ===(count) + } + } + + val workerServiceKey: ServiceKey[ConsumerController.Command[TestConsumer.Job]] = ServiceKey("worker") + + // don't compare the UUID fields + private def assertState( + s: DurableProducerQueue.State[TestConsumer.Job], + expected: DurableProducerQueue.State[TestConsumer.Job]): Unit = { + + def cleanup(a: DurableProducerQueue.State[TestConsumer.Job]) = + a.copy( + confirmedSeqNr = Map.empty, + unconfirmed = s.unconfirmed.map(m => m.copy(confirmationQualifier = DurableProducerQueue.NoQualifier))) + + cleanup(s) should ===(cleanup(expected)) + } + + "ReliableDelivery with work-pulling and durable queue" must { + + "load initial state and resend unconfirmed" in { + nextId() + + val durable = TestDurableProducerQueue[TestConsumer.Job]( + Duration.Zero, + DurableProducerQueue.State( + currentSeqNr = 5, + highestConfirmedSeqNr = 2, + confirmedSeqNr = Map(NoQualifier -> (2L -> TestTimestamp)), + unconfirmed = Vector( + DurableProducerQueue.MessageSent(3, TestConsumer.Job("msg-3"), false, NoQualifier, TestTimestamp), + DurableProducerQueue.MessageSent(4, TestConsumer.Job("msg-4"), false, NoQualifier, TestTimestamp)))) + + val workPullingController = + spawn( + WorkPullingProducerController[TestConsumer.Job](producerId, workerServiceKey, Some(durable)), + s"workPullingController-${idCount}") + val producerProbe = createTestProbe[WorkPullingProducerController.RequestNext[TestConsumer.Job]]() + workPullingController ! WorkPullingProducerController.Start(producerProbe.ref) + + val workerController1Probe = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + system.receptionist ! Receptionist.Register(workerServiceKey, workerController1Probe.ref) + awaitWorkersRegistered(workPullingController, 1) + + // no request to producer since it has unconfirmed to begin with + producerProbe.expectNoMessage() + + val seqMsg3 = workerController1Probe.expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + seqMsg3.message should ===(TestConsumer.Job("msg-3")) + seqMsg3.producerController ! ProducerControllerImpl.Request(1L, 10L, true, false) + + workerController1Probe + .expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + .message should ===(TestConsumer.Job("msg-4")) + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-5") + + workerController1Probe.stop() + awaitWorkersRegistered(workPullingController, 0) + testKit.stop(workPullingController) + } + + "reply to MessageWithConfirmation after storage" in { + import WorkPullingProducerController.MessageWithConfirmation + nextId() + val durable = + TestDurableProducerQueue[TestConsumer.Job](Duration.Zero, DurableProducerQueue.State.empty[TestConsumer.Job]) + val workPullingController = + spawn( + WorkPullingProducerController[TestConsumer.Job](producerId, workerServiceKey, Some(durable)), + s"workPullingController-${idCount}") + val producerProbe = createTestProbe[WorkPullingProducerController.RequestNext[TestConsumer.Job]]() + workPullingController ! WorkPullingProducerController.Start(producerProbe.ref) + + val workerController1Probe = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + system.receptionist ! Receptionist.Register(workerServiceKey, workerController1Probe.ref) + awaitWorkersRegistered(workPullingController, 1) + + val replyProbe = createTestProbe[Done]() + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-1"), replyProbe.ref) + val seqMsg1 = workerController1Probe.expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + seqMsg1.message should ===(TestConsumer.Job("msg-1")) + seqMsg1.ack should ===(true) + seqMsg1.producerController ! ProducerControllerImpl.Request(1L, 10L, true, false) + replyProbe.receiveMessage() + + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-2"), replyProbe.ref) + // reply after storage, doesn't wait for ack from consumer + replyProbe.receiveMessage() + val seqMsg2 = workerController1Probe.expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + seqMsg2.message should ===(TestConsumer.Job("msg-2")) + seqMsg2.ack should ===(true) + seqMsg2.producerController ! ProducerControllerImpl.Ack(2L) + + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-3"), replyProbe.ref) + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-4"), replyProbe.ref) + replyProbe.receiveMessages(2) + workerController1Probe.receiveMessages(2) + seqMsg2.producerController ! ProducerControllerImpl.Ack(4L) + + workerController1Probe.stop() + awaitWorkersRegistered(workPullingController, 0) + testKit.stop(workPullingController) + } + + "store confirmations" in { + import WorkPullingProducerController.MessageWithConfirmation + nextId() + + val stateHolder = + new AtomicReference[DurableProducerQueue.State[TestConsumer.Job]](DurableProducerQueue.State.empty) + val durable = TestDurableProducerQueue[TestConsumer.Job]( + Duration.Zero, + stateHolder, + (_: DurableProducerQueue.Command[_]) => false) + + val workPullingController = + spawn( + WorkPullingProducerController[TestConsumer.Job](producerId, workerServiceKey, Some(durable)), + s"workPullingController-${idCount}") + val producerProbe = createTestProbe[WorkPullingProducerController.RequestNext[TestConsumer.Job]]() + workPullingController ! WorkPullingProducerController.Start(producerProbe.ref) + + val workerController1Probe = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + system.receptionist ! Receptionist.Register(workerServiceKey, workerController1Probe.ref) + awaitWorkersRegistered(workPullingController, 1) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-1") + producerProbe.awaitAssert { + assertState( + stateHolder.get(), + DurableProducerQueue.State( + 2, + 0, + Map.empty, + Vector(MessageSent(1, TestConsumer.Job("msg-1"), ack = false, NoQualifier, TestTimestamp)))) + } + val seqMsg1 = workerController1Probe.expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + seqMsg1.message should ===(TestConsumer.Job("msg-1")) + seqMsg1.producerController ! ProducerControllerImpl.Request(1L, 5L, true, false) + producerProbe.awaitAssert { + assertState(stateHolder.get(), DurableProducerQueue.State(2, 1, Map.empty, Vector.empty)) + } + + val replyTo = createTestProbe[Done]() + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-2"), replyTo.ref) + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-3") + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-4"), replyTo.ref) + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-5") + workerController1Probe.receiveMessage() // msg-2 + workerController1Probe.receiveMessage() // msg-3 + workerController1Probe.receiveMessage() // msg-4 + val seqMsg5 = workerController1Probe.expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + seqMsg5.seqNr should ===(5) + + // no more demand, since 5 messages sent but no Ack + producerProbe.expectNoMessage() + producerProbe.awaitAssert { + assertState( + stateHolder.get(), + DurableProducerQueue.State( + 6, + 1, + Map.empty, + Vector( + MessageSent(2, TestConsumer.Job("msg-2"), ack = true, NoQualifier, TestTimestamp), + MessageSent(3, TestConsumer.Job("msg-3"), ack = false, NoQualifier, TestTimestamp), + MessageSent(4, TestConsumer.Job("msg-4"), ack = true, NoQualifier, TestTimestamp), + MessageSent(5, TestConsumer.Job("msg-5"), ack = false, NoQualifier, TestTimestamp)))) + } + + // start another worker + val workerController2Probe = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + system.receptionist ! Receptionist.Register(workerServiceKey, workerController2Probe.ref) + awaitWorkersRegistered(workPullingController, 2) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-6") + producerProbe.awaitAssert { + assertState( + stateHolder.get(), + DurableProducerQueue.State( + 7, + 1, + Map.empty, + Vector( + MessageSent(2, TestConsumer.Job("msg-2"), ack = true, NoQualifier, TestTimestamp), + MessageSent(3, TestConsumer.Job("msg-3"), ack = false, NoQualifier, TestTimestamp), + MessageSent(4, TestConsumer.Job("msg-4"), ack = true, NoQualifier, TestTimestamp), + MessageSent(5, TestConsumer.Job("msg-5"), ack = false, NoQualifier, TestTimestamp), + MessageSent(6, TestConsumer.Job("msg-6"), ack = false, NoQualifier, TestTimestamp)))) + } + val seqMsg6 = workerController2Probe.expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + seqMsg6.message should ===(TestConsumer.Job("msg-6")) + seqMsg6.seqNr should ===(1) // different ProducerController-ConsumerController + seqMsg6.producerController ! ProducerControllerImpl.Request(1L, 5L, true, false) + producerProbe.awaitAssert { + assertState( + stateHolder.get(), + DurableProducerQueue.State( + 7, + 6, + Map.empty, + Vector( + MessageSent(2, TestConsumer.Job("msg-2"), ack = true, NoQualifier, TestTimestamp), + MessageSent(3, TestConsumer.Job("msg-3"), ack = false, NoQualifier, TestTimestamp), + MessageSent(4, TestConsumer.Job("msg-4"), ack = true, NoQualifier, TestTimestamp), + MessageSent(5, TestConsumer.Job("msg-5"), ack = false, NoQualifier, TestTimestamp)))) + } + + seqMsg1.producerController ! ProducerControllerImpl.Ack(3) + producerProbe.awaitAssert { + assertState( + stateHolder.get(), + DurableProducerQueue.State( + 7, + 6, + Map.empty, + Vector( + MessageSent(4, TestConsumer.Job("msg-4"), ack = true, NoQualifier, TestTimestamp), + MessageSent(5, TestConsumer.Job("msg-5"), ack = false, NoQualifier, TestTimestamp)))) + } + + workerController1Probe.stop() + workerController2Probe.stop() + awaitWorkersRegistered(workPullingController, 0) + testKit.stop(workPullingController) + } + + "hand over, and resend unconfirmed when worker is unregistered" in { + nextId() + + val stateHolder = + new AtomicReference[DurableProducerQueue.State[TestConsumer.Job]](DurableProducerQueue.State.empty) + val durable = TestDurableProducerQueue[TestConsumer.Job]( + Duration.Zero, + stateHolder, + (_: DurableProducerQueue.Command[_]) => false) + + val workPullingController = + spawn( + WorkPullingProducerController[TestConsumer.Job](producerId, workerServiceKey, Some(durable)), + s"workPullingController-${idCount}") + val producerProbe = createTestProbe[WorkPullingProducerController.RequestNext[TestConsumer.Job]]() + workPullingController ! WorkPullingProducerController.Start(producerProbe.ref) + + val workerController1Probe = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + system.receptionist ! Receptionist.Register(workerServiceKey, workerController1Probe.ref) + awaitWorkersRegistered(workPullingController, 1) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-1") + producerProbe.awaitAssert { + assertState( + stateHolder.get(), + DurableProducerQueue.State( + 2, + 0, + Map.empty, + Vector(MessageSent(1, TestConsumer.Job("msg-1"), ack = false, NoQualifier, TestTimestamp)))) + } + val seqMsg1 = workerController1Probe.expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + seqMsg1.message should ===(TestConsumer.Job("msg-1")) + seqMsg1.producerController ! ProducerControllerImpl.Request(1L, 5L, true, false) + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-2") + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-3") + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-4") + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-5") + workerController1Probe.receiveMessage() // msg-2 + workerController1Probe.receiveMessage() // msg-3 + workerController1Probe.receiveMessage() // msg-4 + workerController1Probe.receiveMessage() // msg-5 + + // no more demand, since 5 messages sent but no Ack + producerProbe.expectNoMessage() + producerProbe.awaitAssert { + assertState( + stateHolder.get(), + DurableProducerQueue.State( + 6, + 1, + Map.empty, + Vector( + MessageSent(2, TestConsumer.Job("msg-2"), ack = false, NoQualifier, TestTimestamp), + MessageSent(3, TestConsumer.Job("msg-3"), ack = false, NoQualifier, TestTimestamp), + MessageSent(4, TestConsumer.Job("msg-4"), ack = false, NoQualifier, TestTimestamp), + MessageSent(5, TestConsumer.Job("msg-5"), ack = false, NoQualifier, TestTimestamp)))) + } + + // start another worker + val workerController2Probe = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + system.receptionist ! Receptionist.Register(workerServiceKey, workerController2Probe.ref) + awaitWorkersRegistered(workPullingController, 2) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-6") + val seqMsg6 = workerController2Probe.expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + seqMsg6.message should ===(TestConsumer.Job("msg-6")) + // note that it's only requesting 3 + seqMsg6.producerController ! ProducerControllerImpl.Request(1L, 3L, true, false) + producerProbe.awaitAssert { + assertState( + stateHolder.get(), + DurableProducerQueue.State( + 7, + 6, + Map.empty, + Vector( + MessageSent(2, TestConsumer.Job("msg-2"), ack = true, NoQualifier, TestTimestamp), + MessageSent(3, TestConsumer.Job("msg-3"), ack = false, NoQualifier, TestTimestamp), + MessageSent(4, TestConsumer.Job("msg-4"), ack = true, NoQualifier, TestTimestamp), + MessageSent(5, TestConsumer.Job("msg-5"), ack = false, NoQualifier, TestTimestamp)))) + } + + workerController1Probe.stop() + awaitWorkersRegistered(workPullingController, 1) + + // msg-2, msg-3, msg-4, msg-5 were originally sent to worker1, but not confirmed + // so they will be resent and delivered to worker2 + val seqMsg7 = workerController2Probe.expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + seqMsg7.message should ===(TestConsumer.Job("msg-2")) + val seqMsg8 = workerController2Probe.expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + seqMsg8.message should ===(TestConsumer.Job("msg-3")) + seqMsg8.seqNr should ===(3) + // but it has only requested 3 so no more + workerController2Probe.expectNoMessage() + // then request more, and confirm 3 + seqMsg8.producerController ! ProducerControllerImpl.Request(3L, 10L, true, false) + val seqMsg9 = workerController2Probe.expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + seqMsg9.message should ===(TestConsumer.Job("msg-4")) + val seqMsg10 = workerController2Probe.expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + seqMsg10.message should ===(TestConsumer.Job("msg-5")) + + seqMsg9.producerController ! ProducerControllerImpl.Ack(seqMsg9.seqNr) + producerProbe.awaitAssert { + assertState( + stateHolder.get(), + DurableProducerQueue.State( + 11, + 9, + Map.empty, + Vector( + // note that it has a different seqNr than before + MessageSent(10, TestConsumer.Job("msg-5"), ack = false, NoQualifier, TestTimestamp)))) + } + + workerController1Probe.stop() + workerController2Probe.stop() + awaitWorkersRegistered(workPullingController, 0) + testKit.stop(workPullingController) + } + + } + +} diff --git a/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/ProducerControllerSpec.scala b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/ProducerControllerSpec.scala new file mode 100644 index 00000000000..0dda08546b5 --- /dev/null +++ b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/ProducerControllerSpec.scala @@ -0,0 +1,333 @@ +/* + * Copyright (C) 2019-2020 Lightbend Inc. + */ + +package akka.actor.typed.delivery + +import scala.concurrent.duration._ + +import akka.actor.testkit.typed.scaladsl.LogCapturing +import akka.actor.testkit.typed.scaladsl.ScalaTestWithActorTestKit +import ProducerController.MessageWithConfirmation +import akka.actor.typed.delivery.internal.ProducerControllerImpl +import org.scalatest.wordspec.AnyWordSpecLike + +class ProducerControllerSpec + extends ScalaTestWithActorTestKit(""" + akka.reliable-delivery.consumer-controller.flow-control-window = 20 + """) + with AnyWordSpecLike + with LogCapturing { + import TestConsumer.sequencedMessage + + private var idCount = 0 + private def nextId(): Int = { + idCount += 1 + idCount + } + + private def producerId: String = s"p-$idCount" + + "ProducerController" must { + + "resend lost initial SequencedMessage" in { + nextId() + val consumerControllerProbe = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + + val producerController = + spawn(ProducerController[TestConsumer.Job](producerId, None), s"producerController-${idCount}") + val producerProbe = createTestProbe[ProducerController.RequestNext[TestConsumer.Job]]() + producerController ! ProducerController.Start(producerProbe.ref) + + producerController ! ProducerController.RegisterConsumer(consumerControllerProbe.ref) + + val sendTo = producerProbe.receiveMessage().sendNextTo + sendTo ! TestConsumer.Job("msg-1") + + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 1, producerController)) + + // the ConsumerController will send initial `Request` back, but if that is lost or if the first + // `SequencedMessage` is lost the ProducerController will resend the SequencedMessage + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 1, producerController)) + + val internalProducerController = producerController.unsafeUpcast[ProducerControllerImpl.InternalCommand] + internalProducerController ! ProducerControllerImpl.Request(1L, 10L, true, false) + consumerControllerProbe.expectNoMessage(1100.millis) + + testKit.stop(producerController) + } + + "resend lost SequencedMessage when receiving Resend" in { + nextId() + val consumerControllerProbe = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + + val producerController = + spawn(ProducerController[TestConsumer.Job](producerId, None), s"producerController-${idCount}") + .unsafeUpcast[ProducerControllerImpl.InternalCommand] + val producerProbe = createTestProbe[ProducerController.RequestNext[TestConsumer.Job]]() + producerController ! ProducerController.Start(producerProbe.ref) + + producerController ! ProducerController.RegisterConsumer(consumerControllerProbe.ref) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-1") + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 1, producerController)) + + producerController ! ProducerControllerImpl.Request(1L, 10L, true, false) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-2") + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 2, producerController)) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-3") + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 3, producerController)) + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-4") + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 4, producerController)) + + // let's say 3 is lost, when 4 is received the ConsumerController detects the gap and sends Resend(3) + producerController ! ProducerControllerImpl.Resend(3) + + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 3, producerController)) + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 4, producerController)) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-5") + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 5, producerController)) + + testKit.stop(producerController) + } + + "resend last lost SequencedMessage when receiving Request" in { + nextId() + val consumerControllerProbe = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + + val producerController = + spawn(ProducerController[TestConsumer.Job](producerId, None), s"producerController-${idCount}") + .unsafeUpcast[ProducerControllerImpl.InternalCommand] + val producerProbe = createTestProbe[ProducerController.RequestNext[TestConsumer.Job]]() + producerController ! ProducerController.Start(producerProbe.ref) + + producerController ! ProducerController.RegisterConsumer(consumerControllerProbe.ref) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-1") + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 1, producerController)) + + producerController ! ProducerControllerImpl.Request(1L, 10L, true, false) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-2") + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 2, producerController)) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-3") + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 3, producerController)) + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-4") + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 4, producerController)) + + // let's say 3 and 4 are lost, and no more messages are sent from producer + // ConsumerController will resend Request periodically + producerController ! ProducerControllerImpl.Request(2L, 10L, true, true) + + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 3, producerController)) + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 4, producerController)) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-5") + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 5, producerController)) + + testKit.stop(producerController) + } + + "support registration of new ConsumerController" in { + nextId() + + val producerController = + spawn(ProducerController[TestConsumer.Job](producerId, None), s"producerController-${idCount}") + .unsafeUpcast[ProducerControllerImpl.InternalCommand] + val producerProbe = createTestProbe[ProducerController.RequestNext[TestConsumer.Job]]() + producerController ! ProducerController.Start(producerProbe.ref) + + val consumerControllerProbe1 = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + producerController ! ProducerController.RegisterConsumer(consumerControllerProbe1.ref) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-1") + consumerControllerProbe1.expectMessage(sequencedMessage(producerId, 1, producerController)) + + producerController ! ProducerControllerImpl.Request(1L, 10L, true, false) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-2") + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-3") + + val consumerControllerProbe2 = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + producerController ! ProducerController.RegisterConsumer(consumerControllerProbe2.ref) + + consumerControllerProbe2.expectMessage(sequencedMessage(producerId, 2, producerController).asFirst) + consumerControllerProbe2.expectNoMessage(100.millis) + // if no Request confirming the first (seqNr=2) it will resend it + consumerControllerProbe2.expectMessage(sequencedMessage(producerId, 2, producerController).asFirst) + + producerController ! ProducerControllerImpl.Request(2L, 10L, true, false) + // then the other unconfirmed should be resent + consumerControllerProbe2.expectMessage(sequencedMessage(producerId, 3, producerController)) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-4") + consumerControllerProbe2.expectMessage(sequencedMessage(producerId, 4, producerController)) + + testKit.stop(producerController) + } + + "reply to MessageWithConfirmation" in { + nextId() + val consumerControllerProbe = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + + val producerController = + spawn(ProducerController[TestConsumer.Job](producerId, None), s"producerController-${idCount}") + .unsafeUpcast[ProducerControllerImpl.InternalCommand] + val producerProbe = createTestProbe[ProducerController.RequestNext[TestConsumer.Job]]() + producerController ! ProducerController.Start(producerProbe.ref) + + producerController ! ProducerController.RegisterConsumer(consumerControllerProbe.ref) + + val replyTo = createTestProbe[Long]() + + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-1"), replyTo.ref) + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 1, producerController, ack = true)) + producerController ! ProducerControllerImpl.Request(1L, 10L, true, false) + replyTo.expectMessage(1L) + + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-2"), replyTo.ref) + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 2, producerController, ack = true)) + producerController ! ProducerControllerImpl.Ack(2L) + replyTo.expectMessage(2L) + + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-3"), replyTo.ref) + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-4"), replyTo.ref) + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 3, producerController, ack = true)) + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 4, producerController, ack = true)) + // Ack(3 lost, but Ack(4) triggers reply for 3 and 4 + producerController ! ProducerControllerImpl.Ack(4L) + replyTo.expectMessage(3L) + replyTo.expectMessage(4L) + + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-5"), replyTo.ref) + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 5, producerController, ack = true)) + // Ack(5) lost, but eventually a Request will trigger the reply + producerController ! ProducerControllerImpl.Request(5L, 15L, true, false) + replyTo.expectMessage(5L) + + testKit.stop(producerController) + } + + "allow restart of producer" in { + nextId() + val consumerControllerProbe = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + + val producerController = + spawn(ProducerController[TestConsumer.Job](producerId, None), s"producerController-${idCount}") + .unsafeUpcast[ProducerControllerImpl.InternalCommand] + val producerProbe1 = createTestProbe[ProducerController.RequestNext[TestConsumer.Job]]() + producerController ! ProducerController.Start(producerProbe1.ref) + + producerController ! ProducerController.RegisterConsumer(consumerControllerProbe.ref) + + producerProbe1.receiveMessage().sendNextTo ! TestConsumer.Job("msg-1") + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 1, producerController)) + producerController ! ProducerControllerImpl.Request(1L, 10L, true, false) + + producerProbe1.receiveMessage().sendNextTo ! TestConsumer.Job("msg-2") + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 2, producerController)) + + producerProbe1.receiveMessage().currentSeqNr should ===(3) + + // restart producer, new Start + val producerProbe2 = createTestProbe[ProducerController.RequestNext[TestConsumer.Job]]() + producerController ! ProducerController.Start(producerProbe2.ref) + + producerProbe2.receiveMessage().sendNextTo ! TestConsumer.Job("msg-3") + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 3, producerController)) + + producerProbe2.receiveMessage().sendNextTo ! TestConsumer.Job("msg-4") + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 4, producerController)) + + testKit.stop(producerController) + } + + } + + "ProducerController without resends" must { + "not resend last lost SequencedMessage when receiving Request" in { + nextId() + val consumerControllerProbe = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + + val producerController = + spawn(ProducerController[TestConsumer.Job](producerId, None), s"producerController-${idCount}") + .unsafeUpcast[ProducerControllerImpl.InternalCommand] + val producerProbe = createTestProbe[ProducerController.RequestNext[TestConsumer.Job]]() + producerController ! ProducerController.Start(producerProbe.ref) + + producerController ! ProducerController.RegisterConsumer(consumerControllerProbe.ref) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-1") + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 1, producerController)) + + producerController ! ProducerControllerImpl.Request(1L, 10L, supportResend = false, false) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-2") + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 2, producerController)) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-3") + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 3, producerController)) + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-4") + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 4, producerController)) + + // let's say 3 and 4 are lost, and no more messages are sent from producer + // ConsumerController will resend Request periodically + producerController ! ProducerControllerImpl.Request(2L, 10L, supportResend = false, true) + + // but 3 and 4 are not resent because supportResend = false + consumerControllerProbe.expectNoMessage() + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-5") + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 5, producerController)) + + testKit.stop(producerController) + } + + "reply to MessageWithConfirmation for lost messages" in { + nextId() + val consumerControllerProbe = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + + val producerController = + spawn(ProducerController[TestConsumer.Job](producerId, None), s"producerController-${idCount}") + .unsafeUpcast[ProducerControllerImpl.InternalCommand] + val producerProbe = createTestProbe[ProducerController.RequestNext[TestConsumer.Job]]() + producerController ! ProducerController.Start(producerProbe.ref) + + producerController ! ProducerController.RegisterConsumer(consumerControllerProbe.ref) + + val replyTo = createTestProbe[Long]() + + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-1"), replyTo.ref) + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 1, producerController, ack = true)) + producerController ! ProducerControllerImpl.Request(1L, 10L, supportResend = false, false) + replyTo.expectMessage(1L) + + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-2"), replyTo.ref) + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 2, producerController, ack = true)) + producerController ! ProducerControllerImpl.Ack(2L) + replyTo.expectMessage(2L) + + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-3"), replyTo.ref) + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-4"), replyTo.ref) + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 3, producerController, ack = true)) + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 4, producerController, ack = true)) + // Ack(3 lost, but Ack(4) triggers reply for 3 and 4 + producerController ! ProducerControllerImpl.Ack(4L) + replyTo.expectMessage(3L) + replyTo.expectMessage(4L) + + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-5"), replyTo.ref) + consumerControllerProbe.expectMessage(sequencedMessage(producerId, 5, producerController, ack = true)) + // Ack(5) lost, but eventually a Request will trigger the reply + producerController ! ProducerControllerImpl.Request(5L, 15L, supportResend = false, false) + replyTo.expectMessage(5L) + + testKit.stop(producerController) + } + } + +} diff --git a/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/ReliableDeliveryRandomSpec.scala b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/ReliableDeliveryRandomSpec.scala new file mode 100644 index 00000000000..2432fbc5bac --- /dev/null +++ b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/ReliableDeliveryRandomSpec.scala @@ -0,0 +1,200 @@ +/* + * Copyright (C) 2019-2020 Lightbend Inc. + */ + +package akka.actor.typed.delivery + +import java.util.concurrent.atomic.AtomicReference + +import scala.concurrent.duration._ +import scala.util.Random + +import akka.actor.testkit.typed.scaladsl.LogCapturing +import akka.actor.testkit.typed.scaladsl.ScalaTestWithActorTestKit +import akka.actor.typed.Behavior +import akka.actor.typed.BehaviorInterceptor +import akka.actor.typed.TypedActorContext +import akka.actor.typed.delivery.internal.ProducerControllerImpl +import akka.actor.typed.scaladsl.Behaviors +import akka.actor.typed.scaladsl.LoggerOps +import org.scalatest.wordspec.AnyWordSpecLike + +object ReliableDeliveryRandomSpec { + object RandomFlakyNetwork { + def apply[T](rnd: Random, dropProbability: Any => Double): BehaviorInterceptor[T, T] = + new RandomFlakyNetwork(rnd, dropProbability).asInstanceOf[BehaviorInterceptor[T, T]] + } + + class RandomFlakyNetwork(rnd: Random, dropProbability: Any => Double) extends BehaviorInterceptor[Any, Any] { + override def aroundReceive( + ctx: TypedActorContext[Any], + msg: Any, + target: BehaviorInterceptor.ReceiveTarget[Any]): Behavior[Any] = { + if (rnd.nextDouble() < dropProbability(msg)) { + ctx.asScala.log.info("dropped {}", msg) + Behaviors.same + } else { + target(ctx, msg) + } + } + + } +} + +class ReliableDeliveryRandomSpec + extends ScalaTestWithActorTestKit(""" + akka.reliable-delivery.consumer-controller.flow-control-window = 20 + """) + with AnyWordSpecLike + with LogCapturing { + import ReliableDeliveryRandomSpec._ + + private var idCount = 0 + private def nextId(): Int = { + idCount += 1 + idCount + } + + private def producerId: String = s"p-$idCount" + + private def test( + rndSeed: Long, + rnd: Random, + numberOfMessages: Int, + producerDropProbability: Double, + consumerDropProbability: Double, + durableFailProbability: Option[Double], + resendLost: Boolean): Unit = { + + val consumerControllerSettings = ConsumerController.Settings(system).withOnlyFlowControl(!resendLost) + + val consumerDelay = rnd.nextInt(40).millis + val producerDelay = rnd.nextInt(40).millis + val durableDelay = if (durableFailProbability.isDefined) rnd.nextInt(40).millis else Duration.Zero + system.log.infoN( + "Random seed [{}], consumerDropProbability [{}], producerDropProbability [{}], " + + "consumerDelay [{}], producerDelay [{}], durableFailProbability [{}], durableDelay [{}]", + rndSeed, + consumerDropProbability, + producerDropProbability, + consumerDelay, + producerDelay, + durableFailProbability, + durableDelay) + + // RandomFlakyNetwork to simulate lost messages from producerController to consumerController + val consumerDrop: Any => Double = { + case _: ConsumerController.SequencedMessage[_] => consumerDropProbability + case _ => 0.0 + } + + val consumerEndProbe = createTestProbe[TestConsumer.CollectedProducerIds]() + val consumerController = + spawn( + Behaviors.intercept(() => RandomFlakyNetwork[ConsumerController.Command[TestConsumer.Job]](rnd, consumerDrop))( + ConsumerController[TestConsumer.Job](serviceKey = None, consumerControllerSettings)), + s"consumerController-${idCount}") + spawn( + TestConsumer(consumerDelay, numberOfMessages, consumerEndProbe.ref, consumerController), + name = s"destination-${idCount}") + + // RandomFlakyNetwork to simulate lost messages from consumerController to producerController + val producerDrop: Any => Double = { + case _: ProducerControllerImpl.Request => producerDropProbability + case _: ProducerControllerImpl.Resend => producerDropProbability + case _: ProducerController.RegisterConsumer[_] => producerDropProbability + case _ => 0.0 + } + + val stateHolder = new AtomicReference[DurableProducerQueue.State[TestConsumer.Job]] + val durableQueue = durableFailProbability.map { p => + TestDurableProducerQueue( + durableDelay, + stateHolder, + (_: DurableProducerQueue.Command[TestConsumer.Job]) => rnd.nextDouble() < p) + } + + val producerController = spawn( + Behaviors.intercept(() => RandomFlakyNetwork[ProducerController.Command[TestConsumer.Job]](rnd, producerDrop))( + ProducerController[TestConsumer.Job](producerId, durableQueue)), + s"producerController-${idCount}") + val producer = spawn(TestProducer(producerDelay, producerController), name = s"producer-${idCount}") + + consumerController ! ConsumerController.RegisterToProducerController(producerController) + + consumerEndProbe.receiveMessage(120.seconds) + + testKit.stop(producer) + testKit.stop(producerController) + testKit.stop(consumerController) + } + + "ReliableDelivery with random failures" must { + + "work with flaky network" in { + nextId() + val rndSeed = System.currentTimeMillis() + val rnd = new Random(rndSeed) + val consumerDropProbability = 0.1 + rnd.nextDouble() * 0.4 + val producerDropProbability = 0.1 + rnd.nextDouble() * 0.3 + test( + rndSeed, + rnd, + numberOfMessages = 63, + producerDropProbability, + consumerDropProbability, + durableFailProbability = None, + resendLost = true) + } + + "work with flaky DurableProducerQueue" in { + nextId() + val rndSeed = System.currentTimeMillis() + val rnd = new Random(rndSeed) + val durableFailProbability = 0.1 + rnd.nextDouble() * 0.2 + test( + rndSeed, + rnd, + numberOfMessages = 31, + producerDropProbability = 0.0, + consumerDropProbability = 0.0, + Some(durableFailProbability), + resendLost = true) + } + + "work with flaky network and flaky DurableProducerQueue" in { + nextId() + val rndSeed = System.currentTimeMillis() + val rnd = new Random(rndSeed) + val consumerDropProbability = 0.1 + rnd.nextDouble() * 0.4 + val producerDropProbability = 0.1 + rnd.nextDouble() * 0.3 + val durableFailProbability = 0.1 + rnd.nextDouble() * 0.2 + test( + rndSeed, + rnd, + numberOfMessages = 17, + producerDropProbability, + consumerDropProbability, + Some(durableFailProbability), + resendLost = true) + } + + "work with flaky network without resending" in { + nextId() + val rndSeed = System.currentTimeMillis() + val rnd = new Random(rndSeed) + val consumerDropProbability = 0.1 + rnd.nextDouble() * 0.4 + val producerDropProbability = 0.1 + rnd.nextDouble() * 0.3 + test( + rndSeed, + rnd, + numberOfMessages = 63, + producerDropProbability, + consumerDropProbability, + durableFailProbability = None, + resendLost = false) + } + + } + +} diff --git a/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/ReliableDeliverySpec.scala b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/ReliableDeliverySpec.scala new file mode 100644 index 00000000000..83057b71a2c --- /dev/null +++ b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/ReliableDeliverySpec.scala @@ -0,0 +1,190 @@ +/* + * Copyright (C) 2019-2020 Lightbend Inc. + */ + +package akka.actor.typed.delivery + +import scala.concurrent.duration._ + +import akka.actor.testkit.typed.scaladsl.LogCapturing +import akka.actor.testkit.typed.scaladsl.ScalaTestWithActorTestKit +import org.scalatest.wordspec.AnyWordSpecLike + +class ReliableDeliverySpec + extends ScalaTestWithActorTestKit(""" + akka.reliable-delivery.consumer-controller.flow-control-window = 20 + """) + with AnyWordSpecLike + with LogCapturing { + import TestConsumer.defaultConsumerDelay + import TestProducer.defaultProducerDelay + + private var idCount = 0 + private def nextId(): Int = { + idCount += 1 + idCount + } + + "ReliableDelivery" must { + + "illustrate point-to-point usage" in { + nextId() + val consumerEndProbe = createTestProbe[TestConsumer.CollectedProducerIds]() + val consumerController = + spawn(ConsumerController[TestConsumer.Job](), s"consumerController-${idCount}") + spawn( + TestConsumer(defaultConsumerDelay, 42, consumerEndProbe.ref, consumerController), + name = s"destination-${idCount}") + + val producerController = + spawn(ProducerController[TestConsumer.Job](s"p-${idCount}", None), s"producerController-${idCount}") + val producer = spawn(TestProducer(defaultProducerDelay, producerController), name = s"producer-${idCount}") + + consumerController ! ConsumerController.RegisterToProducerController(producerController) + + consumerEndProbe.receiveMessage(5.seconds) + + testKit.stop(producer) + testKit.stop(producerController) + testKit.stop(consumerController) + } + + "illustrate point-to-point usage with ask" in { + nextId() + val consumerEndProbe = createTestProbe[TestConsumer.CollectedProducerIds]() + val consumerController = + spawn(ConsumerController[TestConsumer.Job](), s"consumerController-${idCount}") + spawn( + TestConsumer(defaultConsumerDelay, 42, consumerEndProbe.ref, consumerController), + name = s"destination-${idCount}") + + val replyProbe = createTestProbe[Long]() + + val producerController = + spawn(ProducerController[TestConsumer.Job](s"p-${idCount}", None), s"producerController-${idCount}") + val producer = + spawn( + TestProducerWithAsk(defaultProducerDelay, replyProbe.ref, producerController), + name = s"producer-${idCount}") + + consumerController ! ConsumerController.RegisterToProducerController(producerController) + + consumerEndProbe.receiveMessage(5.seconds) + + replyProbe.receiveMessages(42, 5.seconds).toSet should ===((1L to 42L).toSet) + + testKit.stop(producer) + testKit.stop(producerController) + testKit.stop(consumerController) + } + + def testWithDelays(producerDelay: FiniteDuration, consumerDelay: FiniteDuration): Unit = { + nextId() + val consumerEndProbe = createTestProbe[TestConsumer.CollectedProducerIds]() + val consumerController = + spawn(ConsumerController[TestConsumer.Job](), s"consumerController-${idCount}") + spawn(TestConsumer(consumerDelay, 42, consumerEndProbe.ref, consumerController), name = s"destination-${idCount}") + + val producerController = + spawn(ProducerController[TestConsumer.Job](s"p-${idCount}", None), s"producerController-${idCount}") + val producer = spawn(TestProducer(producerDelay, producerController), name = s"producer-${idCount}") + + consumerController ! ConsumerController.RegisterToProducerController(producerController) + + consumerEndProbe.receiveMessage(5.seconds) + + testKit.stop(producer) + testKit.stop(producerController) + testKit.stop(consumerController) + } + + "work with slow producer and fast consumer" in { + testWithDelays(producerDelay = 30.millis, consumerDelay = Duration.Zero) + } + + "work with fast producer and slow consumer" in { + testWithDelays(producerDelay = Duration.Zero, consumerDelay = 30.millis) + } + + "work with fast producer and fast consumer" in { + testWithDelays(producerDelay = Duration.Zero, consumerDelay = Duration.Zero) + } + + "allow replacement of destination" in { + nextId() + val consumerEndProbe = createTestProbe[TestConsumer.CollectedProducerIds]() + val consumerController = + spawn(ConsumerController[TestConsumer.Job](), s"consumerController1-${idCount}") + spawn(TestConsumer(defaultConsumerDelay, 42, consumerEndProbe.ref, consumerController), s"consumer1-${idCount}") + + val producerController = + spawn(ProducerController[TestConsumer.Job](s"p-${idCount}", None), s"producerController-${idCount}") + val producer = spawn(TestProducer(defaultProducerDelay, producerController), name = s"producer-${idCount}") + + consumerController ! ConsumerController.RegisterToProducerController(producerController) + + consumerEndProbe.receiveMessage(5.seconds) + + val consumerEndProbe2 = createTestProbe[TestConsumer.CollectedProducerIds]() + val consumerController2 = + spawn(ConsumerController[TestConsumer.Job](), s"consumerController2-${idCount}") + spawn(TestConsumer(defaultConsumerDelay, 42, consumerEndProbe2.ref, consumerController2), s"consumer2-${idCount}") + consumerController2 ! ConsumerController.RegisterToProducerController(producerController) + + consumerEndProbe2.receiveMessage(5.seconds) + + testKit.stop(producer) + testKit.stop(producerController) + testKit.stop(consumerController) + } + + "allow replacement of producer" in { + nextId() + + val consumerProbe = createTestProbe[ConsumerController.Delivery[TestConsumer.Job]]() + val consumerController = + spawn(ConsumerController[TestConsumer.Job](), s"consumerController-${idCount}") + consumerController ! ConsumerController.Start(consumerProbe.ref) + + val producerController1 = + spawn(ProducerController[TestConsumer.Job](s"p-${idCount}", None), s"producerController1-${idCount}") + val producerProbe1 = createTestProbe[ProducerController.RequestNext[TestConsumer.Job]]() + producerController1 ! ProducerController.Start(producerProbe1.ref) + + producerController1 ! ProducerController.RegisterConsumer(consumerController) + + producerProbe1.receiveMessage().sendNextTo ! TestConsumer.Job("msg-1") + val delivery1 = consumerProbe.receiveMessage() + delivery1.message should ===(TestConsumer.Job("msg-1")) + delivery1.confirmTo ! ConsumerController.Confirmed + + producerProbe1.receiveMessage().sendNextTo ! TestConsumer.Job("msg-2") + val delivery2 = consumerProbe.receiveMessage() + delivery2.message should ===(TestConsumer.Job("msg-2")) + delivery2.confirmTo ! ConsumerController.Confirmed + + // replace producer + testKit.stop(producerController1) + val producerController2 = + spawn(ProducerController[TestConsumer.Job](s"p-${idCount}", None), s"producerController2-${idCount}") + val producerProbe2 = createTestProbe[ProducerController.RequestNext[TestConsumer.Job]]() + producerController2 ! ProducerController.Start(producerProbe2.ref) + producerController2 ! ProducerController.RegisterConsumer(consumerController) + + producerProbe2.receiveMessage().sendNextTo ! TestConsumer.Job("msg-3") + val delivery3 = consumerProbe.receiveMessage() + delivery3.message should ===(TestConsumer.Job("msg-3")) + delivery3.confirmTo ! ConsumerController.Confirmed + + producerProbe2.receiveMessage().sendNextTo ! TestConsumer.Job("msg-4") + val delivery4 = consumerProbe.receiveMessage() + delivery4.message should ===(TestConsumer.Job("msg-4")) + delivery4.confirmTo ! ConsumerController.Confirmed + + testKit.stop(producerController2) + testKit.stop(consumerController) + } + + } + +} diff --git a/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/TestConsumer.scala b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/TestConsumer.scala new file mode 100644 index 00000000000..bac1a3b18d0 --- /dev/null +++ b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/TestConsumer.scala @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2019-2020 Lightbend Inc. + */ + +package akka.actor.typed.delivery + +import scala.concurrent.duration.Duration +import scala.concurrent.duration.FiniteDuration +import scala.concurrent.duration._ + +import akka.actor.typed.ActorRef +import akka.actor.typed.Behavior +import ConsumerController.SequencedMessage +import akka.actor.typed.delivery.internal.ProducerControllerImpl +import akka.actor.typed.scaladsl.ActorContext +import akka.actor.typed.scaladsl.Behaviors + +object TestConsumer { + + final case class Job(payload: String) + sealed trait Command + final case class JobDelivery( + msg: Job, + confirmTo: ActorRef[ConsumerController.Confirmed], + producerId: String, + seqNr: Long) + extends Command + final case class SomeAsyncJob( + msg: Job, + confirmTo: ActorRef[ConsumerController.Confirmed], + producerId: String, + seqNr: Long) + extends Command + + final case class CollectedProducerIds(producerIds: Set[String]) + + val defaultConsumerDelay: FiniteDuration = 10.millis + + def sequencedMessage( + producerId: String, + n: Long, + producerController: ActorRef[ProducerController.Command[TestConsumer.Job]], + ack: Boolean = false): SequencedMessage[TestConsumer.Job] = { + ConsumerController.SequencedMessage(producerId, n, TestConsumer.Job(s"msg-$n"), first = n == 1, ack)( + producerController.unsafeUpcast[ProducerControllerImpl.InternalCommand]) + } + + def consumerEndCondition(seqNr: Long): TestConsumer.SomeAsyncJob => Boolean = { + case TestConsumer.SomeAsyncJob(_, _, _, nr) => nr >= seqNr + } + + def apply( + delay: FiniteDuration, + endSeqNr: Long, + endReplyTo: ActorRef[CollectedProducerIds], + controller: ActorRef[ConsumerController.Start[TestConsumer.Job]]): Behavior[Command] = + apply(delay, consumerEndCondition(endSeqNr), endReplyTo, controller) + + def apply( + delay: FiniteDuration, + endCondition: SomeAsyncJob => Boolean, + endReplyTo: ActorRef[CollectedProducerIds], + controller: ActorRef[ConsumerController.Start[TestConsumer.Job]]): Behavior[Command] = + Behaviors.setup[Command] { ctx => + new TestConsumer(ctx, delay, endCondition, endReplyTo, controller).active(Set.empty) + } + +} + +class TestConsumer( + ctx: ActorContext[TestConsumer.Command], + delay: FiniteDuration, + endCondition: TestConsumer.SomeAsyncJob => Boolean, + endReplyTo: ActorRef[TestConsumer.CollectedProducerIds], + controller: ActorRef[ConsumerController.Start[TestConsumer.Job]]) { + import TestConsumer._ + + ctx.setLoggerName("TestConsumer") + + private val deliverTo: ActorRef[ConsumerController.Delivery[Job]] = + ctx.messageAdapter(d => JobDelivery(d.message, d.confirmTo, d.producerId, d.seqNr)) + + controller ! ConsumerController.Start(deliverTo) + + private def active(processed: Set[(String, Long)]): Behavior[Command] = { + Behaviors.receive { (ctx, m) => + m match { + case JobDelivery(msg, confirmTo, producerId, seqNr) => + // confirmation can be later, asynchronously + if (delay == Duration.Zero) + ctx.self ! SomeAsyncJob(msg, confirmTo, producerId, seqNr) + else + // schedule to simulate slow consumer + ctx.scheduleOnce(10.millis, ctx.self, SomeAsyncJob(msg, confirmTo, producerId, seqNr)) + Behaviors.same + + case job @ SomeAsyncJob(_, confirmTo, producerId, seqNr) => + // when replacing producer the seqNr may start from 1 again + val cleanProcessed = + if (seqNr == 1L) processed.filterNot { case (pid, _) => pid == producerId } else processed + + if (cleanProcessed((producerId, seqNr))) + throw new RuntimeException(s"Received duplicate [($producerId,$seqNr)]") + ctx.log.info("processed [{}] from [{}]", seqNr, producerId) + confirmTo ! ConsumerController.Confirmed + + if (endCondition(job)) { + endReplyTo ! CollectedProducerIds(processed.map(_._1)) + Behaviors.stopped + } else + active(cleanProcessed + (producerId -> seqNr)) + } + } + } + +} diff --git a/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/TestDurableProducerQueue.scala b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/TestDurableProducerQueue.scala new file mode 100644 index 00000000000..2f1cc9cc58d --- /dev/null +++ b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/TestDurableProducerQueue.scala @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2019-2020 Lightbend Inc. + */ + +package akka.actor.typed.delivery + +import java.util.concurrent.atomic.AtomicReference + +import scala.concurrent.duration.Duration +import scala.concurrent.duration.FiniteDuration + +import akka.actor.testkit.typed.TestException +import akka.actor.typed.Behavior +import akka.actor.typed.SupervisorStrategy +import akka.actor.typed.scaladsl.ActorContext +import akka.actor.typed.scaladsl.Behaviors + +object TestDurableProducerQueue { + import DurableProducerQueue._ + def apply[A]( + delay: FiniteDuration, + stateHolder: AtomicReference[State[A]], + failWhen: Command[A] => Boolean): Behavior[Command[A]] = { + if (stateHolder.get() eq null) + stateHolder.set(State(1L, 0L, Map.empty, Vector.empty)) + + Behaviors + .supervise { + Behaviors.setup[Command[A]] { context => + context.setLoggerName("TestDurableProducerQueue") + val state = stateHolder.get() + context.log.info("Starting with seqNr [{}], confirmedSeqNr [{}]", state.currentSeqNr, state.confirmedSeqNr) + new TestDurableProducerQueue[A](context, delay, stateHolder, failWhen).active(state) + } + } + .onFailure(SupervisorStrategy.restartWithBackoff(delay, delay, 0.0)) + } + + def apply[A](delay: FiniteDuration, state: State[A]): Behavior[Command[A]] = { + apply(delay, new AtomicReference(state), _ => false) + } + + // using a fixed timestamp to simplify tests, not using the timestamps in the commands + val TestTimestamp: DurableProducerQueue.TimestampMillis = Long.MaxValue + +} + +class TestDurableProducerQueue[A]( + context: ActorContext[DurableProducerQueue.Command[A]], + delay: FiniteDuration, + stateHolder: AtomicReference[DurableProducerQueue.State[A]], + failWhen: DurableProducerQueue.Command[A] => Boolean) { + import DurableProducerQueue._ + import TestDurableProducerQueue.TestTimestamp + + private def active(state: State[A]): Behavior[Command[A]] = { + stateHolder.set(state) + Behaviors.receiveMessage { + case cmd: LoadState[A] @unchecked => + maybeFail(cmd) + if (delay == Duration.Zero) cmd.replyTo ! state else context.scheduleOnce(delay, cmd.replyTo, state) + Behaviors.same + + case cmd: StoreMessageSent[A] @unchecked => + if (cmd.sent.seqNr == state.currentSeqNr) { + context.log.info( + "StoreMessageSent seqNr [{}], confirmationQualifier [{}]", + cmd.sent.seqNr, + cmd.sent.confirmationQualifier) + maybeFail(cmd) + val reply = StoreMessageSentAck(cmd.sent.seqNr) + if (delay == Duration.Zero) cmd.replyTo ! reply else context.scheduleOnce(delay, cmd.replyTo, reply) + active( + state.copy( + currentSeqNr = cmd.sent.seqNr + 1, + unconfirmed = state.unconfirmed :+ cmd.sent.copy(timestampMillis = TestTimestamp))) + } else if (cmd.sent.seqNr == state.currentSeqNr - 1) { + // already stored, could be a retry after timout + context.log.info("Duplicate seqNr [{}], currentSeqNr [{}]", cmd.sent.seqNr, state.currentSeqNr) + val reply = StoreMessageSentAck(cmd.sent.seqNr) + if (delay == Duration.Zero) cmd.replyTo ! reply else context.scheduleOnce(delay, cmd.replyTo, reply) + Behaviors.same + } else { + // may happen after failure + context.log.info("Ignoring unexpected seqNr [{}], currentSeqNr [{}]", cmd.sent.seqNr, state.currentSeqNr) + Behaviors.unhandled // no reply, request will timeout + } + + case cmd: StoreMessageConfirmed[A] @unchecked => + context.log.info( + "StoreMessageConfirmed seqNr [{}], confirmationQualifier [{}]", + cmd.seqNr, + cmd.confirmationQualifier) + maybeFail(cmd) + val newUnconfirmed = state.unconfirmed.filterNot { u => + u.confirmationQualifier == cmd.confirmationQualifier && u.seqNr <= cmd.seqNr + } + val newHighestConfirmed = math.max(state.highestConfirmedSeqNr, cmd.seqNr) + active( + state.copy( + highestConfirmedSeqNr = newHighestConfirmed, + confirmedSeqNr = state.confirmedSeqNr.updated(cmd.confirmationQualifier, (cmd.seqNr, TestTimestamp)), + unconfirmed = newUnconfirmed)) + } + } + + private def maybeFail(cmd: Command[A]): Unit = { + if (failWhen(cmd)) + throw TestException(s"TestDurableProducerQueue failed at [$cmd]") + } + +} diff --git a/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/TestProducer.scala b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/TestProducer.scala new file mode 100644 index 00000000000..134e3c396b1 --- /dev/null +++ b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/TestProducer.scala @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2019-2020 Lightbend Inc. + */ + +package akka.actor.typed.delivery + +import scala.concurrent.duration.Duration +import scala.concurrent.duration.FiniteDuration +import scala.concurrent.duration._ + +import akka.actor.typed.ActorRef +import akka.actor.typed.Behavior +import akka.actor.typed.scaladsl.ActorContext +import akka.actor.typed.scaladsl.Behaviors + +object TestProducer { + + trait Command + final case class RequestNext(sendTo: ActorRef[TestConsumer.Job]) extends Command + private final case object Tick extends Command + + val defaultProducerDelay: FiniteDuration = 20.millis + + def apply( + delay: FiniteDuration, + producerController: ActorRef[ProducerController.Start[TestConsumer.Job]]): Behavior[Command] = { + Behaviors.setup { context => + context.setLoggerName("TestProducer") + val requestNextAdapter: ActorRef[ProducerController.RequestNext[TestConsumer.Job]] = + context.messageAdapter(req => RequestNext(req.sendNextTo)) + producerController ! ProducerController.Start(requestNextAdapter) + + if (delay == Duration.Zero) + activeNoDelay(1) // simulate fast producer + else { + Behaviors.withTimers { timers => + timers.startTimerWithFixedDelay(Tick, Tick, delay) + idle(0) + } + } + } + } + + private def idle(n: Int): Behavior[Command] = { + Behaviors.receiveMessage { + case Tick => Behaviors.same + case RequestNext(sendTo) => active(n + 1, sendTo) + } + } + + private def active(n: Int, sendTo: ActorRef[TestConsumer.Job]): Behavior[Command] = { + Behaviors.receive { (ctx, msg) => + msg match { + case Tick => + sendMessage(n, sendTo, ctx) + idle(n) + + case RequestNext(_) => + throw new IllegalStateException("Unexpected RequestNext, already got one.") + } + } + } + + private def activeNoDelay(n: Int): Behavior[Command] = { + Behaviors.receive { (ctx, msg) => + msg match { + case RequestNext(sendTo) => + sendMessage(n, sendTo, ctx) + activeNoDelay(n + 1) + } + } + } + + private def sendMessage(n: Int, sendTo: ActorRef[TestConsumer.Job], ctx: ActorContext[Command]): Unit = { + val msg = s"msg-$n" + ctx.log.info("sent {}", msg) + sendTo ! TestConsumer.Job(msg) + } +} diff --git a/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/TestProducerWithAsk.scala b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/TestProducerWithAsk.scala new file mode 100644 index 00000000000..8f9afa13377 --- /dev/null +++ b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/TestProducerWithAsk.scala @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2019-2020 Lightbend Inc. + */ + +package akka.actor.typed.delivery + +import scala.concurrent.duration.FiniteDuration +import scala.concurrent.duration._ +import scala.util.Failure +import scala.util.Success + +import akka.actor.typed.ActorRef +import akka.actor.typed.Behavior +import akka.actor.typed.scaladsl.Behaviors +import akka.util.Timeout + +object TestProducerWithAsk { + + trait Command + final case class RequestNext(askTo: ActorRef[ProducerController.MessageWithConfirmation[TestConsumer.Job]]) + extends Command + private case object Tick extends Command + private final case class Confirmed(seqNr: Long) extends Command + private case object AskTimeout extends Command + + private implicit val askTimeout: Timeout = 10.seconds + + def apply( + delay: FiniteDuration, + replyProbe: ActorRef[Long], + producerController: ActorRef[ProducerController.Start[TestConsumer.Job]]): Behavior[Command] = { + Behaviors.setup { context => + context.setLoggerName("TestProducerWithConfirmation") + val requestNextAdapter: ActorRef[ProducerController.RequestNext[TestConsumer.Job]] = + context.messageAdapter(req => RequestNext(req.askNextTo)) + producerController ! ProducerController.Start(requestNextAdapter) + + Behaviors.withTimers { timers => + timers.startTimerWithFixedDelay(Tick, Tick, delay) + idle(0, replyProbe) + } + } + } + + private def idle(n: Int, replyProbe: ActorRef[Long]): Behavior[Command] = { + Behaviors.receiveMessage { + case Tick => Behaviors.same + case RequestNext(sendTo) => active(n + 1, replyProbe, sendTo) + case Confirmed(seqNr) => + replyProbe ! seqNr + Behaviors.same + } + } + + private def active( + n: Int, + replyProbe: ActorRef[Long], + sendTo: ActorRef[ProducerController.MessageWithConfirmation[TestConsumer.Job]]): Behavior[Command] = { + Behaviors.receive { (ctx, msg) => + msg match { + case Tick => + val msg = s"msg-$n" + ctx.log.info("sent {}", msg) + ctx.ask( + sendTo, + (askReplyTo: ActorRef[Long]) => + ProducerController.MessageWithConfirmation(TestConsumer.Job(msg), askReplyTo)) { + case Success(seqNr) => Confirmed(seqNr) + case Failure(_) => AskTimeout + } + idle(n, replyProbe) + + case RequestNext(_) => + throw new IllegalStateException("Unexpected RequestNext, already got one.") + + case Confirmed(seqNr) => + ctx.log.info("Reply Confirmed [{}]", seqNr) + replyProbe ! seqNr + Behaviors.same + + case AskTimeout => + ctx.log.warn("Timeout") + Behaviors.same + } + } + } + +} diff --git a/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/TestProducerWorkPulling.scala b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/TestProducerWorkPulling.scala new file mode 100644 index 00000000000..80805ee054b --- /dev/null +++ b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/TestProducerWorkPulling.scala @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2019-2020 Lightbend Inc. + */ + +package akka.actor.typed.delivery + +import scala.concurrent.duration.FiniteDuration + +import akka.actor.typed.ActorRef +import akka.actor.typed.Behavior +import akka.actor.typed.scaladsl.Behaviors + +object TestProducerWorkPulling { + + trait Command + final case class RequestNext(sendTo: ActorRef[TestConsumer.Job]) extends Command + private final case object Tick extends Command + + def apply( + delay: FiniteDuration, + producerController: ActorRef[WorkPullingProducerController.Start[TestConsumer.Job]]): Behavior[Command] = { + Behaviors.setup { context => + context.setLoggerName("TestProducerWorkPulling") + val requestNextAdapter: ActorRef[WorkPullingProducerController.RequestNext[TestConsumer.Job]] = + context.messageAdapter(req => RequestNext(req.sendNextTo)) + producerController ! WorkPullingProducerController.Start(requestNextAdapter) + + Behaviors.withTimers { timers => + timers.startTimerWithFixedDelay(Tick, Tick, delay) + idle(0) + } + } + } + + private def idle(n: Int): Behavior[Command] = { + Behaviors.receiveMessage { + case Tick => Behaviors.same + case RequestNext(sendTo) => active(n + 1, sendTo) + } + } + + private def active(n: Int, sendTo: ActorRef[TestConsumer.Job]): Behavior[Command] = { + Behaviors.receive { (ctx, msg) => + msg match { + case Tick => + val msg = s"msg-$n" + ctx.log.info("sent {}", msg) + sendTo ! TestConsumer.Job(msg) + idle(n) + + case RequestNext(_) => + throw new IllegalStateException("Unexpected RequestNext, already got one.") + } + } + } + +} diff --git a/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/WorkPullingSpec.scala b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/WorkPullingSpec.scala new file mode 100644 index 00000000000..6ece36f5dee --- /dev/null +++ b/akka-actor-typed-tests/src/test/scala/akka/actor/typed/delivery/WorkPullingSpec.scala @@ -0,0 +1,278 @@ +/* + * Copyright (C) 2019-2020 Lightbend Inc. + */ + +package akka.actor.typed.delivery + +import scala.concurrent.duration._ + +import akka.Done +import akka.actor.testkit.typed.scaladsl.LogCapturing +import akka.actor.testkit.typed.scaladsl.ScalaTestWithActorTestKit +import akka.actor.typed.ActorRef +import akka.actor.typed.delivery.internal.ProducerControllerImpl +import akka.actor.typed.receptionist.Receptionist +import akka.actor.typed.receptionist.ServiceKey +import org.scalatest.wordspec.AnyWordSpecLike + +class WorkPullingSpec + extends ScalaTestWithActorTestKit(""" + akka.reliable-delivery.consumer-controller.flow-control-window = 20 + """) + with AnyWordSpecLike + with LogCapturing { + import TestConsumer.defaultConsumerDelay + import TestProducer.defaultProducerDelay + + private var idCount = 0 + private def nextId(): Int = { + idCount += 1 + idCount + } + + private def producerId: String = s"p-$idCount" + + private def awaitWorkersRegistered( + controller: ActorRef[WorkPullingProducerController.Command[TestConsumer.Job]], + count: Int): Unit = { + val probe = createTestProbe[WorkPullingProducerController.WorkerStats]() + probe.awaitAssert { + controller ! WorkPullingProducerController.GetWorkerStats(probe.ref) + probe.receiveMessage().numberOfWorkers should ===(count) + } + } + + val workerServiceKey: ServiceKey[ConsumerController.Command[TestConsumer.Job]] = ServiceKey("worker") + + "ReliableDelivery with work-pulling" must { + + "illustrate work-pulling usage" in { + nextId() + val workPullingController = + spawn( + WorkPullingProducerController[TestConsumer.Job](producerId, workerServiceKey, None), + s"workPullingController-${idCount}") + val jobProducer = + spawn(TestProducerWorkPulling(defaultProducerDelay, workPullingController), name = s"jobProducer-${idCount}") + + val consumerEndProbe1 = createTestProbe[TestConsumer.CollectedProducerIds]() + val workerController1 = + spawn(ConsumerController[TestConsumer.Job](workerServiceKey), s"workerController1-${idCount}") + spawn( + TestConsumer(defaultConsumerDelay, 42, consumerEndProbe1.ref, workerController1), + name = s"worker1-${idCount}") + + val consumerEndProbe2 = createTestProbe[TestConsumer.CollectedProducerIds]() + val workerController2 = + spawn(ConsumerController[TestConsumer.Job](workerServiceKey), s"workerController2-${idCount}") + spawn( + TestConsumer(defaultConsumerDelay, 42, consumerEndProbe2.ref, workerController2), + name = s"worker2-${idCount}") + + consumerEndProbe1.receiveMessage(10.seconds) + consumerEndProbe2.receiveMessage() + + testKit.stop(workerController1) + testKit.stop(workerController2) + awaitWorkersRegistered(workPullingController, 0) + testKit.stop(jobProducer) + testKit.stop(workPullingController) + } + + "resend unconfirmed to other if worker dies" in { + nextId() + val workPullingController = + spawn( + WorkPullingProducerController[TestConsumer.Job](producerId, workerServiceKey, None), + s"workPullingController-${idCount}") + val producerProbe = createTestProbe[WorkPullingProducerController.RequestNext[TestConsumer.Job]]() + workPullingController ! WorkPullingProducerController.Start(producerProbe.ref) + + val workerController1Probe = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + system.receptionist ! Receptionist.Register(workerServiceKey, workerController1Probe.ref) + awaitWorkersRegistered(workPullingController, 1) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-1") + val seqMsg1 = workerController1Probe.expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + seqMsg1.message should ===(TestConsumer.Job("msg-1")) + seqMsg1.producerController ! ProducerControllerImpl.Request(1L, 10L, true, false) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-2") + workerController1Probe + .expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + .message should ===(TestConsumer.Job("msg-2")) + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-3") + workerController1Probe + .expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + .message should ===(TestConsumer.Job("msg-3")) + + val workerController2Probe = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + system.receptionist ! Receptionist.Register(workerServiceKey, workerController2Probe.ref) + awaitWorkersRegistered(workPullingController, 2) + + workerController1Probe.stop() + awaitWorkersRegistered(workPullingController, 1) + + // msg-2 and msg3 were not confirmed and should be resent to another worker + val seqMsg2 = workerController2Probe.expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + seqMsg2.message should ===(TestConsumer.Job("msg-2")) + seqMsg2.seqNr should ===(1) + seqMsg2.producerController ! ProducerControllerImpl.Request(1L, 10L, true, false) + + workerController2Probe + .expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + .message should ===(TestConsumer.Job("msg-3")) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-4") + workerController2Probe + .expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + .message should ===(TestConsumer.Job("msg-4")) + + workerController2Probe.stop() + awaitWorkersRegistered(workPullingController, 0) + testKit.stop(workPullingController) + } + + "reply to MessageWithConfirmation" in { + import WorkPullingProducerController.MessageWithConfirmation + nextId() + val workPullingController = + spawn( + WorkPullingProducerController[TestConsumer.Job](producerId, workerServiceKey, None), + s"workPullingController-${idCount}") + val producerProbe = createTestProbe[WorkPullingProducerController.RequestNext[TestConsumer.Job]]() + workPullingController ! WorkPullingProducerController.Start(producerProbe.ref) + + val workerController1Probe = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + system.receptionist ! Receptionist.Register(workerServiceKey, workerController1Probe.ref) + awaitWorkersRegistered(workPullingController, 1) + + val replyProbe = createTestProbe[Done]() + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-1"), replyProbe.ref) + val seqMsg1 = workerController1Probe.expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + seqMsg1.message should ===(TestConsumer.Job("msg-1")) + seqMsg1.ack should ===(true) + seqMsg1.producerController ! ProducerControllerImpl.Request(1L, 10L, true, false) + replyProbe.receiveMessage() + + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-2"), replyProbe.ref) + val seqMsg2 = workerController1Probe.expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + seqMsg2.message should ===(TestConsumer.Job("msg-2")) + seqMsg2.ack should ===(true) + // no reply until ack + replyProbe.expectNoMessage() + seqMsg2.producerController ! ProducerControllerImpl.Ack(2L) + replyProbe.receiveMessage() + + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-3"), replyProbe.ref) + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-4"), replyProbe.ref) + workerController1Probe.receiveMessages(2) + seqMsg2.producerController ! ProducerControllerImpl.Ack(4L) + replyProbe.receiveMessages(2) + + workerController1Probe.stop() + awaitWorkersRegistered(workPullingController, 0) + testKit.stop(workPullingController) + } + + "reply to MessageWithConfirmation also when worker dies" in { + import WorkPullingProducerController.MessageWithConfirmation + nextId() + val workPullingController = + spawn( + WorkPullingProducerController[TestConsumer.Job](producerId, workerServiceKey, None), + s"workPullingController-${idCount}") + val producerProbe = createTestProbe[WorkPullingProducerController.RequestNext[TestConsumer.Job]]() + workPullingController ! WorkPullingProducerController.Start(producerProbe.ref) + + val workerController1Probe = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + system.receptionist ! Receptionist.Register(workerServiceKey, workerController1Probe.ref) + awaitWorkersRegistered(workPullingController, 1) + + val replyProbe = createTestProbe[Done]() + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-1"), replyProbe.ref) + val seqMsg1 = workerController1Probe.expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + seqMsg1.producerController ! ProducerControllerImpl.Request(1L, 10L, true, false) + replyProbe.receiveMessage() + + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-2"), replyProbe.ref) + workerController1Probe.receiveMessage() + seqMsg1.producerController ! ProducerControllerImpl.Ack(2L) + replyProbe.receiveMessage() + + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-3"), replyProbe.ref) + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation(TestConsumer.Job("msg-4"), replyProbe.ref) + workerController1Probe.receiveMessages(2) + + val workerController2Probe = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + system.receptionist ! Receptionist.Register(workerServiceKey, workerController2Probe.ref) + awaitWorkersRegistered(workPullingController, 2) + + workerController1Probe.stop() + awaitWorkersRegistered(workPullingController, 1) + replyProbe.expectNoMessage() + + // msg-3 and msg-4 were not confirmed and should be resent to another worker + val seqMsg3 = workerController2Probe.expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + seqMsg3.message should ===(TestConsumer.Job("msg-3")) + seqMsg3.seqNr should ===(1) + seqMsg3.producerController ! ProducerControllerImpl.Request(1L, 10L, true, false) + replyProbe.receiveMessage() + + workerController2Probe + .expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + .message should ===(TestConsumer.Job("msg-4")) + seqMsg3.producerController ! ProducerControllerImpl.Ack(2L) + replyProbe.receiveMessage() + + workerController2Probe.stop() + awaitWorkersRegistered(workPullingController, 0) + testKit.stop(workPullingController) + } + + "allow restart of producer" in { + nextId() + + val workPullingController = + spawn( + WorkPullingProducerController[TestConsumer.Job](producerId, workerServiceKey, None), + s"workPullingController-${idCount}") + val producerProbe = createTestProbe[WorkPullingProducerController.RequestNext[TestConsumer.Job]]() + workPullingController ! WorkPullingProducerController.Start(producerProbe.ref) + + val workerController1Probe = createTestProbe[ConsumerController.Command[TestConsumer.Job]]() + system.receptionist ! Receptionist.Register(workerServiceKey, workerController1Probe.ref) + awaitWorkersRegistered(workPullingController, 1) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-1") + val seqMsg1 = workerController1Probe.expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + seqMsg1.message should ===(TestConsumer.Job("msg-1")) + seqMsg1.producerController ! ProducerControllerImpl.Request(1L, 10L, true, false) + + producerProbe.receiveMessage().sendNextTo ! TestConsumer.Job("msg-2") + workerController1Probe + .expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + .message should ===(TestConsumer.Job("msg-2")) + producerProbe.receiveMessage() + + // restart producer, new Start + val producerProbe2 = createTestProbe[WorkPullingProducerController.RequestNext[TestConsumer.Job]]() + workPullingController ! WorkPullingProducerController.Start(producerProbe2.ref) + + producerProbe2.receiveMessage().sendNextTo ! TestConsumer.Job("msg-3") + workerController1Probe + .expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + .message should ===(TestConsumer.Job("msg-3")) + producerProbe2.receiveMessage().sendNextTo ! TestConsumer.Job("msg-4") + workerController1Probe + .expectMessageType[ConsumerController.SequencedMessage[TestConsumer.Job]] + .message should ===(TestConsumer.Job("msg-4")) + + testKit.stop(workPullingController) + } + + } + +} + +// TODO #28723 add a random test for work pulling diff --git a/akka-actor-typed/src/main/resources/reference.conf b/akka-actor-typed/src/main/resources/reference.conf index c92f7b16393..a3476814a31 100644 --- a/akka-actor-typed/src/main/resources/reference.conf +++ b/akka-actor-typed/src/main/resources/reference.conf @@ -64,3 +64,47 @@ akka.actor { # # This behavior can be disabled by setting this property to `off`. akka.use-slf4j = on + +akka.reliable-delivery { + producer-controller { + durable-queue { + # The ProducerController uses this timeout for the requests to + # the durable queue. If there is no reply within the timeout it + # will be retried. + request-timeout = 3s + + # The ProducerController retries requests to the durable queue this + # number of times before failing. + retry-attempts = 10 + } + } + + consumer-controller { + # Number of messages in flight between ProducerController and + # ConsumerController. The ConsumerController requests for more messages + # when half of the window has been used. + flow-control-window = 50 + + # The ConsumerController resends flow control messages to the + # ProducerController with this interval. + resend-interval = 1s + + # If this is enabled lost messages will not be resent, but flow control is used. + # This can be more efficient since messages don't have to be + # kept in memory in the `ProducerController` until they have been + # confirmed, but the drawback is that lost messages will not be delivered. + only-flow-control = false + } + + work-pulling { + producer-controller = ${akka.reliable-delivery.producer-controller} + producer-controller { + # Limit of how many messages that can be buffered when there + # is no demand from the consumer side. + buffer-size = 1000 + + # Ask timeout for sending message to worker until receiving Ack from worker + internal-ask-timeout = 60s + } + } +} diff --git a/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/ConsumerController.scala b/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/ConsumerController.scala new file mode 100644 index 00000000000..8a3ef514eab --- /dev/null +++ b/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/ConsumerController.scala @@ -0,0 +1,280 @@ +/* + * Copyright (C) 2019-2020 Lightbend Inc. + */ + +package akka.actor.typed.delivery + +import java.time.{ Duration => JavaDuration } + +import scala.concurrent.duration._ + +import akka.actor.DeadLetterSuppression +import akka.actor.typed.ActorRef +import akka.actor.typed.ActorSystem +import akka.actor.typed.Behavior +import akka.actor.typed.delivery.internal.ConsumerControllerImpl +import akka.actor.typed.delivery.internal.DeliverySerializable +import akka.actor.typed.delivery.internal.ProducerControllerImpl +import akka.actor.typed.receptionist.ServiceKey +import akka.actor.typed.scaladsl.Behaviors +import akka.annotation.ApiMayChange +import akka.annotation.DoNotInherit +import akka.annotation.InternalApi +import akka.util.JavaDurationConverters._ +import com.typesafe.config.Config + +/** + * `ConsumerController` and [[ProducerController]] or [[WorkPullingProducerController]] are used + * together. See the descriptions in those classes or the Akka reference documentation for + * how they are intended to be used. + * + * The destination consumer actor will start the flow by sending an initial [[ConsumerController.Start]] + * message to the `ConsumerController`. The `ActorRef` in the `Start` message is typically constructed + * as a message adapter to map the [[ConsumerController.Delivery]] to the protocol of the consumer actor. + * + * Received messages from the producer are wrapped in [[ConsumerController.Delivery]] when sent to the consumer, + * which is supposed to reply with [[ConsumerController.Confirmed]] when it has processed the message. + * Next message is not delivered until the previous is confirmed. + * More messages from the producer that arrive while waiting for the confirmation are stashed by + * the `ConsumerController` and delivered when previous message was confirmed. + * + * The consumer and the `ConsumerController` actors are supposed to be local so that these messages are fast + * and not lost. This is enforced by a runtime check. + * + * The `ConsumerController` is automatically stopped when the consumer that registered with the `Start` + * message is terminated. + */ +@ApiMayChange // TODO #28719 when removing ApiMayChange consider removing `case class` for some of the messages +object ConsumerController { + import ConsumerControllerImpl.UnsealedInternalCommand + + type SeqNr = Long + + sealed trait Command[+A] extends UnsealedInternalCommand + + /** + * Initial message from the consumer actor. The `deliverTo` is typically constructed + * as a message adapter to map the [[Delivery]] to the protocol of the consumer actor. + * + * If the producer is restarted it should send a new `Start` message to the + * `ConsumerController`. + */ + final case class Start[A](deliverTo: ActorRef[Delivery[A]]) extends Command[A] + + object Delivery { + def apply[A](message: A, confirmTo: ActorRef[Confirmed], producerId: String, seqNr: SeqNr): Delivery[A] = + new Delivery(message, confirmTo, producerId, seqNr) + + def unapply[A](delivery: Delivery[A]): Option[(A, ActorRef[Confirmed])] = + Option((delivery.message, delivery.confirmTo)) + } + + /** + * Received messages from the producer are wrapped in `Delivery` when sent to the consumer. + * When the message has been processed the consumer is supposed to send [[Confirmed]] back + * to the `ConsumerController` via the `confirmTo`. + */ + final class Delivery[A]( + val message: A, + val confirmTo: ActorRef[Confirmed], + val producerId: String, + val seqNr: SeqNr) { + override def toString: String = s"Delivery($message,$confirmTo,$producerId,$seqNr)" + } + + /** + * Java API: The generic `Class` type for `ConsumerController.Delivery` that can be used when creating a + * `messageAdapter` for `Class>`. + */ + def deliveryClass[A](): Class[Delivery[A]] = classOf[Delivery[A]] + + /** + * Java API: The generic `Class` type for `ConsumerController.Command` that can be used when creating a `ServiceKey` + * for `Class>`. + */ + def serviceKeyClass[A]: Class[Command[A]] = classOf[Command[A]] + + @DoNotInherit + trait Confirmed extends UnsealedInternalCommand + + /** + * When the message has been processed the consumer is supposed to send `Confirmed` back + * to the `ConsumerController` via the `confirmTo` in the [[Delivery]] message. + */ + case object Confirmed extends Confirmed + + /** + * Java API: the singleton instance of the Confirmed message. + * When the message has been processed the consumer is supposed to send `Confirmed` back + * to the `ConsumerController` via the `confirmTo` in the [[Delivery]] message. + */ + def confirmed(): Confirmed = Confirmed + + /** + * Register the `ConsumerController` to the given `producerController`. It will + * retry the registration until the `ProducerConsumer` has acknowledged by sending its + * first message. + * + * Alternatively, this registration can be done on the producer side with the + * [[ProducerController.RegisterConsumer]] message. + */ + final case class RegisterToProducerController[A](producerController: ActorRef[ProducerController.Command[A]]) + extends Command[A] + + final case class DeliverThenStop[A]() extends Command[A] + + /** + * This is used between the `ProducerController` and `ConsumerController`. Should rarely be used in + * application code but is public because it's in the signature for the `EntityTypeKey` when using + * `ShardingConsumerController`. + * + * In the future we may also make the custom `send` in `ProducerController` public to make it possible to + * wrap it or send it in other ways when building higher level abstractions that are using the `ProducerController`. + * That is used by `ShardingProducerController`. + */ + final case class SequencedMessage[A](producerId: String, seqNr: SeqNr, message: A, first: Boolean, ack: Boolean)( + /** INTERNAL API */ + @InternalApi private[akka] val producerController: ActorRef[ProducerControllerImpl.InternalCommand]) + extends Command[A] + with DeliverySerializable + with DeadLetterSuppression { + + /** INTERNAL API */ + @InternalApi private[akka] def asFirst: SequencedMessage[A] = + copy(first = true)(producerController) + } + + object Settings { + + /** + * Scala API: Factory method from config `akka.reliable-delivery.consumer-controller` + * of the `ActorSystem`. + */ + def apply(system: ActorSystem[_]): Settings = + apply(system.settings.config.getConfig("akka.reliable-delivery.consumer-controller")) + + /** + * Scala API: Factory method from Config corresponding to + * `akka.reliable-delivery.consumer-controller`. + */ + def apply(config: Config): Settings = { + new Settings( + flowControlWindow = config.getInt("flow-control-window"), + resendInterval = config.getDuration("resend-interval").asScala, + onlyFlowControl = config.getBoolean("only-flow-control")) + } + + /** + * Java API: Factory method from config `akka.reliable-delivery.producer-controller` + * of the `ActorSystem`. + */ + def create(system: ActorSystem[_]): Settings = + apply(system) + + /** + * Java API: Factory method from Config corresponding to + * `akka.reliable-delivery.producer-controller`. + */ + def create(config: Config): Settings = + apply(config) + } + + final class Settings private ( + val flowControlWindow: Int, + val resendInterval: FiniteDuration, + val onlyFlowControl: Boolean) { + + def withFlowControlWindow(newFlowControlWindow: Int): Settings = + copy(flowControlWindow = newFlowControlWindow) + + /** + * Scala API + */ + def withResendInterval(newResendInterval: FiniteDuration): Settings = + copy(resendInterval = newResendInterval) + + /** + * Java API + */ + def withResendInterval(newResendInterval: JavaDuration): Settings = + copy(resendInterval = newResendInterval.asScala) + + /** + * Java API + */ + def getResendInterval(): JavaDuration = + resendInterval.asJava + + def withOnlyFlowControl(newOnlyFlowControl: Boolean): Settings = + copy(onlyFlowControl = newOnlyFlowControl) + + /** + * Private copy method for internal use only. + */ + private def copy( + flowControlWindow: Int = flowControlWindow, + resendInterval: FiniteDuration = resendInterval, + onlyFlowControl: Boolean = onlyFlowControl) = + new Settings(flowControlWindow, resendInterval, onlyFlowControl) + + override def toString: String = + s"Settings($flowControlWindow, $resendInterval, $onlyFlowControl)" + } + + def apply[A](): Behavior[Command[A]] = + Behaviors.setup { context => + apply(serviceKey = None, Settings(context.system)) + } + + def apply[A](settings: Settings): Behavior[Command[A]] = + apply(serviceKey = None, settings) + + /** + * To be used with [[WorkPullingProducerController]]. It will register itself to the + * [[akka.actor.typed.receptionist.Receptionist]] with the given `serviceKey`, and the + * `WorkPullingProducerController` subscribes to the same key to find active workers. + */ + def apply[A](serviceKey: ServiceKey[Command[A]]): Behavior[Command[A]] = + Behaviors.setup { context => + apply(Some(serviceKey), Settings(context.system)) + } + + def apply[A](serviceKey: ServiceKey[Command[A]], settings: Settings): Behavior[Command[A]] = + apply(Some(serviceKey), settings) + + /** + * INTERNAL API + */ + @InternalApi private[akka] def apply[A]( + serviceKey: Option[ServiceKey[Command[A]]], + settings: Settings): Behavior[Command[A]] = { + ConsumerControllerImpl(serviceKey, settings) + } + + /** + * Java API + */ + def create[A](): Behavior[Command[A]] = + apply() + + /** + * Java API + */ + def create[A](settings: Settings): Behavior[Command[A]] = + apply(settings) + + /** + * Java API: To be used with [[WorkPullingProducerController]]. It will register itself to the + * [[akka.actor.typed.receptionist.Receptionist]] with the given `serviceKey`, and the + * `WorkPullingProducerController` subscribes to the same key to find active workers. + */ + def create[A](serviceKey: ServiceKey[Command[A]]): Behavior[Command[A]] = + apply(serviceKey) + + /** + * Java API + */ + def create[A](serviceKey: ServiceKey[Command[A]], settings: Settings): Behavior[Command[A]] = + apply(Some(serviceKey), settings) + +} diff --git a/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/DurableProducerQueue.scala b/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/DurableProducerQueue.scala new file mode 100644 index 00000000000..4f8ce85a4af --- /dev/null +++ b/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/DurableProducerQueue.scala @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2019-2020 Lightbend Inc. + */ + +package akka.actor.typed.delivery + +import scala.collection.immutable + +import akka.actor.typed.ActorRef +import akka.annotation.ApiMayChange +import akka.annotation.InternalApi + +import akka.actor.typed.delivery.internal.DeliverySerializable + +/** + * Actor message protocol for storing and confirming reliable delivery of messages. A [[akka.actor.typed.Behavior]] + * implementation of this protocol can optionally be used with [[ProducerController]] when messages shall survive + * a crash of the producer side. + * + * An implementation of this exists in `akka.persistence.typed.delivery.EventSourcedProducerQueue`. + */ +@ApiMayChange // TODO #28719 when removing ApiMayChange consider removing `case class` for some of the messages +object DurableProducerQueue { + + type SeqNr = Long + // Timestamp in millis since epoch, System.currentTimeMillis + type TimestampMillis = Long + + type ConfirmationQualifier = String + + val NoQualifier: ConfirmationQualifier = "" + + trait Command[A] + + /** + * Request that is used at startup to retrieve the unconfirmed messages and current sequence number. + */ + final case class LoadState[A](replyTo: ActorRef[State[A]]) extends Command[A] + + /** + * Store the fact that a message is to be sent. Replies with [[StoreMessageSentAck]] when + * the message has been successfully been stored. + * + * This command may be retied and the implementation should be idempotent, i.e. deduplicate + * already processed sequence numbers. + */ + final case class StoreMessageSent[A](sent: MessageSent[A], replyTo: ActorRef[StoreMessageSentAck]) extends Command[A] + + final case class StoreMessageSentAck(storedSeqNr: SeqNr) + + /** + * Store the fact that a message has been confirmed to be delivered and processed. + * + * This command may be retied and the implementation should be idempotent, i.e. deduplicate + * already processed sequence numbers. + */ + final case class StoreMessageConfirmed[A]( + seqNr: SeqNr, + confirmationQualifier: ConfirmationQualifier, + timestampMillis: TimestampMillis) + extends Command[A] + + object State { + def empty[A]: State[A] = State(1L, 0L, Map.empty, Vector.empty) + } + final case class State[A]( + currentSeqNr: SeqNr, + highestConfirmedSeqNr: SeqNr, + confirmedSeqNr: Map[ConfirmationQualifier, (SeqNr, TimestampMillis)], + unconfirmed: immutable.IndexedSeq[MessageSent[A]]) + extends DeliverySerializable + + /** + * INTERNAL API + */ + @InternalApi private[akka] sealed trait Event extends DeliverySerializable + + /** + * The fact (event) that a message has been sent. + */ + final case class MessageSent[A]( + seqNr: SeqNr, + message: A, + ack: Boolean, + confirmationQualifier: ConfirmationQualifier, + timestampMillis: TimestampMillis) + extends Event + + /** + * INTERNAL API: The fact (event) that a message has been confirmed to be delivered and processed. + */ + @InternalApi private[akka] final case class Confirmed( + seqNr: SeqNr, + confirmationQualifier: ConfirmationQualifier, + timestampMillis: TimestampMillis) + extends Event + + /** + * INTERNAL API: Remove entries related to the confirmationQualifiers that haven't been used for a while. + */ + @InternalApi private[akka] final case class Cleanup(confirmationQualifiers: Set[String]) extends Event + +} diff --git a/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/ProducerController.scala b/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/ProducerController.scala new file mode 100644 index 00000000000..e1562ffabc5 --- /dev/null +++ b/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/ProducerController.scala @@ -0,0 +1,263 @@ +/* + * Copyright (C) 2019-2020 Lightbend Inc. + */ + +package akka.actor.typed.delivery + +import java.time.{ Duration => JavaDuration } +import java.util.Optional + +import scala.compat.java8.OptionConverters._ +import scala.concurrent.duration._ +import scala.reflect.ClassTag + +import akka.actor.typed.ActorRef +import akka.actor.typed.ActorSystem +import akka.actor.typed.Behavior +import akka.actor.typed.delivery.internal.DeliverySerializable +import akka.actor.typed.delivery.internal.ProducerControllerImpl +import akka.actor.typed.scaladsl.Behaviors +import akka.annotation.ApiMayChange +import akka.annotation.InternalApi +import akka.util.JavaDurationConverters._ +import com.typesafe.config.Config + +/** + * Point-to-point reliable delivery between a single producer actor sending messages and a single consumer + * actor receiving the messages. Used together with [[ConsumerController]]. + * + * The producer actor will start the flow by sending a [[ProducerController.Start]] message to + * the `ProducerController`. The `ActorRef` in the `Start` message is typically constructed + * as a message adapter to map the [[ProducerController.RequestNext]] to the protocol of the + * producer actor. + * + * For the `ProducerController` to know where to send the messages it must be connected with the + * `ConsumerController`. You do this is with [[ProducerController.RegisterConsumer]] or + * [[ConsumerController.RegisterToProducerController]] messages. + * + * The `ProducerController` sends `RequestNext` to the producer, which is then allowed to send one + * message to the `ProducerController` via the `sendNextTo` in the `RequestNext`. Thereafter the + * producer will receive a new `RequestNext` when it's allowed to send one more message. + * + * The producer and `ProducerController` actors are supposed to be local so that these messages are + * fast and not lost. This is enforced by a runtime check. + * + * Many unconfirmed messages can be in flight between the `ProducerController` and `ConsumerController`. + * The flow control is driven by the consumer side, which means that the `ProducerController` will + * not send faster than the demand requested by the `ConsumerController`. + * + * Lost messages are detected, resent and deduplicated if needed. This is also driven by the consumer side, + * which means that the `ProducerController` will not push resends unless requested by the + * `ConsumerController`. + * + * Until sent messages have been confirmed the `ProducerController` keeps them in memory to be able to + * resend them. If the JVM of the `ProducerController` crashes those unconfirmed messages are lost. + * To make sure the messages can be delivered also in that scenario the `ProducerController` can be + * used with a [[DurableProducerQueue]]. Then the unconfirmed messages are stored in a durable way so + * that they can be redelivered when the producer is started again. An implementation of the + * `DurableProducerQueue` is provided by `EventSourcedProducerQueue` in `akka-persistence-typed`. + * + * Instead of using `tell` with the `sendNextTo` in the `RequestNext` the producer can use `context.ask` + * with the `askNextTo` in the `RequestNext`. The difference is that a reply is sent back when the + * message has been handled. If a `DurableProducerQueue` is used then the reply is sent when the message + * has been stored successfully, but it might not have been processed by the consumer yet. Otherwise the + * reply is sent after the consumer has processed and confirmed the message. + * + * If the consumer crashes a new `ConsumerController` can be connected to the original `ProducerConsumer` + * without restarting it. The `ProducerConsumer` will then redeliver all unconfirmed messages. + * + * It's also possible to use the `ProducerController` and `ConsumerController` without resending + * lost messages, but the flow control is still used. This can for example be useful when both consumer and + * producer are know to be located in the same local `ActorSystem`. This can be more efficient since messages + * don't have to be kept in memory in the `ProducerController` until they have been + * confirmed, but the drawback is that lost messages will not be delivered. See configuration + * `only-flow-control` of the `ConsumerController`. + * + * The `producerId` is used in logging and included as MDC entry with key `"producerId"`. It's propagated + * to the `ConsumerController` and is useful for correlating log messages. It can be any `String` but it's + * recommended to use a unique identifier of representing the producer. + */ +@ApiMayChange // TODO #28719 when removing ApiMayChange consider removing `case class` for some of the messages +object ProducerController { + import ProducerControllerImpl.UnsealedInternalCommand + + type SeqNr = Long + + sealed trait Command[A] extends UnsealedInternalCommand + + /** + * Initial message from the producer actor. The `producer` is typically constructed + * as a message adapter to map the [[RequestNext]] to the protocol of the producer actor. + * + * If the producer is restarted it should send a new `Start` message to the + * `ProducerController`. + */ + final case class Start[A](producer: ActorRef[RequestNext[A]]) extends Command[A] + + /** + * The `ProducerController` sends `RequestNext` to the producer when it is allowed to send one + * message via the `sendNextTo` or `askNextTo`. Note that only one message is allowed, and then + * it must wait for next `RequestNext` before sending one more message. + */ + final case class RequestNext[A]( + producerId: String, + currentSeqNr: SeqNr, + confirmedSeqNr: SeqNr, + sendNextTo: ActorRef[A], + askNextTo: ActorRef[MessageWithConfirmation[A]]) + + /** + * Java API: The generic `Class` type for `ProducerController.RequestNext` that can be used when creating a + * `messageAdapter` for `Class>`. + */ + def requestNextClass[A](): Class[RequestNext[A]] = classOf[RequestNext[A]] + + /** + * For sending confirmation message back to the producer when the message has been confirmed. + * Typically used with `context.ask` from the producer. + * + * If `DurableProducerQueue` is used the confirmation reply is sent when the message has been + * successfully stored, meaning that the actual delivery to the consumer may happen later. + * If `DurableProducerQueue` is not used the confirmation reply is sent when the message has been + * fully delivered, processed, and confirmed by the consumer. + */ + final case class MessageWithConfirmation[A](message: A, replyTo: ActorRef[SeqNr]) extends UnsealedInternalCommand + + /** + * Register the given `consumerController` to the `ProducerController`. + * + * Alternatively, this registration can be done on the consumer side with the + * [[ConsumerController.RegisterToProducerController]] message. + * + * When using a custom `send` function for the `ProducerController` this should not be used. + */ + final case class RegisterConsumer[A](consumerController: ActorRef[ConsumerController.Command[A]]) + extends Command[A] + with DeliverySerializable + + object Settings { + + /** + * Scala API: Factory method from config `akka.reliable-delivery.producer-controller` + * of the `ActorSystem`. + */ + def apply(system: ActorSystem[_]): Settings = + apply(system.settings.config.getConfig("akka.reliable-delivery.producer-controller")) + + /** + * Scala API: Factory method from Config corresponding to + * `akka.reliable-delivery.producer-controller`. + */ + def apply(config: Config): Settings = { + new Settings( + durableQueueRequestTimeout = config.getDuration("durable-queue.request-timeout").asScala, + durableQueueRetryAttempts = config.getInt("durable-queue.retry-attempts")) + } + + /** + * Java API: Factory method from config `akka.reliable-delivery.producer-controller` + * of the `ActorSystem`. + */ + def create(system: ActorSystem[_]): Settings = + apply(system) + + /** + * Java API: Factory method from Config corresponding to + * `akka.reliable-delivery.producer-controller`. + */ + def create(config: Config): Settings = + apply(config) + } + + final class Settings private (val durableQueueRequestTimeout: FiniteDuration, val durableQueueRetryAttempts: Int) { + + def withDurableQueueRetryAttempts(newDurableQueueRetryAttempts: Int): Settings = + copy(durableQueueRetryAttempts = newDurableQueueRetryAttempts) + + /** + * Scala API + */ + def withDurableQueueRequestTimeout(newDurableQueueRequestTimeout: FiniteDuration): Settings = + copy(durableQueueRequestTimeout = newDurableQueueRequestTimeout) + + /** + * Java API + */ + def withDurableQueueRequestTimeout(newDurableQueueRequestTimeout: JavaDuration): Settings = + copy(durableQueueRequestTimeout = newDurableQueueRequestTimeout.asScala) + + /** + * Java API + */ + def getDurableQueueRequestTimeout(): JavaDuration = + durableQueueRequestTimeout.asJava + + /** + * Private copy method for internal use only. + */ + private def copy( + durableQueueRequestTimeout: FiniteDuration = durableQueueRequestTimeout, + durableQueueRetryAttempts: Int = durableQueueRetryAttempts) = + new Settings(durableQueueRequestTimeout, durableQueueRetryAttempts) + + override def toString: String = + s"Settings($durableQueueRequestTimeout, $durableQueueRetryAttempts)" + } + + def apply[A: ClassTag]( + producerId: String, + durableQueueBehavior: Option[Behavior[DurableProducerQueue.Command[A]]]): Behavior[Command[A]] = { + Behaviors.setup { context => + ProducerControllerImpl(producerId, durableQueueBehavior, ProducerController.Settings(context.system)) + } + } + + def apply[A: ClassTag]( + producerId: String, + durableQueueBehavior: Option[Behavior[DurableProducerQueue.Command[A]]], + settings: Settings): Behavior[Command[A]] = { + ProducerControllerImpl(producerId, durableQueueBehavior, settings) + } + + /** + * INTERNAL API + * + * For custom `send` function. For example used with Sharding where the message must be wrapped in + * `ShardingEnvelope(SequencedMessage(msg))`. + * + * When this factory is used the [[RegisterConsumer]] is not needed. + * + * In the future we may make the custom `send` in `ProducerController` public to make it possible to + * wrap it or send it in other ways when building higher level abstractions that are using the `ProducerController`. + * That is used by `ShardingProducerController`. + */ + @InternalApi private[akka] def apply[A: ClassTag]( + producerId: String, + durableQueueBehavior: Option[Behavior[DurableProducerQueue.Command[A]]], + settings: Settings, + send: ConsumerController.SequencedMessage[A] => Unit): Behavior[Command[A]] = { + ProducerControllerImpl(producerId, durableQueueBehavior, settings, send) + } + + /** + * Java API + */ + def create[A]( + messageClass: Class[A], + producerId: String, + durableQueueBehavior: Optional[Behavior[DurableProducerQueue.Command[A]]]): Behavior[Command[A]] = { + apply(producerId, durableQueueBehavior.asScala)(ClassTag(messageClass)) + } + + /** + * Java API + */ + def create[A]( + messageClass: Class[A], + producerId: String, + durableQueueBehavior: Optional[Behavior[DurableProducerQueue.Command[A]]], + settings: Settings): Behavior[Command[A]] = { + apply(producerId, durableQueueBehavior.asScala, settings)(ClassTag(messageClass)) + } + +} diff --git a/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/WorkPullingProducerController.scala b/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/WorkPullingProducerController.scala new file mode 100644 index 00000000000..ffdde54b0ac --- /dev/null +++ b/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/WorkPullingProducerController.scala @@ -0,0 +1,240 @@ +/* + * Copyright (C) 2019-2020 Lightbend Inc. + */ + +package akka.actor.typed.delivery + +import java.util.Optional + +import scala.reflect.ClassTag +import scala.compat.java8.OptionConverters._ +import scala.concurrent.duration.FiniteDuration + +import akka.Done +import akka.actor.typed.ActorRef +import akka.actor.typed.ActorSystem +import akka.actor.typed.Behavior +import akka.actor.typed.delivery.internal.WorkPullingProducerControllerImpl +import akka.actor.typed.receptionist.ServiceKey +import akka.actor.typed.scaladsl.Behaviors +import akka.annotation.ApiMayChange +import akka.util.JavaDurationConverters._ +import com.typesafe.config.Config + +/** + * Work pulling is a pattern where several worker actors pull tasks in their own pace from + * a shared work manager instead of that the manager pushes work to the workers blindly + * without knowing their individual capacity and current availability. + * + * The `WorkPullingProducerController` can be used together with [[ConsumerController]] to + * implement the work pulling pattern. + * + * One important property is that the order of the messages should not matter, because each + * message is routed randomly to one of the workers with demand. In other words, two subsequent + * messages may be routed to two different workers and processed independent of each other. + * + * A worker actor (consumer) and its `ConsumerController` is dynamically registered to the + * `WorkPullingProducerController` via a [[ServiceKey]]. It will register itself to the + * * [[akka.actor.typed.receptionist.Receptionist]], and the `WorkPullingProducerController` + * subscribes to the same key to find active workers. In this way workers can be dynamically + * added or removed from any node in the cluster. + * + * The work manager (producer) actor will start the flow by sending a [[WorkPullingProducerController.Start]] + * message to the `WorkPullingProducerController`. The `ActorRef` in the `Start` message is + * typically constructed as a message adapter to map the [[WorkPullingProducerController.RequestNext]] + * to the protocol of the producer actor. + * + * The `WorkPullingProducerController` sends `RequestNext` to the producer, which is then allowed + * to send one message to the `WorkPullingProducerController` via the `sendNextTo` in the `RequestNext`. + * Thereafter the producer will receive a new `RequestNext` when it's allowed to send one more message. + * It will send a new `RequestNext` when there are demand from any worker. + * It's possible that all workers with demand are deregistered after the `RequestNext` is sent and before + * the actual messages is sent to the `WorkPullingProducerController`. In that case the message is + * buffered and will be delivered when a new worker is registered or when there is new demand. + * + * The producer and `WorkPullingProducerController` actors are supposed to be local so that these messages are + * fast and not lost. This is enforced by a runtime check. + * + * Many unconfirmed messages can be in flight between the `WorkPullingProducerController` and each + * `ConsumerController`. The flow control is driven by the consumer side, which means that the + * `WorkPullingProducerController` will not send faster than the demand requested by the workers. + * + * Lost messages are detected, resent and deduplicated if needed. This is also driven by the consumer side, + * which means that the `WorkPullingProducerController` will not push resends unless requested by the + * `ConsumerController`. + * + * If a worker crashes or is stopped gracefully the unconfirmed messages for that worker will be + * routed to other workers by the `WorkPullingProducerController`. This may result in that some messages + * may be processed more than once, by different workers. + * + * Until sent messages have been confirmed the `WorkPullingProducerController` keeps them in memory to be able to + * resend them. If the JVM of the `WorkPullingProducerController` crashes those unconfirmed messages are lost. + * To make sure the messages can be delivered also in that scenario the `WorkPullingProducerController` can be + * used with a [[DurableProducerQueue]]. Then the unconfirmed messages are stored in a durable way so + * that they can be redelivered when the producer is started again. An implementation of the + * `DurableProducerQueue` is provided by `EventSourcedProducerQueue` in `akka-persistence-typed`. + * + * Instead of using `tell` with the `sendNextTo` in the `RequestNext` the producer can use `context.ask` + * with the `askNextTo` in the `RequestNext`. The difference is that a reply is sent back when the + * message has been handled. If a `DurableProducerQueue` is used then the reply is sent when the message + * has been stored successfully, but it might not have been processed by the consumer yet. Otherwise the + * reply is sent after the consumer has processed and confirmed the message. + * + * It's also possible to use the `WorkPullingProducerController` and `ConsumerController` without resending + * lost messages, but the flow control is still used. This can for example be useful when both consumer and + * producer are know to be located in the same local `ActorSystem`. This can be more efficient since messages + * don't have to be kept in memory in the `ProducerController` until they have been + * confirmed, but the drawback is that lost messages will not be delivered. See configuration + * `only-flow-control` of the `ConsumerController`. + * + * The `producerId` is used in logging and included as MDC entry with key `"producerId"`. It's propagated + * to the `ConsumerController` and is useful for correlating log messages. It can be any `String` but it's + * recommended to use a unique identifier of representing the producer. + */ +@ApiMayChange // TODO #28719 when removing ApiMayChange consider removing `case class` for some of the messages +object WorkPullingProducerController { + + import WorkPullingProducerControllerImpl.UnsealedInternalCommand + + sealed trait Command[A] extends UnsealedInternalCommand + + /** + * Initial message from the producer actor. The `producer` is typically constructed + * as a message adapter to map the [[RequestNext]] to the protocol of the producer actor. + * + * If the producer is restarted it should send a new `Start` message to the + * `WorkPullingProducerController`. + */ + final case class Start[A](producer: ActorRef[RequestNext[A]]) extends Command[A] + + /** + * The `WorkPullingProducerController` sends `RequestNext` to the producer when it is allowed to send one + * message via the `sendNextTo` or `askNextTo`. Note that only one message is allowed, and then + * it must wait for next `RequestNext` before sending one more message. + */ + final case class RequestNext[A](sendNextTo: ActorRef[A], askNextTo: ActorRef[MessageWithConfirmation[A]]) + + /** + * Java API: The generic `Class` type for `WorkPullingProducerController.RequestNext` that can be used when + * creating a `messageAdapter` for `Class>`. + */ + def requestNextClass[A](): Class[RequestNext[A]] = classOf[RequestNext[A]] + + /** + * For sending confirmation message back to the producer when the message has been fully delivered, processed, + * and confirmed by the consumer. Typically used with `context.ask` from the producer. + */ + final case class MessageWithConfirmation[A](message: A, replyTo: ActorRef[Done]) extends UnsealedInternalCommand + + /** + * Retrieve information about registered workers. + */ + final case class GetWorkerStats[A](replyTo: ActorRef[WorkerStats]) extends Command[A] + + final case class WorkerStats(numberOfWorkers: Int) + + object Settings { + + /** + * Scala API: Factory method from config `akka.reliable-delivery.work-pulling.producer-controller` + * of the `ActorSystem`. + */ + def apply(system: ActorSystem[_]): Settings = + apply(system.settings.config.getConfig("akka.reliable-delivery.work-pulling.producer-controller")) + + /** + * Scala API: Factory method from Config corresponding to + * `akka.reliable-delivery.work-pulling.producer-controller`. + */ + def apply(config: Config): Settings = { + new Settings( + bufferSize = config.getInt("buffer-size"), + config.getDuration("internal-ask-timeout").asScala, + ProducerController.Settings(config)) + } + + /** + * Java API: Factory method from config `akka.reliable-delivery.work-pulling.producer-controller` + * of the `ActorSystem`. + */ + def create(system: ActorSystem[_]): Settings = + apply(system) + + /** + * Java API: Factory method from Config corresponding to + * `akka.reliable-delivery.work-pulling.producer-controller`. + */ + def create(config: Config): Settings = + apply(config) + } + + final class Settings private ( + val bufferSize: Int, + val internalAskTimeout: FiniteDuration, + val producerControllerSettings: ProducerController.Settings) { + + def withBufferSize(newBufferSize: Int): Settings = + copy(bufferSize = newBufferSize) + + def withInternalAskTimeout(newInternalAskTimeout: FiniteDuration): Settings = + copy(internalAskTimeout = newInternalAskTimeout) + + def withInternalAskTimeout(newInternalAskTimeout: java.time.Duration): Settings = + copy(internalAskTimeout = newInternalAskTimeout.asScala) + + def withProducerControllerSettings(newProducerControllerSettings: ProducerController.Settings): Settings = + copy(producerControllerSettings = newProducerControllerSettings) + + /** + * Private copy method for internal use only. + */ + private def copy( + bufferSize: Int = bufferSize, + internalAskTimeout: FiniteDuration = internalAskTimeout, + producerControllerSettings: ProducerController.Settings = producerControllerSettings) = + new Settings(bufferSize, internalAskTimeout, producerControllerSettings) + + override def toString: String = + s"Settings($bufferSize,$internalAskTimeout,$producerControllerSettings)" + } + + def apply[A: ClassTag]( + producerId: String, + workerServiceKey: ServiceKey[ConsumerController.Command[A]], + durableQueueBehavior: Option[Behavior[DurableProducerQueue.Command[A]]]): Behavior[Command[A]] = { + Behaviors.setup { context => + WorkPullingProducerControllerImpl(producerId, workerServiceKey, durableQueueBehavior, Settings(context.system)) + } + } + + def apply[A: ClassTag]( + producerId: String, + workerServiceKey: ServiceKey[ConsumerController.Command[A]], + durableQueueBehavior: Option[Behavior[DurableProducerQueue.Command[A]]], + settings: Settings): Behavior[Command[A]] = { + WorkPullingProducerControllerImpl(producerId, workerServiceKey, durableQueueBehavior, settings) + } + + /** + * Java API + */ + def create[A]( + messageClass: Class[A], + producerId: String, + workerServiceKey: ServiceKey[ConsumerController.Command[A]], + durableQueueBehavior: Optional[Behavior[DurableProducerQueue.Command[A]]]): Behavior[Command[A]] = { + apply(producerId, workerServiceKey, durableQueueBehavior.asScala)(ClassTag(messageClass)) + } + + /** + * Java API + */ + def apply[A: ClassTag]( + messageClass: Class[A], + producerId: String, + workerServiceKey: ServiceKey[ConsumerController.Command[A]], + durableQueueBehavior: Optional[Behavior[DurableProducerQueue.Command[A]]], + settings: Settings): Behavior[Command[A]] = { + apply(producerId, workerServiceKey, durableQueueBehavior.asScala, settings)(ClassTag(messageClass)) + } +} diff --git a/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/internal/ConsumerControllerImpl.scala b/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/internal/ConsumerControllerImpl.scala new file mode 100644 index 00000000000..80c2b08cacb --- /dev/null +++ b/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/internal/ConsumerControllerImpl.scala @@ -0,0 +1,586 @@ +/* + * Copyright (C) 2019-2020 Lightbend Inc. + */ + +package akka.actor.typed.delivery.internal + +import akka.actor.typed.ActorRef +import akka.actor.typed.Behavior +import akka.actor.typed.PostStop +import akka.actor.typed.delivery.ConsumerController +import akka.actor.typed.delivery.ConsumerController.DeliverThenStop +import akka.actor.typed.delivery.ProducerController +import akka.actor.typed.receptionist.Receptionist +import akka.actor.typed.receptionist.ServiceKey +import akka.actor.typed.scaladsl.ActorContext +import akka.actor.typed.scaladsl.Behaviors +import akka.actor.typed.scaladsl.LoggerOps +import akka.actor.typed.scaladsl.StashBuffer +import akka.actor.typed.scaladsl.TimerScheduler +import akka.annotation.InternalApi + +/** + * INTERNAL API + * + * ==== Design notes ==== + * + * The destination consumer will start the flow by sending an initial `Start` message + * to the `ConsumerController`. + * + * The `ProducerController` sends the first message to the `ConsumerController` without waiting for + * a `Request` from the `ConsumerController`. The main reason for this is that when used with + * Cluster Sharding the first message will typically create the `ConsumerController`. It's + * also a way to connect the ProducerController and ConsumerController in a dynamic way, for + * example when the ProducerController is replaced. + * + * The `ConsumerController` sends [[ProducerControllerImpl.Request]] to the `ProducerController` + * to specify it's ready to receive up to the requested sequence number. + * + * The `ConsumerController` sends the first `Request` when it receives the first `SequencedMessage` + * and has received the `Start` message from the consumer. + * + * It sends new `Request` when half of the requested window is remaining, but it also retries + * the `Request` if no messages are received because that could be caused by lost messages. + * + * Apart from the first message the producer will not send more messages than requested. + * + * Received messages are wrapped in [[ConsumerController.Delivery]] when sent to the consumer, + * which is supposed to reply with [[ConsumerController.Confirmed]] when it has processed the message. + * Next message is not delivered until the previous is confirmed. + * More messages from the producer that arrive while waiting for the confirmation are stashed by + * the `ConsumerController` and delivered when previous message was confirmed. + * + * In other words, the "request" protocol to the application producer and consumer is one-by-one, but + * between the `ProducerController` and `ConsumerController` it's window of messages in flight. + * + * The consumer and the `ConsumerController` are supposed to be local so that these messages are fast and not lost. + * + * If the `ConsumerController` receives a message with unexpected sequence number (not previous + 1) + * it sends [[ProducerControllerImpl.Resend]] to the `ProducerController` and will ignore all messages until + * the expected sequence number arrives. + */ +@InternalApi private[akka] object ConsumerControllerImpl { + import ConsumerController.Command + import ConsumerController.RegisterToProducerController + import ConsumerController.SeqNr + import ConsumerController.SequencedMessage + import ConsumerController.Start + + sealed trait InternalCommand + + /** For commands defined in public ConsumerController */ + trait UnsealedInternalCommand extends InternalCommand + + private final case object Retry extends InternalCommand + + private final case class ConsumerTerminated(consumer: ActorRef[_]) extends InternalCommand + + private final case class State[A]( + producerController: ActorRef[ProducerControllerImpl.InternalCommand], + consumer: ActorRef[ConsumerController.Delivery[A]], + receivedSeqNr: SeqNr, + confirmedSeqNr: SeqNr, + requestedSeqNr: SeqNr, + registering: Option[ActorRef[ProducerController.Command[A]]], + stopping: Boolean) { + + def isNextExpected(seqMsg: SequencedMessage[A]): Boolean = + seqMsg.seqNr == receivedSeqNr + 1 + + def isProducerChanged(seqMsg: SequencedMessage[A]): Boolean = + seqMsg.producerController != producerController || receivedSeqNr == 0 + + def updatedRegistering(seqMsg: SequencedMessage[A]): Option[ActorRef[ProducerController.Command[A]]] = { + registering match { + case None => None + case s @ Some(reg) => if (seqMsg.producerController == reg) None else s + } + } + } + + def apply[A]( + serviceKey: Option[ServiceKey[Command[A]]], + settings: ConsumerController.Settings): Behavior[Command[A]] = { + Behaviors + .withStash[InternalCommand](settings.flowControlWindow) { stashBuffer => + Behaviors.setup { context => + Behaviors.withMdc(msg => mdcForMessage(msg)) { + context.setLoggerName("akka.actor.typed.delivery.ConsumerController") + serviceKey.foreach { key => + context.system.receptionist ! Receptionist.Register(key, context.self) + } + Behaviors.withTimers { timers => + // wait for the `Start` message from the consumer, SequencedMessage will be stashed + def waitForStart( + registering: Option[ActorRef[ProducerController.Command[A]]]): Behavior[InternalCommand] = { + Behaviors.receiveMessagePartial { + case reg: RegisterToProducerController[A] @unchecked => + reg.producerController ! ProducerController.RegisterConsumer(context.self) + waitForStart(Some(reg.producerController)) + + case s: Start[A] @unchecked => + ConsumerControllerImpl.enforceLocalConsumer(s.deliverTo) + context.watchWith(s.deliverTo, ConsumerTerminated(s.deliverTo)) + + val activeBehavior = + new ConsumerControllerImpl[A](context, timers, stashBuffer, settings) + .active(initialState(context, s, registering)) + context.log.debug("Received Start, unstash [{}] messages.", stashBuffer.size) + stashBuffer.unstashAll(activeBehavior) + + case seqMsg: SequencedMessage[A] @unchecked => + stashBuffer.stash(seqMsg) + Behaviors.same + + case d: DeliverThenStop[_] => + if (stashBuffer.isEmpty) { + Behaviors.stopped + } else { + stashBuffer.stash(d) + Behaviors.same + } + + case Retry => + registering.foreach { reg => + context.log.debug("Retry sending RegisterConsumer to [{}].", reg) + reg ! ProducerController.RegisterConsumer(context.self) + } + Behaviors.same + + case ConsumerTerminated(c) => + context.log.debug("Consumer [{}] terminated.", c) + Behaviors.stopped + + } + + } + + timers.startTimerWithFixedDelay(Retry, Retry, settings.resendInterval) + waitForStart(None) + } + } + } + } + .narrow // expose Command, but not InternalCommand + } + + private def mdcForMessage(msg: InternalCommand): Map[String, String] = { + msg match { + case seqMsg: SequencedMessage[_] => Map("producerId" -> seqMsg.producerId) + case _ => Map.empty + } + } + + private def initialState[A]( + context: ActorContext[InternalCommand], + start: Start[A], + registering: Option[ActorRef[ProducerController.Command[A]]]): State[A] = { + State( + producerController = context.system.deadLetters, + start.deliverTo, + receivedSeqNr = 0, + confirmedSeqNr = 0, + requestedSeqNr = 0, + registering, + stopping = false) + } + + def enforceLocalConsumer(ref: ActorRef[_]): Unit = { + if (ref.path.address.hasGlobalScope) + throw new IllegalArgumentException(s"Consumer [$ref] should be local.") + } +} + +private class ConsumerControllerImpl[A]( + context: ActorContext[ConsumerControllerImpl.InternalCommand], + timers: TimerScheduler[ConsumerControllerImpl.InternalCommand], + stashBuffer: StashBuffer[ConsumerControllerImpl.InternalCommand], + settings: ConsumerController.Settings) { + + import ConsumerController.Confirmed + import ConsumerController.Delivery + import ConsumerController.RegisterToProducerController + import ConsumerController.SequencedMessage + import ConsumerController.Start + import ConsumerControllerImpl._ + import ProducerControllerImpl.Ack + import ProducerControllerImpl.Request + import ProducerControllerImpl.Resend + import settings.flowControlWindow + + startRetryTimer() + + private def resendLost = !settings.onlyFlowControl + + // Expecting a SequencedMessage from ProducerController, that will be delivered to the consumer if + // the seqNr is right. + private def active(s: State[A]): Behavior[InternalCommand] = { + Behaviors + .receiveMessage[InternalCommand] { + case seqMsg: SequencedMessage[A] => + val pid = seqMsg.producerId + val seqNr = seqMsg.seqNr + val expectedSeqNr = s.receivedSeqNr + 1 + + if (s.isProducerChanged(seqMsg)) { + if (seqMsg.first) + context.log.trace("Received first SequencedMessage seqNr [{}], delivering to consumer.", seqNr) + receiveChangedProducer(s, seqMsg) + } else if (s.registering.isDefined) { + context.log.debug( + "Received SequencedMessage seqNr [{}], discarding message because registering to new ProducerController.", + seqNr) + Behaviors.same + } else if (s.isNextExpected(seqMsg)) { + context.log.trace("Received SequencedMessage seqNr [{}], delivering to consumer.", seqNr) + deliver(s.copy(receivedSeqNr = seqNr), seqMsg) + } else if (seqNr > expectedSeqNr) { + context.log.debugN( + "Received SequencedMessage seqNr [{}], but expected [{}], {}.", + seqNr, + expectedSeqNr, + if (resendLost) "requesting resend from expected seqNr" else "delivering to consumer anyway") + if (resendLost) { + seqMsg.producerController ! Resend(fromSeqNr = expectedSeqNr) + resending(s) + } else { + s.consumer ! Delivery(seqMsg.message, context.self, pid, seqNr) + waitingForConfirmation(s.copy(receivedSeqNr = seqNr), seqMsg) + } + } else { // seqNr < expectedSeqNr + context.log.debug2("Received duplicate SequencedMessage seqNr [{}], expected [{}].", seqNr, expectedSeqNr) + if (seqMsg.first) + active(retryRequest(s)) + else + Behaviors.same + } + + case Retry => + receiveRetry(s, () => active(retryRequest(s))) + + case Confirmed => + receiveUnexpectedConfirmed() + + case start: Start[A] => + receiveStart(s, start, newState => active(newState)) + + case ConsumerTerminated(c) => + receiveConsumerTerminated(c) + + case reg: RegisterToProducerController[A] => + receiveRegisterToProducerController(s, reg, newState => active(newState)) + + case _: DeliverThenStop[_] => + receiveDeliverThenStop(s, newState => active(newState)) + + case _: UnsealedInternalCommand => + Behaviors.unhandled + } + .receiveSignal { + case (_, PostStop) => postStop(s) + } + } + + private def receiveChangedProducer(s: State[A], seqMsg: SequencedMessage[A]): Behavior[InternalCommand] = { + val seqNr = seqMsg.seqNr + + if (seqMsg.first || !resendLost) { + logChangedProducer(s, seqMsg) + + val newRequestedSeqNr = seqMsg.seqNr - 1 + flowControlWindow + context.log.debug("Sending Request with requestUpToSeqNr [{}] after first SequencedMessage.", newRequestedSeqNr) + seqMsg.producerController ! Request(confirmedSeqNr = 0L, newRequestedSeqNr, resendLost, viaTimeout = false) + + deliver( + s.copy( + producerController = seqMsg.producerController, + receivedSeqNr = seqNr, + confirmedSeqNr = 0L, + requestedSeqNr = newRequestedSeqNr, + registering = s.updatedRegistering(seqMsg)), + seqMsg) + } else if (s.receivedSeqNr == 0) { + // needed for sharding + context.log.debug( + "Received SequencedMessage seqNr [{}], from new producer producer [{}] but it wasn't first. Resending.", + seqNr, + seqMsg.producerController) + // request resend of all unconfirmed, and mark first + seqMsg.producerController ! Resend(0) + resending(s) + } else { + context.log.warnN( + "Received SequencedMessage seqNr [{}], discarding message because it was from unexpected " + + "producer [{}] when expecting [{}].", + seqNr, + seqMsg.producerController, + s.producerController) + Behaviors.same + } + + } + + private def logChangedProducer(s: State[A], seqMsg: SequencedMessage[A]): Unit = { + if (s.producerController == context.system.deadLetters) { + context.log.debugN( + "Associated with new ProducerController [{}], seqNr [{}].", + seqMsg.producerController, + seqMsg.seqNr) + } else { + context.log.debugN( + "Changing ProducerController from [{}] to [{}], seqNr [{}].", + s.producerController, + seqMsg.producerController, + seqMsg.seqNr) + } + } + + // It has detected a missing seqNr and requested a Resend. Expecting a SequencedMessage from the + // ProducerController with the missing seqNr. Other SequencedMessage with different seqNr will be + // discarded since they were in flight before the Resend request and will anyway be sent again. + private def resending(s: State[A]): Behavior[InternalCommand] = { + Behaviors + .receiveMessage[InternalCommand] { + case seqMsg: SequencedMessage[A] => + val seqNr = seqMsg.seqNr + + if (s.isProducerChanged(seqMsg)) { + if (seqMsg.first) + context.log.trace("Received first SequencedMessage seqNr [{}], delivering to consumer.", seqNr) + receiveChangedProducer(s, seqMsg) + } else if (s.registering.isDefined) { + context.log.debug( + "Received SequencedMessage seqNr [{}], discarding message because registering to new ProducerController.", + seqNr) + Behaviors.same + } else if (s.isNextExpected(seqMsg)) { + context.log.debug("Received missing SequencedMessage seqNr [{}].", seqNr) + deliver(s.copy(receivedSeqNr = seqNr), seqMsg) + } else { + context.log.debug2( + "Received SequencedMessage seqNr [{}], discarding message because waiting for [{}].", + seqNr, + s.receivedSeqNr + 1) + if (seqMsg.first) + retryRequest(s) + Behaviors.same // ignore until we receive the expected + } + + case Retry => + receiveRetry( + s, + () => { + // in case the Resend message was lost + context.log.debug("Retry sending Resend [{}].", s.receivedSeqNr + 1) + s.producerController ! Resend(fromSeqNr = s.receivedSeqNr + 1) + Behaviors.same + }) + + case Confirmed => + receiveUnexpectedConfirmed() + + case start: Start[A] => + receiveStart(s, start, newState => resending(newState)) + + case ConsumerTerminated(c) => + receiveConsumerTerminated(c) + + case reg: RegisterToProducerController[A] => + receiveRegisterToProducerController(s, reg, newState => active(newState)) + + case _: DeliverThenStop[_] => + receiveDeliverThenStop(s, newState => resending(newState)) + + case _: UnsealedInternalCommand => + Behaviors.unhandled + } + .receiveSignal { + case (_, PostStop) => postStop(s) + } + } + + private def deliver(s: State[A], seqMsg: SequencedMessage[A]): Behavior[InternalCommand] = { + s.consumer ! Delivery(seqMsg.message, context.self, seqMsg.producerId, seqMsg.seqNr) + waitingForConfirmation(s, seqMsg) + } + + // The message has been delivered to the consumer and it is now waiting for Confirmed from + // the consumer. New SequencedMessage from the ProducerController will be stashed. + private def waitingForConfirmation(s: State[A], seqMsg: SequencedMessage[A]): Behavior[InternalCommand] = { + Behaviors + .receiveMessage[InternalCommand] { + case Confirmed => + val seqNr = seqMsg.seqNr + context.log.trace("Received Confirmed seqNr [{}] from consumer, stashed size [{}].", seqNr, stashBuffer.size) + + val newRequestedSeqNr = + if (seqMsg.first) { + // confirm the first message immediately to cancel resending of first + val newRequestedSeqNr = seqNr - 1 + flowControlWindow + context.log.debug( + "Sending Request after first with confirmedSeqNr [{}], requestUpToSeqNr [{}].", + seqNr, + newRequestedSeqNr) + s.producerController ! Request(confirmedSeqNr = seqNr, newRequestedSeqNr, resendLost, viaTimeout = false) + newRequestedSeqNr + } else if ((s.requestedSeqNr - seqNr) == flowControlWindow / 2) { + val newRequestedSeqNr = s.requestedSeqNr + flowControlWindow / 2 + context.log.debug( + "Sending Request with confirmedSeqNr [{}], requestUpToSeqNr [{}].", + seqNr, + newRequestedSeqNr) + s.producerController ! Request(confirmedSeqNr = seqNr, newRequestedSeqNr, resendLost, viaTimeout = false) + startRetryTimer() // reset interval since Request was just sent + newRequestedSeqNr + } else { + if (seqMsg.ack) { + context.log.trace("Sending Ack seqNr [{}].", seqNr) + s.producerController ! Ack(confirmedSeqNr = seqNr) + } + s.requestedSeqNr + } + + if (s.stopping && stashBuffer.isEmpty) { + context.log.debug("Stopped at seqNr [{}], after delivery of buffered messages.", seqNr) + Behaviors.stopped { () => + // best effort to Ack latest confirmed when stopping + s.producerController ! Ack(seqNr) + } + } else { + // FIXME #28718 can we use unstashOne instead of all? + stashBuffer.unstashAll(active(s.copy(confirmedSeqNr = seqNr, requestedSeqNr = newRequestedSeqNr))) + } + + case msg: SequencedMessage[A] => + if (msg.seqNr == seqMsg.seqNr && msg.producerController == seqMsg.producerController) { + context.log.debug("Received duplicate SequencedMessage seqNr [{}].", msg.seqNr) + } else if (stashBuffer.isFull) { + // possible that the stash is full if ProducerController resends unconfirmed (duplicates) + // dropping them since they can be resent + context.log.debug( + "Received SequencedMessage seqNr [{}], discarding message because stash is full.", + msg.seqNr) + } else { + context.log.trace( + "Received SequencedMessage seqNr [{}], stashing while waiting for consumer to confirm [{}].", + msg.seqNr, + seqMsg.seqNr) + stashBuffer.stash(msg) + } + Behaviors.same + + case Retry => + receiveRetry(s, () => waitingForConfirmation(retryRequest(s), seqMsg)) + + case start: Start[A] => + start.deliverTo ! Delivery(seqMsg.message, context.self, seqMsg.producerId, seqMsg.seqNr) + receiveStart(s, start, newState => waitingForConfirmation(newState, seqMsg)) + + case ConsumerTerminated(c) => + receiveConsumerTerminated(c) + + case reg: RegisterToProducerController[A] => + receiveRegisterToProducerController(s, reg, newState => waitingForConfirmation(newState, seqMsg)) + + case _: DeliverThenStop[_] => + receiveDeliverThenStop(s, newState => waitingForConfirmation(newState, seqMsg)) + + case _: UnsealedInternalCommand => + Behaviors.unhandled + } + .receiveSignal { + case (_, PostStop) => postStop(s) + } + } + + private def receiveRetry(s: State[A], nextBehavior: () => Behavior[InternalCommand]): Behavior[InternalCommand] = { + s.registering match { + case None => nextBehavior() + case Some(reg) => + reg ! ProducerController.RegisterConsumer(context.self) + Behaviors.same + } + } + + private def receiveStart( + s: State[A], + start: Start[A], + nextBehavior: State[A] => Behavior[InternalCommand]): Behavior[InternalCommand] = { + ConsumerControllerImpl.enforceLocalConsumer(start.deliverTo) + if (start.deliverTo == s.consumer) { + nextBehavior(s) + } else { + // if consumer is restarted it may send Start again + context.unwatch(s.consumer) + context.watchWith(start.deliverTo, ConsumerTerminated(start.deliverTo)) + nextBehavior(s.copy(consumer = start.deliverTo)) + } + } + + private def receiveRegisterToProducerController( + s: State[A], + reg: RegisterToProducerController[A], + nextBehavior: State[A] => Behavior[InternalCommand]): Behavior[InternalCommand] = { + if (reg.producerController != s.producerController) { + context.log.debug2( + "Register to new ProducerController [{}], previous was [{}].", + reg.producerController, + s.producerController) + reg.producerController ! ProducerController.RegisterConsumer(context.self) + nextBehavior(s.copy(registering = Some(reg.producerController))) + } else { + Behaviors.same + } + } + + private def receiveDeliverThenStop( + s: State[A], + nextBehavior: State[A] => Behavior[InternalCommand]): Behavior[InternalCommand] = { + if (stashBuffer.isEmpty && s.receivedSeqNr == s.confirmedSeqNr) { + context.log.debug("Stopped at seqNr [{}], no buffered messages.", s.confirmedSeqNr) + Behaviors.stopped + } else { + nextBehavior(s.copy(stopping = true)) + } + } + + private def receiveConsumerTerminated(c: ActorRef[_]): Behavior[InternalCommand] = { + context.log.debug("Consumer [{}] terminated.", c) + Behaviors.stopped + } + + private def receiveUnexpectedConfirmed(): Behavior[InternalCommand] = { + context.log.warn("Received unexpected Confirmed from consumer.") + Behaviors.unhandled + } + + private def startRetryTimer(): Unit = { + timers.startTimerWithFixedDelay(Retry, Retry, settings.resendInterval) + } + + // in case the Request or the SequencedMessage triggering the Request is lost + private def retryRequest(s: State[A]): State[A] = { + if (s.producerController == context.system.deadLetters) { + s + } else { + // TODO #28720 Maybe try to adjust the retry frequency. Maybe some exponential backoff and less need for it when + // SequenceMessage are arriving. On the other hand it might be too much overhead to reschedule of each + // incoming SequenceMessage. + val newRequestedSeqNr = if (resendLost) s.requestedSeqNr else s.receivedSeqNr + flowControlWindow / 2 + context.log.debug( + "Retry sending Request with confirmedSeqNr [{}], requestUpToSeqNr [{}].", + s.confirmedSeqNr, + newRequestedSeqNr) + // TODO #28720 maybe watch the producer to avoid sending retry Request to dead producer + s.producerController ! Request(s.confirmedSeqNr, newRequestedSeqNr, resendLost, viaTimeout = true) + s.copy(requestedSeqNr = newRequestedSeqNr) + } + } + + private def postStop(s: State[A]): Behavior[InternalCommand] = { + // best effort to Ack latest confirmed when stopping + s.producerController ! Ack(s.confirmedSeqNr) + Behaviors.same + } + +} diff --git a/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/internal/DeliverySerializable.scala b/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/internal/DeliverySerializable.scala new file mode 100644 index 00000000000..a5c464eb9cd --- /dev/null +++ b/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/internal/DeliverySerializable.scala @@ -0,0 +1,12 @@ +/* + * Copyright (C) 2020 Lightbend Inc. + */ + +package akka.actor.typed.delivery.internal + +import akka.annotation.InternalApi + +/** + * INTERNAL API + */ +@InternalApi private[akka] trait DeliverySerializable diff --git a/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/internal/ProducerControllerImpl.scala b/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/internal/ProducerControllerImpl.scala new file mode 100644 index 00000000000..39271b0a421 --- /dev/null +++ b/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/internal/ProducerControllerImpl.scala @@ -0,0 +1,628 @@ +/* + * Copyright (C) 2019-2020 Lightbend Inc. + */ + +package akka.actor.typed.delivery.internal + +import java.util.concurrent.TimeoutException + +import scala.concurrent.duration._ +import scala.reflect.ClassTag +import scala.util.Failure +import scala.util.Success + +import akka.actor.DeadLetterSuppression +import akka.actor.typed.ActorRef +import akka.actor.typed.Behavior +import akka.actor.typed.delivery.ConsumerController +import akka.actor.typed.delivery.ConsumerController.SequencedMessage +import akka.actor.typed.delivery.DurableProducerQueue +import akka.actor.typed.delivery.ProducerController +import akka.actor.typed.scaladsl.ActorContext +import akka.actor.typed.scaladsl.Behaviors +import akka.actor.typed.scaladsl.LoggerOps +import akka.actor.typed.scaladsl.TimerScheduler +import akka.util.Timeout + +/** + * INTERNAL API + * + * ==== Design notes ==== + * + * The producer will start the flow by sending a [[ProducerController.Start]] message to the `ProducerController` with + * message adapter reference to convert [[ProducerController.RequestNext]] message. + * The `ProducerController` sends `RequestNext` to the producer, which is then allowed to send one message to + * the `ProducerController`. + * + * The producer and `ProducerController` are supposed to be local so that these messages are fast and not lost. + * + * The `ProducerController` sends the first message to the `ConsumerController` without waiting for + * a `Request` from the `ConsumerController`. The main reason for this is that when used with + * Cluster Sharding the first message will typically create the `ConsumerController`. It's + * also a way to connect the ProducerController and ConsumerController in a dynamic way, for + * example when the ProducerController is replaced. + * + * When the first message is received by the `ConsumerController` it sends back the initial `Request`, + * with demand of how many messages it can accept. + * + * Apart from the first message the `ProducerController` will not send more messages than requested + * by the `ConsumerController`. + * + * When there is demand from the consumer side the `ProducerController` sends `RequestNext` to the + * actual producer, which is then allowed to send one more message. + * + * Each message is wrapped by the `ProducerController` in [[ConsumerController.SequencedMessage]] with + * a monotonically increasing sequence number without gaps, starting at 1. + * + * In other words, the "request" protocol to the application producer and consumer is one-by-one, but + * between the `ProducerController` and `ConsumerController` it's window of messages in flight. + * + * The `Request` message also contains a `confirmedSeqNr` that is the acknowledgement + * from the consumer that it has received and processed all messages up to that sequence number. + * + * The `ConsumerController` will send [[ProducerControllerImpl.Resend]] if a lost message is detected + * and then the `ProducerController` will resend all messages from that sequence number. The producer keeps + * unconfirmed messages in a buffer to be able to resend them. The buffer size is limited + * by the request window size. + * + * The resending is optional, and the `ConsumerController` can be started with `resendLost=false` + * to ignore lost messages, and then the `ProducerController` will not buffer unconfirmed messages. + * In that mode it provides only flow control but no reliable delivery. + */ +object ProducerControllerImpl { + + import ProducerController.Command + import ProducerController.RegisterConsumer + import ProducerController.RequestNext + import ProducerController.SeqNr + import ProducerController.Start + + sealed trait InternalCommand + + /** For commands defined in public ProducerController */ + trait UnsealedInternalCommand extends InternalCommand + + final case class Request(confirmedSeqNr: SeqNr, requestUpToSeqNr: SeqNr, supportResend: Boolean, viaTimeout: Boolean) + extends InternalCommand + with DeliverySerializable + with DeadLetterSuppression { + require( + confirmedSeqNr <= requestUpToSeqNr, + s"confirmedSeqNr [$confirmedSeqNr] should be <= requestUpToSeqNr [$requestUpToSeqNr]") + } + final case class Resend(fromSeqNr: SeqNr) extends InternalCommand with DeliverySerializable with DeadLetterSuppression + final case class Ack(confirmedSeqNr: SeqNr) + extends InternalCommand + with DeliverySerializable + with DeadLetterSuppression + + private case class Msg[A](msg: A) extends InternalCommand + private case object ResendFirst extends InternalCommand + case object ResendFirstUnconfirmed extends InternalCommand + + private case class LoadStateReply[A](state: DurableProducerQueue.State[A]) extends InternalCommand + private case class LoadStateFailed(attempt: Int) extends InternalCommand + private case class StoreMessageSentReply(ack: DurableProducerQueue.StoreMessageSentAck) + private case class StoreMessageSentFailed[A](messageSent: DurableProducerQueue.MessageSent[A], attempt: Int) + extends InternalCommand + private case object DurableQueueTerminated extends InternalCommand + + private case class StoreMessageSentCompleted[A](messageSent: DurableProducerQueue.MessageSent[A]) + extends InternalCommand + + private final case class State[A]( + requested: Boolean, + currentSeqNr: SeqNr, + confirmedSeqNr: SeqNr, + requestedSeqNr: SeqNr, + replyAfterStore: Map[SeqNr, ActorRef[SeqNr]], + supportResend: Boolean, + unconfirmed: Vector[ConsumerController.SequencedMessage[A]], + firstSeqNr: SeqNr, + producer: ActorRef[ProducerController.RequestNext[A]], + send: ConsumerController.SequencedMessage[A] => Unit) + + def apply[A: ClassTag]( + producerId: String, + durableQueueBehavior: Option[Behavior[DurableProducerQueue.Command[A]]], + settings: ProducerController.Settings): Behavior[Command[A]] = { + Behaviors + .setup[InternalCommand] { context => + Behaviors.withMdc(staticMdc = Map("producerId" -> producerId)) { + context.setLoggerName("akka.actor.typed.delivery.ProducerController") + val durableQueue = askLoadState(context, durableQueueBehavior, settings) + waitingForInitialization[A]( + context, + None, + None, + durableQueue, + settings, + createInitialState(durableQueue.nonEmpty)) { (producer, consumerController, loadedState) => + val send: ConsumerController.SequencedMessage[A] => Unit = consumerController ! _ + becomeActive( + producerId, + durableQueue, + settings, + createState(context.self, producerId, send, producer, loadedState)) + } + } + } + .narrow + } + + /** + * For custom `send` function. For example used with Sharding where the message must be wrapped in + * `ShardingEnvelope(SequencedMessage(msg))`. + */ + def apply[A: ClassTag]( + producerId: String, + durableQueueBehavior: Option[Behavior[DurableProducerQueue.Command[A]]], + settings: ProducerController.Settings, + send: ConsumerController.SequencedMessage[A] => Unit): Behavior[Command[A]] = { + Behaviors + .setup[InternalCommand] { context => + Behaviors.withMdc(staticMdc = Map("producerId" -> producerId)) { + context.setLoggerName("akka.actor.typed.delivery.ProducerController") + val durableQueue = askLoadState(context, durableQueueBehavior, settings) + // ConsumerController not used here + waitingForInitialization[A]( + context, + None, + consumerController = Some(context.system.deadLetters), + durableQueue, + settings, + createInitialState(durableQueue.nonEmpty)) { (producer, _, loadedState) => + becomeActive( + producerId, + durableQueue, + settings, + createState(context.self, producerId, send, producer, loadedState)) + } + } + } + .narrow + } + + private def askLoadState[A: ClassTag]( + context: ActorContext[InternalCommand], + durableQueueBehavior: Option[Behavior[DurableProducerQueue.Command[A]]], + settings: ProducerController.Settings): Option[ActorRef[DurableProducerQueue.Command[A]]] = { + + durableQueueBehavior.map { b => + val ref = context.spawn(b, "durable") + context.watchWith(ref, DurableQueueTerminated) + askLoadState(context, Some(ref), settings, attempt = 1) + ref + } + } + + private def askLoadState[A: ClassTag]( + context: ActorContext[InternalCommand], + durableQueue: Option[ActorRef[DurableProducerQueue.Command[A]]], + settings: ProducerController.Settings, + attempt: Int): Unit = { + implicit val loadTimeout: Timeout = settings.durableQueueRequestTimeout + durableQueue.foreach { ref => + context.ask[DurableProducerQueue.LoadState[A], DurableProducerQueue.State[A]]( + ref, + askReplyTo => DurableProducerQueue.LoadState[A](askReplyTo)) { + case Success(s) => LoadStateReply(s) + case Failure(_) => LoadStateFailed(attempt) // timeout + } + } + } + + private def createInitialState[A: ClassTag](hasDurableQueue: Boolean) = { + if (hasDurableQueue) None else Some(DurableProducerQueue.State.empty[A]) + } + + private def createState[A: ClassTag]( + self: ActorRef[InternalCommand], + producerId: String, + send: SequencedMessage[A] => Unit, + producer: ActorRef[RequestNext[A]], + loadedState: DurableProducerQueue.State[A]): State[A] = { + val unconfirmed = loadedState.unconfirmed.toVector.zipWithIndex.map { + case (u, i) => SequencedMessage[A](producerId, u.seqNr, u.message, i == 0, u.ack)(self) + } + State( + requested = false, + currentSeqNr = loadedState.currentSeqNr, + confirmedSeqNr = loadedState.highestConfirmedSeqNr, + requestedSeqNr = 1L, + replyAfterStore = Map.empty, + supportResend = true, + unconfirmed = unconfirmed, + firstSeqNr = loadedState.highestConfirmedSeqNr + 1, + producer, + send) + } + + private def waitingForInitialization[A: ClassTag]( + context: ActorContext[InternalCommand], + producer: Option[ActorRef[RequestNext[A]]], + consumerController: Option[ActorRef[ConsumerController.Command[A]]], + durableQueue: Option[ActorRef[DurableProducerQueue.Command[A]]], + settings: ProducerController.Settings, + initialState: Option[DurableProducerQueue.State[A]])( + thenBecomeActive: ( + ActorRef[RequestNext[A]], + ActorRef[ConsumerController.Command[A]], + DurableProducerQueue.State[A]) => Behavior[InternalCommand]): Behavior[InternalCommand] = { + Behaviors.receiveMessagePartial[InternalCommand] { + case RegisterConsumer(c: ActorRef[ConsumerController.Command[A]] @unchecked) => + (producer, initialState) match { + case (Some(p), Some(s)) => thenBecomeActive(p, c, s) + case (_, _) => + waitingForInitialization(context, producer, Some(c), durableQueue, settings, initialState)(thenBecomeActive) + } + case start: Start[A] @unchecked => + (consumerController, initialState) match { + case (Some(c), Some(s)) => thenBecomeActive(start.producer, c, s) + case (_, _) => + waitingForInitialization( + context, + Some(start.producer), + consumerController, + durableQueue, + settings, + initialState)(thenBecomeActive) + } + case load: LoadStateReply[A] @unchecked => + (producer, consumerController) match { + case (Some(p), Some(c)) => thenBecomeActive(p, c, load.state) + case (_, _) => + waitingForInitialization(context, producer, consumerController, durableQueue, settings, Some(load.state))( + thenBecomeActive) + } + case LoadStateFailed(attempt) => + if (attempt >= settings.durableQueueRetryAttempts) { + val errorMessage = s"LoadState failed after [$attempt] attempts, giving up." + context.log.error(errorMessage) + throw new TimeoutException(errorMessage) + } else { + context.log.warn( + "LoadState failed, attempt [{}] of [{}], retrying.", + attempt, + settings.durableQueueRetryAttempts) + // retry + askLoadState(context, durableQueue, settings, attempt + 1) + Behaviors.same + } + case DurableQueueTerminated => + throw new IllegalStateException("DurableQueue was unexpectedly terminated.") + } + } + + private def becomeActive[A: ClassTag]( + producerId: String, + durableQueue: Option[ActorRef[DurableProducerQueue.Command[A]]], + settings: ProducerController.Settings, + state: State[A]): Behavior[InternalCommand] = { + + Behaviors.setup { context => + Behaviors.withTimers { timers => + val msgAdapter: ActorRef[A] = context.messageAdapter(msg => Msg(msg)) + val requested = + if (state.unconfirmed.isEmpty) { + state.producer ! RequestNext(producerId, 1L, 0L, msgAdapter, context.self) + true + } else { + context.log.debug("Starting with [{}] unconfirmed.", state.unconfirmed.size) + context.self ! ResendFirst + false + } + new ProducerControllerImpl[A](context, producerId, durableQueue, settings, msgAdapter, timers) + .active(state.copy(requested = requested)) + } + } + } + + def enforceLocalProducer(ref: ActorRef[_]): Unit = { + if (ref.path.address.hasGlobalScope) + throw new IllegalArgumentException(s"Consumer [$ref] should be local.") + } + +} + +private class ProducerControllerImpl[A: ClassTag]( + context: ActorContext[ProducerControllerImpl.InternalCommand], + producerId: String, + durableQueue: Option[ActorRef[DurableProducerQueue.Command[A]]], + settings: ProducerController.Settings, + msgAdapter: ActorRef[A], + timers: TimerScheduler[ProducerControllerImpl.InternalCommand]) { + import ConsumerController.SequencedMessage + import DurableProducerQueue.MessageSent + import DurableProducerQueue.NoQualifier + import DurableProducerQueue.StoreMessageConfirmed + import DurableProducerQueue.StoreMessageSent + import DurableProducerQueue.StoreMessageSentAck + import ProducerController.MessageWithConfirmation + import ProducerController.RegisterConsumer + import ProducerController.RequestNext + import ProducerController.SeqNr + import ProducerController.Start + import ProducerControllerImpl._ + + // for the durableQueue StoreMessageSent ask + private implicit val askTimeout: Timeout = settings.durableQueueRequestTimeout + + private def active(s: State[A]): Behavior[InternalCommand] = { + + def onMsg(m: A, newReplyAfterStore: Map[SeqNr, ActorRef[SeqNr]], ack: Boolean): Behavior[InternalCommand] = { + checkOnMsgRequestedState() + if (context.log.isTraceEnabled) + context.log.trace("Sending [{}] with seqNr [{}].", m.getClass.getName, s.currentSeqNr) + val seqMsg = SequencedMessage(producerId, s.currentSeqNr, m, s.currentSeqNr == s.firstSeqNr, ack)(context.self) + val newUnconfirmed = + if (s.supportResend) s.unconfirmed :+ seqMsg + else Vector.empty // no resending, no need to keep unconfirmed + + if (s.currentSeqNr == s.firstSeqNr) + timers.startTimerWithFixedDelay(ResendFirst, ResendFirst, 1.second) + + s.send(seqMsg) + val newRequested = + if (s.currentSeqNr == s.requestedSeqNr) + false + else { + s.producer ! RequestNext(producerId, s.currentSeqNr + 1, s.confirmedSeqNr, msgAdapter, context.self) + true + } + active( + s.copy( + requested = newRequested, + currentSeqNr = s.currentSeqNr + 1, + replyAfterStore = newReplyAfterStore, + unconfirmed = newUnconfirmed)) + } + + def checkOnMsgRequestedState(): Unit = { + if (!s.requested || s.currentSeqNr > s.requestedSeqNr) { + throw new IllegalStateException( + s"Unexpected Msg when no demand, requested ${s.requested}, " + + s"requestedSeqNr ${s.requestedSeqNr}, currentSeqNr ${s.currentSeqNr}") + } + } + + def receiveRequest( + newConfirmedSeqNr: SeqNr, + newRequestedSeqNr: SeqNr, + supportResend: Boolean, + viaTimeout: Boolean): Behavior[InternalCommand] = { + context.log.debugN( + "Received Request, confirmed [{}], requested [{}], current [{}]", + newConfirmedSeqNr, + newRequestedSeqNr, + s.currentSeqNr) + + val stateAfterAck = onAck(newConfirmedSeqNr) + + val newUnconfirmed = + if (supportResend) stateAfterAck.unconfirmed + else Vector.empty + + if ((viaTimeout || newConfirmedSeqNr == s.firstSeqNr) && supportResend) { + // the last message was lost and no more message was sent that would trigger Resend + resendUnconfirmed(newUnconfirmed) + } + + // when supportResend=false the requestedSeqNr window must be expanded if all sent messages were lost + val newRequestedSeqNr2 = + if (!supportResend && newRequestedSeqNr <= stateAfterAck.currentSeqNr) + stateAfterAck.currentSeqNr + (newRequestedSeqNr - newConfirmedSeqNr) + else + newRequestedSeqNr + if (newRequestedSeqNr2 != newRequestedSeqNr) + context.log.debugN( + "Expanded requestedSeqNr from [{}] to [{}], because current [{}] and all were probably lost", + newRequestedSeqNr, + newRequestedSeqNr2, + stateAfterAck.currentSeqNr) + + if (newRequestedSeqNr2 > s.requestedSeqNr) { + if (!s.requested && (newRequestedSeqNr2 - s.currentSeqNr) > 0) + s.producer ! RequestNext(producerId, s.currentSeqNr, newConfirmedSeqNr, msgAdapter, context.self) + active( + stateAfterAck.copy( + requested = true, + requestedSeqNr = newRequestedSeqNr2, + supportResend = supportResend, + unconfirmed = newUnconfirmed)) + } else { + active(stateAfterAck.copy(supportResend = supportResend, unconfirmed = newUnconfirmed)) + } + } + + def receiveAck(newConfirmedSeqNr: SeqNr): Behavior[InternalCommand] = { + context.log.trace2("Received Ack, confirmed [{}], current [{}].", newConfirmedSeqNr, s.currentSeqNr) + val stateAfterAck = onAck(newConfirmedSeqNr) + if (newConfirmedSeqNr == s.firstSeqNr && stateAfterAck.unconfirmed.nonEmpty) { + resendUnconfirmed(stateAfterAck.unconfirmed) + } + active(stateAfterAck) + } + + def onAck(newConfirmedSeqNr: SeqNr): State[A] = { + val (replies, newReplyAfterStore) = s.replyAfterStore.partition { case (seqNr, _) => seqNr <= newConfirmedSeqNr } + if (replies.nonEmpty) + context.log.trace("Sending confirmation replies from [{}] to [{}].", replies.head._1, replies.last._1) + replies.foreach { + case (seqNr, replyTo) => replyTo ! seqNr + } + + val newUnconfirmed = + if (s.supportResend) s.unconfirmed.dropWhile(_.seqNr <= newConfirmedSeqNr) + else Vector.empty + + if (newConfirmedSeqNr == s.firstSeqNr) + timers.cancel(ResendFirst) + + val newMaxConfirmedSeqNr = math.max(s.confirmedSeqNr, newConfirmedSeqNr) + + durableQueue.foreach { d => + // Storing the confirmedSeqNr can be "write behind", at-least-once delivery + // TODO #28721 to reduce number of writes, consider to only StoreMessageConfirmed for the Request messages and not for each Ack + if (newMaxConfirmedSeqNr != s.confirmedSeqNr) + d ! StoreMessageConfirmed(newMaxConfirmedSeqNr, NoQualifier, System.currentTimeMillis()) + } + + s.copy(confirmedSeqNr = newMaxConfirmedSeqNr, replyAfterStore = newReplyAfterStore, unconfirmed = newUnconfirmed) + } + + def receiveStoreMessageSentCompleted(seqNr: SeqNr, m: A, ack: Boolean) = { + if (seqNr != s.currentSeqNr) + throw new IllegalStateException(s"currentSeqNr [${s.currentSeqNr}] not matching stored seqNr [$seqNr]") + + s.replyAfterStore.get(seqNr).foreach { replyTo => + context.log.trace("Sending confirmation reply to [{}] after storage.", seqNr) + replyTo ! seqNr + } + val newReplyAfterStore = s.replyAfterStore - seqNr + + onMsg(m, newReplyAfterStore, ack) + } + + def receiveResend(fromSeqNr: SeqNr): Behavior[InternalCommand] = { + val newUnconfirmed = + if (fromSeqNr == 0 && s.unconfirmed.nonEmpty) + s.unconfirmed.head.asFirst +: s.unconfirmed.tail + else + s.unconfirmed.dropWhile(_.seqNr < fromSeqNr) + resendUnconfirmed(newUnconfirmed) + active(s.copy(unconfirmed = newUnconfirmed)) + } + + def resendUnconfirmed(newUnconfirmed: Vector[SequencedMessage[A]]): Unit = { + if (newUnconfirmed.nonEmpty) + context.log.debug("Resending [{} - {}].", newUnconfirmed.head.seqNr, newUnconfirmed.last.seqNr) + newUnconfirmed.foreach(s.send) + } + + def receiveResendFirstUnconfirmed(): Behavior[InternalCommand] = { + if (s.unconfirmed.nonEmpty) { + context.log.debug("Resending first unconfirmed [{}].", s.unconfirmed.head.seqNr) + s.send(s.unconfirmed.head) + } + Behaviors.same + } + + def receiveResendFirst(): Behavior[InternalCommand] = { + if (s.unconfirmed.nonEmpty && s.unconfirmed.head.seqNr == s.firstSeqNr) { + context.log.debug("Resending first, [{}].", s.firstSeqNr) + s.send(s.unconfirmed.head.asFirst) + } else { + if (s.currentSeqNr > s.firstSeqNr) + timers.cancel(ResendFirst) + } + Behaviors.same + } + + def receiveStart(start: Start[A]): Behavior[InternalCommand] = { + ProducerControllerImpl.enforceLocalProducer(start.producer) + context.log.debug("Register new Producer [{}], currentSeqNr [{}].", start.producer, s.currentSeqNr) + if (s.requested) + start.producer ! RequestNext(producerId, s.currentSeqNr, s.confirmedSeqNr, msgAdapter, context.self) + active(s.copy(producer = start.producer)) + } + + def receiveRegisterConsumer( + consumerController: ActorRef[ConsumerController.Command[A]]): Behavior[InternalCommand] = { + val newFirstSeqNr = + if (s.unconfirmed.isEmpty) s.currentSeqNr + else s.unconfirmed.head.seqNr + context.log.debug( + "Register new ConsumerController [{}], starting with seqNr [{}].", + consumerController, + newFirstSeqNr) + if (s.unconfirmed.nonEmpty) { + timers.startTimerWithFixedDelay(ResendFirst, ResendFirst, 1.second) + context.self ! ResendFirst + } + // update the send function + val newSend = consumerController ! _ + active(s.copy(firstSeqNr = newFirstSeqNr, send = newSend)) + } + + Behaviors.receiveMessage { + case MessageWithConfirmation(m: A, replyTo) => + val newReplyAfterStore = s.replyAfterStore.updated(s.currentSeqNr, replyTo) + if (durableQueue.isEmpty) { + onMsg(m, newReplyAfterStore, ack = true) + } else { + storeMessageSent( + MessageSent(s.currentSeqNr, m, ack = true, NoQualifier, System.currentTimeMillis()), + attempt = 1) + active(s.copy(replyAfterStore = newReplyAfterStore)) + } + + case Msg(m: A) => + if (durableQueue.isEmpty) { + onMsg(m, s.replyAfterStore, ack = false) + } else { + storeMessageSent( + MessageSent(s.currentSeqNr, m, ack = false, NoQualifier, System.currentTimeMillis()), + attempt = 1) + Behaviors.same + } + + case StoreMessageSentCompleted(MessageSent(seqNr, m: A, ack, NoQualifier, _)) => + receiveStoreMessageSentCompleted(seqNr, m, ack) + + case f: StoreMessageSentFailed[A] => + receiveStoreMessageSentFailed(f) + + case Request(newConfirmedSeqNr, newRequestedSeqNr, supportResend, viaTimeout) => + receiveRequest(newConfirmedSeqNr, newRequestedSeqNr, supportResend, viaTimeout) + + case Ack(newConfirmedSeqNr) => + receiveAck(newConfirmedSeqNr) + + case Resend(fromSeqNr) => + receiveResend(fromSeqNr) + + case ResendFirst => + receiveResendFirst() + + case ResendFirstUnconfirmed => + receiveResendFirstUnconfirmed() + + case start: Start[A] => + receiveStart(start) + + case RegisterConsumer(consumerController: ActorRef[ConsumerController.Command[A]] @unchecked) => + receiveRegisterConsumer(consumerController) + + case DurableQueueTerminated => + throw new IllegalStateException("DurableQueue was unexpectedly terminated.") + } + } + + private def receiveStoreMessageSentFailed(f: StoreMessageSentFailed[A]): Behavior[InternalCommand] = { + if (f.attempt >= settings.durableQueueRetryAttempts) { + val errorMessage = + s"StoreMessageSentFailed seqNr [${f.messageSent.seqNr}] failed after [${f.attempt}] attempts, giving up." + context.log.error(errorMessage) + throw new TimeoutException(errorMessage) + } else { + context.log.warnN( + "StoreMessageSent seqNr [{}] failed, attempt [{}] of [{}], retrying.", + f.messageSent.seqNr, + f.attempt, + settings.durableQueueRetryAttempts) + // retry + storeMessageSent(f.messageSent, attempt = f.attempt + 1) + Behaviors.same + } + } + + private def storeMessageSent(messageSent: MessageSent[A], attempt: Int): Unit = { + context.ask[StoreMessageSent[A], StoreMessageSentAck]( + durableQueue.get, + askReplyTo => StoreMessageSent(messageSent, askReplyTo)) { + case Success(_) => StoreMessageSentCompleted(messageSent) + case Failure(_) => StoreMessageSentFailed(messageSent, attempt) // timeout + } + } +} diff --git a/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/internal/WorkPullingProducerControllerImpl.scala b/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/internal/WorkPullingProducerControllerImpl.scala new file mode 100644 index 00000000000..70444d90bf1 --- /dev/null +++ b/akka-actor-typed/src/main/scala/akka/actor/typed/delivery/internal/WorkPullingProducerControllerImpl.scala @@ -0,0 +1,674 @@ +/* + * Copyright (C) 2019-2020 Lightbend Inc. + */ + +package akka.actor.typed.delivery.internal + +import java.util.UUID +import java.util.concurrent.ThreadLocalRandom +import java.util.concurrent.TimeoutException + +import scala.reflect.ClassTag +import scala.util.Failure +import scala.util.Success + +import akka.Done +import akka.actor.typed.ActorRef +import akka.actor.typed.Behavior +import akka.actor.typed.delivery.ConsumerController +import akka.actor.typed.delivery.DurableProducerQueue +import akka.actor.typed.delivery.DurableProducerQueue.ConfirmationQualifier +import akka.actor.typed.delivery.DurableProducerQueue.SeqNr +import akka.actor.typed.delivery.ProducerController +import akka.actor.typed.delivery.WorkPullingProducerController +import akka.actor.typed.receptionist.Receptionist +import akka.actor.typed.receptionist.ServiceKey +import akka.actor.typed.scaladsl.ActorContext +import akka.actor.typed.scaladsl.Behaviors +import akka.actor.typed.scaladsl.LoggerOps +import akka.actor.typed.scaladsl.StashBuffer +import akka.annotation.InternalApi +import akka.util.Timeout + +/** + * INTERNAL API + */ +@InternalApi private[akka] object WorkPullingProducerControllerImpl { + + import WorkPullingProducerController.Command + import WorkPullingProducerController.RequestNext + import WorkPullingProducerController.Start + + sealed trait InternalCommand + + /** For commands defined in public WorkPullingProducerController */ + trait UnsealedInternalCommand extends InternalCommand + + private type TotalSeqNr = Long + private type OutSeqNr = Long + private type OutKey = String + + private final case class WorkerRequestNext[A](next: ProducerController.RequestNext[A]) extends InternalCommand + + private final case class Ack(outKey: OutKey, confirmedSeqNr: OutSeqNr) extends InternalCommand + private final case class AskTimeout(outKey: OutKey, outSeqNr: OutSeqNr) extends InternalCommand + + private case object RegisterConsumerDone extends InternalCommand + + private case class LoadStateReply[A](state: DurableProducerQueue.State[A]) extends InternalCommand + private case class LoadStateFailed(attempt: Int) extends InternalCommand + private case class StoreMessageSentReply(ack: DurableProducerQueue.StoreMessageSentAck) + private case class StoreMessageSentFailed[A](messageSent: DurableProducerQueue.MessageSent[A], attempt: Int) + extends InternalCommand + private case class StoreMessageSentCompleted[A](messageSent: DurableProducerQueue.MessageSent[A]) + extends InternalCommand + private case object DurableQueueTerminated extends InternalCommand + + private final case class OutState[A]( + producerController: ActorRef[ProducerController.Command[A]], + consumerController: ActorRef[ConsumerController.Command[A]], + seqNr: OutSeqNr, + unconfirmed: Vector[Unconfirmed[A]], + askNextTo: Option[ActorRef[ProducerController.MessageWithConfirmation[A]]]) { + def confirmationQualifier: ConfirmationQualifier = producerController.path.name + } + + private final case class Unconfirmed[A]( + totalSeqNr: TotalSeqNr, + outSeqNr: OutSeqNr, + msg: A, + replyTo: Option[ActorRef[Done]]) + + private final case class State[A]( + currentSeqNr: TotalSeqNr, // only updated when durableQueue is enabled + workers: Set[ActorRef[ConsumerController.Command[A]]], + out: Map[OutKey, OutState[A]], + // when durableQueue is enabled the worker must be selecting before storage + // to know the confirmationQualifier up-front + preselectedWorkers: Map[TotalSeqNr, PreselectedWorker], + // replyAfterStore is used when durableQueue is enabled, otherwise they are tracked in OutState + replyAfterStore: Map[TotalSeqNr, ActorRef[Done]], + // when the worker is deregistered but there are still unconfirmed + handOver: Map[TotalSeqNr, HandOver], + producer: ActorRef[WorkPullingProducerController.RequestNext[A]], + requested: Boolean) + + private case class PreselectedWorker(outKey: OutKey, confirmationQualifier: ConfirmationQualifier) + + private case class HandOver(oldConfirmationQualifier: ConfirmationQualifier, oldSeqNr: TotalSeqNr) + + // registration of workers via Receptionist + private final case class CurrentWorkers[A](workers: Set[ActorRef[ConsumerController.Command[A]]]) + extends InternalCommand + + private final case class Msg[A](msg: A, wasStashed: Boolean, replyTo: Option[ActorRef[Done]]) extends InternalCommand + + private final case class ResendDurableMsg[A]( + msg: A, + oldConfirmationQualifier: ConfirmationQualifier, + oldSeqNr: TotalSeqNr) + extends InternalCommand + + def apply[A: ClassTag]( + producerId: String, + workerServiceKey: ServiceKey[ConsumerController.Command[A]], + durableQueueBehavior: Option[Behavior[DurableProducerQueue.Command[A]]], + settings: WorkPullingProducerController.Settings): Behavior[Command[A]] = { + Behaviors + .withStash[InternalCommand](settings.bufferSize) { stashBuffer => + Behaviors.setup[InternalCommand] { context => + Behaviors.withMdc(staticMdc = Map("producerId" -> producerId)) { + context.setLoggerName("akka.actor.typed.delivery.WorkPullingProducerController") + val listingAdapter = context.messageAdapter[Receptionist.Listing](listing => + CurrentWorkers[A](listing.allServiceInstances(workerServiceKey))) + context.system.receptionist ! Receptionist.Subscribe(workerServiceKey, listingAdapter) + + val durableQueue = askLoadState(context, durableQueueBehavior, settings) + + waitingForStart( + producerId, + context, + stashBuffer, + durableQueue, + settings, + None, + createInitialState(durableQueue.nonEmpty)) + } + } + } + .narrow + } + + private def createInitialState[A: ClassTag](hasDurableQueue: Boolean) = { + if (hasDurableQueue) None else Some(DurableProducerQueue.State.empty[A]) + } + + private def waitingForStart[A: ClassTag]( + producerId: String, + context: ActorContext[InternalCommand], + stashBuffer: StashBuffer[InternalCommand], + durableQueue: Option[ActorRef[DurableProducerQueue.Command[A]]], + settings: WorkPullingProducerController.Settings, + producer: Option[ActorRef[RequestNext[A]]], + initialState: Option[DurableProducerQueue.State[A]]): Behavior[InternalCommand] = { + + def becomeActive(p: ActorRef[RequestNext[A]], s: DurableProducerQueue.State[A]): Behavior[InternalCommand] = { + // resend unconfirmed to self, order doesn't matter for work pulling + s.unconfirmed.foreach { + case DurableProducerQueue.MessageSent(oldSeqNr, msg, _, oldConfirmationQualifier, _) => + context.self ! ResendDurableMsg(msg, oldConfirmationQualifier, oldSeqNr) + } + + val msgAdapter: ActorRef[A] = context.messageAdapter(msg => Msg(msg, wasStashed = false, replyTo = None)) + val requestNext = RequestNext[A](msgAdapter, context.self) + val b = + new WorkPullingProducerControllerImpl(context, stashBuffer, producerId, requestNext, durableQueue, settings) + .active(createInitialState(s.currentSeqNr, p)) + stashBuffer.unstashAll(b) + } + + Behaviors.receiveMessage { + case start: Start[A] @unchecked => + ProducerControllerImpl.enforceLocalProducer(start.producer) + initialState match { + case Some(s) => + becomeActive(start.producer, s) + case None => + // waiting for LoadStateReply + waitingForStart( + producerId, + context, + stashBuffer, + durableQueue, + settings, + Some(start.producer), + initialState) + } + + case load: LoadStateReply[A] @unchecked => + producer match { + case Some(p) => + becomeActive(p, load.state) + case None => + // waiting for LoadStateReply + waitingForStart(producerId, context, stashBuffer, durableQueue, settings, producer, Some(load.state)) + } + + case LoadStateFailed(attempt) => + if (attempt >= settings.producerControllerSettings.durableQueueRetryAttempts) { + val errorMessage = s"LoadState failed after [$attempt] attempts, giving up." + context.log.error(errorMessage) + throw new TimeoutException(errorMessage) + } else { + context.log.warn( + "LoadState failed, attempt [{}] of [{}], retrying.", + attempt, + settings.producerControllerSettings.durableQueueRetryAttempts) + // retry + askLoadState(context, durableQueue, settings, attempt + 1) + Behaviors.same + } + + case DurableQueueTerminated => + throw new IllegalStateException("DurableQueue was unexpectedly terminated.") + + case other => + checkStashFull(stashBuffer) + stashBuffer.stash(other) + Behaviors.same + } + } + + private def checkStashFull[A: ClassTag](stashBuffer: StashBuffer[InternalCommand]): Unit = { + if (stashBuffer.isFull) + throw new IllegalArgumentException(s"Buffer is full, size [${stashBuffer.size}].") + } + + private def askLoadState[A: ClassTag]( + context: ActorContext[InternalCommand], + durableQueueBehavior: Option[Behavior[DurableProducerQueue.Command[A]]], + settings: WorkPullingProducerController.Settings): Option[ActorRef[DurableProducerQueue.Command[A]]] = { + + durableQueueBehavior.map { b => + val ref = context.spawn(b, "durable") + context.watchWith(ref, DurableQueueTerminated) + askLoadState(context, Some(ref), settings, attempt = 1) + ref + } + } + + private def askLoadState[A: ClassTag]( + context: ActorContext[InternalCommand], + durableQueue: Option[ActorRef[DurableProducerQueue.Command[A]]], + settings: WorkPullingProducerController.Settings, + attempt: Int): Unit = { + implicit val loadTimeout: Timeout = settings.producerControllerSettings.durableQueueRequestTimeout + durableQueue.foreach { ref => + context.ask[DurableProducerQueue.LoadState[A], DurableProducerQueue.State[A]]( + ref, + askReplyTo => DurableProducerQueue.LoadState[A](askReplyTo)) { + case Success(s) => LoadStateReply(s) + case Failure(_) => LoadStateFailed(attempt) // timeout + } + } + } + + private def createInitialState[A]( + currentSeqNr: SeqNr, + producer: ActorRef[WorkPullingProducerController.RequestNext[A]]): State[A] = + State(currentSeqNr, Set.empty, Map.empty, Map.empty, Map.empty, Map.empty, producer, requested = false) + +} + +private class WorkPullingProducerControllerImpl[A: ClassTag]( + context: ActorContext[WorkPullingProducerControllerImpl.InternalCommand], + stashBuffer: StashBuffer[WorkPullingProducerControllerImpl.InternalCommand], + producerId: String, + requestNext: WorkPullingProducerController.RequestNext[A], + durableQueue: Option[ActorRef[DurableProducerQueue.Command[A]]], + settings: WorkPullingProducerController.Settings) { + import DurableProducerQueue.MessageSent + import DurableProducerQueue.StoreMessageConfirmed + import DurableProducerQueue.StoreMessageSent + import DurableProducerQueue.StoreMessageSentAck + import WorkPullingProducerController.GetWorkerStats + import WorkPullingProducerController.MessageWithConfirmation + import WorkPullingProducerController.Start + import WorkPullingProducerController.WorkerStats + import WorkPullingProducerControllerImpl._ + + private val durableQueueAskTimeout: Timeout = settings.producerControllerSettings.durableQueueRequestTimeout + private val workerAskTimeout: Timeout = settings.internalAskTimeout + + private val workerRequestNextAdapter: ActorRef[ProducerController.RequestNext[A]] = + context.messageAdapter(WorkerRequestNext.apply) + + private def active(s: State[A]): Behavior[InternalCommand] = { + + def onMessage(msg: A, wasStashed: Boolean, replyTo: Option[ActorRef[Done]], totalSeqNr: TotalSeqNr): State[A] = { + val consumersWithDemand = s.out.iterator.filter { case (_, out) => out.askNextTo.isDefined }.toVector + if (context.log.isTraceEnabled) + context.log.traceN( + "Received message seqNr [{}], wasStashed [{}], consumersWithDemand [{}], hasRequested [{}].", + totalSeqNr, + wasStashed, + consumersWithDemand.map(_._1).mkString(", "), + s.requested) + if (!s.requested && !wasStashed && durableQueue.isEmpty) + throw new IllegalStateException(s"Unexpected message [$msg], wasn't requested nor unstashed.") + + val selectedWorker = + if (durableQueue.isDefined) { + s.preselectedWorkers.get(totalSeqNr) match { + case Some(PreselectedWorker(outKey, confirmationQualifier)) => + s.out.get(outKey) match { + case Some(out) => Right(outKey -> out) + case None => + // the preselected was deregistered in the meantime + context.self ! ResendDurableMsg(msg, confirmationQualifier, totalSeqNr) + Left(s) + } + case None => + throw new IllegalStateException(s"Expected preselected worker for seqNr [$totalSeqNr].") + } + } else { + selectWorker() match { + case Some(w) => Right(w) + case None => + checkStashFull(stashBuffer) + context.log.debug("Stashing message, seqNr [{}]", totalSeqNr) + stashBuffer.stash(Msg(msg, wasStashed = true, replyTo)) + val newRequested = if (wasStashed) s.requested else false + Left(s.copy(requested = newRequested)) + } + } + + selectedWorker match { + case Right((outKey, out)) => + val newUnconfirmed = out.unconfirmed :+ Unconfirmed(totalSeqNr, out.seqNr, msg, replyTo) + val newOut = s.out.updated(outKey, out.copy(unconfirmed = newUnconfirmed, askNextTo = None)) + implicit val askTimeout: Timeout = workerAskTimeout + context.ask[ProducerController.MessageWithConfirmation[A], OutSeqNr]( + out.askNextTo.get, + ProducerController.MessageWithConfirmation(msg, _)) { + case Success(seqNr) => Ack(outKey, seqNr) + case Failure(_) => AskTimeout(outKey, out.seqNr) + } + + def tellRequestNext(): Unit = { + context.log.trace("Sending RequestNext to producer, seqNr [{}].", totalSeqNr) + s.producer ! requestNext + } + + val hasMoreDemand = consumersWithDemand.size >= 2 + // decision table based on s.hasRequested, wasStashed, hasMoreDemand, stashBuffer.isEmpty + val newRequested = + if (s.requested && !wasStashed && hasMoreDemand) { + // request immediately since more demand + tellRequestNext() + true + } else if (s.requested && !wasStashed && !hasMoreDemand) { + // wait until more demand + false + } else if (!s.requested && wasStashed && hasMoreDemand && stashBuffer.isEmpty) { + // msg was unstashed, the last from stash + tellRequestNext() + true + } else if (!s.requested && wasStashed && hasMoreDemand && stashBuffer.nonEmpty) { + // more in stash + false + } else if (!s.requested && wasStashed && !hasMoreDemand) { + // wait until more demand + false + } else if (s.requested && wasStashed) { + // msg was unstashed, but pending request alread in progress + true + } else if (durableQueue.isDefined && !s.requested && !wasStashed) { + // msg ResendDurableMsg, and stashed before storage + false + } else { + throw new IllegalStateException(s"Invalid combination of hasRequested [${s.requested}], " + + s"wasStashed [$wasStashed], hasMoreDemand [$hasMoreDemand], stashBuffer.isEmpty [${stashBuffer.isEmpty}]") + } + + s.copy(out = newOut, requested = newRequested, preselectedWorkers = s.preselectedWorkers - totalSeqNr) + + case Left(newState) => + newState + } + } + + def workersWithDemand: Vector[(OutKey, OutState[A])] = + s.out.iterator.filter { case (_, out) => out.askNextTo.isDefined }.toVector + + def selectWorker(): Option[(OutKey, OutState[A])] = { + val preselected = s.preselectedWorkers.valuesIterator.map(_.outKey).toSet + val workers = workersWithDemand.filterNot { + case (outKey, _) => preselected(outKey) + } + if (workers.isEmpty) { + None + } else { + val i = ThreadLocalRandom.current().nextInt(workers.size) + Some(workers(i)) + } + } + + def onMessageBeforeDurableQueue(msg: A, replyTo: Option[ActorRef[Done]]): Behavior[InternalCommand] = { + selectWorker() match { + case Some((outKey, out)) => + storeMessageSent( + MessageSent( + s.currentSeqNr, + msg, + ack = replyTo.isDefined, + out.confirmationQualifier, + System.currentTimeMillis()), + attempt = 1) + val newReplyAfterStore = replyTo match { + case None => s.replyAfterStore + case Some(r) => s.replyAfterStore.updated(s.currentSeqNr, r) + } + active( + s.copy( + currentSeqNr = s.currentSeqNr + 1, + preselectedWorkers = + s.preselectedWorkers.updated(s.currentSeqNr, PreselectedWorker(outKey, out.confirmationQualifier)), + replyAfterStore = newReplyAfterStore)) + case None => + checkStashFull(stashBuffer) + // no demand from any workers, or all already preselected + context.log.debug("Stash before storage, seqNr [{}]", s.currentSeqNr) + // not stored yet, so don't treat it as stashed + stashBuffer.stash(Msg(msg, wasStashed = false, replyTo)) + active(s) + } + } + + def onResendDurableMsg(resend: ResendDurableMsg[A]): Behavior[InternalCommand] = { + require(durableQueue.isDefined, "Unexpected ResendDurableMsg when DurableQueue not defined.") + selectWorker() match { + case Some((outKey, out)) => + storeMessageSent( + MessageSent(s.currentSeqNr, resend.msg, false, out.confirmationQualifier, System.currentTimeMillis()), + attempt = 1) + // When StoreMessageSentCompleted (oldConfirmationQualifier, oldSeqNr) confirmation will be stored + active( + s.copy( + currentSeqNr = s.currentSeqNr + 1, + preselectedWorkers = + s.preselectedWorkers.updated(s.currentSeqNr, PreselectedWorker(outKey, out.confirmationQualifier)), + handOver = s.handOver.updated(s.currentSeqNr, HandOver(resend.oldConfirmationQualifier, resend.oldSeqNr)))) + case None => + checkStashFull(stashBuffer) + // no demand from any workers, or all already preselected + context.log.debug("Stash before storage of resent durable message, seqNr [{}].", s.currentSeqNr) + // not stored yet, so don't treat it as stashed + stashBuffer.stash(resend) + active(s) + } + } + + def receiveStoreMessageSentCompleted(seqNr: SeqNr, m: A) = { + s.replyAfterStore.get(seqNr).foreach { replyTo => + context.log.trace("Sending reply for seqNr [{}] after storage.", seqNr) + replyTo ! Done + } + + s.handOver.get(seqNr).foreach { + case HandOver(oldConfirmationQualifier, oldSeqNr) => + durableQueue.foreach { d => + d ! StoreMessageConfirmed(oldSeqNr, oldConfirmationQualifier, System.currentTimeMillis()) + } + } + + val newState = onMessage(m, wasStashed = false, replyTo = None, seqNr) + active(newState.copy(replyAfterStore = newState.replyAfterStore - seqNr, handOver = newState.handOver - seqNr)) + } + + def receiveAck(ack: Ack): Behavior[InternalCommand] = { + s.out.get(ack.outKey) match { + case Some(outState) => + val newUnconfirmed = onAck(outState, ack.confirmedSeqNr) + active(s.copy(out = s.out.updated(ack.outKey, outState.copy(unconfirmed = newUnconfirmed)))) + case None => + // obsolete Next, ConsumerController already deregistered + Behaviors.unhandled + } + } + + def onAck(outState: OutState[A], confirmedSeqNr: OutSeqNr): Vector[Unconfirmed[A]] = { + val (confirmed, newUnconfirmed) = outState.unconfirmed.partition { + case Unconfirmed(_, seqNr, _, _) => seqNr <= confirmedSeqNr + } + + if (confirmed.nonEmpty) { + context.log.trace("Received Ack seqNr [{}] from worker [{}].", confirmedSeqNr, outState.confirmationQualifier) + confirmed.foreach { + case Unconfirmed(_, _, _, None) => // no reply + case Unconfirmed(_, _, _, Some(replyTo)) => + replyTo ! Done + } + + durableQueue.foreach { d => + // Storing the confirmedSeqNr can be "write behind", at-least-once delivery + d ! StoreMessageConfirmed( + confirmed.last.totalSeqNr, + outState.confirmationQualifier, + System.currentTimeMillis()) + } + } + + newUnconfirmed + } + + def receiveWorkerRequestNext(w: WorkerRequestNext[A]): Behavior[InternalCommand] = { + val next = w.next + val outKey = next.producerId + s.out.get(outKey) match { + case Some(outState) => + val confirmedSeqNr = w.next.confirmedSeqNr + context.log.trace2( + "Received RequestNext from worker [{}], confirmedSeqNr [{}].", + w.next.producerId, + confirmedSeqNr) + + val newUnconfirmed = onAck(outState, confirmedSeqNr) + + val newOut = + s.out.updated( + outKey, + outState + .copy(seqNr = w.next.currentSeqNr, unconfirmed = newUnconfirmed, askNextTo = Some(next.askNextTo))) + + if (stashBuffer.nonEmpty) { + context.log.debug2("Unstash [{}] after RequestNext from worker [{}]", stashBuffer.size, w.next.producerId) + stashBuffer.unstashAll(active(s.copy(out = newOut))) + } else if (s.requested) { + active(s.copy(out = newOut)) + } else { + context.log.trace("Sending RequestNext to producer after RequestNext from worker [{}].", w.next.producerId) + s.producer ! requestNext + active(s.copy(out = newOut, requested = true)) + } + + case None => + // obsolete Next, ConsumerController already deregistered + Behaviors.unhandled + } + } + + def receiveCurrentWorkers(curr: CurrentWorkers[A]): Behavior[InternalCommand] = { + // TODO #28722 we could also track unreachable workers and avoid them when selecting worker + val addedWorkers = curr.workers.diff(s.workers) + val removedWorkers = s.workers.diff(curr.workers) + + val newState = addedWorkers.foldLeft(s) { (acc, c) => + val uuid = UUID.randomUUID().toString + val outKey = s"$producerId-$uuid" + context.log.debug2("Registered worker [{}], with producerId [{}].", c, outKey) + val p = context.spawn( + ProducerController[A](outKey, durableQueueBehavior = None, settings.producerControllerSettings), + uuid) + p ! ProducerController.Start(workerRequestNextAdapter) + p ! ProducerController.RegisterConsumer(c) + acc.copy(out = acc.out.updated(outKey, OutState(p, c, 0L, Vector.empty, None))) + } + + val newState2 = removedWorkers.foldLeft(newState) { (acc, c) => + acc.out.find { case (_, outState) => outState.consumerController == c } match { + case Some((key, outState)) => + context.log.debug2("Deregistered worker [{}], with producerId [{}].", c, key) + context.stop(outState.producerController) + // resend the unconfirmed, sending to self since order of messages for WorkPulling doesn't matter anyway + if (outState.unconfirmed.nonEmpty) + context.log.debugN( + "Resending unconfirmed from deregistered worker with producerId [{}], from seqNr [{}] to [{}].", + key, + outState.unconfirmed.head.outSeqNr, + outState.unconfirmed.last.outSeqNr) + outState.unconfirmed.foreach { + case Unconfirmed(totalSeqNr, _, msg, replyTo) => + if (durableQueue.isEmpty) + context.self ! Msg(msg, wasStashed = true, replyTo) + else + context.self ! ResendDurableMsg(msg, outState.confirmationQualifier, totalSeqNr) + } + acc.copy(out = acc.out - key) + + case None => + context.log.debug("Deregistered non-existing worker [{}]", c) + acc + } + } + + active(newState2.copy(workers = curr.workers)) + } + + def receiveStart(start: Start[A]): Behavior[InternalCommand] = { + ProducerControllerImpl.enforceLocalProducer(start.producer) + context.log.debug("Register new Producer [{}], currentSeqNr [{}].", start.producer, s.currentSeqNr) + if (s.requested) + start.producer ! requestNext + active(s.copy(producer = start.producer)) + } + + Behaviors.receiveMessage { + case Msg(msg: A, wasStashed, replyTo) => + if (durableQueue.isEmpty || wasStashed) + active(onMessage(msg, wasStashed, replyTo, s.currentSeqNr)) + else + onMessageBeforeDurableQueue(msg, replyTo) + + case MessageWithConfirmation(msg: A, replyTo) => + if (durableQueue.isEmpty) + active(onMessage(msg, wasStashed = false, Some(replyTo), s.currentSeqNr)) + else + onMessageBeforeDurableQueue(msg, Some(replyTo)) + + case m: ResendDurableMsg[A] => + onResendDurableMsg(m) + + case StoreMessageSentCompleted(MessageSent(seqNr, m: A, _, _, _)) => + receiveStoreMessageSentCompleted(seqNr, m) + + case f: StoreMessageSentFailed[A] => + receiveStoreMessageSentFailed(f) + + case ack: Ack => + receiveAck(ack) + + case w: WorkerRequestNext[A] => + receiveWorkerRequestNext(w) + + case curr: CurrentWorkers[A] => + receiveCurrentWorkers(curr) + + case GetWorkerStats(replyTo) => + replyTo ! WorkerStats(s.workers.size) + Behaviors.same + + case RegisterConsumerDone => + Behaviors.same + + case start: Start[A] => + receiveStart(start) + + case AskTimeout(outKey, outSeqNr) => + context.log.debug( + "Message seqNr [{}] sent to worker [{}] timed out. It will be be redelivered.", + outSeqNr, + outKey) + Behaviors.same + + case DurableQueueTerminated => + throw new IllegalStateException("DurableQueue was unexpectedly terminated.") + + } + } + + private def receiveStoreMessageSentFailed(f: StoreMessageSentFailed[A]): Behavior[InternalCommand] = { + if (f.attempt >= settings.producerControllerSettings.durableQueueRetryAttempts) { + val errorMessage = + s"StoreMessageSentFailed seqNr [${f.messageSent.seqNr}] failed after [${f.attempt}] attempts, giving up." + context.log.error(errorMessage) + throw new TimeoutException(errorMessage) + } else { + context.log.warn("StoreMessageSent seqNr [{}] failed, attempt [{}], retrying.", f.messageSent.seqNr, f.attempt) + // retry + storeMessageSent(f.messageSent, attempt = f.attempt + 1) + Behaviors.same + } + } + + private def storeMessageSent(messageSent: MessageSent[A], attempt: Int): Unit = { + implicit val askTimout: Timeout = durableQueueAskTimeout + context.ask[StoreMessageSent[A], StoreMessageSentAck]( + durableQueue.get, + askReplyTo => StoreMessageSent(messageSent, askReplyTo)) { + case Success(_) => StoreMessageSentCompleted(messageSent) + case Failure(_) => StoreMessageSentFailed(messageSent, attempt) // timeout + } + } + +} diff --git a/akka-cluster-sharding-typed/src/main/resources/reference.conf b/akka-cluster-sharding-typed/src/main/resources/reference.conf index 6307f87dac9..c8dc27eb3b5 100644 --- a/akka-cluster-sharding-typed/src/main/resources/reference.conf +++ b/akka-cluster-sharding-typed/src/main/resources/reference.conf @@ -44,3 +44,32 @@ akka.actor { } } +akka.reliable-delivery { + sharding { + producer-controller = ${akka.reliable-delivery.producer-controller} + producer-controller { + # Limit of how many messages that can be buffered when there + # is no demand from the consumer side. + buffer-size = 1000 + + # Ask timeout for sending message to worker until receiving Ack from worker + internal-ask-timeout = 60s + + # If no messages are sent to an entity within this duration the + # ProducerController for that entity will be removed. + cleanup-unused-after = 120s + + # In case ShardingConsumerController is stopped and there are pending + # unconfirmed messages the ShardingConsumerController has to "wake up" + # the consumer again by resending the first unconfirmed message. + resend-first-unconfirmed-idle-timeout = 10s + } + + consumer-controller = ${akka.reliable-delivery.consumer-controller} + consumer-controller { + # Limit of how many messages that can be buffered before the + # ShardingConsumerController is initialized by the Start message. + buffer-size = 1000 + } + } +} diff --git a/akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/delivery/ShardingConsumerController.scala b/akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/delivery/ShardingConsumerController.scala new file mode 100644 index 00000000000..4b91274c6bf --- /dev/null +++ b/akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/delivery/ShardingConsumerController.scala @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2020-2020 Lightbend Inc. + */ + +package akka.cluster.sharding.typed.delivery + +import java.util.function.{ Function => JFunction } + +import akka.actor.typed.ActorRef +import akka.actor.typed.ActorSystem +import akka.actor.typed.Behavior +import akka.actor.typed.delivery.ConsumerController +import akka.actor.typed.scaladsl.Behaviors +import akka.annotation.ApiMayChange +import akka.cluster.sharding.typed.delivery.internal.ShardingConsumerControllerImpl +import com.typesafe.config.Config + +/** + * `ShardingConsumerController` is used together with [[ShardingProducerController]]. See the description + * in that class or the Akka reference documentation for how they are intended to be used. + * + * `ShardingConsumerController` is the entity that is initialized in `ClusterSharding`. It will manage + * the lifecycle and message delivery to the destination consumer actor. + * + * The destination consumer actor will start the flow by sending an initial [[ConsumerController.Start]] + * message via the `ActorRef` provided in the factory function of the consumer `Behavior`. + * The `ActorRef` in the `Start` message is typically constructed as a message adapter to map the + * [[ConsumerController.Delivery]] to the protocol of the consumer actor. + * + * Received messages from the producer are wrapped in [[ConsumerController.Delivery]] when sent to the consumer, + * which is supposed to reply with [[ConsumerController.Confirmed]] when it has processed the message. + * Next message from a specific producer is not delivered until the previous is confirmed. However, since + * there can be several producers, e.g. one per node, sending to the same destination entity there can be + * several `Delivery` in flight at the same time. + * More messages from a specific producer that arrive while waiting for the confirmation are stashed by + * the `ConsumerController` and delivered when previous message was confirmed. + */ +@ApiMayChange +object ShardingConsumerController { + + object Settings { + + /** + * Scala API: Factory method from config `akka.reliable-delivery.sharding.consumer-controller` + * of the `ActorSystem`. + */ + def apply(system: ActorSystem[_]): Settings = + apply(system.settings.config.getConfig("akka.reliable-delivery.sharding.consumer-controller")) + + /** + * Scala API: Factory method from Config corresponding to + * `akka.reliable-delivery.sharding.consumer-controller`. + */ + def apply(config: Config): Settings = { + new Settings(bufferSize = config.getInt("buffer-size"), ConsumerController.Settings(config)) + } + + /** + * Java API: Factory method from config `akka.reliable-delivery.sharding.consumer-controller` + * of the `ActorSystem`. + */ + def create(system: ActorSystem[_]): Settings = + apply(system) + + /** + * Java API: Factory method from Config corresponding to + * `akka.reliable-delivery.sharding.consumer-controller`. + */ + def create(config: Config): Settings = + apply(config) + } + + final class Settings private (val bufferSize: Int, val consumerControllerSettings: ConsumerController.Settings) { + + def withBufferSize(newBufferSize: Int): Settings = + copy(bufferSize = newBufferSize) + + def withConsumerControllerSettings(newConsumerControllerSettings: ConsumerController.Settings): Settings = + copy(consumerControllerSettings = newConsumerControllerSettings) + + /** + * Private copy method for internal use only. + */ + private def copy( + bufferSize: Int = bufferSize, + consumerControllerSettings: ConsumerController.Settings = consumerControllerSettings) = + new Settings(bufferSize, consumerControllerSettings) + + override def toString: String = + s"Settings($bufferSize,$consumerControllerSettings)" + } + + /** + * The `Behavior` of the entity that is to be initialized in `ClusterSharding`. It will manage + * the lifecycle and message delivery to the destination consumer actor. + */ + def apply[A, B](consumerBehavior: ActorRef[ConsumerController.Start[A]] => Behavior[B]) + : Behavior[ConsumerController.SequencedMessage[A]] = { + Behaviors.setup { context => + ShardingConsumerControllerImpl(consumerBehavior, Settings(context.system)) + } + } + + /** + * The `Behavior` of the entity that is to be initialized in `ClusterSharding`. It will manage + * the lifecycle and message delivery to the destination consumer actor. + */ + def withSettings[A, B](settings: Settings)(consumerBehavior: ActorRef[ConsumerController.Start[A]] => Behavior[B]) + : Behavior[ConsumerController.SequencedMessage[A]] = { + // can't overload apply, loosing type inference + ShardingConsumerControllerImpl(consumerBehavior, settings) + } + + /** + * Java API: The `Behavior` of the entity that is to be initialized in `ClusterSharding`. It will manage + * the lifecycle and message delivery to the destination consumer actor. + */ + def create[A, B](consumerBehavior: JFunction[ActorRef[ConsumerController.Start[A]], Behavior[B]]) + : Behavior[ConsumerController.SequencedMessage[A]] = + apply(consumerBehavior.apply) + + /** + * Java API: The `Behavior` of the entity that is to be initialized in `ClusterSharding`. It will manage + * the lifecycle and message delivery to the destination consumer actor. + */ + def create[A, B]( + consumerBehavior: JFunction[ActorRef[ConsumerController.Start[A]], Behavior[B]], + settings: Settings): Behavior[ConsumerController.SequencedMessage[A]] = + withSettings(settings)(consumerBehavior.apply) + + /** + * Java API: The generic `Class` type for `ConsumerController.SequencedMessage` that can be used when creating + * an `EntityTypeKey` for the `ShardedConsumerController` with + * `Class>>`. + */ + def entityTypeKeyClass[A]: Class[ConsumerController.SequencedMessage[A]] = + classOf[ConsumerController.SequencedMessage[A]] + +} diff --git a/akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/delivery/ShardingProducerController.scala b/akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/delivery/ShardingProducerController.scala new file mode 100644 index 00000000000..ca84d81eb6c --- /dev/null +++ b/akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/delivery/ShardingProducerController.scala @@ -0,0 +1,286 @@ +/* + * Copyright (C) 2019-2020 Lightbend Inc. + */ + +package akka.cluster.sharding.typed.delivery + +import java.util.Optional + +import scala.compat.java8.OptionConverters._ +import scala.concurrent.duration.FiniteDuration +import scala.reflect.ClassTag + +import akka.Done +import akka.actor.typed.ActorRef +import akka.actor.typed.ActorSystem +import akka.actor.typed.Behavior +import akka.actor.typed.delivery.ConsumerController +import akka.actor.typed.delivery.DurableProducerQueue +import akka.actor.typed.delivery.ProducerController +import akka.actor.typed.scaladsl.Behaviors +import akka.annotation.ApiMayChange +import akka.cluster.sharding.typed.ShardingEnvelope +import akka.cluster.sharding.typed.delivery.internal.ShardingProducerControllerImpl +import akka.util.JavaDurationConverters._ +import com.typesafe.config.Config + +/** + * Reliable delivery between a producer actor sending messages to sharded consumer + * actors receiving the messages. + * + * The `ShardingProducerController` should be used together with [[ShardingConsumerController]]. + * + * A producer can send messages via a `ShardingProducerController` to any `ShardingConsumerController` + * identified by an `entityId`. A single `ShardingProducerController` per `ActorSystem` (node) can be + * shared for sending to all entities of a certain entity type. No explicit registration is needed + * between the `ShardingConsumerController` and `ShardingProducerController`. + * + * The producer actor will start the flow by sending a [[ShardingProducerController.Start]] + * message to the `ShardingProducerController`. The `ActorRef` in the `Start` message is + * typically constructed as a message adapter to map the [[ShardingProducerController.RequestNext]] + * to the protocol of the producer actor. + * + * The `ShardingProducerController` sends `RequestNext` to the producer, which is then allowed + * to send one message to the `ShardingProducerController` via the `sendNextTo` in the `RequestNext`. + * Thereafter the producer will receive a new `RequestNext` when it's allowed to send one more message. + * + * In the `RequestNext` message there is information about which entities that have demand. It is allowed + * to send to a new `entityId` that is not included in the `RequestNext.entitiesWithDemand`. If sending to + * an entity that doesn't have demand the message will be buffered. This support for buffering means that + * it is even allowed to send several messages in response to one `RequestNext` but it's recommended to + * only send one message and wait for next `RequestNext` before sending more messages. + * + * The producer and `ShardingProducerController` actors are supposed to be local so that these messages are + * fast and not lost. This is enforced by a runtime check. + * + * There will be one `ShardingConsumerController` for each entity. Many unconfirmed messages can be in + * flight between the `ShardingProducerController` and each `ShardingConsumerController`. The flow control + * is driven by the consumer side, which means that the `ShardingProducerController` will not send faster + * than the demand requested by the consumers. + * + * Lost messages are detected, resent and deduplicated if needed. This is also driven by the consumer side, + * which means that the `ShardingProducerController` will not push resends unless requested by the + * `ShardingConsumerController`. + * + * Until sent messages have been confirmed the `ShardingProducerController` keeps them in memory to be able to + * resend them. If the JVM of the `ShardingProducerController` crashes those unconfirmed messages are lost. + * To make sure the messages can be delivered also in that scenario the `ShardingProducerController` can be + * used with a [[DurableProducerQueue]]. Then the unconfirmed messages are stored in a durable way so + * that they can be redelivered when the producer is started again. An implementation of the + * `DurableProducerQueue` is provided by `EventSourcedProducerQueue` in `akka-persistence-typed`. + * + * Instead of using `tell` with the `sendNextTo` in the `RequestNext` the producer can use `context.ask` + * with the `askNextTo` in the `RequestNext`. The difference is that a reply is sent back when the + * message has been handled. If a `DurableProducerQueue` is used then the reply is sent when the message + * has been stored successfully, but it might not have been processed by the consumer yet. Otherwise the + * reply is sent after the consumer has processed and confirmed the message. + * + * It's also possible to use the `ShardingProducerController` and `ShardingConsumerController` without resending + * lost messages, but the flow control is still used. This can be more efficient since messages + * don't have to be kept in memory in the `ProducerController` until they have been + * confirmed, but the drawback is that lost messages will not be delivered. See configuration + * `only-flow-control` of the `ShardingConsumerController`. + * + * The `producerId` is used in logging and included as MDC entry with key `"producerId"`. It's propagated + * to the `ConsumerController` and is useful for correlating log messages. It can be any `String` but it's + * recommended to use a unique identifier of representing the producer. + */ +@ApiMayChange // TODO #28719 when removing ApiMayChange consider removing `case class` for some of the messages +object ShardingProducerController { + + import ShardingProducerControllerImpl.UnsealedInternalCommand + + type EntityId = String + + sealed trait Command[A] extends UnsealedInternalCommand + + /** + * Initial message from the producer actor. The `producer` is typically constructed + * as a message adapter to map the [[RequestNext]] to the protocol of the producer actor. + * + * If the producer is restarted it should send a new `Start` message to the + * `ShardingProducerController`. + */ + final case class Start[A](producer: ActorRef[RequestNext[A]]) extends Command[A] + + /** + * For sending confirmation message back to the producer when the message has been confirmed. + * Typically used with `context.ask` from the producer. + * + * If `DurableProducerQueue` is used the confirmation reply is sent when the message has been + * successfully stored, meaning that the actual delivery to the consumer may happen later. + * If `DurableProducerQueue` is not used the confirmation reply is sent when the message has been + * fully delivered, processed, and confirmed by the consumer. + */ + final case class MessageWithConfirmation[A](entityId: EntityId, message: A, replyTo: ActorRef[Done]) + extends UnsealedInternalCommand + + /** + * The `ProducerController` sends `RequestNext` to the producer when it is allowed to send one + * message via the `sendNextTo` or `askNextTo`. It should wait for next `RequestNext` before + * sending one more message. + * + * `entitiesWithDemand` contains information about which entities that have demand. It is allowed + * to send to a new `entityId` that is not included in the `entitiesWithDemand`. If sending to + * an entity that doesn't have demand the message will be buffered, and that can be seen in the + * `bufferedForEntitiesWithoutDemand`. + * + * This support for buffering means that it is even allowed to send several messages in response + * to one `RequestNext` but it's recommended to only send one message and wait for next `RequestNext` + * before sending more messages. + */ + final case class RequestNext[A]( + sendNextTo: ActorRef[ShardingEnvelope[A]], + askNextTo: ActorRef[MessageWithConfirmation[A]], + entitiesWithDemand: Set[EntityId], + bufferedForEntitiesWithoutDemand: Map[EntityId, Int]) { + + /** Java API */ + def getEntitiesWithDemand: java.util.Set[String] = { + import akka.util.ccompat.JavaConverters._ + entitiesWithDemand.asJava + } + + /** Java API */ + def getBufferedForEntitiesWithoutDemand: java.util.Map[String, Integer] = { + import akka.util.ccompat.JavaConverters._ + bufferedForEntitiesWithoutDemand.iterator.map { case (k, v) => k -> v.asInstanceOf[Integer] }.toMap.asJava + } + } + + /** + * Java API: The generic `Class` type for `ShardingProducerController.RequestNext` that can be used when creating a + * `messageAdapter` for `Class>`. + */ + def requestNextClass[A](): Class[RequestNext[A]] = classOf[RequestNext[A]] + + object Settings { + + /** + * Scala API: Factory method from config `akka.reliable-delivery.sharding.producer-controller` + * of the `ActorSystem`. + */ + def apply(system: ActorSystem[_]): Settings = + apply(system.settings.config.getConfig("akka.reliable-delivery.sharding.producer-controller")) + + /** + * Scala API: Factory method from Config corresponding to + * `akka.reliable-delivery.sharding.producer-controller`. + */ + def apply(config: Config): Settings = { + new Settings( + bufferSize = config.getInt("buffer-size"), + config.getDuration("internal-ask-timeout").asScala, + config.getDuration("cleanup-unused-after").asScala, + config.getDuration("resend-first-unconfirmed-idle-timeout").asScala, + ProducerController.Settings(config)) + } + + /** + * Java API: Factory method from config `akka.reliable-delivery.sharding.producer-controller` + * of the `ActorSystem`. + */ + def create(system: ActorSystem[_]): Settings = + apply(system) + + /** + * Java API: Factory method from Config corresponding to + * `akka.reliable-delivery.sharding.producer-controller`. + */ + def create(config: Config): Settings = + apply(config) + } + + final class Settings private ( + val bufferSize: Int, + val internalAskTimeout: FiniteDuration, + val cleanupUnusedAfter: FiniteDuration, + val resendFirsUnconfirmedIdleTimeout: FiniteDuration, + val producerControllerSettings: ProducerController.Settings) { + + def withBufferSize(newBufferSize: Int): Settings = + copy(bufferSize = newBufferSize) + + def withInternalAskTimeout(newInternalAskTimeout: FiniteDuration): Settings = + copy(internalAskTimeout = newInternalAskTimeout) + + def withInternalAskTimeout(newInternalAskTimeout: java.time.Duration): Settings = + copy(internalAskTimeout = newInternalAskTimeout.asScala) + + def withCleanupUnusedAfter(newCleanupUnusedAfter: FiniteDuration): Settings = + copy(cleanupUnusedAfter = newCleanupUnusedAfter) + + def withCleanupUnusedAfter(newCleanupUnusedAfter: java.time.Duration): Settings = + copy(cleanupUnusedAfter = newCleanupUnusedAfter.asScala) + + def withResendFirsUnconfirmedIdleTimeout(newResendFirsUnconfirmedIdleTimeout: FiniteDuration): Settings = + copy(resendFirsUnconfirmedIdleTimeout = newResendFirsUnconfirmedIdleTimeout) + + def withResendFirsUnconfirmedIdleTimeout(newResendFirsUnconfirmedIdleTimeout: java.time.Duration): Settings = + copy(resendFirsUnconfirmedIdleTimeout = newResendFirsUnconfirmedIdleTimeout.asScala) + + def withProducerControllerSettings(newProducerControllerSettings: ProducerController.Settings): Settings = + copy(producerControllerSettings = newProducerControllerSettings) + + /** + * Private copy method for internal use only. + */ + private def copy( + bufferSize: Int = bufferSize, + internalAskTimeout: FiniteDuration = internalAskTimeout, + cleanupUnusedAfter: FiniteDuration = cleanupUnusedAfter, + resendFirsUnconfirmedIdleTimeout: FiniteDuration = resendFirsUnconfirmedIdleTimeout, + producerControllerSettings: ProducerController.Settings = producerControllerSettings) = + new Settings( + bufferSize, + internalAskTimeout, + cleanupUnusedAfter, + resendFirsUnconfirmedIdleTimeout, + producerControllerSettings) + + override def toString: String = + s"Settings($bufferSize,$internalAskTimeout,$resendFirsUnconfirmedIdleTimeout,$producerControllerSettings)" + } + + def apply[A: ClassTag]( + producerId: String, + region: ActorRef[ShardingEnvelope[ConsumerController.SequencedMessage[A]]], + durableQueueBehavior: Option[Behavior[DurableProducerQueue.Command[A]]]): Behavior[Command[A]] = { + Behaviors.setup { context => + ShardingProducerControllerImpl(producerId, region, durableQueueBehavior, Settings(context.system)) + } + } + + def apply[A: ClassTag]( + producerId: String, + region: ActorRef[ShardingEnvelope[ConsumerController.SequencedMessage[A]]], + durableQueueBehavior: Option[Behavior[DurableProducerQueue.Command[A]]], + settings: Settings): Behavior[Command[A]] = { + ShardingProducerControllerImpl(producerId, region, durableQueueBehavior, settings) + } + + /** + * Java API + */ + def create[A]( + messageClass: Class[A], + producerId: String, + region: ActorRef[ShardingEnvelope[ConsumerController.SequencedMessage[A]]], + durableQueueBehavior: Optional[Behavior[DurableProducerQueue.Command[A]]]): Behavior[Command[A]] = { + apply(producerId, region, durableQueueBehavior.asScala)(ClassTag(messageClass)) + } + + /** + * Java API + */ + def create[A]( + messageClass: Class[A], + producerId: String, + region: ActorRef[ShardingEnvelope[ConsumerController.SequencedMessage[A]]], + durableQueueBehavior: Optional[Behavior[DurableProducerQueue.Command[A]]], + settings: Settings): Behavior[Command[A]] = { + apply(producerId, region, durableQueueBehavior.asScala, settings)(ClassTag(messageClass)) + } + + // TODO maybe there is a need for variant taking message extractor instead of ShardingEnvelope +} diff --git a/akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/delivery/internal/ShardingConsumerControllerImpl.scala b/akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/delivery/internal/ShardingConsumerControllerImpl.scala new file mode 100644 index 00000000000..cda803f0695 --- /dev/null +++ b/akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/delivery/internal/ShardingConsumerControllerImpl.scala @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2020-2020 Lightbend Inc. + */ + +package akka.cluster.sharding.typed.delivery.internal + +import akka.actor.typed.ActorRef +import akka.actor.typed.Behavior +import akka.actor.typed.Terminated +import akka.actor.typed.delivery.ConsumerController +import akka.actor.typed.delivery.internal.ConsumerControllerImpl +import akka.actor.typed.delivery.internal.ProducerControllerImpl +import akka.actor.typed.scaladsl.ActorContext +import akka.actor.typed.scaladsl.Behaviors +import akka.annotation.InternalApi +import akka.cluster.sharding.typed.delivery.ShardingConsumerController + +/** + * INTERNAL API + */ +@InternalApi private[akka] object ShardingConsumerControllerImpl { + def apply[A, B]( + consumerBehavior: ActorRef[ConsumerController.Start[A]] => Behavior[B], + settings: ShardingConsumerController.Settings): Behavior[ConsumerController.SequencedMessage[A]] = { + Behaviors + .setup[ConsumerController.Command[A]] { context => + context.setLoggerName("akka.cluster.sharding.typed.delivery.ShardingConsumerController") + val consumer = context.spawn(consumerBehavior(context.self), name = "consumer") + context.watch(consumer) + waitForStart(context, settings, consumer) + } + .narrow + } + + private def waitForStart[A]( + context: ActorContext[ConsumerController.Command[A]], + settings: ShardingConsumerController.Settings, + consumer: ActorRef[_]): Behavior[ConsumerController.Command[A]] = { + Behaviors.withStash(settings.bufferSize) { stashBuffer => + Behaviors + .receiveMessage[ConsumerController.Command[A]] { + case start: ConsumerController.Start[A] => + ConsumerControllerImpl.enforceLocalConsumer(start.deliverTo) + context.unwatch(consumer) + context.watch(start.deliverTo) + stashBuffer.unstashAll( + new ShardingConsumerControllerImpl[A](context, start.deliverTo, settings).active(Map.empty, Map.empty)) + case other => + stashBuffer.stash(other) + Behaviors.same + } + .receiveSignal { + case (_, Terminated(`consumer`)) => + context.log.debug("Consumer terminated before initialized.") + Behaviors.stopped + } + } + } + +} + +private class ShardingConsumerControllerImpl[A]( + context: ActorContext[ConsumerController.Command[A]], + deliverTo: ActorRef[ConsumerController.Delivery[A]], + settings: ShardingConsumerController.Settings) { + + def active( + // ProducerController -> producerId + producerControllers: Map[ActorRef[ProducerControllerImpl.InternalCommand], String], + // producerId -> ConsumerController + consumerControllers: Map[String, ActorRef[ConsumerController.Command[A]]]) + : Behavior[ConsumerController.Command[A]] = { + + Behaviors + .receiveMessagePartial[ConsumerController.Command[A]] { + case seqMsg: ConsumerController.SequencedMessage[A] => + def updatedProducerControllers(): Map[ActorRef[ProducerControllerImpl.InternalCommand], String] = { + producerControllers.get(seqMsg.producerController) match { + case Some(_) => + producerControllers + case None => + context.watch(seqMsg.producerController) + producerControllers.updated(seqMsg.producerController, seqMsg.producerId) + } + } + + consumerControllers.get(seqMsg.producerId) match { + case Some(c) => + c ! seqMsg + active(updatedProducerControllers(), consumerControllers) + case None => + context.log.debug("Starting ConsumerController for producerId [{}].", seqMsg.producerId) + val cc = context.spawn( + ConsumerController[A](settings.consumerControllerSettings), + s"consumerController-${seqMsg.producerId}") + context.watch(cc) + cc ! ConsumerController.Start(deliverTo) + cc ! seqMsg + active(updatedProducerControllers(), consumerControllers.updated(seqMsg.producerId, cc)) + } + } + .receiveSignal { + case (_, Terminated(`deliverTo`)) => + context.log.debug("Consumer terminated.") + Behaviors.stopped + case (_, Terminated(ref)) => + val producerControllerRef = ref.unsafeUpcast[ProducerControllerImpl.InternalCommand] + producerControllers.get(producerControllerRef) match { + case Some(producerId) => + context.log.debug("ProducerController for producerId [{}] terminated.", producerId) + val newControllers = producerControllers - producerControllerRef + consumerControllers.get(producerId).foreach { cc => + cc ! ConsumerController.DeliverThenStop() + } + active(newControllers, consumerControllers) + case None => + consumerControllers.find { case (_, cc) => ref == cc } match { + case Some((producerId, _)) => + context.log.debug("ConsumerController for producerId [{}] terminated.", producerId) + val newControllers = consumerControllers - producerId + active(producerControllers, newControllers) + case None => + context.log.debug("Unknown {} terminated.", ref) + Behaviors.same + } + } + } + + } + +} diff --git a/akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/delivery/internal/ShardingProducerControllerImpl.scala b/akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/delivery/internal/ShardingProducerControllerImpl.scala new file mode 100644 index 00000000000..878ea438c45 --- /dev/null +++ b/akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/delivery/internal/ShardingProducerControllerImpl.scala @@ -0,0 +1,598 @@ +/* + * Copyright (C) 2019-2020 Lightbend Inc. + */ + +package akka.cluster.sharding.typed.delivery.internal + +import java.util.concurrent.TimeoutException + +import scala.reflect.ClassTag +import scala.util.Failure +import scala.util.Success + +import akka.Done +import akka.actor.typed.ActorRef +import akka.actor.typed.Behavior +import akka.actor.typed.delivery.ConsumerController +import akka.actor.typed.delivery.DurableProducerQueue +import akka.actor.typed.delivery.DurableProducerQueue.ConfirmationQualifier +import akka.actor.typed.delivery.DurableProducerQueue.SeqNr +import akka.actor.typed.delivery.ProducerController +import akka.actor.typed.delivery.internal.ProducerControllerImpl +import akka.actor.typed.scaladsl.ActorContext +import akka.actor.typed.scaladsl.Behaviors +import akka.actor.typed.scaladsl.LoggerOps +import akka.actor.typed.scaladsl.StashBuffer +import akka.annotation.InternalApi +import akka.cluster.sharding.typed.ShardingEnvelope +import akka.cluster.sharding.typed.delivery.ShardingProducerController +import akka.util.Timeout + +/** + * INTERNAL API + */ +@InternalApi private[akka] object ShardingProducerControllerImpl { + + import ShardingProducerController.Command + import ShardingProducerController.EntityId + import ShardingProducerController.RequestNext + import ShardingProducerController.Start + + sealed trait InternalCommand + + /** For commands defined in public ShardingProducerController */ + trait UnsealedInternalCommand extends InternalCommand + + private type TotalSeqNr = Long + private type OutSeqNr = Long + private type OutKey = String + + private final case class Ack(outKey: OutKey, confirmedSeqNr: OutSeqNr) extends InternalCommand + private final case class AskTimeout(outKey: OutKey, outSeqNr: OutSeqNr) extends InternalCommand + + private final case class WrappedRequestNext[A](next: ProducerController.RequestNext[A]) extends InternalCommand + + private final case class Msg[A](envelope: ShardingEnvelope[A], alreadyStored: TotalSeqNr) extends InternalCommand { + def isAlreadyStored: Boolean = alreadyStored > 0 + } + + private case class LoadStateReply[A](state: DurableProducerQueue.State[A]) extends InternalCommand + private case class LoadStateFailed(attempt: Int) extends InternalCommand + private case class StoreMessageSentReply(ack: DurableProducerQueue.StoreMessageSentAck) + private case class StoreMessageSentFailed[A](messageSent: DurableProducerQueue.MessageSent[A], attempt: Int) + extends InternalCommand + private case class StoreMessageSentCompleted[A](messageSent: DurableProducerQueue.MessageSent[A]) + extends InternalCommand + private case object DurableQueueTerminated extends InternalCommand + + private case object ResendFirstUnconfirmed extends InternalCommand + private case object CleanupUnused extends InternalCommand + + private final case class OutState[A]( + entityId: EntityId, + producerController: ActorRef[ProducerController.Command[A]], + nextTo: Option[ProducerController.RequestNext[A]], + buffered: Vector[Buffered[A]], + seqNr: OutSeqNr, + unconfirmed: Vector[Unconfirmed[A]], + usedNanoTime: Long) { + if (nextTo.nonEmpty && buffered.nonEmpty) + throw new IllegalStateException("nextTo and buffered shouldn't both be nonEmpty.") + } + + private final case class Buffered[A](totalSeqNr: TotalSeqNr, msg: A, replyTo: Option[ActorRef[Done]]) + + private final case class Unconfirmed[A](totalSeqNr: TotalSeqNr, outSeqNr: OutSeqNr, replyTo: Option[ActorRef[Done]]) + + private final case class State[A]( + currentSeqNr: TotalSeqNr, + producer: ActorRef[ShardingProducerController.RequestNext[A]], + out: Map[OutKey, OutState[A]], + // replyAfterStore is used when durableQueue is enabled, otherwise they are tracked in OutState + replyAfterStore: Map[TotalSeqNr, ActorRef[Done]]) { + + def bufferSize: Long = { + out.valuesIterator.foldLeft(0L) { case (acc, outState) => acc + outState.buffered.size } + } + } + + def apply[A: ClassTag]( + producerId: String, + region: ActorRef[ShardingEnvelope[ConsumerController.SequencedMessage[A]]], + durableQueueBehavior: Option[Behavior[DurableProducerQueue.Command[A]]], + settings: ShardingProducerController.Settings): Behavior[Command[A]] = { + Behaviors + .withStash[InternalCommand](settings.bufferSize) { stashBuffer => + Behaviors.setup[InternalCommand] { context => + Behaviors.withMdc(staticMdc = Map("producerId" -> producerId)) { + context.setLoggerName("akka.cluster.sharding.typed.delivery.ShardingProducerController") + + val durableQueue = askLoadState(context, durableQueueBehavior, settings) + + waitingForStart( + producerId, + context, + stashBuffer, + region, + durableQueue, + None, + createInitialState(durableQueue.nonEmpty), + settings) + } + } + } + .narrow + } + + private def createInitialState[A: ClassTag](hasDurableQueue: Boolean) = { + if (hasDurableQueue) None else Some(DurableProducerQueue.State.empty[A]) + } + + private def waitingForStart[A: ClassTag]( + producerId: String, + context: ActorContext[InternalCommand], + stashBuffer: StashBuffer[InternalCommand], + region: ActorRef[ShardingEnvelope[ConsumerController.SequencedMessage[A]]], + durableQueue: Option[ActorRef[DurableProducerQueue.Command[A]]], + producer: Option[ActorRef[RequestNext[A]]], + initialState: Option[DurableProducerQueue.State[A]], + settings: ShardingProducerController.Settings): Behavior[InternalCommand] = { + + def becomeActive(p: ActorRef[RequestNext[A]], s: DurableProducerQueue.State[A]): Behavior[InternalCommand] = { + Behaviors.withTimers { timers => + timers.startTimerWithFixedDelay(CleanupUnused, settings.cleanupUnusedAfter / 2) + timers.startTimerWithFixedDelay(ResendFirstUnconfirmed, settings.resendFirsUnconfirmedIdleTimeout / 2) + + // resend unconfirmed before other stashed messages + Behaviors.withStash[InternalCommand](settings.bufferSize) { newStashBuffer => + Behaviors.setup { _ => + s.unconfirmed.foreach { m => + newStashBuffer.stash(Msg(ShardingEnvelope(m.confirmationQualifier, m.message), alreadyStored = m.seqNr)) + } + // append other stashed messages after the unconfirmed + stashBuffer.foreach(newStashBuffer.stash) + + val msgAdapter: ActorRef[ShardingEnvelope[A]] = context.messageAdapter(msg => Msg(msg, alreadyStored = 0)) + if (s.unconfirmed.isEmpty) + p ! RequestNext(msgAdapter, context.self, Set.empty, Map.empty) + val b = new ShardingProducerControllerImpl(context, producerId, msgAdapter, region, durableQueue, settings) + .active(State(s.currentSeqNr, p, Map.empty, Map.empty)) + + newStashBuffer.unstashAll(b) + } + } + } + } + + Behaviors.receiveMessage { + case start: Start[A] @unchecked => + ProducerControllerImpl.enforceLocalProducer(start.producer) + initialState match { + case Some(s) => + becomeActive(start.producer, s) + case None => + // waiting for LoadStateReply + waitingForStart( + producerId, + context, + stashBuffer, + region, + durableQueue, + Some(start.producer), + initialState, + settings) + } + + case load: LoadStateReply[A] @unchecked => + producer match { + case Some(p) => + becomeActive(p, load.state) + case None => + // waiting for LoadStateReply + waitingForStart( + producerId, + context, + stashBuffer, + region, + durableQueue, + producer, + Some(load.state), + settings) + } + + case LoadStateFailed(attempt) => + if (attempt >= settings.producerControllerSettings.durableQueueRetryAttempts) { + val errorMessage = s"LoadState failed after [$attempt] attempts, giving up." + context.log.error(errorMessage) + throw new TimeoutException(errorMessage) + } else { + context.log.warn( + "LoadState failed, attempt [{}] of [{}], retrying.", + attempt, + settings.producerControllerSettings.durableQueueRetryAttempts) + // retry + askLoadState(context, durableQueue, settings, attempt + 1) + Behaviors.same + } + + case DurableQueueTerminated => + throw new IllegalStateException("DurableQueue was unexpectedly terminated.") + + case other => + checkStashFull(stashBuffer) + stashBuffer.stash(other) + Behaviors.same + } + } + + private def checkStashFull[A: ClassTag](stashBuffer: StashBuffer[InternalCommand]): Unit = { + if (stashBuffer.isFull) + throw new IllegalArgumentException(s"Buffer is full, size [${stashBuffer.size}].") + } + + private def askLoadState[A: ClassTag]( + context: ActorContext[InternalCommand], + durableQueueBehavior: Option[Behavior[DurableProducerQueue.Command[A]]], + settings: ShardingProducerController.Settings): Option[ActorRef[DurableProducerQueue.Command[A]]] = { + + durableQueueBehavior.map { b => + val ref = context.spawn(b, "durable") + context.watchWith(ref, DurableQueueTerminated) + askLoadState(context, Some(ref), settings, attempt = 1) + ref + } + } + + private def askLoadState[A: ClassTag]( + context: ActorContext[InternalCommand], + durableQueue: Option[ActorRef[DurableProducerQueue.Command[A]]], + settings: ShardingProducerController.Settings, + attempt: Int): Unit = { + implicit val loadTimeout: Timeout = settings.producerControllerSettings.durableQueueRequestTimeout + durableQueue.foreach { ref => + context.ask[DurableProducerQueue.LoadState[A], DurableProducerQueue.State[A]]( + ref, + askReplyTo => DurableProducerQueue.LoadState[A](askReplyTo)) { + case Success(s) => LoadStateReply(s) + case Failure(_) => LoadStateFailed(attempt) // timeout + } + } + } + +} + +private class ShardingProducerControllerImpl[A: ClassTag]( + context: ActorContext[ShardingProducerControllerImpl.InternalCommand], + producerId: String, + msgAdapter: ActorRef[ShardingEnvelope[A]], + region: ActorRef[ShardingEnvelope[ConsumerController.SequencedMessage[A]]], + durableQueue: Option[ActorRef[DurableProducerQueue.Command[A]]], + settings: ShardingProducerController.Settings) { + import DurableProducerQueue.MessageSent + import DurableProducerQueue.StoreMessageConfirmed + import DurableProducerQueue.StoreMessageSent + import DurableProducerQueue.StoreMessageSentAck + import ShardingProducerController.EntityId + import ShardingProducerController.MessageWithConfirmation + import ShardingProducerController.RequestNext + import ShardingProducerController.Start + import ShardingProducerControllerImpl._ + + private val durableQueueAskTimeout: Timeout = settings.producerControllerSettings.durableQueueRequestTimeout + private val entityAskTimeout: Timeout = settings.internalAskTimeout + + private val requestNextAdapter: ActorRef[ProducerController.RequestNext[A]] = + context.messageAdapter(WrappedRequestNext.apply) + + private def active(s: State[A]): Behavior[InternalCommand] = { + + def onMessage( + entityId: EntityId, + msg: A, + replyTo: Option[ActorRef[Done]], + totalSeqNr: TotalSeqNr, + newReplyAfterStore: Map[TotalSeqNr, ActorRef[Done]]): Behavior[InternalCommand] = { + + val outKey = s"$producerId-$entityId" + val newState = + s.out.get(outKey) match { + case Some(out @ OutState(_, _, Some(nextTo), _, _, _, _)) => + // there is demand, send immediately + send(msg, outKey, out.seqNr, nextTo) + val newUnconfirmed = out.unconfirmed :+ Unconfirmed(totalSeqNr, out.seqNr, replyTo) + s.copy( + out = s.out.updated( + outKey, + out.copy( + seqNr = out.seqNr + 1, + nextTo = None, + unconfirmed = newUnconfirmed, + usedNanoTime = System.nanoTime())), + replyAfterStore = newReplyAfterStore) + case Some(out @ OutState(_, _, None, buffered, _, _, _)) => + // no demand, buffer + if (s.bufferSize >= settings.bufferSize) + throw new IllegalArgumentException(s"Buffer is full, size [${settings.bufferSize}].") + context.log.debug( + "Buffering message to entityId [{}], buffer size for entity [{}]", + entityId, + buffered.size + 1) + val newBuffered = buffered :+ Buffered(totalSeqNr, msg, replyTo) + val newS = + s.copy( + out = s.out.updated(outKey, out.copy(buffered = newBuffered)), + replyAfterStore = newReplyAfterStore) + // send an updated RequestNext to indicate buffer usage + s.producer ! createRequestNext(newS) + newS + case None => + context.log.debug("Creating ProducerController for entity [{}]", entityId) + val send: ConsumerController.SequencedMessage[A] => Unit = { seqMsg => + region ! ShardingEnvelope(entityId, seqMsg) + } + val p = context.spawn( + ProducerController[A](outKey, durableQueueBehavior = None, settings.producerControllerSettings, send), + entityId) + p ! ProducerController.Start(requestNextAdapter) + s.copy( + out = s.out.updated( + outKey, + OutState( + entityId, + p, + None, + Vector(Buffered(totalSeqNr, msg, replyTo)), + 1L, + Vector.empty, + System.nanoTime())), + replyAfterStore = newReplyAfterStore) + } + + active(newState) + } + + def onAck(outState: OutState[A], confirmedSeqNr: OutSeqNr): Vector[Unconfirmed[A]] = { + val (confirmed, newUnconfirmed) = outState.unconfirmed.partition { + case Unconfirmed(_, seqNr, _) => seqNr <= confirmedSeqNr + } + + if (confirmed.nonEmpty) { + confirmed.foreach { + case Unconfirmed(_, _, None) => // no reply + case Unconfirmed(_, _, Some(replyTo)) => + replyTo ! Done + } + + durableQueue.foreach { d => + // Storing the confirmedSeqNr can be "write behind", at-least-once delivery + d ! StoreMessageConfirmed(confirmed.last.totalSeqNr, outState.entityId, System.currentTimeMillis()) + } + } + + newUnconfirmed + } + + def receiveStoreMessageSentCompleted( + seqNr: SeqNr, + msg: A, + entityId: ConfirmationQualifier): Behavior[InternalCommand] = { + s.replyAfterStore.get(seqNr).foreach { replyTo => + context.log.info("Confirmation reply to [{}] after storage", seqNr) + replyTo ! Done + } + val newReplyAfterStore = s.replyAfterStore - seqNr + + onMessage(entityId, msg, replyTo = None, seqNr, newReplyAfterStore) + } + + def receiveStoreMessageSentFailed(f: StoreMessageSentFailed[A]): Behavior[InternalCommand] = { + if (f.attempt >= settings.producerControllerSettings.durableQueueRetryAttempts) { + val errorMessage = + s"StoreMessageSentFailed seqNr [${f.messageSent.seqNr}] failed after [${f.attempt}] attempts, giving up." + context.log.error(errorMessage) + throw new TimeoutException(errorMessage) + } else { + context.log.info(s"StoreMessageSent seqNr [{}] failed, attempt [{}], retrying.", f.messageSent.seqNr, f.attempt) + // retry + storeMessageSent(f.messageSent, attempt = f.attempt + 1) + Behaviors.same + } + } + + def receiveAck(ack: Ack): Behavior[InternalCommand] = { + s.out.get(ack.outKey) match { + case Some(outState) => + context.log.trace2("Received Ack, confirmed [{}], current [{}].", ack.confirmedSeqNr, s.currentSeqNr) + val newUnconfirmed = onAck(outState, ack.confirmedSeqNr) + val newUsedNanoTime = + if (newUnconfirmed.size != outState.unconfirmed.size) System.nanoTime() else outState.usedNanoTime + active( + s.copy(out = + s.out.updated(ack.outKey, outState.copy(unconfirmed = newUnconfirmed, usedNanoTime = newUsedNanoTime)))) + case None => + // obsolete Ack, ConsumerController already deregistered + Behaviors.unhandled + } + } + + def receiveWrappedRequestNext(w: WrappedRequestNext[A]): Behavior[InternalCommand] = { + val next = w.next + val outKey = next.producerId + s.out.get(outKey) match { + case Some(out) => + if (out.nextTo.nonEmpty) + throw new IllegalStateException(s"Received RequestNext but already has demand for [$outKey]") + + val confirmedSeqNr = w.next.confirmedSeqNr + context.log.trace("Received RequestNext from [{}], confirmed seqNr [{}]", out.entityId, confirmedSeqNr) + val newUnconfirmed = onAck(out, confirmedSeqNr) + + if (out.buffered.nonEmpty) { + val buf = out.buffered.head + send(buf.msg, outKey, out.seqNr, next) + val newUnconfirmed2 = newUnconfirmed :+ Unconfirmed(buf.totalSeqNr, out.seqNr, buf.replyTo) + val newProducers = s.out.updated( + outKey, + out.copy( + seqNr = out.seqNr + 1, + nextTo = None, + unconfirmed = newUnconfirmed2, + buffered = out.buffered.tail, + usedNanoTime = System.nanoTime())) + active(s.copy(out = newProducers)) + } else { + val newProducers = + s.out.updated( + outKey, + out.copy(nextTo = Some(next), unconfirmed = newUnconfirmed, usedNanoTime = System.nanoTime())) + val newState = s.copy(out = newProducers) + // send an updated RequestNext + s.producer ! createRequestNext(newState) + active(newState) + } + + case None => + // if ProducerController was stopped and there was a RequestNext in flight, but will not happen in practise + context.log.warn("Received RequestNext for unknown [{}]", outKey) + Behaviors.same + } + } + + def receiveStart(start: Start[A]): Behavior[InternalCommand] = { + ProducerControllerImpl.enforceLocalProducer(start.producer) + context.log.debug("Register new Producer [{}], currentSeqNr [{}].", start.producer, s.currentSeqNr) + start.producer ! createRequestNext(s) + active(s.copy(producer = start.producer)) + } + + def receiveResendFirstUnconfirmed(): Behavior[InternalCommand] = { + val now = System.nanoTime() + s.out.foreach { + case (outKey: OutKey, outState) => + val idleDurationMillis = (now - outState.usedNanoTime) / 1000 / 1000 + if (outState.unconfirmed.nonEmpty && idleDurationMillis >= settings.resendFirsUnconfirmedIdleTimeout.toMillis) { + context.log.debug( + "Resend first unconfirmed for [{}], because it was idle for [{} ms]", + outKey, + idleDurationMillis) + outState.producerController + .unsafeUpcast[ProducerControllerImpl.InternalCommand] ! ProducerControllerImpl.ResendFirstUnconfirmed + } + } + Behaviors.same + } + + def receiveCleanupUnused(): Behavior[InternalCommand] = { + val now = System.nanoTime() + val removeOutKeys = + s.out.flatMap { + case (outKey: OutKey, outState) => + val idleDurationMillis = (now - outState.usedNanoTime) / 1000 / 1000 + if (outState.unconfirmed.isEmpty && outState.buffered.isEmpty && idleDurationMillis >= settings.cleanupUnusedAfter.toMillis) { + context.log.debug("Cleanup unused [{}], because it was idle for [{} ms]", outKey, idleDurationMillis) + context.stop(outState.producerController) + Some(outKey) + } else + None + } + if (removeOutKeys.isEmpty) + Behaviors.same + else + active(s.copy(out = s.out -- removeOutKeys)) + } + + Behaviors.receiveMessage { + + case msg: Msg[A] => + if (durableQueue.isEmpty) { + // currentSeqNr is only updated when durableQueue is enabled + onMessage(msg.envelope.entityId, msg.envelope.message, None, s.currentSeqNr, s.replyAfterStore) + } else if (msg.isAlreadyStored) { + // loaded from durable queue, currentSeqNr has already b + onMessage(msg.envelope.entityId, msg.envelope.message, None, msg.alreadyStored, s.replyAfterStore) + } else { + storeMessageSent( + MessageSent(s.currentSeqNr, msg.envelope.message, false, msg.envelope.entityId, System.currentTimeMillis()), + attempt = 1) + active(s.copy(currentSeqNr = s.currentSeqNr + 1)) + } + + case MessageWithConfirmation(entityId, message: A, replyTo) => + if (durableQueue.isEmpty) { + onMessage(entityId, message, Some(replyTo), s.currentSeqNr, s.replyAfterStore) + } else { + storeMessageSent( + MessageSent(s.currentSeqNr, message, ack = true, entityId, System.currentTimeMillis()), + attempt = 1) + val newReplyAfterStore = s.replyAfterStore.updated(s.currentSeqNr, replyTo) + active(s.copy(currentSeqNr = s.currentSeqNr + 1, replyAfterStore = newReplyAfterStore)) + } + + case StoreMessageSentCompleted(MessageSent(seqNr, msg: A, _, entityId, _)) => + receiveStoreMessageSentCompleted(seqNr, msg, entityId) + + case f: StoreMessageSentFailed[A] => + receiveStoreMessageSentFailed(f) + + case ack: Ack => + receiveAck(ack) + + case w: WrappedRequestNext[A] => + receiveWrappedRequestNext(w) + + case ResendFirstUnconfirmed => + receiveResendFirstUnconfirmed() + + case CleanupUnused => + receiveCleanupUnused() + + case start: Start[A] => + receiveStart(start) + + case AskTimeout(outKey, outSeqNr) => + context.log.debug( + "Message seqNr [{}] sent to entity [{}] timed out. It will be be redelivered.", + outSeqNr, + outKey) + Behaviors.same + + case DurableQueueTerminated => + throw new IllegalStateException("DurableQueue was unexpectedly terminated.") + + } + } + + private def createRequestNext(s: State[A]): RequestNext[A] = { + val entitiesWithDemand = s.out.valuesIterator.collect { case out if out.nextTo.nonEmpty => out.entityId }.toSet + val bufferedForEntitesWithoutDemand = s.out.valuesIterator.collect { + case out if out.nextTo.isEmpty => out.entityId -> out.buffered.size + }.toMap + RequestNext(msgAdapter, context.self, entitiesWithDemand, bufferedForEntitesWithoutDemand) + } + + private def send(msg: A, outKey: OutKey, outSeqNr: OutSeqNr, nextTo: ProducerController.RequestNext[A]): Unit = { + if (context.log.isTraceEnabled) + context.log.traceN("Sending [{}] to [{}] with outSeqNr [{}].", msg.getClass.getName, outKey, outSeqNr) + implicit val askTimeout: Timeout = entityAskTimeout + context.ask[ProducerController.MessageWithConfirmation[A], OutSeqNr]( + nextTo.askNextTo, + ProducerController.MessageWithConfirmation(msg, _)) { + case Success(seqNr) => + if (seqNr != outSeqNr) + context.log.error("Inconsistent Ack seqNr [{}] != [{}]", seqNr, outSeqNr) + Ack(outKey, seqNr) + case Failure(_) => + AskTimeout(outKey, outSeqNr) + } + } + + private def storeMessageSent(messageSent: MessageSent[A], attempt: Int): Unit = { + implicit val askTimeout: Timeout = durableQueueAskTimeout + context.ask[StoreMessageSent[A], StoreMessageSentAck]( + durableQueue.get, + askReplyTo => StoreMessageSent(messageSent, askReplyTo)) { + case Success(_) => StoreMessageSentCompleted(messageSent) + case Failure(_) => StoreMessageSentFailed(messageSent, attempt) // timeout + } + } +} diff --git a/akka-cluster-sharding-typed/src/test/java/jdocs/delivery/PointToPointDocExample.java b/akka-cluster-sharding-typed/src/test/java/jdocs/delivery/PointToPointDocExample.java new file mode 100644 index 00000000000..85ffdb005b1 --- /dev/null +++ b/akka-cluster-sharding-typed/src/test/java/jdocs/delivery/PointToPointDocExample.java @@ -0,0 +1,170 @@ +/* + * Copyright (C) 2020 Lightbend Inc. + */ + +package jdocs.delivery; + +// #imports +import akka.actor.typed.ActorRef; +import akka.actor.typed.Behavior; +import akka.actor.typed.delivery.ProducerController; +import akka.actor.typed.javadsl.AbstractBehavior; +import akka.actor.typed.javadsl.ActorContext; +import akka.actor.typed.javadsl.Behaviors; +import akka.actor.typed.javadsl.Receive; +import java.math.BigInteger; +import java.util.Optional; + +// #imports + +// #consumer +import akka.actor.typed.delivery.ConsumerController; + +// #consumer + +import akka.actor.typed.ActorSystem; + +import java.util.UUID; + +interface PointToPointDocExample { + + // #producer + public class FibonacciProducer extends AbstractBehavior { + + private long n = 0; + private BigInteger b = BigInteger.ONE; + private BigInteger a = BigInteger.ZERO; + + interface Command {} + + private static class WrappedRequestNext implements Command { + final ProducerController.RequestNext next; + + private WrappedRequestNext(ProducerController.RequestNext next) { + this.next = next; + } + } + + private FibonacciProducer(ActorContext context) { + super(context); + } + + public static Behavior create( + ActorRef> producerController) { + return Behaviors.setup( + context -> { + ActorRef> requestNextAdapter = + context.messageAdapter( + ProducerController.requestNextClass(), WrappedRequestNext::new); + producerController.tell(new ProducerController.Start<>(requestNextAdapter)); + + return new FibonacciProducer(context); + }); + } + + @Override + public Receive createReceive() { + return newReceiveBuilder() + .onMessage(WrappedRequestNext.class, w -> onWrappedRequestNext(w)) + .build(); + } + + private Behavior onWrappedRequestNext(WrappedRequestNext w) { + getContext().getLog().info("Generated fibonacci {}: {}", n, a); + w.next.sendNextTo().tell(new FibonacciConsumer.FibonacciNumber(n, a)); + + if (n == 1000) { + return Behaviors.stopped(); + } else { + n = n + 1; + b = a.add(b); + a = b; + return this; + } + } + } + // #producer + + // #consumer + public class FibonacciConsumer extends AbstractBehavior { + + interface Command {} + + public static class FibonacciNumber implements Command { + public final long n; + public final BigInteger value; + + public FibonacciNumber(long n, BigInteger value) { + this.n = n; + this.value = value; + } + } + + private static class WrappedDelivery implements Command { + final ConsumerController.Delivery delivery; + + private WrappedDelivery(ConsumerController.Delivery delivery) { + this.delivery = delivery; + } + } + + public static Behavior create( + ActorRef> consumerController) { + return Behaviors.setup( + context -> { + ActorRef> deliveryAdapter = + context.messageAdapter(ConsumerController.deliveryClass(), WrappedDelivery::new); + consumerController.tell(new ConsumerController.Start<>(deliveryAdapter)); + + return new FibonacciConsumer(context); + }); + } + + private FibonacciConsumer(ActorContext context) { + super(context); + } + + @Override + public Receive createReceive() { + return newReceiveBuilder().onMessage(WrappedDelivery.class, this::onDelivery).build(); + } + + private Behavior onDelivery(WrappedDelivery w) { + FibonacciNumber number = (FibonacciNumber) w.delivery.message(); + getContext().getLog().info("Processed fibonacci {}: {}", number.n, number.value); + w.delivery.confirmTo().tell(ConsumerController.confirmed()); + return this; + } + } + // #consumer + + public class Guardian { + public static Behavior create() { + return Behaviors.setup( + context -> { + // #connect + ActorRef> consumerController = + context.spawn(ConsumerController.create(), "consumerController"); + context.spawn(FibonacciConsumer.create(consumerController), "consumer"); + + String producerId = "fibonacci-" + UUID.randomUUID(); + ActorRef> producerController = + context.spawn( + ProducerController.create( + FibonacciConsumer.Command.class, producerId, Optional.empty()), + "producerController"); + context.spawn(FibonacciProducer.create(producerController), "producer"); + + consumerController.tell( + new ConsumerController.RegisterToProducerController<>(producerController)); + // #connect + + return Behaviors.empty(); + }); + } + } + + public static void main(String[] args) { + ActorSystem.create(Guardian.create(), "FibonacciExample"); + } +} diff --git a/akka-cluster-sharding-typed/src/test/java/jdocs/delivery/ShardingDocExample.java b/akka-cluster-sharding-typed/src/test/java/jdocs/delivery/ShardingDocExample.java new file mode 100644 index 00000000000..538bfeee785 --- /dev/null +++ b/akka-cluster-sharding-typed/src/test/java/jdocs/delivery/ShardingDocExample.java @@ -0,0 +1,445 @@ +/* + * Copyright (C) 2020 Lightbend Inc. + */ + +package jdocs.delivery; + +// #imports +import akka.Done; +import akka.actor.Address; +import akka.actor.typed.ActorRef; +import akka.actor.typed.Behavior; +import akka.actor.typed.delivery.ConsumerController; +import akka.actor.typed.javadsl.AbstractBehavior; +import akka.actor.typed.javadsl.ActorContext; +import akka.actor.typed.javadsl.Behaviors; +import akka.actor.typed.javadsl.Receive; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.CompletionStage; + +// #imports + +// #producer +import akka.cluster.sharding.typed.delivery.ShardingProducerController; + +// #producer + +// #init +import akka.cluster.sharding.typed.delivery.ShardingConsumerController; +import akka.cluster.sharding.typed.ShardingEnvelope; +import akka.cluster.sharding.typed.javadsl.ClusterSharding; +import akka.cluster.sharding.typed.javadsl.Entity; +import akka.cluster.sharding.typed.javadsl.EntityTypeKey; +import akka.cluster.typed.Cluster; +import akka.actor.typed.ActorSystem; + +// #init + +interface ShardingDocExample { + + // #consumer + + interface DB { + CompletionStage save(String id, TodoList.State state); + + CompletionStage load(String id); + } + + public class TodoList { + interface Command {} + + public static class AddTask implements Command { + public final String item; + + public AddTask(String item) { + this.item = item; + } + } + + public static class CompleteTask implements Command { + public final String item; + + public CompleteTask(String item) { + this.item = item; + } + } + + private static class InitialState implements Command { + final State state; + + private InitialState(State state) { + this.state = state; + } + } + + private static class SaveSuccess implements Command { + final ActorRef confirmTo; + + private SaveSuccess(ActorRef confirmTo) { + this.confirmTo = confirmTo; + } + } + + private static class DBError implements Command { + final Exception cause; + + private DBError(Throwable cause) { + if (cause instanceof Exception) this.cause = (Exception) cause; + else this.cause = new RuntimeException(cause.getMessage(), cause); + } + } + + private static class CommandDelivery implements Command { + final Command command; + final ActorRef confirmTo; + + private CommandDelivery(Command command, ActorRef confirmTo) { + this.command = command; + this.confirmTo = confirmTo; + } + } + + public static class State { + public final List tasks; + + public State(List tasks) { + this.tasks = Collections.unmodifiableList(tasks); + } + + public State add(String task) { + ArrayList copy = new ArrayList<>(tasks); + copy.add(task); + return new State(copy); + } + + public State remove(String task) { + ArrayList copy = new ArrayList<>(tasks); + copy.remove(task); + return new State(copy); + } + } + + public static Behavior create( + String id, DB db, ActorRef> consumerController) { + return Init.create(id, db, consumerController); + } + + private static Behavior onDBError(DBError error) throws Exception { + throw error.cause; + } + + static class Init extends AbstractBehavior { + + private final String id; + private final DB db; + private final ActorRef> consumerController; + + private Init( + ActorContext context, + String id, + DB db, + ActorRef> consumerController) { + super(context); + this.id = id; + this.db = db; + this.consumerController = consumerController; + } + + static Behavior create( + String id, DB db, ActorRef> consumerController) { + return Behaviors.setup( + context -> { + context.pipeToSelf( + db.load(id), + (state, exc) -> { + if (exc == null) return new InitialState(state); + else return new DBError(exc); + }); + + return new Init(context, id, db, consumerController); + }); + } + + @Override + public Receive createReceive() { + return newReceiveBuilder() + .onMessage(InitialState.class, this::onInitialState) + .onMessage(DBError.class, TodoList::onDBError) + .build(); + } + + private Behavior onInitialState(InitialState initial) { + ActorRef> deliveryAdapter = + getContext() + .messageAdapter( + ConsumerController.deliveryClass(), + d -> new CommandDelivery(d.message(), d.confirmTo())); + consumerController.tell(new ConsumerController.Start<>(deliveryAdapter)); + + return Active.create(id, db, initial.state); + } + } + + static class Active extends AbstractBehavior { + + private final String id; + private final DB db; + private State state; + + private Active(ActorContext context, String id, DB db, State state) { + super(context); + this.id = id; + this.db = db; + this.state = state; + } + + static Behavior create(String id, DB db, State state) { + return Behaviors.setup(context -> new Active(context, id, db, state)); + } + + @Override + public Receive createReceive() { + return newReceiveBuilder() + .onMessage(CommandDelivery.class, this::onDelivery) + .onMessage(SaveSuccess.class, this::onSaveSuccess) + .onMessage(DBError.class, TodoList::onDBError) + .build(); + } + + private Behavior onDelivery(CommandDelivery delivery) { + if (delivery.command instanceof AddTask) { + AddTask addTask = (AddTask) delivery.command; + state = state.add(addTask.item); + save(state, delivery.confirmTo); + return this; + } else if (delivery.command instanceof CompleteTask) { + CompleteTask completeTask = (CompleteTask) delivery.command; + state = state.remove(completeTask.item); + save(state, delivery.confirmTo); + return this; + } else { + return Behaviors.unhandled(); + } + } + + private void save(State newState, ActorRef confirmTo) { + getContext() + .pipeToSelf( + db.save(id, newState), + (state, exc) -> { + if (exc == null) return new SaveSuccess(confirmTo); + else return new DBError(exc); + }); + } + + private Behavior onSaveSuccess(SaveSuccess success) { + success.confirmTo.tell(ConsumerController.confirmed()); + return this; + } + } + } + // #consumer + + // #producer + public class TodoService { + + interface Command {} + + public static class UpdateTodo implements Command { + public final String listId; + public final String item; + public final boolean completed; + public final ActorRef replyTo; + + public UpdateTodo(String listId, String item, boolean completed, ActorRef replyTo) { + this.listId = listId; + this.item = item; + this.completed = completed; + this.replyTo = replyTo; + } + } + + public enum Response { + ACCEPTED, + REJECTED, + MAYBE_ACCEPTED + } + + private static class Confirmed implements Command { + final ActorRef originalReplyTo; + + private Confirmed(ActorRef originalReplyTo) { + this.originalReplyTo = originalReplyTo; + } + } + + private static class TimedOut implements Command { + final ActorRef originalReplyTo; + + private TimedOut(ActorRef originalReplyTo) { + this.originalReplyTo = originalReplyTo; + } + } + + private static class WrappedRequestNext implements Command { + final ShardingProducerController.RequestNext next; + + private WrappedRequestNext(ShardingProducerController.RequestNext next) { + this.next = next; + } + } + + public static Behavior create( + ActorRef> producerController) { + return Init.create(producerController); + } + + static class Init extends AbstractBehavior { + + static Behavior create( + ActorRef> producerController) { + return Behaviors.setup( + context -> { + ActorRef> + requestNextAdapter = + context.messageAdapter( + ShardingProducerController.requestNextClass(), WrappedRequestNext::new); + producerController.tell(new ShardingProducerController.Start<>(requestNextAdapter)); + + return new Init(context); + }); + } + + private Init(ActorContext context) { + super(context); + } + + @Override + public Receive createReceive() { + return newReceiveBuilder() + .onMessage(WrappedRequestNext.class, w -> Active.create(w.next)) + .onMessage( + UpdateTodo.class, + command -> { + // not hooked up with shardingProducerController yet + command.replyTo.tell(Response.REJECTED); + return this; + }) + .build(); + } + } + + static class Active extends AbstractBehavior { + + private ShardingProducerController.RequestNext requestNext; + + static Behavior create( + ShardingProducerController.RequestNext requestNext) { + return Behaviors.setup(context -> new Active(context, requestNext)); + } + + private Active( + ActorContext context, + ShardingProducerController.RequestNext requestNext) { + super(context); + this.requestNext = requestNext; + } + + @Override + public Receive createReceive() { + return newReceiveBuilder() + .onMessage(WrappedRequestNext.class, this::onRequestNext) + .onMessage(UpdateTodo.class, this::onUpdateTodo) + .onMessage(Confirmed.class, this::onConfirmed) + .onMessage(TimedOut.class, this::onTimedOut) + .build(); + } + + private Behavior onRequestNext(WrappedRequestNext w) { + requestNext = w.next; + return this; + } + + private Behavior onUpdateTodo(UpdateTodo command) { + Integer buffered = requestNext.getBufferedForEntitiesWithoutDemand().get(command.listId); + if (buffered != null && buffered >= 100) { + command.replyTo.tell(Response.REJECTED); + } else { + TodoList.Command requestMsg; + if (command.completed) requestMsg = new TodoList.CompleteTask(command.item); + else requestMsg = new TodoList.AddTask(command.item); + getContext() + .ask( + Done.class, + requestNext.askNextTo(), + Duration.ofSeconds(5), + askReplyTo -> + new ShardingProducerController.MessageWithConfirmation<>( + command.listId, requestMsg, askReplyTo), + (done, exc) -> { + if (exc == null) return new Confirmed(command.replyTo); + else return new TimedOut(command.replyTo); + }); + } + return this; + } + + private Behavior onConfirmed(Confirmed confirmed) { + confirmed.originalReplyTo.tell(Response.ACCEPTED); + return this; + } + + private Behavior onTimedOut(TimedOut timedOut) { + timedOut.originalReplyTo.tell(Response.MAYBE_ACCEPTED); + return this; + } + } + } + // #producer + + static void illustrateInit() { + Behaviors.setup( + context -> { + // #init + final DB db = theDatbaseImplementation(); + + ActorSystem system = context.getSystem(); + + EntityTypeKey> entityTypeKey = + EntityTypeKey.create(ShardingConsumerController.entityTypeKeyClass(), "todo"); + + ActorRef>> region = + ClusterSharding.get(system) + .init( + Entity.of( + entityTypeKey, + entityContext -> + ShardingConsumerController.create( + start -> + TodoList.create(entityContext.getEntityId(), db, start)))); + + Address selfAddress = Cluster.get(system).selfMember().address(); + String producerId = "todo-producer-" + selfAddress.host() + ":" + selfAddress.port(); + + ActorRef> producerController = + context.spawn( + ShardingProducerController.create( + TodoList.Command.class, producerId, region, Optional.empty()), + "producerController"); + + context.spawn(TodoService.create(producerController), "producer"); + // #init + + return Behaviors.empty(); + }); + } + + static DB theDatbaseImplementation() { + return null; + } +} diff --git a/akka-cluster-sharding-typed/src/test/java/jdocs/delivery/WorkPullingDocExample.java b/akka-cluster-sharding-typed/src/test/java/jdocs/delivery/WorkPullingDocExample.java new file mode 100644 index 00000000000..8b9dac1e454 --- /dev/null +++ b/akka-cluster-sharding-typed/src/test/java/jdocs/delivery/WorkPullingDocExample.java @@ -0,0 +1,364 @@ +/* + * Copyright (C) 2020 Lightbend Inc. + */ + +package jdocs.delivery; + +// #imports +import akka.actor.typed.ActorRef; +import akka.actor.typed.Behavior; +import akka.actor.typed.delivery.ConsumerController; +import akka.actor.typed.delivery.DurableProducerQueue; +import akka.actor.typed.javadsl.ActorContext; +import akka.actor.typed.javadsl.Behaviors; + +import java.time.Duration; +import java.util.Optional; +import java.util.UUID; + +// #imports + +// #producer +import akka.actor.typed.delivery.WorkPullingProducerController; +import akka.Done; + +// #producer + +// #durable-queue +import akka.persistence.typed.PersistenceId; +import akka.persistence.typed.delivery.EventSourcedProducerQueue; + +// #durable-queue + +import akka.actor.typed.javadsl.StashBuffer; +import akka.actor.typed.receptionist.ServiceKey; + +interface WorkPullingDocExample { + + // #consumer + public class ImageConverter { + interface Command {} + + public static class ConversionJob { + public final UUID resultId; + public final String fromFormat; + public final String toFormat; + public final byte[] image; + + public ConversionJob(UUID resultId, String fromFormat, String toFormat, byte[] image) { + this.resultId = resultId; + this.fromFormat = fromFormat; + this.toFormat = toFormat; + this.image = image; + } + } + + private static class WrappedDelivery implements Command { + final ConsumerController.Delivery delivery; + + private WrappedDelivery(ConsumerController.Delivery delivery) { + this.delivery = delivery; + } + } + + public static ServiceKey> serviceKey = + ServiceKey.create(ConsumerController.serviceKeyClass(), "ImageConverter"); + + public static Behavior create() { + return Behaviors.setup( + context -> { + ActorRef> deliveryAdapter = + context.messageAdapter(ConsumerController.deliveryClass(), WrappedDelivery::new); + ActorRef> consumerController = + context.spawn(ConsumerController.create(serviceKey), "consumerController"); + consumerController.tell(new ConsumerController.Start<>(deliveryAdapter)); + + return Behaviors.receive(Command.class) + .onMessage(WrappedDelivery.class, ImageConverter::onDelivery) + .build(); + }); + } + + private static Behavior onDelivery(WrappedDelivery w) { + byte[] image = w.delivery.message().image; + String fromFormat = w.delivery.message().fromFormat; + String toFormat = w.delivery.message().toFormat; + // convert image... + // store result with resultId key for later retrieval + + // and when completed confirm + w.delivery.confirmTo().tell(ConsumerController.confirmed()); + + return Behaviors.same(); + } + } + // #consumer + + // #producer + public class ImageWorkManager { + + interface Command {} + + public static class Convert implements Command { + public final String fromFormat; + public final String toFormat; + public final byte[] image; + + public Convert(String fromFormat, String toFormat, byte[] image) { + this.fromFormat = fromFormat; + this.toFormat = toFormat; + this.image = image; + } + } + + public static class GetResult implements Command { + public final UUID resultId; + public final ActorRef> replyTo; + + public GetResult(UUID resultId, ActorRef> replyTo) { + this.resultId = resultId; + this.replyTo = replyTo; + } + } + + private static class WrappedRequestNext implements Command { + final WorkPullingProducerController.RequestNext next; + + private WrappedRequestNext( + WorkPullingProducerController.RequestNext next) { + this.next = next; + } + } + + // #producer + // #ask + public static class ConvertRequest implements Command { + public final String fromFormat; + public final String toFormat; + public final byte[] image; + public final ActorRef replyTo; + + public ConvertRequest( + String fromFormat, String toFormat, byte[] image, ActorRef replyTo) { + this.fromFormat = fromFormat; + this.toFormat = toFormat; + this.image = image; + this.replyTo = replyTo; + } + } + + interface ConvertResponse {} + + public static class ConvertAccepted implements ConvertResponse { + public final UUID resultId; + + public ConvertAccepted(UUID resultId) { + this.resultId = resultId; + } + } + + enum ConvertRejected implements ConvertResponse { + INSTANCE + } + + public static class ConvertTimedOut implements ConvertResponse { + public final UUID resultId; + + public ConvertTimedOut(UUID resultId) { + this.resultId = resultId; + } + } + + private static class AskReply implements Command { + final UUID resultId; + final ActorRef originalReplyTo; + final boolean timeout; + + private AskReply(UUID resultId, ActorRef originalReplyTo, boolean timeout) { + this.resultId = resultId; + this.originalReplyTo = originalReplyTo; + this.timeout = timeout; + } + } + + // #ask + // #producer + + private final ActorContext context; + private final StashBuffer stashBuffer; + + private ImageWorkManager(ActorContext context, StashBuffer stashBuffer) { + this.context = context; + this.stashBuffer = stashBuffer; + } + + public static Behavior create() { + return Behaviors.setup( + context -> { + ActorRef> + requestNextAdapter = + context.messageAdapter( + WorkPullingProducerController.requestNextClass(), WrappedRequestNext::new); + ActorRef> + producerController = + context.spawn( + WorkPullingProducerController.create( + ImageConverter.ConversionJob.class, + "workManager", + ImageConverter.serviceKey, + Optional.empty()), + "producerController"); + // #producer + // #durable-queue + Behavior> durableQueue = + EventSourcedProducerQueue.create(PersistenceId.ofUniqueId("ImageWorkManager")); + ActorRef> + durableProducerController = + context.spawn( + WorkPullingProducerController.create( + ImageConverter.ConversionJob.class, + "workManager", + ImageConverter.serviceKey, + Optional.of(durableQueue)), + "producerController"); + // #durable-queue + // #producer + producerController.tell(new WorkPullingProducerController.Start<>(requestNextAdapter)); + + return Behaviors.withStash( + 1000, stashBuffer -> new ImageWorkManager(context, stashBuffer).waitForNext()); + }); + } + + private Behavior waitForNext() { + return Behaviors.receive(Command.class) + .onMessage(WrappedRequestNext.class, this::onWrappedRequestNext) + .onMessage(Convert.class, this::onConvertWait) + .onMessage(GetResult.class, this::onGetResult) + .build(); + } + + private Behavior onWrappedRequestNext(WrappedRequestNext w) { + return stashBuffer.unstashAll(active(w.next)); + } + + private Behavior onConvertWait(Convert convert) { + if (stashBuffer.isFull()) { + context.getLog().warn("Too many Convert requests."); + return Behaviors.same(); + } else { + stashBuffer.stash(convert); + return Behaviors.same(); + } + } + + private Behavior onGetResult(GetResult get) { + // TODO retrieve the stored result and reply + return Behaviors.same(); + } + + private Behavior active( + WorkPullingProducerController.RequestNext next) { + return Behaviors.receive(Command.class) + .onMessage(Convert.class, c -> onConvert(c, next)) + .onMessage(GetResult.class, this::onGetResult) + .onMessage(WrappedRequestNext.class, this::onUnexpectedWrappedRequestNext) + .build(); + } + + private Behavior onUnexpectedWrappedRequestNext(WrappedRequestNext w) { + throw new IllegalStateException("Unexpected RequestNext"); + } + + private Behavior onConvert( + Convert convert, + WorkPullingProducerController.RequestNext next) { + UUID resultId = UUID.randomUUID(); + next.sendNextTo() + .tell( + new ImageConverter.ConversionJob( + resultId, convert.fromFormat, convert.toFormat, convert.image)); + return waitForNext(); + } + // #producer + + Object askScope = + new Object() { + // #ask + private Behavior waitForNext() { + return Behaviors.receive(Command.class) + .onMessage(WrappedRequestNext.class, this::onWrappedRequestNext) + .onMessage(ConvertRequest.class, this::onConvertRequestWait) + .onMessage(AskReply.class, this::onAskReply) + .onMessage(GetResult.class, this::onGetResult) + .build(); + } + + private Behavior onConvertRequestWait(ConvertRequest convert) { + if (stashBuffer.isFull()) { + convert.replyTo.tell(ConvertRejected.INSTANCE); + return Behaviors.same(); + } else { + stashBuffer.stash(convert); + return Behaviors.same(); + } + } + + private Behavior onAskReply(AskReply reply) { + if (reply.timeout) reply.originalReplyTo.tell(new ConvertTimedOut(reply.resultId)); + else reply.originalReplyTo.tell(new ConvertAccepted(reply.resultId)); + return Behaviors.same(); + } + + private Behavior onWrappedRequestNext(WrappedRequestNext w) { + return stashBuffer.unstashAll(active(w.next)); + } + + private Behavior onGetResult(GetResult get) { + // TODO retrieve the stored result and reply + return Behaviors.same(); + } + + private Behavior active( + WorkPullingProducerController.RequestNext next) { + return Behaviors.receive(Command.class) + .onMessage(ConvertRequest.class, c -> onConvertRequest(c, next)) + .onMessage(AskReply.class, this::onAskReply) + .onMessage(GetResult.class, this::onGetResult) + .onMessage(WrappedRequestNext.class, this::onUnexpectedWrappedRequestNext) + .build(); + } + + private Behavior onConvertRequest( + ConvertRequest convert, + WorkPullingProducerController.RequestNext next) { + UUID resultId = UUID.randomUUID(); + + context.ask( + Done.class, + next.askNextTo(), + Duration.ofSeconds(5), + askReplyTo -> + new WorkPullingProducerController.MessageWithConfirmation<>( + new ImageConverter.ConversionJob( + resultId, convert.fromFormat, convert.toFormat, convert.image), + askReplyTo), + (done, exc) -> { + if (exc == null) return new AskReply(resultId, convert.replyTo, false); + else return new AskReply(resultId, convert.replyTo, true); + }); + + return waitForNext(); + } + + private Behavior onUnexpectedWrappedRequestNext(WrappedRequestNext w) { + throw new IllegalStateException("Unexpected RequestNext"); + } + + // #ask + }; + // #producer + } + // #producer + +} diff --git a/akka-cluster-sharding-typed/src/test/resources/logback-test.xml b/akka-cluster-sharding-typed/src/test/resources/logback-test.xml index a8653ba3cda..d3f08fca6ec 100644 --- a/akka-cluster-sharding-typed/src/test/resources/logback-test.xml +++ b/akka-cluster-sharding-typed/src/test/resources/logback-test.xml @@ -25,7 +25,7 @@ - + diff --git a/akka-cluster-sharding-typed/src/test/scala/akka/cluster/sharding/typed/delivery/DurableShardingSpec.scala b/akka-cluster-sharding-typed/src/test/scala/akka/cluster/sharding/typed/delivery/DurableShardingSpec.scala new file mode 100644 index 00000000000..ef9497d4833 --- /dev/null +++ b/akka-cluster-sharding-typed/src/test/scala/akka/cluster/sharding/typed/delivery/DurableShardingSpec.scala @@ -0,0 +1,230 @@ +/* + * Copyright (C) 2019-2020 Lightbend Inc. + */ + +package akka.cluster.sharding.typed.delivery + +import java.util.UUID + +import akka.Done +import akka.actor.testkit.typed.scaladsl.LogCapturing +import akka.actor.testkit.typed.scaladsl.ScalaTestWithActorTestKit +import akka.actor.typed.ActorRef +import akka.actor.typed.Behavior +import akka.actor.typed.delivery.ConsumerController +import akka.actor.typed.delivery.ConsumerController.SequencedMessage +import akka.actor.typed.delivery.DurableProducerQueue +import akka.actor.typed.delivery.TestConsumer +import akka.actor.typed.eventstream.EventStream +import akka.actor.typed.scaladsl.Behaviors +import akka.cluster.sharding.typed.ShardingEnvelope +import akka.cluster.sharding.typed.scaladsl.ClusterSharding +import akka.cluster.sharding.typed.scaladsl.Entity +import akka.cluster.sharding.typed.scaladsl.EntityTypeKey +import akka.cluster.typed.Cluster +import akka.cluster.typed.Join +import akka.persistence.journal.inmem.InmemJournal +import akka.persistence.typed.PersistenceId +import akka.persistence.typed.delivery.EventSourcedProducerQueue +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory +import org.scalatest.wordspec.AnyWordSpecLike + +object DurableShardingSpec { + def conf: Config = + ConfigFactory.parseString(s""" + akka.actor.provider = cluster + akka.remote.classic.netty.tcp.port = 0 + akka.remote.artery.canonical.port = 0 + akka.persistence.journal.plugin = "akka.persistence.journal.inmem" + akka.persistence.snapshot-store.plugin = "akka.persistence.snapshot-store.local" + akka.persistence.snapshot-store.local.dir = "target/DurableShardingSpec-${UUID.randomUUID().toString}" + akka.reliable-delivery.consumer-controller.flow-control-window = 20 + """) +} + +class DurableShardingSpec + extends ScalaTestWithActorTestKit(DurableShardingSpec.conf) + with AnyWordSpecLike + with LogCapturing { + + private var idCount = 0 + private def nextId(): Int = { + idCount += 1 + idCount + } + + private def producerId: String = s"p-$idCount" + + private val journalOperations = createTestProbe[InmemJournal.Operation]() + system.eventStream ! EventStream.Subscribe(journalOperations.ref) + + private def consumerBehavior( + c: ActorRef[ConsumerController.Start[TestConsumer.Job]], + consumerProbe: ActorRef[TestConsumer.JobDelivery]): Behavior[TestConsumer.Command] = + Behaviors.setup[TestConsumer.Command] { context => + val deliveryAdapter = context.messageAdapter[ConsumerController.Delivery[TestConsumer.Job]] { d => + TestConsumer.JobDelivery(d.message, d.confirmTo, d.producerId, d.seqNr) + } + c ! ConsumerController.Start(deliveryAdapter) + Behaviors.receiveMessagePartial { + case jobDelivery: TestConsumer.JobDelivery => + consumerProbe.ref ! jobDelivery + Behaviors.same + } + } + + "ReliableDelivery with sharding and durable queue" must { + + "join cluster" in { + Cluster(system).manager ! Join(Cluster(system).selfMember.address) + } + + "load initial state and resend unconfirmed" in { + nextId() + val typeKey = EntityTypeKey[SequencedMessage[TestConsumer.Job]](s"TestConsumer-$idCount") + val consumerProbe = createTestProbe[TestConsumer.JobDelivery]() + val sharding: ActorRef[ShardingEnvelope[SequencedMessage[TestConsumer.Job]]] = + ClusterSharding(system).init(Entity(typeKey)(_ => + ShardingConsumerController[TestConsumer.Job, TestConsumer.Command](c => + consumerBehavior(c, consumerProbe.ref)))) + + val shardingProducerController = + spawn( + ShardingProducerController[TestConsumer.Job]( + producerId, + sharding, + Some(EventSourcedProducerQueue[TestConsumer.Job](PersistenceId.ofUniqueId(producerId)))), + s"shardingController-$idCount") + val producerProbe = createTestProbe[ShardingProducerController.RequestNext[TestConsumer.Job]]() + shardingProducerController ! ShardingProducerController.Start(producerProbe.ref) + + (1 to 4).foreach { n => + producerProbe.receiveMessage().sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job(s"msg-$n")) + journalOperations.expectMessageType[InmemJournal.Write].event.getClass should ===( + classOf[DurableProducerQueue.MessageSent[_]]) + } + + journalOperations.expectNoMessage() + + val delivery1 = consumerProbe.receiveMessage() + delivery1.confirmTo ! ConsumerController.Confirmed + journalOperations.expectMessageType[InmemJournal.Write].event.getClass should ===( + classOf[DurableProducerQueue.Confirmed]) + + val delivery2 = consumerProbe.receiveMessage() + delivery2.confirmTo ! ConsumerController.Confirmed + journalOperations.expectMessageType[InmemJournal.Write].event.getClass should ===( + classOf[DurableProducerQueue.Confirmed]) + + producerProbe.receiveMessage() + + // let the initial messages reach the ShardingConsumerController before stopping ShardingProducerController + val delivery3 = consumerProbe.receiveMessage() + delivery3.msg should ===(TestConsumer.Job("msg-3")) + delivery3.seqNr should ===(3) + Thread.sleep(1000) + + system.log.info("Stopping [{}]", shardingProducerController) + testKit.stop(shardingProducerController) + + val shardingProducerController2 = + spawn( + ShardingProducerController[TestConsumer.Job]( + producerId, + sharding, + Some(EventSourcedProducerQueue[TestConsumer.Job](PersistenceId.ofUniqueId(producerId)))), + s"shardingController2-$idCount") + shardingProducerController2 ! ShardingProducerController.Start(producerProbe.ref) + + // delivery3 and delivery4 are still from old shardingProducerController, that were queued in ConsumerController + delivery3.confirmTo ! ConsumerController.Confirmed + // that confirmation goes to old dead shardingProducerController, and therefore not stored + journalOperations.expectNoMessage() + + val delivery4 = consumerProbe.receiveMessage() + delivery4.msg should ===(TestConsumer.Job("msg-4")) + delivery4.seqNr should ===(4) + delivery4.confirmTo ! ConsumerController.Confirmed + // that confirmation goes to old dead shardingProducerController, and therefore not stored + journalOperations.expectNoMessage() + + // now the unconfirmed are redelivered + val redelivery3 = consumerProbe.receiveMessage() + redelivery3.msg should ===(TestConsumer.Job("msg-3")) + redelivery3.seqNr should ===(1) // new ProducerController and there starting at 1 + redelivery3.confirmTo ! ConsumerController.Confirmed + val confirmed3 = + journalOperations.expectMessageType[InmemJournal.Write].event.asInstanceOf[DurableProducerQueue.Confirmed] + confirmed3.seqNr should ===(3) + confirmed3.confirmationQualifier should ===("entity-1") + + val redelivery4 = consumerProbe.receiveMessage() + redelivery4.msg should ===(TestConsumer.Job("msg-4")) + redelivery4.seqNr should ===(2) + redelivery4.confirmTo ! ConsumerController.Confirmed + val confirmed4 = + journalOperations.expectMessageType[InmemJournal.Write].event.asInstanceOf[DurableProducerQueue.Confirmed] + confirmed4.seqNr should ===(4) + confirmed4.confirmationQualifier should ===("entity-1") + + val next5 = producerProbe.receiveMessage() + next5.sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job(s"msg-5")) + journalOperations.expectMessageType[InmemJournal.Write].event.getClass should ===( + classOf[DurableProducerQueue.MessageSent[_]]) + + val delivery5 = consumerProbe.receiveMessage() + delivery5.msg should ===(TestConsumer.Job("msg-5")) + delivery5.seqNr should ===(3) + delivery5.confirmTo ! ConsumerController.Confirmed + val confirmed5 = + journalOperations.expectMessageType[InmemJournal.Write].event.asInstanceOf[DurableProducerQueue.Confirmed] + confirmed5.seqNr should ===(5) + confirmed5.confirmationQualifier should ===("entity-1") + + testKit.stop(shardingProducerController2) + } + + "reply to MessageWithConfirmation after storage" in { + import ShardingProducerController.MessageWithConfirmation + nextId() + val typeKey = EntityTypeKey[SequencedMessage[TestConsumer.Job]](s"TestConsumer-$idCount") + val consumerProbe = createTestProbe[TestConsumer.JobDelivery]() + + val sharding: ActorRef[ShardingEnvelope[SequencedMessage[TestConsumer.Job]]] = + ClusterSharding(system).init(Entity(typeKey)(_ => + ShardingConsumerController[TestConsumer.Job, TestConsumer.Command](c => + consumerBehavior(c, consumerProbe.ref)))) + + val shardingProducerController = + spawn( + ShardingProducerController[TestConsumer.Job]( + producerId, + sharding, + Some(EventSourcedProducerQueue[TestConsumer.Job](PersistenceId.ofUniqueId(producerId)))), + s"shardingController-$idCount") + val producerProbe = createTestProbe[ShardingProducerController.RequestNext[TestConsumer.Job]]() + shardingProducerController ! ShardingProducerController.Start(producerProbe.ref) + + val replyProbe = createTestProbe[Done]() + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation( + "entity-1", + TestConsumer.Job(s"msg-1"), + replyProbe.ref) + journalOperations.expectMessageType[InmemJournal.Write].event.getClass should ===( + classOf[DurableProducerQueue.MessageSent[_]]) + replyProbe.expectMessage(Done) + + producerProbe.receiveMessage().askNextTo ! MessageWithConfirmation( + "entity-2", + TestConsumer.Job(s"msg-2"), + replyProbe.ref) + journalOperations.expectMessageType[InmemJournal.Write].event.getClass should ===( + classOf[DurableProducerQueue.MessageSent[_]]) + replyProbe.expectMessage(Done) + + testKit.stop(shardingProducerController) + } + } + +} diff --git a/akka-cluster-sharding-typed/src/test/scala/akka/cluster/sharding/typed/delivery/ReliableDeliveryShardingSpec.scala b/akka-cluster-sharding-typed/src/test/scala/akka/cluster/sharding/typed/delivery/ReliableDeliveryShardingSpec.scala new file mode 100644 index 00000000000..09374f0b399 --- /dev/null +++ b/akka-cluster-sharding-typed/src/test/scala/akka/cluster/sharding/typed/delivery/ReliableDeliveryShardingSpec.scala @@ -0,0 +1,518 @@ +/* + * Copyright (C) 2019-2020 Lightbend Inc. + */ + +package akka.cluster.sharding.typed.delivery + +import java.util.concurrent.atomic.AtomicInteger + +import scala.concurrent.duration._ + +import akka.Done +import akka.actor.testkit.typed.scaladsl.LogCapturing +import akka.actor.testkit.typed.scaladsl.LoggingTestKit +import akka.actor.testkit.typed.scaladsl.ScalaTestWithActorTestKit +import akka.actor.typed.ActorRef +import akka.actor.typed.Behavior +import akka.actor.typed.delivery.ConsumerController +import akka.actor.typed.delivery.ConsumerController.SequencedMessage +import akka.actor.typed.delivery.TestConsumer +import akka.actor.typed.delivery.internal.ProducerControllerImpl +import akka.actor.typed.scaladsl.Behaviors +import akka.actor.typed.scaladsl.LoggerOps +import akka.cluster.typed.Cluster +import akka.cluster.sharding.typed.ShardingEnvelope +import akka.cluster.sharding.typed.scaladsl.ClusterSharding +import akka.cluster.sharding.typed.scaladsl.Entity +import akka.cluster.sharding.typed.scaladsl.EntityTypeKey +import akka.cluster.typed.Join +import com.typesafe.config.ConfigFactory +import org.scalatest.wordspec.AnyWordSpecLike + +object ReliableDeliveryShardingSpec { + val config = ConfigFactory.parseString(""" + akka.actor.provider = cluster + akka.remote.classic.netty.tcp.port = 0 + akka.remote.artery.canonical.port = 0 + akka.reliable-delivery.consumer-controller.flow-control-window = 20 + """) + + object TestShardingProducer { + + trait Command + final case class RequestNext(sendToRef: ActorRef[ShardingEnvelope[TestConsumer.Job]]) extends Command + + private final case object Tick extends Command + + def apply(producerController: ActorRef[ShardingProducerController.Start[TestConsumer.Job]]): Behavior[Command] = { + Behaviors.setup { context => + context.setLoggerName("TestShardingProducer") + val requestNextAdapter: ActorRef[ShardingProducerController.RequestNext[TestConsumer.Job]] = + context.messageAdapter(req => RequestNext(req.sendNextTo)) + producerController ! ShardingProducerController.Start(requestNextAdapter) + + // simulate fast producer + Behaviors.withTimers { timers => + timers.startTimerWithFixedDelay(Tick, Tick, 20.millis) + idle(0) + } + } + } + + private def idle(n: Int): Behavior[Command] = { + Behaviors.receiveMessage { + case Tick => Behaviors.same + case RequestNext(sendTo) => active(n + 1, sendTo) + } + } + + private def active(n: Int, sendTo: ActorRef[ShardingEnvelope[TestConsumer.Job]]): Behavior[Command] = { + Behaviors.receive { (ctx, msg) => + msg match { + case Tick => + val msg = s"msg-$n" + val entityId = s"entity-${n % 3}" + ctx.log.info2("sent {} to {}", msg, entityId) + sendTo ! ShardingEnvelope(entityId, TestConsumer.Job(msg)) + idle(n) + + case RequestNext(_) => + // already active + Behaviors.same + } + } + } + + } + +} + +class ReliableDeliveryShardingSpec + extends ScalaTestWithActorTestKit(ReliableDeliveryShardingSpec.config) + with AnyWordSpecLike + with LogCapturing { + import ReliableDeliveryShardingSpec._ + import TestConsumer.defaultConsumerDelay + + private var idCount = 0 + private def nextId(): Int = { + idCount += 1 + idCount + } + + private def producerId: String = s"p-$idCount" + + "ReliableDelivery with sharding" must { + "join cluster" in { + Cluster(system).manager ! Join(Cluster(system).selfMember.address) + } + + "illustrate sharding usage" in { + nextId() + val consumerEndProbe = createTestProbe[TestConsumer.CollectedProducerIds]() + val typeKey = EntityTypeKey[SequencedMessage[TestConsumer.Job]](s"TestConsumer-$idCount") + val sharding: ActorRef[ShardingEnvelope[SequencedMessage[TestConsumer.Job]]] = + ClusterSharding(system).init(Entity(typeKey)(_ => + ShardingConsumerController[TestConsumer.Job, TestConsumer.Command](c => + TestConsumer(defaultConsumerDelay, 42, consumerEndProbe.ref, c)))) + + val shardingProducerController = + spawn(ShardingProducerController[TestConsumer.Job](producerId, sharding, None), s"shardingController-$idCount") + val producer = spawn(TestShardingProducer(shardingProducerController), name = s"shardingProducer-$idCount") + + // expecting 3 end messages, one for each entity: "entity-0", "entity-1", "entity-2" + consumerEndProbe.receiveMessages(3, 5.seconds) + + testKit.stop(producer) + testKit.stop(shardingProducerController) + } + + "illustrate sharding usage with several producers" in { + nextId() + val consumerEndProbe = createTestProbe[TestConsumer.CollectedProducerIds]() + val typeKey = EntityTypeKey[SequencedMessage[TestConsumer.Job]](s"TestConsumer-$idCount") + val sharding: ActorRef[ShardingEnvelope[SequencedMessage[TestConsumer.Job]]] = + ClusterSharding(system).init(Entity(typeKey)(_ => + ShardingConsumerController[TestConsumer.Job, TestConsumer.Command](c => + TestConsumer(defaultConsumerDelay, 42, consumerEndProbe.ref, c)))) + + val shardingController1 = + spawn( + ShardingProducerController[TestConsumer.Job]( + s"p1-$idCount", // note different producerId + sharding, + None), + s"shardingController1-$idCount") + val producer1 = spawn(TestShardingProducer(shardingController1), name = s"shardingProducer1-$idCount") + + val shardingController2 = + spawn( + ShardingProducerController[TestConsumer.Job]( + s"p2-$idCount", // note different producerId + sharding, + None), + s"shardingController2-$idCount") + val producer2 = spawn(TestShardingProducer(shardingController2), name = s"shardingProducer2-$idCount") + + // expecting 3 end messages, one for each entity: "entity-0", "entity-1", "entity-2" + val endMessages = consumerEndProbe.receiveMessages(3, 5.seconds) + // verify that they received messages from both producers + endMessages.flatMap(_.producerIds).toSet should ===( + Set( + s"p1-$idCount-entity-0", + s"p1-$idCount-entity-1", + s"p1-$idCount-entity-2", + s"p2-$idCount-entity-0", + s"p2-$idCount-entity-1", + s"p2-$idCount-entity-2")) + + testKit.stop(producer1) + testKit.stop(producer2) + testKit.stop(shardingController1) + testKit.stop(shardingController2) + } + + "reply to MessageWithConfirmation" in { + nextId() + val consumerEndProbe = createTestProbe[TestConsumer.CollectedProducerIds]() + val typeKey = EntityTypeKey[SequencedMessage[TestConsumer.Job]](s"TestConsumer-$idCount") + val sharding: ActorRef[ShardingEnvelope[SequencedMessage[TestConsumer.Job]]] = + ClusterSharding(system).init(Entity(typeKey)(_ => + ShardingConsumerController[TestConsumer.Job, TestConsumer.Command](c => + TestConsumer(defaultConsumerDelay, 3, consumerEndProbe.ref, c)))) + + val shardingProducerController = + spawn(ShardingProducerController[TestConsumer.Job](producerId, sharding, None), s"shardingController-$idCount") + + val producerProbe = createTestProbe[ShardingProducerController.RequestNext[TestConsumer.Job]]() + shardingProducerController ! ShardingProducerController.Start(producerProbe.ref) + + val replyProbe = createTestProbe[Done]() + producerProbe.receiveMessage().askNextTo ! ShardingProducerController.MessageWithConfirmation( + "entity-0", + TestConsumer.Job("msg-1"), + replyProbe.ref) + producerProbe.receiveMessage().askNextTo ! ShardingProducerController.MessageWithConfirmation( + "entity-0", + TestConsumer.Job("msg-2"), + replyProbe.ref) + producerProbe.receiveMessage().askNextTo ! ShardingProducerController.MessageWithConfirmation( + "entity-1", + TestConsumer.Job("msg-3"), + replyProbe.ref) + producerProbe.receiveMessage().askNextTo ! ShardingProducerController.MessageWithConfirmation( + "entity-0", + TestConsumer.Job("msg-4"), + replyProbe.ref) + + consumerEndProbe.receiveMessage() // entity-0 received 3 messages + consumerEndProbe.expectNoMessage() + + producerProbe.receiveMessage().askNextTo ! ShardingProducerController.MessageWithConfirmation( + "entity-1", + TestConsumer.Job("msg-5"), + replyProbe.ref) + producerProbe.receiveMessage().askNextTo ! ShardingProducerController.MessageWithConfirmation( + "entity-1", + TestConsumer.Job("msg-6"), + replyProbe.ref) + consumerEndProbe.receiveMessage() // entity-0 received 3 messages + + testKit.stop(shardingProducerController) + } + + "include demand information in RequestNext" in { + nextId() + + val shardingProbe = + createTestProbe[ShardingEnvelope[SequencedMessage[TestConsumer.Job]]]() + val shardingProducerController = + spawn( + ShardingProducerController[TestConsumer.Job](producerId, shardingProbe.ref, None), + s"shardingController-$idCount") + val producerProbe = createTestProbe[ShardingProducerController.RequestNext[TestConsumer.Job]]() + shardingProducerController ! ShardingProducerController.Start(producerProbe.ref) + + val next1 = producerProbe.receiveMessage() + next1.entitiesWithDemand should ===(Set.empty) + next1.bufferedForEntitiesWithoutDemand should ===(Map.empty) + + next1.sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job("msg-1")) + // for the first message no RequestNext until initial roundtrip + producerProbe.expectNoMessage() + + val seq1 = shardingProbe.receiveMessage().message + seq1.message should ===(TestConsumer.Job("msg-1")) + seq1.producerController ! ProducerControllerImpl.Request(confirmedSeqNr = 0L, requestUpToSeqNr = 5, true, false) + + val next2 = producerProbe.receiveMessage() + next2.entitiesWithDemand should ===(Set("entity-1")) + next2.bufferedForEntitiesWithoutDemand should ===(Map.empty) + + next2.sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job("msg-2")) + val next3 = producerProbe.receiveMessage() + // could be sent immediately since had demand, and Request(requestUpToSeqNr-5) + next3.entitiesWithDemand should ===(Set("entity-1")) + next3.bufferedForEntitiesWithoutDemand should ===(Map.empty) + + next3.sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job("msg-3")) + val next4 = producerProbe.receiveMessage() + next4.entitiesWithDemand should ===(Set("entity-1")) + next4.bufferedForEntitiesWithoutDemand should ===(Map.empty) + + next4.sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job("msg-4")) + val next5 = producerProbe.receiveMessage() + next5.entitiesWithDemand should ===(Set("entity-1")) + next5.bufferedForEntitiesWithoutDemand should ===(Map.empty) + + next5.sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job("msg-5")) + // no more demand Request(requestUpToSeqNr-5) + producerProbe.expectNoMessage() + // but we can anyway send more, which will be buffered + next5.sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job("msg-6")) + + shardingProbe.receiveMessage() + shardingProbe.receiveMessage() + shardingProbe.receiveMessage() + val seq5 = shardingProbe.receiveMessage().message + seq5.message should ===(TestConsumer.Job("msg-5")) + + val next6 = producerProbe.receiveMessage() + next6.entitiesWithDemand should ===(Set.empty) + next6.bufferedForEntitiesWithoutDemand should ===(Map("entity-1" -> 1)) + + // and we can send to another entity + next6.sendNextTo ! ShardingEnvelope("entity-2", TestConsumer.Job("msg-7")) + producerProbe.expectNoMessage() + val seq7 = shardingProbe.receiveMessage().message + seq7.message should ===(TestConsumer.Job("msg-7")) + seq7.producerController ! ProducerControllerImpl.Request(confirmedSeqNr = 0L, requestUpToSeqNr = 5, true, false) + + val next8 = producerProbe.receiveMessage() + next8.entitiesWithDemand should ===(Set("entity-2")) + next8.bufferedForEntitiesWithoutDemand should ===(Map("entity-1" -> 1)) + + // when new demand the buffered messages will be be sent + seq5.producerController ! ProducerControllerImpl.Request(confirmedSeqNr = 5L, requestUpToSeqNr = 10, true, false) + val seq6 = shardingProbe.receiveMessage().message + seq6.message should ===(TestConsumer.Job("msg-6")) + + val next9 = producerProbe.receiveMessage() + next9.entitiesWithDemand should ===(Set("entity-1", "entity-2")) + next9.bufferedForEntitiesWithoutDemand should ===(Map.empty) + + testKit.stop(shardingProducerController) + } + + "allow restart of producer" in { + nextId() + + val shardingProbe = + createTestProbe[ShardingEnvelope[SequencedMessage[TestConsumer.Job]]]() + val shardingProducerController = + spawn( + ShardingProducerController[TestConsumer.Job](producerId, shardingProbe.ref, None), + s"shardingController-$idCount") + val producerProbe = createTestProbe[ShardingProducerController.RequestNext[TestConsumer.Job]]() + shardingProducerController ! ShardingProducerController.Start(producerProbe.ref) + + producerProbe.receiveMessage().sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job("msg-1")) + val seq1 = shardingProbe.receiveMessage().message + seq1.message should ===(TestConsumer.Job("msg-1")) + seq1.producerController ! ProducerControllerImpl.Request(confirmedSeqNr = 0L, requestUpToSeqNr = 5, true, false) + + producerProbe.receiveMessage().sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job("msg-2")) + shardingProbe.receiveMessage().message.message should ===(TestConsumer.Job("msg-2")) + + // restart producer, new Start + val producerProbe2 = createTestProbe[ShardingProducerController.RequestNext[TestConsumer.Job]]() + shardingProducerController ! ShardingProducerController.Start(producerProbe2.ref) + + producerProbe2.receiveMessage().sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job("msg-3")) + shardingProbe.receiveMessage().message.message should ===(TestConsumer.Job("msg-3")) + + testKit.stop(shardingProducerController) + } + + "deliver unconfirmed if ShardingConsumerController is terminated" in { + // for example if ShardingConsumerController is rebalanced, but no more messages are sent to the entity + nextId() + + val consumerIncarnation = new AtomicInteger(0) + val consumerProbes = Vector.fill(3)(createTestProbe[ConsumerController.Delivery[TestConsumer.Job]]()) + + val typeKey = EntityTypeKey[SequencedMessage[TestConsumer.Job]](s"TestConsumer-$idCount") + val region = ClusterSharding(system).init(Entity(typeKey)(_ => + ShardingConsumerController[TestConsumer.Job, TestConsumer.Command] { cc => + cc ! ConsumerController.Start(consumerProbes(consumerIncarnation.getAndIncrement()).ref) + Behaviors.empty + })) + + val shardingProducerSettings = + ShardingProducerController.Settings(system).withResendFirsUnconfirmedIdleTimeout(1500.millis) + val shardingProducerController = + spawn( + ShardingProducerController[TestConsumer.Job](producerId, region, None, shardingProducerSettings), + s"shardingController-$idCount") + val producerProbe = createTestProbe[ShardingProducerController.RequestNext[TestConsumer.Job]]() + shardingProducerController ! ShardingProducerController.Start(producerProbe.ref) + + producerProbe.receiveMessage().sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job("msg-1")) + val delivery1 = consumerProbes(0).receiveMessage() + delivery1.message should ===(TestConsumer.Job("msg-1")) + delivery1.confirmTo ! ConsumerController.Confirmed + + producerProbe.receiveMessage().sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job("msg-2")) + val delivery2 = consumerProbes(0).receiveMessage() + delivery2.message should ===(TestConsumer.Job("msg-2")) + delivery2.confirmTo ! ConsumerController.Confirmed + + producerProbe.receiveMessage().sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job("msg-3")) + val delivery3 = consumerProbes(0).receiveMessage() + delivery3.message should ===(TestConsumer.Job("msg-3")) + // msg-3 not Confirmed + + consumerProbes(0).stop() + Thread.sleep(1000) // let it terminate + + producerProbe.receiveMessage().sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job("msg-4")) + val delivery3b = consumerProbes(1).receiveMessage() + // msg-3 is redelivered + delivery3b.message should ===(TestConsumer.Job("msg-3")) + delivery3b.confirmTo ! ConsumerController.Confirmed + val delivery4 = consumerProbes(1).receiveMessage() + delivery4.message should ===(TestConsumer.Job("msg-4")) + + // redeliver also when no more messages are sent + consumerProbes(1).stop() + + val delivery4b = consumerProbes(2).receiveMessage() + delivery4b.message should ===(TestConsumer.Job("msg-4")) + + consumerProbes(2).stop() + testKit.stop(shardingProducerController) + } + + "cleanup unused ProducerController" in { + nextId() + + val consumerProbe = createTestProbe[ConsumerController.Delivery[TestConsumer.Job]]() + + val typeKey = EntityTypeKey[SequencedMessage[TestConsumer.Job]](s"TestConsumer-$idCount") + val region = ClusterSharding(system).init(Entity(typeKey)(_ => + ShardingConsumerController[TestConsumer.Job, TestConsumer.Command] { cc => + cc ! ConsumerController.Start(consumerProbe.ref) + Behaviors.empty + })) + + val shardingProducerSettings = + ShardingProducerController.Settings(system).withCleanupUnusedAfter(1.second) + val shardingProducerController = + spawn( + ShardingProducerController[TestConsumer.Job](producerId, region, None, shardingProducerSettings), + s"shardingController-$idCount") + val producerProbe = createTestProbe[ShardingProducerController.RequestNext[TestConsumer.Job]]() + shardingProducerController ! ShardingProducerController.Start(producerProbe.ref) + + producerProbe.receiveMessage().sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job("msg-1")) + val delivery1 = consumerProbe.receiveMessage() + delivery1.message should ===(TestConsumer.Job("msg-1")) + delivery1.confirmTo ! ConsumerController.Confirmed + + producerProbe.receiveMessage().sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job("msg-2")) + val delivery2 = consumerProbe.receiveMessage() + delivery2.message should ===(TestConsumer.Job("msg-2")) + delivery2.confirmTo ! ConsumerController.Confirmed + + producerProbe.receiveMessage().sendNextTo ! ShardingEnvelope("entity-2", TestConsumer.Job("msg-3")) + val delivery3 = consumerProbe.receiveMessage() + delivery3.message should ===(TestConsumer.Job("msg-3")) + // msg-3 not Confirmed + + val next4 = producerProbe.receiveMessage() + next4.entitiesWithDemand should ===(Set("entity-1", "entity-2")) + + Thread.sleep(2000) + + next4.sendNextTo ! ShardingEnvelope("entity-2", TestConsumer.Job("msg-4")) + val next5 = producerProbe.receiveMessage() + next5.entitiesWithDemand should ===(Set("entity-2")) // entity-1 removed + + delivery3.confirmTo ! ConsumerController.Confirmed + val delivery4 = consumerProbe.receiveMessage() + delivery4.message should ===(TestConsumer.Job("msg-4")) + delivery4.confirmTo ! ConsumerController.Confirmed + + // send to entity-1 again + next5.sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job("msg-5")) + val delivery5 = consumerProbe.receiveMessage() + delivery5.message should ===(TestConsumer.Job("msg-5")) + delivery5.confirmTo ! ConsumerController.Confirmed + + consumerProbe.stop() + testKit.stop(shardingProducerController) + } + + "cleanup ConsumerController when ProducerController is terminated" in { + nextId() + + val consumerProbe = createTestProbe[ConsumerController.Delivery[TestConsumer.Job]]() + + val typeKey = EntityTypeKey[SequencedMessage[TestConsumer.Job]](s"TestConsumer-$idCount") + val region = ClusterSharding(system).init(Entity(typeKey)(_ => + ShardingConsumerController[TestConsumer.Job, TestConsumer.Command] { cc => + cc ! ConsumerController.Start(consumerProbe.ref) + Behaviors.empty + })) + + val shardingProducerController1 = + spawn(ShardingProducerController[TestConsumer.Job](producerId, region, None), s"shardingController-$idCount") + val producerProbe = createTestProbe[ShardingProducerController.RequestNext[TestConsumer.Job]]() + shardingProducerController1 ! ShardingProducerController.Start(producerProbe.ref) + + producerProbe.receiveMessage().sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job("msg-1")) + val delivery1 = consumerProbe.receiveMessage() + delivery1.message should ===(TestConsumer.Job("msg-1")) + delivery1.confirmTo ! ConsumerController.Confirmed + + producerProbe.receiveMessage().sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job("msg-2")) + val delivery2 = consumerProbe.receiveMessage() + delivery2.message should ===(TestConsumer.Job("msg-2")) + delivery2.confirmTo ! ConsumerController.Confirmed + producerProbe.receiveMessage() + + LoggingTestKit.empty + .withMessageRegex("ProducerController.*terminated") + .withLoggerName("akka.cluster.sharding.typed.delivery.ShardingConsumerController") + .expect { + testKit.stop(shardingProducerController1) + } + + val shardingProducerController2 = + spawn(ShardingProducerController[TestConsumer.Job](producerId, region, None), s"shardingController-$idCount") + shardingProducerController2 ! ShardingProducerController.Start(producerProbe.ref) + + LoggingTestKit + .debug("Starting ConsumerController") + .withLoggerName("akka.cluster.sharding.typed.delivery.ShardingConsumerController") + .expect { + producerProbe.receiveMessage().sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job("msg-3")) + } + val delivery3 = consumerProbe.receiveMessage() + delivery3.message should ===(TestConsumer.Job("msg-3")) + delivery3.confirmTo ! ConsumerController.Confirmed + + producerProbe.receiveMessage().sendNextTo ! ShardingEnvelope("entity-1", TestConsumer.Job("msg-4")) + val delivery4 = consumerProbe.receiveMessage() + delivery4.message should ===(TestConsumer.Job("msg-4")) + delivery4.confirmTo ! ConsumerController.Confirmed + + consumerProbe.stop() + testKit.stop(shardingProducerController2) + } + + } + +} + +// TODO #28723 add a random test for sharding diff --git a/akka-cluster-sharding-typed/src/test/scala/docs/delivery/PointToPointDocExample.scala b/akka-cluster-sharding-typed/src/test/scala/docs/delivery/PointToPointDocExample.scala new file mode 100644 index 00000000000..ce685bd9ca8 --- /dev/null +++ b/akka-cluster-sharding-typed/src/test/scala/docs/delivery/PointToPointDocExample.scala @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2020 Lightbend Inc. + */ + +package docs.delivery + +import java.util.UUID + +import com.github.ghik.silencer.silent + +import akka.actor.typed.ActorSystem + +//#imports +import akka.actor.typed.ActorRef +import akka.actor.typed.Behavior +import akka.actor.typed.delivery.ProducerController +import akka.actor.typed.scaladsl.Behaviors + +//#imports + +@silent("never used") +object PointToPointDocExample { + + //#producer + object FibonacciProducer { + sealed trait Command + + private case class WrappedRequestNext(r: ProducerController.RequestNext[FibonacciConsumer.Command]) extends Command + + def apply( + producerController: ActorRef[ProducerController.Command[FibonacciConsumer.Command]]): Behavior[Command] = { + Behaviors.setup { context => + val requestNextAdapter = + context.messageAdapter[ProducerController.RequestNext[FibonacciConsumer.Command]](WrappedRequestNext(_)) + producerController ! ProducerController.Start(requestNextAdapter) + + fibonacci(0, 1, 0) + } + } + + private def fibonacci(n: Long, b: BigInt, a: BigInt): Behavior[Command] = { + Behaviors.receive { + case (context, WrappedRequestNext(next)) => + context.log.info("Generated fibonacci {}: {}", n, a) + next.sendNextTo ! FibonacciConsumer.FibonacciNumber(n, a) + + if (n == 1000) + Behaviors.stopped + else + fibonacci(n + 1, a + b, b) + } + } + } + //#producer + + //#consumer + import akka.actor.typed.delivery.ConsumerController + + object FibonacciConsumer { + sealed trait Command + + final case class FibonacciNumber(n: Long, value: BigInt) extends Command + + private case class WrappedDelivery(d: ConsumerController.Delivery[Command]) extends Command + + def apply( + consumerController: ActorRef[ConsumerController.Command[FibonacciConsumer.Command]]): Behavior[Command] = { + Behaviors.setup { context => + val deliveryAdapter = + context.messageAdapter[ConsumerController.Delivery[FibonacciConsumer.Command]](WrappedDelivery(_)) + consumerController ! ConsumerController.Start(deliveryAdapter) + + Behaviors.receiveMessagePartial { + case WrappedDelivery(ConsumerController.Delivery(FibonacciNumber(n, value), confirmTo)) => + context.log.info("Processed fibonacci {}: {}", n, value) + confirmTo ! ConsumerController.Confirmed + Behaviors.same + } + } + } + } + //#consumer + + object Guardian { + def apply(): Behavior[Nothing] = { + Behaviors.setup[Nothing] { context => + //#connect + val consumerController = context.spawn(ConsumerController[FibonacciConsumer.Command](), "consumerController") + context.spawn(FibonacciConsumer(consumerController), "consumer") + + val producerId = s"fibonacci-${UUID.randomUUID()}" + val producerController = context.spawn( + ProducerController[FibonacciConsumer.Command](producerId, durableQueueBehavior = None), + "producerController") + context.spawn(FibonacciProducer(producerController), "producer") + + consumerController ! ConsumerController.RegisterToProducerController(producerController) + //#connect + + Behaviors.empty + } + } + } + + def main(args: Array[String]): Unit = { + ActorSystem[Nothing](Guardian(), "FibonacciExample") + } +} diff --git a/akka-cluster-sharding-typed/src/test/scala/docs/delivery/ShardingDocExample.scala b/akka-cluster-sharding-typed/src/test/scala/docs/delivery/ShardingDocExample.scala new file mode 100644 index 00000000000..be550115af0 --- /dev/null +++ b/akka-cluster-sharding-typed/src/test/scala/docs/delivery/ShardingDocExample.scala @@ -0,0 +1,217 @@ +/* + * Copyright (C) 2020 Lightbend Inc. + */ + +package docs.delivery + +//#imports +import scala.concurrent.Future +import scala.concurrent.duration._ +import scala.util.Failure +import scala.util.Success + +import akka.Done +import akka.actor.typed.ActorRef +import akka.actor.typed.Behavior +import akka.actor.typed.delivery.ConsumerController +import akka.actor.typed.scaladsl.ActorContext +import akka.actor.typed.scaladsl.Behaviors +import akka.cluster.sharding.typed.delivery.ShardingConsumerController +import akka.util.Timeout + +//#imports + +object ShardingDocExample { + + //#consumer + trait DB { + def save(id: String, value: TodoList.State): Future[Done] + def load(id: String): Future[TodoList.State] + } + + object TodoList { + + sealed trait Command + + final case class AddTask(item: String) extends Command + final case class CompleteTask(item: String) extends Command + + private final case class InitialState(state: State) extends Command + private final case class SaveSuccess(confirmTo: ActorRef[ConsumerController.Confirmed]) extends Command + private final case class DBError(cause: Throwable) extends Command + + private final case class CommandDelivery(command: Command, confirmTo: ActorRef[ConsumerController.Confirmed]) + extends Command + + final case class State(tasks: Vector[String]) + + def apply( + id: String, + db: DB, + consumerController: ActorRef[ConsumerController.Start[Command]]): Behavior[Command] = { + Behaviors.setup[Command] { context => + new TodoList(context, id, db).start(consumerController) + } + } + + } + + class TodoList(context: ActorContext[TodoList.Command], id: String, db: DB) { + import TodoList._ + + private def start(consumerController: ActorRef[ConsumerController.Start[Command]]): Behavior[Command] = { + context.pipeToSelf(db.load(id)) { + case Success(value) => InitialState(value) + case Failure(cause) => DBError(cause) + } + + Behaviors.receiveMessagePartial { + case InitialState(state) => + val deliveryAdapter: ActorRef[ConsumerController.Delivery[Command]] = context.messageAdapter { delivery => + CommandDelivery(delivery.message, delivery.confirmTo) + } + consumerController ! ConsumerController.Start(deliveryAdapter) + active(state) + case DBError(cause) => + throw cause + } + } + + private def active(state: State): Behavior[Command] = { + Behaviors.receiveMessagePartial { + case CommandDelivery(AddTask(item), confirmTo) => + val newState = state.copy(tasks = state.tasks :+ item) + save(newState, confirmTo) + active(newState) + case CommandDelivery(CompleteTask(item), confirmTo) => + val newState = state.copy(tasks = state.tasks.filterNot(_ == item)) + save(newState, confirmTo) + active(newState) + case SaveSuccess(confirmTo) => + confirmTo ! ConsumerController.Confirmed + Behaviors.same + case DBError(cause) => + throw cause + } + } + + private def save(newState: State, confirmTo: ActorRef[ConsumerController.Confirmed]): Unit = { + context.pipeToSelf(db.save(id, newState)) { + case Success(_) => SaveSuccess(confirmTo) + case Failure(cause) => DBError(cause) + } + } + } + //#consumer + + //#producer + import akka.cluster.sharding.typed.delivery.ShardingProducerController + + object TodoService { + sealed trait Command + + final case class UpdateTodo(listId: String, item: String, completed: Boolean, replyTo: ActorRef[Response]) + extends Command + + sealed trait Response + case object Accepted extends Response + case object Rejected extends Response + case object MaybeAccepted extends Response + + private final case class WrappedRequestNext(requestNext: ShardingProducerController.RequestNext[TodoList.Command]) + extends Command + private final case class Confirmed(originalReplyTo: ActorRef[Response]) extends Command + private final case class TimedOut(originalReplyTo: ActorRef[Response]) extends Command + + def apply(producerController: ActorRef[ShardingProducerController.Command[TodoList.Command]]): Behavior[Command] = { + Behaviors.setup { context => + new TodoService(context).start(producerController) + } + } + + } + + class TodoService(context: ActorContext[TodoService.Command]) { + import TodoService._ + + private implicit val askTimeout: Timeout = 5.seconds + + private def start( + producerController: ActorRef[ShardingProducerController.Start[TodoList.Command]]): Behavior[Command] = { + val requestNextAdapter: ActorRef[ShardingProducerController.RequestNext[TodoList.Command]] = + context.messageAdapter(WrappedRequestNext.apply) + producerController ! ShardingProducerController.Start(requestNextAdapter) + + Behaviors.receiveMessagePartial { + case WrappedRequestNext(next) => + active(next) + case UpdateTodo(_, _, _, replyTo) => + // not hooked up with shardingProducerController yet + replyTo ! Rejected + Behaviors.same + } + } + + private def active(requestNext: ShardingProducerController.RequestNext[TodoList.Command]): Behavior[Command] = { + Behaviors.receiveMessage { + case WrappedRequestNext(next) => + active(next) + + case UpdateTodo(listId, item, completed, replyTo) => + if (requestNext.bufferedForEntitiesWithoutDemand.getOrElse(listId, 0) >= 100) + replyTo ! Rejected + else { + val requestMsg = if (completed) TodoList.CompleteTask(item) else TodoList.AddTask(item) + context.ask[ShardingProducerController.MessageWithConfirmation[TodoList.Command], Done]( + requestNext.askNextTo, + askReplyTo => ShardingProducerController.MessageWithConfirmation(listId, requestMsg, askReplyTo)) { + case Success(Done) => Confirmed(replyTo) + case Failure(_) => TimedOut(replyTo) + } + } + Behaviors.same + + case Confirmed(originalReplyTo) => + originalReplyTo ! Accepted + Behaviors.same + + case TimedOut(originalReplyTo) => + originalReplyTo ! MaybeAccepted + Behaviors.same + } + } + + } + //#producer + + def illustrateInit(): Unit = { + Behaviors.setup[Nothing] { context => + //#init + import akka.cluster.sharding.typed.scaladsl.ClusterSharding + import akka.cluster.sharding.typed.scaladsl.Entity + import akka.cluster.sharding.typed.scaladsl.EntityTypeKey + import akka.cluster.typed.Cluster + + val db: DB = ??? + + val system = context.system + + val TypeKey = EntityTypeKey[ConsumerController.SequencedMessage[TodoList.Command]]("todo") + + val region = ClusterSharding(system).init(Entity(TypeKey)(entityContext => + ShardingConsumerController(start => TodoList(entityContext.entityId, db, start)))) + + val selfAddress = Cluster(system).selfMember.address + val producerId = s"todo-producer-${selfAddress.host}:${selfAddress.port}" + + val producerController = + context.spawn(ShardingProducerController(producerId, region, durableQueueBehavior = None), "producerController") + + context.spawn(TodoService(producerController), "producer") + //#init + + Behaviors.empty + } + } + +} diff --git a/akka-cluster-sharding-typed/src/test/scala/docs/delivery/WorkPullingDocExample.scala b/akka-cluster-sharding-typed/src/test/scala/docs/delivery/WorkPullingDocExample.scala new file mode 100644 index 00000000000..00bd04b8fab --- /dev/null +++ b/akka-cluster-sharding-typed/src/test/scala/docs/delivery/WorkPullingDocExample.scala @@ -0,0 +1,233 @@ +/* + * Copyright (C) 2020 Lightbend Inc. + */ + +package docs.delivery + +import java.util.UUID + +import scala.concurrent.duration._ +import scala.util.Failure +import scala.util.Success + +import akka.Done +import akka.actor.typed.ActorRef +import com.github.ghik.silencer.silent + +@silent("never used") +object WorkPullingDocExample { + + //#imports + import akka.actor.typed.scaladsl.Behaviors + import akka.actor.typed.Behavior + //#imports + + //#consumer + import akka.actor.typed.delivery.ConsumerController + import akka.actor.typed.receptionist.ServiceKey + + object ImageConverter { + sealed trait Command + final case class ConversionJob(resultId: UUID, fromFormat: String, toFormat: String, image: Array[Byte]) + private case class WrappedDelivery(d: ConsumerController.Delivery[ConversionJob]) extends Command + + val serviceKey = ServiceKey[ConsumerController.Command[ConversionJob]]("ImageConverter") + + def apply(): Behavior[Command] = { + Behaviors.setup { context => + val deliveryAdapter = + context.messageAdapter[ConsumerController.Delivery[ConversionJob]](WrappedDelivery(_)) + val consumerController = + context.spawn(ConsumerController(serviceKey), "consumerController") + consumerController ! ConsumerController.Start(deliveryAdapter) + + Behaviors.receiveMessage { + case WrappedDelivery(delivery) => + val image = delivery.message.image + val fromFormat = delivery.message.fromFormat + val toFormat = delivery.message.toFormat + // convert image... + // store result with resultId key for later retrieval + + // and when completed confirm + delivery.confirmTo ! ConsumerController.Confirmed + + Behaviors.same + } + + } + } + + } + //#consumer + + //#producer + import akka.actor.typed.delivery.WorkPullingProducerController + import akka.actor.typed.scaladsl.ActorContext + import akka.actor.typed.scaladsl.StashBuffer + + object ImageWorkManager { + trait Command + final case class Convert(fromFormat: String, toFormat: String, image: Array[Byte]) extends Command + private case class WrappedRequestNext(r: WorkPullingProducerController.RequestNext[ImageConverter.ConversionJob]) + extends Command + + final case class GetResult(resultId: UUID, replyTo: ActorRef[Option[Array[Byte]]]) extends Command + + //#producer + + //#ask + final case class ConvertRequest( + fromFormat: String, + toFormat: String, + image: Array[Byte], + replyTo: ActorRef[ConvertResponse]) + extends Command + + sealed trait ConvertResponse + final case class ConvertAccepted(resultId: UUID) extends ConvertResponse + case object ConvertRejected extends ConvertResponse + final case class ConvertTimedOut(resultId: UUID) extends ConvertResponse + + private final case class AskReply(resultId: UUID, originalReplyTo: ActorRef[ConvertResponse], timeout: Boolean) + extends Command + //#ask + + //#producer + def apply(): Behavior[Command] = { + Behaviors.setup { context => + val requestNextAdapter = + context.messageAdapter[WorkPullingProducerController.RequestNext[ImageConverter.ConversionJob]]( + WrappedRequestNext(_)) + val producerController = context.spawn( + WorkPullingProducerController( + producerId = "workManager", + workerServiceKey = ImageConverter.serviceKey, + durableQueueBehavior = None), + "producerController") + //#producer + //#durable-queue + import akka.persistence.typed.delivery.EventSourcedProducerQueue + import akka.persistence.typed.PersistenceId + + val durableQueue = + EventSourcedProducerQueue[ImageConverter.ConversionJob](PersistenceId.ofUniqueId("ImageWorkManager")) + val durableProducerController = context.spawn( + WorkPullingProducerController( + producerId = "workManager", + workerServiceKey = ImageConverter.serviceKey, + durableQueueBehavior = Some(durableQueue)), + "producerController") + //#durable-queue + //#producer + producerController ! WorkPullingProducerController.Start(requestNextAdapter) + + Behaviors.withStash(1000) { stashBuffer => + new ImageWorkManager(context, stashBuffer).waitForNext() + } + } + } + + } + + final class ImageWorkManager( + context: ActorContext[ImageWorkManager.Command], + stashBuffer: StashBuffer[ImageWorkManager.Command]) { + + import ImageWorkManager._ + + private def waitForNext(): Behavior[Command] = { + Behaviors.receiveMessage { + case WrappedRequestNext(next) => + stashBuffer.unstashAll(active(next)) + case c: Convert => + if (stashBuffer.isFull) { + context.log.warn("Too many Convert requests.") + Behaviors.same + } else { + stashBuffer.stash(c) + Behaviors.same + } + case GetResult(resultId, replyTo) => + // TODO retrieve the stored result and reply + Behaviors.same + } + } + + private def active( + next: WorkPullingProducerController.RequestNext[ImageConverter.ConversionJob]): Behavior[Command] = { + Behaviors.receiveMessage { + case Convert(from, to, image) => + val resultId = UUID.randomUUID() + next.sendNextTo ! ImageConverter.ConversionJob(resultId, from, to, image) + waitForNext() + case GetResult(resultId, replyTo) => + // TODO retrieve the stored result and reply + Behaviors.same + case _: WrappedRequestNext => + throw new IllegalStateException("Unexpected RequestNext") + } + } + //#producer + object askScope { + //#ask + + import WorkPullingProducerController.MessageWithConfirmation + import akka.util.Timeout + + implicit val askTimeout: Timeout = 5.seconds + + private def waitForNext(): Behavior[Command] = { + Behaviors.receiveMessage { + case WrappedRequestNext(next) => + stashBuffer.unstashAll(active(next)) + case c: ConvertRequest => + if (stashBuffer.isFull) { + c.replyTo ! ConvertRejected + Behaviors.same + } else { + stashBuffer.stash(c) + Behaviors.same + } + case AskReply(resultId, originalReplyTo, timeout) => + val response = if (timeout) ConvertTimedOut(resultId) else ConvertAccepted(resultId) + originalReplyTo ! response + Behaviors.same + case GetResult(resultId, replyTo) => + // TODO retrieve the stored result and reply + Behaviors.same + } + } + + private def active( + next: WorkPullingProducerController.RequestNext[ImageConverter.ConversionJob]): Behavior[Command] = { + Behaviors.receiveMessage { + case ConvertRequest(from, to, image, originalReplyTo) => + val resultId = UUID.randomUUID() + context.ask[MessageWithConfirmation[ImageConverter.ConversionJob], Done]( + next.askNextTo, + askReplyTo => + MessageWithConfirmation(ImageConverter.ConversionJob(resultId, from, to, image), askReplyTo)) { + case Success(done) => AskReply(resultId, originalReplyTo, timeout = false) + case Failure(_) => AskReply(resultId, originalReplyTo, timeout = true) + } + waitForNext() + case AskReply(resultId, originalReplyTo, timeout) => + val response = if (timeout) ConvertTimedOut(resultId) else ConvertAccepted(resultId) + originalReplyTo ! response + Behaviors.same + case GetResult(resultId, replyTo) => + // TODO retrieve the stored result and reply + Behaviors.same + case _: WrappedRequestNext => + throw new IllegalStateException("Unexpected RequestNext") + } + } + + //#ask + } + //#producer + } + //#producer + +} diff --git a/akka-cluster-typed/src/main/java/akka/cluster/typed/internal/protobuf/ReliableDelivery.java b/akka-cluster-typed/src/main/java/akka/cluster/typed/internal/protobuf/ReliableDelivery.java new file mode 100644 index 00000000000..7f3407d2239 --- /dev/null +++ b/akka-cluster-typed/src/main/java/akka/cluster/typed/internal/protobuf/ReliableDelivery.java @@ -0,0 +1,8034 @@ +/* + * Copyright (C) 2020 Lightbend Inc. + */ + +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: ReliableDelivery.proto + +package akka.cluster.typed.internal.protobuf; + +public final class ReliableDelivery { + private ReliableDelivery() {} + public static void registerAllExtensions( + akka.protobufv3.internal.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + akka.protobufv3.internal.ExtensionRegistry registry) { + registerAllExtensions( + (akka.protobufv3.internal.ExtensionRegistryLite) registry); + } + public interface SequencedMessageOrBuilder extends + // @@protoc_insertion_point(interface_extends:akka.cluster.typed.delivery.SequencedMessage) + akka.protobufv3.internal.MessageOrBuilder { + + /** + * required string producerId = 1; + * @return Whether the producerId field is set. + */ + boolean hasProducerId(); + /** + * required string producerId = 1; + * @return The producerId. + */ + java.lang.String getProducerId(); + /** + * required string producerId = 1; + * @return The bytes for producerId. + */ + akka.protobufv3.internal.ByteString + getProducerIdBytes(); + + /** + * required int64 seqNr = 2; + * @return Whether the seqNr field is set. + */ + boolean hasSeqNr(); + /** + * required int64 seqNr = 2; + * @return The seqNr. + */ + long getSeqNr(); + + /** + * required bool first = 3; + * @return Whether the first field is set. + */ + boolean hasFirst(); + /** + * required bool first = 3; + * @return The first. + */ + boolean getFirst(); + + /** + * required bool ack = 4; + * @return Whether the ack field is set. + */ + boolean hasAck(); + /** + * required bool ack = 4; + * @return The ack. + */ + boolean getAck(); + + /** + * required string producerControllerRef = 5; + * @return Whether the producerControllerRef field is set. + */ + boolean hasProducerControllerRef(); + /** + * required string producerControllerRef = 5; + * @return The producerControllerRef. + */ + java.lang.String getProducerControllerRef(); + /** + * required string producerControllerRef = 5; + * @return The bytes for producerControllerRef. + */ + akka.protobufv3.internal.ByteString + getProducerControllerRefBytes(); + + /** + * required .Payload message = 6; + * @return Whether the message field is set. + */ + boolean hasMessage(); + /** + * required .Payload message = 6; + * @return The message. + */ + akka.remote.ContainerFormats.Payload getMessage(); + /** + * required .Payload message = 6; + */ + akka.remote.ContainerFormats.PayloadOrBuilder getMessageOrBuilder(); + } + /** + *
+   * ConsumerController
+   * 
+ * + * Protobuf type {@code akka.cluster.typed.delivery.SequencedMessage} + */ + public static final class SequencedMessage extends + akka.protobufv3.internal.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:akka.cluster.typed.delivery.SequencedMessage) + SequencedMessageOrBuilder { + private static final long serialVersionUID = 0L; + // Use SequencedMessage.newBuilder() to construct. + private SequencedMessage(akka.protobufv3.internal.GeneratedMessageV3.Builder builder) { + super(builder); + } + private SequencedMessage() { + producerId_ = ""; + producerControllerRef_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + akka.protobufv3.internal.GeneratedMessageV3.UnusedPrivateParameter unused) { + return new SequencedMessage(); + } + + @java.lang.Override + public final akka.protobufv3.internal.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private SequencedMessage( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + akka.protobufv3.internal.UnknownFieldSet.Builder unknownFields = + akka.protobufv3.internal.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + akka.protobufv3.internal.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000001; + producerId_ = bs; + break; + } + case 16: { + bitField0_ |= 0x00000002; + seqNr_ = input.readInt64(); + break; + } + case 24: { + bitField0_ |= 0x00000004; + first_ = input.readBool(); + break; + } + case 32: { + bitField0_ |= 0x00000008; + ack_ = input.readBool(); + break; + } + case 42: { + akka.protobufv3.internal.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000010; + producerControllerRef_ = bs; + break; + } + case 50: { + akka.remote.ContainerFormats.Payload.Builder subBuilder = null; + if (((bitField0_ & 0x00000020) != 0)) { + subBuilder = message_.toBuilder(); + } + message_ = input.readMessage(akka.remote.ContainerFormats.Payload.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(message_); + message_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000020; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (akka.protobufv3.internal.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new akka.protobufv3.internal.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final akka.protobufv3.internal.Descriptors.Descriptor + getDescriptor() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_SequencedMessage_descriptor; + } + + @java.lang.Override + protected akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_SequencedMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage.class, akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage.Builder.class); + } + + private int bitField0_; + public static final int PRODUCERID_FIELD_NUMBER = 1; + private volatile java.lang.Object producerId_; + /** + * required string producerId = 1; + * @return Whether the producerId field is set. + */ + public boolean hasProducerId() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required string producerId = 1; + * @return The producerId. + */ + public java.lang.String getProducerId() { + java.lang.Object ref = producerId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + akka.protobufv3.internal.ByteString bs = + (akka.protobufv3.internal.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + producerId_ = s; + } + return s; + } + } + /** + * required string producerId = 1; + * @return The bytes for producerId. + */ + public akka.protobufv3.internal.ByteString + getProducerIdBytes() { + java.lang.Object ref = producerId_; + if (ref instanceof java.lang.String) { + akka.protobufv3.internal.ByteString b = + akka.protobufv3.internal.ByteString.copyFromUtf8( + (java.lang.String) ref); + producerId_ = b; + return b; + } else { + return (akka.protobufv3.internal.ByteString) ref; + } + } + + public static final int SEQNR_FIELD_NUMBER = 2; + private long seqNr_; + /** + * required int64 seqNr = 2; + * @return Whether the seqNr field is set. + */ + public boolean hasSeqNr() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * required int64 seqNr = 2; + * @return The seqNr. + */ + public long getSeqNr() { + return seqNr_; + } + + public static final int FIRST_FIELD_NUMBER = 3; + private boolean first_; + /** + * required bool first = 3; + * @return Whether the first field is set. + */ + public boolean hasFirst() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * required bool first = 3; + * @return The first. + */ + public boolean getFirst() { + return first_; + } + + public static final int ACK_FIELD_NUMBER = 4; + private boolean ack_; + /** + * required bool ack = 4; + * @return Whether the ack field is set. + */ + public boolean hasAck() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + * required bool ack = 4; + * @return The ack. + */ + public boolean getAck() { + return ack_; + } + + public static final int PRODUCERCONTROLLERREF_FIELD_NUMBER = 5; + private volatile java.lang.Object producerControllerRef_; + /** + * required string producerControllerRef = 5; + * @return Whether the producerControllerRef field is set. + */ + public boolean hasProducerControllerRef() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + * required string producerControllerRef = 5; + * @return The producerControllerRef. + */ + public java.lang.String getProducerControllerRef() { + java.lang.Object ref = producerControllerRef_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + akka.protobufv3.internal.ByteString bs = + (akka.protobufv3.internal.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + producerControllerRef_ = s; + } + return s; + } + } + /** + * required string producerControllerRef = 5; + * @return The bytes for producerControllerRef. + */ + public akka.protobufv3.internal.ByteString + getProducerControllerRefBytes() { + java.lang.Object ref = producerControllerRef_; + if (ref instanceof java.lang.String) { + akka.protobufv3.internal.ByteString b = + akka.protobufv3.internal.ByteString.copyFromUtf8( + (java.lang.String) ref); + producerControllerRef_ = b; + return b; + } else { + return (akka.protobufv3.internal.ByteString) ref; + } + } + + public static final int MESSAGE_FIELD_NUMBER = 6; + private akka.remote.ContainerFormats.Payload message_; + /** + * required .Payload message = 6; + * @return Whether the message field is set. + */ + public boolean hasMessage() { + return ((bitField0_ & 0x00000020) != 0); + } + /** + * required .Payload message = 6; + * @return The message. + */ + public akka.remote.ContainerFormats.Payload getMessage() { + return message_ == null ? akka.remote.ContainerFormats.Payload.getDefaultInstance() : message_; + } + /** + * required .Payload message = 6; + */ + public akka.remote.ContainerFormats.PayloadOrBuilder getMessageOrBuilder() { + return message_ == null ? akka.remote.ContainerFormats.Payload.getDefaultInstance() : message_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasProducerId()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasSeqNr()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasFirst()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasAck()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasProducerControllerRef()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasMessage()) { + memoizedIsInitialized = 0; + return false; + } + if (!getMessage().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(akka.protobufv3.internal.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + akka.protobufv3.internal.GeneratedMessageV3.writeString(output, 1, producerId_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeInt64(2, seqNr_); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeBool(3, first_); + } + if (((bitField0_ & 0x00000008) != 0)) { + output.writeBool(4, ack_); + } + if (((bitField0_ & 0x00000010) != 0)) { + akka.protobufv3.internal.GeneratedMessageV3.writeString(output, 5, producerControllerRef_); + } + if (((bitField0_ & 0x00000020) != 0)) { + output.writeMessage(6, getMessage()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += akka.protobufv3.internal.GeneratedMessageV3.computeStringSize(1, producerId_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += akka.protobufv3.internal.CodedOutputStream + .computeInt64Size(2, seqNr_); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += akka.protobufv3.internal.CodedOutputStream + .computeBoolSize(3, first_); + } + if (((bitField0_ & 0x00000008) != 0)) { + size += akka.protobufv3.internal.CodedOutputStream + .computeBoolSize(4, ack_); + } + if (((bitField0_ & 0x00000010) != 0)) { + size += akka.protobufv3.internal.GeneratedMessageV3.computeStringSize(5, producerControllerRef_); + } + if (((bitField0_ & 0x00000020) != 0)) { + size += akka.protobufv3.internal.CodedOutputStream + .computeMessageSize(6, getMessage()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage)) { + return super.equals(obj); + } + akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage other = (akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage) obj; + + if (hasProducerId() != other.hasProducerId()) return false; + if (hasProducerId()) { + if (!getProducerId() + .equals(other.getProducerId())) return false; + } + if (hasSeqNr() != other.hasSeqNr()) return false; + if (hasSeqNr()) { + if (getSeqNr() + != other.getSeqNr()) return false; + } + if (hasFirst() != other.hasFirst()) return false; + if (hasFirst()) { + if (getFirst() + != other.getFirst()) return false; + } + if (hasAck() != other.hasAck()) return false; + if (hasAck()) { + if (getAck() + != other.getAck()) return false; + } + if (hasProducerControllerRef() != other.hasProducerControllerRef()) return false; + if (hasProducerControllerRef()) { + if (!getProducerControllerRef() + .equals(other.getProducerControllerRef())) return false; + } + if (hasMessage() != other.hasMessage()) return false; + if (hasMessage()) { + if (!getMessage() + .equals(other.getMessage())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasProducerId()) { + hash = (37 * hash) + PRODUCERID_FIELD_NUMBER; + hash = (53 * hash) + getProducerId().hashCode(); + } + if (hasSeqNr()) { + hash = (37 * hash) + SEQNR_FIELD_NUMBER; + hash = (53 * hash) + akka.protobufv3.internal.Internal.hashLong( + getSeqNr()); + } + if (hasFirst()) { + hash = (37 * hash) + FIRST_FIELD_NUMBER; + hash = (53 * hash) + akka.protobufv3.internal.Internal.hashBoolean( + getFirst()); + } + if (hasAck()) { + hash = (37 * hash) + ACK_FIELD_NUMBER; + hash = (53 * hash) + akka.protobufv3.internal.Internal.hashBoolean( + getAck()); + } + if (hasProducerControllerRef()) { + hash = (37 * hash) + PRODUCERCONTROLLERREF_FIELD_NUMBER; + hash = (53 * hash) + getProducerControllerRef().hashCode(); + } + if (hasMessage()) { + hash = (37 * hash) + MESSAGE_FIELD_NUMBER; + hash = (53 * hash) + getMessage().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage parseFrom( + java.nio.ByteBuffer data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage parseFrom( + java.nio.ByteBuffer data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage parseFrom( + akka.protobufv3.internal.ByteString data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage parseFrom( + akka.protobufv3.internal.ByteString data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage parseFrom(byte[] data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage parseFrom( + byte[] data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage parseFrom( + java.io.InputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage parseDelimitedFrom( + java.io.InputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage parseFrom( + akka.protobufv3.internal.CodedInputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage parseFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + akka.protobufv3.internal.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
+     * ConsumerController
+     * 
+ * + * Protobuf type {@code akka.cluster.typed.delivery.SequencedMessage} + */ + public static final class Builder extends + akka.protobufv3.internal.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:akka.cluster.typed.delivery.SequencedMessage) + akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessageOrBuilder { + public static final akka.protobufv3.internal.Descriptors.Descriptor + getDescriptor() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_SequencedMessage_descriptor; + } + + @java.lang.Override + protected akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_SequencedMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage.class, akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage.Builder.class); + } + + // Construct using akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + akka.protobufv3.internal.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (akka.protobufv3.internal.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getMessageFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + producerId_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + seqNr_ = 0L; + bitField0_ = (bitField0_ & ~0x00000002); + first_ = false; + bitField0_ = (bitField0_ & ~0x00000004); + ack_ = false; + bitField0_ = (bitField0_ & ~0x00000008); + producerControllerRef_ = ""; + bitField0_ = (bitField0_ & ~0x00000010); + if (messageBuilder_ == null) { + message_ = null; + } else { + messageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000020); + return this; + } + + @java.lang.Override + public akka.protobufv3.internal.Descriptors.Descriptor + getDescriptorForType() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_SequencedMessage_descriptor; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage getDefaultInstanceForType() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage.getDefaultInstance(); + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage build() { + akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage buildPartial() { + akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage result = new akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.producerId_ = producerId_; + if (((from_bitField0_ & 0x00000002) != 0)) { + result.seqNr_ = seqNr_; + to_bitField0_ |= 0x00000002; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.first_ = first_; + to_bitField0_ |= 0x00000004; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + result.ack_ = ack_; + to_bitField0_ |= 0x00000008; + } + if (((from_bitField0_ & 0x00000010) != 0)) { + to_bitField0_ |= 0x00000010; + } + result.producerControllerRef_ = producerControllerRef_; + if (((from_bitField0_ & 0x00000020) != 0)) { + if (messageBuilder_ == null) { + result.message_ = message_; + } else { + result.message_ = messageBuilder_.build(); + } + to_bitField0_ |= 0x00000020; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + akka.protobufv3.internal.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(akka.protobufv3.internal.Message other) { + if (other instanceof akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage) { + return mergeFrom((akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage other) { + if (other == akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage.getDefaultInstance()) return this; + if (other.hasProducerId()) { + bitField0_ |= 0x00000001; + producerId_ = other.producerId_; + onChanged(); + } + if (other.hasSeqNr()) { + setSeqNr(other.getSeqNr()); + } + if (other.hasFirst()) { + setFirst(other.getFirst()); + } + if (other.hasAck()) { + setAck(other.getAck()); + } + if (other.hasProducerControllerRef()) { + bitField0_ |= 0x00000010; + producerControllerRef_ = other.producerControllerRef_; + onChanged(); + } + if (other.hasMessage()) { + mergeMessage(other.getMessage()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasProducerId()) { + return false; + } + if (!hasSeqNr()) { + return false; + } + if (!hasFirst()) { + return false; + } + if (!hasAck()) { + return false; + } + if (!hasProducerControllerRef()) { + return false; + } + if (!hasMessage()) { + return false; + } + if (!getMessage().isInitialized()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (akka.protobufv3.internal.InvalidProtocolBufferException e) { + parsedMessage = (akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.lang.Object producerId_ = ""; + /** + * required string producerId = 1; + * @return Whether the producerId field is set. + */ + public boolean hasProducerId() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required string producerId = 1; + * @return The producerId. + */ + public java.lang.String getProducerId() { + java.lang.Object ref = producerId_; + if (!(ref instanceof java.lang.String)) { + akka.protobufv3.internal.ByteString bs = + (akka.protobufv3.internal.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + producerId_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * required string producerId = 1; + * @return The bytes for producerId. + */ + public akka.protobufv3.internal.ByteString + getProducerIdBytes() { + java.lang.Object ref = producerId_; + if (ref instanceof String) { + akka.protobufv3.internal.ByteString b = + akka.protobufv3.internal.ByteString.copyFromUtf8( + (java.lang.String) ref); + producerId_ = b; + return b; + } else { + return (akka.protobufv3.internal.ByteString) ref; + } + } + /** + * required string producerId = 1; + * @param value The producerId to set. + * @return This builder for chaining. + */ + public Builder setProducerId( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + producerId_ = value; + onChanged(); + return this; + } + /** + * required string producerId = 1; + * @return This builder for chaining. + */ + public Builder clearProducerId() { + bitField0_ = (bitField0_ & ~0x00000001); + producerId_ = getDefaultInstance().getProducerId(); + onChanged(); + return this; + } + /** + * required string producerId = 1; + * @param value The bytes for producerId to set. + * @return This builder for chaining. + */ + public Builder setProducerIdBytes( + akka.protobufv3.internal.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + producerId_ = value; + onChanged(); + return this; + } + + private long seqNr_ ; + /** + * required int64 seqNr = 2; + * @return Whether the seqNr field is set. + */ + public boolean hasSeqNr() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * required int64 seqNr = 2; + * @return The seqNr. + */ + public long getSeqNr() { + return seqNr_; + } + /** + * required int64 seqNr = 2; + * @param value The seqNr to set. + * @return This builder for chaining. + */ + public Builder setSeqNr(long value) { + bitField0_ |= 0x00000002; + seqNr_ = value; + onChanged(); + return this; + } + /** + * required int64 seqNr = 2; + * @return This builder for chaining. + */ + public Builder clearSeqNr() { + bitField0_ = (bitField0_ & ~0x00000002); + seqNr_ = 0L; + onChanged(); + return this; + } + + private boolean first_ ; + /** + * required bool first = 3; + * @return Whether the first field is set. + */ + public boolean hasFirst() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * required bool first = 3; + * @return The first. + */ + public boolean getFirst() { + return first_; + } + /** + * required bool first = 3; + * @param value The first to set. + * @return This builder for chaining. + */ + public Builder setFirst(boolean value) { + bitField0_ |= 0x00000004; + first_ = value; + onChanged(); + return this; + } + /** + * required bool first = 3; + * @return This builder for chaining. + */ + public Builder clearFirst() { + bitField0_ = (bitField0_ & ~0x00000004); + first_ = false; + onChanged(); + return this; + } + + private boolean ack_ ; + /** + * required bool ack = 4; + * @return Whether the ack field is set. + */ + public boolean hasAck() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + * required bool ack = 4; + * @return The ack. + */ + public boolean getAck() { + return ack_; + } + /** + * required bool ack = 4; + * @param value The ack to set. + * @return This builder for chaining. + */ + public Builder setAck(boolean value) { + bitField0_ |= 0x00000008; + ack_ = value; + onChanged(); + return this; + } + /** + * required bool ack = 4; + * @return This builder for chaining. + */ + public Builder clearAck() { + bitField0_ = (bitField0_ & ~0x00000008); + ack_ = false; + onChanged(); + return this; + } + + private java.lang.Object producerControllerRef_ = ""; + /** + * required string producerControllerRef = 5; + * @return Whether the producerControllerRef field is set. + */ + public boolean hasProducerControllerRef() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + * required string producerControllerRef = 5; + * @return The producerControllerRef. + */ + public java.lang.String getProducerControllerRef() { + java.lang.Object ref = producerControllerRef_; + if (!(ref instanceof java.lang.String)) { + akka.protobufv3.internal.ByteString bs = + (akka.protobufv3.internal.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + producerControllerRef_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * required string producerControllerRef = 5; + * @return The bytes for producerControllerRef. + */ + public akka.protobufv3.internal.ByteString + getProducerControllerRefBytes() { + java.lang.Object ref = producerControllerRef_; + if (ref instanceof String) { + akka.protobufv3.internal.ByteString b = + akka.protobufv3.internal.ByteString.copyFromUtf8( + (java.lang.String) ref); + producerControllerRef_ = b; + return b; + } else { + return (akka.protobufv3.internal.ByteString) ref; + } + } + /** + * required string producerControllerRef = 5; + * @param value The producerControllerRef to set. + * @return This builder for chaining. + */ + public Builder setProducerControllerRef( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000010; + producerControllerRef_ = value; + onChanged(); + return this; + } + /** + * required string producerControllerRef = 5; + * @return This builder for chaining. + */ + public Builder clearProducerControllerRef() { + bitField0_ = (bitField0_ & ~0x00000010); + producerControllerRef_ = getDefaultInstance().getProducerControllerRef(); + onChanged(); + return this; + } + /** + * required string producerControllerRef = 5; + * @param value The bytes for producerControllerRef to set. + * @return This builder for chaining. + */ + public Builder setProducerControllerRefBytes( + akka.protobufv3.internal.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000010; + producerControllerRef_ = value; + onChanged(); + return this; + } + + private akka.remote.ContainerFormats.Payload message_; + private akka.protobufv3.internal.SingleFieldBuilderV3< + akka.remote.ContainerFormats.Payload, akka.remote.ContainerFormats.Payload.Builder, akka.remote.ContainerFormats.PayloadOrBuilder> messageBuilder_; + /** + * required .Payload message = 6; + * @return Whether the message field is set. + */ + public boolean hasMessage() { + return ((bitField0_ & 0x00000020) != 0); + } + /** + * required .Payload message = 6; + * @return The message. + */ + public akka.remote.ContainerFormats.Payload getMessage() { + if (messageBuilder_ == null) { + return message_ == null ? akka.remote.ContainerFormats.Payload.getDefaultInstance() : message_; + } else { + return messageBuilder_.getMessage(); + } + } + /** + * required .Payload message = 6; + */ + public Builder setMessage(akka.remote.ContainerFormats.Payload value) { + if (messageBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + message_ = value; + onChanged(); + } else { + messageBuilder_.setMessage(value); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * required .Payload message = 6; + */ + public Builder setMessage( + akka.remote.ContainerFormats.Payload.Builder builderForValue) { + if (messageBuilder_ == null) { + message_ = builderForValue.build(); + onChanged(); + } else { + messageBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * required .Payload message = 6; + */ + public Builder mergeMessage(akka.remote.ContainerFormats.Payload value) { + if (messageBuilder_ == null) { + if (((bitField0_ & 0x00000020) != 0) && + message_ != null && + message_ != akka.remote.ContainerFormats.Payload.getDefaultInstance()) { + message_ = + akka.remote.ContainerFormats.Payload.newBuilder(message_).mergeFrom(value).buildPartial(); + } else { + message_ = value; + } + onChanged(); + } else { + messageBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * required .Payload message = 6; + */ + public Builder clearMessage() { + if (messageBuilder_ == null) { + message_ = null; + onChanged(); + } else { + messageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000020); + return this; + } + /** + * required .Payload message = 6; + */ + public akka.remote.ContainerFormats.Payload.Builder getMessageBuilder() { + bitField0_ |= 0x00000020; + onChanged(); + return getMessageFieldBuilder().getBuilder(); + } + /** + * required .Payload message = 6; + */ + public akka.remote.ContainerFormats.PayloadOrBuilder getMessageOrBuilder() { + if (messageBuilder_ != null) { + return messageBuilder_.getMessageOrBuilder(); + } else { + return message_ == null ? + akka.remote.ContainerFormats.Payload.getDefaultInstance() : message_; + } + } + /** + * required .Payload message = 6; + */ + private akka.protobufv3.internal.SingleFieldBuilderV3< + akka.remote.ContainerFormats.Payload, akka.remote.ContainerFormats.Payload.Builder, akka.remote.ContainerFormats.PayloadOrBuilder> + getMessageFieldBuilder() { + if (messageBuilder_ == null) { + messageBuilder_ = new akka.protobufv3.internal.SingleFieldBuilderV3< + akka.remote.ContainerFormats.Payload, akka.remote.ContainerFormats.Payload.Builder, akka.remote.ContainerFormats.PayloadOrBuilder>( + getMessage(), + getParentForChildren(), + isClean()); + message_ = null; + } + return messageBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final akka.protobufv3.internal.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final akka.protobufv3.internal.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:akka.cluster.typed.delivery.SequencedMessage) + } + + // @@protoc_insertion_point(class_scope:akka.cluster.typed.delivery.SequencedMessage) + private static final akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage(); + } + + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final akka.protobufv3.internal.Parser + PARSER = new akka.protobufv3.internal.AbstractParser() { + @java.lang.Override + public SequencedMessage parsePartialFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return new SequencedMessage(input, extensionRegistry); + } + }; + + public static akka.protobufv3.internal.Parser parser() { + return PARSER; + } + + @java.lang.Override + public akka.protobufv3.internal.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.SequencedMessage getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface RegisterConsumerOrBuilder extends + // @@protoc_insertion_point(interface_extends:akka.cluster.typed.delivery.RegisterConsumer) + akka.protobufv3.internal.MessageOrBuilder { + + /** + * required string consumerControllerRef = 1; + * @return Whether the consumerControllerRef field is set. + */ + boolean hasConsumerControllerRef(); + /** + * required string consumerControllerRef = 1; + * @return The consumerControllerRef. + */ + java.lang.String getConsumerControllerRef(); + /** + * required string consumerControllerRef = 1; + * @return The bytes for consumerControllerRef. + */ + akka.protobufv3.internal.ByteString + getConsumerControllerRefBytes(); + } + /** + *
+   * ProducerController
+   * 
+ * + * Protobuf type {@code akka.cluster.typed.delivery.RegisterConsumer} + */ + public static final class RegisterConsumer extends + akka.protobufv3.internal.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:akka.cluster.typed.delivery.RegisterConsumer) + RegisterConsumerOrBuilder { + private static final long serialVersionUID = 0L; + // Use RegisterConsumer.newBuilder() to construct. + private RegisterConsumer(akka.protobufv3.internal.GeneratedMessageV3.Builder builder) { + super(builder); + } + private RegisterConsumer() { + consumerControllerRef_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + akka.protobufv3.internal.GeneratedMessageV3.UnusedPrivateParameter unused) { + return new RegisterConsumer(); + } + + @java.lang.Override + public final akka.protobufv3.internal.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private RegisterConsumer( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + akka.protobufv3.internal.UnknownFieldSet.Builder unknownFields = + akka.protobufv3.internal.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + akka.protobufv3.internal.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000001; + consumerControllerRef_ = bs; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (akka.protobufv3.internal.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new akka.protobufv3.internal.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final akka.protobufv3.internal.Descriptors.Descriptor + getDescriptor() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_RegisterConsumer_descriptor; + } + + @java.lang.Override + protected akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_RegisterConsumer_fieldAccessorTable + .ensureFieldAccessorsInitialized( + akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer.class, akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer.Builder.class); + } + + private int bitField0_; + public static final int CONSUMERCONTROLLERREF_FIELD_NUMBER = 1; + private volatile java.lang.Object consumerControllerRef_; + /** + * required string consumerControllerRef = 1; + * @return Whether the consumerControllerRef field is set. + */ + public boolean hasConsumerControllerRef() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required string consumerControllerRef = 1; + * @return The consumerControllerRef. + */ + public java.lang.String getConsumerControllerRef() { + java.lang.Object ref = consumerControllerRef_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + akka.protobufv3.internal.ByteString bs = + (akka.protobufv3.internal.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + consumerControllerRef_ = s; + } + return s; + } + } + /** + * required string consumerControllerRef = 1; + * @return The bytes for consumerControllerRef. + */ + public akka.protobufv3.internal.ByteString + getConsumerControllerRefBytes() { + java.lang.Object ref = consumerControllerRef_; + if (ref instanceof java.lang.String) { + akka.protobufv3.internal.ByteString b = + akka.protobufv3.internal.ByteString.copyFromUtf8( + (java.lang.String) ref); + consumerControllerRef_ = b; + return b; + } else { + return (akka.protobufv3.internal.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasConsumerControllerRef()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(akka.protobufv3.internal.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + akka.protobufv3.internal.GeneratedMessageV3.writeString(output, 1, consumerControllerRef_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += akka.protobufv3.internal.GeneratedMessageV3.computeStringSize(1, consumerControllerRef_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer)) { + return super.equals(obj); + } + akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer other = (akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer) obj; + + if (hasConsumerControllerRef() != other.hasConsumerControllerRef()) return false; + if (hasConsumerControllerRef()) { + if (!getConsumerControllerRef() + .equals(other.getConsumerControllerRef())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasConsumerControllerRef()) { + hash = (37 * hash) + CONSUMERCONTROLLERREF_FIELD_NUMBER; + hash = (53 * hash) + getConsumerControllerRef().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer parseFrom( + java.nio.ByteBuffer data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer parseFrom( + java.nio.ByteBuffer data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer parseFrom( + akka.protobufv3.internal.ByteString data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer parseFrom( + akka.protobufv3.internal.ByteString data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer parseFrom(byte[] data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer parseFrom( + byte[] data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer parseFrom(java.io.InputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer parseFrom( + java.io.InputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer parseDelimitedFrom( + java.io.InputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer parseFrom( + akka.protobufv3.internal.CodedInputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer parseFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + akka.protobufv3.internal.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
+     * ProducerController
+     * 
+ * + * Protobuf type {@code akka.cluster.typed.delivery.RegisterConsumer} + */ + public static final class Builder extends + akka.protobufv3.internal.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:akka.cluster.typed.delivery.RegisterConsumer) + akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumerOrBuilder { + public static final akka.protobufv3.internal.Descriptors.Descriptor + getDescriptor() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_RegisterConsumer_descriptor; + } + + @java.lang.Override + protected akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_RegisterConsumer_fieldAccessorTable + .ensureFieldAccessorsInitialized( + akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer.class, akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer.Builder.class); + } + + // Construct using akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + akka.protobufv3.internal.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (akka.protobufv3.internal.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + consumerControllerRef_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + @java.lang.Override + public akka.protobufv3.internal.Descriptors.Descriptor + getDescriptorForType() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_RegisterConsumer_descriptor; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer getDefaultInstanceForType() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer.getDefaultInstance(); + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer build() { + akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer buildPartial() { + akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer result = new akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.consumerControllerRef_ = consumerControllerRef_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + akka.protobufv3.internal.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(akka.protobufv3.internal.Message other) { + if (other instanceof akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer) { + return mergeFrom((akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer other) { + if (other == akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer.getDefaultInstance()) return this; + if (other.hasConsumerControllerRef()) { + bitField0_ |= 0x00000001; + consumerControllerRef_ = other.consumerControllerRef_; + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasConsumerControllerRef()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (akka.protobufv3.internal.InvalidProtocolBufferException e) { + parsedMessage = (akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.lang.Object consumerControllerRef_ = ""; + /** + * required string consumerControllerRef = 1; + * @return Whether the consumerControllerRef field is set. + */ + public boolean hasConsumerControllerRef() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required string consumerControllerRef = 1; + * @return The consumerControllerRef. + */ + public java.lang.String getConsumerControllerRef() { + java.lang.Object ref = consumerControllerRef_; + if (!(ref instanceof java.lang.String)) { + akka.protobufv3.internal.ByteString bs = + (akka.protobufv3.internal.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + consumerControllerRef_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * required string consumerControllerRef = 1; + * @return The bytes for consumerControllerRef. + */ + public akka.protobufv3.internal.ByteString + getConsumerControllerRefBytes() { + java.lang.Object ref = consumerControllerRef_; + if (ref instanceof String) { + akka.protobufv3.internal.ByteString b = + akka.protobufv3.internal.ByteString.copyFromUtf8( + (java.lang.String) ref); + consumerControllerRef_ = b; + return b; + } else { + return (akka.protobufv3.internal.ByteString) ref; + } + } + /** + * required string consumerControllerRef = 1; + * @param value The consumerControllerRef to set. + * @return This builder for chaining. + */ + public Builder setConsumerControllerRef( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + consumerControllerRef_ = value; + onChanged(); + return this; + } + /** + * required string consumerControllerRef = 1; + * @return This builder for chaining. + */ + public Builder clearConsumerControllerRef() { + bitField0_ = (bitField0_ & ~0x00000001); + consumerControllerRef_ = getDefaultInstance().getConsumerControllerRef(); + onChanged(); + return this; + } + /** + * required string consumerControllerRef = 1; + * @param value The bytes for consumerControllerRef to set. + * @return This builder for chaining. + */ + public Builder setConsumerControllerRefBytes( + akka.protobufv3.internal.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + consumerControllerRef_ = value; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final akka.protobufv3.internal.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final akka.protobufv3.internal.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:akka.cluster.typed.delivery.RegisterConsumer) + } + + // @@protoc_insertion_point(class_scope:akka.cluster.typed.delivery.RegisterConsumer) + private static final akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer(); + } + + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final akka.protobufv3.internal.Parser + PARSER = new akka.protobufv3.internal.AbstractParser() { + @java.lang.Override + public RegisterConsumer parsePartialFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return new RegisterConsumer(input, extensionRegistry); + } + }; + + public static akka.protobufv3.internal.Parser parser() { + return PARSER; + } + + @java.lang.Override + public akka.protobufv3.internal.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.RegisterConsumer getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface RequestOrBuilder extends + // @@protoc_insertion_point(interface_extends:akka.cluster.typed.delivery.Request) + akka.protobufv3.internal.MessageOrBuilder { + + /** + * required int64 confirmedSeqNr = 1; + * @return Whether the confirmedSeqNr field is set. + */ + boolean hasConfirmedSeqNr(); + /** + * required int64 confirmedSeqNr = 1; + * @return The confirmedSeqNr. + */ + long getConfirmedSeqNr(); + + /** + * required int64 requestUpToSeqNr = 2; + * @return Whether the requestUpToSeqNr field is set. + */ + boolean hasRequestUpToSeqNr(); + /** + * required int64 requestUpToSeqNr = 2; + * @return The requestUpToSeqNr. + */ + long getRequestUpToSeqNr(); + + /** + * required bool supportResend = 3; + * @return Whether the supportResend field is set. + */ + boolean hasSupportResend(); + /** + * required bool supportResend = 3; + * @return The supportResend. + */ + boolean getSupportResend(); + + /** + * required bool viaTimeout = 4; + * @return Whether the viaTimeout field is set. + */ + boolean hasViaTimeout(); + /** + * required bool viaTimeout = 4; + * @return The viaTimeout. + */ + boolean getViaTimeout(); + } + /** + *
+   * ProducerController
+   * 
+ * + * Protobuf type {@code akka.cluster.typed.delivery.Request} + */ + public static final class Request extends + akka.protobufv3.internal.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:akka.cluster.typed.delivery.Request) + RequestOrBuilder { + private static final long serialVersionUID = 0L; + // Use Request.newBuilder() to construct. + private Request(akka.protobufv3.internal.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Request() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + akka.protobufv3.internal.GeneratedMessageV3.UnusedPrivateParameter unused) { + return new Request(); + } + + @java.lang.Override + public final akka.protobufv3.internal.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Request( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + akka.protobufv3.internal.UnknownFieldSet.Builder unknownFields = + akka.protobufv3.internal.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + bitField0_ |= 0x00000001; + confirmedSeqNr_ = input.readInt64(); + break; + } + case 16: { + bitField0_ |= 0x00000002; + requestUpToSeqNr_ = input.readInt64(); + break; + } + case 24: { + bitField0_ |= 0x00000004; + supportResend_ = input.readBool(); + break; + } + case 32: { + bitField0_ |= 0x00000008; + viaTimeout_ = input.readBool(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (akka.protobufv3.internal.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new akka.protobufv3.internal.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final akka.protobufv3.internal.Descriptors.Descriptor + getDescriptor() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Request_descriptor; + } + + @java.lang.Override + protected akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Request_fieldAccessorTable + .ensureFieldAccessorsInitialized( + akka.cluster.typed.internal.protobuf.ReliableDelivery.Request.class, akka.cluster.typed.internal.protobuf.ReliableDelivery.Request.Builder.class); + } + + private int bitField0_; + public static final int CONFIRMEDSEQNR_FIELD_NUMBER = 1; + private long confirmedSeqNr_; + /** + * required int64 confirmedSeqNr = 1; + * @return Whether the confirmedSeqNr field is set. + */ + public boolean hasConfirmedSeqNr() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required int64 confirmedSeqNr = 1; + * @return The confirmedSeqNr. + */ + public long getConfirmedSeqNr() { + return confirmedSeqNr_; + } + + public static final int REQUESTUPTOSEQNR_FIELD_NUMBER = 2; + private long requestUpToSeqNr_; + /** + * required int64 requestUpToSeqNr = 2; + * @return Whether the requestUpToSeqNr field is set. + */ + public boolean hasRequestUpToSeqNr() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * required int64 requestUpToSeqNr = 2; + * @return The requestUpToSeqNr. + */ + public long getRequestUpToSeqNr() { + return requestUpToSeqNr_; + } + + public static final int SUPPORTRESEND_FIELD_NUMBER = 3; + private boolean supportResend_; + /** + * required bool supportResend = 3; + * @return Whether the supportResend field is set. + */ + public boolean hasSupportResend() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * required bool supportResend = 3; + * @return The supportResend. + */ + public boolean getSupportResend() { + return supportResend_; + } + + public static final int VIATIMEOUT_FIELD_NUMBER = 4; + private boolean viaTimeout_; + /** + * required bool viaTimeout = 4; + * @return Whether the viaTimeout field is set. + */ + public boolean hasViaTimeout() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + * required bool viaTimeout = 4; + * @return The viaTimeout. + */ + public boolean getViaTimeout() { + return viaTimeout_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasConfirmedSeqNr()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasRequestUpToSeqNr()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasSupportResend()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasViaTimeout()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(akka.protobufv3.internal.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeInt64(1, confirmedSeqNr_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeInt64(2, requestUpToSeqNr_); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeBool(3, supportResend_); + } + if (((bitField0_ & 0x00000008) != 0)) { + output.writeBool(4, viaTimeout_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += akka.protobufv3.internal.CodedOutputStream + .computeInt64Size(1, confirmedSeqNr_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += akka.protobufv3.internal.CodedOutputStream + .computeInt64Size(2, requestUpToSeqNr_); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += akka.protobufv3.internal.CodedOutputStream + .computeBoolSize(3, supportResend_); + } + if (((bitField0_ & 0x00000008) != 0)) { + size += akka.protobufv3.internal.CodedOutputStream + .computeBoolSize(4, viaTimeout_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof akka.cluster.typed.internal.protobuf.ReliableDelivery.Request)) { + return super.equals(obj); + } + akka.cluster.typed.internal.protobuf.ReliableDelivery.Request other = (akka.cluster.typed.internal.protobuf.ReliableDelivery.Request) obj; + + if (hasConfirmedSeqNr() != other.hasConfirmedSeqNr()) return false; + if (hasConfirmedSeqNr()) { + if (getConfirmedSeqNr() + != other.getConfirmedSeqNr()) return false; + } + if (hasRequestUpToSeqNr() != other.hasRequestUpToSeqNr()) return false; + if (hasRequestUpToSeqNr()) { + if (getRequestUpToSeqNr() + != other.getRequestUpToSeqNr()) return false; + } + if (hasSupportResend() != other.hasSupportResend()) return false; + if (hasSupportResend()) { + if (getSupportResend() + != other.getSupportResend()) return false; + } + if (hasViaTimeout() != other.hasViaTimeout()) return false; + if (hasViaTimeout()) { + if (getViaTimeout() + != other.getViaTimeout()) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasConfirmedSeqNr()) { + hash = (37 * hash) + CONFIRMEDSEQNR_FIELD_NUMBER; + hash = (53 * hash) + akka.protobufv3.internal.Internal.hashLong( + getConfirmedSeqNr()); + } + if (hasRequestUpToSeqNr()) { + hash = (37 * hash) + REQUESTUPTOSEQNR_FIELD_NUMBER; + hash = (53 * hash) + akka.protobufv3.internal.Internal.hashLong( + getRequestUpToSeqNr()); + } + if (hasSupportResend()) { + hash = (37 * hash) + SUPPORTRESEND_FIELD_NUMBER; + hash = (53 * hash) + akka.protobufv3.internal.Internal.hashBoolean( + getSupportResend()); + } + if (hasViaTimeout()) { + hash = (37 * hash) + VIATIMEOUT_FIELD_NUMBER; + hash = (53 * hash) + akka.protobufv3.internal.Internal.hashBoolean( + getViaTimeout()); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Request parseFrom( + java.nio.ByteBuffer data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Request parseFrom( + java.nio.ByteBuffer data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Request parseFrom( + akka.protobufv3.internal.ByteString data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Request parseFrom( + akka.protobufv3.internal.ByteString data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Request parseFrom(byte[] data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Request parseFrom( + byte[] data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Request parseFrom(java.io.InputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Request parseFrom( + java.io.InputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Request parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Request parseDelimitedFrom( + java.io.InputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Request parseFrom( + akka.protobufv3.internal.CodedInputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Request parseFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(akka.cluster.typed.internal.protobuf.ReliableDelivery.Request prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + akka.protobufv3.internal.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
+     * ProducerController
+     * 
+ * + * Protobuf type {@code akka.cluster.typed.delivery.Request} + */ + public static final class Builder extends + akka.protobufv3.internal.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:akka.cluster.typed.delivery.Request) + akka.cluster.typed.internal.protobuf.ReliableDelivery.RequestOrBuilder { + public static final akka.protobufv3.internal.Descriptors.Descriptor + getDescriptor() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Request_descriptor; + } + + @java.lang.Override + protected akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Request_fieldAccessorTable + .ensureFieldAccessorsInitialized( + akka.cluster.typed.internal.protobuf.ReliableDelivery.Request.class, akka.cluster.typed.internal.protobuf.ReliableDelivery.Request.Builder.class); + } + + // Construct using akka.cluster.typed.internal.protobuf.ReliableDelivery.Request.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + akka.protobufv3.internal.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (akka.protobufv3.internal.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + confirmedSeqNr_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + requestUpToSeqNr_ = 0L; + bitField0_ = (bitField0_ & ~0x00000002); + supportResend_ = false; + bitField0_ = (bitField0_ & ~0x00000004); + viaTimeout_ = false; + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + + @java.lang.Override + public akka.protobufv3.internal.Descriptors.Descriptor + getDescriptorForType() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Request_descriptor; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Request getDefaultInstanceForType() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.Request.getDefaultInstance(); + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Request build() { + akka.cluster.typed.internal.protobuf.ReliableDelivery.Request result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Request buildPartial() { + akka.cluster.typed.internal.protobuf.ReliableDelivery.Request result = new akka.cluster.typed.internal.protobuf.ReliableDelivery.Request(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.confirmedSeqNr_ = confirmedSeqNr_; + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.requestUpToSeqNr_ = requestUpToSeqNr_; + to_bitField0_ |= 0x00000002; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.supportResend_ = supportResend_; + to_bitField0_ |= 0x00000004; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + result.viaTimeout_ = viaTimeout_; + to_bitField0_ |= 0x00000008; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + akka.protobufv3.internal.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(akka.protobufv3.internal.Message other) { + if (other instanceof akka.cluster.typed.internal.protobuf.ReliableDelivery.Request) { + return mergeFrom((akka.cluster.typed.internal.protobuf.ReliableDelivery.Request)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(akka.cluster.typed.internal.protobuf.ReliableDelivery.Request other) { + if (other == akka.cluster.typed.internal.protobuf.ReliableDelivery.Request.getDefaultInstance()) return this; + if (other.hasConfirmedSeqNr()) { + setConfirmedSeqNr(other.getConfirmedSeqNr()); + } + if (other.hasRequestUpToSeqNr()) { + setRequestUpToSeqNr(other.getRequestUpToSeqNr()); + } + if (other.hasSupportResend()) { + setSupportResend(other.getSupportResend()); + } + if (other.hasViaTimeout()) { + setViaTimeout(other.getViaTimeout()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasConfirmedSeqNr()) { + return false; + } + if (!hasRequestUpToSeqNr()) { + return false; + } + if (!hasSupportResend()) { + return false; + } + if (!hasViaTimeout()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + akka.cluster.typed.internal.protobuf.ReliableDelivery.Request parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (akka.protobufv3.internal.InvalidProtocolBufferException e) { + parsedMessage = (akka.cluster.typed.internal.protobuf.ReliableDelivery.Request) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private long confirmedSeqNr_ ; + /** + * required int64 confirmedSeqNr = 1; + * @return Whether the confirmedSeqNr field is set. + */ + public boolean hasConfirmedSeqNr() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required int64 confirmedSeqNr = 1; + * @return The confirmedSeqNr. + */ + public long getConfirmedSeqNr() { + return confirmedSeqNr_; + } + /** + * required int64 confirmedSeqNr = 1; + * @param value The confirmedSeqNr to set. + * @return This builder for chaining. + */ + public Builder setConfirmedSeqNr(long value) { + bitField0_ |= 0x00000001; + confirmedSeqNr_ = value; + onChanged(); + return this; + } + /** + * required int64 confirmedSeqNr = 1; + * @return This builder for chaining. + */ + public Builder clearConfirmedSeqNr() { + bitField0_ = (bitField0_ & ~0x00000001); + confirmedSeqNr_ = 0L; + onChanged(); + return this; + } + + private long requestUpToSeqNr_ ; + /** + * required int64 requestUpToSeqNr = 2; + * @return Whether the requestUpToSeqNr field is set. + */ + public boolean hasRequestUpToSeqNr() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * required int64 requestUpToSeqNr = 2; + * @return The requestUpToSeqNr. + */ + public long getRequestUpToSeqNr() { + return requestUpToSeqNr_; + } + /** + * required int64 requestUpToSeqNr = 2; + * @param value The requestUpToSeqNr to set. + * @return This builder for chaining. + */ + public Builder setRequestUpToSeqNr(long value) { + bitField0_ |= 0x00000002; + requestUpToSeqNr_ = value; + onChanged(); + return this; + } + /** + * required int64 requestUpToSeqNr = 2; + * @return This builder for chaining. + */ + public Builder clearRequestUpToSeqNr() { + bitField0_ = (bitField0_ & ~0x00000002); + requestUpToSeqNr_ = 0L; + onChanged(); + return this; + } + + private boolean supportResend_ ; + /** + * required bool supportResend = 3; + * @return Whether the supportResend field is set. + */ + public boolean hasSupportResend() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * required bool supportResend = 3; + * @return The supportResend. + */ + public boolean getSupportResend() { + return supportResend_; + } + /** + * required bool supportResend = 3; + * @param value The supportResend to set. + * @return This builder for chaining. + */ + public Builder setSupportResend(boolean value) { + bitField0_ |= 0x00000004; + supportResend_ = value; + onChanged(); + return this; + } + /** + * required bool supportResend = 3; + * @return This builder for chaining. + */ + public Builder clearSupportResend() { + bitField0_ = (bitField0_ & ~0x00000004); + supportResend_ = false; + onChanged(); + return this; + } + + private boolean viaTimeout_ ; + /** + * required bool viaTimeout = 4; + * @return Whether the viaTimeout field is set. + */ + public boolean hasViaTimeout() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + * required bool viaTimeout = 4; + * @return The viaTimeout. + */ + public boolean getViaTimeout() { + return viaTimeout_; + } + /** + * required bool viaTimeout = 4; + * @param value The viaTimeout to set. + * @return This builder for chaining. + */ + public Builder setViaTimeout(boolean value) { + bitField0_ |= 0x00000008; + viaTimeout_ = value; + onChanged(); + return this; + } + /** + * required bool viaTimeout = 4; + * @return This builder for chaining. + */ + public Builder clearViaTimeout() { + bitField0_ = (bitField0_ & ~0x00000008); + viaTimeout_ = false; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final akka.protobufv3.internal.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final akka.protobufv3.internal.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:akka.cluster.typed.delivery.Request) + } + + // @@protoc_insertion_point(class_scope:akka.cluster.typed.delivery.Request) + private static final akka.cluster.typed.internal.protobuf.ReliableDelivery.Request DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new akka.cluster.typed.internal.protobuf.ReliableDelivery.Request(); + } + + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Request getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final akka.protobufv3.internal.Parser + PARSER = new akka.protobufv3.internal.AbstractParser() { + @java.lang.Override + public Request parsePartialFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return new Request(input, extensionRegistry); + } + }; + + public static akka.protobufv3.internal.Parser parser() { + return PARSER; + } + + @java.lang.Override + public akka.protobufv3.internal.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Request getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface ResendOrBuilder extends + // @@protoc_insertion_point(interface_extends:akka.cluster.typed.delivery.Resend) + akka.protobufv3.internal.MessageOrBuilder { + + /** + * required int64 fromSeqNr = 1; + * @return Whether the fromSeqNr field is set. + */ + boolean hasFromSeqNr(); + /** + * required int64 fromSeqNr = 1; + * @return The fromSeqNr. + */ + long getFromSeqNr(); + } + /** + *
+   * ProducerController
+   * 
+ * + * Protobuf type {@code akka.cluster.typed.delivery.Resend} + */ + public static final class Resend extends + akka.protobufv3.internal.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:akka.cluster.typed.delivery.Resend) + ResendOrBuilder { + private static final long serialVersionUID = 0L; + // Use Resend.newBuilder() to construct. + private Resend(akka.protobufv3.internal.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Resend() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + akka.protobufv3.internal.GeneratedMessageV3.UnusedPrivateParameter unused) { + return new Resend(); + } + + @java.lang.Override + public final akka.protobufv3.internal.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Resend( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + akka.protobufv3.internal.UnknownFieldSet.Builder unknownFields = + akka.protobufv3.internal.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + bitField0_ |= 0x00000001; + fromSeqNr_ = input.readInt64(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (akka.protobufv3.internal.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new akka.protobufv3.internal.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final akka.protobufv3.internal.Descriptors.Descriptor + getDescriptor() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Resend_descriptor; + } + + @java.lang.Override + protected akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Resend_fieldAccessorTable + .ensureFieldAccessorsInitialized( + akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend.class, akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend.Builder.class); + } + + private int bitField0_; + public static final int FROMSEQNR_FIELD_NUMBER = 1; + private long fromSeqNr_; + /** + * required int64 fromSeqNr = 1; + * @return Whether the fromSeqNr field is set. + */ + public boolean hasFromSeqNr() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required int64 fromSeqNr = 1; + * @return The fromSeqNr. + */ + public long getFromSeqNr() { + return fromSeqNr_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasFromSeqNr()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(akka.protobufv3.internal.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeInt64(1, fromSeqNr_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += akka.protobufv3.internal.CodedOutputStream + .computeInt64Size(1, fromSeqNr_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend)) { + return super.equals(obj); + } + akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend other = (akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend) obj; + + if (hasFromSeqNr() != other.hasFromSeqNr()) return false; + if (hasFromSeqNr()) { + if (getFromSeqNr() + != other.getFromSeqNr()) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasFromSeqNr()) { + hash = (37 * hash) + FROMSEQNR_FIELD_NUMBER; + hash = (53 * hash) + akka.protobufv3.internal.Internal.hashLong( + getFromSeqNr()); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend parseFrom( + java.nio.ByteBuffer data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend parseFrom( + java.nio.ByteBuffer data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend parseFrom( + akka.protobufv3.internal.ByteString data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend parseFrom( + akka.protobufv3.internal.ByteString data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend parseFrom(byte[] data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend parseFrom( + byte[] data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend parseFrom(java.io.InputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend parseFrom( + java.io.InputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend parseDelimitedFrom( + java.io.InputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend parseFrom( + akka.protobufv3.internal.CodedInputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend parseFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + akka.protobufv3.internal.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
+     * ProducerController
+     * 
+ * + * Protobuf type {@code akka.cluster.typed.delivery.Resend} + */ + public static final class Builder extends + akka.protobufv3.internal.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:akka.cluster.typed.delivery.Resend) + akka.cluster.typed.internal.protobuf.ReliableDelivery.ResendOrBuilder { + public static final akka.protobufv3.internal.Descriptors.Descriptor + getDescriptor() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Resend_descriptor; + } + + @java.lang.Override + protected akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Resend_fieldAccessorTable + .ensureFieldAccessorsInitialized( + akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend.class, akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend.Builder.class); + } + + // Construct using akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + akka.protobufv3.internal.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (akka.protobufv3.internal.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + fromSeqNr_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + @java.lang.Override + public akka.protobufv3.internal.Descriptors.Descriptor + getDescriptorForType() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Resend_descriptor; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend getDefaultInstanceForType() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend.getDefaultInstance(); + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend build() { + akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend buildPartial() { + akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend result = new akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.fromSeqNr_ = fromSeqNr_; + to_bitField0_ |= 0x00000001; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + akka.protobufv3.internal.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(akka.protobufv3.internal.Message other) { + if (other instanceof akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend) { + return mergeFrom((akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend other) { + if (other == akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend.getDefaultInstance()) return this; + if (other.hasFromSeqNr()) { + setFromSeqNr(other.getFromSeqNr()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasFromSeqNr()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (akka.protobufv3.internal.InvalidProtocolBufferException e) { + parsedMessage = (akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private long fromSeqNr_ ; + /** + * required int64 fromSeqNr = 1; + * @return Whether the fromSeqNr field is set. + */ + public boolean hasFromSeqNr() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required int64 fromSeqNr = 1; + * @return The fromSeqNr. + */ + public long getFromSeqNr() { + return fromSeqNr_; + } + /** + * required int64 fromSeqNr = 1; + * @param value The fromSeqNr to set. + * @return This builder for chaining. + */ + public Builder setFromSeqNr(long value) { + bitField0_ |= 0x00000001; + fromSeqNr_ = value; + onChanged(); + return this; + } + /** + * required int64 fromSeqNr = 1; + * @return This builder for chaining. + */ + public Builder clearFromSeqNr() { + bitField0_ = (bitField0_ & ~0x00000001); + fromSeqNr_ = 0L; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final akka.protobufv3.internal.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final akka.protobufv3.internal.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:akka.cluster.typed.delivery.Resend) + } + + // @@protoc_insertion_point(class_scope:akka.cluster.typed.delivery.Resend) + private static final akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend(); + } + + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final akka.protobufv3.internal.Parser + PARSER = new akka.protobufv3.internal.AbstractParser() { + @java.lang.Override + public Resend parsePartialFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return new Resend(input, extensionRegistry); + } + }; + + public static akka.protobufv3.internal.Parser parser() { + return PARSER; + } + + @java.lang.Override + public akka.protobufv3.internal.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Resend getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface AckOrBuilder extends + // @@protoc_insertion_point(interface_extends:akka.cluster.typed.delivery.Ack) + akka.protobufv3.internal.MessageOrBuilder { + + /** + * required int64 confirmedSeqNr = 1; + * @return Whether the confirmedSeqNr field is set. + */ + boolean hasConfirmedSeqNr(); + /** + * required int64 confirmedSeqNr = 1; + * @return The confirmedSeqNr. + */ + long getConfirmedSeqNr(); + } + /** + *
+   * ProducerController
+   * 
+ * + * Protobuf type {@code akka.cluster.typed.delivery.Ack} + */ + public static final class Ack extends + akka.protobufv3.internal.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:akka.cluster.typed.delivery.Ack) + AckOrBuilder { + private static final long serialVersionUID = 0L; + // Use Ack.newBuilder() to construct. + private Ack(akka.protobufv3.internal.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Ack() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + akka.protobufv3.internal.GeneratedMessageV3.UnusedPrivateParameter unused) { + return new Ack(); + } + + @java.lang.Override + public final akka.protobufv3.internal.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Ack( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + akka.protobufv3.internal.UnknownFieldSet.Builder unknownFields = + akka.protobufv3.internal.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + bitField0_ |= 0x00000001; + confirmedSeqNr_ = input.readInt64(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (akka.protobufv3.internal.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new akka.protobufv3.internal.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final akka.protobufv3.internal.Descriptors.Descriptor + getDescriptor() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Ack_descriptor; + } + + @java.lang.Override + protected akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Ack_fieldAccessorTable + .ensureFieldAccessorsInitialized( + akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack.class, akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack.Builder.class); + } + + private int bitField0_; + public static final int CONFIRMEDSEQNR_FIELD_NUMBER = 1; + private long confirmedSeqNr_; + /** + * required int64 confirmedSeqNr = 1; + * @return Whether the confirmedSeqNr field is set. + */ + public boolean hasConfirmedSeqNr() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required int64 confirmedSeqNr = 1; + * @return The confirmedSeqNr. + */ + public long getConfirmedSeqNr() { + return confirmedSeqNr_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasConfirmedSeqNr()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(akka.protobufv3.internal.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeInt64(1, confirmedSeqNr_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += akka.protobufv3.internal.CodedOutputStream + .computeInt64Size(1, confirmedSeqNr_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack)) { + return super.equals(obj); + } + akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack other = (akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack) obj; + + if (hasConfirmedSeqNr() != other.hasConfirmedSeqNr()) return false; + if (hasConfirmedSeqNr()) { + if (getConfirmedSeqNr() + != other.getConfirmedSeqNr()) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasConfirmedSeqNr()) { + hash = (37 * hash) + CONFIRMEDSEQNR_FIELD_NUMBER; + hash = (53 * hash) + akka.protobufv3.internal.Internal.hashLong( + getConfirmedSeqNr()); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack parseFrom( + java.nio.ByteBuffer data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack parseFrom( + java.nio.ByteBuffer data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack parseFrom( + akka.protobufv3.internal.ByteString data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack parseFrom( + akka.protobufv3.internal.ByteString data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack parseFrom(byte[] data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack parseFrom( + byte[] data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack parseFrom(java.io.InputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack parseFrom( + java.io.InputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack parseDelimitedFrom( + java.io.InputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack parseFrom( + akka.protobufv3.internal.CodedInputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack parseFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + akka.protobufv3.internal.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
+     * ProducerController
+     * 
+ * + * Protobuf type {@code akka.cluster.typed.delivery.Ack} + */ + public static final class Builder extends + akka.protobufv3.internal.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:akka.cluster.typed.delivery.Ack) + akka.cluster.typed.internal.protobuf.ReliableDelivery.AckOrBuilder { + public static final akka.protobufv3.internal.Descriptors.Descriptor + getDescriptor() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Ack_descriptor; + } + + @java.lang.Override + protected akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Ack_fieldAccessorTable + .ensureFieldAccessorsInitialized( + akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack.class, akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack.Builder.class); + } + + // Construct using akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + akka.protobufv3.internal.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (akka.protobufv3.internal.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + confirmedSeqNr_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + @java.lang.Override + public akka.protobufv3.internal.Descriptors.Descriptor + getDescriptorForType() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Ack_descriptor; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack getDefaultInstanceForType() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack.getDefaultInstance(); + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack build() { + akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack buildPartial() { + akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack result = new akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.confirmedSeqNr_ = confirmedSeqNr_; + to_bitField0_ |= 0x00000001; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + akka.protobufv3.internal.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(akka.protobufv3.internal.Message other) { + if (other instanceof akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack) { + return mergeFrom((akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack other) { + if (other == akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack.getDefaultInstance()) return this; + if (other.hasConfirmedSeqNr()) { + setConfirmedSeqNr(other.getConfirmedSeqNr()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasConfirmedSeqNr()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (akka.protobufv3.internal.InvalidProtocolBufferException e) { + parsedMessage = (akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private long confirmedSeqNr_ ; + /** + * required int64 confirmedSeqNr = 1; + * @return Whether the confirmedSeqNr field is set. + */ + public boolean hasConfirmedSeqNr() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required int64 confirmedSeqNr = 1; + * @return The confirmedSeqNr. + */ + public long getConfirmedSeqNr() { + return confirmedSeqNr_; + } + /** + * required int64 confirmedSeqNr = 1; + * @param value The confirmedSeqNr to set. + * @return This builder for chaining. + */ + public Builder setConfirmedSeqNr(long value) { + bitField0_ |= 0x00000001; + confirmedSeqNr_ = value; + onChanged(); + return this; + } + /** + * required int64 confirmedSeqNr = 1; + * @return This builder for chaining. + */ + public Builder clearConfirmedSeqNr() { + bitField0_ = (bitField0_ & ~0x00000001); + confirmedSeqNr_ = 0L; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final akka.protobufv3.internal.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final akka.protobufv3.internal.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:akka.cluster.typed.delivery.Ack) + } + + // @@protoc_insertion_point(class_scope:akka.cluster.typed.delivery.Ack) + private static final akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack(); + } + + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final akka.protobufv3.internal.Parser + PARSER = new akka.protobufv3.internal.AbstractParser() { + @java.lang.Override + public Ack parsePartialFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return new Ack(input, extensionRegistry); + } + }; + + public static akka.protobufv3.internal.Parser parser() { + return PARSER; + } + + @java.lang.Override + public akka.protobufv3.internal.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Ack getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface StateOrBuilder extends + // @@protoc_insertion_point(interface_extends:akka.cluster.typed.delivery.State) + akka.protobufv3.internal.MessageOrBuilder { + + /** + * required int64 currentSeqNr = 1; + * @return Whether the currentSeqNr field is set. + */ + boolean hasCurrentSeqNr(); + /** + * required int64 currentSeqNr = 1; + * @return The currentSeqNr. + */ + long getCurrentSeqNr(); + + /** + * required int64 highestConfirmedSeqNr = 2; + * @return Whether the highestConfirmedSeqNr field is set. + */ + boolean hasHighestConfirmedSeqNr(); + /** + * required int64 highestConfirmedSeqNr = 2; + * @return The highestConfirmedSeqNr. + */ + long getHighestConfirmedSeqNr(); + + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + java.util.List + getConfirmedList(); + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed getConfirmed(int index); + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + int getConfirmedCount(); + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + java.util.List + getConfirmedOrBuilderList(); + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + akka.cluster.typed.internal.protobuf.ReliableDelivery.ConfirmedOrBuilder getConfirmedOrBuilder( + int index); + + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + java.util.List + getUnconfirmedList(); + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent getUnconfirmed(int index); + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + int getUnconfirmedCount(); + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + java.util.List + getUnconfirmedOrBuilderList(); + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSentOrBuilder getUnconfirmedOrBuilder( + int index); + } + /** + *
+   * DurableProducerQueue
+   * 
+ * + * Protobuf type {@code akka.cluster.typed.delivery.State} + */ + public static final class State extends + akka.protobufv3.internal.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:akka.cluster.typed.delivery.State) + StateOrBuilder { + private static final long serialVersionUID = 0L; + // Use State.newBuilder() to construct. + private State(akka.protobufv3.internal.GeneratedMessageV3.Builder builder) { + super(builder); + } + private State() { + confirmed_ = java.util.Collections.emptyList(); + unconfirmed_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + akka.protobufv3.internal.GeneratedMessageV3.UnusedPrivateParameter unused) { + return new State(); + } + + @java.lang.Override + public final akka.protobufv3.internal.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private State( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + akka.protobufv3.internal.UnknownFieldSet.Builder unknownFields = + akka.protobufv3.internal.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + bitField0_ |= 0x00000001; + currentSeqNr_ = input.readInt64(); + break; + } + case 16: { + bitField0_ |= 0x00000002; + highestConfirmedSeqNr_ = input.readInt64(); + break; + } + case 26: { + if (!((mutable_bitField0_ & 0x00000004) != 0)) { + confirmed_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000004; + } + confirmed_.add( + input.readMessage(akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed.PARSER, extensionRegistry)); + break; + } + case 34: { + if (!((mutable_bitField0_ & 0x00000008) != 0)) { + unconfirmed_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000008; + } + unconfirmed_.add( + input.readMessage(akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent.PARSER, extensionRegistry)); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (akka.protobufv3.internal.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new akka.protobufv3.internal.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000004) != 0)) { + confirmed_ = java.util.Collections.unmodifiableList(confirmed_); + } + if (((mutable_bitField0_ & 0x00000008) != 0)) { + unconfirmed_ = java.util.Collections.unmodifiableList(unconfirmed_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final akka.protobufv3.internal.Descriptors.Descriptor + getDescriptor() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_State_descriptor; + } + + @java.lang.Override + protected akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_State_fieldAccessorTable + .ensureFieldAccessorsInitialized( + akka.cluster.typed.internal.protobuf.ReliableDelivery.State.class, akka.cluster.typed.internal.protobuf.ReliableDelivery.State.Builder.class); + } + + private int bitField0_; + public static final int CURRENTSEQNR_FIELD_NUMBER = 1; + private long currentSeqNr_; + /** + * required int64 currentSeqNr = 1; + * @return Whether the currentSeqNr field is set. + */ + public boolean hasCurrentSeqNr() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required int64 currentSeqNr = 1; + * @return The currentSeqNr. + */ + public long getCurrentSeqNr() { + return currentSeqNr_; + } + + public static final int HIGHESTCONFIRMEDSEQNR_FIELD_NUMBER = 2; + private long highestConfirmedSeqNr_; + /** + * required int64 highestConfirmedSeqNr = 2; + * @return Whether the highestConfirmedSeqNr field is set. + */ + public boolean hasHighestConfirmedSeqNr() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * required int64 highestConfirmedSeqNr = 2; + * @return The highestConfirmedSeqNr. + */ + public long getHighestConfirmedSeqNr() { + return highestConfirmedSeqNr_; + } + + public static final int CONFIRMED_FIELD_NUMBER = 3; + private java.util.List confirmed_; + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + public java.util.List getConfirmedList() { + return confirmed_; + } + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + public java.util.List + getConfirmedOrBuilderList() { + return confirmed_; + } + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + public int getConfirmedCount() { + return confirmed_.size(); + } + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed getConfirmed(int index) { + return confirmed_.get(index); + } + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + public akka.cluster.typed.internal.protobuf.ReliableDelivery.ConfirmedOrBuilder getConfirmedOrBuilder( + int index) { + return confirmed_.get(index); + } + + public static final int UNCONFIRMED_FIELD_NUMBER = 4; + private java.util.List unconfirmed_; + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + public java.util.List getUnconfirmedList() { + return unconfirmed_; + } + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + public java.util.List + getUnconfirmedOrBuilderList() { + return unconfirmed_; + } + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + public int getUnconfirmedCount() { + return unconfirmed_.size(); + } + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + public akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent getUnconfirmed(int index) { + return unconfirmed_.get(index); + } + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + public akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSentOrBuilder getUnconfirmedOrBuilder( + int index) { + return unconfirmed_.get(index); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasCurrentSeqNr()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasHighestConfirmedSeqNr()) { + memoizedIsInitialized = 0; + return false; + } + for (int i = 0; i < getConfirmedCount(); i++) { + if (!getConfirmed(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + for (int i = 0; i < getUnconfirmedCount(); i++) { + if (!getUnconfirmed(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(akka.protobufv3.internal.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeInt64(1, currentSeqNr_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeInt64(2, highestConfirmedSeqNr_); + } + for (int i = 0; i < confirmed_.size(); i++) { + output.writeMessage(3, confirmed_.get(i)); + } + for (int i = 0; i < unconfirmed_.size(); i++) { + output.writeMessage(4, unconfirmed_.get(i)); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += akka.protobufv3.internal.CodedOutputStream + .computeInt64Size(1, currentSeqNr_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += akka.protobufv3.internal.CodedOutputStream + .computeInt64Size(2, highestConfirmedSeqNr_); + } + for (int i = 0; i < confirmed_.size(); i++) { + size += akka.protobufv3.internal.CodedOutputStream + .computeMessageSize(3, confirmed_.get(i)); + } + for (int i = 0; i < unconfirmed_.size(); i++) { + size += akka.protobufv3.internal.CodedOutputStream + .computeMessageSize(4, unconfirmed_.get(i)); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof akka.cluster.typed.internal.protobuf.ReliableDelivery.State)) { + return super.equals(obj); + } + akka.cluster.typed.internal.protobuf.ReliableDelivery.State other = (akka.cluster.typed.internal.protobuf.ReliableDelivery.State) obj; + + if (hasCurrentSeqNr() != other.hasCurrentSeqNr()) return false; + if (hasCurrentSeqNr()) { + if (getCurrentSeqNr() + != other.getCurrentSeqNr()) return false; + } + if (hasHighestConfirmedSeqNr() != other.hasHighestConfirmedSeqNr()) return false; + if (hasHighestConfirmedSeqNr()) { + if (getHighestConfirmedSeqNr() + != other.getHighestConfirmedSeqNr()) return false; + } + if (!getConfirmedList() + .equals(other.getConfirmedList())) return false; + if (!getUnconfirmedList() + .equals(other.getUnconfirmedList())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasCurrentSeqNr()) { + hash = (37 * hash) + CURRENTSEQNR_FIELD_NUMBER; + hash = (53 * hash) + akka.protobufv3.internal.Internal.hashLong( + getCurrentSeqNr()); + } + if (hasHighestConfirmedSeqNr()) { + hash = (37 * hash) + HIGHESTCONFIRMEDSEQNR_FIELD_NUMBER; + hash = (53 * hash) + akka.protobufv3.internal.Internal.hashLong( + getHighestConfirmedSeqNr()); + } + if (getConfirmedCount() > 0) { + hash = (37 * hash) + CONFIRMED_FIELD_NUMBER; + hash = (53 * hash) + getConfirmedList().hashCode(); + } + if (getUnconfirmedCount() > 0) { + hash = (37 * hash) + UNCONFIRMED_FIELD_NUMBER; + hash = (53 * hash) + getUnconfirmedList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.State parseFrom( + java.nio.ByteBuffer data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.State parseFrom( + java.nio.ByteBuffer data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.State parseFrom( + akka.protobufv3.internal.ByteString data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.State parseFrom( + akka.protobufv3.internal.ByteString data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.State parseFrom(byte[] data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.State parseFrom( + byte[] data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.State parseFrom(java.io.InputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.State parseFrom( + java.io.InputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.State parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.State parseDelimitedFrom( + java.io.InputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.State parseFrom( + akka.protobufv3.internal.CodedInputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.State parseFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(akka.cluster.typed.internal.protobuf.ReliableDelivery.State prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + akka.protobufv3.internal.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
+     * DurableProducerQueue
+     * 
+ * + * Protobuf type {@code akka.cluster.typed.delivery.State} + */ + public static final class Builder extends + akka.protobufv3.internal.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:akka.cluster.typed.delivery.State) + akka.cluster.typed.internal.protobuf.ReliableDelivery.StateOrBuilder { + public static final akka.protobufv3.internal.Descriptors.Descriptor + getDescriptor() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_State_descriptor; + } + + @java.lang.Override + protected akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_State_fieldAccessorTable + .ensureFieldAccessorsInitialized( + akka.cluster.typed.internal.protobuf.ReliableDelivery.State.class, akka.cluster.typed.internal.protobuf.ReliableDelivery.State.Builder.class); + } + + // Construct using akka.cluster.typed.internal.protobuf.ReliableDelivery.State.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + akka.protobufv3.internal.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (akka.protobufv3.internal.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getConfirmedFieldBuilder(); + getUnconfirmedFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + currentSeqNr_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + highestConfirmedSeqNr_ = 0L; + bitField0_ = (bitField0_ & ~0x00000002); + if (confirmedBuilder_ == null) { + confirmed_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + } else { + confirmedBuilder_.clear(); + } + if (unconfirmedBuilder_ == null) { + unconfirmed_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + } else { + unconfirmedBuilder_.clear(); + } + return this; + } + + @java.lang.Override + public akka.protobufv3.internal.Descriptors.Descriptor + getDescriptorForType() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_State_descriptor; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.State getDefaultInstanceForType() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.State.getDefaultInstance(); + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.State build() { + akka.cluster.typed.internal.protobuf.ReliableDelivery.State result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.State buildPartial() { + akka.cluster.typed.internal.protobuf.ReliableDelivery.State result = new akka.cluster.typed.internal.protobuf.ReliableDelivery.State(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.currentSeqNr_ = currentSeqNr_; + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.highestConfirmedSeqNr_ = highestConfirmedSeqNr_; + to_bitField0_ |= 0x00000002; + } + if (confirmedBuilder_ == null) { + if (((bitField0_ & 0x00000004) != 0)) { + confirmed_ = java.util.Collections.unmodifiableList(confirmed_); + bitField0_ = (bitField0_ & ~0x00000004); + } + result.confirmed_ = confirmed_; + } else { + result.confirmed_ = confirmedBuilder_.build(); + } + if (unconfirmedBuilder_ == null) { + if (((bitField0_ & 0x00000008) != 0)) { + unconfirmed_ = java.util.Collections.unmodifiableList(unconfirmed_); + bitField0_ = (bitField0_ & ~0x00000008); + } + result.unconfirmed_ = unconfirmed_; + } else { + result.unconfirmed_ = unconfirmedBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + akka.protobufv3.internal.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(akka.protobufv3.internal.Message other) { + if (other instanceof akka.cluster.typed.internal.protobuf.ReliableDelivery.State) { + return mergeFrom((akka.cluster.typed.internal.protobuf.ReliableDelivery.State)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(akka.cluster.typed.internal.protobuf.ReliableDelivery.State other) { + if (other == akka.cluster.typed.internal.protobuf.ReliableDelivery.State.getDefaultInstance()) return this; + if (other.hasCurrentSeqNr()) { + setCurrentSeqNr(other.getCurrentSeqNr()); + } + if (other.hasHighestConfirmedSeqNr()) { + setHighestConfirmedSeqNr(other.getHighestConfirmedSeqNr()); + } + if (confirmedBuilder_ == null) { + if (!other.confirmed_.isEmpty()) { + if (confirmed_.isEmpty()) { + confirmed_ = other.confirmed_; + bitField0_ = (bitField0_ & ~0x00000004); + } else { + ensureConfirmedIsMutable(); + confirmed_.addAll(other.confirmed_); + } + onChanged(); + } + } else { + if (!other.confirmed_.isEmpty()) { + if (confirmedBuilder_.isEmpty()) { + confirmedBuilder_.dispose(); + confirmedBuilder_ = null; + confirmed_ = other.confirmed_; + bitField0_ = (bitField0_ & ~0x00000004); + confirmedBuilder_ = + akka.protobufv3.internal.GeneratedMessageV3.alwaysUseFieldBuilders ? + getConfirmedFieldBuilder() : null; + } else { + confirmedBuilder_.addAllMessages(other.confirmed_); + } + } + } + if (unconfirmedBuilder_ == null) { + if (!other.unconfirmed_.isEmpty()) { + if (unconfirmed_.isEmpty()) { + unconfirmed_ = other.unconfirmed_; + bitField0_ = (bitField0_ & ~0x00000008); + } else { + ensureUnconfirmedIsMutable(); + unconfirmed_.addAll(other.unconfirmed_); + } + onChanged(); + } + } else { + if (!other.unconfirmed_.isEmpty()) { + if (unconfirmedBuilder_.isEmpty()) { + unconfirmedBuilder_.dispose(); + unconfirmedBuilder_ = null; + unconfirmed_ = other.unconfirmed_; + bitField0_ = (bitField0_ & ~0x00000008); + unconfirmedBuilder_ = + akka.protobufv3.internal.GeneratedMessageV3.alwaysUseFieldBuilders ? + getUnconfirmedFieldBuilder() : null; + } else { + unconfirmedBuilder_.addAllMessages(other.unconfirmed_); + } + } + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasCurrentSeqNr()) { + return false; + } + if (!hasHighestConfirmedSeqNr()) { + return false; + } + for (int i = 0; i < getConfirmedCount(); i++) { + if (!getConfirmed(i).isInitialized()) { + return false; + } + } + for (int i = 0; i < getUnconfirmedCount(); i++) { + if (!getUnconfirmed(i).isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + akka.cluster.typed.internal.protobuf.ReliableDelivery.State parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (akka.protobufv3.internal.InvalidProtocolBufferException e) { + parsedMessage = (akka.cluster.typed.internal.protobuf.ReliableDelivery.State) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private long currentSeqNr_ ; + /** + * required int64 currentSeqNr = 1; + * @return Whether the currentSeqNr field is set. + */ + public boolean hasCurrentSeqNr() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required int64 currentSeqNr = 1; + * @return The currentSeqNr. + */ + public long getCurrentSeqNr() { + return currentSeqNr_; + } + /** + * required int64 currentSeqNr = 1; + * @param value The currentSeqNr to set. + * @return This builder for chaining. + */ + public Builder setCurrentSeqNr(long value) { + bitField0_ |= 0x00000001; + currentSeqNr_ = value; + onChanged(); + return this; + } + /** + * required int64 currentSeqNr = 1; + * @return This builder for chaining. + */ + public Builder clearCurrentSeqNr() { + bitField0_ = (bitField0_ & ~0x00000001); + currentSeqNr_ = 0L; + onChanged(); + return this; + } + + private long highestConfirmedSeqNr_ ; + /** + * required int64 highestConfirmedSeqNr = 2; + * @return Whether the highestConfirmedSeqNr field is set. + */ + public boolean hasHighestConfirmedSeqNr() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * required int64 highestConfirmedSeqNr = 2; + * @return The highestConfirmedSeqNr. + */ + public long getHighestConfirmedSeqNr() { + return highestConfirmedSeqNr_; + } + /** + * required int64 highestConfirmedSeqNr = 2; + * @param value The highestConfirmedSeqNr to set. + * @return This builder for chaining. + */ + public Builder setHighestConfirmedSeqNr(long value) { + bitField0_ |= 0x00000002; + highestConfirmedSeqNr_ = value; + onChanged(); + return this; + } + /** + * required int64 highestConfirmedSeqNr = 2; + * @return This builder for chaining. + */ + public Builder clearHighestConfirmedSeqNr() { + bitField0_ = (bitField0_ & ~0x00000002); + highestConfirmedSeqNr_ = 0L; + onChanged(); + return this; + } + + private java.util.List confirmed_ = + java.util.Collections.emptyList(); + private void ensureConfirmedIsMutable() { + if (!((bitField0_ & 0x00000004) != 0)) { + confirmed_ = new java.util.ArrayList(confirmed_); + bitField0_ |= 0x00000004; + } + } + + private akka.protobufv3.internal.RepeatedFieldBuilderV3< + akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed, akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed.Builder, akka.cluster.typed.internal.protobuf.ReliableDelivery.ConfirmedOrBuilder> confirmedBuilder_; + + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + public java.util.List getConfirmedList() { + if (confirmedBuilder_ == null) { + return java.util.Collections.unmodifiableList(confirmed_); + } else { + return confirmedBuilder_.getMessageList(); + } + } + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + public int getConfirmedCount() { + if (confirmedBuilder_ == null) { + return confirmed_.size(); + } else { + return confirmedBuilder_.getCount(); + } + } + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed getConfirmed(int index) { + if (confirmedBuilder_ == null) { + return confirmed_.get(index); + } else { + return confirmedBuilder_.getMessage(index); + } + } + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + public Builder setConfirmed( + int index, akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed value) { + if (confirmedBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureConfirmedIsMutable(); + confirmed_.set(index, value); + onChanged(); + } else { + confirmedBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + public Builder setConfirmed( + int index, akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed.Builder builderForValue) { + if (confirmedBuilder_ == null) { + ensureConfirmedIsMutable(); + confirmed_.set(index, builderForValue.build()); + onChanged(); + } else { + confirmedBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + public Builder addConfirmed(akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed value) { + if (confirmedBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureConfirmedIsMutable(); + confirmed_.add(value); + onChanged(); + } else { + confirmedBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + public Builder addConfirmed( + int index, akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed value) { + if (confirmedBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureConfirmedIsMutable(); + confirmed_.add(index, value); + onChanged(); + } else { + confirmedBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + public Builder addConfirmed( + akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed.Builder builderForValue) { + if (confirmedBuilder_ == null) { + ensureConfirmedIsMutable(); + confirmed_.add(builderForValue.build()); + onChanged(); + } else { + confirmedBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + public Builder addConfirmed( + int index, akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed.Builder builderForValue) { + if (confirmedBuilder_ == null) { + ensureConfirmedIsMutable(); + confirmed_.add(index, builderForValue.build()); + onChanged(); + } else { + confirmedBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + public Builder addAllConfirmed( + java.lang.Iterable values) { + if (confirmedBuilder_ == null) { + ensureConfirmedIsMutable(); + akka.protobufv3.internal.AbstractMessageLite.Builder.addAll( + values, confirmed_); + onChanged(); + } else { + confirmedBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + public Builder clearConfirmed() { + if (confirmedBuilder_ == null) { + confirmed_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + } else { + confirmedBuilder_.clear(); + } + return this; + } + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + public Builder removeConfirmed(int index) { + if (confirmedBuilder_ == null) { + ensureConfirmedIsMutable(); + confirmed_.remove(index); + onChanged(); + } else { + confirmedBuilder_.remove(index); + } + return this; + } + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed.Builder getConfirmedBuilder( + int index) { + return getConfirmedFieldBuilder().getBuilder(index); + } + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + public akka.cluster.typed.internal.protobuf.ReliableDelivery.ConfirmedOrBuilder getConfirmedOrBuilder( + int index) { + if (confirmedBuilder_ == null) { + return confirmed_.get(index); } else { + return confirmedBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + public java.util.List + getConfirmedOrBuilderList() { + if (confirmedBuilder_ != null) { + return confirmedBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(confirmed_); + } + } + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed.Builder addConfirmedBuilder() { + return getConfirmedFieldBuilder().addBuilder( + akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed.getDefaultInstance()); + } + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed.Builder addConfirmedBuilder( + int index) { + return getConfirmedFieldBuilder().addBuilder( + index, akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed.getDefaultInstance()); + } + /** + * repeated .akka.cluster.typed.delivery.Confirmed confirmed = 3; + */ + public java.util.List + getConfirmedBuilderList() { + return getConfirmedFieldBuilder().getBuilderList(); + } + private akka.protobufv3.internal.RepeatedFieldBuilderV3< + akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed, akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed.Builder, akka.cluster.typed.internal.protobuf.ReliableDelivery.ConfirmedOrBuilder> + getConfirmedFieldBuilder() { + if (confirmedBuilder_ == null) { + confirmedBuilder_ = new akka.protobufv3.internal.RepeatedFieldBuilderV3< + akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed, akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed.Builder, akka.cluster.typed.internal.protobuf.ReliableDelivery.ConfirmedOrBuilder>( + confirmed_, + ((bitField0_ & 0x00000004) != 0), + getParentForChildren(), + isClean()); + confirmed_ = null; + } + return confirmedBuilder_; + } + + private java.util.List unconfirmed_ = + java.util.Collections.emptyList(); + private void ensureUnconfirmedIsMutable() { + if (!((bitField0_ & 0x00000008) != 0)) { + unconfirmed_ = new java.util.ArrayList(unconfirmed_); + bitField0_ |= 0x00000008; + } + } + + private akka.protobufv3.internal.RepeatedFieldBuilderV3< + akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent, akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent.Builder, akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSentOrBuilder> unconfirmedBuilder_; + + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + public java.util.List getUnconfirmedList() { + if (unconfirmedBuilder_ == null) { + return java.util.Collections.unmodifiableList(unconfirmed_); + } else { + return unconfirmedBuilder_.getMessageList(); + } + } + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + public int getUnconfirmedCount() { + if (unconfirmedBuilder_ == null) { + return unconfirmed_.size(); + } else { + return unconfirmedBuilder_.getCount(); + } + } + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + public akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent getUnconfirmed(int index) { + if (unconfirmedBuilder_ == null) { + return unconfirmed_.get(index); + } else { + return unconfirmedBuilder_.getMessage(index); + } + } + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + public Builder setUnconfirmed( + int index, akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent value) { + if (unconfirmedBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureUnconfirmedIsMutable(); + unconfirmed_.set(index, value); + onChanged(); + } else { + unconfirmedBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + public Builder setUnconfirmed( + int index, akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent.Builder builderForValue) { + if (unconfirmedBuilder_ == null) { + ensureUnconfirmedIsMutable(); + unconfirmed_.set(index, builderForValue.build()); + onChanged(); + } else { + unconfirmedBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + public Builder addUnconfirmed(akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent value) { + if (unconfirmedBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureUnconfirmedIsMutable(); + unconfirmed_.add(value); + onChanged(); + } else { + unconfirmedBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + public Builder addUnconfirmed( + int index, akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent value) { + if (unconfirmedBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureUnconfirmedIsMutable(); + unconfirmed_.add(index, value); + onChanged(); + } else { + unconfirmedBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + public Builder addUnconfirmed( + akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent.Builder builderForValue) { + if (unconfirmedBuilder_ == null) { + ensureUnconfirmedIsMutable(); + unconfirmed_.add(builderForValue.build()); + onChanged(); + } else { + unconfirmedBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + public Builder addUnconfirmed( + int index, akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent.Builder builderForValue) { + if (unconfirmedBuilder_ == null) { + ensureUnconfirmedIsMutable(); + unconfirmed_.add(index, builderForValue.build()); + onChanged(); + } else { + unconfirmedBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + public Builder addAllUnconfirmed( + java.lang.Iterable values) { + if (unconfirmedBuilder_ == null) { + ensureUnconfirmedIsMutable(); + akka.protobufv3.internal.AbstractMessageLite.Builder.addAll( + values, unconfirmed_); + onChanged(); + } else { + unconfirmedBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + public Builder clearUnconfirmed() { + if (unconfirmedBuilder_ == null) { + unconfirmed_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + } else { + unconfirmedBuilder_.clear(); + } + return this; + } + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + public Builder removeUnconfirmed(int index) { + if (unconfirmedBuilder_ == null) { + ensureUnconfirmedIsMutable(); + unconfirmed_.remove(index); + onChanged(); + } else { + unconfirmedBuilder_.remove(index); + } + return this; + } + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + public akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent.Builder getUnconfirmedBuilder( + int index) { + return getUnconfirmedFieldBuilder().getBuilder(index); + } + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + public akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSentOrBuilder getUnconfirmedOrBuilder( + int index) { + if (unconfirmedBuilder_ == null) { + return unconfirmed_.get(index); } else { + return unconfirmedBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + public java.util.List + getUnconfirmedOrBuilderList() { + if (unconfirmedBuilder_ != null) { + return unconfirmedBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(unconfirmed_); + } + } + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + public akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent.Builder addUnconfirmedBuilder() { + return getUnconfirmedFieldBuilder().addBuilder( + akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent.getDefaultInstance()); + } + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + public akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent.Builder addUnconfirmedBuilder( + int index) { + return getUnconfirmedFieldBuilder().addBuilder( + index, akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent.getDefaultInstance()); + } + /** + * repeated .akka.cluster.typed.delivery.MessageSent unconfirmed = 4; + */ + public java.util.List + getUnconfirmedBuilderList() { + return getUnconfirmedFieldBuilder().getBuilderList(); + } + private akka.protobufv3.internal.RepeatedFieldBuilderV3< + akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent, akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent.Builder, akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSentOrBuilder> + getUnconfirmedFieldBuilder() { + if (unconfirmedBuilder_ == null) { + unconfirmedBuilder_ = new akka.protobufv3.internal.RepeatedFieldBuilderV3< + akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent, akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent.Builder, akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSentOrBuilder>( + unconfirmed_, + ((bitField0_ & 0x00000008) != 0), + getParentForChildren(), + isClean()); + unconfirmed_ = null; + } + return unconfirmedBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final akka.protobufv3.internal.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final akka.protobufv3.internal.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:akka.cluster.typed.delivery.State) + } + + // @@protoc_insertion_point(class_scope:akka.cluster.typed.delivery.State) + private static final akka.cluster.typed.internal.protobuf.ReliableDelivery.State DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new akka.cluster.typed.internal.protobuf.ReliableDelivery.State(); + } + + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.State getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final akka.protobufv3.internal.Parser + PARSER = new akka.protobufv3.internal.AbstractParser() { + @java.lang.Override + public State parsePartialFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return new State(input, extensionRegistry); + } + }; + + public static akka.protobufv3.internal.Parser parser() { + return PARSER; + } + + @java.lang.Override + public akka.protobufv3.internal.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.State getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface ConfirmedOrBuilder extends + // @@protoc_insertion_point(interface_extends:akka.cluster.typed.delivery.Confirmed) + akka.protobufv3.internal.MessageOrBuilder { + + /** + * required int64 seqNr = 1; + * @return Whether the seqNr field is set. + */ + boolean hasSeqNr(); + /** + * required int64 seqNr = 1; + * @return The seqNr. + */ + long getSeqNr(); + + /** + * required string qualifier = 2; + * @return Whether the qualifier field is set. + */ + boolean hasQualifier(); + /** + * required string qualifier = 2; + * @return The qualifier. + */ + java.lang.String getQualifier(); + /** + * required string qualifier = 2; + * @return The bytes for qualifier. + */ + akka.protobufv3.internal.ByteString + getQualifierBytes(); + + /** + * required int64 timestamp = 3; + * @return Whether the timestamp field is set. + */ + boolean hasTimestamp(); + /** + * required int64 timestamp = 3; + * @return The timestamp. + */ + long getTimestamp(); + } + /** + *
+   * DurableProducerQueue
+   * 
+ * + * Protobuf type {@code akka.cluster.typed.delivery.Confirmed} + */ + public static final class Confirmed extends + akka.protobufv3.internal.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:akka.cluster.typed.delivery.Confirmed) + ConfirmedOrBuilder { + private static final long serialVersionUID = 0L; + // Use Confirmed.newBuilder() to construct. + private Confirmed(akka.protobufv3.internal.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Confirmed() { + qualifier_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + akka.protobufv3.internal.GeneratedMessageV3.UnusedPrivateParameter unused) { + return new Confirmed(); + } + + @java.lang.Override + public final akka.protobufv3.internal.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Confirmed( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + akka.protobufv3.internal.UnknownFieldSet.Builder unknownFields = + akka.protobufv3.internal.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + bitField0_ |= 0x00000001; + seqNr_ = input.readInt64(); + break; + } + case 18: { + akka.protobufv3.internal.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000002; + qualifier_ = bs; + break; + } + case 24: { + bitField0_ |= 0x00000004; + timestamp_ = input.readInt64(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (akka.protobufv3.internal.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new akka.protobufv3.internal.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final akka.protobufv3.internal.Descriptors.Descriptor + getDescriptor() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Confirmed_descriptor; + } + + @java.lang.Override + protected akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Confirmed_fieldAccessorTable + .ensureFieldAccessorsInitialized( + akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed.class, akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed.Builder.class); + } + + private int bitField0_; + public static final int SEQNR_FIELD_NUMBER = 1; + private long seqNr_; + /** + * required int64 seqNr = 1; + * @return Whether the seqNr field is set. + */ + public boolean hasSeqNr() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required int64 seqNr = 1; + * @return The seqNr. + */ + public long getSeqNr() { + return seqNr_; + } + + public static final int QUALIFIER_FIELD_NUMBER = 2; + private volatile java.lang.Object qualifier_; + /** + * required string qualifier = 2; + * @return Whether the qualifier field is set. + */ + public boolean hasQualifier() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * required string qualifier = 2; + * @return The qualifier. + */ + public java.lang.String getQualifier() { + java.lang.Object ref = qualifier_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + akka.protobufv3.internal.ByteString bs = + (akka.protobufv3.internal.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + qualifier_ = s; + } + return s; + } + } + /** + * required string qualifier = 2; + * @return The bytes for qualifier. + */ + public akka.protobufv3.internal.ByteString + getQualifierBytes() { + java.lang.Object ref = qualifier_; + if (ref instanceof java.lang.String) { + akka.protobufv3.internal.ByteString b = + akka.protobufv3.internal.ByteString.copyFromUtf8( + (java.lang.String) ref); + qualifier_ = b; + return b; + } else { + return (akka.protobufv3.internal.ByteString) ref; + } + } + + public static final int TIMESTAMP_FIELD_NUMBER = 3; + private long timestamp_; + /** + * required int64 timestamp = 3; + * @return Whether the timestamp field is set. + */ + public boolean hasTimestamp() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * required int64 timestamp = 3; + * @return The timestamp. + */ + public long getTimestamp() { + return timestamp_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasSeqNr()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasQualifier()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasTimestamp()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(akka.protobufv3.internal.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeInt64(1, seqNr_); + } + if (((bitField0_ & 0x00000002) != 0)) { + akka.protobufv3.internal.GeneratedMessageV3.writeString(output, 2, qualifier_); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeInt64(3, timestamp_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += akka.protobufv3.internal.CodedOutputStream + .computeInt64Size(1, seqNr_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += akka.protobufv3.internal.GeneratedMessageV3.computeStringSize(2, qualifier_); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += akka.protobufv3.internal.CodedOutputStream + .computeInt64Size(3, timestamp_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed)) { + return super.equals(obj); + } + akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed other = (akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed) obj; + + if (hasSeqNr() != other.hasSeqNr()) return false; + if (hasSeqNr()) { + if (getSeqNr() + != other.getSeqNr()) return false; + } + if (hasQualifier() != other.hasQualifier()) return false; + if (hasQualifier()) { + if (!getQualifier() + .equals(other.getQualifier())) return false; + } + if (hasTimestamp() != other.hasTimestamp()) return false; + if (hasTimestamp()) { + if (getTimestamp() + != other.getTimestamp()) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasSeqNr()) { + hash = (37 * hash) + SEQNR_FIELD_NUMBER; + hash = (53 * hash) + akka.protobufv3.internal.Internal.hashLong( + getSeqNr()); + } + if (hasQualifier()) { + hash = (37 * hash) + QUALIFIER_FIELD_NUMBER; + hash = (53 * hash) + getQualifier().hashCode(); + } + if (hasTimestamp()) { + hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER; + hash = (53 * hash) + akka.protobufv3.internal.Internal.hashLong( + getTimestamp()); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed parseFrom( + java.nio.ByteBuffer data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed parseFrom( + java.nio.ByteBuffer data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed parseFrom( + akka.protobufv3.internal.ByteString data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed parseFrom( + akka.protobufv3.internal.ByteString data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed parseFrom(byte[] data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed parseFrom( + byte[] data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed parseFrom(java.io.InputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed parseFrom( + java.io.InputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed parseDelimitedFrom( + java.io.InputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed parseFrom( + akka.protobufv3.internal.CodedInputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed parseFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + akka.protobufv3.internal.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
+     * DurableProducerQueue
+     * 
+ * + * Protobuf type {@code akka.cluster.typed.delivery.Confirmed} + */ + public static final class Builder extends + akka.protobufv3.internal.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:akka.cluster.typed.delivery.Confirmed) + akka.cluster.typed.internal.protobuf.ReliableDelivery.ConfirmedOrBuilder { + public static final akka.protobufv3.internal.Descriptors.Descriptor + getDescriptor() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Confirmed_descriptor; + } + + @java.lang.Override + protected akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Confirmed_fieldAccessorTable + .ensureFieldAccessorsInitialized( + akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed.class, akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed.Builder.class); + } + + // Construct using akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + akka.protobufv3.internal.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (akka.protobufv3.internal.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + seqNr_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + qualifier_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + timestamp_ = 0L; + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + @java.lang.Override + public akka.protobufv3.internal.Descriptors.Descriptor + getDescriptorForType() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Confirmed_descriptor; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed getDefaultInstanceForType() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed.getDefaultInstance(); + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed build() { + akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed buildPartial() { + akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed result = new akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.seqNr_ = seqNr_; + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.qualifier_ = qualifier_; + if (((from_bitField0_ & 0x00000004) != 0)) { + result.timestamp_ = timestamp_; + to_bitField0_ |= 0x00000004; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + akka.protobufv3.internal.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(akka.protobufv3.internal.Message other) { + if (other instanceof akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed) { + return mergeFrom((akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed other) { + if (other == akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed.getDefaultInstance()) return this; + if (other.hasSeqNr()) { + setSeqNr(other.getSeqNr()); + } + if (other.hasQualifier()) { + bitField0_ |= 0x00000002; + qualifier_ = other.qualifier_; + onChanged(); + } + if (other.hasTimestamp()) { + setTimestamp(other.getTimestamp()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasSeqNr()) { + return false; + } + if (!hasQualifier()) { + return false; + } + if (!hasTimestamp()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (akka.protobufv3.internal.InvalidProtocolBufferException e) { + parsedMessage = (akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private long seqNr_ ; + /** + * required int64 seqNr = 1; + * @return Whether the seqNr field is set. + */ + public boolean hasSeqNr() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required int64 seqNr = 1; + * @return The seqNr. + */ + public long getSeqNr() { + return seqNr_; + } + /** + * required int64 seqNr = 1; + * @param value The seqNr to set. + * @return This builder for chaining. + */ + public Builder setSeqNr(long value) { + bitField0_ |= 0x00000001; + seqNr_ = value; + onChanged(); + return this; + } + /** + * required int64 seqNr = 1; + * @return This builder for chaining. + */ + public Builder clearSeqNr() { + bitField0_ = (bitField0_ & ~0x00000001); + seqNr_ = 0L; + onChanged(); + return this; + } + + private java.lang.Object qualifier_ = ""; + /** + * required string qualifier = 2; + * @return Whether the qualifier field is set. + */ + public boolean hasQualifier() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * required string qualifier = 2; + * @return The qualifier. + */ + public java.lang.String getQualifier() { + java.lang.Object ref = qualifier_; + if (!(ref instanceof java.lang.String)) { + akka.protobufv3.internal.ByteString bs = + (akka.protobufv3.internal.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + qualifier_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * required string qualifier = 2; + * @return The bytes for qualifier. + */ + public akka.protobufv3.internal.ByteString + getQualifierBytes() { + java.lang.Object ref = qualifier_; + if (ref instanceof String) { + akka.protobufv3.internal.ByteString b = + akka.protobufv3.internal.ByteString.copyFromUtf8( + (java.lang.String) ref); + qualifier_ = b; + return b; + } else { + return (akka.protobufv3.internal.ByteString) ref; + } + } + /** + * required string qualifier = 2; + * @param value The qualifier to set. + * @return This builder for chaining. + */ + public Builder setQualifier( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + qualifier_ = value; + onChanged(); + return this; + } + /** + * required string qualifier = 2; + * @return This builder for chaining. + */ + public Builder clearQualifier() { + bitField0_ = (bitField0_ & ~0x00000002); + qualifier_ = getDefaultInstance().getQualifier(); + onChanged(); + return this; + } + /** + * required string qualifier = 2; + * @param value The bytes for qualifier to set. + * @return This builder for chaining. + */ + public Builder setQualifierBytes( + akka.protobufv3.internal.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + qualifier_ = value; + onChanged(); + return this; + } + + private long timestamp_ ; + /** + * required int64 timestamp = 3; + * @return Whether the timestamp field is set. + */ + public boolean hasTimestamp() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * required int64 timestamp = 3; + * @return The timestamp. + */ + public long getTimestamp() { + return timestamp_; + } + /** + * required int64 timestamp = 3; + * @param value The timestamp to set. + * @return This builder for chaining. + */ + public Builder setTimestamp(long value) { + bitField0_ |= 0x00000004; + timestamp_ = value; + onChanged(); + return this; + } + /** + * required int64 timestamp = 3; + * @return This builder for chaining. + */ + public Builder clearTimestamp() { + bitField0_ = (bitField0_ & ~0x00000004); + timestamp_ = 0L; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final akka.protobufv3.internal.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final akka.protobufv3.internal.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:akka.cluster.typed.delivery.Confirmed) + } + + // @@protoc_insertion_point(class_scope:akka.cluster.typed.delivery.Confirmed) + private static final akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed(); + } + + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final akka.protobufv3.internal.Parser + PARSER = new akka.protobufv3.internal.AbstractParser() { + @java.lang.Override + public Confirmed parsePartialFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return new Confirmed(input, extensionRegistry); + } + }; + + public static akka.protobufv3.internal.Parser parser() { + return PARSER; + } + + @java.lang.Override + public akka.protobufv3.internal.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface MessageSentOrBuilder extends + // @@protoc_insertion_point(interface_extends:akka.cluster.typed.delivery.MessageSent) + akka.protobufv3.internal.MessageOrBuilder { + + /** + * required int64 seqNr = 1; + * @return Whether the seqNr field is set. + */ + boolean hasSeqNr(); + /** + * required int64 seqNr = 1; + * @return The seqNr. + */ + long getSeqNr(); + + /** + * required string qualifier = 2; + * @return Whether the qualifier field is set. + */ + boolean hasQualifier(); + /** + * required string qualifier = 2; + * @return The qualifier. + */ + java.lang.String getQualifier(); + /** + * required string qualifier = 2; + * @return The bytes for qualifier. + */ + akka.protobufv3.internal.ByteString + getQualifierBytes(); + + /** + * required bool ack = 3; + * @return Whether the ack field is set. + */ + boolean hasAck(); + /** + * required bool ack = 3; + * @return The ack. + */ + boolean getAck(); + + /** + * required int64 timestamp = 4; + * @return Whether the timestamp field is set. + */ + boolean hasTimestamp(); + /** + * required int64 timestamp = 4; + * @return The timestamp. + */ + long getTimestamp(); + + /** + * required .Payload message = 5; + * @return Whether the message field is set. + */ + boolean hasMessage(); + /** + * required .Payload message = 5; + * @return The message. + */ + akka.remote.ContainerFormats.Payload getMessage(); + /** + * required .Payload message = 5; + */ + akka.remote.ContainerFormats.PayloadOrBuilder getMessageOrBuilder(); + } + /** + *
+   * DurableProducerQueue
+   * 
+ * + * Protobuf type {@code akka.cluster.typed.delivery.MessageSent} + */ + public static final class MessageSent extends + akka.protobufv3.internal.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:akka.cluster.typed.delivery.MessageSent) + MessageSentOrBuilder { + private static final long serialVersionUID = 0L; + // Use MessageSent.newBuilder() to construct. + private MessageSent(akka.protobufv3.internal.GeneratedMessageV3.Builder builder) { + super(builder); + } + private MessageSent() { + qualifier_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + akka.protobufv3.internal.GeneratedMessageV3.UnusedPrivateParameter unused) { + return new MessageSent(); + } + + @java.lang.Override + public final akka.protobufv3.internal.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private MessageSent( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + akka.protobufv3.internal.UnknownFieldSet.Builder unknownFields = + akka.protobufv3.internal.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + bitField0_ |= 0x00000001; + seqNr_ = input.readInt64(); + break; + } + case 18: { + akka.protobufv3.internal.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000002; + qualifier_ = bs; + break; + } + case 24: { + bitField0_ |= 0x00000004; + ack_ = input.readBool(); + break; + } + case 32: { + bitField0_ |= 0x00000008; + timestamp_ = input.readInt64(); + break; + } + case 42: { + akka.remote.ContainerFormats.Payload.Builder subBuilder = null; + if (((bitField0_ & 0x00000010) != 0)) { + subBuilder = message_.toBuilder(); + } + message_ = input.readMessage(akka.remote.ContainerFormats.Payload.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(message_); + message_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000010; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (akka.protobufv3.internal.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new akka.protobufv3.internal.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final akka.protobufv3.internal.Descriptors.Descriptor + getDescriptor() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_MessageSent_descriptor; + } + + @java.lang.Override + protected akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_MessageSent_fieldAccessorTable + .ensureFieldAccessorsInitialized( + akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent.class, akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent.Builder.class); + } + + private int bitField0_; + public static final int SEQNR_FIELD_NUMBER = 1; + private long seqNr_; + /** + * required int64 seqNr = 1; + * @return Whether the seqNr field is set. + */ + public boolean hasSeqNr() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required int64 seqNr = 1; + * @return The seqNr. + */ + public long getSeqNr() { + return seqNr_; + } + + public static final int QUALIFIER_FIELD_NUMBER = 2; + private volatile java.lang.Object qualifier_; + /** + * required string qualifier = 2; + * @return Whether the qualifier field is set. + */ + public boolean hasQualifier() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * required string qualifier = 2; + * @return The qualifier. + */ + public java.lang.String getQualifier() { + java.lang.Object ref = qualifier_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + akka.protobufv3.internal.ByteString bs = + (akka.protobufv3.internal.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + qualifier_ = s; + } + return s; + } + } + /** + * required string qualifier = 2; + * @return The bytes for qualifier. + */ + public akka.protobufv3.internal.ByteString + getQualifierBytes() { + java.lang.Object ref = qualifier_; + if (ref instanceof java.lang.String) { + akka.protobufv3.internal.ByteString b = + akka.protobufv3.internal.ByteString.copyFromUtf8( + (java.lang.String) ref); + qualifier_ = b; + return b; + } else { + return (akka.protobufv3.internal.ByteString) ref; + } + } + + public static final int ACK_FIELD_NUMBER = 3; + private boolean ack_; + /** + * required bool ack = 3; + * @return Whether the ack field is set. + */ + public boolean hasAck() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * required bool ack = 3; + * @return The ack. + */ + public boolean getAck() { + return ack_; + } + + public static final int TIMESTAMP_FIELD_NUMBER = 4; + private long timestamp_; + /** + * required int64 timestamp = 4; + * @return Whether the timestamp field is set. + */ + public boolean hasTimestamp() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + * required int64 timestamp = 4; + * @return The timestamp. + */ + public long getTimestamp() { + return timestamp_; + } + + public static final int MESSAGE_FIELD_NUMBER = 5; + private akka.remote.ContainerFormats.Payload message_; + /** + * required .Payload message = 5; + * @return Whether the message field is set. + */ + public boolean hasMessage() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + * required .Payload message = 5; + * @return The message. + */ + public akka.remote.ContainerFormats.Payload getMessage() { + return message_ == null ? akka.remote.ContainerFormats.Payload.getDefaultInstance() : message_; + } + /** + * required .Payload message = 5; + */ + public akka.remote.ContainerFormats.PayloadOrBuilder getMessageOrBuilder() { + return message_ == null ? akka.remote.ContainerFormats.Payload.getDefaultInstance() : message_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasSeqNr()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasQualifier()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasAck()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasTimestamp()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasMessage()) { + memoizedIsInitialized = 0; + return false; + } + if (!getMessage().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(akka.protobufv3.internal.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeInt64(1, seqNr_); + } + if (((bitField0_ & 0x00000002) != 0)) { + akka.protobufv3.internal.GeneratedMessageV3.writeString(output, 2, qualifier_); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeBool(3, ack_); + } + if (((bitField0_ & 0x00000008) != 0)) { + output.writeInt64(4, timestamp_); + } + if (((bitField0_ & 0x00000010) != 0)) { + output.writeMessage(5, getMessage()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += akka.protobufv3.internal.CodedOutputStream + .computeInt64Size(1, seqNr_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += akka.protobufv3.internal.GeneratedMessageV3.computeStringSize(2, qualifier_); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += akka.protobufv3.internal.CodedOutputStream + .computeBoolSize(3, ack_); + } + if (((bitField0_ & 0x00000008) != 0)) { + size += akka.protobufv3.internal.CodedOutputStream + .computeInt64Size(4, timestamp_); + } + if (((bitField0_ & 0x00000010) != 0)) { + size += akka.protobufv3.internal.CodedOutputStream + .computeMessageSize(5, getMessage()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent)) { + return super.equals(obj); + } + akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent other = (akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent) obj; + + if (hasSeqNr() != other.hasSeqNr()) return false; + if (hasSeqNr()) { + if (getSeqNr() + != other.getSeqNr()) return false; + } + if (hasQualifier() != other.hasQualifier()) return false; + if (hasQualifier()) { + if (!getQualifier() + .equals(other.getQualifier())) return false; + } + if (hasAck() != other.hasAck()) return false; + if (hasAck()) { + if (getAck() + != other.getAck()) return false; + } + if (hasTimestamp() != other.hasTimestamp()) return false; + if (hasTimestamp()) { + if (getTimestamp() + != other.getTimestamp()) return false; + } + if (hasMessage() != other.hasMessage()) return false; + if (hasMessage()) { + if (!getMessage() + .equals(other.getMessage())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasSeqNr()) { + hash = (37 * hash) + SEQNR_FIELD_NUMBER; + hash = (53 * hash) + akka.protobufv3.internal.Internal.hashLong( + getSeqNr()); + } + if (hasQualifier()) { + hash = (37 * hash) + QUALIFIER_FIELD_NUMBER; + hash = (53 * hash) + getQualifier().hashCode(); + } + if (hasAck()) { + hash = (37 * hash) + ACK_FIELD_NUMBER; + hash = (53 * hash) + akka.protobufv3.internal.Internal.hashBoolean( + getAck()); + } + if (hasTimestamp()) { + hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER; + hash = (53 * hash) + akka.protobufv3.internal.Internal.hashLong( + getTimestamp()); + } + if (hasMessage()) { + hash = (37 * hash) + MESSAGE_FIELD_NUMBER; + hash = (53 * hash) + getMessage().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent parseFrom( + java.nio.ByteBuffer data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent parseFrom( + java.nio.ByteBuffer data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent parseFrom( + akka.protobufv3.internal.ByteString data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent parseFrom( + akka.protobufv3.internal.ByteString data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent parseFrom(byte[] data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent parseFrom( + byte[] data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent parseFrom(java.io.InputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent parseFrom( + java.io.InputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent parseDelimitedFrom( + java.io.InputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent parseFrom( + akka.protobufv3.internal.CodedInputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent parseFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + akka.protobufv3.internal.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
+     * DurableProducerQueue
+     * 
+ * + * Protobuf type {@code akka.cluster.typed.delivery.MessageSent} + */ + public static final class Builder extends + akka.protobufv3.internal.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:akka.cluster.typed.delivery.MessageSent) + akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSentOrBuilder { + public static final akka.protobufv3.internal.Descriptors.Descriptor + getDescriptor() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_MessageSent_descriptor; + } + + @java.lang.Override + protected akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_MessageSent_fieldAccessorTable + .ensureFieldAccessorsInitialized( + akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent.class, akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent.Builder.class); + } + + // Construct using akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + akka.protobufv3.internal.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (akka.protobufv3.internal.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getMessageFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + seqNr_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + qualifier_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + ack_ = false; + bitField0_ = (bitField0_ & ~0x00000004); + timestamp_ = 0L; + bitField0_ = (bitField0_ & ~0x00000008); + if (messageBuilder_ == null) { + message_ = null; + } else { + messageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); + return this; + } + + @java.lang.Override + public akka.protobufv3.internal.Descriptors.Descriptor + getDescriptorForType() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_MessageSent_descriptor; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent getDefaultInstanceForType() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent.getDefaultInstance(); + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent build() { + akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent buildPartial() { + akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent result = new akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.seqNr_ = seqNr_; + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.qualifier_ = qualifier_; + if (((from_bitField0_ & 0x00000004) != 0)) { + result.ack_ = ack_; + to_bitField0_ |= 0x00000004; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + result.timestamp_ = timestamp_; + to_bitField0_ |= 0x00000008; + } + if (((from_bitField0_ & 0x00000010) != 0)) { + if (messageBuilder_ == null) { + result.message_ = message_; + } else { + result.message_ = messageBuilder_.build(); + } + to_bitField0_ |= 0x00000010; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + akka.protobufv3.internal.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(akka.protobufv3.internal.Message other) { + if (other instanceof akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent) { + return mergeFrom((akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent other) { + if (other == akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent.getDefaultInstance()) return this; + if (other.hasSeqNr()) { + setSeqNr(other.getSeqNr()); + } + if (other.hasQualifier()) { + bitField0_ |= 0x00000002; + qualifier_ = other.qualifier_; + onChanged(); + } + if (other.hasAck()) { + setAck(other.getAck()); + } + if (other.hasTimestamp()) { + setTimestamp(other.getTimestamp()); + } + if (other.hasMessage()) { + mergeMessage(other.getMessage()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasSeqNr()) { + return false; + } + if (!hasQualifier()) { + return false; + } + if (!hasAck()) { + return false; + } + if (!hasTimestamp()) { + return false; + } + if (!hasMessage()) { + return false; + } + if (!getMessage().isInitialized()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (akka.protobufv3.internal.InvalidProtocolBufferException e) { + parsedMessage = (akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private long seqNr_ ; + /** + * required int64 seqNr = 1; + * @return Whether the seqNr field is set. + */ + public boolean hasSeqNr() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required int64 seqNr = 1; + * @return The seqNr. + */ + public long getSeqNr() { + return seqNr_; + } + /** + * required int64 seqNr = 1; + * @param value The seqNr to set. + * @return This builder for chaining. + */ + public Builder setSeqNr(long value) { + bitField0_ |= 0x00000001; + seqNr_ = value; + onChanged(); + return this; + } + /** + * required int64 seqNr = 1; + * @return This builder for chaining. + */ + public Builder clearSeqNr() { + bitField0_ = (bitField0_ & ~0x00000001); + seqNr_ = 0L; + onChanged(); + return this; + } + + private java.lang.Object qualifier_ = ""; + /** + * required string qualifier = 2; + * @return Whether the qualifier field is set. + */ + public boolean hasQualifier() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * required string qualifier = 2; + * @return The qualifier. + */ + public java.lang.String getQualifier() { + java.lang.Object ref = qualifier_; + if (!(ref instanceof java.lang.String)) { + akka.protobufv3.internal.ByteString bs = + (akka.protobufv3.internal.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + qualifier_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * required string qualifier = 2; + * @return The bytes for qualifier. + */ + public akka.protobufv3.internal.ByteString + getQualifierBytes() { + java.lang.Object ref = qualifier_; + if (ref instanceof String) { + akka.protobufv3.internal.ByteString b = + akka.protobufv3.internal.ByteString.copyFromUtf8( + (java.lang.String) ref); + qualifier_ = b; + return b; + } else { + return (akka.protobufv3.internal.ByteString) ref; + } + } + /** + * required string qualifier = 2; + * @param value The qualifier to set. + * @return This builder for chaining. + */ + public Builder setQualifier( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + qualifier_ = value; + onChanged(); + return this; + } + /** + * required string qualifier = 2; + * @return This builder for chaining. + */ + public Builder clearQualifier() { + bitField0_ = (bitField0_ & ~0x00000002); + qualifier_ = getDefaultInstance().getQualifier(); + onChanged(); + return this; + } + /** + * required string qualifier = 2; + * @param value The bytes for qualifier to set. + * @return This builder for chaining. + */ + public Builder setQualifierBytes( + akka.protobufv3.internal.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + qualifier_ = value; + onChanged(); + return this; + } + + private boolean ack_ ; + /** + * required bool ack = 3; + * @return Whether the ack field is set. + */ + public boolean hasAck() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * required bool ack = 3; + * @return The ack. + */ + public boolean getAck() { + return ack_; + } + /** + * required bool ack = 3; + * @param value The ack to set. + * @return This builder for chaining. + */ + public Builder setAck(boolean value) { + bitField0_ |= 0x00000004; + ack_ = value; + onChanged(); + return this; + } + /** + * required bool ack = 3; + * @return This builder for chaining. + */ + public Builder clearAck() { + bitField0_ = (bitField0_ & ~0x00000004); + ack_ = false; + onChanged(); + return this; + } + + private long timestamp_ ; + /** + * required int64 timestamp = 4; + * @return Whether the timestamp field is set. + */ + public boolean hasTimestamp() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + * required int64 timestamp = 4; + * @return The timestamp. + */ + public long getTimestamp() { + return timestamp_; + } + /** + * required int64 timestamp = 4; + * @param value The timestamp to set. + * @return This builder for chaining. + */ + public Builder setTimestamp(long value) { + bitField0_ |= 0x00000008; + timestamp_ = value; + onChanged(); + return this; + } + /** + * required int64 timestamp = 4; + * @return This builder for chaining. + */ + public Builder clearTimestamp() { + bitField0_ = (bitField0_ & ~0x00000008); + timestamp_ = 0L; + onChanged(); + return this; + } + + private akka.remote.ContainerFormats.Payload message_; + private akka.protobufv3.internal.SingleFieldBuilderV3< + akka.remote.ContainerFormats.Payload, akka.remote.ContainerFormats.Payload.Builder, akka.remote.ContainerFormats.PayloadOrBuilder> messageBuilder_; + /** + * required .Payload message = 5; + * @return Whether the message field is set. + */ + public boolean hasMessage() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + * required .Payload message = 5; + * @return The message. + */ + public akka.remote.ContainerFormats.Payload getMessage() { + if (messageBuilder_ == null) { + return message_ == null ? akka.remote.ContainerFormats.Payload.getDefaultInstance() : message_; + } else { + return messageBuilder_.getMessage(); + } + } + /** + * required .Payload message = 5; + */ + public Builder setMessage(akka.remote.ContainerFormats.Payload value) { + if (messageBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + message_ = value; + onChanged(); + } else { + messageBuilder_.setMessage(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * required .Payload message = 5; + */ + public Builder setMessage( + akka.remote.ContainerFormats.Payload.Builder builderForValue) { + if (messageBuilder_ == null) { + message_ = builderForValue.build(); + onChanged(); + } else { + messageBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * required .Payload message = 5; + */ + public Builder mergeMessage(akka.remote.ContainerFormats.Payload value) { + if (messageBuilder_ == null) { + if (((bitField0_ & 0x00000010) != 0) && + message_ != null && + message_ != akka.remote.ContainerFormats.Payload.getDefaultInstance()) { + message_ = + akka.remote.ContainerFormats.Payload.newBuilder(message_).mergeFrom(value).buildPartial(); + } else { + message_ = value; + } + onChanged(); + } else { + messageBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * required .Payload message = 5; + */ + public Builder clearMessage() { + if (messageBuilder_ == null) { + message_ = null; + onChanged(); + } else { + messageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); + return this; + } + /** + * required .Payload message = 5; + */ + public akka.remote.ContainerFormats.Payload.Builder getMessageBuilder() { + bitField0_ |= 0x00000010; + onChanged(); + return getMessageFieldBuilder().getBuilder(); + } + /** + * required .Payload message = 5; + */ + public akka.remote.ContainerFormats.PayloadOrBuilder getMessageOrBuilder() { + if (messageBuilder_ != null) { + return messageBuilder_.getMessageOrBuilder(); + } else { + return message_ == null ? + akka.remote.ContainerFormats.Payload.getDefaultInstance() : message_; + } + } + /** + * required .Payload message = 5; + */ + private akka.protobufv3.internal.SingleFieldBuilderV3< + akka.remote.ContainerFormats.Payload, akka.remote.ContainerFormats.Payload.Builder, akka.remote.ContainerFormats.PayloadOrBuilder> + getMessageFieldBuilder() { + if (messageBuilder_ == null) { + messageBuilder_ = new akka.protobufv3.internal.SingleFieldBuilderV3< + akka.remote.ContainerFormats.Payload, akka.remote.ContainerFormats.Payload.Builder, akka.remote.ContainerFormats.PayloadOrBuilder>( + getMessage(), + getParentForChildren(), + isClean()); + message_ = null; + } + return messageBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final akka.protobufv3.internal.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final akka.protobufv3.internal.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:akka.cluster.typed.delivery.MessageSent) + } + + // @@protoc_insertion_point(class_scope:akka.cluster.typed.delivery.MessageSent) + private static final akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent(); + } + + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final akka.protobufv3.internal.Parser + PARSER = new akka.protobufv3.internal.AbstractParser() { + @java.lang.Override + public MessageSent parsePartialFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return new MessageSent(input, extensionRegistry); + } + }; + + public static akka.protobufv3.internal.Parser parser() { + return PARSER; + } + + @java.lang.Override + public akka.protobufv3.internal.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.MessageSent getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface CleanupOrBuilder extends + // @@protoc_insertion_point(interface_extends:akka.cluster.typed.delivery.Cleanup) + akka.protobufv3.internal.MessageOrBuilder { + + /** + * repeated string qualifiers = 1; + * @return A list containing the qualifiers. + */ + java.util.List + getQualifiersList(); + /** + * repeated string qualifiers = 1; + * @return The count of qualifiers. + */ + int getQualifiersCount(); + /** + * repeated string qualifiers = 1; + * @param index The index of the element to return. + * @return The qualifiers at the given index. + */ + java.lang.String getQualifiers(int index); + /** + * repeated string qualifiers = 1; + * @param index The index of the value to return. + * @return The bytes of the qualifiers at the given index. + */ + akka.protobufv3.internal.ByteString + getQualifiersBytes(int index); + } + /** + *
+   * DurableProducerQueue
+   * 
+ * + * Protobuf type {@code akka.cluster.typed.delivery.Cleanup} + */ + public static final class Cleanup extends + akka.protobufv3.internal.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:akka.cluster.typed.delivery.Cleanup) + CleanupOrBuilder { + private static final long serialVersionUID = 0L; + // Use Cleanup.newBuilder() to construct. + private Cleanup(akka.protobufv3.internal.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Cleanup() { + qualifiers_ = akka.protobufv3.internal.LazyStringArrayList.EMPTY; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + akka.protobufv3.internal.GeneratedMessageV3.UnusedPrivateParameter unused) { + return new Cleanup(); + } + + @java.lang.Override + public final akka.protobufv3.internal.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Cleanup( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + akka.protobufv3.internal.UnknownFieldSet.Builder unknownFields = + akka.protobufv3.internal.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + akka.protobufv3.internal.ByteString bs = input.readBytes(); + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + qualifiers_ = new akka.protobufv3.internal.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000001; + } + qualifiers_.add(bs); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (akka.protobufv3.internal.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new akka.protobufv3.internal.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + qualifiers_ = qualifiers_.getUnmodifiableView(); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final akka.protobufv3.internal.Descriptors.Descriptor + getDescriptor() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Cleanup_descriptor; + } + + @java.lang.Override + protected akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Cleanup_fieldAccessorTable + .ensureFieldAccessorsInitialized( + akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup.class, akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup.Builder.class); + } + + public static final int QUALIFIERS_FIELD_NUMBER = 1; + private akka.protobufv3.internal.LazyStringList qualifiers_; + /** + * repeated string qualifiers = 1; + * @return A list containing the qualifiers. + */ + public akka.protobufv3.internal.ProtocolStringList + getQualifiersList() { + return qualifiers_; + } + /** + * repeated string qualifiers = 1; + * @return The count of qualifiers. + */ + public int getQualifiersCount() { + return qualifiers_.size(); + } + /** + * repeated string qualifiers = 1; + * @param index The index of the element to return. + * @return The qualifiers at the given index. + */ + public java.lang.String getQualifiers(int index) { + return qualifiers_.get(index); + } + /** + * repeated string qualifiers = 1; + * @param index The index of the value to return. + * @return The bytes of the qualifiers at the given index. + */ + public akka.protobufv3.internal.ByteString + getQualifiersBytes(int index) { + return qualifiers_.getByteString(index); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(akka.protobufv3.internal.CodedOutputStream output) + throws java.io.IOException { + for (int i = 0; i < qualifiers_.size(); i++) { + akka.protobufv3.internal.GeneratedMessageV3.writeString(output, 1, qualifiers_.getRaw(i)); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + { + int dataSize = 0; + for (int i = 0; i < qualifiers_.size(); i++) { + dataSize += computeStringSizeNoTag(qualifiers_.getRaw(i)); + } + size += dataSize; + size += 1 * getQualifiersList().size(); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup)) { + return super.equals(obj); + } + akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup other = (akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup) obj; + + if (!getQualifiersList() + .equals(other.getQualifiersList())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (getQualifiersCount() > 0) { + hash = (37 * hash) + QUALIFIERS_FIELD_NUMBER; + hash = (53 * hash) + getQualifiersList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup parseFrom( + java.nio.ByteBuffer data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup parseFrom( + java.nio.ByteBuffer data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup parseFrom( + akka.protobufv3.internal.ByteString data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup parseFrom( + akka.protobufv3.internal.ByteString data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup parseFrom(byte[] data) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup parseFrom( + byte[] data, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup parseFrom(java.io.InputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup parseFrom( + java.io.InputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup parseDelimitedFrom( + java.io.InputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup parseFrom( + akka.protobufv3.internal.CodedInputStream input) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup parseFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return akka.protobufv3.internal.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + akka.protobufv3.internal.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
+     * DurableProducerQueue
+     * 
+ * + * Protobuf type {@code akka.cluster.typed.delivery.Cleanup} + */ + public static final class Builder extends + akka.protobufv3.internal.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:akka.cluster.typed.delivery.Cleanup) + akka.cluster.typed.internal.protobuf.ReliableDelivery.CleanupOrBuilder { + public static final akka.protobufv3.internal.Descriptors.Descriptor + getDescriptor() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Cleanup_descriptor; + } + + @java.lang.Override + protected akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Cleanup_fieldAccessorTable + .ensureFieldAccessorsInitialized( + akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup.class, akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup.Builder.class); + } + + // Construct using akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + akka.protobufv3.internal.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (akka.protobufv3.internal.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + qualifiers_ = akka.protobufv3.internal.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + @java.lang.Override + public akka.protobufv3.internal.Descriptors.Descriptor + getDescriptorForType() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.internal_static_akka_cluster_typed_delivery_Cleanup_descriptor; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup getDefaultInstanceForType() { + return akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup.getDefaultInstance(); + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup build() { + akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup buildPartial() { + akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup result = new akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup(this); + int from_bitField0_ = bitField0_; + if (((bitField0_ & 0x00000001) != 0)) { + qualifiers_ = qualifiers_.getUnmodifiableView(); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.qualifiers_ = qualifiers_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + akka.protobufv3.internal.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + akka.protobufv3.internal.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(akka.protobufv3.internal.Message other) { + if (other instanceof akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup) { + return mergeFrom((akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup other) { + if (other == akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup.getDefaultInstance()) return this; + if (!other.qualifiers_.isEmpty()) { + if (qualifiers_.isEmpty()) { + qualifiers_ = other.qualifiers_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureQualifiersIsMutable(); + qualifiers_.addAll(other.qualifiers_); + } + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (akka.protobufv3.internal.InvalidProtocolBufferException e) { + parsedMessage = (akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private akka.protobufv3.internal.LazyStringList qualifiers_ = akka.protobufv3.internal.LazyStringArrayList.EMPTY; + private void ensureQualifiersIsMutable() { + if (!((bitField0_ & 0x00000001) != 0)) { + qualifiers_ = new akka.protobufv3.internal.LazyStringArrayList(qualifiers_); + bitField0_ |= 0x00000001; + } + } + /** + * repeated string qualifiers = 1; + * @return A list containing the qualifiers. + */ + public akka.protobufv3.internal.ProtocolStringList + getQualifiersList() { + return qualifiers_.getUnmodifiableView(); + } + /** + * repeated string qualifiers = 1; + * @return The count of qualifiers. + */ + public int getQualifiersCount() { + return qualifiers_.size(); + } + /** + * repeated string qualifiers = 1; + * @param index The index of the element to return. + * @return The qualifiers at the given index. + */ + public java.lang.String getQualifiers(int index) { + return qualifiers_.get(index); + } + /** + * repeated string qualifiers = 1; + * @param index The index of the value to return. + * @return The bytes of the qualifiers at the given index. + */ + public akka.protobufv3.internal.ByteString + getQualifiersBytes(int index) { + return qualifiers_.getByteString(index); + } + /** + * repeated string qualifiers = 1; + * @param index The index to set the value at. + * @param value The qualifiers to set. + * @return This builder for chaining. + */ + public Builder setQualifiers( + int index, java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureQualifiersIsMutable(); + qualifiers_.set(index, value); + onChanged(); + return this; + } + /** + * repeated string qualifiers = 1; + * @param value The qualifiers to add. + * @return This builder for chaining. + */ + public Builder addQualifiers( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureQualifiersIsMutable(); + qualifiers_.add(value); + onChanged(); + return this; + } + /** + * repeated string qualifiers = 1; + * @param values The qualifiers to add. + * @return This builder for chaining. + */ + public Builder addAllQualifiers( + java.lang.Iterable values) { + ensureQualifiersIsMutable(); + akka.protobufv3.internal.AbstractMessageLite.Builder.addAll( + values, qualifiers_); + onChanged(); + return this; + } + /** + * repeated string qualifiers = 1; + * @return This builder for chaining. + */ + public Builder clearQualifiers() { + qualifiers_ = akka.protobufv3.internal.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + * repeated string qualifiers = 1; + * @param value The bytes of the qualifiers to add. + * @return This builder for chaining. + */ + public Builder addQualifiersBytes( + akka.protobufv3.internal.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureQualifiersIsMutable(); + qualifiers_.add(value); + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final akka.protobufv3.internal.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final akka.protobufv3.internal.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:akka.cluster.typed.delivery.Cleanup) + } + + // @@protoc_insertion_point(class_scope:akka.cluster.typed.delivery.Cleanup) + private static final akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup(); + } + + public static akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final akka.protobufv3.internal.Parser + PARSER = new akka.protobufv3.internal.AbstractParser() { + @java.lang.Override + public Cleanup parsePartialFrom( + akka.protobufv3.internal.CodedInputStream input, + akka.protobufv3.internal.ExtensionRegistryLite extensionRegistry) + throws akka.protobufv3.internal.InvalidProtocolBufferException { + return new Cleanup(input, extensionRegistry); + } + }; + + public static akka.protobufv3.internal.Parser parser() { + return PARSER; + } + + @java.lang.Override + public akka.protobufv3.internal.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public akka.cluster.typed.internal.protobuf.ReliableDelivery.Cleanup getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final akka.protobufv3.internal.Descriptors.Descriptor + internal_static_akka_cluster_typed_delivery_SequencedMessage_descriptor; + private static final + akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internal_static_akka_cluster_typed_delivery_SequencedMessage_fieldAccessorTable; + private static final akka.protobufv3.internal.Descriptors.Descriptor + internal_static_akka_cluster_typed_delivery_RegisterConsumer_descriptor; + private static final + akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internal_static_akka_cluster_typed_delivery_RegisterConsumer_fieldAccessorTable; + private static final akka.protobufv3.internal.Descriptors.Descriptor + internal_static_akka_cluster_typed_delivery_Request_descriptor; + private static final + akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internal_static_akka_cluster_typed_delivery_Request_fieldAccessorTable; + private static final akka.protobufv3.internal.Descriptors.Descriptor + internal_static_akka_cluster_typed_delivery_Resend_descriptor; + private static final + akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internal_static_akka_cluster_typed_delivery_Resend_fieldAccessorTable; + private static final akka.protobufv3.internal.Descriptors.Descriptor + internal_static_akka_cluster_typed_delivery_Ack_descriptor; + private static final + akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internal_static_akka_cluster_typed_delivery_Ack_fieldAccessorTable; + private static final akka.protobufv3.internal.Descriptors.Descriptor + internal_static_akka_cluster_typed_delivery_State_descriptor; + private static final + akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internal_static_akka_cluster_typed_delivery_State_fieldAccessorTable; + private static final akka.protobufv3.internal.Descriptors.Descriptor + internal_static_akka_cluster_typed_delivery_Confirmed_descriptor; + private static final + akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internal_static_akka_cluster_typed_delivery_Confirmed_fieldAccessorTable; + private static final akka.protobufv3.internal.Descriptors.Descriptor + internal_static_akka_cluster_typed_delivery_MessageSent_descriptor; + private static final + akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internal_static_akka_cluster_typed_delivery_MessageSent_fieldAccessorTable; + private static final akka.protobufv3.internal.Descriptors.Descriptor + internal_static_akka_cluster_typed_delivery_Cleanup_descriptor; + private static final + akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable + internal_static_akka_cluster_typed_delivery_Cleanup_fieldAccessorTable; + + public static akka.protobufv3.internal.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static akka.protobufv3.internal.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\026ReliableDelivery.proto\022\033akka.cluster.t" + + "yped.delivery\032\026ContainerFormats.proto\"\213\001" + + "\n\020SequencedMessage\022\022\n\nproducerId\030\001 \002(\t\022\r" + + "\n\005seqNr\030\002 \002(\003\022\r\n\005first\030\003 \002(\010\022\013\n\003ack\030\004 \002(" + + "\010\022\035\n\025producerControllerRef\030\005 \002(\t\022\031\n\007mess" + + "age\030\006 \002(\0132\010.Payload\"1\n\020RegisterConsumer\022" + + "\035\n\025consumerControllerRef\030\001 \002(\t\"f\n\007Reques" + + "t\022\026\n\016confirmedSeqNr\030\001 \002(\003\022\030\n\020requestUpTo" + + "SeqNr\030\002 \002(\003\022\025\n\rsupportResend\030\003 \002(\010\022\022\n\nvi" + + "aTimeout\030\004 \002(\010\"\033\n\006Resend\022\021\n\tfromSeqNr\030\001 " + + "\002(\003\"\035\n\003Ack\022\026\n\016confirmedSeqNr\030\001 \002(\003\"\266\001\n\005S" + + "tate\022\024\n\014currentSeqNr\030\001 \002(\003\022\035\n\025highestCon" + + "firmedSeqNr\030\002 \002(\003\0229\n\tconfirmed\030\003 \003(\0132&.a" + + "kka.cluster.typed.delivery.Confirmed\022=\n\013" + + "unconfirmed\030\004 \003(\0132(.akka.cluster.typed.d" + + "elivery.MessageSent\"@\n\tConfirmed\022\r\n\005seqN" + + "r\030\001 \002(\003\022\021\n\tqualifier\030\002 \002(\t\022\021\n\ttimestamp\030" + + "\003 \002(\003\"j\n\013MessageSent\022\r\n\005seqNr\030\001 \002(\003\022\021\n\tq" + + "ualifier\030\002 \002(\t\022\013\n\003ack\030\003 \002(\010\022\021\n\ttimestamp" + + "\030\004 \002(\003\022\031\n\007message\030\005 \002(\0132\010.Payload\"\035\n\007Cle" + + "anup\022\022\n\nqualifiers\030\001 \003(\tB(\n$akka.cluster" + + ".typed.internal.protobufH\001" + }; + descriptor = akka.protobufv3.internal.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new akka.protobufv3.internal.Descriptors.FileDescriptor[] { + akka.remote.ContainerFormats.getDescriptor(), + }); + internal_static_akka_cluster_typed_delivery_SequencedMessage_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_akka_cluster_typed_delivery_SequencedMessage_fieldAccessorTable = new + akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable( + internal_static_akka_cluster_typed_delivery_SequencedMessage_descriptor, + new java.lang.String[] { "ProducerId", "SeqNr", "First", "Ack", "ProducerControllerRef", "Message", }); + internal_static_akka_cluster_typed_delivery_RegisterConsumer_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_akka_cluster_typed_delivery_RegisterConsumer_fieldAccessorTable = new + akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable( + internal_static_akka_cluster_typed_delivery_RegisterConsumer_descriptor, + new java.lang.String[] { "ConsumerControllerRef", }); + internal_static_akka_cluster_typed_delivery_Request_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_akka_cluster_typed_delivery_Request_fieldAccessorTable = new + akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable( + internal_static_akka_cluster_typed_delivery_Request_descriptor, + new java.lang.String[] { "ConfirmedSeqNr", "RequestUpToSeqNr", "SupportResend", "ViaTimeout", }); + internal_static_akka_cluster_typed_delivery_Resend_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_akka_cluster_typed_delivery_Resend_fieldAccessorTable = new + akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable( + internal_static_akka_cluster_typed_delivery_Resend_descriptor, + new java.lang.String[] { "FromSeqNr", }); + internal_static_akka_cluster_typed_delivery_Ack_descriptor = + getDescriptor().getMessageTypes().get(4); + internal_static_akka_cluster_typed_delivery_Ack_fieldAccessorTable = new + akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable( + internal_static_akka_cluster_typed_delivery_Ack_descriptor, + new java.lang.String[] { "ConfirmedSeqNr", }); + internal_static_akka_cluster_typed_delivery_State_descriptor = + getDescriptor().getMessageTypes().get(5); + internal_static_akka_cluster_typed_delivery_State_fieldAccessorTable = new + akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable( + internal_static_akka_cluster_typed_delivery_State_descriptor, + new java.lang.String[] { "CurrentSeqNr", "HighestConfirmedSeqNr", "Confirmed", "Unconfirmed", }); + internal_static_akka_cluster_typed_delivery_Confirmed_descriptor = + getDescriptor().getMessageTypes().get(6); + internal_static_akka_cluster_typed_delivery_Confirmed_fieldAccessorTable = new + akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable( + internal_static_akka_cluster_typed_delivery_Confirmed_descriptor, + new java.lang.String[] { "SeqNr", "Qualifier", "Timestamp", }); + internal_static_akka_cluster_typed_delivery_MessageSent_descriptor = + getDescriptor().getMessageTypes().get(7); + internal_static_akka_cluster_typed_delivery_MessageSent_fieldAccessorTable = new + akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable( + internal_static_akka_cluster_typed_delivery_MessageSent_descriptor, + new java.lang.String[] { "SeqNr", "Qualifier", "Ack", "Timestamp", "Message", }); + internal_static_akka_cluster_typed_delivery_Cleanup_descriptor = + getDescriptor().getMessageTypes().get(8); + internal_static_akka_cluster_typed_delivery_Cleanup_fieldAccessorTable = new + akka.protobufv3.internal.GeneratedMessageV3.FieldAccessorTable( + internal_static_akka_cluster_typed_delivery_Cleanup_descriptor, + new java.lang.String[] { "Qualifiers", }); + akka.remote.ContainerFormats.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/akka-cluster-typed/src/main/protobuf/ReliableDelivery.proto b/akka-cluster-typed/src/main/protobuf/ReliableDelivery.proto new file mode 100644 index 00000000000..39fe9e0be3e --- /dev/null +++ b/akka-cluster-typed/src/main/protobuf/ReliableDelivery.proto @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2020 Lightbend Inc. + */ + +syntax = "proto2"; + +package akka.cluster.typed.delivery; + +option java_package = "akka.cluster.typed.internal.protobuf"; +option optimize_for = SPEED; +import "ContainerFormats.proto"; + +// ConsumerController +message SequencedMessage { + required string producerId = 1; + required int64 seqNr = 2; + required bool first = 3; + required bool ack = 4; + required string producerControllerRef = 5; + required Payload message = 6; +} + +// ProducerController +message RegisterConsumer { + required string consumerControllerRef = 1; +} + +// ProducerController +message Request { + required int64 confirmedSeqNr = 1; + required int64 requestUpToSeqNr = 2; + required bool supportResend = 3; + required bool viaTimeout = 4; +} + +// ProducerController +message Resend { + required int64 fromSeqNr = 1; +} + +// ProducerController +message Ack { + required int64 confirmedSeqNr = 1; +} + +// DurableProducerQueue +message State { + required int64 currentSeqNr = 1; + required int64 highestConfirmedSeqNr = 2; + repeated Confirmed confirmed = 3; + repeated MessageSent unconfirmed = 4; +} + +// DurableProducerQueue +message Confirmed { + required int64 seqNr = 1; + required string qualifier = 2; + required int64 timestamp = 3; +} + +// DurableProducerQueue +message MessageSent { + required int64 seqNr = 1; + required string qualifier = 2; + required bool ack = 3; + required int64 timestamp = 4; + required Payload message = 5; +} + +// DurableProducerQueue +message Cleanup { + repeated string qualifiers = 1; +} + diff --git a/akka-cluster-typed/src/main/resources/reference.conf b/akka-cluster-typed/src/main/resources/reference.conf index 6f6ba574af5..45d36c6ecab 100644 --- a/akka-cluster-typed/src/main/resources/reference.conf +++ b/akka-cluster-typed/src/main/resources/reference.conf @@ -43,13 +43,16 @@ akka { actor { serialization-identifiers { "akka.cluster.typed.internal.AkkaClusterTypedSerializer" = 28 + "akka.cluster.typed.internal.delivery.ReliableDeliverySerializer" = 36 } serializers { typed-cluster = "akka.cluster.typed.internal.AkkaClusterTypedSerializer" + reliable-delivery = "akka.cluster.typed.internal.delivery.ReliableDeliverySerializer" } serialization-bindings { "akka.cluster.typed.internal.receptionist.ClusterReceptionist$Entry" = typed-cluster "akka.actor.typed.internal.pubsub.TopicImpl$MessagePublished" = typed-cluster + "akka.actor.typed.delivery.internal.DeliverySerializable" = reliable-delivery } } cluster.configuration-compatibility-check.checkers { diff --git a/akka-cluster-typed/src/main/scala/akka/cluster/typed/internal/delivery/ReliableDeliverySerializer.scala b/akka-cluster-typed/src/main/scala/akka/cluster/typed/internal/delivery/ReliableDeliverySerializer.scala new file mode 100644 index 00000000000..ce26c2b6754 --- /dev/null +++ b/akka-cluster-typed/src/main/scala/akka/cluster/typed/internal/delivery/ReliableDeliverySerializer.scala @@ -0,0 +1,241 @@ +/* + * Copyright (C) 2020 Lightbend Inc. + */ + +package akka.cluster.typed.internal.delivery + +import java.io.NotSerializableException + +import akka.util.ccompat.JavaConverters._ +import akka.actor.typed.ActorRefResolver +import akka.actor.typed.delivery.ConsumerController +import akka.actor.typed.delivery.DurableProducerQueue +import akka.actor.typed.delivery.ProducerController +import akka.actor.typed.delivery.internal.ProducerControllerImpl +import akka.actor.typed.scaladsl.adapter._ +import akka.annotation.InternalApi +import akka.cluster.typed.internal.protobuf.ReliableDelivery +import akka.cluster.typed.internal.protobuf.ReliableDelivery.Confirmed +import akka.remote.serialization.WrappedPayloadSupport +import akka.serialization.BaseSerializer +import akka.serialization.SerializerWithStringManifest + +/** + * INTERNAL API + */ +@InternalApi private[akka] class ReliableDeliverySerializer(val system: akka.actor.ExtendedActorSystem) + extends SerializerWithStringManifest + with BaseSerializer { + + private val payloadSupport = new WrappedPayloadSupport(system) + // lazy because Serializers are initialized early on. `toTyped` might then try to + // initialize the classic ActorSystemAdapter extension. + private lazy val resolver = ActorRefResolver(system.toTyped) + + private val SequencedMessageManifest = "a" + private val AckManifest = "b" + private val RequestManifest = "c" + private val ResendManifest = "d" + private val RegisterConsumerManifest = "e" + + private val DurableQueueMessageSentManifest = "f" + private val DurableQueueConfirmedManifest = "g" + private val DurableQueueStateManifest = "h" + private val DurableQueueCleanupManifest = "i" + + override def manifest(o: AnyRef): String = o match { + case _: ConsumerController.SequencedMessage[_] => SequencedMessageManifest + case _: ProducerControllerImpl.Ack => AckManifest + case _: ProducerControllerImpl.Request => RequestManifest + case _: ProducerControllerImpl.Resend => ResendManifest + case _: ProducerController.RegisterConsumer[_] => RegisterConsumerManifest + case _: DurableProducerQueue.MessageSent[_] => DurableQueueMessageSentManifest + case _: DurableProducerQueue.Confirmed => DurableQueueConfirmedManifest + case _: DurableProducerQueue.State[_] => DurableQueueStateManifest + case _: DurableProducerQueue.Cleanup => DurableQueueCleanupManifest + case _ => + throw new IllegalArgumentException(s"Can't serialize object of type ${o.getClass} in [${getClass.getName}]") + } + + override def toBinary(o: AnyRef): Array[Byte] = o match { + case m: ConsumerController.SequencedMessage[_] => sequencedMessageToBinary(m) + case m: ProducerControllerImpl.Ack => ackToBinary(m) + case m: ProducerControllerImpl.Request => requestToBinary(m) + case m: ProducerControllerImpl.Resend => resendToBinary(m) + case m: ProducerController.RegisterConsumer[_] => registerConsumerToBinary(m) + case m: DurableProducerQueue.MessageSent[_] => durableQueueMessageSentToBinary(m) + case m: DurableProducerQueue.Confirmed => durableQueueConfirmedToBinary(m) + case m: DurableProducerQueue.State[_] => durableQueueStateToBinary(m) + case m: DurableProducerQueue.Cleanup => durableQueueCleanupToBinary(m) + case _ => + throw new IllegalArgumentException(s"Cannot serialize object of type [${o.getClass.getName}]") + } + + private def sequencedMessageToBinary(m: ConsumerController.SequencedMessage[_]): Array[Byte] = { + val b = ReliableDelivery.SequencedMessage.newBuilder() + b.setProducerId(m.producerId) + b.setSeqNr(m.seqNr) + b.setFirst(m.first) + b.setAck(m.ack) + b.setProducerControllerRef(resolver.toSerializationFormat(m.producerController)) + b.setMessage(payloadSupport.payloadBuilder(m.message)) + b.build().toByteArray() + } + + private def ackToBinary(m: ProducerControllerImpl.Ack): Array[Byte] = { + val b = ReliableDelivery.Ack.newBuilder() + b.setConfirmedSeqNr(m.confirmedSeqNr) + b.build().toByteArray() + } + + private def requestToBinary(m: ProducerControllerImpl.Request): Array[Byte] = { + val b = ReliableDelivery.Request.newBuilder() + b.setConfirmedSeqNr(m.confirmedSeqNr) + b.setRequestUpToSeqNr(m.requestUpToSeqNr) + b.setSupportResend(m.supportResend) + b.setViaTimeout(m.viaTimeout) + b.build().toByteArray() + } + + private def resendToBinary(m: ProducerControllerImpl.Resend): Array[Byte] = { + val b = ReliableDelivery.Resend.newBuilder() + b.setFromSeqNr(m.fromSeqNr) + b.build().toByteArray() + } + + private def registerConsumerToBinary(m: ProducerController.RegisterConsumer[_]): Array[Byte] = { + val b = ReliableDelivery.RegisterConsumer.newBuilder() + b.setConsumerControllerRef(resolver.toSerializationFormat(m.consumerController)) + b.build().toByteArray() + } + + private def durableQueueMessageSentToBinary(m: DurableProducerQueue.MessageSent[_]): Array[Byte] = { + durableQueueMessageSentToProto(m).toByteArray() + } + + private def durableQueueMessageSentToProto(m: DurableProducerQueue.MessageSent[_]): ReliableDelivery.MessageSent = { + val b = ReliableDelivery.MessageSent.newBuilder() + b.setSeqNr(m.seqNr) + b.setQualifier(m.confirmationQualifier) + b.setAck(m.ack) + b.setTimestamp(m.timestampMillis) + b.setMessage(payloadSupport.payloadBuilder(m.message)) + b.build() + } + + private def durableQueueConfirmedToBinary(m: DurableProducerQueue.Confirmed): _root_.scala.Array[Byte] = { + durableQueueConfirmedToProto(m.confirmationQualifier, m.seqNr, m.timestampMillis).toByteArray() + } + + private def durableQueueConfirmedToProto( + qualifier: String, + seqNr: DurableProducerQueue.SeqNr, + timestampMillis: DurableProducerQueue.TimestampMillis): Confirmed = { + val b = ReliableDelivery.Confirmed.newBuilder() + b.setSeqNr(seqNr) + b.setQualifier(qualifier) + b.setTimestamp(timestampMillis) + b.build() + } + + private def durableQueueStateToBinary(m: DurableProducerQueue.State[_]): Array[Byte] = { + val b = ReliableDelivery.State.newBuilder() + b.setCurrentSeqNr(m.currentSeqNr) + b.setHighestConfirmedSeqNr(m.highestConfirmedSeqNr) + b.addAllConfirmed(m.confirmedSeqNr.map { + case (qualifier, (seqNr, timestamp)) => durableQueueConfirmedToProto(qualifier, seqNr, timestamp) + }.asJava) + b.addAllUnconfirmed(m.unconfirmed.map(durableQueueMessageSentToProto).asJava) + b.build().toByteArray() + } + + private def durableQueueCleanupToBinary(m: DurableProducerQueue.Cleanup): Array[Byte] = { + val b = ReliableDelivery.Cleanup.newBuilder() + b.addAllQualifiers(m.confirmationQualifiers.asJava) + b.build().toByteArray() + } + + override def fromBinary(bytes: Array[Byte], manifest: String): AnyRef = manifest match { + case SequencedMessageManifest => sequencedMessageFromBinary(bytes) + case AckManifest => ackFromBinary(bytes) + case RequestManifest => requestFromBinary(bytes) + case ResendManifest => resendFromBinary(bytes) + case RegisterConsumerManifest => registerConsumerFromBinary(bytes) + case DurableQueueMessageSentManifest => durableQueueMessageSentFromBinary(bytes) + case DurableQueueConfirmedManifest => durableQueueConfirmedFromBinary(bytes) + case DurableQueueStateManifest => durableQueueStateFromBinary(bytes) + case DurableQueueCleanupManifest => durableQueueCleanupFromBinary(bytes) + case _ => + throw new NotSerializableException( + s"Unimplemented deserialization of message with manifest [$manifest] in [${getClass.getName}]") + } + + private def sequencedMessageFromBinary(bytes: Array[Byte]): AnyRef = { + val seqMsg = ReliableDelivery.SequencedMessage.parseFrom(bytes) + val wrappedMsg = payloadSupport.deserializePayload(seqMsg.getMessage) + ConsumerController.SequencedMessage( + seqMsg.getProducerId, + seqMsg.getSeqNr, + wrappedMsg, + seqMsg.getFirst, + seqMsg.getAck)(resolver.resolveActorRef(seqMsg.getProducerControllerRef)) + } + + private def ackFromBinary(bytes: Array[Byte]): AnyRef = { + val ack = ReliableDelivery.Ack.parseFrom(bytes) + ProducerControllerImpl.Ack(ack.getConfirmedSeqNr) + } + + private def requestFromBinary(bytes: Array[Byte]): AnyRef = { + val req = ReliableDelivery.Request.parseFrom(bytes) + ProducerControllerImpl.Request( + req.getConfirmedSeqNr, + req.getRequestUpToSeqNr, + req.getSupportResend, + req.getViaTimeout) + } + + private def resendFromBinary(bytes: Array[Byte]): AnyRef = { + val resend = ReliableDelivery.Resend.parseFrom(bytes) + ProducerControllerImpl.Resend(resend.getFromSeqNr) + } + + private def registerConsumerFromBinary(bytes: Array[Byte]): AnyRef = { + val reg = ReliableDelivery.RegisterConsumer.parseFrom(bytes) + ProducerController.RegisterConsumer( + resolver.resolveActorRef[ConsumerController.Command[Any]](reg.getConsumerControllerRef)) + } + + private def durableQueueMessageSentFromBinary(bytes: Array[Byte]): AnyRef = { + val sent = ReliableDelivery.MessageSent.parseFrom(bytes) + durableQueueMessageSentFromProto(sent) + } + + private def durableQueueMessageSentFromProto( + sent: ReliableDelivery.MessageSent): DurableProducerQueue.MessageSent[Any] = { + val wrappedMsg = payloadSupport.deserializePayload(sent.getMessage) + DurableProducerQueue.MessageSent(sent.getSeqNr, wrappedMsg, sent.getAck, sent.getQualifier, sent.getTimestamp) + } + + private def durableQueueConfirmedFromBinary(bytes: Array[Byte]): AnyRef = { + val confirmed = ReliableDelivery.Confirmed.parseFrom(bytes) + DurableProducerQueue.Confirmed(confirmed.getSeqNr, confirmed.getQualifier, confirmed.getTimestamp) + } + + private def durableQueueStateFromBinary(bytes: Array[Byte]): AnyRef = { + val state = ReliableDelivery.State.parseFrom(bytes) + DurableProducerQueue.State( + state.getCurrentSeqNr, + state.getHighestConfirmedSeqNr, + state.getConfirmedList.asScala + .map(confirmed => confirmed.getQualifier -> (confirmed.getSeqNr -> confirmed.getTimestamp)) + .toMap, + state.getUnconfirmedList.asScala.toVector.map(durableQueueMessageSentFromProto)) + } + + private def durableQueueCleanupFromBinary(bytes: Array[Byte]): AnyRef = { + val cleanup = ReliableDelivery.Cleanup.parseFrom(bytes) + DurableProducerQueue.Cleanup(cleanup.getQualifiersList.iterator.asScala.toSet) + } + +} diff --git a/akka-cluster-typed/src/test/scala/akka/cluster/typed/internal/delivery/ReliableDeliverySerializerSpec.scala b/akka-cluster-typed/src/test/scala/akka/cluster/typed/internal/delivery/ReliableDeliverySerializerSpec.scala new file mode 100644 index 00000000000..4c84b34f7a1 --- /dev/null +++ b/akka-cluster-typed/src/test/scala/akka/cluster/typed/internal/delivery/ReliableDeliverySerializerSpec.scala @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2020 Lightbend Inc. + */ + +package akka.cluster.typed.internal.delivery + +import akka.actor.ExtendedActorSystem +import akka.actor.testkit.typed.scaladsl.LogCapturing +import akka.actor.testkit.typed.scaladsl.ScalaTestWithActorTestKit +import akka.actor.typed.delivery.ConsumerController +import akka.actor.typed.delivery.DurableProducerQueue +import akka.actor.typed.delivery.ProducerController +import akka.actor.typed.delivery.internal.ProducerControllerImpl +import akka.actor.typed.scaladsl.Behaviors +import akka.actor.typed.scaladsl.adapter._ +import akka.serialization.SerializationExtension +import org.scalatest.wordspec.AnyWordSpecLike + +class ReliableDeliverySerializerSpec extends ScalaTestWithActorTestKit with AnyWordSpecLike with LogCapturing { + + private val classicSystem = system.toClassic + private val serializer = new ReliableDeliverySerializer(classicSystem.asInstanceOf[ExtendedActorSystem]) + private val ref = spawn(Behaviors.empty[Any]) + + "ReliableDeliverySerializer" must { + + val timestamp = System.currentTimeMillis() + Seq( + "SequencedMessage-1" -> ConsumerController.SequencedMessage("prod-1", 17L, "msg17", false, false)(ref), + "SequencedMessage-2" -> ConsumerController.SequencedMessage("prod-1", 1L, "msg01", true, true)(ref), + "Ack" -> ProducerControllerImpl.Ack(5L), + "Request" -> ProducerControllerImpl.Request(5L, 25L, true, true), + "Resend" -> ProducerControllerImpl.Resend(5L), + "RegisterConsumer" -> ProducerController.RegisterConsumer(ref), + "DurableProducerQueue.MessageSent-1" -> DurableProducerQueue.MessageSent(3L, "msg03", false, "", timestamp), + "DurableProducerQueue.MessageSent-2" -> DurableProducerQueue.MessageSent(3L, "msg03", true, "q1", timestamp), + "DurableProducerQueue.Confirmed" -> DurableProducerQueue.Confirmed(3L, "q2", timestamp), + "DurableProducerQueue.State-1" -> DurableProducerQueue.State(3L, 2L, Map.empty, Vector.empty), + "DurableProducerQueue.State-2" -> DurableProducerQueue.State( + 3L, + 2L, + Map("" -> (2L -> timestamp)), + Vector(DurableProducerQueue.MessageSent(3L, "msg03", false, "", timestamp))), + "DurableProducerQueue.State-3" -> DurableProducerQueue.State( + 17L, + 12L, + Map( + "q1" -> (5L -> timestamp), + "q2" -> (7L -> timestamp), + "q3" -> (12L -> timestamp), + "q4" -> (14L -> timestamp)), + Vector( + DurableProducerQueue.MessageSent(15L, "msg15", true, "q4", timestamp), + DurableProducerQueue.MessageSent(16L, "msg16", true, "q4", timestamp))), + "DurableProducerQueue.Cleanup" -> DurableProducerQueue.Cleanup(Set("q1", "q2", "q3"))).foreach { + case (scenario, item) => + s"resolve serializer for $scenario" in { + val serializer = SerializationExtension(classicSystem) + serializer.serializerFor(item.getClass).getClass should be(classOf[ReliableDeliverySerializer]) + } + + s"serialize and de-serialize $scenario" in { + verifySerialization(item) + } + } + } + + def verifySerialization(msg: AnyRef): Unit = { + serializer.fromBinary(serializer.toBinary(msg), serializer.manifest(msg)) should be(msg) + } + +} diff --git a/akka-docs/src/main/paradox/common/may-change.md b/akka-docs/src/main/paradox/common/may-change.md index 0c39c1b5c08..1930f3dfe9e 100644 --- a/akka-docs/src/main/paradox/common/may-change.md +++ b/akka-docs/src/main/paradox/common/may-change.md @@ -29,6 +29,7 @@ that the module or API wasn't useful. These are the current complete modules marked as **may change**: * @ref:[Multi Node Testing](../multi-node-testing.md) +* @ref:[Reliable Delivery](../typed/reliable-delivery.md) * @ref:[Sharded Daemon Process](../typed/cluster-sharded-daemon-process.md) diff --git a/akka-docs/src/main/paradox/general/message-delivery-reliability.md b/akka-docs/src/main/paradox/general/message-delivery-reliability.md index c2ab616627d..5e548161575 100644 --- a/akka-docs/src/main/paradox/general/message-delivery-reliability.md +++ b/akka-docs/src/main/paradox/general/message-delivery-reliability.md @@ -281,8 +281,7 @@ The third becomes necessary by virtue of the acknowledgements not being guarante to arrive either. An ACK-RETRY protocol with business-level acknowledgements and de-duplication using identifiers is -supported by the @ref:[At-Least-Once Delivery](../persistence.md#at-least-once-delivery) of the Classic Akka Persistence module. -Corresponding functionality for typed has not yet been implemented (see [issue #20984](https://github.com/akka/akka/issues/20984)). +supported by the @ref:[Reliable Delivery](../typed/reliable-delivery.md) feature. Another way of implementing the third part would be to make processing the messages idempotent on the level of the business logic. diff --git a/akka-docs/src/main/paradox/includes/cluster.md b/akka-docs/src/main/paradox/includes/cluster.md index 4bf9c71ef58..242b956d879 100644 --- a/akka-docs/src/main/paradox/includes/cluster.md +++ b/akka-docs/src/main/paradox/includes/cluster.md @@ -41,6 +41,13 @@ so that one Cluster can span multiple data centers and still be tolerant to netw + +### Reliable Delivery + +Reliable delivery and flow control of messages between actors in the Cluster. + + + @@@ warning diff --git a/akka-docs/src/main/paradox/typed/cluster-sharding-concepts.md b/akka-docs/src/main/paradox/typed/cluster-sharding-concepts.md index 80825e94fa1..cd60986faa7 100644 --- a/akka-docs/src/main/paradox/typed/cluster-sharding-concepts.md +++ b/akka-docs/src/main/paradox/typed/cluster-sharding-concepts.md @@ -115,11 +115,10 @@ actor the order of the messages is preserved. As long as the buffer limit is not messages are delivered on a best effort basis, with at-most once delivery semantics, in the same way as ordinary message sending. -#### AtLeastOnceDelivery +### Reliable delivery -Reliable end-to-end messaging, with at-least-once semantics can be added by using -`AtLeastOnceDelivery` with @ref:[Classic Persistence](../persistence.md#at-least-once-delivery), -and see @github[#20984](#20984) AtLeastOnceDelivery, including redelivery with a backoff. +Reliable end-to-end messaging, with at-least-once semantics can be added by using the +@ref:[Reliable Delivery](reliable-delivery.md#sharding) feature. ### Overhead diff --git a/akka-docs/src/main/paradox/typed/cluster.md b/akka-docs/src/main/paradox/typed/cluster.md index 76a223a9630..c17bf83d154 100644 --- a/akka-docs/src/main/paradox/typed/cluster.md +++ b/akka-docs/src/main/paradox/typed/cluster.md @@ -444,6 +444,9 @@ See @ref:[Distributed Data](distributed-data.md). @@include[cluster.md](../includes/cluster.md) { #cluster-multidc } See @ref:[Cluster Multi-DC](cluster-dc.md). +@@include[cluster.md](../includes/cluster.md) { #reliable-delivery } +See @ref:[Reliable Delivery](reliable-delivery.md) + ## Example project @java[@extref[Cluster example project](samples:akka-samples-cluster-java)] diff --git a/akka-docs/src/main/paradox/typed/images/delivery-p2p-1.png b/akka-docs/src/main/paradox/typed/images/delivery-p2p-1.png new file mode 100644 index 0000000000000000000000000000000000000000..aec7d9fb0bf1518d08d06347f9df217a4f55b2fd GIT binary patch literal 82158 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�)wvjk%{RNy#=`uA5L}BS=zn$ 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 literal 0 HcmV?d00001 diff --git a/akka-docs/src/main/paradox/typed/images/delivery-sharding-1.png b/akka-docs/src/main/paradox/typed/images/delivery-sharding-1.png new file mode 100644 index 0000000000000000000000000000000000000000..0a5b26ee21da1245abecaea28a419a59130b91bb GIT binary patch literal 127161 zcmeFZWmr_}8Zb;tNJyz5DIwh;4N}rQbV&{^-KijmNXL+p(hbre-5o;<0@BhA?;6kE zTRdmKKfdewe!l#eYglX6^W4wfxk8i_q%hHm(Ba_VFr{CLtH8k_6~e(G$fBYES9-az zq~YM;jlg1JN>*Z0Vs_Sc4yyJ>#-`$6M|*1{cO?!uxMz{ZhK4HAjL*7_j0_FC2N>wk z9b8r3y$e$@^zClJdedieuj1YY%>EvOkRTLJxi)Ld24Rr)Pc zuX27)ye|eiiq(3{eZdq_i0@SsR*e9-X{1b&@p}R|2F1;g0k=u z1?3xth~P*ExKq;5U6Pa*1!dCn_SP2!AS$iD<)`b{+uP=c*SEK>Y)XeDC_#wsa0C>l zyIfr(mjJT0z-pRKn(}gd#&$N$MkaQzOqtzm>;YoH!3ntW0bgxQos7ucY^-e^`P>94 zfBk|F_zt_wLP`GXCr(y^l$!ENdNfO!EEPX&cepa%ge&b&ce>l1pI=@(cRX`$c@R?@#%jS`FkC4Q%7S5 zu)P!5&XyduuF)$yXD2~QO4vsK{QU<`C$QP?oopTdIu>w17T6sYHfC0qf7S*b6@Xpk zQ*;2E0z1Rj7h)6m^~*o5{k4w(3vBZ{!2IW=zpesD6+#za`3G%6=yG3awcy}H;H1Sx z)!g8>=kFz}O&quES2R8(oYwQ$BN4|@#!+i0tshB9$e@8FB(zg?QgueX!u79s$Us#~gzuhA@M8hdv4*r*?$Z?bqkO~ntU$Z_!!V!Uk|E~`O&=tzR zTt-5W@$*v`5yV0X{9i!GMOs1^|K+luhzI}$`sc1z!+%>6Rdb*Ce*r+kL45{~0D?b$ z{^EY0f4M9|o{og7i9Ehy$og+f zA{Cxt{u^?UV&LEl{5+oANBM8;0m$_8BWV7Y%W(dFxa5WeN*@DT|7}TtSUmraSpVUY z|G$YP;wJJT=)bUjj5FQnnr33M9sl#EeWKgu7mwt}Zo#|r@pPW2rtjXo>Ha>ZfY|`g zP6<#n9T^!_vx=NM{>2>@@~=Zv1A$~Le)Q13VbrQtSxC8zZ0~HZJolTJV$kR-ggP>% zL*N-)wG#V%P7!+sdtx!nQ=bZYIu#I8Nl^f#wowBFirCx!KJjmE@i)XBhMNc&de{?H zqS1SU7)&MHEK=vXMR|R36eWsy(f3_CcaqMJK#peN^k8CimEChNcrxdy)ZzCU*M;52 zq#=NdMTTKAS0~kr3ESl_wjQoV!Xg=rYZgB6jjFvhtnw#IqKv0YW7cI%^Qu$wISbr- z8Gkfx*;N_O0?tbjtl7MVRzzaMR*QhGR(`K{=ML8n$00f8&kEmO8!%`R7;P$jcqAk) z`SA&jx5sfzKjJ;p_2S0zpM51JmxJ>MUBb6wH|I-@xFiGZuv{ zH6)3i5& z$OR2j^R=o{wU>iw9(D)kPhNp0t+tAoCDvvy1lfIHR4)dA+NAGzeFrA;;qM6Ax{Y+& zUlJ8Q7xl}r>DGD07A}@*aof!^zkXddTI0%6yLs@Qib7~%FIz@dw&>7hXThAk>7?gd zq4fy4cG`mA>ganjnTCz7yvF0*%c%HxyP~;V|Ei){*Iu2y29`^9_H5NI{PS}~+sO8I zq@lbHYU+dit0B|A>Xh=SC(*W+s+d0(r3Ta38Yj2QRN`gz-LGv5(t4t4y8V2-1-v)! z7428C7&j*yv5#IP^;ZUbeW7KEK3%f-r30b>g@&1Sr^6q7cyBHvE-qf>*w~Cu@USl# zTPUu`%k7rQz@&9~!&DROJG(1qNC#{fnxQ~-?1_ez`JMTZiZzrJ8y zAHb?H-Ex$QMgL6ExlV9m!5?@)P;QyjiW-g@?qH_jN_5%%Cht2|3;J5kP8=9^=% zdZcMj5*2N0bk-8#Mm_h2I7Cx3EH9n7n&fq=d!`sbeI>p=NpxqaAe&~N^Me9Yno>v2 z&TvvX-dd^e{`bftLqpNGp2znwp`p86j!Q^r zws+8AH(e<~>U{;Kd-kld8k{bVvF!PAO2|#*wh5`w`u@TLk#sGAEs^){415Pn59Va;G+UD&>bt8hr0^>aCi>*arFjHVxy$Dk6scnN z{=jeG_dUt9eA^@S@d>l*^|zsNbAuoY)?Bj|dTwq>PSi}OI9Ej+XS6h;f?dOLD#6jH zb!O$bLU^0o%Fby&{?|bo&y9!S#y&lA>tlwoD9cV^MEK=NW}pqVCMkKB1T!73oSlV= zp}LR!{c7TN{7h!Pvm~z4A&D2CvA7UHeDcb<=J{=kcGv!&-&cSB{IYg;vybYjV{fMRy)VgbD3a{< zs^;KKbx5l!M!^MK)aSIg=c~@7nZ0h&0{(hdHo3vqF_c=oKA&a=nz#>wUgpXP4cu5* zDww(n@q2&SS=$3);6l4BaKJs~1d~%>RT>Qp5VVU5k{2k3f?e9oeb#6d?{vOX;-1AZv9$LxeSbw#$3UZGeyK6>m#wHki!hq7u5=2! zdkANOM;w-K!X9y}5we_X3nkRF^uD8KVTosH(xrb-$P)e7T(OGXJK2(DgNssbEy`6g z^3+*XC90@IU0vN_9I41DUq??nJ8^WKyr2fZLI?Cfw!TO1Qv@i@`n8?( z!>N(4Mc7ZsNI+XKUVj zT~R^<#d_21Vf0YXaS_SH_>`rbZ(T+PO5qE!7pvDF*K}BRSU5S=04t}*T>sr`%h9;F zwH83Rh#ugHO{j;i+zltvdyo$fF{p%ucC-8=LJ!clW?a7g%pvLy8qg^$c9PL`L@KCs z`WaRUJ|yBiW4G;piH5;{k{eGL2^!}4!MO08#_tPaxRB|OTfb}tPn*J~{eW+e#Zh21xoHV&@pft@F^VbKdXlvGs zWqtV1h2!Mam6a*p$1}$_UmxBU#v*XlTV7~ICpp>A*X8J37im}MZ!iC-6YWYLTlVq2 zU6k7??3L70-7=C-6zJJBu0^{qc=@#;)pPs<;0Qxn<`Ja9d47aHcgN`@QZE+!RFssSl{DN`Q$Kh>$}BA%0-97eT`e<= zBxJtb$8M%Y+uxVZcfP3|lL!RVhWf$#`kQAkFE=6K5r?x~@RxbhjDlr?1Uc5Cw21_l z+PvE=2GU(&dnFXhg z2F6=vcfa(>8OyOr{7{rb3}fSJio(UqD%npI00$h`wmw`DhxvI}Fh9?)o#L)Y4+|iy zbcM(HUtjbBhEDr9g`NFWR?EE>Fw)u&$Mc-bA41CH6+ATMg?-TRAv^`(IJXkKM z$SVE((&Y)ZoU^oItSs|$MLG^!3f%*djQ$graYex^B-gQBY8@ zTNnxhPftPeT+50GOGo*19_rZ_H=L~TPg;iE!#3qr*_uAqy57|gt_siyzgPAE=8Ylv z;~X|qsd0%4JNe($-Kd<}EjuoKyN!=Qo$6D}V95UCqnx7hd=(&k zz%8QAff~(J+FuDaU%x$0^o41j0Sb{Ib;r-6w0Gr%^CdYud$~GjFCKr+1hPpx7V+F}E#Yd=IOvqHINgdR59aHPgh*Jhfm^b=!0>%nHLikW93V zJMkI}Y4r#$6qktiutS=zs^nBzZ^l>%b?Ox#^Y<CIGhxy_|Q^VG26WWQr>&-q%m^A}jc zN5l~wcuqm@Lh_Ge%tW*l&wHA#LY$+LJk<^`(5cucS_{Xgl}F_V^4T(jWU2h~xsNy> z(<9jE09csy@d+aZ4lnY@A~>jg@H8a%=AW(x{r4RaIR9!Uk(PWLVPVOSf3VgsLxYq8 zSip48tT~*!1pki>8m@)~$~)^_KOX$ocEF0=D>-6;Amz-Fp}MXRr`9tr;M zqBu^l;BYt6LF^Bz{DMqmmXO?VqB@N%6Gp!OI!S;6xxkOzcmKVg#Y2Q(Ec2e~9sVNE z6jq-?AP`ck-#aGe=^M#(AEn^c3c@5&vmrCU5g{)Hj)Q!1Xyo*J=N*ys{Ct@gFJ8>F zrZ~L6K{~@ci_Y`D%o&*d-aOP~LBeVIoi)vGg5Oan3Nxv?`<;;(V6YT=^pOx00AjQV z;-dWa7lE)BLQwvFE4JKfiWFMwS@L~#Rd!LR(PYWbhu!4}^|8qUxRt52PvDfGV5%3e zr4qvRbIcoyB_EHsX_MI{fy4mO9NZiUfHQksAUdOkf5meLfAVytKl`W;wlPXV`d0HN zcj9dL#SQivg%z0_e+twt6F-!(ct&krK!MyE-`gwWZoVtUZgrwNGPGcG9W;M! z4Uq5EzLGetr?S!;Wgh3B1kWB`gdz|c3JV#pa@(c%ldtRx!ddZ_t8>uhx)mi3; z`+739UGt@Xtp7ucR(fyrw{Im{_gTMS067OYSlaUT-6Qh9QQ;?|^KiHy!n5czRQEv? z@v=v+`6}ei+qb+6lQBKHAx##o)DiAW>0S+npPW@MyzFikYM$6B<@)RUY#@hUA{ZGP zJ%BF|al;CO_dfx0toechrn@lh{~zH>S4ZYF&RKFZ>s61}+vd?!pAs$BYgTU3FYAOz zCfMaz9B+@vUmR~Rt)~h~EWa`)sUOMHwQJB{A_Hb#rDv!?_LbR-kx%C<^s=N72R`gO?f zVUtvE+5_m;JK61H6`ieJyAq5_PBziCjbZMbvgI=c?KstCDSVvR^Y%E6X+^wDTAciD zRuY?yLBV)-B@4CnsR%AF&(?`|I!xN6;}}Y$2?;?vVHMni^45YHYun!-F|>SMnOGb& z$7qg1z#AX?dVXT})e)Bru!Z_C@1>)o^|y*b9XBw99;i=B^ARW+VA^EoC|$lU>1X%V zWXYd=d$V8I`WRF4>gVMmVXmKQSl6bOhX$dn7+uPXDEZ1Z*R60r7Wmw3o<@4w zvA>krxF4<9Tq+C^u~4h>n>dKIG8v1r0g|--o&kp`dH^JTtMAdcBVw>f>6_dIikBzC4 z8Vj0HjU3d|U@~7z1j!ABcnAloI3iHEIS zlh=aQ+hjLeWZ9W?aeL#ON?AgX5UvSMOsZWJn0$pJ<2fR={cz|iZZB&jC(*itppAys05(C>cbvgg>YY27j z#YMyNWp<;?)(q)xBpZ*JCw z)e0`noQJ!8Ekrg$a?@%&5;^zr88Y+Vqx}Fc?G8X4`FKaLx(1vB`k5)Or4z`yVp{hfsz7qw-n(L^8X%T}j_1ZnR*g zYE30L-EggTOdxmTsOU8fj{R-m$9HC2f`?ZO8IPrIHcd9v8i||Sv(=YocTE8I8~5>J zI+limoLIdKC|g@_s^%x#Dzr_DQU-1sN!yFvV^DkYdFwLbbBJqq<|0~?Q1$NO7Bxd;;O`J=g#+Y|RLJ66ttRLxlD9uq{e{H=(Woj+`vcQGr_#ipCe2eKuL75dwtk)pPX_}`VUJWaLbR*LwNNAnHF~Z z&{&~NRh^a6o}PLOiyW;S{F=w_XYKOh_Op#ic)i}uoyG?bs13Xr+3;xoavdB#UpH?$ z>D0*Y<5fXWT8TZ{FA(3eJcf*LbZ!-th$3F~fz^9UHc-o@Wpi#r_3EZ`TWHbKHR1V=n;m}$q7_9Qa9{;_M(oZo2F!l_7*TVPdnBXFSxG{*~VVV*=uOnBwv1`byzih=zcOwcC;8`F7Fb@9A&>! zQ(VS#2>2%Q+?2GDx11uK+-ZA2P~HF3SEIawciMf1Z%;oU0ggjh_j%v>|8LBm*mtMPZA9Fls% z%LCO9ra9ut3mRT7~B>VP@wRIGy$00=JGMc@f&V-39{`DTAMP`l$Qz z<++Y_Y3bNTAmLgZn%P|zagp<*D#UT_s!DE*Vse*dMlhanLY6OT zn^4b z!aqUACZ*xj&WJJB`z#8kE;+hNL?)t`{V6~`za^sNs9s%h`HszS{xH4g>F^PRy{!qA z%MnYVIX!YLdHGs8q z7h9ZEo#qD%t-9@6W;v!zgt)3V@CPAP&D%m;R)fV{+$-A^+XF&-3#awo>&$7_nDeE_ zXBA|^wqc8OAH3z)AlxaFI{NzG-120Z6TU^Oue*^G1GNWz1kB44(?;gjyJo-A0DkYq z2t+xfpmw6hGy&}6GB)$FifiCxczNcM{dCGDVMS=**~l_fTcf+aw3gJXcUl=l;lk8V z)G_az-8801Y*)0D1D`T!$tSUI!ZgW%lPyZS7x#Kjx}t>8r?%ZwqiU%7J<2v;g8Hsy zHC9*d;KW?J?gS$}KHbQdMfaK#x9QyC`0`NalK(&s7J>hfYnUmp7Z+-5Wm=?oTY%zwO|A(NjO@3d zSdUL2-oxCcwQJy#Iyg8iQXh57uJq5DK6jqdWk!^nPpclUe0Tn-4LTXYg`?p}Adu@h z;sH9g(Qco$)q+AX(KVsX@R-RRT^%#?yiHqnB8Z@YePa6tLqwh#Rcci}r|00HsD-gq z@5k~kiV(1dinis4IZx;28QW}%p{D8^SSF$h1E(~9KDhBWYNt7<-D-EYsAE@egph+99p~>E1W1cU* zmaT6%)E4D|Z$PVKj*3?(3Rkwt7uGvAX!~8A8u1(1sh)hh!_#G59i7@^0$h%p#19AX znV$QWuc-xZnXH$R!6Okd0};qKm*kK;0aXeTEWX&{v8@K>)vxu+3Nn;TY?wGIeYDjR z4Bo8#TCA_7lS%n)m{b7%kOiwjl+1gc^kjY%wkhH}Z69Ol{v6pR9tc0v zV5NX;=@P0iH0GCt60psuC%=;eFIiL)o8&3J#&o93{M^o?Di(dqLGY3%9X>93PB*W} z&sX*eWs`j^n#A~4vMSy8^=lv?;ZxijUsMP$8#CiiF5HXWnes4(RAt`^fo}(nw-vdu zPM-St`ND@5U)C65-!Y@|l=c&*54Em;kaao=oqbvGcHwf)+g=*#ov^x2Eg4I8Nra24 z&beq?*y{-28;0l#*YD75B`K86R$q%NZv%e%(1!ata_Z0mS#Mu&V{`S{`fgXCKQXt> ze%|avOkkNWqLe(v;n2hLlGxQfh>N|{=@z=*4TKPvg^|A8g(nLX*X*;ivrs@Dm$*Kk zuqN0v<1#Q0U@2Mh(dc{x>Tk>}y0w)WBkAQU$ zzi%@A>#e?*JdlPp1-#*S0>e?A$)yj3*Ec(YzLBu1O*9ZxFs-c5Ff>!3inAnp^U2t!U+(g9VvjTelek80OS&tw6~zYP zJyv4JGUUVbyu^5t`?T$RvQqR~S6|;qK63oB)CzCoWYPi_|G~;<%-1KLWZevQ{U-u= zo&ws8w}8iQF|Nrawi{$s5`&5-=TxhEa4MA=p#@~0od>qJNtvQ5i3z#`qXxkuXvHlf$GkoxBazT(jcY(w>>4BCFz`as!ng!J)2u2nPl} zRs9ed=&+BoW!^$`_4PgMp0t~j&)+>wm%$N7t--fU^)7o=;kElZ8t+l;8g*o3%Ga%o zzLj0rq++fGHZBhG9WL-#wks);Yo+bgJFcIbXm4NUdq&w%vT`1+L4N26YE>h`yff_}+>!P2L__##0$v z+1bond_WT7bydJmBHica7x?adCf61syANIG88*Oq4&TqvZ7d!3=3RUBPOqTo%bY!i z#KR#9Q)Akad=tBkr|Ugeip>!~u}Y_v8#Bvd_(h;h85^5J2M@D#3qg1ayPJ}4?cS+t zZ|3c3B|&=P@t|(>11=3tF(v`VIgVJxkEDVQU*!NS*7N82LeOlsU zY3krrWnF7xLR!ksvu&uZaVWL_L%B@?@mXYKq>wh`!NJmXb47VYW${Oph@)&KIyU9v zrsY>0&ZXd71k1$~zMO7@y~`r5Smj*KnO2hdTqa&#>EhZeT;7!9qr z+W%a!b~+TyIsZBHiy5 zI-wh7Xqj>}rz=e+fvfMy!Hw3FCMcv_&6oI^nO1MaXbUP_mL{R7JA0kP=z8++0q*V< z0tHQDP5wDc8^Ldf7fAf%_)Wf= zi$HX~DtQh?6@FKT`^9b_bJI(QiAv1c?z3_=a#k=ZB|$8g#B&$HE#eyIR>e65D?9A| zqyv%%)1UG2y3N_IdCe12|h?OJ%N(W1Ek?z4Rj+ z5a)B(7Zn9g9z|v{d13?C0l42Dq31Z^QrZD8*Uei(k$Ejbz}Ph&^gdoi6)jBlc?dNT$O`zhky% z4Rh;j<2hsi^TVMq@;ykCefqZ>4|`(=ADK^w95vY1g0S=hQ@vKH)!% zf2pgR+}_nu9m2-(63BcA0}IRyRjeu8tuLjgA^<*8#9IUANTAf%4b;$hQ&Zv~o6yv_ znVv)FWgB4LpHXKs*Y4)qz3d97Td3DQa+HvGyFFd2Bc%65lhC_Ljh>!<^+1+6qK~C9 zU81YC1CTWTXrS|vFA?YRkGN13cZ)6{uiV{=swQurh8_Wfs=9$@<) zfa@F+9xlas+u0!-5A!Xkm^t1?!iwfdb%0tG@qH17{ZA4fNaJbCrItT43;%}n~y zmlqooquolM>&;XwdNwTn0PATe*O(rQSb*XAo7JJ7sIN6#FWZBP>9Ow8SPLQ+pfogG+peIPp+ z-`(A9>D_SJ+NEL=psrK1S6RI`)2NZ^{Y`y{Z6@ucK>pI(d$N9VosNclyv9{=>(GTG z#eSd;)8U6w+_By*8^AU|7sue?^=2PSWEC-YPtJf2H6`VX;`$4AG&HpR?UM6vRa$$R zZ%4brh$u3punKCEew}I<&?o2+sh$u2#D{=)oQzNhnfFcg5d{_NYwVzK07;Xt-}+1@ zW{wXUiHncX_=>ceN6?k1X=$ac<-!C23z{z<*w-USIV&e(S;V`$Q11&y4%^0PxahRb z%g--w?)}uJb+8|R=TAFtey>nQp6&SKL&nN*63+BATEi-%6|+Px&*EI{>z@<*9-1ee zvMd5a+MkAm3=r+b?qOHDYIrXCE=4qOtUtAy{Vt7{zq5h?P!Pu&VCjIJ5C`Eqf`k<5 zS8VBeYd{w1{Wy`P6pwb1vtawfBcH<3bH3=rqpy8-y|C6;tezf+0fPAF3+Lq}8i^u9 z!MJ!NPuGVMn6;_qR~`E1fIb@d0$BfS%aoRR>Mrjs;2{_xfLr>P+B~(kvE|6J=`u+v zW6Eppq`PkAbGZYU3dG zAZ4qB+rM~I7615+DML7N;dVcBn!+?p{UAk(Sm4ZK)CByt1aJtVR7$!kly;u z@gShbt|m|QXV85ja^?zzRFt4(ZOe6qgUiJ^WuSMjO9BE>Ug-?0Q~V^f~ipKe!lI$pHzGjTIB!>YcOae(+wMy=P~AvL*DfuBOQW3BEa8(!DP zV^8a}6^TJ?l0g>%8fNB6He+dQ1>V%x&fhIkS8AE6*x1-a6@Y$)x?}~6Lg@B}A5bKH z-9Mb~F0cq_DgSEbmYA068>Gj=cXWd&eMDsKVqHc18#k@m9FJD#J)J>8hw+R2w6Nf&EXa z=YS&J54xr%i=HW%fhe3ES&A(-`&?vposYf7gi|!KIzGtBfW|lR)qyY02Bx&qVJ+yD zv|rus`adnW?>>I4SiqADngH4@Zlu+5@o*J9;ttj?m?T z)Q5KG+p!FhE81elXnVIR7GlHt5i__NJWhVlFldlrXvzbPTSGbfzZXJN4Wc`PQTa0OL2voxKUtUS9o zd!1P%M#!RP8#-8Tx{_0r0oA}$B+;17+ZF@NMS#pwyDx9xX7!iH|11q`VzGswSD)2W zN)cE%>jssJW?-fR@9W4Y$W#{BI-aJY7|ia9@lV%oeZQ7VV~5sFMwv30%m>M5h!#@> z-g_DRJqzWdKi)4U0$Td=iv-y^-~W~j5q{jWUCb#NH@7cO1R=DiH|G>qkYphC{B-;_ zXJHJe1UK^VK-ZZ!z#xM<+;0#RGxuyrovKUDWH~`WR%z+y$$jwt@loZV!*d25vw>7A z5*lbfsz)=Ly7^MC`Xrvsb7F4&r z*{%7$v2IWupx%7mmL|?oQs=z$ihy`AzSbZ#G*kkkB8?Ad?vNDcq#NKJ8-kV7DlV?J z#BSqA=j*knWZsqNP`C*yf1J=(ecz-_18a=b+4~|J1PRL%3$FMs#WVlxTAs~$FK6s_ zkX;J|^h#;K-N(R)R#kkw;{CEwnC03d8)%i{2wxvaJ^b{e&vr`x7*ny;)sy&_Ns`3? z8f!$cS!Eh0eA%*-rg+v}UQn~0gIvyp1t{Wd#gKn?UCl@8J|FmOP%VZHZ^u;zMWVE{@* z^%=7Zsmow+ZU#>3=*nJ2LNB0ElD@8axP1z^L`Eg#w}|btEU`=Ifk<@-1W{yjFC8TR$bz?#!lu;O;yZ<;$!1w zYu!@{H#nPr{$xEw2OP1NAz|-WktZ^#C@JS42yW$vP*^KhB`u(*cQ(L|CBV6W|Nrx$ zWarP0mq1U?%%*xGlT|tH%;=fF(0C>+T2TUYickUNzgNb_g?@3jnNS#UDzRaUtnfO< z|FH-*{6GRdBV)NfM0z5MiJo3%d1a+g9ii>(SM7sQT?~LqsE=S);_%rc)W3Iz!BAQ4 zM<_JZHx&OWTA2V<9#KO&1Z{G>Rpb%2F-&i2!^RF}r5#EBp)zbGP5!UWXOFxwm-DAcpnl{9a<(OCB;*TF$iOq8QAn5 z_wkoUjCbMS%=Vki>IHb5K)J-KnHeu)Mo)>R9;1({pmMH(o~l0UMd-lEjP?uh&rYFO z(SvKTmipeflv(Cp;*AJe+UxXy7fd%psyv(hs{ygn9XPAa%>#!&MirF|{DHX@2BmE0 z{LNAJ_q`_0;j-0h_0*ZAy7XHPDkR}(JklDCa>JHNDp_H>_@)6`-<+SzQqj?k^nMu) z*nw5N$RELa(pFSgQ~&0A82`7Fh$t(UnV7D>G&S8Z%6(dle$H2*23m{hrHB@tz%7!} z{Svl?&y<^>k=)arU-ULOSayAoggOWuP{mdTsHmCGFqB*@J-S;{MjclaK~w`;P$qkQ zt5V$4zvvQfvs5Ff=isXsaDGsim-`Tzr}v7QI{zdVA)0G8U#$Gi8_otvP{AD4LkR%S zmOwzRj)7Hw7f|x&NI(zBcR*o{xccrWN!K>i)F^R30lR&3_Vwm*s$bItcTOM+4p{m} z-XLlKE$LB^8Lh8vS7c+uZ1%8L>|r8U3@Mgk^@l{fM~jI`pz{u{xKe;;EczVd{ryxT!N###0J)@sV*SOg=T1LZp8(c@lR>#L94CWXAQ=q&;|GxfEldB*Z>lsg;+8$)X*Wd}`>lu>aStrO+Kj~}s zMyo>Od3q+(ShJjaot>R1N8YT@f#=h?0Y0kQDE-5X%w&n!wB{F%I=I_fHJLz`H*IP$ zid-MaVB}MY?@V26Hw!qr*1$~#gcB$ zyQ^rO1FDM8{p-AO@$ovUR0a6~#za{|nB~Ah17I^JN)JUX1#1`+At(djkP8uX z{_Y+HmUqS-&hvvpd4;+_3FH%wvj+iYTq0@2g{ES0Xyc8RIU;;jh1=Ffmg&*=X93kQ z44ZYH!7~D;8(^CEFYRycuggJDn(>t<$zrhS1yn;#f88fwr^Q)nuKb5#*^tdfrF0I; zMQJI36a*yz3OFJBpg*9XeK@>fbB?77&yz^Gl}7T6*ZrQTPdmRSx@oi6@NV~r03FL| zkt4zPC$L$HN;a5c-1cYFy(1ks&uP-%PFiu-&-%gR4s0*^v;D;;hbfb zA~U6Cv(b1y0G_%O0K%+0C=CBMUEqEY?a9_5-ne9<(-*`A=rx2xrh zeN)o!$Kzwqi}R-yG{49LY=Q_&BejUVdiMt+^jhe|p3UMD8C$5WR$14g_^z^K_xdu*sLd9#tuD;Q#ww002_M5t!rqOf+h}P8#jdi?%qQYdibD z2xMQRh|ti~G_lmGTKsx65qk!(s6T9SW;hjfhr z#ekGPQYCl-KP7as<|&~q0RV?4j1Iz2g8pFj31lFP1+|?O zoVFmen0SqMgt{eA(Dw)mwXya^SIpfB>y8dHKI$<9tMZ?KBGrZ|F$Q5c=06(Jo$;PA z@28yPc1)fUmXGSqBS~;Sc^%R>UU6U>YX(Ul%YVPn_4C*4Di~loCZ@sT-wGLkMihY> z3%-EML}Q|FRFAHFJ44idB8R9kaTf~avvCHK0uM2k z^=o*?%jjR1V!lGK1@zC1AIysWjCe%(H+KLC+tC9wnJzuOoJWL40jG1k3jt2)0cGA; z7YUXbb9@pX$a!>y9NLvZ&VPW|iojg6$5|bg;qW@?Lbmb(?FoHe#EXhoh68IZ zm&N3ohmV?I7K{ma^+A4iRxQ?@eNj0zTXs$cvSw6&)EBirv@oaLbuM*ew>4*+V+LIG z2mn+#k4N{B?}||}a&NC!psJSHTM_Lxq~z`7Fycvma~K9bJOuje-NZcpF=zmo{$_;F zSXfSL15}4Q*2%e_qd$kn@;>5E?U#h%4;kjV!m-Ey@kA#;>q|3L(RubEa2fCCRNM(^qxIw8FIOE^ogA&icQ<_adDc;S&XgGjEvj73%YI(an4BfnvolJF>`b%cEA5CFBFIS^P0t1Rxfeuj^YRK?2I#fpCOl#VV&_4pHnx*vWZknC>aXC z9Z>*xhQ$X9er^j(bA%(1WO&`;JF&Y6Bz}Nt6%5p~8;yKq=3eUG zkippG0`*PsB}y)z)TM2KV%pC6^x()hp_)CDZATnp*nL9ay%-ZOhIRjVnFbLv4(Tqj z;f8oierviyYZL0d6%+%%UkM6H*jNk|dF~%oghLE*Ny!UcDyE?O3}i8Uwl87KUTp08 z1g0W6Yk~97&}PHN0{-#wEG+%I-=U^4Us9d@I*$;7k(qx>>VA_;WMtEoSh8IU6Um~BJ^n)vDRReWQki;9v=U9y~0)(ee0s{1dfBu@%Qii|T zTF98wy?>WlM3m_a(-PumlVzJpFF{J)f|tAryvRsfvn*Y(Bgq3J75Q{r8?cb+A7~-+ z<;uR~M8d6@EYhytQ=$(NTnLi@J;dTVJkr7;66+u1%JW_fwesQk- z*npaPwv-I7`)$s3rf$wtO9V@UfFu>cN_h;5p|9_-@9-dUC97Lu+jvzO37Y1_aV}eR zv>lDQu2(W|qY8bWLw0_CL$TiLCoudL0{Df*#t;4xThk#g7cI#glS(DrX8>Uo+Abdz znR|UXdUwdAl4d9;_CkJ5U9&;04(p|JfSfUIm2XRk& z(w=j9d$zyra|?d81q@)Cd1T*Cz>B?jDmT3Of$y=3!VO`%nr~+SO+k1>0~A1y1iyu+%AB0Rn_dppGxDT$ZX7W*3x<=9jQh_CDuPZ>7bZMALrK3&x0|~OIzyQ|s$#SAGHth@A zi{dv^xW?%1R>?EG+8!O39#pin=lCThHdlNStb9BCX8DE>>9|A-M#YAbtP7TB6pUbT z$S~}MK_8Y^O#UD~lRp+{INM__B7AkGDFok;2a6=*#i~kh7)OeVR{VB8WJo<1RWetf ziA~Rr4GLn&dcH!Tx?&mFQ=R|W{n;dM52D$~_d~y}Lr3yhiy^bycUgD8P7jXOu^&>I!>&D&4h*CGa%8T4DSj~(C#fZln z0md*gMx&qIOl@W5+TS&LKvn1wg0`0+J$t1OWtXe1R%Q zsjje3c1H>kLRg|nYmcRuj`;YfWpbQ996ydQ%W~#~s>@F}g&L~$-VfQ?w|a0`d$d$R zv$Cn2$Jl3+FFOqM%vBou<5bik_VHJ)kipg5ow8y@{r(XDrAxJ4de)Z)71CLIajdw? zk9@L-a;@h{D73O}pY3c)fN`FX4`45s*s;Cr@&*xIXhplXNh+5*E6sI1ZYpalTf`41 zAs}dh^M?SUV;Ktb0`I6p3G&>}YULPuQMeDO>B=H;31=$tgn%NcEHIuuH2txT;d|t< z)c4Qzqvi&zHa`f7nQJg*xslhs^{Pa?gRy!BJnFT*8vEriDnU4fjB!8D*m7Q8I^z<~ zS7?>UuKy|?0#&)gS_h3gxI;>A(Xn#r^Ch&Y?#w@m)M*u}_Pa?rS^qwB{!TQOUk|V^=C;1|&h1u#1map15>=jTo{wkb?w;haA0 zYS4&6V0aIka}3VzNzC^IEdrqRA1EG3Ti}^jq=cpCXK3p3?g6S{FI26TigM$A$i@Mp zRozn0ped}dlnxN&>`#$+k9u{y!c}g#Gxo5^q82K1g3*=EeY1m{7W&_l;;Yj zPVoNhl2zcz`_F;t*D>i1Hy&u}VKz0xrs|FAH8L%(a0BPfm{{{qg2_g1C4cXUi_R`h zs0tABy0!_F!W%{M`NL7F#L_G>^AkX#lR}av7*sYB{_(y+ZT~iL8Z^ z4P!*so5~vBj!RdJe^^r7u280Xc?_MdKtDK|gr{iCbtXK#;KwCjbnxc7_SvhB$k=Ef zG=5(yDP;2U^6A7$oA(zebb7bzk5A#ZIfStMosU!KfDR+~l=!XE09D!*c)ymuv2%z_~ zySJnS*s|^PP*OF!+=gQ2RyE=jKyLTDqCwh<)!Ar*d%zpWJNHqw9v~n9?9sORurbsQ zSV1VJ-o`BdxM+-P8n5t_CQhrEoS?L~u{`u>0*N%(YDfax@M~Hjghbu{v<1T0C>0Qm zBdPy!*Pr+!j10$N&2kpF&U7XNvnUyjA#{hwI5}cPyPU^_fR4Qy-_Db~PYdopO+~W# zN2F1z-|m)%k}&kTHo^r-7%1^xPGaB23(b8beMQ#O=FrB^5JP+{p-qzeW zenKpewA+7r`{lHd>HxK9t19N@MQ#`W=!At1C)o z{_|5Il^mUtlIF**_9OjdAdt4};lYm0QCJ9k)$zo(<8dcwDc|M2UmcKA)E8RPW|?qX z#8Gzo(1U&bpX&PPRqMl4Fbca5o;L2R<-^L zAAuAMW^x1j+LgSnU($Ap#BHptD-qx)$1e*|RqEc>Rjlf&M0-X75mxK$ja4N{cDTY5 zU-QW)Gog*{zRhLAY%Klrdl4Jpf^fle!}!tZ!^Qa7bP$t+4MOK6BrHo7o2$8#>1svh zgSASq1sNF#<#=#7eE{DsDS&x}`k{Cnd~Jm{TV5hKo3qkmO_%$*IZKyg?rk`57R~*> z0PZIT41EudDKkAihqO~CpR!!T*dGARi4X%_uK}kU#7In#Fh6A2O^vV0R486LMvDg6jtU!;kha7d;4=#iK^uB~#?9OtC$JhIb0+r)7# z>-)X@4F{KIaj`{3S7mD<7QTwTP}+b{!mN&MnFj1Evs>2Y6{3+{*lTKAYDu`vDx+ee z@LH-*jH@Eg{->N}Fec!%FV)okyU`?Fc*Omzg9%pRhPdKz_%r@NSqoO(yQB8(cd z#|0rEsc}&9n+D5Qha8=MuoFauApXxMM+S=gRH^1}&AF@Y$@^rtjU3s4+l6h#kvWLK zy_X%)5h6uugx0wA>hN~|A;|QZ1I+Z@OQA7vE`PhbVr?M4cEW1nES0yz{?5qj5nNe! z_9f9Es;ow-#aE8(VXpi|0!CuOx3QnD?a;ykHU0kMx^Vuwf?}PR#>7m|PMCxQWMtI` zlK69$a#~`Z(#gaYHtvC&Hq_M4wwQ6&B*?}20O0*3{+PL>_9DkQn^!cbeWdCY&)fqm zf5Y_wTlI-u`*khb1BFvV1m7PmjE$np#ZYtblN+^thiv^N>X@BS}iDpLef z;(yMYruiouj377b+C!#@*SfBdS$3UKvR2q=LkD378^rHuqBE1M0e<#h9A|tSZSb?z zIe?E&vB!W^snAlP747ib+< z%joB!p*Ae4D*p0dw!Etp1)RlOM?Q5n2{c#qCRfqUi1?9z)>@dv;j@1O9GQsw0_%j1qD*)7I zhCF!GR&|JP7OZm1z{4iT9xY>#DUynZZ4P(vtXKc%mIZs|DB=4GZRy)=JAUbzQQ`sQ zQu24&Yo{xYFu?IRC8lSFaAkD-MsUo@Y=Zmp6-xi&>%nReI;F^?VGHAb(tVx)A~Cn8 zW{%e@u8s9POu&8PURtB%lx%f}*=w_6(g+hzmo{e#X@mKyq*n7jL(9Vx*I)?xn+_T= zH?`2)5aaax?>q=&B>jo(xzzMj=;NM3E?~Xo6`at&S_LYg^IR-#={h z8P##}r@!;^*m`OlJqiCn(+~9iQ|AXymy-56;|OAU_ot4RO+DVhA9U{%5?56~B!xj$ zItEWFx87zZZfvShZor?-w4+rZcjank+&_;G4-e|+GM}%Y%fm8wf!ay}6cpWZZ!;|4 z-qa76(xQSt4Zw)@6jJlkuR0mz*;Ra8W$4d%OBtSCHMh*iGP2f_DD_)5)u}BL$rE7s z6(Z~cVU}1kX+8c^O<1}IiDGlNp6q!C5s<0YlBAe2CGT&jH7ScfWN8r&- zk0m1Ulam`0h&~cyf+G*oMk5d z3{^Q3hc1>)$OmX-I_#_6EE=5c$tkoNHqDf7+xUuAT@dwNHartF;JDhsWAw*uRhN6DJ3WIQ+ zoY)&NymUikwiZ0G3*qk7DmEU%TLo5hWk7qraHRV*rKhG2X^f~3ZqbaG&HSk}AJ#19 zXgUkn%Mu}M=1no6JgZt~IICKv$|TwS-6PLAnej5S`*`tEtW)>KYn+8nnyLi`E5h+R ze7VCzS3eN2On~s9y1lJ_%7kc0Nc5|ypAyHow4Ql8fB~tKAmj4)@`+#Sqw>wq4jgoB zfU|93;nH7B3qfObY<}u~pVRcglnktF zZ&U^(_(vF1UkJhn$vIR|JpXhbd2Vpyd={CwHQKe-m6jJ*5a+oZD7%GbiPz`&feO0- zuA8#sPpRYCyixF=H2;q2OzT~q?xWs^&m~$=;D=nMBnMsg8CWcZ--7^F@W{zZixg+( zPqox?pQ4*OJm03l;o&JJEV&wyQdIxje&fIFiwte2F}CmyFN>frgKf6}(LY2qp6|t(nYZtNq zAv{uKRC?dR53i=DCna~!h#kiJ^yWK0^^4&)f)FVL|aSsqJYu8$$JH?fMMJ@S@c1_GeP=^CHh*b z39jX;l&ButA+MM8xfYUY|G|p)3nIuGV`*E!vo9$v=|$x~zPt`p%XsC;8q>ulBi|vb zE?ZZnn2)A@T|lAnU+}1Od4LQNVRMBS1WMr6?VP0kDQ!+9$SEk+0HOZplSbGHScDwL z-}dH`DSnBovNekLZ~0jzG(yZB= zgWZLnlzS)tML+Gse2;t`BZEQvmTba26DvKxn2_KJraRSS5>EiXUFx75Fp@3#09 z_ri504l*?|BP*HJ)u0L8!O(Mw(4&fng-U$&nUIM*{k%3j4$ys!N+DVKRIDS&)m;Wd zxyw}kX*hK&HuuXh%jesDSbELNBpkn&OieAlKb;KG&V7w8<>DpiO^=Ql!e;6gb?YgM=TShcDouo$TriZ#k zrA&UqnCZt$=2ri>Sql^U6dCAD{;W>`X^7eNH+J60iZ15!5dL$gL7Kr#;KnqHh33o? z`#ZP(Vtnmxs*XJP{BfQmIj^JDJBT$B9Gm%X#0hTr%q7*oCbA@a9wWgMT`AG#IopdC z0pGk%*}V<}n1>?FA2+VclLZL1EwTjN+*(R=efj~vs|eMWJUl(W`GMpJgysOx_9`{} z%S&4kZW%3?D|L2t_HUS7z4I|;(URBf-5`CeU9*k5&<}i%u5t-d)!#o>S1r(MW83J) zV{18cprL-N&Lk{mPCT4BJLD4{V*$I`Bwj0F`_hBX4jM_%hBfJ`Rt;poAqh&LXQ~|4 zw$|6NNCD#UZ54C8O2ysC=*?(}00l1V)_an!gb;Y)Sp>8~<9r{m{+TXK_9BxfiF+3z z$*``Pvh981evpNxNO=XmJ*!9+qe|V4OXR7Lbb)sq2UO*Jza6xJ_t~kRO$B|-Qo79< zAd=8GZRm8#R8O(KtzAdlI^e+bz;8>iT_MUtfO=D}P_AkA$(*L!4Qpoi2@8*JK9_`P(H1a?%R4kVr^l4n*xvL zy0o_Dmoa;r?EtN^^vCZqV;iS>C|RMg~1TVIr*Ywzty8g z2K{%z@sa{Z5V&a$AWv>IRMmS)Rd2n{Y|eZ|RB<>(pTL83TSSaCBs8ftBmeZ8Btort47TFj_SzgCb1y3KM; zuNrjRb(G8P=srwMOfO~$OLo@<_z7spQZEMRZaT7yd3$LkS zbC-zz@MC~&2tq<}H2Pv#Ovxoxn3{k4S9C2^I|-~*UC(5=rGR2tj(!=Z2LNUQ;x}&S z>E7YKb>T(7$Ut#nN^;2GzQ9sLlVApE-bOuMkDO(c4NnohO48&X3c0RlAM#Gt1`A?}!lRQ4N>Vj{FX; zU>68v{S^Eq&56bl3ZzR-zWM2;W)qNNy)Xiz^x*;G=Th@^wJj`z(w}XSQ+CKA0}m)2 z%`#VA2WWkm{=H>bQ2*LN!*E1l@L}T*K@8K`(emW|jvx9ZXPx(fuPjkh_9|Obp6ILL&5R}SNx-K|+F?A|hBWpjjrFxjZVh zuWeO8Y5TviMjIqNqI^%ws=Fxte_{{|N>wy3Ei9wZWP4~}Ihs5P?aAao2D6jvskNNl zWBlfDQ(Q6>>EgOey#jX!o4p7J1?f}{;-X&s*`m*Uk0t_3gz zNz9+o*-T)dp&p9>tt`ZG872%XLB*wWwM{@`pc&oyt1PAOME<%P@qvXzcEw3qQ%MrC zN5I75YZ}Uwd*yID6bS=jvj#OOX2ga(uy+yG2=@Y^A6yydpSobR6CVbLvh_4d!>|{m zmh*_3tX`{@QJ>UNsgNMxqoc*+L{PvE*~Xtc7zv@NLmg&yz5fo(|2f*c@X)ifv)79n zZ`h0Xr>!sMx1p_)U)iZv&^Y~u#RbU8YdWpRB%_SB=sB5!gpKLLFUc#KY?tZl9w_RG z-sh-5L=AcJI&XMJ0j;5_Dh7A6OgJh|G4 z(w4PyyFfb|@%mO%5n_Es6i$kpJ3=JU5K}vAAKw2Fus|<{NW`=5r z-6Wu{Sxp2WlX{aiEL&dDbYHiJ5NT#%A$v=lbhu$SA)W?kxT#Ck-X|Bm`SdNOu7(X& z6uT(J@283B3IDfYm97oMK4Ua|-JT_NDW2qwmt(ux#;}CMvA=1#GANL`LK_CSSn|K> z0?4X=nqhuqWS~Ou@k2*IEN0fOi>W^?{)*u2z^vHe?tOPmiwH)|`awipq0~L3Tnwx~ zITK*FxP9M9msVMcD)2NRMbG_FsYCG$mbMcn-#>!MbZP>@n4Yt3a^EsfmZQz#>p7^d zuHx>JRa=DA5(^qp0!|tTQC{i0;c78yajTk@+MBBS8`7 zjuhsT{CNp%a$gZz%R% z&dF}K=+Snn*rA4yfx%L%3BJ!4Gv&Z8=I%n78I|d2NKU|u9u0ng3+rKEVB=TQ>znD- z3)L+5_%hn|5i>O7~^;5 zdrnWnhe;#){5?DSW7bVE8kvBIX8a_13UB?!qa>aV^T&?`5am>2MB8mh(Py7zH4WfQ z%f6=QFJa;{Vgm9d0UyEewYPhQ%e$-mFq9k&Qi!kxl~x1aqTY{cm=NV_Sy$&Kft_Hw zj0A3YWMYoL{q<<5;5B(Na8rMLG@3n*fK}(6j*+26fB!MuHwhY=PlDq{fv9XKx0hCb ze4te{F*JM?bmlygO^Y}$??-ibZn0$DhUmw?Xv(C6T*~S;91cxSq|@B0@Oh75D1HwgijjtW z6;nZOW{!@GfQvWdr|KfN(qyZHTG&Er++Td$3(=<^=E7PZn=@z5mv=SKTSmvnagm@t zOpACLnWfDunQNh%rD~`e;YQcY>taRI_;fC6YbU@k=eVcs*jY%tqNy7jh%NoP>kjEs zWs*abosrs5K|KmX61hD&44Jc^Pv}_p`!uMZOQ`IpRQ2~T+r>c+^AfSMm+1fb)Fol> zu1iP*yeUv5AZnktJ9f9T4~rX6s0TTVv8`k6!YD?*Qc=a)(>3fumY}U z*@t3Q2ZYz7ZymH>%HrRy9NbET+@SQkdtVRTvb2i)go=wwl2Lq=Z;sbe|4g(=heBDW zag^RvY&mQD9YR-fdj$bNs6JSwoez(ul1;RrEdEOnAo#&nppf3-LNj(|x|SbzO%I*}dU!MxY& zi2<_THt+gyuB0kZiR|VhbY*sIV7S$+)KWirV3^OW@Pg+kHQ)NOR>G=!hvNTy>*&AV8qc9#P-m;3 zT1G(um$IaH(QiEkH6xOVmIj3+Xo@O4^HRxl{lEA5BqgG$srk&zo3}*6%~V@8l8B4# zPZ#7(ALY`CNRwuSW{=lO*i8$Q@T23s^=ESN8HYA6P7+?{;PLO#B|P;dGxGHoAh1L> zkCa2lT_ob&({bUCQBH8K_fJW6ESD(Diz&|~ylnF#SPO}U#x2_b5q1wlf|i9^yrc$B zk-XN{@J0|@S>1GvJpr#%Qb##wQHqkbl|1-nD6SV?>a!IG>ty#wCpfQ9WDX9_t|^=L zzt+BjdO`pW;7n-cqU2biMFjp|Yw7~Az{DrWnu63J)Ii+jH2Ewf=x-dN@1Ij`-?|I= zWm}b3)G~RE-1hgK9&P%ySxxnNKuMq5D>NJR5&MmQ;ak-fOGD1ezk=iE3g-FEMFGT+ zm9@q7JE#4kh{u{ccDD;Mh2LNw0;@^r{!51snTVrzw`x2=DD{OXR>wnb{Lt7~>YD!v z97Wve$u12dm~q*Cx`J>XG*q=F(B=aFQ&>huAwRqAZYCvi`+bvD6`x}1F68<%+4pp= znxgRLU78+U>t-)CKwQ)s(eWu1ZtQ_FeUX)&p!P)hP!}_8{m4-J)tLLZy0P+mFY=F~ zwCU~&=T@eLNO+$kpZRVWtPGA0egW}&TbsKfoaGAjT__l#H1UnEPyCJ7deTJVk=A zq8Fwf+XG&f(F3uXrDDF)x$9FOZ=Bv%K<2LUQj%hzpb<&enWe@JNIN1=sIdFRkiv&4 zn#HtTdo#7;rNXP$XhM+awzY9@omPs7!P%T`b!hJ16h2obQ(PDY$_qFXEN1@>3PWxA zbxr;Wouv48!}~<5B9}ZNiO?{mA54kt-aC`;5;JPl_5Yr62{@Kzq4feLva z3Q7Th7L0*G(C|(JA#;^0wB!yM3q2ejWhlEc{M{G83LO>BT*8SQb1@J%hA}tCm7<-Lm)f!KqEOoaIh=NRl_wKY7b>yjZ_%68>BAsjv6-! znt&1vxc7VJXi6x!1nBIppxRxt=e~6$x40_eYalz#-B}I|kLN2KLv8Pq_rk;)Ar}l} zbOiB}*p_Dsq}2rOgSYMoDim=)YuzJEPuE)n( z5*FA*>aWgooow1d4O@pH@(%z!;I7FmI7Fh&W~iX;g=`YcT|^b9O;lLpnx=x{%i^}U zndNxsIKya3@ypgNx?j{%rDWaJ&wuqGwlJQery#S6f1k*S zFnlb}6PM7v@JE;8lU7IS+sO?lCr1K@=lvELCjWiXl^Z}c2(U5le7ZgrfjEm6)Fc?n zNXwSqhekKJObABBDi+PJy#~IH5c(Y3^5q~>*w4LP{fbWMr;mPOlbrr{{t~8~OvLym zXjU+p%S-5%Myp5wrUm1?H`nEhjLqHY@cM1FmeGtldgTw$N z<9Je@Puj0P^aUx2D5)>tZ3eBRsVIEMqr)oE-(*agTv1Q`Y0#jmrY!aZsNaXCGlXS@ zCn7j5)J_bbfkqXER1T=`$_sJ2$F{-w{wysgz}6%UT9Pd-4JmYj)cqHTV<09eKyjC_-7PJ z$fhCH-Y_L@dW$tSHs(jp$CRYna85tU>og)lJYj?=#$N{v7{Y#~R>q?GIGp8^1?Y)# z=?ckvnr8F6rET<^ovLf_3)+z;48*}wgQ|6#wl(gyAlbqbd}il{(iIp^1`xt|de{7&)~ zMcCC+_s!R_HEkg(5VvFMTi^=xY|-Tzbg^1j)oEs?i3$nKX0a84gI&m$)-0-(x<;i- zGWi+~GfS~Bfls7NG9o+9-`*Lg98HOdms24I>jPG%Y3iTJ&C9nfm$%84;vZ-p>Z)8` zQ=B&*O1E8wROdst+n}tX)+|nW{&SS#mA-Owc%T&X(?~Ih8hL9@jvm|=2c0<}4tGPg zTcQ9IZOK<7;ryM{N_nSY2Fkp-0k&c^FRG1QM%BQ$9Xvj^+F0gezlo8laR6WD)&`32 zh0Lw{$ISKU92LQt9lMgAWHwDb+Xkb*0E1hS8oDU=nsiK%#`-b(CC!a%Vj;wiHF?A= z%;`ZpTAQi+&5;Qf^Bg=)8)ZavQxn%}oXy4J5A?ZtVqK28{21XcMm(3)`$4U`J$|Hp3scT^)$GT+P8b9d3N`Yb3p_~|JLB~mH4CM;&t zp4y`n0a;qqdR#n6=NW89#1JDIEl*9F(xONN;{#H| zY^bWr^=GvB&{Q}o)=l{5J)vNAA(ijJI7K4PF@;@(i-J?&5RD-Bd!m(qZG?yetP$ zEyFv_dIV)?i7&WfghdSw{lVJ|mfFb8EQVJuvZsfaqT4)fA*vV2s2NJY z@&4O4X#so^29^Eri15i3qG~D&x@|6l-QC>+eNkg9A72_}bM+<+<9^$tJ=&UYACU9Wm2&Y)kDo4!mU8iugQF31kLkZQ|jz z%}0GB-tnnd6-#HbY0*qEq&zXL;-OY<2p980;p)3GlJoyz{z6H(b2m&r29jEQp>Uyq+mT#}9-0h5luUmW~>YLi!kTycH zgNc^yqTzdW8>??+nA*E4kIX-(r;@!9Xy#BiA;)Hou@L(@cPDNLtn{*7i?E-*o*s47 z77@YcV`o5B)j>`)wwNc|7%UCCu}BKVi_5PKCe9vQQoDkeI=2{EQ^IUH15gAOi9?)h zy)C2&<~)wOQ}oTh`Thnwrn(1m-?O#`lAi4rs`png?0pUEpqK9kIWsAZC&8(y zCg{)W;U$pqwPtQ4)hdpOWoEQ?F%e*qBbEL? zNr1ZSb2hh|r0G6Se1jdhgP)hBjyOQ#v4T*v&*$WK_5m2?W(CG+~e>NZVyVE_gO zD{Sm9;CVaaBq<$RoW=X`oOsNP$k&_E?N9er)$4&-#zlCf3th~+JAWcm7NZEv;U+e$ z%|%7_w+9S-8Q2k1(Ed1Qf8HzL5!)gSR!C(9S5#nq9_B{Fl25PU_2!R?%Z;H#tm{=h zDpc&kdr@BM^%@`Oi&Tn+0Fu2uVUP7Ur4u=&ik;6nf4xIE@bN7+>rlsF^~AWtsViKS z6PHOypxiSP=b{iBXxfKc*iSuTu@Ysp%=We2QbO8Q7pq$>=D5iLfMt-n5}tUR@%c62 zj}3AfJFO)14xX~d=ONdWB;<}^l&x0xfl4lb80Y;V1j{Od-e7F>-&XhDN_@H=mfwpB zZst7uvzwM>o+zs)$>ynQ)ZI6?OKX4qfqjaERST}+*pt#OUO_eB)-@v7^=!u5y`%-E zcW8D^@~&pZ9szO3>7${1wtJ$vhdLdus%YXxg2GsxhEFz4<$meDsP^PQwtyti$WA8L z+1Uk2KeYtIOsQs9RYZL;9E~<><5jKwjSH~!guQr|DLR+aJ)DsF0^oOg&|llf|FLM% z{D`_Ae$;3hzkz_-iQc&~oQjJr0I5V`MIe`FtjNgdNE|6o%G{+q-IpBn4ATss?Hf@! z;KeuV{qs%2>mKmgS9jVtvau!H4sp)NlYq10-T?&+l>_^g_H6qOuO{{6*<-w}%w7ax z^-W1UqsUD;#LXVB7^J+vlOOSgGg?>}j5 zu&Te?{xM9?8oL8iXSlf$4LqV}F98&rnti8SM9_12P7dWj2gjY*`1MD>AQNH|l3U-? z*pr=78h-njrXev&?>tl}(j|NVL5e;VCf0b|ktklYp#}cY(QKaJaY>Ng$G%>zMx(6& zRwvjH1h#hRs_PBj)SFKtn%!C6qy{=pmDB8UhlbFI`g1xh#Qf15V=F_T&j()D1Bsrz z31vcyMH?I4Yw+_oXj>Hl`KA*^sSUT0?`RpE0!nNwE&=;z4Q#8cC*FJ!98GD|I8(lO z#`Eke5qmDpg$O=UO&;Lk7+gJ9!aMTC`@6iu6>32A(wAADNJbgW%}(LavF%{;N@>Im z-iqOGWuQ}AI;00$sKp?LAqEo!|0}l$G>Qv8`)o0xm)lZumyN0}>l4~cey30J#6sb^ zizB5J@G9^Wo)a%u%8W*ruYNu=JsN8zDAGg5O~CXTXU7_i(w4a!?H+k%QsP(LChY`$ zjIY->7iwAB5F|zKW5FAk&8v*@RyD^{g44H(AGtl;LfA zW{P2Q)WTri-Or$u$3Xta`T$EEQB~ZNwjG4Q38ia@QQMI%;gGDV5=N(s)wSllUGc|N zc`g;v6%m&B;m=?y$Hx-4JAC_nj-Hon2{kRbhN6N@;spjAT}gHNTk1L@(Y^?gf2s?*0Vfvb|4OCi$fv6S{Tksd?J4pB@0+kYeBt~=vj|{RYPRoicWqnjeh(Or-Ap0q z_`@Blqd-U{tFvKyQW&|BCw#esA>gSE8BwxP zs5 z?izl|p7_MV`|EE9Kg$(revOQ^&QS=r8{{4&tnc5cFLb_qPKPa2VmaUpuuRYh)Bhv9 z@3NUQn{XH4^Px00zylD!DkkxSpSb)RPA$VXikYQ?i(sKtqK&>vYwK{fV9dSjmt*eF zAJWz?HM3|^K(Yh|V6?|DQB;} zC&yx`bHCn;-5q9=J&904Xfm*1(R*NW1s2}}x+osR{%+c~2N3v~qT~EoXfXU@lD%2y z?r2%|nhHX|xk}KCS8ONO_i;Z1(Sq4gPziqB?K_LU5`JJ_#vpr$%MT>WTbdQy97H`B%c zBrV3Fd_4bJEiCL}`hygcsv1vG14vo60x;lq_hYx|(8R^dF5W+A&2Ev#sVb$x^_5sB zs^%*EJF&j%?k=wOhqzydMwEL8bfg8$T~E@wV5g3`M$}^pQ~{99uQ;rTlFt-yJ=PH5 zf!$)xRRDF60_F)D&xI?YwQY-Se_pIMC8de}v+J z)7^}3GR|GEW_7N%n@F(Xl6f{5`B9nO>cAP=BU_Cx<{(%8TdC zxl#+^cJMby3bnrvG}jt)^TZ|(WBJ1TdyG@~`s40X-7Q|<5GrBl0&W(MT~gf=pqjkX zbqKI49@WNijo~UkbvBKwp)pMVggOfx9@O{?{bNI|(9EvVTb=%KOTdb<$8)j_> z>?EAF=Gz_He6{-CNzoshHg%jeB|64CsUk3YDt^=e@{9XpOZc`^rhT$i*jmD|M;u%3 zb1aV2@ph5EwRHKqT#e}P(c}h`^lf>|j1mfo_Uneg%|49Bg^h&?u+QIX3+dY^?9k*UMOmgct)X7udgfl&HBO58VmLXKB>g^AnYxFMm9>?ZF@TQ9|AW2h(=}UE_gng&@Msx zi?}l@eVD$_k(h#aoiKy$`sBvBUN?uz9dG2(cz)r41nmk0X+=g-Pc)b*(WRn>{jODC zTd3(IfmwyYwa1SknfQd&QFGKh-bdysO@to=SgWOjPY{EqRTPBt_^sw|z~8lwJ2FaW8tmVzgtC*4 z(U(HV${lLOx~z1<*45H}AeD)_uarle+I2hdiou$^-U)Vnjv|`CB1w8N%S4R?M&~N< zffBTkDTNwM*A}XI4a*{xJmn+-r2U>HXyEnK@_glgyEeIAiFQDIDewI*T}^|;5K7ek zHl%^$_DHM0x&W+kw(Zt_`D0c2( zjM|jhm^PCm&pU<-d!`%tK=AkzH^e#vtRVNWcYU*9(3l~hT`zyBVO)5Sxa8^GLc^SP zSK7D>Xbwq4QxElMjd6P4%48c0Rx50W^b4TC^g#^q&F{*guy8PzXgYTA2PAoHaE%;Mdi-?TiNE(_0)| znVyg+6w}Q`O)Z4IpZ0~|MNIsmee)#0qc_j|>J^Rupdz9(pw6LpCI8dx$fn^2A0a{o za!Oja4(pT`8)~%~fukz696RuHpAbZ(3XA14Fvo{x=i{soTsTSvO!c6R!p<|?h<-%D zooxOxdThiFtFiNGkF*^BW~LV@Y(w$x1?g+0Y}+H^H)LhFqH{}?p&aQ!kmVph$&uI! zDv86G-{iNTAC>jV$#Xjr)ILCg*GYlj5skzg)tHD85fQGy?1)S4&MMu=8t8|c(}>*U z++6fc-$fn}HO2No%uY-XSJR*KCE&7?R#-z!M|qyA*?qF`j-iQ!s*h`l4t!X0R)>7s zVb`(T45lzQd5@#p$wzGUKc=-|Kv;Pu4I(=`3ey*N*LL2%=iT!Y(=*W=t`6A;qP5bf zWV{4-VKX9FR`>x;MMtO@DhfG zoAC?MSeC9BOoa%O3#SD4ic&_&F`wUQds%ow^Bg&NvRPD<;u-_`_*~7}AsivZL+Dw~ zGp*y{uJP1m=e(9w0tWF3k==SToP?P0)Pg|cpxm)S5ccKIjT_P?X zmOeemOKi=O0~bY@b$66414TB!5RF`mlM#u2H#8n+L@Pa!clx)Vuc!ux^15(la#SWU zgTpk3(GRovo>Z9>&&f>)>YmXEA%b%E$VuBZ+xdx-y_v1Tiw0(jnSFv)5?f32GsDCi z^rBSuE782Vx+rTm#G}hY?I@-)c5qN|ROB$YNV&qS*lKt8B)LYE%r4|H@eHO*$&Lm) ziUVkBwAYvKQ@Py|5{ZYqODWATHX#)<_wb1H4C0PaZ%NU<};?c zVneg4z!kmxvR-NPO}S_6d6w<#7)*%r^JGv=VB%)Jaf|j#;$AA^H(uyTg|a_q?d*}l zCK!Pp67+NkPPI0CiXS}rUTR%wil{8JIw zEK*f8)PqG2_P8{$5Tju`Fp5PJtZ_4|9W zsIA|MIpQe=n2S0*uAi73 zg!|_wRj^&5qc;HE7~_x_TpGC1P=0g7keP}}aZCaTI$6hB=YH;X;I|REadSC(N$-rA*|i(29rH~WOKbLU4^IEPrh?= zbL>vfmJn){hl|3@PU|_ePOC5K?o~+Nwj%QmizGT;es!)uokc7&gjj@Z;VT(WOgoq5 z%ciAFISGXks2_|gQ~|b6<^37Bi=hJxm4jU(b6W$QVKhi=$0G(L${;d`Fp`h}9k*zb z@p*HK zr)Xm2{a1-PO6lkD0WQ8ukjeEZ4^i}wkQE6+5a9LoNZY#nRdAK9q*+fBDBIu8t!4AX zW;ne7S&$$TGAJ&9fk>=o^v#qIH{AtZ>=nb4mrtoIo@kW~#3ga>#lCOi^ob(7KEBR^ zdE0(qJ}2hc7_fB<&@>rUPUQlLoHS&KzK5knWh9i+Ro#U(Zu7E`15uG&;SUzA6*L_k zCj`Be+lX^B>eZ_6^Ff9P$U*87ma|D@kH2Dw6@ILEc97R?xGm z!4jGx7Dugws+Oz~0YB>*1*k^IfA90Hfzxx|BFL-X<0bL^rJAtHYWWPY9FT7&BI=?+ zSvnYoYtEm)GgR8ze4Hf_*@$8`OYweP-OX1QmGvZl(x#4 z6udS)5hKb8Remo%Hxd0>G?_pyqaa;4w(JpA(eSP8;ETG7vc%B@^$gZr8Q|mm-6!Q5 zg2~0?Q{oTO9nY(&dY6qb6iUF#x5Ysw)r00ts`rb#9NwY0Ec<1lsn$tHNjY&^Vrx&Y zM*b-}x{?vwDhG(n%o8MvFQULiYSi+0wmJT(+kUanVMRe5v5~KmS2y)(kpNRf^@G6L zZ8ifT2z}&3NFdyLJ3%w9jU0AeMGNISjg7wOp`LBP&vlKjfeaLIl{|kgqmWrm-eY?1 zb9MKE8{cmo{Xd@0vAxkYY}a)=Wop~D+i9EHn%Zuswry*QscqYKr?zcR%~^Tgwchmu zk`LK(C+BsX`>|hekPJ+;#Y~AthkZnP8XL%qd?6x|NpkVm=FjW*UF-(mwQq~3~>SitI;F{jGz$@05wth^R#c+ zM#f|&^U~PXRy;wCSss5m!5r@g48*x?YBd^P(u<%5S_n-FIy2SWe_7a`C~V|KPy_Kw zcxjHWw1;r-^YSFdslh+thcVTE`*nYT9gfS0duAyHO2RuIHyV7t#{%8=Z_xs@zof2f zYC^^f;*8rVF`M|#$rw+n{LMbT@Yp`YVi50(`P0kb4*fZMIe;=M4 zi^)D`mxy;NBr@0fkG~t1w~Ie~E*H8mQAP`7U7j5$c3axaC^_0}OUj0ZFSW+&G7B{2 zyn80Eemz&CpEBEB422?gIO_`Gq2bbysbGDzq|mLBUtIB1MZWdkd>8MW)-{ZZuoPP% z>A1-FGBq)i?!6L_hBZz)BW9PJb=Qega#A3jB3jRO%Tg%9h3uSfh9ndJT=};tvKCtW z@MeoXKAiu`q=)qpoROpf#Gfv1gf+l)?JyNllsi@YVv5`M`5P~mM+zr}@;@v8$<@_W z-4q6|bk1uu)MctN6LsDo>G~(*ln;|H%2J~6&t&MmY@X~oCZm-`Zw*HR(%|qo0*&b1 z=xos2fRg5LFx|OoZCdYy?eRn8Mj+U?0Yv$WHODp|+4VnG$sun0iVi;18CNP2oxG>0D<#08J!w1M_fU6w(~K$ zG&8-;5Ih^XOdL%Li>%k{Yh$o?725LEZ5oavvjZ@|16(WivL!aZnr4wyu_4I7kw$Jo zc58=Jp-~TT{?Z^ZDwe~h%TeEN`yfZP1cS)NQEj8aGK;@ZdATER)*)*onBA`mqjtC^5~X(J4!&C2$tb_f<5SZ%=a<+dLM!`-^t_W|3;l^c2#uG2?CqWIjnKp|ClYQ5D#+abny(>?B6EM${rp}< zSPd<$>DuJ38`r8w9`MH>yhf!Yz+44MwEyFBVLa2x7Hd|EPW9@Gb4Q= zY4BSk$!GJGmt2E0T3}^t0Ok&@)+B#X>b~7{7~*1HGc?+;Y2> zhHDj7+p`|_f}a+O*iNSL)QT1PAOXfL#r*vrhVR2#D+W3~GaD6|bwN#g8_xnGyLqG%K$Kgp zeg=X=)5jbEvV9lYlPY6CHLdQs`Mixvn)6AZ&{SQrF7+&($O!-dxK) zD-cLgqb+D%7!%7A&Waa}+r>J!h-c!_IQgeyh~6p1dao(K-ffOVb=Mt=Y0NJBEMBk_ z>I|x2JX?GPo$cPT|FKXkcv_ApMMHgIS@n*?-PFE2S=fesJl|L-oj=EU?QH`mFs*3Pk2yVhUah@6 zUhBz#Y&HWQE6pOdZFI>jCt~o9RU8&NpeJ4^1>n0^{ zUM1}5ybZ!i^}ls0(+3mDXdr+z3Y4KjYBw4ocsiCaDN&IT znlkvuU)tmPqZep#-G;jfR0|mG$(EI(N z-Ao9Th;^$n;^=;^&DAKFs$u!kn%!+-kqN?z8S9PgytG6jG9v80p<&o!Gx**p;CD`n zRE02-P_wp$?@H;lox*TK^8>slr_o5^mJ5+Q^~_oEX4olFRYBah`>0d=%_<_v zi-&iXHm7|^zTg;%Y$v=q$(RIHDJjc|&5MEMg0A9PoR@DynMdzDyS87^7}(2z^S|BOTa?q%om4mxw=C#^3!W0|Fae;;Wcr}nH*aDafn>Sp z_z_hQV-$D2zLP-kP<4(DF<6%6j>ql*0N9&XP%UbX90F&SiSq^p3fH|yy0>T6{2UN#zTi-GonN}r^Ru~2P;3Qp73ZvYIf8~&=1MAq38O<-=HoZwza>>i ziJPE$1!Rucf$Nh+C(JVeF@LQYnC;}RVz5qnZ|&N-Q1Qx|qMQ?6l8>BBqR=4tZvf5Y z2)cOf3rJ>}%&}+R>7VPk(_sa9P1QuC$^^6iP~PLkDm9IhBw4BY(xAAW2CXT_fX{U#Jbyr>U5uKUi~gm`T9f1>^>}z z&t=#>tZJ72QkS$9NWfj6w}k%Mvo-4Zt}mx8IJ_4~{9kGe^yv;0njxI~yV~g>zbLNl zCXgr->%kQyNq~AR+lmsI2gjTi2bWCX%npbcX8@4#gDSq_^d#0U-{=jzWuurYevW9Z zTd3iGNjnb`6E-%e$eT0pCzgFz>F*VxSJcCpyj3Dr&;Ao)5u!$xTru_e+%6AAg0aY!n*bOQMpTRXSXR`*V>klcR&p+|_A$Az%f_rhbRu)MO zAqt_CJ7YwkoZo{^a5w}hqH0NwM#QpN(!!o^Xf$r5cn%w73S+$<|GNajE%{qnCN=}(*o7NwS=Yh4370g8#> z({=Cfk&!GqUIE{jeyw>PLl9c%RkLP6yu%^%6)-2ig&~k#H&brVlJ|;v6jGWVJEsqj z0^5w33DJ;GKC-@bZdou#wPat~h8JWLZNL!X7Y)$=&3b8}02L-0OL|J8eV99%(Q zjQ9W79-QPsEU=@5EcQD$6CG(^Ddsq%UNO3uw6*d$=a1BDl_CJ6v5C=J29_{Fgwm z-d1k9wB~?7wxvR^(w(49lw@Q7$VR`yCa3UdMHIDa6`z&CzYUS+j3wwzRj~$GUbu!c z$W9QgxT3S}fD{_0#)$3*S~JLt_jUDn%8QFEC;z{1NTWEI^T^x%NE$Jd-DYmD5u$IC zc`Zq59&NqLj#ZGw%*(dX`2M+a9eveDZ-4I zhVl}*2uq-VsNF4s<{2}Yug<#7x9vI@@$ET@(0J$QE9M51t}8=W!MF7Y?wM2;pnk`2 z2;Ujlo!RmC^4aVA^+3o%)}CN$NQug(dYu~B5Ku?~BWMI{R{MG2Q!U==S z^26?WNai{MEiL zqll(!!>Oqf_5>QDKEAf41HkA^Dm6isqN}_mOVJ2o^>*y4n(=I%DEllmaPP1`#|QN3 zB8iYNRVIAJ$(It!shpkX5_Y7^7hejVgE3=L&AKwqi|Ys}JhzqGN%CC8%i{JT7|i%} zTN6~r$`mYJ9;K@m%&RRDSOXPUed`#bdN#1-8{eQ75T^&uMpp1uxj*KE>*!3j*kHpV zG^R#&6F-=HW~}5Pb;raGy_ zdkB5yuaOX}Dtv31emt2-nl*%r_dKt391J3ouAWo}E>VLg9taT_2$_`}QzwQ#(W7R} zF@2?s;{o?mk{b+^DzfF_fJcOT^cOK=RRHuw zrnLtPZDkc{i0XMp*Xy!)(NRkwFT+JV=y(>+{tuU3gNn=I3AqISJv?eAzuw8IS4>!h zBrftkTTaE+BHvFhNrpC9!=qxr#1g{$a&7$_o#~oE?t0WH@XYKOGh<_L3t*&1oB=a` z&h=!N#m^EG+2f+^$d*{ZuGYJg@q&5F3Bc3nb!H3swgqA7wxb09Jl|7enaUmN>S2k^ z9(i^&lnd)@T(u7H(Yxv95@;4k!3ALe^z0t!M}Yq=iSa<(Ce|oPFO9x>rN>s<0t^1Ja7ZnqYxDw}b$%PD&7F|1qIq>5|;H8_p(bX5``=59D zzlFY`2_)xnCk>%k1Dv}(LwY2{BU&?a!cyv0jY=@gr?mctIl^tXsD2|uM13P7?<`Le z^Jp&vHo&lyKh9#LJmZ|xycx*gufhf)q)r(b%r*eWirM^#sp=7Nfrv&V?J`;y2w`=y zA;xrJj@&CODwe65c(dD<)+m+7al;tr#Ih6l1}MWSKQiua(&8Hlg}}n$8YWueptwTo z$G__nLhTmADppiq7N=>s9I<@YsZ`*g8H@J002U>Z&csPq{)M-N@X0GBtd?Cy!s_BP zv59O1+6az;+TX=%Io*1KM#YzsJP%@21$AP@$EZ!!Pn4#oo+9dZoJI$081;y!m$U=W z;UONl51MN0cJZ}s`fAJS2m=-Q$x>I21R9NsZ6S2~HyVw^e>Y2_h3{`p<=ihDPX2d% z0>%6abg3hnh#)Sr-i2E09ujeAL{?LbkVtS=8UEh!1p7RV>Tx2%zp>R zdf#>-Q8EZ|kIj*TdSDZw@yQfxg1OWv5*clPYh_m3O&Hl)&$f?dHYK1jk9kX=Mx>N* zDnEdvDwUXreuA6;z?D9_XX+l5u#CU0N0MW#;%o^DMD}?GC`n6t9!-Pb4j_A^`acH> zs>zVt@h-eyod_>Ax*AA~|Ls+Dcj+mFUJ63{*6WLG0}m#$A4jIy)c=bfZvp(7S@Mbo zLcpxbcK?9z{P?)8S39PLiZ>FzySn#{e4Z!^r~dR%kFp0x(5cT5qW-?_QLo zKCTGZX7E$w3=AqOq9N#!*Z-I?&^|UVlh1fY$fsG}}J#+(t=-=`yphzwvPp|J;@# zSS2%2c`k*0xpx5(Cv9H|BNAs_mVaRxOg9Nc1D5~+zkf~s*CJ#aCoC^bw3K=gj;`7M zmKd7iha=(4r#ZYA0Eb``6WU<0w5i<9gKoe_{U2XN%~!&ToKCFf{i*O z63+t#=>|{CKUV?c3g?}@LXst0VY+CFA*<){N0*dsw%Y20)<-`B-xoGQExBr*F^S=B zBu9xwM1$;u@|tDL2Iv|1rK<@E35C`GNk^m%r|h#=QvdM!792DS+yDg4Fwo?a_+|5v zB=xNMgs>Bgzz>{*Qr?J$QM7q6?g8JeP^vVUU48Kn-nw)_fl87Qtvr)U>IY)0bA!=)XLgr?V>@H?~Pq*HZLGA?ozsN-M*wADXyTxiz zSiE(*D)Gd|-KMZVj0h*af1_BcX>(a0+4Do9EQe{JUecs0mk52=O%-r-aw*Cpu&otR ze3Ck!B6TVK`-3Q_WXe@!NiZ-F23#46)+M_#VoC;sAG;N1^T z+-{=-Dc*}}4(wOc+u{dgUE>|!wsAc#kxZxdBySOa#w@YS1$N|2BgcBJGMU(uMRajJ z`E>ZcN3bL3?ADD~{N5}-&b+$Ma=ncgR9;LLOx|v@EwH--vFDN)KEFtwYOKWNoJfBt zqvnm)qaoh}>;Ebk5A`K!C;IYg?%OY=wgarIkyIgi^5n~VTv{$m;>&Y-z}rNQ=WWi* z&>cUEEtE9Oey)xQPw6>zgTsL>AbkjT9$E?RkrryP~xra00i=B;+<9 zThAY4c|c(=&EK!od%7+RW)>$2-Q9vnc(W^iBOJ%h-vxOMET z(^Zd&KYz$zVPWxBdljwSC0pzV;1<;vLw{;&Cx;e~6psP<2?{C0JR-9z>o_?52D=rM zy6b&KPLnjUB~(q$>Gt&kxCp1jItl=d+Myprv*Vo-heWBh~ZrMD2KZ zwSskys;=XHSpXtCl?(%NDXI{6soj^z9m-W6>-P9S_den|Ie!MKYgQg=%|@O7baY;W zpK9Hp%FX(og>}UzeGxwlx0MTqoFdAz%kzZHhAH}T)C8`_^HF;g`G?*pAUsj~Nv^Z# zKEbuv>#v6(L{!VvdKm=}Cy%tzSjET(+dpFzcMM_+k0{KvjIn*@10ZE?{FC}Z+4g{v zw$_M3&Ht$g5BrQ64jnf0Sm@kvekBZKg{E&FFUJRFpMFH@K1FcKZ&JhZCE;5LE^-1~ z7|lp>b8|Q2iE!4k)w4TEzLfIk0Xc`prL=}aJXbO=w6V{ei+;>U+84E6687rs#mS$x$6V)BaGbL z-6@$-Q1CeFn0fhm&r*{4*O?*8t#Dm#Z&{-hyM(_*VwcxNJjxFM%XC)YsQ$hwn|fHj zUv*vn7VASqEvu%%Dy*QLE=WqY9-k15unE>4MZho(ClqSBRrCyR0EJHv=Zq`q59z2_ zuYHFi8fJ(uZJG_I-#KJmYmchLgsj<>`Q|E}3&W)u? zXPsTyP8xZ?@YdjM2p1S@Pvt@Z*?hb`G(_a=d2?mxHBTmHy)%dROm?mX6@`dnipvEd ztgtMgyVu3I1p0UNmgcTWwa?idBK0<*%cBuWDXO*Mmyws^D5^NNuRnr-d_E5$BSeFh z%e~qQV|&48aXR)CA9b?UJ8(Ad-rS#Er;0ha3psNlZ4{|$*4%R-gkcs0@>!?pYvlUh zlP}eUk8QQiP-0_mkz_o@c3)Jzmi+Dx7H?s(&-g@;lZIV3y&A+N$`}Zqtc(@e+0~BlC08z1Fp{$e`$?}xz_(zyq`>rUJF|N{-?GB zCU!7|KqAJ>qYULjH#Fi|r&U+Swh<}=PRFkD{`Z0>U%hZQk_zYKMLBPGwJjeOs1YCd z-qOyU5T91c1HZRfP(U^@K83B%2im4QJlFXCn%tNX`ox*(nZTHoFzl-6tmK7)Go1+( zl@u51di^8-mEXlBZf$D9`TGm6U&a@@#QrP7kAcGck$6H+wf8FTzaTpkNF|WB>bo)3 z2r|amMh1+N?eguh(kb$Yx$O;>vAt4YUVo(0F%uOgnb7M9hyj2XT&ZtHC{zeJmmZm< z0Vljyk{w+9&C=PYJf&6t9+eofJ7W6SfWEtoj)ci-w>3#rsKRZ;V^f5z<-Zb~%@pZm z6MldbakNAeN4vf^dyb`-mcoLtkDuL+v(_E#^P%5)Qe-KYO76t`M9bKrc}|5OIyyR% znq37Wb%(`%P({a|q_Ux^NeY)6a6Vz;!QH6}1F~Dx3hRC0-Jcq=?!skKO49m%D=!n@*O4op?(r3CszAfn7a|-y4n&f6z!b=+cAkTwi{04p zi4?1Gc8KFQBL!W^U>#nIDaPK2KO^1%XFGKWT@!cni>*mGcXqsFLJ;+LsMF0GN>eix zV6?aRrnZiY-1hMdr|hh%LOnRN{lqGnJn)5Ha{?Owo<1P3sRU21j z<$vmGxVM@+<3w{hN2l|M@q#e+lK(Jvi2|6^mk}-Y)7wOJ7gAcSkYCLf0~Li{{+L(| zelY0Kb=z{^zdtJ;@=SII!|QWlCpXW|g%x z{HnN5633Lq-kDUhooCHb{G-iP-cq$_gbHw9c_FuNLO2E1p!}je}iNs2;p07Zmquqmm0<#@lgeg*Kj~{zO=^ewOk^ zxVg8@@-bq%Sig#pw#cp&i<(}f=0xE6xW!&>dkgjtrgA~ZTk{pA&GNSgU20gXT1pM3 zSgD=OB4cu5!;n_A6&E`Dr(?+GH?#%Kp)hfNZs>D)%k^Mryr#S!8A6patBAx>cf|4H zg)T}4oVpwysn0@2_d>;L@>CMF=}%1q_^W*)Y19;0X~ZceSKgX%XQSSvdh9gu2P9YV z&P{0oNh+zXWf2JnIZ<90#o|DIi`6?KU%h&-#s9*M(BR z!2GiPxk|3A zD~i+_$2hrOZNSRu2?3ts4!vDOE9q$g>U54>o z;rDfpb!%NwxmIs6-H7-dqh?%Xx+KMihX>w~4>JD{X(ML|jwBo%9?n;|W`+p&{>{l1 zBo-Z25Ss%{xaCb%F+sr)q2c}7)};@=#JXBUmlFzVy~Np&34So~y?RUaX9KbTN77i$2m%tsbi;ZWB4uPV%-8$qiLs?1Swg z)HUy5JO|4J#a0y~_-I-pJR+{046uBuRZh;}-jSI=>9mW|Ns!EJy*m62Z!ex5XNCoiA`8+-q=vNVu<#N)Y zJ9W6C{_Ha3L{dA!+(j%-w_-~J^;g6scbTaOcN?)&f#Qgg~3UzJD_w`F#?M=uI6 zEGI?+ZfY5m!$2C5*qswIvXCE*By7_Jf__Ov{x9G0M&7ieL^Q0AGGZr6JfP3Yty(uZ zWI-ILfa}bc=ztnwZuiQzS8jrsuqLvVSu@n$(^h=+qG|CwRnuAk{@B7OQCFsLMoX9o z_a&&egZ3LQ_ziAd$R2-vqNt<)Kj%;tJ^K<>U*Vc2SttT8 zg_842F}m1w;S^fsf_QbJ%XOh6+=eGatGn+jf3sDQ7Le0_cP&c0-Y+F2Q=DMTmR=w$ z$z`0oPizb)UjJqZ2y?&MOgN{~E6FR$iW@3brcK7ED~rZ`_)EMo{HB32MM12gR*Kdl0 zK)%Du5!B()iAP8F>a9fXoT~9 zb89M<=;BObC!0C1fX)^u+o-Ekqj+;EmF&rCT9fr>R0){tE$LDWJ=uK2?|Q-CIQ#iw zl*rL-kwD_=65l$+1;@;Q8*0{+C0HY@M7u&c^%P$pN0bWcuA&ABw0nbDA8~%NYLKSi zZoq)Qv|SoUwacA0nj6$j`@{}hlpz~QBH+W3r#mrixjHHxv;lvX8@%FVuq<-c8(5_q zI5Ne`7oWXN$cSdt(x_=*&sgw4sn)64j`yMk(v#0V*#Ax0;JQGQb}fj$g=aMlWti{D z=(ZMC?~gYBNKXuj1}dF+#g{kZx4@x6K6bjs=Fy^$C_6YH-0beZJGo3=1+ghFRkX)Jg~A)Ol}2&M%ApfL9RM4P)#3N)qc{-!NQSP zc)PC=VOtE;Xu~d*G{+oPI@!7Lp*Zg=v|#cU4rPfWsY;kbDZ+qb@sPtMmyaV75|2)0 zu#nTUWbiH!mk43=EbN#Iyha}*(^MQOP8&4Bv6Kvo0&PrJ? ziO)m?XF)hy+j={|=l(r4wOW@tLZYkmrsuBU)@REk#@ut zmqau|-s!~@Cu>yZ;M6=~GDKJ}MK)tRw0j1h_*uN#$xJa8FntIg?Hvl2GMUciIA_(D zK?2nGuNO(^#5M}i&Qg`Thv%{_(2%w-@yhAkGXW3)9f@<#1hue`1Xhd$Pk?aFsF6VS z*5OUvx9)DnWi`OJDC(uPm=F3E1dF7cuWJqk50%&C%*ccv9gvL&@7l!3g_A4}xrCRd z@-t6&c{}^?X95<0F70DeTai}DHh>g|=<(2R6v5TbiG=nXq_qpA` zPbjNk*cY`+EB2o+0LH&yHCaN;Z>kAu>A0SE?WIivu%IT4`67$gO(8Q)${?c7;4G|1 z!XD<(+<-;yBH5wvaV!p(REQ(3wzdPp=iZ5s7@>y{qsKX_Ya0<$mivxlG>HmHdXMQE z-SogqTYrto%uHZp1i-RiiC@31h+HTkoiq9 zv<{EkD?}Mh(h4IaH#?j0^L^N29IzHn0ZvkBs3_>wJC;$lD4rDP=j-(i0y(Ha=%XS1 zEB?-wR@CDXrT2q0Blvk!^m(hC>hxC2^D^I?r=>>%?kJdN&{6bB=<5Sn4SF;Eg^*{BJcRUF8QmJ) zvfb?*#q$}I%cVj&v)|*mA?CD~$?L)7+xr+%c3@*K%MR;WjN8?>t@*~CqM>%*V@GCF z+td(cj(kluvCG3j2fD>TQAc3}eFS{q>h5fCY;rAdnE<3KlQbzyA0&7Wdzpt!hD}C0 zZzHD*#B#Num;&wM>zWdyAl1u`L(Q?@#Q_LoLf$#qqxJkFUqaqH;5d@5uD-U9+nqL*ZO_}Wv1fz} zvTy*YcNJ;o!vpG1Ss)sagcJ#G31guWJeYN)+g-NB>!y4CAFn;<{N+z|?Z=b{rkK)h z&->%)pXS@1Cpr8&AN3zRKJCx}B#%rUUmMfE$sPAZ8qRjDTp8CWQ`m?uvz;x-Ts-3# zV>*ZkOZq=UO}u;GofsRy8wk}U z+9PN}xbPCcshjoGxink`ymVl)m@?(+=~oWT{%d}0LmT^de13NBY0tD^FzEwZo0(kH z$3f*wa-VDz9H$=ryn64gI2rAcS}hZsXnjmIzL>5wYOJt=+k?d#WeS$X7sL-SoyeZZ zUiAIh$f|tHf?oR-<<4e}$?w}N+>_I1_WF_MgTfU!HBp^k6fdp7I=AZBdo%Y=ve3WB zTzDEXoPk*m3og`rOLarc$zHI!3REKnsB*jB$1u0Li85KM$4#&9gyzMVxUaV~eRj9< z*A~Lg;n|sjmR~8$m>ZJE^TN2Ip9&VH<>$4%$MF1h6Fe3)Du*!8FnE;%Zn<(o)$_+_ zef1CoH60&hj}T^>h3s>V=0AkXCvbLaCk>z0`&PE$zf^#i% zBRtv({icuaGC_Fd$xvnR7kM!ujmx*gT&cF9>m$mE7oN2ObJYS%gd6*PRXh_nwvdS; z6;PWdCmWMACCPSV0G48@XuBPMe=H>sP^NWI7@9{6UW)=&GbfodTdu>4gqJ9eNjDUt zjR&>;6F(DRheM7#j0u0cj=VFQ)7Ol~k(n72n6voeMl2By1qWX9zT!^-h2j~{L%pi8 zvCDVR51ZXRmlVg3guCJQI{p21zflJxI52}UZUm5*iCr|N+FF}ho6W8ltQLoi*MAY^ z25fcHuJ-#$)Rj4>9KKDq<-d;GNZM)e(z z%@#bZS3fpxT^bLCT*Ri~SMM>6($ERQOFAep*4WGDr`5iAu{F0d; zZZbU<&5wT|O}fb_NY4C+xvymnhc|G%8JpjW`K~tRf7F*-q@2yKLkd0!k19E$pb(r5 z|9hAf8mf%F8-m5hrG`pJG&x`K?)jqJJB?!Re2bFJx>DIQ+HCjO)BOf{Yh>p0jme-x z$qGJOjOX{7LQ%GQCB_F=quU=d7_ZkMX`RfmngZc2dbh4CoG@Xu+j_Pj-NnL!8dT1l zs)6q1D(%3B&SgH_<3Ef!Ir{3Qr*8OKs!O&;p%@VE=1{&bI(hmSfo&<1X_{EYdBrKe zefuu1D(e{$g__ymH`oOdmzOxJc`bMc7`bWmnv-9$6J3{xM-rsgvwknA!4;@wL+O88 zPKs4S_7@|$oS9>4cc@0&bl2%2NPAU5^Cfp9*^H6uF;|N_cEyjkdT2r>|2B% zMH|9bgAbl``&vasx;*ZeJKc3fCgI`N^yO`xy(Zz{GOU5+`mmyXq%rFTxkrX?e$B#^ zkBoNFw>-P_Km;8FQO=*7Pv`<7-js6*XHucT%n;wd)aXq~)5V0mpG2Wa2*Jn1M&>iY zN-TTZ%&O%gZ@`lEp)Vp=9-C!T1JsTn11d#WlgHxL+l2H8o%c3>yiSBhn_6hse87NZ z6;cKii{-_VpyH}7K1PYiIDwl)Nnl-7^2gJnF5B-4KvhT4S!2A6_`+!ZLPMuoVa#Mg zHT11t_^|*(MhP}X<{jn7#i#nL?;ZzH3#ZOmSiQK+m!ZQT3&@am!@nxQY-9=818Lh~ zxi&(bsV8>&4+~zdIAu%5|CS%*bz%m1dx#+e zZBP>K)hfhatyj<(3ghn=sdeo1uCYR)pym5uudH#Cd3Z@Wi+{CR9uu=DfNT6AMQWIWbXA{&$4=OwI+Etk?uYH$oR>%PK~!}E&AyHU zdR*?@ZB6@Fo7Q6v-q^T52Cc8ox7my8vG`28p49`?G@g5yuNFq*Y*224J0OVb^Z|2E zj`f3rsFy|I*FAD>#Yg1;{)Q+bPYdc*zQ`m5;i!>WZiO(lAgd!SJ91|9U!B zGJLrwscYxkY04x9o)584K`Dkmf5$SgX!E2Sa+tFh9bhAL-8l@3?_szq3aQif!+SN%0S`jWs^tB| zgY+Ozc33F`p_GbdcGj_1pV*U#M*NgrgswrQ3RqoL(YZe&LEnC!v+`>M{IpPu`fKwp&^Twdd! zW%Vo07Uck6Z}WPLCM$_MLQ$Bd9eZukTmu1R#$Hbvoo??K6CMlAZB>tvt~zefGwC}m zV4Y=Nj28TjFb+BAi(tWu!kb5lDCs&2D~j5PHrCO3&GZ*%hn*Z0z{HO zZ7gN2jLDs|hjfdS?4v@tG(VM}qXAYe;3Cku6!V;L9dgSf@1j(P8#exM%iw)J8y<0= z(@88N=q$g4!Ns@z2|`spkp=-Kvi-VjEaFKmtOFNMQeqW9Ff_j*s|&*QXOKsYw%rEn zf2JjcEnM*d@1GbP+*M;hjlR{DB?0UnE(SKXP0gmPdm`nFi8kug&`rZaa3?fG3iL|) z15VW4^IB_T58^>^E5zr6#q8z`4#y7q%4cg7mzzLVkJM*G9zHNIGoVWuJhcu7tNyju zp<1ztE1pq6q9N8CQ?`(FjV?#?=Yt5CCY;UOUwKl0IaS;A#P$d<p<;22rM9T>9t$8?P#<1j<*g~g?_>Cgyc6`02)w>&|bGuD}K)QEHV$2JAW{dsEIWBmOPn6>&_ zJ`Oq6`h<$Un>6_BxTR_YA>R5ij-P?! zY!ez9nQ7$xnw?qC*jGKzgrYp6>P(eYYRtJg?N7@TG&wbSi(kiTsux-U{(z{sv^1f( z$cINIRpWrtA{cMkgfv@+p>u*`TbWw;9oG@VI?r7CNuOsQiz~U;etNVv-S5s_AD#=O<22Q&VOZ}8{N`(g%NT2lP`$O;X##oDcsS;Mv`{O&SJQOLC)=Uz zh4p$EF(*wJS_LYzy0)H= z+lZbPvyCz`tJAW6U7x$A z1~zscJosIK)1xFPtLSb}_!&ZnzPJ)Y2-iOt^t9n3me;ePYs)r+dC_zbg~X_j&l&Bb z5DJEE`#RkIGM4@uoYSEWl@7;|`0YpB-)B+X?EIfFk%=& z`*;KG!7rkvsPeJJkb|$UZKh$UOm15^w+`X2+!jBc`&y}-?02yF!QEFsGQ$Ul*)SNSbuTq3H1EZ^`{~nIlf|`b zD|Yq^$?^tvlr(-1tnBV%gM?{@mX~Z6X1UOJ(R*>Z8CJlDTFP+ZCPCam5J!W#@D?`& z){l%Vt5z|=?B>l?11_|~+t{Ym zXd1W>^C=F;U!?VI2j6Vd=sWTc*FhY*H8t5O`U@xT8~X+; zLwo>6U?uF%W=X?GYSo{Ui{9PUyK2>1Rl^Z% z+WNto5YIa$nwp-E2xj01_2|~63EueZC9)N#>fD4loZt~TF9&(3e3p-*Yq&w0;3I0%$|1Mlubf1q%JMV~siVqd zRzsW^r1Z1MmQ*K0Rgw5KxuGBMSbo;)C~W|epPiHgBYvh!qTx2Ul9CHwhCPs^7xgn| zx>XI}sy)#|K6oI8ID0QcEZZEl5to`5fBhm5ef7y ze}p_rJxt?HE6l`zC4Y=2bo%l%K$5c8A?uJ@`*8|h_ldmViGro`{J{j@>|aNw^!n%| z|K95mv+w={2mEpJN{W7u%r6)tvI(}C?xlIHyHRHBfz zKRuQYjjdyw#6dnTj#*6k2f2-^astg* zCuW%~gquuI5{tiEv!U%B^yZTpvmDZ1$KV{bvk{8P@ww|(*xH=4LVI}HDLrlnRfYAu zZiYt5+&>N>9S+&no{sLCKze#1Wr5I#Nl?(b#U(#cwVJXo`AuhzBA6QA3|GE0lAby_|OWx zj&HL@JKk(hFO)YcBTU+m*4T&p$)4C>;2UkV6sd> z;xX-oA3d?hei9!dj|F}f5J&xc>K8r7sUt)hcHYxwous{`_f~2L@rc7pW`|NmOepva z_EtTf$qjfDC!w@fI`VX8azUDAr&O@90}8+EYHts3B6Y z04U0W?+;7G^^tpF2oc(oWczT+#qKQCRDgDf`a%(Dl5D8D|C_<{>#OM5f|mc2x~8US zFA$g{?Y%uU+@>aY$C=8(ruWt_QjbVMU&9T zuBa7HKdH zOy!4WaxveW+63iu7>o#Bq!n=%>T?D{h95^?UcK(AquJ>CBsgjZXWg-*|8~t|QCi5- zd6peZRBk>TNWJilh^D7E{w&HKJ5i@+>QT<|Ito)efX8LeVtL?HopPy zlig@i{tPHHrtGoIX}Rik=dDA+vyjguy*r*#<>{ULgMtFL)^iBi+vfd?Si;SX9E~@nk6T}2TQJQO^C_ss+F>``l?C1u`J+ba+qf5 z2A*vq{fP{GQ=IRYt6ei>4F&USDuBKMzb!CM?0Wpk^#b146x&{I6mEB$HkVJQlXX@5|e3IWRK@=vL>;aeV(jp{M~?)3wk4?kGfx@exewMMI@z`zJJ-Yoi+A}`xKBFE>6M6Iags#;Y%klO!sk7; zr)#HT=)2z;%_J(SlWg@UfK88wP+@ZwP&8&Zyw=eoi&&5{mT&Hks6(9BfPUOJXLHYw8??<<+-1tEcK*rXFclpALv8zU41`TN^Q?0no13i?& zQ_>vqr)KiBHqs3)n|N~+|P+7XxV z2TH-y46Jztg=Asd67MM`6HsE$t=YYpVy|h7@#dpVmXDT9W==<33>1uIi(}wo?{UXj z!?$UD4IQZpiP&mh)VZ8**Lr7TBPZm-_fMIcV;`wgssHNpQwGzU@3F4VlbCjOBrU!* zTPsj&Wt&fpaz~^4xq8(G$c(&R(Yy&r!esHB^YFOj&z|7ZC`8Hw zMWypDI&#H=6^d)6C(EzoY{iC{yJ$Dh^KW~11UAD@VK<*U|0{#O@Amb`eUH!Pzn!K! z7_~I|@voyio1<|{_ITsBL4O$30yx99zOE>A$`?cVm^+if; z$E(Ze)MS!aL_7>gGC{{V`Wcl7mLb3lDLgI}85-yGcK zy|l}iLrK~0QIIPtYBZM}Jo^c&{tga}I0k;Ic|!~1;+S1^e1D0J~Yu0K8nuvcqI#OPZed{;-BFy1iT#uYxV;1H*T4+Cd(ntKkFFUl7Rj^^ zA@X3i=Uh_I8d#fi2B8{GuPOuEE9MUUbM*v<4;$L^&Ir@s6lfK}Or8b28V0xl0E@up zC&1r^WijbZTCf!7IA}8mGwmsj8PgwWalpiV5Su^#OPH6IV5RMW7Aoqm_-2oMSi1qv zBm}$tWW#g=XR^-&L;QgX}^cS#H6ev65wTK`1f2ulAS7vER~< z*v&O=CsnIrz(W>7<6J5~gN)ErS^q6E+2vDtQ%vDXqDaU4$vpyRjBkzt-~6hpPjn&F zeQI=}6r^)D8EsGdRm5%oxFdl5RXZ3U6_=yTKz#RaV-fqJ{nN%Qtsx+hf+Tvk_Ufyi z|2BRYqp*UIo)R`TNklARA1=2?2PP}9y_#%kiK zlbr`+f1Oyx+4!Ef!LHls;oL+qsW_UtLFDvOuTKUpeKNWfhEwkWAE&>Yo*NZE$6#Pl zr8hix>Udw-0ev~3n*0g*(cmZ0+yp}DH34Ljt|ztYj$Qc#`s_eF*R6SsaZECJ_axAp zk-uzUnn_f}vTo`{Yf`bmi7I@UYzz~8#%@8u+fBy+iC??5f&VyYLal_xaWGNw>9LHw zYV=z@n(Jkzo1tC@!N^A!#Gv8|_QMmUB$)f3^+~neF@wqxs!zN3Ef)%p$(F(3@mNB$ zE}e?u!-|f^)%fNQ%$zMRFbZQ~0Aw}knMJ%l@Z+p5Hk|65l-1Eo)zsij3Mu%OP3Q z$D)?aJghJ9BuzgoA52(|BrEnQqz)-UtTof-qnc6a2{QAV67vv8_$#%#wwy?S8Inja zZaO@m%24aD0&0YIl!^YgAG0Mkq-0dBj#Ed6Pn!SFon9PfFv=22K8Uug#Q|pisM0s# zJ8}$TNyq)u^2|XGWVZ}v#6l9vU46^r8W22sHafkqQ)ar>a(-;GU?7464KM-cPYZ0Y*5zlq9F)O+1jrTQ+kXX}k7I1a6L z77bO>7c--*K%|4Ld=?@x?o5IX{5qs89Eir%dQ(jR~_I2l(Q>x zz&kzz*jFL7HNH6nc&fcoyfjxLnNinVT%`ehsJLK>K43Z1~+t6*HSXZAF8 z_!l>bB3vR&W4NbGe5zl#MYx|rAu2u)VbBA<0arBMNG8V$l$uSe1Y7ndm*B@xZ1}bC z(>u!v{tpcD$$;P4I_i0~CRPTl0xF>SL}k?jV3xYH-=I-hle(kr_6bgt_WRzK)Q}Hk zi{m`p8dx|KyRo^K=(qPZ{m&$0pzuNHLX-s!31RCpGO@P^A-PQ$wT+~Ee1n1(^Fw4u z>1)sa#Q8I0Yr=o{+$jTLxym8Eb|)~EB7f^)6^|{XbvHU>XNx%!;Ug{V2|9|k5~Ztm zG(>fnxnMKkLM7O6q^X-N#3I45bDp(5_SQWKOBfW6dAw5g=C@nu^^*@r7o@$tsO=rT zdXI)?+%&;lMIb32jE=vtQ8Z4J@SU%4*09l?Nz9`j*qlJyloWPFWY7wUr0odx0UKT% zW27RVMefGvtb+YTx;Re-@<1w8zR+e6|KDbL|F>B&bozkJ*f2m9HLym(H;)bpxo#~J zDqKS%8=V{a3X$Ac19UP)3(;)Mc0_cLQ~R6A0j;{xz^pMub}zSn{Qz)x0+MZ9p#`b) zu^NDtkK}x#TK6AB-A{%s8yrZ;BmNlE;(}P&^%>8SMq!quZ25}f+V{q54$QMjcyMD01KOyk?uc{sDRxyq z#QQ|4mLe*K~)FC1X{LzC`Gj8(~Z@coi)JFBGj-e%gRjR&R{(~n>%W& z2`YFvrwy8Q#WS{DWgy8-tU|7Hl_&m+<~F+07tNZ$+W*$_e^&x>5uEtHwcu)kS7F8> z5qV=()s}4w2w(gmgOG*~R*Wnh@eTyloJbgySAz$0r7R|h{0Wju;?FziCkClv)w-R{ z8%0+|l?1zke#O>D>pG-r=|GZXL(veAQY0G%?V>5~xJ-zxL1+vb^%Q?RdgrSs!w89< zwd!VeP6p?W(q95Kk3IFVv}-r`o8dy#GhzCcF5%%iDt(`PVcU{9^Cab%cU~V+#KT7K z!pe4A`{q}tq+fw!0*k3n>aRHlCUvfgVZs^sO2Q6#qCA2BYde?!ovSpA1YJ}(;#NVV zc_-!&tf7@kHeyq5{b472GLT9%iA5LKS8|=hN1c~fusYr}trAufcMM6?IK>H#8NnZ# z^d-8>oSomlEgP!-FhRv}Ezr}NAaygcQ>a+dLwG9464NmiN?YEcso;`%wB3XS~j6RY!h-UZ6_4kFA>^*|cjUPjd zSAd;-GoZh|;}f(asw)#)l)5Ax9$Mz$2vXVD8gI7B-^gYV7pikOu?M2dY<6H`mUcTw zLN>K=kg}e>=xj+TQUO}5a7aI%-geWuO{Zppe2YbwR3JLhao_M5^cVz3xDspzF@32B zMF;G+w*Jii#(5-`NYNeZaw{Y5#x@J>J*5#^s z8m^0&>k@G{sM~4lfBD`UR4!5zeTO@`S-jq3fi7bTAUvg-wi=RiASTPADdpe5@3n6jKMV%_agC zjelLWM*k3p8);2*JE1;@m#(I9drEqv2Bb34OY4Ed`u}c~%YR!HENIBeC8%y;>SAI4 zv&4ge#B@_XCn0gs!!^$SN5fOQsWFU+VvhkB@ULx8eh!hhSH%VmVAgAlErmZ=alP-CHxV%yUH4)+`?$1>GX6VXkG)n8K^VpuxH}ANCL!j$EAWt%qGJLBO)(FMD+QCTLx@sR zKn(WlxVX&=4=EldC$08%%tUU54Xn8C`8%Cdff0gSF(%LYjza-LCo!>oJ_7v} zorx&ZcxN2a)>ChP{T~1@Q+bS+rU=zmXL0{lqRGKnrZ1@*-epnjbinKrn1&IYDV zRi&t%B|`iF%X&h>fiGwa?_GWc?zjt@N_)+MvvkC&vP*2u??~$QXqP_up%!+0%5L_j zbesFGcsgXSZ04J9FQ8lyB+2H?nzdX$5Lq#U2u++4L!?4G9k=kR5smBL*9th=x zcF)@%KPOV9E}|;MJ){&2kxF;yK{7O7=Gd#8>1+D@sYQ{xfh?Tu%F1i}AFVqJDzDvE z-+F1_qR^qdDdh&Z$m2<7GWDAkVz%3(FOKy(hcU<8Wmz}j|NHZSID=R5U)K-M$_V+T zy;2jK(F?=--2x7{!R{efej!!1BAmidDlp^t#(l@a*uD&jAU z!73BQQ$dUF_b4!MGMmE-QwI3C6j0N}?#yUs{n79;nc~&y#;`Ya2Ud79YUqCqNT9bc z;H}r^`|GWD11VR=c8%0j3dN zH8NnDl$IwF|33mr+y#;9jnXp53u_cXd(5{7+H&?5D-tr#z=LfvV=+Ib19j|JFD_P1 z0+$vW+2XV2hV0K`nPN=|x^|(p4^7Z>31U6t4!AF@yb9UeJ{Q2-tOLdp+`{o|MQZt; z06LMr$d@fV1o9PXVaD$|q47t!1)wmht3T&UhY{odA|5@SnSaM8JHb(}l!F#N1fj5I z;CeVv7)y$ANq9F^ghYf^8fL;R$%~w0wh;{n-;uBZv)jwW56D$HWLEAKl31`)02VEk z_M-ATXm4eUd5ly7c+6M1*K={JQxPL8{(q6;uGg|#=6`Xp&jkpp7Ph2YI6RJv;Mxft zIP*|}*yt>+0@G!)@8(gjr3b-P9%`FHrJES!Iv98seBKx!x7C5(bD7Yc9+vHP4*Kih z_Wfpdh8PwtF4A@3lPo5(vH=qV7ndAe4e8+yNS)8s777KedSP#>>c0k-U=uc16qStQ zj9cUq@m98;C$JL*1+Cc?z>Kz|QG)!}#R5FPoQc~T8kH5Jf-)KP>?kS`(CX#yI~$=mE^vG=e(^2zNfW8 z(w{{xIStcjbDqOmA*7U=<5>(=n4^$Mm6<3M}C8C96u zn*`xVY)G&5BN2~rLew}!3F@EN0@%?7_A5Sl7$$rOGga0$cE2gD{;`Xpl|r<$gIBb( zg$HvVQ@4Mw23Iq_e=&6fNxXzE2joEE_{m$Il=v;6tuYkKb+q93OCQ)r8A zZDShj-D4%wAPPS2B}zu)7&IvgXUL9N17Em8S)g|}pru(Ynp=4>HTe6I*e)0G30?OJ z%9~j?9_ntrYC_lG;`o*;O2eKR^tpa9l~vM-^~$&!Lb}q1AVCFcH@p zl-%fUw9Iqo@o);elgdKdd=6nZJ{;n*EaI%jR$o4^fE*o;Cg~|rfvvz}aZCWE_rz!v zNc$w##DJWk1to}+mbXD9rt9C9s~#51B?W(LZi|O{7SYi%VtQ~#P>uIy>n;D}WP+A? zdwGfKA!loiDxacVJ^(g_DSGSU^F=1^D z^W-9OrG(KWRrAjc9af0DnyT(@5y91V1I7InHJtR{sYb-k^(@>D1ruqUIw|xSwSiy; zJWkk`g*gXM!*>VX%odFVzwOePEOAk(Hkz0vQsg6Xe{TzWc*mOPcLnkw>l5wl?J2fWMjh0DTJZ7iqt`+P`Ee`jhps zI8sdrolq;m2NCA(3b6}|i~HGo*Lm2zl*;?PLcK;IpkRZ`%a+oD`jFSRZi{PRYhd<- z#!?n+4gCUek{Vh+aA;6O`s;c)lJ?lemL~%Q7{JS2)`e+{+B{1POdU8yDh_F88+=T% zCZd*!lUKPeJ3C+I?Qd6-&WcgsZ7n?>4zb4F&lp?It#Uv|9%i<`$iTa@RyS7J4g$Nq zBETWzYOd)lKe1)jUkGG~Gt(iINDtQ2DMZ#!kHX4FHn8}}r{5~VDZS5};yT0YhE$P3 zvUH#!*K5;w2ZYBQK}m9gl~Dy7KYl_XF0~O%qn)17pozXy z&`c=(7GoLy1Fam5Bi;0{3FbGeuC*+!q0!uA>|GX1Mo-cwf{Kn_W~3_S&vyUv4GE5d z#bTRpdeLhwU46HyDT~B)ju;x9J2(m8ZLIkYZ@%-TK*Mx9L7gB(tKfxJX6+$nMX@9s zO~2N$gH#_A{tMc?#^>#94#}fcT40A=x+swF#ZNV88bN@HRxl)?v6)1yKl@p z_8-PZZhLF0OgNOCscSd>g(a%^g8f}(5*Cfke;zsx8XLw|_QsJBQbgy0TIrmT;>EJ7 zbRS_%L*?Oh&&kNhC;|c%ZCH9I4};l_jErEQuaf|QfrI_HBd)RG?VE^o?O&4@dE7wi z3la%68>#rJJ1!kiO~~p|?j>!mOX?QW%%sVv=tjvqX&_UY#oA%WqV7$UTET{I=xjt=u}tVask$0IffO?4IJ z@q^|Ql`O}+$A<}}i&bIy{zsFJ%ZpC{&7cK#opq0T`Rb$`K!xFupOPKa_ z{{Hc0d(->=Gx(wR8(0t3dC1}&ZK6p!&@*}~05?S*ofX`=O+Od%67T*z9egzV*JQxJ2jLPg2AYrlAG|xxlM{B;?msvJHpI|fLbal}fVjVa;vUNjzlF=sA>^KT zR^i%d`avlFY0>vGgyg6mfAs6u`=rLx_!yTXjG`^7&_#_<=$qgRpr_9i)Og?{K z_%5jkBRHG0(*r)CPNZ8vGpo5v#l~Bx;}f^cnB(Vl0zSW=`ad&!QDc5<_49?=#r zVF9O#BHU5VxkEI5+bj@K5kW(j2Ym8%;r`e>lDT$E2G6)7xAIx6c_Cr%j4hBG+=@1%hTa+Wpu=PAqfd>a%Ha(_T~#7g#*%Nuy_mdAadG+lwiH8F$gJx z2Ym$86Z>sN!n6}@eUQqlkGJozo&AguE;j(|>Dlc1!*oEv7M~_@^E0<0JBegXHdlSe zK)9XI;G7VobTf<^qWHW4OG5$lw=O9In=tQaqMr-33Z!R}AA0C`Z_s$c6~yeYpUeM; zCCY@nB=xQt*x!DB!rm<_2*K0ux$3IACE~~(Z=39-;0MOuN%)Mm>cScvAXfnm$hGyb ztr<9%WNiI@e=`M^9b)oBR1%@@!lXMm|4SvF?u8A_vpavnt6Y(){b_V^3HQ+txOr0(?B#b%&%z}Kn!=V6A=dgLB>#f;#-@xzmWComc zo{D%jMixWNsZ6rtD*d(n*L#rAv*3*=UGIQt>-_7sMl+S}NXRz)HI-!mauoD6!3HES zyP6Q}>I$@JPgq{?m3E3AphBNIg-xY3h08RXQ2GyvuB;+Sd1P}2DbyOgVvLSf{lrLV zS`I%CaTU^5H{X5{_QpNI#7?bJ6r3N0wwTn9`HAR^A((J$?`-xCT>pF;r4<%JObtw{ zW|N`?yy|(r8<{9v2IbQ$vV}zG1aEDJY?-mDM;1kW&)dFETd&#*wN(?)K4rZ1gV9)> zAgo?onGSB1kTXX(1s9;1Iwjw4WfWq7_r_JD8`B-ja-U^CfvVk*y$<8DebW#P}!LYwR=1kB|lM z3T(%%WE6Hm-C6PuS=<9BZ!+F2gXGIxfAC6+FyHZhX`^)1y-kKRX<8?6c6K+)#Lt_a z8VTP#A^rqIRSG83^Q*$77scGkPkW-bo8BWj_#U%Gr3pFo3YK{W-MrM~Wp{N6_`_abJpBM6_9pWmL8 zN;m5X+D15^_r@JZJj|HgEWXKDNle@BnT?x19eCb(;5bt+h~99a1mxP-TILI##to?}HrE^vY^@%P3p{cx+JrkzOW zk%fnJw}c=4;nCyTTa-~MOe=<6&_VX_xqAWDOV$3?8m!3j+M&=P9oARAgf=hLGwc|&NR`67Fp zxeBfLwEgZu+$h1wS~2C`x>SP(C) zw4zw?La4%`Rw28Jgj`p~+?kw)J4sGA>lBqbs=wG@B6@mD56GU_h6b17+CeLL8w2ac z#~{6cua!FNE$O&HW6`A@bVzMYO$Gy^f|z#sGk@=a5ct~J_c?kl4L5Tj%|g=zI@&;1PDRZhVg2c zA7bb?v3D!CU@nahZSa=k!t*AZ)A4d*F0_oX{ad`%^r+VVgH0?~;K%SW7h;C$jcpJc z2`%>Cj%jmooo6^li0y@RooS+_`HR1i&L9q*JFuHs@2c5Y?Y|;q=flo;?>2Tc8+8I~ z9_hdbw?-?pDvR8{O_2KCaH7niF4Xwmz0W-Jov_Fc72jyng2J^_--d*3NNouzsmFsl z!c>E16Bsw3joCxRAu9GvAMjUvbRy1t$;eaSD_nAH!fq^X-D$mV#CeeM{kDSTi{{tAqGwh%Io{p^Ur7E#mS5%3>9!c>$tM%Lr#1uH(a;) zf5Du31tUDV2SQ3N?!UPd<(16-D=!5_Z}T$wL$3gj)*})p=do6X0t_WXr;>v)T&#eP z83r*+{IQ5eb{5;axY26-(;}Q&CD7{#ZG$fWmq%MzHT18UJPc~gedM|c)4JyY5TnM0u=0J=OM#HnQflaSb9+2i zDdI!NP87=korFTvbFk6pIA8he?1vp*#f!AF<#EzeCVX@hTs|c%00(kpBM!!=W3j_L(YQ5l;u(G!9iouS9u_oFzank!l`Ps z-V$?8U#csd1O|MA)GU8lJG`V=eZu$7(XExBFR;B@D&gsEhp zPL>@FF@CA2!)Nt+|B(g5R=0L922{uvr^~E`&%6)&jFNvzr|)3Jk=svgYiw;9itcQV zk9!lDKr@++C|=~i)A_Yt@0%Cl;pi5D;o7nGkjRFP#RPt>CQ(F0R|_4X1XKemDnUpU zL5z#P(UIQkq&8@ZZy_P3C=62YkZ)O;E~0702_+jDNR3j%*ur1lA&9q%*D|`L%sK_o zDh$K|-~vaqSom->r6k_u`9qctfJb&MsE&uu6mv2apw0q5v&n#m1M}rqrk^75HnxZs zg3K#(wW`M>dfOnM4**(*24#S~*A!W%0(-s+8@YGHH?y`miQ zk>_L;*-egEoob@bTj$?=Gv(hEW1R8Pz92$}){felEaf#p>{;zHHbhE zZSx0%;UAV{t|X<)@mQn-VG7u}ue#A_$fgLCrk+EJ{r;6y<4;?BCQvCK{#qsC!AG`B zr>8ZH!yiTWM_A}E?$lNEl_ff#z74Xnc-0UL)p5=d_PH1wW%6MyO0bDuUsLhAaflc@ z?WU%M99D;jT=FeH#J%z`ubNx(ux?2O+dE(>^Z<4HM`1Lqbb@~3`cF=6(BHlX$0uB& zYDRQ9MeWyvPCyP@%G4_@z{c5bvbdg`ToM0?xCya7@~Zu%4AZgqE%x_Lq>DIX9rz1Y z&q5GtvCv(FsG&qp$}gWbn;I(3-(9K+7CWYpYuC(AkLu2(*D&Kkce(*ZmL3-R ztSefyALo84;eL+SPVs)k=ZYF$!vp4SaRQ{HE$pkqmG6qVK)w#}vV`1A;fv5rRB;!P z{j4oS`nQTCWa^H52kizf0%tbY_M%tb{WaDIxokx{` z?9LpGefCf-rD?8}!{|K6htg2<21Xj`lwr338V+N#RAYlI$ZE*9rIWi@W~4u%*#jv0 ziWBX&=6)^J(!Vr>HEfEO5*u%4h3)parkqdmv3CO~zO&&3eBvY<4VxJ8#&iUOrIGZ*Jo4Ms)2+-@vf?&#?HGmKdT`;zmnFtN=8>*Hy&v_WPmTGmwT7 z&7i??Yb0&?X^_^nT)m}#AtU{-n{QADzb>f4@{k(gGJ^9Iq2Oo2oqq)1PI9mv#1$to z1OAZJ5=@|1_Jz&QY!^!|_JBxMOGpaa2q^~T@yk#N1t~6R<-Dm=yNVV{-a2w!ruOLf zbZRaC{S+k;1@Nrcnk&qduYnO$*Vd2Ow5;3H*_J0M99pvu3dxp0{nchYqbA>mwb0`Z zx|(%xfYC-7*(Kt#DD3yjo`~YcCMFO%_=>&mc~a7eCrzYrrE>c)6yls#} z+VetQ{c+VuSjZ&w_5Abwv;UvK+*m`fhMA^2WF!7uRRtcA@H%S*oAC)lk((29=93T5Oi3 zw@QR*>mUV#t$2egOo{@prplt*z%$h0pU9*aQ{!|WQohROA!=Wuz!|zU7`U){W$fhTQa<9 z;K@GO?ZOm0IfzWkII)*v$v?N4YeWprqaNx>mtk3Bg()4wKc^TiP0Wdq!)_#AGvV&85seddxmtiv>P(j<`j^ z~ZsLhRX8ZakFklZQ2B{*Jc%{jsftq;Tc3A zeFl#xo4HTTc3*%C(}JoKk(sww5-*wrsa3M@ZfhlsUHjWA{6c?sCy*2rAiw0hl9u~c zVBg$gOkaz`W4ryV#y))Td-mN~?)i$w=XH_izh?N@xeCl@wSPFMF!bLi(D|CPJxy>7 zcwp3N_YzS;^lUp{?s-#79?HQ1T)n)e^1{%e)%iRV#h1T+z788bJ@e{2L^7Um5{~qC z*nQ-v-J;~APi>jYGdnLPZh-xl^$s*q3Ydhp93M-PaehEoVgDCdBkJW>E<=8e zoMfOp`+SK1c*`#(f&Y3_nm;T(mTv$zTZ1#nuj=eat+MGS`YRNtL485x`jXht*-@lo zlSy}2Lqj4fH{oY65qF|-N%KS6x>DhraMZg7HbFk@1Y4s!+SZTe zOAI~<(weVqFYuVl#M96F=8gsT0S+zd-l&W;$Ih-BJBy|mqaXLUP zBxv0pv4M_Gn@#^=s{Ra2mCF(^e?!sZv#ZuV8IxIm#j=l9*vO2>@y+f4Sd+F3j;H=N zCSyIWMZ?TrqbkLHZeo0h_qc)}O|3hm2+}nB?HnGXE`A_Tx3Am$TTFkGfj!^9Z@=AR zsqqyt5%69MbX6oE(VXh!(eCHi$DSBA1{;sFuM9mlT9!5=k~JRPKRGmw!Q`x1;~ZY zNyaG8jUg)cr12B>_olvO;%F90e3s~qphweoPoOekm$yXAP9{sMJ%pz7c3%dlOl3

*b=faW+_l7n@%jmA!>8v!X3zHCc%`FAEQb+s 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�rHiwPchga+j$?$K^h|Cu#p5FiWls30?+1B z<|*apWh`t@Tuzi9!@D(NDL^Ig&Wq9+pm`>g{#h@gn;57w&iZ*$GO{< zjY{4w&~KpQxWsw4hcbVu6>!*>&prpaK zRP~_@m-{-Z5C#o~i7GfY>1;-dX0vlZixehNj^y}65*a#2}_BS`6U+G13X(gD{5fv32a`b}i@*hIG~YryjY z$uEYdqoX5khckQj?($_!#x~gG>p4&iika@=w|qF_ke21U9>ZF~bCO>jRj11t}7S9d3-0qiOdum=n--%{-fCu^Q-0}37vTGc^$s`9)PbAK!^_26CEE6+z=R74 zD2u(_cNzNZ<&6K`ww-&TqzihsveJ$i<*6Ti>9X`>3NpyONfE{w1ZjQoL|bPc_@WU^ ztV1fs&~Hxb;#ML0mOstD$MSTr8mv1D&H(H7-+@;Lq#-)DE{p;R zFQt81k&dMmG@xH#Yrkjv(Y>zMilD(3jcJw_eN^1?-CRMCK$=SPPiHA9TV$jqgd(R& z8{Xp~VEN<4?u6GN+4}T%XuospdyK_GhH@vt%?5-uy#sWBAAR3{R zx3_&;ftT0NiDlolr-M2J>j*53(85*LuoXn*vOrX1;bRlA3=jWZTwtA2D7Awy;}p#@p<9v!*v1=RdO=P%{x7z^GODg@ z={6xifZz}a?gtAR+%34fC+NX7xRc=S?(XjH?k>UI-R14{?Y@2A7~ik_%HZt1s%lov zIalo|GCC46qqLTe@)S+I%)0SDwYKJcBinpwf8=PU$(9Q7l6W+CWs;@ zLH+^%WOl2lQu*joxrGuHlTPdpRq?_Ma-rg0*4hNH6

4Z25OjJW^J5TGYiNFUvd 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 U-V(Y8^0l@)9?fVd8VCy<`COnv z&L${}+BOgqk`l+U1aFF&=Jdd83JL-jPy{^o;gMNIWS}nLi|y&jK@8cw^jePa?@#ON z#DLU9_C?yp<9-;3i&b-C5RPnm7+=@lV!w9sTy!s(Hdbpi0X5|Sxqbo->|9KgU<{c- z7S#%z6mRc=A<~9(2aY)vnTw0OMGXb1n4?*;NuM7v{dIn(wANU^J@WPFhcwcb@eT`>iIGXzeo4^N-=d^`SR@<1 zFR#&<=6xHNMXM~s_(sd&@>W`0JwnXt&eNM+qb{w7T$%3ce#(ws-fEiw z#Z--4Xz}W*z&-osRDw&3U50DPiR!BioWzQyvMV z2ai2hRs+9;opala!D|gU%jBv-JE?j7SX~>OQFM~%tSrfuV?uc7PSKlHW=c?`(?jtL zFOxW#^yt*^NcBXbg~s%H`lB)zFK-iHNshE1y$c!Wd?ddum`LTM_?cMpOwDMBH;IML z@L=o@x-$8HPK-$yPL75-Kk6)Bqj73BsZmME;I*#ZLQmb-h4

M+Rf5FQVM@>AP(g zu!4)%4PLtX++)GjdUoz*f7Y`M1BK(LG0KmvABQUDE4iw zlTYXC+4SW3PB*zEKaIPp{rt4j9AAia-+ebGV9BqhrcR}h2Nt+P^dOz7-O&`@jW@eE zdVcgH9rGQzn$wlFoR@{qMnAoW!ntMfP~HgM?Y+^*vM^l+CQoIoJ-=IH`enX(&t8|p zU*wB7idRX%?=BLf-2T*gF{YIHjd)jETW3$H*E?bBPV#@V0G|CszvBnGVD?h}kBY^G z8>SujNH<4v80AB|HeL&1R&vT|HSLyW`}MGU=2bY|8QD_zvrH(osEb#&^GPC59=QMq zYFv_rnjxo`BBE}la0htpK&~^Pi$BT9^th@f$VWD-m56vxZ1_s)R_cw(CbQAL!^k~p zSdO4DWCTnG_Mk+_2Pc$qm-bDS*ZnOo1H{@F=z_pxC^vt_iYV{f;41918QLW3^UWP_ zTU6I$Q_8JdLc?d*%sq6Un{}dv+>%(E=SeK8zCR-aj6M!v(){Seo6_e;?h=k@8sZ{M z#&m@>!}EMUeh=Vn#o^=L&Q@LcUQS3C<5l=z>AKw|j@t!7W%?Xz4aU7Q@Q*Vl-b3|< z3&Vf2T^lN$%PNC~s<{xv;5x)@F!$Cl$Ysu2|1S7E-Tkpr;T$_qx!S`bx;rr;veE{k{sL~u(wnf}{F-wN#8NE&AnK@6Ji;NvIQPNXQ zl~jADwjG8gDtG!vNSpXo3bfhBt4r6;ZPu{Xpo)r-Y{5+YlwBmtcnRK{+C2By@Qhr6`}t8P4GD- zDkw(z{j;faD^A(mwMS-~D_)=&2E%W>KcR4P8PBnLQ^!IxU^X zQKr`H<9f+xzzL&Q8Aa&*$Ii*>^#@i7Wf@zP4WQ_fed%tfOBRT7FJILYww)IFIz?BA zZExFg|o($hp%85QDledaa`Zi?^hp2q<-6$2!;);pCc-H zll+u9rZNZ_6YU8=g@ z>0=MpY3YeH%Whcl^rvNT+7*TnG!Oo!&l?Wut^^yP4F3{V_J*`S#`1OAuQa*Q9G*BC zJ(NxbPAf#dzn+_4k&HUx&&Lde&{H!ilI|Z^hN;2*fC>8QFZ7+vH!0ke1Oeq%s@X=5 z;R+ho+*Zi zgf1zR+Lc`#_wz{B29qEw?FJ%szkr!Zx%H9EIH492Gvlrg4w6wSs)~fzKehFx=qm#s zJPX+w|Al(DdvnSfh~4fQ1MVLxD+

a$DHYEnFjg-~ZB_A@gnU3sJYA42+ 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

xv{dwat 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

Y54`8OJ2$MKk1Le8Uasf1vcvZQOD5+ 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%0DZE68TFs{h76C*-`^@R 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�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

_ig`f)Wie|9+$6Lll6Ul=20@Y77^k$+Re-% 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

nmxUa7sSQ+J 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 literal 0 HcmV?d00001 diff --git a/akka-docs/src/main/paradox/typed/images/delivery-work-pulling-2.png b/akka-docs/src/main/paradox/typed/images/delivery-work-pulling-2.png new file mode 100644 index 0000000000000000000000000000000000000000..8c70ea1713aa90f8d5c07fdecfdc07321f5b99a8 GIT binary patch literal 171136 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

^A0YjtrmwmhNf4lV6cfL@?Rp+J|ttW}t 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

5EJk_P!V(XJJQC{DlkT8px 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

=62*4SbMX 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

c}dO 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 literal 0 HcmV?d00001 diff --git a/akka-docs/src/main/paradox/typed/index-cluster.md b/akka-docs/src/main/paradox/typed/index-cluster.md index c5741a7a962..a17e0dca738 100644 --- a/akka-docs/src/main/paradox/typed/index-cluster.md +++ b/akka-docs/src/main/paradox/typed/index-cluster.md @@ -18,6 +18,7 @@ project.description: Akka Cluster concepts, node membership service, CRDT Distri * [sharded-daemon-process](cluster-sharded-daemon-process.md) * [cluster-dc](cluster-dc.md) * [distributed-pub-sub](distributed-pub-sub.md) +* [reliable-delivery](reliable-delivery.md) * [serialization](../serialization.md) * [serialization-jackson](../serialization-jackson.md) * [multi-jvm-testing](../multi-jvm-testing.md) diff --git a/akka-docs/src/main/paradox/typed/reliable-delivery.md b/akka-docs/src/main/paradox/typed/reliable-delivery.md new file mode 100644 index 00000000000..e86d30a43c6 --- /dev/null +++ b/akka-docs/src/main/paradox/typed/reliable-delivery.md @@ -0,0 +1,413 @@ +--- +project.description: Reliable delivery and flow control of messages between actors. +--- +# Reliable delivery + +For the Akka Classic documentation of this feature see @ref:[Classic At-Least-Once Delivery](../persistence.md#at-least-once-delivery). + +@@@ warning + +This module is currently marked as @ref:[may change](../common/may-change.md) because it is a new feature that +needs feedback from real usage before finalizing the API. This means that API or semantics can change without +warning or deprecation period. It is also not recommended to use this module in production just yet. + +@@@ + +## Module info + +To use reliable delivery, add the module to your project: + +@@dependency[sbt,Maven,Gradle] { + group=com.typesafe.akka + artifact=akka-actor-typed_$scala.binary_version$ + version=$akka.version$ +} + +## Introduction + +Normal @ref:[message delivery reliability](../general/message-delivery-reliability.md) is at-most once delivery, which +means that messages may be lost. That should be rare, but still possible. + +For interactions between some actors that is not acceptable and at-least once delivery or effectively once processing +is needed. The tools for reliable delivery described here help with implementing that. It can't be achieved +automatically under the hood without collaboration from the application because confirming when a message has been +fully processed is a business level concern. Only ensuring that it was transferred over the network or delivered to +the mailbox of the actor would not be enough, since it may crash right after without being processed. + +Lost messages are detected, resent and deduplicated as needed. In addition, it also includes flow control for +the sending of messages to avoid that a fast producer overwhelms a slower consumer or sends messages at +a higher rate than what can be transferred over the network. This can be a common problem in interactions between +actors, resulting in fatal errors like `OutOfMemoryError` because too many messages are queued in the mailboxes +of the actors. The detection of lost messages and the flow control is driven by the consumer side, which means +that the producer side will not send faster than the demand requested by the consumer side. The producer side will +not push resends unless requested by the consumer side. + +There are 3 supported patterns, which are described in the following sections: + +* @ref:[Point-to-point](#point-to-point) +* @ref:[Work pulling](#work-pulling) +* @ref:[Sharding](#sharding) + +## Point-to-point + +Point-to-point reliable delivery between a single producer actor sending messages and a single consumer actor +receiving the messages. + +Messages are sent from the producer to @apidoc[ProducerController] and via @apidoc[ConsumerController] actors, which +handle the delivery and confirmation of the processing in the destination consumer actor. + +![delivery-p2p-1.png](./images/delivery-p2p-1.png) + +The producer actor will start the flow by sending a `ProducerController.Start` message to +the `ProducerController`. + +The `ProducerController` sends `RequestNext` to the producer, which is then allowed to send one +message to the `ProducerController`. Thereafter the producer will receive a new `RequestNext` +when it's allowed to send one more message. + +The producer and `ProducerController` actors are supposed to be local so that these messages are +fast and not lost. This is enforced by a runtime check. + +Similarly, on the consumer side the destination consumer actor will start the flow by sending an +initial `ConsumerController.Start` message to the `ConsumerController`. + +For the `ProducerController` to know where to send the messages it must be connected with the +`ConsumerController`. You do this is with `ProducerController.RegisterConsumer` or +`ConsumerController.RegisterToProducerController` messages. When using the the point-to-point pattern +it is the application's responsibility to connect them together. For example, by sending the `ActorRef` +in an ordinary message to the other side, or register the `ActorRef` in the @ref:[Receptionist](actor-discovery.md) +and find it on the other side. + +You must also take measures to reconnect them if any of the sides crashes, for example by watching it +for termination. + +Received messages from the producer are wrapped in `ConsumerController.Delivery` when sent to the consumer, +which is supposed to reply with `ConsumerController.Confirmed` when it has processed the message. +Next message is not delivered until the previous is confirmed. More messages from the producer that arrive +while waiting for the confirmation are stashed by the `ConsumerController` and delivered when the previous +message is confirmed. + +The consumer and the `ConsumerController` actors are supposed to be local so that these messages are fast +and not lost. This is enforced by a runtime check. + +Many unconfirmed messages can be in flight between the `ProducerController` and `ConsumerController`, but +it is limited by a flow control window. The flow control is driven by the consumer side, which means that +the `ProducerController` will not send faster than the demand requested by the `ConsumerController`. + +### Point-to-point example + +An example of a fibonacci number generator (producer): + +Scala +: @@snip [PointToPointDocExample.scala](/akka-cluster-sharding-typed/src/test/scala/docs/delivery/PointToPointDocExample.scala) { #imports #producer } + +Java +: @@snip [PointToPointDocExample.java](/akka-cluster-sharding-typed/src/test/java/jdocs/delivery/PointToPointDocExample.java) { #imports #producer } + +and consumer of the fibonacci numbers: + +Scala +: @@snip [PointToPointDocExample.scala](/akka-cluster-sharding-typed/src/test/scala/docs/delivery/PointToPointDocExample.scala) { #consumer } + +Java +: @@snip [PointToPointDocExample.java](/akka-cluster-sharding-typed/src/test/java/jdocs/delivery/PointToPointDocExample.java) { #consumer } + +The `FibonacciProducer` sends the messages to a `ProducerController`. The `FibonacciConsumer` receives the messages +from a `ConsumerController`. Note how the `ActorRef` in the `Start` messages are constructed as message adapters to map +the `RequestNext` and `Delivery` to the protocol of the producer and consumer actors respectively. + +The `ConsumerController` and `ProducerController` are connected via the `ConsumerController.RegisterToProducerController` +message. The `ActorRef` of the `ProducerController` can be shared between producer and consumer sides with ordinary +messages, or by using the `Receptionist`. Alternatively, they can be connected in the other direction by sending +`ProducerController.RegisterConsumer` to the `ProducerController`. + +Scala +: @@snip [PointToPointDocExample.scala](/akka-cluster-sharding-typed/src/test/scala/docs/delivery/PointToPointDocExample.scala) { #connect } + +Java +: @@snip [PointToPointDocExample.java](/akka-cluster-sharding-typed/src/test/java/jdocs/delivery/PointToPointDocExample.java) { #connect } + +### Point-to-point delivery semantics + +As long as neither producer nor consumer crash the messages are delivered to the consumer actor in the same order +as they were sent as they were sent to the `ProducerController`, without loss or duplicates. Meaning effectively +once processing without any business level deduplication. + +Unconfirmed messages may be lost if the producer crashes. To avoid that you need to enable the @ref:[durable +queue](#durable-producer) on the producer side. The stored unconfirmed messages will be redelivered when the +corresponding producer is started again. Even if the same `ConsumerController` instance is used there may be +delivery of messages that had already been processed but the fact that they were confirmed had not been stored yet. +Meaning at-least once delivery. + +If the consumer crashes a new `ConsumerController` can be connected to the original `ProducerConsumer` +without restarting it. The `ProducerConsumer` will then redeliver all unconfirmed messages. In that case +the unconfirmed messages will be delivered to the new consumer, and some of these may already have been +processed by the previous consumer. +Meaning at-least once delivery. + +## Work pulling + +Work pulling is a pattern where several worker actors pull tasks in their own pace from +a shared work manager instead of that the manager pushes work to the workers blindly +without knowing their individual capacity and current availability. + +One important property is that the order of the messages should not matter, because each +message is routed randomly to one of the workers with demand. In other words, two subsequent +messages may be routed to two different workers and processed independent of each other. + +Messages are sent from the producer to @apidoc[WorkPullingProducerController] and via @apidoc[ConsumerController] +actors, which handle the delivery and confirmation of the processing in the destination worker (consumer) actor. + +![delivery-work-pulling-1.png](./images/delivery-work-pulling-1.png) + +and adding another worker + +![delivery-work-pulling-2.png](./images/delivery-work-pulling-2.png) + +A worker actor (consumer) and its `ConsumerController` is dynamically registered to the +`WorkPullingProducerController` via a `ServiceKey`. It will register itself to the +@ref:[Receptionist](actor-discovery.md), and the `WorkPullingProducerController` +subscribes to the same key to find active workers. In this way workers can be dynamically +added or removed from any node in the cluster. + +The work manager (producer) actor will start the flow by sending a `WorkPullingProducerController.Start` +message to the `WorkPullingProducerController`. + +The `WorkPullingProducerController` sends `RequestNext` to the producer, which is then allowed +to send one message to the `WorkPullingProducerController`. +Thereafter the producer will receive a new `RequestNext` when it's allowed to send one more message. +`WorkPullingProducerController` will send a new `RequestNext` when there is a demand from any worker. +It's possible that all workers with demand are deregistered after the `RequestNext` is sent and before +the actual messages is sent to the `WorkPullingProducerController`. In that case the message is +buffered and will be delivered when a new worker is registered or when there is a new demand. + +The producer and `WorkPullingProducerController` actors are supposed to be local so that these messages are +fast and not lost. This is enforced by a runtime check. + +Similarly, on the consumer side the destination consumer actor will start the flow by sending an +initial `ConsumerController.Start` message to the `ConsumerController`. + +Received messages from the producer are wrapped in `ConsumerController.Delivery` when sent to the consumer, +which is supposed to reply with `ConsumerController.Confirmed` when it has processed the message. +Next message is not delivered until the previous is confirmed. More messages from the producer that arrive +while waiting for the confirmation are stashed by the `ConsumerController` and delivered when the previous +message is confirmed. + +The consumer and the `ConsumerController` actors are supposed to be local so that these messages are fast +and not lost. This is enforced by a runtime check. + +Many unconfirmed messages can be in flight between the `WorkPullingProducerController` and each +`ConsumerController`, but it is limited by a flow control window. The flow control is driven by the +consumer side, which means that the `WorkPullingProducerController` will not send faster than the +demand requested by the workers. + +### Work pulling example + +Example of image converter worker (consumer): + +Scala +: @@snip [WorkPullingDocExample.scala](/akka-cluster-sharding-typed/src/test/scala/docs/delivery/WorkPullingDocExample.scala) { #imports #consumer } + +Java +: @@snip [WorkPullingDocExample.java](/akka-cluster-sharding-typed/src/test/java/jdocs/delivery/WorkPullingDocExample.java) { #imports #consumer } + +and image converter job manager (producer): + +Scala +: @@snip [WorkPullingDocExample.scala](/akka-cluster-sharding-typed/src/test/scala/docs/delivery/WorkPullingDocExample.scala) { #producer } + +Java +: @@snip [WorkPullingDocExample.java](/akka-cluster-sharding-typed/src/test/java/jdocs/delivery/WorkPullingDocExample.java) { #producer } + +Note how the `ActorRef` in the `Start` messages are constructed as message adapters to map the +`RequestNext` and `Delivery` to the protocol of the producer and consumer actors respectively. + +See also the corresponding @ref:[example that is using ask from the producer](#ask-from-the-producer). + +### Work pulling delivery semantics + +For work pulling the order of the messages should not matter, because each message is routed randomly +to one of the workers with demand and can therefore be processed in any order. + +As long as neither producers nor workers crash (or workers being removed for other reasons) the messages are +delivered to the workers without loss or duplicates. Meaning effectively once processing without any +business level deduplication. + +Unconfirmed messages may be lost if the producer crashes. To avoid that you need to enable the @ref:[durable +queue](#durable-producer) on the producer side. The stored unconfirmed messages will be redelivered when the +corresponding producer is started again. Those messages may be routed to different workers than before +and some of them may have already been processed but the fact that they were confirmed had not been stored +yet. Meaning at-least once delivery. + +If a worker crashes or is stopped gracefully the unconfirmed messages will be redelivered to other workers. +In that case some of these may already have been processed by the previous worker. Meaning at-least once delivery. + +## Sharding + +To use reliable delivery with Cluster Sharding, add the following module to your project: + +@@dependency[sbt,Maven,Gradle] { + group=com.typesafe.akka + artifact=akka-cluster-sharding-typed_$scala.binary_version$ + version=$akka.version$ +} + +Reliable delivery between a producer actor sending messages to @ref:[sharded](cluster-sharding.md) consumer +actor receiving the messages. + +![delivery-work-sharding-1.png](./images/delivery-sharding-1.png) + +and sending to another entity + +![delivery-work-sharding-2.png](./images/delivery-sharding-2.png) + +and sending from another producer (different node) + +![delivery-work-sharding-3.png](./images/delivery-sharding-3.png) + +The @apidoc[ShardingProducerController] should be used together with @apidoc[ShardingConsumerController]. + +A producer can send messages via a `ShardingProducerController` to any `ShardingConsumerController` +identified by an `entityId`. A single `ShardingProducerController` per `ActorSystem` (node) can be +shared for sending to all entities of a certain entity type. No explicit registration is needed +between the `ShardingConsumerController` and `ShardingProducerController`. + +The producer actor will start the flow by sending a `ShardingProducerController.Start` +message to the `ShardingProducerController`. + +The `ShardingProducerController` sends `RequestNext` to the producer, which is then allowed +to send one message to the `ShardingProducerController`. Thereafter the producer will receive a +new `RequestNext` when it's allowed to send one more message. + +In the @apidoc[ShardingProducerController.RequestNext] message there is information about which entities +that have demand. It is allowed to send to a new `entityId` that is not included in the `RequestNext.entitiesWithDemand`. +If sending to an entity that doesn't have demand the message will be buffered. This support for buffering +means that it is even allowed to send several messages in response to one `RequestNext` but it's recommended to +only send one message and wait for next `RequestNext` before sending more messages. + +The producer and `ShardingProducerController` actors are supposed to be local so that these messages are +fast and not lost. This is enforced by a runtime check. + +Similarly, on the consumer side the destination consumer actor will start the flow by sending an +initial `ConsumerController.Start` message to the `ConsumerController`. + +There will be one `ShardingConsumerController` for each entity. Many unconfirmed messages can be in +flight between the `ShardingProducerController` and each `ShardingConsumerController`, but it is +limited by a flow control window. The flow control is driven by the consumer side, which means that +the `ShardingProducerController` will not send faster than the demand requested by the consumers. + +### Sharding example + +The sharded entity is a todo list which uses an async database call to store its entire state on each change, +and first when that completes replies to reliable delivery that the message was consumed. + +Example of `TodoList` entity (consumer): + +Scala +: @@snip [ShardingDocExample.scala](/akka-cluster-sharding-typed/src/test/scala/docs/delivery/ShardingDocExample.scala) { #imports #consumer } + +Java +: @@snip [ShardingDocExample.java](/akka-cluster-sharding-typed/src/test/java/jdocs/delivery/ShardingDocExample.java) { #imports #consumer } + +and `TodoService` (producer): + +Scala +: @@snip [ShardingDocExample.scala](/akka-cluster-sharding-typed/src/test/scala/docs/delivery/ShardingDocExample.scala) { #producer } + +Java +: @@snip [ShardingDocExample.java](/akka-cluster-sharding-typed/src/test/java/jdocs/delivery/ShardingDocExample.java) { #producer } + +Note how the `ActorRef` in the `Start` messages are constructed as message adapters to map the +`RequestNext` and `Delivery` to the protocol of the producer and consumer actors respectively. + +Those are initialized with sharding like this (from the guardian): + +Java +: @@snip [ShardingDocExample.java](/akka-cluster-sharding-typed/src/test/java/jdocs/delivery/ShardingDocExample.java) { #init } + +### Sharding delivery semantics + +As long as neither producer nor consumer crash the messages are delivered to the consumer actor in the same order +as they were sent to the `ShardingProducerController`, without loss or duplicates. Meaning effectively once +processing without any business level deduplication. + +Unconfirmed messages may be lost if the producer crashes. To avoid that you need to enable the @ref:[durable +queue](#durable-producer) on the producer side. The stored unconfirmed messages will be redelivered when the +corresponding producer is started again. In that case there may be delivery of messages that had already been +processed but the fact that they were confirmed had not been stored yet. Meaning at-least once delivery. + +If the consumer crashes or the shard is rebalanced the unconfirmed messages will be redelivered. In that case +some of these may already have been processed by the previous consumer. + +## Durable producer + +Until sent messages have been confirmed the producer side keeps them in memory to be able to +resend them. If the JVM of the producer side crashes those unconfirmed messages are lost. +To make sure the messages can be delivered also in that scenario a @apidoc[DurableProducerQueue] can be used. +Then the unconfirmed messages are stored in a durable way so that they can be redelivered when the producer +is started again. An implementation of the `DurableProducerQueue` is provided by @apidoc[EventSourcedProducerQueue] +in `akka-persistence-typed`. + +Be aware of that a `DurableProducerQueue` will add a substantial performance overhead. + +When using the `EventSourcedProducerQueue` the following dependency is needed: + +@@dependency[sbt,Maven,Gradle] { + group=com.typesafe.akka + artifact=akka-persistence-typed_$scala.binary_version$ + version=$akka.version$ +} + +You also have to select journal plugin and snapshot store plugin, see +@ref:[Persistence Plugins](../persistence-plugins.md). + +Example of the image converter work manager from the @ref:[Work pulling example](#work-pulling-example) with +`EventSourcedProducerQueue` enabled: + +Scala +: @@snip [WorkPullingDocExample.scala](/akka-cluster-sharding-typed/src/test/scala/docs/delivery/WorkPullingDocExample.scala) { #durable-queue } + +Java +: @@snip [WorkPullingDocExample.java](/akka-cluster-sharding-typed/src/test/java/jdocs/delivery/WorkPullingDocExample.java) { #durable-queue } + +It's important to note that the `EventSourcedProducerQueue` requires a @ref:[PersistenceId](persistence.md#persistenceid), +which must be unique. The same `PersistenceId` must not be used for different producers at the same time. +A @ref:[Cluster Singleton](cluster-singleton.md) hosting the producer would satisfy that requirement, +or one producer per node and a naming scheme to ensure that different nodes use different `PersistenceId`. + +To deliver unconfirmed messages after a crash the producer must be started again with same `PersistenceId` +as before the crash. + +## Ask from the producer + +Instead of using `tell` with the `sendNextTo` in the `RequestNext` the producer can use `context.ask` +with the `askNextTo` in the `RequestNext`. The difference is that a reply is sent back when the +message has been handled. To include the `replyTo` `ActorRef` the message must be wrapped in a +`MessageWithConfirmation`. If a `DurableProducerQueue` is used then the reply is sent when the message +has been stored successfully, but it might not have been processed by the consumer yet. Otherwise the +reply is sent after the consumer has processed and confirmed the message. + +Example of using `ask` in the image converter work manager from the @ref:[Work pulling example](#work-pulling-example): + +Scala +: @@snip [WorkPullingDocExample.scala](/akka-cluster-sharding-typed/src/test/scala/docs/delivery/WorkPullingDocExample.scala) { #ask } + +Java +: @@snip [WorkPullingDocExample.java](/akka-cluster-sharding-typed/src/test/java/jdocs/delivery/WorkPullingDocExample.java) { #ask } + +## Only flow control + +It's possible to use this without resending lost messages, but the flow control is still used. This can +for example be useful when both consumer and producer are know to be located in the same local `ActorSystem`. +This can be more efficient since messages don't have to be kept in memory in the `ProducerController` until +they have been confirmed, but the drawback is that lost messages will not be delivered. See configuration +`only-flow-control` of the `ConsumerController`. + +## Configuration + +There are several configuration properties, please refer to `akka.reliable-delivery` config section in the +reference configuration: + +* @ref:[akka-actor-typed reference configuration](../general/configuration-reference.md#config-akka-actor-typed) +* @ref:[akka-persistence-typed reference configuration](../general/configuration-reference.md#config-akka-persistence-typed) +* @ref:[akka-cluster-sharding-typed reference configuration](../general/configuration-reference.md#config-cluster-sharding-typed) diff --git a/akka-persistence-typed/src/main/resources/reference.conf b/akka-persistence-typed/src/main/resources/reference.conf index 3917096126e..7361c8113fc 100644 --- a/akka-persistence-typed/src/main/resources/reference.conf +++ b/akka-persistence-typed/src/main/resources/reference.conf @@ -23,3 +23,32 @@ akka.persistence.typed { log-stashing = off } + +akka.reliable-delivery { + producer-controller { + event-sourced-durable-queue { + # Max duration for the exponential backoff for persist failures. + restart-max-backoff = 10s + + # Snapshot after this number of events. See RetentionCriteria. + snapshot-every = 1000 + + # Number of snapshots to keep. See RetentionCriteria. + keep-n-snapshots = 2 + + # Delete events after snapshotting. See RetentionCriteria. + delete-events = on + + # Cleanup entries that haven't be used for this duration. + cleanup-unused-after = 3600s + + # The journal plugin to use, by default it will use the plugin configured by + # `akka.persistence.journal.plugin`. + journal-plugin-id = "" + + # The journal plugin to use, by default it will use the plugin configured by + # `akka.persistence.snapshot-store.plugin`. + snapshot-plugin-id = "" + } + } +} diff --git a/akka-persistence-typed/src/main/scala/akka/persistence/typed/delivery/EventSourcedProducerQueue.scala b/akka-persistence-typed/src/main/scala/akka/persistence/typed/delivery/EventSourcedProducerQueue.scala new file mode 100644 index 00000000000..2a091c5c49a --- /dev/null +++ b/akka-persistence-typed/src/main/scala/akka/persistence/typed/delivery/EventSourcedProducerQueue.scala @@ -0,0 +1,290 @@ +/* + * Copyright (C) 2020 Lightbend Inc. + */ + +package akka.persistence.typed.delivery + +import java.time.{ Duration => JavaDuration } + +import scala.concurrent.duration._ + +import akka.util.JavaDurationConverters._ +import akka.actor.typed.ActorSystem +import akka.actor.typed.Behavior +import akka.actor.typed.SupervisorStrategy +import akka.actor.typed.delivery.DurableProducerQueue +import akka.actor.typed.scaladsl.ActorContext +import akka.actor.typed.scaladsl.Behaviors +import akka.annotation.ApiMayChange +import akka.persistence.typed.PersistenceId +import akka.persistence.typed.delivery.EventSourcedProducerQueue.CleanupTick +import akka.persistence.typed.scaladsl.Effect +import akka.persistence.typed.scaladsl.EventSourcedBehavior +import akka.persistence.typed.scaladsl.RetentionCriteria +import com.typesafe.config.Config + +/** + * [[DurableProducerQueue]] that can be used with [[akka.actor.typed.delivery.ProducerController]] + * for reliable delivery of messages. It is implemented with event sourcing and stores one + * event before sending the message to the destination and one event for the confirmation + * that the message has been delivered and processed. + * + * The [[DurableProducerQueue.LoadState]] request is used at startup to retrieve the unconfirmed messages. + */ +@ApiMayChange +object EventSourcedProducerQueue { + import DurableProducerQueue._ + + object Settings { + + /** + * Scala API: Factory method from config `akka.reliable-delivery.producer-controller.event-sourced-durable-queue` + * of the `ActorSystem`. + */ + def apply(system: ActorSystem[_]): Settings = + apply(system.settings.config.getConfig("akka.reliable-delivery.producer-controller.event-sourced-durable-queue")) + + /** + * Scala API: Factory method from Config corresponding to + * `akka.reliable-delivery.producer-controller.event-sourced-durable-queue`. + */ + def apply(config: Config): Settings = { + new Settings( + restartMaxBackoff = config.getDuration("restart-max-backoff").asScala, + snapshotEvery = config.getInt("snapshot-every"), + keepNSnapshots = config.getInt("keep-n-snapshots"), + deleteEvents = config.getBoolean("delete-events"), + cleanupUnusedAfter = config.getDuration("cleanup-unused-after").asScala, + journalPluginId = config.getString("journal-plugin-id"), + snapshotPluginId = config.getString("snapshot-plugin-id")) + } + + /** + * Java API: Factory method from config `akka.reliable-delivery.producer-controller.event-sourced-durable-queue` + * of the `ActorSystem`. + */ + def create(system: ActorSystem[_]): Settings = + apply(system) + + /** + * Java API: Factory method from Config corresponding to + * `akka.reliable-delivery.producer-controller.event-sourced-durable-queue`. + */ + def create(config: Config): Settings = + apply(config) + } + + final class Settings private ( + val restartMaxBackoff: FiniteDuration, + val snapshotEvery: Int, + val keepNSnapshots: Int, + val deleteEvents: Boolean, + val cleanupUnusedAfter: FiniteDuration, + val journalPluginId: String, + val snapshotPluginId: String) { + + def withSnapshotEvery(newSnapshotEvery: Int): Settings = + copy(snapshotEvery = newSnapshotEvery) + + def withKeepNSnapshots(newKeepNSnapshots: Int): Settings = + copy(keepNSnapshots = newKeepNSnapshots) + + def withDeleteEvents(newDeleteEvents: Boolean): Settings = + copy(deleteEvents = newDeleteEvents) + + /** + * Scala API + */ + def withRestartMaxBackoff(newRestartMaxBackoff: FiniteDuration): Settings = + copy(restartMaxBackoff = newRestartMaxBackoff) + + /** + * Java API + */ + def withRestartMaxBackoff(newRestartMaxBackoff: JavaDuration): Settings = + copy(restartMaxBackoff = newRestartMaxBackoff.asScala) + + /** + * Java API + */ + def getRestartMaxBackoff(): JavaDuration = + restartMaxBackoff.asJava + + /** + * Scala API + */ + def withCleanupUnusedAfter(newCleanupUnusedAfter: FiniteDuration): Settings = + copy(cleanupUnusedAfter = newCleanupUnusedAfter) + + /** + * Java API + */ + def withCleanupUnusedAfter(newCleanupUnusedAfter: JavaDuration): Settings = + copy(cleanupUnusedAfter = newCleanupUnusedAfter.asScala) + + /** + * Java API + */ + def getCleanupUnusedAfter(): JavaDuration = + cleanupUnusedAfter.asJava + + def withJournalPluginId(id: String): Settings = + copy(journalPluginId = id) + + def withSnapshotPluginId(id: String): Settings = + copy(snapshotPluginId = id) + + /** + * Private copy method for internal use only. + */ + private def copy( + restartMaxBackoff: FiniteDuration = restartMaxBackoff, + snapshotEvery: Int = snapshotEvery, + keepNSnapshots: Int = keepNSnapshots, + deleteEvents: Boolean = deleteEvents, + cleanupUnusedAfter: FiniteDuration = cleanupUnusedAfter, + journalPluginId: String = journalPluginId, + snapshotPluginId: String = snapshotPluginId) = + new Settings( + restartMaxBackoff, + snapshotEvery, + keepNSnapshots, + deleteEvents, + cleanupUnusedAfter, + journalPluginId, + snapshotPluginId) + + override def toString: String = + s"Settings($restartMaxBackoff,$snapshotEvery,$keepNSnapshots,$deleteEvents,$cleanupUnusedAfter,$journalPluginId,$snapshotPluginId)" + } + + private case class CleanupTick[A]() extends DurableProducerQueue.Command[A] + + def apply[A](persistenceId: PersistenceId): Behavior[DurableProducerQueue.Command[A]] = { + Behaviors.setup { context => + apply(persistenceId, Settings(context.system)) + } + } + + def apply[A](persistenceId: PersistenceId, settings: Settings): Behavior[DurableProducerQueue.Command[A]] = { + Behaviors.setup { context => + context.setLoggerName(classOf[EventSourcedProducerQueue[A]]) + val impl = new EventSourcedProducerQueue[A](context, settings.cleanupUnusedAfter) + + Behaviors.withTimers { timers => + // for sharding it can become many different confirmation qualifier and this + // cleanup task is removing qualifiers from `state.confirmedSeqNr` that have not been used for a while + context.self ! CleanupTick[A]() + timers.startTimerWithFixedDelay(CleanupTick[A](), settings.cleanupUnusedAfter / 2) + + val retentionCriteria = RetentionCriteria.snapshotEvery( + numberOfEvents = settings.snapshotEvery, + keepNSnapshots = settings.keepNSnapshots) + val retentionCriteria2 = + if (settings.deleteEvents) retentionCriteria.withDeleteEventsOnSnapshot else retentionCriteria + + EventSourcedBehavior[Command[A], Event, State[A]]( + persistenceId, + State.empty, + (state, command) => impl.onCommand(state, command), + (state, event) => impl.onEvent(state, event)) + .withRetention(retentionCriteria2) + .withJournalPluginId(settings.journalPluginId) + .withSnapshotPluginId(settings.snapshotPluginId) + .onPersistFailure(SupervisorStrategy + .restartWithBackoff(1.second.min(settings.restartMaxBackoff), settings.restartMaxBackoff, 0.1)) + } + } + } + + /** + * Java API + */ + def create[A](persistenceId: PersistenceId): Behavior[DurableProducerQueue.Command[A]] = + apply(persistenceId) + + /** + * Java API + */ + def create[A](persistenceId: PersistenceId, settings: Settings): Behavior[DurableProducerQueue.Command[A]] = + apply(persistenceId, settings) + +} + +/** + * INTERNAL API + */ +private class EventSourcedProducerQueue[A]( + context: ActorContext[DurableProducerQueue.Command[A]], + cleanupUnusedAfter: FiniteDuration) { + import DurableProducerQueue._ + + def onCommand(state: State[A], command: Command[A]): Effect[Event, State[A]] = { + command match { + case StoreMessageSent(sent, replyTo) => + if (sent.seqNr == state.currentSeqNr) { + context.log.trace( + "StoreMessageSent seqNr [{}], confirmationQualifier [{}]", + sent.seqNr, + sent.confirmationQualifier) + Effect.persist(sent).thenReply(replyTo)(_ => StoreMessageSentAck(sent.seqNr)) + } else if (sent.seqNr == state.currentSeqNr - 1) { + // already stored, could be a retry after timout + context.log.debug("Duplicate seqNr [{}], currentSeqNr [{}]", sent.seqNr, state.currentSeqNr) + Effect.reply(replyTo)(StoreMessageSentAck(sent.seqNr)) + } else { + // may happen after failure + context.log.debug("Ignoring unexpected seqNr [{}], currentSeqNr [{}]", sent.seqNr, state.currentSeqNr) + Effect.unhandled // no reply, request will timeout + } + + case StoreMessageConfirmed(seqNr, confirmationQualifier, timestampMillis) => + context.log.trace("StoreMessageConfirmed seqNr [{}], confirmationQualifier [{}]", seqNr, confirmationQualifier) + val previousConfirmedSeqNr = state.confirmedSeqNr.get(confirmationQualifier) match { + case Some((nr, _)) => nr + case None => 0L + } + if (seqNr > previousConfirmedSeqNr) + Effect.persist(Confirmed(seqNr, confirmationQualifier, timestampMillis)) + else + Effect.none // duplicate + + case LoadState(replyTo) => + Effect.reply(replyTo)(state) + + case _: CleanupTick[_] => + val now = System.currentTimeMillis() + val old = state.confirmedSeqNr.collect { + case (confirmationQualifier, (_, timestampMillis)) + if (now - timestampMillis) >= cleanupUnusedAfter.toMillis && !state.unconfirmed.exists( + _.confirmationQualifier != confirmationQualifier) => + confirmationQualifier + }.toSet + if (old.isEmpty) { + Effect.none + } else { + if (context.log.isDebugEnabled) + context.log.debug("Cleanup [{}]", old.mkString(",")) + Effect.persist(DurableProducerQueue.Cleanup(old)) + } + } + } + + def onEvent(state: State[A], event: Event): State[A] = { + event match { + case sent: MessageSent[A] @unchecked => + state.copy(currentSeqNr = sent.seqNr + 1, unconfirmed = state.unconfirmed :+ sent) + case Confirmed(seqNr, confirmationQualifier, timestampMillis) => + val newUnconfirmed = state.unconfirmed.filterNot { u => + u.confirmationQualifier == confirmationQualifier && u.seqNr <= seqNr + } + state.copy( + highestConfirmedSeqNr = math.max(state.highestConfirmedSeqNr, seqNr), + confirmedSeqNr = state.confirmedSeqNr.updated(confirmationQualifier, (seqNr, timestampMillis)), + unconfirmed = newUnconfirmed) + case Cleanup(confirmationQualifiers) => + state.copy(confirmedSeqNr = state.confirmedSeqNr -- confirmationQualifiers) + } + } + +} diff --git a/akka-persistence-typed/src/test/resources/logback-test.xml b/akka-persistence-typed/src/test/resources/logback-test.xml index 41ea808109b..ad3473919ec 100644 --- a/akka-persistence-typed/src/test/resources/logback-test.xml +++ b/akka-persistence-typed/src/test/resources/logback-test.xml @@ -4,9 +4,6 @@ - - INFO - %date{ISO8601} %-5level %logger %marker - %msg {%mdc}%n diff --git a/akka-cluster-typed/src/test/scala/akka/cluster/typed/ClusterSingletonPersistenceSpec.scala b/akka-persistence-typed/src/test/scala/akka/persistence/typed/ClusterSingletonPersistenceSpec.scala similarity index 89% rename from akka-cluster-typed/src/test/scala/akka/cluster/typed/ClusterSingletonPersistenceSpec.scala rename to akka-persistence-typed/src/test/scala/akka/persistence/typed/ClusterSingletonPersistenceSpec.scala index fa274078eeb..fd5890c64af 100644 --- a/akka-cluster-typed/src/test/scala/akka/cluster/typed/ClusterSingletonPersistenceSpec.scala +++ b/akka-persistence-typed/src/test/scala/akka/persistence/typed/ClusterSingletonPersistenceSpec.scala @@ -2,14 +2,17 @@ * Copyright (C) 2017-2020 Lightbend Inc. */ -package akka.cluster.typed +package akka.persistence.typed +import akka.actor.testkit.typed.scaladsl.LogCapturing import akka.actor.testkit.typed.scaladsl.ScalaTestWithActorTestKit -import akka.actor.typed.{ ActorRef, Behavior } -import akka.persistence.typed.scaladsl.{ Effect, EventSourcedBehavior } import akka.actor.testkit.typed.scaladsl.TestProbe -import akka.actor.testkit.typed.scaladsl.LogCapturing -import akka.persistence.typed.PersistenceId +import akka.actor.typed.ActorRef +import akka.actor.typed.Behavior +import akka.cluster.typed.ClusterSingleton +import akka.cluster.typed.SingletonActor +import akka.persistence.typed.scaladsl.Effect +import akka.persistence.typed.scaladsl.EventSourcedBehavior import com.typesafe.config.ConfigFactory import org.scalatest.wordspec.AnyWordSpecLike diff --git a/akka-persistence-typed/src/test/scala/akka/persistence/typed/delivery/EventSourcedProducerQueueSpec.scala b/akka-persistence-typed/src/test/scala/akka/persistence/typed/delivery/EventSourcedProducerQueueSpec.scala new file mode 100644 index 00000000000..b3e620b0a2b --- /dev/null +++ b/akka-persistence-typed/src/test/scala/akka/persistence/typed/delivery/EventSourcedProducerQueueSpec.scala @@ -0,0 +1,284 @@ +/* + * Copyright (C) 2017-2020 Lightbend Inc. + */ + +package akka.persistence.typed.delivery + +import java.util.UUID +import java.util.concurrent.atomic.AtomicInteger +import scala.concurrent.duration._ + +import akka.actor.testkit.typed.scaladsl._ +import akka.actor.typed.eventstream.EventStream +import akka.actor.typed.delivery.DurableProducerQueue.Confirmed +import akka.actor.typed.delivery.DurableProducerQueue.LoadState +import akka.actor.typed.delivery.DurableProducerQueue.MessageSent +import akka.actor.typed.delivery.DurableProducerQueue.NoQualifier +import akka.actor.typed.delivery.DurableProducerQueue.State +import akka.actor.typed.delivery.DurableProducerQueue.StoreMessageConfirmed +import akka.actor.typed.delivery.DurableProducerQueue.StoreMessageSent +import akka.actor.typed.delivery.DurableProducerQueue.StoreMessageSentAck +import akka.persistence.journal.inmem.InmemJournal +import akka.persistence.typed.PersistenceId +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory +import org.scalatest.wordspec.AnyWordSpecLike + +object EventSourcedProducerQueueSpec { + def conf: Config = + ConfigFactory.parseString(s""" + akka.persistence.journal.plugin = "akka.persistence.journal.inmem" + akka.persistence.journal.inmem.test-serialization = on + akka.persistence.snapshot-store.plugin = "akka.persistence.snapshot-store.local" + akka.persistence.snapshot-store.local.dir = "target/EventSourcedDurableProducerQueueSpec-${UUID + .randomUUID() + .toString}" + """) +} + +class EventSourcedProducerQueueSpec + extends ScalaTestWithActorTestKit(ReliableDeliveryWithEventSourcedProducerQueueSpec.conf) + with AnyWordSpecLike + with LogCapturing { + + private val pidCounter = new AtomicInteger(0) + private def nextPid(): PersistenceId = PersistenceId.ofUniqueId(s"pid-${pidCounter.incrementAndGet()})") + + private val journalOperations = createTestProbe[InmemJournal.Operation]() + system.eventStream ! EventStream.Subscribe(journalOperations.ref) + + private val stateProbe = createTestProbe[State[String]]() + + "EventSourcedDurableProducerQueue" must { + + "persist MessageSent" in { + val pid = nextPid() + val ackProbe = createTestProbe[StoreMessageSentAck]() + val queue = spawn(EventSourcedProducerQueue[String](pid)) + val timestamp = System.currentTimeMillis() + + val msg1 = MessageSent(seqNr = 1, "a", ack = true, NoQualifier, timestamp) + queue ! StoreMessageSent(msg1, ackProbe.ref) + ackProbe.expectMessage(StoreMessageSentAck(storedSeqNr = 1)) + journalOperations.expectMessage(InmemJournal.Write(msg1, pid.id, 1)) + + val msg2 = MessageSent(seqNr = 2, "b", ack = true, NoQualifier, timestamp) + queue ! StoreMessageSent(msg2, ackProbe.ref) + ackProbe.expectMessage(StoreMessageSentAck(storedSeqNr = 2)) + journalOperations.expectMessage(InmemJournal.Write(msg2, pid.id, 2)) + + queue ! LoadState(stateProbe.ref) + val expectedState = + State(currentSeqNr = 3, highestConfirmedSeqNr = 0, confirmedSeqNr = Map.empty, unconfirmed = Vector(msg1, msg2)) + stateProbe.expectMessage(expectedState) + + // replay + testKit.stop(queue) + val queue2 = spawn(EventSourcedProducerQueue[String](pid)) + queue2 ! LoadState(stateProbe.ref) + stateProbe.expectMessage(expectedState) + } + + "not persist MessageSent if lower seqNr than already stored" in { + val pid = nextPid() + val ackProbe = createTestProbe[StoreMessageSentAck]() + val queue = spawn(EventSourcedProducerQueue[String](pid)) + val timestamp = System.currentTimeMillis() + + val msg1 = MessageSent(seqNr = 1, "a", ack = true, NoQualifier, timestamp) + queue ! StoreMessageSent(msg1, ackProbe.ref) + ackProbe.expectMessage(StoreMessageSentAck(storedSeqNr = 1)) + journalOperations.expectMessage(InmemJournal.Write(msg1, pid.id, 1)) + + val msg2 = MessageSent(seqNr = 2, "b", ack = true, NoQualifier, timestamp) + queue ! StoreMessageSent(msg2, ackProbe.ref) + ackProbe.expectMessage(StoreMessageSentAck(storedSeqNr = 2)) + journalOperations.expectMessage(InmemJournal.Write(msg2, pid.id, 2)) + + // duplicate msg2 + queue ! StoreMessageSent(msg2, ackProbe.ref) + ackProbe.expectMessage(StoreMessageSentAck(storedSeqNr = 2)) + journalOperations.expectNoMessage() + + // further back is ignored + queue ! StoreMessageSent(msg1, ackProbe.ref) + ackProbe.expectNoMessage() + journalOperations.expectNoMessage() + } + + "persist Confirmed" in { + val pid = nextPid() + val ackProbe = createTestProbe[StoreMessageSentAck]() + val queue = spawn(EventSourcedProducerQueue[String](pid)) + val timestamp = System.currentTimeMillis() + + val msg1 = MessageSent(seqNr = 1, "a", ack = true, NoQualifier, timestamp) + queue ! StoreMessageSent(msg1, ackProbe.ref) + journalOperations.expectMessage(InmemJournal.Write(msg1, pid.id, 1)) + + val msg2 = MessageSent(seqNr = 2, "b", ack = true, NoQualifier, timestamp) + queue ! StoreMessageSent(msg2, ackProbe.ref) + journalOperations.expectMessage(InmemJournal.Write(msg2, pid.id, 2)) + + val msg3 = MessageSent(seqNr = 3, "c", ack = true, NoQualifier, timestamp) + queue ! StoreMessageSent(msg3, ackProbe.ref) + journalOperations.expectMessage(InmemJournal.Write(msg3, pid.id, 3)) + + val timestamp2 = System.currentTimeMillis() + queue ! StoreMessageConfirmed(seqNr = 2, NoQualifier, timestamp2) + journalOperations.expectMessage(InmemJournal.Write(Confirmed(seqNr = 2, NoQualifier, timestamp2), pid.id, 4)) + + queue ! LoadState(stateProbe.ref) + // note that msg1 is also confirmed (removed) by the confirmation of msg2 + val expectedState = + State( + currentSeqNr = 4, + highestConfirmedSeqNr = 2, + confirmedSeqNr = Map(NoQualifier -> (2L -> timestamp2)), + unconfirmed = Vector(msg3)) + stateProbe.expectMessage(expectedState) + + // replay + testKit.stop(queue) + val queue2 = spawn(EventSourcedProducerQueue[String](pid)) + queue2 ! LoadState(stateProbe.ref) + stateProbe.expectMessage(expectedState) + } + + "not persist Confirmed with lower seqNr than already confirmed" in { + val pid = nextPid() + val ackProbe = createTestProbe[StoreMessageSentAck]() + val queue = spawn(EventSourcedProducerQueue[String](pid)) + val timestamp = System.currentTimeMillis() + + val msg1 = MessageSent(seqNr = 1, "a", ack = true, NoQualifier, timestamp) + queue ! StoreMessageSent(msg1, ackProbe.ref) + journalOperations.expectMessage(InmemJournal.Write(msg1, pid.id, 1)) + + val msg2 = MessageSent(seqNr = 2, "b", ack = true, NoQualifier, timestamp) + queue ! StoreMessageSent(msg2, ackProbe.ref) + journalOperations.expectMessage(InmemJournal.Write(msg2, pid.id, 2)) + + val timestamp2 = System.currentTimeMillis() + queue ! StoreMessageConfirmed(seqNr = 2, NoQualifier, timestamp2) + journalOperations.expectMessage(InmemJournal.Write(Confirmed(seqNr = 2, NoQualifier, timestamp2), pid.id, 3)) + + // lower + queue ! StoreMessageConfirmed(seqNr = 1, NoQualifier, timestamp2) + journalOperations.expectNoMessage() + + // duplicate + queue ! StoreMessageConfirmed(seqNr = 2, NoQualifier, timestamp2) + journalOperations.expectNoMessage() + } + + "keep track of confirmations per confirmationQualifier" in { + val pid = nextPid() + val ackProbe = createTestProbe[StoreMessageSentAck]() + val queue = spawn(EventSourcedProducerQueue[String](pid)) + val timestamp = System.currentTimeMillis() + + val msg1 = MessageSent(seqNr = 1, "a", ack = true, confirmationQualifier = "q1", timestamp) + queue ! StoreMessageSent(msg1, ackProbe.ref) + journalOperations.expectMessage(InmemJournal.Write(msg1, pid.id, 1)) + + val msg2 = MessageSent(seqNr = 2, "b", ack = true, confirmationQualifier = "q1", timestamp) + queue ! StoreMessageSent(msg2, ackProbe.ref) + journalOperations.expectMessage(InmemJournal.Write(msg2, pid.id, 2)) + + val msg3 = MessageSent(seqNr = 3, "c", ack = true, "q2", timestamp) + queue ! StoreMessageSent(msg3, ackProbe.ref) + journalOperations.expectMessage(InmemJournal.Write(msg3, pid.id, 3)) + + val msg4 = MessageSent(seqNr = 4, "d", ack = true, "q2", timestamp) + queue ! StoreMessageSent(msg4, ackProbe.ref) + journalOperations.expectMessage(InmemJournal.Write(msg4, pid.id, 4)) + + val msg5 = MessageSent(seqNr = 5, "e", ack = true, "q2", timestamp) + queue ! StoreMessageSent(msg5, ackProbe.ref) + journalOperations.expectMessage(InmemJournal.Write(msg5, pid.id, 5)) + + val timestamp2 = System.currentTimeMillis() + queue ! StoreMessageConfirmed(seqNr = 4, "q2", timestamp2) + journalOperations.expectMessage(InmemJournal.Write(Confirmed(seqNr = 4, "q2", timestamp2), pid.id, 6)) + + queue ! LoadState(stateProbe.ref) + // note that msg3 is also confirmed (removed) by the confirmation of msg4, same qualifier + // but msg1 and msg2 are still unconfirmed + val expectedState = + State( + currentSeqNr = 6, + highestConfirmedSeqNr = 4, + confirmedSeqNr = Map("q2" -> (4L -> timestamp2)), + unconfirmed = Vector(msg1, msg2, msg5)) + stateProbe.expectMessage(expectedState) + + // replay + testKit.stop(queue) + val queue2 = spawn(EventSourcedProducerQueue[String](pid)) + queue2 ! LoadState(stateProbe.ref) + stateProbe.expectMessage(expectedState) + } + + "cleanup old confirmationQualifier entries" in { + val pid = nextPid() + val ackProbe = createTestProbe[StoreMessageSentAck]() + val settings = EventSourcedProducerQueue.Settings(system).withCleanupUnusedAfter(100.millis) + val queue = spawn(EventSourcedProducerQueue[String](pid, settings)) + val now = System.currentTimeMillis() + val timestamp0 = now - 70000 + + val msg1 = MessageSent(seqNr = 1, "a", ack = true, confirmationQualifier = "q1", timestamp0) + queue ! StoreMessageSent(msg1, ackProbe.ref) + + val msg2 = MessageSent(seqNr = 2, "b", ack = true, confirmationQualifier = "q1", timestamp0) + queue ! StoreMessageSent(msg2, ackProbe.ref) + + val msg3 = MessageSent(seqNr = 3, "c", ack = true, "q2", timestamp0) + queue ! StoreMessageSent(msg3, ackProbe.ref) + + val msg4 = MessageSent(seqNr = 4, "d", ack = true, "q2", timestamp0) + queue ! StoreMessageSent(msg4, ackProbe.ref) + + val timestamp1 = now - 60000 + queue ! StoreMessageConfirmed(seqNr = 1, "q1", timestamp1) + + // cleanup tick + Thread.sleep(1000) + + // q1, seqNr 2 is not confirmed yet, so q1 entries shouldn't be cleaned yet + queue ! LoadState(stateProbe.ref) + + val expectedState1 = + State( + currentSeqNr = 5, + highestConfirmedSeqNr = 1, + confirmedSeqNr = Map("q1" -> (1L -> timestamp1)), + unconfirmed = Vector(msg2, msg3, msg4)) + stateProbe.expectMessage(expectedState1) + + val timestamp2 = now - 50000 + queue ! StoreMessageConfirmed(seqNr = 2, "q1", timestamp2) + + val timestamp3 = now + 10000 // not old + queue ! StoreMessageConfirmed(seqNr = 4, "q2", timestamp3) + + // cleanup tick + Thread.sleep(1000) + + // all q1 confirmed and old timestamp, so q1 entries should be cleaned + queue ! LoadState(stateProbe.ref) + + val expectedState2 = + State[String]( + currentSeqNr = 5, + highestConfirmedSeqNr = 4, + confirmedSeqNr = Map("q2" -> (4L -> timestamp3)), + unconfirmed = Vector.empty) + stateProbe.expectMessage(expectedState2) + + } + + } + +} diff --git a/akka-persistence-typed/src/test/scala/akka/persistence/typed/delivery/ReliableDeliveryWithEventSourcedProducerQueueSpec.scala b/akka-persistence-typed/src/test/scala/akka/persistence/typed/delivery/ReliableDeliveryWithEventSourcedProducerQueueSpec.scala new file mode 100644 index 00000000000..0e019dcc358 --- /dev/null +++ b/akka-persistence-typed/src/test/scala/akka/persistence/typed/delivery/ReliableDeliveryWithEventSourcedProducerQueueSpec.scala @@ -0,0 +1,169 @@ +/* + * Copyright (C) 2017-2020 Lightbend Inc. + */ + +package akka.persistence.typed.delivery + +import java.util.UUID + +import akka.actor.testkit.typed.scaladsl._ +import akka.actor.typed.delivery.ConsumerController +import akka.actor.typed.delivery.ProducerController +import akka.persistence.typed.PersistenceId +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory +import org.scalatest.wordspec.AnyWordSpecLike + +object ReliableDeliveryWithEventSourcedProducerQueueSpec { + def conf: Config = + ConfigFactory.parseString(s""" + akka.persistence.journal.plugin = "akka.persistence.journal.inmem" + akka.persistence.journal.inmem.test-serialization = on + akka.persistence.snapshot-store.plugin = "akka.persistence.snapshot-store.local" + akka.persistence.snapshot-store.local.dir = "target/ProducerControllerWithEventSourcedProducerQueueSpec-${UUID + .randomUUID() + .toString}" + akka.reliable-delivery.consumer-controller.flow-control-window = 20 + """) +} + +class ReliableDeliveryWithEventSourcedProducerQueueSpec + extends ScalaTestWithActorTestKit(WorkPullingWithEventSourcedProducerQueueSpec.conf) + with AnyWordSpecLike + with LogCapturing { + + "ReliableDelivery with EventSourcedProducerQueue" must { + + "deliver messages after full producer and consumer restart" in { + val producerId = "p1" + val producerProbe = createTestProbe[ProducerController.RequestNext[String]]() + + val producerController = spawn( + ProducerController[String]( + producerId, + Some(EventSourcedProducerQueue[String](PersistenceId.ofUniqueId(producerId))))) + producerController ! ProducerController.Start(producerProbe.ref) + + val consumerController = spawn(ConsumerController[String]()) + val consumerProbe = createTestProbe[ConsumerController.Delivery[String]]() + consumerController ! ConsumerController.Start(consumerProbe.ref) + consumerController ! ConsumerController.RegisterToProducerController(producerController) + + producerProbe.receiveMessage().sendNextTo ! "a" + producerProbe.receiveMessage().sendNextTo ! "b" + producerProbe.receiveMessage().sendNextTo ! "c" + producerProbe.receiveMessage() + + consumerProbe.receiveMessage().message should ===("a") + + system.log.info("Stopping [{}]", producerController) + testKit.stop(producerController) + producerProbe.expectTerminated(producerController) + testKit.stop(consumerController) + consumerProbe.expectTerminated(consumerController) + + val producerController2 = spawn( + ProducerController[String]( + producerId, + Some(EventSourcedProducerQueue[String](PersistenceId.ofUniqueId(producerId))))) + producerController2 ! ProducerController.Start(producerProbe.ref) + + val consumerController2 = spawn(ConsumerController[String]()) + consumerController2 ! ConsumerController.Start(consumerProbe.ref) + consumerController2 ! ConsumerController.RegisterToProducerController(producerController2) + + val delivery1 = consumerProbe.receiveMessage() + delivery1.message should ===("a") + delivery1.confirmTo ! ConsumerController.Confirmed + + val delivery2 = consumerProbe.receiveMessage() + delivery2.message should ===("b") + delivery2.confirmTo ! ConsumerController.Confirmed + + val delivery3 = consumerProbe.receiveMessage() + delivery3.message should ===("c") + delivery3.confirmTo ! ConsumerController.Confirmed + + val requestNext4 = producerProbe.receiveMessage() + requestNext4.currentSeqNr should ===(4) + requestNext4.sendNextTo ! "d" + + val delivery4 = consumerProbe.receiveMessage() + delivery4.message should ===("d") + delivery4.confirmTo ! ConsumerController.Confirmed + + testKit.stop(producerController2) + testKit.stop(consumerController2) + } + + "deliver messages after producer restart, keeping same ConsumerController" in { + val producerId = "p2" + val producerProbe = createTestProbe[ProducerController.RequestNext[String]]() + + val producerController = spawn( + ProducerController[String]( + producerId, + Some(EventSourcedProducerQueue[String](PersistenceId.ofUniqueId(producerId))))) + producerController ! ProducerController.Start(producerProbe.ref) + + val consumerController = spawn(ConsumerController[String]()) + val consumerProbe = createTestProbe[ConsumerController.Delivery[String]]() + consumerController ! ConsumerController.Start(consumerProbe.ref) + consumerController ! ConsumerController.RegisterToProducerController(producerController) + + producerProbe.receiveMessage().sendNextTo ! "a" + producerProbe.receiveMessage().sendNextTo ! "b" + producerProbe.receiveMessage().sendNextTo ! "c" + producerProbe.receiveMessage() + + val delivery1 = consumerProbe.receiveMessage() + delivery1.message should ===("a") + + system.log.info("Stopping [{}]", producerController) + testKit.stop(producerController) + + consumerProbe.expectTerminated(producerController) + + val producerController2 = spawn( + ProducerController[String]( + producerId, + Some(EventSourcedProducerQueue[String](PersistenceId.ofUniqueId(producerId))))) + producerController2 ! ProducerController.Start(producerProbe.ref) + consumerController ! ConsumerController.RegisterToProducerController(producerController2) + + delivery1.confirmTo ! ConsumerController.Confirmed + + val requestNext4 = producerProbe.receiveMessage() + requestNext4.currentSeqNr should ===(4) + requestNext4.sendNextTo ! "d" + + // TODO Should we try harder to deduplicate first? + val redelivery1 = consumerProbe.receiveMessage() + redelivery1.message should ===("a") + redelivery1.confirmTo ! ConsumerController.Confirmed + + producerProbe.receiveMessage().sendNextTo ! "e" + + val redelivery2 = consumerProbe.receiveMessage() + redelivery2.message should ===("b") + redelivery2.confirmTo ! ConsumerController.Confirmed + + val redelivery3 = consumerProbe.receiveMessage() + redelivery3.message should ===("c") + redelivery3.confirmTo ! ConsumerController.Confirmed + + val delivery4 = consumerProbe.receiveMessage() + delivery4.message should ===("d") + delivery4.confirmTo ! ConsumerController.Confirmed + + val delivery5 = consumerProbe.receiveMessage() + delivery5.message should ===("e") + delivery5.confirmTo ! ConsumerController.Confirmed + + testKit.stop(producerController2) + testKit.stop(consumerController) + } + + } + +} diff --git a/akka-persistence-typed/src/test/scala/akka/persistence/typed/delivery/WorkPullingWithEventSourcedProducerQueueSpec.scala b/akka-persistence-typed/src/test/scala/akka/persistence/typed/delivery/WorkPullingWithEventSourcedProducerQueueSpec.scala new file mode 100644 index 00000000000..82d88ddf6d1 --- /dev/null +++ b/akka-persistence-typed/src/test/scala/akka/persistence/typed/delivery/WorkPullingWithEventSourcedProducerQueueSpec.scala @@ -0,0 +1,263 @@ +/* + * Copyright (C) 2017-2020 Lightbend Inc. + */ + +package akka.persistence.typed.delivery + +import java.util.UUID +import java.util.concurrent.atomic.AtomicInteger + +import akka.actor.testkit.typed.FishingOutcome +import akka.actor.testkit.typed.scaladsl._ +import akka.actor.typed.delivery.ConsumerController +import akka.actor.typed.delivery.WorkPullingProducerController +import akka.actor.typed.receptionist.ServiceKey +import akka.persistence.typed.PersistenceId +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory +import org.scalatest.wordspec.AnyWordSpecLike + +object WorkPullingWithEventSourcedProducerQueueSpec { + def conf: Config = + ConfigFactory.parseString(s""" + akka.persistence.journal.plugin = "akka.persistence.journal.inmem" + akka.persistence.snapshot-store.plugin = "akka.persistence.snapshot-store.local" + akka.persistence.snapshot-store.local.dir = "target/WorkPullingWithEventSourcedProducerQueueSpec-${UUID + .randomUUID() + .toString}" + akka.reliable-delivery.consumer-controller.flow-control-window = 20 + """) +} + +class WorkPullingWithEventSourcedProducerQueueSpec + extends ScalaTestWithActorTestKit(WorkPullingWithEventSourcedProducerQueueSpec.conf) + with AnyWordSpecLike + with LogCapturing { + + private val idCounter = new AtomicInteger(0) + private def nextId(): String = s"${idCounter.incrementAndGet()}" + + private def workerServiceKey(): ServiceKey[ConsumerController.Command[String]] = + ServiceKey(s"worker-${idCounter.get}") + + "WorkPulling with EventSourcedProducerQueue" must { + + "deliver messages after full producer and consumer restart" in { + val producerId = s"p${nextId()}" + val serviceKey = workerServiceKey() + val producerProbe = createTestProbe[WorkPullingProducerController.RequestNext[String]]() + + val producerController = spawn( + WorkPullingProducerController[String]( + producerId, + serviceKey, + Some(EventSourcedProducerQueue[String](PersistenceId.ofUniqueId(producerId))))) + producerController ! WorkPullingProducerController.Start(producerProbe.ref) + + val consumerController = spawn(ConsumerController[String](serviceKey)) + val consumerProbe = createTestProbe[ConsumerController.Delivery[String]]() + consumerController ! ConsumerController.Start(consumerProbe.ref) + + producerProbe.receiveMessage().sendNextTo ! "a" + producerProbe.receiveMessage().sendNextTo ! "b" + producerProbe.receiveMessage().sendNextTo ! "c" + producerProbe.receiveMessage() + + consumerProbe.receiveMessage().message should ===("a") + + system.log.info("Stopping [{}]", producerController) + testKit.stop(producerController) + producerProbe.expectTerminated(producerController) + testKit.stop(consumerController) + consumerProbe.expectTerminated(consumerController) + + val producerController2 = spawn( + WorkPullingProducerController[String]( + producerId, + serviceKey, + Some(EventSourcedProducerQueue[String](PersistenceId.ofUniqueId(producerId))))) + producerController2 ! WorkPullingProducerController.Start(producerProbe.ref) + + val consumerController2 = spawn(ConsumerController[String](serviceKey)) + consumerController2 ! ConsumerController.Start(consumerProbe.ref) + + val delivery1 = consumerProbe.receiveMessage() + delivery1.message should ===("a") + delivery1.confirmTo ! ConsumerController.Confirmed + + val delivery2 = consumerProbe.receiveMessage() + delivery2.message should ===("b") + delivery2.confirmTo ! ConsumerController.Confirmed + + val delivery3 = consumerProbe.receiveMessage() + delivery3.message should ===("c") + delivery3.confirmTo ! ConsumerController.Confirmed + + val requestNext4 = producerProbe.receiveMessage() + requestNext4.sendNextTo ! "d" + + val delivery4 = consumerProbe.receiveMessage() + delivery4.message should ===("d") + delivery4.confirmTo ! ConsumerController.Confirmed + + testKit.stop(producerController2) + testKit.stop(consumerController2) + } + + "deliver messages after producer restart, keeping same ConsumerController" in { + val producerId = s"p${nextId()}" + val serviceKey = workerServiceKey() + val producerProbe = createTestProbe[WorkPullingProducerController.RequestNext[String]]() + + val producerController = spawn( + WorkPullingProducerController[String]( + producerId, + serviceKey, + Some(EventSourcedProducerQueue[String](PersistenceId.ofUniqueId(producerId))))) + producerController ! WorkPullingProducerController.Start(producerProbe.ref) + + val consumerController = spawn(ConsumerController[String](serviceKey)) + val consumerProbe = createTestProbe[ConsumerController.Delivery[String]]() + consumerController ! ConsumerController.Start(consumerProbe.ref) + + producerProbe.receiveMessage().sendNextTo ! "a" + producerProbe.receiveMessage().sendNextTo ! "b" + producerProbe.receiveMessage().sendNextTo ! "c" + producerProbe.receiveMessage() + + val delivery1 = consumerProbe.receiveMessage() + delivery1.message should ===("a") + + system.log.info("Stopping [{}]", producerController) + testKit.stop(producerController) + + val producerController2 = spawn( + WorkPullingProducerController[String]( + producerId, + serviceKey, + Some(EventSourcedProducerQueue[String](PersistenceId.ofUniqueId(producerId))))) + producerController2 ! WorkPullingProducerController.Start(producerProbe.ref) + + // Delivery in flight from old dead WorkPullingProducerController, confirmation will not be stored + delivery1.confirmTo ! ConsumerController.Confirmed + + // from old, buffered in ConsumerController + val delivery2 = consumerProbe.receiveMessage() + delivery2.message should ===("b") + delivery2.confirmTo ! ConsumerController.Confirmed + + // from old, buffered in ConsumerController + val delivery3 = consumerProbe.receiveMessage() + delivery3.message should ===("c") + delivery3.confirmTo ! ConsumerController.Confirmed + + val requestNext4 = producerProbe.receiveMessage() + requestNext4.sendNextTo ! "d" + + // TODO Should we try harder to deduplicate first? + val redelivery1 = consumerProbe.receiveMessage() + redelivery1.message should ===("a") + redelivery1.confirmTo ! ConsumerController.Confirmed + + producerProbe.receiveMessage().sendNextTo ! "e" + + val redelivery2 = consumerProbe.receiveMessage() + redelivery2.message should ===("b") + redelivery2.confirmTo ! ConsumerController.Confirmed + + val redelivery3 = consumerProbe.receiveMessage() + redelivery3.message should ===("c") + redelivery3.confirmTo ! ConsumerController.Confirmed + + val delivery4 = consumerProbe.receiveMessage() + delivery4.message should ===("d") + delivery4.confirmTo ! ConsumerController.Confirmed + + val delivery5 = consumerProbe.receiveMessage() + delivery5.message should ===("e") + delivery5.confirmTo ! ConsumerController.Confirmed + + testKit.stop(producerController2) + testKit.stop(consumerController) + } + + "deliver messages after restart, when using several workers" in { + val producerId = s"p${nextId()}" + val serviceKey = workerServiceKey() + val producerProbe = createTestProbe[WorkPullingProducerController.RequestNext[String]]() + + val producerController = spawn( + WorkPullingProducerController[String]( + producerId, + serviceKey, + Some(EventSourcedProducerQueue[String](PersistenceId.ofUniqueId(producerId))))) + producerController ! WorkPullingProducerController.Start(producerProbe.ref) + + // same consumerProbe for all workers, since we can't know the routing + val consumerProbe = createTestProbe[ConsumerController.Delivery[String]]() + var received = Vector.empty[ConsumerController.Delivery[String]] + + val consumerController1 = spawn(ConsumerController[String](serviceKey)) + consumerController1 ! ConsumerController.Start(consumerProbe.ref) + val consumerController2 = spawn(ConsumerController[String](serviceKey)) + consumerController2 ! ConsumerController.Start(consumerProbe.ref) + val consumerController3 = spawn(ConsumerController[String](serviceKey)) + consumerController3 ! ConsumerController.Start(consumerProbe.ref) + + val batch1 = 15 + val confirmed1 = 10 + (1 to batch1).foreach { n => + producerProbe.receiveMessage().sendNextTo ! s"msg-$n" + } + + (1 to confirmed1).foreach { _ => + received :+= consumerProbe.receiveMessage() + received.last.confirmTo ! ConsumerController.Confirmed + } + + system.log.debug("Workers received [{}]", received.mkString(", ")) + received.map(_.message).toSet.size should ===(confirmed1) + + producerProbe.receiveMessage() + + system.log.info("Stopping [{}]", producerController) + testKit.stop(producerController) + system.log.info("Stopping [{}]", consumerController2) + testKit.stop(consumerController2) + + val consumerController4 = spawn(ConsumerController[String](serviceKey)) + consumerController4 ! ConsumerController.Start(consumerProbe.ref) + + val producerController2 = spawn( + WorkPullingProducerController[String]( + producerId, + serviceKey, + Some(EventSourcedProducerQueue[String](PersistenceId.ofUniqueId(producerId))))) + producerController2 ! WorkPullingProducerController.Start(producerProbe.ref) + + val batch2 = 5 + (batch1 + 1 to batch1 + batch2).foreach { n => + producerProbe.receiveMessage().sendNextTo ! s"msg-$n" + } + + consumerProbe.fishForMessage(consumerProbe.remainingOrDefault) { delivery => + received :+= delivery + delivery.confirmTo ! ConsumerController.Confirmed + if (received.map(_.message).toSet.size == batch1 + batch2) + FishingOutcome.Complete + else + FishingOutcome.Continue + } + + system.log.debug("Workers received [{}]", received.mkString(", ")) + received.map(_.message).toSet should ===((1 to batch1 + batch2).map(n => s"msg-$n").toSet) + + testKit.stop(producerController2) + testKit.stop(consumerController1) + testKit.stop(consumerController3) + testKit.stop(consumerController4) + } + + } + +} diff --git a/build.sbt b/build.sbt index e631acb4ce7..e8e01c74853 100644 --- a/build.sbt +++ b/build.sbt @@ -395,7 +395,8 @@ lazy val persistenceTyped = akkaModule("akka-persistence-typed") actorTyped, persistence % "compile->compile;test->test", persistenceQuery % "test", - actorTypedTests % "test->test", + actorTestkitTyped % "test->test", + clusterTyped % "test->test", actorTestkitTyped % "test->test", jackson % "test->test") .settings(javacOptions += "-parameters") // for Jackson @@ -409,12 +410,13 @@ lazy val clusterTyped = akkaModule("akka-cluster-typed") cluster % "compile->compile;test->test;multi-jvm->multi-jvm", clusterTools, distributedData, - persistence % "test->test", - persistenceTyped % "test->test", actorTestkitTyped % "test->test", actorTypedTests % "test->test", remoteTests % "test->test", jackson % "test->test") + .settings(Protobuf.settings) + // To be able to import ContainerFormats.proto + .settings(Protobuf.importPath := Some(baseDirectory.value / ".." / "akka-remote" / "src" / "main" / "protobuf")) .settings(AutomaticModuleName.settings("akka.cluster.typed")) .settings(Protobuf.settings) // To be able to import ContainerFormats.proto