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 | 15 +- .../EventSourcedProducerQueueSpec.scala | 284 + ...eryWithEventSourcedProducerQueueSpec.scala | 169 + ...ingWithEventSourcedProducerQueueSpec.scala | 263 + build.sbt | 8 +- 61 files changed, 18784 insertions(+), 19 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 0000000000..65cc7696ed --- /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 0000000000..ba1eb6b0ae --- /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 0000000000..082d5c1bee --- /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 0000000000..0dda08546b --- /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 0000000000..2432fbc5ba --- /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 0000000000..83057b71a2 --- /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 0000000000..bac1a3b18d --- /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 0000000000..2f1cc9cc58 --- /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 0000000000..134e3c396b --- /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 0000000000..8f9afa1337 --- /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 0000000000..80805ee054 --- /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 0000000000..6ece36f5de --- /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 c92f7b1639..a3476814a3 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 0000000000..8a3ef514ea --- /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 0000000000..4f8ce85a4a --- /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 0000000000..e1562ffabc --- /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 0000000000..ffdde54b0a --- /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 0000000000..80c2b08cac --- /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 0000000000..a5c464eb9c --- /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 0000000000..39271b0a42 --- /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 0000000000..70444d90bf --- /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 6307f87dac..c8dc27eb3b 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 0000000000..4b91274c6b --- /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 0000000000..ca84d81eb6 --- /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 0000000000..cda803f069 --- /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 0000000000..878ea438c4 --- /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 0000000000..85ffdb005b --- /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 0000000000..538bfeee78 --- /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 0000000000..8b9dac1e45 --- /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 a8653ba3cd..d3f08fca6e 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 0000000000..ef9497d483 --- /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 0000000000..09374f0b39 --- /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 0000000000..ce685bd9ca --- /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 0000000000..be550115af --- /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 0000000000..00bd04b8fa --- /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 0000000000..7f3407d223 --- /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 0000000000..39fe9e0be3 --- /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 6f6ba574af..45d36c6eca 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 0000000000..ce26c2b675 --- /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 0000000000..4c84b34f7a --- /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 0c39c1b5c0..1930f3dfe9 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 c2ab616627..5e54816157 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 4bf9c71ef5..242b956d87 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 80825e94fa..cd60986faa 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 76a223a963..c17bf83d15 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 zcmeAS@N?(olHy`uVBq!ia0y~yVBuk4V4TXq#=yW(wJAA@fq^kG)7d#7+u7YYKPSH^ zxF9h()g`mIASbahz?gwSV`6ebLXfA9#)-tlgoG1kwKchl%7Z#OdV&(_PaNQD*~62> z!_|56C~F@hqn(2)kAakE&F*6dI2P%@ZaQP7YP!{PYuthBNy|Q5?OyLP+u-VAhILb} zJW5gc%ia+@nY+tNLP8?AA?N9*NlXH}nNNsmGFfq*n8%#7-1&yI!y6Tj-y9LX9utfw z)H0t4^El_hGV9rJX3xBQbR&gVwSN%!y%bPzls$sbR>_SQ#dl~y|KZKcmMzY|DV?~ z<9Z!iTd%|17;C{KDKQ?NraL@5>SbaoVyaE8Ga6@T>h?B1yj;Y_cF%*2?IE{=?Zu;+ z$J`Ps-Q?8S*sfLo|6d=LoRBd8%z+Q(hyMTHFaG!c|8m2C&$4W7%#{qHimC5Rk6--F zz`z)p84^(v;p=0SoS&6w1-Ypui3%0DIeEoa6}C!X6;^r0 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 X&TsV39@S-FU|{fc^>bP0l+XkKb`7p? 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 zcmeAS@N?(olHy`uVBq!ia0y~yU|GY!z~s%r#=yXE%8bvGfq^kG)7d#7+u7YYKPSH^ zxF9h()g`mIASbahz?gwSV`6ebLXfA9#)-tlgoG1kwKchl%7Z#OdV&(_PaNQD*~62> z!_|56C~F@hqn(2)kAakE&F*6dI2P%@ZaQP7YP!{PYuthBNy|Q5?OyLP+u-VAhILb} zJW5gc%ia+@nY+tNLP8?AA?N9*NlXH}nNNsmGFfq*n8%#7-1&yI!y6Tj-y9LX9utfw z)H0t4^El_hGV9rJX3xBQbR&gVwSN%!y%bPzls$sbR>_SQ#dl~y|KZKcmMzY|DV?~ z<9Z!iTd%|17;C{KDKQ?NraL@5>SbaoVyaE8Ga6@T>h?B1yj;Y_cF%*2?IE{=?Zu;+ z$J`Ps-Q?8S*sfLo|6d=LoRBd8%z+Q(hyMTHFaG!c|8m2C&$4W7%#{qHimC5Rk6--F zz`z)p84^(v;p=0SoS&6w1-Ypui3%0DIeEoa6}C!X6;^r0 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

FF}@qp-ssW0N{{^mw*E^A)C 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 z z+>qjK64O;>Ho5TVhgY-3mYw(#QN8egpE7${=l4X*O$tRy%->TP!gHn@-xS>TEI+#M zR8B_h(e@jgJEf#&FA-_jIQ8w?bFvo`rWT%c&*DB>zGk_~&(bf8cl7VqG;-i<_?(}% zWrj3Um`81AyJW;9<$FK=D8^1Xzh+}s=2iRYJ{w*wmzN8E81+m_`Olsy`vSCBwrtJh zFL~a$f*(q40Y$Sg6XiW6~>V~FoZ3R_whs<^v^R?)@WN^$3In5yVtBUvS@~0C1 z`J7R8yF+rTBD~`NZ2aLfL!DQB`-;;a=9k5lPhb39W-|a#e{QO_bz4*kk{KPb+ z)m?6Ef{jXEUK{M4UpMsRylyG|voZ86JHwu|9WnX6xkk5M@5l*XURZeJ#HaKN@yd%& z<>)vmoGIPZx-zKPmG5-Q%@VDf&+6M3ZL-}Q;k)_q;m|buw%5E{CI%jVA|(?MB)myl zOsQCZvrN%m?G0VI*$x>GCR_WR;@6*X`CdrVbl0Ot`4Z;meoxE@OEoDue=lo&&J6uG zj26$CFKC@xuKZF|zw`VSA%-f$i-Cv#aK+~Di%#SGa!mels{oUKiyL3&qID6awTrc+ zr5?QY`lzUX*j@JGAK96zo0zK{KJK`dzi#IB=Vg}6tJR#BzffPT<|*NzoqLP9_M-!@ z)l_|F;kR2Kvo1(3|NGri+sdP^@?OZ-g0pVBGTh5TQ-fFk`R6e6%C?eN|M*+4-yLsj zNd5XZ^5F%|4f2`~S17yZ&;05!``ZDJZw{`pi}w^6c*nVV9s^YaDU?m`~{JiFf;zAMMm@2ubnT(j1ZyWTXcodw(!RJfGzVKOXeP%u$lXoM40o%X$$St9kq-$ zSF!ngU3=A?>tl>t#2(2XJFAcCoYYwzxbTzY4C~FF75?{H8s~~8*zmG2|9p7X{YkHL zWY^QDYk1e?s5}4K=ly)UxUQz=Rf6W)DoU1*c%yx!XR)V1x(%eMr{Rb}sGRcVqg( zO+1Esj+~OH+f?SY=h6!g4p~|Gw6Hpfj@&n2ZXEin5cbyP#J!rhrVwt0G=DWwYsq(P zK{Ib#u`$m-sQrG*g4FGv*`bXUEQ&cIXS8z{pJq-8^qn{3((7(Bw!SK%U(ZjSR8l(B zdbz+T?UwY}v=@Gn1@qX>=xT8tU-<1tLVZK~!A)sFb8_0#L^eN@(_K@bp;{!ASh>F< zeSXj3>d8G%{#~p1a$KRcd(I@kTw^mArAd#AyVaytcO1&tz_NN(v{b764Y$P?e^lR& zo2i?9Sbdd1%x3--r`<19oABi9R!nG(X8dRw{&DvGeS2I#om!O|6tkm+{nzP(XPkb1 zi3qb!_fukfbMj~hF;e4Qq- zr$gh-{f-_r5$)0~Z;$d86}6jEAXoDw9;4S zI3&)QJ81P>**w{3PEJqz@(QKk1>mXeeU%5gyB;mRVZrd);)B(NcNwjAGj7iKd98wN zvgy$ju{qzKPdin-+wbJOIp=oy-<0V2ahRQbV&eBDUVcRvxBTVpwNp>c!#zJgJv?~%)4_wmlY)a(g%3=NvNn!9H#=9lvGUX7znhG8!{6LsALnk=zonf2eu6=Y!|(mK^+I0P{$;=4RJ(1}F|nUN-PNr#!`9AX z*uZs0D{bM0WuUV&o`jp9czv8Z)~;p$hL4JMMxsq`gBLTUN?;)imcKAkEgY+Uu|%GvAdrn^sL?-QAFn!DQX^tH>b ze)>8RnS0jHvSnPkNqxnXdw$%nWc8{QcF*zAirx`FjaxzVXvbNF&;tg{D`U!f^j6p| zuzj$J{Y+w}p8OK-Zzq{`RZM66I(+cO^QfD1S~wn-ELssX@9xyRpMAQA%Ksjo-G3_B z`ts9RmYzjN*L=J*J>A+-J!*$NgC=uF(19tu6CRl{1*JUOm2`&d#+{xIx$KMcLQ_w_ z@H+M60n^r5oNw1jyjSr2vejQEC^&dE+qT-8nl*gVhPUqsY&azUTrzFqi+jfvB}#ia zzDy2c2*1y&Q2KF?=ccl-O+U79))o12srRP-t=%I!X?J1$u2VXO+zi+D_0(9-3f8%@ zFKU96{?eznbMee&N$T@BlsIL}t`L0_UcW4@en8ubx(U$tp zbNE>W>VJFA5^)l_og=lzsM=Zo`xR!EdAp44d$#zxNiqfNoIca^Pwdfjk;vs`EsOWg z4Yq#e%qUwM)Og`QZ{^man-p!L5v4zZUMi=GK0$K;YNL*qcvY2rOlHReSr(cDYXEnW-c>RCw{$JJyA1+kCVrJb z*p&`1-Fx2qw3dpUUYg79gS?E|UAGuhg8W_oJ(k(2)cc|Rb=b-I_ikwY{9&PN-8CyT z-lo2B4P*AJd)enFO8@`Sw5#!ZW25VX&a(Tw*++ys^tY~+njOs$C8}|ut6^%QVaLzE zS9PDSF1k~uvOD4u*QqC;pP!q$({rQSM!WOBe|@Mg3123ow@rL`^sJ1_Yc8ExWp{sG zV6-F4rr)kfTA8P>h)TamPWIp081mTJI%7|)<;qQ)lzX=Xu3NG&)J}JWdDz!GPa1tI zOE(!E^LLtHcPmHq!{dwve`c+Z)aTFVFW8XbUA53=w{@)F)EoO3p9wd!(_u)gKUri~ zvdU)0_L%7PwhpqZ{22l!`j&DfPQNR;U+@{@l0~3BSq{8GrO%D_##bkNsamjJcG|_) zJLBRjxi`I-d6t9SB!6?1oV=XIef#=tHFY0VDnWb5zh|s7vCf!ac<|)r3;SW%()`pII2O<{f8_!A3mS=n4DSmxSyRrK^3hiaLoTk$IF0q3)p%mOvA zUo`Q@cHdw7)OH5P+f~preowyM-FN!o8>Px8bLVcV2wD^@^=S9+ODTu9Ek5CPr6(fc zwnkE^^W@mStJ77sH;0y4|EgrY-@VtYEoblaxTNwLuNnJm(jzzVF>m?Y75B22-Oj$f z@LjTKfM}P&+<8)$*G-ark}>jM#2(w;J^#on0{uOIHSAw6>9r_&{O7du8=Jf&ZC z`@=_uqnGV%<}G*2|GevjnYpT(OCCdjX@F!;TmSK2*Dl30g`7}wja{{_!SS&U%gSde zEzO>y%WLGXbf@nQoIVe<4Yo&)zapdV>Vo?@Z7j3SZf}2h^Ge^ZW3ME=Zp`8In{jph zIYyS`B-OMRPwn_*?i$#;3b7j=v{RwHM>Bmmw3rj@)O?wqp?Y_~LDeP+fx3rt4 zs#mTD*HxWUY2f+xhG(}^m233@SN=7AT?HGLlo}peY#mi@lKb+4k z^ylbx#|KlG-Yi`BZR6`_kH2jCb|9dtVe!^{`IFPczo&Ub&aLg(wKKL@`0&$ZKUW&% z$K0Q%|IEt$wo#))Q^;(8F%PLN7Q2l%U3|{8#43GKujf-A_NBY4KxdV{ZM^up(OB=x zNw@XoY|l=~UQMd0zPX>f`P`M*)5}-nG_GfyQzaQ3+PpU|MEel`$s<+#mrq@Z*eN-a zHF$9o`?EtnTZ>7@^LVr` z=trHuby?xjs58LmFZ8rj<&L%`nX4^MMiGoqEk^jYaWV(^S$20Bkz(f`R|7F zYIduC&(HhaepzEU`MiIaZ%|^4?HWJv>vAv3`9Guv2Va)l@N3Bezo@Ezliz>;wzIgk zcR{4!7At+b1M6m9tyr0T;M6(Qs-wI%0gSdhbqxEf41%*JFdR8`<9uY_gw3F5~LW4wbVnW=bc2 zPrvnZ`An9ytGwE2C!}}#DQupvd(Ko-D`a2MMJ0|kx1DC>wLiNOfA5ake7Vz2=R!?4 z{f=F5V6Ahc>!(lO78mJlS$FSV^`_#de9_l*XR5Iqb5HFHwc4`g-0Z1Jb+y;3Ewqyh zr`pPHQP_McFy-%S?@3cXY<1rJb=9{66Dk&L+!z>jAj?GBagFTJxvV$NrheIUmiczK zloeyxnR!N&-2K1om5-CtSha5Ybb%y?Fi~f&H9bmuv(=BU4!nDi$8bZ|>4H090j_GH ziY6;RP5gUObb?okSWAKCoO6PoCd6^PV9{4mnLJh zHbbP;FTSwG*w*+M|A(vQ?i8I{vih9si)*v&+VU;q*2i6!d(q9Fm2G`|?(%SRZ&jm* znXm6L9~D@3eqHXgLdI{m5=}p3@7Vs=c-`+?C7f>?|9xgKKDT$n_boLI{V~ei>yzL9 zk=U0KwMZzq-{qTq?z-v)8&=&Dd&jPJwQz~X`*RJPS`$tkThjG5bldWG=N5hkgN5)SEMHfl!%E`lfAe>_hQgTVJ74hU9M`L2=MYMGFXGv`sA^-1chS_w#kM=T-qUo%O9K~0sESQYV!c>>cOUni|JIu~TN_(* z>xk{X(e!z8_e{&;SLVBo)AxNA@8i=*O=Ma3>v-nw-7|A$bu9QYlcy7V6ZyF;d; z$8R>NtT`o7U@?n%;pBA@%_Wx~E<5Oq6#1efDqbE|W?H!4u|8cJZGMKl`!b%DSjirIvRde5TBsA(ou7k9O_o~ zF?nF|*Uaqu>csylK`Kl_jGYd8f({Nkn%dnBkIXC^tId=@XSz3izin-{wd=fgxciHT zkEe5}ObruoHJJT&^^>k`yl>)@(_aUPxhtGXQS(v1zVpkoS(7$I$?RV9^nm~61m7uJ zcX6*(mUsuI+hwi)?jw_CHvV9U|w!BIbDDz5lf(QXgDTsPA2?-!$jn7na%neVZ~9nuGlr z9w@#q(~oryiQjEAiDQWy!{lS)Gkq$5ym-pG_(EyHi`U=Zy%k!xVe`&Uvv#E)txZcY zbI@1VC7&HMH??=`QI^Z|-@dVaQg&_0uDPD8thTGH6g%uQZ#stuOHs4Klv?g|E#rR* zj@`#|3vN%!tkn=t`MNm2V9NL4Hu*jFi`o4o-H$iBtRAo~sQGxyVy^7Wt51Ji-J5-4;?fMk zU0qKbT@q$;ur!@qn4$0MeMn0dq^t>k{60s{KbpCB-MN((tJ9xxC~9mm zmT`Qd@V#b6U%a%4eBlWb!E>6=EIdwzT$r^@?`cH%Y=uoixtX_*+HH9sQsk+)eu`km zZ?+(w$|)C*-V*jL)bstDB)@ZtmW%n7O*d9Cy|tZjDB|YB4ZYtBdp^92_*fpbRz~!e z*Hjsv-S>K3>E`{l0RrBrPdeI);fY2P+Go2O^F z5=)o4e_Z}!H~$?EcJuXuZ{I}U_nPYS>ACkNUyZXHxjA%SxiM+SKaR=UZNS>n&Aqs% zZSOIa$~_!R2hMmz928o7WyuGVH5HGVJm=VpEY--LDqp{IhDxTo%hDo6lg}oX6%&vC z&Q`B3dA`lO>culY+u5s5EAXo@RXQ=O{+*_nwf?NvA+5>YmvWnC-*mQ{yen0*^FWD$ zOaGp0XXj^|2%G%xeI!{L94=h@;TP|gotZyZKU&)L%R;!;U~$bf)0KYT{a?fxT`_!o zl(`~m#zIE}3GsS^`!gSlJMQVw@aq)~V*f0gA+d4^U&*=9Lmq4SOBec`nfyVo^N-fT zB|`QmR!{QFsx+Oy!ahv@lV;Pjsk5%`U$EXq*CXMe;J+h$tPfjEGLEc16f5ZdNY;GY z`fH6JSKmreSafB&!58+Y7s}`8Z`b&G*4X1rpk_q@vxlqx@);6)jxDi>RhwN{h-=j^yi1&UvJr z`jX>7yJ(!l*2y9^ElVDMU7D=vts>BH_`Up|s;P4Jmz@iiWUDC%y}NhEP5#DpSJ|yM zd;7Al#ThR1-SD$>l_x9vR&JY9rH2n|y9>|$8h<_R^gpZT9CcnFqJ$pZH&YSWt)`G5 zqQtdC?3uI71h&a+{}j~UaVzXzP$}}za?;#L*(svOlQwZ_xhpnasrt~An(nJVvH$bq ze@U)K1=dOZ{NTs(i6{CCcZ#HkT4{V`>!Uq$`nD;Y+P9!@2aAX5xz>N(hN{09`M4%$ zJYkIUs(e!@d9MG~GfRoyOUpc-*&VbIcv>J-dOmmpV?*at7U8f})A!4+<^2aC4O3lZO(_d)J=DAilr98vi zuJjcb@1~azp4(TL?|<*QvOH&2!nbxKKDEhyo7b=UpD;hP{^!E#h|`x2eP`aMxgo8& zUACz?=hG)9o>Oab1H{4{`X2t^wy$Y?zp;4B*1e5))^v7mIqg%nw`5=YtZW+-6I18- z%15Gx<+-a@FWUDp^C9sBj>@J+rv(LUEXHhoh;z=Rf2HKUsKk2tySOP`)1pRL&zeAJg?@_~@mViBPgPwp&u zXLSE+q`&m*JK*M`h6sy*;suRlpIsg&c^C`6DExjU^GbVW5PydwxBrbL9xT(E4w%+S z{q7vV{iu?O(dkdEJy{HfR!r{}jM96L>+e_2FIT?M6_VLuz9W1o^ z6IA>4Xz-(ysi*yJ&swc{;(X-0C(8G(JnrF8JEQ!;y{3}FxSL1*FM9jqfCaz*VVBfJ_K#fFB&^}vS~n-$^{(jO z3)>E>Un$PIR}uZO#kFjQo&J7{xQ*vJ3Rf}Ty`^M&Ufj`d-ZYMso(6@EOFFg|hRQ|P zj3iUP^<6%{MBs#$z_s{az3eSB-yh%qiDT|t*@fK9k9`6(KhO5s=U?~K{GQg9HFaN4 z+dnBz_Sxp%%62vTZu1peBUkzQ%XYW!T~yh!^31OAhZ`>5uY05W*WAM*cqdGVo~kCz^>%$B~*5_$F9t=Rb$pTEj5R`>n;aKBFLgq}c{ zeKN1!iTC@zDl|U$^-8~wbAQyWvT2+7_b2YC?W#7)pZsp_>6JG9sgBDeQne<@Y&bc? zU2e8A!<(L#Pzx1K?cyz)W^~D`tts1RWNx0mkfG1uwWecWp6fH_>SwPcdVdSsXRT?f zOX*Kqo*TEQAn2ij*%|pYSq{;B!XGT}J+gY_wJQ2f+vQzbYL16J+jDAdbocCE1|jE^ z<8$=)buP{5Yn)`hPipQ@jzb?#XI)v77F|Frn~Zxrs)Q;oG2%DLF9vP=7XRH=O& zGk;6_;pCQYV*1vP6x5Q$+ASMy1O^-5ZYnU3iVJg(*u_n7Wl2)}AS;-}QB> zSIeesAC1aLZlPJeQH>|%S<>qC%4YGs%vmKE6{4_t*Q{*USbhFq2T`nlV} zWY#570Z+G0T&c5H**Z0INyU6veKlsS2D8Is?&BRf7KW=`HZ>o+q5l8n#)`?8bDB6F z<=B+faa&IoU$jT$$YvwFr&%9zsa_Uu$ii>|9zOH(^YWMC}EB86oUpAk1`uj)o^ZPvZUY>E` zxZ0{3Lvhs{pJVI$oHe`iTO!qRt-ftdnl}G@@wN(0=V=wYCizCsyy0G!to^8Eqe8k# zU3%i7hUp?cj~q7~+_bRg`&1KE*@s!J$7Jg@uhgzk*8cq_L+rPY)r}v?+aqpHn);qdvQtE zNgLIs1D*2>f0?=evA$?Mt;pqT&a7|mZ0CO2Hdpr08l}`@p=C*3o?1VaRLzrJKL3rh zclVN8HxA4SnH|Lvcr_?hE-1=I?}ub!dJ)&M{9Vhv-Y`yfVG7^HT2N!yLuJsVH?&aZx< zXPE9D%khul(wURVJRc-3ez*D--&(#sr)%zgZm+;IYYfvCFMY02vvl3u>nzsBJ>jeD zcV;Yqz@g0}6l{_4WX5EX6M<4qv-R3Cw?+N-y07x}tjZPT#*@3ZZ4>)*AV2H2%l(;l zIyE67w_|)ZMa)>$m?m02mwln%`I)Oa`&l!8sC1r~Z?SlWbb;%}T@P59cMG(#JQ9sf z^xz6U-O|sqw2kHK(l7-vCn3=f%^oY+YeP*AOnJF&)xo9Tf_^&$ebP*yvg(7l?yLTg z@7Wo`_jAAS)rJ-~9TIwbJa~%Ksh_70%K05xQJ~$w_!#TohaA0ZX&E=nefe{C^qqee zZ}8E;>%trEyfZ5O!Ab%_`)y{)q#arCY|D+gkKZ5ra`}IT&$Q#JeGKpP^D zbez3vs-ds@2NR+5qBaa(AyaOIbw8f|@!=G(;8@~zAV2BY zR4wxwzuGCXEB;?T-*;*Mrr?RaqE&)@BDQi}IjCI0)q{QpnyL?#PE z=?5NHO~}{vAy!-V?fOxiS`jqk_rZtObGH9KX8YSkJnzN@zw`U=`NmiM zF^Jv2(f7y0Q)%~)EMmyZ*|~da+UDJv*IBoVxqb9%f9>XR$W6s?6jfEnYH!`}j9=!I z)5M5{6Q(3;Mx~yLm6+vrLFdrl8##wKD<-(xb|$OlD{a3Kyee4AV~)`AQwt|4UhK0I z?wca>E4|rn`oB4sA{M!oGWAYzb=6&#=gY+rboq&A>leBADtiqKyp0uIQ*SQ$(WRbw z(q?O+@gY}R_3hot32r}TKFnE@`Riu=GRyxemb>znJeYd;*k#TB!-uD5yjrOryyCyk zRBPLm_dEJl<^3%+Q_or6dHi3~p~K=Qi$6F&vHon#^>v@ywOMAX_Pq{%^5TyEs~(?k zm)}f$AGG1OglpygJC_~iy}qw)cf#P`i|3j~MKiU^>R{y1bV`eh{)jR(qKYiMHVCnP~JzIHJzx%-w`le#D z#_n7H56t`)od0FB+f~t5bA9@x7C&MR-unH0wEy1 zc83YIQ@HN8XGT5V`*c_Dp)Wt}Erk?nd>?M!xpiLN{d=18Z0FZK*Zq=OR#vyF+M`6u z^CLfu7l1Z}r#T20q=lh8^<$@M2UTGXHK5O(YMcz2KX6v6RS~iEY z%o-2-I$c~5X=ku9?$`AA&!4gb{;0jyoY?(1&dPpS{lkia=!e|Oblb(d~XHo*Xu4PcV4jEyi3f}SvYI{)m7q}i{>3O zJ`=X=jMSgRS`klEf4gmI`kIcyybEi-tc|#BayWnEdhd)6dlbq}%?*8W@AI`SoU1G6 z8T8bB@6XIjYgzO4HA_mJ+A^(edp!lhCU(X-M)>~uQEb!x=>2`0->al|IV`^a)5P@u zHS?K!vQ*!nl%M?l#`hIHraGPP884o+oAvAHf8`F{=f`HR+_T8-ir|hPlN8o8UH9us zHW7Pe>A7xgdEkdni4(&%zOK92{^5qH+D^TTC+h3E4lhyN_da<4pG&LM*D$Tg{CVVN z+(Vz*E3>1P)|E%g+HR@0eH$R9Qdq#$@gfUz&-6t}WppV6!h zHW52kS(ldy+I8Gu7q+r640oMzv-W}Btkkn%Eb~@8>S$VZAm;=7{7Mg7k=yTUe*N9` zSpVNFBl`g1_jflpeh7T3T>eI}rsvZK`Mv(rzx2--)~eHHY0 z3CpwPSz;IYt}|aYb-k?-_-v*2;!fs!x34`|xb}~x*vc)|HzRFsFEviq``7uF>uVfq z#m%$2As3yVPrI-os&`jxP+$#bqDM!-i`KQ@X6inwq*;=-?7+co#qy`SkO=Wo>>j{j|O zd#Brp@2`^AeEc#ymIMvvTuJ6l(Md$E6@_U;(zHyxh=c5BxT?7`1<~r&G(l=y|v$sO`gww@>l!L ze!bjnp&R+nE|8zU%gw%O>+G}&rMX^tud;+(u3mdKD%JIt8a{>>! zJZ5;7mDZ#GDx`(e#6;LQ+PONzeP`nFTS?bApD@0fC%(FFPrFe~j<8uhXZ?&MCsPIn z2L?|U#}IE15jDo*RFkLSi&trGRa|wiIQ)3>Tdmo@%}rnSasOS=6hGm3<}^dC+OK|3 zS7~0aOkK}i|39g>-B;=J+MIZywKLc5vP_z|UTEi&dqDyQhtKn*Z}k&!f7rM=W$kN) z>f2^qMv5veoo7G15M5}g>XUPoY1Z1MnbaoSp2VW&0X(ltJJj0Lsxr>NbcUXieq)) zx6dE{P7Z&mo-Sc6Y%jpTmc~-Papx`e8(;F@YW2-|);lr8;JfuTW34lnAIHxTv3?yg zsmu4DRaWtqfFs}Y64~Tu?_Tnv%g3*=;nNG}DF<#8Pk0`pC%wMN3tT~TIVcD{+i9Ea zxpMOTIos5<+n+_Q?7W%GfAPuEl)i>*Hg=z*xOS&J6bvf}5Yb)iP%%$^#^XbhI(jZ9 zX<;q3NAC-+ZZ=-1QFrQ3^RaMQKf8^u!j4TYo#6JM^F#D;tvNrA|31OLi8G4($Hj#B z-^K?k@3e1?F7fnz99zg2{rGRx+2&2F6nKv?nXH_mFCrCs?$J_Vt?ERJwJ90Zh0L3|0yu*Z}ah$XCfv2 z&EJ{SeCReQesRC`m`F|h!{Fb2_KUmTewWy+b$m@MYoovBi7Wd58~3>HKmKq1suMe( zmUZ=%1+RE7a)0vFnh)Kn*=#3E=lL@DfBd=nNs4{+1s3j@8biMgH*c4J{4QM{FC3V& z(${ZFp3tA5+IHoCe?QgKdp$aO@O=00ZEF{PfA@BgnptQ>@1v*BpPx4LU6p+OlJd%H z*LFRAR;TUw;o(KW`5bGGb#FOin4GupjK0w3o~122VD;n?40Q?mwgDb!MfIuCn~{$L3tIjnBMPcTKn` z^I_W7(l=WIWJ4BJD89d$tiO(XZ-{u&|I6>B_Z1twe8LnM<6*EsTXT`6T1@zko2_jT zc}^-bGC6cZ+HID*AIMy^FidZY+1H;}l#l;vPWh-3vPkK2^C5K+j)h%wzZ-7cvZ46V zi!&<zqL>9&fdON;R`=!%1;h4_+I_*l7j48xr;x|yqL77U0|G) z)%?gpHY!wGb4TiDtM(~8f(#`WdX6_O{&k~tL%ob9Xu>d0aK@L-`&U*ztySHwd-4`5 z)3r;+a^{-_HXN(@bZYfHNhUGjKW7Tgt@(CHBebC9>hb)0ff6U4EEErZ!|^TR|CDu4 zckk*t@3^j4c0Ko7dB>+O+JcMN1+V5=@GqITXvdO_a#5}g(=3wbya=4@yw5}BLd37Q zwVZWg!bt&ZZ*G3?SQ?(gEY7dlBARV>_0IRqyOxg`|2Xp2|202xjPH8xn|7{cjRM(! zqhiDEuRPu=uQ@}asj~fN+|ha4Hgg#`Agad5`fx#q~S{SQ?t6#Z*?Qt8nQ`^*@CK^qxMN*|^un#^#gh z2c2!)i@26djhOMgcJ|55>fL8gt^!TLx+Pqa7va0q+ScHr@|y zo25>PtPDMo);^8J?ssVNoP|f1^-kHcM5}1R%`D%2OHC|P6SvB&koNsxe7MpwcSY*y z9KNDWZDJ;K1^)6kt*D*4{m-f!;s0;k+P3-qifpB%c+1~=S5+VXufXm8zd7XoZ+4T9 zKmP0b{MC`Uc)s|ud&ak={{y+?4E_ zi?laO@hvbc>M(6}2$`FHc2&rwuvo|U$(#3AZ{N0lm3XPWhnCv%d3y~U+;7~`pR=TK zZcl`DGHcVTZ@p``>{F~)nYu0g(Z+>Fy0?Uj>~mQ}_A-~IDR8dd(l}XCmFcuYg4Kz_ z{mEIqKfZPz&Acc0F7%U`eB7}Hu00wteN$%55Y()g9vJgnV(lug+%G#N`(=yMn`dYW zNNf_hn)vBKX2OS7T?;(NuVgk`XHK3NS4{V}!$%M7%sr`g&|7hhz|8f3 z{pZDR(M{QKZA;+a-T#{^ml(J%W4p0sL*uEpCtv;lcJ1wz9}D%l*tSe=_Q#8r*GLW_765TssEGxYTXT|$=Y`fUvi1P zaBS(EzI)sQqHYWuh-&KMOJ->2I4&_+AZ$`s~ zV2@Q|w=M*1jrb;N-(PM1?l#v;rTiZ6eGHE-o_*Gk!@u5+-SGVcCBX?CPsAAOJqm9& zg?-@Jv^g!=a`o@zha%h@ttRqkb%nHptC`+T&CFjKwQ&tnORuNx<*x*77t35Bs1T{YmWFU^R$K3n>_NV>$QqInicTPV@EQZsA(l$<9 z>zB{ABD>#o@dS33=`$N97%A^M^J(3)Ee!5_KVROI`z7c8SNh?L`jsi+(Q7+?lpo&J zlD{dW(pyn>N5h<|Z;u%E9!d$_rE)b_dRD92)nmsFDX-jeoi(ppnRUyB1#hD_zInWI z`Oynmk6y2jIHvSlQ&2;UWznBE;rX$rY?j2hM7o>oJ~XpajC)r1_sjbl_Fp>cEuP1B zCRsIc>fYCnH(E^6G7eVoI2Gc;IcbB|gznO+3^#Ml^`*BmYI8TGIX9M+AIxi5(9k#4 zD@J!lUHIR|``?c0D*mW+ zb;lV{!L)N(M$kd?P=iSdd(VDSUc2;^s?75H`&PD^nJU$I7IG+6DDUt&cxOvD^R^28 zkB53#)m0tVeR^`Z#<|PIL1{uX%b_(|>s^*@Vv{h|J#-|cV_Rqlt%d# z%d~=A?T?FhsdK(ESr~9atLMf;54AOBVK-kcO|c@+Dnte!DDjxYwMy z)aw0-%G;Y5I}c>JIrvx!8~b^NJ^gk%LHA;UP#X98t6}MR2X!9aI=f-B_n}oS>nr5i z%dR*?#GY>n-IuEOV(EnguVsFoR+3RjKYZl*L-W4C0zIX+HqSKH{|k0$z0S;kEVXdr z)c1z7x7t6Mz3{p^Tc)?K@YY>ZUl-*ib@1`WszdpmDk(a!&)MfX~pMddr~5lOnwz0!ZjuGf*q zXEpk4gu;&PJMs97z>C>mE|vSoESx|8^y=tB zuH|OGY~KEEkyGu$%Dv?+bwzJ@t3J=;-LiZ0(VU2x%Q;_&T=V+K%vNtTGhE%M=|srh+?_dU-tz8vQJ3x5hkBuOkiIPFpF@fm?~uLTOG z-d=IYz%@`d-JCK@jbOM$>{T){TI%7|3A1l zQ0?kd(XAoh*PSo4__f#DLFa2r&D!PDvgfH!a9ntX28z^T=k6t9LKtZohQ9eC<;9 z?i1V>u)+CD*4aPeeJ!p@U!g}_1h_;ZYm3c>jG!Ed+@H_ z6PtGPgO)SHG~r1yaXY);J!#e1Xf`*CX=BT}ALnhAl`PJ;*DRW{bW>;6$GGeJiaEEY zsB7yO_B=}3zoJ0yU9Z}`_TI`Tg+@%g-=37aObAW8C^6Yv+`mg@4cCLHy>>>cUmyME z#-A;xY8`zo_0&Vh70*K*!=_r=K6$feUQ>8~;gR*6vnt-`ulPCnzL->aw`sq$PTacS zlV5%OLT}BzVr}iX|4nW4uf4%r?5F)a^n_z_#NQ|VEh|qxUD&J}`=oO%lf&m1FHV?p zec0){=A((+2d=Ygs;#zNNWJD!mAhrWm5nLOr|cv4-uiqo%cR=7-{ss_$&&x#dwJu- zY!k^Z!KTaQGvbctYAihG-}_bAWO>4T{%W_2vL zZ{dACzuvB_IH^5ee%|_f_hwJu7PWD`-F~q{mMbrCsXS2Q+`QExAb4#$ zEz`!uUy=>yhv>&js?~D|d%WG@73lP>yY|c1biYem^gZ%# zZJoD{$A3a^e9ONtd&@6;PT&1j${Rh-j;9_~R=f{dH(`6?n zO-|XOd4~V0e2rg}<{q!yNG>(OufCU#2-mwRtd@y2zf^O>f8o9B8GqXU&yBMCX^+u$zs=E`OC{_IEF-DgxB+Gr}4nr!r9@%(se^}g#yfmf`pJ@>z{)c5&yq5rY6jhWhl zYvHB_jmPYcR+#ZT|M=?j#bbgWV%}&N%sY@<7Iy7o>q^0@-jnNious`=T>mgW{B}7z zz0$QNZbHZfwdz^NKdt+^JJWb_uEH+AUfzK8P}}$Xlct8R+f^Z-GEIvw?{cSE@TnTd zRq5e7v?p<{W@}ej6BOtEm$T;iw`=PD3U@@0N_IHf@0x0T$d+wl#)7Fv=O=1^jBc@X zmJI8xoGCFeYm+a-zwO8SHpMTy;u5Mo`}f}dzrlA;KdU!j)=_ngD4tMa@V)xwCxM@r z6jn;z;oH@_b;SdV+UR26YwO(?K3r|*|15Y$o8Gnfn)dZZ4_Q{O4|&Iae(qi`&=QHP zG^6bIzrw6)7Eb?nU0MHMkobMfT9cuA4B4&E`U6C8rB?y!t#o~4i#`%IoK@ItNDj73&=4;o2NII7Ad#AwX& z;Y?H8Rj+@yK1>Ozd!J$YaJT5+;NJ^X*H6@Qv6ZyG^33p^GWYNP^#4tJ7SFqqS9mW# z{#1ufTTzznjV$XG*K}81+;VvPmkP5hoy-%DMXPJ;cl>$e@~qzJy59wx-Ibc_bC$I6 z|IrV;_`u%I<>E=ZPjl-g-MPM3`SU4botH(HlQ~w0xr>&vPkA2Qc6HsZB;B&7k?UkF zHt3p8YzbwIx%ipwP?mS?rmFj1<(Id9T~{$#tbfy_E|!)}@jgQRldo*QslI-%p2W;D9tMbSSzGXjTkY(EtECG{ z=PI08AZvCet>f?-#WtJliaje?TcWb&1W!NxRaK93-bZOl0bQ0%9IIth*6w3)U(r$)KO=sR^2DS2vlZ6nm}#?f7fk3j zy|E#-PwQ)1Us$?Z#M*TBSMm=!>J`!-w66$ZQMvk2!n3r)bY;!LqlW9#C%p*K=ub2q>4 znv0V1e?MIjbyPYy=fh_HdtMh7{FEw3icRACZo{37_^eq6_U_A&!4L%~`8uNAdaFPR@O+xc{j5I1L8+0lmQv!;q~Q2xxp z(&Qtst|3zWtE_wO4RMQhi>P%?4VRjI{-4`8mHo)0Rej+P-|TAKqy9_7=7*b2u4=hfjNYtS zUVG{nz7^Zuo|D?seV|sgI(Sa5>8%?=r=IMM5ehq6Y0JIqdfdD_-+f*$UY@JPaL9{$ z*7qaIk1j;r_q=wi?5*bIzemo7?melV-n=YG<&3|S*o=FnM?54mTpa5zuAU*>!Te7+ zAwJMpkySk-JXOhHYqLzUuU1V+;92hLo6CgHe5pH?618@*(+t5?x1zJ+9*gm5IBMA* zoE386$EB`Ya%Xrx2C}|&Gz&Ao6lmt(GEKtdl-Y)~aJ8V0ixRnSeD0so`EX54y!P`Y zAGO0Vp{aSfiAh~2Z+-e%D7U@!xrbiSr|6`J}iTC90G7tBy|<@2ao=7JA5i zs%HL#cQ-fB%e%j?Z(j1|L;t_6UA|)T$~L>hX)U^2PipVW+L@Dc)$jo;|L5K-#=SXP z)Lu{E@L&mH$+>1^_H~|u^<-nQWr@#DKl}0Xkg3P)J4OUs2sUgD$Q}mPplYHErjcXEYr-xiBJf zNoUm7<9pWMv!0-{O8n;p>oE51sj0>`Ebfl~9XnK6{(YKar_8%pSViP{chT}(!$sUr zFQiWh&ie1rmMH(%MfQh60^1+!X`jWo^A_dbG2~e}=QqQd34*1%;cs%i6jprr;5zHi zP4SyIcTL`-E-!l3E#kD6Jd?QijQB*kQbjo54Ihisi1JRM`86e ztNhT@VxPjYBA)(ywa0MT_m`IgpQ>0q)D__@lkc~TS6{X7`S(k&#N;$8xE>}>^vcV> zt#O8N{>%LbZh0QwvQ{jL{ppi5>sK!e8r~(%4=$bcqCzyR`i@DSm0OIeoV1trs+aO7 zbUC(6+w!RGrebkewbU)v$R+cfm)P65vtNaXBma>0$j{SRFYjdE1 zQ%2(2!s{HmI&Uj4%BklhC1sg!U)eP`JXayz@{@wei2|F$QYjZ!Wj*6)p3r(rMDkJn zhY5!lum5l)_@$>AcglXB{_ho;MpJrHANDHP+h&zSWu)uYhyUDlE|B-;qV&%<SGAUHx!UzR zM>ApL9m5BLoHo;|UjJKMe#a-gP3=YgjXUp8P8NT;_P6lJHw z+3w56eV1Gnb}IZe4DzmR6zcrLzN~J7_zqDO>ko+T4=s=hppLsWsi% zW^?`jwd^nVn&&QWkGIe@S+(!yA5ACwk2dWNx3$HauG?)1nBl)arYGW>reH)R%ZJ~q zu2`Jl`*3IN^uG#A=iOcYPWjY=eHAx<_`Nccod2-xN_F$C9*bwpGTG-0? zTh^~`{-l)N%jT%qK z&l$|ZwwryPT(Q(R%f177Chl&;$D=c7y8MIjyVojxOo~rix}jA3?9}|lyH0hB z%=^LGdaUluWa+rOCAn(VXXmDrzK=A0BHFR)W2fh=xmW*xD=uAIz(0H5OhI{{HLtQ} zI`}m2_;qA$bmgO{8T(H!O%Q$h`|-(ph1ZryCHSsNoMkvcGObkc(!y63waZmjo>6!- z^_!)jX5mElC7Cy8Z!5WQY?@VK5qtWx_jWtx%C0OItnvK&d$amWzHh3ghf*@de=}Dn z+)rEB`gL=-{zc>TbzM_`dFQNJJ~h|y`OD?&crV}o_d{TBRcS!=taoXXxTHc1cw6eV z_tdujDE~40dz}CJQvQqf|NqP|__;cX*NS5cn}Y7vQ!&pvg~d;vm#TPgw?o%2sgvjQ zA7!y4Kg`=A-9G-mG>x-OM^EsCAXCJdzxMCE^WV*1tal=7bBn`MUwO6f_sWA(HqBp~ zYL)To<@%0Ump9Hi86-Yw)yfp#GUddpC(;^C!_DvAC%%UO=9_?3~ zE57Y-Z?@~+^}SyULmXOX+&uY&$79xH8B2b@8|lucPU+WJDt5`mDd`vPYOXz>!TPLv zmHryJvK4&6&K5@DOQ+7=asSSydFtC!4~2{UNjfY`ApT+!iG01@>6q-cYm1QYR8%!m3-^h!F9>Kl3H6@H4IAU%<->#Ad^#6bj0On zS7O=OtT#_fYMnQ2KB86j;{A$h?w!{E)py>qJ1H2OrD;^$Qe#{1Ydrm5LzA-of{YFG z>!qvKI&C)VGUVO=lT&R~Rn_n5K4HEeSEbwk_T6nHyy$bV;;u8d?eb^TAHV48S*jZr zx4ysX_b=AOWvYo=E3f=5c~_ft&*^s4lBUOB^zBM#*?m~=fBFB<7lBouzV2f^xhhL- z<-Kj2oA-SDFZz-hJD}@-Zr-`Al*BkJmaT4T--dot*n&arrwzpOzj|-8VX9n;e6aFmyM-^m=u8fFo_uQ2fv?iHUdWo~2&$?3&)?@Xb&cdw(HZYo z?%N>X`@wnp+q8Hc&dZPQ&ei?0@;85n(ub*EPfRQ}v3MyuD_Bu&!-v|Rw=S!{SnlJK zo3U~!|E85nPxiew>*{E_@aLD9J6FhAv7;xS{$tFuIo_dJsJq=PGEPZBa015^8>Wjl z17|(|&R>06tn7fD_rL4)n#bNeS<(1YX!&K$nhvSk_hT+*_)I#^#$q-zfyK2k$b|jK zh0{M=8Ms4&KD8Xk|Mw$Q>YLi3s(*iLtyioz+ut|U`EPp0m)ZOMKMS^MXq8{@d?EDN zXM@GHcTYKl>vtciO5CI<-w!=&yMw;Lg8ARnW-b>tPki zC+CyH{kt_9`PYT3eOSTvgil6nnNrb*sq8b8(tWjDSg&v?{eH-LNXJNi%c2FEsbzlA z?Kka?F->;eGIQO6`Eh#fFIrYz3*V#Te{DHaUDc-Vb0l8pzu#?Mr*+?Y@*2bMrw*uE z*FHOTclIiN*ytNtB0JkRi&Z}@+xpsu|EpLGE#l5S-UzmBya7-u;4Af4<>Z9wY%T2eEDdZtHMG( zzxGIOW0$*|1+U%f+3@(%73XwwnJW_9Y#SDyI=AeQ%*8WDZtmU4W|5Vjl_gMjtLJ&w zM+rNlxVO@apWnRmp7oojsqBT>tuuR9-pX7Yoz!=^eCySX-+a`rbVr_DI@|21;Lm*@ zo(MkdUpiHG>i+!iQjV`uvxVB8Ka#MHTK_rZi0RxA6XrEfS?V>FFUS3QT>pP&htQ9w z_bXOc%@WYPaPlB~2=B@toj3UAxv#i=xXwMq*va(#67vHrLc4i8X3DR6d84nW+92A* zdimMyQ)=%BvoHJmEMHCzrojw$<|6+^tjWPVEt5>}+sZ5FpTS`Rm00 ze?(lDvz@rMXXc^9(^)c~M$}J`y7%9_^6j%PUwC@^UYgc_+*4WfhWFE1)qDM)Z=Gby zuHl`{B)1|=#BNJ$c7FEL1CDQkmawS)-Tquire-{qtat^V`^obgau28JDV46R(A>|Nz-TX5uop%gV4y9Z_yR0IODgDDr zmC%_XKexUV{V;#4i=%yTV#BH*TLcn9IgAc1o6-JT|DxqJq2TxfA7ppDkzejBTGjrE zU21Mg#tD68wk*9nYJEHzDys{2?b_w#9;V3qZ*|Vp-$&FR?e|#taeiRMtH>^&{VH}L z?~*QMncrNMub1_SOEBda&qX!Ey0t7f#4mijs30rPz2T?s9=9d>9ltNU@9sE%TDi;Y z!7nfAx2wx9*j+0r-Y6Vu+?bhE|9^pj;E}Hf^Gj7zrulxd>AUiM#nLZ~Dpyz5&G^lG zse3xxOosSB_u`JKTwVKS@+-4%o?F}JR(Ma!((F+G^ys$H`6og(b1iaewoK8_T{LTn z?TpFhp|i6yn^O*@XPmktbNleV>taGR$E8=DsZGAJBlvuD(A3BkYmc5|w9n+(A>s9D zkBftnf?$Av#^Z81^~u5aCie%dXm3vcU_B-KdGv~BXaAeN7f?LF8)KVcdi~>`oA2@# zEjHd;`96MODZ}~wxjnss502~$IjPkXDin51dtcM>TH~tXm1+IWTQkqZPYBx({p99v zy^kli_zHvx7(Cf2GQm4KdzSH~ic_ik!#3sJ*%6dEX>Ex8uQat8D|R_dzcJ;K&$-I> zmEE~(*UGF46Se8NcRAFvzP?H+`h8Z`Ro9(I*Z;da_vFN_3vNXpZaLwURGO=j{o8F; z_CJHkVdn!o{>GeTUBB_hFVYEsNR&doOyX2?B#z_8t9=ZkM)WifM|UUN-elc3?^+skXI zzBVr9?DF^X_c+ymf7dM8FY^7_^F{X6Tw%rHEE^pN}=yA0NI*Y(+tW!k*CthWBwU*2_W zt5W3S-BzykEIW{QCiu*8SJ#MxF1kjh9#6kYWiX zn0v-F@##a+X6a}v<9F#RMb1obyLxq{VAam|N?*_PEN$5|>u<%~0~f`m-&{4Zv|M|7 z`?ci7<{O(o#(z28evw%=?_27$8tZkb>i1vXTHM@GbY*|T3)g?+pXGR-@7Ig;y>?t_igz|g ztuK^L5qhKP*zxnlyfX8pJUkHqm$KJFTYVV zYt35cW$&covFh?);X{SLxTm*e82L_m_3W#!%-!`<*F`fI@BgE}M5is#aPDy@=NYEV zwFfn>?#ii&4PW=&_iA3*jD7V_rOpI;w{D1-ym;ZsEYPrGr-PrsfuxOF)hr7_{G_6t zmR=2=%Fh`cmr4<|aXf1uhz}V|_ z(n}~zK~dj_=hErF;+Y-F+RG-fg{#VD+;+JA>b9u7Zp^vYUxO{ym|O4a@0{hGbF4Hq zZ2r7e_kw)xpQ)QHAbCNfZ1>z%T4&Ez_f&2@p86*J?5kTUcE!H(iJM+&w5rWtw&J~s z^_@A3K78qZ6#VXuQuWujIc62oQ*Xc868a=pe)81DgNjY}wTxdTroX(u!@~FQzp2G~ z{PGd~o3~xnKFs**!!fO><7&-roGeXO>e$G4P7`K*_*Iow9xWzfy z=Pa-7Y~HB_u|LYhGWJXqa*O5j1vg4kz(qu`0%LL z#Vt&!s_Ks;_s2=86{z|!73!Yfl)ox`#tNzQ<*!yQxf<-ue%tI4o7vSPUVU0O@^e-Q z>wnFX+9u}rpTk<}|Lp6>PR@7Ttd}d@y61i3e^dE;0c#I?z19D4DQU$r{nY5ZwJEu) zcAp3^I!6-8Nml=X*Hdms>i&kDcDq`gE#vYVM4B3v0&w5k;RcV$*qy!VEJN$GuFMer=JxD3WSO7mRI;a zE7qj?$!-xji`i#CKHs|Tp2{Jun`)-(WzTH*Xz=@K1IO~$MQrmFyIzW)UfL!aw<=D0 zpPReItNT74{u{EYcdT3GC=i;x`s=x?TPp?jiIu$y_QJiH5<(2Q-8Y??3FAwEoDPMb9_!cVF#&|2+Bn zo-6NrFRaf=NdLhm?3fY7%irI{(d6coy>VCX^Y~qpe8LpZ|9q$^HRoF(xBER`(kH@CV;Kq`IFN;BX){6DwQQvMUb)2hHc0W>`^+)MV`IhBjXZPJs zTE2Jc$z^jc_^gg+y%oCSf~#Z1&FF0ccK<$~H%JV%x_>^fd8S)*YNkNg!JQp53Y@i< z=ak-y4twFf$|d;>YocgR%gZAdLanSSTK`PE^2}v+Ry0fC)kCvFUwX*?PWklvuSim` z#M+#d8@ZVnp2e+p{IKb3pxVo8;cD*Bm;ys5J3sGy>f>ek>RtNT)xU4}e9)QA{cloj z?A{|sLMQxj8r`|FJ#zA#`p_2E}d)0EhArZqoL8T|d}FFHRo?eXt-o!V=};`Gii zAK%lx-l}QIE>GtmQKtg_&4p{Hnf&?Z=+*k6=Si)PRiUk6V!P+wDPIH{NJAWVv!uY~qoVd)MCqqbnMbzo;sLlhSS(y_;#k`Al zRqdOy&DAkts?dX15ls^p#9_-MmFB{@cu- z``n{>Z;sv%-hVaSYo=Z|KKNCw?8?6Br>_(#`m+A{ z@)zdYuc=rjyMJ-W5K%hwA?WGT)rY_QoIg*%t}ke6?VA$+Rly&>aLsPzGxB6T{_^)V zvk7+{)*LlHHFu8!!&{3V8-@P=2CE5tb*{abuk>>2)SaNUi=ei= zfgl5C^8)LM9sgvPbk|0n-4ywN^?pWTnT`A2T??PMnoB$Lu3hWQ()st50hTWFMb2pa1aZl9I%!EdgRe71P$~=$-HO{9TkihwE3% z&HLGhZM!s=d$xv!oxXc@%QU`%EBm$j{!L$bBgZT&D@WvCT~FzqllvM!2z?hWD~j!E z%KnzHyge_==s17MysNuDZGURiJ)3i7^$~Tc9m_IeeeKleZ27#pMCsH51Iay8-U{VsHC}1Lw8L+FVh4)z}tqL~$zPm1VvC7IG2GI*2ZSEgj{ANOK-aa3JP)9+nfQz%P)=%bI zahdgs=%0H!8#6mE9y>`+s)E7KoM2=2>#dcP;AEVXp5#P`>}i(Xl5Db?iIQk3AtrYo~XOqx}= za81Xo+}_Hkg^&(7Vl zzqMB3=CpN&Nnz??Y_DEtXXfN6z5HVPHgDCIsoeWrPu^d!}I?#rm32VX3)w$^LF%HtowRtu)VH5pmZwS+ht{SZ0lQ)A?0P_-3ojN%(wV z8<+gU>eW*{RJT%sVJ(rHypXrJ$H|{eO*A_YEDE2(D1fTyC(86(`v%UyY9n3j!J8XitgOBF#8jsn@u^PNkYDX`^ZCS&J$rci4pdmn7ju~D`@Fnz zBIv?~D62w418YZ6PqVf2i73z3^P*w96;?WgS+2RM9Tk4gw6)IS-$3s*S1%) zkEZLH9El1)|KWM&w~KZF-~(U}uYKReA@vhm~rFLV9dlR3cUaife(PxBiJ`Ae>L==U9Xw(snf7+o)@SwWbJLLi4v^OWL^pJUw4HtN0-`2RzpP%Z4n2Ely}0aoiCE}am+ z$nNV=g<~H(<`vAc5dXbeAi+!fM|bicXa1{?GA>zk9oZN(`-Rx9M%h0Pc{*(#tvS}i zAvuN9Lgr26nx`r0hZy#qozS)IW|hl>h8NujlGTJ%EVj9`^p-5G&YIG>s{4xV+*@pW zPQ6fgbNTW~ZB^?m*)Q$ZuV37sxkc)W`k%c^gYy-i zMg}LQvcC?!^1^8U-9wh&gJeqFBW|y}6E?m0kXLu&&b>3|_{uA|KmL8g@i+IH#IM2M zN=yAt8p#U^vbj!i^fq;uv^nwQ>fMyJHP*#0x%!c{Hf-k9xlcKYrKMJ>M5eO&2`=gUZ6kbhC!def zJj;#G{RIz9Dign%)spjPPKexwOmWcaY;f~sfrr3~bY1O?hliI>4f}AfxS`g1uT}QK z({+2rrkTZWeEYbPmv>X?x~R+Rl$$D+s_#9Tdzq`t;^H6PRR`Eip35%XDcL(;*v#_q zN1MrtN44Azty-7#Q1pkBe7b?uvi~-pm3lXJO8QLwu=w>n+2wNYTW*AVhzaNwA9^n2 z!L{K@(rHVJbqi)xG;MLpJhQ&{h=|XF0R1?=jiIc+PyNn)vwl;c|M6{HnW-KkUsv3` z`pv;lGWz;5#r@lAL#@4igU_%2`YF0{55L#djmdfo1QJhWZne2|A)5RAiAGkZxyk&? z>J=skXdXJL=r{XL=$C1{*8|-{W7pJu<}KK5Vd$c79BBH&H}`w&^Di5ezw#bhSfv&f z{cNrNJg%+rD}E{k%?XT}`R3>0*wQbDR~vu%wBcW4>Y3<{*=@i>b^%0 zgHPWIeR(P-W!Bt<<-#7??uU0@(w(-o=11=B>^$-LJ1=awu!GCj?r2o_slSzWR<4R> zibs~;IXSCx>-WuV*VcxlUHtuqt6h0nAme<=FBc0ISe!ih@qx_WP50fuue~^%O(`ou zLq=_P=d`O6^D@F@({-J`%5B`@{q@aJ$Eu9~zm|$l+WEPyp{n1V-C@U#aFt#B_Ra}* z=@O>D7A?#CoqA&0cIPj?Zx=`Y*ZFhiKvSPp+n&-8GaW(DJhKXur6a?8whwQuEKGbF z8|;*f&c%k`^jlXXJ@+Hu(%NvX^DM$r>dETVcj$ z>-)cQ_pUOm&nnt}G*(yXU+${hz+>|~lTYg?J8k|XEwgB~uD7#fns&_M z$^3e!XD9dL9rqF!e&101HFu5bG_MUsA!qp)EcLij9hK7mBkuWqk16ZJtDcp6XDZ*_ z^YokA!cx|=t2^HFF02%tS7rBX#oYSGjjNx?|M-8x{zvGwT}hJo$HIC1!SDp7ZH?vwfZTAVNcdQUJ-Rs*v}^1b=EV<J0)7MSA)s-qZ*ZbCUuK>Qj^GBV8 z`B~1F+I)7A^*a2qab<-LYt7ml}tuHUk%|Lj^v;)F3Sz{xF+wmv)F;U|1z4_~eU}=&g;X{@zhySoGnF2mjtfcB_^-|C`cV8gljW!EL=) zBIn+U(M)|PGp8YP&egP~6DJzh2_AYqF|O>oWrp_ehF`Axr_W3Co#s&_R@-PJv+=g> zuI*=i%eRIushJrR)+4oI(W0c2wmnBUw9}ezsJvI2eK$99*gyIF zhQmMDt-rcFIrC;s!M?nWAH-GEcHe&e;`ICdGk-0sxg!6+;^@B zARAB8jG8mcH3a%DndtvnC=1&11v*DDU>8TjmaN>&MGF@Seqx`rR#)n+TvhO0HLGKF zYuUQbNd8{d#dho9MgCw-^@K!e?mMevy_!`u53PP-UNNccp>KGXOM)Z^i*lls2{XVZdDw#`bjy0LHKEt}Tk*Q)R2JzOBguWIqstZQ!VKAQ^<7c%$i{bJ4DEF+ux zNbTdg)HC~%j)&EyTOH_o^geOXsTHw{-?Gffciww5FFt0mkJ@Yfe ziTUL1zm|0yy{`nnd$FLa?|hofM*rLAeZIFYF8i_J(Rmqn5gva#_k}CdTegY5YB{-} z{FT;O>n|;#4e@v4WxRaXrQMoeGo`xnhJSwAW(V^>uQOPdHHJzZ|5Y&MUSzzc-K?A> zahGEWbB=s6T)9*rQej(L`ky~d^EE#HQJuk>=b>_9Z<9O2bbi5iZRyNk9z7LQy`-() z6eE;U+cSsJaj}+QV@J^X-5TpRna7BC=yj}`+M-CR&_YTT<++{*^`T<&`%M2eYHE zZV0i3KGpOOU-V=4*Vg8eoDW=c zC3bl^meu5|MeyE_y02!kN=oa?E%~&cpJzVXa68ktTD!NeZ?@f(3)|V2x60iLaQ$As z_t%_+WXrPb`WE2&yIwK> zym-W3rAk-M%+E`fM90kjsy@}0^XW@ zEDKDxY>nI>#HDvkL(9Ioc1{!9<15Vy+E6cp~YdhsIMKlFau>{7dHMq2zw7wg@hZamCf=$F1WqQ>xbgG72V z^Uk}!DwjmwyE^Gu;MAjAlD772PdN5-x4osS?d8tt7xeG$pM33_hw-kaoer)SCca!S zzmF$o(RH_VoR>K_>m9a9PJb+Abz#@UtT{)^A0PJq_u_`d>@^Q`)wj0Hcw=FF@W|bW zhI77cMXO3#b6356GdnAOuX9ds;KQE1TQ(#=ZELeCN>5|zs=o3<2KWKcDrxOYc85Qg)<5NiQDj@+GU+# z=_WRbGykpTmMS%bt@_rY%H}@JjQh&uRcEq1rh5lf?mAWXVpH~!ogHOuYOC+WKIQ1y z%>4DR%*Xd{BI57FcM1yq5Zb-2Qa1Mfrg=8srYaj<*uH*lRbPym_0BavZX`wD>tBBK z+{Vf|la8Oexamy3t6cx=7`^2M$Lx%g{ca?@F%Z3T`+Qgg4 z^Yw(^D4`T)%p@wRm)L7)WaU;@@5Ja*IAzCu2IyG;-JY!MEVs|5l}Fz_TXNIhE&Q+W zliA*Hja;M6qJI~xxc79`;;m}}m(F^%d{uO1dV^|P-Ml$k|FgWz>%C)qIi6&$sVkFM zC7LO;!qxfRY(;}7a~DmYxuPn$=D?dR9?Xtg=6kN%dv@-VCx54k+5bLwNb6XRhJxM8 zZT!9lQy;7<-1YLBX|#uFY)e~Evh&`K73OAk6F(hXvMuyr$|XCs^&c9~Y}&trF}}rZ zh66*VfmFwa{`Hkyo9>Ix5NxaL_GsZ#+v`xXutwRvGCN_?s)?NK*SNAL*(+^b8xn2f z@j5H}@~6$`PK?Je)uuStz@zLTSEnI>(x^mt>EyPJI2 z%dDI=5$vhXtj!MRzsyirwa%}1$s6Guuf%VI8OTOgM1T(ypMwPL}gR#*EnhmOUnN-_n=Vwt8%p>z@0% zB)EC5{hrc|Y2j8(@u3|P_>RB2F@2I0qi4j@V`}N?0;?i>zcsr(FuA^rvwYs>w$!7p z%?vT8W9P}FEqcZD^}OG*H|4t7%6D(p4vo-}ZdxgpThed!pPgw`)GCow~>; z%=NFhrBCgIt!p-UPdF-l`jel<92t=X)n?ZBXX=!f-n?3RUajAB&eHqGH(9G|L!%kA zj=(`FK#7ARyT@(Yu@&n?@?0J~&N5uN$%=FS*L77BOZ#+P_FNP=`$^qEeBp_jDfY#W znjeIQZDVV6?dY`^^$BWRQMA#!Z|Nl82g|frGQyL4myl_Lhe?P7Hk-sDB?&M1FVHoG9L??iRn{Qf<0^9v5`5GqvpP|##H z_4r${+e_`%h{?`TY+mGfG;Q+R{odbZS!eG1_x8!_zt&x6WR`WjFWpqR&UlK(9_N_p z9xncm6nN8SE!B8@P{Xw{_0Xc72i+|X$)C9T^oNPI>zXGskdnp(4jpmEh~zCM=79zh zi&n0DIpyN9v$r(Ul~zsS)Tt>_{NNjU@>astJqLJ;-85e+D_r!F*Pa=yG{KlfsW{Ne z_?GwjFY${`vTo_V7IN)kZ?1G^t#9zTUz_f9J#>(rpVfTn{MMI&RU5zex}MaUVSex0 zM$@->4LVGPE$3x~SsD`@W^f-WF%aR>dU*Bny0bRQw+bxYJV^<*pMKi)!lzTFo=e|) zUir`F&h$rkQ)rz2q=zYc7d^iGJ=8`HP;Z;(=0 zD;4|exK6==7BA2aRnWR5@Ng1ir^7eF19SGST-o?a$uvjpg(^#)(d_oL{ZF4rJyct= zDX7waBKNeDKbA~hG~aW1u+y_hGp1wTjaRUFMb71DStM9hx?^@9PmEf=#S9@9fe`kY zE3(oLt-A5#(-8q#xg9QhjUQ*0{=IiDR&z0%UKnGTzSfL@L+nhv^9n4^90`rcQ5Fn) zpL%BD(0lKgF}})c>h$D6Gqkl`fYGZY5sM! z;(DEsi~lsa{P!>M*1y6$q0?=qsf)MiJpFHvCFSB5Ckp&Di8n2AmGeT*>l%?P3r@1! z-}K`^zt$SVJvn+E<;^i%VmlH$AC`qbITP!l_d7nL)ccSYe>jW&$*PGxQ|0r*d-$=nYs zSFaYm6}I6Bhe0Q+5;ynlnY%<9`4jh~b9nP?J5XRX_tIDAY5Ln#)@E(pUbkK? zopHrndlA#BnKC(U72kKszFK%^ngmmtaN~x~YoVIF);zl%nrA#rIHAN3o~H+OVIYa6 zsD;5~y^UOr(ECUO$q>5_j#5i4zgc%#&bG=Iz9w-*?0Rj{)8OdxNGK(8zQ;<*3$bM7ymohAH31C$|Y3!?xlS* zm)-Eco;=;}MO(%5TW?)0^X@7*3Z!#tXxDnv;+#H_J^D=nXekJBJzG=>){jomS&gVn=|XUwNiOeS3_iqNdHW(AiwI3 zo2Jh0UEg!{B?N)5N5vT-O4~K+gq!>cdx7!zPi(9mq}$n6~~N~k>R&b zpFHIiCRnU}a}gWkuH@3bl>KaGVV2WD#~PqHK&P)^j-`HI;I-n28z#pNl{H+Pk*n~B z&;8l66HzTsT(2F}JjC^|hhMG!L!jxK*?yKyZsAKiezc#cFIW?ovq@$VS90$L=EL)2 zD}Bx1upN8C@cYfApkEvZ%7tY@+>|;Kn19HcSm>I(@Lw{OOQ@7j?J-Z&HoMez>)Dh_uAeOmtA1I$l6U{_t!nVs`0|QN&+Ly(WLCdNB*r;!;o7g%@Rxa98C`@8{V9vHDCdqP@umL-ybg04MaY)PmJ`4M7)>jcN|U{l_X>e<#S&n6hHIIY0%#mCrw*zaG%Kl9BSFS)t9eaT#EP|$N)!%uEMUPH^=5DF{_k5%E%Wr*aUuEu$Rpqdl>$gaA@69*MUR_ctJabI- z*nY2dTV<9ZHyS}1Az>$n$Dyp99BC19YK>8xUdLZYS#V{^M}@dY&VKbIz`XS)|Kynm z#Ls_gGc8g6ovanc{%EJds*p8no{BjJb*C`&umZFB9VomMqt- zh|G%`J%3L&Oh0==@8Zjeab*+o*DDmlhBZh z?d5lz3J&O|epO^>f2=os@}IiBoDcS~sSAf~R%Jf1uPr5sFJc6g1vt`0cSG}-jN&F@%ldnr`M~maetE~fW=TGL^E9+03KYu>hLgryd z)SpE4`^7m%7RLi$KC_73pz$ZDMZA8-qQt9m@-02?B3hDWwwqU9vNv|r{~o`@d$O~p zcEN2KpP*9CO{*e&Z+&tNS;`VRFCvs<$6ZkqD>JtpQ&$EZRJ&wuYWeb}BYie54l^*ek?}T>yUB8YKti~c1zotg% zu5{dEW$L8=J$A{wnH#6fTy^u#d$w=>TUT#ve$c;C!c{2rXvI~p_2(6?*vj#rJ@dks z;eF2915=bSt^fbYzyHAFmgBDrzvY+w`epTYrRd#$x5XtdKZREP z+Ufk|kaxT0DKF#qmCvJJ+P<%P-Sy4+_6(IZTQb%>_$M=a-;cllcklh&F!}MSOMhox zu(ixwWOB;V{r04%bC@Od*?JCcIKnDtlTaR+aMS(PQ62vG$%*ABPbMTMOD9XKTSiaP zy?M%V`AN&?l6ybjop(F-a;&YV@UHZIkKDS)Dz~>Ddm)~8_uH~R zf3DY0DC14+QCXZ|dd#0Wzk%(mPDWndHG%yb3soB|npKWhgoa-CC<>aiWa(0`qM}Pn zKJR%ImiS@9vt_rIEvz@46=FNb*Y~7})73v~{;WuKS*UgAa_Y|tVTTt+EF~P@{C4L> zZQ2ufQ_J+Nvibw--|}Za^Z2j16Cok>t-U^f@2ihq%8Wt^Ff=2AW!4w#zX>_ddYlfP zKKnsdHtA|bw7YwI%97=y~U z_Gx~c^`dgURrRja{G*YT&gFlz-@MrEJoB@zfwrx?na^x}W8*t_P3M*>f1TqLy2MWM z+-c8*Q&Y|e96Ti~tt>xdzMj2ZfOy$q=5+aqMSZsV?=MuczyH_uGjXm7!i@@zo$d=( zW)?Js)@#eJd2uyfUb*o7D{V8bxNCNQPM)8=#r0d&o<5N^ZZm6&i@UE}yXNVh{(OS_ zs~0aPEqljTyY=uX2K>yJ{4+NP_!32#4M`E{y-=f;oC-#A`fx^Pfx zu5`;59^S~tMOGJER)1UPcQdpu>Yk3Z>e^V@#Q6uC)-WlDh%Rw^Ki!)vG*MnZ-$jA3 zB2qDg@BcrG+`L)gc{ArJ`MU*XDA*hpOKYhLe0ZFpD%^6u-g(ak77qwYDB;Md%iaCv zZh3&;9IM=*2WRG4I$v8Crzou#`P}M(_pIeFugu(B^zv7C%Ev=LpS54f&3`kcmYwhP zN8#mP+>h%7*WI?xDXxn-%=!I|wZhYTw-Uh3OC8^lj1s2)N@;*9S>E=8U&j7*I_RjxwIy&({9(*?k}4Ta))v+HOT!l z>4&S8`?>r#oGEE(9Ce|uUcLIAf45XBD*VnR)#@y^@9&@AIB#R{=#r1`@aF_L`7F`n5deiqZa;QCJ9YZcTl?N^!Qi%<@MsH?r)l>z*z0%)HKI7Tt|QJuB&&dey=r`Vmy1z`_i1tr>E&m`m-md zQKM~Zi}0Fl`*)r;Ieqp0#~WJ<7D=$K7Oa_+o144pRM_h64ZGd@Wmhd+?c29K#51tE zHX`uoHQCPO-mY*{-?f{zuMGLLXQh$7W;B=3q4!a&qB|l)GoQqr^x%)rS9xX@R2#D0 zEKBLDaM6ZU5vtbTQ@-8XQ4u-WKKh#InTaC)hdg*~pZyJ3AyxcDra**KMNQ3XT9wkl z)0ZeB|6hlB7pu14Dd_cVPJVy;@yudZqx5S&KYyREKUJf)_37$x z-RbA+9yQg^bH+zxU*6Gt8d_8vVZr#CGo4oZW zN?u;xT2lNrbo$A^udZ%=dv@-pht~I3JB4Rxb-lH&X`1@=4cAK*FK&&9-UH3er{zCw zV5xt|^=?;`^WVO0Azqos58MksnCt#(*P_LqAH1&DgmVWMrB*pDTV2j@t!2WoYtzh5 zhWazMZ0}j}cD;>y<~@~}rHv=gde44!rmy~Z*6Blj`j+>yU9>tvIX_-}Zki_Uw(!)X z2Zf6S9rUzY0+Wlmma85+ermZ``l-FgrBm`*TG^F&1m=b2C4~k};wsRJKnpkqGok7g z=1bnyzOPJ|-*~F8OJI*`x7dk=%Ex;QO8%OL--`aHyyx%#r`qv6f{g;XTk_6&RaSn^ z4hoHZyxv|;{lmSg4-=2G_NfZ&&#cx;&3N z`33Wv_pZy$p60v!yXW*x(NoQX*Uj4*^5CzDh;?v$YRf8P-iO<7`+QbAr5gM^^T&Ok zk4O5}JTRNGGcF^RD^%QT!dvCJ4n1uQ&z?T>ij1uExMyDxb$6>m>^$APiRq?-yLbP8 za$}9azL4u#O<$u;(?t)7HR~RHZK`)Wg1;A5>ol-KoE_~Adb@wAf>BVmqxjO|{ zdCmUa#{Y2NR?W_pY7?!5RvpjUw<^PwEA-;8Cl>D?3Uq`fYT4WSdwHLB`sdqfQL_1+ z%npUS%KO9fSMTbZ_mHR1G53<~#-jFTSEHV6l2)+#R`F=*0)_s{)p{L9(vuMlwg(&{ zqSI$|z06#>so4L1%j%NymwWl$inpPOtyZ`5Rb(_Hct2~Fl$3a_tYTKUID2;D z@%?Xk(^>C@UQAdj%NrDUS7Y_1WhdV(xiI(12k|Xy_8e02D9hVwd1dQc9edTIzFTW& zDJ~DGum4#c^20hLHmPORt82^ba_5Tw)Rf$mc&jFILg2pvR;}iq^z_)vU$1AMJAd{; zB3X=TSMc66g25wFlY+gA!j(YW?@*_3Ze1 z=X+(RdDGGa)^C`tsAExoHTe8Kg%cN_riH)qYs%ZX;m)hRbV=6Li5K3#cww+RN>S#* z*$07J_pj8+`INuiY+}H*wZ`{uM&uO5to76`;a$9XMM%D(=!8p`?>KY(j%IgajJGV` z;Xiff%*stRtoz&K`qeVuW%n)!+C3?9tJ)^GDlPrVt!06gO9Div_V-Sf zOJowL2VNgJnmM(sJzd+DZsXlU=p1TSyjQnByV zc}|S}?>@FOEh=hywsu$Mxl?J9+<%r}4t3+uG5o?xDMDLTlh~UO##K8uzJJGc{alpV%2^V3 zqrB7GyF%1^Bd)GnGweyb>$|S$Sw`JgRF|@T>Jz;D%GU4mZ3X_%OQ}juO=T3B=UtzUGdX2rQs;gv*$GIt*oATazNxtc4$<59E zv?_0Z&p!WocB|zMF5Ok=wofN+h4oXNxD27mej)uE#N+QN`P=-R^RRPn3ESuHY>q#L z8V(lDtGjZ4Y?y0w;{W=-!zPw0&>ZQ))A(|4lc?I3>idloT%IHw2L7&Gwfgek-LDg# zJvg)T&dMt1`nD&p#n(scuFt=(7`=UO=AJ+Na#mS&Hg^k7?)o>&?d{%1`>I+rH8dREEvy`3qt&v&P8?h2cpa%Rd(&V`Qz%A#hNZB00EBRpQ? z!9u%?ISU(9d$)divvP0H-D^u8w!PbETR6+6w(?!c-LLukQq=hTR9+h=u*3$e=vvTz zaHWe)>de*M0C9%SBr7yO+PYzPe z*b|>svnFNrbg^~qNk0}$m^yRi&sA<}EF1i;e|dJ!mf7#%=j#5PI|UQ({M>i@m#E2x zr6246o!9q0=a|0ysOr*LuNQ{QtIyoLXVGor`d`BG7caa!Sbfs!x77OLoX3A|ZIj(p z@{y_V_B5%_S{IJ|z4obec9!|?`SbsWeQ5l!j{lCHzz1Cp+=CiBI0!SE7?_nC#W~Qr~{q zW*;81#$I5aq}OJ<(u?h;e{NWWmz%yhzi#)dBIO9jEwk1qHvI5u{u35CQ}VBA_pNG? zHEcg$Xsuqwx^s2Y+NHZMS14`$R>F3FmcaEB*3!C4KeVCH(&P-0ogo zx@(!=hET&#?EC(_$_`q5J^tUL^qAr_+wYH7f4XgNlTjD(@yPMh$Gr8Yv3`DbVvXeG zr7^eVEvsVUs!~_Kxm)j1_ic6c)A#oO%NK8*68Q4_jgP_4n58D&iLdYdE%5r; zel68kPG?{3N_Cb~^8f7jaI>CF%C`46Qf(go=FV@i2%RuLdrqcY-Iw)gdmh|nY`5a< zxhwfZHSMp*fem|Y7c?I^e!TVXJNqkz?7{P!t}19e4FCJ=*|Z6>WM_%gc;D5Wxgu$5 ztU=AZZJBxNw2hv7Y%@P9HamIxzQ&KPT>Gueg*gMx!UuTXY~ zh;vKZ<)9*&8@(}SjzW>>;^2tVZR(Y=v3tznS)jze?Job9J)zPJ?ZVU(6 z`TiXGw)A|h*RyjopRR9qnR6n!;H#+g)9>{)5q4GAW&c%QEV{I&awS{x=JZyhEpORw zx39I2a<9=ibB5!OP}l!{L?^k;jbW#j{mmO{WdDb0odhf|o(W%Fj<>Es84wt{nzH*xDN=>+ zSojH9tb#clIzBFh% z8cezQ`cll|CEr=Lvm0#TUDx~C;;pEA{r#$@Vu_{|Z*1?sXsrH~zka{-m4o_y_dg5SpPa$_4n?}&c*4MlNU^lTU3~zDsw@swsG$M zJ6jIPXLQ~xG2NScrsA33`@i=N7JRsR)&A?DZ7#*PuT6QltDJ9RmGJV2yq-&!o7b-` zd$79OzV_{3_hSC9TU%|92PRssFYJ>uG>fac-jjT)P*(VQwe0HG*QYxj6RdZCeD(9i z)w9)>R0x%P*=Sy2`80EfxXru|$xf5GBu|8!1WlVUK|yntw}z=|rBA&hmwCO-{M+|F zid7aLm-~G1$%ZN~R_?I+070&#(4?fMn&FZ6q{Y2p(v;DQ z+U<4k@3(08m^DuSTW86!AG+dywODq(>v_?s3o1@LtSrA0=c8!Z`v83Q-SlaVZJd2XG#0 z_CM2kRa-f7rNzSMzwQXQU0v(C(eA3t``;|WzKkg>Jd1BH2>IQ*a?QfWUti4Mdp&C1 zteHD`8GYQ%zZ%SQckR==yWoJj+RP+Tr$=A9%eL>lp84*m=k|Tq6*er$|I(N|J(-86 zx6;9-F{1t7uD}It7Ym;4zJ7bX+Q%80P-Ib3elX&-8E;7IGA#wWKTWR;-mvzuD{7?^)^?WtuO4DsSHIsIaGJP5$;Am;d3)X}R>nq5m5`Ix=z|zx}11?az6+ z^Qj8W+}n-|uiyDYh~?)dg&!^4g>oy_U)*P3e$GcZLeYQffRjxO;a-n_eiPQ=%|`*{83we!ZNGD2lvZg9?hpQx#+{e64&i;L;Ot4vSuj({!Q+WNhINR;l)#ZmK zyFz#irW|}%f5T8ZF3IxO&l6`iXbSGDe(?Fd#~YT4l~olFMLWgro;si*e018YAD4u4 zmPcnVS+Un{M@3MK@}I)xU8T}S>8)$TEB8%kk&Vx}>%{0RmEkz=-Iwi&w`w9SQdj-& z-X6U-Lqpnk;i;Yf-Yf};3^$10CMIioR3J8O&2cu7EX9$v2R}O z_V8=8Dmy!k{oRdyZ*7B@X@9WadC#!s`_`p#k7d^X`WCh_|8wQ{hr3p6tcqb>eZVWU z;qw2?WR&JP6I-x*BNz7#t|J{%C>=p^XdV6PYyzAD#Y39-!{`brO z-O~TPsJG6+deNdw|C-yM{;&D!U3XDH{>Z!kmlvN~*z@9v$UKDtN0X+lTeh57CLU+_ zTzi`CNA9p2wl6Lo|NZXR4%gWCbIX3`=9@2Cn%i%8x9+NobVpm6xzn1NZs5L`1Cxru zKbA*VKQbmw3^tJJj(lh=6=Y~}*^nnarX#w7H)VFIdB&fNwz;j>U-GvJ-_(d`t=uKB zYJ+y@2Gf$QC+E4%UmgEp@5!RrOBWT?qgJKHZPK^g5Nm!&ed3F4?%O--pT^veWz3bW zZt2*dR=@4tA9LrR!gxR&qKo4*ehZ?3EVKIiMAFEaJ% zw|774&E6WTb*N7H<^wi4ar0k0mmlk5{A6&T$-ZT3#y_naYb0AQ#ZU4Je#!K&;m7y2 z@BcY?oz^S9!G5YK_v|WB ztLG-hZN9tuJ}{{3KiPUff60$jk+{R_^D1rEB(%Ex*l;M5wJuPn!Y2-C49P<{BRhY( zz3rzRFTc&wHqV-J;Kww=Z(uv zpCTVR|2sL4jraGb%3m#y8K+sF@|!9C>cQ!POw|1McPS?{i7ZJub*hlZoXfmC z+D^`Cs;srX>fMK(#rIlHJBBn)C^-1+TBq)2cb=s4&Ha6xH=_HL>W$NHu9&~u_XuCs z`s4^#jw=Ev^r}78Rdj=a--A+}=O)B>VrW z^u4{GJ{P%{7WUikJlPSNIqUxG-S_`w&A;GWA(_~I`2D{J?yoAhc;@YRr**xC>x0js zbFJ}LmVA(uI+dCG^wZK$k-kQ^Rw>RE*t#ZxHGj?Q{2j+as$bm{?@2I?jeU|kGuQrt zVDh7_Pq&)?+0CM4V`#6hzU1ZAUk~{o-N?ROc7px>fAd$J;=ckHBxozw+|_veb6X+xc>rfvLJ*;fv)PIyY}iT+d<|5ET{Wd~1Hj+G%Zh zb&kvuEfe47=}gt$^z6&SmJ72r4W0du@Gx@6*VV>1)XvN8otZ1B8PU5uAT?1rNB{2Z zC5lnHYALVxJZo6wD#cj(x+#77zU}H=ia7>)Vu>^CvfuLL6j}#flgNCXaY10u^tf8z zc@2w=&4-wu!p7;NIr4_8HcpM+#3*-kS7N=rLFQrz?`YjCZud zS1E|(a7h2ZHT{3N$D_+CXOC{kdTLZz`6X3MT$kExvb=jX=dJr>)t&)3!O zSUA_E&~v4|__bra6KB3Zcy6jYYzC(Bg?fYRA1{-cH8bDI+*l_U=5hAp$Nrjx6DRL3 zp2)(gJ$-ptu(TA{jb$en@SCzv+PceRc8TlMxxPVn!t`4^8`th+RCM06$-()WpLs~; zr}t;I4_ga?x5HIy_e?xUt{rT&B4zfl^R&y7gp$5G5Y?sHFVML z$j>?Ugnxprv2yIb4>$d1)Ua+lv(tK! zy4{2|ckaoreEiZl-Pg~(CGu8HU|#L{nWn)C5uqU=JMWq;Y~k2jY~1qbVAj>(avR>A z%3-T3*fw%i?rgfAUEFr|a*XKWw^z;P$yk^{he#$I_#xcj%<-u~sg;RmzO6!-ZtR|d zKkDXe#tRZeS#G{F5)IK|pLJ@9clpCbUsX4RJ2P_&UHW6)_fT(=bo@-~_YX-hcmR?VJ_A6nHd(aiV6MizgG>!zeXIx$Axly>}yZfzH;RDA+54IJU)EMmi zH%t4;tkrtlAAOomJpNj>Wbxu)+sSua7d^0>d);@}?|a?ra|*?No>#ncV{ZBzv$K*f zUnU)X_(xP$y&$lC>TCT5XVZ$vgLllVC9~qiqyFz&z22bd>bkwZ&-Arru3Y&~@9nSL z8;kaSJajsmMJ_+D>@@H7w!2GDthGChm{Ve4nIQM@U4E_as@2)5_V(pL6`_{%ZT6>H zWWLz>cf(tqyjNM%jdQo2Q=0c(=)k(h<*w!BMz5Z9P@yGM6| zww5!i{`auPpqwd%|C{UiL@dsU>CbsDz9uKB{E6nDllpbfS3Iq|wbUuiMA~Le&Zp8R zn|1{j7acrxwfN1Mol2j5%wCvX^Q(>#KHe_;DsRU(FRn1Z2pe_SG6xBh#+b9hUDs1g zxWf9D_sLF}_4WF*1nX-?U*gv`|DJK;`tc~O)Vxbm?BZ8F*wqpL?(*ed;;VGTYdFvO z_?YQOo5daX5MQM;y=8|(1g}bqhr#coQgLMy6E@Cz&HeM*v0Hz2jKb_M`8(`A8nXD) zi}g0oKK}Zm^>W$smmQ6IIyw_>8mIH@+`p3br`v`@dQCsJi|;?edrhJ1X6%oq+ZLZg zmVT>}@C{tQ+Q0tKx(BNiug{dMbw28>0)kPfLxV|VjZFXIjhZFhWlz>EDxb2zjyRix!*8;?2`-p@w9G3(^T*6$#EjOPE%PQ8_v`Fmh~Y%Ah$cv(yb#P^?F&{(^V2LLboaW z;9yld^i0O)=!sp|w!BVwW{@+(K{}r4hH1fVX=~qe+7-;PWiO95&kHCjy0oC|&g?*o zt6w_*1bu#XX5NQrjpU7K+YcO{H$`~XWbS#v9B1$Bte*ey!L*#ax+nLnJY$bYs0}P_ zt_n{3p7LeCQ@*#tlXY5x^-^nQDgNFE(tF-HKiJVNE>&jG(GsIltM;mhap9}}_Bdnx zIlFJJ`69D3`K8;=+LLUWKC>T%rJgzcsA{i^4qRqGC1~<=V2O$Y|G!L>-|@=S$}%}`eo~7pZ_na-~VfVR-FChE1+0{JH&qBdvkT)FS-S99OGRm#WxIE2o}Z_4X^+XgS38HE%Y1C<;O zt`gTNOL}!>!hr=zas ztgPQGG^+Y-@OO^fj``W^cirjvdh45c>iK)jYEO!uep)(d)-0npmKzjdWh?{dgaZ#a z0yeyQ`efSfRm(QJ&f0zapYzWLagN0YprCh#rAJf+Hc8M8<(xU*|Tx)pPtO9OELQVGPf0XukLEQ73y;JeoWD! zHQd&5eXS28Z3}9ahiISQxXGB;^wWYq$v^uz<>VEog=rtPJr#Pe<=AtnhZ)?}tg02v ze_!waAMovs^^5yk`F3A_d$ZhO-`~CeCp?d@3I(mLD0=qh!T&fVkuS;RcN6z?uUeJ; zB)a^*^3kQKwPM_cJl1^s_SL%2|1@!z!#cf)$jVk3o0^h{yM9+$zM8EOO`P(u?Ca*a zv!A?vmC363;iJ0w%tyVi+2xBee;3M4Oy_Bu|2g%&^7Lh!_f*TYWLt|P20J_w_HY`s zhrSoi$j#-g6m!*M^6^j=`@t!)_4>(6A@{|(qB+i+);#Fzmj1uxfxxP5BJxuU66}1-`DvQ%rj&T=@K<^R8m;(rV$SvBlv(8G0_wSJnOMcH-p~ z{aMM0>{(u==KCT}dU;57KRhF`^W;jk#$O9>8AZ;1J@3cuJ&#RP&bZ9^y6^9s>HiI9 zYp@roHWch!|M&6pr*?NgzMuI#Zqnl8{-?gb`?+ytx64aY)2;u?G&N6t+UZ{#^1#$o zWVT`LteP**0<&*gOSk>F*Z_IwKu>0J){=}uD z+)I~iiP`sMr$6Vl7bcTy{&w}M{j@4$|59ZOnuJN8syKiDrl+MpZ?3Oedu1NDHHfDb0tj*fG zZCh{lk0UO^t8`-0ITn1as0?J?+16)v($i<+lZy3IwwavB6n&)-5n0R?yDeu)A0y}4 z>yPjB$Y}bUozk*n;@{Zkw!}$Y@Z)H$0_!H`pcD( zMN78Dgr$i~9n_hjT@pC?^7)Son)m*0y8WT*4M&BI+|Jj`+fRR5+I>~}MWkizw>c#x zCBKepwOrASvWUO;e_pv)T;912YHco0y2a0$C$_ft$r#Ub|6teju)XuE`1+~kd*4nI z6kmPe|C>nTGkmT4f4r?tixrrV;L&C$@;mygNcLr!?&|OIMt|R23$T}P*^zLN>#5mK zt54-?WA_FLG*phKT$EbMzuxr~nEhyOxc-{SMeA0EeVTMB#rIvw z*C(FS_`bGSElD~$^H|o`q*oJ~QvMdro~quex$mz0{ObjW^n5q$wMyTWqie0XQp@L_ zLGi{pL5?}$OY02Zy)?_MTAsp}9#U~LG*abqkkOM#eLT>mCg}D(C4F&u^GEldUVbKdUbn?) z+R78tS1{fF^d@tYf$@3Emj8RauXmNsz4o>A^&IZfTJe?Y(UZ=JpMQ9BbNkfXRf6RP z`W=q1OV1^6We4uNt$mKeNzL%uq%};+0T1IUvzt9d?1PUgOU$q-%i8~v|6WS_SIL8` zUoP4+vuRH7?<}t~#&JuPF87$k&rUv75ntN*k?XXVj~UaI5>dX7|89hpMQKGzA6@;Z zN&VXQ{SBd(tw!p$(FSVw#1ojGy<3(gI%Rd-MXfv@SJUr5UCLkHx~lzTU;O{?9ePQ3 zXH9Jquj|pgxMA<7F0GlCivx;^H@T6kcEU^Vrv-kGo8*@;W8O?}ctoW3yorG_w%!e-roHKmJ#I(}iQ3pLd;| zv;4JQ$BWZvCrzHjGB50d*u5S9l(uU*YweD*-S%P8M95?tnEc}3&@}ba!Mw7AY!6$_ zN|-`r&l;&~J~-PfcPp0V;KJ`VKg5J%S8P&Yk_$5wTF&G)smnmXO<{&jUDkY^bEl^N zl-#K}&*-UEm`S#5#W9CD4GT(Jxy&vo@MUR4Eo)oom~(LNqh(f=-}i)0TGZt4oIcxR z)q{^t7X?MFAF1kF`mQp$eo0&P_}M9+LjN=cJTd7=_$s@0ng5jSD+PL9Pw(oVSzz8_ zE3m;p%|*IHM<7Lk!EsJw1KUNe=YGvMrat+Y+hJg>d;8A&7ax1SM%~o(y!_M2zj48o z1u+T*OEcvKu6xav?y+dznyANZRJ_!C{|)=O4Yx~*D2AY2#?Oyp}1LyrC z5nrW_aen0bym^t(v8EGj%?6$OK6G6TRXnpf&{;=uo1>+Z^^;vyd;d%kToaJL`kd@} z@$>s*Sa-a;7vNUVF0s|=sD+I-NBD=Z!&V7pJ~qz_nx>ZBKCTh*^`Ky&xIpBF-Sh80 z%wM9;-oI|==JZ+DJ-*+Kujk~9n`vLZ?Ztt=q0%4X{Jx1C%vPwb{G9E!#>?Md_{kQO zSnc6ugyt%O&bKWlmX_z@Sp;{b<; zfXRd0E#a&SzP`F?;@`@heWLrzwVS7VH9m)bwQ5?x*u3LYo@hvd$2`7#nJ>*X5dv!x zBnr1xJ&K7kI3DACrSa_L3;RzmKW8lGJo}uiS?b@vhW^E^2Uow`@XY(xvN&G>e}#z9 z)d4Kc<-#n&9pM6V6gF7AEr{LuU+7+&{*+a=!>RSs2iE6zM&%C>%UcZtrE?^Vz4C_cWK#;Tp+G>djij^EXt z2Nc>4u30{B=ZF7-0juUL5@oTF;`9k&@;LSHMEpFH)4Tu8(l)s=QGT}CtIf}L!5i92 z{S5Y%FO41h`V&^a|JEADI{ovmdZx9ubEV3z-c{$}-NjXAcWC{`#fg)BS8U>Wcry8H zRrJ#p5zQ=5o?oeck&wGmu;~G>$zt<8JYOHmw%+jw6FAt{WKdzfcjdzh^;fIEyxLQh z`?H0k`hLhI`v+T-&vHp~=*n~{{^1w1VdpRt=>HZXDy^@%M&MrD!Lprg?8~ZaIZql_ zu_{Hg-*XahZ~oopz_O7ov7(|sY>Uav0*4Aw+3^*@;PN^Gt#dcx*mQP zHOs1J`c%<12JHUt)0k%{vuL+uB;`mv`}pDH-GA?He|gWrlQ_M?E^p^TgS0tZE+4v_ z?XM|w#btbzy?be$T+Ys4I@4DDC=WP#;Q1A4zI$omD<{lct2jkqnSq{@ymsiCCQI9u z7tDEz3yeL&8q4RdciVHW)s0DbBEzAZ_3KVvoIPu{sqM-xQ<`>Q ziTIiaOPLH+Z_F~Sw8*VsnYHV-s)G_>Bo5t52(vI2 zKl~#(s;KRwj}wRVp%>HqXKHDi?ho3K*n7}&P1EZe*{{V}81t4@1t<18HLp3qz@QuD z>EamTo~?Z*M$nIA^E_99t!utZoLc*R!rQ}<+aqlk3wU){@xHZdyv^mY;Gh@-mPOMK*xLVE84?!e9a-7> z@j%;;KP&rd11<$QAN~9yRy7^I&d7mjqJP3A?l6xulY%b z{!EZRr73pv*ZS;71+#tR9%gzN*-JQUD6nX&XtgKGNR%D-?yybY)BoTuYa*x3dc8UM z?+$D8Dwbz(8*(HzJ?M0K_hFM$o&FZa@7v<~P5)Sb+VrgFkm;T)6XJE^-yb&SbCPdS zR>^DsE_!bLoM+Oft1=vIr1}zCWkOF(-|8TI?Dk#Bw|UL%Uv@TW9?|LF=WmdnzC+K& zVutaNOCn$XEv$>bW%nS^^}Uw5>^y%Krr6lKo6_$)P7aWJJ#(4o9s7?L`A;4CS*(8O z(+)PIAptF>$#EMFwO>xi4m;RtR>PF{XID(i!G(PSx=x|x-fK&y$%&%x^Kp};fGAGDghTT90OOJ{xK z+_x9cC;!Sx^w?w<)2z|HA+U${aLoUjqV*p?MXh0ydFObCC7&aT`>OKmgO9C!I~0oI zSf%gr&fWEo*);W2+EdBL52r0WbWQzwjCjn{>(B**kY$4oOezHjS=h>U?|7i7w7XgE zZmjN&L#i@->yBraGsWsXoMOwDukbx=;nIsrAwSdaEnXO}zTML&X_m^leGyit`aH^G zH(s&-?(7*;F!RXr=f79?9qIJFm-}ghX7P``5t})Wzx|rf@A2iWNDABSb86!9Ie!bj zZn!MhBKl@qyJ^CA2ML??$4)i1YFV%2JkRZNc;=&jHrGFxDE#_*+&JdMeWSB?x99ewYBGixZrGJx6Tk7-LP;8yu zY4|z^Xyux)gGFs`!qaC7&(wDCh<`}Qd9L>3V0X#}u~Mhd_lJ@uUsC;T`(MxE*wSYn z;jx`l{y*6}D}I&xu2p{hs}flArBn{{-94PU;fnI&drxPv)J$*NB)d-6eD{+?b%!Zu zPjj>|yB+g6e4c4x!-s@j6Iz~}*xIV{CX#dCT!F*=W*|Bs^WTL_wqzTrT9C zoBgkpM z5d{-yrl--<7gXB&w|}{!^1{DVuk~&&ezL}3_d>@NyC5Tr zZ7T#;Z&uL+GFfrbKv`nDvlW?gz;^?uqtTMT(h}a9ad3KgJo$cMc`JC#kn9fMU3pkN;^0%(oj2xqUT?o^ zC_U)_1IwI8n{VI$$~fyYe3As*tD3;T$xy$mfJx*@fe*VXVviha?TYY= zS$WSTa;m-es*>;>8JvHM&&fX*=$*CguDa&x`+6I91t;_z?{*4ayZOzE6RRGG9p0~( zz3Q{M-TH|Qv6mL_5_M+!8&F~7#d2l7zq#Os_a;>ly+Uba-muAPNcbvDj@!`H&o8<> z=y6EK0^ZpT())kx2sn3;ImWhlJl{zbnG7pcFBD%2+;jeniJ7VUrS-pBRL;V#d%o~#%3`u!tzaZ z%nW8dQ@#9e_g0m-=dByAM&zcv%Ct;tG5zt*^4fxXvyZ*^wf?j={`bXOX|+4jpS_5- zzxVrY-`55HYeZjn1iwF`=ew%^=VCve1sRsl+P5bB4utS9GDh6CM1X^ znz;2Yu=}|5+~dya=g#eW6w*}{8Mr~}UNh6~1m?$`d4}^?PVRZx{p@OJ{JKL;r}VTU zA|F0*x*mTgLfJk0R7(9-OHt8~ke8+&;=HrYzj``pv6hy@vk#Hm=dG?u(Nm~-V9(*W z&$vTKtHPnvwyb4vh6}G zQa$be6gwmsmxWJh>`3~(&6ml2{(+SBzV{vLAIMeQFkJAtp);7}^Vaqqtsmdo-j_Of z(){MV%9}qe`}Qe5tbVe(`FWCyzU`v-4PVy^FMe`Sje+_6(d%rB51qO5MTu>Z$S?Er z=a%+e>%CmPLih#0Z355zs53ED>M5>j9Wibh#!BJul`np*@xNA{J1>5HQb%PX4@YO_ zy_Aza9+R4;@bI`G58r`HRzY=xkD)D&3ZJvqElfD5Wo+lU%G$jyeY>NN`l{6`$E$je zw-pNtD6>6Ie3~Qt_W4K2pUS&fDmYA6X-s|PJK<{O<|T`FpRV9N$joNV;uPZ;p>Txl zeqbw?@~i{QZtop`9I&;OI_d1H#33-DRw3%a9d&_)X6qED{IIF1`5K@YAihZS)lUoFr+L;~;(L-=9>AtJBxBxX=I7#>5e+(f@jH=DQiiKU^LEHS&kv-}m*>9b@;N zrT-mSzVxnNYtnMgoGWVq|CEPk{v;k_asAT0^Ox7xjMbTjM@&jM+}sRYZ1-&8xffaKoU!uq9tblxiLtBPZpef_mzd`I)?O4|x1 zj@walY;!;GModO6V!&He7tLt+nP}hj++HczKjfg+jiNo82VM8bu{6f`XL+nW(sE%= znBvq3NO_7u?q$)4(ClClcVzXves@y)=ed{d8O;~!8yar>@3sf6FotR7V-i^-!d7&6 zM%E|r!$Y;SojvW89R_;0j|3&Qnd5?ND~siLZGxpT&6$<8~B+ALo7 ztj0pd&hHLY>+1F8Zx%2>TDSopb!Qaf@NV#O(w{Zu$%T}MlDmQvW>xWCWOGm0)txYP zlF+Hrg1sBXP@5#+;GJ+FMb+Wps_!S0)vebb7ye{777)9041OE_nKK-+h?p7qsojQGvYaJ(@C6?v>^gndhP{ zY?qukmuStNsVA55@@1x?QdmazG*D{|5;Vx9g9am4n4^!7(4I+irig@SZ8A}f-(y&) z_;m8#gwR(eoxGpcb@ld6)37J> zC+EULB73eRCI7rO>&$!Jb#qxj)gm~}!Wnuk456&zRh*ohlV%CcYN*}Tw$HcIzbw=6 zXV-?}N2j)|ROEJlx2mV-!iG~5y09k?&>A0&h*n19RIfA-J~b7w{T9h>M^;A|-^}&B zW#W19Pv}9myf5pxmK{RchKv;53k4Q@5^4*pso9f~n%Z`!)nl_+Zk5N+6s;LEXS|%1 zVQXj@cqu4YU6^a#R4g9wNDu+da5))MX;k6~ zriZoDW*b}1Y&np?h&A?D1s5b-<+oEl^yFzv3)`ZTTD+a7zx(OsFFJCg;^qv?+omc; z)n3yoZ06Nve8QU688~_R7+6;`T2zL%oIJ_*Ri-Pnf6-UT%_`bww?p0HBVHcSSnWb4X?zn7==$z;sI_GqO z;B%XK6(`T0op<8&^IPypL}nbD!N9uOk?H)!KR%tE3lD`fwVjNeY8q}7dt{Ddne4@@ zHd?1*=UKWJ#U7I1D4pO~Cs)qe^FsZ^N#wD7XhL=PBDf&I^hA1FP1w)MowJr}+AU#q zS*;y<`YVtqCJ|5o5N%#&F7ap6D`Wr&Wbgiin}O0+jEQctHDXB z^3qaI&&-)6rKRm__P7VW%hH)Gjs>%$f;UES$^w!0#O!*}Q8TWFWY=H_iz-gHJ- zSpD@S?$ju!w%31rBogB0si^z+%@vGQ+%N%ay1c>}uwfU&k-K;A28G3GzJ2?4-ChNk z4=&kTWwOHZ*KmB_Hf!n()zep3bN$?L=ZsoJxwp;xu=%N2!%oE@hDl^ioAI6?oKB9p<=mja`Z zL?V;O8aIv%XXnKsq1V6Mj$YixE|7$ETpA`e6eEl4muv_()UB0OAw>o2Jj0ozw?jy$*Wc&KM} zbIF|daw|?wcz=AA$JFP(QzbiRx~=Kr-~4(0=EqZ>q?|l=Zqkp6?=@lPb|IDwq4>XX zqMF0OtRBw=>4l&XYa~7^U3&JS@QDb z$Ihk+_IozjcnXsH^rYhNu{ zd$v~n;J>!^4%UmSJmY1b?>^(#9BXTPN!OO?yk>>>(c?!t-4A~cdbH=4mqF^^uP@8= z?d<%FjEz)ubwiVqlJ2b9(1R^)HLx7(VPIWt=*0VQ)xL#^7v#c|4RzoAn?7-3-lvej z6;j-fWSX(*OE6&3h~RCz#Bt4WMM84&WD_$}@AB^_p0AP0SS7G5C}@(Zu4(9`NkZ(a z&S7svs2DtB(TM1^EV|#o@jW{~fBLg$Vwst_Q_r2dcw1M%`k$)0s%KHxzAqiwIP$HF z79&@f;HQ*byLS1^TWuz~(dw3I`qZkVuNnJRJ)Cje&k+O=!f(%tUCYskfrSrrTf^t5`StgAi>m}I zw=nfMu*MC&p8|?Qfr%^{5w1^?A1*;IMG@?TPeKVsi%8CX{ja|Z~> zPux6&PuKtdv;A3U zV5F&5@`hmS8amvVMAj_&xU%pZj(BPW#nS=)>E1Ysx(rY}NzIpf?t?v^gh4eg=bwU| zIO=w=1CG61dGwgTUyFs$H(+&!pr3->q36%%-;=g3KmCunJ@x1&)uM~HLW9EN_1EXz zQ)};+o4nao)u{GX2xu1fPQ~A=ljco(mH*tP^25X9OLi`Gz4volw2HQ|GoPHDR=?f9 zEh1B=c-7_g{dp{Ir|jw3`A==`+_|6bbgw^k@v-{TD=#-snlM43IQ{$-(bLmU9Q!K% z^L4BB%a<=FipSs70&SfYR`;J>d3LVx=`)6khKe!9nc3NsfB*loVrTuzzReX6Yp(CA zuXrH%^2Lh@Q%_GnwaZjH_Vt2-_y3wVC0~!Ttlj3ZDmyFn*%zlsgZ#dj`nRH!roB4% z>g!wUl<)VLi~bzZ?Ck8Fc+)uj#Hy*MpM3JxFO*IHd@Z-g=k>b%6>D{3_XKFIUiH+! z-)7zU=Q~u?)las+ugSkrx}$7G>+>%=-`y*BI5)>ueffD2&+_u^XJ**>>P2n#TDPah zc}JQK*4)-n#1yC;A!}V0WVZK1*OqPDBpsh`|Nhr=*6ip%Ke9tQ8Vx?L;!^+rVgG-> zW#WFH?{8Mu&#&{%di^T(aa;FNkE0WIzyG;$j(z>Td+(IP=Gum<*#CREe(8!GSL)@} zpLcb!{>`cV%lq?(`@1PUU$)qNf9qQ7y!g)#_5DUkQ+1m=iXUB(R8IP;UQt?7GHdIi zyF8-P4{?U+@7v=V6%}22&vRWCNZ&>&*Xq#XaTb zB-ekx1-{gMoc%lHwzT!%R0~Z#&B?mEp2hC|{&JVSLT4vqBLDaAvNk&F^KLF%6f?_5 z_r&!4Kd=9rt||0i<=VPYq}XbPeV6y?CkyTE1&!FZ=&oNe#k~C8L}&NDlj`=r4jwEy zZiO{f2D&L^v1p$zeZ9>*^>g;^RIjjQcZwcw-Bj~3Njd3lp#PlZ=6f@2s{g(H{a@4m z&%f*^H*do6f4_QER$nNdS;eCpy=%kyS`P33pXR<_{XJ;;5*78+yYCmS z)`{HW5Owu4XPmpg%~sE{RRy2l?*8xm?%%a=Rl9xq$3Uwjzm>nAIB8SSW&J&q%wjhA z8C_ld`pe8>tMlScE=%l$B^tRa%KyIpUY}ue_=4=Q{Uv{`W}0n1P@!l0`A+w%ogqu+ zrOo_z@xrrr|9>khuWCH|``%~2$hC2yg&Q}zRWy72m{k>*nzH0{`@4$%{c}IF$i;mB z^W1;Q!i|A?aoeNJRvZ`Ik$C6etxncwCq$CuEkMG3hAp#nnRI`{7l4w8+tULB@my6D9Ey7K*P+-55jw)n2w{j2D@ z=--bE-LEoduljR3e4oln&6A3yb)SE;_e4xxcP}{p|8jkgh0ZyR1zR%?+Wc(nGE#lT z`Q=FP`OJ=oXKQ~oNTeKHWqrSV_MNKBrT>0&Xzuy6>Fcr2oDbU;rwY6mIL5&}kNH}0 zXP4(vtrfnrXT6_)h+9A3EJ@T!e*a(n_%Q#KHvjjYHeWa0iFfy(TjuZ05+~(fG)+zS z|9F49I_S`*7Qed3tLybYo46EPl(l}!%*mRxdfkm1&wnPY`@r_QeSPiiiYVKkXFiLp zX=9#|i>N-~y-kHfoG!7?-iwIN*!N?n|2M(aI>{U%m9x6Jw!Lhfo?CdrP)*Iv?t8iX zYvr~ZUMI}AW}mMs{@J(v&K37Hn@T|^tWA&EaxCWG&yUNOtXz5X-lT8e_(0pM&zcrx zSsvAj=9G*4`*hBxuWi*X8VaA>4~pr|d2ZDn@pV=cL+V=R&!x5>E+jwuWc$7L-3qJi2@IASX7wcx>+%6Ja0cte46I5fv>x}dvf;rqVE?D{hhsTw-mc$ zQrYr?pf#L#CZ=<kpSn*rQdZg+_;g#a%kd<>9wHNGV&M#nC-&XxPqHghC{X}`k;b} z;>VrQL0{I~v&yTzsq%WKdi!#Q+{WGW zwniE+zkRu`|9J_o!IO1POkWGaLPL}D6o2lVy>w-Q=$y;kUmvu7ThzwAEAreFowMto z?t7gSTH5Qmq(4?{quvwoVkwtx|K?5JjC@=kJoXz{7BwGe5ndx;l(AN^Cn5FyZdvaV zbDIc1zl=Jy^uJrKgiKz&a_`>Q;>e$qRzKeN*~a|1_`DZ6=3>u3d}^xPE9bjvp5Y3` zx4SmJe&ApCaW~`blG1Yih~tq9_bqgMSO4MsIi>$UFR5}nvuLX$^GwsEkcHe~gQ)Xzy|N66h z&i0t|bF<6V3WUs!;HU(}?*SHNgNH1uPkF_kh)8qW#hEYt>a$bc>c3J#;(G3r->zS^>sH0T z2UWkmWNwQP@XA=bY?)usq;|y!%TFbx{1+#4Ci}nlT~_z+Pvy!B7xunvZTxw2C#!t= zmvsw6i(N#YJn!UP%d^h>PWGE)91k-MzRmyt*;_emZQM>D(B_|xbb+SZ3BOWhu{EU{ zUnmHadS3s1xNA?Sb@_YK&}F{dPiDMY@B6`4`;JN0xuwbKeysPu#lOGtRGOXDScdaX zaWQj~Xv_MC5=UfJCbTQAxp=m!s%pven*Q5s?RNjqtuCIPJ@Df!y?K^m9 z)9xQTufAUYW>WVxj`m$S8S8(xzpq)Zu(L8bd2-F?-S!iL z9di#&*VP&wjDiJXU@E%NrZyS2?uK2@+VOaLYmC_nrH-SI(Ti#`%u@ z^WM+3+fUZ=+bId${P%NqIrpU5&!0a(b#wF4OIPmX%*wg9D>iIxMB2HBlHXSL-&eK& zeRXfpn%%1ZK5yTr9?bp8R6VRw!DZ8m9Yw>6agG%3~dw{2|<7b&%^})%_o@ra!s&TYi#x z*}I90d)0Z5?${BrGvjTR=xRHKlP5jJeZCzozo(ZSraL+Q{_h6Q19_h#9ZjMP^80H3 zD9gVP=6WF`&~(YZ?xFFg6UqLk9{by^-pyIIYDHMiDv?z`ijTj2e{J9N)8AxwFFChy z^}@~kEnjN?U6!9be^o`xh5b@r&m6k(x#aqu?|Yxm-IQ}u>0n;f-t^>fqWXTYNq=DTWAsuDgCa zUsiPEDZeL+%kL^~JXLTy`*yEK#|O{;s&$H-zuE8qmpgg>^hEXfwT=%yVjp&zQNfaA zqJH6LM#QyRew(B{Sw@#GKdrB;*gn(f5VQXr8|Aq5?$1`ZPYmBX&+YJpAAhdQES@ys z!PJ|^%e|8xJ+SRoSmp4cvHilHotssRm6JV!-@JG+LFsGRs`cwZ+iy69Ht`?7WwPeu zo103Rd6`phZch7AobvU$_@R#vu7(7Ls{Y)$(`xyM%De1u$^>a4-cz{5e2Tb4hbzt z5EbLi$5J4IGgc2fBUjjC$GOQ^^V|dm&K6aNgIYRL_mGPsWVQr9Q{d#1y$d&b&YC@2 z)yypH)90e&&7#Kd8co6ixO-yN7#1Q=N)gd`aG8-tPUL1uFZEJzSd zIB1Nm!eJCrXyj0EIH<)W$Fv+iu7bu804X@ogkxsMfl1Jzp(&KbhQ+TD+kjF7i-!V8 zK?Cb~T*0o?z`(kiqk>}&6Sj=Xz&XJIq=12Y9@Ylq1O`qQ2GG#g2LTJTG_ z6tlrT{=g{I!2lX*dZ1Xqg|(BW;=shnB(jD{r@{?)G-yP)9&mmjg3FUkEE*B45g%|2 zI(jHDaRhAWYG^;8i7WB3a0G1N+VBARd_r)dgsOL70mbuZLf{G$98Cxbq63@|9{gv{ YWK{FMdYCPPfq{X+)78&qol`;+0P&eNNB{r; literal 0 HcmV?d00001 diff --git a/akka-docs/src/main/paradox/typed/images/delivery-sharding-2.png b/akka-docs/src/main/paradox/typed/images/delivery-sharding-2.png new file mode 100644 index 0000000000000000000000000000000000000000..b64540a519101bb96e352c2910f62741c9200f97 GIT binary patch literal 159012 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ξ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 XM{}5$U--qqz`)??>gTe~DWM4f;*ygu literal 0 HcmV?d00001 diff --git a/akka-docs/src/main/paradox/typed/images/delivery-sharding-3.png b/akka-docs/src/main/paradox/typed/images/delivery-sharding-3.png new file mode 100644 index 0000000000000000000000000000000000000000..c50bf66d41795b21061ea8c470feff22ef313198 GIT binary patch literal 187259 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 z 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

i2>hJTm)vpVgJGA`2G?12+FwOH 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

)1d<&bZKT=>I%Og46$6C6SWe(bNe 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 z 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 z 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 L)z4*}Q$iB}f+NAG 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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

=&{2gICMH?p3b39P)bCnlE2grfGF>FSL&6@!~7~ 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 z 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 + */ + +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 41ea808109..ad3473919e 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 fa274078ee..fd5890c64a 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.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.testkit.typed.scaladsl.ScalaTestWithActorTestKit +import akka.actor.testkit.typed.scaladsl.TestProbe +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 0000000000..b3e620b0a2 --- /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 0000000000..0e019dcc35 --- /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 0000000000..82d88ddf6d --- /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 e631acb4ce..e8e01c7485 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

iajwer6Bjuhn%pPGczjD1LsT{)@WPU0iLe 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