From 5c0e4672fdaaa3426838b8e836ad61f245d47dcc Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Fri, 5 Oct 2012 13:53:35 +0200 Subject: [PATCH 001/210] Don't decode path in RelativeActorPath, see #2603 --- .../actor/LocalActorRefProviderSpec.scala | 15 ++++++++++ .../akka/actor/RelativeActorPathSpec.scala | 29 +++++++++++++++++++ .../src/main/scala/akka/actor/Address.scala | 6 ++-- 3 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 akka-actor-tests/src/test/scala/akka/actor/RelativeActorPathSpec.scala diff --git a/akka-actor-tests/src/test/scala/akka/actor/LocalActorRefProviderSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/LocalActorRefProviderSpec.scala index a71a9a09f8..db2ac0285e 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/LocalActorRefProviderSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/LocalActorRefProviderSpec.scala @@ -39,6 +39,21 @@ class LocalActorRefProviderSpec extends AkkaSpec(LocalActorRefProviderSpec.confi a must be === b } + "find child actor with URL encoded name using actorFor" in { + val childName = "akka%3A%2F%2FClusterSystem%40127.0.0.1%3A2552" + val a = system.actorOf(Props(new Actor { + val child = context.actorOf(Props.empty, name = childName) + assert(childName == child.path.name) + def receive = { + case "lookup" ⇒ sender ! context.actorFor(childName) + } + })) + a.tell("lookup", testActor) + val b = expectMsgType[ActorRef] + b.isTerminated must be(false) + b.path.name must be(childName) + } + } "An ActorRefFactory" must { diff --git a/akka-actor-tests/src/test/scala/akka/actor/RelativeActorPathSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/RelativeActorPathSpec.scala new file mode 100644 index 0000000000..179f4aa92c --- /dev/null +++ b/akka-actor-tests/src/test/scala/akka/actor/RelativeActorPathSpec.scala @@ -0,0 +1,29 @@ +/** + * Copyright (C) 2009-2012 Typesafe Inc. + */ +package akka.actor + +import org.scalatest.WordSpec +import org.scalatest.matchers.MustMatchers +import java.net.URLEncoder + +class RelativeActorPathSpec extends WordSpec with MustMatchers { + + def elements(path: String): Seq[String] = path match { + case RelativeActorPath(elem) ⇒ elem.toSeq + case _ ⇒ Nil + } + + "RelativeActorPath" must { + "match single name" in { + elements("foo") must be(Seq("foo")) + } + "match path separated names" in { + elements("foo/bar/baz") must be(Seq("foo", "bar", "baz")) + } + "match url encoded name" in { + val name = URLEncoder.encode("akka://ClusterSystem@127.0.0.1:2552", "UTF-8") + elements(name) must be(Seq(name)) + } + } +} diff --git a/akka-actor/src/main/scala/akka/actor/Address.scala b/akka-actor/src/main/scala/akka/actor/Address.scala index 438c479176..7c87d696a4 100644 --- a/akka-actor/src/main/scala/akka/actor/Address.scala +++ b/akka-actor/src/main/scala/akka/actor/Address.scala @@ -75,7 +75,7 @@ object RelativeActorPath extends PathUtils { try { val uri = new URI(addr) if (uri.isAbsolute) None - else Some(split(uri.getPath)) + else Some(split(uri.getRawPath)) } catch { case _: URISyntaxException ⇒ None } @@ -122,10 +122,10 @@ object ActorPathExtractor extends PathUtils { def unapply(addr: String): Option[(Address, Iterable[String])] = try { val uri = new URI(addr) - if (uri.getPath == null) None + if (uri.getRawPath == null) None else AddressFromURIString.unapply(uri) match { case None ⇒ None - case Some(addr) ⇒ Some((addr, split(uri.getPath).drop(1))) + case Some(addr) ⇒ Some((addr, split(uri.getRawPath).drop(1))) } } catch { case _: URISyntaxException ⇒ None From 495ace37f4c9a9348a738d4c7a7261c102930628 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Fri, 5 Oct 2012 14:52:18 +0200 Subject: [PATCH 002/210] Avoid TestConductorTransport unless needed, see #2586 * Due to the shutdown issues the TestConductorTransport is by default not active, but it's easy to activate it and exception will be thrown if trying to use the featues that require it, i.e blackhole, passThrow and throttle * Documented --- .../scala/akka/cluster/SplitBrainSpec.scala | 2 ++ .../UnreachableNodeRejoinsClusterSpec.scala | 2 ++ akka-docs/rst/dev/multi-node-testing.rst | 3 +++ .../akka/remote/testconductor/Conductor.scala | 18 ++++++++++++++++++ .../akka/remote/testkit/MultiNodeSpec.scala | 16 ++++++++++++++-- .../testconductor/TestConductorSpec.scala | 2 ++ 6 files changed, 41 insertions(+), 2 deletions(-) diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/SplitBrainSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/SplitBrainSpec.scala index 0c98b178a3..57223465fe 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/SplitBrainSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/SplitBrainSpec.scala @@ -27,6 +27,8 @@ case class SplitBrainMultiNodeConfig(failureDetectorPuppet: Boolean) extends Mul failure-detector.threshold = 4 }""")). withFallback(MultiNodeClusterSpec.clusterConfig(failureDetectorPuppet))) + + testTransport(on = true) } class SplitBrainWithFailureDetectorPuppetMultiJvmNode1 extends SplitBrainSpec(failureDetectorPuppet = true) diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/UnreachableNodeRejoinsClusterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/UnreachableNodeRejoinsClusterSpec.scala index c95462c7d4..999f318679 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/UnreachableNodeRejoinsClusterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/UnreachableNodeRejoinsClusterSpec.scala @@ -21,6 +21,8 @@ case class UnreachableNodeRejoinsClusterMultiNodeConfig(failureDetectorPuppet: B val fourth = role("fourth") commonConfig(debugConfig(on = false).withFallback(MultiNodeClusterSpec.clusterConfig)) + + testTransport(on = true) } class UnreachableNodeRejoinsClusterWithFailureDetectorPuppetMultiJvmNode1 extends UnreachableNodeRejoinsClusterSpec(failureDetectorPuppet = true) diff --git a/akka-docs/rst/dev/multi-node-testing.rst b/akka-docs/rst/dev/multi-node-testing.rst index eca5139a9a..b098317054 100644 --- a/akka-docs/rst/dev/multi-node-testing.rst +++ b/akka-docs/rst/dev/multi-node-testing.rst @@ -207,6 +207,9 @@ surprising ways. * Don't issue a shutdown of the first node. The first node is the controller and if it shuts down your test will break. + * To be able to use ``blackhole``, ``passThrough``, and ``throttle`` you must activate the ``TestConductorTranport`` + by specifying ``testTransport(on = true)`` in your MultiNodeConfig. + * Throttling, shutdown and other failure injections can only be done from the first node, which again is the controller. * Don't ask for the address of a node using ``node(address)`` after the node has been shut down. Grab the address before diff --git a/akka-remote-tests/src/main/scala/akka/remote/testconductor/Conductor.scala b/akka-remote-tests/src/main/scala/akka/remote/testconductor/Conductor.scala index 7aaa6d72b3..fca4d62763 100644 --- a/akka-remote-tests/src/main/scala/akka/remote/testconductor/Conductor.scala +++ b/akka-remote-tests/src/main/scala/akka/remote/testconductor/Conductor.scala @@ -24,6 +24,7 @@ import akka.util.{ Timeout } import scala.concurrent.util.{ Deadline, Duration } import scala.reflect.classTag import scala.concurrent.util.FiniteDuration +import akka.ConfigurationException sealed trait Direction { def includes(other: Direction): Boolean @@ -102,6 +103,9 @@ trait Conductor { this: TestConductorExt ⇒ } /** + * To use this feature you must activate the TestConductorTranport by + * specifying `testTransport(on = true)` in your MultiNodeConfig. + * * Make the remoting pipeline on the node throttle data sent to or received * from the given remote peer. Throttling works by delaying packet submission * within the netty pipeline until the packet would have been completely sent @@ -121,10 +125,14 @@ trait Conductor { this: TestConductorExt ⇒ */ def throttle(node: RoleName, target: RoleName, direction: Direction, rateMBit: Double): Future[Done] = { import Settings.QueryTimeout + requireTestConductorTranport() controller ? Throttle(node, target, direction, rateMBit.toFloat) mapTo classTag[Done] } /** + * To use this feature you must activate the TestConductorTranport by + * specifying `testTransport(on = true)` in your MultiNodeConfig. + * * Switch the Netty pipeline of the remote support into blackhole mode for * sending and/or receiving: it will just drop all messages right before * submitting them to the Socket or right after receiving them from the @@ -136,10 +144,19 @@ trait Conductor { this: TestConductorExt ⇒ */ def blackhole(node: RoleName, target: RoleName, direction: Direction): Future[Done] = { import Settings.QueryTimeout + requireTestConductorTranport() controller ? Throttle(node, target, direction, 0f) mapTo classTag[Done] } + private def requireTestConductorTranport(): Unit = + if (!transport.isInstanceOf[TestConductorTransport]) + throw new ConfigurationException("To use this feature you must activate the TestConductorTranport by " + + "specifying `testTransport(on = true)` in your MultiNodeConfig.") + /** + * To use this feature you must activate the TestConductorTranport by + * specifying `testTransport(on = true)` in your MultiNodeConfig. + * * Switch the Netty pipeline of the remote support into pass through mode for * sending and/or receiving. * @@ -149,6 +166,7 @@ trait Conductor { this: TestConductorExt ⇒ */ def passThrough(node: RoleName, target: RoleName, direction: Direction): Future[Done] = { import Settings.QueryTimeout + requireTestConductorTranport() controller ? Throttle(node, target, direction, -1f) mapTo classTag[Done] } diff --git a/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala b/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala index a842a547a1..5081cde959 100644 --- a/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala +++ b/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala @@ -19,6 +19,7 @@ import scala.concurrent.util.Duration import scala.concurrent.util.duration._ import java.util.concurrent.TimeoutException import akka.remote.testconductor.RoleName +import akka.remote.testconductor.TestConductorTransport import akka.actor.RootActorPath import akka.event.{ Logging, LoggingAdapter } @@ -32,6 +33,7 @@ abstract class MultiNodeConfig { private var _roles = Vector[RoleName]() private var _deployments = Map[RoleName, Seq[String]]() private var _allDeploy = Vector[String]() + private var _testTransport = false /** * Register a common base config for all test participants, if so desired. @@ -81,13 +83,24 @@ abstract class MultiNodeConfig { def deployOnAll(deployment: String): Unit = _allDeploy :+= deployment + /** + * To be able to use `blackhole`, `passThrough`, and `throttle` you must + * activate the TestConductorTranport by specifying + * `testTransport(on = true)` in your MultiNodeConfig. + */ + def testTransport(on: Boolean): Unit = _testTransport = on + private[testkit] lazy val myself: RoleName = { require(_roles.size > MultiNodeSpec.selfIndex, "not enough roles declared for this test") _roles(MultiNodeSpec.selfIndex) } private[testkit] def config: Config = { - val configs = (_nodeConf get myself).toList ::: _commonConf.toList ::: MultiNodeSpec.nodeConfig :: MultiNodeSpec.baseConfig :: Nil + val transportConfig = + if (_testTransport) ConfigFactory.parseString("akka.remote.transport=" + classOf[TestConductorTransport].getName) + else ConfigFactory.empty + + val configs = (_nodeConf get myself).toList ::: _commonConf.toList ::: transportConfig :: MultiNodeSpec.nodeConfig :: MultiNodeSpec.baseConfig :: Nil configs reduce (_ withFallback _) } @@ -175,7 +188,6 @@ object MultiNodeSpec { private[testkit] val nodeConfig = mapToConfig(Map( "akka.actor.provider" -> "akka.remote.RemoteActorRefProvider", - "akka.remote.transport" -> "akka.remote.testconductor.TestConductorTransport", "akka.remote.netty.hostname" -> selfName, "akka.remote.netty.port" -> selfPort)) diff --git a/akka-remote-tests/src/multi-jvm/scala/akka/remote/testconductor/TestConductorSpec.scala b/akka-remote-tests/src/multi-jvm/scala/akka/remote/testconductor/TestConductorSpec.scala index 3a49490e1a..97f5827b1b 100644 --- a/akka-remote-tests/src/multi-jvm/scala/akka/remote/testconductor/TestConductorSpec.scala +++ b/akka-remote-tests/src/multi-jvm/scala/akka/remote/testconductor/TestConductorSpec.scala @@ -23,6 +23,8 @@ object TestConductorMultiJvmSpec extends MultiNodeConfig { val master = role("master") val slave = role("slave") + + testTransport(on = true) } class TestConductorMultiJvmNode1 extends TestConductorSpec From 99ad1e0eeb545ab87f3e2bc876b169bd5e4da9f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Antonsson?= Date: Fri, 5 Oct 2012 15:15:17 +0200 Subject: [PATCH 003/210] Document how to schedule periodic messages from an actor to itself. #2513 --- .../docs/pattern/SchedulerPatternTest.scala | 9 + .../pattern/SchedulerPatternTestBase.java | 189 ++++++++++++++++++ akka-docs/rst/java/howto.rst | 29 ++- .../docs/pattern/SchedulerPatternSpec.scala | 98 +++++++++ akka-docs/rst/scala/howto.rst | 29 ++- 5 files changed, 352 insertions(+), 2 deletions(-) create mode 100644 akka-docs/rst/java/code/docs/pattern/SchedulerPatternTest.scala create mode 100644 akka-docs/rst/java/code/docs/pattern/SchedulerPatternTestBase.java create mode 100644 akka-docs/rst/scala/code/docs/pattern/SchedulerPatternSpec.scala diff --git a/akka-docs/rst/java/code/docs/pattern/SchedulerPatternTest.scala b/akka-docs/rst/java/code/docs/pattern/SchedulerPatternTest.scala new file mode 100644 index 0000000000..d450bbc090 --- /dev/null +++ b/akka-docs/rst/java/code/docs/pattern/SchedulerPatternTest.scala @@ -0,0 +1,9 @@ +/** + * Copyright (C) 2009-2012 Typesafe Inc. + */ + +package docs.pattern + +import org.scalatest.junit.JUnitSuite + +class SchedulerPatternTest extends SchedulerPatternTestBase with JUnitSuite diff --git a/akka-docs/rst/java/code/docs/pattern/SchedulerPatternTestBase.java b/akka-docs/rst/java/code/docs/pattern/SchedulerPatternTestBase.java new file mode 100644 index 0000000000..b2543bfb19 --- /dev/null +++ b/akka-docs/rst/java/code/docs/pattern/SchedulerPatternTestBase.java @@ -0,0 +1,189 @@ +/** + * Copyright (C) 2009-2012 Typesafe Inc. + */ + +package docs.pattern; + +import akka.actor.*; +import akka.testkit.*; +import akka.testkit.TestEvent.Mute; +import akka.testkit.TestEvent.UnMute; +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; +import scala.concurrent.util.Duration; +import scala.concurrent.util.FiniteDuration; +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +public class SchedulerPatternTestBase { + + ActorSystem system; + + @Before + public void setUp() { + system = ActorSystem.create("SchedulerPatternTest", AkkaSpec.testConf()); + } + + @After + public void tearDown() { + system.shutdown(); + } + + static + //#schedule-constructor + public class ScheduleInConstructor extends UntypedActor { + + private final Cancellable tick = getContext().system().scheduler().schedule( + Duration.create(500, TimeUnit.MILLISECONDS), + Duration.create(1000, TimeUnit.MILLISECONDS), + getSelf(), "tick", getContext().system().dispatcher()); + //#schedule-constructor + ActorRef target; + public ScheduleInConstructor(ActorRef target) { + this.target = target; + } + //#schedule-constructor + + @Override + public void postStop() { + tick.cancel(); + } + + @Override + public void onReceive(Object message) throws Exception { + if (message.equals("tick")) { + // do something useful here + //#schedule-constructor + target.tell(message, getSelf()); + //#schedule-constructor + } + //#schedule-constructor + else if (message.equals("restart")) { + throw new ArithmeticException(); + } + //#schedule-constructor + else { + unhandled(message); + } + } + } + //#schedule-constructor + + static + //#schedule-receive + public class ScheduleInReceive extends UntypedActor { + //#schedule-receive + ActorRef target; + public ScheduleInReceive(ActorRef target) { + this.target = target; + } + //#schedule-receive + + @Override + public void preStart() { + getContext().system().scheduler().scheduleOnce( + Duration.create(500, TimeUnit.MILLISECONDS), + getSelf(), "tick", getContext().system().dispatcher()); + } + + // override postRestart so we don't call preStart and schedule a new message + @Override + public void postRestart(Throwable reason) { + } + + @Override + public void onReceive(Object message) throws Exception { + if (message.equals("tick")) { + // send another periodic tick after the specified delay + getContext().system().scheduler().scheduleOnce( + Duration.create(1000, TimeUnit.MILLISECONDS), + getSelf(), "tick", getContext().system().dispatcher()); + // do something useful here + //#schedule-receive + target.tell(message, getSelf()); + //#schedule-receive + } + //#schedule-receive + else if (message.equals("restart")) { + throw new ArithmeticException(); + } + //#schedule-receive + else { + unhandled(message); + } + } + } + //#schedule-receive + + @Test + @Ignore // no way to tag this as timing sensitive + public void scheduleInConstructor() { + new TestSchedule(system) {{ + final JavaTestKit probe = new JavaTestKit(system); + + final Props props = new Props(new UntypedActorFactory() { + public UntypedActor create() { + return new ScheduleInConstructor(probe.getRef()); + } + }); + + testSchedule(probe, props, duration("3000 millis"), duration("2000 millis")); + }}; + } + + @Test + @Ignore // no way to tag this as timing sensitive + public void scheduleInReceive() { + + new TestSchedule(system) {{ + final JavaTestKit probe = new JavaTestKit(system); + + final Props props = new Props(new UntypedActorFactory() { + public UntypedActor create() { + return new ScheduleInReceive(probe.getRef()); + } + }); + + testSchedule(probe, props, duration("3000 millis"), duration("2500 millis")); + }}; + } + + public static class TestSchedule extends JavaTestKit { + private ActorSystem system; + + public TestSchedule(ActorSystem system) { + super(system); + this.system = system; + } + + public void testSchedule(final JavaTestKit probe, Props props, + FiniteDuration startDuration, + FiniteDuration afterRestartDuration) { + Iterable filter = + Arrays.asList(new akka.testkit.EventFilter[]{ + (akka.testkit.EventFilter) new ErrorFilter(ArithmeticException.class)}); + system.eventStream().publish(new Mute(filter)); + + final ActorRef actor = system.actorOf(props); + new Within(startDuration) { + protected void run() { + probe.expectMsgEquals("tick"); + probe.expectMsgEquals("tick"); + probe.expectMsgEquals("tick"); + } + }; + actor.tell("restart", getRef()); + new Within(afterRestartDuration) { + protected void run() { + probe.expectMsgEquals("tick"); + probe.expectMsgEquals("tick"); + } + }; + system.stop(actor); + + system.eventStream().publish(new UnMute(filter)); + } + } +} diff --git a/akka-docs/rst/java/howto.rst b/akka-docs/rst/java/howto.rst index 204d50e7dc..e1f9f1610b 100644 --- a/akka-docs/rst/java/howto.rst +++ b/akka-docs/rst/java/howto.rst @@ -17,6 +17,34 @@ sense to add to the ``akka.pattern`` package for creating an `OTP-like library You might find some of the patterns described in the Scala chapter of :ref:`howto-scala` useful even though the example code is written in Scala. +Scheduling Periodic Messages +============================ + +This pattern describes how to schedule periodic messages to yourself in two different +ways. + +The first way is to set up periodic message scheduling in the constructor of the actor, +and cancel that scheduled sending in ``postStop`` or else we might have multiple registered +message sends to the same actor. + +.. note:: + + With this approach the scheduler will be restarted with the actor on restarts. + +.. includecode:: code/docs/pattern/SchedulerPatternTestBase.java#schedule-constructor + +The second variant sets up an initial one shot message send in the ``preStart`` method +of the actor, and the then the actor when it receives this message sets up a new one shot +message send. You also have to override ``postRestart`` so we don't call ``preStart`` +and schedule the initial message send again. + +.. note:: + + With this approach we won't fill up the mailbox with tick messages if the actor is + under pressure, but only schedule a new tick message when we have seen the previous one. + +.. includecode:: code/docs/pattern/SchedulerPatternTestBase.java#schedule-receive + Template Pattern ================ @@ -33,4 +61,3 @@ This is an especially nice pattern, since it does even come with some empty exam Spread the word: this is the easiest way to get famous! Please keep this pattern at the end of this file. - diff --git a/akka-docs/rst/scala/code/docs/pattern/SchedulerPatternSpec.scala b/akka-docs/rst/scala/code/docs/pattern/SchedulerPatternSpec.scala new file mode 100644 index 0000000000..e79d94b2c5 --- /dev/null +++ b/akka-docs/rst/scala/code/docs/pattern/SchedulerPatternSpec.scala @@ -0,0 +1,98 @@ +/** + * Copyright (C) 2009-2012 Typesafe Inc. + */ + +package docs.pattern + +import language.postfixOps + +import akka.actor.{ Props, ActorRef, Actor } +import scala.concurrent.util.duration._ +import scala.concurrent.util.{ FiniteDuration, Duration } +import akka.testkit.{ TimingTest, AkkaSpec, filterException } +import docs.pattern.SchedulerPatternSpec.ScheduleInConstructor + +object SchedulerPatternSpec { + //#schedule-constructor + class ScheduleInConstructor extends Actor { + import context._ + + val tick = system.scheduler.schedule(500 millis, 1000 millis, self, "tick") + //#schedule-constructor + var target: ActorRef = null + def this(target: ActorRef) = { this(); this.target = target } + //#schedule-constructor + + override def postStop() = tick.cancel() + + def receive = { + case "tick" ⇒ + // do something useful here + //#schedule-constructor + target ! "tick" + case "restart" ⇒ + throw new ArithmeticException + //#schedule-constructor + } + } + //#schedule-constructor + + //#schedule-receive + class ScheduleInReceive extends Actor { + import context._ + //#schedule-receive + var target: ActorRef = null + def this(target: ActorRef) = { this(); this.target = target } + //#schedule-receive + + override def preStart() = + system.scheduler.scheduleOnce(500 millis, self, "tick") + + // override postRestart so we don't call preStart and schedule a new message + override def postRestart(reason: Throwable) = {} + + def receive = { + case "tick" ⇒ + // send another periodic tick after the specified delay + system.scheduler.scheduleOnce(1000 millis, self, "tick") + // do something useful here + //#schedule-receive + target ! "tick" + case "restart" ⇒ + throw new ArithmeticException + //#schedule-receive + } + } + //#schedule-receive +} + +class SchedulerPatternSpec extends AkkaSpec { + + def testSchedule(actor: ActorRef, startDuration: FiniteDuration, + afterRestartDuration: FiniteDuration) = { + + filterException[ArithmeticException] { + within(startDuration) { + expectMsg("tick") + expectMsg("tick") + expectMsg("tick") + } + actor ! "restart" + within(afterRestartDuration) { + expectMsg("tick") + expectMsg("tick") + } + system.stop(actor) + } + } + + "send periodic ticks from the constructor" taggedAs TimingTest in { + testSchedule(system.actorOf(Props(new ScheduleInConstructor(testActor))), + 3000 millis, 2000 millis) + } + + "send ticks from the preStart and receive" taggedAs TimingTest in { + testSchedule(system.actorOf(Props(new ScheduleInConstructor(testActor))), + 3000 millis, 2500 millis) + } +} diff --git a/akka-docs/rst/scala/howto.rst b/akka-docs/rst/scala/howto.rst index 7d064e2491..c5203adb1c 100644 --- a/akka-docs/rst/scala/howto.rst +++ b/akka-docs/rst/scala/howto.rst @@ -111,6 +111,34 @@ This is where the Spider pattern comes in." The pattern is described `Discovering Message Flows in Actor System with the Spider Pattern `_. +Scheduling Periodic Messages +============================ + +This pattern describes how to schedule periodic messages to yourself in two different +ways. + +The first way is to set up periodic message scheduling in the constructor of the actor, +and cancel that scheduled sending in ``postStop`` or else we might have multiple registered +message sends to the same actor. + +.. note:: + + With this approach the scheduler will be restarted with the actor on restarts. + +.. includecode:: code/docs/pattern/SchedulerPatternSpec.scala#schedule-constructor + +The second variant sets up an initial one shot message send in the ``preStart`` method +of the actor, and the then the actor when it receives this message sets up a new one shot +message send. You also have to override ``postRestart`` so we don't call ``preStart`` +and schedule the initial message send again. + +.. note:: + + With this approach we won't fill up the mailbox with tick messages if the actor is + under pressure, but only schedule a new tick message when we have seen the previous one. + +.. includecode:: code/docs/pattern/SchedulerPatternSpec.scala#schedule-receive + Template Pattern ================ @@ -127,4 +155,3 @@ This is an especially nice pattern, since it does even come with some empty exam Spread the word: this is the easiest way to get famous! Please keep this pattern at the end of this file. - From c9436d2ec47286c5435688a7ac5495419fb3c594 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Fri, 5 Oct 2012 17:12:06 +0200 Subject: [PATCH 004/210] testTransport in ReliableProxySpec, see #2586 --- .../scala/akka/contrib/pattern/ReliableProxySpec.scala | 2 ++ 1 file changed, 2 insertions(+) diff --git a/akka-contrib/src/multi-jvm/scala/akka/contrib/pattern/ReliableProxySpec.scala b/akka-contrib/src/multi-jvm/scala/akka/contrib/pattern/ReliableProxySpec.scala index 03fef8da54..870028a3f2 100644 --- a/akka-contrib/src/multi-jvm/scala/akka/contrib/pattern/ReliableProxySpec.scala +++ b/akka-contrib/src/multi-jvm/scala/akka/contrib/pattern/ReliableProxySpec.scala @@ -22,6 +22,8 @@ import akka.testkit.TestProbe object ReliableProxySpec extends MultiNodeConfig { val local = role("local") val remote = role("remote") + + testTransport(on = true) } class ReliableProxyMultiJvmNode1 extends ReliableProxySpec From 397083a218a1ed843b6dafa92f910072721be437 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Sat, 6 Oct 2012 00:13:42 +0200 Subject: [PATCH 005/210] Changing the default sender of ! to be Actor.noSender to keep null in one place and have a logical alternative when deadLetters isn't present in scope. --- akka-actor/src/main/scala/akka/actor/Actor.scala | 5 +++++ akka-actor/src/main/scala/akka/actor/ActorRef.scala | 8 ++++---- .../src/main/scala/akka/actor/ActorRefProvider.scala | 2 +- akka-actor/src/main/scala/akka/actor/ActorSelection.scala | 2 +- .../src/main/scala/akka/actor/RepointableActorRef.scala | 2 +- akka-actor/src/main/scala/akka/event/Logging.scala | 2 +- akka-actor/src/main/scala/akka/pattern/AskSupport.scala | 2 +- .../src/main/scala/akka/pattern/PipeToSupport.scala | 4 ++-- akka-actor/src/main/scala/akka/routing/Listeners.scala | 2 +- .../main/scala/akka/remote/RemoteActorRefProvider.scala | 2 +- akka-remote/src/main/scala/akka/remote/RemoteDaemon.scala | 2 +- 11 files changed, 19 insertions(+), 14 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/Actor.scala b/akka-actor/src/main/scala/akka/actor/Actor.scala index 1b616c55e8..f51b0fb7d6 100644 --- a/akka-actor/src/main/scala/akka/actor/Actor.scala +++ b/akka-actor/src/main/scala/akka/actor/Actor.scala @@ -300,6 +300,11 @@ object Actor { def apply(x: Any) = throw new UnsupportedOperationException("Empty behavior apply()") } + /** + * Default placeholder used for "!" to indeicate that there is no sender of the message, + * that will be translated to the receiving system's deadLetters. + */ + final val noSender: ActorRef = null } /** diff --git a/akka-actor/src/main/scala/akka/actor/ActorRef.scala b/akka-actor/src/main/scala/akka/actor/ActorRef.scala index 2cb2f984f2..d7d971837c 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRef.scala @@ -153,7 +153,7 @@ trait ScalaActorRef { ref: ActorRef ⇒ * *

*/ - def !(message: Any)(implicit sender: ActorRef = null): Unit + def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit } @@ -341,7 +341,7 @@ private[akka] class LocalActorRef private[akka] ( override def sendSystemMessage(message: SystemMessage): Unit = actorCell.sendSystemMessage(message) - override def !(message: Any)(implicit sender: ActorRef = null): Unit = actorCell.tell(message, sender) + override def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit = actorCell.tell(message, sender) override def restart(cause: Throwable): Unit = actorCell.restart(cause) @@ -395,7 +395,7 @@ private[akka] trait MinimalActorRef extends InternalActorRef with LocalRef { override def stop(): Unit = () override def isTerminated = false - override def !(message: Any)(implicit sender: ActorRef = null): Unit = () + override def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit = () override def sendSystemMessage(message: SystemMessage): Unit = () override def restart(cause: Throwable): Unit = () @@ -435,7 +435,7 @@ private[akka] class EmptyLocalActorRef(override val provider: ActorRefProvider, override def sendSystemMessage(message: SystemMessage): Unit = specialHandle(message) - override def !(message: Any)(implicit sender: ActorRef = null): Unit = message match { + override def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit = message match { case d: DeadLetter ⇒ specialHandle(d.message) // do NOT form endless loops, since deadLetters will resend! case _ ⇒ if (!specialHandle(message)) eventStream.publish(DeadLetter(message, sender, this)) } diff --git a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala index d60a46d497..f1a4a0d141 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala @@ -375,7 +375,7 @@ class LocalActorRefProvider( override def stop(): Unit = stopped switchOn { terminationPromise.complete(causeOfTermination.map(Failure(_)).getOrElse(Success(()))) } override def isTerminated: Boolean = stopped.isOn - override def !(message: Any)(implicit sender: ActorRef = null): Unit = stopped.ifOff(message match { + override def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit = stopped.ifOff(message match { case Failed(ex, _) if sender ne null ⇒ causeOfTermination = Some(ex); sender.asInstanceOf[InternalActorRef].stop() case NullMessage ⇒ // do nothing case _ ⇒ log.error(this + " received unexpected message [" + message + "]") diff --git a/akka-actor/src/main/scala/akka/actor/ActorSelection.scala b/akka-actor/src/main/scala/akka/actor/ActorSelection.scala index 0740d8724e..2f4fd4219b 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorSelection.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorSelection.scala @@ -70,5 +70,5 @@ object ActorSelection { trait ScalaActorSelection { this: ActorSelection ⇒ - def !(msg: Any)(implicit sender: ActorRef = null) = tell(msg, sender) + def !(msg: Any)(implicit sender: ActorRef = Actor.noSender) = tell(msg, sender) } \ No newline at end of file diff --git a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala index 7bbc5517d8..142cdc4dc4 100644 --- a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala @@ -112,7 +112,7 @@ private[akka] class RepointableActorRef( } } else this - def !(message: Any)(implicit sender: ActorRef = null) = underlying.tell(message, sender) + def !(message: Any)(implicit sender: ActorRef = Actor.noSender) = underlying.tell(message, sender) def sendSystemMessage(message: SystemMessage) = underlying.sendSystemMessage(message) diff --git a/akka-actor/src/main/scala/akka/event/Logging.scala b/akka-actor/src/main/scala/akka/event/Logging.scala index 48d7c44d5d..e6003f5279 100644 --- a/akka-actor/src/main/scala/akka/event/Logging.scala +++ b/akka-actor/src/main/scala/akka/event/Logging.scala @@ -708,7 +708,7 @@ object Logging { val path: ActorPath = new RootActorPath(Address("akka", "all-systems"), "/StandardOutLogger") def provider: ActorRefProvider = throw new UnsupportedOperationException("StandardOutLogger does not provide") override val toString = "StandardOutLogger" - override def !(message: Any)(implicit sender: ActorRef = null): Unit = print(message) + override def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit = print(message) } val StandardOutLogger = new StandardOutLogger diff --git a/akka-actor/src/main/scala/akka/pattern/AskSupport.scala b/akka-actor/src/main/scala/akka/pattern/AskSupport.scala index 704ce43d8d..43e899f81f 100644 --- a/akka-actor/src/main/scala/akka/pattern/AskSupport.scala +++ b/akka-actor/src/main/scala/akka/pattern/AskSupport.scala @@ -247,7 +247,7 @@ private[akka] final class PromiseActorRef private (val provider: ActorRefProvide case Registering ⇒ path // spin until registration is completed } - override def !(message: Any)(implicit sender: ActorRef = null): Unit = state match { + override def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit = state match { case Stopped | _: StoppedWithPath ⇒ provider.deadLetters ! message case _ ⇒ if (!(result.tryComplete( message match { diff --git a/akka-actor/src/main/scala/akka/pattern/PipeToSupport.scala b/akka-actor/src/main/scala/akka/pattern/PipeToSupport.scala index 5563a908de..a766954e54 100644 --- a/akka-actor/src/main/scala/akka/pattern/PipeToSupport.scala +++ b/akka-actor/src/main/scala/akka/pattern/PipeToSupport.scala @@ -7,12 +7,12 @@ import language.implicitConversions import scala.concurrent.{ Future, ExecutionContext } import scala.util.{ Failure, Success } -import akka.actor.{ Status, ActorRef } +import akka.actor.{ Status, ActorRef, Actor } trait PipeToSupport { final class PipeableFuture[T](val future: Future[T])(implicit executionContext: ExecutionContext) { - def pipeTo(recipient: ActorRef)(implicit sender: ActorRef = null): Future[T] = { + def pipeTo(recipient: ActorRef)(implicit sender: ActorRef = Actor.noSender): Future[T] = { future onComplete { case Success(r) ⇒ recipient ! r case Failure(f) ⇒ recipient ! Status.Failure(f) diff --git a/akka-actor/src/main/scala/akka/routing/Listeners.scala b/akka-actor/src/main/scala/akka/routing/Listeners.scala index 7cc48b05f8..346f994a2f 100644 --- a/akka-actor/src/main/scala/akka/routing/Listeners.scala +++ b/akka-actor/src/main/scala/akka/routing/Listeners.scala @@ -45,7 +45,7 @@ trait Listeners { self: Actor ⇒ * @param msg * @param sender */ - protected def gossip(msg: Any)(implicit sender: ActorRef = null): Unit = { + protected def gossip(msg: Any)(implicit sender: ActorRef = Actor.noSender): Unit = { val i = listeners.iterator while (i.hasNext) i.next ! msg } diff --git a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala index 50531bfa91..4e1921a960 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala @@ -235,7 +235,7 @@ private[akka] class RemoteActorRef private[akka] ( provider.deadLetters ! message } - override def !(message: Any)(implicit sender: ActorRef = null): Unit = + override def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit = try remote.send(message, Option(sender), this) catch { case e @ (_: InterruptedException | NonFatal(_)) ⇒ diff --git a/akka-remote/src/main/scala/akka/remote/RemoteDaemon.scala b/akka-remote/src/main/scala/akka/remote/RemoteDaemon.scala index ecfd544dcb..f6e000737a 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteDaemon.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteDaemon.scala @@ -63,7 +63,7 @@ private[akka] class RemoteSystemDaemon( } } - override def !(msg: Any)(implicit sender: ActorRef = null): Unit = msg match { + override def !(msg: Any)(implicit sender: ActorRef = Actor.noSender): Unit = msg match { case message: DaemonMsg ⇒ log.debug("Received command [{}] to RemoteSystemDaemon on [{}]", message, path.address) message match { From 4787c12a29a9af502bd2d7dc735c74d70fd1578c Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Sat, 6 Oct 2012 00:24:21 +0200 Subject: [PATCH 006/210] Fixing a typo in the ScalaDoc for Actor.noSender and clarifying that it is indeed the famous null being used here. --- akka-actor/src/main/scala/akka/actor/Actor.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/akka-actor/src/main/scala/akka/actor/Actor.scala b/akka-actor/src/main/scala/akka/actor/Actor.scala index f51b0fb7d6..d02f37cf7b 100644 --- a/akka-actor/src/main/scala/akka/actor/Actor.scala +++ b/akka-actor/src/main/scala/akka/actor/Actor.scala @@ -301,7 +301,7 @@ object Actor { } /** - * Default placeholder used for "!" to indeicate that there is no sender of the message, + * Default placeholder (null) used for "!" to indicate that there is no sender of the message, * that will be translated to the receiving system's deadLetters. */ final val noSender: ActorRef = null From 2bf9b32b48e4c9a96ab72cb3f429ddae1f6708ab Mon Sep 17 00:00:00 2001 From: Roland Date: Fri, 5 Oct 2012 11:56:59 -0700 Subject: [PATCH 007/210] add small hint for programmatic remoting config, see #2604 --- .../docs/remoting/RemoteDeploymentDocTestBase.java | 10 ++++++++++ akka-docs/rst/java/remoting.rst | 7 +++++++ akka-docs/rst/scala/remoting.rst | 7 +++++++ 3 files changed, 24 insertions(+) diff --git a/akka-docs/rst/java/code/docs/remoting/RemoteDeploymentDocTestBase.java b/akka-docs/rst/java/code/docs/remoting/RemoteDeploymentDocTestBase.java index eaf5fbab79..49d0a631f6 100644 --- a/akka-docs/rst/java/code/docs/remoting/RemoteDeploymentDocTestBase.java +++ b/akka-docs/rst/java/code/docs/remoting/RemoteDeploymentDocTestBase.java @@ -7,6 +7,8 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; +import com.typesafe.config.ConfigFactory; + //#import import akka.actor.ActorRef; import akka.actor.Address; @@ -60,6 +62,14 @@ public class RemoteDeploymentDocTestBase { actor.tell("Pretty slick", null); //#sample-actor } + + @Test + public void demonstrateProgrammaticConfig() { + //#programmatic + ConfigFactory.parseString("akka.remote.netty.hostname=\"1.2.3.4\"") + .withFallback(ConfigFactory.load()); + //#programmatic + } } \ No newline at end of file diff --git a/akka-docs/rst/java/remoting.rst b/akka-docs/rst/java/remoting.rst index 826a5b7ba1..efd4b0e43f 100644 --- a/akka-docs/rst/java/remoting.rst +++ b/akka-docs/rst/java/remoting.rst @@ -60,6 +60,13 @@ reference file for more information: .. literalinclude:: ../../../akka-remote/src/main/resources/reference.conf :language: none +.. note:: + + Setting properties like the listening IP and port number programmatically is + best done by using something like the following: + + .. includecode:: code/docs/remoting/RemoteDeploymentDocTestBase.java#programmatic + Looking up Remote Actors ^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/akka-docs/rst/scala/remoting.rst b/akka-docs/rst/scala/remoting.rst index ca7220a419..c866e9c1e6 100644 --- a/akka-docs/rst/scala/remoting.rst +++ b/akka-docs/rst/scala/remoting.rst @@ -57,6 +57,13 @@ reference file for more information: .. literalinclude:: ../../../akka-remote/src/main/resources/reference.conf :language: none +.. note:: + + Setting properties like the listening IP and port number programmatically is + best done by using something like the following: + + .. includecode:: ../java/code/docs/remoting/RemoteDeploymentDocTestBase.java#programmatic + Types of Remote Interaction ^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 8ef2a47069493dccfc9c2768b40b38aeffb0673b Mon Sep 17 00:00:00 2001 From: RayRoestenburg Date: Thu, 4 Oct 2012 15:28:39 +0200 Subject: [PATCH 008/210] fixed timing test when response is not sent by actor --- .../internal/component/ActorComponent.scala | 2 +- .../test/scala/akka/camel/TestSupport.scala | 6 +- .../component/ActorProducerTest.scala | 88 ++++++++++++------- 3 files changed, 62 insertions(+), 34 deletions(-) diff --git a/akka-camel/src/main/scala/akka/camel/internal/component/ActorComponent.scala b/akka-camel/src/main/scala/akka/camel/internal/component/ActorComponent.scala index 2a1be08354..0e45a4eaec 100644 --- a/akka-camel/src/main/scala/akka/camel/internal/component/ActorComponent.scala +++ b/akka-camel/src/main/scala/akka/camel/internal/component/ActorComponent.scala @@ -135,7 +135,7 @@ private[camel] class ActorProducer(val endpoint: ActorEndpoint, camel: Camel) ex private[camel] def processExchangeAdapter(exchange: CamelExchangeAdapter): Unit = { val isDone = new CountDownLatch(1) processExchangeAdapter(exchange, new AsyncCallback { def done(doneSync: Boolean) { isDone.countDown() } }) - isDone.await(camel.settings.ReplyTimeout.toMillis, TimeUnit.MILLISECONDS) + isDone.await(endpoint.replyTimeout.length, endpoint.replyTimeout.unit) } /** diff --git a/akka-camel/src/test/scala/akka/camel/TestSupport.scala b/akka-camel/src/test/scala/akka/camel/TestSupport.scala index c25ccdab3c..370e5f99f9 100644 --- a/akka-camel/src/test/scala/akka/camel/TestSupport.scala +++ b/akka-camel/src/test/scala/akka/camel/TestSupport.scala @@ -75,10 +75,10 @@ private[camel] object TestSupport { } def time[A](block: ⇒ A): FiniteDuration = { - val start = System.currentTimeMillis() + val start = System.nanoTime() block - val duration = System.currentTimeMillis() - start - duration millis + val duration = System.nanoTime() - start + duration nanos } def anInstanceOf[T](implicit tag: ClassTag[T]) = { diff --git a/akka-camel/src/test/scala/akka/camel/internal/component/ActorProducerTest.scala b/akka-camel/src/test/scala/akka/camel/internal/component/ActorProducerTest.scala index 8f7845d3ff..d6088fef77 100644 --- a/akka-camel/src/test/scala/akka/camel/internal/component/ActorProducerTest.scala +++ b/akka-camel/src/test/scala/akka/camel/internal/component/ActorProducerTest.scala @@ -24,11 +24,12 @@ import akka.actor.Status.{ Success, Failure } import com.typesafe.config.ConfigFactory import akka.actor.ActorSystem.Settings import akka.event.LoggingAdapter -import akka.testkit.{ TimingTest, TestKit, TestProbe } +import akka.testkit.{ TestLatch, TimingTest, TestKit, TestProbe } import org.apache.camel.impl.DefaultCamelContext import concurrent.{ Await, Promise, Future } import akka.util.Timeout import akka.actor._ +import akka.testkit._ class ActorProducerTest extends TestKit(ActorSystem("test")) with WordSpec with MustMatchers with ActorProducerFixture { implicit val timeout = Timeout(10 seconds) @@ -65,9 +66,7 @@ class ActorProducerTest extends TestKit(ActorSystem("test")) with WordSpec with "process the exchange" in { producer = given(outCapable = false, autoAck = false) import system.dispatcher - val future = Future { - producer.processExchangeAdapter(exchange) - } + val future = Future { producer.processExchangeAdapter(exchange) } within(1 second) { probe.expectMsgType[CamelMessage] info("message sent to consumer") @@ -111,10 +110,21 @@ class ActorProducerTest extends TestKit(ActorSystem("test")) with WordSpec with } "response is not sent by actor" must { - + val latch = TestLatch(1) + val callback = new AsyncCallback { + def done(doneSync: Boolean) { + latch.countDown() + } + } def process() = { producer = given(outCapable = true, replyTimeout = 100 millis) - time(producer.processExchangeAdapter(exchange)) + val duration = time { + producer.processExchangeAdapter(exchange, callback) + // wait for the actor to complete the callback + Await.ready(latch, 1.seconds.dilated) + } + latch.reset() + duration } "timeout after replyTimeout" taggedAs TimingTest in { @@ -159,16 +169,20 @@ class ActorProducerTest extends TestKit(ActorSystem("test")) with WordSpec with val doneSync = producer.processExchangeAdapter(exchange, asyncCallback) - asyncCallback.expectNoCallWithin(100 millis); info("no async callback before response") + asyncCallback.expectNoCallWithin(100 millis) + info("no async callback before response") within(1 second) { probe.expectMsgType[CamelMessage] probe.sender ! "some message" } - doneSync must be(false); info("done async") + doneSync must be(false) + info("done async") - asyncCallback.expectDoneAsyncWithin(1 second); info("async callback received") - verify(exchange).setResponse(msg("some message")); info("response as expected") + asyncCallback.expectDoneAsyncWithin(1 second) + info("async callback received") + verify(exchange).setResponse(msg("some message")) + info("response as expected") } } @@ -197,7 +211,10 @@ class ActorProducerTest extends TestKit(ActorSystem("test")) with WordSpec with producer.processExchangeAdapter(exchange, asyncCallback) asyncCallback.awaitCalled(100 millis) verify(exchange).setFailure(Matchers.argThat(new ArgumentMatcher[FailureResult] { - def matches(failure: AnyRef) = { failure.asInstanceOf[FailureResult].cause must be(anInstanceOf[TimeoutException]); true } + def matches(failure: AnyRef) = { + failure.asInstanceOf[FailureResult].cause must be(anInstanceOf[TimeoutException]) + true + } })) } @@ -221,9 +238,12 @@ class ActorProducerTest extends TestKit(ActorSystem("test")) with WordSpec with producer = given(outCapable = false, autoAck = true) val doneSync = producer.processExchangeAdapter(exchange, asyncCallback) - doneSync must be(true); info("done sync") - asyncCallback.expectDoneSyncWithin(1 second); info("async callback called") - verify(exchange, never()).setResponse(any[CamelMessage]); info("no response forwarded to exchange") + doneSync must be(true) + info("done sync") + asyncCallback.expectDoneSyncWithin(1 second) + info("async callback called") + verify(exchange, never()).setResponse(any[CamelMessage]) + info("no response forwarded to exchange") } } @@ -238,11 +258,14 @@ class ActorProducerTest extends TestKit(ActorSystem("test")) with WordSpec with doneSync must be(false) within(1 second) { - probe.expectMsgType[CamelMessage]; info("message sent to consumer") + probe.expectMsgType[CamelMessage] + info("message sent to consumer") probe.sender ! Ack - asyncCallback.expectDoneAsyncWithin(remaining); info("async callback called") + asyncCallback.expectDoneAsyncWithin(remaining) + info("async callback called") } - verify(exchange, never()).setResponse(any[CamelMessage]); info("no response forwarded to exchange") + verify(exchange, never()).setResponse(any[CamelMessage]) + info("no response forwarded to exchange") } } @@ -253,12 +276,16 @@ class ActorProducerTest extends TestKit(ActorSystem("test")) with WordSpec with producer.processExchangeAdapter(exchange, asyncCallback) within(1 second) { - probe.expectMsgType[CamelMessage]; info("message sent to consumer") + probe.expectMsgType[CamelMessage] + info("message sent to consumer") probe.sender ! "some neither Ack nor Failure response" - asyncCallback.expectDoneAsyncWithin(remaining); info("async callback called") + asyncCallback.expectDoneAsyncWithin(remaining) + info("async callback called") } - verify(exchange, never()).setResponse(any[CamelMessage]); info("no response forwarded to exchange") - verify(exchange).setFailure(any[FailureResult]); info("failure set") + verify(exchange, never()).setResponse(any[CamelMessage]) + info("no response forwarded to exchange") + verify(exchange).setFailure(any[FailureResult]) + info("failure set") } } @@ -282,12 +309,15 @@ class ActorProducerTest extends TestKit(ActorSystem("test")) with WordSpec with doneSync must be(false) within(1 second) { - probe.expectMsgType[CamelMessage]; info("message sent to consumer") + probe.expectMsgType[CamelMessage] + info("message sent to consumer") probe.sender ! Failure(new Exception) - asyncCallback.awaitCalled(remaining); + asyncCallback.awaitCalled(remaining) } - verify(exchange, never()).setResponse(any[CamelMessage]); info("no response forwarded to exchange") - verify(exchange).setFailure(any[FailureResult]); info("failure set") + verify(exchange, never()).setResponse(any[CamelMessage]) + info("no response forwarded to exchange") + verify(exchange).setFailure(any[FailureResult]) + info("failure set") } } } @@ -363,10 +393,8 @@ trait ActorProducerFixture extends MockitoSugar with BeforeAndAfterAll with Befo def createAsyncCallback = new TestAsyncCallback class TestAsyncCallback extends AsyncCallback { - def expectNoCallWithin(duration: Duration) { - if (callbackReceived.await(duration.toNanos, TimeUnit.NANOSECONDS)) fail("NOT expected callback, but received one!") - } - + def expectNoCallWithin(duration: Duration): Unit = + if (callbackReceived.await(duration.length, duration.unit)) fail("NOT expected callback, but received one!") def awaitCalled(timeout: Duration = 1 second) { valueWithin(1 second) } val callbackReceived = new CountDownLatch(1) @@ -378,7 +406,7 @@ trait ActorProducerFixture extends MockitoSugar with BeforeAndAfterAll with Befo } private[this] def valueWithin(implicit timeout: FiniteDuration) = - if (!callbackReceived.await(timeout.toNanos, TimeUnit.NANOSECONDS)) fail("Callback not received!") + if (!callbackReceived.await(timeout.length, timeout.unit)) fail("Callback not received!") else callbackValue.get def expectDoneSyncWithin(implicit timeout: FiniteDuration): Unit = if (!valueWithin(timeout)) fail("Expected to be done Synchronously") From 45efd3dc0058298a43ca5203dc090c0b58b6bae7 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Sun, 7 Oct 2012 08:54:15 +0200 Subject: [PATCH 009/210] Adjust the scaladoc note as suggested, see #2586 --- .../akka/remote/testconductor/Conductor.scala | 21 +++++++++++-------- .../akka/remote/testconductor/Extension.scala | 10 +++++++-- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/akka-remote-tests/src/main/scala/akka/remote/testconductor/Conductor.scala b/akka-remote-tests/src/main/scala/akka/remote/testconductor/Conductor.scala index fca4d62763..4646e78a0a 100644 --- a/akka-remote-tests/src/main/scala/akka/remote/testconductor/Conductor.scala +++ b/akka-remote-tests/src/main/scala/akka/remote/testconductor/Conductor.scala @@ -103,9 +103,6 @@ trait Conductor { this: TestConductorExt ⇒ } /** - * To use this feature you must activate the TestConductorTranport by - * specifying `testTransport(on = true)` in your MultiNodeConfig. - * * Make the remoting pipeline on the node throttle data sent to or received * from the given remote peer. Throttling works by delaying packet submission * within the netty pipeline until the packet would have been completely sent @@ -118,6 +115,10 @@ trait Conductor { this: TestConductorExt ⇒ * determining how much to send, leading to the correct output rate, but with * increased latency. * + * ====Note==== + * To use this feature you must activate the `TestConductorTranport` + * by specifying `testTransport(on = true)` in your MultiNodeConfig. + * * @param node is the symbolic name of the node which is to be affected * @param target is the symbolic name of the other node to which connectivity shall be throttled * @param direction can be either `Direction.Send`, `Direction.Receive` or `Direction.Both` @@ -130,14 +131,15 @@ trait Conductor { this: TestConductorExt ⇒ } /** - * To use this feature you must activate the TestConductorTranport by - * specifying `testTransport(on = true)` in your MultiNodeConfig. - * * Switch the Netty pipeline of the remote support into blackhole mode for * sending and/or receiving: it will just drop all messages right before * submitting them to the Socket or right after receiving them from the * Socket. * + * ====Note==== + * To use this feature you must activate the `TestConductorTranport` + * by specifying `testTransport(on = true)` in your MultiNodeConfig. + * * @param node is the symbolic name of the node which is to be affected * @param target is the symbolic name of the other node to which connectivity shall be impeded * @param direction can be either `Direction.Send`, `Direction.Receive` or `Direction.Both` @@ -154,12 +156,13 @@ trait Conductor { this: TestConductorExt ⇒ "specifying `testTransport(on = true)` in your MultiNodeConfig.") /** - * To use this feature you must activate the TestConductorTranport by - * specifying `testTransport(on = true)` in your MultiNodeConfig. - * * Switch the Netty pipeline of the remote support into pass through mode for * sending and/or receiving. * + * ====Note==== + * To use this feature you must activate the `TestConductorTranport` + * by specifying `testTransport(on = true)` in your MultiNodeConfig. + * * @param node is the symbolic name of the node which is to be affected * @param target is the symbolic name of the other node to which connectivity shall be impeded * @param direction can be either `Direction.Send`, `Direction.Receive` or `Direction.Both` diff --git a/akka-remote-tests/src/main/scala/akka/remote/testconductor/Extension.scala b/akka-remote-tests/src/main/scala/akka/remote/testconductor/Extension.scala index 4469ce308a..1945c89a1f 100644 --- a/akka-remote-tests/src/main/scala/akka/remote/testconductor/Extension.scala +++ b/akka-remote-tests/src/main/scala/akka/remote/testconductor/Extension.scala @@ -29,8 +29,14 @@ object TestConductor extends ExtensionKey[TestConductorExt] { * [[akka.actor.Extension]]. Please follow the aforementioned links for * more information. * - * This extension requires the `akka.actor.provider` - * to be a [[akka.remote.RemoteActorRefProvider]]. + * ====Note==== + * This extension requires the `akka.actor.provider` + * to be a [[akka.remote.RemoteActorRefProvider]]. + * + * To use ``blackhole``, ``passThrough``, and ``throttle`` you must activate the + * `TestConductorTranport` by specifying `testTransport(on = true)` in your + * MultiNodeConfig. + * */ class TestConductorExt(val system: ExtendedActorSystem) extends Extension with Conductor with Player { From 3783be2f58d4380e900891d7b8331f4333dc7d86 Mon Sep 17 00:00:00 2001 From: Evgeny Chukreev Date: Fri, 5 Oct 2012 22:09:16 +0300 Subject: [PATCH 010/210] Fix for "#2579: Scheduler drifts away" --- .../src/main/scala/akka/actor/Scheduler.scala | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/Scheduler.scala b/akka-actor/src/main/scala/akka/actor/Scheduler.scala index 02c67c6423..023acca4c1 100644 --- a/akka-actor/src/main/scala/akka/actor/Scheduler.scala +++ b/akka-actor/src/main/scala/akka/actor/Scheduler.scala @@ -9,7 +9,7 @@ import akka.util.internal.{ TimerTask, HashedWheelTimer, Timeout ⇒ HWTimeout, import akka.event.LoggingAdapter import akka.dispatch.MessageDispatcher import java.io.Closeable -import java.util.concurrent.atomic.AtomicReference +import java.util.concurrent.atomic.{ AtomicReference, AtomicLong } import scala.annotation.tailrec import akka.util.internal._ import concurrent.ExecutionContext @@ -137,14 +137,17 @@ class DefaultScheduler(hashedWheelTimer: HashedWheelTimer, log: LoggingAdapter) val continuousCancellable = new ContinuousCancellable continuousCancellable.init( hashedWheelTimer.newTimeout( - new TimerTask with ContinuousScheduling { + new AtomicLong(System.nanoTime + initialDelay.toNanos) with TimerTask with ContinuousScheduling { def run(timeout: HWTimeout) { executor execute new Runnable { override def run = { receiver ! message // Check if the receiver is still alive and kicking before reschedule the task if (receiver.isTerminated) log.debug("Could not reschedule message to be sent because receiving actor {} has been terminated.", receiver) - else scheduleNext(timeout, delay, continuousCancellable) + else { + val driftNanos = System.nanoTime - getAndAdd(delay.toNanos) + scheduleNext(timeout, Duration.fromNanos(Math.max(delay.toNanos - driftNanos, 1)), continuousCancellable) + } } } } @@ -162,11 +165,12 @@ class DefaultScheduler(hashedWheelTimer: HashedWheelTimer, log: LoggingAdapter) val continuousCancellable = new ContinuousCancellable continuousCancellable.init( hashedWheelTimer.newTimeout( - new TimerTask with ContinuousScheduling { + new AtomicLong(System.nanoTime + initialDelay.toNanos) with TimerTask with ContinuousScheduling { override def run(timeout: HWTimeout): Unit = executor.execute(new Runnable { override def run = { runnable.run() - scheduleNext(timeout, delay, continuousCancellable) + val driftNanos = System.nanoTime - getAndAdd(delay.toNanos) + scheduleNext(timeout, Duration.fromNanos(Math.max(delay.toNanos - driftNanos, 1)), continuousCancellable) } }) }, From 64d50f7001df811f9966a5cedbe1fa07470c178e Mon Sep 17 00:00:00 2001 From: Roland Kuhn Date: Sun, 7 Oct 2012 18:48:00 -0700 Subject: [PATCH 011/210] fix link to CLA --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index df9d399f9e..fc929aca31 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,7 +4,7 @@ Greetings traveller! ##Infrastructure## -* [Akka Contributor License Agreement](www.typesafe.com/contribute/cla) +* [Akka Contributor License Agreement](http://www.typesafe.com/contribute/cla) * [Akka Issue Tracker](http://doc.akka.io/docs/akka/current/project/issue-tracking.html) * [Scalariform](https://github.com/mdr/scalariform) From cecde67226ec13e79d503429680cd6a62c34b651 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Mon, 1 Oct 2012 10:02:48 +0200 Subject: [PATCH 012/210] Move heartbeat sending out from ClusterCoreDaemon, see #2284 --- .../scala/akka/cluster/ClusterDaemon.scala | 44 ++-------- .../scala/akka/cluster/ClusterHeartbeat.scala | 88 +++++++++++++++++-- 2 files changed, 86 insertions(+), 46 deletions(-) diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala index 6012c48f45..10bcd9ee6a 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala @@ -155,8 +155,8 @@ private[cluster] final class ClusterDaemon(settings: ClusterSettings) extends Ac withDispatcher(context.props.dispatcher), name = "publisher") val core = context.actorOf(Props(new ClusterCoreDaemon(publisher)). withDispatcher(context.props.dispatcher), name = "core") - context.actorOf(Props[ClusterHeartbeatDaemon]. - withDispatcher(context.props.dispatcher), name = "heartbeat") + context.actorOf(Props[ClusterHeartbeatReceiver]. + withDispatcher(context.props.dispatcher), name = "heartbeatReceiver") if (settings.MetricsEnabled) context.actorOf(Props(new ClusterMetricsCollector(publisher)). withDispatcher(context.props.dispatcher), name = "metrics") @@ -172,26 +172,24 @@ private[cluster] final class ClusterDaemon(settings: ClusterSettings) extends Ac private[cluster] final class ClusterCoreDaemon(publisher: ActorRef) extends Actor with ActorLogging { import ClusterLeaderAction._ import InternalClusterAction._ - import ClusterHeartbeatSender._ + import ClusterHeartbeatSender.JoinInProgress val cluster = Cluster(context.system) import cluster.{ selfAddress, scheduler, failureDetector } import cluster.settings._ val vclockNode = VectorClock.Node(selfAddress.toString) - val selfHeartbeat = Heartbeat(selfAddress) // note that self is not initially member, // and the Gossip is not versioned for this 'Node' yet var latestGossip: Gossip = Gossip() - var joinInProgress: Map[Address, Deadline] = Map.empty var stats = ClusterStats() - val heartbeatSender = context.actorOf(Props[ClusterHeartbeatSender]. - withDispatcher(UseDispatcher), name = "heartbeatSender") val coreSender = context.actorOf(Props[ClusterCoreSender]. withDispatcher(UseDispatcher), name = "coreSender") + val heartbeatSender = context.actorOf(Props[ClusterHeartbeatSender]. + withDispatcher(UseDispatcher), name = "heartbeatSender") import context.dispatcher @@ -201,12 +199,6 @@ private[cluster] final class ClusterCoreDaemon(publisher: ActorRef) extends Acto self ! GossipTick } - // start periodic heartbeat to all nodes in cluster - val heartbeatTask = - FixedRateTask(scheduler, PeriodicTasksInitialDelay.max(HeartbeatInterval).asInstanceOf[FiniteDuration], HeartbeatInterval) { - self ! HeartbeatTick - } - // start periodic cluster failure detector reaping (moving nodes condemned by the failure detector to unreachable list) val failureDetectorReaperTask = FixedRateTask(scheduler, PeriodicTasksInitialDelay.max(UnreachableNodesReaperInterval).asInstanceOf[FiniteDuration], UnreachableNodesReaperInterval) { @@ -232,7 +224,6 @@ private[cluster] final class ClusterCoreDaemon(publisher: ActorRef) extends Acto override def postStop(): Unit = { gossipTask.cancel() - heartbeatTask.cancel() failureDetectorReaperTask.cancel() leaderActionsTask.cancel() publishStatsTask foreach { _.cancel() } @@ -250,7 +241,6 @@ private[cluster] final class ClusterCoreDaemon(publisher: ActorRef) extends Acto case msg: GossipEnvelope ⇒ receiveGossip(msg) case msg: GossipMergeConflict ⇒ receiveGossipMerge(msg) case GossipTick ⇒ gossip() - case HeartbeatTick ⇒ heartbeat() case ReapUnreachableTick ⇒ reapUnreachableMembers() case LeaderActionsTick ⇒ leaderActions() case PublishStatsTick ⇒ publishInternalStats() @@ -293,11 +283,11 @@ private[cluster] final class ClusterCoreDaemon(publisher: ActorRef) extends Acto val localGossip = latestGossip // wipe our state since a node that joins a cluster must be empty latestGossip = Gossip() - joinInProgress = Map(address -> (Deadline.now + JoinTimeout)) // wipe the failure detector since we are starting fresh and shouldn't care about the past failureDetector.reset() + heartbeatSender ! JoinInProgress(address, Deadline.now + JoinTimeout) publish(localGossip) context.become(initialized) @@ -517,12 +507,7 @@ private[cluster] final class ClusterCoreDaemon(publisher: ActorRef) extends Acto else if (remoteGossip.version < localGossip.version) localGossip // local gossip is newer else remoteGossip // remote gossip is newer - val newJoinInProgress = - if (joinInProgress.isEmpty) joinInProgress - else joinInProgress -- winningGossip.members.map(_.address) -- winningGossip.overview.unreachable.map(_.address) - latestGossip = winningGossip seen selfAddress - joinInProgress = newJoinInProgress // for all new joining nodes we remove them from the failure detector (latestGossip.members -- localGossip.members).foreach { @@ -744,27 +729,10 @@ private[cluster] final class ClusterCoreDaemon(publisher: ActorRef) extends Acto } } - def heartbeat(): Unit = { - removeOverdueJoinInProgress() - - val beatTo = latestGossip.members.toSeq.map(_.address) ++ joinInProgress.keys - - val deadline = Deadline.now + HeartbeatInterval - beatTo.foreach { address ⇒ if (address != selfAddress) heartbeatSender ! SendHeartbeat(selfHeartbeat, address, deadline) } - } - - /** - * Removes overdue joinInProgress from State. - */ - def removeOverdueJoinInProgress(): Unit = { - joinInProgress --= joinInProgress collect { case (address, deadline) if deadline.isOverdue ⇒ address } - } - /** * Reaps the unreachable members (moves them to the 'unreachable' list in the cluster overview) according to the failure detector's verdict. */ def reapUnreachableMembers(): Unit = { - if (!isSingletonCluster && isAvailable) { // only scrutinize if we are a non-singleton cluster and available diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala index b48c9f066b..b28542bf24 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala @@ -4,12 +4,14 @@ package akka.cluster import language.postfixOps - +import scala.collection.immutable.SortedSet import akka.actor.{ ReceiveTimeout, ActorLogging, ActorRef, Address, Actor, RootActorPath, Props } import java.security.MessageDigest import akka.pattern.{ CircuitBreaker, CircuitBreakerOpenException } import scala.concurrent.util.duration._ import scala.concurrent.util.Deadline +import scala.concurrent.util.FiniteDuration +import akka.cluster.ClusterEvent._ /** * Sent at regular intervals for failure detection. @@ -19,11 +21,11 @@ case class Heartbeat(from: Address) extends ClusterMessage /** * INTERNAL API. * - * Receives Heartbeat messages and delegates to Cluster. + * Receives Heartbeat messages and updates failure detector. * Instantiated as a single instance for each Cluster - e.g. heartbeats are serialized * to Cluster message after message, but concurrent with other types of messages. */ -private[cluster] final class ClusterHeartbeatDaemon extends Actor with ActorLogging { +private[cluster] final class ClusterHeartbeatReceiver extends Actor with ActorLogging { val failureDetector = Cluster(context.system).failureDetector @@ -38,12 +40,18 @@ private[cluster] final class ClusterHeartbeatDaemon extends Actor with ActorLogg */ private[cluster] object ClusterHeartbeatSender { /** - * - * Command to [akka.cluster.ClusterHeartbeatSender]], which will send [[akka.cluster.Heartbeat]] + * Command to [akka.cluster.ClusterHeartbeatSenderWorker]], which will send [[akka.cluster.Heartbeat]] * to the other node. * Local only, no need to serialize. */ case class SendHeartbeat(heartbeatMsg: Heartbeat, to: Address, deadline: Deadline) + + /** + * Tell [akka.cluster.ClusterHeartbeatSender]] that this node has started joining of + * another node and heartbeats should be sent until it becomes member or deadline is overdue. + * Local only, no need to serialize. + */ + case class JoinInProgress(address: Address, deadline: Deadline) } /* @@ -57,12 +65,39 @@ private[cluster] object ClusterHeartbeatSender { */ private[cluster] final class ClusterHeartbeatSender extends Actor with ActorLogging { import ClusterHeartbeatSender._ + import Member.addressOrdering + import InternalClusterAction.HeartbeatTick + + val cluster = Cluster(context.system) + import cluster.{ selfAddress, scheduler } + import cluster.settings._ + import context.dispatcher + + val selfHeartbeat = Heartbeat(selfAddress) + + var nodes: SortedSet[Address] = SortedSet.empty + var joinInProgress: Map[Address, Deadline] = Map.empty + + // start periodic heartbeat to other nodes in cluster + val heartbeatTask = + FixedRateTask(scheduler, PeriodicTasksInitialDelay.max(HeartbeatInterval).asInstanceOf[FiniteDuration], HeartbeatInterval) { + self ! HeartbeatTick + } + + override def preStart(): Unit = { + cluster.subscribe(self, classOf[MemberEvent]) + } + + override def postStop(): Unit = { + heartbeatTask.cancel() + cluster.unsubscribe(self) + } /** * Looks up and returns the remote cluster heartbeat connection for the specific address. */ def clusterHeartbeatConnectionFor(address: Address): ActorRef = - context.actorFor(RootActorPath(address) / "system" / "cluster" / "heartbeat") + context.actorFor(RootActorPath(address) / "system" / "cluster" / "heartbeatReceiver") val digester = MessageDigest.getInstance("MD5") @@ -76,14 +111,51 @@ private[cluster] final class ClusterHeartbeatSender extends Actor with ActorLogg } def receive = { - case msg @ SendHeartbeat(from, to, deadline) ⇒ + case state: CurrentClusterState ⇒ init(state) + case MemberUnreachable(m) ⇒ removeMember(m) + case MemberRemoved(m) ⇒ removeMember(m) + case e: MemberEvent ⇒ addMember(e.member) + case JoinInProgress(a, d) ⇒ joinInProgress += (a -> d) + case HeartbeatTick ⇒ heartbeat() + } + + def init(state: CurrentClusterState): Unit = { + nodes = state.members.map(_.address) + joinInProgress --= nodes + } + + def addMember(m: Member): Unit = { + nodes += m.address + joinInProgress -= m.address + } + + def removeMember(m: Member): Unit = { + nodes -= m.address + joinInProgress -= m.address + } + + def heartbeat(): Unit = { + removeOverdueJoinInProgress() + + val beatTo = nodes ++ joinInProgress.keys + + val deadline = Deadline.now + HeartbeatInterval + for (to ← beatTo; if to != selfAddress) { val workerName = encodeChildName(to.toString) val worker = context.actorFor(workerName) match { case notFound if notFound.isTerminated ⇒ context.actorOf(Props(new ClusterHeartbeatSenderWorker(clusterHeartbeatConnectionFor(to))), workerName) case child ⇒ child } - worker ! msg + worker ! SendHeartbeat(selfHeartbeat, to, deadline) + } + } + + /** + * Removes overdue joinInProgress from State. + */ + def removeOverdueJoinInProgress(): Unit = { + joinInProgress --= joinInProgress collect { case (address, deadline) if (nodes contains address) || deadline.isOverdue ⇒ address } } } From 7557433491f39f88797c3e869aafc493abba2869 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Mon, 1 Oct 2012 11:15:29 +0200 Subject: [PATCH 013/210] URLEncode heartbeat sender child names * Names can be url encoded now, instead of MD5 --- .../main/scala/akka/cluster/ClusterHeartbeat.scala | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala index b28542bf24..734c923df5 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala @@ -6,12 +6,12 @@ package akka.cluster import language.postfixOps import scala.collection.immutable.SortedSet import akka.actor.{ ReceiveTimeout, ActorLogging, ActorRef, Address, Actor, RootActorPath, Props } -import java.security.MessageDigest import akka.pattern.{ CircuitBreaker, CircuitBreakerOpenException } import scala.concurrent.util.duration._ import scala.concurrent.util.Deadline import scala.concurrent.util.FiniteDuration import akka.cluster.ClusterEvent._ +import java.net.URLEncoder /** * Sent at regular intervals for failure detection. @@ -99,16 +99,10 @@ private[cluster] final class ClusterHeartbeatSender extends Actor with ActorLogg def clusterHeartbeatConnectionFor(address: Address): ActorRef = context.actorFor(RootActorPath(address) / "system" / "cluster" / "heartbeatReceiver") - val digester = MessageDigest.getInstance("MD5") - /** - * Child name is MD5 hash of the address. - * FIXME Change to URLEncode when ticket #2123 has been fixed + * Child name URL encoded target address. */ - def encodeChildName(name: String): String = { - digester update name.getBytes("UTF-8") - digester.digest.map { h ⇒ "%02x".format(0xFF & h) }.mkString - } + def encodeChildName(name: String): String = URLEncoder.encode(name, "UTF-8") def receive = { case state: CurrentClusterState ⇒ init(state) From 3f73705abc7ca77e3f6166b588cb3ac060307c28 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Mon, 1 Oct 2012 14:12:20 +0200 Subject: [PATCH 014/210] Use consistent hash to heartbeat to a few nodes instead of all, see #2284 * Previously heartbeat messages was sent to all other members, i.e. each member was monitored by all other members in the cluster. * This was the number one know scalability bottleneck, due to the number of interconnections. * Limit sending of heartbeats to a few (5) members. Select and re-balance with consistent hashing algorithm when new members are added or removed. * Send a few EndHeartbeat when ending send of Heartbeat messages. --- .gitignore | 1 + .../src/main/resources/reference.conf | 4 + .../src/main/scala/akka/cluster/Cluster.scala | 4 +- .../scala/akka/cluster/ClusterDaemon.scala | 2 +- .../scala/akka/cluster/ClusterHeartbeat.scala | 210 +++++++++++++----- .../scala/akka/cluster/ClusterSettings.scala | 3 + .../scala/akka/cluster/LargeClusterSpec.scala | 6 +- .../akka/cluster/ClusterConfigSpec.scala | 2 + 8 files changed, 172 insertions(+), 60 deletions(-) diff --git a/.gitignore b/.gitignore index f646a4c173..18fb5d762a 100755 --- a/.gitignore +++ b/.gitignore @@ -67,3 +67,4 @@ redis/ beanstalk/ .scalastyle bin/ +.worksheet diff --git a/akka-cluster/src/main/resources/reference.conf b/akka-cluster/src/main/resources/reference.conf index 4347f6c0b0..a1215f4563 100644 --- a/akka-cluster/src/main/resources/reference.conf +++ b/akka-cluster/src/main/resources/reference.conf @@ -78,6 +78,10 @@ akka { # how often should the node send out heartbeats? heartbeat-interval = 1s + # Number of member nodes that each member will send heartbeat messages to, + # i.e. each node will be monitored by this number of other nodes. + monitored-by-nr-of-members = 5 + # defines the failure detector threshold # A low threshold is prone to generate many wrong suspicions but ensures # a quick detection in the event of a real crash. Conversely, a high diff --git a/akka-cluster/src/main/scala/akka/cluster/Cluster.scala b/akka-cluster/src/main/scala/akka/cluster/Cluster.scala index 25b1cd684b..6863b1224e 100644 --- a/akka-cluster/src/main/scala/akka/cluster/Cluster.scala +++ b/akka-cluster/src/main/scala/akka/cluster/Cluster.scala @@ -62,7 +62,7 @@ class Cluster(val system: ExtendedActorSystem) extends Extension { val settings = new ClusterSettings(system.settings.config, system.name) import settings._ - val selfAddress = system.provider match { + val selfAddress: Address = system.provider match { case c: ClusterActorRefProvider ⇒ c.transport.address case other ⇒ throw new ConfigurationException( "ActorSystem [%s] needs to have a 'ClusterActorRefProvider' enabled in the configuration, currently uses [%s]". @@ -74,7 +74,7 @@ class Cluster(val system: ExtendedActorSystem) extends Extension { log.info("Cluster Node [{}] - is starting up...", selfAddress) - val failureDetector = { + val failureDetector: FailureDetector = { import settings.{ FailureDetectorImplementationClass ⇒ fqcn } system.dynamicAccess.createInstanceFor[FailureDetector]( fqcn, Seq(classOf[ActorSystem] -> system, classOf[ClusterSettings] -> settings)).recover({ diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala index 10bcd9ee6a..1b4398feeb 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala @@ -287,8 +287,8 @@ private[cluster] final class ClusterCoreDaemon(publisher: ActorRef) extends Acto // wipe the failure detector since we are starting fresh and shouldn't care about the past failureDetector.reset() - heartbeatSender ! JoinInProgress(address, Deadline.now + JoinTimeout) publish(localGossip) + heartbeatSender ! JoinInProgress(address, Deadline.now + JoinTimeout) context.become(initialized) if (address == selfAddress) diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala index 734c923df5..4e80223dbf 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala @@ -5,18 +5,32 @@ package akka.cluster import language.postfixOps import scala.collection.immutable.SortedSet -import akka.actor.{ ReceiveTimeout, ActorLogging, ActorRef, Address, Actor, RootActorPath, Props } -import akka.pattern.{ CircuitBreaker, CircuitBreakerOpenException } +import scala.annotation.tailrec import scala.concurrent.util.duration._ import scala.concurrent.util.Deadline import scala.concurrent.util.FiniteDuration -import akka.cluster.ClusterEvent._ import java.net.URLEncoder +import akka.actor.{ ActorLogging, ActorRef, Address, Actor, RootActorPath, PoisonPill, Props } +import akka.pattern.{ CircuitBreaker, CircuitBreakerOpenException } +import akka.cluster.ClusterEvent._ +import akka.routing.ConsistentHash /** - * Sent at regular intervals for failure detection. + * INTERNAL API */ -case class Heartbeat(from: Address) extends ClusterMessage +private[akka] object ClusterHeartbeatReceiver { + /** + * Sent at regular intervals for failure detection. + */ + case class Heartbeat(from: Address) extends ClusterMessage + + /** + * Tell failure detector at receiving side that it should + * remove the monitoring, because heartbeats will end from + * this node. + */ + case class EndHeartbeat(from: Address) extends ClusterMessage +} /** * INTERNAL API. @@ -26,11 +40,13 @@ case class Heartbeat(from: Address) extends ClusterMessage * to Cluster message after message, but concurrent with other types of messages. */ private[cluster] final class ClusterHeartbeatReceiver extends Actor with ActorLogging { + import ClusterHeartbeatReceiver._ val failureDetector = Cluster(context.system).failureDetector def receive = { - case Heartbeat(from) ⇒ failureDetector heartbeat from + case Heartbeat(from) ⇒ failureDetector heartbeat from + case EndHeartbeat(from) ⇒ failureDetector remove from } } @@ -39,16 +55,11 @@ private[cluster] final class ClusterHeartbeatReceiver extends Actor with ActorLo * INTERNAL API */ private[cluster] object ClusterHeartbeatSender { - /** - * Command to [akka.cluster.ClusterHeartbeatSenderWorker]], which will send [[akka.cluster.Heartbeat]] - * to the other node. - * Local only, no need to serialize. - */ - case class SendHeartbeat(heartbeatMsg: Heartbeat, to: Address, deadline: Deadline) - /** * Tell [akka.cluster.ClusterHeartbeatSender]] that this node has started joining of - * another node and heartbeats should be sent until it becomes member or deadline is overdue. + * another node and heartbeats should be sent unconditionally until it becomes + * member or deadline is overdue. This is done to be able to detect immediate death + * of the joining node. * Local only, no need to serialize. */ case class JoinInProgress(address: Address, deadline: Deadline) @@ -58,14 +69,17 @@ private[cluster] object ClusterHeartbeatSender { * INTERNAL API * * This actor is responsible for sending the heartbeat messages to - * other nodes. Netty blocks when sending to broken connections. This actor - * isolates sending to different nodes by using child workers for each target + * a few other nodes that will monitor this node. + * + * Netty blocks when sending to broken connections. This actor + * isolates sending to different nodes by using child actors for each target * address and thereby reduce the risk of irregular heartbeats to healty * nodes due to broken connections to other nodes. */ private[cluster] final class ClusterHeartbeatSender extends Actor with ActorLogging { import ClusterHeartbeatSender._ - import Member.addressOrdering + import ClusterHeartbeatSenderConnection._ + import ClusterHeartbeatReceiver._ import InternalClusterAction.HeartbeatTick val cluster = Cluster(context.system) @@ -74,9 +88,14 @@ private[cluster] final class ClusterHeartbeatSender extends Actor with ActorLogg import context.dispatcher val selfHeartbeat = Heartbeat(selfAddress) + val selfEndHeartbeat = EndHeartbeat(selfAddress) + val selfAddressStr = selfAddress.toString - var nodes: SortedSet[Address] = SortedSet.empty - var joinInProgress: Map[Address, Deadline] = Map.empty + var all = Set.empty[Address] + var current = Set.empty[Address] + var ending = Map.empty[Address, Int] + var joinInProgress = Map.empty[Address, Deadline] + var consistentHash = ConsistentHash(Seq.empty[Address], HeartbeatConsistentHashingVirtualNodesFactor) // start periodic heartbeat to other nodes in cluster val heartbeatTask = @@ -99,63 +118,146 @@ private[cluster] final class ClusterHeartbeatSender extends Actor with ActorLogg def clusterHeartbeatConnectionFor(address: Address): ActorRef = context.actorFor(RootActorPath(address) / "system" / "cluster" / "heartbeatReceiver") - /** - * Child name URL encoded target address. - */ - def encodeChildName(name: String): String = URLEncoder.encode(name, "UTF-8") - def receive = { + case HeartbeatTick ⇒ heartbeat() case state: CurrentClusterState ⇒ init(state) case MemberUnreachable(m) ⇒ removeMember(m) case MemberRemoved(m) ⇒ removeMember(m) case e: MemberEvent ⇒ addMember(e.member) - case JoinInProgress(a, d) ⇒ joinInProgress += (a -> d) - case HeartbeatTick ⇒ heartbeat() + case JoinInProgress(a, d) ⇒ addJoinInProgress(a, d) } def init(state: CurrentClusterState): Unit = { - nodes = state.members.map(_.address) - joinInProgress --= nodes + all = state.members.collect { case m if m.address != selfAddress ⇒ m.address } + joinInProgress --= all + consistentHash = ConsistentHash(all, HeartbeatConsistentHashingVirtualNodesFactor) } - def addMember(m: Member): Unit = { - nodes += m.address - joinInProgress -= m.address + def addMember(m: Member): Unit = if (m.address != selfAddress) { + all += m.address + consistentHash = consistentHash :+ m.address + removeJoinInProgress(m.address) + update() } - def removeMember(m: Member): Unit = { - nodes -= m.address - joinInProgress -= m.address + def removeMember(m: Member): Unit = if (m.address != selfAddress) { + all -= m.address + consistentHash = consistentHash :- m.address + removeJoinInProgress(m.address) + update() + } + + def removeJoinInProgress(address: Address): Unit = if (joinInProgress contains address) { + joinInProgress -= address + ending += (address -> 0) + } + + def addJoinInProgress(address: Address, deadline: Deadline): Unit = { + if (address != selfAddress && !all.contains(address)) + joinInProgress += (address -> deadline) } def heartbeat(): Unit = { removeOverdueJoinInProgress() - val beatTo = nodes ++ joinInProgress.keys - - val deadline = Deadline.now + HeartbeatInterval - for (to ← beatTo; if to != selfAddress) { - val workerName = encodeChildName(to.toString) - val worker = context.actorFor(workerName) match { + def connection(to: Address): ActorRef = { + // URL encoded target address as child actor name + val connectionName = URLEncoder.encode(to.toString, "UTF-8") + context.actorFor(connectionName) match { case notFound if notFound.isTerminated ⇒ - context.actorOf(Props(new ClusterHeartbeatSenderWorker(clusterHeartbeatConnectionFor(to))), workerName) + context.actorOf(Props(new ClusterHeartbeatSenderConnection(clusterHeartbeatConnectionFor(to))), connectionName) case child ⇒ child } - worker ! SendHeartbeat(selfHeartbeat, to, deadline) + } + + val deadline = Deadline.now + HeartbeatInterval + (current ++ joinInProgress.keys) foreach { to ⇒ connection(to) ! SendHeartbeat(selfHeartbeat, to, deadline) } + + // When sending heartbeats to a node is stopped a few `EndHeartbeat` messages is + // sent to notify it that no more heartbeats will be sent. + for ((to, count) ← ending) { + val c = connection(to) + c ! SendEndHeartbeat(selfEndHeartbeat, to) + if (count == NumberOfEndHeartbeats) { + ending -= to + c ! PoisonPill + } else { + ending += (to -> (count + 1)) + } } } /** - * Removes overdue joinInProgress from State. + * Update current peers to send heartbeats to, and + * keep track of which nodes to stop sending heartbeats to. + */ + def update(): Unit = { + val previous = current + current = selectPeers + // start ending process for nodes not selected any more + ending ++= (previous -- current).map(_ -> 0) + // abort ending process for nodes that have been selected again + ending --= current + } + + /** + * Select a few peers that heartbeats will be sent to, i.e. that will + * monitor this node. Try to send heartbeats to same nodes as much + * as possible, but re-balance with consistent hashing algorithm when + * new members are added or removed. + */ + def selectPeers: Set[Address] = { + val allSize = all.size + val nrOfPeers = math.min(allSize, MonitoredByNrOfMembers) + // try more if consistentHash results in same node as already selected + val attemptLimit = nrOfPeers * 2 + @tailrec def select(acc: Set[Address], n: Int): Set[Address] = { + if (acc.size == nrOfPeers || n == attemptLimit) acc + else select(acc + consistentHash.nodeFor(selfAddressStr + n), n + 1) + } + if (nrOfPeers >= allSize) all + else select(Set.empty[Address], 0) + } + + /** + * Cleanup overdue joinInProgress, in case a joining node never + * became member, for some reason. */ def removeOverdueJoinInProgress(): Unit = { - joinInProgress --= joinInProgress collect { case (address, deadline) if (nodes contains address) || deadline.isOverdue ⇒ address } + val overdue = joinInProgress collect { case (address, deadline) if deadline.isOverdue ⇒ address } + if (overdue.nonEmpty) { + log.info("Overdue join in progress [{}]", overdue.mkString(", ")) + ending ++= overdue.map(_ -> 0) + joinInProgress --= overdue + } } } /** - * Responsible for sending [[akka.cluster.Heartbeat]] to one specific address. + * INTERNAL API + */ +private[cluster] object ClusterHeartbeatSenderConnection { + import ClusterHeartbeatReceiver._ + + /** + * Command to [akka.cluster.ClusterHeartbeatSenderConnection]], which will send + * [[akka.cluster.ClusterHeartbeatReceiver.Heartbeat]] to the other node. + * Local only, no need to serialize. + */ + case class SendHeartbeat(heartbeatMsg: Heartbeat, to: Address, deadline: Deadline) + + /** + * Command to [akka.cluster.ClusterHeartbeatSenderConnection]], which will send + * [[akka.cluster.ClusterHeartbeatReceiver.EndHeartbeat]] to the other node. + * Local only, no need to serialize. + */ + case class SendEndHeartbeat(endHeartbeatMsg: EndHeartbeat, to: Address) +} + +/** + * Responsible for sending [[akka.cluster.ClusterHeartbeatReceiver.Heartbeat]] + * and [[akka.cluster.ClusterHeartbeatReceiver.EndHeartbeat]] to one specific address. * * Netty blocks when sending to broken connections, and this actor uses * a configurable circuit breaker to reduce connect attempts to broken @@ -163,10 +265,10 @@ private[cluster] final class ClusterHeartbeatSender extends Actor with ActorLogg * * @see ClusterHeartbeatSender */ -private[cluster] final class ClusterHeartbeatSenderWorker(toRef: ActorRef) +private[cluster] final class ClusterHeartbeatSenderConnection(toRef: ActorRef) extends Actor with ActorLogging { - import ClusterHeartbeatSender._ + import ClusterHeartbeatSenderConnection._ val breaker = { val cbSettings = Cluster(context.system).settings.SendCircuitBreakerSettings @@ -177,21 +279,19 @@ private[cluster] final class ClusterHeartbeatSenderWorker(toRef: ActorRef) onClose(log.debug("CircuitBreaker Closed for [{}]", toRef)) } - // make sure it will cleanup when not used any more - context.setReceiveTimeout(30 seconds) - def receive = { case SendHeartbeat(heartbeatMsg, _, deadline) ⇒ if (!deadline.isOverdue) { + log.debug("Cluster Node [{}] - Heartbeat to [{}]", heartbeatMsg.from, toRef) // the CircuitBreaker will measure elapsed time and open if too many long calls try breaker.withSyncCircuitBreaker { - log.debug("Cluster Node [{}] - Heartbeat to [{}]", heartbeatMsg.from, toRef) toRef ! heartbeatMsg - if (deadline.isOverdue) log.debug("Sending heartbeat to [{}] took longer than expected", toRef) } catch { case e: CircuitBreakerOpenException ⇒ /* skip sending heartbeat to broken connection */ } } - - case ReceiveTimeout ⇒ context.stop(self) // cleanup when not used - + if (deadline.isOverdue) log.debug("Sending heartbeat to [{}] took longer than expected", toRef) + case SendEndHeartbeat(endHeartbeatMsg, _) ⇒ + log.debug("Cluster Node [{}] - EndHeartbeat to [{}]", endHeartbeatMsg.from, toRef) + toRef ! endHeartbeatMsg } + } \ No newline at end of file diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala index 6110df034a..38a3f4554c 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala @@ -24,6 +24,9 @@ class ClusterSettings(val config: Config, val systemName: String) { final val FailureDetectorAcceptableHeartbeatPause: FiniteDuration = Duration(getMilliseconds("akka.cluster.failure-detector.acceptable-heartbeat-pause"), MILLISECONDS) final val HeartbeatInterval: FiniteDuration = Duration(getMilliseconds("akka.cluster.failure-detector.heartbeat-interval"), MILLISECONDS) + final val HeartbeatConsistentHashingVirtualNodesFactor = 10 // no need for configuration + final val NumberOfEndHeartbeats: Int = (FailureDetectorAcceptableHeartbeatPause / HeartbeatInterval + 1).toInt + final val MonitoredByNrOfMembers = getInt("akka.cluster.failure-detector.monitored-by-nr-of-members") final val SeedNodes: IndexedSeq[Address] = getStringList("akka.cluster.seed-nodes").asScala.map { case AddressFromURIString(addr) ⇒ addr diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/LargeClusterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/LargeClusterSpec.scala index e5c72e642b..5f1edfc6db 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/LargeClusterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/LargeClusterSpec.scala @@ -42,7 +42,7 @@ object LargeClusterMultiJvmSpec extends MultiNodeConfig { gossip-interval = 500 ms auto-join = off auto-down = on - failure-detector.acceptable-heartbeat-pause = 10s + failure-detector.acceptable-heartbeat-pause = 5s publish-stats-interval = 0 s # always, when it happens } akka.event-handlers = ["akka.testkit.TestEventListener"] @@ -57,7 +57,9 @@ object LargeClusterMultiJvmSpec extends MultiNodeConfig { akka.scheduler.tick-duration = 33 ms akka.remote.log-remote-lifecycle-events = off akka.remote.netty.execution-pool-size = 4 - #akka.remote.netty.reconnection-time-window = 1s + #akka.remote.netty.reconnection-time-window = 10s + akka.remote.netty.read-timeout = 5s + akka.remote.netty.write-timeout = 5s akka.remote.netty.backoff-timeout = 500ms akka.remote.netty.connection-timeout = 500ms diff --git a/akka-cluster/src/test/scala/akka/cluster/ClusterConfigSpec.scala b/akka-cluster/src/test/scala/akka/cluster/ClusterConfigSpec.scala index be5ae74e4d..d83753fb00 100644 --- a/akka-cluster/src/test/scala/akka/cluster/ClusterConfigSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/ClusterConfigSpec.scala @@ -29,6 +29,8 @@ class ClusterConfigSpec extends AkkaSpec { PeriodicTasksInitialDelay must be(1 seconds) GossipInterval must be(1 second) HeartbeatInterval must be(1 second) + NumberOfEndHeartbeats must be(4) + MonitoredByNrOfMembers must be(5) LeaderActionsInterval must be(1 second) UnreachableNodesReaperInterval must be(1 second) PublishStatsInterval must be(10 second) From c63234ca4cbcf63e580ca041d2becd99e834792b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Antonsson?= Date: Mon, 8 Oct 2012 10:52:55 +0200 Subject: [PATCH 015/210] Changes according to review. #2513 --- ...estBase.java => SchedulerPatternTest.java} | 70 ++++++++++--------- .../docs/pattern/SchedulerPatternTest.scala | 9 --- akka-docs/rst/java/howto.rst | 9 ++- .../docs/pattern/SchedulerPatternSpec.scala | 7 +- akka-docs/rst/scala/howto.rst | 5 +- 5 files changed, 50 insertions(+), 50 deletions(-) rename akka-docs/rst/java/code/docs/pattern/{SchedulerPatternTestBase.java => SchedulerPatternTest.java} (76%) delete mode 100644 akka-docs/rst/java/code/docs/pattern/SchedulerPatternTest.scala diff --git a/akka-docs/rst/java/code/docs/pattern/SchedulerPatternTestBase.java b/akka-docs/rst/java/code/docs/pattern/SchedulerPatternTest.java similarity index 76% rename from akka-docs/rst/java/code/docs/pattern/SchedulerPatternTestBase.java rename to akka-docs/rst/java/code/docs/pattern/SchedulerPatternTest.java index b2543bfb19..05546232aa 100644 --- a/akka-docs/rst/java/code/docs/pattern/SchedulerPatternTestBase.java +++ b/akka-docs/rst/java/code/docs/pattern/SchedulerPatternTest.java @@ -8,26 +8,23 @@ import akka.actor.*; import akka.testkit.*; import akka.testkit.TestEvent.Mute; import akka.testkit.TestEvent.UnMute; -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; +import org.junit.*; import scala.concurrent.util.Duration; import scala.concurrent.util.FiniteDuration; import java.util.Arrays; import java.util.concurrent.TimeUnit; -public class SchedulerPatternTestBase { +public class SchedulerPatternTest { - ActorSystem system; + static ActorSystem system; - @Before - public void setUp() { + @BeforeClass + public static void setUp() { system = ActorSystem.create("SchedulerPatternTest", AkkaSpec.testConf()); } - @After - public void tearDown() { + @AfterClass + public static void tearDown() { system.shutdown(); } @@ -38,9 +35,10 @@ public class SchedulerPatternTestBase { private final Cancellable tick = getContext().system().scheduler().schedule( Duration.create(500, TimeUnit.MILLISECONDS), Duration.create(1000, TimeUnit.MILLISECONDS), - getSelf(), "tick", getContext().system().dispatcher()); + getSelf(), "tick", getContext().dispatcher()); //#schedule-constructor - ActorRef target; + // this variable and constructor is declared here to not show up in the docs + final ActorRef target; public ScheduleInConstructor(ActorRef target) { this.target = target; } @@ -75,7 +73,8 @@ public class SchedulerPatternTestBase { //#schedule-receive public class ScheduleInReceive extends UntypedActor { //#schedule-receive - ActorRef target; + // this variable and constructor is declared here to not show up in the docs + final ActorRef target; public ScheduleInReceive(ActorRef target) { this.target = target; } @@ -85,7 +84,7 @@ public class SchedulerPatternTestBase { public void preStart() { getContext().system().scheduler().scheduleOnce( Duration.create(500, TimeUnit.MILLISECONDS), - getSelf(), "tick", getContext().system().dispatcher()); + getSelf(), "tick", getContext().dispatcher()); } // override postRestart so we don't call preStart and schedule a new message @@ -99,7 +98,7 @@ public class SchedulerPatternTestBase { // send another periodic tick after the specified delay getContext().system().scheduler().scheduleOnce( Duration.create(1000, TimeUnit.MILLISECONDS), - getSelf(), "tick", getContext().system().dispatcher()); + getSelf(), "tick", getContext().dispatcher()); // do something useful here //#schedule-receive target.tell(message, getSelf()); @@ -164,26 +163,29 @@ public class SchedulerPatternTestBase { Iterable filter = Arrays.asList(new akka.testkit.EventFilter[]{ (akka.testkit.EventFilter) new ErrorFilter(ArithmeticException.class)}); - system.eventStream().publish(new Mute(filter)); + try { + system.eventStream().publish(new Mute(filter)); - final ActorRef actor = system.actorOf(props); - new Within(startDuration) { - protected void run() { - probe.expectMsgEquals("tick"); - probe.expectMsgEquals("tick"); - probe.expectMsgEquals("tick"); - } - }; - actor.tell("restart", getRef()); - new Within(afterRestartDuration) { - protected void run() { - probe.expectMsgEquals("tick"); - probe.expectMsgEquals("tick"); - } - }; - system.stop(actor); - - system.eventStream().publish(new UnMute(filter)); + final ActorRef actor = system.actorOf(props); + new Within(startDuration) { + protected void run() { + probe.expectMsgEquals("tick"); + probe.expectMsgEquals("tick"); + probe.expectMsgEquals("tick"); + } + }; + actor.tell("restart", getRef()); + new Within(afterRestartDuration) { + protected void run() { + probe.expectMsgEquals("tick"); + probe.expectMsgEquals("tick"); + } + }; + system.stop(actor); + } + finally { + system.eventStream().publish(new UnMute(filter)); + } } } } diff --git a/akka-docs/rst/java/code/docs/pattern/SchedulerPatternTest.scala b/akka-docs/rst/java/code/docs/pattern/SchedulerPatternTest.scala deleted file mode 100644 index d450bbc090..0000000000 --- a/akka-docs/rst/java/code/docs/pattern/SchedulerPatternTest.scala +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (C) 2009-2012 Typesafe Inc. - */ - -package docs.pattern - -import org.scalatest.junit.JUnitSuite - -class SchedulerPatternTest extends SchedulerPatternTestBase with JUnitSuite diff --git a/akka-docs/rst/java/howto.rst b/akka-docs/rst/java/howto.rst index e1f9f1610b..922d318c75 100644 --- a/akka-docs/rst/java/howto.rst +++ b/akka-docs/rst/java/howto.rst @@ -29,9 +29,12 @@ message sends to the same actor. .. note:: - With this approach the scheduler will be restarted with the actor on restarts. + With this approach the scheduled periodic message send will be restarted with the actor on restarts. + This also means that the time period that elapses between two tick messages during a restart may drift + off based on when you restart the scheduled message sends relative to the time that the last message was + sent, and how long the initial delay is. Worst case scenario is ``interval`` plus ``initialDelay``. -.. includecode:: code/docs/pattern/SchedulerPatternTestBase.java#schedule-constructor +.. includecode:: code/docs/pattern/SchedulerPatternTest.java#schedule-constructor The second variant sets up an initial one shot message send in the ``preStart`` method of the actor, and the then the actor when it receives this message sets up a new one shot @@ -43,7 +46,7 @@ and schedule the initial message send again. With this approach we won't fill up the mailbox with tick messages if the actor is under pressure, but only schedule a new tick message when we have seen the previous one. -.. includecode:: code/docs/pattern/SchedulerPatternTestBase.java#schedule-receive +.. includecode:: code/docs/pattern/SchedulerPatternTest.java#schedule-receive Template Pattern ================ diff --git a/akka-docs/rst/scala/code/docs/pattern/SchedulerPatternSpec.scala b/akka-docs/rst/scala/code/docs/pattern/SchedulerPatternSpec.scala index e79d94b2c5..a669cb0bc5 100644 --- a/akka-docs/rst/scala/code/docs/pattern/SchedulerPatternSpec.scala +++ b/akka-docs/rst/scala/code/docs/pattern/SchedulerPatternSpec.scala @@ -15,10 +15,10 @@ import docs.pattern.SchedulerPatternSpec.ScheduleInConstructor object SchedulerPatternSpec { //#schedule-constructor class ScheduleInConstructor extends Actor { - import context._ - - val tick = system.scheduler.schedule(500 millis, 1000 millis, self, "tick") + val tick = + context.system.scheduler.schedule(500 millis, 1000 millis, self, "tick") //#schedule-constructor + // this var and constructor is declared here to not show up in the docs var target: ActorRef = null def this(target: ActorRef) = { this(); this.target = target } //#schedule-constructor @@ -41,6 +41,7 @@ object SchedulerPatternSpec { class ScheduleInReceive extends Actor { import context._ //#schedule-receive + // this var and constructor is declared here to not show up in the docs var target: ActorRef = null def this(target: ActorRef) = { this(); this.target = target } //#schedule-receive diff --git a/akka-docs/rst/scala/howto.rst b/akka-docs/rst/scala/howto.rst index c5203adb1c..dcdebe06db 100644 --- a/akka-docs/rst/scala/howto.rst +++ b/akka-docs/rst/scala/howto.rst @@ -123,7 +123,10 @@ message sends to the same actor. .. note:: - With this approach the scheduler will be restarted with the actor on restarts. + With this approach the scheduled periodic message send will be restarted with the actor on restarts. + This also means that the time period that elapses between two tick messages during a restart may drift + off based on when you restart the scheduled message sends relative to the time that the last message was + sent, and how long the initial delay is. Worst case scenario is ``interval`` plus ``initialDelay``. .. includecode:: code/docs/pattern/SchedulerPatternSpec.scala#schedule-constructor From 1f3341713f97a0191b12981cb49d3e2e3eb8f637 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Mon, 8 Oct 2012 12:17:40 +0200 Subject: [PATCH 016/210] Remove cluster.FixedRateTask, see #2606 --- .../test/scala/akka/actor/SchedulerSpec.scala | 25 ++++++++ .../scala/akka/cluster/ClusterDaemon.scala | 31 ++++------ .../cluster/ClusterMetricsCollector.scala | 10 ++-- .../scala/akka/cluster/FixedRateTask.scala | 58 ------------------- .../akka/cluster/FixedRateTaskSpec.scala | 43 -------------- .../akka/cluster/MetricsCollectorSpec.scala | 2 +- 6 files changed, 41 insertions(+), 128 deletions(-) delete mode 100644 akka-cluster/src/main/scala/akka/cluster/FixedRateTask.scala delete mode 100644 akka-cluster/src/test/scala/akka/cluster/FixedRateTaskSpec.scala diff --git a/akka-actor-tests/src/test/scala/akka/actor/SchedulerSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/SchedulerSpec.scala index 8d1d2fa965..86cde2fb47 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/SchedulerSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/SchedulerSpec.scala @@ -214,5 +214,30 @@ class SchedulerSpec extends AkkaSpec with BeforeAndAfterEach with DefaultTimeout assert(elapsedTimeMs < 2000) // the precision is not ms exact cancellable.cancel() } + + "adjust for scheduler inaccuracy" taggedAs TimingTest in { + val startTime = System.nanoTime + val n = 33 + val latch = new TestLatch(n) + system.scheduler.schedule(150.millis, 150.millis) { + latch.countDown() + } + Await.ready(latch, 6.seconds) + val rate = n * 1000.0 / (System.nanoTime - startTime).nanos.toMillis + rate must be(6.66 plusOrMinus (0.4)) + } + + "not be affected by long running task" taggedAs TimingTest in { + val startTime = System.nanoTime + val n = 22 + val latch = new TestLatch(n) + system.scheduler.schedule(225.millis, 225.millis) { + Thread.sleep(80) + latch.countDown() + } + Await.ready(latch, 6.seconds) + val rate = n * 1000.0 / (System.nanoTime - startTime).nanos.toMillis + rate must be(4.4 plusOrMinus (0.3)) + } } } diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala index 6012c48f45..00d70afb5b 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala @@ -196,35 +196,26 @@ private[cluster] final class ClusterCoreDaemon(publisher: ActorRef) extends Acto import context.dispatcher // start periodic gossip to random nodes in cluster - val gossipTask = - FixedRateTask(scheduler, PeriodicTasksInitialDelay.max(GossipInterval).asInstanceOf[FiniteDuration], GossipInterval) { - self ! GossipTick - } + val gossipTask = scheduler.schedule(PeriodicTasksInitialDelay.max(GossipInterval).asInstanceOf[FiniteDuration], + GossipInterval, self, GossipTick) // start periodic heartbeat to all nodes in cluster - val heartbeatTask = - FixedRateTask(scheduler, PeriodicTasksInitialDelay.max(HeartbeatInterval).asInstanceOf[FiniteDuration], HeartbeatInterval) { - self ! HeartbeatTick - } + val heartbeatTask = scheduler.schedule(PeriodicTasksInitialDelay.max(HeartbeatInterval).asInstanceOf[FiniteDuration], + HeartbeatInterval, self, HeartbeatTick) // start periodic cluster failure detector reaping (moving nodes condemned by the failure detector to unreachable list) - val failureDetectorReaperTask = - FixedRateTask(scheduler, PeriodicTasksInitialDelay.max(UnreachableNodesReaperInterval).asInstanceOf[FiniteDuration], UnreachableNodesReaperInterval) { - self ! ReapUnreachableTick - } + val failureDetectorReaperTask = scheduler.schedule(PeriodicTasksInitialDelay.max(UnreachableNodesReaperInterval).asInstanceOf[FiniteDuration], + UnreachableNodesReaperInterval, self, ReapUnreachableTick) // start periodic leader action management (only applies for the current leader) - private val leaderActionsTask = - FixedRateTask(scheduler, PeriodicTasksInitialDelay.max(LeaderActionsInterval).asInstanceOf[FiniteDuration], LeaderActionsInterval) { - self ! LeaderActionsTick - } + val leaderActionsTask = scheduler.schedule(PeriodicTasksInitialDelay.max(LeaderActionsInterval).asInstanceOf[FiniteDuration], + LeaderActionsInterval, self, LeaderActionsTick) // start periodic publish of current stats - private val publishStatsTask: Option[Cancellable] = + val publishStatsTask: Option[Cancellable] = if (PublishStatsInterval == Duration.Zero) None - else Some(FixedRateTask(scheduler, PeriodicTasksInitialDelay.max(PublishStatsInterval).asInstanceOf[FiniteDuration], PublishStatsInterval) { - self ! PublishStatsTick - }) + else Some(scheduler.schedule(PeriodicTasksInitialDelay.max(PublishStatsInterval).asInstanceOf[FiniteDuration], + PublishStatsInterval, self, PublishStatsTick)) override def preStart(): Unit = { if (AutoJoin) self ! JoinSeedNodes(SeedNodes) diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala index 87bb15450b..7040c322fd 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala @@ -62,16 +62,14 @@ private[cluster] class ClusterMetricsCollector(publisher: ActorRef) extends Acto /** * Start periodic gossip to random nodes in cluster */ - val gossipTask = FixedRateTask(scheduler, PeriodicTasksInitialDelay.max(MetricsGossipInterval).asInstanceOf[FiniteDuration], MetricsGossipInterval) { - self ! GossipTick - } + val gossipTask = scheduler.schedule(PeriodicTasksInitialDelay.max(MetricsGossipInterval).asInstanceOf[FiniteDuration], + MetricsGossipInterval, self, GossipTick) /** * Start periodic metrics collection */ - val metricsTask = FixedRateTask(scheduler, PeriodicTasksInitialDelay.max(MetricsInterval).asInstanceOf[FiniteDuration], MetricsInterval) { - self ! MetricsTick - } + val metricsTask = scheduler.schedule(PeriodicTasksInitialDelay.max(MetricsInterval).asInstanceOf[FiniteDuration], + MetricsInterval, self, MetricsTick) override def preStart(): Unit = { cluster.subscribe(self, classOf[MemberEvent]) diff --git a/akka-cluster/src/main/scala/akka/cluster/FixedRateTask.scala b/akka-cluster/src/main/scala/akka/cluster/FixedRateTask.scala deleted file mode 100644 index 9e6eedf659..0000000000 --- a/akka-cluster/src/main/scala/akka/cluster/FixedRateTask.scala +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright (C) 2009-2012 Typesafe Inc. - */ - -package akka.cluster - -import java.util.concurrent.TimeUnit -import java.util.concurrent.atomic.{ AtomicBoolean, AtomicLong } -import akka.actor.{ Scheduler, Cancellable } -import scala.concurrent.util.Duration -import concurrent.ExecutionContext -import scala.concurrent.util.FiniteDuration - -/** - * INTERNAL API - */ -private[akka] object FixedRateTask { - def apply(scheduler: Scheduler, - initalDelay: FiniteDuration, - delay: FiniteDuration)(f: ⇒ Unit)(implicit executor: ExecutionContext): FixedRateTask = - new FixedRateTask(scheduler, initalDelay, delay, new Runnable { def run(): Unit = f }) -} - -/** - * INTERNAL API - * - * Task to be scheduled periodically at a fixed rate, compensating, on average, - * for inaccuracy in scheduler. It will start when constructed, using the - * initialDelay. - */ -private[akka] class FixedRateTask(scheduler: Scheduler, - initalDelay: FiniteDuration, - delay: FiniteDuration, - task: Runnable)(implicit executor: ExecutionContext) - extends Runnable with Cancellable { - - private val delayNanos = delay.toNanos - private val cancelled = new AtomicBoolean(false) - private val counter = new AtomicLong(0L) - private val startTime = System.nanoTime + initalDelay.toNanos - scheduler.scheduleOnce(initalDelay, this) - - def cancel(): Unit = cancelled.set(true) - - def isCancelled: Boolean = cancelled.get - - override final def run(): Unit = if (!isCancelled) try { - task.run() - } finally if (!isCancelled) { - val nextTime = startTime + delayNanos * counter.incrementAndGet - // it's ok to schedule with negative duration, will run asap - val nextDelay = Duration(nextTime - System.nanoTime, TimeUnit.NANOSECONDS) - try { - scheduler.scheduleOnce(nextDelay, this) - } catch { case e: IllegalStateException ⇒ /* will happen when scheduler is closed, nothing wrong */ } - } - -} diff --git a/akka-cluster/src/test/scala/akka/cluster/FixedRateTaskSpec.scala b/akka-cluster/src/test/scala/akka/cluster/FixedRateTaskSpec.scala deleted file mode 100644 index e6590cf9c3..0000000000 --- a/akka-cluster/src/test/scala/akka/cluster/FixedRateTaskSpec.scala +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (C) 2009-2012 Typesafe Inc. - */ - -package akka.cluster - -import akka.testkit.AkkaSpec -import scala.concurrent.util.duration._ -import akka.testkit.TimingTest -import akka.testkit.TestLatch -import scala.concurrent.Await - -@org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class FixedRateTaskSpec extends AkkaSpec { - import system.dispatcher - "Task scheduled at fixed rate" must { - "adjust for scheduler inaccuracy" taggedAs TimingTest in { - val startTime = System.nanoTime - val n = 33 - val latch = new TestLatch(n) - FixedRateTask(system.scheduler, 150.millis, 150.millis) { - latch.countDown() - } - Await.ready(latch, 6.seconds) - val rate = n * 1000.0 / (System.nanoTime - startTime).nanos.toMillis - rate must be(6.66 plusOrMinus (0.4)) - } - - "compensate for long running task" taggedAs TimingTest in { - val startTime = System.nanoTime - val n = 22 - val latch = new TestLatch(n) - FixedRateTask(system.scheduler, 225.millis, 225.millis) { - Thread.sleep(80) - latch.countDown() - } - Await.ready(latch, 6.seconds) - val rate = n * 1000.0 / (System.nanoTime - startTime).nanos.toMillis - rate must be(4.4 plusOrMinus (0.3)) - } - } -} - diff --git a/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala index 2288279a03..ea881f5a71 100644 --- a/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala @@ -119,7 +119,7 @@ class MetricsCollectorSpec extends AkkaSpec(MetricsEnabledSpec.config) with Impl "collect [" + samples + "] node metrics samples in an acceptable duration" taggedAs LongRunningTest in { val latch = TestLatch(samples) - val task = FixedRateTask(system.scheduler, 0 seconds, interval) { + val task = system.scheduler.schedule(0 seconds, interval) { val sample = collector.sample assertCreatedUninitialized(sample.metrics) assertExpectedSampleSize(collector.isSigar, window, sample) From a4d023e83b5b92c5c6863adb9a9e1502978e2fb5 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Mon, 8 Oct 2012 13:27:34 +0200 Subject: [PATCH 017/210] Test tags should be opt-out and not opt-in, see #2600 * Runs all tests by default * Exclude with -Dakka.test.tags.exclude=long-running,timing --- project/AkkaBuild.scala | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index adf1b3c9d6..6b5c92b162 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -436,11 +436,8 @@ object AkkaBuild extends Build { val excludeTestNames = SettingKey[Seq[String]]("exclude-test-names") val excludeTestTags = SettingKey[Set[String]]("exclude-test-tags") - val includeTestTags = SettingKey[Set[String]]("include-test-tags") val onlyTestTags = SettingKey[Set[String]]("only-test-tags") - val defaultExcludedTags = Set("timing", "long-running") - lazy val defaultMultiJvmOptions: Seq[String] = { import scala.collection.JavaConverters._ val akkaProperties = System.getProperties.propertyNames.asScala.toList.collect { @@ -457,14 +454,7 @@ object AkkaBuild extends Build { // for excluding tests by tag use system property: -Dakka.test.tags.exclude= // note that it will not be used if you specify -Dakka.test.tags.only lazy val useExcludeTestTags: Set[String] = { - if (useOnlyTestTags.isEmpty) defaultExcludedTags ++ systemPropertyAsSeq("akka.test.tags.exclude").toSet - else Set.empty - } - - // for including tests by tag use system property: -Dakka.test.tags.include= - // note that it will not be used if you specify -Dakka.test.tags.only - lazy val useIncludeTestTags: Set[String] = { - if (useOnlyTestTags.isEmpty) systemPropertyAsSeq("akka.test.tags.include").toSet + if (useOnlyTestTags.isEmpty) systemPropertyAsSeq("akka.test.tags.exclude").toSet else Set.empty } @@ -472,8 +462,7 @@ object AkkaBuild extends Build { lazy val useOnlyTestTags: Set[String] = systemPropertyAsSeq("akka.test.tags.only").toSet def executeMultiJvmTests: Boolean = { - useOnlyTestTags.contains("long-running") || - !(useExcludeTestTags -- useIncludeTestTags).contains("long-running") + useOnlyTestTags.contains("long-running") || !useExcludeTestTags.contains("long-running") } def systemPropertyAsSeq(name: String): Seq[String] = { @@ -484,7 +473,7 @@ object AkkaBuild extends Build { val multiNodeEnabled = java.lang.Boolean.getBoolean("akka.test.multi-node") lazy val defaultMultiJvmScalatestOptions: Seq[String] = { - val excludeTags = (useExcludeTestTags -- useIncludeTestTags).toSeq + val excludeTags = useExcludeTestTags.toSeq Seq("-C", "org.scalatest.akka.QuietReporter") ++ (if (excludeTags.isEmpty) Seq.empty else Seq("-l", if (multiNodeEnabled) excludeTags.mkString("\"", " ", "\"") else excludeTags.mkString(" "))) ++ (if (useOnlyTestTags.isEmpty) Seq.empty else Seq("-n", if (multiNodeEnabled) useOnlyTestTags.mkString("\"", " ", "\"") else useOnlyTestTags.mkString(" "))) @@ -515,15 +504,13 @@ object AkkaBuild extends Build { excludeTestNames := useExcludeTestNames, excludeTestTags := useExcludeTestTags, - includeTestTags := useIncludeTestTags, onlyTestTags := useOnlyTestTags, // add filters for tests excluded by name testOptions in Test <++= excludeTestNames map { _.map(exclude => Tests.Filter(test => !test.contains(exclude))) }, - // add arguments for tests excluded by tag - includes override excludes (opposite to scalatest) - testOptions in Test <++= (excludeTestTags, includeTestTags) map { (excludes, includes) => - val tags = (excludes -- includes) + // add arguments for tests excluded by tag + testOptions in Test <++= excludeTestTags map { tags => if (tags.isEmpty) Seq.empty else Seq(Tests.Argument("-l", tags.mkString(" "))) }, From 510a837c48123fe983e2cc53e236be50e002b4c1 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Mon, 8 Oct 2012 15:55:26 +0200 Subject: [PATCH 018/210] Wrong remoteConfig --- project/AkkaBuild.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 6b5c92b162..ff1085c32e 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -51,7 +51,7 @@ object AkkaBuild extends Build { |import scala.concurrent.util.duration._ |import akka.util.Timeout |val config = ConfigFactory.parseString("akka.stdout-loglevel=INFO,akka.loglevel=DEBUG") - |val remoteConfig = ConfigFactory.parseString("akka.remote.netty{port=0,use-dispatcher-for-io=akka.actor.default-dispatcher,execution-pool-size=0},akka.actor.provider=RemoteActorRefProvider").withFallback(config) + |val remoteConfig = ConfigFactory.parseString("akka.remote.netty{port=0,use-dispatcher-for-io=akka.actor.default-dispatcher,execution-pool-size=0},akka.actor.provider=akka.remote.RemoteActorRefProvider").withFallback(config) |var system: ActorSystem = null |implicit def _system = system |def startSystem(remoting: Boolean = false) { system = ActorSystem("repl", if(remoting) remoteConfig else config); println("don’t forget to system.shutdown()!") } From 39bb478b3fab658af39e940aae27b3d87ea60a36 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Mon, 8 Oct 2012 16:45:42 +0200 Subject: [PATCH 019/210] Adjust the failing assert in SingletonClusterSpec, see #2582 --- .../src/multi-jvm/scala/akka/cluster/SingletonClusterSpec.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/SingletonClusterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/SingletonClusterSpec.scala index 1bde3bfd3d..55b44a3c76 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/SingletonClusterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/SingletonClusterSpec.scala @@ -67,7 +67,7 @@ abstract class SingletonClusterSpec(multiNodeConfig: SingletonClusterMultiNodeCo awaitUpConvergence(numberOfMembers = 1, canNotBePartOfMemberRing = Seq(secondAddress), 30.seconds) clusterView.isSingletonCluster must be(true) - assertLeader(first) + awaitCond(clusterView.isLeader) } enterBarrier("after-3") From 59f8210b85c4a5f2eaf88d1bf387ccdbb1cdc554 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Tue, 9 Oct 2012 17:54:54 +0200 Subject: [PATCH 020/210] Incorporate review comments, see #2284 --- .../scala/akka/cluster/ClusterHeartbeat.scala | 14 ++++---- .../scala/akka/cluster/ClusterSettings.scala | 35 ++++++++++++++----- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala index 4e80223dbf..232a890910 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala @@ -103,9 +103,7 @@ private[cluster] final class ClusterHeartbeatSender extends Actor with ActorLogg self ! HeartbeatTick } - override def preStart(): Unit = { - cluster.subscribe(self, classOf[MemberEvent]) - } + override def preStart(): Unit = cluster.subscribe(self, classOf[MemberEvent]) override def postStop(): Unit = { heartbeatTask.cancel() @@ -131,6 +129,7 @@ private[cluster] final class ClusterHeartbeatSender extends Actor with ActorLogg all = state.members.collect { case m if m.address != selfAddress ⇒ m.address } joinInProgress --= all consistentHash = ConsistentHash(all, HeartbeatConsistentHashingVirtualNodesFactor) + update() } def addMember(m: Member): Unit = if (m.address != selfAddress) { @@ -259,11 +258,11 @@ private[cluster] object ClusterHeartbeatSenderConnection { * Responsible for sending [[akka.cluster.ClusterHeartbeatReceiver.Heartbeat]] * and [[akka.cluster.ClusterHeartbeatReceiver.EndHeartbeat]] to one specific address. * - * Netty blocks when sending to broken connections, and this actor uses - * a configurable circuit breaker to reduce connect attempts to broken + * This actor exists only because Netty blocks when sending to broken connections, + * and this actor uses a configurable circuit breaker to reduce connect attempts to broken * connections. * - * @see ClusterHeartbeatSender + * @see akka.cluster.ClusterHeartbeatSender */ private[cluster] final class ClusterHeartbeatSenderConnection(toRef: ActorRef) extends Actor with ActorLogging { @@ -283,7 +282,8 @@ private[cluster] final class ClusterHeartbeatSenderConnection(toRef: ActorRef) case SendHeartbeat(heartbeatMsg, _, deadline) ⇒ if (!deadline.isOverdue) { log.debug("Cluster Node [{}] - Heartbeat to [{}]", heartbeatMsg.from, toRef) - // the CircuitBreaker will measure elapsed time and open if too many long calls + // Netty blocks when sending to broken connections, the CircuitBreaker will + // measure elapsed time and open if too many long calls try breaker.withSyncCircuitBreaker { toRef ! heartbeatMsg } catch { case e: CircuitBreakerOpenException ⇒ /* skip sending heartbeat to broken connection */ } diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala index 38a3f4554c..fa35bc25a8 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala @@ -16,17 +16,34 @@ import scala.concurrent.util.FiniteDuration class ClusterSettings(val config: Config, val systemName: String) { import config._ - final val FailureDetectorThreshold = getDouble("akka.cluster.failure-detector.threshold") - final val FailureDetectorMaxSampleSize = getInt("akka.cluster.failure-detector.max-sample-size") - final val FailureDetectorImplementationClass = getString("akka.cluster.failure-detector.implementation-class") - final val FailureDetectorMinStdDeviation: FiniteDuration = - Duration(getMilliseconds("akka.cluster.failure-detector.min-std-deviation"), MILLISECONDS) - final val FailureDetectorAcceptableHeartbeatPause: FiniteDuration = - Duration(getMilliseconds("akka.cluster.failure-detector.acceptable-heartbeat-pause"), MILLISECONDS) - final val HeartbeatInterval: FiniteDuration = Duration(getMilliseconds("akka.cluster.failure-detector.heartbeat-interval"), MILLISECONDS) + final val FailureDetectorThreshold: Double = { + val x = getDouble("akka.cluster.failure-detector.threshold") + require(x > 0.0, "failure-detector.threshold must be > 0") + x + } + final val FailureDetectorMaxSampleSize: Int = { + val n = getInt("akka.cluster.failure-detector.max-sample-size") + require(n > 0, "failure-detector.max-sample-size must be > 0"); n + } + final val FailureDetectorImplementationClass: String = getString("akka.cluster.failure-detector.implementation-class") + final val FailureDetectorMinStdDeviation: FiniteDuration = { + val d = Duration(getMilliseconds("akka.cluster.failure-detector.min-std-deviation"), MILLISECONDS) + require(d > Duration.Zero, "failure-detector.min-std-deviation must be > 0"); d + } + final val FailureDetectorAcceptableHeartbeatPause: FiniteDuration = { + val d = Duration(getMilliseconds("akka.cluster.failure-detector.acceptable-heartbeat-pause"), MILLISECONDS) + require(d >= Duration.Zero, "failure-detector.acceptable-heartbeat-pause must be >= 0"); d + } + final val HeartbeatInterval: FiniteDuration = { + val d = Duration(getMilliseconds("akka.cluster.failure-detector.heartbeat-interval"), MILLISECONDS) + require(d > Duration.Zero, "failure-detector.heartbeat-interval must be > 0"); d + } final val HeartbeatConsistentHashingVirtualNodesFactor = 10 // no need for configuration final val NumberOfEndHeartbeats: Int = (FailureDetectorAcceptableHeartbeatPause / HeartbeatInterval + 1).toInt - final val MonitoredByNrOfMembers = getInt("akka.cluster.failure-detector.monitored-by-nr-of-members") + final val MonitoredByNrOfMembers: Int = { + val n = getInt("akka.cluster.failure-detector.monitored-by-nr-of-members") + require(n > 0, "failure-detector.monitored-by-nr-of-members must be > 0"); n + } final val SeedNodes: IndexedSeq[Address] = getStringList("akka.cluster.seed-nodes").asScala.map { case AddressFromURIString(addr) ⇒ addr From 66c81e915e818598c1b564b120fb2f6f2f990240 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Wed, 10 Oct 2012 15:23:18 +0200 Subject: [PATCH 021/210] Move state of ClusterHeartbeatSender to separate immutable class, see #2284 --- .../scala/akka/routing/ConsistentHash.scala | 2 +- .../scala/akka/cluster/ClusterHeartbeat.scala | 206 +++++++++++------- .../ClusterHeartbeatSenderStateSpec.scala | 88 ++++++++ 3 files changed, 221 insertions(+), 75 deletions(-) create mode 100644 akka-cluster/src/test/scala/akka/cluster/ClusterHeartbeatSenderStateSpec.scala diff --git a/akka-actor/src/main/scala/akka/routing/ConsistentHash.scala b/akka-actor/src/main/scala/akka/routing/ConsistentHash.scala index 79c31cda33..d3bef92e6c 100644 --- a/akka-actor/src/main/scala/akka/routing/ConsistentHash.scala +++ b/akka-actor/src/main/scala/akka/routing/ConsistentHash.scala @@ -18,7 +18,7 @@ import java.util.Arrays * hash, i.e. make sure it is different for different nodes. * */ -class ConsistentHash[T: ClassTag] private (nodes: SortedMap[Int, T], virtualNodesFactor: Int) { +class ConsistentHash[T: ClassTag] private (nodes: SortedMap[Int, T], val virtualNodesFactor: Int) { import ConsistentHash._ diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala index 561f3c85ba..325e0aae25 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala @@ -89,13 +89,9 @@ private[cluster] final class ClusterHeartbeatSender extends Actor with ActorLogg val selfHeartbeat = Heartbeat(selfAddress) val selfEndHeartbeat = EndHeartbeat(selfAddress) - val selfAddressStr = selfAddress.toString - var all = Set.empty[Address] - var current = Set.empty[Address] - var ending = Map.empty[Address, Int] - var joinInProgress = Map.empty[Address, Deadline] - var consistentHash = ConsistentHash(Seq.empty[Address], HeartbeatConsistentHashingVirtualNodesFactor) + var state = ClusterHeartbeatSenderState.empty(ConsistentHash(Seq.empty[Address], HeartbeatConsistentHashingVirtualNodesFactor), + selfAddress.toString, MonitoredByNrOfMembers) // start periodic heartbeat to other nodes in cluster val heartbeatTask = scheduler.schedule(PeriodicTasksInitialDelay.max(HeartbeatInterval).asInstanceOf[FiniteDuration], @@ -115,47 +111,31 @@ private[cluster] final class ClusterHeartbeatSender extends Actor with ActorLogg context.actorFor(RootActorPath(address) / "system" / "cluster" / "heartbeatReceiver") def receive = { - case HeartbeatTick ⇒ heartbeat() - case state: CurrentClusterState ⇒ init(state) - case MemberUnreachable(m) ⇒ removeMember(m) - case MemberRemoved(m) ⇒ removeMember(m) - case e: MemberEvent ⇒ addMember(e.member) - case JoinInProgress(a, d) ⇒ addJoinInProgress(a, d) + case HeartbeatTick ⇒ heartbeat() + case s: CurrentClusterState ⇒ reset(s) + case MemberUnreachable(m) ⇒ removeMember(m) + case MemberRemoved(m) ⇒ removeMember(m) + case e: MemberEvent ⇒ addMember(e.member) + case JoinInProgress(a, d) ⇒ addJoinInProgress(a, d) } - def init(state: CurrentClusterState): Unit = { - all = state.members.collect { case m if m.address != selfAddress ⇒ m.address } - joinInProgress --= all - consistentHash = ConsistentHash(all, HeartbeatConsistentHashingVirtualNodesFactor) - update() - } + def reset(snapshot: CurrentClusterState): Unit = + state = state.reset(snapshot.members.collect { case m if m.address != selfAddress ⇒ m.address }) - def addMember(m: Member): Unit = if (m.address != selfAddress) { - all += m.address - consistentHash = consistentHash :+ m.address - removeJoinInProgress(m.address) - update() - } + def addMember(m: Member): Unit = if (m.address != selfAddress) + state = state addMember m.address - def removeMember(m: Member): Unit = if (m.address != selfAddress) { - all -= m.address - consistentHash = consistentHash :- m.address - removeJoinInProgress(m.address) - update() - } + def removeMember(m: Member): Unit = if (m.address != selfAddress) + state = state removeMember m.address - def removeJoinInProgress(address: Address): Unit = if (joinInProgress contains address) { - joinInProgress -= address - ending += (address -> 0) - } + def removeJoinInProgress(address: Address): Unit = if (address != selfAddress) + state = state.removeJoinInProgress(address) - def addJoinInProgress(address: Address, deadline: Deadline): Unit = { - if (address != selfAddress && !all.contains(address)) - joinInProgress += (address -> deadline) - } + def addJoinInProgress(address: Address, deadline: Deadline): Unit = if (address != selfAddress) + state = state.addJoinInProgress(address, deadline) def heartbeat(): Unit = { - removeOverdueJoinInProgress() + state = state.removeOverdueJoinInProgress() def connection(to: Address): ActorRef = { // URL encoded target address as child actor name @@ -168,67 +148,145 @@ private[cluster] final class ClusterHeartbeatSender extends Actor with ActorLogg } val deadline = Deadline.now + HeartbeatInterval - (current ++ joinInProgress.keys) foreach { to ⇒ connection(to) ! SendHeartbeat(selfHeartbeat, to, deadline) } + state.active foreach { to ⇒ connection(to) ! SendHeartbeat(selfHeartbeat, to, deadline) } // When sending heartbeats to a node is stopped a few `EndHeartbeat` messages is // sent to notify it that no more heartbeats will be sent. - for ((to, count) ← ending) { + for ((to, count) ← state.ending) { val c = connection(to) c ! SendEndHeartbeat(selfEndHeartbeat, to) if (count == NumberOfEndHeartbeats) { - ending -= to + state = state.removeEnding(to) c ! PoisonPill - } else { - ending += (to -> (count + 1)) - } + } else + state = state.increaseEndingCount(to) } } +} + +/** + * INTERNAL API + */ +private[cluster] object ClusterHeartbeatSenderState { /** - * Update current peers to send heartbeats to, and + * Initial, empty state + */ + def empty(consistentHash: ConsistentHash[Address], selfAddressStr: String, + monitoredByNrOfMembers: Int): ClusterHeartbeatSenderState = + ClusterHeartbeatSenderState(consistentHash, selfAddressStr, monitoredByNrOfMembers) + + /** + * Create a new state based on previous state, and * keep track of which nodes to stop sending heartbeats to. */ - def update(): Unit = { - val previous = current - current = selectPeers + private def apply( + old: ClusterHeartbeatSenderState, + consistentHash: ConsistentHash[Address], + all: Set[Address]): ClusterHeartbeatSenderState = { + + /** + * Select a few peers that heartbeats will be sent to, i.e. that will + * monitor this node. Try to send heartbeats to same nodes as much + * as possible, but re-balance with consistent hashing algorithm when + * new members are added or removed. + */ + def selectPeers: Set[Address] = { + val allSize = all.size + val nrOfPeers = math.min(allSize, old.monitoredByNrOfMembers) + // try more if consistentHash results in same node as already selected + val attemptLimit = nrOfPeers * 2 + @tailrec def select(acc: Set[Address], n: Int): Set[Address] = { + if (acc.size == nrOfPeers || n == attemptLimit) acc + else select(acc + consistentHash.nodeFor(old.selfAddressStr + n), n + 1) + } + if (nrOfPeers >= allSize) all + else select(Set.empty[Address], 0) + } + + val curr = selectPeers // start ending process for nodes not selected any more - ending ++= (previous -- current).map(_ -> 0) // abort ending process for nodes that have been selected again - ending --= current + val end = old.ending ++ (old.current -- curr).map(_ -> 0) -- curr + old.copy(consistentHash = consistentHash, all = all, current = curr, ending = end, + joinInProgress = old.joinInProgress -- all) } - /** - * Select a few peers that heartbeats will be sent to, i.e. that will - * monitor this node. Try to send heartbeats to same nodes as much - * as possible, but re-balance with consistent hashing algorithm when - * new members are added or removed. - */ - def selectPeers: Set[Address] = { - val allSize = all.size - val nrOfPeers = math.min(allSize, MonitoredByNrOfMembers) - // try more if consistentHash results in same node as already selected - val attemptLimit = nrOfPeers * 2 - @tailrec def select(acc: Set[Address], n: Int): Set[Address] = { - if (acc.size == nrOfPeers || n == attemptLimit) acc - else select(acc + consistentHash.nodeFor(selfAddressStr + n), n + 1) - } - if (nrOfPeers >= allSize) all - else select(Set.empty[Address], 0) +} + +/** + * INTERNAL API + * + * State used by [akka.cluster.ClusterHeartbeatSender]. + * The initial state is created with `empty` in the of + * the companion object, thereafter the state is modified + * with the methods, such as `addMember`. It is immutable, + * i.e. the methods return new instances. + */ +private[cluster] case class ClusterHeartbeatSenderState private ( + consistentHash: ConsistentHash[Address], + selfAddressStr: String, + monitoredByNrOfMembers: Int, + all: Set[Address] = Set.empty, + current: Set[Address] = Set.empty, + ending: Map[Address, Int] = Map.empty, + joinInProgress: Map[Address, Deadline] = Map.empty) { + + // FIXME can be disabled as optimization + assertInvariants + + private def assertInvariants: Unit = { + val currentAndEnding = current.intersect(ending.keySet) + require(currentAndEnding.isEmpty, + "Same nodes in current and ending not allowed, got [%s]" format currentAndEnding) + val joinInProgressAndAll = joinInProgress.keySet.intersect(all) + require(joinInProgressAndAll.isEmpty, + "Same nodes in joinInProgress and all not allowed, got [%s]" format joinInProgressAndAll) + val currentNotInAll = current -- all + require(currentNotInAll.isEmpty, + "Nodes in current but not in all not allowed, got [%s]" format currentNotInAll) + require(all.isEmpty == consistentHash.isEmpty, "ConsistentHash doesn't correspond to all nodes [%s]" + format all) + } + + val active: Set[Address] = current ++ joinInProgress.keySet + + def reset(nodes: Set[Address]): ClusterHeartbeatSenderState = + ClusterHeartbeatSenderState(this, consistentHash = ConsistentHash(nodes, consistentHash.virtualNodesFactor), + all = nodes) + + def addMember(a: Address): ClusterHeartbeatSenderState = + ClusterHeartbeatSenderState(this, all = all + a, consistentHash = consistentHash :+ a) + + def removeMember(a: Address): ClusterHeartbeatSenderState = + ClusterHeartbeatSenderState(this, all = all - a, consistentHash = consistentHash :- a) + + def removeJoinInProgress(address: Address): ClusterHeartbeatSenderState = { + if (joinInProgress contains address) + copy(joinInProgress = joinInProgress - address, ending = ending + (address -> 0)) + else this + } + + def addJoinInProgress(address: Address, deadline: Deadline): ClusterHeartbeatSenderState = { + if (all contains address) this + else copy(joinInProgress = joinInProgress + (address -> deadline)) } /** * Cleanup overdue joinInProgress, in case a joining node never * became member, for some reason. */ - def removeOverdueJoinInProgress(): Unit = { + def removeOverdueJoinInProgress(): ClusterHeartbeatSenderState = { val overdue = joinInProgress collect { case (address, deadline) if deadline.isOverdue ⇒ address } - if (overdue.nonEmpty) { - log.info("Overdue join in progress [{}]", overdue.mkString(", ")) - ending ++= overdue.map(_ -> 0) - joinInProgress --= overdue - } + if (overdue.isEmpty) this + else + copy(ending = ending ++ overdue.map(_ -> 0), joinInProgress = joinInProgress -- overdue) } + def removeEnding(a: Address): ClusterHeartbeatSenderState = copy(ending = ending - a) + + def increaseEndingCount(a: Address): ClusterHeartbeatSenderState = copy(ending = ending + (a -> (ending(a) + 1))) + } /** diff --git a/akka-cluster/src/test/scala/akka/cluster/ClusterHeartbeatSenderStateSpec.scala b/akka-cluster/src/test/scala/akka/cluster/ClusterHeartbeatSenderStateSpec.scala new file mode 100644 index 0000000000..bd378ed0fe --- /dev/null +++ b/akka-cluster/src/test/scala/akka/cluster/ClusterHeartbeatSenderStateSpec.scala @@ -0,0 +1,88 @@ +/** + * Copyright (C) 2009-2012 Typesafe Inc. + */ + +package akka.cluster + +import org.scalatest.WordSpec +import org.scalatest.matchers.MustMatchers +import akka.actor.Address +import akka.routing.ConsistentHash +import scala.concurrent.util.Deadline +import scala.concurrent.util.duration._ + +@org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) +class ClusterHeartbeatSenderStateSpec extends WordSpec with MustMatchers { + + val selfAddress = Address("akka", "sys", "myself", 2552) + val aa = Address("akka", "sys", "aa", 2552) + val bb = Address("akka", "sys", "bb", 2552) + val cc = Address("akka", "sys", "cc", 2552) + val dd = Address("akka", "sys", "dd", 2552) + val ee = Address("akka", "sys", "ee", 2552) + + val emptyState = ClusterHeartbeatSenderState.empty(ConsistentHash(Seq.empty[Address], 10), + selfAddress.toString, 3) + + "A ClusterHeartbeatSenderState" must { + + "return empty active set when no nodes" in { + emptyState.active.isEmpty must be(true) + } + + "include joinInProgress in active set" in { + val s = emptyState.addJoinInProgress(aa, Deadline.now + 30.seconds) + s.joinInProgress.keySet must be(Set(aa)) + s.active must be(Set(aa)) + } + + "remove joinInProgress from active set after removeOverdueJoinInProgress" in { + val s = emptyState.addJoinInProgress(aa, Deadline.now - 30.seconds).removeOverdueJoinInProgress() + s.joinInProgress must be(Map.empty) + s.active must be(Set.empty) + } + + "remove joinInProgress after reset" in { + val s = emptyState.addJoinInProgress(aa, Deadline.now - 30.seconds).reset(Set(aa, bb)) + s.joinInProgress must be(Map.empty) + } + + "include nodes from reset in active set" in { + val nodes = Set(aa, bb, cc) + val s = emptyState.reset(nodes) + s.all must be(nodes) + s.current must be(nodes) + s.ending must be(Map.empty) + s.active must be(nodes) + } + + "limit current nodes to monitoredByNrOfMembers when adding members" in { + val nodes = Set(aa, bb, cc, dd) + val s = nodes.foldLeft(emptyState) { _ addMember _ } + s.all must be(nodes) + s.current.size must be(3) + s.addMember(ee).current.size must be(3) + } + + "move meber to ending set when removing member" in { + val nodes = Set(aa, bb, cc, dd, ee) + val s = emptyState.reset(nodes) + s.ending must be(Map.empty) + val included = s.current.head + val s2 = s.removeMember(included) + s2.ending must be(Map(included -> 0)) + s2.current must not contain (included) + val s3 = s2.addMember(included) + s3.current must contain(included) + s3.ending.keySet must not contain (included) + } + + "increase ending count correctly" in { + val s = emptyState.reset(Set(aa)).removeMember(aa) + s.ending must be(Map(aa -> 0)) + val s2 = s.increaseEndingCount(aa).increaseEndingCount(aa) + s2.ending must be(Map(aa -> 2)) + } + + } +} From 6f70624ddd818673ae2b262d1491168411946959 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Wed, 10 Oct 2012 16:45:58 +0200 Subject: [PATCH 022/210] Diagnostics for failing test, see #2583 --- .../akka/cluster/LeaderElectionSpec.scala | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderElectionSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderElectionSpec.scala index 8c2198dd7b..b16102e398 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderElectionSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderElectionSpec.scala @@ -16,7 +16,7 @@ case class LeaderElectionMultiNodeConfig(failureDetectorPuppet: Boolean) extends val third = role("third") val fourth = role("fourth") - commonConfig(debugConfig(on = false).withFallback(MultiNodeClusterSpec.clusterConfig(failureDetectorPuppet))) + commonConfig(debugConfig(on = true).withFallback(MultiNodeClusterSpec.clusterConfig(failureDetectorPuppet))) } class LeaderElectionWithFailureDetectorPuppetMultiJvmNode1 extends LeaderElectionSpec(failureDetectorPuppet = true) @@ -61,38 +61,38 @@ abstract class LeaderElectionSpec(multiNodeConfig: LeaderElectionMultiNodeConfig val leader = currentRoles.head val aUser = currentRoles.last val remainingRoles = currentRoles.tail + val n = "-" + (alreadyShutdown + 1) myself match { case `controller` ⇒ val leaderAddress = address(leader) - enterBarrier("before-shutdown") + enterBarrier("before-shutdown" + n) testConductor.shutdown(leader, 0) - enterBarrier("after-shutdown", "after-down", "completed") - markNodeAsUnavailable(leaderAddress) + enterBarrier("after-shutdown" + n, "after-down" + n, "completed" + n) case `leader` ⇒ - enterBarrier("before-shutdown", "after-shutdown") + enterBarrier("before-shutdown" + n, "after-shutdown" + n) // this node will be shutdown by the controller and doesn't participate in more barriers case `aUser` ⇒ val leaderAddress = address(leader) - enterBarrier("before-shutdown", "after-shutdown") + enterBarrier("before-shutdown" + n, "after-shutdown" + n) // user marks the shutdown leader as DOWN cluster.down(leaderAddress) - enterBarrier("after-down", "completed") + enterBarrier("after-down" + n, "completed" + n) markNodeAsUnavailable(leaderAddress) case _ if remainingRoles.contains(myself) ⇒ // remaining cluster nodes, not shutdown - enterBarrier("before-shutdown", "after-shutdown", "after-down") + enterBarrier("before-shutdown" + n, "after-shutdown" + n, "after-down" + n) awaitUpConvergence(currentRoles.size - 1) val nextExpectedLeader = remainingRoles.head clusterView.isLeader must be(myself == nextExpectedLeader) assertLeaderIn(remainingRoles) - enterBarrier("completed") + enterBarrier("completed" + n) } } From 24c115547d43c2aa142324214c308480a7c7043b Mon Sep 17 00:00:00 2001 From: Helena Edelson Date: Wed, 10 Oct 2012 09:58:18 -0600 Subject: [PATCH 023/210] 2609 Typo in method name for ClusterRouteeProvider --- .../main/scala/akka/cluster/routing/ClusterRouterConfig.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala b/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala index 52a9a55e21..eaaaa2c4a5 100644 --- a/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala +++ b/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala @@ -196,7 +196,7 @@ private[akka] class ClusterRouteeProvider( private def selectDeploymentTarget: Option[Address] = { val currentRoutees = routees - val currentNodes = availbleNodes + val currentNodes = availableNodes if (currentNodes.isEmpty || currentRoutees.size >= settings.totalInstances) { None } else { @@ -222,7 +222,7 @@ private[akka] class ClusterRouteeProvider( case a ⇒ a } - private[routing] def availbleNodes: SortedSet[Address] = { + private[routing] def availableNodes: SortedSet[Address] = { import Member.addressOrdering val currentNodes = nodes if (currentNodes.isEmpty && settings.allowLocalRoutees) From 61481da6cd57cdd794094a4b8f89c287dcee0286 Mon Sep 17 00:00:00 2001 From: Helena Edelson Date: Wed, 10 Oct 2012 10:05:41 -0600 Subject: [PATCH 024/210] 2609 Fixed more 'available' typos in ClusterRouteeProvider --- .../scala/akka/cluster/routing/ClusterRouterConfig.scala | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala b/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala index eaaaa2c4a5..bdbb1297fb 100644 --- a/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala +++ b/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala @@ -236,11 +236,11 @@ private[akka] class ClusterRouteeProvider( private[routing] var nodes: SortedSet[Address] = { import Member.addressOrdering cluster.readView.members.collect { - case m if isAvailble(m) ⇒ m.address + case m if isAvailable(m) ⇒ m.address } } - private[routing] def isAvailble(m: Member): Boolean = { + private[routing] def isAvailable(m: Member): Boolean = { m.status == MemberStatus.Up && (settings.allowLocalRoutees || m.address != cluster.selfAddress) } @@ -271,10 +271,10 @@ private[akka] class ClusterRouterActor extends Router { override def routerReceive: Receive = { case s: CurrentClusterState ⇒ import Member.addressOrdering - routeeProvider.nodes = s.members.collect { case m if routeeProvider.isAvailble(m) ⇒ m.address } + routeeProvider.nodes = s.members.collect { case m if routeeProvider.isAvailable(m) ⇒ m.address } routeeProvider.createRoutees() - case m: MemberEvent if routeeProvider.isAvailble(m.member) ⇒ + case m: MemberEvent if routeeProvider.isAvailable(m.member) ⇒ routeeProvider.nodes += m.member.address // createRoutees will create routees based on // totalInstances and maxInstancesPerNode From 279fd2b6ef4a5d8aef16f7f0dd2d188b9b378a1c Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Wed, 10 Oct 2012 18:13:08 +0200 Subject: [PATCH 025/210] Fix bug introduced in refactoring, see #2284 --- .../scala/akka/cluster/ClusterHeartbeat.scala | 17 ++++++-------- .../ClusterHeartbeatSenderStateSpec.scala | 22 ++++++++++++++++++- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala index 325e0aae25..fef88ece20 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala @@ -128,9 +128,6 @@ private[cluster] final class ClusterHeartbeatSender extends Actor with ActorLogg def removeMember(m: Member): Unit = if (m.address != selfAddress) state = state removeMember m.address - def removeJoinInProgress(address: Address): Unit = if (address != selfAddress) - state = state.removeJoinInProgress(address) - def addJoinInProgress(address: Address, deadline: Deadline): Unit = if (address != selfAddress) state = state.addJoinInProgress(address, deadline) @@ -208,8 +205,7 @@ private[cluster] object ClusterHeartbeatSenderState { // start ending process for nodes not selected any more // abort ending process for nodes that have been selected again val end = old.ending ++ (old.current -- curr).map(_ -> 0) -- curr - old.copy(consistentHash = consistentHash, all = all, current = curr, ending = end, - joinInProgress = old.joinInProgress -- all) + old.copy(consistentHash = consistentHash, all = all, current = curr, ending = end) } } @@ -252,16 +248,17 @@ private[cluster] case class ClusterHeartbeatSenderState private ( val active: Set[Address] = current ++ joinInProgress.keySet def reset(nodes: Set[Address]): ClusterHeartbeatSenderState = - ClusterHeartbeatSenderState(this, consistentHash = ConsistentHash(nodes, consistentHash.virtualNodesFactor), + ClusterHeartbeatSenderState(nodes.foldLeft(this) { _ removeJoinInProgress _ }, + consistentHash = ConsistentHash(nodes, consistentHash.virtualNodesFactor), all = nodes) def addMember(a: Address): ClusterHeartbeatSenderState = - ClusterHeartbeatSenderState(this, all = all + a, consistentHash = consistentHash :+ a) + ClusterHeartbeatSenderState(removeJoinInProgress(a), all = all + a, consistentHash = consistentHash :+ a) def removeMember(a: Address): ClusterHeartbeatSenderState = - ClusterHeartbeatSenderState(this, all = all - a, consistentHash = consistentHash :- a) + ClusterHeartbeatSenderState(removeJoinInProgress(a), all = all - a, consistentHash = consistentHash :- a) - def removeJoinInProgress(address: Address): ClusterHeartbeatSenderState = { + private def removeJoinInProgress(address: Address): ClusterHeartbeatSenderState = { if (joinInProgress contains address) copy(joinInProgress = joinInProgress - address, ending = ending + (address -> 0)) else this @@ -269,7 +266,7 @@ private[cluster] case class ClusterHeartbeatSenderState private ( def addJoinInProgress(address: Address, deadline: Deadline): ClusterHeartbeatSenderState = { if (all contains address) this - else copy(joinInProgress = joinInProgress + (address -> deadline)) + else copy(joinInProgress = joinInProgress + (address -> deadline), ending = ending - address) } /** diff --git a/akka-cluster/src/test/scala/akka/cluster/ClusterHeartbeatSenderStateSpec.scala b/akka-cluster/src/test/scala/akka/cluster/ClusterHeartbeatSenderStateSpec.scala index bd378ed0fe..3850524c24 100644 --- a/akka-cluster/src/test/scala/akka/cluster/ClusterHeartbeatSenderStateSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/ClusterHeartbeatSenderStateSpec.scala @@ -40,13 +40,33 @@ class ClusterHeartbeatSenderStateSpec extends WordSpec with MustMatchers { val s = emptyState.addJoinInProgress(aa, Deadline.now - 30.seconds).removeOverdueJoinInProgress() s.joinInProgress must be(Map.empty) s.active must be(Set.empty) + s.ending must be(Map(aa -> 0)) } "remove joinInProgress after reset" in { - val s = emptyState.addJoinInProgress(aa, Deadline.now - 30.seconds).reset(Set(aa, bb)) + val s = emptyState.addJoinInProgress(aa, Deadline.now + 30.seconds).reset(Set(aa, bb)) s.joinInProgress must be(Map.empty) } + "remove joinInProgress after addMember" in { + val s = emptyState.addJoinInProgress(aa, Deadline.now + 30.seconds).addMember(aa) + s.joinInProgress must be(Map.empty) + } + + "remove joinInProgress after removeMember" in { + val s = emptyState.addJoinInProgress(aa, Deadline.now + 30.seconds).reset(Set(aa, bb)).removeMember(aa) + s.joinInProgress must be(Map.empty) + s.ending must be(Map(aa -> 0)) + } + + "remove from ending after addJoinInProgress" in { + val s = emptyState.reset(Set(aa, bb)).removeMember(aa) + s.ending must be(Map(aa -> 0)) + val s2 = s.addJoinInProgress(aa, Deadline.now + 30.seconds) + s2.joinInProgress.keySet must be(Set(aa)) + s2.ending must be(Map.empty) + } + "include nodes from reset in active set" in { val nodes = Set(aa, bb, cc) val s = emptyState.reset(nodes) From 6b6eeb22ba2cf44aa2c5c6ce4146d67529be5104 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Antonsson?= Date: Wed, 10 Oct 2012 14:19:15 +0200 Subject: [PATCH 026/210] Start actor after it can be resolved with actorFor. #2575 --- .../src/main/scala/akka/actor/ActorRef.scala | 13 ++++++++++++- .../main/scala/akka/actor/ActorRefProvider.scala | 2 ++ .../scala/akka/actor/RepointableActorRef.scala | 4 +++- .../main/scala/akka/actor/dungeon/Children.scala | 2 +- .../main/scala/akka/actor/dungeon/Dispatch.scala | 14 +++++++++----- .../src/main/scala/akka/routing/Routing.scala | 2 +- .../scala/akka/remote/RemoteActorRefProvider.scala | 2 ++ .../src/main/scala/akka/testkit/TestActorRef.scala | 3 +++ 8 files changed, 33 insertions(+), 9 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorRef.scala b/akka-actor/src/main/scala/akka/actor/ActorRef.scala index d7d971837c..80ed2bbca5 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRef.scala @@ -194,6 +194,7 @@ private[akka] abstract class InternalActorRef extends ActorRef with ScalaActorRe /* * Actor life-cycle management, invoked only internally (in response to user requests via ActorContext). */ + def start(): ActorRef def resume(causedByFailure: Throwable): Unit def suspend(): Unit def restart(cause: Throwable): Unit @@ -265,11 +266,15 @@ private[akka] class LocalActorRef private[akka] ( * that is reached). */ private val actorCell: ActorCell = newActorCell(_system, this, _props, _supervisor) - actorCell.start(sendSupervise = true, ThreadLocalRandom.current.nextInt()) + actorCell.init(ThreadLocalRandom.current.nextInt(), sendSupervise = true) + if (actorCellShouldStart) + actorCell.start() protected def newActorCell(system: ActorSystemImpl, ref: InternalActorRef, props: Props, supervisor: InternalActorRef): ActorCell = new ActorCell(system, ref, props, supervisor) + protected def actorCellShouldStart(): Boolean = false + protected def actorContext: ActorContext = actorCell /** @@ -279,6 +284,11 @@ private[akka] class LocalActorRef private[akka] ( */ override def isTerminated: Boolean = actorCell.isTerminated + override def start(): ActorRef = { + actorCell.start() + this + } + /** * Suspends the actor so that it will not process messages until resumed. The * suspend request is processed asynchronously to the caller of this method @@ -390,6 +400,7 @@ private[akka] trait MinimalActorRef extends InternalActorRef with LocalRef { override def getParent: InternalActorRef = Nobody override def getChild(names: Iterator[String]): InternalActorRef = if (names.forall(_.isEmpty)) this else Nobody + override def start(): ActorRef = this override def suspend(): Unit = () override def resume(causedByFailure: Throwable): Unit = () override def stop(): Unit = () diff --git a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala index f1a4a0d141..8fa84b2978 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala @@ -516,6 +516,7 @@ class LocalActorRefProvider( cell.reserveChild("user") val ref = new LocalActorRef(system, Props(new Guardian(guardianStrategy)), rootGuardian, rootPath / "user") cell.initChild(ref) + ref.start() ref } @@ -524,6 +525,7 @@ class LocalActorRefProvider( cell.reserveChild("system") val ref = new LocalActorRef(system, Props(new SystemGuardian(systemGuardianStrategy)), rootGuardian, rootPath / "system") cell.initChild(ref) + ref.start() ref } diff --git a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala index 142cdc4dc4..03c66ec12e 100644 --- a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala @@ -79,7 +79,9 @@ private[akka] class RepointableActorRef( */ def newCell(old: Cell): Cell = new ActorCell(system, this, props, supervisor) - .start(sendSupervise = false, old.asInstanceOf[UnstartedCell].uid) + .init(old.asInstanceOf[UnstartedCell].uid, sendSupervise = false).start() + + def start(): ActorRef = this def suspend(): Unit = underlying.suspend() diff --git a/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala b/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala index 85dfd7095a..63d312fa8d 100644 --- a/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala +++ b/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala @@ -192,7 +192,7 @@ private[akka] trait Children { this: ActorCell ⇒ // mailbox==null during RoutedActorCell constructor, where suspends are queued otherwise if (mailbox ne null) for (_ ← 1 to mailbox.suspendCount) actor.suspend() initChild(actor) - actor + actor.start() } } diff --git a/akka-actor/src/main/scala/akka/actor/dungeon/Dispatch.scala b/akka-actor/src/main/scala/akka/actor/dungeon/Dispatch.scala index 1b9476acb1..aefd2bcc55 100644 --- a/akka-actor/src/main/scala/akka/actor/dungeon/Dispatch.scala +++ b/akka-actor/src/main/scala/akka/actor/dungeon/Dispatch.scala @@ -38,12 +38,11 @@ private[akka] trait Dispatch { this: ActorCell ⇒ final def isTerminated: Boolean = mailbox.isClosed /** - * Start this cell, i.e. attach it to the dispatcher. The UID must reasonably - * be different from the previous UID of a possible actor with the same path, + * Initialize this cell, i.e. set up mailboxes and supervision. The UID must be + * reasonably different from the previous UID of a possible actor with the same path, * which can be achieved by using ThreadLocalRandom.current.nextInt(). */ - final def start(sendSupervise: Boolean, uid: Int): this.type = { - + final def init(uid: Int, sendSupervise: Boolean): this.type = { /* * Create the mailbox and enqueue the Create() message to ensure that * this is processed before anything else. @@ -59,10 +58,15 @@ private[akka] trait Dispatch { this: ActorCell ⇒ parent.sendSystemMessage(akka.dispatch.Supervise(self, uid)) parent ! NullMessage // read ScalaDoc of NullMessage to see why } + this + } + /** + * Start this cell, i.e. attach it to the dispatcher. + */ + final def start(): this.type = { // This call is expected to start off the actor by scheduling its mailbox. dispatcher.attach(this) - this } diff --git a/akka-actor/src/main/scala/akka/routing/Routing.scala b/akka-actor/src/main/scala/akka/routing/Routing.scala index 8fcff84831..54b89d3f81 100644 --- a/akka-actor/src/main/scala/akka/routing/Routing.scala +++ b/akka-actor/src/main/scala/akka/routing/Routing.scala @@ -71,7 +71,7 @@ private[akka] class RoutedActorCell(_system: ActorSystemImpl, _ref: InternalActo r } - start(sendSupervise = false, _uid) + init(_uid, sendSupervise = false).start() /* * end of construction diff --git a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala index 4e1921a960..3f13f39f75 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala @@ -243,6 +243,8 @@ private[akka] class RemoteActorRef private[akka] ( provider.deadLetters ! message } + def start(): ActorRef = this + def suspend(): Unit = sendSystemMessage(Suspend()) def resume(causedByFailure: Throwable): Unit = sendSystemMessage(Resume(causedByFailure)) diff --git a/akka-testkit/src/main/scala/akka/testkit/TestActorRef.scala b/akka-testkit/src/main/scala/akka/testkit/TestActorRef.scala index e113a8596c..ee24286cb7 100644 --- a/akka-testkit/src/main/scala/akka/testkit/TestActorRef.scala +++ b/akka-testkit/src/main/scala/akka/testkit/TestActorRef.scala @@ -54,6 +54,9 @@ class TestActorRef[T <: Actor]( } } + // we need to start ourselves since the creation of an actor has been split into initialization and starting + override def actorCellShouldStart(): Boolean = true + /** * Directly inject messages into actor receive behavior. Any exceptions * thrown will be available to you, while still being able to use From b965011a132418280a0b5db462c6c998928a0a95 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Thu, 11 Oct 2012 09:26:09 +0200 Subject: [PATCH 027/210] config lib 0.6.0 --- project/AkkaBuild.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index ff1085c32e..00ea3b26a8 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -696,7 +696,7 @@ object Dependencies { object Dependency { // Compile val camelCore = "org.apache.camel" % "camel-core" % "2.10.0" exclude("org.slf4j", "slf4j-api") // ApacheV2 - val config = "com.typesafe" % "config" % "0.5.2" // ApacheV2 + val config = "com.typesafe" % "config" % "0.6.0" // ApacheV2 val netty = "io.netty" % "netty" % "3.5.4.Final" // ApacheV2 val protobuf = "com.google.protobuf" % "protobuf-java" % "2.4.1" // New BSD val scalaStm = "org.scala-tools" % "scala-stm" % "0.6" cross CrossVersion.full // Modified BSD (Scala) From 4d003c50e7d32bb0270b454fefc3a42090e410e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Antonsson?= Date: Thu, 11 Oct 2012 10:29:54 +0200 Subject: [PATCH 028/210] Changes according to review. #2575 --- .../src/main/scala/akka/actor/ActorRef.scala | 17 ++++++++++------- .../scala/akka/actor/RepointableActorRef.scala | 6 +++--- .../scala/akka/actor/dungeon/Children.scala | 1 + .../akka/remote/RemoteActorRefProvider.scala | 2 +- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorRef.scala b/akka-actor/src/main/scala/akka/actor/ActorRef.scala index 80ed2bbca5..df87360c65 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRef.scala @@ -194,7 +194,7 @@ private[akka] abstract class InternalActorRef extends ActorRef with ScalaActorRe /* * Actor life-cycle management, invoked only internally (in response to user requests via ActorContext). */ - def start(): ActorRef + def start(): Unit def resume(causedByFailure: Throwable): Unit def suspend(): Unit def restart(cause: Throwable): Unit @@ -260,10 +260,13 @@ private[akka] class LocalActorRef private[akka] ( /* * Safe publication of this class’s fields is guaranteed by mailbox.setActor() - * which is called indirectly from actorCell.start() (if you’re wondering why + * which is called indirectly from actorCell.init() (if you’re wondering why * this is at all important, remember that under the JMM final fields are only * frozen at the _end_ of the constructor, but we are publishing “this” before * that is reached). + * This means that the result of newActorCell needs to be written to the val + * actorCell before we call init and start, since we can start using "this" + * object from another thread as soon as we run init. */ private val actorCell: ActorCell = newActorCell(_system, this, _props, _supervisor) actorCell.init(ThreadLocalRandom.current.nextInt(), sendSupervise = true) @@ -284,10 +287,10 @@ private[akka] class LocalActorRef private[akka] ( */ override def isTerminated: Boolean = actorCell.isTerminated - override def start(): ActorRef = { - actorCell.start() - this - } + /** + * Starts the actor after initialization. + */ + override def start(): Unit = actorCell.start() /** * Suspends the actor so that it will not process messages until resumed. The @@ -400,7 +403,7 @@ private[akka] trait MinimalActorRef extends InternalActorRef with LocalRef { override def getParent: InternalActorRef = Nobody override def getChild(names: Iterator[String]): InternalActorRef = if (names.forall(_.isEmpty)) this else Nobody - override def start(): ActorRef = this + override def start(): Unit = () override def suspend(): Unit = () override def resume(causedByFailure: Throwable): Unit = () override def stop(): Unit = () diff --git a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala index 03c66ec12e..b644ba6445 100644 --- a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala @@ -78,10 +78,10 @@ private[akka] class RepointableActorRef( * unstarted cell. The cell must be fully functional. */ def newCell(old: Cell): Cell = - new ActorCell(system, this, props, supervisor) - .init(old.asInstanceOf[UnstartedCell].uid, sendSupervise = false).start() + new ActorCell(system, this, props, supervisor). + init(old.asInstanceOf[UnstartedCell].uid, sendSupervise = false).start() - def start(): ActorRef = this + def start(): Unit = () def suspend(): Unit = underlying.suspend() diff --git a/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala b/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala index 63d312fa8d..d59b0b71da 100644 --- a/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala +++ b/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala @@ -193,6 +193,7 @@ private[akka] trait Children { this: ActorCell ⇒ if (mailbox ne null) for (_ ← 1 to mailbox.suspendCount) actor.suspend() initChild(actor) actor.start() + actor } } diff --git a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala index 3f13f39f75..87c66522b4 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala @@ -243,7 +243,7 @@ private[akka] class RemoteActorRef private[akka] ( provider.deadLetters ! message } - def start(): ActorRef = this + def start(): Unit = () def suspend(): Unit = sendSystemMessage(Suspend()) From 0f04239f67887f93b6afc3768a9f7d7d4127c901 Mon Sep 17 00:00:00 2001 From: Roland Date: Fri, 21 Sep 2012 14:50:06 +0200 Subject: [PATCH 029/210] move Duration classes according to scala 2.10 nightly and remove casts to FiniteDuration, see #2504 --- .../test/java/akka/dispatch/JavaFutureTests.java | 2 +- .../src/test/java/akka/util/JavaDuration.java | 4 ++-- .../ActorConfigurationVerificationSpec.scala | 2 +- .../src/test/scala/akka/actor/ActorDSLSpec.scala | 2 +- .../actor/ActorFireForgetRequestReplySpec.scala | 2 +- .../scala/akka/actor/ActorLifeCycleSpec.scala | 2 +- .../test/scala/akka/actor/ActorLookupSpec.scala | 2 +- .../src/test/scala/akka/actor/ActorRefSpec.scala | 2 +- .../test/scala/akka/actor/ActorSystemSpec.scala | 2 +- .../test/scala/akka/actor/ActorTimeoutSpec.scala | 2 +- .../akka/actor/ActorWithBoundedStashSpec.scala | 2 +- .../scala/akka/actor/ActorWithStashSpec.scala | 2 +- .../test/scala/akka/actor/ConsistencySpec.scala | 2 +- .../test/scala/akka/actor/DeathWatchSpec.scala | 2 +- .../src/test/scala/akka/actor/DeployerSpec.scala | 2 +- .../src/test/scala/akka/actor/FSMActorSpec.scala | 4 +--- .../test/scala/akka/actor/FSMTimingSpec.scala | 3 +-- .../scala/akka/actor/FSMTransitionSpec.scala | 3 +-- .../test/scala/akka/actor/ForwardActorSpec.scala | 3 +-- .../src/test/scala/akka/actor/IOActor.scala | 4 +--- .../akka/actor/LocalActorRefProviderSpec.scala | 2 +- .../scala/akka/actor/ReceiveTimeoutSpec.scala | 3 +-- .../scala/akka/actor/RestartStrategySpec.scala | 3 +-- .../test/scala/akka/actor/SchedulerSpec.scala | 2 +- .../akka/actor/SupervisorHierarchySpec.scala | 3 +-- .../scala/akka/actor/SupervisorMiscSpec.scala | 2 +- .../test/scala/akka/actor/SupervisorSpec.scala | 2 +- .../scala/akka/actor/SupervisorTreeSpec.scala | 2 +- .../test/scala/akka/actor/Ticket669Spec.scala | 2 +- .../test/scala/akka/actor/TypedActorSpec.scala | 4 +--- .../akka/actor/dispatch/ActorModelSpec.scala | 3 +-- .../actor/dispatch/DispatcherActorSpec.scala | 3 +-- .../akka/actor/dispatch/DispatchersSpec.scala | 2 +- .../src/test/scala/akka/config/ConfigSpec.scala | 3 +-- .../test/scala/akka/dataflow/Future2Actor.scala | 2 +- .../test/scala/akka/dispatch/FutureSpec.scala | 3 +-- .../scala/akka/dispatch/MailboxConfigSpec.scala | 2 +- .../akka/dispatch/PriorityDispatcherSpec.scala | 2 +- .../src/test/scala/akka/event/EventBusSpec.scala | 2 +- .../test/scala/akka/event/EventStreamSpec.scala | 4 ++-- .../scala/akka/event/LoggingReceiveSpec.scala | 3 +-- .../src/test/scala/akka/pattern/AskSpec.scala | 2 +- .../akka/pattern/CircuitBreakerMTSpec.scala | 2 +- .../scala/akka/pattern/CircuitBreakerSpec.scala | 2 +- .../test/scala/akka/pattern/PatternSpec.scala | 3 +-- ...ellThroughputComputationPerformanceSpec.scala | 3 +-- .../TellThroughputPerformanceSpec.scala | 3 +-- .../performance/workbench/PerformanceSpec.scala | 2 +- .../routing/ConfiguredLocalRoutingSpec.scala | 2 +- .../scala/akka/routing/CustomRouteSpec.scala | 2 +- .../test/scala/akka/routing/ResizerSpec.scala | 4 +--- .../test/scala/akka/routing/RoutingSpec.scala | 3 +-- .../scala/akka/serialization/SerializeSpec.scala | 2 +- .../src/test/scala/akka/util/DurationSpec.scala | 3 +-- .../akka/util/internal/HashedWheelTimer.java | 4 ++-- .../src/main/java/akka/util/internal/Timer.java | 2 +- .../src/main/scala/akka/actor/ActorCell.scala | 2 +- .../src/main/scala/akka/actor/ActorDSL.scala | 4 +--- .../src/main/scala/akka/actor/ActorSystem.scala | 4 ++-- .../src/main/scala/akka/actor/Deployer.scala | 2 +- akka-actor/src/main/scala/akka/actor/FSM.scala | 4 ++-- .../main/scala/akka/actor/FaultHandling.scala | 2 +- akka-actor/src/main/scala/akka/actor/IO.scala | 2 +- .../src/main/scala/akka/actor/Scheduler.scala | 4 ++-- .../src/main/scala/akka/actor/TypedActor.scala | 4 ++-- .../src/main/scala/akka/actor/dsl/Creators.scala | 4 +--- .../src/main/scala/akka/actor/dsl/Inbox.scala | 12 +++++------- .../scala/akka/actor/dungeon/FaultHandling.scala | 2 +- .../akka/actor/dungeon/ReceiveTimeout.scala | 4 ++-- .../scala/akka/dispatch/AbstractDispatcher.scala | 4 ++-- .../akka/dispatch/BalancingDispatcher.scala | 4 ++-- .../main/scala/akka/dispatch/Dispatcher.scala | 4 ++-- .../main/scala/akka/dispatch/Dispatchers.scala | 2 +- .../src/main/scala/akka/dispatch/Mailbox.scala | 4 ++-- .../scala/akka/dispatch/PinnedDispatcher.scala | 4 ++-- .../scala/akka/dispatch/ThreadPoolBuilder.scala | 2 +- .../src/main/scala/akka/event/Logging.scala | 2 +- .../main/scala/akka/pattern/CircuitBreaker.scala | 5 ++--- .../akka/pattern/FutureTimeoutSupport.scala | 4 ++-- .../scala/akka/pattern/GracefulStopSupport.scala | 4 ++-- .../src/main/scala/akka/pattern/Patterns.scala | 4 ++-- .../src/main/scala/akka/routing/Routing.scala | 4 +--- .../src/main/scala/akka/util/Timeout.scala | 2 +- akka-agent/src/main/scala/akka/agent/Agent.scala | 2 +- .../src/test/scala/akka/agent/AgentSpec.scala | 3 +-- .../src/main/scala/akka/camel/Activation.scala | 5 +++-- .../scala/akka/camel/ActorRouteDefinition.scala | 2 +- akka-camel/src/main/scala/akka/camel/Camel.scala | 6 +++--- .../src/main/scala/akka/camel/CamelSupport.scala | 2 +- .../src/main/scala/akka/camel/Consumer.scala | 3 +-- .../scala/akka/camel/internal/DefaultCamel.scala | 5 ++--- .../internal/component/ActorComponent.scala | 4 +--- .../java/akka/camel/ConsumerJavaTestBase.java | 4 ++-- .../java/akka/camel/CustomRouteTestBase.java | 3 ++- .../akka/camel/SampleErrorHandlingConsumer.java | 2 +- .../akka/camel/ActivationIntegrationTest.scala | 2 +- .../akka/camel/ConcurrentActivationTest.scala | 2 +- .../akka/camel/ConsumerIntegrationTest.scala | 2 +- .../scala/akka/camel/ProducerFeatureTest.scala | 3 +-- .../src/test/scala/akka/camel/TestSupport.scala | 3 +-- .../scala/akka/camel/UntypedProducerTest.scala | 2 +- .../camel/internal/ActivationTrackerTest.scala | 3 +-- .../ActorComponentConfigurationTest.scala | 2 +- .../internal/component/ActorProducerTest.scala | 3 +-- .../component/DurationConverterTest.scala | 3 +-- .../akka/cluster/AccrualFailureDetector.scala | 5 ++--- .../src/main/scala/akka/cluster/Cluster.scala | 4 +--- .../main/scala/akka/cluster/ClusterDaemon.scala | 16 +++++++--------- .../scala/akka/cluster/ClusterHeartbeat.scala | 5 ++--- .../akka/cluster/ClusterMetricsCollector.scala | 4 ++-- .../scala/akka/cluster/ClusterSettings.scala | 4 ++-- .../ClusterAccrualFailureDetectorSpec.scala | 2 +- .../ClusterMetricsDataStreamingOffSpec.scala | 2 +- .../scala/akka/cluster/ClusterMetricsSpec.scala | 2 +- .../scala/akka/cluster/ConvergenceSpec.scala | 2 +- .../scala/akka/cluster/JoinInProgressSpec.scala | 3 +-- .../scala/akka/cluster/JoinSeedNodeSpec.scala | 2 +- .../scala/akka/cluster/LargeClusterSpec.scala | 11 +++-------- .../LeaderDowningNodeThatIsUnreachableSpec.scala | 2 +- .../scala/akka/cluster/LeaderLeavingSpec.scala | 2 +- .../MembershipChangeListenerExitingSpec.scala | 2 +- .../MembershipChangeListenerJoinSpec.scala | 2 +- .../akka/cluster/MultiNodeClusterSpec.scala | 4 +--- ...odeLeavingAndExitingAndBeingRemovedSpec.scala | 2 +- .../akka/cluster/NodeLeavingAndExitingSpec.scala | 2 +- .../scala/akka/cluster/NodeUpSpec.scala | 2 +- .../akka/cluster/SingletonClusterSpec.scala | 2 +- .../scala/akka/cluster/SplitBrainSpec.scala | 2 +- .../scala/akka/cluster/SunnyWeatherSpec.scala | 2 +- .../UnreachableNodeRejoinsClusterSpec.scala | 2 +- .../ClusterConsistentHashingRouterSpec.scala | 2 +- .../ClusterRoundRobinRoutedActorSpec.scala | 2 +- .../cluster/AccrualFailureDetectorSpec.scala | 3 +-- .../scala/akka/cluster/ClusterConfigSpec.scala | 3 +-- .../ClusterDomainEventPublisherSpec.scala | 2 +- .../test/scala/akka/cluster/ClusterSpec.scala | 3 +-- .../test/scala/akka/cluster/DataStreamSpec.scala | 2 +- .../akka/cluster/MetricsCollectorSpec.scala | 3 +-- .../scala/akka/cluster/MetricsGossipSpec.scala | 2 +- .../akka/contrib/pattern/ReliableProxy.scala | 4 ++-- .../akka/contrib/pattern/ReliableProxyTest.java | 4 ++-- .../contrib/pattern/ReliableProxyDocSpec.scala | 4 ++-- .../test/scala/akka/dataflow/DataflowSpec.scala | 2 +- .../circuitbreaker/CircuitBreakerDocSpec.scala | 2 +- .../rst/common/code/docs/duration/Sample.scala | 2 +- .../actor/mailbox/DurableMailboxDocSpec.scala | 2 +- .../rst/project/migration-guide-2.0.x-2.1.x.rst | 6 +++--- .../rst/scala/code/docs/actor/ActorDocSpec.scala | 8 ++++---- .../rst/scala/code/docs/actor/FSMDocSpec.scala | 2 +- .../code/docs/actor/FaultHandlingDocSample.scala | 3 +-- .../code/docs/actor/FaultHandlingDocSpec.scala | 4 ++-- .../scala/code/docs/actor/SchedulerDocSpec.scala | 2 +- .../code/docs/actor/TypedActorDocSpec.scala | 2 +- .../rst/scala/code/docs/agent/AgentDocSpec.scala | 6 +++--- .../rst/scala/code/docs/camel/Consumers.scala | 2 +- .../rst/scala/code/docs/camel/Introduction.scala | 2 +- .../rst/scala/code/docs/camel/Producers.scala | 2 +- .../code/docs/dataflow/DataflowDocSpec.scala | 2 +- .../code/docs/dispatcher/DispatcherDocSpec.scala | 2 +- .../scala/code/docs/future/FutureDocSpec.scala | 6 +++--- .../code/docs/routing/RouterTypeExample.scala | 2 +- .../code/docs/testkit/TestKitUsageSpec.scala | 2 +- .../scala/code/docs/testkit/TestkitDocSpec.scala | 12 ++++++------ .../code/docs/transactor/TransactorDocSpec.scala | 6 +++--- .../scala/code/docs/zeromq/ZeromqDocSpec.scala | 2 +- .../mailbox/filebased/FileBasedMailbox.scala | 2 +- .../filebased/FileBasedMailboxSettings.scala | 3 +-- .../filebased/filequeue/PersistentQueue.scala | 1 - .../mailbox/filebased/FileBasedMailboxSpec.scala | 2 +- .../akka/actor/mailbox/DurableMailboxSpec.scala | 2 +- .../akka/osgi/ActorSystemActivatorTest.scala | 2 +- .../akka/remote/testconductor/Conductor.scala | 10 ++++------ .../akka/remote/testconductor/DataTypes.scala | 4 ++-- .../akka/remote/testconductor/Extension.scala | 2 +- .../testconductor/NetworkFailureInjector.scala | 6 ++---- .../scala/akka/remote/testconductor/Player.scala | 12 +++++------- .../akka/remote/testkit/MultiNodeSpec.scala | 3 +-- .../scala/akka/remote/NewRemoteActorSpec.scala | 2 +- .../router/RandomRoutedRemoteActorSpec.scala | 2 +- .../router/RoundRobinRoutedRemoteActorSpec.scala | 2 +- .../ScatterGatherRoutedRemoteActorSpec.scala | 2 +- .../remote/testconductor/TestConductorSpec.scala | 3 +-- .../akka/remote/testconductor/BarrierSpec.scala | 5 ++--- .../main/scala/akka/remote/RemoteSettings.scala | 2 +- .../main/scala/akka/remote/netty/Client.scala | 2 +- .../main/scala/akka/remote/netty/Settings.scala | 4 ++-- .../scala/akka/remote/NetworkFailureSpec.scala | 2 +- .../scala/akka/remote/RemoteConfigSpec.scala | 3 +-- .../remote/Ticket1978CommunicationSpec.scala | 3 +-- .../scala/akka/remote/Ticket1978ConfigSpec.scala | 3 +-- .../test/scala/akka/remote/UntrustedSpec.scala | 2 +- .../DaemonMsgCreateSerializerSpec.scala | 2 +- .../scala/sample/cluster/stats/StatsSample.scala | 2 +- .../transformation/TransformationSample.scala | 2 +- .../stats/StatsSampleSingleMasterSpec.scala | 2 +- .../sample/cluster/stats/StatsSampleSpec.scala | 2 +- .../cluster/stats/japi/StatsSampleJapiSpec.scala | 2 +- .../japi/StatsSampleSingleMasterJapiSpec.scala | 2 +- .../TransformationSampleSpec.scala | 2 +- .../japi/TransformationSampleJapiSpec.scala | 2 +- .../src/main/scala/DiningHakkersOnBecome.scala | 2 +- .../src/main/scala/DiningHakkersOnFsm.scala | 4 +--- .../akka/event/slf4j/Slf4jEventHandlerSpec.scala | 2 +- .../src/main/java/akka/testkit/JavaTestKit.java | 4 ++-- .../akka/testkit/CallingThreadDispatcher.scala | 4 ++-- .../main/scala/akka/testkit/TestBarrier.scala | 4 ++-- .../scala/akka/testkit/TestEventListener.scala | 2 +- .../src/main/scala/akka/testkit/TestFSMRef.scala | 4 ++-- .../src/main/scala/akka/testkit/TestKit.scala | 5 ++--- .../scala/akka/testkit/TestKitExtension.scala | 4 ++-- .../src/main/scala/akka/testkit/TestLatch.scala | 4 ++-- .../src/main/scala/akka/testkit/package.scala | 4 ++-- .../src/test/scala/akka/testkit/AkkaSpec.scala | 2 +- .../test/scala/akka/testkit/AkkaSpecSpec.scala | 2 +- .../scala/akka/testkit/TestActorRefSpec.scala | 3 +-- .../test/scala/akka/testkit/TestFSMRefSpec.scala | 2 +- .../test/scala/akka/testkit/TestProbeSpec.scala | 2 +- .../test/scala/akka/testkit/TestTimeSpec.scala | 2 +- .../akka/transactor/TransactorExtension.scala | 2 +- .../transactor/CoordinatedIncrementSpec.scala | 2 +- .../akka/transactor/FickleFriendsSpec.scala | 2 +- .../scala/akka/transactor/TransactorSpec.scala | 2 +- .../akka/zeromq/ConcurrentSocketActor.scala | 2 +- .../main/scala/akka/zeromq/SocketOption.scala | 4 +--- .../main/scala/akka/zeromq/ZeroMQExtension.scala | 4 ++-- .../akka/zeromq/ConcurrentSocketActorSpec.scala | 2 +- project/AkkaBuild.scala | 4 ++-- 227 files changed, 307 insertions(+), 387 deletions(-) diff --git a/akka-actor-tests/src/test/java/akka/dispatch/JavaFutureTests.java b/akka-actor-tests/src/test/java/akka/dispatch/JavaFutureTests.java index 4053a2d7f2..ec494e542c 100644 --- a/akka-actor-tests/src/test/java/akka/dispatch/JavaFutureTests.java +++ b/akka-actor-tests/src/test/java/akka/dispatch/JavaFutureTests.java @@ -7,7 +7,7 @@ import akka.japi.*; import scala.concurrent.Await; import scala.concurrent.Future; import scala.concurrent.Promise; -import scala.concurrent.util.Duration; +import scala.concurrent.duration.Duration; import akka.testkit.TestKitExtension; import org.junit.AfterClass; import org.junit.BeforeClass; diff --git a/akka-actor-tests/src/test/java/akka/util/JavaDuration.java b/akka-actor-tests/src/test/java/akka/util/JavaDuration.java index 0cbcea80d4..326afb8543 100644 --- a/akka-actor-tests/src/test/java/akka/util/JavaDuration.java +++ b/akka-actor-tests/src/test/java/akka/util/JavaDuration.java @@ -4,14 +4,14 @@ package akka.util; import org.junit.Test; -import scala.concurrent.util.Duration; +import scala.concurrent.duration.Duration; public class JavaDuration { @Test public void testCreation() { final Duration fivesec = Duration.create(5, "seconds"); - final Duration threemillis = Duration.parse("3 millis"); + final Duration threemillis = Duration.create("3 millis"); final Duration diff = fivesec.minus(threemillis); assert diff.lt(fivesec); assert Duration.Zero().lteq(Duration.Inf()); diff --git a/akka-actor-tests/src/test/scala/akka/actor/ActorConfigurationVerificationSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ActorConfigurationVerificationSpec.scala index 6532b5e5cd..c130d23149 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ActorConfigurationVerificationSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ActorConfigurationVerificationSpec.scala @@ -8,7 +8,7 @@ import language.postfixOps import akka.testkit._ import akka.testkit.DefaultTimeout import akka.testkit.TestEvent._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.routing._ import org.scalatest.BeforeAndAfterEach import akka.ConfigurationException diff --git a/akka-actor-tests/src/test/scala/akka/actor/ActorDSLSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ActorDSLSpec.scala index bb5ed0d4bd..578f557871 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ActorDSLSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ActorDSLSpec.scala @@ -12,7 +12,7 @@ import akka.actor.ActorDSL._ //#import import akka.event.Logging.Warning import scala.concurrent.{ Await, Future } -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import java.util.concurrent.TimeoutException class ActorDSLSpec extends AkkaSpec { diff --git a/akka-actor-tests/src/test/scala/akka/actor/ActorFireForgetRequestReplySpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ActorFireForgetRequestReplySpec.scala index 42018823bc..93e17d3192 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ActorFireForgetRequestReplySpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ActorFireForgetRequestReplySpec.scala @@ -6,7 +6,7 @@ package akka.actor import akka.testkit._ import org.scalatest.BeforeAndAfterEach -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import scala.concurrent.Await import akka.pattern.ask diff --git a/akka-actor-tests/src/test/scala/akka/actor/ActorLifeCycleSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ActorLifeCycleSpec.scala index 40907e74a0..430a64172a 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ActorLifeCycleSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ActorLifeCycleSpec.scala @@ -11,7 +11,7 @@ import org.scalatest.matchers.MustMatchers import akka.actor.Actor._ import akka.testkit._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import java.util.concurrent.atomic._ import scala.concurrent.Await import akka.pattern.ask diff --git a/akka-actor-tests/src/test/scala/akka/actor/ActorLookupSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ActorLookupSpec.scala index 2d49ba884d..4d19f5ea9e 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ActorLookupSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ActorLookupSpec.scala @@ -6,7 +6,7 @@ package akka.actor import language.postfixOps import akka.testkit._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import scala.concurrent.Await import akka.pattern.ask import java.net.MalformedURLException diff --git a/akka-actor-tests/src/test/scala/akka/actor/ActorRefSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ActorRefSpec.scala index ae956e968a..a1da055cf6 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ActorRefSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ActorRefSpec.scala @@ -11,7 +11,7 @@ import org.scalatest.matchers.MustMatchers import akka.testkit._ import akka.util.Timeout -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import scala.concurrent.Await import java.lang.IllegalStateException import scala.concurrent.Promise diff --git a/akka-actor-tests/src/test/scala/akka/actor/ActorSystemSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ActorSystemSpec.scala index f7a9844c9d..bf0128a7e3 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ActorSystemSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ActorSystemSpec.scala @@ -8,7 +8,7 @@ import akka.testkit._ import org.scalatest.junit.JUnitSuite import com.typesafe.config.ConfigFactory import scala.concurrent.Await -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import scala.collection.JavaConverters import java.util.concurrent.{ TimeUnit, RejectedExecutionException, CountDownLatch, ConcurrentLinkedQueue } import akka.util.Timeout diff --git a/akka-actor-tests/src/test/scala/akka/actor/ActorTimeoutSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ActorTimeoutSpec.scala index 4eed96b0c5..965a99319d 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ActorTimeoutSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ActorTimeoutSpec.scala @@ -3,7 +3,7 @@ */ package akka.actor -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.testkit._ import akka.testkit.TestEvent._ import scala.concurrent.Await diff --git a/akka-actor-tests/src/test/scala/akka/actor/ActorWithBoundedStashSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ActorWithBoundedStashSpec.scala index b3a7bf0686..4d95bf02f6 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ActorWithBoundedStashSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ActorWithBoundedStashSpec.scala @@ -11,7 +11,7 @@ import akka.testkit.TestEvent._ import akka.dispatch.BoundedDequeBasedMailbox import akka.pattern.ask import scala.concurrent.Await -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.ActorSystem.Settings import com.typesafe.config.{ Config, ConfigFactory } import org.scalatest.Assertions.intercept diff --git a/akka-actor-tests/src/test/scala/akka/actor/ActorWithStashSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ActorWithStashSpec.scala index 5913000215..c4d9248d88 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ActorWithStashSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ActorWithStashSpec.scala @@ -10,7 +10,7 @@ import akka.testkit.DefaultTimeout import akka.testkit.TestEvent._ import scala.concurrent.Await import akka.pattern.ask -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import com.typesafe.config.{ Config, ConfigFactory } import org.scalatest.BeforeAndAfterEach import org.scalatest.junit.JUnitSuite diff --git a/akka-actor-tests/src/test/scala/akka/actor/ConsistencySpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ConsistencySpec.scala index dbba376054..6f6fb7fe21 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ConsistencySpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ConsistencySpec.scala @@ -4,7 +4,7 @@ import language.postfixOps import akka.testkit.AkkaSpec import akka.dispatch.UnboundedMailbox -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ object ConsistencySpec { val config = """ diff --git a/akka-actor-tests/src/test/scala/akka/actor/DeathWatchSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/DeathWatchSpec.scala index ea491dcbd1..d01848943f 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/DeathWatchSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/DeathWatchSpec.scala @@ -6,7 +6,7 @@ package akka.actor import language.postfixOps import akka.testkit._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import java.util.concurrent.atomic._ import scala.concurrent.Await import akka.pattern.ask diff --git a/akka-actor-tests/src/test/scala/akka/actor/DeployerSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/DeployerSpec.scala index 37aa133583..954337431c 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/DeployerSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/DeployerSpec.scala @@ -10,7 +10,7 @@ import akka.testkit.AkkaSpec import com.typesafe.config.ConfigFactory import com.typesafe.config.ConfigParseOptions import akka.routing._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ object DeployerSpec { val deployerConf = ConfigFactory.parseString(""" diff --git a/akka-actor-tests/src/test/scala/akka/actor/FSMActorSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/FSMActorSpec.scala index bae6d2f6fe..f0e5e44ad4 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/FSMActorSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/FSMActorSpec.scala @@ -8,13 +8,11 @@ import language.postfixOps import org.scalatest.{ BeforeAndAfterAll, BeforeAndAfterEach } import akka.testkit._ import TestEvent.Mute -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.event._ import com.typesafe.config.ConfigFactory import scala.concurrent.Await import akka.util.Timeout -import scala.concurrent.util.Duration -import scala.concurrent.util.FiniteDuration object FSMActorSpec { val timeout = Timeout(2 seconds) diff --git a/akka-actor-tests/src/test/scala/akka/actor/FSMTimingSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/FSMTimingSpec.scala index 3960f5a8ff..e5436d4e9c 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/FSMTimingSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/FSMTimingSpec.scala @@ -7,8 +7,7 @@ package akka.actor import language.postfixOps import akka.testkit._ -import scala.concurrent.util.Duration -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.event.Logging @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) diff --git a/akka-actor-tests/src/test/scala/akka/actor/FSMTransitionSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/FSMTransitionSpec.scala index 446f6fc9b3..04a0eea352 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/FSMTransitionSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/FSMTransitionSpec.scala @@ -6,8 +6,7 @@ package akka.actor import language.postfixOps import akka.testkit._ -import scala.concurrent.util.duration._ -import scala.concurrent.util.Duration +import scala.concurrent.duration._ object FSMTransitionSpec { diff --git a/akka-actor-tests/src/test/scala/akka/actor/ForwardActorSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ForwardActorSpec.scala index 9e662b5535..40c652c3ec 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ForwardActorSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ForwardActorSpec.scala @@ -7,9 +7,8 @@ package akka.actor import language.postfixOps import akka.testkit._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.Actor._ -import scala.concurrent.util.Duration import scala.concurrent.Await import akka.pattern.{ ask, pipe } diff --git a/akka-actor-tests/src/test/scala/akka/actor/IOActor.scala b/akka-actor-tests/src/test/scala/akka/actor/IOActor.scala index 58ffb9c602..441f1515be 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/IOActor.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/IOActor.scala @@ -7,8 +7,7 @@ package akka.actor import language.postfixOps import akka.util.ByteString import scala.concurrent.{ ExecutionContext, Await, Future, Promise } -import scala.concurrent.util.{ Duration, Deadline } -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import scala.util.continuations._ import akka.testkit._ import akka.dispatch.MessageDispatcher @@ -16,7 +15,6 @@ import akka.pattern.ask import java.net.{ Socket, InetSocketAddress, InetAddress, SocketAddress } import scala.util.Failure import annotation.tailrec -import scala.concurrent.util.FiniteDuration object IOActorSpec { diff --git a/akka-actor-tests/src/test/scala/akka/actor/LocalActorRefProviderSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/LocalActorRefProviderSpec.scala index db2ac0285e..d9586c1f50 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/LocalActorRefProviderSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/LocalActorRefProviderSpec.scala @@ -7,7 +7,7 @@ package akka.actor import language.postfixOps import akka.testkit._ import scala.concurrent.Await -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.util.Timeout import scala.concurrent.Future import scala.util.Success diff --git a/akka-actor-tests/src/test/scala/akka/actor/ReceiveTimeoutSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ReceiveTimeoutSpec.scala index a74cbc9839..f34dbda9e3 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ReceiveTimeoutSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ReceiveTimeoutSpec.scala @@ -6,11 +6,10 @@ package akka.actor import language.postfixOps import akka.testkit._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import java.util.concurrent.atomic.AtomicInteger import scala.concurrent.Await import java.util.concurrent.TimeoutException -import scala.concurrent.util.Duration @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) class ReceiveTimeoutSpec extends AkkaSpec { diff --git a/akka-actor-tests/src/test/scala/akka/actor/RestartStrategySpec.scala b/akka-actor-tests/src/test/scala/akka/actor/RestartStrategySpec.scala index 55e87b75da..190c738f83 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/RestartStrategySpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/RestartStrategySpec.scala @@ -15,8 +15,7 @@ import java.util.concurrent.{ TimeUnit, CountDownLatch } import akka.testkit.AkkaSpec import akka.testkit.DefaultTimeout import akka.testkit.TestLatch -import scala.concurrent.util.duration._ -import scala.concurrent.util.Duration +import scala.concurrent.duration._ import akka.pattern.ask @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) diff --git a/akka-actor-tests/src/test/scala/akka/actor/SchedulerSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/SchedulerSpec.scala index 86cde2fb47..3932df4ea3 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/SchedulerSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/SchedulerSpec.scala @@ -3,7 +3,7 @@ package akka.actor import language.postfixOps import org.scalatest.BeforeAndAfterEach -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import java.util.concurrent.{ CountDownLatch, ConcurrentLinkedQueue, TimeUnit } import akka.testkit._ import scala.concurrent.Await diff --git a/akka-actor-tests/src/test/scala/akka/actor/SupervisorHierarchySpec.scala b/akka-actor-tests/src/test/scala/akka/actor/SupervisorHierarchySpec.scala index fe7e66a5fe..a34d220cc5 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/SupervisorHierarchySpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/SupervisorHierarchySpec.scala @@ -7,8 +7,7 @@ package akka.actor import language.postfixOps import java.util.concurrent.{ TimeUnit, CountDownLatch } import scala.concurrent.Await -import scala.concurrent.util.Duration -import scala.concurrent.util.duration.intToDurationInt +import scala.concurrent.duration._ import scala.math.BigInt.int2bigInt import scala.util.Random import scala.util.control.NoStackTrace diff --git a/akka-actor-tests/src/test/scala/akka/actor/SupervisorMiscSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/SupervisorMiscSpec.scala index b13457338c..070a5aba51 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/SupervisorMiscSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/SupervisorMiscSpec.scala @@ -12,7 +12,7 @@ import java.util.concurrent.{ TimeUnit, CountDownLatch } import akka.testkit.AkkaSpec import akka.testkit.DefaultTimeout import akka.pattern.ask -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import scala.util.control.NonFatal object SupervisorMiscSpec { diff --git a/akka-actor-tests/src/test/scala/akka/actor/SupervisorSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/SupervisorSpec.scala index 5362ad4153..eafb47c47d 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/SupervisorSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/SupervisorSpec.scala @@ -7,7 +7,7 @@ package akka.actor import language.postfixOps import org.scalatest.BeforeAndAfterEach -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.{ Die, Ping } import akka.testkit.TestEvent._ import akka.testkit._ diff --git a/akka-actor-tests/src/test/scala/akka/actor/SupervisorTreeSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/SupervisorTreeSpec.scala index 4213b548d9..96e063a383 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/SupervisorTreeSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/SupervisorTreeSpec.scala @@ -8,7 +8,7 @@ import language.postfixOps import org.scalatest.WordSpec import org.scalatest.matchers.MustMatchers import scala.concurrent.Await -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.Actor._ import akka.testkit.{ TestKit, EventFilter, filterEvents, filterException, AkkaSpec, ImplicitSender, DefaultTimeout } import akka.dispatch.Dispatchers diff --git a/akka-actor-tests/src/test/scala/akka/actor/Ticket669Spec.scala b/akka-actor-tests/src/test/scala/akka/actor/Ticket669Spec.scala index 6c96ae28a8..cca4652de9 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/Ticket669Spec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/Ticket669Spec.scala @@ -14,7 +14,7 @@ import akka.testkit.ImplicitSender import akka.testkit.DefaultTimeout import scala.concurrent.Await import akka.pattern.ask -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) class Ticket669Spec extends AkkaSpec with BeforeAndAfterAll with ImplicitSender with DefaultTimeout { diff --git a/akka-actor-tests/src/test/scala/akka/actor/TypedActorSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/TypedActorSpec.scala index fc7be182f7..040c8e6211 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/TypedActorSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/TypedActorSpec.scala @@ -7,8 +7,7 @@ import language.postfixOps import org.scalatest.{ BeforeAndAfterAll, BeforeAndAfterEach } import akka.util.Timeout import scala.concurrent.{ Await, Future, Promise } -import scala.concurrent.util.Duration -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import java.util.concurrent.atomic.AtomicReference import annotation.tailrec import akka.testkit.{ EventFilter, filterEvents, AkkaSpec } @@ -20,7 +19,6 @@ import akka.serialization.JavaSerializer import akka.actor.TypedActor._ import java.lang.IllegalStateException import java.util.concurrent.{ TimeoutException, TimeUnit, CountDownLatch } -import scala.concurrent.util.FiniteDuration object TypedActorSpec { diff --git a/akka-actor-tests/src/test/scala/akka/actor/dispatch/ActorModelSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/dispatch/ActorModelSpec.scala index d67acd9ac1..a736003421 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/dispatch/ActorModelSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/dispatch/ActorModelSpec.scala @@ -21,8 +21,7 @@ import akka.event.Logging.Error import akka.pattern.ask import akka.testkit._ import akka.util.Switch -import scala.concurrent.util.duration._ -import scala.concurrent.util.Duration +import scala.concurrent.duration._ import scala.concurrent.{ Await, Future, Promise } import scala.annotation.tailrec diff --git a/akka-actor-tests/src/test/scala/akka/actor/dispatch/DispatcherActorSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/dispatch/DispatcherActorSpec.scala index a6b071d804..db3574a29d 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/dispatch/DispatcherActorSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/dispatch/DispatcherActorSpec.scala @@ -7,8 +7,7 @@ import java.util.concurrent.atomic.{ AtomicBoolean, AtomicInteger } import akka.testkit.{ filterEvents, EventFilter, AkkaSpec } import akka.actor.{ Props, Actor } import scala.concurrent.Await -import scala.concurrent.util.Duration -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.testkit.DefaultTimeout import akka.dispatch.{ PinnedDispatcher, Dispatchers, Dispatcher } import akka.pattern.ask diff --git a/akka-actor-tests/src/test/scala/akka/actor/dispatch/DispatchersSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/dispatch/DispatchersSpec.scala index 5abcdc7a0d..39612fe409 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/dispatch/DispatchersSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/dispatch/DispatchersSpec.scala @@ -14,7 +14,7 @@ import scala.collection.JavaConverters._ import com.typesafe.config.ConfigFactory import akka.actor.Actor import akka.actor.Props -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ object DispatchersSpec { val config = """ diff --git a/akka-actor-tests/src/test/scala/akka/config/ConfigSpec.scala b/akka-actor-tests/src/test/scala/akka/config/ConfigSpec.scala index 56f8cd45fc..67ed31509d 100644 --- a/akka-actor-tests/src/test/scala/akka/config/ConfigSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/config/ConfigSpec.scala @@ -9,8 +9,7 @@ import language.postfixOps import akka.testkit.AkkaSpec import com.typesafe.config.ConfigFactory import scala.collection.JavaConverters._ -import scala.concurrent.util.duration._ -import scala.concurrent.util.Duration +import scala.concurrent.duration._ import akka.actor.{ IOManager, ActorSystem } @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) diff --git a/akka-actor-tests/src/test/scala/akka/dataflow/Future2Actor.scala b/akka-actor-tests/src/test/scala/akka/dataflow/Future2Actor.scala index 0e3d358322..bc225933fe 100644 --- a/akka-actor-tests/src/test/scala/akka/dataflow/Future2Actor.scala +++ b/akka-actor-tests/src/test/scala/akka/dataflow/Future2Actor.scala @@ -8,7 +8,7 @@ import language.postfixOps import akka.actor.{ Actor, Props } import scala.concurrent.Future import scala.concurrent.Await -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.testkit.{ AkkaSpec, DefaultTimeout } import akka.pattern.{ ask, pipe } import scala.concurrent.ExecutionException diff --git a/akka-actor-tests/src/test/scala/akka/dispatch/FutureSpec.scala b/akka-actor-tests/src/test/scala/akka/dispatch/FutureSpec.scala index bc423998f0..28a5fe6a70 100644 --- a/akka-actor-tests/src/test/scala/akka/dispatch/FutureSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/dispatch/FutureSpec.scala @@ -12,8 +12,7 @@ import akka.actor._ import akka.testkit.{ EventFilter, filterEvents, filterException, AkkaSpec, DefaultTimeout, TestLatch } import scala.concurrent.{ Await, Awaitable, Future, Promise, ExecutionContext } import scala.util.control.NonFatal -import scala.concurrent.util.duration._ -import scala.concurrent.util.Duration +import scala.concurrent.duration._ import scala.concurrent.ExecutionContext import org.scalatest.junit.JUnitSuite import scala.runtime.NonLocalReturnControl diff --git a/akka-actor-tests/src/test/scala/akka/dispatch/MailboxConfigSpec.scala b/akka-actor-tests/src/test/scala/akka/dispatch/MailboxConfigSpec.scala index ed93362b6f..94954ab4d8 100644 --- a/akka-actor-tests/src/test/scala/akka/dispatch/MailboxConfigSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/dispatch/MailboxConfigSpec.scala @@ -11,7 +11,7 @@ import com.typesafe.config.Config import akka.actor.{ RepointableRef, Props, DeadLetter, ActorSystem, ActorRefWithCell, ActorRef, ActorCell } import akka.testkit.AkkaSpec import scala.concurrent.{ Future, Promise, Await } -import scala.concurrent.util.duration.intToDurationInt +import scala.concurrent.duration._ @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) abstract class MailboxSpec extends AkkaSpec with BeforeAndAfterAll with BeforeAndAfterEach { diff --git a/akka-actor-tests/src/test/scala/akka/dispatch/PriorityDispatcherSpec.scala b/akka-actor-tests/src/test/scala/akka/dispatch/PriorityDispatcherSpec.scala index 58a785ccf3..1e71627e69 100644 --- a/akka-actor-tests/src/test/scala/akka/dispatch/PriorityDispatcherSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/dispatch/PriorityDispatcherSpec.scala @@ -10,7 +10,7 @@ import akka.actor.{ Props, InternalActorRef, ActorSystem, Actor } import akka.pattern.ask import akka.testkit.{ DefaultTimeout, AkkaSpec } import scala.concurrent.Await -import scala.concurrent.util.duration.intToDurationInt +import scala.concurrent.duration._ object PriorityDispatcherSpec { val config = """ diff --git a/akka-actor-tests/src/test/scala/akka/event/EventBusSpec.scala b/akka-actor-tests/src/test/scala/akka/event/EventBusSpec.scala index 2703727f07..0f7799adc0 100644 --- a/akka-actor-tests/src/test/scala/akka/event/EventBusSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/event/EventBusSpec.scala @@ -8,7 +8,7 @@ import language.postfixOps import org.scalatest.BeforeAndAfterEach import akka.testkit._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import java.util.concurrent.atomic._ import akka.actor.{ Props, Actor, ActorRef, ActorSystem } import java.util.Comparator diff --git a/akka-actor-tests/src/test/scala/akka/event/EventStreamSpec.scala b/akka-actor-tests/src/test/scala/akka/event/EventStreamSpec.scala index 745f4ca2b8..442d35f194 100644 --- a/akka-actor-tests/src/test/scala/akka/event/EventStreamSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/event/EventStreamSpec.scala @@ -5,7 +5,7 @@ package akka.event import language.postfixOps -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.{ Actor, ActorRef, ActorSystemImpl, ActorSystem, Props, UnhandledMessage } import com.typesafe.config.ConfigFactory import scala.collection.JavaConverters._ @@ -282,4 +282,4 @@ class EventStreamSpec extends AkkaSpec(EventStreamSpec.config) { msg foreach (expectMsg(_)) } -} \ No newline at end of file +} diff --git a/akka-actor-tests/src/test/scala/akka/event/LoggingReceiveSpec.scala b/akka-actor-tests/src/test/scala/akka/event/LoggingReceiveSpec.scala index 4bb99ec555..d7ce93e997 100644 --- a/akka-actor-tests/src/test/scala/akka/event/LoggingReceiveSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/event/LoggingReceiveSpec.scala @@ -6,10 +6,9 @@ package akka.event import language.postfixOps import org.scalatest.{ BeforeAndAfterAll, BeforeAndAfterEach } -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.testkit._ import org.scalatest.WordSpec -import scala.concurrent.util.Duration import com.typesafe.config.ConfigFactory import scala.collection.JavaConverters._ import java.util.Properties diff --git a/akka-actor-tests/src/test/scala/akka/pattern/AskSpec.scala b/akka-actor-tests/src/test/scala/akka/pattern/AskSpec.scala index 7104e2edb6..8f3f7f0510 100644 --- a/akka-actor-tests/src/test/scala/akka/pattern/AskSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/pattern/AskSpec.scala @@ -6,7 +6,7 @@ package akka.pattern import language.postfixOps import akka.testkit.AkkaSpec -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import scala.concurrent.Await import akka.testkit.DefaultTimeout import akka.util.Timeout diff --git a/akka-actor-tests/src/test/scala/akka/pattern/CircuitBreakerMTSpec.scala b/akka-actor-tests/src/test/scala/akka/pattern/CircuitBreakerMTSpec.scala index 72370d98a4..66afe3e665 100644 --- a/akka-actor-tests/src/test/scala/akka/pattern/CircuitBreakerMTSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/pattern/CircuitBreakerMTSpec.scala @@ -4,7 +4,7 @@ package akka.pattern import akka.testkit._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import scala.concurrent.{ Promise, Future, Await } class CircuitBreakerMTSpec extends AkkaSpec { diff --git a/akka-actor-tests/src/test/scala/akka/pattern/CircuitBreakerSpec.scala b/akka-actor-tests/src/test/scala/akka/pattern/CircuitBreakerSpec.scala index 0e108d1a3b..954fefb58d 100644 --- a/akka-actor-tests/src/test/scala/akka/pattern/CircuitBreakerSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/pattern/CircuitBreakerSpec.scala @@ -6,7 +6,7 @@ package akka.pattern import language.postfixOps -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.testkit._ import org.scalatest.BeforeAndAfter import akka.actor.{ ActorSystem, Scheduler } diff --git a/akka-actor-tests/src/test/scala/akka/pattern/PatternSpec.scala b/akka-actor-tests/src/test/scala/akka/pattern/PatternSpec.scala index 1c41364d05..f1ef0564f6 100644 --- a/akka-actor-tests/src/test/scala/akka/pattern/PatternSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/pattern/PatternSpec.scala @@ -9,8 +9,7 @@ import language.postfixOps import akka.testkit.AkkaSpec import akka.actor.{ Props, Actor } import scala.concurrent.{ Future, Promise, Await } -import scala.concurrent.util.Duration -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ object PatternSpec { case class Work(duration: Duration) diff --git a/akka-actor-tests/src/test/scala/akka/performance/microbench/TellThroughputComputationPerformanceSpec.scala b/akka-actor-tests/src/test/scala/akka/performance/microbench/TellThroughputComputationPerformanceSpec.scala index dccd0b243a..87aa78f2c7 100644 --- a/akka-actor-tests/src/test/scala/akka/performance/microbench/TellThroughputComputationPerformanceSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/performance/microbench/TellThroughputComputationPerformanceSpec.scala @@ -4,8 +4,7 @@ import akka.performance.workbench.PerformanceSpec import akka.actor._ import java.util.concurrent.{ ThreadPoolExecutor, CountDownLatch, TimeUnit } import akka.dispatch._ -import scala.concurrent.util.Duration -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ // -server -Xms512M -Xmx1024M -XX:+UseParallelGC -Dbenchmark=true -Dbenchmark.repeatFactor=500 @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) diff --git a/akka-actor-tests/src/test/scala/akka/performance/microbench/TellThroughputPerformanceSpec.scala b/akka-actor-tests/src/test/scala/akka/performance/microbench/TellThroughputPerformanceSpec.scala index f9a2ae2df8..8cc54f8635 100644 --- a/akka-actor-tests/src/test/scala/akka/performance/microbench/TellThroughputPerformanceSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/performance/microbench/TellThroughputPerformanceSpec.scala @@ -4,8 +4,7 @@ import akka.performance.workbench.PerformanceSpec import akka.actor._ import java.util.concurrent.{ ThreadPoolExecutor, CountDownLatch, TimeUnit } import akka.dispatch._ -import scala.concurrent.util.Duration -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ // -server -Xms512M -Xmx1024M -XX:+UseParallelGC -Dbenchmark=true -Dbenchmark.repeatFactor=500 @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) diff --git a/akka-actor-tests/src/test/scala/akka/performance/workbench/PerformanceSpec.scala b/akka-actor-tests/src/test/scala/akka/performance/workbench/PerformanceSpec.scala index 796a9f5835..977c8ed41e 100644 --- a/akka-actor-tests/src/test/scala/akka/performance/workbench/PerformanceSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/performance/workbench/PerformanceSpec.scala @@ -4,7 +4,7 @@ import scala.collection.immutable.TreeMap import org.apache.commons.math.stat.descriptive.DescriptiveStatistics import org.scalatest.BeforeAndAfterEach import akka.testkit.AkkaSpec -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import com.typesafe.config.Config import java.util.concurrent.TimeUnit import akka.event.Logging diff --git a/akka-actor-tests/src/test/scala/akka/routing/ConfiguredLocalRoutingSpec.scala b/akka-actor-tests/src/test/scala/akka/routing/ConfiguredLocalRoutingSpec.scala index ab212f8901..9f3c121d86 100644 --- a/akka-actor-tests/src/test/scala/akka/routing/ConfiguredLocalRoutingSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/routing/ConfiguredLocalRoutingSpec.scala @@ -12,7 +12,7 @@ import akka.ConfigurationException import scala.concurrent.Await import akka.pattern.{ ask, gracefulStop } import akka.testkit.{ TestLatch, ImplicitSender, DefaultTimeout, AkkaSpec } -import scala.concurrent.util.duration.intToDurationInt +import scala.concurrent.duration._ import akka.actor.UnstartedCell object ConfiguredLocalRoutingSpec { diff --git a/akka-actor-tests/src/test/scala/akka/routing/CustomRouteSpec.scala b/akka-actor-tests/src/test/scala/akka/routing/CustomRouteSpec.scala index 5232338b9f..945be2b97d 100644 --- a/akka-actor-tests/src/test/scala/akka/routing/CustomRouteSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/routing/CustomRouteSpec.scala @@ -35,7 +35,7 @@ class CustomRouteSpec extends AkkaSpec { import akka.pattern.ask import akka.testkit.ExtractRoute import scala.concurrent.Await - import scala.concurrent.util.duration._ + import scala.concurrent.duration._ val target = system.actorOf(Props.empty) val router = system.actorOf(Props.empty.withRouter(new MyRouter(target))) diff --git a/akka-actor-tests/src/test/scala/akka/routing/ResizerSpec.scala b/akka-actor-tests/src/test/scala/akka/routing/ResizerSpec.scala index bfb5b4bba7..5bcebb588f 100644 --- a/akka-actor-tests/src/test/scala/akka/routing/ResizerSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/routing/ResizerSpec.scala @@ -9,13 +9,11 @@ import akka.testkit._ import akka.testkit.TestEvent._ import akka.actor.Props import scala.concurrent.Await -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.ActorRef import java.util.concurrent.atomic.AtomicInteger import akka.pattern.ask -import scala.concurrent.util.Duration import java.util.concurrent.TimeoutException -import scala.concurrent.util.FiniteDuration import scala.util.Try object ResizerSpec { diff --git a/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala b/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala index 283eac7463..6d643005aa 100644 --- a/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala @@ -9,9 +9,8 @@ import java.util.concurrent.atomic.AtomicInteger import akka.actor._ import scala.collection.mutable.LinkedList import akka.testkit._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import scala.concurrent.Await -import scala.concurrent.util.Duration import akka.ConfigurationException import com.typesafe.config.ConfigFactory import akka.pattern.{ ask, pipe } diff --git a/akka-actor-tests/src/test/scala/akka/serialization/SerializeSpec.scala b/akka-actor-tests/src/test/scala/akka/serialization/SerializeSpec.scala index 3125431fb5..c49dc8037f 100644 --- a/akka-actor-tests/src/test/scala/akka/serialization/SerializeSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/serialization/SerializeSpec.scala @@ -11,7 +11,7 @@ import akka.actor._ import java.io._ import scala.concurrent.Await import akka.util.Timeout -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import scala.reflect.BeanInfo import com.google.protobuf.Message import akka.pattern.ask diff --git a/akka-actor-tests/src/test/scala/akka/util/DurationSpec.scala b/akka-actor-tests/src/test/scala/akka/util/DurationSpec.scala index ef300afbe5..39f8f769f5 100644 --- a/akka-actor-tests/src/test/scala/akka/util/DurationSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/util/DurationSpec.scala @@ -7,8 +7,7 @@ import language.postfixOps import org.scalatest.WordSpec import org.scalatest.matchers.MustMatchers -import scala.concurrent.util.Duration -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import java.util.concurrent.TimeUnit._ diff --git a/akka-actor/src/main/java/akka/util/internal/HashedWheelTimer.java b/akka-actor/src/main/java/akka/util/internal/HashedWheelTimer.java index 1630f599ee..fc50854ab7 100644 --- a/akka-actor/src/main/java/akka/util/internal/HashedWheelTimer.java +++ b/akka-actor/src/main/java/akka/util/internal/HashedWheelTimer.java @@ -24,8 +24,8 @@ import java.util.concurrent.ThreadFactory; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; -import scala.concurrent.util.Duration; -import scala.concurrent.util.FiniteDuration; +import scala.concurrent.duration.Duration; +import scala.concurrent.duration.FiniteDuration; import akka.event.LoggingAdapter; import akka.util.Unsafe; diff --git a/akka-actor/src/main/java/akka/util/internal/Timer.java b/akka-actor/src/main/java/akka/util/internal/Timer.java index be7656ec6c..7110b03091 100644 --- a/akka-actor/src/main/java/akka/util/internal/Timer.java +++ b/akka-actor/src/main/java/akka/util/internal/Timer.java @@ -17,7 +17,7 @@ package akka.util.internal; import java.util.Set; -import scala.concurrent.util.FiniteDuration; +import scala.concurrent.duration.FiniteDuration; /** * Schedules {@link TimerTask}s for one-time future execution in a background diff --git a/akka-actor/src/main/scala/akka/actor/ActorCell.scala b/akka-actor/src/main/scala/akka/actor/ActorCell.scala index 5ec4545fd1..8108626ab4 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorCell.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorCell.scala @@ -7,7 +7,7 @@ package akka.actor import java.io.{ ObjectOutputStream, NotSerializableException } import scala.annotation.tailrec import scala.collection.immutable.TreeSet -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import scala.util.control.NonFatal import akka.actor.dungeon.ChildrenContainer import akka.actor.dungeon.ChildrenContainer.WaitingForChildren diff --git a/akka-actor/src/main/scala/akka/actor/ActorDSL.scala b/akka-actor/src/main/scala/akka/actor/ActorDSL.scala index b1e36f7559..bee50ff78e 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorDSL.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorDSL.scala @@ -5,13 +5,11 @@ package akka.actor import scala.collection.mutable.Queue -import scala.concurrent.util.Duration -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.pattern.ask import scala.concurrent.Await import akka.util.Timeout import scala.collection.immutable.TreeSet -import scala.concurrent.util.Deadline import java.util.concurrent.TimeoutException import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.TimeUnit diff --git a/akka-actor/src/main/scala/akka/actor/ActorSystem.scala b/akka-actor/src/main/scala/akka/actor/ActorSystem.scala index 182239adbf..5f89c5166e 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorSystem.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorSystem.scala @@ -9,7 +9,7 @@ import akka.dispatch._ import akka.pattern.ask import com.typesafe.config.{ Config, ConfigFactory } import scala.annotation.tailrec -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import java.io.Closeable import scala.concurrent.{ Await, Awaitable, CanAwait, Future } import scala.util.control.NonFatal @@ -18,7 +18,7 @@ import akka.util.internal.{ HashedWheelTimer, ConcurrentIdentityHashMap } import java.util.concurrent.{ ThreadFactory, CountDownLatch, TimeoutException, RejectedExecutionException } import java.util.concurrent.TimeUnit.MILLISECONDS import akka.actor.dungeon.ChildrenContainer -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration.FiniteDuration import util.{ Failure, Success } object ActorSystem { diff --git a/akka-actor/src/main/scala/akka/actor/Deployer.scala b/akka-actor/src/main/scala/akka/actor/Deployer.scala index dd3e88dcda..deb6285826 100644 --- a/akka-actor/src/main/scala/akka/actor/Deployer.scala +++ b/akka-actor/src/main/scala/akka/actor/Deployer.scala @@ -4,7 +4,7 @@ package akka.actor -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import com.typesafe.config._ import akka.routing._ import java.util.concurrent.{ TimeUnit } diff --git a/akka-actor/src/main/scala/akka/actor/FSM.scala b/akka-actor/src/main/scala/akka/actor/FSM.scala index a58abb0ac3..41ef90c5db 100644 --- a/akka-actor/src/main/scala/akka/actor/FSM.scala +++ b/akka-actor/src/main/scala/akka/actor/FSM.scala @@ -5,10 +5,10 @@ package akka.actor import language.implicitConversions import akka.util._ -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import scala.collection.mutable import akka.routing.{ Deafen, Listen, Listeners } -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration.FiniteDuration object FSM { diff --git a/akka-actor/src/main/scala/akka/actor/FaultHandling.scala b/akka-actor/src/main/scala/akka/actor/FaultHandling.scala index 3d1c9a01c3..ee882dd765 100644 --- a/akka-actor/src/main/scala/akka/actor/FaultHandling.scala +++ b/akka-actor/src/main/scala/akka/actor/FaultHandling.scala @@ -9,7 +9,7 @@ import java.util.concurrent.TimeUnit import scala.collection.mutable.ArrayBuffer import scala.collection.JavaConversions._ import java.lang.{ Iterable ⇒ JIterable } -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration /** * INTERNAL API */ diff --git a/akka-actor/src/main/scala/akka/actor/IO.scala b/akka-actor/src/main/scala/akka/actor/IO.scala index 8c104e9a18..635afe2a58 100644 --- a/akka-actor/src/main/scala/akka/actor/IO.scala +++ b/akka-actor/src/main/scala/akka/actor/IO.scala @@ -7,7 +7,7 @@ import language.higherKinds import language.postfixOps import scala.concurrent.{ ExecutionContext, Future } -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import scala.util.control.NonFatal import akka.util.ByteString import java.net.{ SocketAddress, InetSocketAddress } diff --git a/akka-actor/src/main/scala/akka/actor/Scheduler.scala b/akka-actor/src/main/scala/akka/actor/Scheduler.scala index 023acca4c1..8e11baada0 100644 --- a/akka-actor/src/main/scala/akka/actor/Scheduler.scala +++ b/akka-actor/src/main/scala/akka/actor/Scheduler.scala @@ -4,7 +4,7 @@ package akka.actor -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import akka.util.internal.{ TimerTask, HashedWheelTimer, Timeout ⇒ HWTimeout, Timer } import akka.event.LoggingAdapter import akka.dispatch.MessageDispatcher @@ -13,7 +13,7 @@ import java.util.concurrent.atomic.{ AtomicReference, AtomicLong } import scala.annotation.tailrec import akka.util.internal._ import concurrent.ExecutionContext -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration.FiniteDuration //#scheduler /** diff --git a/akka-actor/src/main/scala/akka/actor/TypedActor.scala b/akka-actor/src/main/scala/akka/actor/TypedActor.scala index 69a3707f48..b4cbee5361 100644 --- a/akka-actor/src/main/scala/akka/actor/TypedActor.scala +++ b/akka-actor/src/main/scala/akka/actor/TypedActor.scala @@ -8,7 +8,7 @@ import akka.japi.{ Creator, Option ⇒ JOption } import java.lang.reflect.{ InvocationTargetException, Method, InvocationHandler, Proxy } import akka.util.Timeout import scala.util.control.NonFatal -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import scala.concurrent.{ Await, Future } import akka.util.Reflect.instantiator import akka.dispatch._ @@ -19,7 +19,7 @@ import scala.reflect.ClassTag import akka.serialization.{ JavaSerializer, SerializationExtension } import java.io.ObjectStreamException import scala.util.{ Try, Success, Failure } -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration.FiniteDuration /** * A TypedActorFactory is something that can created TypedActor instances. diff --git a/akka-actor/src/main/scala/akka/actor/dsl/Creators.scala b/akka-actor/src/main/scala/akka/actor/dsl/Creators.scala index 29dda88300..98ab610502 100644 --- a/akka-actor/src/main/scala/akka/actor/dsl/Creators.scala +++ b/akka-actor/src/main/scala/akka/actor/dsl/Creators.scala @@ -6,10 +6,8 @@ package akka.actor.dsl import scala.concurrent.Await import akka.actor.ActorLogging -import scala.concurrent.util.Deadline import scala.collection.immutable.TreeSet -import scala.concurrent.util.{ Duration, FiniteDuration } -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.Cancellable import akka.actor.{ Actor, Stash, SupervisorStrategy } import scala.collection.mutable.Queue diff --git a/akka-actor/src/main/scala/akka/actor/dsl/Inbox.scala b/akka-actor/src/main/scala/akka/actor/dsl/Inbox.scala index 7b1a77bc71..418a035e53 100644 --- a/akka-actor/src/main/scala/akka/actor/dsl/Inbox.scala +++ b/akka-actor/src/main/scala/akka/actor/dsl/Inbox.scala @@ -6,10 +6,8 @@ package akka.actor.dsl import scala.concurrent.Await import akka.actor.ActorLogging -import scala.concurrent.util.Deadline import scala.collection.immutable.TreeSet -import scala.concurrent.util.{ Duration, FiniteDuration } -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.Cancellable import akka.actor.Actor import scala.collection.mutable.Queue @@ -129,10 +127,10 @@ trait Inbox { this: ActorDSL.type ⇒ val next = clientsByTimeout.head.deadline import context.dispatcher if (currentDeadline.isEmpty) { - currentDeadline = Some((next, context.system.scheduler.scheduleOnce(next.timeLeft.asInstanceOf[FiniteDuration], self, Kick))) + currentDeadline = Some((next, context.system.scheduler.scheduleOnce(next.timeLeft, self, Kick))) } else if (currentDeadline.get._1 != next) { currentDeadline.get._2.cancel() - currentDeadline = Some((next, context.system.scheduler.scheduleOnce(next.timeLeft.asInstanceOf[FiniteDuration], self, Kick))) + currentDeadline = Some((next, context.system.scheduler.scheduleOnce(next.timeLeft, self, Kick))) } } } @@ -169,7 +167,7 @@ trait Inbox { this: ActorDSL.type ⇒ * this method within an actor! */ def receive(timeout: FiniteDuration = defaultTimeout): Any = { - implicit val t = Timeout((timeout + extraTime).asInstanceOf[FiniteDuration]) + implicit val t = Timeout(timeout + extraTime) Await.result(receiver ? Get(Deadline.now + timeout), Duration.Inf) } @@ -186,7 +184,7 @@ trait Inbox { this: ActorDSL.type ⇒ * this method within an actor! */ def select[T](timeout: FiniteDuration = defaultTimeout)(predicate: PartialFunction[Any, T]): T = { - implicit val t = Timeout((timeout + extraTime).asInstanceOf[FiniteDuration]) + implicit val t = Timeout(timeout + extraTime) predicate(Await.result(receiver ? Select(Deadline.now + timeout, predicate), Duration.Inf)) } diff --git a/akka-actor/src/main/scala/akka/actor/dungeon/FaultHandling.scala b/akka-actor/src/main/scala/akka/actor/dungeon/FaultHandling.scala index a42d15c6f5..5ea0772f61 100644 --- a/akka-actor/src/main/scala/akka/actor/dungeon/FaultHandling.scala +++ b/akka-actor/src/main/scala/akka/actor/dungeon/FaultHandling.scala @@ -16,7 +16,7 @@ import akka.actor.PreRestartException import akka.actor.Failed import akka.actor.PostRestartException import akka.event.Logging.Debug -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration private[akka] trait FaultHandling { this: ActorCell ⇒ diff --git a/akka-actor/src/main/scala/akka/actor/dungeon/ReceiveTimeout.scala b/akka-actor/src/main/scala/akka/actor/dungeon/ReceiveTimeout.scala index 0c3661b59a..5e1e4465eb 100644 --- a/akka-actor/src/main/scala/akka/actor/dungeon/ReceiveTimeout.scala +++ b/akka-actor/src/main/scala/akka/actor/dungeon/ReceiveTimeout.scala @@ -8,8 +8,8 @@ import ReceiveTimeout.emptyReceiveTimeoutData import akka.actor.ActorCell import akka.actor.ActorCell.emptyCancellable import akka.actor.Cancellable -import scala.concurrent.util.Duration -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration.Duration +import scala.concurrent.duration.FiniteDuration private[akka] object ReceiveTimeout { final val emptyReceiveTimeoutData: (Duration, Cancellable) = (Duration.Undefined, ActorCell.emptyCancellable) diff --git a/akka-actor/src/main/scala/akka/dispatch/AbstractDispatcher.scala b/akka-actor/src/main/scala/akka/dispatch/AbstractDispatcher.scala index 23fa51bb76..2d19949335 100644 --- a/akka-actor/src/main/scala/akka/dispatch/AbstractDispatcher.scala +++ b/akka-actor/src/main/scala/akka/dispatch/AbstractDispatcher.scala @@ -13,10 +13,10 @@ import akka.serialization.SerializationExtension import akka.util.{ Unsafe, Index } import scala.annotation.tailrec import scala.concurrent.forkjoin.{ ForkJoinTask, ForkJoinPool } -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import scala.concurrent.{ ExecutionContext, Await, Awaitable } import scala.util.control.NonFatal -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration.FiniteDuration final case class Envelope private (val message: Any, val sender: ActorRef) diff --git a/akka-actor/src/main/scala/akka/dispatch/BalancingDispatcher.scala b/akka-actor/src/main/scala/akka/dispatch/BalancingDispatcher.scala index c90048c80b..6efb5771ef 100644 --- a/akka-actor/src/main/scala/akka/dispatch/BalancingDispatcher.scala +++ b/akka-actor/src/main/scala/akka/dispatch/BalancingDispatcher.scala @@ -6,12 +6,12 @@ package akka.dispatch import akka.actor.{ ActorCell, ActorRef } import scala.annotation.tailrec -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import akka.util.Helpers import java.util.{ Comparator, Iterator } import java.util.concurrent.{ Executor, LinkedBlockingQueue, ConcurrentLinkedQueue, ConcurrentSkipListSet } import akka.actor.ActorSystemImpl -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration.FiniteDuration /** * An executor based event driven dispatcher which will try to redistribute work from busy actors to idle actors. It is assumed diff --git a/akka-actor/src/main/scala/akka/dispatch/Dispatcher.scala b/akka-actor/src/main/scala/akka/dispatch/Dispatcher.scala index 96166022f8..67e70291b7 100644 --- a/akka-actor/src/main/scala/akka/dispatch/Dispatcher.scala +++ b/akka-actor/src/main/scala/akka/dispatch/Dispatcher.scala @@ -10,9 +10,9 @@ import akka.event.Logging import java.util.concurrent.atomic.AtomicReference import java.util.concurrent.{ ExecutorService, RejectedExecutionException } import scala.concurrent.forkjoin.ForkJoinPool -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import scala.concurrent.Awaitable -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration.FiniteDuration /** * The event-based ``Dispatcher`` binds a set of Actors to a thread pool backed up by a diff --git a/akka-actor/src/main/scala/akka/dispatch/Dispatchers.scala b/akka-actor/src/main/scala/akka/dispatch/Dispatchers.scala index 125c400bb6..e1ae0ae50b 100644 --- a/akka-actor/src/main/scala/akka/dispatch/Dispatchers.scala +++ b/akka-actor/src/main/scala/akka/dispatch/Dispatchers.scala @@ -9,7 +9,7 @@ import com.typesafe.config.{ ConfigFactory, Config } import akka.actor.{ Scheduler, DynamicAccess, ActorSystem } import akka.event.Logging.Warning import akka.event.EventStream -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration /** * DispatcherPrerequisites represents useful contextual pieces when constructing a MessageDispatcher diff --git a/akka-actor/src/main/scala/akka/dispatch/Mailbox.scala b/akka-actor/src/main/scala/akka/dispatch/Mailbox.scala index 8d9a553ffb..d17ad5b7b6 100644 --- a/akka-actor/src/main/scala/akka/dispatch/Mailbox.scala +++ b/akka-actor/src/main/scala/akka/dispatch/Mailbox.scala @@ -9,11 +9,11 @@ import akka.AkkaException import akka.actor.{ ActorCell, ActorRef, Cell, ActorSystem, InternalActorRef, DeadLetter } import akka.util.{ Unsafe, BoundedBlockingQueue } import akka.event.Logging.Error -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import scala.annotation.tailrec import scala.util.control.NonFatal import com.typesafe.config.Config -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration.FiniteDuration /** * INTERNAL API diff --git a/akka-actor/src/main/scala/akka/dispatch/PinnedDispatcher.scala b/akka-actor/src/main/scala/akka/dispatch/PinnedDispatcher.scala index af421ddb96..52d5587597 100644 --- a/akka-actor/src/main/scala/akka/dispatch/PinnedDispatcher.scala +++ b/akka-actor/src/main/scala/akka/dispatch/PinnedDispatcher.scala @@ -5,8 +5,8 @@ package akka.dispatch import akka.actor.ActorCell -import scala.concurrent.util.Duration -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration.Duration +import scala.concurrent.duration.FiniteDuration /** * Dedicates a unique thread for each actor passed in as reference. Served through its messageQueue. diff --git a/akka-actor/src/main/scala/akka/dispatch/ThreadPoolBuilder.scala b/akka-actor/src/main/scala/akka/dispatch/ThreadPoolBuilder.scala index 67b0aa33a5..9d06a7b74c 100644 --- a/akka-actor/src/main/scala/akka/dispatch/ThreadPoolBuilder.scala +++ b/akka-actor/src/main/scala/akka/dispatch/ThreadPoolBuilder.scala @@ -6,7 +6,7 @@ package akka.dispatch import java.util.Collection import scala.concurrent.{ Awaitable, BlockContext, CanAwait } -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import scala.concurrent.forkjoin._ import java.util.concurrent.{ ArrayBlockingQueue, diff --git a/akka-actor/src/main/scala/akka/event/Logging.scala b/akka-actor/src/main/scala/akka/event/Logging.scala index e6003f5279..c9286cf2c9 100644 --- a/akka-actor/src/main/scala/akka/event/Logging.scala +++ b/akka-actor/src/main/scala/akka/event/Logging.scala @@ -9,7 +9,7 @@ import akka.actor._ import akka.{ ConfigurationException, AkkaException } import akka.actor.ActorSystem.Settings import akka.util.{ Timeout, ReentrantGuard } -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import java.util.concurrent.atomic.AtomicInteger import scala.util.control.NoStackTrace import java.util.concurrent.TimeoutException diff --git a/akka-actor/src/main/scala/akka/pattern/CircuitBreaker.scala b/akka-actor/src/main/scala/akka/pattern/CircuitBreaker.scala index df228f821d..6aa618f6e7 100644 --- a/akka-actor/src/main/scala/akka/pattern/CircuitBreaker.scala +++ b/akka-actor/src/main/scala/akka/pattern/CircuitBreaker.scala @@ -10,8 +10,7 @@ import akka.util.Unsafe import scala.util.control.NoStackTrace import java.util.concurrent.{ Callable, CopyOnWriteArrayList } import scala.concurrent.{ ExecutionContext, Future, Promise, Await } -import scala.concurrent.util.{ FiniteDuration, Deadline } -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import scala.util.control.NonFatal import scala.util.Success @@ -453,7 +452,7 @@ class CircuitBreaker(scheduler: Scheduler, maxFailures: Int, callTimeout: Finite * @return Future containing result of protected call */ override def invoke[T](body: ⇒ Future[T]): Future[T] = - Promise.failed[T](new CircuitBreakerOpenException(remainingTimeout().timeLeft.asInstanceOf[FiniteDuration])).future + Promise.failed[T](new CircuitBreakerOpenException(remainingTimeout().timeLeft)).future /** * Calculate remaining timeout to inform the caller in case a backoff algorithm is useful diff --git a/akka-actor/src/main/scala/akka/pattern/FutureTimeoutSupport.scala b/akka-actor/src/main/scala/akka/pattern/FutureTimeoutSupport.scala index dc398e7fa2..6820cf4bfa 100644 --- a/akka-actor/src/main/scala/akka/pattern/FutureTimeoutSupport.scala +++ b/akka-actor/src/main/scala/akka/pattern/FutureTimeoutSupport.scala @@ -4,11 +4,11 @@ package akka.pattern * Copyright (C) 2009-2012 Typesafe Inc. */ -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import scala.concurrent.{ ExecutionContext, Promise, Future } import akka.actor._ import scala.util.control.NonFatal -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration.FiniteDuration trait FutureTimeoutSupport { /** diff --git a/akka-actor/src/main/scala/akka/pattern/GracefulStopSupport.scala b/akka-actor/src/main/scala/akka/pattern/GracefulStopSupport.scala index 37fcc532e6..9279707238 100644 --- a/akka-actor/src/main/scala/akka/pattern/GracefulStopSupport.scala +++ b/akka-actor/src/main/scala/akka/pattern/GracefulStopSupport.scala @@ -8,9 +8,9 @@ import akka.actor._ import akka.util.{ Timeout } import akka.dispatch.{ Unwatch, Watch } import scala.concurrent.Future -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import scala.util.Success -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration.FiniteDuration trait GracefulStopSupport { /** diff --git a/akka-actor/src/main/scala/akka/pattern/Patterns.scala b/akka-actor/src/main/scala/akka/pattern/Patterns.scala index c4440f4723..66e391c285 100644 --- a/akka-actor/src/main/scala/akka/pattern/Patterns.scala +++ b/akka-actor/src/main/scala/akka/pattern/Patterns.scala @@ -6,14 +6,14 @@ package akka.pattern import akka.actor.Scheduler import scala.concurrent.ExecutionContext import java.util.concurrent.Callable -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration.FiniteDuration object Patterns { import akka.actor.{ ActorRef, ActorSystem } import akka.pattern.{ ask ⇒ scalaAsk, pipe ⇒ scalaPipe, gracefulStop ⇒ scalaGracefulStop, after ⇒ scalaAfter } import akka.util.Timeout import scala.concurrent.Future - import scala.concurrent.util.Duration + import scala.concurrent.duration.Duration /** * Java API for `akka.pattern.ask`: diff --git a/akka-actor/src/main/scala/akka/routing/Routing.scala b/akka-actor/src/main/scala/akka/routing/Routing.scala index 8fcff84831..550404a3ea 100644 --- a/akka-actor/src/main/scala/akka/routing/Routing.scala +++ b/akka-actor/src/main/scala/akka/routing/Routing.scala @@ -6,8 +6,7 @@ package akka.routing import language.implicitConversions import language.postfixOps import akka.actor._ -import scala.concurrent.util.Duration -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.ConfigurationException import akka.pattern.pipe import com.typesafe.config.Config @@ -18,7 +17,6 @@ import scala.concurrent.forkjoin.ThreadLocalRandom import akka.dispatch.Dispatchers import scala.annotation.tailrec import concurrent.ExecutionContext -import scala.concurrent.util.FiniteDuration /** * A RoutedActorRef is an ActorRef that has a set of connected ActorRef and it uses a Router to diff --git a/akka-actor/src/main/scala/akka/util/Timeout.scala b/akka-actor/src/main/scala/akka/util/Timeout.scala index 62faa56f3d..7062eabd35 100644 --- a/akka-actor/src/main/scala/akka/util/Timeout.scala +++ b/akka-actor/src/main/scala/akka/util/Timeout.scala @@ -8,7 +8,7 @@ import language.implicitConversions import java.util.concurrent.TimeUnit import java.lang.{ Double ⇒ JDouble } -import scala.concurrent.util.{ Duration, FiniteDuration } +import scala.concurrent.duration.{ Duration, FiniteDuration } @SerialVersionUID(1L) case class Timeout(duration: FiniteDuration) { diff --git a/akka-agent/src/main/scala/akka/agent/Agent.scala b/akka-agent/src/main/scala/akka/agent/Agent.scala index f85fdfc4ed..215de37c28 100644 --- a/akka-agent/src/main/scala/akka/agent/Agent.scala +++ b/akka-agent/src/main/scala/akka/agent/Agent.scala @@ -10,7 +10,7 @@ import akka.pattern.ask import akka.util.Timeout import scala.concurrent.stm._ import scala.concurrent.{ ExecutionContext, Future, Promise, Await } -import scala.concurrent.util.{ FiniteDuration, Duration } +import scala.concurrent.duration.{ FiniteDuration, Duration } /** * Used internally to send functions. diff --git a/akka-agent/src/test/scala/akka/agent/AgentSpec.scala b/akka-agent/src/test/scala/akka/agent/AgentSpec.scala index 746cc18fae..e6fb305151 100644 --- a/akka-agent/src/test/scala/akka/agent/AgentSpec.scala +++ b/akka-agent/src/test/scala/akka/agent/AgentSpec.scala @@ -3,8 +3,7 @@ package akka.agent import language.postfixOps import scala.concurrent.{ Await, Future } -import scala.concurrent.util.Duration -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.util.Timeout import akka.testkit._ import scala.concurrent.stm._ diff --git a/akka-camel/src/main/scala/akka/camel/Activation.scala b/akka-camel/src/main/scala/akka/camel/Activation.scala index a12abc7d0c..b035cbd267 100644 --- a/akka-camel/src/main/scala/akka/camel/Activation.scala +++ b/akka-camel/src/main/scala/akka/camel/Activation.scala @@ -8,8 +8,9 @@ import akka.camel.internal._ import akka.util.Timeout import akka.actor.{ ActorSystem, Props, ActorRef } import akka.pattern._ -import scala.concurrent.util.Duration import concurrent.{ ExecutionContext, Future } +import scala.concurrent.duration.Duration +import scala.concurrent.duration.FiniteDuration /** * Activation trait that can be used to wait on activation or de-activation of Camel endpoints. @@ -34,4 +35,4 @@ trait Activation { * @param timeout the timeout of the Future */ def deactivationFutureFor(endpoint: ActorRef)(implicit timeout: Timeout, executor: ExecutionContext): Future[ActorRef] -} \ No newline at end of file +} diff --git a/akka-camel/src/main/scala/akka/camel/ActorRouteDefinition.scala b/akka-camel/src/main/scala/akka/camel/ActorRouteDefinition.scala index 9cb84a2a2a..e8b1be8550 100644 --- a/akka-camel/src/main/scala/akka/camel/ActorRouteDefinition.scala +++ b/akka-camel/src/main/scala/akka/camel/ActorRouteDefinition.scala @@ -7,7 +7,7 @@ package akka.camel import akka.actor.ActorRef import akka.camel.internal.component.CamelPath import org.apache.camel.model.ProcessorDefinition -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration /** * Wraps a [[org.apache.camel.model.ProcessorDefinition]]. diff --git a/akka-camel/src/main/scala/akka/camel/Camel.scala b/akka-camel/src/main/scala/akka/camel/Camel.scala index de2e61fd0d..afb2d3c3d8 100644 --- a/akka-camel/src/main/scala/akka/camel/Camel.scala +++ b/akka-camel/src/main/scala/akka/camel/Camel.scala @@ -10,10 +10,10 @@ import org.apache.camel.ProducerTemplate import org.apache.camel.impl.DefaultCamelContext import org.apache.camel.model.RouteDefinition import com.typesafe.config.Config -import scala.concurrent.util.Duration -import scala.concurrent.util.FiniteDuration -import java.util.concurrent.TimeUnit._ import akka.ConfigurationException +import scala.concurrent.duration.Duration +import java.util.concurrent.TimeUnit._ +import scala.concurrent.duration.FiniteDuration /** * Camel trait encapsulates the underlying camel machinery. diff --git a/akka-camel/src/main/scala/akka/camel/CamelSupport.scala b/akka-camel/src/main/scala/akka/camel/CamelSupport.scala index 84cd23e339..cf4c49283d 100644 --- a/akka-camel/src/main/scala/akka/camel/CamelSupport.scala +++ b/akka-camel/src/main/scala/akka/camel/CamelSupport.scala @@ -2,7 +2,7 @@ package akka.camel import akka.actor.Actor import com.typesafe.config.Config -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import java.util.concurrent.TimeUnit._ private[camel] trait CamelSupport { this: Actor ⇒ diff --git a/akka-camel/src/main/scala/akka/camel/Consumer.scala b/akka-camel/src/main/scala/akka/camel/Consumer.scala index 506624dbd6..8a5db0a8ed 100644 --- a/akka-camel/src/main/scala/akka/camel/Consumer.scala +++ b/akka-camel/src/main/scala/akka/camel/Consumer.scala @@ -7,8 +7,7 @@ package akka.camel import akka.camel.internal.CamelSupervisor.Register import org.apache.camel.model.{ RouteDefinition, ProcessorDefinition } import akka.actor._ -import scala.concurrent.util.FiniteDuration -import akka.dispatch.Mapper +import scala.concurrent.duration._ /** * Mixed in by Actor implementations that consume message from Camel endpoints. diff --git a/akka-camel/src/main/scala/akka/camel/internal/DefaultCamel.scala b/akka-camel/src/main/scala/akka/camel/internal/DefaultCamel.scala index 13d5fe73d1..e876a36e2a 100644 --- a/akka-camel/src/main/scala/akka/camel/internal/DefaultCamel.scala +++ b/akka-camel/src/main/scala/akka/camel/internal/DefaultCamel.scala @@ -7,8 +7,7 @@ import akka.event.Logging import akka.camel.{ CamelSettings, Camel } import akka.camel.internal.ActivationProtocol._ import scala.util.control.NonFatal -import scala.concurrent.util.Duration -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration._ import org.apache.camel.ProducerTemplate import concurrent.{ Future, ExecutionContext } import akka.util.Timeout @@ -99,4 +98,4 @@ private[camel] class DefaultCamel(val system: ExtendedActorSystem) extends Camel case EndpointDeActivated(`endpoint`) ⇒ endpoint case EndpointFailedToDeActivate(`endpoint`, cause) ⇒ throw cause }) -} \ No newline at end of file +} diff --git a/akka-camel/src/main/scala/akka/camel/internal/component/ActorComponent.scala b/akka-camel/src/main/scala/akka/camel/internal/component/ActorComponent.scala index 0e45a4eaec..47e9d54071 100644 --- a/akka-camel/src/main/scala/akka/camel/internal/component/ActorComponent.scala +++ b/akka-camel/src/main/scala/akka/camel/internal/component/ActorComponent.scala @@ -11,8 +11,7 @@ import org.apache.camel.impl.{ DefaultProducer, DefaultEndpoint, DefaultComponen import akka.actor._ import akka.pattern._ import scala.reflect.BeanProperty -import scala.concurrent.util.duration._ -import scala.concurrent.util.Duration +import scala.concurrent.duration._ import scala.concurrent.{ ExecutionContext, Future } import scala.util.control.NonFatal import java.util.concurrent.{ TimeUnit, TimeoutException, CountDownLatch } @@ -21,7 +20,6 @@ import akka.camel.internal.CamelExchangeAdapter import akka.camel.{ ActorNotRegisteredException, Camel, Ack, FailureResult, CamelMessage } import support.TypeConverterSupport import scala.util.{ Failure, Success, Try } -import scala.concurrent.util.FiniteDuration /** * For internal use only. diff --git a/akka-camel/src/test/java/akka/camel/ConsumerJavaTestBase.java b/akka-camel/src/test/java/akka/camel/ConsumerJavaTestBase.java index 0c9aad7e23..e8b178a463 100644 --- a/akka-camel/src/test/java/akka/camel/ConsumerJavaTestBase.java +++ b/akka-camel/src/test/java/akka/camel/ConsumerJavaTestBase.java @@ -4,6 +4,8 @@ package akka.camel; +import scala.concurrent.duration.Duration; +import scala.concurrent.duration.FiniteDuration; import akka.actor.ActorRef; import akka.actor.ActorSystem; import akka.actor.Props; @@ -11,12 +13,10 @@ import akka.testkit.JavaTestKit; import akka.util.Timeout; import scala.concurrent.Await; import scala.concurrent.ExecutionContext; -import scala.concurrent.util.Duration; import org.junit.AfterClass; import org.junit.Test; import java.util.concurrent.TimeUnit; import akka.testkit.AkkaSpec; -import scala.concurrent.util.FiniteDuration; import static org.junit.Assert.*; /** * @author Martin Krasser diff --git a/akka-camel/src/test/java/akka/camel/CustomRouteTestBase.java b/akka-camel/src/test/java/akka/camel/CustomRouteTestBase.java index 77b0294f60..c002bceec1 100644 --- a/akka-camel/src/test/java/akka/camel/CustomRouteTestBase.java +++ b/akka-camel/src/test/java/akka/camel/CustomRouteTestBase.java @@ -7,7 +7,8 @@ import akka.camel.javaapi.UntypedProducerActor; import akka.util.Timeout; import scala.concurrent.Await; import scala.concurrent.ExecutionContext; -import scala.concurrent.util.Duration; +import scala.concurrent.duration.Duration; +import scala.concurrent.duration.FiniteDuration; import org.apache.camel.CamelExecutionException; import org.apache.camel.Exchange; import org.apache.camel.Predicate; diff --git a/akka-camel/src/test/java/akka/camel/SampleErrorHandlingConsumer.java b/akka-camel/src/test/java/akka/camel/SampleErrorHandlingConsumer.java index c654e3958d..9c6af3ba2b 100644 --- a/akka-camel/src/test/java/akka/camel/SampleErrorHandlingConsumer.java +++ b/akka-camel/src/test/java/akka/camel/SampleErrorHandlingConsumer.java @@ -7,7 +7,7 @@ package akka.camel; import akka.actor.Status; import akka.camel.javaapi.UntypedConsumerActor; import akka.dispatch.Mapper; -import scala.concurrent.util.Duration; +import scala.concurrent.duration.Duration; import org.apache.camel.builder.Builder; import org.apache.camel.model.ProcessorDefinition; import org.apache.camel.model.RouteDefinition; diff --git a/akka-camel/src/test/scala/akka/camel/ActivationIntegrationTest.scala b/akka-camel/src/test/scala/akka/camel/ActivationIntegrationTest.scala index 54c671c3b5..a945e3a63e 100644 --- a/akka-camel/src/test/scala/akka/camel/ActivationIntegrationTest.scala +++ b/akka-camel/src/test/scala/akka/camel/ActivationIntegrationTest.scala @@ -7,7 +7,7 @@ package akka.camel import language.postfixOps import org.scalatest.matchers.MustMatchers -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import org.apache.camel.ProducerTemplate import akka.actor._ import TestSupport._ diff --git a/akka-camel/src/test/scala/akka/camel/ConcurrentActivationTest.scala b/akka-camel/src/test/scala/akka/camel/ConcurrentActivationTest.scala index 988e4a78f1..a4ad1564c2 100644 --- a/akka-camel/src/test/scala/akka/camel/ConcurrentActivationTest.scala +++ b/akka-camel/src/test/scala/akka/camel/ConcurrentActivationTest.scala @@ -6,7 +6,7 @@ import akka.camel.TestSupport.NonSharedCamelSystem import akka.actor.{ ActorRef, Props, Actor } import akka.routing.BroadcastRouter import concurrent.{ Promise, Await, Future } -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import language.postfixOps import akka.testkit._ import akka.util.Timeout diff --git a/akka-camel/src/test/scala/akka/camel/ConsumerIntegrationTest.scala b/akka-camel/src/test/scala/akka/camel/ConsumerIntegrationTest.scala index 0de66ae082..acc72ff9b1 100644 --- a/akka-camel/src/test/scala/akka/camel/ConsumerIntegrationTest.scala +++ b/akka-camel/src/test/scala/akka/camel/ConsumerIntegrationTest.scala @@ -17,7 +17,7 @@ import org.apache.camel.builder.Builder import org.apache.camel.{ FailedToCreateRouteException, CamelExecutionException } import java.util.concurrent.{ ExecutionException, TimeUnit, TimeoutException } import akka.actor.Status.Failure -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import concurrent.{ ExecutionContext, Await } import akka.testkit._ import akka.util.Timeout diff --git a/akka-camel/src/test/scala/akka/camel/ProducerFeatureTest.scala b/akka-camel/src/test/scala/akka/camel/ProducerFeatureTest.scala index 2ead3101bd..f549a25ef8 100644 --- a/akka-camel/src/test/scala/akka/camel/ProducerFeatureTest.scala +++ b/akka-camel/src/test/scala/akka/camel/ProducerFeatureTest.scala @@ -15,8 +15,7 @@ import akka.actor.SupervisorStrategy.Stop import org.scalatest.{ BeforeAndAfterEach, BeforeAndAfterAll, WordSpec } import akka.actor._ import akka.pattern._ -import scala.concurrent.util.{ Deadline, FiniteDuration } -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.util.Timeout import org.scalatest.matchers.MustMatchers import akka.testkit._ diff --git a/akka-camel/src/test/scala/akka/camel/TestSupport.scala b/akka-camel/src/test/scala/akka/camel/TestSupport.scala index 370e5f99f9..4ff7155666 100644 --- a/akka-camel/src/test/scala/akka/camel/TestSupport.scala +++ b/akka-camel/src/test/scala/akka/camel/TestSupport.scala @@ -7,11 +7,10 @@ package akka.camel import language.postfixOps import language.implicitConversions -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import java.util.concurrent.{ TimeoutException, ExecutionException, TimeUnit } import org.scalatest.{ BeforeAndAfterEach, BeforeAndAfterAll, Suite } import org.scalatest.matchers.{ BePropertyMatcher, BePropertyMatchResult } -import scala.concurrent.util.{ FiniteDuration, Duration } import scala.reflect.ClassTag import akka.actor.{ ActorRef, Props, ActorSystem, Actor } import concurrent.Await diff --git a/akka-camel/src/test/scala/akka/camel/UntypedProducerTest.scala b/akka-camel/src/test/scala/akka/camel/UntypedProducerTest.scala index a9d097aa10..e89a568b42 100644 --- a/akka-camel/src/test/scala/akka/camel/UntypedProducerTest.scala +++ b/akka-camel/src/test/scala/akka/camel/UntypedProducerTest.scala @@ -14,7 +14,7 @@ import akka.camel.TestSupport.SharedCamelSystem import akka.actor.Props import akka.pattern._ import scala.concurrent.Await -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import org.scalatest._ import akka.testkit._ import matchers.MustMatchers diff --git a/akka-camel/src/test/scala/akka/camel/internal/ActivationTrackerTest.scala b/akka-camel/src/test/scala/akka/camel/internal/ActivationTrackerTest.scala index 3b6c029fc0..99ebeafed7 100644 --- a/akka-camel/src/test/scala/akka/camel/internal/ActivationTrackerTest.scala +++ b/akka-camel/src/test/scala/akka/camel/internal/ActivationTrackerTest.scala @@ -2,13 +2,12 @@ package akka.camel.internal import language.postfixOps import org.scalatest.matchers.MustMatchers -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import org.scalatest.{ GivenWhenThen, BeforeAndAfterEach, BeforeAndAfterAll, WordSpec } import akka.actor.{ Props, ActorSystem } import akka.camel._ import akka.testkit.{ TimingTest, TestProbe, TestKit } import akka.camel.internal.ActivationProtocol._ -import scala.concurrent.util.FiniteDuration class ActivationTrackerTest extends TestKit(ActorSystem("test")) with WordSpec with MustMatchers with BeforeAndAfterAll with BeforeAndAfterEach with GivenWhenThen { diff --git a/akka-camel/src/test/scala/akka/camel/internal/component/ActorComponentConfigurationTest.scala b/akka-camel/src/test/scala/akka/camel/internal/component/ActorComponentConfigurationTest.scala index 09f9c1aa62..1be5295225 100644 --- a/akka-camel/src/test/scala/akka/camel/internal/component/ActorComponentConfigurationTest.scala +++ b/akka-camel/src/test/scala/akka/camel/internal/component/ActorComponentConfigurationTest.scala @@ -7,7 +7,7 @@ package akka.camel.internal.component import language.postfixOps import org.scalatest.matchers.MustMatchers -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.camel.TestSupport.SharedCamelSystem import org.apache.camel.Component import org.scalatest.WordSpec diff --git a/akka-camel/src/test/scala/akka/camel/internal/component/ActorProducerTest.scala b/akka-camel/src/test/scala/akka/camel/internal/component/ActorProducerTest.scala index d6088fef77..57d4ee02c6 100644 --- a/akka-camel/src/test/scala/akka/camel/internal/component/ActorProducerTest.scala +++ b/akka-camel/src/test/scala/akka/camel/internal/component/ActorProducerTest.scala @@ -10,8 +10,7 @@ import org.mockito.Matchers.any import org.mockito.Mockito._ import org.apache.camel.{ CamelContext, ProducerTemplate, AsyncCallback } import java.util.concurrent.atomic.AtomicBoolean -import scala.concurrent.util.duration._ -import concurrent.util.{ FiniteDuration, Duration } +import scala.concurrent.duration._ import java.lang.String import akka.camel._ import internal.{ DefaultCamel, CamelExchangeAdapter } diff --git a/akka-camel/src/test/scala/akka/camel/internal/component/DurationConverterTest.scala b/akka-camel/src/test/scala/akka/camel/internal/component/DurationConverterTest.scala index 307b0d71d7..06c5d5aa5e 100644 --- a/akka-camel/src/test/scala/akka/camel/internal/component/DurationConverterTest.scala +++ b/akka-camel/src/test/scala/akka/camel/internal/component/DurationConverterTest.scala @@ -7,8 +7,7 @@ package akka.camel.internal.component import language.postfixOps import org.scalatest.matchers.MustMatchers -import scala.concurrent.util.duration._ -import scala.concurrent.util.Duration +import scala.concurrent.duration._ import org.scalatest.WordSpec import org.apache.camel.TypeConversionException diff --git a/akka-cluster/src/main/scala/akka/cluster/AccrualFailureDetector.scala b/akka-cluster/src/main/scala/akka/cluster/AccrualFailureDetector.scala index 7efe1f0f1e..7293e54c67 100644 --- a/akka-cluster/src/main/scala/akka/cluster/AccrualFailureDetector.scala +++ b/akka-cluster/src/main/scala/akka/cluster/AccrualFailureDetector.scala @@ -10,8 +10,7 @@ import scala.collection.immutable.Map import scala.annotation.tailrec import java.util.concurrent.atomic.AtomicReference import java.util.concurrent.TimeUnit.NANOSECONDS -import scala.concurrent.util.Duration -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ object AccrualFailureDetector { private def realClock: () ⇒ Long = () ⇒ NANOSECONDS.toMillis(System.nanoTime) @@ -285,4 +284,4 @@ private[cluster] case class HeartbeatHistory private ( squaredIntervalSum = squaredIntervalSum - pow2(intervals.head)) private def pow2(x: Long) = x * x -} \ No newline at end of file +} diff --git a/akka-cluster/src/main/scala/akka/cluster/Cluster.scala b/akka-cluster/src/main/scala/akka/cluster/Cluster.scala index 25b1cd684b..69d3f6db03 100644 --- a/akka-cluster/src/main/scala/akka/cluster/Cluster.scala +++ b/akka-cluster/src/main/scala/akka/cluster/Cluster.scala @@ -14,8 +14,7 @@ import akka.pattern._ import akka.remote._ import akka.routing._ import akka.util._ -import scala.concurrent.util.duration._ -import scala.concurrent.util.{ Duration, Deadline } +import scala.concurrent.duration._ import scala.concurrent.forkjoin.ThreadLocalRandom import scala.annotation.tailrec import scala.collection.immutable.SortedSet @@ -24,7 +23,6 @@ import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicReference import akka.util.internal.HashedWheelTimer import concurrent.{ ExecutionContext, Await } -import scala.concurrent.util.FiniteDuration /** * Cluster Extension Id and factory for creating Cluster extension. diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala index 00d70afb5b..d23c06f443 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala @@ -4,8 +4,7 @@ package akka.cluster import scala.collection.immutable.SortedSet -import scala.concurrent.util.{ Deadline, Duration } -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import scala.concurrent.forkjoin.ThreadLocalRandom import akka.actor.{ Actor, ActorLogging, ActorRef, Address, Cancellable, Props, ReceiveTimeout, RootActorPath, Scheduler } import akka.actor.Status.Failure @@ -16,7 +15,6 @@ import akka.cluster.MemberStatus._ import akka.cluster.ClusterEvent._ import language.existentials import language.postfixOps -import scala.concurrent.util.FiniteDuration /** * Base trait for all cluster messages. All ClusterMessage's are serializable. @@ -196,25 +194,25 @@ private[cluster] final class ClusterCoreDaemon(publisher: ActorRef) extends Acto import context.dispatcher // start periodic gossip to random nodes in cluster - val gossipTask = scheduler.schedule(PeriodicTasksInitialDelay.max(GossipInterval).asInstanceOf[FiniteDuration], + val gossipTask = scheduler.schedule(PeriodicTasksInitialDelay.max(GossipInterval), GossipInterval, self, GossipTick) // start periodic heartbeat to all nodes in cluster - val heartbeatTask = scheduler.schedule(PeriodicTasksInitialDelay.max(HeartbeatInterval).asInstanceOf[FiniteDuration], + val heartbeatTask = scheduler.schedule(PeriodicTasksInitialDelay.max(HeartbeatInterval), HeartbeatInterval, self, HeartbeatTick) // start periodic cluster failure detector reaping (moving nodes condemned by the failure detector to unreachable list) - val failureDetectorReaperTask = scheduler.schedule(PeriodicTasksInitialDelay.max(UnreachableNodesReaperInterval).asInstanceOf[FiniteDuration], + val failureDetectorReaperTask = scheduler.schedule(PeriodicTasksInitialDelay.max(UnreachableNodesReaperInterval), UnreachableNodesReaperInterval, self, ReapUnreachableTick) // start periodic leader action management (only applies for the current leader) - val leaderActionsTask = scheduler.schedule(PeriodicTasksInitialDelay.max(LeaderActionsInterval).asInstanceOf[FiniteDuration], + val leaderActionsTask = scheduler.schedule(PeriodicTasksInitialDelay.max(LeaderActionsInterval), LeaderActionsInterval, self, LeaderActionsTick) // start periodic publish of current stats val publishStatsTask: Option[Cancellable] = if (PublishStatsInterval == Duration.Zero) None - else Some(scheduler.schedule(PeriodicTasksInitialDelay.max(PublishStatsInterval).asInstanceOf[FiniteDuration], + else Some(scheduler.schedule(PeriodicTasksInitialDelay.max(PublishStatsInterval), PublishStatsInterval, self, PublishStatsTick)) override def preStart(): Unit = { @@ -929,4 +927,4 @@ private[cluster] case class ClusterStats( def incrementMergeDetectedCount(): ClusterStats = copy(mergeDetectedCount = mergeDetectedCount + 1) -} \ No newline at end of file +} diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala index b48c9f066b..b4dffff0fa 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala @@ -8,8 +8,7 @@ import language.postfixOps import akka.actor.{ ReceiveTimeout, ActorLogging, ActorRef, Address, Actor, RootActorPath, Props } import java.security.MessageDigest import akka.pattern.{ CircuitBreaker, CircuitBreakerOpenException } -import scala.concurrent.util.duration._ -import scala.concurrent.util.Deadline +import scala.concurrent.duration._ /** * Sent at regular intervals for failure detection. @@ -128,4 +127,4 @@ private[cluster] final class ClusterHeartbeatSenderWorker(toRef: ActorRef) case ReceiveTimeout ⇒ context.stop(self) // cleanup when not used } -} \ No newline at end of file +} diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala index 7040c322fd..180d3eb40a 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala @@ -5,8 +5,7 @@ package akka.cluster import scala.language.postfixOps -import scala.concurrent.util.duration._ -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration._ import scala.collection.immutable.{ SortedSet, Map } import scala.concurrent.forkjoin.ThreadLocalRandom import scala.util.{ Try, Success, Failure } @@ -418,6 +417,7 @@ private[cluster] trait MetricNumericConverter { def convert(from: ScalaNumber): Either[Long, Double] = from match { case n: BigInt ⇒ Left(n.longValue()) case n: BigDecimal ⇒ Right(n.doubleValue()) + // FIXME: these are rejected as unreachable by the new pattern matcher case n: RichInt ⇒ Left(n.abs) case n: RichLong ⇒ Left(n.self) case n: RichDouble ⇒ Right(n.self) diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala index 6110df034a..babafd5b21 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala @@ -4,14 +4,14 @@ package akka.cluster import com.typesafe.config.Config -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import java.util.concurrent.TimeUnit.MILLISECONDS import akka.ConfigurationException import scala.collection.JavaConverters._ import akka.actor.Address import akka.actor.AddressFromURIString import akka.dispatch.Dispatchers -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration.FiniteDuration class ClusterSettings(val config: Config, val systemName: String) { import config._ diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterAccrualFailureDetectorSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterAccrualFailureDetectorSpec.scala index 0d4f62c740..05253a16b3 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterAccrualFailureDetectorSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterAccrualFailureDetectorSpec.scala @@ -6,7 +6,7 @@ package akka.cluster import com.typesafe.config.ConfigFactory import akka.remote.testkit.MultiNodeConfig import akka.remote.testkit.MultiNodeSpec -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.testkit._ object ClusterAccrualFailureDetectorMultiJvmSpec extends MultiNodeConfig { diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterMetricsDataStreamingOffSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterMetricsDataStreamingOffSpec.scala index 18f2bcf9ae..33ed0b8f6b 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterMetricsDataStreamingOffSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterMetricsDataStreamingOffSpec.scala @@ -5,7 +5,7 @@ package akka.cluster import scala.language.postfixOps -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.remote.testkit.{ MultiNodeSpec, MultiNodeConfig } import com.typesafe.config.ConfigFactory import akka.testkit.LongRunningTest diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterMetricsSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterMetricsSpec.scala index c6ef98e660..e04d3612d3 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterMetricsSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterMetricsSpec.scala @@ -5,7 +5,7 @@ package akka.cluster import scala.language.postfixOps -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import com.typesafe.config.ConfigFactory import akka.remote.testkit.MultiNodeConfig import akka.remote.testkit.MultiNodeSpec diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/ConvergenceSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/ConvergenceSpec.scala index 5cbcfaf6b6..c8125f32b1 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/ConvergenceSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/ConvergenceSpec.scala @@ -9,7 +9,7 @@ import com.typesafe.config.ConfigFactory import akka.remote.testkit.MultiNodeConfig import akka.remote.testkit.MultiNodeSpec import akka.testkit._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.Address case class ConvergenceMultiNodeConfig(failureDetectorPuppet: Boolean) extends MultiNodeConfig { diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/JoinInProgressSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/JoinInProgressSpec.scala index e198694aab..f59db3f21e 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/JoinInProgressSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/JoinInProgressSpec.scala @@ -8,8 +8,7 @@ import org.scalatest.BeforeAndAfter import akka.remote.testkit.MultiNodeConfig import akka.remote.testkit.MultiNodeSpec import akka.testkit._ -import scala.concurrent.util.duration._ -import scala.concurrent.util.Deadline +import scala.concurrent.duration._ object JoinInProgressMultiJvmSpec extends MultiNodeConfig { val first = role("first") diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/JoinSeedNodeSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/JoinSeedNodeSpec.scala index 1391b80127..4bec3ceb7d 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/JoinSeedNodeSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/JoinSeedNodeSpec.scala @@ -8,7 +8,7 @@ import org.scalatest.BeforeAndAfter import akka.remote.testkit.MultiNodeConfig import akka.remote.testkit.MultiNodeSpec import akka.testkit._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.Address object JoinSeedNodeMultiJvmSpec extends MultiNodeConfig { diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/LargeClusterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/LargeClusterSpec.scala index e5c72e642b..ec9a9d4b5b 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/LargeClusterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/LargeClusterSpec.scala @@ -8,19 +8,16 @@ import akka.remote.testkit.MultiNodeConfig import akka.remote.testkit.MultiNodeSpec import akka.testkit._ import akka.testkit.TestEvent._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.ActorSystem -import scala.concurrent.util.Deadline import java.util.concurrent.TimeoutException import scala.collection.immutable.SortedSet import scala.concurrent.Await -import scala.concurrent.util.Duration import java.util.concurrent.TimeUnit import akka.remote.testconductor.RoleName import akka.actor.Props import akka.actor.Actor import akka.cluster.MemberStatus._ -import scala.concurrent.util.FiniteDuration object LargeClusterMultiJvmSpec extends MultiNodeConfig { // each jvm simulates a datacenter with many nodes @@ -135,9 +132,7 @@ abstract class LargeClusterSpec systems foreach { Cluster(_) } } - def expectedMaxDuration(totalNodes: Int): FiniteDuration = - // this cast will always succeed, but the compiler does not know about it ... - (5.seconds + (2.seconds * totalNodes)).asInstanceOf[FiniteDuration] + def expectedMaxDuration(totalNodes: Int): FiniteDuration = 5.seconds + 2.seconds * totalNodes def joinAll(from: RoleName, to: RoleName, totalNodes: Int, runOnRoles: RoleName*): Unit = { val joiningClusters = systems.map(Cluster(_)).toSet @@ -285,7 +280,7 @@ abstract class LargeClusterSpec val unreachableNodes = nodesPerDatacenter val liveNodes = nodesPerDatacenter * 4 - within((30.seconds + (3.seconds * liveNodes)).asInstanceOf[FiniteDuration]) { + within(30.seconds + 3.seconds * liveNodes) { val startGossipCounts = Map.empty[Cluster, Long] ++ systems.map(sys ⇒ (Cluster(sys) -> Cluster(sys).readView.latestStats.receivedGossipCount)) def gossipCount(c: Cluster): Long = { diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderDowningNodeThatIsUnreachableSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderDowningNodeThatIsUnreachableSpec.scala index 4299ffe839..bf026b43b3 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderDowningNodeThatIsUnreachableSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderDowningNodeThatIsUnreachableSpec.scala @@ -10,7 +10,7 @@ import akka.remote.testkit.MultiNodeConfig import akka.remote.testkit.MultiNodeSpec import akka.testkit._ import akka.actor._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ case class LeaderDowningNodeThatIsUnreachableMultiNodeConfig(failureDetectorPuppet: Boolean) extends MultiNodeConfig { val first = role("first") diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderLeavingSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderLeavingSpec.scala index 394db2af77..ddbab3edbb 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderLeavingSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderLeavingSpec.scala @@ -8,7 +8,7 @@ import com.typesafe.config.ConfigFactory import akka.remote.testkit.MultiNodeConfig import akka.remote.testkit.MultiNodeSpec import akka.testkit._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.Props import akka.actor.Actor import akka.cluster.MemberStatus._ diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerExitingSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerExitingSpec.scala index afeec13d9e..b36ffccf7c 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerExitingSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerExitingSpec.scala @@ -9,7 +9,7 @@ import com.typesafe.config.ConfigFactory import akka.remote.testkit.MultiNodeConfig import akka.remote.testkit.MultiNodeSpec import akka.testkit._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.Props import akka.actor.Actor import akka.cluster.MemberStatus._ diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerJoinSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerJoinSpec.scala index 6454a87d45..effff75438 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerJoinSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerJoinSpec.scala @@ -9,7 +9,7 @@ import org.scalatest.BeforeAndAfter import akka.remote.testkit.MultiNodeConfig import akka.remote.testkit.MultiNodeSpec import akka.testkit._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.Props import akka.actor.Actor diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala index a5415e4aca..8e2497fc40 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala @@ -11,14 +11,12 @@ import akka.remote.testconductor.RoleName import akka.remote.testkit.{ STMultiNodeSpec, MultiNodeSpec } import akka.testkit._ import akka.testkit.TestEvent._ -import scala.concurrent.util.duration._ -import scala.concurrent.util.Duration +import scala.concurrent.duration._ import org.scalatest.Suite import org.scalatest.exceptions.TestFailedException import java.util.concurrent.ConcurrentHashMap import akka.actor.ActorPath import akka.actor.RootActorPath -import scala.concurrent.util.FiniteDuration import akka.event.Logging.ErrorLevel import akka.actor.ActorSystem diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeLeavingAndExitingAndBeingRemovedSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeLeavingAndExitingAndBeingRemovedSpec.scala index 3fec2f22ad..d7eaddf402 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeLeavingAndExitingAndBeingRemovedSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeLeavingAndExitingAndBeingRemovedSpec.scala @@ -8,7 +8,7 @@ import com.typesafe.config.ConfigFactory import akka.remote.testkit.MultiNodeConfig import akka.remote.testkit.MultiNodeSpec import akka.testkit._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ object NodeLeavingAndExitingAndBeingRemovedMultiJvmSpec extends MultiNodeConfig { val first = role("first") diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeLeavingAndExitingSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeLeavingAndExitingSpec.scala index 2e25b5fc12..e1051e4161 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeLeavingAndExitingSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeLeavingAndExitingSpec.scala @@ -8,7 +8,7 @@ import com.typesafe.config.ConfigFactory import akka.remote.testkit.MultiNodeConfig import akka.remote.testkit.MultiNodeSpec import akka.testkit._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.Props import akka.actor.Actor import akka.cluster.MemberStatus._ diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeUpSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeUpSpec.scala index 0b6cea8683..0a82b74563 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeUpSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeUpSpec.scala @@ -8,7 +8,7 @@ import org.scalatest.BeforeAndAfter import akka.remote.testkit.MultiNodeConfig import akka.remote.testkit.MultiNodeSpec import akka.testkit._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import scala.collection.immutable.SortedSet import java.util.concurrent.atomic.AtomicReference import akka.actor.Props diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/SingletonClusterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/SingletonClusterSpec.scala index 55b44a3c76..3575c5b6d4 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/SingletonClusterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/SingletonClusterSpec.scala @@ -7,7 +7,7 @@ import com.typesafe.config.ConfigFactory import akka.remote.testkit.MultiNodeConfig import akka.remote.testkit.MultiNodeSpec import akka.testkit._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ case class SingletonClusterMultiNodeConfig(failureDetectorPuppet: Boolean) extends MultiNodeConfig { val first = role("first") diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/SplitBrainSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/SplitBrainSpec.scala index 57223465fe..e1b1a4af96 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/SplitBrainSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/SplitBrainSpec.scala @@ -9,7 +9,7 @@ import com.typesafe.config.ConfigFactory import akka.remote.testkit.MultiNodeConfig import akka.remote.testkit.MultiNodeSpec import akka.testkit._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.Address import akka.remote.testconductor.Direction diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/SunnyWeatherSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/SunnyWeatherSpec.scala index 2fa233bcf5..581eca3978 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/SunnyWeatherSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/SunnyWeatherSpec.scala @@ -8,7 +8,7 @@ import org.scalatest.BeforeAndAfter import akka.remote.testkit.MultiNodeConfig import akka.remote.testkit.MultiNodeSpec import akka.testkit._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import java.util.concurrent.atomic.AtomicReference import scala.collection.immutable.SortedSet import akka.actor.Props diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/UnreachableNodeRejoinsClusterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/UnreachableNodeRejoinsClusterSpec.scala index 999f318679..db2f9fc930 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/UnreachableNodeRejoinsClusterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/UnreachableNodeRejoinsClusterSpec.scala @@ -12,7 +12,7 @@ import akka.testkit._ import com.typesafe.config.ConfigFactory import akka.actor.Address import akka.remote.testconductor.{ RoleName, Direction } -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ case class UnreachableNodeRejoinsClusterMultiNodeConfig(failureDetectorPuppet: Boolean) extends MultiNodeConfig { val first = role("first") diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterConsistentHashingRouterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterConsistentHashingRouterSpec.scala index c39edd8a13..daf4e81038 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterConsistentHashingRouterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterConsistentHashingRouterSpec.scala @@ -4,7 +4,7 @@ package akka.cluster.routing import scala.concurrent.Await -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import com.typesafe.config.ConfigFactory diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterRoundRobinRoutedActorSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterRoundRobinRoutedActorSpec.scala index a78b179652..0098da695b 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterRoundRobinRoutedActorSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterRoundRobinRoutedActorSpec.scala @@ -5,7 +5,7 @@ package akka.cluster.routing import language.postfixOps import scala.concurrent.Await -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import com.typesafe.config.ConfigFactory import akka.actor.Actor diff --git a/akka-cluster/src/test/scala/akka/cluster/AccrualFailureDetectorSpec.scala b/akka-cluster/src/test/scala/akka/cluster/AccrualFailureDetectorSpec.scala index 1cb0a9c164..45476864db 100644 --- a/akka-cluster/src/test/scala/akka/cluster/AccrualFailureDetectorSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/AccrualFailureDetectorSpec.scala @@ -8,8 +8,7 @@ import akka.actor.Address import akka.testkit._ import akka.testkit.TestEvent._ import scala.collection.immutable.TreeMap -import scala.concurrent.util.duration._ -import scala.concurrent.util.Duration +import scala.concurrent.duration._ @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) class AccrualFailureDetectorSpec extends AkkaSpec(""" diff --git a/akka-cluster/src/test/scala/akka/cluster/ClusterConfigSpec.scala b/akka-cluster/src/test/scala/akka/cluster/ClusterConfigSpec.scala index be5ae74e4d..360b82f04f 100644 --- a/akka-cluster/src/test/scala/akka/cluster/ClusterConfigSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/ClusterConfigSpec.scala @@ -8,8 +8,7 @@ import language.postfixOps import akka.testkit.AkkaSpec import akka.dispatch.Dispatchers -import scala.concurrent.util.duration._ -import scala.concurrent.util.Duration +import scala.concurrent.duration._ @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) class ClusterConfigSpec extends AkkaSpec { diff --git a/akka-cluster/src/test/scala/akka/cluster/ClusterDomainEventPublisherSpec.scala b/akka-cluster/src/test/scala/akka/cluster/ClusterDomainEventPublisherSpec.scala index 5b615a61af..0907a3abb8 100644 --- a/akka-cluster/src/test/scala/akka/cluster/ClusterDomainEventPublisherSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/ClusterDomainEventPublisherSpec.scala @@ -6,7 +6,7 @@ package akka.cluster import language.postfixOps import scala.collection.immutable.SortedSet -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import org.scalatest.BeforeAndAfterEach import akka.actor.Address import akka.actor.Props diff --git a/akka-cluster/src/test/scala/akka/cluster/ClusterSpec.scala b/akka-cluster/src/test/scala/akka/cluster/ClusterSpec.scala index 8edbdd1669..a659abf313 100644 --- a/akka-cluster/src/test/scala/akka/cluster/ClusterSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/ClusterSpec.scala @@ -6,8 +6,7 @@ package akka.cluster import language.postfixOps import language.reflectiveCalls -import scala.concurrent.util.duration._ -import scala.concurrent.util.Duration +import scala.concurrent.duration._ import akka.testkit.AkkaSpec import akka.testkit.ImplicitSender import akka.actor.ExtendedActorSystem diff --git a/akka-cluster/src/test/scala/akka/cluster/DataStreamSpec.scala b/akka-cluster/src/test/scala/akka/cluster/DataStreamSpec.scala index 2f2ccaa2ae..f77c9fdcdb 100644 --- a/akka-cluster/src/test/scala/akka/cluster/DataStreamSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/DataStreamSpec.scala @@ -5,7 +5,7 @@ package akka.cluster import language.postfixOps -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.testkit.{ LongRunningTest, AkkaSpec } diff --git a/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala index ea881f5a71..f00869d92f 100644 --- a/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala @@ -5,8 +5,7 @@ package akka.cluster import scala.language.postfixOps -import scala.concurrent.util.duration._ -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration._ import scala.concurrent.Await import akka.actor._ diff --git a/akka-cluster/src/test/scala/akka/cluster/MetricsGossipSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricsGossipSpec.scala index 3ff6db6de2..9a782b528a 100644 --- a/akka-cluster/src/test/scala/akka/cluster/MetricsGossipSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/MetricsGossipSpec.scala @@ -4,7 +4,7 @@ package akka.cluster -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.testkit.{ ImplicitSender, AkkaSpec } import akka.actor.Address diff --git a/akka-contrib/src/main/scala/akka/contrib/pattern/ReliableProxy.scala b/akka-contrib/src/main/scala/akka/contrib/pattern/ReliableProxy.scala index d46eff9f5f..9d4b9ecd7b 100644 --- a/akka-contrib/src/main/scala/akka/contrib/pattern/ReliableProxy.scala +++ b/akka-contrib/src/main/scala/akka/contrib/pattern/ReliableProxy.scala @@ -6,7 +6,7 @@ package akka.contrib.pattern import akka.actor._ import akka.remote.RemoteScope -import scala.concurrent.util._ +import scala.concurrent.duration._ object ReliableProxy { @@ -164,4 +164,4 @@ class ReliableProxy(target: ActorRef, retryAfter: FiniteDuration) extends Actor m } -} \ No newline at end of file +} diff --git a/akka-contrib/src/test/java/akka/contrib/pattern/ReliableProxyTest.java b/akka-contrib/src/test/java/akka/contrib/pattern/ReliableProxyTest.java index afb0c34378..4ae2c20b1f 100644 --- a/akka-contrib/src/test/java/akka/contrib/pattern/ReliableProxyTest.java +++ b/akka-contrib/src/test/java/akka/contrib/pattern/ReliableProxyTest.java @@ -8,8 +8,8 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import scala.concurrent.util.Duration; -import scala.concurrent.util.FiniteDuration; +import scala.concurrent.duration.Duration; +import scala.concurrent.duration.FiniteDuration; import akka.actor.Actor; import akka.actor.ActorRef; import akka.actor.ActorSystem; diff --git a/akka-contrib/src/test/scala/akka/contrib/pattern/ReliableProxyDocSpec.scala b/akka-contrib/src/test/scala/akka/contrib/pattern/ReliableProxyDocSpec.scala index 259c94010c..07c2d7af74 100644 --- a/akka-contrib/src/test/scala/akka/contrib/pattern/ReliableProxyDocSpec.scala +++ b/akka-contrib/src/test/scala/akka/contrib/pattern/ReliableProxyDocSpec.scala @@ -8,7 +8,7 @@ import akka.testkit.AkkaSpec import akka.actor.Props import akka.actor.Actor import akka.testkit.ImplicitSender -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.FSM import akka.actor.ActorRef @@ -39,4 +39,4 @@ class ReliableProxyDocSpec extends AkkaSpec with ImplicitSender { } -} \ No newline at end of file +} diff --git a/akka-dataflow/src/test/scala/akka/dataflow/DataflowSpec.scala b/akka-dataflow/src/test/scala/akka/dataflow/DataflowSpec.scala index 2bc616881b..8af04d0e0a 100644 --- a/akka-dataflow/src/test/scala/akka/dataflow/DataflowSpec.scala +++ b/akka-dataflow/src/test/scala/akka/dataflow/DataflowSpec.scala @@ -11,7 +11,7 @@ import akka.actor.Status._ import akka.pattern.ask import akka.testkit.{ EventFilter, filterEvents, filterException } import scala.concurrent.{ Await, Promise, Future } -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.testkit.{ DefaultTimeout, TestLatch, AkkaSpec } import java.util.concurrent.TimeoutException diff --git a/akka-docs/rst/common/code/docs/circuitbreaker/CircuitBreakerDocSpec.scala b/akka-docs/rst/common/code/docs/circuitbreaker/CircuitBreakerDocSpec.scala index 9d279f0df0..55d5cfb657 100644 --- a/akka-docs/rst/common/code/docs/circuitbreaker/CircuitBreakerDocSpec.scala +++ b/akka-docs/rst/common/code/docs/circuitbreaker/CircuitBreakerDocSpec.scala @@ -5,7 +5,7 @@ package docs.circuitbreaker //#imports1 -import scala.concurrent.util.duration._ // small d is important here +import scala.concurrent.duration._ import akka.pattern.CircuitBreaker import akka.pattern.pipe import akka.actor.Actor diff --git a/akka-docs/rst/common/code/docs/duration/Sample.scala b/akka-docs/rst/common/code/docs/duration/Sample.scala index cd559ccfee..2bad498fd0 100644 --- a/akka-docs/rst/common/code/docs/duration/Sample.scala +++ b/akka-docs/rst/common/code/docs/duration/Sample.scala @@ -6,7 +6,7 @@ package docs.duration object Scala { //#dsl - import scala.concurrent.util.duration._ // notice the small d + import scala.concurrent.duration._ val fivesec = 5.seconds val threemillis = 3.millis diff --git a/akka-docs/rst/modules/code/docs/actor/mailbox/DurableMailboxDocSpec.scala b/akka-docs/rst/modules/code/docs/actor/mailbox/DurableMailboxDocSpec.scala index 9618f81ff9..4c2880f53d 100644 --- a/akka-docs/rst/modules/code/docs/actor/mailbox/DurableMailboxDocSpec.scala +++ b/akka-docs/rst/modules/code/docs/actor/mailbox/DurableMailboxDocSpec.scala @@ -53,7 +53,7 @@ import akka.dispatch.MessageQueue import akka.actor.mailbox.DurableMessageQueue import akka.actor.mailbox.DurableMessageSerialization import akka.pattern.CircuitBreaker -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ class MyMailboxType(systemSettings: ActorSystem.Settings, config: Config) extends MailboxType { diff --git a/akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst b/akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst index 449746ad02..ae59cf2d7c 100644 --- a/akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst +++ b/akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst @@ -38,9 +38,9 @@ Search Replace with ``akka.dispatch.Future`` ``scala.concurrent.Future`` ``akka.dispatch.Promise`` ``scala.concurrent.Promise`` ``akka.dispatch.ExecutionContext`` ``scala.concurrent.ExecutionContext`` -``akka.util.Duration`` ``scala.concurrent.util.Duration`` -``akka.util.duration`` ``scala.concurrent.util.duration`` -``akka.util.Deadline`` ``scala.concurrent.util.Deadline`` +``akka.util.Duration`` ``scala.concurrent.duration.Duration`` +``akka.util.duration`` ``scala.concurrent.duration`` +``akka.util.Deadline`` ``scala.concurrent.duration.Deadline`` ``akka.util.NonFatal`` ``scala.util.control.NonFatal`` ``akka.japi.Util.manifest`` ``akka.japi.Util.classTag`` ==================================== ==================================== diff --git a/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala b/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala index 0cd43bdd7e..15e542b264 100644 --- a/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala @@ -18,7 +18,7 @@ import org.scalatest.{ BeforeAndAfterAll, WordSpec } import org.scalatest.matchers.MustMatchers import akka.testkit._ import akka.util._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.Actor.Receive import scala.concurrent.Await @@ -245,7 +245,7 @@ class ActorDocSpec extends AkkaSpec(Map("akka.loglevel" -> "INFO")) { "using implicit timeout" in { val myActor = system.actorOf(Props(new FirstActor)) //#using-implicit-timeout - import scala.concurrent.util.duration._ + import scala.concurrent.duration._ import akka.util.Timeout import akka.pattern.ask implicit val timeout = Timeout(5 seconds) @@ -258,7 +258,7 @@ class ActorDocSpec extends AkkaSpec(Map("akka.loglevel" -> "INFO")) { "using explicit timeout" in { val myActor = system.actorOf(Props(new FirstActor)) //#using-explicit-timeout - import scala.concurrent.util.duration._ + import scala.concurrent.duration._ import akka.pattern.ask val future = myActor.ask("hello")(5 seconds) //#using-explicit-timeout @@ -268,7 +268,7 @@ class ActorDocSpec extends AkkaSpec(Map("akka.loglevel" -> "INFO")) { "using receiveTimeout" in { //#receive-timeout import akka.actor.ReceiveTimeout - import scala.concurrent.util.duration._ + import scala.concurrent.duration._ class MyActor extends Actor { context.setReceiveTimeout(30 milliseconds) def receive = { diff --git a/akka-docs/rst/scala/code/docs/actor/FSMDocSpec.scala b/akka-docs/rst/scala/code/docs/actor/FSMDocSpec.scala index 5bc1ea8d70..bcc908990f 100644 --- a/akka-docs/rst/scala/code/docs/actor/FSMDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/actor/FSMDocSpec.scala @@ -15,7 +15,7 @@ class FSMDocSpec extends MyFavoriteTestFrameWorkPlusAkkaTestKit { //#fsm-code-elided //#simple-imports import akka.actor.{ Actor, ActorRef, FSM } - import scala.concurrent.util.duration._ + import scala.concurrent.duration._ //#simple-imports //#simple-events // received events diff --git a/akka-docs/rst/scala/code/docs/actor/FaultHandlingDocSample.scala b/akka-docs/rst/scala/code/docs/actor/FaultHandlingDocSample.scala index ade871de77..cc1bd3053a 100644 --- a/akka-docs/rst/scala/code/docs/actor/FaultHandlingDocSample.scala +++ b/akka-docs/rst/scala/code/docs/actor/FaultHandlingDocSample.scala @@ -9,8 +9,7 @@ import language.postfixOps //#imports import akka.actor._ import akka.actor.SupervisorStrategy._ -import scala.concurrent.util.duration._ -import scala.concurrent.util.Duration +import scala.concurrent.duration._ import akka.util.Timeout import akka.event.LoggingReceive import akka.pattern.{ ask, pipe } diff --git a/akka-docs/rst/scala/code/docs/actor/FaultHandlingDocSpec.scala b/akka-docs/rst/scala/code/docs/actor/FaultHandlingDocSpec.scala index d96771a87a..5c35ae6e2a 100644 --- a/akka-docs/rst/scala/code/docs/actor/FaultHandlingDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/actor/FaultHandlingDocSpec.scala @@ -22,7 +22,7 @@ object FaultHandlingDocSpec { //#strategy import akka.actor.OneForOneStrategy import akka.actor.SupervisorStrategy._ - import scala.concurrent.util.duration._ + import scala.concurrent.duration._ override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) { @@ -44,7 +44,7 @@ object FaultHandlingDocSpec { //#strategy2 import akka.actor.OneForOneStrategy import akka.actor.SupervisorStrategy._ - import scala.concurrent.util.duration._ + import scala.concurrent.duration._ override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) { diff --git a/akka-docs/rst/scala/code/docs/actor/SchedulerDocSpec.scala b/akka-docs/rst/scala/code/docs/actor/SchedulerDocSpec.scala index 2d76628089..5b46d94298 100644 --- a/akka-docs/rst/scala/code/docs/actor/SchedulerDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/actor/SchedulerDocSpec.scala @@ -8,7 +8,7 @@ import language.postfixOps //#imports1 import akka.actor.Actor import akka.actor.Props -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ //#imports1 diff --git a/akka-docs/rst/scala/code/docs/actor/TypedActorDocSpec.scala b/akka-docs/rst/scala/code/docs/actor/TypedActorDocSpec.scala index 7ef1204a7d..487ff8f04c 100644 --- a/akka-docs/rst/scala/code/docs/actor/TypedActorDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/actor/TypedActorDocSpec.scala @@ -7,7 +7,7 @@ import language.postfixOps //#imports import scala.concurrent.{ Promise, Future, Await } -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.{ ActorContext, TypedActor, TypedProps } //#imports diff --git a/akka-docs/rst/scala/code/docs/agent/AgentDocSpec.scala b/akka-docs/rst/scala/code/docs/agent/AgentDocSpec.scala index 1f855057e4..1eaf81f15d 100644 --- a/akka-docs/rst/scala/code/docs/agent/AgentDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/agent/AgentDocSpec.scala @@ -6,7 +6,7 @@ package docs.agent import language.postfixOps import akka.agent.Agent -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.util.Timeout import akka.testkit._ @@ -99,7 +99,7 @@ class AgentDocSpec extends AkkaSpec { val agent = Agent(0) //#read-await - import scala.concurrent.util.duration._ + import scala.concurrent.duration._ import akka.util.Timeout implicit val timeout = Timeout(5 seconds) @@ -126,7 +126,7 @@ class AgentDocSpec extends AkkaSpec { "transfer example" in { //#transfer-example import akka.agent.Agent - import scala.concurrent.util.duration._ + import scala.concurrent.duration._ import akka.util.Timeout import scala.concurrent.stm._ diff --git a/akka-docs/rst/scala/code/docs/camel/Consumers.scala b/akka-docs/rst/scala/code/docs/camel/Consumers.scala index 1d500cf04c..f1d184ec66 100644 --- a/akka-docs/rst/scala/code/docs/camel/Consumers.scala +++ b/akka-docs/rst/scala/code/docs/camel/Consumers.scala @@ -59,7 +59,7 @@ object Consumers { object Sample4 { //#Consumer4 import akka.camel.{ CamelMessage, Consumer } - import scala.concurrent.util.duration._ + import scala.concurrent.duration._ class Consumer4 extends Consumer { def endpointUri = "jetty:http://localhost:8877/camel/default" diff --git a/akka-docs/rst/scala/code/docs/camel/Introduction.scala b/akka-docs/rst/scala/code/docs/camel/Introduction.scala index 348e6ed914..e1b5f17a17 100644 --- a/akka-docs/rst/scala/code/docs/camel/Introduction.scala +++ b/akka-docs/rst/scala/code/docs/camel/Introduction.scala @@ -79,7 +79,7 @@ object Introduction { { //#CamelActivation import akka.camel.{ CamelMessage, Consumer } - import scala.concurrent.util.duration._ + import scala.concurrent.duration._ class MyEndpoint extends Consumer { def endpointUri = "mina:tcp://localhost:6200?textline=true" diff --git a/akka-docs/rst/scala/code/docs/camel/Producers.scala b/akka-docs/rst/scala/code/docs/camel/Producers.scala index fe471eec89..8835ec7df3 100644 --- a/akka-docs/rst/scala/code/docs/camel/Producers.scala +++ b/akka-docs/rst/scala/code/docs/camel/Producers.scala @@ -17,7 +17,7 @@ object Producers { //#Producer1 //#AskProducer import akka.pattern.ask - import scala.concurrent.util.duration._ + import scala.concurrent.duration._ implicit val timeout = Timeout(10 seconds) val system = ActorSystem("some-system") diff --git a/akka-docs/rst/scala/code/docs/dataflow/DataflowDocSpec.scala b/akka-docs/rst/scala/code/docs/dataflow/DataflowDocSpec.scala index 8cd02a56f3..a32ee6fcae 100644 --- a/akka-docs/rst/scala/code/docs/dataflow/DataflowDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/dataflow/DataflowDocSpec.scala @@ -5,7 +5,7 @@ package docs.dataflow import language.postfixOps -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import scala.concurrent.{ Await, Future, Promise } import org.scalatest.WordSpec import org.scalatest.matchers.MustMatchers diff --git a/akka-docs/rst/scala/code/docs/dispatcher/DispatcherDocSpec.scala b/akka-docs/rst/scala/code/docs/dispatcher/DispatcherDocSpec.scala index 7d06bb43da..1d19f30622 100644 --- a/akka-docs/rst/scala/code/docs/dispatcher/DispatcherDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/dispatcher/DispatcherDocSpec.scala @@ -10,7 +10,7 @@ import org.scalatest.matchers.MustMatchers import akka.testkit.AkkaSpec import akka.event.Logging import akka.event.LoggingAdapter -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.{ Props, Actor, PoisonPill, ActorSystem } object DispatcherDocSpec { diff --git a/akka-docs/rst/scala/code/docs/future/FutureDocSpec.scala b/akka-docs/rst/scala/code/docs/future/FutureDocSpec.scala index 86aa0ba382..b7ea972f63 100644 --- a/akka-docs/rst/scala/code/docs/future/FutureDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/future/FutureDocSpec.scala @@ -9,7 +9,7 @@ import akka.testkit._ import akka.actor.{ Actor, Props } import akka.actor.Status import akka.util.Timeout -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import java.lang.IllegalStateException import scala.concurrent.{ Await, ExecutionContext, Future, Promise } import scala.util.{ Failure, Success } @@ -62,7 +62,7 @@ class FutureDocSpec extends AkkaSpec { import scala.concurrent.Await import akka.pattern.ask import akka.util.Timeout - import scala.concurrent.util.duration._ + import scala.concurrent.duration._ implicit val timeout = Timeout(5 seconds) val future = actor ? msg // enabled by the “ask” import @@ -88,7 +88,7 @@ class FutureDocSpec extends AkkaSpec { //#future-eval import scala.concurrent.Await import scala.concurrent.Future - import scala.concurrent.util.duration._ + import scala.concurrent.duration._ val future = Future { "Hello" + "World" diff --git a/akka-docs/rst/scala/code/docs/routing/RouterTypeExample.scala b/akka-docs/rst/scala/code/docs/routing/RouterTypeExample.scala index 4f48116b18..6fc5920ec9 100644 --- a/akka-docs/rst/scala/code/docs/routing/RouterTypeExample.scala +++ b/akka-docs/rst/scala/code/docs/routing/RouterTypeExample.scala @@ -8,7 +8,7 @@ import language.postfixOps import akka.routing.{ ScatterGatherFirstCompletedRouter, BroadcastRouter, RandomRouter, RoundRobinRouter } import annotation.tailrec import akka.actor.{ Props, Actor } -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.util.Timeout import scala.concurrent.Await import akka.pattern.ask diff --git a/akka-docs/rst/scala/code/docs/testkit/TestKitUsageSpec.scala b/akka-docs/rst/scala/code/docs/testkit/TestKitUsageSpec.scala index d767879cc2..48e6b6664b 100644 --- a/akka-docs/rst/scala/code/docs/testkit/TestKitUsageSpec.scala +++ b/akka-docs/rst/scala/code/docs/testkit/TestKitUsageSpec.scala @@ -21,7 +21,7 @@ import akka.actor.Props import akka.testkit.DefaultTimeout import akka.testkit.ImplicitSender import akka.testkit.TestKit -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ /** * a Test to show some TestKit examples diff --git a/akka-docs/rst/scala/code/docs/testkit/TestkitDocSpec.scala b/akka-docs/rst/scala/code/docs/testkit/TestkitDocSpec.scala index 8a78fc8c7a..028c4efbaa 100644 --- a/akka-docs/rst/scala/code/docs/testkit/TestkitDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/testkit/TestkitDocSpec.scala @@ -8,7 +8,7 @@ import scala.util.Success //#imports-test-probe import akka.testkit.TestProbe -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor._ import scala.concurrent.Future @@ -89,7 +89,7 @@ class TestkitDocSpec extends AkkaSpec with DefaultTimeout with ImplicitSender { //#test-fsm-ref import akka.testkit.TestFSMRef import akka.actor.FSM - import scala.concurrent.util.duration._ + import scala.concurrent.duration._ val fsm = TestFSMRef(new Actor with FSM[Int, String] { startWith(1, "") @@ -122,7 +122,7 @@ class TestkitDocSpec extends AkkaSpec with DefaultTimeout with ImplicitSender { //#test-behavior import akka.testkit.TestActorRef - import scala.concurrent.util.duration._ + import scala.concurrent.duration._ import scala.concurrent.Await import akka.pattern.ask @@ -161,7 +161,7 @@ class TestkitDocSpec extends AkkaSpec with DefaultTimeout with ImplicitSender { type Worker = MyActor //#test-within import akka.actor.Props - import scala.concurrent.util.duration._ + import scala.concurrent.duration._ val worker = system.actorOf(Props[Worker]) within(200 millis) { @@ -175,7 +175,7 @@ class TestkitDocSpec extends AkkaSpec with DefaultTimeout with ImplicitSender { "demonstrate dilated duration" in { //#duration-dilation - import scala.concurrent.util.duration._ + import scala.concurrent.duration._ import akka.testkit._ 10.milliseconds.dilated //#duration-dilation @@ -208,7 +208,7 @@ class TestkitDocSpec extends AkkaSpec with DefaultTimeout with ImplicitSender { "demonstrate probe reply" in { import akka.testkit.TestProbe - import scala.concurrent.util.duration._ + import scala.concurrent.duration._ import akka.pattern.ask //#test-probe-reply val probe = TestProbe() diff --git a/akka-docs/rst/scala/code/docs/transactor/TransactorDocSpec.scala b/akka-docs/rst/scala/code/docs/transactor/TransactorDocSpec.scala index 2faa1a9703..2b75a15b92 100644 --- a/akka-docs/rst/scala/code/docs/transactor/TransactorDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/transactor/TransactorDocSpec.scala @@ -8,7 +8,7 @@ import language.postfixOps import akka.actor._ import akka.transactor._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.util.Timeout import akka.testkit._ import scala.concurrent.stm._ @@ -141,7 +141,7 @@ class TransactorDocSpec extends AkkaSpec { //#run-coordinated-example import scala.concurrent.Await - import scala.concurrent.util.duration._ + import scala.concurrent.duration._ import akka.util.Timeout import akka.pattern.ask @@ -168,7 +168,7 @@ class TransactorDocSpec extends AkkaSpec { import CoordinatedApi._ //#implicit-timeout - import scala.concurrent.util.duration._ + import scala.concurrent.duration._ import akka.util.Timeout implicit val timeout = Timeout(5 seconds) diff --git a/akka-docs/rst/scala/code/docs/zeromq/ZeromqDocSpec.scala b/akka-docs/rst/scala/code/docs/zeromq/ZeromqDocSpec.scala index b02055a1b8..0e3b4df262 100644 --- a/akka-docs/rst/scala/code/docs/zeromq/ZeromqDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/zeromq/ZeromqDocSpec.scala @@ -6,7 +6,7 @@ package docs.zeromq import language.postfixOps import akka.actor.{ Actor, Props } -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.testkit._ import akka.zeromq.{ ZeroMQVersion, ZeroMQExtension } import java.text.SimpleDateFormat diff --git a/akka-durable-mailboxes/akka-file-mailbox/src/main/scala/akka/actor/mailbox/filebased/FileBasedMailbox.scala b/akka-durable-mailboxes/akka-file-mailbox/src/main/scala/akka/actor/mailbox/filebased/FileBasedMailbox.scala index 59e5780849..47ad1483c3 100644 --- a/akka-durable-mailboxes/akka-file-mailbox/src/main/scala/akka/actor/mailbox/filebased/FileBasedMailbox.scala +++ b/akka-durable-mailboxes/akka-file-mailbox/src/main/scala/akka/actor/mailbox/filebased/FileBasedMailbox.scala @@ -12,7 +12,7 @@ import akka.ConfigurationException import akka.dispatch._ import scala.util.control.NonFatal import akka.pattern.{ CircuitBreakerOpenException, CircuitBreaker } -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration class FileBasedMailboxType(systemSettings: ActorSystem.Settings, config: Config) extends MailboxType { private val settings = new FileBasedMailboxSettings(systemSettings, config) diff --git a/akka-durable-mailboxes/akka-file-mailbox/src/main/scala/akka/actor/mailbox/filebased/FileBasedMailboxSettings.scala b/akka-durable-mailboxes/akka-file-mailbox/src/main/scala/akka/actor/mailbox/filebased/FileBasedMailboxSettings.scala index 7ac8d0a044..305a3d3a43 100644 --- a/akka-durable-mailboxes/akka-file-mailbox/src/main/scala/akka/actor/mailbox/filebased/FileBasedMailboxSettings.scala +++ b/akka-durable-mailboxes/akka-file-mailbox/src/main/scala/akka/actor/mailbox/filebased/FileBasedMailboxSettings.scala @@ -5,10 +5,9 @@ package akka.actor.mailbox.filebased import akka.actor.mailbox._ import com.typesafe.config.Config -import scala.concurrent.util.Duration +import scala.concurrent.duration._ import java.util.concurrent.TimeUnit.MILLISECONDS import akka.actor.ActorSystem -import scala.concurrent.util.FiniteDuration class FileBasedMailboxSettings(val systemSettings: ActorSystem.Settings, val userConfig: Config) extends DurableMailboxSettings { diff --git a/akka-durable-mailboxes/akka-file-mailbox/src/main/scala/akka/actor/mailbox/filebased/filequeue/PersistentQueue.scala b/akka-durable-mailboxes/akka-file-mailbox/src/main/scala/akka/actor/mailbox/filebased/filequeue/PersistentQueue.scala index 83d539361c..33aa49061b 100644 --- a/akka-durable-mailboxes/akka-file-mailbox/src/main/scala/akka/actor/mailbox/filebased/filequeue/PersistentQueue.scala +++ b/akka-durable-mailboxes/akka-file-mailbox/src/main/scala/akka/actor/mailbox/filebased/filequeue/PersistentQueue.scala @@ -20,7 +20,6 @@ package akka.actor.mailbox.filebased.filequeue import java.io._ import scala.collection.mutable import akka.event.LoggingAdapter -import scala.concurrent.util.Duration import java.util.concurrent.TimeUnit import akka.actor.mailbox.filebased.FileBasedMailboxSettings diff --git a/akka-durable-mailboxes/akka-file-mailbox/src/test/scala/akka/actor/mailbox/filebased/FileBasedMailboxSpec.scala b/akka-durable-mailboxes/akka-file-mailbox/src/test/scala/akka/actor/mailbox/filebased/FileBasedMailboxSpec.scala index 5b982523ee..e0271461e8 100644 --- a/akka-durable-mailboxes/akka-file-mailbox/src/test/scala/akka/actor/mailbox/filebased/FileBasedMailboxSpec.scala +++ b/akka-durable-mailboxes/akka-file-mailbox/src/test/scala/akka/actor/mailbox/filebased/FileBasedMailboxSpec.scala @@ -28,7 +28,7 @@ class FileBasedMailboxSpec extends DurableMailboxSpec("File", FileBasedMailboxSp settings.QueuePath must be("file-based") settings.CircuitBreakerMaxFailures must be(5) - import scala.concurrent.util.duration._ + import scala.concurrent.duration._ settings.CircuitBreakerCallTimeout must be(5 seconds) } diff --git a/akka-durable-mailboxes/akka-mailboxes-common/src/test/scala/akka/actor/mailbox/DurableMailboxSpec.scala b/akka-durable-mailboxes/akka-mailboxes-common/src/test/scala/akka/actor/mailbox/DurableMailboxSpec.scala index 0e156a5632..2c6706f693 100644 --- a/akka-durable-mailboxes/akka-mailboxes-common/src/test/scala/akka/actor/mailbox/DurableMailboxSpec.scala +++ b/akka-durable-mailboxes/akka-mailboxes-common/src/test/scala/akka/actor/mailbox/DurableMailboxSpec.scala @@ -19,7 +19,7 @@ import DurableMailboxSpecActorFactory.{ MailboxTestActor, AccumulatorActor } import akka.actor.{ RepointableRef, Props, ActorSystem, ActorRefWithCell, ActorRef, ActorCell, Actor } import akka.dispatch.Mailbox import akka.testkit.TestKit -import scala.concurrent.util.duration.intToDurationInt +import scala.concurrent.duration._ object DurableMailboxSpecActorFactory { diff --git a/akka-osgi/src/test/scala/akka/osgi/ActorSystemActivatorTest.scala b/akka-osgi/src/test/scala/akka/osgi/ActorSystemActivatorTest.scala index 80bac1529f..d582209d76 100644 --- a/akka-osgi/src/test/scala/akka/osgi/ActorSystemActivatorTest.scala +++ b/akka-osgi/src/test/scala/akka/osgi/ActorSystemActivatorTest.scala @@ -9,7 +9,7 @@ import org.scalatest.WordSpec import akka.actor.ActorSystem import akka.pattern.ask import scala.concurrent.Await -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.util.Timeout import de.kalpatec.pojosr.framework.launch.BundleDescriptor import test.{ RuntimeNameActorSystemActivator, TestActivators, PingPongActorSystemActivator } diff --git a/akka-remote-tests/src/main/scala/akka/remote/testconductor/Conductor.scala b/akka-remote-tests/src/main/scala/akka/remote/testconductor/Conductor.scala index 4646e78a0a..bbccd3d0a5 100644 --- a/akka-remote-tests/src/main/scala/akka/remote/testconductor/Conductor.scala +++ b/akka-remote-tests/src/main/scala/akka/remote/testconductor/Conductor.scala @@ -9,7 +9,7 @@ import RemoteConnection.getAddrString import TestConductorProtocol._ import org.jboss.netty.channel.{ Channel, SimpleChannelUpstreamHandler, ChannelHandlerContext, ChannelStateEvent, MessageEvent } import com.typesafe.config.ConfigFactory -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.pattern.ask import scala.concurrent.Await import akka.event.{ LoggingAdapter, Logging } @@ -21,9 +21,7 @@ import akka.actor.{ OneForOneStrategy, SupervisorStrategy, Status, Address, Pois import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.TimeUnit.MILLISECONDS import akka.util.{ Timeout } -import scala.concurrent.util.{ Deadline, Duration } import scala.reflect.classTag -import scala.concurrent.util.FiniteDuration import akka.ConfigurationException sealed trait Direction { @@ -566,7 +564,7 @@ private[akka] class BarrierCoordinator extends Actor with LoggingFSM[BarrierCoor } onTransition { - case Idle -> Waiting ⇒ setTimer("Timeout", StateTimeout, nextStateData.deadline.timeLeft.asInstanceOf[FiniteDuration], false) + case Idle -> Waiting ⇒ setTimer("Timeout", StateTimeout, nextStateData.deadline.timeLeft, false) case Waiting -> Idle ⇒ cancelTimer("Timeout") } @@ -577,7 +575,7 @@ private[akka] class BarrierCoordinator extends Actor with LoggingFSM[BarrierCoor val enterDeadline = getDeadline(timeout) // we only allow the deadlines to get shorter if (enterDeadline.timeLeft < deadline.timeLeft) { - setTimer("Timeout", StateTimeout, enterDeadline.timeLeft.asInstanceOf[FiniteDuration], false) + setTimer("Timeout", StateTimeout, enterDeadline.timeLeft, false) handleBarrier(d.copy(arrived = together, deadline = enterDeadline)) } else handleBarrier(d.copy(arrived = together)) @@ -608,7 +606,7 @@ private[akka] class BarrierCoordinator extends Actor with LoggingFSM[BarrierCoor } } - def getDeadline(timeout: Option[Duration]): Deadline = { + def getDeadline(timeout: Option[FiniteDuration]): Deadline = { Deadline.now + timeout.getOrElse(TestConductor().Settings.BarrierTimeout.duration) } diff --git a/akka-remote-tests/src/main/scala/akka/remote/testconductor/DataTypes.scala b/akka-remote-tests/src/main/scala/akka/remote/testconductor/DataTypes.scala index b0ebed3653..cbe0825f35 100644 --- a/akka-remote-tests/src/main/scala/akka/remote/testconductor/DataTypes.scala +++ b/akka-remote-tests/src/main/scala/akka/remote/testconductor/DataTypes.scala @@ -12,7 +12,7 @@ import akka.remote.testconductor.{ TestConductorProtocol ⇒ TCP } import com.google.protobuf.Message import akka.actor.Address import org.jboss.netty.handler.codec.oneone.OneToOneDecoder -import scala.concurrent.util.Duration +import scala.concurrent.duration._ import akka.remote.testconductor.TestConductorProtocol.BarrierOp case class RoleName(name: String) @@ -32,7 +32,7 @@ private[akka] sealed trait ConfirmedClientOp extends ClientOp */ private[akka] case class Hello(name: String, addr: Address) extends NetworkOp -private[akka] case class EnterBarrier(name: String, timeout: Option[Duration]) extends ServerOp with NetworkOp +private[akka] case class EnterBarrier(name: String, timeout: Option[FiniteDuration]) extends ServerOp with NetworkOp private[akka] case class FailBarrier(name: String) extends ServerOp with NetworkOp private[akka] case class BarrierResult(name: String, success: Boolean) extends UnconfirmedClientOp with NetworkOp diff --git a/akka-remote-tests/src/main/scala/akka/remote/testconductor/Extension.scala b/akka-remote-tests/src/main/scala/akka/remote/testconductor/Extension.scala index 1945c89a1f..07a6c9c22f 100644 --- a/akka-remote-tests/src/main/scala/akka/remote/testconductor/Extension.scala +++ b/akka-remote-tests/src/main/scala/akka/remote/testconductor/Extension.scala @@ -5,7 +5,7 @@ import akka.remote.RemoteActorRefProvider import akka.util.Timeout import java.util.concurrent.TimeUnit.MILLISECONDS import java.util.concurrent.ConcurrentHashMap -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration /** * Access to the [[akka.remote.testconductor.TestConductorExt]] extension: diff --git a/akka-remote-tests/src/main/scala/akka/remote/testconductor/NetworkFailureInjector.scala b/akka-remote-tests/src/main/scala/akka/remote/testconductor/NetworkFailureInjector.scala index e1d5fb0854..02042b200d 100644 --- a/akka-remote-tests/src/main/scala/akka/remote/testconductor/NetworkFailureInjector.scala +++ b/akka-remote-tests/src/main/scala/akka/remote/testconductor/NetworkFailureInjector.scala @@ -12,9 +12,7 @@ import org.jboss.netty.channel.{ SimpleChannelHandler, MessageEvent, Channels, C import akka.actor.{ Props, LoggingFSM, Address, ActorSystem, ActorRef, ActorLogging, Actor, FSM } import akka.event.Logging import akka.remote.netty.ChannelAddress -import scala.concurrent.util.Duration -import scala.concurrent.util.duration._ -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration._ /** * INTERNAL API. @@ -337,7 +335,7 @@ private[akka] class ThrottleActor(channelContext: ChannelHandlerContext) if (timeForPacket <= now) rec(Data(timeForPacket, d.rateMBit, d.queue.tail), toSend :+ d.queue.head) else { val splitThreshold = d.lastSent + packetSplitThreshold.toNanos - if (now < splitThreshold) (d, toSend, Some(((timeForPacket - now).nanos min (splitThreshold - now).nanos).asInstanceOf[FiniteDuration])) + if (now < splitThreshold) (d, toSend, Some((timeForPacket - now).nanos min (splitThreshold - now).nanos)) else { val microsToSend = (now - d.lastSent) / 1000 val (s1, s2) = split(d.queue.head, (microsToSend * d.rateMBit / 8).toInt) diff --git a/akka-remote-tests/src/main/scala/akka/remote/testconductor/Player.scala b/akka-remote-tests/src/main/scala/akka/remote/testconductor/Player.scala index 03b07486f0..1442558362 100644 --- a/akka-remote-tests/src/main/scala/akka/remote/testconductor/Player.scala +++ b/akka-remote-tests/src/main/scala/akka/remote/testconductor/Player.scala @@ -6,8 +6,7 @@ package akka.remote.testconductor import language.postfixOps import akka.actor.{ Actor, ActorRef, ActorSystem, LoggingFSM, Props, PoisonPill, Status, Address, Scheduler } import RemoteConnection.getAddrString -import scala.concurrent.util.{ Duration, Deadline } -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.util.Timeout import org.jboss.netty.channel.{ Channel, SimpleChannelUpstreamHandler, ChannelHandlerContext, ChannelStateEvent, MessageEvent, WriteCompletionEvent, ExceptionEvent } import com.typesafe.config.ConfigFactory @@ -19,7 +18,6 @@ import akka.event.{ LoggingAdapter, Logging } import java.net.{ InetSocketAddress, ConnectException } import scala.reflect.classTag import concurrent.{ ExecutionContext, Await, Future } -import scala.concurrent.util.FiniteDuration /** * The Player is the client component of the @@ -81,13 +79,13 @@ trait Player { this: TestConductorExt ⇒ system.log.debug("entering barriers " + name.mkString("(", ", ", ")")) val stop = Deadline.now + timeout.duration name foreach { b ⇒ - val barrierTimeout = stop.timeLeft.asInstanceOf[FiniteDuration] + val barrierTimeout = stop.timeLeft if (barrierTimeout < Duration.Zero) { client ! ToServer(FailBarrier(b)) throw new TimeoutException("Server timed out while waiting for barrier " + b); } try { - implicit val timeout = Timeout((barrierTimeout + Settings.QueryTimeout.duration).asInstanceOf[FiniteDuration]) + implicit val timeout = Timeout(barrierTimeout + Settings.QueryTimeout.duration) Await.result(client ? ToServer(EnterBarrier(b, Option(barrierTimeout))), Duration.Inf) } catch { case e: AskTimeoutException ⇒ @@ -255,7 +253,7 @@ private[akka] class ClientFSM(name: RoleName, controllerAddr: InetSocketAddress) private[akka] class PlayerHandler( server: InetSocketAddress, private var reconnects: Int, - backoff: Duration, + backoff: FiniteDuration, fsm: ActorRef, log: LoggingAdapter, scheduler: Scheduler)(implicit executor: ExecutionContext) @@ -278,7 +276,7 @@ private[akka] class PlayerHandler( event.getCause match { case c: ConnectException if reconnects > 0 ⇒ reconnects -= 1 - scheduler.scheduleOnce(nextAttempt.timeLeft.asInstanceOf[FiniteDuration])(reconnect()) + scheduler.scheduleOnce(nextAttempt.timeLeft)(reconnect()) case e ⇒ fsm ! ConnectionFailure(e.getMessage) } } diff --git a/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala b/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala index 5081cde959..9d5fd4b55e 100644 --- a/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala +++ b/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala @@ -15,8 +15,7 @@ import akka.remote.RemoteActorRefProvider import akka.testkit._ import scala.concurrent.{ Await, Awaitable } import scala.util.control.NonFatal -import scala.concurrent.util.Duration -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import java.util.concurrent.TimeoutException import akka.remote.testconductor.RoleName import akka.remote.testconductor.TestConductorTransport diff --git a/akka-remote-tests/src/multi-jvm/scala/akka/remote/NewRemoteActorSpec.scala b/akka-remote-tests/src/multi-jvm/scala/akka/remote/NewRemoteActorSpec.scala index f7820ae8d3..b315e5c5d0 100644 --- a/akka-remote-tests/src/multi-jvm/scala/akka/remote/NewRemoteActorSpec.scala +++ b/akka-remote-tests/src/multi-jvm/scala/akka/remote/NewRemoteActorSpec.scala @@ -12,7 +12,7 @@ import akka.pattern.ask import testkit.{ STMultiNodeSpec, MultiNodeConfig, MultiNodeSpec } import akka.testkit._ import akka.actor.Terminated -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import com.typesafe.config.ConfigFactory object NewRemoteActorMultiJvmSpec extends MultiNodeConfig { diff --git a/akka-remote-tests/src/multi-jvm/scala/akka/remote/router/RandomRoutedRemoteActorSpec.scala b/akka-remote-tests/src/multi-jvm/scala/akka/remote/router/RandomRoutedRemoteActorSpec.scala index 040d91ad57..90de3e7970 100644 --- a/akka-remote-tests/src/multi-jvm/scala/akka/remote/router/RandomRoutedRemoteActorSpec.scala +++ b/akka-remote-tests/src/multi-jvm/scala/akka/remote/router/RandomRoutedRemoteActorSpec.scala @@ -17,7 +17,7 @@ import akka.routing.Broadcast import akka.routing.RandomRouter import akka.routing.RoutedActorRef import akka.testkit._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ object RandomRoutedRemoteActorMultiJvmSpec extends MultiNodeConfig { diff --git a/akka-remote-tests/src/multi-jvm/scala/akka/remote/router/RoundRobinRoutedRemoteActorSpec.scala b/akka-remote-tests/src/multi-jvm/scala/akka/remote/router/RoundRobinRoutedRemoteActorSpec.scala index 5a629abc37..52c2fa56b8 100644 --- a/akka-remote-tests/src/multi-jvm/scala/akka/remote/router/RoundRobinRoutedRemoteActorSpec.scala +++ b/akka-remote-tests/src/multi-jvm/scala/akka/remote/router/RoundRobinRoutedRemoteActorSpec.scala @@ -19,7 +19,7 @@ import akka.routing.RoutedActorRef import akka.routing.Resizer import akka.routing.RouteeProvider import akka.testkit._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ object RoundRobinRoutedRemoteActorMultiJvmSpec extends MultiNodeConfig { diff --git a/akka-remote-tests/src/multi-jvm/scala/akka/remote/router/ScatterGatherRoutedRemoteActorSpec.scala b/akka-remote-tests/src/multi-jvm/scala/akka/remote/router/ScatterGatherRoutedRemoteActorSpec.scala index d4d125e411..69a8ff02e5 100644 --- a/akka-remote-tests/src/multi-jvm/scala/akka/remote/router/ScatterGatherRoutedRemoteActorSpec.scala +++ b/akka-remote-tests/src/multi-jvm/scala/akka/remote/router/ScatterGatherRoutedRemoteActorSpec.scala @@ -16,7 +16,7 @@ import akka.routing.ScatterGatherFirstCompletedRouter import akka.routing.RoutedActorRef import akka.testkit._ import akka.testkit.TestEvent._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.PoisonPill import akka.actor.Address diff --git a/akka-remote-tests/src/multi-jvm/scala/akka/remote/testconductor/TestConductorSpec.scala b/akka-remote-tests/src/multi-jvm/scala/akka/remote/testconductor/TestConductorSpec.scala index 97f5827b1b..1b5ac90772 100644 --- a/akka-remote-tests/src/multi-jvm/scala/akka/remote/testconductor/TestConductorSpec.scala +++ b/akka-remote-tests/src/multi-jvm/scala/akka/remote/testconductor/TestConductorSpec.scala @@ -10,8 +10,7 @@ import akka.actor.Props import akka.actor.Actor import scala.concurrent.Await import scala.concurrent.Awaitable -import scala.concurrent.util.Duration -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.testkit.ImplicitSender import akka.testkit.LongRunningTest import java.net.InetSocketAddress diff --git a/akka-remote-tests/src/test/scala/akka/remote/testconductor/BarrierSpec.scala b/akka-remote-tests/src/test/scala/akka/remote/testconductor/BarrierSpec.scala index f306477a28..103d16089d 100644 --- a/akka-remote-tests/src/test/scala/akka/remote/testconductor/BarrierSpec.scala +++ b/akka-remote-tests/src/test/scala/akka/remote/testconductor/BarrierSpec.scala @@ -7,8 +7,7 @@ import language.postfixOps import akka.actor.{ Props, AddressFromURIString, ActorRef, Actor, OneForOneStrategy, SupervisorStrategy } import akka.testkit.{ AkkaSpec, ImplicitSender, EventFilter, TestProbe, TimingTest } -import scala.concurrent.util.Duration -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.event.Logging import akka.util.Timeout import org.scalatest.BeforeAndAfterEach @@ -545,4 +544,4 @@ class BarrierSpec extends AkkaSpec(BarrierSpec.config) with ImplicitSender { private def data(clients: Set[Controller.NodeInfo], barrier: String, arrived: List[ActorRef], previous: Data): Data = { Data(clients, barrier, arrived, previous.deadline) } -} \ No newline at end of file +} diff --git a/akka-remote/src/main/scala/akka/remote/RemoteSettings.scala b/akka-remote/src/main/scala/akka/remote/RemoteSettings.scala index c18635f1ca..804ccf5525 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteSettings.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteSettings.scala @@ -4,7 +4,7 @@ package akka.remote import com.typesafe.config.Config -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import java.util.concurrent.TimeUnit.MILLISECONDS class RemoteSettings(val config: Config, val systemName: String) { diff --git a/akka-remote/src/main/scala/akka/remote/netty/Client.scala b/akka-remote/src/main/scala/akka/remote/netty/Client.scala index 4a391af5f0..2015f82ac7 100644 --- a/akka-remote/src/main/scala/akka/remote/netty/Client.scala +++ b/akka-remote/src/main/scala/akka/remote/netty/Client.scala @@ -20,7 +20,7 @@ import akka.actor.{ DeadLetter, Address, ActorRef } import akka.util.Switch import scala.util.control.NonFatal import org.jboss.netty.handler.ssl.SslHandler -import scala.concurrent.util.Deadline +import scala.concurrent.duration._ /** * This is the abstract baseclass for netty remote clients, currently there's only an diff --git a/akka-remote/src/main/scala/akka/remote/netty/Settings.scala b/akka-remote/src/main/scala/akka/remote/netty/Settings.scala index 4a874c5283..c9fb4aff9a 100644 --- a/akka-remote/src/main/scala/akka/remote/netty/Settings.scala +++ b/akka-remote/src/main/scala/akka/remote/netty/Settings.scala @@ -4,12 +4,12 @@ package akka.remote.netty import com.typesafe.config.Config -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import java.util.concurrent.TimeUnit._ import java.net.InetAddress import akka.ConfigurationException import scala.collection.JavaConverters.iterableAsScalaIterableConverter -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration.FiniteDuration private[akka] class NettySettings(config: Config, val systemName: String) { diff --git a/akka-remote/src/test/scala/akka/remote/NetworkFailureSpec.scala b/akka-remote/src/test/scala/akka/remote/NetworkFailureSpec.scala index 053c9a93b6..dad24b8d4b 100644 --- a/akka-remote/src/test/scala/akka/remote/NetworkFailureSpec.scala +++ b/akka-remote/src/test/scala/akka/remote/NetworkFailureSpec.scala @@ -17,7 +17,7 @@ import scala.concurrent.{ ExecutionContext, Future } trait NetworkFailureSpec extends DefaultTimeout { self: AkkaSpec ⇒ import Actor._ - import scala.concurrent.util.Duration + import scala.concurrent.duration.Duration import system.dispatcher diff --git a/akka-remote/src/test/scala/akka/remote/RemoteConfigSpec.scala b/akka-remote/src/test/scala/akka/remote/RemoteConfigSpec.scala index 3ca382b00e..5355433d69 100644 --- a/akka-remote/src/test/scala/akka/remote/RemoteConfigSpec.scala +++ b/akka-remote/src/test/scala/akka/remote/RemoteConfigSpec.scala @@ -7,8 +7,7 @@ import language.postfixOps import akka.testkit.AkkaSpec import akka.actor.ExtendedActorSystem -import scala.concurrent.util.duration._ -import scala.concurrent.util.Duration +import scala.concurrent.duration._ import akka.remote.netty.NettyRemoteTransport @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) diff --git a/akka-remote/src/test/scala/akka/remote/Ticket1978CommunicationSpec.scala b/akka-remote/src/test/scala/akka/remote/Ticket1978CommunicationSpec.scala index b6d2bed02a..c194fe1fa6 100644 --- a/akka-remote/src/test/scala/akka/remote/Ticket1978CommunicationSpec.scala +++ b/akka-remote/src/test/scala/akka/remote/Ticket1978CommunicationSpec.scala @@ -17,8 +17,7 @@ import akka.remote.netty.{ NettySettings, NettySSLSupport } import javax.net.ssl.SSLException import akka.util.Timeout import scala.concurrent.Await -import scala.concurrent.util.duration._ -import scala.concurrent.util.Duration +import scala.concurrent.duration._ import akka.event.{ Logging, NoLogging, LoggingAdapter } object Configuration { diff --git a/akka-remote/src/test/scala/akka/remote/Ticket1978ConfigSpec.scala b/akka-remote/src/test/scala/akka/remote/Ticket1978ConfigSpec.scala index be172a563b..e088ae3362 100644 --- a/akka-remote/src/test/scala/akka/remote/Ticket1978ConfigSpec.scala +++ b/akka-remote/src/test/scala/akka/remote/Ticket1978ConfigSpec.scala @@ -3,8 +3,7 @@ package akka.remote import akka.testkit._ import akka.actor._ import com.typesafe.config._ -import scala.concurrent.util.duration._ -import scala.concurrent.util.Duration +import scala.concurrent.duration._ import akka.remote.netty.NettyRemoteTransport import java.util.ArrayList diff --git a/akka-remote/src/test/scala/akka/remote/UntrustedSpec.scala b/akka-remote/src/test/scala/akka/remote/UntrustedSpec.scala index d3aa1a42e9..58ace1bb7c 100644 --- a/akka-remote/src/test/scala/akka/remote/UntrustedSpec.scala +++ b/akka-remote/src/test/scala/akka/remote/UntrustedSpec.scala @@ -18,7 +18,7 @@ import akka.event.Logging import org.scalatest.junit.JUnitRunner import org.junit.runner.RunWith import akka.actor.Terminated -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.PoisonPill @RunWith(classOf[JUnitRunner]) diff --git a/akka-remote/src/test/scala/akka/remote/serialization/DaemonMsgCreateSerializerSpec.scala b/akka-remote/src/test/scala/akka/remote/serialization/DaemonMsgCreateSerializerSpec.scala index 2c80c99615..776feb410c 100644 --- a/akka-remote/src/test/scala/akka/remote/serialization/DaemonMsgCreateSerializerSpec.scala +++ b/akka-remote/src/test/scala/akka/remote/serialization/DaemonMsgCreateSerializerSpec.scala @@ -12,7 +12,7 @@ import akka.testkit.AkkaSpec import akka.actor.{ Actor, Address, Props, Deploy, OneForOneStrategy, SupervisorStrategy, FromClassCreator } import akka.remote.{ DaemonMsgCreate, RemoteScope } import akka.routing.{ RoundRobinRouter, FromConfig } -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ object DaemonMsgCreateSerializerSpec { class MyActor extends Actor { diff --git a/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala b/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala index 549738541e..87a4026d2e 100644 --- a/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala +++ b/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala @@ -3,7 +3,7 @@ package sample.cluster.stats //#imports import language.postfixOps import scala.concurrent.forkjoin.ThreadLocalRandom -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import com.typesafe.config.ConfigFactory import akka.actor.Actor import akka.actor.ActorLogging diff --git a/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/transformation/TransformationSample.scala b/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/transformation/TransformationSample.scala index 53ee7bcae5..5deb2d4a40 100644 --- a/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/transformation/TransformationSample.scala +++ b/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/transformation/TransformationSample.scala @@ -2,7 +2,7 @@ package sample.cluster.transformation //#imports import language.postfixOps -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.Actor import akka.actor.ActorRef diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSingleMasterSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSingleMasterSpec.scala index 9f7010f7cd..f3de9f8ab4 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSingleMasterSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSingleMasterSpec.scala @@ -1,7 +1,7 @@ package sample.cluster.stats import language.postfixOps -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import com.typesafe.config.ConfigFactory diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSpec.scala index b1141e587f..07d1b3e84b 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSpec.scala @@ -1,7 +1,7 @@ package sample.cluster.stats import language.postfixOps -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.Props import akka.actor.RootActorPath diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala index 4c73b858cb..c2ea084a18 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala @@ -1,7 +1,7 @@ package sample.cluster.stats.japi import language.postfixOps -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.Props import akka.actor.RootActorPath diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleSingleMasterJapiSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleSingleMasterJapiSpec.scala index e6ef3d333f..06357f510f 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleSingleMasterJapiSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleSingleMasterJapiSpec.scala @@ -1,7 +1,7 @@ package sample.cluster.stats.japi import language.postfixOps -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import com.typesafe.config.ConfigFactory diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/TransformationSampleSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/TransformationSampleSpec.scala index 1c3176ee16..131997730f 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/TransformationSampleSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/TransformationSampleSpec.scala @@ -1,7 +1,7 @@ package sample.cluster.transformation import language.postfixOps -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import com.typesafe.config.ConfigFactory diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/japi/TransformationSampleJapiSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/japi/TransformationSampleJapiSpec.scala index 4a8cd1c8c8..d7d328f81d 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/japi/TransformationSampleJapiSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/japi/TransformationSampleJapiSpec.scala @@ -1,7 +1,7 @@ package sample.cluster.transformation.japi import language.postfixOps -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import com.typesafe.config.ConfigFactory diff --git a/akka-samples/akka-sample-fsm/src/main/scala/DiningHakkersOnBecome.scala b/akka-samples/akka-sample-fsm/src/main/scala/DiningHakkersOnBecome.scala index 9fc39ec2a6..a9740267ca 100644 --- a/akka-samples/akka-sample-fsm/src/main/scala/DiningHakkersOnBecome.scala +++ b/akka-samples/akka-sample-fsm/src/main/scala/DiningHakkersOnBecome.scala @@ -9,7 +9,7 @@ import language.postfixOps //http://www.dalnefre.com/wp/2010/08/dining-philosophers-in-humus/ import akka.actor._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ /* * First we define our messages, they basically speak for themselves diff --git a/akka-samples/akka-sample-fsm/src/main/scala/DiningHakkersOnFsm.scala b/akka-samples/akka-sample-fsm/src/main/scala/DiningHakkersOnFsm.scala index 902eb797d2..b1fec79f2b 100644 --- a/akka-samples/akka-sample-fsm/src/main/scala/DiningHakkersOnFsm.scala +++ b/akka-samples/akka-sample-fsm/src/main/scala/DiningHakkersOnFsm.scala @@ -6,9 +6,7 @@ package sample.fsm.dining.fsm import language.postfixOps import akka.actor._ import akka.actor.FSM._ -import scala.concurrent.util.Duration -import scala.concurrent.util.duration._ -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration._ /* * Some messages for the chopstick diff --git a/akka-slf4j/src/test/scala/akka/event/slf4j/Slf4jEventHandlerSpec.scala b/akka-slf4j/src/test/scala/akka/event/slf4j/Slf4jEventHandlerSpec.scala index 77b10039ad..bdc00e6c17 100644 --- a/akka-slf4j/src/test/scala/akka/event/slf4j/Slf4jEventHandlerSpec.scala +++ b/akka-slf4j/src/test/scala/akka/event/slf4j/Slf4jEventHandlerSpec.scala @@ -8,7 +8,7 @@ import language.postfixOps import akka.testkit.AkkaSpec import akka.actor.Actor import akka.actor.ActorLogging -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.event.Logging import akka.actor.Props import ch.qos.logback.core.OutputStreamAppender diff --git a/akka-testkit/src/main/java/akka/testkit/JavaTestKit.java b/akka-testkit/src/main/java/akka/testkit/JavaTestKit.java index 88fe0d940e..8fbb628d7c 100644 --- a/akka-testkit/src/main/java/akka/testkit/JavaTestKit.java +++ b/akka-testkit/src/main/java/akka/testkit/JavaTestKit.java @@ -10,8 +10,8 @@ import akka.event.Logging; import akka.event.Logging.LogEvent; import akka.japi.JavaPartialFunction; import akka.japi.Util; -import scala.concurrent.util.Duration; -import scala.concurrent.util.FiniteDuration; +import scala.concurrent.duration.Duration; +import scala.concurrent.duration.FiniteDuration; /** * Java API for the TestProbe. Proper JavaDocs to come once JavaDoccing is implemented. diff --git a/akka-testkit/src/main/scala/akka/testkit/CallingThreadDispatcher.scala b/akka-testkit/src/main/scala/akka/testkit/CallingThreadDispatcher.scala index 0fbe4d7c18..dad7f4643e 100644 --- a/akka-testkit/src/main/scala/akka/testkit/CallingThreadDispatcher.scala +++ b/akka-testkit/src/main/scala/akka/testkit/CallingThreadDispatcher.scala @@ -12,9 +12,9 @@ import scala.annotation.tailrec import com.typesafe.config.Config import akka.actor.{ ActorInitializationException, ExtensionIdProvider, ExtensionId, Extension, ExtendedActorSystem, ActorRef, ActorCell } import akka.dispatch.{ MessageQueue, MailboxType, TaskInvocation, SystemMessage, Suspend, Resume, MessageDispatcherConfigurator, MessageDispatcher, Mailbox, Envelope, DispatcherPrerequisites, DefaultSystemMessageQueue } -import scala.concurrent.util.duration.intToDurationInt +import scala.concurrent.duration._ import akka.util.Switch -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import scala.concurrent.Awaitable import akka.actor.ActorContext import scala.util.control.NonFatal diff --git a/akka-testkit/src/main/scala/akka/testkit/TestBarrier.scala b/akka-testkit/src/main/scala/akka/testkit/TestBarrier.scala index 929838a8b5..5d043f4b10 100644 --- a/akka-testkit/src/main/scala/akka/testkit/TestBarrier.scala +++ b/akka-testkit/src/main/scala/akka/testkit/TestBarrier.scala @@ -4,10 +4,10 @@ package akka.testkit -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import java.util.concurrent.{ CyclicBarrier, TimeUnit, TimeoutException } import akka.actor.ActorSystem -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration.FiniteDuration class TestBarrierTimeoutException(message: String) extends RuntimeException(message) diff --git a/akka-testkit/src/main/scala/akka/testkit/TestEventListener.scala b/akka-testkit/src/main/scala/akka/testkit/TestEventListener.scala index 2987ede478..1fdd339ca5 100644 --- a/akka-testkit/src/main/scala/akka/testkit/TestEventListener.scala +++ b/akka-testkit/src/main/scala/akka/testkit/TestEventListener.scala @@ -12,7 +12,7 @@ import akka.event.Logging.{ Warning, LogEvent, InitializeLogger, Info, Error, De import akka.event.Logging import java.lang.{ Iterable ⇒ JIterable } import scala.collection.JavaConverters -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import scala.reflect.ClassTag import akka.actor.NoSerializationVerificationNeeded diff --git a/akka-testkit/src/main/scala/akka/testkit/TestFSMRef.scala b/akka-testkit/src/main/scala/akka/testkit/TestFSMRef.scala index 5d634de9ef..c60d9d85f4 100644 --- a/akka-testkit/src/main/scala/akka/testkit/TestFSMRef.scala +++ b/akka-testkit/src/main/scala/akka/testkit/TestFSMRef.scala @@ -5,9 +5,9 @@ package akka.testkit import akka.actor._ -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import akka.dispatch.DispatcherPrerequisites -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration.FiniteDuration /** * This is a specialised form of the TestActorRef with support for querying and diff --git a/akka-testkit/src/main/scala/akka/testkit/TestKit.scala b/akka-testkit/src/main/scala/akka/testkit/TestKit.scala index 9838f62d2a..b466b8a9d8 100644 --- a/akka-testkit/src/main/scala/akka/testkit/TestKit.scala +++ b/akka-testkit/src/main/scala/akka/testkit/TestKit.scala @@ -7,8 +7,7 @@ import language.postfixOps import akka.actor._ import akka.actor.Actor._ -import scala.concurrent.util.{ Duration, FiniteDuration } -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import java.util.concurrent.{ BlockingDeque, LinkedBlockingDeque, TimeUnit, atomic } import atomic.AtomicInteger import scala.annotation.tailrec @@ -192,7 +191,7 @@ trait TestKitBase { def remainingOr(duration: FiniteDuration): FiniteDuration = end match { case x if x eq Duration.Undefined ⇒ duration case x if !x.isFinite ⇒ throw new IllegalArgumentException("`end` cannot be infinite") - case f: FiniteDuration ⇒ (end - now).asInstanceOf[FiniteDuration] // RK FIXME after next Scala milestone + case f: FiniteDuration ⇒ f - now } private def remainingOrDilated(max: Duration): FiniteDuration = max match { diff --git a/akka-testkit/src/main/scala/akka/testkit/TestKitExtension.scala b/akka-testkit/src/main/scala/akka/testkit/TestKitExtension.scala index 50dc392a09..33102e09a6 100644 --- a/akka-testkit/src/main/scala/akka/testkit/TestKitExtension.scala +++ b/akka-testkit/src/main/scala/akka/testkit/TestKitExtension.scala @@ -4,11 +4,11 @@ package akka.testkit import com.typesafe.config.Config -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import akka.util.Timeout import java.util.concurrent.TimeUnit.MILLISECONDS import akka.actor.{ ExtensionId, ActorSystem, Extension, ExtendedActorSystem } -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration.FiniteDuration object TestKitExtension extends ExtensionId[TestKitSettings] { override def get(system: ActorSystem): TestKitSettings = super.get(system) diff --git a/akka-testkit/src/main/scala/akka/testkit/TestLatch.scala b/akka-testkit/src/main/scala/akka/testkit/TestLatch.scala index cedf351551..2bb7a8f4b5 100644 --- a/akka-testkit/src/main/scala/akka/testkit/TestLatch.scala +++ b/akka-testkit/src/main/scala/akka/testkit/TestLatch.scala @@ -4,11 +4,11 @@ package akka.testkit -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import akka.actor.ActorSystem import scala.concurrent.{ Await, CanAwait, Awaitable } import java.util.concurrent.{ TimeoutException, CountDownLatch, TimeUnit } -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration.FiniteDuration /** * A count down latch wrapper for use in testing. diff --git a/akka-testkit/src/main/scala/akka/testkit/package.scala b/akka-testkit/src/main/scala/akka/testkit/package.scala index 247cf9e17f..38d6d853af 100644 --- a/akka-testkit/src/main/scala/akka/testkit/package.scala +++ b/akka-testkit/src/main/scala/akka/testkit/package.scala @@ -3,7 +3,7 @@ package akka import language.implicitConversions import akka.actor.ActorSystem -import scala.concurrent.util.{ Duration, FiniteDuration } +import scala.concurrent.duration.{ Duration, FiniteDuration } import java.util.concurrent.TimeUnit.MILLISECONDS import scala.reflect.ClassTag @@ -35,7 +35,7 @@ package object testkit { * Scala API. Scale timeouts (durations) during tests with the configured * 'akka.test.timefactor'. * Implicit conversion to add dilated function to Duration. - * import scala.concurrent.util.duration._ + * import scala.concurrent.duration._ * import akka.testkit._ * 10.milliseconds.dilated * diff --git a/akka-testkit/src/test/scala/akka/testkit/AkkaSpec.scala b/akka-testkit/src/test/scala/akka/testkit/AkkaSpec.scala index bd4de8b906..d4844087b7 100644 --- a/akka-testkit/src/test/scala/akka/testkit/AkkaSpec.scala +++ b/akka-testkit/src/test/scala/akka/testkit/AkkaSpec.scala @@ -9,7 +9,7 @@ import org.scalatest.{ WordSpec, BeforeAndAfterAll, Tag } import org.scalatest.matchers.MustMatchers import akka.actor.{ Actor, Props, ActorSystem, PoisonPill, DeadLetter, ActorSystemImpl } import akka.event.{ Logging, LoggingAdapter } -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import scala.concurrent.{ Await, Future } import com.typesafe.config.{ Config, ConfigFactory } import java.util.concurrent.TimeoutException diff --git a/akka-testkit/src/test/scala/akka/testkit/AkkaSpecSpec.scala b/akka-testkit/src/test/scala/akka/testkit/AkkaSpecSpec.scala index c8eee623f7..baebc2e6d4 100644 --- a/akka-testkit/src/test/scala/akka/testkit/AkkaSpecSpec.scala +++ b/akka-testkit/src/test/scala/akka/testkit/AkkaSpecSpec.scala @@ -11,7 +11,7 @@ import org.scalatest.matchers.MustMatchers import akka.actor._ import com.typesafe.config.ConfigFactory import concurrent.Await -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.DeadLetter import akka.pattern.ask diff --git a/akka-testkit/src/test/scala/akka/testkit/TestActorRefSpec.scala b/akka-testkit/src/test/scala/akka/testkit/TestActorRefSpec.scala index 0ee1923359..f847c2b48a 100644 --- a/akka-testkit/src/test/scala/akka/testkit/TestActorRefSpec.scala +++ b/akka-testkit/src/test/scala/akka/testkit/TestActorRefSpec.scala @@ -9,11 +9,10 @@ import org.scalatest.{ BeforeAndAfterEach, WordSpec } import akka.actor._ import akka.event.Logging.Warning import scala.concurrent.{ Future, Promise, Await } -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.ActorSystem import akka.pattern.ask import akka.dispatch.Dispatcher -import scala.concurrent.util.Duration /** * Test whether TestActorRef behaves as an ActorRef should, besides its own spec. diff --git a/akka-testkit/src/test/scala/akka/testkit/TestFSMRefSpec.scala b/akka-testkit/src/test/scala/akka/testkit/TestFSMRefSpec.scala index 256273bc1f..6ed7d51708 100644 --- a/akka-testkit/src/test/scala/akka/testkit/TestFSMRefSpec.scala +++ b/akka-testkit/src/test/scala/akka/testkit/TestFSMRefSpec.scala @@ -9,7 +9,7 @@ import language.postfixOps import org.scalatest.matchers.MustMatchers import org.scalatest.{ BeforeAndAfterEach, WordSpec } import akka.actor._ -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) class TestFSMRefSpec extends AkkaSpec { diff --git a/akka-testkit/src/test/scala/akka/testkit/TestProbeSpec.scala b/akka-testkit/src/test/scala/akka/testkit/TestProbeSpec.scala index 10c39cdc05..a413aa86a9 100644 --- a/akka-testkit/src/test/scala/akka/testkit/TestProbeSpec.scala +++ b/akka-testkit/src/test/scala/akka/testkit/TestProbeSpec.scala @@ -7,7 +7,7 @@ import org.scalatest.matchers.MustMatchers import org.scalatest.{ BeforeAndAfterEach, WordSpec } import akka.actor._ import scala.concurrent.{ Future, Await } -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.pattern.ask @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) diff --git a/akka-testkit/src/test/scala/akka/testkit/TestTimeSpec.scala b/akka-testkit/src/test/scala/akka/testkit/TestTimeSpec.scala index aac0f490b0..4ca3969ab0 100644 --- a/akka-testkit/src/test/scala/akka/testkit/TestTimeSpec.scala +++ b/akka-testkit/src/test/scala/akka/testkit/TestTimeSpec.scala @@ -2,7 +2,7 @@ package akka.testkit import org.scalatest.matchers.MustMatchers import org.scalatest.{ BeforeAndAfterEach, WordSpec } -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import com.typesafe.config.Config @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) diff --git a/akka-transactor/src/main/scala/akka/transactor/TransactorExtension.scala b/akka-transactor/src/main/scala/akka/transactor/TransactorExtension.scala index 6b4a0157bc..2225010fd8 100644 --- a/akka-transactor/src/main/scala/akka/transactor/TransactorExtension.scala +++ b/akka-transactor/src/main/scala/akka/transactor/TransactorExtension.scala @@ -7,7 +7,7 @@ import akka.actor.{ ActorSystem, ExtensionId, ExtensionIdProvider, ExtendedActor import akka.actor.Extension import com.typesafe.config.Config import akka.util.Timeout -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import java.util.concurrent.TimeUnit.MILLISECONDS /** diff --git a/akka-transactor/src/test/scala/akka/transactor/CoordinatedIncrementSpec.scala b/akka-transactor/src/test/scala/akka/transactor/CoordinatedIncrementSpec.scala index e4724cf8a3..1aa9fb555c 100644 --- a/akka-transactor/src/test/scala/akka/transactor/CoordinatedIncrementSpec.scala +++ b/akka-transactor/src/test/scala/akka/transactor/CoordinatedIncrementSpec.scala @@ -8,7 +8,7 @@ import org.scalatest.BeforeAndAfterAll import akka.actor._ import scala.concurrent.Await -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.util.Timeout import akka.testkit._ import scala.concurrent.stm._ diff --git a/akka-transactor/src/test/scala/akka/transactor/FickleFriendsSpec.scala b/akka-transactor/src/test/scala/akka/transactor/FickleFriendsSpec.scala index 4e1219324e..a087ab5b6d 100644 --- a/akka-transactor/src/test/scala/akka/transactor/FickleFriendsSpec.scala +++ b/akka-transactor/src/test/scala/akka/transactor/FickleFriendsSpec.scala @@ -10,7 +10,7 @@ import org.scalatest.BeforeAndAfterAll import akka.actor._ import scala.concurrent.Await -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.testkit._ import akka.testkit.TestEvent.Mute import scala.concurrent.stm._ diff --git a/akka-transactor/src/test/scala/akka/transactor/TransactorSpec.scala b/akka-transactor/src/test/scala/akka/transactor/TransactorSpec.scala index cb4d2d633b..4fd05a0e1e 100644 --- a/akka-transactor/src/test/scala/akka/transactor/TransactorSpec.scala +++ b/akka-transactor/src/test/scala/akka/transactor/TransactorSpec.scala @@ -8,7 +8,7 @@ import language.postfixOps import akka.actor._ import scala.concurrent.Await -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.util.Timeout import akka.testkit._ import scala.concurrent.stm._ diff --git a/akka-zeromq/src/main/scala/akka/zeromq/ConcurrentSocketActor.scala b/akka-zeromq/src/main/scala/akka/zeromq/ConcurrentSocketActor.scala index 6fc349b798..20c8b2d723 100644 --- a/akka-zeromq/src/main/scala/akka/zeromq/ConcurrentSocketActor.scala +++ b/akka-zeromq/src/main/scala/akka/zeromq/ConcurrentSocketActor.scala @@ -7,7 +7,7 @@ import org.zeromq.ZMQ.{ Socket, Poller } import org.zeromq.{ ZMQ ⇒ JZMQ } import akka.actor._ import scala.concurrent.{ Promise, Future } -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import scala.annotation.tailrec import scala.collection.mutable.ListBuffer import akka.event.Logging diff --git a/akka-zeromq/src/main/scala/akka/zeromq/SocketOption.scala b/akka-zeromq/src/main/scala/akka/zeromq/SocketOption.scala index ea7fb82d07..f935a9c31d 100644 --- a/akka-zeromq/src/main/scala/akka/zeromq/SocketOption.scala +++ b/akka-zeromq/src/main/scala/akka/zeromq/SocketOption.scala @@ -6,10 +6,8 @@ package akka.zeromq import com.google.protobuf.Message import org.zeromq.{ ZMQ ⇒ JZMQ } import akka.actor.ActorRef -import scala.concurrent.util.duration._ -import scala.concurrent.util.Duration +import scala.concurrent.duration._ import org.zeromq.ZMQ.{ Poller, Socket } -import scala.concurrent.util.FiniteDuration /** * Marker trait representing request messages for zeromq diff --git a/akka-zeromq/src/main/scala/akka/zeromq/ZeroMQExtension.scala b/akka-zeromq/src/main/scala/akka/zeromq/ZeroMQExtension.scala index 32a3326076..85e05e54f3 100644 --- a/akka-zeromq/src/main/scala/akka/zeromq/ZeroMQExtension.scala +++ b/akka-zeromq/src/main/scala/akka/zeromq/ZeroMQExtension.scala @@ -8,11 +8,11 @@ import org.zeromq.ZMQ.Poller import akka.actor._ import akka.pattern.ask import scala.concurrent.Await -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import java.util.concurrent.TimeUnit import akka.util.Timeout import org.zeromq.ZMQException -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration.FiniteDuration /** * A Model to represent a version of the zeromq library diff --git a/akka-zeromq/src/test/scala/akka/zeromq/ConcurrentSocketActorSpec.scala b/akka-zeromq/src/test/scala/akka/zeromq/ConcurrentSocketActorSpec.scala index 3226b874a1..68123761c5 100644 --- a/akka-zeromq/src/test/scala/akka/zeromq/ConcurrentSocketActorSpec.scala +++ b/akka-zeromq/src/test/scala/akka/zeromq/ConcurrentSocketActorSpec.scala @@ -7,7 +7,7 @@ import language.postfixOps import org.scalatest.matchers.MustMatchers import akka.testkit.{ TestProbe, DefaultTimeout, AkkaSpec } -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.{ Cancellable, Actor, Props, ActorRef } import akka.util.Timeout diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index ff1085c32e..c534069ce3 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -48,7 +48,7 @@ object AkkaBuild extends Build { |import ActorDSL._ |import scala.concurrent._ |import com.typesafe.config.ConfigFactory - |import scala.concurrent.util.duration._ + |import scala.concurrent.duration._ |import akka.util.Timeout |val config = ConfigFactory.parseString("akka.stdout-loglevel=INFO,akka.loglevel=DEBUG") |val remoteConfig = ConfigFactory.parseString("akka.remote.netty{port=0,use-dispatcher-for-io=akka.actor.default-dispatcher,execution-pool-size=0},akka.actor.provider=akka.remote.RemoteActorRefProvider").withFallback(config) @@ -404,7 +404,7 @@ object AkkaBuild extends Build { shellPrompt := { s => Project.extract(s).currentProject.id + " > " }, resolvers <<= (resolvers, scalaVersion) apply { case (res, "2.10.0-SNAPSHOT") => - res :+ ("Scala Community 2.10.0-SNAPSHOT" at "https://scala-webapps.epfl.ch/jenkins/job/community-nightly/ws/target/repositories/fc24ea43b17664f020e43379e800c34be09700bd") + res :+ ("Sonatype Snapshot Repo" at "https://oss.sonatype.org/content/repositories/snapshots/") case (res, _) => res } From ef695cbb29b89271b5c7520a53d4e376e6220368 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Fri, 12 Oct 2012 13:00:16 +0200 Subject: [PATCH 030/210] LogRoleReplace filter out ESC characters --- .../src/test/scala/akka/remote/testkit/LogRoleReplace.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/akka-remote-tests/src/test/scala/akka/remote/testkit/LogRoleReplace.scala b/akka-remote-tests/src/test/scala/akka/remote/testkit/LogRoleReplace.scala index 51a189b7f9..6905b9b116 100644 --- a/akka-remote-tests/src/test/scala/akka/remote/testkit/LogRoleReplace.scala +++ b/akka-remote-tests/src/test/scala/akka/remote/testkit/LogRoleReplace.scala @@ -93,7 +93,7 @@ object LogRoleReplace extends ClipboardOwner { class LogRoleReplace { private val RoleStarted = """\[([\w\-]+)\].*Role \[([\w]+)\] started with address \[akka://.*@([\w\-\.]+):([0-9]+)\]""".r - private val ColorCode = """\[[0-9]+m""" + private val ColorCode = """\u001B?\[[0-9]+m""" private var replacements: Map[String, String] = Map.empty From 91f6c5a94dad08a481ffaea24d3ba55b7edec1ef Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Fri, 12 Oct 2012 13:27:31 +0200 Subject: [PATCH 031/210] Adjust barriers/checks in LeaderElectionSpec, see #2583 * Previously it didn't check for unreachable, before down --- .../akka/cluster/LeaderElectionSpec.scala | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderElectionSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderElectionSpec.scala index b16102e398..573121272b 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderElectionSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderElectionSpec.scala @@ -4,10 +4,12 @@ package akka.cluster +import language.postfixOps import com.typesafe.config.ConfigFactory import akka.remote.testkit.MultiNodeConfig import akka.remote.testkit.MultiNodeSpec import akka.testkit._ +import scala.concurrent.util.duration._ case class LeaderElectionMultiNodeConfig(failureDetectorPuppet: Boolean) extends MultiNodeConfig { val controller = role("controller") @@ -69,7 +71,7 @@ abstract class LeaderElectionSpec(multiNodeConfig: LeaderElectionMultiNodeConfig val leaderAddress = address(leader) enterBarrier("before-shutdown" + n) testConductor.shutdown(leader, 0) - enterBarrier("after-shutdown" + n, "after-down" + n, "completed" + n) + enterBarrier("after-shutdown" + n, "after-unavailable" + n, "after-down" + n, "completed" + n) case `leader` ⇒ enterBarrier("before-shutdown" + n, "after-shutdown" + n) @@ -78,15 +80,25 @@ abstract class LeaderElectionSpec(multiNodeConfig: LeaderElectionMultiNodeConfig case `aUser` ⇒ val leaderAddress = address(leader) enterBarrier("before-shutdown" + n, "after-shutdown" + n) + + // detect failure + markNodeAsUnavailable(leaderAddress) + awaitCond(clusterView.unreachableMembers.exists(m ⇒ m.address == leaderAddress)) + enterBarrier("after-unavailable" + n) + // user marks the shutdown leader as DOWN cluster.down(leaderAddress) enterBarrier("after-down" + n, "completed" + n) - markNodeAsUnavailable(leaderAddress) case _ if remainingRoles.contains(myself) ⇒ // remaining cluster nodes, not shutdown - enterBarrier("before-shutdown" + n, "after-shutdown" + n, "after-down" + n) + val leaderAddress = address(leader) + enterBarrier("before-shutdown" + n, "after-shutdown" + n) + awaitCond(clusterView.unreachableMembers.exists(m ⇒ m.address == leaderAddress)) + enterBarrier("after-unavailable" + n) + + enterBarrier("after-down" + n) awaitUpConvergence(currentRoles.size - 1) val nextExpectedLeader = remainingRoles.head clusterView.isLeader must be(myself == nextExpectedLeader) @@ -97,12 +109,12 @@ abstract class LeaderElectionSpec(multiNodeConfig: LeaderElectionMultiNodeConfig } } - "be able to 're-elect' a single leader after leader has left" taggedAs LongRunningTest in { + "be able to 're-elect' a single leader after leader has left" taggedAs LongRunningTest in within(20 seconds) { shutdownLeaderAndVerifyNewLeader(alreadyShutdown = 0) enterBarrier("after-2") } - "be able to 're-elect' a single leader after leader has left (again)" taggedAs LongRunningTest in { + "be able to 're-elect' a single leader after leader has left (again)" taggedAs LongRunningTest in within(20 seconds) { shutdownLeaderAndVerifyNewLeader(alreadyShutdown = 1) enterBarrier("after-3") } From ec438ca2a6183289a0e61b947842bc50e18ba4a3 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Fri, 12 Oct 2012 14:15:00 +0200 Subject: [PATCH 032/210] Logback and slf4j dependencies, see #2615 * Latest slf4j 1.6.6 * Latest logback-classic 1.0.7 * Removed runtime scope for logback in docs --- akka-docs/rst/java/logging.rst | 3 +-- akka-docs/rst/scala/logging.rst | 2 +- project/AkkaBuild.scala | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/akka-docs/rst/java/logging.rst b/akka-docs/rst/java/logging.rst index eefce2b35d..0f857837c5 100644 --- a/akka-docs/rst/java/logging.rst +++ b/akka-docs/rst/java/logging.rst @@ -194,8 +194,7 @@ It has one single dependency; the slf4j-api jar. In runtime you also need a SLF4 ch.qos.logback logback-classic - 1.0.4 - runtime + 1.0.7 You need to enable the Slf4jEventHandler in the 'event-handlers' element in diff --git a/akka-docs/rst/scala/logging.rst b/akka-docs/rst/scala/logging.rst index 60cd3f2a61..f8c3e11f27 100644 --- a/akka-docs/rst/scala/logging.rst +++ b/akka-docs/rst/scala/logging.rst @@ -232,7 +232,7 @@ It has one single dependency; the slf4j-api jar. In runtime you also need a SLF4 .. code-block:: scala - lazy val logback = "ch.qos.logback" % "logback-classic" % "1.0.4" % "runtime" + lazy val logback = "ch.qos.logback" % "logback-classic" % "1.0.7" You need to enable the Slf4jEventHandler in the 'event-handlers' element in diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 00ea3b26a8..23698d3b1a 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -701,7 +701,7 @@ object Dependency { val protobuf = "com.google.protobuf" % "protobuf-java" % "2.4.1" // New BSD val scalaStm = "org.scala-tools" % "scala-stm" % "0.6" cross CrossVersion.full // Modified BSD (Scala) - val slf4jApi = "org.slf4j" % "slf4j-api" % "1.6.4" // MIT + val slf4jApi = "org.slf4j" % "slf4j-api" % "1.6.6" // MIT val zeroMQClient = "org.zeromq" % "zeromq-scala-binding" % "0.0.6" cross CrossVersion.full // ApacheV2 val uncommonsMath = "org.uncommons.maths" % "uncommons-maths" % "1.2.2a" // ApacheV2 val ariesBlueprint = "org.apache.aries.blueprint" % "org.apache.aries.blueprint" % "0.3.2" // ApacheV2 @@ -717,7 +717,7 @@ object Dependency { val commonsMath = "org.apache.commons" % "commons-math" % "2.1" % "test" // ApacheV2 val commonsIo = "commons-io" % "commons-io" % "2.0.1" % "test" // ApacheV2 val junit = "junit" % "junit" % "4.10" % "test" // Common Public License 1.0 - val logback = "ch.qos.logback" % "logback-classic" % "1.0.4" % "test" // EPL 1.0 / LGPL 2.1 + val logback = "ch.qos.logback" % "logback-classic" % "1.0.7" % "test" // EPL 1.0 / LGPL 2.1 val mockito = "org.mockito" % "mockito-all" % "1.8.1" % "test" // MIT val scalatest = "org.scalatest" % "scalatest" % "1.9-2.10.0-M7-B1" % "test" cross CrossVersion.full // ApacheV2 val scalacheck = "org.scalacheck" % "scalacheck" % "1.10.0" % "test" cross CrossVersion.full // New BSD From d442f2024b49396c6e8748dc8eb845a305ddfebb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Antonsson?= Date: Fri, 12 Oct 2012 14:21:54 +0200 Subject: [PATCH 033/210] More Duration cleanup, and changed use of ScalaNumber to ScalaNumericConversions. #2504 --- .../test/scala/akka/util/DurationSpec.scala | 9 +++++---- .../src/main/scala/akka/camel/Consumer.scala | 1 + .../java/akka/camel/CustomRouteTestBase.java | 1 - .../camel/SampleErrorHandlingConsumer.java | 2 +- .../scala/akka/camel/CamelConfigSpec.scala | 2 +- .../cluster/ClusterMetricsCollector.scala | 20 +++++++++---------- .../contrib/pattern/ReliableProxySpec.scala | 4 ++-- .../scala/akka/dataflow/DataflowSpec.scala | 4 +--- 8 files changed, 21 insertions(+), 22 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/util/DurationSpec.scala b/akka-actor-tests/src/test/scala/akka/util/DurationSpec.scala index 39f8f769f5..d5c020be49 100644 --- a/akka-actor-tests/src/test/scala/akka/util/DurationSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/util/DurationSpec.scala @@ -33,11 +33,12 @@ class DurationSpec extends WordSpec with MustMatchers { val one = 1.second val inf = Duration.Inf val minf = Duration.MinusInf + val undefined = Duration.Undefined (-inf) must be(minf) - intercept[IllegalArgumentException] { minf + inf } - intercept[IllegalArgumentException] { inf - inf } - intercept[IllegalArgumentException] { inf + minf } - intercept[IllegalArgumentException] { minf - minf } + (minf + inf) must be(undefined) + (inf - inf) must be(undefined) + (inf + minf) must be(undefined) + (minf - minf) must be(undefined) (inf + inf) must be(inf) (inf - minf) must be(inf) (minf - inf) must be(minf) diff --git a/akka-camel/src/main/scala/akka/camel/Consumer.scala b/akka-camel/src/main/scala/akka/camel/Consumer.scala index 8a5db0a8ed..2915235745 100644 --- a/akka-camel/src/main/scala/akka/camel/Consumer.scala +++ b/akka-camel/src/main/scala/akka/camel/Consumer.scala @@ -8,6 +8,7 @@ import akka.camel.internal.CamelSupervisor.Register import org.apache.camel.model.{ RouteDefinition, ProcessorDefinition } import akka.actor._ import scala.concurrent.duration._ +import akka.dispatch.Mapper /** * Mixed in by Actor implementations that consume message from Camel endpoints. diff --git a/akka-camel/src/test/java/akka/camel/CustomRouteTestBase.java b/akka-camel/src/test/java/akka/camel/CustomRouteTestBase.java index c002bceec1..ae6d9c5531 100644 --- a/akka-camel/src/test/java/akka/camel/CustomRouteTestBase.java +++ b/akka-camel/src/test/java/akka/camel/CustomRouteTestBase.java @@ -17,7 +17,6 @@ import org.apache.camel.component.mock.MockEndpoint; import org.junit.Before; import org.junit.After; import org.junit.Test; -import scala.concurrent.util.FiniteDuration; import java.util.concurrent.TimeUnit; diff --git a/akka-camel/src/test/java/akka/camel/SampleErrorHandlingConsumer.java b/akka-camel/src/test/java/akka/camel/SampleErrorHandlingConsumer.java index 9c6af3ba2b..e8a057e1ac 100644 --- a/akka-camel/src/test/java/akka/camel/SampleErrorHandlingConsumer.java +++ b/akka-camel/src/test/java/akka/camel/SampleErrorHandlingConsumer.java @@ -12,7 +12,7 @@ import org.apache.camel.builder.Builder; import org.apache.camel.model.ProcessorDefinition; import org.apache.camel.model.RouteDefinition; import scala.Option; -import scala.concurrent.util.FiniteDuration; +import scala.concurrent.duration.FiniteDuration; /** * @author Martin Krasser diff --git a/akka-camel/src/test/scala/akka/camel/CamelConfigSpec.scala b/akka-camel/src/test/scala/akka/camel/CamelConfigSpec.scala index 9f4b802081..ca7b4ba3cc 100644 --- a/akka-camel/src/test/scala/akka/camel/CamelConfigSpec.scala +++ b/akka-camel/src/test/scala/akka/camel/CamelConfigSpec.scala @@ -6,7 +6,7 @@ package akka.camel import org.scalatest.matchers.MustMatchers import org.scalatest.WordSpec import akka.actor.ActorSystem -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import java.util.concurrent.TimeUnit._ class CamelConfigSpec extends WordSpec with MustMatchers { diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala index 180d3eb40a..984c7fa3b6 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala @@ -9,7 +9,7 @@ import scala.concurrent.duration._ import scala.collection.immutable.{ SortedSet, Map } import scala.concurrent.forkjoin.ThreadLocalRandom import scala.util.{ Try, Success, Failure } -import scala.math.ScalaNumber +import scala.math.ScalaNumericConversions import scala.runtime.{ RichLong, RichDouble, RichInt } import akka.actor._ @@ -238,7 +238,7 @@ private[cluster] case class MetricsGossipEnvelope(from: Address, gossip: Metrics * * @param startTime the time of initial sampling for this data stream */ -private[cluster] case class DataStream(decay: Int, ewma: ScalaNumber, startTime: Long, timestamp: Long) +private[cluster] case class DataStream(decay: Int, ewma: ScalaNumericConversions, startTime: Long, timestamp: Long) extends ClusterMessage with MetricNumericConverter { /** @@ -249,13 +249,13 @@ private[cluster] case class DataStream(decay: Int, ewma: ScalaNumber, startTime: /** * Calculates the exponentially weighted moving average for a given monitored data set. - * The datam can be too large to fit into an int or long, thus we use ScalaNumber, + * The datam can be too large to fit into an int or long, thus we use ScalaNumericConversions, * and defer to BigInt or BigDecimal. * * @param xn the new data point * @return an new [[akka.cluster.DataStream]] with the updated yn and timestamp */ - def :+(xn: ScalaNumber): DataStream = convert(xn) fold ( + def :+(xn: ScalaNumericConversions): DataStream = convert(xn) fold ( nl ⇒ copy(ewma = BigInt(α * nl + 1 - α * ewma.longValue()), timestamp = newTimestamp), nd ⇒ copy(ewma = BigDecimal(α * nd + 1 - α * ewma.doubleValue()), timestamp = newTimestamp)) @@ -273,7 +273,7 @@ private[cluster] case class DataStream(decay: Int, ewma: ScalaNumber, startTime: */ private[cluster] object DataStream { - def apply(decay: Int, data: ScalaNumber): Option[DataStream] = if (decay > 0) + def apply(decay: Int, data: ScalaNumericConversions): Option[DataStream] = if (decay > 0) Some(DataStream(decay, data, newTimestamp, newTimestamp)) else None } @@ -288,7 +288,7 @@ private[cluster] object DataStream { * @param average the data stream of the metric value, for trending over time. Metrics that are already * averages (e.g. system load average) or finite (e.g. as total cores), are not trended. */ -private[cluster] case class Metric(name: String, value: Option[ScalaNumber], average: Option[DataStream]) +private[cluster] case class Metric(name: String, value: Option[ScalaNumericConversions], average: Option[DataStream]) extends ClusterMessage with MetricNumericConverter { /** @@ -352,7 +352,7 @@ private[cluster] object Metric extends MetricNumericConverter { * or defined for the OS (JMX). If undefined we set the value option to None and do not modify * the latest sampled metric to avoid skewing the statistical trend. */ - def apply(name: String, value: Option[ScalaNumber]): Metric = value match { + def apply(name: String, value: Option[ScalaNumericConversions]): Metric = value match { case Some(v) if defined(v) ⇒ Metric(name, value, None) case _ ⇒ Metric(name, None, None) } @@ -409,15 +409,15 @@ private[cluster] trait MetricNumericConverter { *

  • JMX system load average and max heap can be 'undefined' for certain OS, in which case a -1 is returned
  • *
  • SIGAR combined CPU can occasionally return a NaN or Infinite (known bug)
*/ - def defined(value: ScalaNumber): Boolean = convert(value) fold (a ⇒ value != -1, b ⇒ !(b.isNaN || b.isInfinite)) + def defined(value: ScalaNumericConversions): Boolean = + convert(value) fold (a ⇒ value.underlying != -1, b ⇒ !(b.isNaN || b.isInfinite)) /** * May involve rounding or truncation. */ - def convert(from: ScalaNumber): Either[Long, Double] = from match { + def convert(from: ScalaNumericConversions): Either[Long, Double] = from match { case n: BigInt ⇒ Left(n.longValue()) case n: BigDecimal ⇒ Right(n.doubleValue()) - // FIXME: these are rejected as unreachable by the new pattern matcher case n: RichInt ⇒ Left(n.abs) case n: RichLong ⇒ Left(n.self) case n: RichDouble ⇒ Right(n.self) diff --git a/akka-contrib/src/multi-jvm/scala/akka/contrib/pattern/ReliableProxySpec.scala b/akka-contrib/src/multi-jvm/scala/akka/contrib/pattern/ReliableProxySpec.scala index 870028a3f2..3595b9887a 100644 --- a/akka-contrib/src/multi-jvm/scala/akka/contrib/pattern/ReliableProxySpec.scala +++ b/akka-contrib/src/multi-jvm/scala/akka/contrib/pattern/ReliableProxySpec.scala @@ -14,7 +14,7 @@ import akka.remote.testconductor.Direction import akka.actor.Props import akka.actor.Actor import akka.testkit.ImplicitSender -import scala.concurrent.util.duration._ +import scala.concurrent.duration._ import akka.actor.FSM import akka.actor.ActorRef import akka.testkit.TestProbe @@ -195,4 +195,4 @@ class ReliableProxySpec extends MultiNodeSpec(ReliableProxySpec) with STMultiNod } } -} \ No newline at end of file +} diff --git a/akka-dataflow/src/test/scala/akka/dataflow/DataflowSpec.scala b/akka-dataflow/src/test/scala/akka/dataflow/DataflowSpec.scala index 8af04d0e0a..0543b557c3 100644 --- a/akka-dataflow/src/test/scala/akka/dataflow/DataflowSpec.scala +++ b/akka-dataflow/src/test/scala/akka/dataflow/DataflowSpec.scala @@ -271,9 +271,7 @@ class DataflowSpec extends AkkaSpec with DefaultTimeout { assert(checkType(rString, classTag[String])) assert(checkType(rInt, classTag[Int])) assert(!checkType(rInt, classTag[String])) - assert(intercept[java.lang.Exception] { - assert(!checkType(rInt, classTag[Nothing])) - }.getMessage == "Nothing is a bottom type, therefore its erasure does not return a value") // When this fails, remove the intercept + assert(!checkType(rInt, classTag[Nothing])) assert(!checkType(rInt, classTag[Any])) Await.result(rString, timeout.duration) From 76c158e63c5b21525c0820571e27cf6fa5b4cc51 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Fri, 12 Oct 2012 18:46:20 +0200 Subject: [PATCH 034/210] slf4j 1.7.2, see #2615 --- project/AkkaBuild.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 23698d3b1a..7d0789aaae 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -701,7 +701,7 @@ object Dependency { val protobuf = "com.google.protobuf" % "protobuf-java" % "2.4.1" // New BSD val scalaStm = "org.scala-tools" % "scala-stm" % "0.6" cross CrossVersion.full // Modified BSD (Scala) - val slf4jApi = "org.slf4j" % "slf4j-api" % "1.6.6" // MIT + val slf4jApi = "org.slf4j" % "slf4j-api" % "1.7.2" // MIT val zeroMQClient = "org.zeromq" % "zeromq-scala-binding" % "0.0.6" cross CrossVersion.full // ApacheV2 val uncommonsMath = "org.uncommons.maths" % "uncommons-maths" % "1.2.2a" // ApacheV2 val ariesBlueprint = "org.apache.aries.blueprint" % "org.apache.aries.blueprint" % "0.3.2" // ApacheV2 From 0ab417b2c1fe1d4b78827d9ddd7d33935722e310 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Sun, 14 Oct 2012 03:35:09 +0200 Subject: [PATCH 035/210] #2612 - Clarifying ReceiveTimeout semantics in the documentation. --- .../actor/MyReceivedTimeoutUntypedActor.java | 4 ++++ akka-docs/rst/java/untyped-actors.rst | 19 +++++++++++++------ akka-docs/rst/scala/actors.rst | 19 +++++++++++++------ .../scala/code/docs/actor/ActorDocSpec.scala | 11 +++++++++-- 4 files changed, 39 insertions(+), 14 deletions(-) diff --git a/akka-docs/rst/java/code/docs/actor/MyReceivedTimeoutUntypedActor.java b/akka-docs/rst/java/code/docs/actor/MyReceivedTimeoutUntypedActor.java index b1fb899be7..66c0bd4b20 100644 --- a/akka-docs/rst/java/code/docs/actor/MyReceivedTimeoutUntypedActor.java +++ b/akka-docs/rst/java/code/docs/actor/MyReceivedTimeoutUntypedActor.java @@ -11,13 +11,17 @@ import scala.concurrent.util.Duration; public class MyReceivedTimeoutUntypedActor extends UntypedActor { public MyReceivedTimeoutUntypedActor() { + // To set an initial delay getContext().setReceiveTimeout(Duration.parse("30 seconds")); } public void onReceive(Object message) { if (message.equals("Hello")) { + // To set in a response to a message + getContext().setReceiveTimeout(Duration.parse("30 seconds")); getSender().tell("Hello world", getSelf()); } else if (message == ReceiveTimeout.getInstance()) { + // To turn it off throw new RuntimeException("received timeout"); } else { unhandled(message); diff --git a/akka-docs/rst/java/untyped-actors.rst b/akka-docs/rst/java/untyped-actors.rst index 685a0903d5..2ee8bc397f 100644 --- a/akka-docs/rst/java/untyped-actors.rst +++ b/akka-docs/rst/java/untyped-actors.rst @@ -431,13 +431,20 @@ defaults to a 'dead-letter' actor ref. getSender().tell(result); // will have dead-letter actor as default } -Initial receive timeout -======================= +Receive timeout +=============== -A timeout mechanism can be used to receive a message when no initial message is -received within a certain time. To receive this timeout you have to set the -``receiveTimeout`` property and declare handing for the ReceiveTimeout -message. +The `UntypedActorContext` :meth:`setReceiveTimeout` defines the inactivity timeout after which +the sending of a `ReceiveTimeout` message is triggered. +When specified, the receive function should be able to handle an `akka.actor.ReceiveTimeout` message. +1 millisecond is the minimum supported timeout. + +Please note that the receive timeout might fire and enqueue the `ReceiveTimeout` message right after +another message was enqueued; hence it is **not guaranteed** that upon reception of the receive +timeout there must have been an idle period beforehand as configured via this method. + +Once set, the receive timeout stays in effect (i.e. continues firing repeatedly after inactivity +periods). Pass in `Duration.Undefined` to switch off this feature. .. includecode:: code/docs/actor/MyReceivedTimeoutUntypedActor.java#receive-timeout diff --git a/akka-docs/rst/scala/actors.rst b/akka-docs/rst/scala/actors.rst index fea94dec0d..3000a2e55a 100644 --- a/akka-docs/rst/scala/actors.rst +++ b/akka-docs/rst/scala/actors.rst @@ -549,13 +549,20 @@ defaults to a 'dead-letter' actor ref. val result = process(request) sender ! result // will have dead-letter actor as default -Initial receive timeout -======================= +Receive timeout +=============== -A timeout mechanism can be used to receive a message when no initial message is -received within a certain time. To receive this timeout you have to set the -``receiveTimeout`` property and declare a case handing the ReceiveTimeout -object. +The `ActorContext` :meth:`setReceiveTimeout` defines the inactivity timeout after which +the sending of a `ReceiveTimeout` message is triggered. +When specified, the receive function should be able to handle an `akka.actor.ReceiveTimeout` message. +1 millisecond is the minimum supported timeout. + +Please note that the receive timeout might fire and enqueue the `ReceiveTimeout` message right after +another message was enqueued; hence it is **not guaranteed** that upon reception of the receive +timeout there must have been an idle period beforehand as configured via this method. + +Once set, the receive timeout stays in effect (i.e. continues firing repeatedly after inactivity +periods). Pass in `Duration.Undefined` to switch off this feature. .. includecode:: code/docs/actor/ActorDocSpec.scala#receive-timeout diff --git a/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala b/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala index 0cd43bdd7e..291c02bd85 100644 --- a/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala @@ -269,11 +269,18 @@ class ActorDocSpec extends AkkaSpec(Map("akka.loglevel" -> "INFO")) { //#receive-timeout import akka.actor.ReceiveTimeout import scala.concurrent.util.duration._ + import scala.concurrent.util.Duration class MyActor extends Actor { + // To set an initial delay context.setReceiveTimeout(30 milliseconds) def receive = { - case "Hello" ⇒ //... - case ReceiveTimeout ⇒ throw new RuntimeException("received timeout") + case "Hello" ⇒ + // To set in a response to a message + context.setReceiveTimeout(30 milliseconds) + case ReceiveTimeout ⇒ + // To turn it off + context.setReceiveTimeout(Duration.Undefined) + throw new RuntimeException("Receive timed out") } } //#receive-timeout From c813178373cacffe3b28fc82935adab715fb908a Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Sun, 14 Oct 2012 03:40:10 +0200 Subject: [PATCH 036/210] #2613 - Harmonized the Akka CONTRIBUTING.md with the Typesafe Developer Guidelines --- CONTRIBUTING.md | 116 +++++++++++++++++++++++++++++++----------------- 1 file changed, 75 insertions(+), 41 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fc929aca31..7b2b0af92d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,57 +1,91 @@ #Contributing to Akka# -Greetings traveller! - ##Infrastructure## * [Akka Contributor License Agreement](http://www.typesafe.com/contribute/cla) * [Akka Issue Tracker](http://doc.akka.io/docs/akka/current/project/issue-tracking.html) * [Scalariform](https://github.com/mdr/scalariform) -##Workflow## +# Typesafe Project & Developer Guidelines -0. Sign the Akka Contributor License Agreement, - we won't accept anything from anybody who has not signed it. -1. Find-or-create a ticket in the issue tracker -2. Assign that ticket to yourself -3. Create a local branch with the following name format: wip-X-Y-Z - where the X is the number of the ticket in the tracker, - and Y is some brief keywords of the ticket title and Z is your initials or similar. - Example: wip-2373-add-contributing-md-√ -4. Do what needs to be done (with tests and docs if applicable). - Your branch should pass all tests before going any further. -5. Push the branch to your clone of the Akka repository -6. Create a Pull Request onto the applicable Akka branch, - if the number of commits are more than a few, please squash the - commits first. -7. Change the status of your ticket to "Test" -8. The Pull Request will be reviewed by the Akka committers -9. Modify the Pull Request as agreed upon during the review, - then push the changes to your branch in your Akka repository, - the Pull Request should be automatically updated with the new - content. -10. Several cycles of review-then-change might occur. -11. Pull Request is either merged by the Akka committers, - or rejected, and the associated ticket will be updated to - reflect that. -12. Delete the local and remote wip-X-Y-Z +These guidelines are meant to be a living document that should be changed and adapted as needed. We encourage changes that makes it easier to achieve our goals in an efficient way. -##Code Reviews## +These guidelines mainly applies to Typesafe’s “mature” projects - not necessarily to projects of the type ‘collection of scripts’ etc. -Akka utilizes peer code reviews to streamline the codebase, reduce the defect ratio, -increase maintainability and spread knowledge about how things are solved. +## General Workflow -Core review values: +This is the process for committing code into master. There are of course exceptions to these rules, for example minor changes to comments and documentation, fixing a broken build etc. -* Rule: [The Boy Scout Rule](http://programmer.97things.oreilly.com/wiki/index.php/The_Boy_Scout_Rule) - - Why: Small improvements add up over time, keeping the codebase in shape. -* Rule: [Don't Repeat Yourself](http://programmer.97things.oreilly.com/wiki/index.php/Don't_Repeat_Yourself) - - Why: Repetitions are not maintainable, keeping things DRY makes it easier to fix bugs and refactor, - since you only need to apply the correction in one place, or perform the refactoring at one place. -* Rule: Feature tests > Integration tests > Unit tests - - Why: Without proving that a feature works, the code is only liability. - Without proving that a feature works with other features, the code is of limited value. - Without proving the individual parts of a feature works, the code is harder to debug. +1. Make sure you have signed the [Typesafe CLA](http://www.typesafe.com/contribute/cla), if not, sign it online. +2. Before starting to work on a feature or a fix, you have to make sure that: + 1. There is a ticket for your work in the project's issue tracker. If not, create it first. + 2. The ticket has been scheduled for the current milestone. + 3. The ticket is estimated by the team. + 4. The ticket have been discussed and prioritized by the team. +3. You should always perform your work in a Git feature branch. The branch should be given a descriptive name that explains its intent. Some teams also like adding the ticket number and/or the [GitHub](http://github.com) user ID to the branch name, these details is up to each of the individual teams. +4. When the feature or fix is completed you should open a [Pull Request](https://help.github.com/articles/using-pull-requests) on GitHub. +5. The Pull Request should be reviewed by other maintainers (as many as feasible/practical). Note that the maintainers can consist of outside contributors, both within and outside Typesafe. Outside contributors (for example from EPFL or independent committers) are encouraged to participate in the review process, it is not a closed process. +6. After the review you should fix the issues as needed (pushing a new commit for new review etc.), iterating until the reviewers give their thumbs up. +7. Once the code has passed review the Pull Request can be merged into the master branch. + +## Pull Request Requirements + +For a Pull Request to be considered at all it has to meet these requirements: + +1. Live up to the current code standard: + - Not violate [DRY](http://programmer.97things.oreilly.com/wiki/index.php/Don%27t_Repeat_Yourself). + - [Boy Scout Rule](http://programmer.97things.oreilly.com/wiki/index.php/The_Boy_Scout_Rule) needs to have been applied. +2. Regardless if the code introduces new features or fixes bugs or regressions, it must have comprehensive tests. +3. The code must be well documented in the Typesafe's standard documentation format (see the ‘Documentation’ section below). + +If these requirements are not met then the code should **not** be merged into master, or even reviewed - regardless of how good or important it is. No exceptions. + +## Continuous Integration + +Each project should be configured to use a continuous integration (CI) tool (i.e. a build server ala Jenkins). Typesafe has a Jenkins server farm that can be used. The CI tool should, on each push to master, build the **full** distribution and run **all** tests, and if something fails it should email out a notification with the failure report to the committer and the core team. The CI tool should also be used in conjunction with Typesafe’s Pull Request Validator (discussed below). + +## Documentation + +All documentation should be generated using the sbt-site-plugin, *or* publish artifacts to a repository that can be consumed by the typesafe stack. + +All documentation must abide by the following maxims: + +- Example code should be run as part of an automated test suite. +- Version should be **programmatically** specifiable to the build. +- Generation should be **completely automated** and available for scripting. +- Artifacts that must be included in the Typesafe Stack should be published to a maven “documentation” repository as documentation artifacts. + +All documentation is preferred to be in Typesafe's standard documentation format [reStructuredText](http://doc.akka.io/docs/akka/snapshot/dev/documentation.html) compiled using Typesafe's customized [Sphinx](http://sphinx.pocoo.org/) based documentation generation system, which among other things allows all code in the documentation to be externalized into compiled files and imported into the documentation. + +For more info, or for a starting point for new projects, look at the [Typesafe Documentation Sample project](https://github.com/typesafehub/doc-example). + +For larger projects that have invested a lot of time and resources into their current documentation and samples scheme (like for example Play), it is understandable that it will take some time to migrate to this new model. In these cases someone from the project needs to take the responsibility of manual QA and verifier for the documentation and samples. + +## Work In Progress + +It is ok to work on a public feature branch in the GitHub repository. Something that can sometimes be useful for early feedback etc. If so then it is preferable to name the branch accordingly. This can be done by either prefix the name with ``wip-`` as in ‘Work In Progress’, or use hierarchical names like ``wip/..``, ``feature/..`` or ``topic/..``. Either way is fine as long as it is clear that it is work in progress and not ready for merge. This work can temporarily have a lower standard. However, to be merged into master it will have to go through the regular process outlined above, with Pull Request, review etc.. + +Also, to facilitate both well-formed commits and working together, the ``wip`` and ``feature``/``topic`` identifiers also have special meaning. Any branch labelled with ``wip`` is considered “git-unstable” and may be rebased and have its history rewritten. Any branch with ``feature``/``topic`` in the name is considered “stable” enough for others to depend on when a group is working on a feature. + +## Creating Commits And Writing Commit Messages + +Follow these guidelines when creating public commits and writing commit messages. + +1. If your work spans multiple local commits (for example; if you do safe point commits while working in a feature branch or work in a branch for long time doing merges/rebases etc.) then please do not commit it all but rewrite the history by squashing the commits into a single big commit which you write a good commit message for (like discussed in the following sections). For more info read this article: [Git Workflow](http://sandofsky.com/blog/git-workflow.html). Every commit should be able to be used in isolation, cherry picked etc. +2. First line should be a descriptive sentence what the commit is doing. It should be possible to fully understand what the commit does by just reading this single line. It is **not ok** to only list the ticket number, type "minor fix" or similar. Include reference to ticket number, prefixed with #, at the end of the first line. If the commit is a small fix, then you are done. If not, go to 3. +3. Following the single line description should be a blank line followed by an enumerated list with the details of the commit. +4. Add keywords for your commit (depending on the degree of automation we reach, the list may change over time): + * ``Review by @gituser`` - if you want to notify someone on the team. The others can, and are encouraged to participate. + * ``Fix/Fixing/Fixes/Close/Closing/Refs #ticket`` - if you want to mark the ticket as fixed in the issue tracker (Assembla understands this). + * ``backport to _branch name_`` - if the fix needs to be cherry-picked to another branch (like 2.9.x, 2.10.x, etc) + +Example: + + Added monadic API to Future. Fixes #2731 + + * Details 1 + * Details 2 + * Details 3 ##Source style## From f5895ba64c3e5d76e0d40a537b2e48c81106cd26 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Sun, 14 Oct 2012 04:05:55 +0200 Subject: [PATCH 037/210] Adding SBT transient project config classes to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f646a4c173..82c89b5692 100755 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ project/plugins/project project/boot/* */project/build/target */project/boot +*/project/project.target.config-classes lib_managed etags tags From 3a0cf84d2c8a43a71e058c5542ca584584ef09f7 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Sun, 14 Oct 2012 04:43:13 +0200 Subject: [PATCH 038/210] Increasing timeouts for FutureDocTestBase to avoid Jenkins being too slow. --- .../code/docs/future/FutureDocTestBase.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/akka-docs/rst/java/code/docs/future/FutureDocTestBase.java b/akka-docs/rst/java/code/docs/future/FutureDocTestBase.java index 7b1e1f2be5..fc5c2937a1 100644 --- a/akka-docs/rst/java/code/docs/future/FutureDocTestBase.java +++ b/akka-docs/rst/java/code/docs/future/FutureDocTestBase.java @@ -113,7 +113,7 @@ public class FutureDocTestBase { return "Hello" + "World"; } }, system.dispatcher()); - String result = (String) Await.result(f, Duration.create(1, SECONDS)); + String result = (String) Await.result(f, Duration.create(5, SECONDS)); //#future-eval assertEquals("HelloWorld", result); } @@ -135,7 +135,7 @@ public class FutureDocTestBase { } }, ec); - int result = Await.result(f2, Duration.create(1, SECONDS)); + int result = Await.result(f2, Duration.create(5, SECONDS)); assertEquals(10, result); //#map } @@ -159,7 +159,7 @@ public class FutureDocTestBase { }, ec); //#map2 - int result = Await.result(f2, Duration.create(1, SECONDS)); + int result = Await.result(f2, Duration.create(5, SECONDS)); assertEquals(10, result); } @@ -183,7 +183,7 @@ public class FutureDocTestBase { }, ec); //#map3 - int result = Await.result(f2, Duration.create(1, SECONDS)); + int result = Await.result(f2, Duration.create(5, SECONDS)); assertEquals(10, result); } @@ -209,7 +209,7 @@ public class FutureDocTestBase { }, ec); //#flat-map - int result = Await.result(f2, Duration.create(1, SECONDS)); + int result = Await.result(f2, Duration.create(5, SECONDS)); assertEquals(10, result); } @@ -238,7 +238,7 @@ public class FutureDocTestBase { } }, ec); - long result = Await.result(futureSum, Duration.create(1, SECONDS)); + long result = Await.result(futureSum, Duration.create(5, SECONDS)); //#sequence assertEquals(3L, result); } @@ -262,7 +262,7 @@ public class FutureDocTestBase { }, ec); //Returns the sequence of strings as upper case - Iterable result = Await.result(futureResult, Duration.create(1, SECONDS)); + Iterable result = Await.result(futureResult, Duration.create(5, SECONDS)); assertEquals(Arrays.asList("A", "B", "C"), result); //#traverse } @@ -286,7 +286,7 @@ public class FutureDocTestBase { return r + t; //Just concatenate } }, ec); - String result = Await.result(resultFuture, Duration.create(1, SECONDS)); + String result = Await.result(resultFuture, Duration.create(5, SECONDS)); //#fold assertEquals("ab", result); @@ -310,7 +310,7 @@ public class FutureDocTestBase { } }, ec); - Object result = Await.result(resultFuture, Duration.create(1, SECONDS)); + Object result = Await.result(resultFuture, Duration.create(5, SECONDS)); //#reduce assertEquals("ab", result); @@ -326,10 +326,10 @@ public class FutureDocTestBase { Future otherFuture = Futures.failed( new IllegalArgumentException("Bang!")); //#failed - Object result = Await.result(future, Duration.create(1, SECONDS)); + Object result = Await.result(future, Duration.create(5, SECONDS)); assertEquals("Yay!", result); Throwable result2 = Await.result(otherFuture.failed(), - Duration.create(1, SECONDS)); + Duration.create(5, SECONDS)); assertEquals("Bang!", result2.getMessage()); } @@ -399,7 +399,7 @@ public class FutureDocTestBase { throw problem; } }, ec); - int result = Await.result(future, Duration.create(1, SECONDS)); + int result = Await.result(future, Duration.create(5, SECONDS)); assertEquals(result, 0); //#recover } @@ -425,7 +425,7 @@ public class FutureDocTestBase { throw problem; } }, ec); - int result = Await.result(future, Duration.create(1, SECONDS)); + int result = Await.result(future, Duration.create(5, SECONDS)); assertEquals(result, 0); //#try-recover } @@ -497,7 +497,7 @@ public class FutureDocTestBase { } }, ec); - String result = Await.result(future3, Duration.create(1, SECONDS)); + String result = Await.result(future3, Duration.create(5, SECONDS)); assertEquals("foo bar", result); //#zip } @@ -509,7 +509,7 @@ public class FutureDocTestBase { Future future3 = Futures.successful("bar"); // Will have "bar" in this case Future future4 = future1.fallbackTo(future2).fallbackTo(future3); - String result = Await.result(future4, Duration.create(1, SECONDS)); + String result = Await.result(future4, Duration.create(5, SECONDS)); assertEquals("bar", result); //#fallback-to } From 7fa58f735ab92ae336364294b2496bc790211b3b Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Mon, 15 Oct 2012 12:02:08 +0200 Subject: [PATCH 039/210] Adding link to CONTRIBUTING.md in developer-guidelines.rst --- akka-docs/rst/dev/developer-guidelines.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/akka-docs/rst/dev/developer-guidelines.rst b/akka-docs/rst/dev/developer-guidelines.rst index 903f2d64d9..17665c34e2 100644 --- a/akka-docs/rst/dev/developer-guidelines.rst +++ b/akka-docs/rst/dev/developer-guidelines.rst @@ -3,6 +3,8 @@ Developer Guidelines ==================== +First read: `The Akka Contributor Guidelines `_ . + Code Style ---------- From 1d578a9aa21706a699bd044d5943bfdf7ed498a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Antonsson?= Date: Mon, 15 Oct 2012 13:33:39 +0200 Subject: [PATCH 040/210] Change RemoteActorRef to not start before it's been published. #2575 --- .../src/main/scala/akka/actor/ActorRef.scala | 4 ---- .../akka/remote/RemoteActorRefProvider.scala | 17 +++++++++-------- .../main/scala/akka/testkit/TestActorRef.scala | 6 +++--- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorRef.scala b/akka-actor/src/main/scala/akka/actor/ActorRef.scala index df87360c65..00b06dc594 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRef.scala @@ -270,14 +270,10 @@ private[akka] class LocalActorRef private[akka] ( */ private val actorCell: ActorCell = newActorCell(_system, this, _props, _supervisor) actorCell.init(ThreadLocalRandom.current.nextInt(), sendSupervise = true) - if (actorCellShouldStart) - actorCell.start() protected def newActorCell(system: ActorSystemImpl, ref: InternalActorRef, props: Props, supervisor: InternalActorRef): ActorCell = new ActorCell(system, ref, props, supervisor) - protected def actorCellShouldStart(): Boolean = false - protected def actorContext: ActorContext = actorCell /** diff --git a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala index 87c66522b4..1d9ad9edc2 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala @@ -158,8 +158,7 @@ class RemoteActorRefProvider( local.actorOf(system, props, supervisor, path, false, deployment.headOption, false, async) } else { val rpath = RootActorPath(addr) / "remote" / transport.address.hostPort / path.elements - useActorOnNode(rpath, props, d, supervisor) - new RemoteActorRef(this, transport, rpath, supervisor) + new RemoteActorRef(this, transport, rpath, supervisor, Some(props), Some(d)) } case _ ⇒ local.actorOf(system, props, supervisor, path, systemService, deployment.headOption, false, async) @@ -169,12 +168,12 @@ class RemoteActorRefProvider( def actorFor(path: ActorPath): InternalActorRef = if (path.address == rootPath.address || path.address == transport.address) actorFor(rootGuardian, path.elements) - else new RemoteActorRef(this, transport, path, Nobody) + else new RemoteActorRef(this, transport, path, Nobody, props = None, deploy = None) def actorFor(ref: InternalActorRef, path: String): InternalActorRef = path match { case ActorPathExtractor(address, elems) ⇒ if (address == rootPath.address || address == transport.address) actorFor(rootGuardian, elems) - else new RemoteActorRef(this, transport, new RootActorPath(address) / elems, Nobody) + else new RemoteActorRef(this, transport, new RootActorPath(address) / elems, Nobody, props = None, deploy = None) case _ ⇒ local.actorFor(ref, path) } @@ -213,7 +212,9 @@ private[akka] class RemoteActorRef private[akka] ( val provider: RemoteActorRefProvider, remote: RemoteTransport, val path: ActorPath, - val getParent: InternalActorRef) + val getParent: InternalActorRef, + props: Option[Props], + deploy: Option[Deploy]) extends InternalActorRef with RemoteRef { def getChild(name: Iterator[String]): InternalActorRef = { @@ -221,7 +222,7 @@ private[akka] class RemoteActorRef private[akka] ( s.headOption match { case None ⇒ this case Some("..") ⇒ getParent getChild name - case _ ⇒ new RemoteActorRef(provider, remote, path / s, Nobody) + case _ ⇒ new RemoteActorRef(provider, remote, path / s, Nobody, props = None, deploy = None) } } @@ -243,7 +244,7 @@ private[akka] class RemoteActorRef private[akka] ( provider.deadLetters ! message } - def start(): Unit = () + def start(): Unit = if (props.isDefined && deploy.isDefined) provider.useActorOnNode(path, props.get, deploy.get, getParent) def suspend(): Unit = sendSystemMessage(Suspend()) @@ -255,4 +256,4 @@ private[akka] class RemoteActorRef private[akka] ( @throws(classOf[java.io.ObjectStreamException]) private def writeReplace(): AnyRef = SerializedActorRef(path) -} \ No newline at end of file +} diff --git a/akka-testkit/src/main/scala/akka/testkit/TestActorRef.scala b/akka-testkit/src/main/scala/akka/testkit/TestActorRef.scala index ee24286cb7..520f2557c7 100644 --- a/akka-testkit/src/main/scala/akka/testkit/TestActorRef.scala +++ b/akka-testkit/src/main/scala/akka/testkit/TestActorRef.scala @@ -42,6 +42,9 @@ class TestActorRef[T <: Actor]( _supervisor, _supervisor.path / name) { + // we need to start ourselves since the creation of an actor has been split into initialization and starting + underlying.start() + import TestActorRef.InternalGetActor override def newActorCell(system: ActorSystemImpl, ref: InternalActorRef, props: Props, supervisor: InternalActorRef): ActorCell = @@ -54,9 +57,6 @@ class TestActorRef[T <: Actor]( } } - // we need to start ourselves since the creation of an actor has been split into initialization and starting - override def actorCellShouldStart(): Boolean = true - /** * Directly inject messages into actor receive behavior. Any exceptions * thrown will be available to you, while still being able to use From dbad8c85f6f94b47b12b12fba3a1e587ce59f9be Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Mon, 15 Oct 2012 13:49:12 +0200 Subject: [PATCH 041/210] Clarifying setReceiveTimeout examples after review --- .../java/code/docs/actor/MyReceivedTimeoutUntypedActor.java | 3 ++- akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/akka-docs/rst/java/code/docs/actor/MyReceivedTimeoutUntypedActor.java b/akka-docs/rst/java/code/docs/actor/MyReceivedTimeoutUntypedActor.java index 66c0bd4b20..d2b2322acc 100644 --- a/akka-docs/rst/java/code/docs/actor/MyReceivedTimeoutUntypedActor.java +++ b/akka-docs/rst/java/code/docs/actor/MyReceivedTimeoutUntypedActor.java @@ -18,10 +18,11 @@ public class MyReceivedTimeoutUntypedActor extends UntypedActor { public void onReceive(Object message) { if (message.equals("Hello")) { // To set in a response to a message - getContext().setReceiveTimeout(Duration.parse("30 seconds")); + getContext().setReceiveTimeout(Duration.parse("10 seconds")); getSender().tell("Hello world", getSelf()); } else if (message == ReceiveTimeout.getInstance()) { // To turn it off + getContext().setReceiveTimeout(Duration.Undefined()); throw new RuntimeException("received timeout"); } else { unhandled(message); diff --git a/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala b/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala index 291c02bd85..ebd591db88 100644 --- a/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala @@ -274,9 +274,9 @@ class ActorDocSpec extends AkkaSpec(Map("akka.loglevel" -> "INFO")) { // To set an initial delay context.setReceiveTimeout(30 milliseconds) def receive = { - case "Hello" ⇒ + case "Hello" ⇒ // To set in a response to a message - context.setReceiveTimeout(30 milliseconds) + context.setReceiveTimeout(100 milliseconds) case ReceiveTimeout ⇒ // To turn it off context.setReceiveTimeout(Duration.Undefined) From ec4871e801be2841f726ac14b0b377721484fd54 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Mon, 15 Oct 2012 14:04:20 +0200 Subject: [PATCH 042/210] Removing rst_html and rst_latex --- .../main/scala/akka/actor/TypedActor.scala | 26 +++---- akka-docs/rst/general/supervision.rst | 5 ++ project/AkkaBuild.scala | 76 ++++++++++--------- 3 files changed, 54 insertions(+), 53 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/TypedActor.scala b/akka-actor/src/main/scala/akka/actor/TypedActor.scala index 69a3707f48..90cdc81744 100644 --- a/akka-actor/src/main/scala/akka/actor/TypedActor.scala +++ b/akka-actor/src/main/scala/akka/actor/TypedActor.scala @@ -607,8 +607,7 @@ class TypedActorExtension(system: ExtendedActorSystem) extends TypedActorFactory protected def actorFactory: ActorRefFactory = system protected def typedActor = this - val serialization = SerializationExtension(system) - val settings = system.settings + import system.settings /** * Default timeout for typed actor methods with non-void return type @@ -635,23 +634,18 @@ class TypedActorExtension(system: ExtendedActorSystem) extends TypedActorFactory private[akka] def createActorRefProxy[R <: AnyRef, T <: R](props: TypedProps[T], proxyVar: AtomVar[R], actorRef: ⇒ ActorRef): R = { //Warning, do not change order of the following statements, it's some elaborate chicken-n-egg handling val actorVar = new AtomVar[ActorRef](null) - val classLoader: ClassLoader = if (props.loader.nonEmpty) props.loader.get else props.interfaces.headOption.map(_.getClassLoader).orNull //If we have no loader, we arbitrarily take the loader of the first interface val proxy = Proxy.newProxyInstance( - classLoader, + (props.loader orElse props.interfaces.collectFirst { case any ⇒ any.getClassLoader }).orNull, //If we have no loader, we arbitrarily take the loader of the first interface props.interfaces.toArray, - new TypedActorInvocationHandler( - this, - actorVar, - if (props.timeout.isDefined) props.timeout.get else DefaultReturnTimeout)).asInstanceOf[R] + new TypedActorInvocationHandler(this, actorVar, props.timeout getOrElse DefaultReturnTimeout)).asInstanceOf[R] - proxyVar match { - case null ⇒ - actorVar.set(actorRef) - proxy - case _ ⇒ - proxyVar.set(proxy) // Chicken and egg situation we needed to solve, set the proxy so that we can set the self-reference inside each receive - actorVar.set(actorRef) //Make sure the InvocationHandler gets ahold of the actor reference, this is not a problem since the proxy hasn't escaped this method yet - proxyVar.get + if (proxyVar eq null) { + actorVar set actorRef + proxy + } else { + proxyVar set proxy // Chicken and egg situation we needed to solve, set the proxy so that we can set the self-reference inside each receive + actorVar set actorRef //Make sure the InvocationHandler gets ahold of the actor reference, this is not a problem since the proxy hasn't escaped this method yet + proxyVar.get } } diff --git a/akka-docs/rst/general/supervision.rst b/akka-docs/rst/general/supervision.rst index c28bbfc4f2..2b747316b2 100644 --- a/akka-docs/rst/general/supervision.rst +++ b/akka-docs/rst/general/supervision.rst @@ -189,6 +189,11 @@ external resource, which may also be one of its own children. If a third party terminates a child by way of the ``system.stop(child)`` method or sending a :class:`PoisonPill`, the supervisor might well be affected. +..warning:: + + DeathWatch for Akka Remote does not (yet) get triggered by connection failures. + This feature may be added in a future release of Akka Remoting. + One-For-One Strategy vs. All-For-One Strategy --------------------------------------------- diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 7d0789aaae..75f61aff07 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -648,7 +648,45 @@ object AkkaBuild extends Build { // Dependencies object Dependencies { - import Dependency._ + + object Compile { + // Compile + val camelCore = "org.apache.camel" % "camel-core" % "2.10.0" exclude("org.slf4j", "slf4j-api") // ApacheV2 + + val config = "com.typesafe" % "config" % "0.6.0" // ApacheV2 + val netty = "io.netty" % "netty" % "3.5.8.Final" // ApacheV2 + val protobuf = "com.google.protobuf" % "protobuf-java" % "2.4.1" // New BSD + val scalaStm = "org.scala-tools" % "scala-stm" % "0.6" cross CrossVersion.full // Modified BSD (Scala) + + val slf4jApi = "org.slf4j" % "slf4j-api" % "1.7.2" // MIT + val zeroMQClient = "org.zeromq" % "zeromq-scala-binding" % "0.0.6" cross CrossVersion.full // ApacheV2 + val uncommonsMath = "org.uncommons.maths" % "uncommons-maths" % "1.2.2a" // ApacheV2 + val ariesBlueprint = "org.apache.aries.blueprint" % "org.apache.aries.blueprint" % "0.3.2" // ApacheV2 + val osgiCore = "org.osgi" % "org.osgi.core" % "4.2.0" // ApacheV2 + + + // Camel Sample + val camelJetty = "org.apache.camel" % "camel-jetty" % camelCore.revision // ApacheV2 + + // Test + + object Test { + val commonsMath = "org.apache.commons" % "commons-math" % "2.1" % "test" // ApacheV2 + val commonsIo = "commons-io" % "commons-io" % "2.0.1" % "test" // ApacheV2 + val junit = "junit" % "junit" % "4.10" % "test" // Common Public License 1.0 + val logback = "ch.qos.logback" % "logback-classic" % "1.0.7" % "test" // EPL 1.0 / LGPL 2.1 + val mockito = "org.mockito" % "mockito-all" % "1.8.1" % "test" // MIT + val scalatest = "org.scalatest" % "scalatest" % "1.9-2.10.0-M7-B1" % "test" cross CrossVersion.full // ApacheV2 + val scalacheck = "org.scalacheck" % "scalacheck" % "1.10.0" % "test" cross CrossVersion.full // New BSD + val ariesProxy = "org.apache.aries.proxy" % "org.apache.aries.proxy.impl" % "0.3" % "test" // ApacheV2 + val pojosr = "com.googlecode.pojosr" % "de.kalpatec.pojosr.framework" % "0.1.4" % "test" // ApacheV2 + val tinybundles = "org.ops4j.pax.tinybundles" % "tinybundles" % "1.0.0" % "test" // ApacheV2 + val log4j = "log4j" % "log4j" % "1.2.14" % "test" // ApacheV2 + val junitIntf = "com.novocode" % "junit-interface" % "0.8" % "test" // MIT + } + } + + import Compile._ val actor = Seq(config) @@ -692,39 +730,3 @@ object Dependencies { val multiNodeSample = Seq(Test.scalatest) } - -object Dependency { - // Compile - val camelCore = "org.apache.camel" % "camel-core" % "2.10.0" exclude("org.slf4j", "slf4j-api") // ApacheV2 - val config = "com.typesafe" % "config" % "0.6.0" // ApacheV2 - val netty = "io.netty" % "netty" % "3.5.4.Final" // ApacheV2 - val protobuf = "com.google.protobuf" % "protobuf-java" % "2.4.1" // New BSD - val scalaStm = "org.scala-tools" % "scala-stm" % "0.6" cross CrossVersion.full // Modified BSD (Scala) - - val slf4jApi = "org.slf4j" % "slf4j-api" % "1.7.2" // MIT - val zeroMQClient = "org.zeromq" % "zeromq-scala-binding" % "0.0.6" cross CrossVersion.full // ApacheV2 - val uncommonsMath = "org.uncommons.maths" % "uncommons-maths" % "1.2.2a" // ApacheV2 - val ariesBlueprint = "org.apache.aries.blueprint" % "org.apache.aries.blueprint" % "0.3.2" // ApacheV2 - val osgiCore = "org.osgi" % "org.osgi.core" % "4.2.0" // ApacheV2 - - - // Camel Sample - val camelJetty = "org.apache.camel" % "camel-jetty" % camelCore.revision // ApacheV2 - - // Test - - object Test { - val commonsMath = "org.apache.commons" % "commons-math" % "2.1" % "test" // ApacheV2 - val commonsIo = "commons-io" % "commons-io" % "2.0.1" % "test" // ApacheV2 - val junit = "junit" % "junit" % "4.10" % "test" // Common Public License 1.0 - val logback = "ch.qos.logback" % "logback-classic" % "1.0.7" % "test" // EPL 1.0 / LGPL 2.1 - val mockito = "org.mockito" % "mockito-all" % "1.8.1" % "test" // MIT - val scalatest = "org.scalatest" % "scalatest" % "1.9-2.10.0-M7-B1" % "test" cross CrossVersion.full // ApacheV2 - val scalacheck = "org.scalacheck" % "scalacheck" % "1.10.0" % "test" cross CrossVersion.full // New BSD - val ariesProxy = "org.apache.aries.proxy" % "org.apache.aries.proxy.impl" % "0.3" % "test" // ApacheV2 - val pojosr = "com.googlecode.pojosr" % "de.kalpatec.pojosr.framework" % "0.1.4" % "test" // ApacheV2 - val tinybundles = "org.ops4j.pax.tinybundles" % "tinybundles" % "1.0.0" % "test" // ApacheV2 - val log4j = "log4j" % "log4j" % "1.2.14" % "test" // ApacheV2 - val junitIntf = "com.novocode" % "junit-interface" % "0.8" % "test" // MIT - } -} From f488b32b3496c52300857740daaf3d6eb3191eb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Antonsson?= Date: Mon, 15 Oct 2012 15:13:59 +0200 Subject: [PATCH 043/210] Corrected mixup in migration guide. --- akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst b/akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst index 449746ad02..88ae42fb6d 100644 --- a/akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst +++ b/akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst @@ -203,17 +203,17 @@ v2.0 Scala:: v2.1 Scala:: - val router2 = system.actorOf(Props[ExampleActor1].withRouter( - RoundRobinRouter(routees = routees))) + val router2 = system.actorOf(Props.empty.withRouter( + RoundRobinRouter(routees = routees))) v2.0 Java:: - ActorRef router2 = system.actorOf(new Props(ExampleActor.class).withRouter( + ActorRef router2 = system.actorOf(new Props().withRouter( RoundRobinRouter.create(routees))); v2.1 Java:: - ActorRef router2 = system.actorOf(new Props().withRouter( + ActorRef router2 = system.actorOf(Props.empty().withRouter( RoundRobinRouter.create(routees))); Props: Function-based creation From 0470bd65086aef4f287782dcee6495650b187560 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Mon, 15 Oct 2012 15:15:40 +0200 Subject: [PATCH 044/210] Make it possible to pass -D and -X args to multi jvm/node tests, see #2618 --- project/AkkaBuild.scala | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 75f61aff07..5b4a0525b4 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -440,7 +440,14 @@ object AkkaBuild extends Build { lazy val defaultMultiJvmOptions: Seq[String] = { import scala.collection.JavaConverters._ + // multinode.D= and multinode.X= makes it possible to pass arbitrary + // -D or -X arguments to the forked jvm, e.g. + // -Dmultinode.Djava.net.preferIPv4Stack=true -Dmultinode.Xmx512m -Dmultinode.XX:MaxPermSize=256M + val multinodeJvmArgs = "multinode\\.(D|X)(.*)".r val akkaProperties = System.getProperties.propertyNames.asScala.toList.collect { + case multinodeJvmArgs(a, b) => + val value = System.getProperty("multinode." + a + b) + "-" + a + b + (if (value == "") "" else "=" + value) case key: String if key.startsWith("multinode.") => "-D" + key + "=" + System.getProperty(key) case key: String if key.startsWith("akka.") => "-D" + key + "=" + System.getProperty(key) } From 19100f1275c81d3c55155981956d2353500b5a6e Mon Sep 17 00:00:00 2001 From: Roland Date: Mon, 15 Oct 2012 15:24:48 +0200 Subject: [PATCH 045/210] update versions for Scala 2.10.0-RC1 also fix a postfixOps warning and a duration error --- .../common/code/docs/duration/Sample.scala | 2 ++ .../extension/SettingsExtensionDocSpec.scala | 2 +- project/AkkaBuild.scala | 26 +++++++++---------- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/akka-docs/rst/common/code/docs/duration/Sample.scala b/akka-docs/rst/common/code/docs/duration/Sample.scala index 2bad498fd0..d374313900 100644 --- a/akka-docs/rst/common/code/docs/duration/Sample.scala +++ b/akka-docs/rst/common/code/docs/duration/Sample.scala @@ -4,6 +4,8 @@ package docs.duration +import language.postfixOps + object Scala { //#dsl import scala.concurrent.duration._ diff --git a/akka-docs/rst/scala/code/docs/extension/SettingsExtensionDocSpec.scala b/akka-docs/rst/scala/code/docs/extension/SettingsExtensionDocSpec.scala index 831ec28b21..502a214761 100644 --- a/akka-docs/rst/scala/code/docs/extension/SettingsExtensionDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/extension/SettingsExtensionDocSpec.scala @@ -8,7 +8,7 @@ import akka.actor.Extension import akka.actor.ExtensionId import akka.actor.ExtensionIdProvider import akka.actor.ExtendedActorSystem -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import com.typesafe.config.Config import java.util.concurrent.TimeUnit diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index c534069ce3..0c15039c06 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -29,7 +29,7 @@ object AkkaBuild extends Build { lazy val buildSettings = Seq( organization := "com.typesafe.akka", version := "2.1-SNAPSHOT", - scalaVersion := System.getProperty("akka.scalaVersion", "2.10.0-M7") + scalaVersion := System.getProperty("akka.scalaVersion", "2.10.0-RC1") ) lazy val akka = Project( @@ -65,7 +65,7 @@ object AkkaBuild extends Build { generatePdf in Sphinx <<= generatePdf in Sphinx in LocalProject(docs.id) map identity ), - aggregate = Seq(actor, testkit, actorTests, dataflow, remote, remoteTests, camel, cluster, slf4j, agent, transactor, mailboxes, zeroMQ, kernel, akkaSbtPlugin, osgi, osgiAries, docs, contrib) + aggregate = Seq(actor, testkit, actorTests, dataflow, remote, remoteTests, camel, cluster, slf4j, agent, transactor, mailboxes, /*zeroMQ,*/ kernel, akkaSbtPlugin, osgi, osgiAries, docs, contrib) ) lazy val actor = Project( @@ -215,15 +215,15 @@ object AkkaBuild extends Build { ) ) - lazy val zeroMQ = Project( - id = "akka-zeromq", - base = file("akka-zeromq"), - dependencies = Seq(actor, testkit % "test;test->test"), - settings = defaultSettings ++ OSGi.zeroMQ ++ Seq( - libraryDependencies ++= Dependencies.zeroMQ, - previousArtifact := akkaPreviousArtifact("akka-zeromq") - ) - ) +// lazy val zeroMQ = Project( +// id = "akka-zeromq", +// base = file("akka-zeromq"), +// dependencies = Seq(actor, testkit % "test;test->test"), +// settings = defaultSettings ++ OSGi.zeroMQ ++ Seq( +// libraryDependencies ++= Dependencies.zeroMQ, +// previousArtifact := akkaPreviousArtifact("akka-zeromq") +// ) +// ) lazy val kernel = Project( id = "akka-kernel", @@ -351,7 +351,7 @@ object AkkaBuild extends Build { id = "akka-docs", base = file("akka-docs"), dependencies = Seq(actor, testkit % "test->test", mailboxesCommon % "compile;test->test", - remote, cluster, slf4j, agent, dataflow, transactor, fileMailbox, zeroMQ, camel, osgi, osgiAries), + remote, cluster, slf4j, agent, dataflow, transactor, fileMailbox, /*zeroMQ,*/ camel, osgi, osgiAries), settings = defaultSettings ++ site.settings ++ site.sphinxSupport() ++ site.publishSite ++ sphinxPreprocessing ++ cpsPlugin ++ Seq( sourceDirectory in Sphinx <<= baseDirectory / "rst", sphinxPackages in Sphinx <+= baseDirectory { _ / "_sphinx" / "pygments" }, @@ -719,7 +719,7 @@ object Dependency { val junit = "junit" % "junit" % "4.10" % "test" // Common Public License 1.0 val logback = "ch.qos.logback" % "logback-classic" % "1.0.4" % "test" // EPL 1.0 / LGPL 2.1 val mockito = "org.mockito" % "mockito-all" % "1.8.1" % "test" // MIT - val scalatest = "org.scalatest" % "scalatest" % "1.9-2.10.0-M7-B1" % "test" cross CrossVersion.full // ApacheV2 + val scalatest = "org.scalatest" % "scalatest" % "1.8" % "test" cross CrossVersion.full // ApacheV2 val scalacheck = "org.scalacheck" % "scalacheck" % "1.10.0" % "test" cross CrossVersion.full // New BSD val ariesProxy = "org.apache.aries.proxy" % "org.apache.aries.proxy.impl" % "0.3" % "test" // ApacheV2 val pojosr = "com.googlecode.pojosr" % "de.kalpatec.pojosr.framework" % "0.1.4" % "test" // ApacheV2 From 51e2dbe3c0e2cca5f498c5470abdaa6a776150cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Antonsson?= Date: Mon, 15 Oct 2012 16:51:03 +0200 Subject: [PATCH 046/210] Fixed code example. #2513 --- akka-docs/rst/scala/code/docs/pattern/SchedulerPatternSpec.scala | 1 + 1 file changed, 1 insertion(+) diff --git a/akka-docs/rst/scala/code/docs/pattern/SchedulerPatternSpec.scala b/akka-docs/rst/scala/code/docs/pattern/SchedulerPatternSpec.scala index a669cb0bc5..c8bc865f65 100644 --- a/akka-docs/rst/scala/code/docs/pattern/SchedulerPatternSpec.scala +++ b/akka-docs/rst/scala/code/docs/pattern/SchedulerPatternSpec.scala @@ -15,6 +15,7 @@ import docs.pattern.SchedulerPatternSpec.ScheduleInConstructor object SchedulerPatternSpec { //#schedule-constructor class ScheduleInConstructor extends Actor { + import context.dispatcher val tick = context.system.scheduler.schedule(500 millis, 1000 millis, self, "tick") //#schedule-constructor From b96d77c15a0c52bf5ed194d68d196a8879cab351 Mon Sep 17 00:00:00 2001 From: Roland Date: Mon, 15 Oct 2012 17:17:54 +0200 Subject: [PATCH 047/210] actually build the samples and fix the resulting breakage (of not compiling them for some time, that is) also remove the last casts to FiniteDuration --- .../src/test/scala/akka/routing/ResizerSpec.scala | 2 +- .../src/test/scala/akka/camel/ProducerFeatureTest.scala | 2 +- .../src/main/scala/akka/cluster/ClusterHeartbeat.scala | 2 +- .../src/main/scala/akka/cluster/ClusterMetricsCollector.scala | 4 ++-- .../akka/remote/testconductor/NetworkFailureInjector.scala | 2 +- .../src/main/scala/AsyncRouteAndTransform.scala | 2 +- .../akka-sample-camel/src/main/scala/SimpleFileConsumer.scala | 2 +- .../main/java/sample/cluster/stats/japi/StatsAggregator.java | 2 +- .../java/sample/cluster/stats/japi/StatsSampleClient.java | 4 ++-- .../transformation/japi/TransformationFrontendMain.java | 2 +- akka-samples/akka-sample-fsm/src/main/scala/Buncher.scala | 4 ++-- .../scala/sample/remote/calculator/CreationApplication.scala | 2 +- .../scala/sample/remote/calculator/LookupApplication.scala | 2 +- project/AkkaBuild.scala | 2 +- 14 files changed, 17 insertions(+), 17 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/routing/ResizerSpec.scala b/akka-actor-tests/src/test/scala/akka/routing/ResizerSpec.scala index 5bcebb588f..ac0de07dcf 100644 --- a/akka-actor-tests/src/test/scala/akka/routing/ResizerSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/routing/ResizerSpec.scala @@ -160,7 +160,7 @@ class ResizerSpec extends AkkaSpec(ResizerSpec.config) with DefaultTimeout with // sending in too quickly will result in skipped resize due to many resizeInProgress conflicts Thread.sleep(20.millis.dilated.toMillis) } - within((((d * loops).asInstanceOf[FiniteDuration] / resizer.lowerBound) + 2.seconds.dilated).asInstanceOf[FiniteDuration]) { + within((d * loops / resizer.lowerBound) + 2.seconds.dilated) { for (m ← 0 until loops) expectMsg("done") } } diff --git a/akka-camel/src/test/scala/akka/camel/ProducerFeatureTest.scala b/akka-camel/src/test/scala/akka/camel/ProducerFeatureTest.scala index f549a25ef8..7cf9e92464 100644 --- a/akka-camel/src/test/scala/akka/camel/ProducerFeatureTest.scala +++ b/akka-camel/src/test/scala/akka/camel/ProducerFeatureTest.scala @@ -231,7 +231,7 @@ class ProducerFeatureTest extends WordSpec with BeforeAndAfterAll with BeforeAnd def stopGracefully(actors: ActorRef*)(implicit timeout: Timeout) { val deadline = timeout.duration.fromNow for (a ← actors) - Await.result(gracefulStop(a, deadline.timeLeft.asInstanceOf[FiniteDuration]), deadline.timeLeft) must be === true + Await.result(gracefulStop(a, deadline.timeLeft), deadline.timeLeft) must be === true } } diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala index 11a6769f71..8dfd6ba04b 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala @@ -93,7 +93,7 @@ private[cluster] final class ClusterHeartbeatSender extends Actor with ActorLogg selfAddress.toString, MonitoredByNrOfMembers) // start periodic heartbeat to other nodes in cluster - val heartbeatTask = scheduler.schedule(PeriodicTasksInitialDelay.max(HeartbeatInterval).asInstanceOf[FiniteDuration], + val heartbeatTask = scheduler.schedule(PeriodicTasksInitialDelay max HeartbeatInterval, HeartbeatInterval, self, HeartbeatTick) override def preStart(): Unit = cluster.subscribe(self, classOf[MemberEvent]) diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala index 984c7fa3b6..7edd0974c0 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala @@ -61,13 +61,13 @@ private[cluster] class ClusterMetricsCollector(publisher: ActorRef) extends Acto /** * Start periodic gossip to random nodes in cluster */ - val gossipTask = scheduler.schedule(PeriodicTasksInitialDelay.max(MetricsGossipInterval).asInstanceOf[FiniteDuration], + val gossipTask = scheduler.schedule(PeriodicTasksInitialDelay max MetricsGossipInterval, MetricsGossipInterval, self, GossipTick) /** * Start periodic metrics collection */ - val metricsTask = scheduler.schedule(PeriodicTasksInitialDelay.max(MetricsInterval).asInstanceOf[FiniteDuration], + val metricsTask = scheduler.schedule(PeriodicTasksInitialDelay max MetricsInterval, MetricsInterval, self, MetricsTick) override def preStart(): Unit = { diff --git a/akka-remote-tests/src/main/scala/akka/remote/testconductor/NetworkFailureInjector.scala b/akka-remote-tests/src/main/scala/akka/remote/testconductor/NetworkFailureInjector.scala index 02042b200d..3f2e739308 100644 --- a/akka-remote-tests/src/main/scala/akka/remote/testconductor/NetworkFailureInjector.scala +++ b/akka-remote-tests/src/main/scala/akka/remote/testconductor/NetworkFailureInjector.scala @@ -339,7 +339,7 @@ private[akka] class ThrottleActor(channelContext: ChannelHandlerContext) else { val microsToSend = (now - d.lastSent) / 1000 val (s1, s2) = split(d.queue.head, (microsToSend * d.rateMBit / 8).toInt) - (d.copy(queue = s2 +: d.queue.tail), toSend :+ s1, Some(((timeForPacket - now).nanos min packetSplitThreshold).asInstanceOf[FiniteDuration])) + (d.copy(queue = s2 +: d.queue.tail), toSend :+ s1, Some((timeForPacket - now).nanos min packetSplitThreshold)) } } } diff --git a/akka-samples/akka-sample-camel/src/main/scala/AsyncRouteAndTransform.scala b/akka-samples/akka-sample-camel/src/main/scala/AsyncRouteAndTransform.scala index 5c6f52d595..d424d8486f 100644 --- a/akka-samples/akka-sample-camel/src/main/scala/AsyncRouteAndTransform.scala +++ b/akka-samples/akka-sample-camel/src/main/scala/AsyncRouteAndTransform.scala @@ -24,7 +24,7 @@ class HttpProducer(transformer: ActorRef) extends Actor with Producer { def endpointUri = "jetty://http://akka.io/?bridgeEndpoint=true" override def transformOutgoingMessage(msg: Any) = msg match { - case msg: CamelMessage ⇒ msg.withHeaders(msg.headers(Set(Exchange.HTTP_PATH))) + case msg: CamelMessage ⇒ msg.copy(headers = msg.headers(Set(Exchange.HTTP_PATH))) } override def routeResponse(msg: Any) { diff --git a/akka-samples/akka-sample-camel/src/main/scala/SimpleFileConsumer.scala b/akka-samples/akka-sample-camel/src/main/scala/SimpleFileConsumer.scala index 909de26813..94370d0529 100644 --- a/akka-samples/akka-sample-camel/src/main/scala/SimpleFileConsumer.scala +++ b/akka-samples/akka-sample-camel/src/main/scala/SimpleFileConsumer.scala @@ -19,6 +19,6 @@ class FileConsumer(uri: String) extends Consumer { def endpointUri = uri def receive = { case msg: CamelMessage ⇒ - println("Received file %s with content:\n%s".format(msg.getHeader(Exchange.FILE_NAME), msg.bodyAs[String])) + println("Received file %s with content:\n%s".format(msg.headers(Exchange.FILE_NAME), msg.bodyAs[String])) } } diff --git a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsAggregator.java b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsAggregator.java index 469a443131..aba6b67674 100644 --- a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsAggregator.java +++ b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsAggregator.java @@ -6,7 +6,7 @@ import java.util.concurrent.TimeUnit; import sample.cluster.stats.japi.StatsMessages.JobFailed; import sample.cluster.stats.japi.StatsMessages.StatsResult; -import scala.concurrent.util.Duration; +import scala.concurrent.duration.Duration; import akka.actor.ActorRef; import akka.actor.ReceiveTimeout; import akka.actor.UntypedActor; diff --git a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsSampleClient.java b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsSampleClient.java index 3350fed61a..bb3f52e248 100644 --- a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsSampleClient.java +++ b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsSampleClient.java @@ -10,8 +10,8 @@ import sample.cluster.stats.japi.StatsMessages.JobFailed; import sample.cluster.stats.japi.StatsMessages.StatsJob; import sample.cluster.stats.japi.StatsMessages.StatsResult; import scala.concurrent.forkjoin.ThreadLocalRandom; -import scala.concurrent.util.Duration; -import scala.concurrent.util.FiniteDuration; +import scala.concurrent.duration.Duration; +import scala.concurrent.duration.FiniteDuration; import akka.actor.ActorRef; import akka.actor.Address; import akka.actor.Cancellable; diff --git a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/transformation/japi/TransformationFrontendMain.java b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/transformation/japi/TransformationFrontendMain.java index 2793494b3d..741d9452be 100644 --- a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/transformation/japi/TransformationFrontendMain.java +++ b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/transformation/japi/TransformationFrontendMain.java @@ -4,7 +4,7 @@ import java.util.concurrent.TimeUnit; import sample.cluster.transformation.japi.TransformationMessages.TransformationJob; import scala.concurrent.ExecutionContext; -import scala.concurrent.util.Duration; +import scala.concurrent.duration.Duration; import akka.actor.ActorRef; import akka.actor.ActorSystem; import akka.actor.Props; diff --git a/akka-samples/akka-sample-fsm/src/main/scala/Buncher.scala b/akka-samples/akka-sample-fsm/src/main/scala/Buncher.scala index 64dc611396..9fc9a371f6 100644 --- a/akka-samples/akka-sample-fsm/src/main/scala/Buncher.scala +++ b/akka-samples/akka-sample-fsm/src/main/scala/Buncher.scala @@ -5,9 +5,9 @@ package sample.fsm.buncher import akka.actor.ActorRefFactory import scala.reflect.ClassTag -import scala.concurrent.util.Duration +import scala.concurrent.duration.Duration import akka.actor.{ FSM, Actor, ActorRef } -import scala.concurrent.util.FiniteDuration +import scala.concurrent.duration.FiniteDuration /* * generic typed object buncher. diff --git a/akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/CreationApplication.scala b/akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/CreationApplication.scala index c37e3e1ed8..a227611fdf 100644 --- a/akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/CreationApplication.scala +++ b/akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/CreationApplication.scala @@ -40,7 +40,7 @@ class CreationActor extends Actor { case result: MathResult ⇒ result match { case MultiplicationResult(n1, n2, r) ⇒ println("Mul result: %d * %d = %d".format(n1, n2, r)) - case DivisionResult(n1, n2, r) ⇒ + case DivisionResult(n1, n2, r) ⇒ println("Div result: %.0f / %d = %.2f".format(n1, n2, r)) } } diff --git a/akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/LookupApplication.scala b/akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/LookupApplication.scala index cee40de5e7..70f49eb29d 100644 --- a/akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/LookupApplication.scala +++ b/akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/LookupApplication.scala @@ -40,7 +40,7 @@ class LookupActor extends Actor { def receive = { case (actor: ActorRef, op: MathOp) ⇒ actor ! op case result: MathResult ⇒ result match { - case AddResult(n1, n2, r) ⇒ + case AddResult(n1, n2, r) ⇒ println("Add result: %d + %d = %d".format(n1, n2, r)) case SubtractResult(n1, n2, r) ⇒ println("Sub result: %d - %d = %d".format(n1, n2, r)) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 5a3490b86d..1bf83f218c 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -65,7 +65,7 @@ object AkkaBuild extends Build { generatePdf in Sphinx <<= generatePdf in Sphinx in LocalProject(docs.id) map identity ), - aggregate = Seq(actor, testkit, actorTests, dataflow, remote, remoteTests, camel, cluster, slf4j, agent, transactor, mailboxes, zeroMQ, kernel, akkaSbtPlugin, osgi, osgiAries, docs, contrib) + aggregate = Seq(actor, testkit, actorTests, dataflow, remote, remoteTests, camel, cluster, slf4j, agent, transactor, mailboxes, zeroMQ, kernel, akkaSbtPlugin, osgi, osgiAries, docs, contrib, samples) ) lazy val actor = Project( From 43acb90c8b55810907ce6ed43de59aa21fd7e83a Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Mon, 15 Oct 2012 17:27:02 +0200 Subject: [PATCH 048/210] Capitalize extractor --- project/AkkaBuild.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 5b4a0525b4..97af0919ef 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -443,9 +443,9 @@ object AkkaBuild extends Build { // multinode.D= and multinode.X= makes it possible to pass arbitrary // -D or -X arguments to the forked jvm, e.g. // -Dmultinode.Djava.net.preferIPv4Stack=true -Dmultinode.Xmx512m -Dmultinode.XX:MaxPermSize=256M - val multinodeJvmArgs = "multinode\\.(D|X)(.*)".r + val MultinodeJvmArgs = "multinode\\.(D|X)(.*)".r val akkaProperties = System.getProperties.propertyNames.asScala.toList.collect { - case multinodeJvmArgs(a, b) => + case MultinodeJvmArgs(a, b) => val value = System.getProperty("multinode." + a + b) "-" + a + b + (if (value == "") "" else "=" + value) case key: String if key.startsWith("multinode.") => "-D" + key + "=" + System.getProperty(key) From ef80428b022a61ab56212a61f82953599d50618b Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Mon, 15 Oct 2012 20:00:12 +0200 Subject: [PATCH 049/210] #2619 - make read first in the developer guidelines a ..note:: --- akka-docs/rst/dev/developer-guidelines.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/akka-docs/rst/dev/developer-guidelines.rst b/akka-docs/rst/dev/developer-guidelines.rst index 17665c34e2..b5f3c3788d 100644 --- a/akka-docs/rst/dev/developer-guidelines.rst +++ b/akka-docs/rst/dev/developer-guidelines.rst @@ -3,7 +3,9 @@ Developer Guidelines ==================== -First read: `The Akka Contributor Guidelines `_ . +..note:: + + First read: `The Akka Contributor Guidelines `_ . Code Style ---------- From 74b1e3a53d03c319407fdfa22515f760c5131111 Mon Sep 17 00:00:00 2001 From: Roland Date: Mon, 15 Oct 2012 20:26:13 +0200 Subject: [PATCH 050/210] review comments: Duration.parse and FIXMEs - found two more mentions of Duration.parse, replaced by Duration.create - add FIXME to build for zeroMQ and scalaVersion --- .../src/main/scala/akka/actor/UntypedActor.scala | 2 +- akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst | 2 +- project/AkkaBuild.scala | 10 +++------- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/UntypedActor.scala b/akka-actor/src/main/scala/akka/actor/UntypedActor.scala index 015d8fb9e3..47ddf4fc43 100644 --- a/akka-actor/src/main/scala/akka/actor/UntypedActor.scala +++ b/akka-actor/src/main/scala/akka/actor/UntypedActor.scala @@ -36,7 +36,7 @@ import akka.japi.{ Creator } * } * } * - * private static SupervisorStrategy strategy = new OneForOneStrategy(10, Duration.parse("1 minute"), + * private static SupervisorStrategy strategy = new OneForOneStrategy(10, Duration.create("1 minute"), * new Function() { * @Override * public Directive apply(Throwable t) { diff --git a/akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst b/akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst index bf2a7baf73..b162f8e24f 100644 --- a/akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst +++ b/akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst @@ -66,7 +66,7 @@ Java: :: // Use this Actors' Dispatcher as ExecutionContext - getContext().system().scheduler().scheduleOnce(Duration.parse("10 seconds", + getContext().system().scheduler().scheduleOnce(Duration.create("10 seconds", getSelf(), new Reconnect(), getContext().getDispatcher()); // Use ActorSystem's default Dispatcher as ExecutionContext diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 1bf83f218c..47ca2278d4 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -29,6 +29,7 @@ object AkkaBuild extends Build { lazy val buildSettings = Seq( organization := "com.typesafe.akka", version := "2.1-SNAPSHOT", + // FIXME: use 2.10.0 for final scalaVersion := System.getProperty("akka.scalaVersion", "2.10.0-RC1") ) @@ -401,13 +402,7 @@ object AkkaBuild extends Build { super.settings ++ buildSettings ++ Seq( - shellPrompt := { s => Project.extract(s).currentProject.id + " > " }, - resolvers <<= (resolvers, scalaVersion) apply { - case (res, "2.10.0-SNAPSHOT") => - res :+ ("Sonatype Snapshot Repo" at "https://oss.sonatype.org/content/repositories/snapshots/") - case (res, _) => - res - } + shellPrompt := { s => Project.extract(s).currentProject.id + " > " } ) lazy val baseSettings = Defaults.defaultSettings ++ Publish.settings @@ -659,6 +654,7 @@ object Dependencies { val scalaStm = "org.scala-tools" % "scala-stm" % "0.6" cross CrossVersion.full // Modified BSD (Scala) val slf4jApi = "org.slf4j" % "slf4j-api" % "1.7.2" // MIT + // FIXME: use 2.10.0-RC1 version once published val zeroMQClient = "org.zeromq" % "zeromq-scala-binding_2.10.0-M7" % "0.0.6" // ApacheV2 val uncommonsMath = "org.uncommons.maths" % "uncommons-maths" % "1.2.2a" // ApacheV2 val ariesBlueprint = "org.apache.aries.blueprint" % "org.apache.aries.blueprint" % "0.3.2" // ApacheV2 From c27389ca1b50a41838edb22aae163932f84c585c Mon Sep 17 00:00:00 2001 From: Roland Date: Mon, 15 Oct 2012 21:34:31 +0200 Subject: [PATCH 051/210] clarify need to carefully managing blocking, see #2616 --- akka-docs/rst/general/actor-systems.rst | 54 +++++++++++++++++-- .../dispatcher/DispatcherDocTestBase.java | 13 +++-- akka-docs/rst/java/dispatchers.rst | 9 ++++ .../docs/dispatcher/DispatcherDocSpec.scala | 7 +++ akka-docs/rst/scala/dispatchers.rst | 9 ++++ .../calculator/CreationApplication.scala | 2 +- .../remote/calculator/LookupApplication.scala | 2 +- 7 files changed, 86 insertions(+), 10 deletions(-) diff --git a/akka-docs/rst/general/actor-systems.rst b/akka-docs/rst/general/actor-systems.rst index 1b7d6a7759..99df8bd334 100644 --- a/akka-docs/rst/general/actor-systems.rst +++ b/akka-docs/rst/general/actor-systems.rst @@ -89,10 +89,9 @@ Actor Best Practices bothering everyone else needlessly and avoid hogging resources. Translated to programming this means to process events and generate responses (or more requests) in an event-driven manner. Actors should not block (i.e. passively - wait while occupying a Thread) on some external entity, which might be a - lock, a network socket, etc. The blocking operations should be done in some - special-cased thread which sends messages to the actors which shall act on - them. + wait while occupying a Thread) on some external entity—which might be a + lock, a network socket, etc.—unless it is unavoidable; in the latter case + see below. #. Do not pass mutable objects between actors. In order to ensure that, prefer immutable messages. If the encapsulation of actors is broken by exposing @@ -112,6 +111,53 @@ Actor Best Practices performance) and it also reduces the number of blocking calls made, since the creation of top-level actors involves synchronous messaging. +Blocking Needs Careful Management +--------------------------------- + +In some cases it is unavoidable to do blocking operations, i.e. to put a thread +to sleep for an indeterminate time, waiting for an external event to occur. +Examples are legacy RDBMS drivers or messaging APIs, and the underlying reason +in typically that (network) I/O occurs under the covers. When facing this, you +may be tempted to just wrap the blocking call inside a :class:`Future` and work +with that instead, but this strategy is too simple: you are quite likely to +find bottle-necks or run out of memory or threads when the application runs +under increased load. + +The non-exhaustive list of adequate solutions to the “blocking problem” +includes the following suggestions: + + - Do the blocking call within an actor (or a set of actors managed by a router + [:ref:`Java `, :ref:`Scala `]), making sure to + configure a thread pool which is either dedicated for this purpose or + sufficiently sized. + + - Do the blocking call within a :class:`Future`, ensuring an upper bound on + the number of such calls at any point in time (submitting an unbounded + number of tasks of this nature will exhaust your memory or thread limits). + + - Do the blocking call within a :class:`Future`, providing a thread pool with + an upper limit on the number of threads which is appropriate for the + hardware on which the application runs. + + - Dedicate a single thread to manage a set of blocking resources (e.g. a NIO + selector driving multiple channels) and dispatch events as they occur as + actor messages. + +The first possibility is especially well-suited for resources which are +single-threaded in nature, like database handles which traditionally can only +execute one outstanding query at a time and use internal synchronization to +ensure this. A common pattern is to create a router for N actors, each of which +wraps a single DB connection and handles queries as sent to the router. The +number N must then be tuned for maximum throughput, which will vary depending +on which DBMS is deployed on what hardware. + +.. note:: + + Configuring thread pools is a task best delegated to Akka, simply configure + in the ``application.conf`` and instantiate through an :class:`ActorSystem` + [:ref:`Java `, :ref:`Scala + `] + What you should not concern yourself with ----------------------------------------- diff --git a/akka-docs/rst/java/code/docs/dispatcher/DispatcherDocTestBase.java b/akka-docs/rst/java/code/docs/dispatcher/DispatcherDocTestBase.java index 04705d524c..5c0c2d1711 100644 --- a/akka-docs/rst/java/code/docs/dispatcher/DispatcherDocTestBase.java +++ b/akka-docs/rst/java/code/docs/dispatcher/DispatcherDocTestBase.java @@ -5,10 +5,6 @@ package docs.dispatcher; //#imports import akka.actor.*; -import akka.actor.ActorRef; -import akka.actor.Props; -import akka.actor.UntypedActor; -import akka.actor.UntypedActorFactory; //#imports //#imports-prio @@ -37,6 +33,7 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import scala.Option; +import scala.concurrent.ExecutionContext; import com.typesafe.config.ConfigFactory; @@ -75,6 +72,14 @@ public class DispatcherDocTestBase { .withDispatcher("my-pinned-dispatcher")); //#defining-pinned-dispatcher } + + public void compileLookup() { + //#lookup + // this is scala.concurrent.ExecutionContext + // for use with Futures, Scheduler, etc. + final ExecutionContext ex = system.dispatchers().lookup("my-dispatcher"); + //#lookup + } @Test public void priorityDispatcher() throws Exception { diff --git a/akka-docs/rst/java/dispatchers.rst b/akka-docs/rst/java/dispatchers.rst index 7fa54e0529..b25a1c33b0 100644 --- a/akka-docs/rst/java/dispatchers.rst +++ b/akka-docs/rst/java/dispatchers.rst @@ -13,6 +13,15 @@ Default dispatcher Every ``ActorSystem`` will have a default dispatcher that will be used in case nothing else is configured for an ``Actor``. The default dispatcher can be configured, and is by default a ``Dispatcher`` with a "fork-join-executor", which gives excellent performance in most cases. +.. _dispatcher-lookup-java: + +Looking up a Dispatcher +----------------------- + +Dispatchers implement the :class:`ExecutionContext` interface and can thus be used to run :class:`Future` invocations etc. + +.. includecode:: code/docs/dispatcher/DispatcherDocTestBase.java#lookup + Setting the dispatcher for an Actor ----------------------------------- diff --git a/akka-docs/rst/scala/code/docs/dispatcher/DispatcherDocSpec.scala b/akka-docs/rst/scala/code/docs/dispatcher/DispatcherDocSpec.scala index 7d06bb43da..49873d9737 100644 --- a/akka-docs/rst/scala/code/docs/dispatcher/DispatcherDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/dispatcher/DispatcherDocSpec.scala @@ -186,6 +186,13 @@ class DispatcherDocSpec extends AkkaSpec(DispatcherDocSpec.config) { //#defining-pinned-dispatcher } + "looking up a dispatcher" in { + //#lookup + // for use with Futures, Scheduler, etc. + implicit val executionContext = system.dispatchers.lookup("my-dispatcher") + //#lookup + } + "defining priority dispatcher" in { //#prio-dispatcher diff --git a/akka-docs/rst/scala/dispatchers.rst b/akka-docs/rst/scala/dispatchers.rst index ac95c9c42c..68182af86e 100644 --- a/akka-docs/rst/scala/dispatchers.rst +++ b/akka-docs/rst/scala/dispatchers.rst @@ -13,6 +13,15 @@ Default dispatcher Every ``ActorSystem`` will have a default dispatcher that will be used in case nothing else is configured for an ``Actor``. The default dispatcher can be configured, and is by default a ``Dispatcher`` with a "fork-join-executor", which gives excellent performance in most cases. +.. _dispatcher-lookup-scala: + +Looking up a Dispatcher +----------------------- + +Dispatchers implement the :class:`ExecutionContext` interface and can thus be used to run :class:`Future` invocations etc. + +.. includecode:: code/docs/dispatcher/DispatcherDocSpec.scala#lookup + Setting the dispatcher for an Actor ----------------------------------- diff --git a/akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/CreationApplication.scala b/akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/CreationApplication.scala index c37e3e1ed8..a227611fdf 100644 --- a/akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/CreationApplication.scala +++ b/akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/CreationApplication.scala @@ -40,7 +40,7 @@ class CreationActor extends Actor { case result: MathResult ⇒ result match { case MultiplicationResult(n1, n2, r) ⇒ println("Mul result: %d * %d = %d".format(n1, n2, r)) - case DivisionResult(n1, n2, r) ⇒ + case DivisionResult(n1, n2, r) ⇒ println("Div result: %.0f / %d = %.2f".format(n1, n2, r)) } } diff --git a/akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/LookupApplication.scala b/akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/LookupApplication.scala index cee40de5e7..70f49eb29d 100644 --- a/akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/LookupApplication.scala +++ b/akka-samples/akka-sample-remote/src/main/scala/sample/remote/calculator/LookupApplication.scala @@ -40,7 +40,7 @@ class LookupActor extends Actor { def receive = { case (actor: ActorRef, op: MathOp) ⇒ actor ! op case result: MathResult ⇒ result match { - case AddResult(n1, n2, r) ⇒ + case AddResult(n1, n2, r) ⇒ println("Add result: %d + %d = %d".format(n1, n2, r)) case SubtractResult(n1, n2, r) ⇒ println("Sub result: %d - %d = %d".format(n1, n2, r)) From daaa5d5eafd53a13a1f336b521f3a494f524a89f Mon Sep 17 00:00:00 2001 From: Roland Date: Mon, 15 Oct 2012 21:41:17 +0200 Subject: [PATCH 052/210] mention stateName in FSM unhandled messages, see #2617 --- akka-actor/src/main/scala/akka/actor/FSM.scala | 2 ++ akka-docs/rst/scala/fsm.rst | 3 +++ 2 files changed, 5 insertions(+) diff --git a/akka-actor/src/main/scala/akka/actor/FSM.scala b/akka-actor/src/main/scala/akka/actor/FSM.scala index a58abb0ac3..f2faccce25 100644 --- a/akka-actor/src/main/scala/akka/actor/FSM.scala +++ b/akka-actor/src/main/scala/akka/actor/FSM.scala @@ -427,6 +427,8 @@ trait FSM[S, D] extends Listeners with ActorLogging { /** * Set handler which is called upon reception of unhandled messages. Calling * this method again will overwrite the previous contents. + * + * The current state may be queried using ``stateName``. */ final def whenUnhandled(stateFunction: StateFunction): Unit = handleEvent = stateFunction orElse handleEventDefault diff --git a/akka-docs/rst/scala/fsm.rst b/akka-docs/rst/scala/fsm.rst index b8fac5a6e3..bcccce0197 100644 --- a/akka-docs/rst/scala/fsm.rst +++ b/akka-docs/rst/scala/fsm.rst @@ -192,6 +192,9 @@ do something else in this case you can specify that with .. includecode:: code/docs/actor/FSMDocSpec.scala :include: unhandled-syntax +Within this handler the state of the FSM may be queried using the +:meth:`stateName` method. + **IMPORTANT**: This handler is not stacked, meaning that each invocation of :func:`whenUnhandled` replaces the previously installed handler. From e7ded49eb7cb4e4a03c83d9e5a2365f8f28412f7 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Mon, 15 Oct 2012 15:22:02 +0200 Subject: [PATCH 053/210] Config lib v1.0.0, see #2611 --- project/AkkaBuild.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 97af0919ef..f78bce104f 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -660,7 +660,7 @@ object Dependencies { // Compile val camelCore = "org.apache.camel" % "camel-core" % "2.10.0" exclude("org.slf4j", "slf4j-api") // ApacheV2 - val config = "com.typesafe" % "config" % "0.6.0" // ApacheV2 + val config = "com.typesafe" % "config" % "1.0.0" // ApacheV2 val netty = "io.netty" % "netty" % "3.5.8.Final" // ApacheV2 val protobuf = "com.google.protobuf" % "protobuf-java" % "2.4.1" // New BSD val scalaStm = "org.scala-tools" % "scala-stm" % "0.6" cross CrossVersion.full // Modified BSD (Scala) From 4b04faf582bd415bb8184930d25af2854641fb91 Mon Sep 17 00:00:00 2001 From: Roland Date: Mon, 15 Oct 2012 22:54:20 +0200 Subject: [PATCH 054/210] put in sonatype repo for scala-stm --- project/AkkaBuild.scala | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index d9c0eb92de..6263a576a7 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -171,6 +171,8 @@ object AkkaBuild extends Build { base = file("akka-agent"), dependencies = Seq(actor, testkit % "test->test"), settings = defaultSettings ++ OSGi.agent ++ Seq( + // FIXME remove once scala-stm is on maven central + resolvers += "sonatype" at "http://oss.sonatype.org/content/repositories/releases", libraryDependencies ++= Dependencies.agent, previousArtifact := akkaPreviousArtifact("akka-agent") ) @@ -181,6 +183,8 @@ object AkkaBuild extends Build { base = file("akka-transactor"), dependencies = Seq(actor, testkit % "test->test"), settings = defaultSettings ++ OSGi.transactor ++ Seq( + // FIXME remove once scala-stm is on maven central + resolvers += "sonatype" at "http://oss.sonatype.org/content/repositories/releases", libraryDependencies ++= Dependencies.transactor, previousArtifact := akkaPreviousArtifact("akka-transactor") ) From b6e4c748869dbda3c19d69995728914631c01845 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Viktor=20Klang=20=28=E2=88=9A=29?= Date: Tue, 16 Oct 2012 10:59:11 +0300 Subject: [PATCH 055/210] Update akka-docs/rst/dev/developer-guidelines.rst Tidying up developer guidelines link --- akka-docs/rst/dev/developer-guidelines.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/akka-docs/rst/dev/developer-guidelines.rst b/akka-docs/rst/dev/developer-guidelines.rst index b5f3c3788d..a8971f7fbf 100644 --- a/akka-docs/rst/dev/developer-guidelines.rst +++ b/akka-docs/rst/dev/developer-guidelines.rst @@ -3,9 +3,9 @@ Developer Guidelines ==================== -..note:: +.. note:: - First read: `The Akka Contributor Guidelines `_ . + First read `The Akka Contributor Guidelines `_ . Code Style ---------- From 94eaeca3a7c42fd06c7b081436434525018c740a Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Tue, 16 Oct 2012 10:54:21 +0200 Subject: [PATCH 056/210] Mavenize java akka-sample-cluster --- akka-docs/rst/cluster/cluster-usage-java.rst | 104 ++++++++++++------- akka-docs/rst/project/links.rst | 50 +++++++-- akka-samples/akka-sample-cluster/pom.xml | 39 +++++++ 3 files changed, 148 insertions(+), 45 deletions(-) create mode 100644 akka-samples/akka-sample-cluster/pom.xml diff --git a/akka-docs/rst/cluster/cluster-usage-java.rst b/akka-docs/rst/cluster/cluster-usage-java.rst index c8e2d791b4..6abe22e700 100644 --- a/akka-docs/rst/cluster/cluster-usage-java.rst +++ b/akka-docs/rst/cluster/cluster-usage-java.rst @@ -25,6 +25,8 @@ version from ``_. We recommend against using ``SNAPSHOT`` in order to obtain stable builds. +.. _cluster_simple_example_java: + A Simple Cluster Example ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -54,17 +56,33 @@ ip-addresses or host names of the machines in ``application.conf`` instead of `` .. literalinclude:: ../../../akka-samples/akka-sample-cluster/src/main/java/sample/cluster/simple/japi/SimpleClusterApp.java :language: java +3. Add `maven exec plugin `_ to your pom.xml:: -3. Start the first seed node. Open a sbt session in one terminal window and run:: + + + + + org.codehaus.mojo + exec-maven-plugin + 1.2.1 + + + + - run-main sample.cluster.simple.japi.SimpleClusterApp 2551 + +4. Start the first seed node. Open a terminal window and run (one line):: + + mvn exec:java -Dexec.mainClass="sample.cluster.simple.japi.SimpleClusterApp" \ + -Dexec.args="2551" 2551 corresponds to the port of the first seed-nodes element in the configuration. In the log output you see that the cluster node has been started and changed status to 'Up'. -4. Start the second seed node. Open a sbt session in another terminal window and run:: +5. Start the second seed node. Open another terminal window and run:: - run-main sample.cluster.simple.japi.SimpleClusterApp 2552 + mvn exec:java -Dexec.mainClass="sample.cluster.simple.japi.SimpleClusterApp" \ + -Dexec.args="2552" 2552 corresponds to the port of the second seed-nodes element in the configuration. @@ -73,9 +91,9 @@ and becomes a member of the cluster. It's status changed to 'Up'. Switch over to the first terminal window and see in the log output that the member joined. -5. Start another node. Open a sbt session in yet another terminal window and run:: +6. Start another node. Open a sbt session in yet another terminal window and run:: - run-main sample.cluster.simple.japi.SimpleClusterApp + mvn exec:java -Dexec.mainClass="sample.cluster.simple.japi.SimpleClusterApp" Now you don't need to specify the port number, and it will use a random available port. It joins one of the configured seed nodes. Look at the log output in the different terminal @@ -197,23 +215,28 @@ Death watch uses the cluster failure detector for nodes in the cluster, i.e. it network failures and JVM crashes, in addition to graceful termination of watched actor. -This example is included in ``akka-samples/akka-sample-cluster`` -and you can try by starting nodes in different terminal windows. For example, starting 2 +This example is included in ``akka-samples/akka-sample-cluster`` and you can try it by copying the +`source `_ to your +maven project, defined as in :ref:`cluster_simple_example_java`. +Run it by starting nodes in different terminal windows. For example, starting 2 frontend nodes and 3 backend nodes:: - sbt + mvn exec:java \ + -Dexec.mainClass="sample.cluster.transformation.japi.TransformationFrontendMain" \ + -Dexec.args="2551" - project akka-sample-cluster-experimental + mvn exec:java \ + -Dexec.mainClass="sample.cluster.transformation.japi.TransformationBackendMain" \ + -Dexec.args="2552" - run-main sample.cluster.transformation.japi.TransformationFrontendMain 2551 + mvn exec:java \ + -Dexec.mainClass="sample.cluster.transformation.japi.TransformationBackendMain" - run-main sample.cluster.transformation.japi.TransformationBackendMain 2552 + mvn exec:java \ + -Dexec.mainClass="sample.cluster.transformation.japi.TransformationBackendMain" - run-main sample.cluster.transformation.japi.TransformationBackendMain - - run-main sample.cluster.transformation.japi.TransformationBackendMain - - run-main sample.cluster.transformation.japi.TransformationFrontendMain + mvn exec:java \ + -Dexec.mainClass="sample.cluster.transformation.japi.TransformationFrontendMain" .. note:: The above example should probably be designed as two separate, frontend/backend, clusters, when there is a `cluster client for decoupling clusters `_. @@ -355,21 +378,26 @@ This means that user requests can be sent to ``StatsService`` on any node and it ``StatsWorker`` on all nodes. There can only be one worker per node, but that worker could easily fan out to local children if more parallelism is needed. -This example is included in ``akka-samples/akka-sample-cluster`` -and you can try by starting nodes in different terminal windows. For example, starting 3 +This example is included in ``akka-samples/akka-sample-cluster`` and you can try it by copying the +`source `_ to your +maven project, defined as in :ref:`cluster_simple_example_java`. +Run it by starting nodes in different terminal windows. For example, starting 3 service nodes and 1 client:: - sbt + mvn exec:java \ + -Dexec.mainClass="run-main sample.cluster.stats.japi.StatsSampleMain" \ + -Dexec.args="2551" - project akka-sample-cluster-experimental + mvn exec:java \ + -Dexec.mainClass="run-main sample.cluster.stats.japi.StatsSampleMain" \ + -Dexec.args="2552" - run-main sample.cluster.stats.japi.StatsSampleMain 2551 + mvn exec:java \ + -Dexec.mainClass="run-main sample.cluster.stats.japi.StatsSampleMain" - run-main sample.cluster.stats.japi.StatsSampleMain 2552 + mvn exec:java \ + -Dexec.mainClass="run-main sample.cluster.stats.japi.StatsSampleMain" - run-main sample.cluster.stats.japi.StatsSampleClientMain - - run-main sample.cluster.stats.japi.StatsSampleMain The above setup is nice for this example, but we will also take a look at how to use a single master node that creates and deploys workers. To keep track of a single @@ -387,22 +415,26 @@ All nodes start ``StatsFacade`` and the router is now configured like this: .. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsSampleOneMasterMain.java#start-router-deploy - -This example is included in ``akka-samples/akka-sample-cluster`` -and you can try by starting nodes in different terminal windows. For example, starting 3 +This example is included in ``akka-samples/akka-sample-cluster`` and you can try it by copying the +`source `_ to your +maven project, defined as in :ref:`cluster_simple_example_java`. +Run it by starting nodes in different terminal windows. For example, starting 3 service nodes and 1 client:: - sbt + mvn exec:java \ + -Dexec.mainClass="sample.cluster.stats.japi.StatsSampleOneMasterMain" \ + -Dexec.args="2551" - project akka-sample-cluster-experimental + mvn exec:java \ + -Dexec.mainClass="sample.cluster.stats.japi.StatsSampleOneMasterMain" \ + -Dexec.args="2552" - run-main sample.cluster.stats.japi.StatsSampleOneMasterMain 2551 + mvn exec:java \ + -Dexec.mainClass="sample.cluster.stats.japi.StatsSampleOneMasterClientMain" - run-main sample.cluster.stats.japi.StatsSampleOneMasterMain 2552 + mvn exec:java \ + -Dexec.mainClass="sample.cluster.stats.japi.StatsSampleOneMasterMain" - run-main sample.cluster.stats.japi.StatsSampleOneMasterClientMain - - run-main sample.cluster.stats.japi.StatsSampleOneMasterMain .. note:: The above example, especially the last part, will be simplified when the cluster handles automatic actor partitioning. diff --git a/akka-docs/rst/project/links.rst b/akka-docs/rst/project/links.rst index 238971d1ba..8266240e24 100644 --- a/akka-docs/rst/project/links.rst +++ b/akka-docs/rst/project/links.rst @@ -1,13 +1,17 @@ .. _support: +######### + Project +######### + Commercial Support -================== +^^^^^^^^^^^^^^^^^^ Commercial support is provided by `Typesafe `_. Akka is now part of the `Typesafe Stack `_. Mailing List -============ +^^^^^^^^^^^^ `Akka User Google Group `_ @@ -15,13 +19,13 @@ Mailing List Downloads -========= +^^^^^^^^^ ``_ Source Code -=========== +^^^^^^^^^^^ Akka uses Git and is hosted at `Github `_. @@ -29,7 +33,7 @@ Akka uses Git and is hosted at `Github `_. Releases Repository -=================== +^^^^^^^^^^^^^^^^^^^ The Akka Maven repository can be found at http://repo.akka.io/releases/. @@ -50,7 +54,7 @@ underlying repositories directly. Snapshots Repository -==================== +^^^^^^^^^^^^^^^^^^^^ Nightly builds are available in http://repo.akka.io/snapshots/ and proxied through http://repo.typesafe.com/typesafe/snapshots/ as both ``SNAPSHOT`` and @@ -60,12 +64,40 @@ For timestamped versions, pick a timestamp from http://repo.typesafe.com/typesafe/snapshots/com/typesafe/akka/akka-actor_@binVersion@/. All Akka modules that belong to the same build have the same timestamp. -Make sure that you add the repository to the sbt resolvers or maven repositories:: +sbt definition of snapshot repository +------------------------------------- + +Make sure that you add the repository to the sbt resolvers:: resolvers += "Typesafe Snapshots" at "http://repo.typesafe.com/typesafe/snapshots/" Define the library dependencies with the timestamp as version. For example:: - libraryDependencies += "com.typesafe.akka" % "akka-actor_@binVersion@" % "2.1-20120913-000917" + libraryDependencies += "com.typesafe.akka" % "akka-remote_@binVersion@" % "2.1-20121016-001042" + +maven definition of snapshot repository +--------------------------------------- + +Make sure that you add the repository to the maven repositories in pom.xml:: + + + + typesafe-snapshots + Typesafe Snapshots + http://repo.typesafe.com/typesafe/snapshots/ + default + + + +Define the library dependencies with the timestamp as version. For example:: + + + + com.typesafe.akka + akka-remote_@binVersion@ + 2.1-20121016-001042 + + + + - libraryDependencies += "com.typesafe.akka" % "akka-remote_@binVersion@" % "2.1-20120913-000917" diff --git a/akka-samples/akka-sample-cluster/pom.xml b/akka-samples/akka-sample-cluster/pom.xml new file mode 100644 index 0000000000..e01518726d --- /dev/null +++ b/akka-samples/akka-sample-cluster/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + + com.typesafe.akka + akka-sample-cluster-experimental-japi + 2.1-SNAPSHOT + jar + + UTF-8 + + + + com.typesafe.akka + akka-cluster-experimental_2.10.0-RC1 + 2.1-20121016-001042 + + + + + typesafe-snapshots + Typesafe Snapshots + http://repo.typesafe.com/typesafe/snapshots/ + default + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.2.1 + + + + \ No newline at end of file From e86144499ca98f21d944d65414a04d0acc426c74 Mon Sep 17 00:00:00 2001 From: Roland Date: Tue, 16 Oct 2012 12:06:03 +0200 Subject: [PATCH 057/210] remove some FIXMEs some were left-over residue, some were fixed --- .../test/scala/akka/dispatch/FutureSpec.scala | 269 ------------------ .../scala/akka/actor/ActorSelection.scala | 1 - .../src/main/scala/akka/actor/Deployer.scala | 6 +- .../main/scala/akka/actor/FaultHandling.scala | 4 +- .../akka/dispatch/AbstractDispatcher.scala | 2 +- .../main/scala/akka/dispatch/Dispatcher.scala | 2 +- .../main/scala/akka/pattern/AskSupport.scala | 2 +- .../scala/akka/pattern/CircuitBreaker.scala | 3 +- .../src/main/scala/akka/routing/Routing.scala | 6 +- 9 files changed, 15 insertions(+), 280 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/dispatch/FutureSpec.scala b/akka-actor-tests/src/test/scala/akka/dispatch/FutureSpec.scala index 28a5fe6a70..9c732d7279 100644 --- a/akka-actor-tests/src/test/scala/akka/dispatch/FutureSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/dispatch/FutureSpec.scala @@ -521,268 +521,6 @@ class FutureSpec extends AkkaSpec with Checkers with BeforeAndAfterAll with Defa filterException[TimeoutException] { intercept[TimeoutException] { FutureSpec.ready(f3, 0 millis) } } } - //FIXME DATAFLOW - /*"futureComposingWithContinuations" in { - import Future.flow - - val actor = system.actorOf(Props[TestActor]) - - val x = Future("Hello") - val y = x flatMap (actor ? _) mapTo manifest[String] - - val r = flow(x() + " " + y() + "!") - - assert(Await.result(r, timeout.duration) === "Hello World!") - - system.stop(actor) - } - - "futureComposingWithContinuationsFailureDivideZero" in { - filterException[ArithmeticException] { - import Future.flow - - val x = Future("Hello") - val y = x map (_.length) - - val r = flow(x() + " " + y.map(_ / 0).map(_.toString).apply, 100) - - intercept[java.lang.ArithmeticException](Await.result(r, timeout.duration)) - } - } - - "futureComposingWithContinuationsFailureCastInt" in { - filterException[ClassCastException] { - import Future.flow - - val actor = system.actorOf(Props[TestActor]) - - val x = Future(3) - val y = (actor ? "Hello").mapTo[Int] - - val r = flow(x() + y(), 100) - - intercept[ClassCastException](Await.result(r, timeout.duration)) - } - } - - "futureComposingWithContinuationsFailureCastNothing" in { - filterException[ClassCastException] { - import Future.flow - - val actor = system.actorOf(Props[TestActor]) - - val x = Future("Hello") - val y = actor ? "Hello" mapTo manifest[Nothing] - - val r = flow(x() + y()) - - intercept[ClassCastException](Await.result(r, timeout.duration)) - } - } - - "futureCompletingWithContinuations" in { - import Future.flow - - val x, y, z = Promise[Int]() - val ly, lz = new TestLatch - - val result = flow { - y completeWith x - ly.open() // not within continuation - - z << x - lz.open() // within continuation, will wait for 'z' to complete - z() + y() - } - - FutureSpec.ready(ly, 100 milliseconds) - intercept[TimeoutException] { FutureSpec.ready(lz, 100 milliseconds) } - - flow { x << 5 } - - assert(Await.result(y, timeout.duration) === 5) - assert(Await.result(z, timeout.duration) === 5) - FutureSpec.ready(lz, timeout.duration) - assert(Await.result(result, timeout.duration) === 10) - - val a, b, c = Promise[Int]() - - val result2 = flow { - val n = (a << c).value.get.right.get + 10 - b << (c() - 2) - a() + n * b() - } - - c completeWith Future(5) - - assert(Await.result(a, timeout.duration) === 5) - assert(Await.result(b, timeout.duration) === 3) - assert(Await.result(result2, timeout.duration) === 50) - } - - "futureDataFlowShouldEmulateBlocking1" in { - import Future.flow - - val one, two = Promise[Int]() - val simpleResult = flow { - one() + two() - } - - assert(List(one, two, simpleResult).forall(_.isCompleted == false)) - - flow { one << 1 } - - FutureSpec.ready(one, 1 minute) - - assert(one.isCompleted) - assert(List(two, simpleResult).forall(_.isCompleted == false)) - - flow { two << 9 } - - FutureSpec.ready(two, 1 minute) - - assert(List(one, two).forall(_.isCompleted == true)) - assert(Await.result(simpleResult, timeout.duration) === 10) - - } - - "futureDataFlowShouldEmulateBlocking2" in { - import Future.flow - val x1, x2, y1, y2 = Promise[Int]() - val lx, ly, lz = new TestLatch - val result = flow { - lx.open() - x1 << y1 - ly.open() - x2 << y2 - lz.open() - x1() + x2() - } - FutureSpec.ready(lx, 2 seconds) - assert(!ly.isOpen) - assert(!lz.isOpen) - assert(List(x1, x2, y1, y2).forall(_.isCompleted == false)) - - flow { y1 << 1 } // When this is set, it should cascade down the line - - FutureSpec.ready(ly, 2 seconds) - assert(Await.result(x1, 1 minute) === 1) - assert(!lz.isOpen) - - flow { y2 << 9 } // When this is set, it should cascade down the line - - FutureSpec.ready(lz, 2 seconds) - assert(Await.result(x2, 1 minute) === 9) - - assert(List(x1, x2, y1, y2).forall(_.isCompleted)) - - assert(Await.result(result, 1 minute) === 10) - } - - "dataFlowAPIshouldbeSlick" in { - import Future.flow - - val i1, i2, s1, s2 = new TestLatch - - val callService1 = Future { i1.open(); FutureSpec.ready(s1, TestLatch.DefaultTimeout); 1 } - val callService2 = Future { i2.open(); FutureSpec.ready(s2, TestLatch.DefaultTimeout); 9 } - - val result = flow { callService1() + callService2() } - - assert(!s1.isOpen) - assert(!s2.isOpen) - assert(!result.isCompleted) - FutureSpec.ready(i1, 2 seconds) - FutureSpec.ready(i2, 2 seconds) - s1.open() - s2.open() - assert(Await.result(result, timeout.duration) === 10) - } - - "futureCompletingWithContinuationsFailure" in { - filterException[ArithmeticException] { - import Future.flow - - val x, y, z = Promise[Int]() - val ly, lz = new TestLatch - - val result = flow { - y << x - ly.open() - val oops = 1 / 0 - z << x - lz.open() - z() + y() + oops - } - intercept[TimeoutException] { FutureSpec.ready(ly, 100 milliseconds) } - intercept[TimeoutException] { FutureSpec.ready(lz, 100 milliseconds) } - flow { x << 5 } - - assert(Await.result(y, timeout.duration) === 5) - intercept[java.lang.ArithmeticException](Await.result(result, timeout.duration)) - assert(z.value === None) - assert(!lz.isOpen) - } - } - - "futureContinuationsShouldNotBlock" in { - import Future.flow - - val latch = new TestLatch - val future = Future { - FutureSpec.ready(latch, TestLatch.DefaultTimeout) - "Hello" - } - - val result = flow { - Some(future()).filter(_ == "Hello") - } - - assert(!result.isCompleted) - - latch.open() - - assert(Await.result(result, timeout.duration) === Some("Hello")) - } - - "futureFlowShouldBeTypeSafe" in { - import Future.flow - - val rString = flow { - val x = Future(5) - x().toString - } - - val rInt = flow { - val x = rString.apply - val y = Future(5) - x.length + y() - } - - assert(checkType(rString, manifest[String])) - assert(checkType(rInt, manifest[Int])) - assert(!checkType(rInt, manifest[String])) - assert(!checkType(rInt, manifest[Nothing])) - assert(!checkType(rInt, manifest[Any])) - - Await.result(rString, timeout.duration) - Await.result(rInt, timeout.duration) - } - - "futureFlowSimpleAssign" in { - import Future.flow - - val x, y, z = Promise[Int]() - - flow { - z << x() + y() - } - flow { x << 40 } - flow { y << 2 } - - assert(Await.result(z, timeout.duration) === 42) - }*/ - "run callbacks async" in { val latch = Vector.fill(10)(new TestLatch) @@ -872,13 +610,6 @@ class FutureSpec extends AkkaSpec with Checkers with BeforeAndAfterAll with Defa // failCount.get must be(0) } - //FIXME DATAFLOW - /*"should capture first exception with dataflow" in { - import Future.flow - val f1 = flow { 40 / 0 } - intercept[java.lang.ArithmeticException](Await result (f1, TestLatch.DefaultTimeout)) - }*/ - } } diff --git a/akka-actor/src/main/scala/akka/actor/ActorSelection.scala b/akka-actor/src/main/scala/akka/actor/ActorSelection.scala index 2f4fd4219b..e329af556b 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorSelection.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorSelection.scala @@ -23,7 +23,6 @@ abstract class ActorSelection { def tell(msg: Any, sender: ActorRef): Unit = target.tell(toMessage(msg, path), sender) - // FIXME make this so that "next" instead is the remaining path private def toMessage(msg: Any, path: Array[AnyRef]): Any = { var acc = msg var index = path.length - 1 diff --git a/akka-actor/src/main/scala/akka/actor/Deployer.scala b/akka-actor/src/main/scala/akka/actor/Deployer.scala index deb6285826..06d3b01a1b 100644 --- a/akka-actor/src/main/scala/akka/actor/Deployer.scala +++ b/akka-actor/src/main/scala/akka/actor/Deployer.scala @@ -79,7 +79,11 @@ trait Scope { @SerialVersionUID(1L) abstract class LocalScope extends Scope -//FIXME docs +/** + * The Local Scope is the default one, which is assumed on all deployments + * which do not set a different scope. It is also the only scope handled by + * the LocalActorRefProvider. + */ case object LocalScope extends LocalScope { /** * Java API: get the singleton instance diff --git a/akka-actor/src/main/scala/akka/actor/FaultHandling.scala b/akka-actor/src/main/scala/akka/actor/FaultHandling.scala index ee882dd765..ab93cfee88 100644 --- a/akka-actor/src/main/scala/akka/actor/FaultHandling.scala +++ b/akka-actor/src/main/scala/akka/actor/FaultHandling.scala @@ -234,6 +234,8 @@ object SupervisorStrategy extends SupervisorStrategyLowPriorityImplicits { private[akka] def maxNrOfRetriesOption(maxNrOfRetries: Int): Option[Int] = if (maxNrOfRetries < 0) None else Some(maxNrOfRetries) + + private[akka] val escalateDefault = (_: Any) => Escalate } /** @@ -280,7 +282,7 @@ abstract class SupervisorStrategy { * @param children is a lazy collection (a view) */ def handleFailure(context: ActorContext, child: ActorRef, cause: Throwable, stats: ChildRestartStats, children: Iterable[ChildRestartStats]): Boolean = { - val directive = if (decider.isDefinedAt(cause)) decider(cause) else Escalate //FIXME applyOrElse in Scala 2.10 + val directive = decider.applyOrElse(cause, escalateDefault) directive match { case Resume ⇒ resumeChild(child, cause); true case Restart ⇒ processFailure(context, true, child, cause, stats, children); true diff --git a/akka-actor/src/main/scala/akka/dispatch/AbstractDispatcher.scala b/akka-actor/src/main/scala/akka/dispatch/AbstractDispatcher.scala index 2d19949335..36afc8a24c 100644 --- a/akka-actor/src/main/scala/akka/dispatch/AbstractDispatcher.scala +++ b/akka-actor/src/main/scala/akka/dispatch/AbstractDispatcher.scala @@ -288,7 +288,7 @@ abstract class MessageDispatcher(val prerequisites: DispatcherPrerequisites) ext if (debug) actors.remove(this, actor.self) addInhabitants(-1) val mailBox = actor.swapMailbox(deadLetterMailbox) - mailBox.becomeClosed() // FIXME reschedule in tell if possible race with cleanUp is detected in order to properly clean up + mailBox.becomeClosed() mailBox.cleanUp() } diff --git a/akka-actor/src/main/scala/akka/dispatch/Dispatcher.scala b/akka-actor/src/main/scala/akka/dispatch/Dispatcher.scala index 67e70291b7..6577e217a1 100644 --- a/akka-actor/src/main/scala/akka/dispatch/Dispatcher.scala +++ b/akka-actor/src/main/scala/akka/dispatch/Dispatcher.scala @@ -93,7 +93,7 @@ class Dispatcher( */ protected[akka] def shutdown: Unit = { val newDelegate = executorServiceDelegate.copy() // Doesn't matter which one we copy - val es = synchronized { // FIXME getAndSet using ARFU or Unsafe + val es = synchronized { val service = executorServiceDelegate executorServiceDelegate = newDelegate // just a quick getAndSet service diff --git a/akka-actor/src/main/scala/akka/pattern/AskSupport.scala b/akka-actor/src/main/scala/akka/pattern/AskSupport.scala index 43e899f81f..2ff45b0290 100644 --- a/akka-actor/src/main/scala/akka/pattern/AskSupport.scala +++ b/akka-actor/src/main/scala/akka/pattern/AskSupport.scala @@ -281,7 +281,7 @@ private[akka] final class PromiseActorRef private (val provider: ActorRefProvide val watchers = clearWatchers() if (!watchers.isEmpty) { val termination = Terminated(this)(existenceConfirmed = true, addressTerminated = false) - watchers foreach { w ⇒ try w.tell(termination, this) catch { case NonFatal(t) ⇒ /* FIXME LOG THIS */ } } + watchers foreach { _.tell(termination, this) } } } state match { diff --git a/akka-actor/src/main/scala/akka/pattern/CircuitBreaker.scala b/akka-actor/src/main/scala/akka/pattern/CircuitBreaker.scala index 2ce607d483..bfcf3a3783 100644 --- a/akka-actor/src/main/scala/akka/pattern/CircuitBreaker.scala +++ b/akka-actor/src/main/scala/akka/pattern/CircuitBreaker.scala @@ -288,8 +288,7 @@ class CircuitBreaker(scheduler: Scheduler, maxFailures: Int, callTimeout: Finite val iterator = listeners.iterator while (iterator.hasNext) { val listener = iterator.next - //FIXME per @viktorklang: it's a bit wasteful to create Futures for one-offs, just use EC.execute instead - Future(listener())(executor) + executor.execute(new Runnable { def run = listener() }) } } } diff --git a/akka-actor/src/main/scala/akka/routing/Routing.scala b/akka-actor/src/main/scala/akka/routing/Routing.scala index 36a1fa65a8..ac4f55bd7c 100644 --- a/akka-actor/src/main/scala/akka/routing/Routing.scala +++ b/akka-actor/src/main/scala/akka/routing/Routing.scala @@ -446,9 +446,9 @@ case class Destination(sender: ActorRef, recipient: ActorRef) @SerialVersionUID(1L) abstract class NoRouter extends RouterConfig case object NoRouter extends NoRouter { - def createRoute(routeeProvider: RouteeProvider): Route = null // FIXME, null, really?? - def routerDispatcher: String = "" - def supervisorStrategy = null // FIXME null, really?? + def createRoute(routeeProvider: RouteeProvider): Route = throw new UnsupportedOperationException("NoRouter does not createRoute") + def routerDispatcher: String = throw new UnsupportedOperationException("NoRouter has no dispatcher") + def supervisorStrategy = throw new UnsupportedOperationException("NoRouter has no strategy") override def withFallback(other: RouterConfig): RouterConfig = other /** From 387324ad7b1dd69328a49f52bdd90749d9b1fa33 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Tue, 16 Oct 2012 12:42:42 +0200 Subject: [PATCH 058/210] Updating to the zeromq release for 2.10.0-RC1 --- project/AkkaBuild.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 6263a576a7..5a1758faf1 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -225,6 +225,7 @@ object AkkaBuild extends Build { base = file("akka-zeromq"), dependencies = Seq(actor, testkit % "test;test->test"), settings = defaultSettings ++ OSGi.zeroMQ ++ Seq( + resolvers += "sonatype" at "http://oss.sonatype.org/content/repositories/releases", libraryDependencies ++= Dependencies.zeroMQ, previousArtifact := akkaPreviousArtifact("akka-zeromq") ) @@ -665,8 +666,7 @@ object Dependencies { val scalaStm = "org.scala-tools" % "scala-stm" % "0.6" cross CrossVersion.full // Modified BSD (Scala) val slf4jApi = "org.slf4j" % "slf4j-api" % "1.7.2" // MIT - // FIXME: use 2.10.0-RC1 version once published - val zeroMQClient = "org.zeromq" % "zeromq-scala-binding_2.10.0-M7" % "0.0.6" // ApacheV2 + val zeroMQClient = "org.zeromq" % "zeromq-scala-binding_2.10" % "0.0.6-RC1" // ApacheV2 val uncommonsMath = "org.uncommons.maths" % "uncommons-maths" % "1.2.2a" // ApacheV2 val ariesBlueprint = "org.apache.aries.blueprint" % "org.apache.aries.blueprint" % "0.3.2" // ApacheV2 val osgiCore = "org.osgi" % "org.osgi.core" % "4.2.0" // ApacheV2 From 6792d11b36845551195ebf7f00c57daf0fcd37cc Mon Sep 17 00:00:00 2001 From: Roland Date: Tue, 16 Oct 2012 14:38:23 +0200 Subject: [PATCH 059/210] =?UTF-8?q?Patrik=E2=80=99s=20comments:=20change?= =?UTF-8?q?=20CircuitBreaker=20to=20Runnable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit was using Callable for no apparent reason; also fix FaultHandlingDocTestBase.java --- .../main/scala/akka/actor/FaultHandling.scala | 4 +- .../scala/akka/pattern/CircuitBreaker.scala | 42 ++++++++----------- .../circuitbreaker/DangerousJavaActor.java | 5 +-- .../docs/actor/FaultHandlingTestBase.java | 6 ++- .../actor/japi/FaultHandlingDocSample.java | 6 ++- 5 files changed, 32 insertions(+), 31 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/FaultHandling.scala b/akka-actor/src/main/scala/akka/actor/FaultHandling.scala index ab93cfee88..fbee491664 100644 --- a/akka-actor/src/main/scala/akka/actor/FaultHandling.scala +++ b/akka-actor/src/main/scala/akka/actor/FaultHandling.scala @@ -234,8 +234,8 @@ object SupervisorStrategy extends SupervisorStrategyLowPriorityImplicits { private[akka] def maxNrOfRetriesOption(maxNrOfRetries: Int): Option[Int] = if (maxNrOfRetries < 0) None else Some(maxNrOfRetries) - - private[akka] val escalateDefault = (_: Any) => Escalate + + private[akka] val escalateDefault = (_: Any) ⇒ Escalate } /** diff --git a/akka-actor/src/main/scala/akka/pattern/CircuitBreaker.scala b/akka-actor/src/main/scala/akka/pattern/CircuitBreaker.scala index bfcf3a3783..8a423c12b3 100644 --- a/akka-actor/src/main/scala/akka/pattern/CircuitBreaker.scala +++ b/akka-actor/src/main/scala/akka/pattern/CircuitBreaker.scala @@ -155,22 +155,20 @@ class CircuitBreaker(scheduler: Scheduler, maxFailures: Int, callTimeout: Finite * The callback is run in the [[scala.concurrent.ExecutionContext]] supplied in the constructor. * * @param callback Handler to be invoked on state change - * @tparam T Type supplied to assist with type inference, otherwise ignored by implementation * @return CircuitBreaker for fluent usage */ - def onOpen[T](callback: ⇒ T): CircuitBreaker = { - Open.addListener(() ⇒ callback) - this - } + def onOpen(callback: ⇒ Unit): CircuitBreaker = onOpen(new Runnable { def run = callback }) /** * Java API for onOpen * * @param callback Handler to be invoked on state change - * @tparam T Type supplied to assist with type inference, otherwise ignored by implementation * @return CircuitBreaker for fluent usage */ - def onOpen[T](callback: Callable[T]): CircuitBreaker = onOpen(callback.call) + def onOpen(callback: Runnable): CircuitBreaker = { + Open addListener callback + this + } /** * Adds a callback to execute when circuit breaker transitions to half-open @@ -178,22 +176,20 @@ class CircuitBreaker(scheduler: Scheduler, maxFailures: Int, callTimeout: Finite * The callback is run in the [[scala.concurrent.ExecutionContext]] supplied in the constructor. * * @param callback Handler to be invoked on state change - * @tparam T Type supplied to assist with type inference, otherwise ignored by implementation * @return CircuitBreaker for fluent usage */ - def onHalfOpen[T](callback: ⇒ T): CircuitBreaker = { - HalfOpen.addListener(() ⇒ callback) - this - } + def onHalfOpen(callback: ⇒ Unit): CircuitBreaker = onHalfOpen(new Runnable { def run = callback }) /** * JavaAPI for onHalfOpen * * @param callback Handler to be invoked on state change - * @tparam T Type supplied to assist with type inference, otherwise ignored by implementation * @return CircuitBreaker for fluent usage */ - def onHalfOpen[T](callback: Callable[T]): CircuitBreaker = onHalfOpen(callback.call) + def onHalfOpen(callback: Runnable): CircuitBreaker = { + HalfOpen addListener callback + this + } /** * Adds a callback to execute when circuit breaker state closes @@ -201,22 +197,20 @@ class CircuitBreaker(scheduler: Scheduler, maxFailures: Int, callTimeout: Finite * The callback is run in the [[scala.concurrent.ExecutionContext]] supplied in the constructor. * * @param callback Handler to be invoked on state change - * @tparam T Type supplied to assist with type inference, otherwise ignored by implementation * @return CircuitBreaker for fluent usage */ - def onClose[T](callback: ⇒ T): CircuitBreaker = { - Closed.addListener(() ⇒ callback) - this - } + def onClose(callback: ⇒ Unit): CircuitBreaker = onClose(new Runnable { def run = callback }) /** * JavaAPI for onClose * * @param callback Handler to be invoked on state change - * @tparam T Type supplied to assist with type inference, otherwise ignored by implementation * @return CircuitBreaker for fluent usage */ - def onClose[T](callback: Callable[T]): CircuitBreaker = onClose(callback.call) + def onClose(callback: Runnable): CircuitBreaker = { + Closed addListener callback + this + } /** * Retrieves current failure count. @@ -261,7 +255,7 @@ class CircuitBreaker(scheduler: Scheduler, maxFailures: Int, callTimeout: Finite * Internal state abstraction */ private sealed trait State { - private val listeners = new CopyOnWriteArrayList[() ⇒ _] + private val listeners = new CopyOnWriteArrayList[Runnable] /** * Add a listener function which is invoked on state entry @@ -269,7 +263,7 @@ class CircuitBreaker(scheduler: Scheduler, maxFailures: Int, callTimeout: Finite * @param listener listener implementation * @tparam T return type of listener, not used - but supplied for type inference purposes */ - def addListener[T](listener: () ⇒ T): Unit = listeners add listener + def addListener(listener: Runnable): Unit = listeners add listener /** * Test for whether listeners exist @@ -288,7 +282,7 @@ class CircuitBreaker(scheduler: Scheduler, maxFailures: Int, callTimeout: Finite val iterator = listeners.iterator while (iterator.hasNext) { val listener = iterator.next - executor.execute(new Runnable { def run = listener() }) + executor.execute(listener) } } } diff --git a/akka-docs/rst/common/code/docs/circuitbreaker/DangerousJavaActor.java b/akka-docs/rst/common/code/docs/circuitbreaker/DangerousJavaActor.java index 412e742849..f3347937fc 100644 --- a/akka-docs/rst/common/code/docs/circuitbreaker/DangerousJavaActor.java +++ b/akka-docs/rst/common/code/docs/circuitbreaker/DangerousJavaActor.java @@ -29,10 +29,9 @@ public class DangerousJavaActor extends UntypedActor { this.breaker = new CircuitBreaker( getContext().dispatcher(), getContext().system().scheduler(), 5, Duration.create(10, "s"), Duration.create(1, "m")) - .onOpen(new Callable() { - public Object call() throws Exception { + .onOpen(new Runnable() { + public void run() { notifyMeOnOpen(); - return null; } }); } diff --git a/akka-docs/rst/java/code/docs/actor/FaultHandlingTestBase.java b/akka-docs/rst/java/code/docs/actor/FaultHandlingTestBase.java index fdd1937014..c78da61fb1 100644 --- a/akka-docs/rst/java/code/docs/actor/FaultHandlingTestBase.java +++ b/akka-docs/rst/java/code/docs/actor/FaultHandlingTestBase.java @@ -7,7 +7,11 @@ package docs.actor; import akka.actor.ActorRef; import akka.actor.ActorSystem; import akka.actor.SupervisorStrategy; -import static akka.actor.SupervisorStrategy.*; +import static akka.actor.SupervisorStrategy.resume; +import static akka.actor.SupervisorStrategy.restart; +import static akka.actor.SupervisorStrategy.stop; +import static akka.actor.SupervisorStrategy.escalate; +import akka.actor.SupervisorStrategy.Directive; import akka.actor.OneForOneStrategy; import akka.actor.Props; import akka.actor.Terminated; diff --git a/akka-docs/rst/java/code/docs/actor/japi/FaultHandlingDocSample.java b/akka-docs/rst/java/code/docs/actor/japi/FaultHandlingDocSample.java index f3db04cfdf..5b7a3073c3 100644 --- a/akka-docs/rst/java/code/docs/actor/japi/FaultHandlingDocSample.java +++ b/akka-docs/rst/java/code/docs/actor/japi/FaultHandlingDocSample.java @@ -22,7 +22,11 @@ import com.typesafe.config.ConfigFactory; import static akka.japi.Util.classTag; -import static akka.actor.SupervisorStrategy.*; +import static akka.actor.SupervisorStrategy.resume; +import static akka.actor.SupervisorStrategy.restart; +import static akka.actor.SupervisorStrategy.stop; +import static akka.actor.SupervisorStrategy.escalate; +import akka.actor.SupervisorStrategy.Directive; import static akka.pattern.Patterns.ask; import static akka.pattern.Patterns.pipe; From 5e83df74e9b100bdf80830bb5442cb490f2d927e Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Tue, 16 Oct 2012 17:02:13 +0200 Subject: [PATCH 060/210] Solve wrong barrier problem, see #2583 * The problem was that we didn't wait for the testconductor.shutdown Future to complete and therefore barriers could be triggered in unexpected order. The reason why we didn't await, was that during shutdown the Future was completed with client disconnected failure. I have fixed that and added await to all shutdowns. --- .../cluster/ClientDowningNodeThatIsUnreachableSpec.scala | 2 +- .../akka/cluster/ClusterAccrualFailureDetectorSpec.scala | 2 +- .../multi-jvm/scala/akka/cluster/ConvergenceSpec.scala | 2 +- .../multi-jvm/scala/akka/cluster/LargeClusterSpec.scala | 2 +- .../cluster/LeaderDowningNodeThatIsUnreachableSpec.scala | 4 ++-- .../scala/akka/cluster/LeaderElectionSpec.scala | 4 ++-- .../scala/akka/cluster/SingletonClusterSpec.scala | 2 +- .../main/scala/akka/remote/testconductor/Conductor.scala | 9 +++++++-- 8 files changed, 16 insertions(+), 11 deletions(-) diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/ClientDowningNodeThatIsUnreachableSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/ClientDowningNodeThatIsUnreachableSpec.scala index 49483d39ef..3efb891a3b 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/ClientDowningNodeThatIsUnreachableSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/ClientDowningNodeThatIsUnreachableSpec.scala @@ -44,7 +44,7 @@ abstract class ClientDowningNodeThatIsUnreachableSpec(multiNodeConfig: ClientDow runOn(first) { // kill 'third' node - testConductor.shutdown(third, 0) + testConductor.shutdown(third, 0).await markNodeAsUnavailable(thirdAddress) // mark 'third' node as DOWN diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterAccrualFailureDetectorSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterAccrualFailureDetectorSpec.scala index 05253a16b3..552f90bd49 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterAccrualFailureDetectorSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterAccrualFailureDetectorSpec.scala @@ -46,7 +46,7 @@ abstract class ClusterAccrualFailureDetectorSpec "mark node as 'unavailable' if a node in the cluster is shut down (and its heartbeats stops)" taggedAs LongRunningTest in { runOn(first) { - testConductor.shutdown(third, 0) + testConductor.shutdown(third, 0).await } enterBarrier("third-shutdown") diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/ConvergenceSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/ConvergenceSpec.scala index c8125f32b1..b2a9453035 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/ConvergenceSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/ConvergenceSpec.scala @@ -61,7 +61,7 @@ abstract class ConvergenceSpec(multiNodeConfig: ConvergenceMultiNodeConfig) runOn(first) { // kill 'third' node - testConductor.shutdown(third, 0) + testConductor.shutdown(third, 0).await markNodeAsUnavailable(thirdAddress) } diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/LargeClusterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/LargeClusterSpec.scala index 6465c5ead8..1ebb930df6 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/LargeClusterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/LargeClusterSpec.scala @@ -316,7 +316,7 @@ abstract class LargeClusterSpec } runOn(firstDatacenter) { - testConductor.shutdown(secondDatacenter, 0) + testConductor.shutdown(secondDatacenter, 0).await } enterBarrier("second-datacenter-shutdown") diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderDowningNodeThatIsUnreachableSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderDowningNodeThatIsUnreachableSpec.scala index bf026b43b3..134ed4d0d6 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderDowningNodeThatIsUnreachableSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderDowningNodeThatIsUnreachableSpec.scala @@ -51,7 +51,7 @@ abstract class LeaderDowningNodeThatIsUnreachableSpec(multiNodeConfig: LeaderDow val fourthAddress = address(fourth) runOn(first) { // kill 'fourth' node - testConductor.shutdown(fourth, 0) + testConductor.shutdown(fourth, 0).await enterBarrier("down-fourth-node") // mark the node as unreachable in the failure detector @@ -81,7 +81,7 @@ abstract class LeaderDowningNodeThatIsUnreachableSpec(multiNodeConfig: LeaderDow enterBarrier("before-down-second-node") runOn(first) { // kill 'second' node - testConductor.shutdown(second, 0) + testConductor.shutdown(second, 0).await enterBarrier("down-second-node") // mark the node as unreachable in the failure detector diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderElectionSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderElectionSpec.scala index ddc9a46ecb..fc8c4d2619 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderElectionSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderElectionSpec.scala @@ -18,7 +18,7 @@ case class LeaderElectionMultiNodeConfig(failureDetectorPuppet: Boolean) extends val third = role("third") val fourth = role("fourth") - commonConfig(debugConfig(on = true).withFallback(MultiNodeClusterSpec.clusterConfig(failureDetectorPuppet))) + commonConfig(debugConfig(on = false).withFallback(MultiNodeClusterSpec.clusterConfig(failureDetectorPuppet))) } class LeaderElectionWithFailureDetectorPuppetMultiJvmNode1 extends LeaderElectionSpec(failureDetectorPuppet = true) @@ -70,7 +70,7 @@ abstract class LeaderElectionSpec(multiNodeConfig: LeaderElectionMultiNodeConfig case `controller` ⇒ val leaderAddress = address(leader) enterBarrier("before-shutdown" + n) - testConductor.shutdown(leader, 0) + testConductor.shutdown(leader, 0).await enterBarrier("after-shutdown" + n, "after-unavailable" + n, "after-down" + n, "completed" + n) case `leader` ⇒ diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/SingletonClusterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/SingletonClusterSpec.scala index 3575c5b6d4..291a59a44f 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/SingletonClusterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/SingletonClusterSpec.scala @@ -61,7 +61,7 @@ abstract class SingletonClusterSpec(multiNodeConfig: SingletonClusterMultiNodeCo "become singleton cluster when one node is shutdown" taggedAs LongRunningTest in { runOn(first) { val secondAddress = address(second) - testConductor.shutdown(second, 0) + testConductor.shutdown(second, 0).await markNodeAsUnavailable(secondAddress) diff --git a/akka-remote-tests/src/main/scala/akka/remote/testconductor/Conductor.scala b/akka-remote-tests/src/main/scala/akka/remote/testconductor/Conductor.scala index bbccd3d0a5..eae82b6e6d 100644 --- a/akka-remote-tests/src/main/scala/akka/remote/testconductor/Conductor.scala +++ b/akka-remote-tests/src/main/scala/akka/remote/testconductor/Conductor.scala @@ -23,6 +23,7 @@ import java.util.concurrent.TimeUnit.MILLISECONDS import akka.util.{ Timeout } import scala.reflect.classTag import akka.ConfigurationException +import akka.AkkaException sealed trait Direction { def includes(other: Direction): Boolean @@ -207,7 +208,10 @@ trait Conductor { this: TestConductorExt ⇒ */ def shutdown(node: RoleName, exitValue: Int): Future[Done] = { import Settings.QueryTimeout - controller ? Terminate(node, exitValue) mapTo classTag[Done] + import system.dispatcher + // the recover is needed to handle ClientDisconnectedException exception, + // which is normal during shutdown + controller ? Terminate(node, exitValue) mapTo classTag[Done] recover { case _: ClientDisconnectedException ⇒ Done } } /** @@ -309,7 +313,7 @@ private[akka] class ServerFSM(val controller: ActorRef, val channel: Channel) ex whenUnhandled { case Event(ClientDisconnected, Some(s)) ⇒ - s ! Status.Failure(new RuntimeException("client disconnected in state " + stateName + ": " + channel)) + s ! Status.Failure(new ClientDisconnectedException("client disconnected in state " + stateName + ": " + channel)) stop() case Event(ClientDisconnected, None) ⇒ stop() } @@ -367,6 +371,7 @@ private[akka] class ServerFSM(val controller: ActorRef, val channel: Channel) ex */ private[akka] object Controller { case class ClientDisconnected(name: RoleName) + class ClientDisconnectedException(msg: String) extends AkkaException(msg) case object GetNodes case object GetSockAddr case class CreateServerFSM(channel: Channel) From 6c89f640b6a5a9a6a58b62e1560f6d551e270724 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Wed, 17 Oct 2012 01:00:57 +0200 Subject: [PATCH 061/210] Bumping the version of Akka master to 2.2-SNAPSHOT --- akka-actor-tests/src/test/scala/akka/config/ConfigSpec.scala | 4 ++-- akka-actor/src/main/resources/reference.conf | 2 +- akka-actor/src/main/scala/akka/actor/ActorSystem.scala | 2 +- akka-docs/rst/modules/camel.rst | 2 +- akka-kernel/src/main/dist/README | 2 +- akka-kernel/src/main/dist/config/application.conf | 2 +- akka-samples/akka-sample-cluster/pom.xml | 4 ++-- akka-sbt-plugin/sample/project/Build.scala | 4 ++-- akka-sbt-plugin/sample/project/plugins.sbt | 2 +- project/AkkaBuild.scala | 2 +- 10 files changed, 13 insertions(+), 13 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/config/ConfigSpec.scala b/akka-actor-tests/src/test/scala/akka/config/ConfigSpec.scala index 67ed31509d..1aa168b924 100644 --- a/akka-actor-tests/src/test/scala/akka/config/ConfigSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/config/ConfigSpec.scala @@ -24,8 +24,8 @@ class ConfigSpec extends AkkaSpec(ConfigFactory.defaultReference(ActorSystem.fin { import config._ - getString("akka.version") must equal("2.1-SNAPSHOT") - settings.ConfigVersion must equal("2.1-SNAPSHOT") + getString("akka.version") must equal("2.2-SNAPSHOT") + settings.ConfigVersion must equal("2.2-SNAPSHOT") getBoolean("akka.daemonic") must equal(false) getBoolean("akka.actor.serialize-messages") must equal(false) diff --git a/akka-actor/src/main/resources/reference.conf b/akka-actor/src/main/resources/reference.conf index 839a9b614d..aeee89a65f 100644 --- a/akka-actor/src/main/resources/reference.conf +++ b/akka-actor/src/main/resources/reference.conf @@ -7,7 +7,7 @@ akka { # Akka version, checked against the runtime version of Akka. - version = "2.1-SNAPSHOT" + version = "2.2-SNAPSHOT" # Home directory of Akka, modules in the deploy directory will be loaded home = "" diff --git a/akka-actor/src/main/scala/akka/actor/ActorSystem.scala b/akka-actor/src/main/scala/akka/actor/ActorSystem.scala index 5f89c5166e..a9528a57aa 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorSystem.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorSystem.scala @@ -23,7 +23,7 @@ import util.{ Failure, Success } object ActorSystem { - val Version: String = "2.1-SNAPSHOT" + val Version: String = "2.2-SNAPSHOT" val EnvHome: Option[String] = System.getenv("AKKA_HOME") match { case null | "" | "." ⇒ None diff --git a/akka-docs/rst/modules/camel.rst b/akka-docs/rst/modules/camel.rst index 68686ce586..f5ca672afa 100644 --- a/akka-docs/rst/modules/camel.rst +++ b/akka-docs/rst/modules/camel.rst @@ -6,7 +6,7 @@ ####### .. note:: - The Akka Camel module has not been migrated to Akka 2.1-SNAPSHOT yet. + The Akka Camel module has not been migrated to Akka 2.2-SNAPSHOT yet. It might not make it into Akka 2.0 final but will then hopefully be re-introduce in an upcoming release. It might also be backported to diff --git a/akka-kernel/src/main/dist/README b/akka-kernel/src/main/dist/README index d15368f696..3b25f979a6 100644 --- a/akka-kernel/src/main/dist/README +++ b/akka-kernel/src/main/dist/README @@ -2,7 +2,7 @@ Akka ==== -This is the Akka 2.1-SNAPSHOT download. +This is the Akka 2.2-SNAPSHOT download. Included are all libraries, documentation, and sources for Akka. diff --git a/akka-kernel/src/main/dist/config/application.conf b/akka-kernel/src/main/dist/config/application.conf index 4abcd7e7f8..d3a3ea5725 100644 --- a/akka-kernel/src/main/dist/config/application.conf +++ b/akka-kernel/src/main/dist/config/application.conf @@ -1,3 +1,3 @@ # In this file you can override any option defined in the 'reference.conf' files. # Copy in all or parts of the 'reference.conf' files and modify as you please. -# For more info about config, please visit the Akka Documentation: http://akka.io/docs/akka/2.1-SNAPSHOT/ +# For more info about config, please visit the Akka Documentation: http://akka.io/docs/akka/2.2-SNAPSHOT/ diff --git a/akka-samples/akka-sample-cluster/pom.xml b/akka-samples/akka-sample-cluster/pom.xml index e01518726d..78cdd9ca2b 100644 --- a/akka-samples/akka-sample-cluster/pom.xml +++ b/akka-samples/akka-sample-cluster/pom.xml @@ -7,7 +7,7 @@ com.typesafe.akka akka-sample-cluster-experimental-japi - 2.1-SNAPSHOT + 2.2-SNAPSHOT jar UTF-8 @@ -36,4 +36,4 @@ - \ No newline at end of file + diff --git a/akka-sbt-plugin/sample/project/Build.scala b/akka-sbt-plugin/sample/project/Build.scala index b212548f6b..b7c5122da3 100644 --- a/akka-sbt-plugin/sample/project/Build.scala +++ b/akka-sbt-plugin/sample/project/Build.scala @@ -6,7 +6,7 @@ import akka.sbt.AkkaKernelPlugin.{ Dist, outputDirectory, distJvmOptions} object HelloKernelBuild extends Build { val Organization = "akka.sample" - val Version = "2.1-SNAPSHOT" + val Version = "2.2-SNAPSHOT" val ScalaVersion = "2.10.0-M6" lazy val HelloKernel = Project( @@ -49,7 +49,7 @@ object Dependencies { object Dependency { // Versions object V { - val Akka = "2.1-SNAPSHOT" + val Akka = "2.2-SNAPSHOT" } val akkaKernel = "com.typesafe.akka" % "akka-kernel" % V.Akka diff --git a/akka-sbt-plugin/sample/project/plugins.sbt b/akka-sbt-plugin/sample/project/plugins.sbt index 3f814e328e..b34eb00adb 100644 --- a/akka-sbt-plugin/sample/project/plugins.sbt +++ b/akka-sbt-plugin/sample/project/plugins.sbt @@ -1,3 +1,3 @@ resolvers += "Typesafe Repo" at "http://repo.typesafe.com/typesafe/releases/" -addSbtPlugin("com.typesafe.akka" % "akka-sbt-plugin" % "2.1-SNAPSHOT") +addSbtPlugin("com.typesafe.akka" % "akka-sbt-plugin" % "2.2-SNAPSHOT") diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 5a1758faf1..d126c450fa 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -28,7 +28,7 @@ object AkkaBuild extends Build { lazy val buildSettings = Seq( organization := "com.typesafe.akka", - version := "2.1-SNAPSHOT", + version := "2.2-SNAPSHOT", // FIXME: use 2.10.0 for final scalaVersion := System.getProperty("akka.scalaVersion", "2.10.0-RC1") ) From 2479ee34d929b8a4e7b8e67d4c9e4b5ddd6fe637 Mon Sep 17 00:00:00 2001 From: Roland Date: Wed, 17 Oct 2012 14:27:04 +0200 Subject: [PATCH 062/210] fix small CSS issue in docs (overlapping DIV tag) --- akka-docs/_sphinx/themes/akka/static/docs.css | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/akka-docs/_sphinx/themes/akka/static/docs.css b/akka-docs/_sphinx/themes/akka/static/docs.css index 3d37718c68..7121bb66ae 100644 --- a/akka-docs/_sphinx/themes/akka/static/docs.css +++ b/akka-docs/_sphinx/themes/akka/static/docs.css @@ -6,7 +6,7 @@ a:hover { color: #73a600; text-decoration: none; } .main { position: relative; height: auto; margin-top: -18px; overflow: auto; } .page-title { position: relative; top: 24px; font-family: 'Exo', sans-serif; font-size: 24px; font-weight: 400; color: rgba(255, 255, 255, 1); text-shadow:0 2px 0 #000000; width: 900px;} .main-container { background: #f2f2eb; min-height: 600px; padding-top: 20px; margin-top: 28px; padding-bottom: 40px; } -.container h1:first-of-type { visibility: hidden; margin-top: -36px; } +.container h1:first-of-type { display: none; visibility: hidden; margin-top: -36px; } .pdf-link { float: right; height: 40px; margin-bottom: -15px; margin-top: -5px; } .breadcrumb { height: 18px; } .breadcrumb li { float: right; } @@ -172,4 +172,5 @@ strong {color: #1d3c52; } } .pre { padding: 1px 2px; color: #5d8700; background-color: #f3f7e9; border: 1px solid #dee1e2; font-family: Menlo, Monaco, "Courier New", monospace; font-size: 12px; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } -.footer h5 { text-transform: none; } \ No newline at end of file +.footer h5 { text-transform: none; } + From f41e489aa80f59bdbac49142a2d41aee7bd3e648 Mon Sep 17 00:00:00 2001 From: Roland Date: Wed, 17 Oct 2012 14:33:21 +0200 Subject: [PATCH 063/210] switch groupId for scala-stm --- project/AkkaBuild.scala | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index d126c450fa..55e2bd54bf 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -171,8 +171,6 @@ object AkkaBuild extends Build { base = file("akka-agent"), dependencies = Seq(actor, testkit % "test->test"), settings = defaultSettings ++ OSGi.agent ++ Seq( - // FIXME remove once scala-stm is on maven central - resolvers += "sonatype" at "http://oss.sonatype.org/content/repositories/releases", libraryDependencies ++= Dependencies.agent, previousArtifact := akkaPreviousArtifact("akka-agent") ) @@ -183,8 +181,6 @@ object AkkaBuild extends Build { base = file("akka-transactor"), dependencies = Seq(actor, testkit % "test->test"), settings = defaultSettings ++ OSGi.transactor ++ Seq( - // FIXME remove once scala-stm is on maven central - resolvers += "sonatype" at "http://oss.sonatype.org/content/repositories/releases", libraryDependencies ++= Dependencies.transactor, previousArtifact := akkaPreviousArtifact("akka-transactor") ) @@ -663,7 +659,7 @@ object Dependencies { val config = "com.typesafe" % "config" % "1.0.0" // ApacheV2 val netty = "io.netty" % "netty" % "3.5.8.Final" // ApacheV2 val protobuf = "com.google.protobuf" % "protobuf-java" % "2.4.1" // New BSD - val scalaStm = "org.scala-tools" % "scala-stm" % "0.6" cross CrossVersion.full // Modified BSD (Scala) + val scalaStm = "org.scala-stm" % "scala-stm" % "0.6" cross CrossVersion.full // Modified BSD (Scala) val slf4jApi = "org.slf4j" % "slf4j-api" % "1.7.2" // MIT val zeroMQClient = "org.zeromq" % "zeromq-scala-binding_2.10" % "0.0.6-RC1" // ApacheV2 From 0efc7a073ad2f22f09a1fe0ff9816a0e0b978702 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Wed, 17 Oct 2012 15:11:48 +0200 Subject: [PATCH 064/210] Removing the now redundant module doc for camel --- akka-docs/rst/modules/camel.rst | 13 ------------- akka-docs/rst/modules/index.rst | 1 - 2 files changed, 14 deletions(-) delete mode 100644 akka-docs/rst/modules/camel.rst diff --git a/akka-docs/rst/modules/camel.rst b/akka-docs/rst/modules/camel.rst deleted file mode 100644 index f5ca672afa..0000000000 --- a/akka-docs/rst/modules/camel.rst +++ /dev/null @@ -1,13 +0,0 @@ - -.. _camel-module: - -####### - Camel -####### - -.. note:: - The Akka Camel module has not been migrated to Akka 2.2-SNAPSHOT yet. - - It might not make it into Akka 2.0 final but will then hopefully be - re-introduce in an upcoming release. It might also be backported to - 2.0 final. diff --git a/akka-docs/rst/modules/index.rst b/akka-docs/rst/modules/index.rst index 2c6d78603e..8dbf7533b7 100644 --- a/akka-docs/rst/modules/index.rst +++ b/akka-docs/rst/modules/index.rst @@ -6,4 +6,3 @@ Modules durable-mailbox http - camel From 824e50fbc1fae0488186c094cde138f823fcabf5 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Wed, 17 Oct 2012 16:06:44 +0200 Subject: [PATCH 065/210] Only disabling the binary jar from the Akka samples, not the source jars etc. --- project/AkkaBuild.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 55e2bd54bf..9a59cde844 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -413,7 +413,7 @@ object AkkaBuild extends Build { ) lazy val sampleSettings = defaultSettings ++ Seq( - publishArtifact in Compile := false + publishArtifact in (Compile, packageBin) := false ) lazy val experimentalSettings = Seq( From 72f3b0570dfa421aab2bb921d745a235f8975225 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Wed, 17 Oct 2012 15:56:03 +0200 Subject: [PATCH 066/210] Fix CircuitBreakerMTSpec openBreaker, see #2627 --- .../scala/akka/pattern/CircuitBreakerMTSpec.scala | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/pattern/CircuitBreakerMTSpec.scala b/akka-actor-tests/src/test/scala/akka/pattern/CircuitBreakerMTSpec.scala index 66afe3e665..34cb3d4ef8 100644 --- a/akka-actor-tests/src/test/scala/akka/pattern/CircuitBreakerMTSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/pattern/CircuitBreakerMTSpec.scala @@ -6,6 +6,7 @@ package akka.pattern import akka.testkit._ import scala.concurrent.duration._ import scala.concurrent.{ Promise, Future, Await } +import scala.annotation.tailrec class CircuitBreakerMTSpec extends AkkaSpec { implicit val ec = system.dispatcher @@ -14,8 +15,16 @@ class CircuitBreakerMTSpec extends AkkaSpec { val resetTimeout = 2.seconds.dilated val breaker = new CircuitBreaker(system.scheduler, 5, callTimeout, resetTimeout) - def openBreaker(): Unit = - Await.ready(Future.sequence((1 to 5).map(_ ⇒ breaker.withCircuitBreaker(Future(throw new RuntimeException("FAIL"))).failed)), 1.second.dilated) + def openBreaker(): Unit = { + @tailrec def call(attemptsLeft: Int): Unit = { + attemptsLeft must be > (0) + if (Await.result(breaker.withCircuitBreaker(Future(throw new RuntimeException("FAIL"))) recover { + case _: CircuitBreakerOpenException ⇒ false + case _ ⇒ true + }, remaining)) call(attemptsLeft - 1) + } + call(10) + } "allow many calls while in closed state with no errors" in { From c0053155a7a5435c99985fd2f9b292b0dfeaaf73 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Thu, 18 Oct 2012 13:18:09 +0200 Subject: [PATCH 067/210] Excluding jfree:jcommon and jfree:jfreechart from uncommons-maths --- project/AkkaBuild.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index d126c450fa..e0abd463da 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -667,7 +667,7 @@ object Dependencies { val slf4jApi = "org.slf4j" % "slf4j-api" % "1.7.2" // MIT val zeroMQClient = "org.zeromq" % "zeromq-scala-binding_2.10" % "0.0.6-RC1" // ApacheV2 - val uncommonsMath = "org.uncommons.maths" % "uncommons-maths" % "1.2.2a" // ApacheV2 + val uncommonsMath = "org.uncommons.maths" % "uncommons-maths" % "1.2.2a" exclude("jfree", "jcommon") exclude("jfree", "jfreechart") // ApacheV2 val ariesBlueprint = "org.apache.aries.blueprint" % "org.apache.aries.blueprint" % "0.3.2" // ApacheV2 val osgiCore = "org.osgi" % "org.osgi.core" % "4.2.0" // ApacheV2 From a7cce179600cbc1195faf6f935f72929612fce74 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Thu, 18 Oct 2012 15:12:42 +0200 Subject: [PATCH 068/210] #2635 - Removing Akka OSGi modules out of the dist, they should be opt-in --- project/AkkaBuild.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 9a59cde844..152b41fcf5 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -42,7 +42,7 @@ object AkkaBuild extends Build { parallelExecution in GlobalScope := System.getProperty("akka.parallelExecution", "false").toBoolean, Publish.defaultPublishTo in ThisBuild <<= crossTarget / "repository", Unidoc.unidocExclude := Seq(samples.id), - Dist.distExclude := Seq(actorTests.id, akkaSbtPlugin.id, docs.id, samples.id), + Dist.distExclude := Seq(actorTests.id, akkaSbtPlugin.id, docs.id, samples.id, osgi.id, osgiAries.id), initialCommands in ThisBuild := """|import language.postfixOps |import akka.actor._ From 364a43e2ebbff30ddcb6a88ee3472e6d193ab7f0 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Thu, 18 Oct 2012 15:36:25 +0200 Subject: [PATCH 069/210] Typesafe Config had an inappropriate version range in the OSGi manifest, correcting it. --- project/AkkaBuild.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 9a59cde844..a109e39a0b 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -643,7 +643,7 @@ object AkkaBuild extends Build { def defaultImports = Seq("!sun.misc", akkaImport(), configImport(), scalaImport(), "*") def akkaImport(packageName: String = "akka.*") = "%s;version=\"[2.1,2.2)\"".format(packageName) - def configImport(packageName: String = "com.typesafe.config.*") = "%s;version=\"[0.4.1,0.5)\"".format(packageName) + def configImport(packageName: String = "com.typesafe.config.*") = "%s;version=\"[0.4.1,1.1.0)\"".format(packageName) def scalaImport(packageName: String = "scala.*") = "%s;version=\"[2.10,2.11)\"".format(packageName) } } From 543087df9d355d8ea33ef2f4f44947c25b1d06e9 Mon Sep 17 00:00:00 2001 From: Roland Date: Thu, 18 Oct 2012 17:31:51 +0200 Subject: [PATCH 070/210] =?UTF-8?q?mention=20=E2=80=9Cimport=20context.dis?= =?UTF-8?q?patcher=E2=80=9D=20in=20the=20docs,=20see=20#2638?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rst/scala/code/docs/future/FutureDocSpec.scala | 14 ++++++++++++++ akka-docs/rst/scala/futures.rst | 13 +++++++++++++ 2 files changed, 27 insertions(+) diff --git a/akka-docs/rst/scala/code/docs/future/FutureDocSpec.scala b/akka-docs/rst/scala/code/docs/future/FutureDocSpec.scala index b7ea972f63..6e6a3521d1 100644 --- a/akka-docs/rst/scala/code/docs/future/FutureDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/future/FutureDocSpec.scala @@ -394,4 +394,18 @@ class FutureDocSpec extends AkkaSpec { intercept[IllegalStateException] { Await.result(result, 2 second) } } + "demonstrate context.dispatcher" in { + //#context-dispatcher + class A extends Actor { + import context.dispatcher + val f = Future("hello") + def receive = { + //#receive-omitted + case _ ⇒ + //#receive-omitted + } + } + //#context-dispatcher + } + } diff --git a/akka-docs/rst/scala/futures.rst b/akka-docs/rst/scala/futures.rst index 1b4df4154b..0347d93e4b 100644 --- a/akka-docs/rst/scala/futures.rst +++ b/akka-docs/rst/scala/futures.rst @@ -22,6 +22,19 @@ by the ``ExecutionContext`` companion object to wrap ``Executors`` and ``Executo .. includecode:: code/docs/future/FutureDocSpec.scala :include: diy-execution-context +Within Actors +^^^^^^^^^^^^^ + +Each actor is configured to be run on a :class:`MessageDispatcher`, and that +dispatcher doubles as an :class:`ExecutionContext`. If the nature of the Future +calls invoked by the actor matches or is compatible with the activities of that +actor (e.g. all CPU bound and no latency requirements), then it may be easiest +to reuse the dispatcher for running the Futures by importing +``context.dispatcher``. + +.. includecode:: code/docs/future/FutureDocSpec.scala#context-dispatcher + :exclude: receive-omitted + Use With Actors --------------- From f915d1335d3a82c863c899b978ed1b6b48400dc8 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Thu, 18 Oct 2012 17:46:55 +0200 Subject: [PATCH 071/210] #2628 - make HelloActor and WorldActor public static classes --- .../src/main/java/sample/kernel/hello/java/HelloKernel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/akka-samples/akka-sample-hello-kernel/src/main/java/sample/kernel/hello/java/HelloKernel.java b/akka-samples/akka-sample-hello-kernel/src/main/java/sample/kernel/hello/java/HelloKernel.java index 77e579aa1e..fa1cdf08d1 100644 --- a/akka-samples/akka-sample-hello-kernel/src/main/java/sample/kernel/hello/java/HelloKernel.java +++ b/akka-samples/akka-sample-hello-kernel/src/main/java/sample/kernel/hello/java/HelloKernel.java @@ -12,7 +12,7 @@ import akka.kernel.Bootable; public class HelloKernel implements Bootable { final ActorSystem system = ActorSystem.create("hellokernel"); - static class HelloActor extends UntypedActor { + public static class HelloActor extends UntypedActor { final ActorRef worldActor = getContext().actorOf( new Props(WorldActor.class)); @@ -26,7 +26,7 @@ public class HelloKernel implements Bootable { } } - static class WorldActor extends UntypedActor { + public static class WorldActor extends UntypedActor { public void onReceive(Object message) { if (message instanceof String) getSender().tell(((String) message).toUpperCase() + " world!", From c625793056ac0ede4c67f61bf91841022bfd46b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Bon=C3=A9r?= Date: Thu, 18 Oct 2012 22:17:58 +0300 Subject: [PATCH 072/210] Updated CONTRIBUTING.md file with new doc template project name project. --- CONTRIBUTING.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7b2b0af92d..2796e67ed8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ -#Contributing to Akka# +# Contributing to Akka -##Infrastructure## +## Infrastructure * [Akka Contributor License Agreement](http://www.typesafe.com/contribute/cla) * [Akka Issue Tracker](http://doc.akka.io/docs/akka/current/project/issue-tracking.html) @@ -57,7 +57,7 @@ All documentation must abide by the following maxims: All documentation is preferred to be in Typesafe's standard documentation format [reStructuredText](http://doc.akka.io/docs/akka/snapshot/dev/documentation.html) compiled using Typesafe's customized [Sphinx](http://sphinx.pocoo.org/) based documentation generation system, which among other things allows all code in the documentation to be externalized into compiled files and imported into the documentation. -For more info, or for a starting point for new projects, look at the [Typesafe Documentation Sample project](https://github.com/typesafehub/doc-example). +For more info, or for a starting point for new projects, look at the [Typesafe Documentation Template project](https://github.com/typesafehub/doc-template). For larger projects that have invested a lot of time and resources into their current documentation and samples scheme (like for example Play), it is understandable that it will take some time to migrate to this new model. In these cases someone from the project needs to take the responsibility of manual QA and verifier for the documentation and samples. @@ -81,17 +81,17 @@ Follow these guidelines when creating public commits and writing commit messages Example: - Added monadic API to Future. Fixes #2731 + Adding monadic API to Future. Fixes #2731 * Details 1 * Details 2 * Details 3 -##Source style## +## Source style Akka uses [Scalariform](https://github.com/mdr/scalariform) to enforce some of the code style rules. -##Contributing Modules## +## Contributing Modules For external contributions of entire features, the normal way is to establish it as a stand-alone feature first, to show that there is a need for the feature. The From 2999e9a43b3c421540484752c160729f2b6f6882 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Fri, 19 Oct 2012 17:03:45 +0200 Subject: [PATCH 073/210] Better assert message in case of failure of assertLeader, see #2641 --- .../multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala index 8e2497fc40..5815217ae3 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala @@ -208,7 +208,8 @@ trait MultiNodeClusterSpec extends Suite with STMultiNodeSpec { self: MultiNodeS def assertLeaderIn(nodesInCluster: Seq[RoleName]): Unit = if (nodesInCluster.contains(myself)) { nodesInCluster.length must not be (0) val expectedLeader = roleOfLeader(nodesInCluster) - clusterView.isLeader must be(ifNode(expectedLeader)(true)(false)) + assert(clusterView.isLeader == ifNode(expectedLeader)(true)(false), + "expectedLeader [%s], got [%s]".format(expectedLeader, clusterView.members)) clusterView.status must (be(MemberStatus.Up) or be(MemberStatus.Leaving)) } From b52a0822790dd61ab4ebaac1dba370f281f412fc Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Fri, 19 Oct 2012 17:28:20 +0200 Subject: [PATCH 074/210] Even better assert message in case of failure of assertLeader, see #2641 --- .../multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala index 5815217ae3..5ff931f1c2 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala @@ -208,8 +208,10 @@ trait MultiNodeClusterSpec extends Suite with STMultiNodeSpec { self: MultiNodeS def assertLeaderIn(nodesInCluster: Seq[RoleName]): Unit = if (nodesInCluster.contains(myself)) { nodesInCluster.length must not be (0) val expectedLeader = roleOfLeader(nodesInCluster) - assert(clusterView.isLeader == ifNode(expectedLeader)(true)(false), - "expectedLeader [%s], got [%s]".format(expectedLeader, clusterView.members)) + val leader = clusterView.leader + val isLeader = leader == Some(clusterView.selfAddress) + assert(isLeader == ifNode(expectedLeader)(true)(false), + "expectedLeader [%s], got leader [%s], members [%s]".format(expectedLeader, leader, clusterView.members)) clusterView.status must (be(MemberStatus.Up) or be(MemberStatus.Leaving)) } From e6d54b59accc3f95ba6d4f73b1fe2509b11421de Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Mon, 22 Oct 2012 11:14:22 +0200 Subject: [PATCH 075/210] #2623 - Adding a @github@ substitution for links to github, as well as adding a pointer as to where to find the example code for the docs. --- akka-docs/rst/cluster/cluster-usage-java.rst | 6 +++--- akka-docs/rst/dev/developer-guidelines.rst | 2 +- akka-docs/rst/intro/what-is-akka.rst | 3 +++ akka-docs/rst/java/camel.rst | 16 ++++++++-------- akka-docs/rst/java/remoting.rst | 2 +- akka-docs/rst/scala/actors.rst | 2 +- akka-docs/rst/scala/camel.rst | 16 ++++++++-------- akka-docs/rst/scala/remoting.rst | 2 +- project/AkkaBuild.scala | 4 +++- project/scripts/release | 6 ------ 10 files changed, 29 insertions(+), 30 deletions(-) diff --git a/akka-docs/rst/cluster/cluster-usage-java.rst b/akka-docs/rst/cluster/cluster-usage-java.rst index 6abe22e700..c674bff3a6 100644 --- a/akka-docs/rst/cluster/cluster-usage-java.rst +++ b/akka-docs/rst/cluster/cluster-usage-java.rst @@ -216,7 +216,7 @@ network failures and JVM crashes, in addition to graceful termination of watched actor. This example is included in ``akka-samples/akka-sample-cluster`` and you can try it by copying the -`source `_ to your +`source <@github@/akka-samples/akka-sample-cluster>`_ to your maven project, defined as in :ref:`cluster_simple_example_java`. Run it by starting nodes in different terminal windows. For example, starting 2 frontend nodes and 3 backend nodes:: @@ -379,7 +379,7 @@ This means that user requests can be sent to ``StatsService`` on any node and it fan out to local children if more parallelism is needed. This example is included in ``akka-samples/akka-sample-cluster`` and you can try it by copying the -`source `_ to your +`source <@github@/akka-samples/akka-sample-cluster>`_ to your maven project, defined as in :ref:`cluster_simple_example_java`. Run it by starting nodes in different terminal windows. For example, starting 3 service nodes and 1 client:: @@ -416,7 +416,7 @@ All nodes start ``StatsFacade`` and the router is now configured like this: .. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsSampleOneMasterMain.java#start-router-deploy This example is included in ``akka-samples/akka-sample-cluster`` and you can try it by copying the -`source `_ to your +`source <@github@/akka-samples/akka-sample-cluster>`_ to your maven project, defined as in :ref:`cluster_simple_example_java`. Run it by starting nodes in different terminal windows. For example, starting 3 service nodes and 1 client:: diff --git a/akka-docs/rst/dev/developer-guidelines.rst b/akka-docs/rst/dev/developer-guidelines.rst index a8971f7fbf..c8acfe33cc 100644 --- a/akka-docs/rst/dev/developer-guidelines.rst +++ b/akka-docs/rst/dev/developer-guidelines.rst @@ -55,7 +55,7 @@ There is a testing standard that should be followed: `Ticket001Spec `_. It enables assertions concerning replies received and their timing, there is more documentation in the :ref:`akka-testkit` module. +There is a useful test kit for testing actors: `akka.util.TestKit <@github@/akka-testkit/src/main/scala/akka/testkit/TestKit.scala>`_. It enables assertions concerning replies received and their timing, there is more documentation in the :ref:`akka-testkit` module. Multi-JVM Testing ^^^^^^^^^^^^^^^^^ diff --git a/akka-docs/rst/intro/what-is-akka.rst b/akka-docs/rst/intro/what-is-akka.rst index dc351b0d22..8ca103351d 100644 --- a/akka-docs/rst/intro/what-is-akka.rst +++ b/akka-docs/rst/intro/what-is-akka.rst @@ -20,6 +20,9 @@ Akka is Open Source and available under the Apache 2 License. Download from http://akka.io/downloads/ +Please note that all code samples compile, so if you want direct access to the sources, have a look +over at the `Akka Docs Project <@github@/akka-docs/rst>`_. + Akka implements a unique hybrid =============================== diff --git a/akka-docs/rst/java/camel.rst b/akka-docs/rst/java/camel.rst index 429454f25d..9eff4ae561 100644 --- a/akka-docs/rst/java/camel.rst +++ b/akka-docs/rst/java/camel.rst @@ -132,7 +132,7 @@ An ``ActivationTimeoutException`` is thrown if the endpoint could not be activat Deactivation of a Consumer or a Producer actor happens when the actor is terminated. For a Consumer, the route to the actor is stopped. For a Producer, the `SendProcessor`_ is stopped. A ``DeActivationTimeoutException`` is thrown if the associated camel objects could not be deactivated within the specified timeout. -.. _Camel: http://github.com/akka/akka/blob/master/akka-camel/src/main/scala/akka/camel/Camel.scala +.. _Camel: @github@/akka-camel/src/main/scala/akka/camel/Camel.scala .. _CamelContext: https://svn.apache.org/repos/asf/camel/tags/camel-2.8.0/camel-core/src/main/java/org/apache/camel/CamelContext.java .. _ProducerTemplate: https://svn.apache.org/repos/asf/camel/tags/camel-2.8.0/camel-core/src/main/java/org/apache/camel/ProducerTemplate.java .. _SendProcessor: https://svn.apache.org/repos/asf/camel/tags/camel-2.8.0/camel-core/src/main/java/org/apache/camel/processor/SendProcessor.java @@ -146,7 +146,7 @@ class. For example, the following actor class (Consumer1) implements the `getEndpointUri` method, which is declared in the `UntypedConsumerActor`_ class, in order to receive messages from the ``file:data/input/actor`` Camel endpoint. -.. _UntypedConsumerActor: http://github.com/akka/akka/blob/master/akka-camel/src/main/scala/akka/camel/javaapi/UntypedConsumer.scala +.. _UntypedConsumerActor: @github@/akka-camel/src/main/scala/akka/camel/javaapi/UntypedConsumer.scala .. includecode:: code/docs/camel/Consumer1.java#Consumer1 @@ -156,7 +156,7 @@ actor. Messages consumed by actors from Camel endpoints are of type `CamelMessage`_. These are immutable representations of Camel messages. .. _file component: http://camel.apache.org/file2.html -.. _Message: http://github.com/akka/akka/blob/master/akka-camel/src/main/scala/akka/camel/CamelMessage.scala +.. _Message: @github@/akka-camel/src/main/scala/akka/camel/CamelMessage.scala Here's another example that sets the endpointUri to @@ -176,7 +176,7 @@ client the response type should be `CamelMessage`_. For any other response type, new CamelMessage object is created by akka-camel with the actor response as message body. -.. _Message: http://github.com/akka/akka/blob/master/akka-camel/src/main/scala/akka/camel/CamelMessage.scala +.. _Message: @github@/akka-camel/src/main/scala/akka/camel/CamelMessage.scala .. _camel-acknowledgements-java: @@ -221,7 +221,7 @@ The timeout on the consumer actor can be overridden with the ``replyTimeout``, a .. includecode:: code/docs/camel/Consumer4.java#Consumer4 .. _Exchange: https://svn.apache.org/repos/asf/camel/tags/camel-2.8.0/camel-core/src/main/java/org/apache/camel/Exchange.java -.. _ask: http://github.com/akka/akka/blob/master/akka-actor/src/main/scala/akka/pattern/Patterns.scala +.. _ask: @github@/akka-actor/src/main/scala/akka/pattern/Patterns.scala Producer Actors =============== @@ -296,7 +296,7 @@ For initiating a a two-way message exchange, one of the .. includecode:: code/docs/camel/RequestBodyActor.java#RequestProducerTemplate -.. _UntypedProducerActor: http://github.com/akka/akka/blob/master/akka-camel/src/main/scala/akka/camel/javaapi/UntypedProducerActor.scala +.. _UntypedProducerActor: @github@/akka-camel/src/main/scala/akka/camel/javaapi/UntypedProducerActor.scala .. _ProducerTemplate: https://svn.apache.org/repos/asf/camel/tags/camel-2.8.0/camel-core/src/main/java/org/apache/camel/ProducerTemplate.java .. _camel-asynchronous-routing-java: @@ -361,7 +361,7 @@ Akka Camel components Akka actors can be accessed from Camel routes using the `actor`_ Camel component. This component can be used to access any Akka actor (not only consumer actors) from Camel routes, as described in the following sections. -.. _actor: http://github.com/akka/akka/blob/master/akka-camel/src/main/scala/akka/camel/internal/component/ActorComponent.scala +.. _actor: @github@/akka-camel/src/main/scala/akka/camel/internal/component/ActorComponent.scala .. _access-to-actors-java: @@ -372,7 +372,7 @@ To access actors from custom Camel routes, the `actor`_ Camel component should be used. It fully supports Camel's `asynchronous routing engine`_. -.. _actor: http://github.com/akka/akka/blob/master/akka-camel/src/main/scala/akka/camel/internal/component/ActorComponent.scala +.. _actor: @github@/akka-camel/src/main/scala/akka/camel/internal/component/ActorComponent.scala .. _asynchronous routing engine: http://camel.apache.org/asynchronous-routing-engine.html This component accepts the following endpoint URI format: diff --git a/akka-docs/rst/java/remoting.rst b/akka-docs/rst/java/remoting.rst index efd4b0e43f..aab5a1b013 100644 --- a/akka-docs/rst/java/remoting.rst +++ b/akka-docs/rst/java/remoting.rst @@ -193,7 +193,7 @@ Description of the Remoting Sample There is a more extensive remote example that comes with the Akka distribution. Please have a look here for more information: `Remote Sample -`_ +<@github@/akka-samples/akka-sample-remote>`_ This sample demonstrates both, remote deployment and look-up of remote actors. First, let us have a look at the common setup for both scenarios (this is ``common.conf``): diff --git a/akka-docs/rst/scala/actors.rst b/akka-docs/rst/scala/actors.rst index 3000a2e55a..e81f744952 100644 --- a/akka-docs/rst/scala/actors.rst +++ b/akka-docs/rst/scala/actors.rst @@ -671,7 +671,7 @@ The ``become`` method is useful for many different things, but a particular nice example of it is in example where it is used to implement a Finite State Machine (FSM): `Dining Hakkers`_. -.. _Dining Hakkers: http://github.com/akka/akka/blob/master/akka-samples/akka-sample-fsm/src/main/scala/DiningHakkersOnBecome.scala +.. _Dining Hakkers: @github@/akka-samples/akka-sample-fsm/src/main/scala/DiningHakkersOnBecome.scala Here is another little cute example of ``become`` and ``unbecome`` in action: diff --git a/akka-docs/rst/scala/camel.rst b/akka-docs/rst/scala/camel.rst index 292324e26d..c1a0e35789 100644 --- a/akka-docs/rst/scala/camel.rst +++ b/akka-docs/rst/scala/camel.rst @@ -129,7 +129,7 @@ An ``ActivationTimeoutException`` is thrown if the endpoint could not be activat Deactivation of a Consumer or a Producer actor happens when the actor is terminated. For a Consumer, the route to the actor is stopped. For a Producer, the `SendProcessor`_ is stopped. A ``DeActivationTimeoutException`` is thrown if the associated camel objects could not be deactivated within the specified timeout. -.. _Camel: http://github.com/akka/akka/blob/master/akka-camel/src/main/scala/akka/camel/Camel.scala +.. _Camel: @github@/akka-camel/src/main/scala/akka/camel/Camel.scala .. _CamelContext: https://svn.apache.org/repos/asf/camel/tags/camel-2.8.0/camel-core/src/main/java/org/apache/camel/CamelContext.java .. _ProducerTemplate: https://svn.apache.org/repos/asf/camel/tags/camel-2.8.0/camel-core/src/main/java/org/apache/camel/ProducerTemplate.java .. _SendProcessor: https://svn.apache.org/repos/asf/camel/tags/camel-2.8.0/camel-core/src/main/java/org/apache/camel/processor/SendProcessor.java @@ -143,7 +143,7 @@ trait. For example, the following actor class (Consumer1) implements the endpointUri method, which is declared in the Consumer trait, in order to receive messages from the ``file:data/input/actor`` Camel endpoint. -.. _Consumer: http://github.com/akka/akka/blob/master/akka-camel/src/main/scala/akka/camel/Consumer.scala +.. _Consumer: @github@/akka-camel/src/main/scala/akka/camel/Consumer.scala .. includecode:: code/docs/camel/Consumers.scala#Consumer1 @@ -153,7 +153,7 @@ actor. Messages consumed by actors from Camel endpoints are of type `CamelMessage`_. These are immutable representations of Camel messages. .. _file component: http://camel.apache.org/file2.html -.. _Message: http://github.com/akka/akka/blob/master/akka-camel/src/main/scala/akka/camel/CamelMessage.scala +.. _Message: @github@/akka-camel/src/main/scala/akka/camel/CamelMessage.scala Here's another example that sets the endpointUri to @@ -173,7 +173,7 @@ client the response type should be `CamelMessage`_. For any other response type, new CamelMessage object is created by akka-camel with the actor response as message body. -.. _CamelMessage: http://github.com/akka/akka/blob/master/akka-camel/src/main/scala/akka/camel/CamelMessage.scala +.. _CamelMessage: @github@/akka-camel/src/main/scala/akka/camel/CamelMessage.scala .. _camel-acknowledgements: @@ -218,7 +218,7 @@ The timeout on the consumer actor can be overridden with the ``replyTimeout``, a .. includecode:: code/docs/camel/Consumers.scala#Consumer4 .. _Exchange: https://svn.apache.org/repos/asf/camel/tags/camel-2.8.0/camel-core/src/main/java/org/apache/camel/Exchange.java -.. _ask: http://github.com/akka/akka/blob/master/akka-actor/src/main/scala/akka/pattern/AskSupport.scala +.. _ask: @github@/akka-actor/src/main/scala/akka/pattern/AskSupport.scala Producer Actors =============== @@ -292,7 +292,7 @@ For initiating a a two-way message exchange, one of the .. includecode:: code/docs/camel/Producers.scala#RequestProducerTemplate -.. _Producer: http://github.com/akka/akka/blob/master/akka-camel/src/main/scala/akka/camel/Producer.scala +.. _Producer: @github@/akka-camel/src/main/scala/akka/camel/Producer.scala .. _ProducerTemplate: https://svn.apache.org/repos/asf/camel/tags/camel-2.8.0/camel-core/src/main/java/org/apache/camel/ProducerTemplate.java .. _camel-asynchronous-routing: @@ -357,7 +357,7 @@ Akka Camel components Akka actors can be accessed from Camel routes using the `actor`_ Camel component. This component can be used to access any Akka actor (not only consumer actors) from Camel routes, as described in the following sections. -.. _actor: http://github.com/akka/akka/blob/master/akka-camel/src/main/scala/akka/camel/internal/component/ActorComponent.scala +.. _actor: @github@/akka-camel/src/main/scala/akka/camel/internal/component/ActorComponent.scala .. _access-to-actors: @@ -368,7 +368,7 @@ To access actors from custom Camel routes, the `actor`_ Camel component should be used. It fully supports Camel's `asynchronous routing engine`_. -.. _actor: http://github.com/akka/akka/blob/master/akka-camel/src/main/scala/akka/camel/internal/component/ActorComponent.scala +.. _actor: @github@/akka-camel/src/main/scala/akka/camel/internal/component/ActorComponent.scala .. _asynchronous routing engine: http://camel.apache.org/asynchronous-routing-engine.html This component accepts the following endpoint URI format: diff --git a/akka-docs/rst/scala/remoting.rst b/akka-docs/rst/scala/remoting.rst index c866e9c1e6..db5ddbf170 100644 --- a/akka-docs/rst/scala/remoting.rst +++ b/akka-docs/rst/scala/remoting.rst @@ -200,7 +200,7 @@ Description of the Remoting Sample There is a more extensive remote example that comes with the Akka distribution. Please have a look here for more information: `Remote Sample -`_ +<@github@/akka-samples/akka-sample-remote>`_ This sample demonstrates both, remote deployment and look-up of remote actors. First, let us have a look at the common setup for both scenarios (this is ``common.conf``): diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index a54aea55a5..35a28de088 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -533,6 +533,7 @@ object AkkaBuild extends Build { // customization of sphinx @@ replacements, add to all sphinx-using projects // add additional replacements here preprocessVars <<= (scalaVersion, version) { (s, v) => + val isSnapshot = v.endsWith("SNAPSHOT") val BinVer = """(\d+\.\d+)\.\d+""".r Map( "version" -> v, @@ -548,7 +549,8 @@ object AkkaBuild extends Build { "binVersion" -> (s match { case BinVer(bv) => bv case _ => s - }) + }), + "github" -> "http://github.com/akka/akka/tree/%s".format((if (isSnapshot) "master" else "v" + v)) ) }, preprocess <<= (sourceDirectory, target in preprocess, cacheDirectory, preprocessExts, preprocessVars, streams) map { diff --git a/project/scripts/release b/project/scripts/release index 1dd5d9d3ae..50244cc0ca 100755 --- a/project/scripts/release +++ b/project/scripts/release @@ -203,12 +203,6 @@ try git checkout -b ${release_branch} # find and replace the version try ${script_dir}/find-replace ${current_version} ${version} -#find and replace github links -try ${script_dir}/find-replace http://github.com/akka/akka/tree/master http://github.com/akka/akka/tree/v${version} -try ${script_dir}/find-replace https://github.com/akka/akka/tree/master http://github.com/akka/akka/tree/v${version} -try ${script_dir}/find-replace http://github.com/akka/akka/blob/master http://github.com/akka/akka/tree/v${version} -try ${script_dir}/find-replace https://github.com/akka/akka/blob/master http://github.com/akka/akka/tree/v${version} - # start clean try sbt clean From 4fe6588b1ee3281437059c3b902aeea22b7eb56e Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Tue, 23 Oct 2012 08:11:03 +0200 Subject: [PATCH 076/210] Correction of 2.1 migration guide * config 1.0.0 * Duration.create --- akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst b/akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst index b162f8e24f..e9458c7614 100644 --- a/akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst +++ b/akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst @@ -24,7 +24,7 @@ Config Dependency dependency of akka-actor and it is no longer embedded in ``akka-actor.jar``. If your are using a build tool with dependency resolution, such as sbt or maven you will not notice the difference, but if you have manually constructed classpaths -you need to add `config-0.5.0.jar `_. +you need to add `config-1.0.0.jar `_. Pieces Moved to Scala Standard Library ====================================== @@ -66,7 +66,7 @@ Java: :: // Use this Actors' Dispatcher as ExecutionContext - getContext().system().scheduler().scheduleOnce(Duration.create("10 seconds", + getContext().system().scheduler().scheduleOnce(Duration.create(10, TimeUnit.SECONDS)", getSelf(), new Reconnect(), getContext().getDispatcher()); // Use ActorSystem's default Dispatcher as ExecutionContext @@ -383,7 +383,7 @@ v2.0:: v2.1:: - final FiniteDuration d = Duration.create("1 second"); + final FiniteDuration d = Duration.create(1, TimeUnit.SECONDS); final Timeout t = new Timeout(d); // always required finite duration, now enforced Package Name Changes in Remoting From be0d5b45092af99b5f62771fb245dc3bb43849cd Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Tue, 23 Oct 2012 15:06:54 +0200 Subject: [PATCH 077/210] #2643 - Removing the use of Await in the Future documentation, promoting the use of callbacks --- .../code/docs/future/FutureDocTestBase.java | 61 ++++++++++++++---- akka-docs/rst/java/futures.rst | 16 +++++ .../code/docs/future/FutureDocSpec.scala | 62 ++++++++++++++----- akka-docs/rst/scala/futures.rst | 13 +++- 4 files changed, 121 insertions(+), 31 deletions(-) diff --git a/akka-docs/rst/java/code/docs/future/FutureDocTestBase.java b/akka-docs/rst/java/code/docs/future/FutureDocTestBase.java index 5e9f70b8b0..fb49a9a48d 100644 --- a/akka-docs/rst/java/code/docs/future/FutureDocTestBase.java +++ b/akka-docs/rst/java/code/docs/future/FutureDocTestBase.java @@ -79,6 +79,21 @@ public class FutureDocTestBase { system.shutdown(); } + public final static class PrintResult extends OnSuccess { + @Override public final void onSuccess(T t) { + // print t + } + } + + public final static class Demo { + //#print-result + public final static class PrintResult extends OnSuccess { + @Override public final void onSuccess(T t) { + System.out.println(t); + } + } + //#print-result + } @SuppressWarnings("unchecked") @Test public void useCustomExecutionContext() throws Exception { ExecutorService yourExecutorServiceGoesHere = Executors.newSingleThreadExecutor(); //#diy-execution-context @@ -102,6 +117,9 @@ public class FutureDocTestBase { Future future = Patterns.ask(actor, msg, timeout); String result = (String) Await.result(future, timeout.duration()); //#ask-blocking + //#pipe-to + akka.pattern.Patterns.pipe(future, system.dispatcher()).to(actor); + //#pipe-to assertEquals("HELLO", result); } @@ -113,9 +131,11 @@ public class FutureDocTestBase { return "Hello" + "World"; } }, system.dispatcher()); - String result = (String) Await.result(f, Duration.create(5, SECONDS)); + + f.onSuccess(new PrintResult(), system.dispatcher()); //#future-eval - assertEquals("HelloWorld", result); + String result = (String) Await.result(f, Duration.create(5, SECONDS)); + assertEquals("HelloWorld", result); } @Test @@ -135,9 +155,10 @@ public class FutureDocTestBase { } }, ec); + f2.onSuccess(new PrintResult(), system.dispatcher()); + //#map int result = Await.result(f2, Duration.create(5, SECONDS)); assertEquals(10, result); - //#map } @Test @@ -158,6 +179,7 @@ public class FutureDocTestBase { } }, ec); + f2.onSuccess(new PrintResult(), system.dispatcher()); //#map2 int result = Await.result(f2, Duration.create(5, SECONDS)); assertEquals(10, result); @@ -174,7 +196,8 @@ public class FutureDocTestBase { } }, ec); - Thread.sleep(100); + // Thread.sleep is only here to prove a point + Thread.sleep(100); // Do not use this in your code Future f2 = f1.map(new Mapper() { public Integer apply(String s) { @@ -182,6 +205,7 @@ public class FutureDocTestBase { } }, ec); + f2.onSuccess(new PrintResult(), system.dispatcher()); //#map3 int result = Await.result(f2, Duration.create(5, SECONDS)); assertEquals(10, result); @@ -208,6 +232,7 @@ public class FutureDocTestBase { } }, ec); + f2.onSuccess(new PrintResult(), system.dispatcher()); //#flat-map int result = Await.result(f2, Duration.create(5, SECONDS)); assertEquals(10, result); @@ -238,8 +263,9 @@ public class FutureDocTestBase { } }, ec); - long result = Await.result(futureSum, Duration.create(5, SECONDS)); + futureSum.onSuccess(new PrintResult(), system.dispatcher()); //#sequence + long result = Await.result(futureSum, Duration.create(5, SECONDS)); assertEquals(3L, result); } @@ -262,9 +288,10 @@ public class FutureDocTestBase { }, ec); //Returns the sequence of strings as upper case + futureResult.onSuccess(new PrintResult>(), system.dispatcher()); + //#traverse Iterable result = Await.result(futureResult, Duration.create(5, SECONDS)); assertEquals(Arrays.asList("A", "B", "C"), result); - //#traverse } @Test @@ -286,9 +313,10 @@ public class FutureDocTestBase { return r + t; //Just concatenate } }, ec); - String result = Await.result(resultFuture, Duration.create(5, SECONDS)); - //#fold + resultFuture.onSuccess(new PrintResult(), system.dispatcher()); + //#fold + String result = Await.result(resultFuture, Duration.create(5, SECONDS)); assertEquals("ab", result); } @@ -310,8 +338,9 @@ public class FutureDocTestBase { } }, ec); - Object result = Await.result(resultFuture, Duration.create(5, SECONDS)); + resultFuture.onSuccess(new PrintResult(), system.dispatcher()); //#reduce + Object result = Await.result(resultFuture, Duration.create(5, SECONDS)); assertEquals("ab", result); } @@ -399,9 +428,11 @@ public class FutureDocTestBase { throw problem; } }, ec); + + future.onSuccess(new PrintResult(), system.dispatcher()); + //#recover int result = Await.result(future, Duration.create(5, SECONDS)); assertEquals(result, 0); - //#recover } @Test @@ -425,9 +456,11 @@ public class FutureDocTestBase { throw problem; } }, ec); + + future.onSuccess(new PrintResult(), system.dispatcher()); + //#try-recover int result = Await.result(future, Duration.create(5, SECONDS)); assertEquals(result, 0); - //#try-recover } @Test @@ -497,9 +530,10 @@ public class FutureDocTestBase { } }, ec); + future3.onSuccess(new PrintResult(), system.dispatcher()); + //#zip String result = Await.result(future3, Duration.create(5, SECONDS)); assertEquals("foo bar", result); - //#zip } { @@ -509,9 +543,10 @@ public class FutureDocTestBase { Future future3 = Futures.successful("bar"); // Will have "bar" in this case Future future4 = future1.fallbackTo(future2).fallbackTo(future3); + future4.onSuccess(new PrintResult(), system.dispatcher()); + //#fallback-to String result = Await.result(future4, Duration.create(5, SECONDS)); assertEquals("bar", result); - //#fallback-to } } diff --git a/akka-docs/rst/java/futures.rst b/akka-docs/rst/java/futures.rst index 137f0badac..f643155bc3 100644 --- a/akka-docs/rst/java/futures.rst +++ b/akka-docs/rst/java/futures.rst @@ -47,6 +47,17 @@ Alternatives to blocking are discussed further within this documentation. Also note that the ``Future`` returned by an ``UntypedActor`` is a ``Future`` since an ``UntypedActor`` is dynamic. That is why the cast to ``String`` is used in the above sample. +.. warning:: + + ``Await.result`` and ``Await.ready`` are provided for exceptional situations where you **must** block, + a good rule of thumb is to only use them if you know why you **must** block. For all other cases, use + asynchronous composition as described below. + +To send the result of a ``Future`` to an ``Actor``, you can use the ``pipe`` construct: + +.. includecode:: code/docs/future/FutureDocTestBase.java + :include: pipe-to + Use Directly ------------ @@ -75,6 +86,11 @@ Or failures: .. includecode:: code/docs/future/FutureDocTestBase.java :include: failed +For these examples ``PrintResult`` is defined as follows: + +.. includecode:: code/docs/future/FutureDocTestBase.java + :include: print-result + Functional Futures ------------------ diff --git a/akka-docs/rst/scala/code/docs/future/FutureDocSpec.scala b/akka-docs/rst/scala/code/docs/future/FutureDocSpec.scala index 6e6a3521d1..48feec13d9 100644 --- a/akka-docs/rst/scala/code/docs/future/FutureDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/future/FutureDocSpec.scala @@ -39,6 +39,9 @@ object FutureDocSpec { class FutureDocSpec extends AkkaSpec { import FutureDocSpec._ import system.dispatcher + + val println: PartialFunction[Any, Unit] = { case _ ⇒ } + "demonstrate usage custom ExecutionContext" in { val yourExecutorServiceGoesHere = java.util.concurrent.Executors.newSingleThreadExecutor() //#diy-execution-context @@ -68,6 +71,12 @@ class FutureDocSpec extends AkkaSpec { val future = actor ? msg // enabled by the “ask” import val result = Await.result(future, timeout.duration).asInstanceOf[String] //#ask-blocking + + //#pipe-to + import akka.pattern.pipe + future pipeTo actor + //#pipe-to + result must be("HELLO") } @@ -93,9 +102,9 @@ class FutureDocSpec extends AkkaSpec { val future = Future { "Hello" + "World" } - val result = Await.result(future, 1 second) + future foreach println //#future-eval - result must be("HelloWorld") + Await.result(future, 1 second) must be("HelloWorld") } "demonstrate usage of map" in { @@ -106,10 +115,11 @@ class FutureDocSpec extends AkkaSpec { val f2 = f1 map { x ⇒ x.length } + f2 foreach println + //#map val result = Await.result(f2, 1 second) result must be(10) f1.value must be(Some(Success("HelloWorld"))) - //#map } "demonstrate wrong usage of nested map" in { @@ -123,6 +133,7 @@ class FutureDocSpec extends AkkaSpec { x.length * y } } + f3 foreach println //#wrong-nested-map Await.ready(f3, 1 second) } @@ -138,25 +149,30 @@ class FutureDocSpec extends AkkaSpec { x.length * y } } + f3 foreach println + //#flat-map val result = Await.result(f3, 1 second) result must be(30) - //#flat-map } "demonstrate usage of filter" in { //#filter val future1 = Future.successful(4) val future2 = future1.filter(_ % 2 == 0) - val result = Await.result(future2, 1 second) - result must be(4) + + future2 foreach println val failedFilter = future1.filter(_ % 2 == 1).recover { // When filter fails, it will have a java.util.NoSuchElementException case m: NoSuchElementException ⇒ 0 } + + failedFilter foreach println + //#filter + val result = Await.result(future2, 1 second) + result must be(4) val result2 = Await.result(failedFilter, 1 second) result2 must be(0) //Can only be 0 when there was a MatchError - //#filter } "demonstrate usage of for comprehension" in { @@ -171,9 +187,10 @@ class FutureDocSpec extends AkkaSpec { // Note that the execution of futures a, b, and c // are not done in parallel. + f foreach println + //#for-comprehension val result = Await.result(f, 1 second) result must be(24) - //#for-comprehension } "demonstrate wrong way of composing" in { @@ -220,8 +237,9 @@ class FutureDocSpec extends AkkaSpec { c ← ask(actor3, (a + b)).mapTo[Int] } yield c - val result = Await.result(f3, 1 second).asInstanceOf[Int] + f3 foreach println //#composing + val result = Await.result(f3, 1 second).asInstanceOf[Int] result must be(3) } @@ -236,25 +254,28 @@ class FutureDocSpec extends AkkaSpec { val futureList = Future.sequence(listOfFutures) // Find the sum of the odd numbers - val oddSum = Await.result(futureList.map(_.sum), 1 second).asInstanceOf[Int] - oddSum must be(10000) + val oddSum = futureList.map(_.sum) + oddSum foreach println //#sequence-ask + Await.result(oddSum, 1 second).asInstanceOf[Int] must be(10000) } "demonstrate usage of sequence" in { //#sequence val futureList = Future.sequence((1 to 100).toList.map(x ⇒ Future(x * 2 - 1))) - val oddSum = Await.result(futureList.map(_.sum), 1 second).asInstanceOf[Int] - oddSum must be(10000) + val oddSum = futureList.map(_.sum) + oddSum foreach println //#sequence + Await.result(oddSum, 1 second).asInstanceOf[Int] must be(10000) } "demonstrate usage of traverse" in { //#traverse val futureList = Future.traverse((1 to 100).toList)(x ⇒ Future(x * 2 - 1)) - val oddSum = Await.result(futureList.map(_.sum), 1 second).asInstanceOf[Int] - oddSum must be(10000) + val oddSum = futureList.map(_.sum) + oddSum foreach println //#traverse + Await.result(oddSum, 1 second).asInstanceOf[Int] must be(10000) } "demonstrate usage of fold" in { @@ -262,8 +283,9 @@ class FutureDocSpec extends AkkaSpec { // Create a sequence of Futures val futures = for (i ← 1 to 1000) yield Future(i * 2) val futureSum = Future.fold(futures)(0)(_ + _) - Await.result(futureSum, 1 second) must be(1001000) + futureSum foreach println //#fold + Await.result(futureSum, 1 second) must be(1001000) } "demonstrate usage of reduce" in { @@ -271,8 +293,9 @@ class FutureDocSpec extends AkkaSpec { // Create a sequence of Futures val futures = for (i ← 1 to 1000) yield Future(i * 2) val futureSum = Future.reduce(futures)(_ + _) - Await.result(futureSum, 1 second) must be(1001000) + futureSum foreach println //#reduce + Await.result(futureSum, 1 second) must be(1001000) } "demonstrate usage of recover" in { @@ -283,6 +306,7 @@ class FutureDocSpec extends AkkaSpec { val future = akka.pattern.ask(actor, msg1) recover { case e: ArithmeticException ⇒ 0 } + future foreach println //#recover Await.result(future, 1 second) must be(0) } @@ -297,6 +321,7 @@ class FutureDocSpec extends AkkaSpec { case foo: IllegalArgumentException ⇒ Future.failed[Int](new IllegalStateException("All br0ken!")) } + future foreach println //#try-recover Await.result(future, 1 second) must be(0) } @@ -306,6 +331,7 @@ class FutureDocSpec extends AkkaSpec { val future2 = Future { "bar" } //#zip val future3 = future1 zip future2 map { case (a, b) ⇒ a + " " + b } + future3 foreach println //#zip Await.result(future3, 1 second) must be("foo bar") } @@ -321,6 +347,7 @@ class FutureDocSpec extends AkkaSpec { } andThen { case _ ⇒ watchSomeTV } + result foreach println //#and-then Await.result(result, 1 second) must be("foo bar") } @@ -331,6 +358,7 @@ class FutureDocSpec extends AkkaSpec { val future3 = Future { "pigdog" } //#fallback-to val future4 = future1 fallbackTo future2 fallbackTo future3 + future4 foreach println //#fallback-to Await.result(future4, 1 second) must be("foo") } diff --git a/akka-docs/rst/scala/futures.rst b/akka-docs/rst/scala/futures.rst index 0347d93e4b..6cfb188a6d 100644 --- a/akka-docs/rst/scala/futures.rst +++ b/akka-docs/rst/scala/futures.rst @@ -41,7 +41,7 @@ Use With Actors There are generally two ways of getting a reply from an ``Actor``: the first is by a sent message (``actor ! msg``), which only works if the original sender was an ``Actor``) and the second is through a ``Future``. -Using an ``Actor``\'s ``?`` method to send a message will return a ``Future``. To wait for and retrieve the actual result the simplest method is: +Using an ``Actor``\'s ``?`` method to send a message will return a ``Future``: .. includecode:: code/docs/future/FutureDocSpec.scala :include: ask-blocking @@ -59,6 +59,11 @@ When using non-blocking it is better to use the ``mapTo`` method to safely try t The ``mapTo`` method will return a new ``Future`` that contains the result if the cast was successful, or a ``ClassCastException`` if not. Handling ``Exception``\s will be discussed further within this documentation. +To send the result of a ``Future`` to an ``Actor``, you can use the ``pipe`` construct: + +.. includecode:: code/docs/future/FutureDocSpec.scala + :include: pipe-to + Use Directly ------------ @@ -150,6 +155,12 @@ First an example of using ``Await.result``: .. includecode:: code/docs/future/FutureDocSpec.scala :include: composing-wrong +.. warning:: + + ``Await.result`` and ``Await.ready`` are provided for exceptional situations where you **must** block, + a good rule of thumb is to only use them if you know why you **must** block. For all other cases, use + asynchronous composition as described below. + Here we wait for the results from the first 2 ``Actor``\s before sending that result to the third ``Actor``. We called ``Await.result`` 3 times, which caused our little program to block 3 times before getting our final result. Now compare that to this example: From 3530e513e1d39081a219bb327b0161558b65207f Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Tue, 23 Oct 2012 12:07:38 +0200 Subject: [PATCH 078/210] #2646 - Replacing most usages of JavaConversions by JavaConverters --- .../main/scala/akka/actor/ActorSystem.scala | 4 +-- .../main/scala/akka/actor/FaultHandling.scala | 6 +++-- .../src/main/scala/akka/dispatch/Future.scala | 16 +++++------ .../src/main/scala/akka/japi/JavaAPI.scala | 5 ++-- .../routing/ConsistentHashingRouter.scala | 4 +-- .../src/main/scala/akka/routing/Routing.scala | 15 +++++------ .../src/main/scala/akka/util/Index.scala | 27 +++++++++---------- .../main/scala/akka/camel/CamelMessage.scala | 10 +++---- .../camel/internal/CamelExchangeAdapter.scala | 12 +++++---- .../akka/transactor/UntypedTransactor.scala | 13 ++++----- 10 files changed, 53 insertions(+), 59 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorSystem.scala b/akka-actor/src/main/scala/akka/actor/ActorSystem.scala index a9528a57aa..212ee9372d 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorSystem.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorSystem.scala @@ -676,8 +676,8 @@ private[akka] class ActorSystemImpl(val name: String, applicationConfig: Config, def hasExtension(ext: ExtensionId[_ <: Extension]): Boolean = findExtension(ext) != null private def loadExtensions() { - import scala.collection.JavaConversions._ - settings.config.getStringList("akka.extensions") foreach { fqcn ⇒ + import scala.collection.JavaConverters.collectionAsScalaIterableConverter + settings.config.getStringList("akka.extensions").asScala foreach { fqcn ⇒ dynamicAccess.getObjectFor[AnyRef](fqcn) recoverWith { case _ ⇒ dynamicAccess.createInstanceFor[AnyRef](fqcn, Seq()) } match { case Success(p: ExtensionIdProvider) ⇒ registerExtension(p.lookup()) case Success(p: ExtensionId[_]) ⇒ registerExtension(p) diff --git a/akka-actor/src/main/scala/akka/actor/FaultHandling.scala b/akka-actor/src/main/scala/akka/actor/FaultHandling.scala index fbee491664..d72389ae5e 100644 --- a/akka-actor/src/main/scala/akka/actor/FaultHandling.scala +++ b/akka-actor/src/main/scala/akka/actor/FaultHandling.scala @@ -7,7 +7,6 @@ import language.implicitConversions import java.util.concurrent.TimeUnit import scala.collection.mutable.ArrayBuffer -import scala.collection.JavaConversions._ import java.lang.{ Iterable ⇒ JIterable } import scala.concurrent.duration.Duration /** @@ -195,7 +194,10 @@ object SupervisorStrategy extends SupervisorStrategyLowPriorityImplicits { * Decider builder which just checks whether one of * the given Throwables matches the cause and restarts, otherwise escalates. */ - def makeDecider(trapExit: JIterable[Class[_ <: Throwable]]): Decider = makeDecider(trapExit.toSeq) + def makeDecider(trapExit: JIterable[Class[_ <: Throwable]]): Decider = { + import scala.collection.JavaConverters.iterableAsScalaIterableConverter + makeDecider(trapExit.asScala.toSeq) + } /** * Decider builder for Iterables of cause-directive pairs, e.g. a map obtained diff --git a/akka-actor/src/main/scala/akka/dispatch/Future.scala b/akka-actor/src/main/scala/akka/dispatch/Future.scala index 113215cd23..59c0afe5aa 100644 --- a/akka-actor/src/main/scala/akka/dispatch/Future.scala +++ b/akka-actor/src/main/scala/akka/dispatch/Future.scala @@ -68,7 +68,7 @@ object ExecutionContexts { * Futures is the Java API for Futures and Promises */ object Futures { - + import scala.collection.JavaConverters.iterableAsScalaIterableConverter /** * Java API, equivalent to Future.apply */ @@ -95,7 +95,7 @@ object Futures { */ def find[T <: AnyRef](futures: JIterable[Future[T]], predicate: JFunc[T, java.lang.Boolean], executor: ExecutionContext): Future[JOption[T]] = { implicit val ec = executor - Future.find[T]((scala.collection.JavaConversions.iterableAsScalaIterable(futures)))(predicate.apply(_))(executor).map(JOption.fromScalaOption(_)) + Future.find[T](futures.asScala)(predicate.apply(_))(executor).map(JOption.fromScalaOption(_)) } /** @@ -103,7 +103,7 @@ object Futures { * Returns a Future to the result of the first future in the list that is completed */ def firstCompletedOf[T <: AnyRef](futures: JIterable[Future[T]], executor: ExecutionContext): Future[T] = - Future.firstCompletedOf(scala.collection.JavaConversions.iterableAsScalaIterable(futures))(executor) + Future.firstCompletedOf(futures.asScala)(executor) /** * Java API @@ -113,14 +113,14 @@ object Futures { * or the result of the fold. */ def fold[T <: AnyRef, R <: AnyRef](zero: R, futures: JIterable[Future[T]], fun: akka.japi.Function2[R, T, R], executor: ExecutionContext): Future[R] = - Future.fold(scala.collection.JavaConversions.iterableAsScalaIterable(futures))(zero)(fun.apply)(executor) + Future.fold(futures.asScala)(zero)(fun.apply)(executor) /** * Java API. * Reduces the results of the supplied futures and binary function. */ def reduce[T <: AnyRef, R >: T](futures: JIterable[Future[T]], fun: akka.japi.Function2[R, T, R], executor: ExecutionContext): Future[R] = - Future.reduce[T, R](scala.collection.JavaConversions.iterableAsScalaIterable(futures))(fun.apply)(executor) + Future.reduce[T, R](futures.asScala)(fun.apply)(executor) /** * Java API. @@ -129,9 +129,7 @@ object Futures { */ def sequence[A](in: JIterable[Future[A]], executor: ExecutionContext): Future[JIterable[A]] = { implicit val d = executor - scala.collection.JavaConversions.iterableAsScalaIterable(in).foldLeft(Future(new JLinkedList[A]())) { (fr, fa) ⇒ - for (r ← fr; a ← fa) yield { r add a; r } - } + in.asScala.foldLeft(Future(new JLinkedList[A]())) { (fr, fa) ⇒ for (r ← fr; a ← fa) yield { r add a; r } } } /** @@ -142,7 +140,7 @@ object Futures { */ def traverse[A, B](in: JIterable[A], fn: JFunc[A, Future[B]], executor: ExecutionContext): Future[JIterable[B]] = { implicit val d = executor - scala.collection.JavaConversions.iterableAsScalaIterable(in).foldLeft(Future(new JLinkedList[B]())) { (fr, a) ⇒ + in.asScala.foldLeft(Future(new JLinkedList[B]())) { (fr, a) ⇒ val fb = fn(a) for (r ← fr; b ← fb) yield { r add b; r } } diff --git a/akka-actor/src/main/scala/akka/japi/JavaAPI.scala b/akka-actor/src/main/scala/akka/japi/JavaAPI.scala index 642600f2bd..ee2a688345 100644 --- a/akka-actor/src/main/scala/akka/japi/JavaAPI.scala +++ b/akka-actor/src/main/scala/akka/japi/JavaAPI.scala @@ -9,6 +9,7 @@ import scala.Some import scala.reflect.ClassTag import scala.util.control.NoStackTrace import scala.runtime.AbstractPartialFunction +import java.util.Collections.{ emptyList, singletonList } /** * A Function interface. Used to create first-class-functions is Java. @@ -114,13 +115,11 @@ abstract class JavaPartialFunction[A, B] extends AbstractPartialFunction[A, B] { * Java API */ sealed abstract class Option[A] extends java.lang.Iterable[A] { - import scala.collection.JavaConversions._ - def get: A def isEmpty: Boolean def isDefined: Boolean = !isEmpty def asScala: scala.Option[A] - def iterator: java.util.Iterator[A] = if (isEmpty) Iterator.empty else Iterator.single(get) + def iterator: java.util.Iterator[A] = if (isEmpty) emptyList[A].iterator else singletonList(get).iterator } object Option { diff --git a/akka-actor/src/main/scala/akka/routing/ConsistentHashingRouter.scala b/akka-actor/src/main/scala/akka/routing/ConsistentHashingRouter.scala index cdfd040ace..71a36be2b7 100644 --- a/akka-actor/src/main/scala/akka/routing/ConsistentHashingRouter.scala +++ b/akka-actor/src/main/scala/akka/routing/ConsistentHashingRouter.scala @@ -3,7 +3,7 @@ */ package akka.routing -import scala.collection.JavaConversions.iterableAsScalaIterable +import scala.collection.JavaConverters.iterableAsScalaIterableConverter import scala.util.control.NonFatal import akka.actor.ActorRef import akka.actor.SupervisorStrategy @@ -163,7 +163,7 @@ case class ConsistentHashingRouter( * @param routeePaths string representation of the actor paths of the routees that will be looked up * using `actorFor` in [[akka.actor.ActorRefProvider]] */ - def this(routeePaths: java.lang.Iterable[String]) = this(routees = iterableAsScalaIterable(routeePaths)) + def this(routeePaths: java.lang.Iterable[String]) = this(routees = routeePaths.asScala) /** * Constructor that sets the resizer to be used. diff --git a/akka-actor/src/main/scala/akka/routing/Routing.scala b/akka-actor/src/main/scala/akka/routing/Routing.scala index ac4f55bd7c..9ccf43fb58 100644 --- a/akka-actor/src/main/scala/akka/routing/Routing.scala +++ b/akka-actor/src/main/scala/akka/routing/Routing.scala @@ -10,7 +10,7 @@ import scala.concurrent.duration._ import akka.ConfigurationException import akka.pattern.pipe import com.typesafe.config.Config -import scala.collection.JavaConversions.iterableAsScalaIterable +import scala.collection.JavaConverters.iterableAsScalaIterableConverter import java.util.concurrent.atomic.{ AtomicLong, AtomicBoolean } import java.util.concurrent.TimeUnit import scala.concurrent.forkjoin.ThreadLocalRandom @@ -335,7 +335,7 @@ abstract class CustomRouterConfig extends RouterConfig { val customRoute = createCustomRoute(routeeProvider) { - case (sender, message) ⇒ customRoute.destinationsFor(sender, message) + case (sender, message) ⇒ customRoute.destinationsFor(sender, message).asScala } } @@ -564,7 +564,7 @@ case class RoundRobinRouter(nrOfInstances: Int = 0, routees: Iterable[String] = * @param routeePaths string representation of the actor paths of the routees that will be looked up * using `actorFor` in [[akka.actor.ActorRefProvider]] */ - def this(routeePaths: java.lang.Iterable[String]) = this(routees = iterableAsScalaIterable(routeePaths)) + def this(routeePaths: java.lang.Iterable[String]) = this(routees = routeePaths.asScala) /** * Constructor that sets the resizer to be used. @@ -701,7 +701,7 @@ case class RandomRouter(nrOfInstances: Int = 0, routees: Iterable[String] = Nil, * @param routeePaths string representation of the actor paths of the routees that will be looked up * using `actorFor` in [[akka.actor.ActorRefProvider]] */ - def this(routeePaths: java.lang.Iterable[String]) = this(routees = iterableAsScalaIterable(routeePaths)) + def this(routeePaths: java.lang.Iterable[String]) = this(routees = routeePaths.asScala) /** * Constructor that sets the resizer to be used. @@ -845,7 +845,7 @@ case class SmallestMailboxRouter(nrOfInstances: Int = 0, routees: Iterable[Strin * @param routeePaths string representation of the actor paths of the routees that will be looked up * using `actorFor` in [[akka.actor.ActorRefProvider]] */ - def this(routeePaths: java.lang.Iterable[String]) = this(routees = iterableAsScalaIterable(routeePaths)) + def this(routeePaths: java.lang.Iterable[String]) = this(routees = routeePaths.asScala) /** * Constructor that sets the resizer to be used. @@ -1064,7 +1064,7 @@ case class BroadcastRouter(nrOfInstances: Int = 0, routees: Iterable[String] = N * @param routeePaths string representation of the actor paths of the routees that will be looked up * using `actorFor` in [[akka.actor.ActorRefProvider]] */ - def this(routeePaths: java.lang.Iterable[String]) = this(routees = iterableAsScalaIterable(routeePaths)) + def this(routeePaths: java.lang.Iterable[String]) = this(routees = routeePaths.asScala) /** * Constructor that sets the resizer to be used. @@ -1196,8 +1196,7 @@ case class ScatterGatherFirstCompletedRouter(nrOfInstances: Int = 0, routees: It * @param routeePaths string representation of the actor paths of the routees that will be looked up * using `actorFor` in [[akka.actor.ActorRefProvider]] */ - def this(routeePaths: java.lang.Iterable[String], w: FiniteDuration) = - this(routees = iterableAsScalaIterable(routeePaths), within = w) + def this(routeePaths: java.lang.Iterable[String], w: FiniteDuration) = this(routees = routeePaths.asScala, within = w) /** * Constructor that sets the resizer to be used. diff --git a/akka-actor/src/main/scala/akka/util/Index.scala b/akka-actor/src/main/scala/akka/util/Index.scala index 3289ed8f13..ccaab901c3 100644 --- a/akka-actor/src/main/scala/akka/util/Index.scala +++ b/akka-actor/src/main/scala/akka/util/Index.scala @@ -7,6 +7,7 @@ import annotation.tailrec import java.util.concurrent.{ ConcurrentSkipListSet, ConcurrentHashMap } import java.util.{ Comparator, Set ⇒ JSet } +import scala.collection.JavaConverters.{ asScalaIteratorConverter, collectionAsScalaIterableConverter } import scala.collection.mutable /** @@ -71,12 +72,11 @@ class Index[K, V](val mapSize: Int, val valueComparator: Comparator[V]) { * @return Some(value) for the first matching value where the supplied function returns true for the given key, * if no matches it returns None */ - def findValue(key: K)(f: (V) ⇒ Boolean): Option[V] = { - import scala.collection.JavaConversions._ - val set = container get key - if (set ne null) set.iterator.find(f) - else None - } + def findValue(key: K)(f: (V) ⇒ Boolean): Option[V] = + container get key match { + case null ⇒ None + case set ⇒ set.iterator.asScala.find(f) + } /** * Returns an Iterator of V containing the values for the supplied key, or an empty iterator if the key doesn't exist @@ -84,27 +84,24 @@ class Index[K, V](val mapSize: Int, val valueComparator: Comparator[V]) { def valueIterator(key: K): scala.Iterator[V] = { container.get(key) match { case null ⇒ Iterator.empty - case some ⇒ scala.collection.JavaConversions.asScalaIterator(some.iterator()) + case some ⇒ some.iterator.asScala } } /** * Applies the supplied function to all keys and their values */ - def foreach(fun: (K, V) ⇒ Unit): Unit = { - import scala.collection.JavaConversions._ - container.entrySet foreach { e ⇒ e.getValue.foreach(fun(e.getKey, _)) } - } + def foreach(fun: (K, V) ⇒ Unit): Unit = + container.entrySet.iterator.asScala foreach { e ⇒ e.getValue.iterator.asScala.foreach(fun(e.getKey, _)) } /** * Returns the union of all value sets. */ def values: Set[V] = { - import scala.collection.JavaConversions._ val builder = mutable.Set.empty[V] for { - entry ← container.entrySet - v ← entry.getValue + values ← container.values.iterator.asScala + v ← values.iterator.asScala } builder += v builder.toSet } @@ -112,7 +109,7 @@ class Index[K, V](val mapSize: Int, val valueComparator: Comparator[V]) { /** * Returns the key set. */ - def keys: Iterable[K] = scala.collection.JavaConversions.collectionAsScalaIterable(container.keySet) + def keys: Iterable[K] = container.keySet.asScala /** * Disassociates the value of type V from the key of type K diff --git a/akka-camel/src/main/scala/akka/camel/CamelMessage.scala b/akka-camel/src/main/scala/akka/camel/CamelMessage.scala index 8b0dbef50a..70fd61bd2a 100644 --- a/akka-camel/src/main/scala/akka/camel/CamelMessage.scala +++ b/akka-camel/src/main/scala/akka/camel/CamelMessage.scala @@ -5,21 +5,18 @@ package akka.camel import java.util.{ Map ⇒ JMap, Set ⇒ JSet } - -import scala.collection.JavaConversions._ - import org.apache.camel.{ CamelContext, Message ⇒ JCamelMessage } import akka.AkkaException import scala.reflect.ClassTag +import scala.util.Try +import scala.collection.JavaConversions._ import akka.dispatch.Mapper -import util.{ Success, Failure, Try } /** * An immutable representation of a Camel message. * @author Martin Krasser */ case class CamelMessage(body: Any, headers: Map[String, Any]) { - def this(body: Any, headers: JMap[String, Any]) = this(body, headers.toMap) //for Java override def toString: String = "CamelMessage(%s, %s)" format (body, headers) @@ -76,8 +73,7 @@ case class CamelMessage(body: Any, headers: Map[String, Any]) { *

* Java API */ - def getHeaderAs[T](name: String, clazz: Class[T], camelContext: CamelContext): T = - headerAs[T](name)(ClassTag(clazz), camelContext).get + def getHeaderAs[T](name: String, clazz: Class[T], camelContext: CamelContext): T = headerAs[T](name)(ClassTag(clazz), camelContext).get /** * Returns a new CamelMessage with a transformed body using a transformer function. diff --git a/akka-camel/src/main/scala/akka/camel/internal/CamelExchangeAdapter.scala b/akka-camel/src/main/scala/akka/camel/internal/CamelExchangeAdapter.scala index 5750856b37..1d16c3003e 100644 --- a/akka-camel/src/main/scala/akka/camel/internal/CamelExchangeAdapter.scala +++ b/akka-camel/src/main/scala/akka/camel/internal/CamelExchangeAdapter.scala @@ -1,9 +1,6 @@ package akka.camel.internal -import scala.collection.JavaConversions._ - import org.apache.camel.util.ExchangeHelper - import org.apache.camel.{ Exchange, Message ⇒ JCamelMessage } import akka.camel.{ FailureResult, AkkaCamelException, CamelMessage } @@ -83,8 +80,10 @@ private[camel] class CamelExchangeAdapter(val exchange: Exchange) { * * @see AkkaCamelException */ - def toAkkaCamelException(headers: Map[String, Any]): AkkaCamelException = + def toAkkaCamelException(headers: Map[String, Any]): AkkaCamelException = { + import scala.collection.JavaConversions._ new AkkaCamelException(exchange.getException, headers ++ response.getHeaders) + } /** * Creates an immutable Failure object from the adapted Exchange so it can be used internally between Actors. @@ -101,7 +100,10 @@ private[camel] class CamelExchangeAdapter(val exchange: Exchange) { * * @see Failure */ - def toFailureResult(headers: Map[String, Any]): FailureResult = FailureResult(exchange.getException, headers ++ response.getHeaders) + def toFailureResult(headers: Map[String, Any]): FailureResult = { + import scala.collection.JavaConversions._ + FailureResult(exchange.getException, headers ++ response.getHeaders) + } /** * Creates an immutable CamelMessage object from Exchange.getIn so it can be used with Actors. diff --git a/akka-transactor/src/main/scala/akka/transactor/UntypedTransactor.scala b/akka-transactor/src/main/scala/akka/transactor/UntypedTransactor.scala index 98899e0a13..69fcac66ad 100644 --- a/akka-transactor/src/main/scala/akka/transactor/UntypedTransactor.scala +++ b/akka-transactor/src/main/scala/akka/transactor/UntypedTransactor.scala @@ -5,13 +5,15 @@ package akka.transactor import akka.actor.{ UntypedActor, ActorRef } -import scala.collection.JavaConversions._ import java.util.{ Set ⇒ JSet } +import java.util.Collections.{ emptySet, singleton ⇒ singletonSet } /** * An UntypedActor version of transactor for using from Java. */ abstract class UntypedTransactor extends UntypedActor { + import scala.collection.JavaConverters.asScalaSetConverter + private val settings = TransactorExtension(context.system) /** @@ -21,8 +23,7 @@ abstract class UntypedTransactor extends UntypedActor { final def onReceive(message: Any) { message match { case coordinated @ Coordinated(message) ⇒ { - val others = coordinate(message) - for (sendTo ← others) { + for (sendTo ← coordinate(message).asScala) { sendTo.actor ! coordinated(sendTo.message.getOrElse(message)) } before(message) @@ -49,19 +50,19 @@ abstract class UntypedTransactor extends UntypedActor { /** * Empty set of transactors to send to. */ - def nobody: JSet[SendTo] = Set[SendTo]() + def nobody: JSet[SendTo] = emptySet() /** * For including one other actor in this coordinated transaction and sending * them the same message as received. Use as the result in `coordinated`. */ - def include(actor: ActorRef): JSet[SendTo] = Set(SendTo(actor)) + def include(actor: ActorRef): JSet[SendTo] = singletonSet(SendTo(actor)) /** * For including one other actor in this coordinated transaction and specifying the * message to send. Use as the result in `coordinated`. */ - def include(actor: ActorRef, message: Any): JSet[SendTo] = Set(SendTo(actor, Some(message))) + def include(actor: ActorRef, message: Any): JSet[SendTo] = singletonSet(SendTo(actor, Some(message))) /** * For including another actor in this coordinated transaction and sending From e8976dd0c658e393d7437d283fd1c6c489b3ea49 Mon Sep 17 00:00:00 2001 From: Peter Vlugter Date: Wed, 24 Oct 2012 11:37:26 +1300 Subject: [PATCH 079/210] Update release script with new repo.akka.io details --- project/scripts/release | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/project/scripts/release b/project/scripts/release index 50244cc0ca..a803277959 100755 --- a/project/scripts/release +++ b/project/scripts/release @@ -2,18 +2,15 @@ # # Release script for Akka. # -# To run this script you need a user account on repo.akka.io and contributor access -# to github.com/akka/akka. +# To run this script you need access to repo.akka.io and github.com/akka/akka. # -# If your username on repo.akka.io is different from your local username then you can -# configure ssh to always associate a particular username with repo.akka.io by adding -# the following to .ssh/config: +# To always use the akkarepo user with repo.akka.io add the following to .ssh/config: # Host repo.akka.io -# User +# User akkarepo # defaults -declare -r default_server="repo.akka.io" -declare -r default_path="/akka/www" +declare -r default_server="akkarepo@repo.akka.io" +declare -r default_path="www" # settings declare -r release_dir="target/release" From f3b859159f7f39bc50cb23f94b3f573f5b2d6922 Mon Sep 17 00:00:00 2001 From: Peter Vlugter Date: Wed, 24 Oct 2012 12:05:16 +1300 Subject: [PATCH 080/210] Include generated pdf in online docs --- project/AkkaBuild.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 35a28de088..000456ebdf 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -15,7 +15,7 @@ import com.typesafe.tools.mima.plugin.MimaPlugin.mimaDefaultSettings import com.typesafe.tools.mima.plugin.MimaKeys.previousArtifact import com.typesafe.sbt.SbtSite.site import com.typesafe.sbt.site.SphinxSupport -import com.typesafe.sbt.site.SphinxSupport.{ enableOutput, generatePdf, sphinxInputs, sphinxPackages, Sphinx } +import com.typesafe.sbt.site.SphinxSupport.{ enableOutput, generatePdf, generatedPdf, sphinxInputs, sphinxPackages, Sphinx } import com.typesafe.sbt.preprocess.Preprocess.{ preprocess, preprocessExts, preprocessVars, simplePreprocess } import ls.Plugin.{ lsSettings, LsKeys } import java.lang.Boolean.getBoolean @@ -63,7 +63,7 @@ object AkkaBuild extends Build { // generate online version of docs sphinxInputs in Sphinx <<= sphinxInputs in Sphinx in LocalProject(docs.id) map { inputs => inputs.copy(tags = inputs.tags :+ "online") }, // don't regenerate the pdf, just reuse the akka-docs version - generatePdf in Sphinx <<= generatePdf in Sphinx in LocalProject(docs.id) map identity + generatedPdf in Sphinx <<= generatedPdf in Sphinx in LocalProject(docs.id) map identity ), aggregate = Seq(actor, testkit, actorTests, dataflow, remote, remoteTests, camel, cluster, slf4j, agent, transactor, mailboxes, zeroMQ, kernel, akkaSbtPlugin, osgi, osgiAries, docs, contrib, samples) From 2563f2d92769f72546284f95f78a389ce6598b05 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Wed, 24 Oct 2012 14:37:21 +0200 Subject: [PATCH 081/210] Repointing the link for the downloads. --- akka-docs/_sphinx/themes/akka/layout.html | 4 ++-- akka-docs/rst/index.rst | 2 +- akka-docs/rst/intro/getting-started.rst | 2 +- akka-docs/rst/intro/what-is-akka.rst | 2 +- akka-docs/rst/java/microkernel.rst | 2 +- akka-docs/rst/project/links.rst | 2 +- akka-docs/rst/scala/microkernel.rst | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/akka-docs/_sphinx/themes/akka/layout.html b/akka-docs/_sphinx/themes/akka/layout.html index be74cedd45..1e0f13bdc2 100644 --- a/akka-docs/_sphinx/themes/akka/layout.html +++ b/akka-docs/_sphinx/themes/akka/layout.html @@ -49,7 +49,7 @@

diff --git a/akka-docs/rst/index.rst b/akka-docs/rst/index.rst index 05b57dc816..57f40438fa 100644 --- a/akka-docs/rst/index.rst +++ b/akka-docs/rst/index.rst @@ -20,7 +20,7 @@ Links * :ref:`migration` -* `Downloads `_ +* `Downloads `_ * `Source Code `_ diff --git a/akka-docs/rst/intro/getting-started.rst b/akka-docs/rst/intro/getting-started.rst index fdd6169abd..599268ad6b 100644 --- a/akka-docs/rst/intro/getting-started.rst +++ b/akka-docs/rst/intro/getting-started.rst @@ -51,7 +51,7 @@ How to see the JARs dependencies of each Akka module is described in the Using a release distribution ---------------------------- -Download the release you need from http://akka.io/downloads and unzip it. +Download the release you need from http://typesafe.com/stack/downloads/akka and unzip it. Using a snapshot version ------------------------ diff --git a/akka-docs/rst/intro/what-is-akka.rst b/akka-docs/rst/intro/what-is-akka.rst index 8ca103351d..4f393fda5d 100644 --- a/akka-docs/rst/intro/what-is-akka.rst +++ b/akka-docs/rst/intro/what-is-akka.rst @@ -18,7 +18,7 @@ fault-tolerant applications. Akka is Open Source and available under the Apache 2 License. -Download from http://akka.io/downloads/ +Download from http://typesafe.com/stack/downloads/akka/ Please note that all code samples compile, so if you want direct access to the sources, have a look over at the `Akka Docs Project <@github@/akka-docs/rst>`_. diff --git a/akka-docs/rst/java/microkernel.rst b/akka-docs/rst/java/microkernel.rst index 3d89c5c7e6..db7c547b89 100644 --- a/akka-docs/rst/java/microkernel.rst +++ b/akka-docs/rst/java/microkernel.rst @@ -10,7 +10,7 @@ having to create a launcher script. The Akka Microkernel is included in the Akka download found at `downloads`_. -.. _downloads: http://akka.io/downloads +.. _downloads: http://typesafe.com/stack/downloads/akka To run an application with the microkernel you need to create a Bootable class that handles the startup and shutdown the application. An example is included below. diff --git a/akka-docs/rst/project/links.rst b/akka-docs/rst/project/links.rst index 8266240e24..54734e0e5c 100644 --- a/akka-docs/rst/project/links.rst +++ b/akka-docs/rst/project/links.rst @@ -21,7 +21,7 @@ Mailing List Downloads ^^^^^^^^^ -``_ +``_ Source Code diff --git a/akka-docs/rst/scala/microkernel.rst b/akka-docs/rst/scala/microkernel.rst index c223f9dd45..51e0bf4ac4 100644 --- a/akka-docs/rst/scala/microkernel.rst +++ b/akka-docs/rst/scala/microkernel.rst @@ -10,7 +10,7 @@ having to create a launcher script. The Akka Microkernel is included in the Akka download found at `downloads`_. -.. _downloads: http://akka.io/downloads +.. _downloads: http://typesafe.com/stack/downloads/akka To run an application with the microkernel you need to create a Bootable class that handles the startup and shutdown the application. An example is included below. From dfb92800497b15b81b03607f2d24da6f01f96046 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Wed, 24 Oct 2012 17:59:49 +0200 Subject: [PATCH 082/210] Eliminate glitch that caused job to be sent to deadletters, see #2630 * Cluster sample * The problem was that the sent job was sometimes sent to deadLetters * The reason was that statsService was not created when a facade at another node forwared the job to the statsService, i.e. deadLetters * Solved by using ask and recover with JobFailed in case of timeout in the facade, so that the facade always sends back JobResult or JobFailed --- .../sample/cluster/stats/japi/StatsAggregator.java | 2 +- .../sample/cluster/stats/japi/StatsFacade.java | 14 +++++++++++++- .../scala/sample/cluster/stats/StatsSample.scala | 13 +++++++++++-- .../stats/StatsSampleSingleMasterSpec.scala | 4 ++-- .../sample/cluster/stats/StatsSampleSpec.scala | 2 +- .../cluster/stats/japi/StatsSampleJapiSpec.scala | 2 +- .../japi/StatsSampleSingleMasterJapiSpec.scala | 4 ++-- 7 files changed, 31 insertions(+), 10 deletions(-) diff --git a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsAggregator.java b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsAggregator.java index aba6b67674..81b5b74ce5 100644 --- a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsAggregator.java +++ b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsAggregator.java @@ -25,7 +25,7 @@ public class StatsAggregator extends UntypedActor { @Override public void preStart() { - getContext().setReceiveTimeout(Duration.create(10, TimeUnit.SECONDS)); + getContext().setReceiveTimeout(Duration.create(5, TimeUnit.SECONDS)); } @Override diff --git a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsFacade.java b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsFacade.java index 25366c8064..89582882fa 100644 --- a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsFacade.java +++ b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsFacade.java @@ -1,17 +1,23 @@ package sample.cluster.stats.japi; +import scala.concurrent.Future; import sample.cluster.stats.japi.StatsMessages.JobFailed; import sample.cluster.stats.japi.StatsMessages.StatsJob; import akka.actor.ActorRef; import akka.actor.Address; import akka.actor.Props; import akka.actor.UntypedActor; +import akka.dispatch.Recover; import akka.cluster.Cluster; import akka.cluster.ClusterEvent.CurrentClusterState; import akka.cluster.ClusterEvent.LeaderChanged; import akka.cluster.ClusterEvent.MemberEvent; import akka.event.Logging; import akka.event.LoggingAdapter; +import akka.util.Timeout; +import static akka.pattern.Patterns.ask; +import static akka.pattern.Patterns.pipe; +import static java.util.concurrent.TimeUnit.SECONDS; //#facade public class StatsFacade extends UntypedActor { @@ -43,7 +49,13 @@ public class StatsFacade extends UntypedActor { } else if (message instanceof StatsJob) { StatsJob job = (StatsJob) message; - currentMaster.forward(job, getContext()); + Future f = ask(currentMaster, job, new Timeout(10, SECONDS)). + recover(new Recover() { + public Object recover(Throwable t) { + return new JobFailed("Service unavailable, try again later"); + } + }, getContext().dispatcher()); + pipe(f, getContext().dispatcher()).to(getSender()); } else if (message instanceof CurrentClusterState) { CurrentClusterState state = (CurrentClusterState) message; diff --git a/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala b/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala index 87a4026d2e..d35c475780 100644 --- a/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala +++ b/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala @@ -22,6 +22,9 @@ import akka.cluster.ClusterEvent.MemberUp import akka.cluster.MemberStatus import akka.routing.FromConfig import akka.routing.ConsistentHashingRouter.ConsistentHashableEnvelope +import akka.pattern.ask +import akka.pattern.pipe +import akka.util.Timeout //#imports //#messages @@ -51,7 +54,7 @@ class StatsService extends Actor { class StatsAggregator(expectedResults: Int, replyTo: ActorRef) extends Actor { var results = IndexedSeq.empty[Int] - context.setReceiveTimeout(10 seconds) + context.setReceiveTimeout(5 seconds) def receive = { case wordCount: Int ⇒ @@ -88,6 +91,7 @@ class StatsWorker extends Actor { //#facade class StatsFacade extends Actor with ActorLogging { + import context.dispatcher val cluster = Cluster(context.system) var currentMaster: Option[ActorRef] = None @@ -102,7 +106,12 @@ class StatsFacade extends Actor with ActorLogging { case job: StatsJob if currentMaster.isEmpty ⇒ sender ! JobFailed("Service unavailable, try again later") case job: StatsJob ⇒ - currentMaster foreach { _ forward job } + implicit val timeout = Timeout(10.seconds) + currentMaster foreach { + _ ? job recover { + case _ ⇒ JobFailed("Service unavailable, try again later") + } pipeTo sender + } case state: CurrentClusterState ⇒ state.leader foreach updateCurrentMaster case LeaderChanged(Some(leaderAddress)) ⇒ diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSingleMasterSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSingleMasterSpec.scala index f3de9f8ab4..ad678d377f 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSingleMasterSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSingleMasterSpec.scala @@ -84,11 +84,11 @@ abstract class StatsSampleSingleMasterSpec extends MultiNodeSpec(StatsSampleSing testConductor.enter("all-up") } - "show usage of the statsFacade" in within(5 seconds) { + "show usage of the statsFacade" in within(15 seconds) { val facade = system.actorFor(RootActorPath(node(third).address) / "user" / "statsFacade") // eventually the service should be ok, - // worker nodes might not be up yet + // service and worker nodes might not be up yet awaitCond { facade ! StatsJob("this is the text that will be analyzed") expectMsgPF() { diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSpec.scala index 07d1b3e84b..64c2e2994d 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSpec.scala @@ -128,7 +128,7 @@ abstract class StatsSampleSpec extends MultiNodeSpec(StatsSampleSpecConfig) } meanWordLength must be(3.875 plusOrMinus 0.001) - testConductor.enter("done-2") + testConductor.enter("done-3") } diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala index c2ea084a18..0712305b4b 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala @@ -111,7 +111,7 @@ abstract class StatsSampleJapiSpec extends MultiNodeSpec(StatsSampleJapiSpecConf } meanWordLength must be(3.875 plusOrMinus 0.001) - testConductor.enter("done-2") + testConductor.enter("done-3") } diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleSingleMasterJapiSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleSingleMasterJapiSpec.scala index 06357f510f..7a5275a7f8 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleSingleMasterJapiSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleSingleMasterJapiSpec.scala @@ -83,11 +83,11 @@ abstract class StatsSampleSingleMasterJapiSpec extends MultiNodeSpec(StatsSample testConductor.enter("all-up") } - "show usage of the statsFacade" in within(5 seconds) { + "show usage of the statsFacade" in within(15 seconds) { val facade = system.actorFor(RootActorPath(node(third).address) / "user" / "statsFacade") // eventually the service should be ok, - // worker nodes might not be up yet + // service and worker nodes might not be up yet awaitCond { facade ! new StatsJob("this is the text that will be analyzed") expectMsgPF() { From ddb03c910db4dc80ff35cf385acd1111de172f33 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Thu, 25 Oct 2012 08:13:41 +0200 Subject: [PATCH 083/210] Wrong message ordering in ClusterDomainEventPublisherSpec, see #2648 * Problem: testActor subscriber sometimes didn't receive expected published message * Reason: the testActor subscribe/unsubscribe in beforeEach/afterEach via different instances of the publisher, therefore the ordering of those messages were not guaranteed, and unsubscribe happend after subscribe * Solution: subscribe directly to the eventStream once, and use separate TestProbe to verify the subscribe/unsubscribe --- .../ClusterDomainEventPublisherSpec.scala | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/akka-cluster/src/test/scala/akka/cluster/ClusterDomainEventPublisherSpec.scala b/akka-cluster/src/test/scala/akka/cluster/ClusterDomainEventPublisherSpec.scala index 0907a3abb8..188c91505c 100644 --- a/akka-cluster/src/test/scala/akka/cluster/ClusterDomainEventPublisherSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/ClusterDomainEventPublisherSpec.scala @@ -16,6 +16,7 @@ import akka.cluster.ClusterEvent._ import akka.testkit.AkkaSpec import akka.testkit.ImplicitSender import akka.actor.ActorRef +import akka.testkit.TestProbe object ClusterDomainEventPublisherSpec { val config = """ @@ -47,14 +48,15 @@ class ClusterDomainEventPublisherSpec extends AkkaSpec(ClusterDomainEventPublish val g4 = Gossip(members = SortedSet(d1, a1, b1, c2)).seen(a1.address) val g5 = Gossip(members = SortedSet(d1, a1, b1, c2)).seen(a1.address).seen(b1.address).seen(c2.address).seen(d1.address) + override def atStartup(): Unit = { + system.eventStream.subscribe(testActor, classOf[ClusterDomainEvent]) + } + override def beforeEach(): Unit = { publisher = system.actorOf(Props[ClusterDomainEventPublisher]) - publisher ! Subscribe(testActor, classOf[ClusterDomainEvent]) - expectMsgType[CurrentClusterState] } override def afterEach(): Unit = { - publisher ! Unsubscribe(testActor, None) system.stop(publisher) } @@ -116,10 +118,23 @@ class ClusterDomainEventPublisherSpec extends AkkaSpec(ClusterDomainEventPublish expectMsgType[SeenChanged] } + "send CurrentClusterState when subscribe" in { + val subscriber = TestProbe() + publisher ! Subscribe(subscriber.ref, classOf[ClusterDomainEvent]) + subscriber.expectMsgType[CurrentClusterState] + // but only to the new subscriber + expectNoMsg(1 second) + } + "support unsubscribe" in { - publisher ! Unsubscribe(testActor, Some(classOf[ClusterDomainEvent])) - publisher ! PublishChanges(g1, g2) - expectNoMsg + val subscriber = TestProbe() + publisher ! Subscribe(subscriber.ref, classOf[ClusterDomainEvent]) + subscriber.expectMsgType[CurrentClusterState] + publisher ! Unsubscribe(subscriber.ref, Some(classOf[ClusterDomainEvent])) + publisher ! PublishChanges(Gossip(members = SortedSet(a1)), Gossip(members = SortedSet(a1, b1))) + subscriber.expectNoMsg(1 second) + // but testActor is still subscriber + expectMsg(MemberUp(b1)) } } From 3ee7dbcc45628eb2256c2e3569d22f8ea4513699 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Viktor=20Klang=20=28=E2=88=9A=29?= Date: Thu, 25 Oct 2012 19:42:48 +0300 Subject: [PATCH 084/210] Update akka-docs/rst/general/supervision.rst #2653 - fixing markup and clarifying warning section of supervision.rst --- akka-docs/rst/general/supervision.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/akka-docs/rst/general/supervision.rst b/akka-docs/rst/general/supervision.rst index 2b747316b2..9659d3f5cd 100644 --- a/akka-docs/rst/general/supervision.rst +++ b/akka-docs/rst/general/supervision.rst @@ -189,10 +189,12 @@ external resource, which may also be one of its own children. If a third party terminates a child by way of the ``system.stop(child)`` method or sending a :class:`PoisonPill`, the supervisor might well be affected. -..warning:: +.. warning:: - DeathWatch for Akka Remote does not (yet) get triggered by connection failures. + DeathWatch for Akka Remote does not (yet) get triggered by connection failures – + which means that if the parent node or the network goes down, nobody will get notified. This feature may be added in a future release of Akka Remoting. + Akka Cluster, however, has such functionality. One-For-One Strategy vs. All-For-One Strategy --------------------------------------------- From b2ba6d4702958e3fe46c9e21cb0136627c4a4b90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Endre=20S=C3=A1ndor=20Varga?= Date: Mon, 22 Oct 2012 17:13:50 +0200 Subject: [PATCH 085/210] Added remoting lifecycle event classes and event publisher --- .../scala/akka/cluster/LargeClusterSpec.scala | 1 - akka-remote/src/main/resources/reference.conf | 6 ++- .../main/scala/akka/remote/netty/Client.scala | 53 +++++++++++-------- .../main/scala/akka/remote/netty/Server.scala | 29 +++++----- 4 files changed, 51 insertions(+), 38 deletions(-) diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/LargeClusterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/LargeClusterSpec.scala index 6465c5ead8..d074da2885 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/LargeClusterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/LargeClusterSpec.scala @@ -55,7 +55,6 @@ object LargeClusterMultiJvmSpec extends MultiNodeConfig { akka.remote.log-remote-lifecycle-events = off akka.remote.netty.execution-pool-size = 4 #akka.remote.netty.reconnection-time-window = 10s - akka.remote.netty.read-timeout = 5s akka.remote.netty.write-timeout = 5s akka.remote.netty.backoff-timeout = 500ms akka.remote.netty.connection-timeout = 500ms diff --git a/akka-remote/src/main/resources/reference.conf b/akka-remote/src/main/resources/reference.conf index a70106a8b2..36bc91a02c 100644 --- a/akka-remote/src/main/resources/reference.conf +++ b/akka-remote/src/main/resources/reference.conf @@ -171,10 +171,12 @@ akka { # (O) Time between reconnect attempts for active clients reconnect-delay = 5s - # (O) Read inactivity period (lowest resolution is seconds) + # (O) Client read inactivity period (finest resolution is seconds) # after which active client connection is shutdown; - # will be re-established in case of new communication requests. + # Connection will be re-established in case of new communication requests. # A value of 0 will turn this feature off + # This value should be left to be 0 when use-passive-connections is off, or if + # no traffic is expected from the server side (i.e. it is a sink). read-timeout = 0s # (O) Write inactivity period (lowest resolution is seconds) diff --git a/akka-remote/src/main/scala/akka/remote/netty/Client.scala b/akka-remote/src/main/scala/akka/remote/netty/Client.scala index 2015f82ac7..7568f859ec 100644 --- a/akka-remote/src/main/scala/akka/remote/netty/Client.scala +++ b/akka-remote/src/main/scala/akka/remote/netty/Client.scala @@ -21,6 +21,7 @@ import akka.util.Switch import scala.util.control.NonFatal import org.jboss.netty.handler.ssl.SslHandler import scala.concurrent.duration._ +import java.nio.channels.ClosedChannelException /** * This is the abstract baseclass for netty remote clients, currently there's only an @@ -63,21 +64,23 @@ private[akka] abstract class RemoteClient private[akka] (val netty: NettyRemoteT private def send(request: (Any, Option[ActorRef], ActorRef)): Unit = { try { val channel = currentChannel - val f = channel.write(request) - f.addListener( - new ChannelFutureListener { - import netty.system.deadLetters - def operationComplete(future: ChannelFuture): Unit = - if (future.isCancelled || !future.isSuccess) request match { - case (msg, sender, recipient) ⇒ deadLetters ! DeadLetter(msg, sender.getOrElse(deadLetters), recipient) - // We don't call notifyListeners here since we don't think failed message deliveries are errors - /// If the connection goes down we'll get the error reporting done by the pipeline. - } - }) - // Check if we should back off - if (!channel.isWritable) { - val backoff = netty.settings.BackoffTimeout - if (backoff.length > 0 && !f.await(backoff.length, backoff.unit)) f.cancel() //Waited as long as we could, now back off + if (channel.isOpen) { + val f = channel.write(request) + f.addListener( + new ChannelFutureListener { + import netty.system.deadLetters + def operationComplete(future: ChannelFuture): Unit = + if (future.isCancelled || !future.isSuccess) request match { + case (msg, sender, recipient) ⇒ deadLetters ! DeadLetter(msg, sender.getOrElse(deadLetters), recipient) + // We don't call notifyListeners here since we don't think failed message deliveries are errors + /// If the connection goes down we'll get the error reporting done by the pipeline. + } + }) + // Check if we should back off + if (!channel.isWritable) { + val backoff = netty.settings.BackoffTimeout + if (backoff.length > 0 && !f.await(backoff.length, backoff.unit)) f.cancel() //Waited as long as we could, now back off + } } } catch { case NonFatal(e) ⇒ netty.notifyListeners(RemoteClientError(e, netty, remoteAddress)) @@ -195,8 +198,11 @@ private[akka] class ActiveRemoteClient private[akka] ( notifyListeners(RemoteClientShutdown(netty, remoteAddress)) try { if ((connection ne null) && (connection.getChannel ne null)) { - ChannelAddress.remove(connection.getChannel) - connection.getChannel.close() + val channel = connection.getChannel + ChannelAddress.remove(channel) + // Try to disconnect first to reduce "connection reset by peer" events + if (channel.isConnected) channel.disconnect() + if (channel.isOpen) channel.close() } } finally { try { @@ -267,10 +273,8 @@ private[akka] class ActiveRemoteClientHandler( case CommandType.SHUTDOWN ⇒ runOnceNow { client.netty.shutdownClientConnection(remoteAddress) } case _ ⇒ //Ignore others } - case arp: AkkaRemoteProtocol if arp.hasMessage ⇒ client.netty.receiveMessage(new RemoteMessage(arp.getMessage, client.netty.system)) - case other ⇒ throw new RemoteClientException("Unknown message received in remote client handler: " + other, client.netty, client.remoteAddress) } @@ -307,9 +311,14 @@ private[akka] class ActiveRemoteClientHandler( } override def exceptionCaught(ctx: ChannelHandlerContext, event: ExceptionEvent) = { - val cause = if (event.getCause ne null) event.getCause else new Exception("Unknown cause") - client.notifyListeners(RemoteClientError(cause, client.netty, client.remoteAddress)) - event.getChannel.close() + val cause = if (event.getCause ne null) event.getCause else new AkkaException("Unknown cause") + cause match { + case _: ClosedChannelException ⇒ // Ignore + case NonFatal(e) ⇒ + client.notifyListeners(RemoteClientError(e, client.netty, client.remoteAddress)) + event.getChannel.close() + case e: Throwable ⇒ throw e // Rethrow fatals + } } } diff --git a/akka-remote/src/main/scala/akka/remote/netty/Server.scala b/akka-remote/src/main/scala/akka/remote/netty/Server.scala index 16269a43a2..3de64ca0a9 100644 --- a/akka-remote/src/main/scala/akka/remote/netty/Server.scala +++ b/akka-remote/src/main/scala/akka/remote/netty/Server.scala @@ -3,21 +3,19 @@ */ package akka.remote.netty +import akka.actor.Address +import akka.remote.RemoteProtocol.{ RemoteControlProtocol, CommandType, AkkaRemoteProtocol } +import akka.remote._ +import java.net.InetAddress import java.net.InetSocketAddress +import java.nio.channels.ClosedChannelException import java.util.concurrent.Executors -import scala.Option.option2Iterable import org.jboss.netty.bootstrap.ServerBootstrap -import org.jboss.netty.channel.ChannelHandler.Sharable +import org.jboss.netty.channel._ import org.jboss.netty.channel.group.ChannelGroup import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory -import org.jboss.netty.handler.codec.frame.{ LengthFieldPrepender, LengthFieldBasedFrameDecoder } -import org.jboss.netty.handler.execution.ExecutionHandler -import akka.remote.RemoteProtocol.{ RemoteControlProtocol, CommandType, AkkaRemoteProtocol } -import akka.remote.{ RemoteServerShutdown, RemoteServerError, RemoteServerClientDisconnected, RemoteServerClientConnected, RemoteServerClientClosed, RemoteProtocol, RemoteMessage } -import akka.actor.Address -import java.net.InetAddress -import akka.actor.ActorSystemImpl -import org.jboss.netty.channel._ +import scala.util.control.NonFatal +import akka.AkkaException private[akka] class NettyRemoteServer(val netty: NettyRemoteTransport) { @@ -154,7 +152,6 @@ private[akka] class RemoteServerHandler( event.getMessage match { case remote: AkkaRemoteProtocol if remote.hasMessage ⇒ netty.receiveMessage(new RemoteMessage(remote.getMessage, netty.system)) - case remote: AkkaRemoteProtocol if remote.hasInstruction ⇒ val instruction = remote.getInstruction instruction.getCommandType match { @@ -179,8 +176,14 @@ private[akka] class RemoteServerHandler( } override def exceptionCaught(ctx: ChannelHandlerContext, event: ExceptionEvent) = { - netty.notifyListeners(RemoteServerError(event.getCause, netty)) - event.getChannel.close() + val cause = if (event.getCause ne null) event.getCause else new AkkaException("Unknown cause") + cause match { + case _: ClosedChannelException ⇒ // Ignore + case NonFatal(e) ⇒ + netty.notifyListeners(RemoteServerError(e, netty)) + event.getChannel.close() + case e: Throwable ⇒ throw e // Rethrow fatals + } } } From 06199e3f8f6b27e63895495b9b358aee140d0239 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Fri, 26 Oct 2012 16:56:23 +0200 Subject: [PATCH 086/210] MatchError in RemoteDaemon case AddressTerminated, see #2660 --- akka-remote/src/main/scala/akka/remote/RemoteDaemon.scala | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/akka-remote/src/main/scala/akka/remote/RemoteDaemon.scala b/akka-remote/src/main/scala/akka/remote/RemoteDaemon.scala index f6e000737a..ee8a6c5698 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteDaemon.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteDaemon.scala @@ -102,7 +102,10 @@ private[akka] class RemoteSystemDaemon( } case AddressTerminated(address) ⇒ - foreachChild { case a: InternalActorRef if a.getParent.path.address == address ⇒ system.stop(a) } + foreachChild { + case a: InternalActorRef if a.getParent.path.address == address ⇒ system.stop(a) + case _ ⇒ // skip, this child doesn't belong to the terminated address + } case unknown ⇒ log.warning("Unknown message {} received by {}", unknown, this) } From 7be1f4b55ede536c79f5b7df8b19da1e4b1ed113 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Mon, 29 Oct 2012 15:36:11 +0100 Subject: [PATCH 087/210] #2658 - Fixing todo sections of the documentation documentation ;-) --- akka-docs/rst/dev/documentation.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/akka-docs/rst/dev/documentation.rst b/akka-docs/rst/dev/documentation.rst index ad8ff244ae..b5745db46a 100644 --- a/akka-docs/rst/dev/documentation.rst +++ b/akka-docs/rst/dev/documentation.rst @@ -17,13 +17,12 @@ built using `Sphinx`_. Sphinx ====== -More to come... - +For more details see `The Sphinx Documentation `_ reStructuredText ================ -More to come... +For more details see `The reST Quickref `_ Sections -------- From 8ee11349bcff8875ec7006beffcef03eb7caa733 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Mon, 29 Oct 2012 16:02:37 +0100 Subject: [PATCH 088/210] #2655 - Hardinging the LocalActorRefProviderSpec --- .../test/scala/akka/actor/LocalActorRefProviderSpec.scala | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/actor/LocalActorRefProviderSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/LocalActorRefProviderSpec.scala index d9586c1f50..a768089415 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/LocalActorRefProviderSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/LocalActorRefProviderSpec.scala @@ -43,9 +43,10 @@ class LocalActorRefProviderSpec extends AkkaSpec(LocalActorRefProviderSpec.confi val childName = "akka%3A%2F%2FClusterSystem%40127.0.0.1%3A2552" val a = system.actorOf(Props(new Actor { val child = context.actorOf(Props.empty, name = childName) - assert(childName == child.path.name) def receive = { - case "lookup" ⇒ sender ! context.actorFor(childName) + case "lookup" ⇒ + if (childName == child.path.name) sender ! context.actorFor(childName) + else sender ! s"§childName is not ${child.path.name}!" } })) a.tell("lookup", testActor) From d01ea366ce2805557d29044de01f73071bdab53b Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Mon, 29 Oct 2012 23:07:06 +0100 Subject: [PATCH 089/210] #2661 - Changing ignoreMsg of TestProbe to take a PF from Any instead of AnyRef, to support primitives --- akka-testkit/src/main/scala/akka/testkit/TestKit.scala | 4 ++-- .../src/test/scala/akka/testkit/TestProbeSpec.scala | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/akka-testkit/src/main/scala/akka/testkit/TestKit.scala b/akka-testkit/src/main/scala/akka/testkit/TestKit.scala index b466b8a9d8..4f6744b74b 100644 --- a/akka-testkit/src/main/scala/akka/testkit/TestKit.scala +++ b/akka-testkit/src/main/scala/akka/testkit/TestKit.scala @@ -16,7 +16,7 @@ import scala.annotation.varargs import scala.reflect.ClassTag object TestActor { - type Ignore = Option[PartialFunction[AnyRef, Boolean]] + type Ignore = Option[PartialFunction[Any, Boolean]] abstract class AutoPilot { def run(sender: ActorRef, msg: Any): AutoPilot @@ -138,7 +138,7 @@ trait TestKitBase { * Ignore all messages in the test actor for which the given partial * function returns true. */ - def ignoreMsg(f: PartialFunction[AnyRef, Boolean]) { testActor ! TestActor.SetIgnore(Some(f)) } + def ignoreMsg(f: PartialFunction[Any, Boolean]) { testActor ! TestActor.SetIgnore(Some(f)) } /** * Stop ignoring messages in the test actor. diff --git a/akka-testkit/src/test/scala/akka/testkit/TestProbeSpec.scala b/akka-testkit/src/test/scala/akka/testkit/TestProbeSpec.scala index a413aa86a9..72e5b3a8c0 100644 --- a/akka-testkit/src/test/scala/akka/testkit/TestProbeSpec.scala +++ b/akka-testkit/src/test/scala/akka/testkit/TestProbeSpec.scala @@ -78,6 +78,13 @@ class TestProbeSpec extends AkkaSpec with DefaultTimeout { expectMsgAllClassOf(5 seconds, classOf[Int]) must be(Seq(42)) } + "be able to ignore primitive types" in { + ignoreMsg { case 42 ⇒ true } + testActor ! 42 + testActor ! "pigdog" + expectMsg("pigdog") + } + } } From 49500ab248e96c1a352c638dc205b895151985af Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Fri, 26 Oct 2012 11:42:18 +0200 Subject: [PATCH 090/210] Use full address when hashing routees, see #2657 * Problem: ConsistentHashingRouter used on different nodes with remote and local routees doesn't route to same targets. * Reason: Full address, with host and port was not used in the representation of the routees, which produced different hash rings on different nodes. * Solution: Fill in full address in the toString representation for LocalActorRef * IMPORTANT: Discovered that rootPath of the provider didn't include the full address. It is documented that it should and I needed that to be able to grab the address without depending on remoting. This caused changes in RemoteActorRefProvider. Initialization order is a bit scary there. --- .../scala/akka/routing/ConsistentHash.scala | 6 ++-- .../routing/ConsistentHashingRouter.scala | 33 +++++++++++++++---- .../akka/remote/RemoteActorRefProvider.scala | 22 ++++++++----- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/akka-actor/src/main/scala/akka/routing/ConsistentHash.scala b/akka-actor/src/main/scala/akka/routing/ConsistentHash.scala index d3bef92e6c..819fea2586 100644 --- a/akka-actor/src/main/scala/akka/routing/ConsistentHash.scala +++ b/akka-actor/src/main/scala/akka/routing/ConsistentHash.scala @@ -120,8 +120,10 @@ object ConsistentHash { apply(nodes.asScala, virtualNodesFactor)(ClassTag(classOf[Any].asInstanceOf[Class[T]])) } - private def nodeHashFor(node: Any, vnode: Int): Int = - hashFor((node + ":" + vnode).getBytes("UTF-8")) + private def nodeHashFor(node: Any, vnode: Int): Int = { + val baseStr = node.toString + ":" + hashFor(baseStr + vnode) + } private def hashFor(bytes: Array[Byte]): Int = MurmurHash.arrayHash(bytes) diff --git a/akka-actor/src/main/scala/akka/routing/ConsistentHashingRouter.scala b/akka-actor/src/main/scala/akka/routing/ConsistentHashingRouter.scala index 71a36be2b7..ca9027c8e8 100644 --- a/akka-actor/src/main/scala/akka/routing/ConsistentHashingRouter.scala +++ b/akka-actor/src/main/scala/akka/routing/ConsistentHashingRouter.scala @@ -12,6 +12,8 @@ import akka.dispatch.Dispatchers import akka.event.Logging import akka.serialization.SerializationExtension import java.util.concurrent.atomic.AtomicReference +import akka.actor.Address +import akka.actor.ExtendedActorSystem object ConsistentHashingRouter { /** @@ -238,20 +240,22 @@ trait ConsistentHashingLike { this: RouterConfig ⇒ } val log = Logging(routeeProvider.context.system, routeeProvider.context.self) + val selfAddress = routeeProvider.context.system.asInstanceOf[ExtendedActorSystem].provider.rootPath.address val vnodes = if (virtualNodesFactor == 0) routeeProvider.context.system.settings.DefaultVirtualNodesFactor else virtualNodesFactor // tuple of routees and the ConsistentHash, updated together in updateConsistentHash - val consistentHashRef = new AtomicReference[(IndexedSeq[ActorRef], ConsistentHash[ActorRef])]((null, null)) + val consistentHashRef = new AtomicReference[(IndexedSeq[ConsistentActorRef], ConsistentHash[ConsistentActorRef])]((null, null)) updateConsistentHash() // update consistentHash when routees has changed // changes to routees are rare and when no changes this is a quick operation - def updateConsistentHash(): ConsistentHash[ActorRef] = { + def updateConsistentHash(): ConsistentHash[ConsistentActorRef] = { val oldConsistentHashTuple = consistentHashRef.get val (oldConsistentHashRoutees, oldConsistentHash) = oldConsistentHashTuple - val currentRoutees = routeeProvider.routees + val currentRoutees = routeeProvider.routees map { ConsistentActorRef(_, selfAddress) } + if (currentRoutees ne oldConsistentHashRoutees) { // when other instance, same content, no need to re-hash, but try to set routees val consistentHash = @@ -267,9 +271,9 @@ trait ConsistentHashingLike { this: RouterConfig ⇒ val currentConsistenHash = updateConsistentHash() if (currentConsistenHash.isEmpty) routeeProvider.context.system.deadLetters else hashData match { - case bytes: Array[Byte] ⇒ currentConsistenHash.nodeFor(bytes) - case str: String ⇒ currentConsistenHash.nodeFor(str) - case x: AnyRef ⇒ currentConsistenHash.nodeFor(SerializationExtension(routeeProvider.context.system).serialize(x).get) + case bytes: Array[Byte] ⇒ currentConsistenHash.nodeFor(bytes).actorRef + case str: String ⇒ currentConsistenHash.nodeFor(str).actorRef + case x: AnyRef ⇒ currentConsistenHash.nodeFor(SerializationExtension(routeeProvider.context.system).serialize(x).get).actorRef } } catch { case NonFatal(e) ⇒ @@ -294,4 +298,21 @@ trait ConsistentHashingLike { this: RouterConfig ⇒ } } +} + +/** + * INTERNAL API + * Important to use ActorRef with full address, with host and port, in the hash ring, + * so that same ring is produced on different nodes. + * The ConsistentHash uses toString of the ring nodes, and the ActorRef itself + * isn't a good representation, because LocalActorRef doesn't include the + * host and port. + */ +private[akka] case class ConsistentActorRef(actorRef: ActorRef, selfAddress: Address) { + override def toString: String = { + actorRef.path.address match { + case Address(_, _, None, None) ⇒ actorRef.path.toStringWithAddress(selfAddress) + case a ⇒ actorRef.path.toString + } + } } \ No newline at end of file diff --git a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala index 1d9ad9edc2..4967978582 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala @@ -32,7 +32,9 @@ class RemoteActorRefProvider( private var _log = local.log def log: LoggingAdapter = _log - override def rootPath: ActorPath = local.rootPath + @volatile + private var _rootPath = local.rootPath + override def rootPath: ActorPath = _rootPath override def deadLetters: InternalActorRef = local.deadLetters // these are only available after init() @@ -61,7 +63,7 @@ class RemoteActorRefProvider( def init(system: ActorSystemImpl): Unit = { local.init(system) - _remoteDaemon = new RemoteSystemDaemon(system, rootPath / "remote", rootGuardian, log, untrustedMode = remoteSettings.UntrustedMode) + _remoteDaemon = new RemoteSystemDaemon(system, local.rootPath / "remote", rootGuardian, log, untrustedMode = remoteSettings.UntrustedMode) local.registerExtraNames(Map(("remote", remoteDaemon))) _serialization = SerializationExtension(system) @@ -82,6 +84,8 @@ class RemoteActorRefProvider( // this enables reception of remote requests _transport.start() + _rootPath = RootActorPath(local.rootPath.address.copy(host = transport.address.host, port = transport.address.port)) + val remoteClientLifeCycleHandler = system.systemActorOf(Props(new Actor { def receive = { case RemoteClientError(cause, remote, address) ⇒ remote.shutdownClientConnection(address) @@ -154,7 +158,7 @@ class RemoteActorRefProvider( Iterator(props.deploy) ++ deployment.iterator reduce ((a, b) ⇒ b withFallback a) match { case d @ Deploy(_, _, _, RemoteScope(addr)) ⇒ - if (addr == rootPath.address || addr == transport.address) { + if (isSelfAddress(addr)) { local.actorOf(system, props, supervisor, path, false, deployment.headOption, false, async) } else { val rpath = RootActorPath(addr) / "remote" / transport.address.hostPort / path.elements @@ -167,12 +171,12 @@ class RemoteActorRefProvider( } def actorFor(path: ActorPath): InternalActorRef = - if (path.address == rootPath.address || path.address == transport.address) actorFor(rootGuardian, path.elements) + if (isSelfAddress(path.address)) actorFor(rootGuardian, path.elements) else new RemoteActorRef(this, transport, path, Nobody, props = None, deploy = None) def actorFor(ref: InternalActorRef, path: String): InternalActorRef = path match { case ActorPathExtractor(address, elems) ⇒ - if (address == rootPath.address || address == transport.address) actorFor(rootGuardian, elems) + if (isSelfAddress(address)) actorFor(rootGuardian, elems) else new RemoteActorRef(this, transport, new RootActorPath(address) / elems, Nobody, props = None, deploy = None) case _ ⇒ local.actorFor(ref, path) } @@ -190,14 +194,16 @@ class RemoteActorRefProvider( } def getExternalAddressFor(addr: Address): Option[Address] = { - val ta = transport.address - val ra = rootPath.address addr match { - case `ta` | `ra` ⇒ Some(rootPath.address) + case _ if isSelfAddress(addr) ⇒ Some(local.rootPath.address) case Address("akka", _, Some(_), Some(_)) ⇒ Some(transport.address) case _ ⇒ None } } + + private def isSelfAddress(address: Address): Boolean = + address == local.rootPath.address || address == rootPath.address || address == transport.address + } private[akka] trait RemoteRef extends ActorRefScope { From d46f6264794a91fbc58337c434448aba04b65b7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Antonsson?= Date: Mon, 29 Oct 2012 14:37:39 +0100 Subject: [PATCH 091/210] Limit the number of netty worker threads based on configuration. #2659 --- .../src/main/resources/reference.conf | 32 +++++++++++++++++++ .../akka/remote/testconductor/Conductor.scala | 2 +- .../akka/remote/testconductor/Extension.scala | 26 +++++++++++---- .../akka/remote/testconductor/Player.scala | 6 ++-- .../testconductor/RemoteConnection.scala | 8 +++-- akka-remote/src/main/resources/reference.conf | 30 +++++++++++++++++ .../remote/netty/NettyRemoteSupport.scala | 3 +- .../main/scala/akka/remote/netty/Server.scala | 3 +- .../scala/akka/remote/netty/Settings.scala | 11 +++++++ .../scala/akka/remote/RemoteConfigSpec.scala | 25 +++++++++++++++ 10 files changed, 131 insertions(+), 15 deletions(-) diff --git a/akka-remote-tests/src/main/resources/reference.conf b/akka-remote-tests/src/main/resources/reference.conf index 40c16c4ccd..7ad9bf6e76 100644 --- a/akka-remote-tests/src/main/resources/reference.conf +++ b/akka-remote-tests/src/main/resources/reference.conf @@ -29,5 +29,37 @@ akka { # minimum time interval which is to be inserted between reconnect attempts reconnect-backoff = 1s + + netty { + # (I&O) Used to configure the number of I/O worker threads on server sockets + server-socket-worker-pool { + # Min number of threads to cap factor-based number to + pool-size-min = 1 + + # The pool size factor is used to determine thread pool size + # using the following formula: ceil(available processors * factor). + # Resulting size is then bounded by the pool-size-min and + # pool-size-max values. + pool-size-factor = 1.0 + + # Max number of threads to cap factor-based number to + pool-size-max = 2 + } + + # (I&O) Used to configure the number of I/O worker threads on client sockets + client-socket-worker-pool { + # Min number of threads to cap factor-based number to + pool-size-min = 1 + + # The pool size factor is used to determine thread pool size + # using the following formula: ceil(available processors * factor). + # Resulting size is then bounded by the pool-size-min and + # pool-size-max values. + pool-size-factor = 1.0 + + # Max number of threads to cap factor-based number to + pool-size-max = 2 + } + } } } \ No newline at end of file diff --git a/akka-remote-tests/src/main/scala/akka/remote/testconductor/Conductor.scala b/akka-remote-tests/src/main/scala/akka/remote/testconductor/Conductor.scala index eae82b6e6d..25837cbb71 100644 --- a/akka-remote-tests/src/main/scala/akka/remote/testconductor/Conductor.scala +++ b/akka-remote-tests/src/main/scala/akka/remote/testconductor/Conductor.scala @@ -391,7 +391,7 @@ private[akka] class Controller(private var initialParticipants: Int, controllerP import BarrierCoordinator._ val settings = TestConductor().Settings - val connection = RemoteConnection(Server, controllerPort, + val connection = RemoteConnection(Server, controllerPort, settings.ServerSocketWorkerPoolSize, new ConductorHandler(settings.QueryTimeout, self, Logging(context.system, "ConductorHandler"))) /* diff --git a/akka-remote-tests/src/main/scala/akka/remote/testconductor/Extension.scala b/akka-remote-tests/src/main/scala/akka/remote/testconductor/Extension.scala index 07a6c9c22f..62eca3128d 100644 --- a/akka-remote-tests/src/main/scala/akka/remote/testconductor/Extension.scala +++ b/akka-remote-tests/src/main/scala/akka/remote/testconductor/Extension.scala @@ -6,6 +6,8 @@ import akka.util.Timeout import java.util.concurrent.TimeUnit.MILLISECONDS import java.util.concurrent.ConcurrentHashMap import scala.concurrent.duration.Duration +import com.typesafe.config.Config +import akka.dispatch.ThreadPoolConfig /** * Access to the [[akka.remote.testconductor.TestConductorExt]] extension: @@ -41,15 +43,25 @@ object TestConductor extends ExtensionKey[TestConductorExt] { class TestConductorExt(val system: ExtendedActorSystem) extends Extension with Conductor with Player { object Settings { - val config = system.settings.config + val config = system.settings.config.getConfig("akka.testconductor") - val ConnectTimeout = Duration(config.getMilliseconds("akka.testconductor.connect-timeout"), MILLISECONDS) - val ClientReconnects = config.getInt("akka.testconductor.client-reconnects") - val ReconnectBackoff = Duration(config.getMilliseconds("akka.testconductor.reconnect-backoff"), MILLISECONDS) + val ConnectTimeout = Duration(config.getMilliseconds("connect-timeout"), MILLISECONDS) + val ClientReconnects = config.getInt("client-reconnects") + val ReconnectBackoff = Duration(config.getMilliseconds("reconnect-backoff"), MILLISECONDS) - implicit val BarrierTimeout = Timeout(Duration(config.getMilliseconds("akka.testconductor.barrier-timeout"), MILLISECONDS)) - implicit val QueryTimeout = Timeout(Duration(config.getMilliseconds("akka.testconductor.query-timeout"), MILLISECONDS)) - val PacketSplitThreshold = Duration(config.getMilliseconds("akka.testconductor.packet-split-threshold"), MILLISECONDS) + implicit val BarrierTimeout = Timeout(Duration(config.getMilliseconds("barrier-timeout"), MILLISECONDS)) + implicit val QueryTimeout = Timeout(Duration(config.getMilliseconds("query-timeout"), MILLISECONDS)) + val PacketSplitThreshold = Duration(config.getMilliseconds("packet-split-threshold"), MILLISECONDS) + + private def computeWPS(config: Config): Int = + ThreadPoolConfig.scaledPoolSize( + config.getInt("pool-size-min"), + config.getDouble("pool-size-factor"), + config.getInt("pool-size-max")) + + val ServerSocketWorkerPoolSize = computeWPS(config.getConfig("netty.server-socket-worker-pool")) + + val ClientSocketWorkerPoolSize = computeWPS(config.getConfig("netty.client-socket-worker-pool")) } /** diff --git a/akka-remote-tests/src/main/scala/akka/remote/testconductor/Player.scala b/akka-remote-tests/src/main/scala/akka/remote/testconductor/Player.scala index 1442558362..2a3957d146 100644 --- a/akka-remote-tests/src/main/scala/akka/remote/testconductor/Player.scala +++ b/akka-remote-tests/src/main/scala/akka/remote/testconductor/Player.scala @@ -143,7 +143,8 @@ private[akka] class ClientFSM(name: RoleName, controllerAddr: InetSocketAddress) val settings = TestConductor().Settings val handler = new PlayerHandler(controllerAddr, settings.ClientReconnects, settings.ReconnectBackoff, - self, Logging(context.system, "PlayerHandler"), context.system.scheduler)(context.dispatcher) + settings.ClientSocketWorkerPoolSize, self, Logging(context.system, "PlayerHandler"), + context.system.scheduler)(context.dispatcher) startWith(Connecting, Data(None, None)) @@ -254,6 +255,7 @@ private[akka] class PlayerHandler( server: InetSocketAddress, private var reconnects: Int, backoff: FiniteDuration, + poolSize: Int, fsm: ActorRef, log: LoggingAdapter, scheduler: Scheduler)(implicit executor: ExecutionContext) @@ -283,7 +285,7 @@ private[akka] class PlayerHandler( private def reconnect(): Unit = { nextAttempt = Deadline.now + backoff - RemoteConnection(Client, server, this) + RemoteConnection(Client, server, poolSize, this) } override def channelConnected(ctx: ChannelHandlerContext, event: ChannelStateEvent) = { diff --git a/akka-remote-tests/src/main/scala/akka/remote/testconductor/RemoteConnection.scala b/akka-remote-tests/src/main/scala/akka/remote/testconductor/RemoteConnection.scala index 1979857bf0..db212e7cbf 100644 --- a/akka-remote-tests/src/main/scala/akka/remote/testconductor/RemoteConnection.scala +++ b/akka-remote-tests/src/main/scala/akka/remote/testconductor/RemoteConnection.scala @@ -45,16 +45,18 @@ private[akka] case object Server extends Role * INTERNAL API. */ private[akka] object RemoteConnection { - def apply(role: Role, sockaddr: InetSocketAddress, handler: ChannelUpstreamHandler): Channel = { + def apply(role: Role, sockaddr: InetSocketAddress, poolSize: Int, handler: ChannelUpstreamHandler): Channel = { role match { case Client ⇒ - val socketfactory = new NioClientSocketChannelFactory(Executors.newCachedThreadPool, Executors.newCachedThreadPool) + val socketfactory = new NioClientSocketChannelFactory(Executors.newCachedThreadPool, Executors.newCachedThreadPool, + poolSize) val bootstrap = new ClientBootstrap(socketfactory) bootstrap.setPipelineFactory(new TestConductorPipelineFactory(handler)) bootstrap.setOption("tcpNoDelay", true) bootstrap.connect(sockaddr).getChannel case Server ⇒ - val socketfactory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool, Executors.newCachedThreadPool) + val socketfactory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool, Executors.newCachedThreadPool, + poolSize) val bootstrap = new ServerBootstrap(socketfactory) bootstrap.setPipelineFactory(new TestConductorPipelineFactory(handler)) bootstrap.setOption("reuseAddress", true) diff --git a/akka-remote/src/main/resources/reference.conf b/akka-remote/src/main/resources/reference.conf index a70106a8b2..cc8818a3be 100644 --- a/akka-remote/src/main/resources/reference.conf +++ b/akka-remote/src/main/resources/reference.conf @@ -244,6 +244,36 @@ akka { # suite (see enabled-algorithms section above) random-number-generator = "" } + + # (I&O) Used to configure the number of I/O worker threads on server sockets + server-socket-worker-pool { + # Min number of threads to cap factor-based number to + pool-size-min = 2 + + # The pool size factor is used to determine thread pool size + # using the following formula: ceil(available processors * factor). + # Resulting size is then bounded by the pool-size-min and + # pool-size-max values. + pool-size-factor = 1.0 + + # Max number of threads to cap factor-based number to + pool-size-max = 8 + } + + # (I&O) Used to configure the number of I/O worker threads on client sockets + client-socket-worker-pool { + # Min number of threads to cap factor-based number to + pool-size-min = 2 + + # The pool size factor is used to determine thread pool size + # using the following formula: ceil(available processors * factor). + # Resulting size is then bounded by the pool-size-min and + # pool-size-max values. + pool-size-factor = 1.0 + + # Max number of threads to cap factor-based number to + pool-size-max = 8 + } } } } diff --git a/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala b/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala index 6e36c63024..de95ad1e8d 100644 --- a/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala +++ b/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala @@ -45,7 +45,8 @@ private[akka] class NettyRemoteTransport(_system: ExtendedActorSystem, _provider val d = system.dispatchers.lookup(id) new NioClientSocketChannelFactory(d, d) case None ⇒ - new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()) + new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool(), + settings.ClientSocketWorkerPoolSize) } /** diff --git a/akka-remote/src/main/scala/akka/remote/netty/Server.scala b/akka-remote/src/main/scala/akka/remote/netty/Server.scala index 16269a43a2..1f083bcab5 100644 --- a/akka-remote/src/main/scala/akka/remote/netty/Server.scala +++ b/akka-remote/src/main/scala/akka/remote/netty/Server.scala @@ -31,7 +31,8 @@ private[akka] class NettyRemoteServer(val netty: NettyRemoteTransport) { val d = netty.system.dispatchers.lookup(id) new NioServerSocketChannelFactory(d, d) case None ⇒ - new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()) + new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool(), + settings.ServerSocketWorkerPoolSize) } // group of open channels, used for clean-up diff --git a/akka-remote/src/main/scala/akka/remote/netty/Settings.scala b/akka-remote/src/main/scala/akka/remote/netty/Settings.scala index c9fb4aff9a..7c1ca16540 100644 --- a/akka-remote/src/main/scala/akka/remote/netty/Settings.scala +++ b/akka-remote/src/main/scala/akka/remote/netty/Settings.scala @@ -10,6 +10,7 @@ import java.net.InetAddress import akka.ConfigurationException import scala.collection.JavaConverters.iterableAsScalaIterableConverter import scala.concurrent.duration.FiniteDuration +import akka.dispatch.ThreadPoolConfig private[akka] class NettySettings(config: Config, val systemName: String) { @@ -139,4 +140,14 @@ private[akka] class NettySettings(config: Config, val systemName: String) { } enableSSL } + + private def computeWPS(config: Config): Int = + ThreadPoolConfig.scaledPoolSize( + config.getInt("pool-size-min"), + config.getDouble("pool-size-factor"), + config.getInt("pool-size-max")) + + val ServerSocketWorkerPoolSize = computeWPS(config.getConfig("server-socket-worker-pool")) + + val ClientSocketWorkerPoolSize = computeWPS(config.getConfig("client-socket-worker-pool")) } diff --git a/akka-remote/src/test/scala/akka/remote/RemoteConfigSpec.scala b/akka-remote/src/test/scala/akka/remote/RemoteConfigSpec.scala index 5355433d69..45b6ad5610 100644 --- a/akka-remote/src/test/scala/akka/remote/RemoteConfigSpec.scala +++ b/akka-remote/src/test/scala/akka/remote/RemoteConfigSpec.scala @@ -62,7 +62,32 @@ class RemoteConfigSpec extends AkkaSpec( WriteBufferLowWaterMark must be(None) SendBufferSize must be(None) ReceiveBufferSize must be(None) + ServerSocketWorkerPoolSize must be >= (2) + ServerSocketWorkerPoolSize must be <= (8) + ClientSocketWorkerPoolSize must be >= (2) + ClientSocketWorkerPoolSize must be <= (8) } + "contain correct configuration values in reference.conf" in { + val c = system.asInstanceOf[ExtendedActorSystem]. + provider.asInstanceOf[RemoteActorRefProvider]. + remoteSettings.config.getConfig("akka.remote.netty") + + // server-socket-worker-pool + { + val pool = c.getConfig("server-socket-worker-pool") + pool.getInt("pool-size-min") must equal(2) + pool.getDouble("pool-size-factor") must equal(1.0) + pool.getInt("pool-size-max") must equal(8) + } + + // client-socket-worker-pool + { + val pool = c.getConfig("client-socket-worker-pool") + pool.getInt("pool-size-min") must equal(2) + pool.getDouble("pool-size-factor") must equal(1.0) + pool.getInt("pool-size-max") must equal(8) + } + } } } From 0d9d877b0cda932a012eb513b3ea251221d5a15a Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Tue, 30 Oct 2012 07:33:00 +0100 Subject: [PATCH 092/210] Correction of remote-tests-experimental proj name --- scripts/multi-node-log-replace.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/multi-node-log-replace.sh b/scripts/multi-node-log-replace.sh index 8e8af7112a..3bee844c2d 100755 --- a/scripts/multi-node-log-replace.sh +++ b/scripts/multi-node-log-replace.sh @@ -22,4 +22,4 @@ # check for an sbt command type -P sbt &> /dev/null || fail "sbt command not found" -sbt "project akka-remote-tests" "test:run-main akka.remote.testkit.LogRoleReplace $1 $2" \ No newline at end of file +sbt "project akka-remote-tests-experimental" "test:run-main akka.remote.testkit.LogRoleReplace $1 $2" From 545becacfe2a0b6e98af583f74fcf90b5c890ec2 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Tue, 30 Oct 2012 09:28:45 +0100 Subject: [PATCH 093/210] Use withDefaultValue instead of withDefault * Just minor boy scouting cleanup --- akka-actor/src/main/scala/akka/util/SubclassifiedIndex.scala | 2 +- .../main/scala/akka/cluster/routing/ClusterRouterConfig.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/akka-actor/src/main/scala/akka/util/SubclassifiedIndex.scala b/akka-actor/src/main/scala/akka/util/SubclassifiedIndex.scala index ae82da6407..565d50e636 100644 --- a/akka-actor/src/main/scala/akka/util/SubclassifiedIndex.scala +++ b/akka-actor/src/main/scala/akka/util/SubclassifiedIndex.scala @@ -55,7 +55,7 @@ private[akka] object SubclassifiedIndex { } private[SubclassifiedIndex] def emptyMergeMap[K, V] = internalEmptyMergeMap.asInstanceOf[Map[K, Set[V]]] - private[this] val internalEmptyMergeMap = Map[AnyRef, Set[AnyRef]]().withDefault(_ ⇒ Set[AnyRef]()) + private[this] val internalEmptyMergeMap = Map[AnyRef, Set[AnyRef]]().withDefaultValue(Set[AnyRef]()) } /** diff --git a/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala b/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala index bdbb1297fb..ef99ced2d8 100644 --- a/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala +++ b/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala @@ -202,7 +202,7 @@ private[akka] class ClusterRouteeProvider( } else { // find the node with least routees val numberOfRouteesPerNode: Map[Address, Int] = - currentRoutees.foldLeft(currentNodes.map(_ -> 0).toMap.withDefault(_ ⇒ 0)) { (acc, x) ⇒ + currentRoutees.foldLeft(currentNodes.map(_ -> 0).toMap.withDefaultValue(0)) { (acc, x) ⇒ val address = fullAddress(x) acc + (address -> (acc(address) + 1)) } From 0b2d3df67e2fea0935880b9650cb937d6c8233a0 Mon Sep 17 00:00:00 2001 From: "Kaspar Fischer (hbf)" Date: Wed, 31 Oct 2012 13:17:59 +0100 Subject: [PATCH 094/210] contribution module throttle --- akka-contrib/docs/index.rst | 1 + akka-contrib/docs/throttle.rst | 60 ++++ akka-contrib/docs/throttler.png | Bin 0 -> 4036 bytes .../throttle/TimerBasedThrottler.scala | 294 ++++++++++++++++++ .../throttle/TimerBasedThrottlerSpec.scala | 144 +++++++++ 5 files changed, 499 insertions(+) create mode 100644 akka-contrib/docs/throttle.rst create mode 100644 akka-contrib/docs/throttler.png create mode 100644 akka-contrib/src/main/scala/akka/contrib/throttle/TimerBasedThrottler.scala create mode 100644 akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala diff --git a/akka-contrib/docs/index.rst b/akka-contrib/docs/index.rst index 9f5b57c513..5303c21c6d 100644 --- a/akka-contrib/docs/index.rst +++ b/akka-contrib/docs/index.rst @@ -29,6 +29,7 @@ The Current List of Modules .. toctree:: reliable-proxy + throttle Suggested Way of Using these Contributions ------------------------------------------ diff --git a/akka-contrib/docs/throttle.rst b/akka-contrib/docs/throttle.rst new file mode 100644 index 0000000000..ab60fb6b96 --- /dev/null +++ b/akka-contrib/docs/throttle.rst @@ -0,0 +1,60 @@ +Throttling Actor Messages +========================= + +Introduction +------------ + +Suppose you are writing an application that makes HTTP requests to an external +web service and that this web service has a restriction in place: you may not +make more than 10 requests in 1 minute. You will get blocked or need to pay if +you don’t stay under this limit. In such a scenario you will want to employ +a *message throttler*. + +This extension module provides a simple implementation of a throttling actor, +the :class:`TimerBasedThrottler`. + + +How to use it +------------- + +You can use a :class:`TimerBasedThrottler` as follows: + +.. includecode:: @contribSrc@/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala#demo-code + +Please refer to the ScalaDoc documentation for the details. + + +The guarantees +-------------- + +:class:`TimerBasedThrottler` uses a timer internally. When the throttler’s rate is 3 msg/s, +for example, the throttler will start a timer that triggers +every second and each time will give the throttler exactly three "vouchers"; +each voucher gives the throttler a right to deliver a message. In this way, +at most 3 messages will be sent out by the throttler in each interval. + +It should be noted that such timer-based throttlers provide relatively **weak guarantees**: + +* Only *start times* are taken into account. This may be a problem if, for example, the + throttler is used to throttle requests to an external web service. If a web request + takes very long on the server then the rate *observed on the server* may be higher. +* A timer-based throttler only makes guarantees for the intervals of its own timer. In + our example, no more than 3 messages are delivered within such intervals. Other + intervals on the timeline, however, may contain more calls. + +The two cases are illustrated in the two figures below, each showing a timeline and three +intervals of the timer. The message delivery times chosen by the throttler are indicated +by dots, and as you can see, each interval contains at most 3 point, so the throttler +works correctly. Still, there is in each example an interval (the red one) that is +problematic. In the first scenario, this is because the delivery times are merely the +start times of longer requests (indicated by the four bars above the timeline that start +at the dots), so that the server observes four requests during the red interval. In the +second scenario, the messages are centered around one of the points in time where the +timer triggers, causing the red interval to contain too many messages. + +.. image:: throttler.png + +For some application scenarios, the guarantees provided by a timer-based throttler might +be too weak. Charles Cordingley’s `blog post `_ +discusses a throttler with stronger guarantees (it solves problem 2 from above). +Future versions of this module may feature throttlers with better guarantees. \ No newline at end of file diff --git a/akka-contrib/docs/throttler.png b/akka-contrib/docs/throttler.png new file mode 100644 index 0000000000000000000000000000000000000000..eab1a52a34e7435e1e6cafcf3e6c511dab45f078 GIT binary patch literal 4036 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 T<$x{&0|SGntDnm{r-UW|g*xXE literal 0 HcmV?d00001 diff --git a/akka-contrib/src/main/scala/akka/contrib/throttle/TimerBasedThrottler.scala b/akka-contrib/src/main/scala/akka/contrib/throttle/TimerBasedThrottler.scala new file mode 100644 index 0000000000..12e98e89b2 --- /dev/null +++ b/akka-contrib/src/main/scala/akka/contrib/throttle/TimerBasedThrottler.scala @@ -0,0 +1,294 @@ +/** + * Copyright (C) 2009-2012 Typesafe Inc. + */ + +package akka.contrib.throttle + +import scala.concurrent.duration.{ Duration, FiniteDuration } +import scala.util.control.NonFatal +import scala.collection.immutable.{ Queue ⇒ Q } +import akka.actor.{ ActorRef, Actor, FSM } +import Throttler._ +import TimerBasedThrottler._ +import java.util.concurrent.TimeUnit +import akka.AkkaException + +/** + * Marker trait for throttlers. + * + * == Throttling == + * A throttler is an actor that is defined through a target actor and a rate + * (of type [[akka.contrib.throttle.Throttler.Rate]]). You set or change the target and rate at any time through the `SetTarget(target)` + * and `SetRate(rate)` messages, respectively. When you send the throttler any other message `msg`, it will + * put the message `msg` into an internal queue and eventually send all queued messages to the target, at + * a speed that respects the given rate. If no target is currently defined then the messages will be queued + * and will be delivered as soon as a target gets set. + * + * A [[akka.contrib.throttle.Throttler]] understands actor messages of type + * [[akka.contrib.throttle.Throttler.SetTarget]], [[akka.contrib.throttle.Throttler.SetRate]], in + * addition to any other messages, which the throttler will consider as messages to be sent to + * the target. + * + * == Transparency == + * Notice that the throttler `forward`s messages, i.e., the target will see the original message sender (and not the throttler) as the sender of the message. + * + * == Persistence == + * Throttlers usually use an internal queue to keep the messages that need to be sent to the target. + * You therefore cannot rely on the throttler's inbox size in order to learn how much messages are + * outstanding. + * + * It is left to the implementation whether the internal queue is persisted over application restarts or + * actor failure. + * + * == Processing messages == + * The target should process messages as fast as possible. If the target requires substantial time to + * process messages, it should distribute its work to other actors (using for example something like + * a `BalancingDispatcher`), otherwise the resulting system will always work below + * the threshold rate. + * + * Example: Suppose the throttler has a rate of 3msg/s and the target requires 1s to process a message. + * This system will only process messages at a rate of 1msg/s: the target will receive messages at at most 3msg/s + * but as it handles them synchronously and each of them takes 1s, its inbox will grow and grow. In such + * a situation, the target should distribute its messages to a set of worker actors so that individual messages + * can be handled in parallel. + * + * @see [[akka.contrib.throttle.TimerBasedThrottler]] + */ +trait Throttler { self: Actor ⇒ } + +/** + * Message types understood by [[akka.contrib.throttle.Throttler]]'s. + * + * @see [[akka.contrib.throttle.Throttler]] + * @see [[akka.contrib.throttle.Throttler.Rate]] + */ +object Throttler { + /** + * A rate used for throttling. + * + * There are some shorthands available to construct rates: + * {{{ + * import java.util.concurrent.TimeUnit._ + * import scala.concurrent.duration.{ Duration, FiniteDuration } + * + * val rate1 = 1 msgsPer (1, SECONDS) + * val rate2 = 1 msgsPer Duration(1, SECONDS) + * val rate3 = 1 msgsPer (1 seconds) + * val rate4 = 1 msgsPerSecond + * val rate5 = 1 msgsPerMinute + * val rate6 = 1 msgsPerHour + * }}} + * + * @param numberOfCalls the number of calls that may take place in a period + * @param duration the length of the period + * @see [[akka.contrib.throttle.Throttler]] + */ + case class Rate(val numberOfCalls: Int, val duration: FiniteDuration) { + /** + * The duration in milliseconds. + */ + def durationInMillis(): Long = duration.toMillis + } + + /** + * Set the target of a [[akka.contrib.throttle.Throttler]]. + * + * You may change a throttler's target at any time. + * + * Notice that the messages sent by the throttler to the target will have the original sender (and + * not the throttler) as the sender. (In Akka terms, the throttler `forward`s the message.) + * + * @param target if `target` is `None`, the throttler will stop delivering messages and the messages already received + * but not yet delivered, as well as any messages received in the future will be queued + * and eventually be delivered when a new target is set. If `target` is not `None`, the currently queued messages + * as well as any messages received in the the future will be delivered to the new target at a rate not exceeding the current throttler's rate. + */ + case class SetTarget(target: Option[ActorRef]) + + /** + * Set the rate of a [[akka.contrib.throttle.Throttler]]. + * + * You may change a throttler's rate at any time. + * + * @param rate the rate at which messages will be delivered to the target of the throttler + */ + case class SetRate(rate: Rate) + + import language.implicitConversions + + /** + * Helper for some syntactic sugar. + * + * @see [[akka.contrib.throttle.Throttler.Rate]] + */ + implicit class RateInt(numberOfCalls: Int) { + def msgsPer(duration: Int, timeUnit: TimeUnit) = Rate(numberOfCalls, Duration(duration, timeUnit)) + def msgsPer(duration: FiniteDuration) = Rate(numberOfCalls, duration) + def msgsPerSecond = Rate(numberOfCalls, Duration(1, TimeUnit.SECONDS)) + def msgsPerMinute = Rate(numberOfCalls, Duration(1, TimeUnit.MINUTES)) + def msgsPerHour = Rate(numberOfCalls, Duration(1, TimeUnit.HOURS)) + } + +} + +/** + * Implementation-specific internals. + */ +object TimerBasedThrottler { + private[throttle] case object Tick + + // States of the FSM + private[throttle] sealed trait State + // Idle means we don't deliver messages, either because there are none, or because no target was set. + private[throttle] case object Idle extends State + // Active means we the target is set and we have a message queue that is non-empty. + private[throttle] case object Active extends State + + // Messages, as we queue them to be sent later + private[throttle] case class Message(message: Any, sender: ActorRef) + + // The data of the FSM + private[throttle] sealed case class Data(target: Option[ActorRef], + callsLeftInThisPeriod: Int, + queue: Q[Message]) +} + +/** + * A [[akka.contrib.throttle.Throttler]] that uses a timer to control the message delivery rate. + * + * ==Example== + * For example, if you set a rate like "3 messages in 1 second", the throttler + * will send the first three messages immediately to the target actor but will need to impose a delay before + * sending out further messages: + * {{{ + * // A simple actor that prints whatever it receives + * val printer = system.actorOf(Props(new Actor { + * def receive = { + * case x => println(x) + * } + * })) + * // The throttler for this example, setting the rate + * val throttler = system.actorOf(Props(new TimerBasedThrottler(3 msgsPer (1.second)))) + * // Set the target + * throttler ! SetTarget(Some(printer)) + * // These three messages will be sent to the printer immediately + * throttler ! "1" + * throttler ! "2" + * throttler ! "3" + * // These two will wait at least until 1 second has passed + * throttler ! "4" + * throttler ! "5" + * }}} + * + * ==Implementation notes== + * This throttler implementation internally installs a timer that repeats every `rate.durationInMillis` and enables `rate.numberOfCalls` + * additional calls to take place. A `TimerBasedThrottler` uses very few system resources, provided the rate's duration is not too + * fine-grained (which would cause a lot of timer invocations); for example, it does not store the calling history + * as other throttlers may need to do. + * + * However, a `TimerBasedThrottler` only provides ''weak guarantees'' on the rate (see also + * this blog post): + * + * - Only ''delivery'' times are taken into account: if, for example, the throttler is used to throttle + * requests to an external web service then only the start times of the web requests are considered. + * If a web request takes very long on the server then more than `rate.numberOfCalls`-many requests + * may be observed on the server in an interval of duration `rate.durationInMillis()`. + * - There may be intervals of duration `rate.durationInMillis()` that contain more than `rate.numberOfCalls` + * message deliveries: a `TimerBasedThrottler` only makes guarantees for the intervals + * of its ''own'' timer, namely that no more than `rate.numberOfCalls`-many messages are delivered within such intervals. Other intervals on the + * timeline may contain more calls. + * + * For some applications, these guarantees may not be sufficient. + * + * ==Known issues== + * + * - If you change the rate using `SetRate(rate)`, the actual rate may in fact be higher for the + * overlapping period (i.e., `durationInMillis()`) of the new and old rate. Therefore, + * changing the rate frequently is not recommended with the current implementation. + * - The queue of messages to be delivered is not persisted in any way; actor or system failure will + * cause the queued messages to be lost. + * + * @see [[akka.contrib.throttle.Throttler]] + */ +class TimerBasedThrottler(var rate: Rate) extends Actor with Throttler with FSM[State, Data] { + + startWith(Idle, Data(None, rate.numberOfCalls, Q())) + + // Idle: no messages, or target not set + when(Idle) { + // Set the rate + case Event(SetRate(rate), d) ⇒ + this.rate = rate + stay using d.copy(callsLeftInThisPeriod = rate.numberOfCalls) + + // Set the target + case Event(SetTarget(t @ Some(_)), d) if !d.queue.isEmpty ⇒ + goto(Active) using deliverMessages(d.copy(target = t)) + case Event(SetTarget(t), d) ⇒ + stay using d.copy(target = t) + + // Queuing + case Event(msg, d @ Data(None, _, queue)) ⇒ + stay using d.copy(queue = queue.enqueue(Message(msg, context.sender))) + case Event(msg, d @ Data(Some(_), _, Seq())) ⇒ + goto(Active) using deliverMessages(d.copy(queue = Q(Message(msg, context.sender)))) + // Note: The case Event(msg, t @ Data(Some(_), _, _, Seq(_*))) should never happen here. + } + + when(Active) { + // Set the rate + case Event(SetRate(rate), d) ⇒ + this.rate = rate + // Note: this should be improved (see "Known issues" in class comments) + stopTimer() + startTimer(rate) + stay using d.copy(callsLeftInThisPeriod = rate.numberOfCalls) + + // Set the target (when the new target is None) + case Event(SetTarget(None), d) ⇒ + goto(Idle) using d.copy(target = None) + + // Set the target (when the new target is not None) + case Event(SetTarget(t @ Some(_)), d) ⇒ + stay using d.copy(target = t) + + // Period ends and we have no more messages + case Event(Tick, d @ Data(_, _, Seq())) ⇒ + goto(Idle) + + // Period ends and we get more occasions to send messages + case Event(Tick, d @ Data(_, _, _)) ⇒ + stay using deliverMessages(d.copy(callsLeftInThisPeriod = rate.numberOfCalls)) + + // Queue a message (when we cannot send messages in the current period anymore) + case Event(msg, d @ Data(_, 0, queue)) ⇒ + stay using d.copy(queue = queue.enqueue(Message(msg, context.sender))) + + // Queue a message (when we can send some more messages in the current period) + case Event(msg, d @ Data(_, _, queue)) ⇒ + stay using deliverMessages(d.copy(queue = queue.enqueue(Message(msg, context.sender)))) + } + + onTransition { + case Idle -> Active ⇒ startTimer(rate) + case Active -> Idle ⇒ stopTimer() + } + + initialize + + private def startTimer(rate: Rate) = setTimer("morePermits", Tick, rate.duration, true) + private def stopTimer() = cancelTimer("morePermits") + + /** + * Send as many messages as we can (while respecting the rate) to the target and + * return the state data (with the queue containing the remaining ones). + */ + private def deliverMessages(data: Data): Data = { + val queue = data.queue + val nrOfMsgToSend = scala.math.min(queue.length, data.callsLeftInThisPeriod) + + queue.take(nrOfMsgToSend).foreach(x ⇒ data.target.get.tell(x.message, x.sender)) + + data.copy(queue = queue.drop(nrOfMsgToSend), callsLeftInThisPeriod = data.callsLeftInThisPeriod - nrOfMsgToSend) + } +} \ No newline at end of file diff --git a/akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala b/akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala new file mode 100644 index 0000000000..4f8f422cb6 --- /dev/null +++ b/akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala @@ -0,0 +1,144 @@ +/** + * Copyright (C) 2009-2012 Typesafe Inc. + */ + +package akka.contrib.throttle + +import language.postfixOps +import scala.concurrent.duration._ +import akka.actor.ActorSystem +import akka.actor.Actor +import akka.actor.Props +import akka.testkit.TestKit +import akka.testkit.ImplicitSender +import akka.contrib.throttle.Throttler._ +import org.junit.runner.RunWith +import org.scalatest.junit.JUnitRunner +import org.scalatest.WordSpec +import org.scalatest.matchers.MustMatchers +import org.scalatest.BeforeAndAfterAll + +object TimerBasedThrottlerSpec { + class EchoActor extends Actor { + def receive = { + case x ⇒ sender ! x + } + } +} + +@RunWith(classOf[JUnitRunner]) +class TimerBasedThrottlerSpec(_system: ActorSystem) extends TestKit(_system) with ImplicitSender + with WordSpec with MustMatchers with BeforeAndAfterAll { + + def this() = this(ActorSystem("TimerBasedThrottlerSpec")) + + override def afterAll { + system.shutdown() + } + + "A throttler" must { + + "must pass the ScalaDoc class documentation example prgoram" in { + //#demo-code + // A simple actor that prints whatever it receives + val printer = system.actorOf(Props(new Actor { + def receive = { + case x ⇒ println(x) + } + })) + // The throttler for this example, setting the rate + val throttler = system.actorOf(Props(new TimerBasedThrottler(3 msgsPer (1 second)))) + // Set the target + throttler ! SetTarget(Some(printer)) + // These three messages will be sent to the echoer immediately + throttler ! "1" + throttler ! "2" + throttler ! "3" + // These two will wait until a second has passed + throttler ! "4" + throttler ! "5" + //#demo-code + } + + "keep messages until a target is set" in { + val echo = system.actorOf(Props[TimerBasedThrottlerSpec.EchoActor]) + val throttler = system.actorOf(Props(new TimerBasedThrottler(3 msgsPer (1 second)))) + throttler ! "1" + throttler ! "2" + throttler ! "3" + throttler ! "4" + throttler ! "5" + throttler ! "6" + expectNoMsg(1 second) + throttler ! SetTarget(Some(echo)) + within(2.seconds) { + expectMsg("1") + expectMsg("2") + expectMsg("3") + expectMsg("4") + expectMsg("5") + expectMsg("6") + } + } + + "respect the rate (3 msg/s)" in { + val echo = system.actorOf(Props[TimerBasedThrottlerSpec.EchoActor]) + val throttler = system.actorOf(Props(new TimerBasedThrottler(3 msgsPer (1 second)))) + throttler ! SetTarget(Some(echo)) + throttler ! "1" + throttler ! "2" + throttler ! "3" + throttler ! "4" + throttler ! "5" + throttler ! "6" + throttler ! "7" + within(1 second) { + expectMsg("1") + expectMsg("2") + expectMsg("3") + expectNoMsg(remaining) + } + within(1 second) { + expectMsg("4") + expectMsg("5") + expectMsg("6") + expectNoMsg(remaining) + } + within(1 second) { + expectMsg("7") + } + } + + "respect the rate (4 msg/s)" in { + val echo = system.actorOf(Props[TimerBasedThrottlerSpec.EchoActor]) + val throttler = system.actorOf(Props(new TimerBasedThrottler(4 msgsPer (1 second)))) + throttler ! SetTarget(Some(echo)) + throttler ! "1" + throttler ! "2" + throttler ! "3" + throttler ! "4" + throttler ! "5" + throttler ! "6" + throttler ! "7" + throttler ! "8" + throttler ! "9" + within(1 second) { + expectMsg("1") + expectMsg("2") + expectMsg("3") + expectMsg("4") + expectNoMsg(remaining) + } + within(1 second) { + expectMsg("5") + expectMsg("6") + expectMsg("7") + expectMsg("8") + expectNoMsg(remaining) + } + within(1 second) { + expectMsg("9") + } + } + } +} \ No newline at end of file From 0615ba78970a52fc0b3b374c2e95a6a2278592e1 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Wed, 31 Oct 2012 14:20:20 +0100 Subject: [PATCH 095/210] #2669 - Fixing the docs about how to generate the docs --- akka-docs/rst/dev/documentation.rst | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/akka-docs/rst/dev/documentation.rst b/akka-docs/rst/dev/documentation.rst index ad8ff244ae..18b6707f43 100644 --- a/akka-docs/rst/dev/documentation.rst +++ b/akka-docs/rst/dev/documentation.rst @@ -75,16 +75,17 @@ First install `Sphinx`_. See below. Building -------- -:: +For the html version of the docs:: - cd akka-docs + sbt sphinx:generate-html - make html - open _build/html/index.html + open /akka-docs/target/sphinx/html/index.html - make pdf - open _build/latex/Akka.pdf +For the pdf version of the docs:: + sbt sphinx:generate-pdf + + open /akka-docs/target/sphinx/latex/Akka.pdf Installing Sphinx on OS X ------------------------- From 977194ff8e7b895ebcfcd827b1f2e31e92b44a9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Antonsson?= Date: Wed, 31 Oct 2012 16:37:03 +0100 Subject: [PATCH 096/210] Improve MultiNodeSpec ifNode syntax. #2126 --- .../scala/akka/cluster/LargeClusterSpec.scala | 6 +++--- .../scala/akka/cluster/MultiNodeClusterSpec.scala | 2 +- .../scala/akka/remote/testkit/MultiNodeSpec.scala | 14 +++++++------- .../remote/testconductor/TestConductorSpec.scala | 7 ++----- 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/LargeClusterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/LargeClusterSpec.scala index 1ebb930df6..06e3caeac8 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/LargeClusterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/LargeClusterSpec.scala @@ -148,7 +148,7 @@ abstract class LargeClusterSpec runOn(runOnRoles: _*) { systems.size must be(nodesPerDatacenter) // make sure it is initialized - val clusterNodes = ifNode(from)(joiningClusterNodes)(systems.map(Cluster(_)).toSet) + val clusterNodes = if(isNode(from)) joiningClusterNodes else systems.map(Cluster(_)).toSet val startGossipCounts = Map.empty[Cluster, Long] ++ clusterNodes.map(c ⇒ (c -> c.readView.latestStats.receivedGossipCount)) def gossipCount(c: Cluster): Long = { @@ -260,7 +260,7 @@ abstract class LargeClusterSpec if (bulk.nonEmpty) { val totalNodes = nodesPerDatacenter * 4 + bulk.size within(expectedMaxDuration(totalNodes)) { - val joiningClusters = ifNode(fifthDatacenter)(bulk.map(Cluster(_)).toSet)(Set.empty) + val joiningClusters = if(isNode(fifthDatacenter)) bulk.map(Cluster(_)).toSet else Set.empty[Cluster] join(joiningClusters, from = fifthDatacenter, to = firstDatacenter, totalNodes, runOnRoles = firstDatacenter, secondDatacenter, thirdDatacenter, fourthDatacenter, fifthDatacenter) enterBarrier("fifth-datacenter-joined-" + bulk.size) @@ -270,7 +270,7 @@ abstract class LargeClusterSpec for (i ← 0 until oneByOne.size) { val totalNodes = nodesPerDatacenter * 4 + bulk.size + i + 1 within(expectedMaxDuration(totalNodes)) { - val joiningClusters = ifNode(fifthDatacenter)(Set(Cluster(oneByOne(i))))(Set.empty) + val joiningClusters = if(isNode(fifthDatacenter)) Set(Cluster(oneByOne(i))) else Set.empty[Cluster] join(joiningClusters, from = fifthDatacenter, to = firstDatacenter, totalNodes, runOnRoles = firstDatacenter, secondDatacenter, thirdDatacenter, fourthDatacenter, fifthDatacenter) enterBarrier("fifth-datacenter-joined-" + (bulk.size + i)) diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala index 5ff931f1c2..12fc8ebbc6 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala @@ -210,7 +210,7 @@ trait MultiNodeClusterSpec extends Suite with STMultiNodeSpec { self: MultiNodeS val expectedLeader = roleOfLeader(nodesInCluster) val leader = clusterView.leader val isLeader = leader == Some(clusterView.selfAddress) - assert(isLeader == ifNode(expectedLeader)(true)(false), + assert(isLeader == isNode(expectedLeader), "expectedLeader [%s], got leader [%s], members [%s]".format(expectedLeader, leader, clusterView.members)) clusterView.status must (be(MemberStatus.Up) or be(MemberStatus.Leaving)) } diff --git a/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala b/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala index 9d5fd4b55e..c40a4e5a7b 100644 --- a/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala +++ b/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala @@ -42,7 +42,10 @@ abstract class MultiNodeConfig { /** * Register a config override for a specific participant. */ - def nodeConfig(role: RoleName, config: Config): Unit = _nodeConf += role -> config + def nodeConfig(roles: RoleName*)(configs: Config*): Unit = { + val c = configs.reduceLeft(_ withFallback _) + _nodeConf ++= roles map { _ -> c } + } /** * Include for verbose debug logging @@ -318,18 +321,15 @@ abstract class MultiNodeSpec(val myself: RoleName, _system: ActorSystem, _roles: * to the `roleMap`). */ def runOn(nodes: RoleName*)(thunk: ⇒ Unit): Unit = { - if (nodes exists (_ == myself)) { + if (isNode(nodes: _*)) { thunk } } /** - * Execute the `yes` block of code only on the given nodes (names according - * to the `roleMap`) else execute the `no` block of code. + * Verify that the running node matches one of the given nodes */ - def ifNode[T](nodes: RoleName*)(yes: ⇒ T)(no: ⇒ T): T = { - if (nodes exists (_ == myself)) yes else no - } + def isNode(nodes: RoleName*): Boolean = nodes contains myself /** * Enter the named barriers in the order given. Use the remaining duration from diff --git a/akka-remote-tests/src/multi-jvm/scala/akka/remote/testconductor/TestConductorSpec.scala b/akka-remote-tests/src/multi-jvm/scala/akka/remote/testconductor/TestConductorSpec.scala index 1b5ac90772..544ee03ead 100644 --- a/akka-remote-tests/src/multi-jvm/scala/akka/remote/testconductor/TestConductorSpec.scala +++ b/akka-remote-tests/src/multi-jvm/scala/akka/remote/testconductor/TestConductorSpec.scala @@ -89,11 +89,8 @@ class TestConductorSpec extends MultiNodeSpec(TestConductorMultiJvmSpec) with ST } val (min, max) = - ifNode(master) { - (0 seconds, 500 millis) - } { - (0.6 seconds, 2 seconds) - } + if(isNode(master))(0 seconds, 500 millis) + else (0.6 seconds, 2 seconds) within(min, max) { expectMsg(500 millis, 10) From 58c0b2beae6a94f5f0a3a6631a105401447861e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Antonsson?= Date: Thu, 1 Nov 2012 11:04:05 +0100 Subject: [PATCH 097/210] Correct and update the SbtMultiJvm documentation. #2671 --- akka-docs/rst/dev/multi-jvm-testing.rst | 107 +++++++++++++++--------- project/plugins.sbt | 2 +- 2 files changed, 67 insertions(+), 42 deletions(-) diff --git a/akka-docs/rst/dev/multi-jvm-testing.rst b/akka-docs/rst/dev/multi-jvm-testing.rst index 8157e6bd84..92a4e9c6b1 100644 --- a/akka-docs/rst/dev/multi-jvm-testing.rst +++ b/akka-docs/rst/dev/multi-jvm-testing.rst @@ -18,52 +18,65 @@ You can add it as a plugin by adding the following to your project/plugins.sbt: .. includecode:: ../../../project/plugins.sbt#sbt-multi-jvm You can then add multi-JVM testing to ``project/Build.scala`` by including the ``MultiJvm`` -settings and config. For example, here is an example of how the akka-remote-tests project adds -multi-JVM testing (Simplified for clarity): +settings and config. Please note that MultiJvm test sources are located in ``src/multi-jvm/...``, +and not in ``src/test/...``. + +Here is an example Build.scala file that uses the MultiJvm plugin: .. parsed-literal:: import sbt._ import Keys._ import com.typesafe.sbt.SbtMultiJvm - import com.typesafe.sbt.SbtMultiJvm.MultiJvmKeys.{ MultiJvm, extraOptions } + import com.typesafe.sbt.SbtMultiJvm.MultiJvmKeys.{ MultiJvm } - object AkkaBuild extends Build { + object ExampleBuild extends Build { - lazy val remoteTests = Project( - id = "akka-remote-tests", - base = file("akka-remote-tests"), - dependencies = Seq(remote, actorTests % "test->test", - testkit % "test->test"), - settings = defaultSettings ++ Seq( - // disable parallel tests - parallelExecution in Test := false, - extraOptions in MultiJvm <<= (sourceDirectory in MultiJvm) { src => - (name: String) => (src ** (name + ".conf")).get. - headOption.map("-Dakka.config=" + _.absolutePath).toSeq - }, - executeTests in Test <<= ((executeTests in Test), - (executeTests in MultiJvm)) map { - case ((_, testResults), (_, multiJvmResults)) => - val results = testResults ++ multiJvmResults - (Tests.overall(results.values), results) - } - ) - ) configs (MultiJvm) + lazy val buildSettings = Defaults.defaultSettings ++ multiJvmSettings ++ Seq( + organization := "example", + version := "1.0", + scalaVersion := "@scalaVersion@", + // make sure that the artifacts don't have the scala version in the name + crossPaths := false + ) - lazy val buildSettings = Defaults.defaultSettings ++ - SbtMultiJvm.multiJvmSettings ++ Seq( - organization := "com.typesafe.akka", - version := "@version@", - scalaVersion := "@scalaVersion@", - crossPaths := false - ) + lazy val example = Project( + id = "example", + base = file("."), + settings = buildSettings ++ + Seq(libraryDependencies ++= Dependencies.example) + ) configs(MultiJvm) - lazy val defaultSettings = buildSettings ++ Seq( - resolvers += "Typesafe Repo" at "http://repo.typesafe.com/typesafe/releases/" - ) + lazy val multiJvmSettings = SbtMultiJvm.multiJvmSettings ++ Seq( + // make sure that MultiJvm test are compiled by the default test compilation + compile in MultiJvm <<= (compile in MultiJvm) triggeredBy (compile in Test), + // disable parallel tests + parallelExecution in Test := false, + // make sure that MultiJvm tests are executed by the default test target + executeTests in Test <<= + ((executeTests in Test), (executeTests in MultiJvm)) map { + case ((_, testResults), (_, multiJvmResults)) => + val results = testResults ++ multiJvmResults + (Tests.overall(results.values), results) + } + ) - } + object Dependencies { + val example = Seq( + // ---- application dependencies ---- + "com.typesafe.akka" %% "akka-actor" % "@version@" @crossString@, + "com.typesafe.akka" %% "akka-remote" % "@version@" @crossString@, + + // ---- test dependencies ---- + "com.typesafe.akka" %% "akka-testkit" % "@version@" % + "test" cross CrossVersion.full, + "com.typesafe.akka" %% "akka-remote-tests-experimental" % "@version@" % + "test" cross CrossVersion.full, + "org.scalatest" %% "scalatest" % "1.8" % "test" cross CrossVersion.full, + "junit" % "junit" % "4.5" % "test" + ) + } + } You can specify JVM options for the forked JVMs:: @@ -73,7 +86,7 @@ You can specify JVM options for the forked JVMs:: Running tests ============= -The multi-jvm tasks are similar to the normal tasks: ``test``, ``test-only``, +The multi-JVM tasks are similar to the normal tasks: ``test``, ``test-only``, and ``run``, but are under the ``multi-jvm`` configuration. So in Akka, to run all the multi-JVM tests in the akka-remote project use (at @@ -111,8 +124,8 @@ options after the test names and ``--``. For example: Creating application tests ========================== -The tests are discovered, and combined, through a naming convention. MultiJvm tests are -located in ``src/multi-jvm/scala`` directory. A test is named with the following pattern: +The tests are discovered, and combined, through a naming convention. MultiJvm test sources +are located in ``src/multi-jvm/...``. A test is named with the following pattern: .. code-block:: none @@ -162,14 +175,26 @@ spawned, one for each node. It will look like this: [success] Total time: ... -Naming -====== +Changing Defaults +================= + +You can chenge the name of the multi-JVM test source directory by adding the following +configuration to your project: + +.. code-block:: none + + unmanagedSourceDirectories in MultiJvm <<= + Seq(baseDirectory(_ / "src/some_directory_here")).join + You can change what the ``MultiJvm`` identifier is. For example, to change it to -``ClusterTest`` use the ``multiJvmMarker`` setting:: +``ClusterTest`` use the ``multiJvmMarker`` setting: + +.. code-block:: none multiJvmMarker in MultiJvm := "ClusterTest" + Your tests should now be named ``{TestName}ClusterTest{NodeName}``. diff --git a/project/plugins.sbt b/project/plugins.sbt index 6f68c66496..8e57ed4e2d 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -3,7 +3,7 @@ resolvers += Classpaths.typesafeResolver // these comment markers are for including code into the docs //#sbt-multi-jvm -addSbtPlugin("com.typesafe.sbt" % "sbt-multi-jvm" % "0.3.3") +addSbtPlugin("com.typesafe.sbt" % "sbt-multi-jvm" % "0.3.4") //#sbt-multi-jvm addSbtPlugin("com.typesafe.sbt" % "sbt-scalariform" % "1.0.0") From 2e2d367ae6136f2e4561a6eeb91f55120c05ce54 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Thu, 1 Nov 2012 19:27:53 +0100 Subject: [PATCH 098/210] Missing variable assignment, see #2677 * Credit goes to Eric Pederson --- .../sample/cluster/transformation/TransformationSample.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/transformation/TransformationSample.scala b/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/transformation/TransformationSample.scala index 5deb2d4a40..159e17f94b 100644 --- a/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/transformation/TransformationSample.scala +++ b/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/transformation/TransformationSample.scala @@ -68,7 +68,8 @@ class TransformationFrontend extends Actor { context watch sender backends = backends :+ sender - case Terminated(a) ⇒ backends.filterNot(_ == a) + case Terminated(a) ⇒ + backends = backends.filterNot(_ == a) } } //#frontend From 7918a6f72b66e6aae8d3cf69e98dbe700cf13256 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Fri, 2 Nov 2012 18:48:37 +0100 Subject: [PATCH 099/210] Adding pool size for both use with dispatcher as without. --- .../main/scala/akka/remote/netty/NettyRemoteSupport.scala | 8 ++++---- akka-remote/src/main/scala/akka/remote/netty/Server.scala | 5 ++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala b/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala index de95ad1e8d..7c27a82e6d 100644 --- a/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala +++ b/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala @@ -40,13 +40,13 @@ private[akka] class NettyRemoteTransport(_system: ExtendedActorSystem, _provider // TODO replace by system.scheduler val timer: HashedWheelTimer = new HashedWheelTimer(system.threadFactory) - val clientChannelFactory = settings.UseDispatcherForIO match { + val clientChannelFactory = { + settings.UseDispatcherForIO match { case Some(id) ⇒ val d = system.dispatchers.lookup(id) - new NioClientSocketChannelFactory(d, d) + new NioClientSocketChannelFactory(d, d, settings.ClientSocketWorkerPoolSize) case None ⇒ - new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool(), - settings.ClientSocketWorkerPoolSize) + new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool(), settings.ClientSocketWorkerPoolSize) } /** diff --git a/akka-remote/src/main/scala/akka/remote/netty/Server.scala b/akka-remote/src/main/scala/akka/remote/netty/Server.scala index 1f083bcab5..2f76b324cd 100644 --- a/akka-remote/src/main/scala/akka/remote/netty/Server.scala +++ b/akka-remote/src/main/scala/akka/remote/netty/Server.scala @@ -29,10 +29,9 @@ private[akka] class NettyRemoteServer(val netty: NettyRemoteTransport) { settings.UseDispatcherForIO match { case Some(id) ⇒ val d = netty.system.dispatchers.lookup(id) - new NioServerSocketChannelFactory(d, d) + new NioServerSocketChannelFactory(d, d, settings.ServerSocketWorkerPoolSize) case None ⇒ - new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool(), - settings.ServerSocketWorkerPoolSize) + new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool(), settings.ServerSocketWorkerPoolSize) } // group of open channels, used for clean-up From 8eec825f18e776ff3b96ca688b15644175d25fd2 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Sun, 4 Nov 2012 02:57:30 +0100 Subject: [PATCH 100/210] paragraph is not a dollar. I promise. --- .../src/test/scala/akka/actor/LocalActorRefProviderSpec.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/akka-actor-tests/src/test/scala/akka/actor/LocalActorRefProviderSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/LocalActorRefProviderSpec.scala index a768089415..4cb432aa23 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/LocalActorRefProviderSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/LocalActorRefProviderSpec.scala @@ -46,7 +46,7 @@ class LocalActorRefProviderSpec extends AkkaSpec(LocalActorRefProviderSpec.confi def receive = { case "lookup" ⇒ if (childName == child.path.name) sender ! context.actorFor(childName) - else sender ! s"§childName is not ${child.path.name}!" + else sender ! s"$childName is not ${child.path.name}!" } })) a.tell("lookup", testActor) From 29cf71d6bc2e05ce65ae0e51b613aef475abb87a Mon Sep 17 00:00:00 2001 From: Roland Date: Mon, 5 Nov 2012 13:33:14 +0100 Subject: [PATCH 101/210] make timing requirements for lenient for ReliableProxySpec, see #2637 --- .../scala/akka/contrib/pattern/ReliableProxySpec.scala | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/akka-contrib/src/multi-jvm/scala/akka/contrib/pattern/ReliableProxySpec.scala b/akka-contrib/src/multi-jvm/scala/akka/contrib/pattern/ReliableProxySpec.scala index 3595b9887a..f71bb0116b 100644 --- a/akka-contrib/src/multi-jvm/scala/akka/contrib/pattern/ReliableProxySpec.scala +++ b/akka-contrib/src/multi-jvm/scala/akka/contrib/pattern/ReliableProxySpec.scala @@ -122,8 +122,8 @@ class ReliableProxySpec extends MultiNodeSpec(ReliableProxySpec) with STMultiNod enterBarrier("test2b") runOn(local) { - testConductor.throttle(local, remote, Direction.Send, -1) - expectTransition(Active, Idle) + testConductor.throttle(local, remote, Direction.Send, -1).await + within(5 seconds) { expectTransition(Active, Idle) } } runOn(remote) { within(1 second) { @@ -152,8 +152,8 @@ class ReliableProxySpec extends MultiNodeSpec(ReliableProxySpec) with STMultiNod enterBarrier("test3a") runOn(local) { - testConductor.throttle(local, remote, Direction.Receive, -1) - expectTransition(Active, Idle) + testConductor.throttle(local, remote, Direction.Receive, -1).await + within(5 seconds) { expectTransition(Active, Idle) } } enterBarrier("test3b") From edc9fd733d7d57e95654c4fc1fefdb9d7eb52d74 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Mon, 5 Nov 2012 17:11:07 +0100 Subject: [PATCH 102/210] Allow negative Load average in test, see #2664 * According to documentation it can be negative for some OS --- .../src/main/scala/akka/cluster/ClusterMetricsCollector.scala | 2 +- .../src/test/scala/akka/cluster/MetricsCollectorSpec.scala | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala index 7edd0974c0..eb01e76e73 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala @@ -463,7 +463,7 @@ private[cluster] class MetricsCollector private (private val sigar: Option[AnyRe /** * (SIGAR / JMX) Returns the OS-specific average system load on the CPUs in the system, for the past 1 minute. - * On some systems the JMX OS system load average may not be available, in which case a -1 is returned. + * On some systems the JMX OS system load average may not be available, in which case a negative value is returned. * Hyperic SIGAR provides more precise values, thus, if the library is on the classpath, it is the default. */ def systemLoadAverage: Metric = Metric("system-load-average", Some(BigDecimal(Try( diff --git a/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala index f00869d92f..e1044000e8 100644 --- a/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala @@ -78,11 +78,12 @@ class MetricsCollectorSpec extends AkkaSpec(MetricsEnabledSpec.config) with Impl val metrics = sample.metrics.collect { case m if m.isDefined ⇒ (m.name, m.value.get) } val used = metrics collectFirst { case ("heap-memory-used", b) ⇒ b } val committed = metrics collectFirst { case ("heap-memory-committed", b) ⇒ b } + metrics foreach { case ("total-cores", b) ⇒ b.intValue must be > (0) case ("network-max-rx", b) ⇒ b.longValue must be > (0L) case ("network-max-tx", b) ⇒ b.longValue must be > (0L) - case ("system-load-average", b) ⇒ b.doubleValue must be >= (0.0) + case ("system-load-average", b) ⇒ // not possible to assert b, allowed to be negative or positive case ("processors", b) ⇒ b.intValue must be >= (0) case ("heap-memory-used", b) ⇒ b.longValue must be >= (0L) case ("heap-memory-committed", b) ⇒ b.longValue must be > (0L) From 4917680f7348d9abf4962f860f25b71cde75af17 Mon Sep 17 00:00:00 2001 From: "Kaspar Fischer (hbf)" Date: Mon, 5 Nov 2012 17:38:40 +0100 Subject: [PATCH 103/210] more tests and bug fixes --- .../throttle/TimerBasedThrottler.scala | 26 +++---- .../throttle/TimerBasedThrottlerSpec.scala | 68 +++++++++++++++++-- 2 files changed, 78 insertions(+), 16 deletions(-) diff --git a/akka-contrib/src/main/scala/akka/contrib/throttle/TimerBasedThrottler.scala b/akka-contrib/src/main/scala/akka/contrib/throttle/TimerBasedThrottler.scala index 12e98e89b2..4917be2579 100644 --- a/akka-contrib/src/main/scala/akka/contrib/throttle/TimerBasedThrottler.scala +++ b/akka-contrib/src/main/scala/akka/contrib/throttle/TimerBasedThrottler.scala @@ -1,7 +1,7 @@ -/** - * Copyright (C) 2009-2012 Typesafe Inc. - */ - +/** + * Copyright (C) 2009-2012 Typesafe Inc. + */ + package akka.contrib.throttle import scala.concurrent.duration.{ Duration, FiniteDuration } @@ -121,7 +121,7 @@ object Throttler { * * @see [[akka.contrib.throttle.Throttler.Rate]] */ - implicit class RateInt(numberOfCalls: Int) { + implicit class RateInt(val numberOfCalls: Int) extends AnyVal { def msgsPer(duration: Int, timeUnit: TimeUnit) = Rate(numberOfCalls, Duration(duration, timeUnit)) def msgsPer(duration: FiniteDuration) = Rate(numberOfCalls, duration) def msgsPerSecond = Rate(numberOfCalls, Duration(1, TimeUnit.SECONDS)) @@ -137,11 +137,9 @@ object Throttler { object TimerBasedThrottler { private[throttle] case object Tick - // States of the FSM + // States of the FSM: A `TimerBasedThrottler` is in state `Active` iff the timer is running. private[throttle] sealed trait State - // Idle means we don't deliver messages, either because there are none, or because no target was set. private[throttle] case object Idle extends State - // Active means we the target is set and we have a message queue that is non-empty. private[throttle] case object Active extends State // Messages, as we queue them to be sent later @@ -211,7 +209,6 @@ object TimerBasedThrottler { * @see [[akka.contrib.throttle.Throttler]] */ class TimerBasedThrottler(var rate: Rate) extends Actor with Throttler with FSM[State, Data] { - startWith(Idle, Data(None, rate.numberOfCalls, Q())) // Idle: no messages, or target not set @@ -246,15 +243,20 @@ class TimerBasedThrottler(var rate: Rate) extends Actor with Throttler with FSM[ // Set the target (when the new target is None) case Event(SetTarget(None), d) ⇒ - goto(Idle) using d.copy(target = None) + // Note: We do not yet switch to state `Inactive` because we need the timer to tick once more before + stay using d.copy(target = None) // Set the target (when the new target is not None) case Event(SetTarget(t @ Some(_)), d) ⇒ stay using d.copy(target = t) - // Period ends and we have no more messages + // Tick after a `SetTarget(None)`: take the additional permits and go to `Idle` + case Event(Tick, d @ Data(None, _, _)) ⇒ + goto(Idle) using d.copy(callsLeftInThisPeriod = rate.numberOfCalls) + + // Period ends and we have no more messages: take the additional permits and go to `Idle` case Event(Tick, d @ Data(_, _, Seq())) ⇒ - goto(Idle) + goto(Idle) using d.copy(callsLeftInThisPeriod = rate.numberOfCalls) // Period ends and we get more occasions to send messages case Event(Tick, d @ Data(_, _, _)) ⇒ diff --git a/akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala b/akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala index 4f8f422cb6..c78384a2dd 100644 --- a/akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala +++ b/akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala @@ -27,11 +27,9 @@ object TimerBasedThrottlerSpec { } @RunWith(classOf[JUnitRunner]) -class TimerBasedThrottlerSpec(_system: ActorSystem) extends TestKit(_system) with ImplicitSender +class TimerBasedThrottlerSpec extends TestKit(ActorSystem("TimerBasedThrottlerSpec")) with ImplicitSender with WordSpec with MustMatchers with BeforeAndAfterAll { - def this() = this(ActorSystem("TimerBasedThrottlerSpec")) - override def afterAll { system.shutdown() } @@ -71,7 +69,7 @@ class TimerBasedThrottlerSpec(_system: ActorSystem) extends TestKit(_system) wit throttler ! "6" expectNoMsg(1 second) throttler ! SetTarget(Some(echo)) - within(2.seconds) { + within(2 seconds) { expectMsg("1") expectMsg("2") expectMsg("3") @@ -81,6 +79,68 @@ class TimerBasedThrottlerSpec(_system: ActorSystem) extends TestKit(_system) wit } } + "send messages after a `SetTarget(None)` pause" in { + val echo = system.actorOf(Props[TimerBasedThrottlerSpec.EchoActor]) + val throttler = system.actorOf(Props(new TimerBasedThrottler(3 msgsPer (1 second)))) + throttler ! SetTarget(Some(echo)) + throttler ! "1" + throttler ! "2" + throttler ! "3" + throttler ! SetTarget(None) + within(1 second) { + expectMsg("1") + expectMsg("2") + expectMsg("3") + expectNoMsg(remaining) + } + expectNoMsg(1 second) + throttler ! SetTarget(Some(echo)) + throttler ! "4" + throttler ! "5" + throttler ! "6" + throttler ! "7" + within(1 seconds) { + expectMsg("4") + expectMsg("5") + expectMsg("6") + expectNoMsg(remaining) + } + within(1 second) { + expectMsg("7") + } + } + + "keep messages when the target is set to None" in { + val echo = system.actorOf(Props[TimerBasedThrottlerSpec.EchoActor]) + val throttler = system.actorOf(Props(new TimerBasedThrottler(3 msgsPer (1 second)))) + throttler ! SetTarget(Some(echo)) + throttler ! "1" + throttler ! "2" + throttler ! "3" + throttler ! "4" + throttler ! "5" + throttler ! "6" + throttler ! "7" + throttler ! SetTarget(None) + within(1 second) { + expectMsg("1") + expectMsg("2") + expectMsg("3") + expectNoMsg(remaining) + } + expectNoMsg(1 second) + throttler ! SetTarget(Some(echo)) + within(1 seconds) { + expectMsg("4") + expectMsg("5") + expectMsg("6") + expectNoMsg(remaining) + } + within(1 second) { + expectMsg("7") + } + } + "respect the rate (3 msg/s)" in { val echo = system.actorOf(Props[TimerBasedThrottlerSpec.EchoActor]) val throttler = system.actorOf(Props(new TimerBasedThrottler(3 msgsPer (1 second)))) From 99cf420a376597b7340a37180d0ea89a6b3004fb Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Mon, 5 Nov 2012 20:07:57 +0100 Subject: [PATCH 104/210] Use undefined metrics value for negative load average, see #2664 --- .../scala/akka/cluster/ClusterMetricsCollector.scala | 11 ++++++++--- .../scala/akka/cluster/MetricsCollectorSpec.scala | 6 ++---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala index eb01e76e73..76c01a6381 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala @@ -463,11 +463,16 @@ private[cluster] class MetricsCollector private (private val sigar: Option[AnyRe /** * (SIGAR / JMX) Returns the OS-specific average system load on the CPUs in the system, for the past 1 minute. - * On some systems the JMX OS system load average may not be available, in which case a negative value is returned. + * On some systems the JMX OS system load average may not be available, in which case a Metric with + * undefined value is returned. * Hyperic SIGAR provides more precise values, thus, if the library is on the classpath, it is the default. */ - def systemLoadAverage: Metric = Metric("system-load-average", Some(BigDecimal(Try( - LoadAverage.get.invoke(sigar.get).asInstanceOf[Array[Double]].toSeq.head) getOrElse osMBean.getSystemLoadAverage))) + def systemLoadAverage: Metric = Metric("system-load-average", + Try(LoadAverage.get.invoke(sigar.get).asInstanceOf[Array[Double]].toSeq.head).getOrElse( + osMBean.getSystemLoadAverage) match { + case x if x < 0 ⇒ None // load average may be unavailable on some platform + case x ⇒ Some(BigDecimal(x)) + }) /** * (JMX) Returns the number of available processors diff --git a/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala index e1044000e8..6589ba0efc 100644 --- a/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala @@ -78,12 +78,11 @@ class MetricsCollectorSpec extends AkkaSpec(MetricsEnabledSpec.config) with Impl val metrics = sample.metrics.collect { case m if m.isDefined ⇒ (m.name, m.value.get) } val used = metrics collectFirst { case ("heap-memory-used", b) ⇒ b } val committed = metrics collectFirst { case ("heap-memory-committed", b) ⇒ b } - metrics foreach { case ("total-cores", b) ⇒ b.intValue must be > (0) case ("network-max-rx", b) ⇒ b.longValue must be > (0L) case ("network-max-tx", b) ⇒ b.longValue must be > (0L) - case ("system-load-average", b) ⇒ // not possible to assert b, allowed to be negative or positive + case ("system-load-average", b) ⇒ b.doubleValue must be >= (0.0) case ("processors", b) ⇒ b.intValue must be >= (0) case ("heap-memory-used", b) ⇒ b.longValue must be >= (0L) case ("heap-memory-committed", b) ⇒ b.longValue must be > (0L) @@ -110,8 +109,7 @@ class MetricsCollectorSpec extends AkkaSpec(MetricsEnabledSpec.config) with Impl "collect JMX metrics" in { // heap max may be undefined depending on the OS - // systemLoadAverage is JMX is SIGAR not present - collector.systemLoadAverage.isDefined must be(true) + // systemLoadAverage is JMX if SIGAR not present, but not available on all OS collector.used.isDefined must be(true) collector.committed.isDefined must be(true) collector.processors.isDefined must be(true) From 35493b6c584f4ea4a91cd7de22206a4f6237357b Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Sat, 3 Nov 2012 20:20:48 +0100 Subject: [PATCH 105/210] Unbreaking poolsize for everybody. --- .../scala/akka/remote/netty/NettyRemoteSupport.scala | 8 ++------ .../src/main/scala/akka/remote/netty/Server.scala | 12 ++++-------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala b/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala index 7c27a82e6d..a65bac1a66 100644 --- a/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala +++ b/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala @@ -41,12 +41,8 @@ private[akka] class NettyRemoteTransport(_system: ExtendedActorSystem, _provider val timer: HashedWheelTimer = new HashedWheelTimer(system.threadFactory) val clientChannelFactory = { - settings.UseDispatcherForIO match { - case Some(id) ⇒ - val d = system.dispatchers.lookup(id) - new NioClientSocketChannelFactory(d, d, settings.ClientSocketWorkerPoolSize) - case None ⇒ - new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool(), settings.ClientSocketWorkerPoolSize) + val boss, worker = settings.UseDispatcherForIO.map(system.dispatchers.lookup) getOrElse Executors.newCachedThreadPool() + new NioClientSocketChannelFactory(boss, worker, settings.ClientSocketWorkerPoolSize) } /** diff --git a/akka-remote/src/main/scala/akka/remote/netty/Server.scala b/akka-remote/src/main/scala/akka/remote/netty/Server.scala index 2f76b324cd..83c9b6026b 100644 --- a/akka-remote/src/main/scala/akka/remote/netty/Server.scala +++ b/akka-remote/src/main/scala/akka/remote/netty/Server.scala @@ -25,14 +25,10 @@ private[akka] class NettyRemoteServer(val netty: NettyRemoteTransport) { val ip = InetAddress.getByName(settings.Hostname) - private val factory = - settings.UseDispatcherForIO match { - case Some(id) ⇒ - val d = netty.system.dispatchers.lookup(id) - new NioServerSocketChannelFactory(d, d, settings.ServerSocketWorkerPoolSize) - case None ⇒ - new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool(), settings.ServerSocketWorkerPoolSize) - } + private val factory = { + val boss, worker = settings.UseDispatcherForIO.map(netty.system.dispatchers.lookup) getOrElse Executors.newCachedThreadPool() + new NioServerSocketChannelFactory(boss, worker, settings.ServerSocketWorkerPoolSize) + } // group of open channels, used for clean-up private val openChannels: ChannelGroup = new DefaultDisposableChannelGroup("akka-remote-server") From 480f5d5683569d324dad7cf0f883c47fcad86320 Mon Sep 17 00:00:00 2001 From: Roland Date: Mon, 5 Nov 2012 22:11:57 +0100 Subject: [PATCH 106/210] make FSM.receive overridable, see #2680 --- akka-actor/src/main/scala/akka/actor/FSM.scala | 2 +- akka-docs/rst/scala/fsm.rst | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/akka-actor/src/main/scala/akka/actor/FSM.scala b/akka-actor/src/main/scala/akka/actor/FSM.scala index 273ab765c3..069691ce67 100644 --- a/akka-actor/src/main/scala/akka/actor/FSM.scala +++ b/akka-actor/src/main/scala/akka/actor/FSM.scala @@ -521,7 +521,7 @@ trait FSM[S, D] extends Listeners with ActorLogging { * Main actor receive() method * ******************************************* */ - override final def receive: Receive = { + override def receive: Receive = { case TimeoutMarker(gen) ⇒ if (generation == gen) { processMsg(StateTimeout, "state timeout") diff --git a/akka-docs/rst/scala/fsm.rst b/akka-docs/rst/scala/fsm.rst index bcccce0197..4ace396a14 100644 --- a/akka-docs/rst/scala/fsm.rst +++ b/akka-docs/rst/scala/fsm.rst @@ -124,6 +124,14 @@ obvious that an actor is actually created: :include: simple-fsm :exclude: fsm-body +.. note:: + + The FSM trait defines a ``receive`` method which handles internal messages + and passes everything else through to the FSM logic (according to the + current state). When overriding the ``receive`` method, keep in mind that + e.g. state timeout handling depends on actually passing the messages through + the FSM logic. + The :class:`FSM` trait takes two type parameters: #. the supertype of all state names, usually a sealed trait with case objects From 94060d61326f15c6576c16dc7afd430673fe2838 Mon Sep 17 00:00:00 2001 From: Peter Vlugter Date: Tue, 6 Nov 2012 12:30:31 +1300 Subject: [PATCH 107/210] Update build and sbt plugin to sbt 0.12.1 --- akka-sbt-plugin/sample/project/Build.scala | 6 +++--- akka-sbt-plugin/sample/project/build.properties | 2 +- akka-sbt-plugin/sample/project/plugins.sbt | 2 -- akka-sbt-plugin/src/main/scala/AkkaKernelPlugin.scala | 4 ++-- project/AkkaBuild.scala | 2 +- project/build.properties | 2 +- 6 files changed, 8 insertions(+), 10 deletions(-) diff --git a/akka-sbt-plugin/sample/project/Build.scala b/akka-sbt-plugin/sample/project/Build.scala index b7c5122da3..6fbf075359 100644 --- a/akka-sbt-plugin/sample/project/Build.scala +++ b/akka-sbt-plugin/sample/project/Build.scala @@ -7,7 +7,7 @@ import akka.sbt.AkkaKernelPlugin.{ Dist, outputDirectory, distJvmOptions} object HelloKernelBuild extends Build { val Organization = "akka.sample" val Version = "2.2-SNAPSHOT" - val ScalaVersion = "2.10.0-M6" + val ScalaVersion = "2.10.0-RC1" lazy val HelloKernel = Project( id = "hello-kernel", @@ -52,7 +52,7 @@ object Dependency { val Akka = "2.2-SNAPSHOT" } - val akkaKernel = "com.typesafe.akka" % "akka-kernel" % V.Akka - val akkaSlf4j = "com.typesafe.akka" % "akka-slf4j" % V.Akka + val akkaKernel = "com.typesafe.akka" %% "akka-kernel" % V.Akka cross CrossVersion.full + val akkaSlf4j = "com.typesafe.akka" %% "akka-slf4j" % V.Akka cross CrossVersion.full val logback = "ch.qos.logback" % "logback-classic" % "1.0.0" } diff --git a/akka-sbt-plugin/sample/project/build.properties b/akka-sbt-plugin/sample/project/build.properties index f4ff7a5afa..4474a03e1a 100644 --- a/akka-sbt-plugin/sample/project/build.properties +++ b/akka-sbt-plugin/sample/project/build.properties @@ -1 +1 @@ -sbt.version=0.11.2 +sbt.version=0.12.1 diff --git a/akka-sbt-plugin/sample/project/plugins.sbt b/akka-sbt-plugin/sample/project/plugins.sbt index b34eb00adb..6200abdd63 100644 --- a/akka-sbt-plugin/sample/project/plugins.sbt +++ b/akka-sbt-plugin/sample/project/plugins.sbt @@ -1,3 +1 @@ -resolvers += "Typesafe Repo" at "http://repo.typesafe.com/typesafe/releases/" - addSbtPlugin("com.typesafe.akka" % "akka-sbt-plugin" % "2.2-SNAPSHOT") diff --git a/akka-sbt-plugin/src/main/scala/AkkaKernelPlugin.scala b/akka-sbt-plugin/src/main/scala/AkkaKernelPlugin.scala index 835a596a4a..f000763a70 100644 --- a/akka-sbt-plugin/src/main/scala/AkkaKernelPlugin.scala +++ b/akka-sbt-plugin/src/main/scala/AkkaKernelPlugin.scala @@ -59,7 +59,7 @@ object AkkaKernelPlugin extends Plugin { (distConfig, sourceDirectory, crossTarget, dependencyClasspath, projectDependencies, allDependencies, buildStructure, state) map { (conf, src, tgt, cp, projDeps, allDeps, buildStruct, st) ⇒ if (isKernelProject(allDeps)) { - val log = logger(st) + val log = st.log val distBinPath = conf.outputDirectory / "bin" val distConfigPath = conf.outputDirectory / "config" val distDeployPath = conf.outputDirectory / "deploy" @@ -201,7 +201,7 @@ object AkkaKernelPlugin extends Plugin { def setting[A](key: SettingKey[A], errorMessage: ⇒ String) = { optionalSetting(key) getOrElse { - logger(state).error(errorMessage); + state.log.error(errorMessage); throw new IllegalArgumentException() } } diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 000456ebdf..8c1a4a6335 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -274,7 +274,7 @@ object AkkaBuild extends Build { publishMavenStyle := false, // SBT Plugins should be published as Ivy publishTo <<= Publish.akkaPluginPublishTo, scalacOptions in Compile := Seq("-encoding", "UTF-8", "-deprecation", "-unchecked"), - scalaVersion := "2.9.1", + scalaVersion := "2.9.2", scalaBinaryVersion <<= scalaVersion ) ) diff --git a/project/build.properties b/project/build.properties index a8c2f849be..4474a03e1a 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=0.12.0 +sbt.version=0.12.1 From 645e713362db2966c73e914b531a2f8210304bad Mon Sep 17 00:00:00 2001 From: Roland Date: Tue, 6 Nov 2012 09:34:45 +0100 Subject: [PATCH 108/210] align Act.become with context.become, see #2682 - become uses discardOld=true - becomeStacked uses discardOld=false - update docs and demonstrate this difference --- .../test/scala/akka/actor/ActorDSLSpec.scala | 28 ++++++++++++++++++- .../main/scala/akka/actor/dsl/Creators.scala | 13 +++++++-- akka-docs/rst/scala/actors.rst | 11 ++++++++ 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/actor/ActorDSLSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ActorDSLSpec.scala index 578f557871..097912601a 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ActorDSLSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ActorDSLSpec.scala @@ -103,6 +103,32 @@ class ActorDSLSpec extends AkkaSpec { i.receive() must be("hi") } + "support becomeStacked" in { + //#becomeStacked + val a = actor(new Act { + become { // this will replace the initial (empty) behavior + case "info" ⇒ sender ! "A" + case "switch" ⇒ + becomeStacked { // this will stack upon the "A" behavior + case "info" ⇒ sender ! "B" + case "switch" ⇒ unbecome() // return to the "A" behavior + } + case "lobotomize" => unbecome() // OH NOES: Actor.emptyBehavior + } + }) + //#becomeStacked + + implicit def sender = testActor + a ! "info" + expectMsg("A") + a ! "switch" + a ! "info" + expectMsg("B") + a ! "switch" + a ! "info" + expectMsg("A") + } + "support setup/teardown" in { //#simple-start-stop val a = actor(new Act { @@ -188,7 +214,7 @@ class ActorDSLSpec extends AkkaSpec { become { case 1 ⇒ stash() case 2 ⇒ - testActor ! 2; unstashAll(); become { + testActor ! 2; unstashAll(); becomeStacked { case 1 ⇒ testActor ! 1; unbecome() } } diff --git a/akka-actor/src/main/scala/akka/actor/dsl/Creators.scala b/akka-actor/src/main/scala/akka/actor/dsl/Creators.scala index 98ab610502..a9515f3000 100644 --- a/akka-actor/src/main/scala/akka/actor/dsl/Creators.scala +++ b/akka-actor/src/main/scala/akka/actor/dsl/Creators.scala @@ -29,7 +29,9 @@ trait Creators { this: ActorDSL.type ⇒ * for quickly trying things out in the REPL. It makes the following keywords * available: * - * - `become` mapped to `context.become(_, discardOld = false)` + * - `become` mapped to `context.become(_, discardOld = true)` + * + * - `becomeStacked` mapped to `context.become(_, discardOld = false)` * * - `unbecome` mapped to `context.unbecome` * @@ -87,7 +89,14 @@ trait Creators { this: ActorDSL.type ⇒ * stack is cleared upon restart. Use `unbecome()` to pop an element off * this stack. */ - def become(r: Receive) = context.become(r, discardOld = false) + def becomeStacked(r: Receive) = context.become(r, discardOld = false) + + /** + * Replace the behavior at the top of the behavior stack for this actor. The + * stack is cleared upon restart. Use `unbecome()` to pop an element off + * this stack or `becomeStacked()` to push a new element on top of it. + */ + def become(r: Receive) = context.become(r, discardOld = true) /** * Pop the active behavior from the behavior stack of this actor. This stack diff --git a/akka-docs/rst/scala/actors.rst b/akka-docs/rst/scala/actors.rst index e81f744952..5a4be2cc58 100644 --- a/akka-docs/rst/scala/actors.rst +++ b/akka-docs/rst/scala/actors.rst @@ -174,6 +174,17 @@ form of the ``implicit val context: ActorContext``. Outside of an actor, you have to either declare an implicit :class:`ActorSystem`, or you can give the factory explicitly (see further below). +The two possible ways of issuing a ``context.become`` (replacing or adding the +new behavior) are offered separately to enable a clutter-free notation of +nested receives: + +.. includecode:: ../../../akka-actor-tests/src/test/scala/akka/actor/ActorDSLSpec.scala#becomeStacked + +Please note that calling ``unbecome`` more often than ``becomeStacked`` results +in the original behavior being installed, which in case of the :class:`Act` +trait is the empty behavior (the outer ``become`` just replaces it during +construction). + Life-cycle hooks are also exposed as DSL elements (see `Start Hook`_ and `Stop Hook`_ below), where later invocations of the methods shown below will replace the contents of the respective hooks: From f9eb59e8833d68c008f9273679a279b75558c551 Mon Sep 17 00:00:00 2001 From: Roland Date: Tue, 6 Nov 2012 11:00:27 +0100 Subject: [PATCH 109/210] better document become semantics, see #2683 --- .../src/main/scala/akka/actor/ActorCell.scala | 22 +++++++--- .../src/main/scala/akka/actor/Stash.scala | 4 +- .../code/docs/actor/UntypedActorSwapper.java | 4 +- akka-docs/rst/java/untyped-actors.rst | 29 ++++++------- akka-docs/rst/scala/actors.rst | 43 +++++++------------ .../scala/code/docs/actor/ActorDocSpec.scala | 4 +- akka-docs/rst/scala/typed-actors.rst | 5 ++- 7 files changed, 54 insertions(+), 57 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorCell.scala b/akka-actor/src/main/scala/akka/actor/ActorCell.scala index 8108626ab4..14d280eb98 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorCell.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorCell.scala @@ -76,8 +76,14 @@ trait ActorContext extends ActorRefFactory { /** * Changes the Actor's behavior to become the new 'Receive' (PartialFunction[Any, Unit]) handler. - * Puts the behavior on top of the hotswap stack. - * If "discardOld" is true, an unbecome will be issued prior to pushing the new behavior to the stack + * This method acts upon the behavior stack as follows: + * + * - if `discardOld = true` it will replace the top element (i.e. the current behavior) + * - if `discardOld = false` it will keep the current behavior and push the given one atop + * + * The default of replacing the current behavior has been chosen to avoid memory leaks in + * case client code is written without consulting this documentation first (i.e. always pushing + * new closures and never issuing an `unbecome()`) */ def become(behavior: Actor.Receive, discardOld: Boolean = true): Unit @@ -167,14 +173,20 @@ trait UntypedActorContext extends ActorContext { /** * Changes the Actor's behavior to become the new 'Procedure' handler. - * Puts the behavior on top of the hotswap stack. + * Replaces the current behavior at the top of the hotswap stack. */ def become(behavior: Procedure[Any]): Unit /** * Changes the Actor's behavior to become the new 'Procedure' handler. - * Puts the behavior on top of the hotswap stack. - * If "discardOld" is true, an unbecome will be issued prior to pushing the new behavior to the stack + * This method acts upon the behavior stack as follows: + * + * - if `discardOld = true` it will replace the top element (i.e. the current behavior) + * - if `discardOld = false` it will keep the current behavior and push the given one atop + * + * The default of replacing the current behavior has been chosen to avoid memory leaks in + * case client code is written without consulting this documentation first (i.e. always pushing + * new closures and never issuing an `unbecome()`) */ def become(behavior: Procedure[Any], discardOld: Boolean): Unit diff --git a/akka-actor/src/main/scala/akka/actor/Stash.scala b/akka-actor/src/main/scala/akka/actor/Stash.scala index 05b618d03a..cdf4ef6d5b 100644 --- a/akka-actor/src/main/scala/akka/actor/Stash.scala +++ b/akka-actor/src/main/scala/akka/actor/Stash.scala @@ -16,13 +16,13 @@ import akka.AkkaException * def receive = { * case "open" ⇒ * unstashAll() - * context.become { + * context.become({ * case "write" ⇒ // do writing... * case "close" ⇒ * unstashAll() * context.unbecome() * case msg ⇒ stash() - * } + * }, discardOld = false) * case "done" ⇒ // done * case msg ⇒ stash() * } diff --git a/akka-docs/rst/java/code/docs/actor/UntypedActorSwapper.java b/akka-docs/rst/java/code/docs/actor/UntypedActorSwapper.java index c882ac015a..5098278a38 100644 --- a/akka-docs/rst/java/code/docs/actor/UntypedActorSwapper.java +++ b/akka-docs/rst/java/code/docs/actor/UntypedActorSwapper.java @@ -32,9 +32,9 @@ public class UntypedActorSwapper { @Override public void apply(Object message) { log.info("Ho"); - getContext().unbecome(); // resets the latest 'become' (just for fun) + getContext().unbecome(); // resets the latest 'become' } - }); + }, false); // this signals stacking of the new behavior } else { unhandled(message); } diff --git a/akka-docs/rst/java/untyped-actors.rst b/akka-docs/rst/java/untyped-actors.rst index 2ee8bc397f..c708188d07 100644 --- a/akka-docs/rst/java/untyped-actors.rst +++ b/akka-docs/rst/java/untyped-actors.rst @@ -549,7 +549,8 @@ Upgrade Akka supports hotswapping the Actor’s message loop (e.g. its implementation) at runtime. Use the ``getContext().become`` method from within the Actor. -The hotswapped code is kept in a Stack which can be pushed and popped. +The hotswapped code is kept in a Stack which can be pushed (replacing or adding +at the top) and popped. .. warning:: @@ -563,26 +564,20 @@ To hotswap the Actor using ``getContext().become``: .. includecode:: code/docs/actor/UntypedActorDocTestBase.java :include: hot-swap-actor -The ``become`` method is useful for many different things, such as to implement -a Finite State Machine (FSM). +This variant of the :meth:`become` method is useful for many different things, +such as to implement a Finite State Machine (FSM). It will replace the current +behavior (i.e. the top of the behavior stack), which means that +:meth:`unbecome` is not called, instead always the next behavior is explicitly +installed. -Here is another little cute example of ``become`` and ``unbecome`` in action: +The other way of using :meth:`become` does not replace but add to the top of +the behavior stack. In this case care must be taken to ensure that the number +of “pop” operations (i.e. :meth:`unbecome`) matches the number of “push” ones +in the long run, otherwise this amounts to a memory leak (which is why this +behavior is not the default). .. includecode:: code/docs/actor/UntypedActorSwapper.java#swapper -Downgrade ---------- - -Since the hotswapped code is pushed to a Stack you can downgrade the code as -well. Use the ``getContext().unbecome`` method from within the Actor. - -.. code-block:: java - - public void onReceive(Object message) { - if (message.equals("revert")) getContext().unbecome(); - } - - Stash ===== diff --git a/akka-docs/rst/scala/actors.rst b/akka-docs/rst/scala/actors.rst index e81f744952..6e90d589ae 100644 --- a/akka-docs/rst/scala/actors.rst +++ b/akka-docs/rst/scala/actors.rst @@ -653,11 +653,10 @@ Upgrade ------- Akka supports hotswapping the Actor’s message loop (e.g. its implementation) at -runtime: Invoke the ``context.become`` method from within the Actor. - -Become takes a ``PartialFunction[Any, Unit]`` that implements -the new message handler. The hotswapped code is kept in a Stack which can be -pushed and popped. +runtime: invoke the ``context.become`` method from within the Actor. +:meth:`become` takes a ``PartialFunction[Any, Unit]`` that implements the new +message handler. The hotswapped code is kept in a Stack which can be pushed and +popped. .. warning:: @@ -667,38 +666,26 @@ To hotswap the Actor behavior using ``become``: .. includecode:: code/docs/actor/ActorDocSpec.scala#hot-swap-actor -The ``become`` method is useful for many different things, but a particular nice -example of it is in example where it is used to implement a Finite State Machine -(FSM): `Dining Hakkers`_. +This variant of the :meth:`become` method is useful for many different things, +such as to implement a Finite State Machine (FSM, for an example see `Dining +Hakkers`_). It will replace the current behavior (i.e. the top of the behavior +stack), which means that :meth:`unbecome` is not called, instead always the +next behavior is explicitly installed. .. _Dining Hakkers: @github@/akka-samples/akka-sample-fsm/src/main/scala/DiningHakkersOnBecome.scala -Here is another little cute example of ``become`` and ``unbecome`` in action: +The other way of using :meth:`become` does not replace but add to the top of +the behavior stack. In this case care must be taken to ensure that the number +of “pop” operations (i.e. :meth:`unbecome`) matches the number of “push” ones +in the long run, otherwise this amounts to a memory leak (which is why this +behavior is not the default). .. includecode:: code/docs/actor/ActorDocSpec.scala#swapper Encoding Scala Actors nested receives without accidentally leaking memory ------------------------------------------------------------------------- -See this `Unnested receive example `_. - - -Downgrade ---------- - -Since the hotswapped code is pushed to a Stack you can downgrade the code as -well, all you need to do is to: Invoke the ``context.unbecome`` method from within the Actor. - -This will pop the Stack and replace the Actor's implementation with the -``PartialFunction[Any, Unit]`` that is at the top of the Stack. - -Here's how you use the ``unbecome`` method: - -.. code-block:: scala - - def receive = { - case "revert" => context.unbecome() - } +See this `Unnested receive example <@github@/akka-docs/scala/code/docs/actor/UnnestedReceives.scala>`_. Stash diff --git a/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala b/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala index 611b7a43f5..6642df3b28 100644 --- a/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala @@ -96,11 +96,11 @@ class Swapper extends Actor { def receive = { case Swap ⇒ log.info("Hi") - become { + become({ case Swap ⇒ log.info("Ho") unbecome() // resets the latest 'become' (just for fun) - } + }, discardOld = false) // push on top instead of replace } } diff --git a/akka-docs/rst/scala/typed-actors.rst b/akka-docs/rst/scala/typed-actors.rst index ce9c608e4e..0a0597cf0d 100644 --- a/akka-docs/rst/scala/typed-actors.rst +++ b/akka-docs/rst/scala/typed-actors.rst @@ -7,7 +7,10 @@ Essentially turning method invocations into asynchronous dispatch instead of syn Typed Actors consist of 2 "parts", a public interface and an implementation, and if you've done any work in "enterprise" Java, this will be very familiar to you. As with normal Actors you have an external API (the public interface instance) that will delegate methodcalls asynchronously to a private instance of the implementation. -The advantage of Typed Actors vs. Actors is that with TypedActors you have a static contract, and don't need to define your own messages, the downside is that it places some limitations on what you can do and what you can't, i.e. you can't use become/unbecome. +The advantage of Typed Actors vs. Actors is that with TypedActors you have a +static contract, and don't need to define your own messages, the downside is +that it places some limitations on what you can do and what you can't, i.e. you +cannot use :meth:`become`/:meth:`unbecome`. Typed Actors are implemented using `JDK Proxies `_ which provide a pretty easy-worked API to intercept method calls. From 657a24dbc80e8830072bcd031f7bd56c74985f6d Mon Sep 17 00:00:00 2001 From: Roland Date: Tue, 6 Nov 2012 11:41:50 +0100 Subject: [PATCH 110/210] change Java stash sample to become(), see #2642 --- .../docs/actor/UntypedActorDocTestBase.java | 31 +++++++++---------- akka-docs/rst/java/untyped-actors.rst | 8 +++-- akka-docs/rst/scala/actors.rst | 8 +++-- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/akka-docs/rst/java/code/docs/actor/UntypedActorDocTestBase.java b/akka-docs/rst/java/code/docs/actor/UntypedActorDocTestBase.java index d825858239..fded2ddb3b 100644 --- a/akka-docs/rst/java/code/docs/actor/UntypedActorDocTestBase.java +++ b/akka-docs/rst/java/code/docs/actor/UntypedActorDocTestBase.java @@ -351,24 +351,23 @@ public class UntypedActorDocTestBase { static //#stash public class ActorWithProtocol extends UntypedActorWithStash { - private Boolean isOpen = false; public void onReceive(Object msg) { - if (isOpen) { - if (msg.equals("write")) { - // do writing... - } else if (msg.equals("close")) { - unstashAll(); - isOpen = false; - } else { - stash(); - } + if (msg.equals("open")) { + unstashAll(); + getContext().become(new Procedure() { + public void apply(Object msg) throws Exception { + if (msg.equals("write")) { + // do writing... + } else if (msg.equals("close")) { + unstashAll(); + getContext().unbecome(); + } else { + stash(); + } + } + }, false); // add behavior on top instead of replacing } else { - if (msg.equals("open")) { - unstashAll(); - isOpen = true; - } else { - stash(); - } + stash(); } } } diff --git a/akka-docs/rst/java/untyped-actors.rst b/akka-docs/rst/java/untyped-actors.rst index 2ee8bc397f..6c3e08f377 100644 --- a/akka-docs/rst/java/untyped-actors.rst +++ b/akka-docs/rst/java/untyped-actors.rst @@ -627,9 +627,11 @@ The stash is backed by a ``scala.collection.immutable.Vector``. As a result, even a very large number of messages may be stashed without a major impact on performance. -Note that the stash is not persisted across restarts of an actor, -unlike the actor's mailbox. Therefore, it should be managed like other -parts of the actor's state which have the same property. +Note that the stash is part of the ephemeral actor state, unlike the +mailbox. Therefore, it should be managed like other parts of the +actor's state which have the same property. The :class:`Stash` trait’s +implementation of :meth:`preRestart` will call ``unstashAll()``, which is +usually the desired behavior. Killing an Actor diff --git a/akka-docs/rst/scala/actors.rst b/akka-docs/rst/scala/actors.rst index e81f744952..313d8643b2 100644 --- a/akka-docs/rst/scala/actors.rst +++ b/akka-docs/rst/scala/actors.rst @@ -752,9 +752,11 @@ major impact on performance. callback. This means it's not possible to write ``Actor with MyActor with Stash`` if ``MyActor`` overrides ``preRestart``. -Note that the stash is not persisted across restarts of an actor, -unlike the actor's mailbox. Therefore, it should be managed like other -parts of the actor's state which have the same property. +Note that the stash is part of the ephemeral actor state, unlike the +mailbox. Therefore, it should be managed like other parts of the +actor's state which have the same property. The :class:`Stash` trait’s +implementation of :meth:`preRestart` will call ``unstashAll()``, which is +usually the desired behavior. Killing an Actor From fb237b859e886aa651294303d9665065222a8bc2 Mon Sep 17 00:00:00 2001 From: "Kaspar Fischer (hbf)" Date: Tue, 6 Nov 2012 11:55:09 +0100 Subject: [PATCH 111/210] removed `remaining` argument in `expectNoMsg` calls in tests --- .../throttle/TimerBasedThrottlerSpec.scala | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala b/akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala index c78384a2dd..cfb51554ad 100644 --- a/akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala +++ b/akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala @@ -91,7 +91,7 @@ class TimerBasedThrottlerSpec extends TestKit(ActorSystem("TimerBasedThrottlerSp expectMsg("1") expectMsg("2") expectMsg("3") - expectNoMsg(remaining) + expectNoMsg() } expectNoMsg(1 second) throttler ! SetTarget(Some(echo)) @@ -103,7 +103,7 @@ class TimerBasedThrottlerSpec extends TestKit(ActorSystem("TimerBasedThrottlerSp expectMsg("4") expectMsg("5") expectMsg("6") - expectNoMsg(remaining) + expectNoMsg() } within(1 second) { expectMsg("7") @@ -126,7 +126,7 @@ class TimerBasedThrottlerSpec extends TestKit(ActorSystem("TimerBasedThrottlerSp expectMsg("1") expectMsg("2") expectMsg("3") - expectNoMsg(remaining) + expectNoMsg() } expectNoMsg(1 second) throttler ! SetTarget(Some(echo)) @@ -134,7 +134,7 @@ class TimerBasedThrottlerSpec extends TestKit(ActorSystem("TimerBasedThrottlerSp expectMsg("4") expectMsg("5") expectMsg("6") - expectNoMsg(remaining) + expectNoMsg() } within(1 second) { expectMsg("7") @@ -156,13 +156,13 @@ class TimerBasedThrottlerSpec extends TestKit(ActorSystem("TimerBasedThrottlerSp expectMsg("1") expectMsg("2") expectMsg("3") - expectNoMsg(remaining) + expectNoMsg() } within(1 second) { expectMsg("4") expectMsg("5") expectMsg("6") - expectNoMsg(remaining) + expectNoMsg() } within(1 second) { expectMsg("7") @@ -187,14 +187,14 @@ class TimerBasedThrottlerSpec extends TestKit(ActorSystem("TimerBasedThrottlerSp expectMsg("2") expectMsg("3") expectMsg("4") - expectNoMsg(remaining) + expectNoMsg() } within(1 second) { expectMsg("5") expectMsg("6") expectMsg("7") expectMsg("8") - expectNoMsg(remaining) + expectNoMsg() } within(1 second) { expectMsg("9") From ebd47bcdf6deecd1732f66f3e906104b129f2c31 Mon Sep 17 00:00:00 2001 From: Roland Date: Tue, 6 Nov 2012 11:59:11 +0100 Subject: [PATCH 112/210] correct small confusion (short: confuso) --- akka-docs/rst/java/untyped-actors.rst | 5 ++--- akka-docs/rst/scala/actors.rst | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/akka-docs/rst/java/untyped-actors.rst b/akka-docs/rst/java/untyped-actors.rst index c708188d07..a7575148c4 100644 --- a/akka-docs/rst/java/untyped-actors.rst +++ b/akka-docs/rst/java/untyped-actors.rst @@ -566,9 +566,8 @@ To hotswap the Actor using ``getContext().become``: This variant of the :meth:`become` method is useful for many different things, such as to implement a Finite State Machine (FSM). It will replace the current -behavior (i.e. the top of the behavior stack), which means that -:meth:`unbecome` is not called, instead always the next behavior is explicitly -installed. +behavior (i.e. the top of the behavior stack), which means that you do not use +:meth:`unbecome`, instead always the next behavior is explicitly installed. The other way of using :meth:`become` does not replace but add to the top of the behavior stack. In this case care must be taken to ensure that the number diff --git a/akka-docs/rst/scala/actors.rst b/akka-docs/rst/scala/actors.rst index 6e90d589ae..21556eeefa 100644 --- a/akka-docs/rst/scala/actors.rst +++ b/akka-docs/rst/scala/actors.rst @@ -669,7 +669,7 @@ To hotswap the Actor behavior using ``become``: This variant of the :meth:`become` method is useful for many different things, such as to implement a Finite State Machine (FSM, for an example see `Dining Hakkers`_). It will replace the current behavior (i.e. the top of the behavior -stack), which means that :meth:`unbecome` is not called, instead always the +stack), which means that you do not use :meth:`unbecome`, instead always the next behavior is explicitly installed. .. _Dining Hakkers: @github@/akka-samples/akka-sample-fsm/src/main/scala/DiningHakkersOnBecome.scala From d98c4db1f981fcfa05be733503b9c17276da5cca Mon Sep 17 00:00:00 2001 From: Roland Date: Tue, 6 Nov 2012 14:15:57 +0100 Subject: [PATCH 113/210] fix up two oversights in previous doc change - use discardOld=false also in Scala stash sample code - correct link to UnnestedReceives sample --- akka-actor-tests/src/test/scala/akka/actor/ActorDSLSpec.scala | 2 +- akka-docs/rst/scala/actors.rst | 2 +- akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/actor/ActorDSLSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ActorDSLSpec.scala index 097912601a..2aba0e18d4 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ActorDSLSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ActorDSLSpec.scala @@ -113,7 +113,7 @@ class ActorDSLSpec extends AkkaSpec { case "info" ⇒ sender ! "B" case "switch" ⇒ unbecome() // return to the "A" behavior } - case "lobotomize" => unbecome() // OH NOES: Actor.emptyBehavior + case "lobotomize" ⇒ unbecome() // OH NOES: Actor.emptyBehavior } }) //#becomeStacked diff --git a/akka-docs/rst/scala/actors.rst b/akka-docs/rst/scala/actors.rst index 85f5c7ae8e..e52d9ba973 100644 --- a/akka-docs/rst/scala/actors.rst +++ b/akka-docs/rst/scala/actors.rst @@ -696,7 +696,7 @@ behavior is not the default). Encoding Scala Actors nested receives without accidentally leaking memory ------------------------------------------------------------------------- -See this `Unnested receive example <@github@/akka-docs/scala/code/docs/actor/UnnestedReceives.scala>`_. +See this `Unnested receive example <@github@/akka-docs/rst/scala/code/docs/actor/UnnestedReceives.scala>`_. Stash diff --git a/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala b/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala index 6642df3b28..fc936ff13b 100644 --- a/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/actor/ActorDocSpec.scala @@ -316,13 +316,13 @@ class ActorDocSpec extends AkkaSpec(Map("akka.loglevel" -> "INFO")) { def receive = { case "open" ⇒ unstashAll() - context.become { + context.become({ case "write" ⇒ // do writing... case "close" ⇒ unstashAll() context.unbecome() case msg ⇒ stash() - } + }, discardOld = false) // stack on top instead of replacing case msg ⇒ stash() } } From aeb4e471415b2f757d4065cc5baed8a940e78cc4 Mon Sep 17 00:00:00 2001 From: "Kaspar Fischer (hbf)" Date: Tue, 6 Nov 2012 15:35:40 +0100 Subject: [PATCH 114/210] fixes to accomodate time dilation in tests and minor issues from reviews by @rkuhn and @patriknw --- .../contrib/throttle/TimerBasedThrottler.scala | 2 +- .../throttle/TimerBasedThrottlerSpec.scala | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/akka-contrib/src/main/scala/akka/contrib/throttle/TimerBasedThrottler.scala b/akka-contrib/src/main/scala/akka/contrib/throttle/TimerBasedThrottler.scala index 4917be2579..de614619f7 100644 --- a/akka-contrib/src/main/scala/akka/contrib/throttle/TimerBasedThrottler.scala +++ b/akka-contrib/src/main/scala/akka/contrib/throttle/TimerBasedThrottler.scala @@ -54,7 +54,7 @@ import akka.AkkaException * * @see [[akka.contrib.throttle.TimerBasedThrottler]] */ -trait Throttler { self: Actor ⇒ } +trait Throttler { this: Actor ⇒ } /** * Message types understood by [[akka.contrib.throttle.Throttler]]'s. diff --git a/akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala b/akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala index cfb51554ad..be077489ee 100644 --- a/akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala +++ b/akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala @@ -17,6 +17,7 @@ import org.scalatest.junit.JUnitRunner import org.scalatest.WordSpec import org.scalatest.matchers.MustMatchers import org.scalatest.BeforeAndAfterAll +import akka.testkit._ object TimerBasedThrottlerSpec { class EchoActor extends Actor { @@ -36,7 +37,7 @@ class TimerBasedThrottlerSpec extends TestKit(ActorSystem("TimerBasedThrottlerSp "A throttler" must { - "must pass the ScalaDoc class documentation example prgoram" in { + "must pass the ScalaDoc class documentation example program" in { //#demo-code // A simple actor that prints whatever it receives val printer = system.actorOf(Props(new Actor { @@ -45,7 +46,7 @@ class TimerBasedThrottlerSpec extends TestKit(ActorSystem("TimerBasedThrottlerSp } })) // The throttler for this example, setting the rate - val throttler = system.actorOf(Props(new TimerBasedThrottler(3 msgsPer (1 second)))) + val throttler = system.actorOf(Props(new TimerBasedThrottler(3 msgsPer (1.second.dilated)))) // Set the target throttler ! SetTarget(Some(printer)) // These three messages will be sent to the echoer immediately @@ -60,7 +61,7 @@ class TimerBasedThrottlerSpec extends TestKit(ActorSystem("TimerBasedThrottlerSp "keep messages until a target is set" in { val echo = system.actorOf(Props[TimerBasedThrottlerSpec.EchoActor]) - val throttler = system.actorOf(Props(new TimerBasedThrottler(3 msgsPer (1 second)))) + val throttler = system.actorOf(Props(new TimerBasedThrottler(3 msgsPer (1.second.dilated)))) throttler ! "1" throttler ! "2" throttler ! "3" @@ -81,7 +82,7 @@ class TimerBasedThrottlerSpec extends TestKit(ActorSystem("TimerBasedThrottlerSp "send messages after a `SetTarget(None)` pause" in { val echo = system.actorOf(Props[TimerBasedThrottlerSpec.EchoActor]) - val throttler = system.actorOf(Props(new TimerBasedThrottler(3 msgsPer (1 second)))) + val throttler = system.actorOf(Props(new TimerBasedThrottler(3 msgsPer (1.second.dilated)))) throttler ! SetTarget(Some(echo)) throttler ! "1" throttler ! "2" @@ -112,7 +113,7 @@ class TimerBasedThrottlerSpec extends TestKit(ActorSystem("TimerBasedThrottlerSp "keep messages when the target is set to None" in { val echo = system.actorOf(Props[TimerBasedThrottlerSpec.EchoActor]) - val throttler = system.actorOf(Props(new TimerBasedThrottler(3 msgsPer (1 second)))) + val throttler = system.actorOf(Props(new TimerBasedThrottler(3 msgsPer (1.second.dilated)))) throttler ! SetTarget(Some(echo)) throttler ! "1" throttler ! "2" @@ -143,7 +144,7 @@ class TimerBasedThrottlerSpec extends TestKit(ActorSystem("TimerBasedThrottlerSp "respect the rate (3 msg/s)" in { val echo = system.actorOf(Props[TimerBasedThrottlerSpec.EchoActor]) - val throttler = system.actorOf(Props(new TimerBasedThrottler(3 msgsPer (1 second)))) + val throttler = system.actorOf(Props(new TimerBasedThrottler(3 msgsPer (1.second.dilated)))) throttler ! SetTarget(Some(echo)) throttler ! "1" throttler ! "2" @@ -171,7 +172,7 @@ class TimerBasedThrottlerSpec extends TestKit(ActorSystem("TimerBasedThrottlerSp "respect the rate (4 msg/s)" in { val echo = system.actorOf(Props[TimerBasedThrottlerSpec.EchoActor]) - val throttler = system.actorOf(Props(new TimerBasedThrottler(4 msgsPer (1 second)))) + val throttler = system.actorOf(Props(new TimerBasedThrottler(4 msgsPer (1.second.dilated)))) throttler ! SetTarget(Some(echo)) throttler ! "1" throttler ! "2" From 1f61c293ec1ceb7c5adb18f939bdaba391e01bb4 Mon Sep 17 00:00:00 2001 From: Roland Date: Wed, 7 Nov 2012 09:49:56 +0100 Subject: [PATCH 115/210] fix two old Duration references --- akka-docs/rst/common/duration.rst | 2 +- akka-docs/rst/scala/testing.rst | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/akka-docs/rst/common/duration.rst b/akka-docs/rst/common/duration.rst index c159c99a8c..97136d48b3 100644 --- a/akka-docs/rst/common/duration.rst +++ b/akka-docs/rst/common/duration.rst @@ -5,7 +5,7 @@ Duration ######## Durations are used throughout the Akka library, wherefore this concept is -represented by a special data type, :class:`scala.concurrent.util.Duration`. +represented by a special data type, :class:`scala.concurrent.duration.Duration`. Values of this type may represent infinite (:obj:`Duration.Inf`, :obj:`Duration.MinusInf`) or finite durations, or be :obj:`Duration.Undefined`. diff --git a/akka-docs/rst/scala/testing.rst b/akka-docs/rst/scala/testing.rst index 9a80ab0e59..a57305ce30 100644 --- a/akka-docs/rst/scala/testing.rst +++ b/akka-docs/rst/scala/testing.rst @@ -713,8 +713,8 @@ Some `Specs2 `_ users have contributed examples of how to wor actually beneficial also for the third point—is to apply the TestKit together with :class:`org.specs2.specification.Scope`. * The Specification traits provide a :class:`Duration` DSL which uses partly - the same method names as :class:`scala.concurrent.util.Duration`, resulting in ambiguous - implicits if ``akka.util.duration._`` is imported. There are two work-arounds: + the same method names as :class:`scala.concurrent.duration.Duration`, resulting in ambiguous + implicits if ``scala.concurrent.duration._`` is imported. There are two work-arounds: * either use the Specification variant of Duration and supply an implicit conversion to the Akka Duration. This conversion is not supplied with the From eee616c6350df9239d367950e3232547f5637d55 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Wed, 7 Nov 2012 16:38:40 +0100 Subject: [PATCH 116/210] #2688 - Switching to s.c.u.Unsafe.instance for akka.util.Unsafe.instance --- .../src/main/scala/akka/util/Unsafe.java | 20 +------------------ 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/akka-actor/src/main/scala/akka/util/Unsafe.java b/akka-actor/src/main/scala/akka/util/Unsafe.java index ace3c1baac..005d1b3441 100644 --- a/akka-actor/src/main/scala/akka/util/Unsafe.java +++ b/akka-actor/src/main/scala/akka/util/Unsafe.java @@ -5,27 +5,9 @@ package akka.util; -import java.lang.reflect.Field; - /** * INTERNAL API */ public final class Unsafe { - public final static sun.misc.Unsafe instance; - static { - try { - sun.misc.Unsafe found = null; - for(Field field : sun.misc.Unsafe.class.getDeclaredFields()) { - if (field.getType() == sun.misc.Unsafe.class) { - field.setAccessible(true); - found = (sun.misc.Unsafe) field.get(null); - break; - } - } - if (found == null) throw new IllegalStateException("Can't find instance of sun.misc.Unsafe"); - else instance = found; - } catch(Throwable t) { - throw new ExceptionInInitializerError(t); - } - } + public final static sun.misc.Unsafe instance = scala.concurrent.util.Unsafe.instance; } From f306964fca35d7eab95727a8a7b213e3d30ce81e Mon Sep 17 00:00:00 2001 From: Helena Edelson Date: Thu, 18 Oct 2012 13:33:37 -0600 Subject: [PATCH 117/210] Initial work of adaptive metrics aware routers, see #2547 --- .../src/main/resources/reference.conf | 11 +- .../cluster/ClusterMetricsCollector.scala | 177 +++++++++++++++--- .../ClusterMetricsDataStreamingOffSpec.scala | 31 --- ...ptiveLoadBalancingRouterMultiJvmSpec.scala | 61 ++++++ .../routing/ClusterLoadBalancingRouter.scala | 155 +++++++++++++++ .../scala/akka/cluster/DataStreamSpec.scala | 9 +- .../MetricsAwareClusterNodeSelectorSpec.scala | 76 ++++++++ .../akka/cluster/MetricsCollectorSpec.scala | 12 +- .../akka/cluster/MetricsGossipSpec.scala | 12 +- .../cluster/NodeMetricsComparatorSpec.scala | 81 ++++++++ 10 files changed, 548 insertions(+), 77 deletions(-) delete mode 100644 akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterMetricsDataStreamingOffSpec.scala create mode 100644 akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterAdaptiveLoadBalancingRouterMultiJvmSpec.scala create mode 100644 akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterLoadBalancingRouter.scala create mode 100644 akka-cluster/src/test/scala/akka/cluster/MetricsAwareClusterNodeSelectorSpec.scala create mode 100644 akka-cluster/src/test/scala/akka/cluster/NodeMetricsComparatorSpec.scala diff --git a/akka-cluster/src/main/resources/reference.conf b/akka-cluster/src/main/resources/reference.conf index a1215f4563..d75ddd0a00 100644 --- a/akka-cluster/src/main/resources/reference.conf +++ b/akka-cluster/src/main/resources/reference.conf @@ -107,6 +107,13 @@ akka { } # Uses JMX and Hyperic SIGAR, if SIGAR is on the classpath. + # Metrics that are only available with SIGAR for load balancing of nodes are: + # 1. Network latency + # 2. CPU + # A. Combined CPU (sum of User + Sys + Nice + Wait, in percentage) + # B. System load average: on some OS the JMX load average may not be available, + # however if SIGAR is on the classpath it is available on any OS. + # C. The number of cores per processor metrics { # Enable or disable metrics collector for load-balancing nodes. enabled = on @@ -118,9 +125,7 @@ akka { gossip-interval = 3s # How quickly the exponential weighting of past data is decayed compared to - # new data. - # If set to 0 data streaming over time will be turned off. - # Set higher to increase the bias toward newer values + # new data. Set higher to increase the bias toward newer values. rate-of-decay = 10 } diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala index 76c01a6381..07016b098c 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala @@ -9,7 +9,7 @@ import scala.concurrent.duration._ import scala.collection.immutable.{ SortedSet, Map } import scala.concurrent.forkjoin.ThreadLocalRandom import scala.util.{ Try, Success, Failure } -import scala.math.ScalaNumericConversions +import math.{ ScalaNumber, ScalaNumericConversions } import scala.runtime.{ RichLong, RichDouble, RichInt } import akka.actor._ @@ -43,6 +43,8 @@ private[cluster] class ClusterMetricsCollector(publisher: ActorRef) extends Acto import cluster.{ selfAddress, scheduler, settings } import settings._ + val DefaultRateOfDecay: Int = 10 + /** * The node ring gossipped that contains only members that are Up. */ @@ -51,7 +53,7 @@ private[cluster] class ClusterMetricsCollector(publisher: ActorRef) extends Acto /** * The latest metric values with their statistical data. */ - var latestGossip: MetricsGossip = MetricsGossip(MetricsRateOfDecay) + var latestGossip: MetricsGossip = MetricsGossip(if (MetricsRateOfDecay <= 0) DefaultRateOfDecay else MetricsRateOfDecay) /** * The metrics collector that samples data on the node. @@ -252,12 +254,17 @@ private[cluster] case class DataStream(decay: Int, ewma: ScalaNumericConversions * The datam can be too large to fit into an int or long, thus we use ScalaNumericConversions, * and defer to BigInt or BigDecimal. * + * FIXME - look into the math: the new ewma becomes the new value + * value: 416979936, prev ewma: 416581760, new ewma: 416979936 + * * @param xn the new data point - * @return an new [[akka.cluster.DataStream]] with the updated yn and timestamp + * + * @return a [[akka.cluster.DataStream]] with the updated yn and timestamp */ - def :+(xn: ScalaNumericConversions): DataStream = convert(xn) fold ( - nl ⇒ copy(ewma = BigInt(α * nl + 1 - α * ewma.longValue()), timestamp = newTimestamp), - nd ⇒ copy(ewma = BigDecimal(α * nd + 1 - α * ewma.doubleValue()), timestamp = newTimestamp)) + def :+(xn: ScalaNumericConversions): DataStream = if (xn != ewma) convert(xn) fold ( + nl ⇒ copy(ewma = BigInt((α * nl) + (1 - α) * ewma.longValue()), timestamp = newTimestamp), + nd ⇒ copy(ewma = BigDecimal((α * nd) + (1 - α) * ewma.doubleValue()), timestamp = newTimestamp)) + else this /** * The duration of observation for this data stream @@ -266,18 +273,6 @@ private[cluster] case class DataStream(decay: Int, ewma: ScalaNumericConversions } -/** - * INTERNAL API - * - * Companion object of DataStream class. - */ -private[cluster] object DataStream { - - def apply(decay: Int, data: ScalaNumericConversions): Option[DataStream] = if (decay > 0) - Some(DataStream(decay, data, newTimestamp, newTimestamp)) else None - -} - /** * INTERNAL API * @@ -295,7 +290,7 @@ private[cluster] case class Metric(name: String, value: Option[ScalaNumericConve * Returns the metric with a new data stream for data trending if eligible, * otherwise returns the unchanged metric. */ - def initialize(decay: Int): Metric = if (initializable) copy(average = DataStream(decay, value.get)) else this + def initialize(decay: Int): Metric = if (initializable) copy(average = Some(DataStream(decay, value.get, newTimestamp, newTimestamp))) else this /** * If defined ( [[akka.cluster.MetricNumericConverter.defined()]] ), updates the new @@ -356,6 +351,49 @@ private[cluster] object Metric extends MetricNumericConverter { case Some(v) if defined(v) ⇒ Metric(name, value, None) case _ ⇒ Metric(name, None, None) } +} + +/** + * Reusable logic for particular metric categories or to leverage all for routing. + */ +private[cluster] trait MetricsAwareClusterNodeSelector { + import NodeMetrics._ + import NodeMetrics.NodeMetricsComparator._ + + /** + * Returns the address of the available node with the lowest cumulative difference + * between heap memory max and used/committed. + */ + def selectByMemory(nodes: Set[NodeMetrics]): Option[Address] = Try(Some(nodes.map { + n ⇒ + val (used, committed, max) = MetricValues.unapply(n.heapMemory) + (n.address, max match { + case Some(m) ⇒ ((committed - used) + (m - used) + (m - committed)) + case None ⇒ committed - used + }) + }.min._1)) getOrElse None + + // TODO + def selectByNetworkLatency(nodes: Set[NodeMetrics]): Option[Address] = None + /* Try(nodes.map { + n ⇒ + val (rxBytes, txBytes) = MetricValues.unapply(n.networkLatency).get + (n.address, (rxBytes + txBytes)) + }.min._1) getOrElse None // TODO: min or max + */ + + // TODO + def selectByCpu(nodes: Set[NodeMetrics]): Option[Address] = None + /* Try(nodes.map { + n ⇒ + val (loadAverage, processors, combinedCpu, cores) = MetricValues.unapply(n.cpu) + var cumulativeDifference = 0 + // TODO: calculate + combinedCpu.get + cores.get + (n.address, cumulativeDifference) + }.min._1) getOrElse None // TODO min or max + }*/ } @@ -378,6 +416,7 @@ private[cluster] object Metric extends MetricNumericConverter { * @param metrics the array of sampled [[akka.actor.Metric]] */ private[cluster] case class NodeMetrics(address: Address, timestamp: Long, metrics: Set[Metric] = Set.empty[Metric]) extends ClusterMessage { + import NodeMetrics._ /** * Returns the most recent data. @@ -394,6 +433,99 @@ private[cluster] case class NodeMetrics(address: Address, timestamp: Long, metri */ def same(that: NodeMetrics): Boolean = address == that.address + /** + * Of all the data streams, this fluctuates the most. + */ + def heapMemory: HeapMemory = HeapMemory(metric("heap-memory-used"), metric("heap-memory-committed"), metric("heap-memory-max")) + + def networkLatency: NetworkLatency = NetworkLatency(metric("network-max-rx"), metric("network-max-tx")) + + def cpu: Cpu = Cpu(metric("system-load-average"), metric("processors"), metric("cpu-combined"), metric("total-cores")) + + def metric(key: String): Metric = metrics.collectFirst { case m if m.name == key ⇒ m } getOrElse Metric(key, None) + +} + +/** + * INTERNAL API + * + * Companion object of Metric class - used by metrics consumers such as the load balancing routers. + * + * The following extractors and orderings hide the implementation from cluster metric consumers + * such as load balancers. + */ +private[cluster] object NodeMetrics { + + object NodeMetricsComparator extends MetricNumericConverter { + + implicit val longMinOrdering: Ordering[Long] = Ordering.fromLessThan[Long] { (a, b) ⇒ (a < b) } + + implicit val longMinAddressOrdering: Ordering[(Address, Long)] = new Ordering[(Address, Long)] { + def compare(a: (Address, Long), b: (Address, Long)): Int = longMinOrdering.compare(a._2, b._2) + } + + def maxAddressLong(seq: Seq[(Address, Long)]): (Address, Long) = + seq.reduceLeft((a: (Address, Long), b: (Address, Long)) ⇒ if (a._2 > b._2) a else b) + + implicit val doubleMinOrdering: Ordering[Double] = Ordering.fromLessThan[Double] { (a, b) ⇒ (a < b) } + + implicit val doubleMinAddressOrdering: Ordering[(Address, Double)] = new Ordering[(Address, Double)] { + def compare(a: (Address, Double), b: (Address, Double)): Int = doubleMinOrdering.compare(a._2, b._2) + } + + def maxAddressDouble(seq: Seq[(Address, Double)]): (Address, Double) = + seq.reduceLeft((a: (Address, Double), b: (Address, Double)) ⇒ if (a._2 > b._2) a else b) + } + + sealed trait MetricValues + + object MetricValues { + + def unapply(v: HeapMemory): Tuple3[Long, Long, Option[Long]] = + (v.used.average.get.ewma.longValue(), + v.committed.average.get.ewma.longValue(), + Try(Some(v.max.average.get.ewma.longValue())) getOrElse None) + + def unapply(v: NetworkLatency): Option[(Long, Long)] = + Try(Some(v.maxRxIO.average.get.ewma.longValue(), v.maxTxIO.average.get.ewma.longValue())) getOrElse None + + def unapply(v: Cpu): Tuple4[Double, Int, Option[Double], Option[Int]] = + (v.systemLoadAverage.value.get.doubleValue(), + v.processors.value.get.intValue(), + Try(Some(v.combinedCpu.average.get.ewma.doubleValue())) getOrElse None, + Try(Some(v.cores.value.get.intValue())) getOrElse None) + } + + /** + * @param used the current sum of heap memory used from all heap memory pools (in bytes) + * + * @param committed the current sum of heap memory guaranteed to be available to the JVM + * from all heap memory pools (in bytes). Committed will always be greater than or equal to used. + * + * @param max the maximum amount of memory (in bytes) that can be used for JVM memory management. + * Can be undefined on some OS. + */ + case class HeapMemory(used: Metric, committed: Metric, max: Metric) extends MetricValues + + /** + * @param maxRxIO the max network IO rx value, in bytes + * + * @param maxTxIO the max network IO tx value, in bytes + */ + case class NetworkLatency(maxRxIO: Metric, maxTxIO: Metric) extends MetricValues + + /** + * @param systemLoadAverage OS-specific average load on the CPUs in the system, for the past 1 minute + * + * @param processors the number of available processors + * + * @param combinedCpu combined CPU sum of User + Sys + Nice + Wait, in percentage. This metric can describe + * the amount of time the CPU spent executing code during n-interval and how much more it could theoretically. + * + * @param cores the number of cores (multi-core: per processor) + */ + private[cluster] case class Cpu(systemLoadAverage: Metric, processors: Metric, combinedCpu: Metric, cores: Metric) extends MetricValues + } /** @@ -462,7 +594,7 @@ private[cluster] class MetricsCollector private (private val sigar: Option[AnyRe systemLoadAverage, used, committed, max, processors, networkMaxRx, networkMaxTx)) /** - * (SIGAR / JMX) Returns the OS-specific average system load on the CPUs in the system, for the past 1 minute. + * (SIGAR / JMX) Returns the OS-specific average load on the CPUs in the system, for the past 1 minute. * On some systems the JMX OS system load average may not be available, in which case a Metric with * undefined value is returned. * Hyperic SIGAR provides more precise values, thus, if the library is on the classpath, it is the default. @@ -486,8 +618,7 @@ private[cluster] class MetricsCollector private (private val sigar: Option[AnyRe /** * (JMX) Returns the current sum of heap memory guaranteed to be available to the JVM - * from all heap memory pools (in bytes). Committed will always be greater - * than or equal to used. + * from all heap memory pools (in bytes). */ def committed: Metric = Metric("heap-memory-committed", Some(BigInt(memoryMBean.getHeapMemoryUsage.getCommitted))) @@ -508,11 +639,11 @@ private[cluster] class MetricsCollector private (private val sigar: Option[AnyRe def cpuCombined: Metric = Metric("cpu-combined", Try(BigDecimal(CombinedCpu.get.invoke(Cpu.get.invoke(sigar.get)).asInstanceOf[Double])).toOption) /** + * FIXME: Array[Int].head - expose all if cores per processor might differ. * (SIGAR) Returns the total number of cores. */ def totalCores: Metric = Metric("total-cores", Try(BigInt(CpuList.get.invoke(sigar.get).asInstanceOf[Array[AnyRef]].map(cpu ⇒ createMethodFrom(Some(cpu), "getTotalCores").get.invoke(cpu).asInstanceOf[Int]).head)).toOption) - //Array[Int].head - if this would differ on some servers, expose all. In testing each int was always equal. /** * (SIGAR) Returns the max network IO read/write value, in bytes, for network latency evaluation. diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterMetricsDataStreamingOffSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterMetricsDataStreamingOffSpec.scala deleted file mode 100644 index 33ed0b8f6b..0000000000 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterMetricsDataStreamingOffSpec.scala +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2009-2012 Typesafe Inc. - */ - -package akka.cluster - -import scala.language.postfixOps -import scala.concurrent.duration._ -import akka.remote.testkit.{ MultiNodeSpec, MultiNodeConfig } -import com.typesafe.config.ConfigFactory -import akka.testkit.LongRunningTest - -object ClusterMetricsDataStreamingOffMultiJvmSpec extends MultiNodeConfig { - val first = role("first") - val second = role("second") - commonConfig(ConfigFactory.parseString("akka.cluster.metrics.rate-of-decay = 0") - .withFallback(MultiNodeClusterSpec.clusterConfigWithFailureDetectorPuppet)) -} -class ClusterMetricsDataStreamingOffMultiJvmNode1 extends ClusterMetricsDataStreamingOffSpec -class ClusterMetricsDataStreamingOffMultiJvmNode2 extends ClusterMetricsDataStreamingOffSpec - -abstract class ClusterMetricsDataStreamingOffSpec extends MultiNodeSpec(ClusterMetricsDataStreamingOffMultiJvmSpec) with MultiNodeClusterSpec with MetricSpec { - "Cluster metrics" must { - "not collect stream metric data" taggedAs LongRunningTest in within(30 seconds) { - awaitClusterUp(roles: _*) - awaitCond(clusterView.clusterMetrics.size == roles.size) - awaitCond(clusterView.clusterMetrics.flatMap(_.metrics).filter(_.trendable).forall(_.average.isEmpty)) - enterBarrier("after") - } - } -} diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterAdaptiveLoadBalancingRouterMultiJvmSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterAdaptiveLoadBalancingRouterMultiJvmSpec.scala new file mode 100644 index 0000000000..b62f60c0ce --- /dev/null +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterAdaptiveLoadBalancingRouterMultiJvmSpec.scala @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2009-2012 Typesafe Inc. + */ + +package akka.cluster.routing + +import akka.remote.testkit.{MultiNodeSpec, MultiNodeConfig} +import akka.testkit.{LongRunningTest, DefaultTimeout, ImplicitSender} +import akka.actor._ +import akka.cluster.{ MemberStatus, MultiNodeClusterSpec } +import akka.cluster.routing.ClusterRoundRobinRoutedActorMultiJvmSpec.SomeActor + + +object ClusterAdaptiveLoadBalancingRouterMultiJvmSpec extends MultiNodeConfig { + + val first = role("first") + val second = role("second") + val third = role("third") + val fourth = role("fourth") + val fifth = role("fifth") + + // TODO - config + commonConfig(debugConfig(on = false).withFallback(MultiNodeClusterSpec.clusterConfig)) + +} + +class ClusterAdaptiveLoadBalancingRouterMultiJvmNode1 extends ClusterAdaptiveLoadBalancingRouterSpec +class ClusterAdaptiveLoadBalancingRouterMultiJvmNode2 extends ClusterAdaptiveLoadBalancingRouterSpec +class ClusterAdaptiveLoadBalancingRouterMultiJvmNode3 extends ClusterAdaptiveLoadBalancingRouterSpec +class ClusterAdaptiveLoadBalancingRouterMultiJvmNode4 extends ClusterAdaptiveLoadBalancingRouterSpec +class ClusterAdaptiveLoadBalancingRouterMultiJvmNode5 extends ClusterAdaptiveLoadBalancingRouterSpec + +abstract class ClusterAdaptiveLoadBalancingRouterSpec extends MultiNodeSpec(ClusterAdaptiveLoadBalancingRouterMultiJvmSpec) +with MultiNodeClusterSpec +with ImplicitSender with DefaultTimeout { + import ClusterAdaptiveLoadBalancingRouterMultiJvmSpec._ + + // TODO configure properly and leverage the other pending load balancing routers + lazy val router1 = system.actorOf(Props[SomeActor].withRouter(ClusterRouterConfig(MemoryLoadBalancingRouter(), + ClusterRouterSettings(totalInstances = 3, maxInstancesPerNode = 1))), "router1") + lazy val router2 = system.actorOf(Props[SomeActor].withRouter(ClusterRouterConfig(MemoryLoadBalancingRouter(), + ClusterRouterSettings(totalInstances = 3, maxInstancesPerNode = 1))), "router2") + lazy val router3 = system.actorOf(Props[SomeActor].withRouter(ClusterRouterConfig(MemoryLoadBalancingRouter(), + ClusterRouterSettings(totalInstances = 3, maxInstancesPerNode = 1))), "router3") + lazy val router4 = system.actorOf(Props[SomeActor].withRouter(ClusterRouterConfig(MemoryLoadBalancingRouter(), + ClusterRouterSettings(totalInstances = 3, maxInstancesPerNode = 1))), "router4") + lazy val router5 = system.actorOf(Props[SomeActor].withRouter(ClusterRouterConfig(MemoryLoadBalancingRouter(), + ClusterRouterSettings(totalInstances = 3, maxInstancesPerNode = 1))), "router5") + + "A cluster with a ClusterAdaptiveLoadBalancingRouter" must { + "start cluster with 5 nodes" taggedAs LongRunningTest in { + awaitClusterUp(roles: _*) + enterBarrier("cluster-started") + awaitCond(clusterView.members.filter(_.status == MemberStatus.Up).size == roles.size) + awaitCond(clusterView.clusterMetrics.size == roles.size) + enterBarrier("cluster-metrics-consumer-ready") + } + // TODO the rest of the necessary testing. All the work needed for consumption and extraction + // of the data needed is in ClusterMetricsCollector._ + } +} diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterLoadBalancingRouter.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterLoadBalancingRouter.scala new file mode 100644 index 0000000000..969372112f --- /dev/null +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterLoadBalancingRouter.scala @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2009-2012 Typesafe Inc. + */ + +package akka.cluster.routing + +import language.implicitConversions +import language.postfixOps +import akka.actor._ +import akka.cluster._ +import akka.routing._ +import akka.dispatch.Dispatchers +import akka.event.Logging +import java.util.concurrent.atomic.{ AtomicLong, AtomicReference } +import akka.routing.Destination +import akka.cluster.NodeMetrics +import akka.routing.Broadcast +import akka.actor.OneForOneStrategy +import akka.cluster.ClusterEvent.ClusterMetricsChanged +import akka.cluster.ClusterEvent.CurrentClusterState +import util.Try +import akka.cluster.NodeMetrics.{ NodeMetricsComparator, MetricValues } +import NodeMetricsComparator._ + +/** + * INTERNAL API. + * + * Trait that embodies the contract for all load balancing implementations. + */ +private[cluster] trait LoadBalancer { + + /** + * Compares only those nodes that are deemed 'available' by the + * [[akka.routing.RouteeProvider]] + */ + def selectNodeByHealth(availableNodes: Set[NodeMetrics]): Option[Address] + +} + +/** + * INTERNAL API + */ +private[cluster] object ClusterLoadBalancingRouter { + val defaultSupervisorStrategy: SupervisorStrategy = OneForOneStrategy() { + case _ ⇒ SupervisorStrategy.Escalate + } +} + +/** + * INTERNAL API. + * + * The abstract consumer of [[akka.cluster.ClusterMetricsChanged]] events and the primary consumer + * of cluster metric data. This strategy is a metrics-aware router which performs load balancing of + * cluster nodes with a fallback strategy of a [[akka.routing.RoundRobinRouter]]. + * + * Load balancing of nodes is based on .. etc etc desc forthcoming + */ +trait ClusterAdaptiveLoadBalancingRouterLike extends RoundRobinLike with LoadBalancer { this: RouterConfig ⇒ + + def routerDispatcher: String + + override def createRoute(routeeProvider: RouteeProvider): Route = { + if (resizer.isEmpty) { + if (routees.isEmpty) routeeProvider.createRoutees(nrOfInstances) + else routeeProvider.registerRouteesFor(routees) + } + + val log = Logging(routeeProvider.context.system, routeeProvider.context.self) + + val next = new AtomicLong(0) + + val nodeMetrics = new AtomicReference[Set[NodeMetrics]](Set.empty) + + val metricsListener = routeeProvider.context.actorOf(Props(new Actor { + def receive = { + case ClusterMetricsChanged(metrics) ⇒ receiveMetrics(metrics) + case _: CurrentClusterState ⇒ // ignore + } + def receiveMetrics(metrics: Set[NodeMetrics]): Unit = { + val availableNodes = routeeProvider.routees.map(_.path.address).toSet + val updated: Set[NodeMetrics] = nodeMetrics.get.collect { case node if availableNodes contains node.address ⇒ node } + nodeMetrics.set(updated) + } + override def postStop(): Unit = Cluster(routeeProvider.context.system) unsubscribe self + }).withDispatcher(routerDispatcher), name = "metricsListener") + Cluster(routeeProvider.context.system).subscribe(metricsListener, classOf[ClusterMetricsChanged]) + + def getNext(): ActorRef = { + // TODO use as/where you will... selects by health category based on the implementation + val address: Option[Address] = selectNodeByHealth(nodeMetrics.get) + // TODO actual routee selection. defaults to round robin. + routeeProvider.routees((next.getAndIncrement % routees.size).asInstanceOf[Int]) + } + + def routeTo(): ActorRef = if (routeeProvider.routees.isEmpty) routeeProvider.context.system.deadLetters else getNext() + + { + case (sender, message) ⇒ + message match { + case Broadcast(msg) ⇒ toAll(sender, routeeProvider.routees) + case msg ⇒ List(Destination(sender, routeTo())) + } + } + } +} + +/** + * Selects by all monitored metric types (memory, network latency, cpu...) and + * chooses the healthiest node to route to. + */ +@SerialVersionUID(1L) +private[cluster] case class ClusterAdaptiveMetricsLoadBalancingRouter(nrOfInstances: Int = 0, routees: Iterable[String] = Nil, + override val resizer: Option[Resizer] = None, + val routerDispatcher: String = Dispatchers.DefaultDispatcherId, + val supervisorStrategy: SupervisorStrategy = ClusterLoadBalancingRouter.defaultSupervisorStrategy) + extends RouterConfig with ClusterAdaptiveLoadBalancingRouterLike with MetricsAwareClusterNodeSelector { + + // TODO + def selectNodeByHealth(nodes: Set[NodeMetrics]): Option[Address] = { + val s = Set(selectByMemory(nodes), selectByNetworkLatency(nodes), selectByCpu(nodes)) + s.head // TODO select the Address that appears with the highest or lowest frequency + } +} + +@SerialVersionUID(1L) +private[cluster] case class MemoryLoadBalancingRouter(nrOfInstances: Int = 0, routees: Iterable[String] = Nil, + override val resizer: Option[Resizer] = None, + val routerDispatcher: String = Dispatchers.DefaultDispatcherId, + val supervisorStrategy: SupervisorStrategy = ClusterLoadBalancingRouter.defaultSupervisorStrategy) + extends RouterConfig with ClusterAdaptiveLoadBalancingRouterLike with MetricsAwareClusterNodeSelector { + + def selectNodeByHealth(nodes: Set[NodeMetrics]): Option[Address] = selectByMemory(nodes) +} + +@SerialVersionUID(1L) +private[cluster] case class CpuLoadBalancer(nrOfInstances: Int = 0, routees: Iterable[String] = Nil, + override val resizer: Option[Resizer] = None, + val routerDispatcher: String = Dispatchers.DefaultDispatcherId, + val supervisorStrategy: SupervisorStrategy = ClusterLoadBalancingRouter.defaultSupervisorStrategy) + extends RouterConfig with ClusterAdaptiveLoadBalancingRouterLike with MetricsAwareClusterNodeSelector { + + // TODO + def selectNodeByHealth(nodes: Set[NodeMetrics]): Option[Address] = None +} + +@SerialVersionUID(1L) +private[cluster] case class NetworkLatencyLoadBalancer(nrOfInstances: Int = 0, routees: Iterable[String] = Nil, + override val resizer: Option[Resizer] = None, + val routerDispatcher: String = Dispatchers.DefaultDispatcherId, + val supervisorStrategy: SupervisorStrategy = ClusterLoadBalancingRouter.defaultSupervisorStrategy) + extends RouterConfig with ClusterAdaptiveLoadBalancingRouterLike with MetricsAwareClusterNodeSelector { + + // TODO + def selectNodeByHealth(nodes: Set[NodeMetrics]): Option[Address] = None +} diff --git a/akka-cluster/src/test/scala/akka/cluster/DataStreamSpec.scala b/akka-cluster/src/test/scala/akka/cluster/DataStreamSpec.scala index f77c9fdcdb..b6357ddc46 100644 --- a/akka-cluster/src/test/scala/akka/cluster/DataStreamSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/DataStreamSpec.scala @@ -6,15 +6,13 @@ package akka.cluster import language.postfixOps import scala.concurrent.duration._ - import akka.testkit.{ LongRunningTest, AkkaSpec } @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class DataStreamSpec extends AkkaSpec(MetricsEnabledSpec.config) with AbstractClusterMetricsSpec with MetricNumericConverter { +class DataStreamSpec extends AkkaSpec(MetricsEnabledSpec.config) with AbstractClusterMetricsSpec { import system.dispatcher val collector = createMetricsCollector - val DefaultRateOfDecay = 10 "DataStream" must { @@ -53,10 +51,5 @@ class DataStreamSpec extends AkkaSpec(MetricsEnabledSpec.config) with AbstractCl else if (first.value.get.longValue < newMetric.value.get.longValue) e1.ewma.longValue must be < e2.ewma.longValue } } - - "data streaming is disabled if the decay is set to 0" in { - val data = collector.sample.metrics map (_.initialize(0)) - data foreach (_.average.isEmpty must be(true)) - } } } diff --git a/akka-cluster/src/test/scala/akka/cluster/MetricsAwareClusterNodeSelectorSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricsAwareClusterNodeSelectorSpec.scala new file mode 100644 index 0000000000..01327d65f9 --- /dev/null +++ b/akka-cluster/src/test/scala/akka/cluster/MetricsAwareClusterNodeSelectorSpec.scala @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2009-2012 Typesafe Inc. + */ + +package akka.cluster + +import akka.testkit.AkkaSpec +import akka.actor.Address +import akka.cluster.NodeMetrics.MetricValues +import util.control.NonFatal +import util.Try + +@org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) +class MetricsAwareClusterNodeSelectorSpec extends ClusterMetricsRouteeSelectorSpec with MetricsAwareClusterNodeSelector { + import NodeMetrics.NodeMetricsComparator.longMinAddressOrdering + + "MetricsAwareClusterNodeSelector" must { + + "select the address of the node with the lowest memory" in { + for (i ← 0 to 10) { // run enough times to insure we test differing metric values + + val map = nodes.map(n ⇒ n.address -> MetricValues.unapply(n.heapMemory)).toMap + val (used1, committed1, max1) = map.get(node1.address).get + val (used2, committed2, max2) = map.get(node2.address).get + val diff1 = max1 match { + case Some(m) ⇒ ((committed1 - used1) + (m - used1) + (m - committed1)) + case None ⇒ committed1 - used1 + } + val diff2 = max2 match { + case Some(m) ⇒ ((committed2 - used2) + (m - used2) + (m - committed2)) + case None ⇒ committed2 - used2 + } + val testMin = Set(diff1, diff2).min + val expectedAddress = if (testMin == diff1) node1.address else node2.address + val address = selectByMemory(nodes.toSet).get + address must be(expectedAddress) + } + } + "select the address of the node with the lowest network latency" in { + // TODO + } + "select the address of the node with the best CPU health" in { + // TODO + } + "select the address of the node with the best overall health based on all metric categories monitored" in { + // TODO + } + } +} + +abstract class ClusterMetricsRouteeSelectorSpec extends AkkaSpec(MetricsEnabledSpec.config) with AbstractClusterMetricsSpec { + + val collector = createMetricsCollector + + var node1 = NodeMetrics(Address("akka", "sys", "a", 2554), 1, collector.sample.metrics) + node1 = node1.copy(metrics = node1.metrics.collect { case m ⇒ m.initialize(DefaultRateOfDecay) }) + + var node2 = NodeMetrics(Address("akka", "sys", "a", 2555), 1, collector.sample.metrics) + node2 = node2.copy(metrics = node2.metrics.collect { case m ⇒ m.initialize(DefaultRateOfDecay) }) + + var nodes: Seq[NodeMetrics] = Seq(node1, node2) + + // work up the data streams where applicable + for (i ← 0 to samples) { + nodes = nodes map { + n ⇒ + n.copy(metrics = collector.sample.metrics.flatMap(latest ⇒ n.metrics.collect { + case streaming if latest same streaming ⇒ + streaming.average match { + case Some(e) ⇒ streaming.copy(value = latest.value, average = Try(Some(e :+ latest.value.get)) getOrElse None) + case None ⇒ streaming.copy(value = latest.value) + } + })) + } + } +} diff --git a/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala index 6589ba0efc..c7a4ad4c73 100644 --- a/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala @@ -35,7 +35,7 @@ class MetricsCollectorSpec extends AkkaSpec(MetricsEnabledSpec.config) with Impl for (i ← 0 to samples) { val metrics = collector.sample.metrics assertCreatedUninitialized(metrics) - assertInitialized(window, metrics map (_.initialize(window))) + assertInitialized(DefaultRateOfDecay, metrics map (_.initialize(DefaultRateOfDecay))) } } @@ -51,8 +51,8 @@ class MetricsCollectorSpec extends AkkaSpec(MetricsEnabledSpec.config) with Impl } }) - val sample3 = collector.sample.metrics map (_.initialize(window)) - val sample4 = collector.sample.metrics map (_.initialize(window)) + val sample3 = collector.sample.metrics map (_.initialize(DefaultRateOfDecay)) + val sample4 = collector.sample.metrics map (_.initialize(DefaultRateOfDecay)) merged = sample4 flatMap (latest ⇒ sample3 collect { case peer if latest same peer ⇒ { val m = peer :+ latest @@ -74,7 +74,7 @@ class MetricsCollectorSpec extends AkkaSpec(MetricsEnabledSpec.config) with Impl "collect accurate metrics for a node" in { val sample = collector.sample - assertExpectedSampleSize(collector.isSigar, window, sample) + assertExpectedSampleSize(collector.isSigar, DefaultRateOfDecay, sample) val metrics = sample.metrics.collect { case m if m.isDefined ⇒ (m.name, m.value.get) } val used = metrics collectFirst { case ("heap-memory-used", b) ⇒ b } val committed = metrics collectFirst { case ("heap-memory-committed", b) ⇒ b } @@ -120,7 +120,7 @@ class MetricsCollectorSpec extends AkkaSpec(MetricsEnabledSpec.config) with Impl val task = system.scheduler.schedule(0 seconds, interval) { val sample = collector.sample assertCreatedUninitialized(sample.metrics) - assertExpectedSampleSize(collector.isSigar, window, sample) + assertExpectedSampleSize(collector.isSigar, DefaultRateOfDecay, sample) latch.countDown() } Await.ready(latch, longDuration) @@ -219,7 +219,7 @@ trait AbstractClusterMetricsSpec extends DefaultTimeout { val selfAddress = new Address("akka", "localhost") - val window = 49 + val DefaultRateOfDecay = 10 val interval: FiniteDuration = 100 millis diff --git a/akka-cluster/src/test/scala/akka/cluster/MetricsGossipSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricsGossipSpec.scala index 9a782b528a..e44b02e409 100644 --- a/akka-cluster/src/test/scala/akka/cluster/MetricsGossipSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/MetricsGossipSpec.scala @@ -21,7 +21,7 @@ class MetricsGossipSpec extends AkkaSpec(MetricsEnabledSpec.config) with Implici val m1 = NodeMetrics(Address("akka", "sys", "a", 2554), newTimestamp, collector.sample.metrics) val m2 = NodeMetrics(Address("akka", "sys", "a", 2555), newTimestamp, collector.sample.metrics) - var localGossip = MetricsGossip(window) + var localGossip = MetricsGossip(DefaultRateOfDecay) localGossip :+= m1 localGossip.nodes.size must be(1) localGossip.nodeKeys.size must be(localGossip.nodes.size) @@ -41,7 +41,7 @@ class MetricsGossipSpec extends AkkaSpec(MetricsEnabledSpec.config) with Implici val m1 = NodeMetrics(Address("akka", "sys", "a", 2554), newTimestamp, collector.sample.metrics) val m2 = NodeMetrics(Address("akka", "sys", "a", 2555), newTimestamp, collector.sample.metrics) - var remoteGossip = MetricsGossip(window) + var remoteGossip = MetricsGossip(DefaultRateOfDecay) remoteGossip :+= m1 remoteGossip :+= m2 remoteGossip.nodes.size must be(2) @@ -61,11 +61,11 @@ class MetricsGossipSpec extends AkkaSpec(MetricsEnabledSpec.config) with Implici val m3 = NodeMetrics(Address("akka", "sys", "a", 2556), newTimestamp, collector.sample.metrics) val m2Updated = m2 copy (metrics = collector.sample.metrics, timestamp = newTimestamp) - var localGossip = MetricsGossip(window) + var localGossip = MetricsGossip(DefaultRateOfDecay) localGossip :+= m1 localGossip :+= m2 - var remoteGossip = MetricsGossip(window) + var remoteGossip = MetricsGossip(DefaultRateOfDecay) remoteGossip :+= m3 remoteGossip :+= m2Updated @@ -84,7 +84,7 @@ class MetricsGossipSpec extends AkkaSpec(MetricsEnabledSpec.config) with Implici "get the current NodeMetrics if it exists in the local nodes" in { val m1 = NodeMetrics(Address("akka", "sys", "a", 2554), newTimestamp, collector.sample.metrics) - var localGossip = MetricsGossip(window) + var localGossip = MetricsGossip(DefaultRateOfDecay) localGossip :+= m1 localGossip.metricsFor(m1).nonEmpty must be(true) } @@ -93,7 +93,7 @@ class MetricsGossipSpec extends AkkaSpec(MetricsEnabledSpec.config) with Implici val m1 = NodeMetrics(Address("akka", "sys", "a", 2554), newTimestamp, collector.sample.metrics) val m2 = NodeMetrics(Address("akka", "sys", "a", 2555), newTimestamp, collector.sample.metrics) - var localGossip = MetricsGossip(window) + var localGossip = MetricsGossip(DefaultRateOfDecay) localGossip :+= m1 localGossip :+= m2 diff --git a/akka-cluster/src/test/scala/akka/cluster/NodeMetricsComparatorSpec.scala b/akka-cluster/src/test/scala/akka/cluster/NodeMetricsComparatorSpec.scala new file mode 100644 index 0000000000..54e540763b --- /dev/null +++ b/akka-cluster/src/test/scala/akka/cluster/NodeMetricsComparatorSpec.scala @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2009-2012 Typesafe Inc. + */ + +package akka.cluster + +import akka.actor.Address + +@org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) +class NodeMetricsComparatorSpec extends ClusterMetricsRouteeSelectorSpec { + + import NodeMetrics._ + + "NodeMetrics.MetricValues" must { + "extract expected metrics for load balancing" in { + val stream1 = node2.metric("heap-memory-committed").value.get.longValue() + val stream2 = node1.metric("heap-memory-used").value.get.longValue() + stream1 must be >= (stream2) + } + + "extract expected MetricValue types for load balancing" in { + nodes foreach { + node ⇒ + val (used, committed, max) = MetricValues.unapply(node.heapMemory) + committed must be >= (used) + max match { + case Some(m) ⇒ + used must be <= (m) + committed must be <= (m) + case None ⇒ + used must be > (0L) + committed must be > (0L) + } + + val network = MetricValues.unapply(node.networkLatency) + if (network.isDefined) { + network.get._1 must be > (0L) + network.get._2 must be > (0L) + } + + val (systemLoadAverage, processors, combinedCpu, cores) = MetricValues.unapply(node.cpu) + systemLoadAverage must be >= (0.0) + processors must be > (0) + if (combinedCpu.isDefined) { + combinedCpu.get must be <= (1.0) + combinedCpu.get must be >= (0.0) + } + if (cores.isDefined) { + cores.get must be > (0) + cores.get must be >= (processors) + } + } + } + } + + "NodeMetricsComparator" must { + val seq = Seq((Address("akka", "sys", "a", 2554), 9L), (Address("akka", "sys", "a", 2555), 8L)) + val seq2 = Seq((Address("akka", "sys", "a", 2554), 9.0), (Address("akka", "sys", "a", 2555), 8.0)) + + "handle min ordering of a (Address, Long)" in { + import NodeMetricsComparator.longMinAddressOrdering + seq.min._1.port.get must be(2555) + seq.min._2 must be(8L) + } + "handle max ordering of a (Address, Long)" in { + val (address, value) = NodeMetricsComparator.maxAddressLong(seq) + value must be(9L) + address.port.get must be(2554) + } + "handle min ordering of a (Address, Double)" in { + import NodeMetricsComparator.doubleMinAddressOrdering + seq2.min._1.port.get must be(2555) + seq2.min._2 must be(8.0) + } + "handle max ordering of a (Address, Double)" in { + val (address, value) = NodeMetricsComparator.maxAddressDouble(seq2) + value must be(9.0) + address.port.get must be(2554) + } + } +} \ No newline at end of file From c9d206764a183fe3e1799c1359c2c56978026181 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Wed, 7 Nov 2012 20:36:24 +0100 Subject: [PATCH 118/210] ClusterLoadBalancingRouter and refactoring of metrics, see #2547 * MetricsSelector, calculate capacity, weights and allocate weighted routee refs * ClusterLoadBalancingRouterSpec * Optional heap max * Constants for the metric fields * Refactoring of Metric and decay * Rewrite of DataStreamSpec * Correction of EWMA and removal of BigInt, BigDecimal * Separation of MetricsCollector into trait and two classes, SigarMetricsCollector and JmxMetricsCollector * This will reduce cost when sigar is not installed, such as avoiding throwing and catching exc for every call * Improved error handling for loading sigar * Made MetricsCollector implementation configurable * Tested with sigar --- .../src/main/resources/reference.conf | 14 +- .../cluster/ClusterMetricsCollector.scala | 535 ++++++++++-------- .../scala/akka/cluster/ClusterSettings.scala | 11 +- .../routing/ClusterLoadBalancingRouter.scala | 271 +++++++++ .../akka/cluster/ClusterMetricsSpec.scala | 7 +- .../akka/cluster/MultiNodeClusterSpec.scala | 2 +- ...ptiveLoadBalancingRouterMultiJvmSpec.scala | 61 -- .../routing/ClusterLoadBalancingRouter.scala | 155 ----- .../ClusterLoadBalancingRouterSpec.scala | 162 ++++++ .../akka/cluster/ClusterConfigSpec.scala | 1 + .../scala/akka/cluster/DataStreamSpec.scala | 90 +-- .../cluster/MetricNumericConverterSpec.scala | 40 +- ...ratorSpec.scala => MetricValuesSpec.scala} | 61 +- .../MetricsAwareClusterNodeSelectorSpec.scala | 76 --- .../akka/cluster/MetricsCollectorSpec.scala | 168 ++---- .../akka/cluster/MetricsGossipSpec.scala | 27 +- .../scala/akka/cluster/NodeMetricsSpec.scala | 3 +- .../routing/HeapMetricsSelectorSpec.scala | 114 ++++ 18 files changed, 1065 insertions(+), 733 deletions(-) create mode 100644 akka-cluster/src/main/scala/akka/cluster/routing/ClusterLoadBalancingRouter.scala delete mode 100644 akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterAdaptiveLoadBalancingRouterMultiJvmSpec.scala delete mode 100644 akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterLoadBalancingRouter.scala create mode 100644 akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterLoadBalancingRouterSpec.scala rename akka-cluster/src/test/scala/akka/cluster/{NodeMetricsComparatorSpec.scala => MetricValuesSpec.scala} (53%) delete mode 100644 akka-cluster/src/test/scala/akka/cluster/MetricsAwareClusterNodeSelectorSpec.scala create mode 100644 akka-cluster/src/test/scala/akka/cluster/routing/HeapMetricsSelectorSpec.scala diff --git a/akka-cluster/src/main/resources/reference.conf b/akka-cluster/src/main/resources/reference.conf index d75ddd0a00..8539e56b1c 100644 --- a/akka-cluster/src/main/resources/reference.conf +++ b/akka-cluster/src/main/resources/reference.conf @@ -70,7 +70,7 @@ akka { failure-detector { # FQCN of the failure detector implementation. - # It must implement akka.cluster.akka.cluster and + # It must implement akka.cluster.cluster.FailureDetector and # have constructor with akka.actor.ActorSystem and # akka.cluster.ClusterSettings parameters implementation-class = "akka.cluster.AccrualFailureDetector" @@ -118,14 +118,22 @@ akka { # Enable or disable metrics collector for load-balancing nodes. enabled = on + # FQCN of the metrics collector implementation. + # It must implement akka.cluster.cluster.MetricsCollector and + # have constructor with akka.actor.ActorSystem parameter. + collector-class = "akka.cluster.SigarMetricsCollector" + # How often metrics is sampled on a node. - metrics-interval = 3s + collect-interval = 3s # How often a node publishes metrics information. gossip-interval = 3s # How quickly the exponential weighting of past data is decayed compared to - # new data. Set higher to increase the bias toward newer values. + # new data. Set lower to increase the bias toward newer values. + # Corresponds to 'N time periods' as explained in + # http://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average + # Must be >= 1 rate-of-decay = 10 } diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala index 07016b098c..ab3b6f5777 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala @@ -4,29 +4,36 @@ package akka.cluster -import scala.language.postfixOps -import scala.concurrent.duration._ -import scala.collection.immutable.{ SortedSet, Map } -import scala.concurrent.forkjoin.ThreadLocalRandom -import scala.util.{ Try, Success, Failure } -import math.{ ScalaNumber, ScalaNumericConversions } -import scala.runtime.{ RichLong, RichDouble, RichInt } - -import akka.actor._ -import akka.event.LoggingAdapter -import akka.cluster.MemberStatus.Up - -import java.lang.management.{ OperatingSystemMXBean, MemoryMXBean, ManagementFactory } -import java.lang.reflect.Method +import java.io.Closeable import java.lang.System.{ currentTimeMillis ⇒ newTimestamp } +import java.lang.management.{ OperatingSystemMXBean, MemoryMXBean, ManagementFactory } +import java.lang.reflect.InvocationTargetException +import java.lang.reflect.Method + +import scala.collection.immutable.{ SortedSet, Map } +import scala.concurrent.duration._ +import scala.concurrent.forkjoin.ThreadLocalRandom +import scala.runtime.{ RichLong, RichDouble, RichInt } +import scala.util.{ Try, Success, Failure } + +import akka.ConfigurationException +import akka.actor.Actor +import akka.actor.ActorLogging +import akka.actor.ActorRef +import akka.actor.ActorSystem +import akka.actor.Address +import akka.actor.DynamicAccess +import akka.actor.ExtendedActorSystem +import akka.cluster.MemberStatus.Up +import akka.event.Logging /** * INTERNAL API. * - * This strategy is primarily for load-balancing of nodes. It controls metrics sampling + * Cluster metrics is primarily for load-balancing of nodes. It controls metrics sampling * at a regular frequency, prepares highly variable data for further analysis by other entities, - * and publishes the latest cluster metrics data around the node ring to assist in determining - * the need to redirect traffic to the least-loaded nodes. + * and publishes the latest cluster metrics data around the node ring and local eventStream + * to assist in determining the need to redirect traffic to the least-loaded nodes. * * Metrics sampling is delegated to the [[akka.cluster.MetricsCollector]]. * @@ -43,8 +50,6 @@ private[cluster] class ClusterMetricsCollector(publisher: ActorRef) extends Acto import cluster.{ selfAddress, scheduler, settings } import settings._ - val DefaultRateOfDecay: Int = 10 - /** * The node ring gossipped that contains only members that are Up. */ @@ -53,12 +58,12 @@ private[cluster] class ClusterMetricsCollector(publisher: ActorRef) extends Acto /** * The latest metric values with their statistical data. */ - var latestGossip: MetricsGossip = MetricsGossip(if (MetricsRateOfDecay <= 0) DefaultRateOfDecay else MetricsRateOfDecay) + var latestGossip: MetricsGossip = MetricsGossip() /** * The metrics collector that samples data on the node. */ - val collector: MetricsCollector = MetricsCollector(selfAddress, log, context.system.asInstanceOf[ExtendedActorSystem].dynamicAccess) + val collector: MetricsCollector = MetricsCollector(context.system.asInstanceOf[ExtendedActorSystem], settings) /** * Start periodic gossip to random nodes in cluster @@ -160,7 +165,7 @@ private[cluster] class ClusterMetricsCollector(publisher: ActorRef) extends Acto * * @param nodes metrics per node */ -private[cluster] case class MetricsGossip(rateOfDecay: Int, nodes: Set[NodeMetrics] = Set.empty) { +private[cluster] case class MetricsGossip(nodes: Set[NodeMetrics] = Set.empty) { /** * Removes nodes if their correlating node ring members are not [[akka.cluster.MemberStatus.Up]] @@ -194,11 +199,10 @@ private[cluster] case class MetricsGossip(rateOfDecay: Int, nodes: Set[NodeMetri val names = previous map (_.name) val (toMerge: Set[Metric], unseen: Set[Metric]) = data.metrics partition (a ⇒ names contains a.name) - val initialized = unseen.map(_.initialize(rateOfDecay)) val merged = toMerge flatMap (latest ⇒ previous.collect { case peer if latest same peer ⇒ peer :+ latest }) val refreshed = nodes filterNot (_.address == data.address) - copy(nodes = refreshed + data.copy(metrics = initialized ++ merged)) + copy(nodes = refreshed + data.copy(metrics = unseen ++ merged)) } /** @@ -231,6 +235,8 @@ private[cluster] case class MetricsGossipEnvelope(from: Address, gossip: Metrics * INTERNAL API * * @param decay sets how quickly the exponential weighting decays for past data compared to new data + * Corresponds to 'N time periods' as explained in + * http://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average * * @param ewma the current exponentially weighted moving average, e.g. Y(n - 1), or, * the sampled value resulting from the previous smoothing iteration. @@ -240,36 +246,30 @@ private[cluster] case class MetricsGossipEnvelope(from: Address, gossip: Metrics * * @param startTime the time of initial sampling for this data stream */ -private[cluster] case class DataStream(decay: Int, ewma: ScalaNumericConversions, startTime: Long, timestamp: Long) - extends ClusterMessage with MetricNumericConverter { +private[cluster] case class DataStream(decay: Int, ewma: Double, startTime: Long, timestamp: Long) + extends ClusterMessage { + + require(decay >= 1, "Rate of decay must be >= 1") /** * The rate at which the weights of past observations * decay as they become more distant. */ - private val α = 2 / decay + 1 + private val α = 2.0 / (decay + 1) /** * Calculates the exponentially weighted moving average for a given monitored data set. - * The datam can be too large to fit into an int or long, thus we use ScalaNumericConversions, - * and defer to BigInt or BigDecimal. - * - * FIXME - look into the math: the new ewma becomes the new value - * value: 416979936, prev ewma: 416581760, new ewma: 416979936 * * @param xn the new data point * * @return a [[akka.cluster.DataStream]] with the updated yn and timestamp */ - def :+(xn: ScalaNumericConversions): DataStream = if (xn != ewma) convert(xn) fold ( - nl ⇒ copy(ewma = BigInt((α * nl) + (1 - α) * ewma.longValue()), timestamp = newTimestamp), - nd ⇒ copy(ewma = BigDecimal((α * nd) + (1 - α) * ewma.doubleValue()), timestamp = newTimestamp)) - else this + def :+(xn: Double): DataStream = copy(ewma = (α * xn) + (1 - α) * ewma, timestamp = newTimestamp) /** * The duration of observation for this data stream */ - def duration: FiniteDuration = (timestamp - startTime) millis + def duration: FiniteDuration = (timestamp - startTime).millis } @@ -278,19 +278,17 @@ private[cluster] case class DataStream(decay: Int, ewma: ScalaNumericConversions * * @param name the metric name * - * @param value the metric value, which may or may not be defined + * @param value the metric value, which may or may not be defined, it must be a valid numerical value, + * see [[akka.cluster.MetricNumericConverter.defined()]] * * @param average the data stream of the metric value, for trending over time. Metrics that are already * averages (e.g. system load average) or finite (e.g. as total cores), are not trended. */ -private[cluster] case class Metric(name: String, value: Option[ScalaNumericConversions], average: Option[DataStream]) +private[cluster] case class Metric private (name: String, value: Option[Number], average: Option[DataStream], + dummy: Boolean) // dummy because of overloading clash with apply extends ClusterMessage with MetricNumericConverter { - /** - * Returns the metric with a new data stream for data trending if eligible, - * otherwise returns the unchanged metric. - */ - def initialize(decay: Int): Metric = if (initializable) copy(average = Some(DataStream(decay, value.get, newTimestamp, newTimestamp))) else this + require(value.isEmpty || defined(value.get), "Invalid Metric [%s] value [%]".format(name, value)) /** * If defined ( [[akka.cluster.MetricNumericConverter.defined()]] ), updates the new @@ -298,36 +296,27 @@ private[cluster] case class Metric(name: String, value: Option[ScalaNumericConve */ def :+(latest: Metric): Metric = latest.value match { case Some(v) if this same latest ⇒ average match { - case Some(previous) ⇒ copy(value = Some(v), average = Some(previous :+ v)) - case None if latest.average.isDefined ⇒ copy(value = Some(v), average = latest.average) - case None if !latest.average.isDefined ⇒ copy(value = Some(v)) + case Some(previous) ⇒ copy(value = latest.value, average = Some(previous :+ v.doubleValue)) + case None if latest.average.isDefined ⇒ copy(value = latest.value, average = latest.average) + case None if latest.average.isEmpty ⇒ copy(value = latest.value) } case None ⇒ this } + def isDefined: Boolean = value.isDefined + /** - * @see [[akka.cluster.MetricNumericConverter.defined()]] + * The numerical value of the average, if defined, otherwise the latest value, + * if defined. */ - def isDefined: Boolean = value match { - case Some(a) ⇒ defined(a) - case None ⇒ false - } + def averageValue: Option[Double] = + average map (_.ewma) orElse value.map(_.doubleValue) /** * Returns true if that is tracking the same metric as this. */ def same(that: Metric): Boolean = name == that.name - /** - * Returns true if the metric requires initialization. - */ - def initializable: Boolean = trendable && isDefined && average.isEmpty - - /** - * Returns true if the metric is a value applicable for trending. - */ - def trendable: Boolean = !(Metric.noStream contains name) - } /** @@ -336,65 +325,30 @@ private[cluster] case class Metric(name: String, value: Option[ScalaNumericConve * Companion object of Metric class. */ private[cluster] object Metric extends MetricNumericConverter { + import NodeMetrics.MetricValues._ - /** - * The metrics that are already averages or finite are not trended over time. - */ - private val noStream = Set("system-load-average", "total-cores", "processors") + private def definedValue(value: Option[Number]): Option[Number] = + if (value.isDefined && defined(value.get)) value else None /** * Evaluates validity of value based on whether it is available (SIGAR on classpath) * or defined for the OS (JMX). If undefined we set the value option to None and do not modify * the latest sampled metric to avoid skewing the statistical trend. + * + * @param decay rate of decay for values applicable for trending */ - def apply(name: String, value: Option[ScalaNumericConversions]): Metric = value match { - case Some(v) if defined(v) ⇒ Metric(name, value, None) - case _ ⇒ Metric(name, None, None) + def apply(name: String, value: Option[Number], decay: Option[Int]): Metric = { + val dv = definedValue(value) + val average = + if (decay.isDefined && dv.isDefined) { + val now = newTimestamp + Some(DataStream(decay.get, dv.get.doubleValue, now, now)) + } else + None + new Metric(name, dv, average, true) } -} - -/** - * Reusable logic for particular metric categories or to leverage all for routing. - */ -private[cluster] trait MetricsAwareClusterNodeSelector { - import NodeMetrics._ - import NodeMetrics.NodeMetricsComparator._ - - /** - * Returns the address of the available node with the lowest cumulative difference - * between heap memory max and used/committed. - */ - def selectByMemory(nodes: Set[NodeMetrics]): Option[Address] = Try(Some(nodes.map { - n ⇒ - val (used, committed, max) = MetricValues.unapply(n.heapMemory) - (n.address, max match { - case Some(m) ⇒ ((committed - used) + (m - used) + (m - committed)) - case None ⇒ committed - used - }) - }.min._1)) getOrElse None - - // TODO - def selectByNetworkLatency(nodes: Set[NodeMetrics]): Option[Address] = None - /* Try(nodes.map { - n ⇒ - val (rxBytes, txBytes) = MetricValues.unapply(n.networkLatency).get - (n.address, (rxBytes + txBytes)) - }.min._1) getOrElse None // TODO: min or max - */ - - // TODO - def selectByCpu(nodes: Set[NodeMetrics]): Option[Address] = None - /* Try(nodes.map { - n ⇒ - val (loadAverage, processors, combinedCpu, cores) = MetricValues.unapply(n.cpu) - var cumulativeDifference = 0 - // TODO: calculate - combinedCpu.get - cores.get - (n.address, cumulativeDifference) - }.min._1) getOrElse None // TODO min or max - }*/ + def apply(name: String): Metric = new Metric(name, None, None, true) } /** @@ -417,6 +371,7 @@ private[cluster] trait MetricsAwareClusterNodeSelector { */ private[cluster] case class NodeMetrics(address: Address, timestamp: Long, metrics: Set[Metric] = Set.empty[Metric]) extends ClusterMessage { import NodeMetrics._ + import NodeMetrics.MetricValues._ /** * Returns the most recent data. @@ -436,13 +391,13 @@ private[cluster] case class NodeMetrics(address: Address, timestamp: Long, metri /** * Of all the data streams, this fluctuates the most. */ - def heapMemory: HeapMemory = HeapMemory(metric("heap-memory-used"), metric("heap-memory-committed"), metric("heap-memory-max")) + def heapMemory: HeapMemory = HeapMemory(metric(HeapMemoryUsed), metric(HeapMemoryCommitted), metric(HeapMemoryMax)) - def networkLatency: NetworkLatency = NetworkLatency(metric("network-max-rx"), metric("network-max-tx")) + def networkLatency: NetworkLatency = NetworkLatency(metric(NetworkInboundRate), metric(NetworkOutboundRate)) - def cpu: Cpu = Cpu(metric("system-load-average"), metric("processors"), metric("cpu-combined"), metric("total-cores")) + def cpu: Cpu = Cpu(metric(SystemLoadAverage), metric(Processors), metric(CpuCombined), metric(TotalCores)) - def metric(key: String): Metric = metrics.collectFirst { case m if m.name == key ⇒ m } getOrElse Metric(key, None) + def metric(key: String): Metric = metrics.collectFirst { case m if m.name == key ⇒ m } getOrElse Metric(key) } @@ -456,44 +411,36 @@ private[cluster] case class NodeMetrics(address: Address, timestamp: Long, metri */ private[cluster] object NodeMetrics { - object NodeMetricsComparator extends MetricNumericConverter { - - implicit val longMinOrdering: Ordering[Long] = Ordering.fromLessThan[Long] { (a, b) ⇒ (a < b) } - - implicit val longMinAddressOrdering: Ordering[(Address, Long)] = new Ordering[(Address, Long)] { - def compare(a: (Address, Long), b: (Address, Long)): Int = longMinOrdering.compare(a._2, b._2) - } - - def maxAddressLong(seq: Seq[(Address, Long)]): (Address, Long) = - seq.reduceLeft((a: (Address, Long), b: (Address, Long)) ⇒ if (a._2 > b._2) a else b) - - implicit val doubleMinOrdering: Ordering[Double] = Ordering.fromLessThan[Double] { (a, b) ⇒ (a < b) } - - implicit val doubleMinAddressOrdering: Ordering[(Address, Double)] = new Ordering[(Address, Double)] { - def compare(a: (Address, Double), b: (Address, Double)): Int = doubleMinOrdering.compare(a._2, b._2) - } - - def maxAddressDouble(seq: Seq[(Address, Double)]): (Address, Double) = - seq.reduceLeft((a: (Address, Double), b: (Address, Double)) ⇒ if (a._2 > b._2) a else b) - } - sealed trait MetricValues object MetricValues { + final val HeapMemoryUsed = "heap-memory-used" + final val HeapMemoryCommitted = "heap-memory-committed" + final val HeapMemoryMax = "heap-memory-max" + final val NetworkInboundRate = "network-max-inbound" + final val NetworkOutboundRate = "network-max-outbound" + final val SystemLoadAverage = "system-load-average" + final val Processors = "processors" + final val CpuCombined = "cpu-combined" + final val TotalCores = "total-cores" + def unapply(v: HeapMemory): Tuple3[Long, Long, Option[Long]] = - (v.used.average.get.ewma.longValue(), - v.committed.average.get.ewma.longValue(), - Try(Some(v.max.average.get.ewma.longValue())) getOrElse None) + (v.used.averageValue.get.longValue, + v.committed.averageValue.get.longValue, + v.max.averageValue map (_.longValue) orElse None) def unapply(v: NetworkLatency): Option[(Long, Long)] = - Try(Some(v.maxRxIO.average.get.ewma.longValue(), v.maxTxIO.average.get.ewma.longValue())) getOrElse None + (v.inbound.averageValue, v.outbound.averageValue) match { + case (Some(a), Some(b)) ⇒ Some((a.longValue, b.longValue)) + case _ ⇒ None + } - def unapply(v: Cpu): Tuple4[Double, Int, Option[Double], Option[Int]] = - (v.systemLoadAverage.value.get.doubleValue(), - v.processors.value.get.intValue(), - Try(Some(v.combinedCpu.average.get.ewma.doubleValue())) getOrElse None, - Try(Some(v.cores.value.get.intValue())) getOrElse None) + def unapply(v: Cpu): Tuple4[Option[Double], Int, Option[Double], Option[Int]] = + (v.systemLoadAverage.averageValue map (_.doubleValue), + v.processors.averageValue.get.intValue, + v.combinedCpu.averageValue map (_.doubleValue), + v.cores.averageValue map (_.intValue)) } /** @@ -505,14 +452,17 @@ private[cluster] object NodeMetrics { * @param max the maximum amount of memory (in bytes) that can be used for JVM memory management. * Can be undefined on some OS. */ - case class HeapMemory(used: Metric, committed: Metric, max: Metric) extends MetricValues + case class HeapMemory(used: Metric, committed: Metric, max: Metric) extends MetricValues { + require(used.isDefined, "used must be defined") + require(committed.isDefined, "committed must be defined") + } /** - * @param maxRxIO the max network IO rx value, in bytes + * @param inbound the inbound network IO rate, in bytes * - * @param maxTxIO the max network IO tx value, in bytes + * @param outbound the outbound network IO rate, in bytes */ - case class NetworkLatency(maxRxIO: Metric, maxTxIO: Metric) extends MetricValues + case class NetworkLatency(inbound: Metric, outbound: Metric) extends MetricValues /** * @param systemLoadAverage OS-specific average load on the CPUs in the system, for the past 1 minute @@ -524,7 +474,9 @@ private[cluster] object NodeMetrics { * * @param cores the number of cores (multi-core: per processor) */ - private[cluster] case class Cpu(systemLoadAverage: Metric, processors: Metric, combinedCpu: Metric, cores: Metric) extends MetricValues + private[cluster] case class Cpu(systemLoadAverage: Metric, processors: Metric, combinedCpu: Metric, cores: Metric) extends MetricValues { + require(processors.isDefined, "processors must be defined") + } } @@ -537,44 +489,152 @@ private[cluster] object NodeMetrics { private[cluster] trait MetricNumericConverter { /** - * A defined value is neither a -1 or NaN/Infinite: + * An undefined value is neither a -1 (negative) or NaN/Infinite: *
  • JMX system load average and max heap can be 'undefined' for certain OS, in which case a -1 is returned
  • *
  • SIGAR combined CPU can occasionally return a NaN or Infinite (known bug)
*/ - def defined(value: ScalaNumericConversions): Boolean = - convert(value) fold (a ⇒ value.underlying != -1, b ⇒ !(b.isNaN || b.isInfinite)) + def defined(value: Number): Boolean = convertNumber(value) match { + case Left(a) ⇒ a >= 0 + case Right(b) ⇒ !(b.isNaN || b.isInfinite) + } /** * May involve rounding or truncation. */ - def convert(from: ScalaNumericConversions): Either[Long, Double] = from match { - case n: BigInt ⇒ Left(n.longValue()) - case n: BigDecimal ⇒ Right(n.doubleValue()) + def convertNumber(from: Any): Either[Long, Double] = from match { + case n: Int ⇒ Left(n) + case n: Long ⇒ Left(n) + case n: Double ⇒ Right(n) + case n: Float ⇒ Right(n) case n: RichInt ⇒ Left(n.abs) case n: RichLong ⇒ Left(n.self) case n: RichDouble ⇒ Right(n.self) + case n: BigInt ⇒ Left(n.longValue) + case n: BigDecimal ⇒ Right(n.doubleValue) + case x ⇒ throw new IllegalArgumentException("Not a number [%s]" format x) } } +/** + * INTERNAL API + */ +private[cluster] trait MetricsCollector extends Closeable { + /** + * Samples and collects new data points. + */ + def sample: NodeMetrics +} + /** * INTERNAL API * - * Loads JVM metrics through JMX monitoring beans. If Hyperic SIGAR is on the classpath, this - * loads wider and more accurate range of metrics in combination with SIGAR's native OS library. - * - * FIXME switch to Scala reflection - * - * @param sigar the optional org.hyperic.Sigar instance + * Loads JVM metrics through JMX monitoring beans. * * @param address The [[akka.actor.Address]] of the node being sampled + * @param decay how quickly the exponential weighting of past data is decayed */ -private[cluster] class MetricsCollector private (private val sigar: Option[AnyRef], address: Address) extends MetricNumericConverter { +private[cluster] class JmxMetricsCollector(address: Address, decay: Int) extends MetricsCollector { + import NodeMetrics.MetricValues._ + + private def this(cluster: Cluster) = + this(cluster.selfAddress, cluster.settings.MetricsRateOfDecay) + + def this(system: ActorSystem) = this(Cluster(system)) + + private val decayOption = Some(decay) private val memoryMBean: MemoryMXBean = ManagementFactory.getMemoryMXBean private val osMBean: OperatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean + /** + * Samples and collects new data points. + */ + def sample: NodeMetrics = NodeMetrics(address, newTimestamp, Set( + systemLoadAverage, heapUsed, heapCommitted, heapMax, processors)) + + /** + * JMX Returns the OS-specific average load on the CPUs in the system, for the past 1 minute. + * On some systems the JMX OS system load average may not be available, in which case a -1 is returned, + * which means that the returned Metric is undefined. + */ + def systemLoadAverage: Metric = Metric( + name = SystemLoadAverage, + value = Some(osMBean.getSystemLoadAverage), + decay = None) + + /** + * (JMX) Returns the number of available processors + */ + def processors: Metric = Metric( + name = Processors, + value = Some(osMBean.getAvailableProcessors), + decay = None) + + // FIXME those three heap calls should be done at once + + /** + * (JMX) Returns the current sum of heap memory used from all heap memory pools (in bytes). + */ + def heapUsed: Metric = Metric( + name = HeapMemoryUsed, + value = Some(memoryMBean.getHeapMemoryUsage.getUsed), + decay = decayOption) + + /** + * (JMX) Returns the current sum of heap memory guaranteed to be available to the JVM + * from all heap memory pools (in bytes). + */ + def heapCommitted: Metric = Metric( + name = HeapMemoryCommitted, + value = Some(memoryMBean.getHeapMemoryUsage.getCommitted), + decay = decayOption) + + /** + * (JMX) Returns the maximum amount of memory (in bytes) that can be used + * for JVM memory management. If not defined the metrics value is None, i.e. + * never negative. + */ + def heapMax: Metric = Metric( + name = HeapMemoryMax, + value = Some(memoryMBean.getHeapMemoryUsage.getMax), + decay = None) + + def close(): Unit = () + +} + +/** + * INTERNAL API + * + * Loads metrics through Hyperic SIGAR and JMX monitoring beans. This + * loads wider and more accurate range of metrics compared to JmxMetricsCollector + * by using SIGAR's native OS library. + * + * The constructor will by design throw exception if org.hyperic.sigar.Sigar can't be loaded, due + * to missing classes or native libraries. + * + * TODO switch to Scala reflection + * + * @param address The [[akka.actor.Address]] of the node being sampled + * @param decay how quickly the exponential weighting of past data is decayed + * @param sigar the org.hyperic.Sigar instance + */ +private[cluster] class SigarMetricsCollector(address: Address, decay: Int, sigar: AnyRef) + extends JmxMetricsCollector(address, decay) { + import NodeMetrics.MetricValues._ + + def this(address: Address, decay: Int, dynamicAccess: DynamicAccess) = + this(address, decay, dynamicAccess.createInstanceFor[AnyRef]("org.hyperic.sigar.Sigar", Seq.empty).get) + + private def this(cluster: Cluster) = + this(cluster.selfAddress, cluster.settings.MetricsRateOfDecay, cluster.system.dynamicAccess) + + def this(system: ActorSystem) = this(Cluster(system)) + + private val decayOption = Some(decay) + private val LoadAverage: Option[Method] = createMethodFrom(sigar, "getLoadAverage") private val CpuList: Option[Method] = createMethodFrom(sigar, "getCpuInfoList").map(m ⇒ m) @@ -585,48 +645,41 @@ private[cluster] class MetricsCollector private (private val sigar: Option[AnyRe private val CombinedCpu: Option[Method] = Try(Cpu.get.getReturnType.getMethod("getCombined")).toOption + private val Pid: Option[Method] = createMethodFrom(sigar, "getPid") + + // Do something initially, in constructor, to make sure that the native library can be loaded. + // This will by design throw exception if sigar isn't usable + val pid: Long = createMethodFrom(sigar, "getPid") match { + case Some(method) ⇒ + try method.invoke(sigar).asInstanceOf[Long] catch { + case e: InvocationTargetException if e.getCause.isInstanceOf[LinkageError] ⇒ + // native libraries not in place + // don't throw fatal LinkageError, but something less harmless + throw new IllegalArgumentException(e.getCause.toString) + case e: InvocationTargetException ⇒ throw e.getCause + } + case None ⇒ throw new IllegalArgumentException("Wrong version of Sigar, expected 'getPid' method") + } + /** * Samples and collects new data points. - * - * @return [[akka.cluster.NodeMetrics]] */ - def sample: NodeMetrics = NodeMetrics(address, newTimestamp, Set(cpuCombined, totalCores, - systemLoadAverage, used, committed, max, processors, networkMaxRx, networkMaxTx)) + override def sample: NodeMetrics = NodeMetrics(address, newTimestamp, Set(cpuCombined, totalCores, + systemLoadAverage, heapUsed, heapCommitted, heapMax, processors, networkMaxRx, networkMaxTx)) /** * (SIGAR / JMX) Returns the OS-specific average load on the CPUs in the system, for the past 1 minute. - * On some systems the JMX OS system load average may not be available, in which case a Metric with - * undefined value is returned. + * On some systems the JMX OS system load average may not be available, in which case a -1 is returned, + * which means that the returned Metric is undefined. * Hyperic SIGAR provides more precise values, thus, if the library is on the classpath, it is the default. */ - def systemLoadAverage: Metric = Metric("system-load-average", - Try(LoadAverage.get.invoke(sigar.get).asInstanceOf[Array[Double]].toSeq.head).getOrElse( - osMBean.getSystemLoadAverage) match { - case x if x < 0 ⇒ None // load average may be unavailable on some platform - case x ⇒ Some(BigDecimal(x)) - }) - - /** - * (JMX) Returns the number of available processors - */ - def processors: Metric = Metric("processors", Some(BigInt(osMBean.getAvailableProcessors))) - - /** - * (JMX) Returns the current sum of heap memory used from all heap memory pools (in bytes). - */ - def used: Metric = Metric("heap-memory-used", Some(BigInt(memoryMBean.getHeapMemoryUsage.getUsed))) - - /** - * (JMX) Returns the current sum of heap memory guaranteed to be available to the JVM - * from all heap memory pools (in bytes). - */ - def committed: Metric = Metric("heap-memory-committed", Some(BigInt(memoryMBean.getHeapMemoryUsage.getCommitted))) - - /** - * (JMX) Returns the maximum amount of memory (in bytes) that can be used - * for JVM memory management. If undefined, returns -1. - */ - def max: Metric = Metric("heap-memory-max", Some(BigInt(memoryMBean.getHeapMemoryUsage.getMax))) + override def systemLoadAverage: Metric = { + val m = Metric( + name = SystemLoadAverage, + value = Try(LoadAverage.get.invoke(sigar).asInstanceOf[Array[AnyRef]].head.asInstanceOf[Number]).toOption, + decay = None) + if (m.isDefined) m else super.systemLoadAverage + } /** * (SIGAR) Returns the combined CPU sum of User + Sys + Nice + Wait, in percentage. This metric can describe @@ -636,49 +689,61 @@ private[cluster] class MetricsCollector private (private val sigar: Option[AnyRe * In the data stream, this will sometimes return with a valid metric value, and sometimes as a NaN or Infinite. * Documented bug https://bugzilla.redhat.com/show_bug.cgi?id=749121 and several others. */ - def cpuCombined: Metric = Metric("cpu-combined", Try(BigDecimal(CombinedCpu.get.invoke(Cpu.get.invoke(sigar.get)).asInstanceOf[Double])).toOption) + def cpuCombined: Metric = Metric( + name = CpuCombined, + value = Try(CombinedCpu.get.invoke(Cpu.get.invoke(sigar)).asInstanceOf[Number]).toOption, + decay = decayOption) /** * FIXME: Array[Int].head - expose all if cores per processor might differ. * (SIGAR) Returns the total number of cores. + * + * FIXME do we need this information, isn't it enough with jmx processors? */ - def totalCores: Metric = Metric("total-cores", Try(BigInt(CpuList.get.invoke(sigar.get).asInstanceOf[Array[AnyRef]].map(cpu ⇒ - createMethodFrom(Some(cpu), "getTotalCores").get.invoke(cpu).asInstanceOf[Int]).head)).toOption) + def totalCores: Metric = Metric( + name = TotalCores, + value = Try(CpuList.get.invoke(sigar).asInstanceOf[Array[AnyRef]].map(cpu ⇒ + createMethodFrom(cpu, "getTotalCores").get.invoke(cpu).asInstanceOf[Number]).head).toOption, + decay = None) + + // FIXME those two network calls should be combined into one /** * (SIGAR) Returns the max network IO read/write value, in bytes, for network latency evaluation. */ - def networkMaxRx: Metric = networkMaxFor("getRxBytes", "network-max-rx") + def networkMaxRx: Metric = networkFor("getRxBytes", NetworkInboundRate) /** - * (SIGAR) Returns the max network IO tx value, in bytes. + * (SIGAR) Returns the max network IO outbound value, in bytes. */ - def networkMaxTx: Metric = networkMaxFor("getTxBytes", "network-max-tx") - - /** - * Returns the network stats per interface. - */ - def networkStats: Map[String, AnyRef] = Try(NetInterfaces.get.invoke(sigar.get).asInstanceOf[Array[String]].map(arg ⇒ - arg -> (createMethodFrom(sigar, "getNetInterfaceStat", Array(classOf[String])).get.invoke(sigar.get, arg))).toMap) getOrElse Map.empty[String, AnyRef] - - /** - * Returns true if SIGAR is successfully installed on the classpath, otherwise false. - */ - def isSigar: Boolean = sigar.isDefined + def networkMaxTx: Metric = networkFor("getTxBytes", NetworkOutboundRate) /** * Releases any native resources associated with this instance. */ - def close(): Unit = if (isSigar) Try(createMethodFrom(sigar, "close").get.invoke(sigar.get)) getOrElse Unit + override def close(): Unit = Try(createMethodFrom(sigar, "close").get.invoke(sigar)) + + // FIXME network metrics needs thought and refactoring /** * Returns the max bytes for the given method in metric for metric from the network interface stats. */ - private def networkMaxFor(method: String, metric: String): Metric = Metric(metric, Try(Some(BigInt( - networkStats.collect { case (_, a) ⇒ createMethodFrom(Some(a), method).get.invoke(a).asInstanceOf[Long] }.max))) getOrElse None) + private def networkFor(method: String, metric: String): Metric = Metric( + name = metric, + value = Try(networkStats.collect { + case (_, a) ⇒ + createMethodFrom(a, method).get.invoke(a).asInstanceOf[Long] + }.max.asInstanceOf[Number]).toOption.orElse(None), + decay = decayOption) - private def createMethodFrom(ref: Option[AnyRef], method: String, types: Array[(Class[_])] = Array.empty[(Class[_])]): Option[Method] = - Try(ref.get.getClass.getMethod(method, types: _*)).toOption + /** + * Returns the network stats per interface. + */ + private def networkStats: Map[String, AnyRef] = Try(NetInterfaces.get.invoke(sigar).asInstanceOf[Array[String]].map(arg ⇒ + arg -> (createMethodFrom(sigar, "getNetInterfaceStat", Array(classOf[String])).get.invoke(sigar, arg))).toMap) getOrElse Map.empty[String, AnyRef] + + private def createMethodFrom(ref: AnyRef, method: String, types: Array[(Class[_])] = Array.empty[(Class[_])]): Option[Method] = + Try(ref.getClass.getMethod(method, types: _*)).toOption } @@ -687,16 +752,26 @@ private[cluster] class MetricsCollector private (private val sigar: Option[AnyRe * Companion object of MetricsCollector class. */ private[cluster] object MetricsCollector { - def apply(address: Address, log: LoggingAdapter, dynamicAccess: DynamicAccess): MetricsCollector = - dynamicAccess.createInstanceFor[AnyRef]("org.hyperic.sigar.Sigar", Seq.empty) match { - case Success(identity) ⇒ new MetricsCollector(Some(identity), address) - case Failure(e) ⇒ - log.debug(e.toString) - log.info("Hyperic SIGAR was not found on the classpath or not installed properly. " + - "Metrics will be retreived from MBeans, and may be incorrect on some platforms. " + - "To increase metric accuracy add the 'sigar.jar' to the classpath and the appropriate" + - "platform-specific native libary to 'java.library.path'.") - new MetricsCollector(None, address) + def apply(system: ExtendedActorSystem, settings: ClusterSettings): MetricsCollector = { + import settings.{ MetricsCollectorClass ⇒ fqcn } + def log = Logging(system, "MetricsCollector") + if (fqcn == classOf[SigarMetricsCollector].getName) { + Try(new SigarMetricsCollector(system)) match { + case Success(sigarCollector) ⇒ sigarCollector + case Failure(e) ⇒ + log.info("Metrics will be retreived from MBeans, and may be incorrect on some platforms. " + + "To increase metric accuracy add the 'sigar.jar' to the classpath and the appropriate " + + "platform-specific native libary to 'java.library.path'. Reason: " + + e.toString) + new JmxMetricsCollector(system) + } + + } else { + system.dynamicAccess.createInstanceFor[MetricsCollector]( + fqcn, Seq(classOf[ActorSystem] -> system)).recover({ + case e ⇒ throw new ConfigurationException("Could not create custom metrics collector [" + fqcn + "] due to:" + e.toString) + }).get } + } } diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala index b8fa31fbc3..1b2d11745e 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala @@ -71,9 +71,16 @@ class ClusterSettings(val config: Config, val systemName: String) { callTimeout = Duration(getMilliseconds("akka.cluster.send-circuit-breaker.call-timeout"), MILLISECONDS), resetTimeout = Duration(getMilliseconds("akka.cluster.send-circuit-breaker.reset-timeout"), MILLISECONDS)) final val MetricsEnabled: Boolean = getBoolean("akka.cluster.metrics.enabled") - final val MetricsInterval: FiniteDuration = Duration(getMilliseconds("akka.cluster.metrics.metrics-interval"), MILLISECONDS) + final val MetricsCollectorClass: String = getString("akka.cluster.metrics.collector-class") + final val MetricsInterval: FiniteDuration = { + val d = Duration(getMilliseconds("akka.cluster.metrics.collect-interval"), MILLISECONDS) + require(d > Duration.Zero, "metrics.collect-interval must be > 0"); d + } final val MetricsGossipInterval: FiniteDuration = Duration(getMilliseconds("akka.cluster.metrics.gossip-interval"), MILLISECONDS) - final val MetricsRateOfDecay: Int = getInt("akka.cluster.metrics.rate-of-decay") + final val MetricsRateOfDecay: Int = { + val n = getInt("akka.cluster.metrics.rate-of-decay") + require(n >= 1, "metrics.rate-of-decay must be >= 1"); n + } } case class CircuitBreakerSettings(maxFailures: Int, callTimeout: FiniteDuration, resetTimeout: FiniteDuration) diff --git a/akka-cluster/src/main/scala/akka/cluster/routing/ClusterLoadBalancingRouter.scala b/akka-cluster/src/main/scala/akka/cluster/routing/ClusterLoadBalancingRouter.scala new file mode 100644 index 0000000000..52b63ef5f6 --- /dev/null +++ b/akka-cluster/src/main/scala/akka/cluster/routing/ClusterLoadBalancingRouter.scala @@ -0,0 +1,271 @@ +/* + * Copyright (C) 2009-2012 Typesafe Inc. + */ + +package akka.cluster.routing + +import scala.concurrent.forkjoin.ThreadLocalRandom +import scala.collection.JavaConverters.iterableAsScalaIterableConverter + +import akka.actor.Actor +import akka.actor.ActorRef +import akka.actor.Address +import akka.actor.OneForOneStrategy +import akka.actor.Props +import akka.actor.SupervisorStrategy +import akka.cluster.Cluster +import akka.cluster.ClusterEvent.ClusterMetricsChanged +import akka.cluster.ClusterEvent.CurrentClusterState +import akka.cluster.NodeMetrics +import akka.cluster.NodeMetrics.MetricValues +import akka.dispatch.Dispatchers +import akka.event.Logging +import akka.routing.Broadcast +import akka.routing.Destination +import akka.routing.Resizer +import akka.routing.Route +import akka.routing.RouteeProvider +import akka.routing.RouterConfig + +/** + * INTERNAL API + */ +private[cluster] object ClusterLoadBalancingRouter { + val defaultSupervisorStrategy: SupervisorStrategy = OneForOneStrategy() { + case _ ⇒ SupervisorStrategy.Escalate + } +} + +/** + * A Router that performs load balancing to cluster nodes based on + * cluster metric data. + * + * It uses random selection of routees based probabilities derived from + * the remaining capacity of corresponding node. + * + * Please note that providing both 'nrOfInstances' and 'routees' does not make logical + * sense as this means that the router should both create new actors and use the 'routees' + * actor(s). In this case the 'nrOfInstances' will be ignored and the 'routees' will be used. + *
+ * The configuration parameter trumps the constructor arguments. This means that + * if you provide either 'nrOfInstances' or 'routees' during instantiation they will + * be ignored if the router is defined in the configuration file for the actor being used. + * + *

Supervision Setup

+ * + * The router creates a “head” actor which supervises and/or monitors the + * routees. Instances are created as children of this actor, hence the + * children are not supervised by the parent of the router. Common choices are + * to always escalate (meaning that fault handling is always applied to all + * children simultaneously; this is the default) or use the parent’s strategy, + * which will result in routed children being treated individually, but it is + * possible as well to use Routers to give different supervisor strategies to + * different groups of children. + * + * @param metricsSelector decides what probability to use for selecting a routee, based + * on remaining capacity as indicated by the node metrics + * @param routees string representation of the actor paths of the routees that will be looked up + * using `actorFor` in [[akka.actor.ActorRefProvider]] + */ +@SerialVersionUID(1L) +case class ClusterLoadBalancingRouter( + metricsSelector: MetricsSelector, + nrOfInstances: Int = 0, routees: Iterable[String] = Nil, + override val resizer: Option[Resizer] = None, + val routerDispatcher: String = Dispatchers.DefaultDispatcherId, + val supervisorStrategy: SupervisorStrategy = ClusterLoadBalancingRouter.defaultSupervisorStrategy) + extends RouterConfig with ClusterLoadBalancingRouterLike { + + /** + * Constructor that sets nrOfInstances to be created. + * Java API + * @param selector the selector is responsible for producing weighted mix of routees from the node metrics + * @param nr number of routees to create + */ + def this(selector: MetricsSelector, nr: Int) = this(metricsSelector = selector, nrOfInstances = nr) + + /** + * Constructor that sets the routees to be used. + * Java API + * @param selector the selector is responsible for producing weighted mix of routees from the node metrics + * @param routeePaths string representation of the actor paths of the routees that will be looked up + * using `actorFor` in [[akka.actor.ActorRefProvider]] + */ + def this(selector: MetricsSelector, routeePaths: java.lang.Iterable[String]) = + this(metricsSelector = selector, routees = routeePaths.asScala) + + /** + * Constructor that sets the resizer to be used. + * Java API + * @param selector the selector is responsible for producing weighted mix of routees from the node metrics + */ + def this(selector: MetricsSelector, resizer: Resizer) = + this(metricsSelector = selector, resizer = Some(resizer)) + + /** + * Java API for setting routerDispatcher + */ + def withDispatcher(dispatcherId: String): ClusterLoadBalancingRouter = + copy(routerDispatcher = dispatcherId) + + /** + * Java API for setting the supervisor strategy to be used for the “head” + * Router actor. + */ + def withSupervisorStrategy(strategy: SupervisorStrategy): ClusterLoadBalancingRouter = + copy(supervisorStrategy = strategy) + +} + +/** + * INTERNAL API. + * + * This strategy is a metrics-aware router which performs load balancing of + * cluster nodes based on cluster metric data. It consumes [[akka.cluster.ClusterMetricsChanged]] + * events and the [[akka.cluster.routing.MetricsSelector]] creates an mix of + * weighted routees based on the node metrics. Messages are routed randomly to the + * weighted routees, i.e. nodes with lower load are more likely to be used than nodes with + * higher load + */ +trait ClusterLoadBalancingRouterLike { this: RouterConfig ⇒ + + def metricsSelector: MetricsSelector + + def nrOfInstances: Int + + def routees: Iterable[String] + + def routerDispatcher: String + + override def createRoute(routeeProvider: RouteeProvider): Route = { + if (resizer.isEmpty) { + if (routees.isEmpty) routeeProvider.createRoutees(nrOfInstances) + else routeeProvider.registerRouteesFor(routees) + } + + val log = Logging(routeeProvider.context.system, routeeProvider.context.self) + + // Function that points to the routees to use, starts with the plain routees + // of the routeeProvider and then changes to the current weighted routees + // produced by the metricsSelector. The reason for using a function is that + // routeeProvider.routees can change. + @volatile var weightedRoutees: () ⇒ IndexedSeq[ActorRef] = () ⇒ routeeProvider.routees + + // subscribe to ClusterMetricsChanged and update weightedRoutees + val metricsListener = routeeProvider.context.actorOf(Props(new Actor { + + val cluster = Cluster(routeeProvider.context.system) + + override def preStart(): Unit = cluster.subscribe(self, classOf[ClusterMetricsChanged]) + override def postStop(): Unit = cluster.unsubscribe(self) + + def receive = { + case ClusterMetricsChanged(metrics) ⇒ receiveMetrics(metrics) + case _: CurrentClusterState ⇒ // ignore + } + + def receiveMetrics(metrics: Set[NodeMetrics]): Unit = { + val routees = metricsSelector.weightedRefs(routeeProvider.routees, cluster.selfAddress, metrics) + weightedRoutees = () ⇒ routees + } + + }).withDispatcher(routerDispatcher), name = "metricsListener") + + def getNext(): ActorRef = { + val currentRoutees = weightedRoutees.apply + if (currentRoutees.isEmpty) routeeProvider.context.system.deadLetters + else currentRoutees(ThreadLocalRandom.current.nextInt(currentRoutees.size)) + } + + { + case (sender, message) ⇒ + message match { + case Broadcast(msg) ⇒ toAll(sender, routeeProvider.routees) + case msg ⇒ List(Destination(sender, getNext())) + } + } + } +} + +/** + * MetricsSelector that uses the heap metrics. + * Low heap capacity => lower weight. + */ +@SerialVersionUID(1L) +case object HeapMetricsSelector extends MetricsSelector { + /** + * Java API: get the singleton instance + */ + def getInstance = this + + override def capacity(nodeMetrics: Set[NodeMetrics]): Map[Address, Double] = { + nodeMetrics.map { n ⇒ + val (used, committed, max) = MetricValues.unapply(n.heapMemory) + val capacity = max match { + case None ⇒ (committed - used).toDouble / committed + case Some(m) ⇒ (m - used).toDouble / m + } + (n.address, capacity) + }.toMap + } +} + +// FIXME implement more MetricsSelectors, such as CpuMetricsSelector, +// LoadAverageMetricsSelector, NetworkMetricsSelector. +// Also a CompositeMetricsSelector which uses a mix of other +// selectors. + +/** + * A MetricsSelector is responsible for producing weighted mix of routees + * from the node metrics. The weights are typically proportional to the + * remaining capacity. + */ +abstract class MetricsSelector { + + /** + * Remaining capacity for each node. The value is between + * 0.0 and 1.0, where 0.0 means no remaining capacity (full + * utilization) and 1.0 means full remaining capacity (zero + * utilization). + */ + def capacity(nodeMetrics: Set[NodeMetrics]): Map[Address, Double] + + /** + * Converts the capacity values to weights. The node with lowest + * capacity gets weight 1 (lowest usable capacity is 1%) and other + * nodes gets weights proportional to their capacity compared to + * the node with lowest capacity. + */ + def weights(capacity: Map[Address, Double]): Map[Address, Int] = { + if (capacity.isEmpty) Map.empty[Address, Int] + else { + val (_, min) = capacity.minBy { case (_, c) ⇒ c } + // lowest usable capacity is 1% (>= 0.5% will be rounded to weight 1), also avoids div by zero + val divisor = math.max(0.01, min) + capacity mapValues { c ⇒ math.round((c) / divisor).toInt } + } + } + + /** + * Allocates a list of actor refs according to the weight of their node, i.e. + * weight 3 of node A will allocate 3 slots for each ref with address A. + */ + def weightedRefs(refs: IndexedSeq[ActorRef], selfAddress: Address, weights: Map[Address, Int]): IndexedSeq[ActorRef] = { + def fullAddress(actorRef: ActorRef): Address = actorRef.path.address match { + case Address(_, _, None, None) ⇒ selfAddress + case a ⇒ a + } + + val w = weights.withDefaultValue(1) + refs.foldLeft(IndexedSeq.empty[ActorRef]) { (acc, ref) ⇒ + acc ++ IndexedSeq.fill(w(fullAddress(ref)))(ref) + } + } + + /** + * Combines the different pieces to allocate a list of weighted actor refs + * based on the node metrics. + */ + def weightedRefs(refs: IndexedSeq[ActorRef], selfAddress: Address, nodeMetrics: Set[NodeMetrics]): IndexedSeq[ActorRef] = + weightedRefs(refs, selfAddress, weights(capacity(nodeMetrics))) +} \ No newline at end of file diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterMetricsSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterMetricsSpec.scala index e04d3612d3..aa7c10b1ed 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterMetricsSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterMetricsSpec.scala @@ -31,6 +31,8 @@ class ClusterMetricsMultiJvmNode5 extends ClusterMetricsSpec abstract class ClusterMetricsSpec extends MultiNodeSpec(ClusterMetricsMultiJvmSpec) with MultiNodeClusterSpec with MetricSpec { import ClusterMetricsMultiJvmSpec._ + def isSigar(collector: MetricsCollector): Boolean = collector.isInstanceOf[SigarMetricsCollector] + "Cluster metrics" must { "periodically collect metrics on each node, publish ClusterMetricsChanged to the event stream, " + "and gossip metrics around the node ring" taggedAs LongRunningTest in within(60 seconds) { @@ -38,9 +40,8 @@ abstract class ClusterMetricsSpec extends MultiNodeSpec(ClusterMetricsMultiJvmSp enterBarrier("cluster-started") awaitCond(clusterView.members.filter(_.status == MemberStatus.Up).size == roles.size) awaitCond(clusterView.clusterMetrics.size == roles.size) - assertInitialized(cluster.settings.MetricsRateOfDecay, collectNodeMetrics(clusterView.clusterMetrics).toSet) - val collector = MetricsCollector(cluster.selfAddress, log, system.asInstanceOf[ExtendedActorSystem].dynamicAccess) - clusterView.clusterMetrics.foreach(n ⇒ assertExpectedSampleSize(collector.isSigar, cluster.settings.MetricsRateOfDecay, n)) + val collector = MetricsCollector(cluster.system, cluster.settings) + collector.sample.metrics.size must be > (3) enterBarrier("after") } "reflect the correct number of node metrics in cluster view" taggedAs LongRunningTest in within(30 seconds) { diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala index 12fc8ebbc6..4c799aec63 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala @@ -64,7 +64,7 @@ trait MultiNodeClusterSpec extends Suite with STMultiNodeSpec { self: MultiNodeS def muteLog(sys: ActorSystem = system): Unit = { if (!sys.log.isDebugEnabled) { Seq(".*Metrics collection has started successfully.*", - ".*Hyperic SIGAR was not found on the classpath.*", + ".*Metrics will be retreived from MBeans.*", ".*Cluster Node.* - registered cluster JMX MBean.*", ".*Cluster Node.* - is starting up.*", ".*Shutting down cluster Node.*", diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterAdaptiveLoadBalancingRouterMultiJvmSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterAdaptiveLoadBalancingRouterMultiJvmSpec.scala deleted file mode 100644 index b62f60c0ce..0000000000 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterAdaptiveLoadBalancingRouterMultiJvmSpec.scala +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2009-2012 Typesafe Inc. - */ - -package akka.cluster.routing - -import akka.remote.testkit.{MultiNodeSpec, MultiNodeConfig} -import akka.testkit.{LongRunningTest, DefaultTimeout, ImplicitSender} -import akka.actor._ -import akka.cluster.{ MemberStatus, MultiNodeClusterSpec } -import akka.cluster.routing.ClusterRoundRobinRoutedActorMultiJvmSpec.SomeActor - - -object ClusterAdaptiveLoadBalancingRouterMultiJvmSpec extends MultiNodeConfig { - - val first = role("first") - val second = role("second") - val third = role("third") - val fourth = role("fourth") - val fifth = role("fifth") - - // TODO - config - commonConfig(debugConfig(on = false).withFallback(MultiNodeClusterSpec.clusterConfig)) - -} - -class ClusterAdaptiveLoadBalancingRouterMultiJvmNode1 extends ClusterAdaptiveLoadBalancingRouterSpec -class ClusterAdaptiveLoadBalancingRouterMultiJvmNode2 extends ClusterAdaptiveLoadBalancingRouterSpec -class ClusterAdaptiveLoadBalancingRouterMultiJvmNode3 extends ClusterAdaptiveLoadBalancingRouterSpec -class ClusterAdaptiveLoadBalancingRouterMultiJvmNode4 extends ClusterAdaptiveLoadBalancingRouterSpec -class ClusterAdaptiveLoadBalancingRouterMultiJvmNode5 extends ClusterAdaptiveLoadBalancingRouterSpec - -abstract class ClusterAdaptiveLoadBalancingRouterSpec extends MultiNodeSpec(ClusterAdaptiveLoadBalancingRouterMultiJvmSpec) -with MultiNodeClusterSpec -with ImplicitSender with DefaultTimeout { - import ClusterAdaptiveLoadBalancingRouterMultiJvmSpec._ - - // TODO configure properly and leverage the other pending load balancing routers - lazy val router1 = system.actorOf(Props[SomeActor].withRouter(ClusterRouterConfig(MemoryLoadBalancingRouter(), - ClusterRouterSettings(totalInstances = 3, maxInstancesPerNode = 1))), "router1") - lazy val router2 = system.actorOf(Props[SomeActor].withRouter(ClusterRouterConfig(MemoryLoadBalancingRouter(), - ClusterRouterSettings(totalInstances = 3, maxInstancesPerNode = 1))), "router2") - lazy val router3 = system.actorOf(Props[SomeActor].withRouter(ClusterRouterConfig(MemoryLoadBalancingRouter(), - ClusterRouterSettings(totalInstances = 3, maxInstancesPerNode = 1))), "router3") - lazy val router4 = system.actorOf(Props[SomeActor].withRouter(ClusterRouterConfig(MemoryLoadBalancingRouter(), - ClusterRouterSettings(totalInstances = 3, maxInstancesPerNode = 1))), "router4") - lazy val router5 = system.actorOf(Props[SomeActor].withRouter(ClusterRouterConfig(MemoryLoadBalancingRouter(), - ClusterRouterSettings(totalInstances = 3, maxInstancesPerNode = 1))), "router5") - - "A cluster with a ClusterAdaptiveLoadBalancingRouter" must { - "start cluster with 5 nodes" taggedAs LongRunningTest in { - awaitClusterUp(roles: _*) - enterBarrier("cluster-started") - awaitCond(clusterView.members.filter(_.status == MemberStatus.Up).size == roles.size) - awaitCond(clusterView.clusterMetrics.size == roles.size) - enterBarrier("cluster-metrics-consumer-ready") - } - // TODO the rest of the necessary testing. All the work needed for consumption and extraction - // of the data needed is in ClusterMetricsCollector._ - } -} diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterLoadBalancingRouter.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterLoadBalancingRouter.scala deleted file mode 100644 index 969372112f..0000000000 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterLoadBalancingRouter.scala +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright (C) 2009-2012 Typesafe Inc. - */ - -package akka.cluster.routing - -import language.implicitConversions -import language.postfixOps -import akka.actor._ -import akka.cluster._ -import akka.routing._ -import akka.dispatch.Dispatchers -import akka.event.Logging -import java.util.concurrent.atomic.{ AtomicLong, AtomicReference } -import akka.routing.Destination -import akka.cluster.NodeMetrics -import akka.routing.Broadcast -import akka.actor.OneForOneStrategy -import akka.cluster.ClusterEvent.ClusterMetricsChanged -import akka.cluster.ClusterEvent.CurrentClusterState -import util.Try -import akka.cluster.NodeMetrics.{ NodeMetricsComparator, MetricValues } -import NodeMetricsComparator._ - -/** - * INTERNAL API. - * - * Trait that embodies the contract for all load balancing implementations. - */ -private[cluster] trait LoadBalancer { - - /** - * Compares only those nodes that are deemed 'available' by the - * [[akka.routing.RouteeProvider]] - */ - def selectNodeByHealth(availableNodes: Set[NodeMetrics]): Option[Address] - -} - -/** - * INTERNAL API - */ -private[cluster] object ClusterLoadBalancingRouter { - val defaultSupervisorStrategy: SupervisorStrategy = OneForOneStrategy() { - case _ ⇒ SupervisorStrategy.Escalate - } -} - -/** - * INTERNAL API. - * - * The abstract consumer of [[akka.cluster.ClusterMetricsChanged]] events and the primary consumer - * of cluster metric data. This strategy is a metrics-aware router which performs load balancing of - * cluster nodes with a fallback strategy of a [[akka.routing.RoundRobinRouter]]. - * - * Load balancing of nodes is based on .. etc etc desc forthcoming - */ -trait ClusterAdaptiveLoadBalancingRouterLike extends RoundRobinLike with LoadBalancer { this: RouterConfig ⇒ - - def routerDispatcher: String - - override def createRoute(routeeProvider: RouteeProvider): Route = { - if (resizer.isEmpty) { - if (routees.isEmpty) routeeProvider.createRoutees(nrOfInstances) - else routeeProvider.registerRouteesFor(routees) - } - - val log = Logging(routeeProvider.context.system, routeeProvider.context.self) - - val next = new AtomicLong(0) - - val nodeMetrics = new AtomicReference[Set[NodeMetrics]](Set.empty) - - val metricsListener = routeeProvider.context.actorOf(Props(new Actor { - def receive = { - case ClusterMetricsChanged(metrics) ⇒ receiveMetrics(metrics) - case _: CurrentClusterState ⇒ // ignore - } - def receiveMetrics(metrics: Set[NodeMetrics]): Unit = { - val availableNodes = routeeProvider.routees.map(_.path.address).toSet - val updated: Set[NodeMetrics] = nodeMetrics.get.collect { case node if availableNodes contains node.address ⇒ node } - nodeMetrics.set(updated) - } - override def postStop(): Unit = Cluster(routeeProvider.context.system) unsubscribe self - }).withDispatcher(routerDispatcher), name = "metricsListener") - Cluster(routeeProvider.context.system).subscribe(metricsListener, classOf[ClusterMetricsChanged]) - - def getNext(): ActorRef = { - // TODO use as/where you will... selects by health category based on the implementation - val address: Option[Address] = selectNodeByHealth(nodeMetrics.get) - // TODO actual routee selection. defaults to round robin. - routeeProvider.routees((next.getAndIncrement % routees.size).asInstanceOf[Int]) - } - - def routeTo(): ActorRef = if (routeeProvider.routees.isEmpty) routeeProvider.context.system.deadLetters else getNext() - - { - case (sender, message) ⇒ - message match { - case Broadcast(msg) ⇒ toAll(sender, routeeProvider.routees) - case msg ⇒ List(Destination(sender, routeTo())) - } - } - } -} - -/** - * Selects by all monitored metric types (memory, network latency, cpu...) and - * chooses the healthiest node to route to. - */ -@SerialVersionUID(1L) -private[cluster] case class ClusterAdaptiveMetricsLoadBalancingRouter(nrOfInstances: Int = 0, routees: Iterable[String] = Nil, - override val resizer: Option[Resizer] = None, - val routerDispatcher: String = Dispatchers.DefaultDispatcherId, - val supervisorStrategy: SupervisorStrategy = ClusterLoadBalancingRouter.defaultSupervisorStrategy) - extends RouterConfig with ClusterAdaptiveLoadBalancingRouterLike with MetricsAwareClusterNodeSelector { - - // TODO - def selectNodeByHealth(nodes: Set[NodeMetrics]): Option[Address] = { - val s = Set(selectByMemory(nodes), selectByNetworkLatency(nodes), selectByCpu(nodes)) - s.head // TODO select the Address that appears with the highest or lowest frequency - } -} - -@SerialVersionUID(1L) -private[cluster] case class MemoryLoadBalancingRouter(nrOfInstances: Int = 0, routees: Iterable[String] = Nil, - override val resizer: Option[Resizer] = None, - val routerDispatcher: String = Dispatchers.DefaultDispatcherId, - val supervisorStrategy: SupervisorStrategy = ClusterLoadBalancingRouter.defaultSupervisorStrategy) - extends RouterConfig with ClusterAdaptiveLoadBalancingRouterLike with MetricsAwareClusterNodeSelector { - - def selectNodeByHealth(nodes: Set[NodeMetrics]): Option[Address] = selectByMemory(nodes) -} - -@SerialVersionUID(1L) -private[cluster] case class CpuLoadBalancer(nrOfInstances: Int = 0, routees: Iterable[String] = Nil, - override val resizer: Option[Resizer] = None, - val routerDispatcher: String = Dispatchers.DefaultDispatcherId, - val supervisorStrategy: SupervisorStrategy = ClusterLoadBalancingRouter.defaultSupervisorStrategy) - extends RouterConfig with ClusterAdaptiveLoadBalancingRouterLike with MetricsAwareClusterNodeSelector { - - // TODO - def selectNodeByHealth(nodes: Set[NodeMetrics]): Option[Address] = None -} - -@SerialVersionUID(1L) -private[cluster] case class NetworkLatencyLoadBalancer(nrOfInstances: Int = 0, routees: Iterable[String] = Nil, - override val resizer: Option[Resizer] = None, - val routerDispatcher: String = Dispatchers.DefaultDispatcherId, - val supervisorStrategy: SupervisorStrategy = ClusterLoadBalancingRouter.defaultSupervisorStrategy) - extends RouterConfig with ClusterAdaptiveLoadBalancingRouterLike with MetricsAwareClusterNodeSelector { - - // TODO - def selectNodeByHealth(nodes: Set[NodeMetrics]): Option[Address] = None -} diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterLoadBalancingRouterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterLoadBalancingRouterSpec.scala new file mode 100644 index 0000000000..028693f04c --- /dev/null +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterLoadBalancingRouterSpec.scala @@ -0,0 +1,162 @@ +/* + * Copyright (C) 2009-2012 Typesafe Inc. + */ + +package akka.cluster.routing + +import language.postfixOps +import scala.concurrent.duration._ +import java.lang.management.ManagementFactory +import akka.remote.testkit.{ MultiNodeSpec, MultiNodeConfig } +import akka.testkit.{ LongRunningTest, DefaultTimeout, ImplicitSender } +import akka.actor._ +import akka.cluster.{ MemberStatus, MultiNodeClusterSpec } +import scala.concurrent.Await +import akka.routing.RouterRoutees +import akka.pattern.ask +import akka.routing.CurrentRoutees +import akka.cluster.Cluster +import scala.concurrent.forkjoin.ThreadLocalRandom +import com.typesafe.config.ConfigFactory + +object ClusterLoadBalancingRouterMultiJvmSpec extends MultiNodeConfig { + + class Routee extends Actor { + var usedMemory: Array[Byte] = _ + def receive = { + case _ ⇒ sender ! Reply(Cluster(context.system).selfAddress) + } + } + + class Memory extends Actor with ActorLogging { + var usedMemory: Array[Byte] = _ + def receive = { + case AllocateMemory ⇒ + val heap = ManagementFactory.getMemoryMXBean.getHeapMemoryUsage + // getMax can be undefined (-1) + val max = math.max(heap.getMax, heap.getCommitted) + val used = heap.getUsed + val allocate = (0.8 * (max - used)).toInt + usedMemory = Array.fill(allocate)(ThreadLocalRandom.current.nextInt(127).toByte) + } + } + + case object AllocateMemory + case class Reply(address: Address) + + val first = role("first") + val second = role("second") + val third = role("third") + + commonConfig(debugConfig(on = false).withFallback(ConfigFactory.parseString(""" + akka.cluster.metrics.collect-interval = 1s + akka.cluster.metrics.gossip-interval = 1s + """)).withFallback(MultiNodeClusterSpec.clusterConfig)) + +} + +class ClusterLoadBalancingRouterMultiJvmNode1 extends ClusterLoadBalancingRouterSpec +class ClusterLoadBalancingRouterMultiJvmNode2 extends ClusterLoadBalancingRouterSpec +class ClusterLoadBalancingRouterMultiJvmNode3 extends ClusterLoadBalancingRouterSpec + +abstract class ClusterLoadBalancingRouterSpec extends MultiNodeSpec(ClusterLoadBalancingRouterMultiJvmSpec) + with MultiNodeClusterSpec + with ImplicitSender with DefaultTimeout { + import ClusterLoadBalancingRouterMultiJvmSpec._ + + def currentRoutees(router: ActorRef) = + Await.result(router ? CurrentRoutees, remaining).asInstanceOf[RouterRoutees].routees + + def receiveReplies(expectedReplies: Int): Map[Address, Int] = { + val zero = Map.empty[Address, Int] ++ roles.map(address(_) -> 0) + (receiveWhile(5 seconds, messages = expectedReplies) { + case Reply(address) ⇒ address + }).foldLeft(zero) { + case (replyMap, address) ⇒ replyMap + (address -> (replyMap(address) + 1)) + } + } + + /** + * Fills in self address for local ActorRef + */ + def fullAddress(actorRef: ActorRef): Address = actorRef.path.address match { + case Address(_, _, None, None) ⇒ cluster.selfAddress + case a ⇒ a + } + + def startRouter(name: String): ActorRef = { + val router = system.actorOf(Props[Routee].withRouter(ClusterRouterConfig( + local = ClusterLoadBalancingRouter(HeapMetricsSelector), + settings = ClusterRouterSettings(totalInstances = 10, maxInstancesPerNode = 1))), name) + awaitCond { + // it may take some time until router receives cluster member events + currentRoutees(router).size == roles.size + } + currentRoutees(router).map(fullAddress).toSet must be(roles.map(address).toSet) + router + } + + "A cluster with a ClusterLoadBalancingRouter" must { + "start cluster nodes" taggedAs LongRunningTest in { + awaitClusterUp(roles: _*) + enterBarrier("after-1") + } + + "use all nodes in the cluster when not overloaded" taggedAs LongRunningTest in { + runOn(first) { + val router1 = startRouter("router1") + + // collect some metrics before we start + Thread.sleep(10000) + + val iterationCount = 100 + for (i ← 0 until iterationCount) { + router1 ! "hit" + Thread.sleep(10) + } + + val replies = receiveReplies(iterationCount) + + replies(first) must be > (0) + replies(second) must be > (0) + replies(third) must be > (0) + replies.values.sum must be(iterationCount) + + } + + enterBarrier("after-2") + } + + "prefer node with more free heap capacity" taggedAs LongRunningTest in { + System.gc() + enterBarrier("gc") + + runOn(second) { + system.actorOf(Props[Memory], "memory") ! AllocateMemory + } + enterBarrier("heap-allocated") + + runOn(first) { + val router2 = startRouter("router2") + router2 + + // collect some metrics before we start + Thread.sleep(10000) + + val iterationCount = 100 + for (i ← 0 until iterationCount) { + router2 ! "hit" + Thread.sleep(10) + } + + val replies = receiveReplies(iterationCount) + + replies(third) must be > (replies(second)) + replies.values.sum must be(iterationCount) + + } + + enterBarrier("after-3") + } + } +} diff --git a/akka-cluster/src/test/scala/akka/cluster/ClusterConfigSpec.scala b/akka-cluster/src/test/scala/akka/cluster/ClusterConfigSpec.scala index 2d1a6542bd..34513076c0 100644 --- a/akka-cluster/src/test/scala/akka/cluster/ClusterConfigSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/ClusterConfigSpec.scala @@ -47,6 +47,7 @@ class ClusterConfigSpec extends AkkaSpec { callTimeout = 2 seconds, resetTimeout = 30 seconds)) MetricsEnabled must be(true) + MetricsCollectorClass must be("akka.cluster.SigarMetricsCollector") MetricsInterval must be(3 seconds) MetricsGossipInterval must be(3 seconds) MetricsRateOfDecay must be(10) diff --git a/akka-cluster/src/test/scala/akka/cluster/DataStreamSpec.scala b/akka-cluster/src/test/scala/akka/cluster/DataStreamSpec.scala index b6357ddc46..f6519f000f 100644 --- a/akka-cluster/src/test/scala/akka/cluster/DataStreamSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/DataStreamSpec.scala @@ -7,48 +7,74 @@ package akka.cluster import language.postfixOps import scala.concurrent.duration._ import akka.testkit.{ LongRunningTest, AkkaSpec } +import scala.concurrent.forkjoin.ThreadLocalRandom +import System.currentTimeMillis @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class DataStreamSpec extends AkkaSpec(MetricsEnabledSpec.config) with AbstractClusterMetricsSpec { +class DataStreamSpec extends AkkaSpec(MetricsEnabledSpec.config) with MetricSpec with MetricsCollectorFactory { import system.dispatcher val collector = createMetricsCollector "DataStream" must { + "calcualate same ewma for constant values" in { + val ds = DataStream(decay = 5, ewma = 100.0, currentTimeMillis, currentTimeMillis) :+ + 100.0 :+ 100.0 :+ 100.0 + ds.ewma must be(100.0 plusOrMinus 0.001) + } + + "calcualate correct ewma for normal decay" in { + val d0 = DataStream(decay = 10, ewma = 1000.0, currentTimeMillis, currentTimeMillis) + d0.ewma must be(1000.0 plusOrMinus 0.01) + val d1 = d0 :+ 10.0 + d1.ewma must be(820.0 plusOrMinus 0.01) + val d2 = d1 :+ 10.0 + d2.ewma must be(672.73 plusOrMinus 0.01) + val d3 = d2 :+ 10.0 + d3.ewma must be(552.23 plusOrMinus 0.01) + val d4 = d3 :+ 10.0 + d4.ewma must be(453.64 plusOrMinus 0.01) + + val dn = (1 to 100).foldLeft(d0)((d, _) ⇒ d :+ 10.0) + dn.ewma must be(10.0 plusOrMinus 0.1) + } + + "calculate ewma for decay 1" in { + val d0 = DataStream(decay = 1, ewma = 100.0, currentTimeMillis, currentTimeMillis) + d0.ewma must be(100.0 plusOrMinus 0.01) + val d1 = d0 :+ 1.0 + d1.ewma must be(1.0 plusOrMinus 0.01) + val d2 = d1 :+ 57.0 + d2.ewma must be(57.0 plusOrMinus 0.01) + val d3 = d2 :+ 10.0 + d3.ewma must be(10.0 plusOrMinus 0.01) + } + "calculate the ewma for multiple, variable, data streams" taggedAs LongRunningTest in { - val firstDataSet = collector.sample.metrics.collect { case m if m.trendable && m.isDefined ⇒ m.initialize(DefaultRateOfDecay) } - var streamingDataSet = firstDataSet - - val cancellable = system.scheduler.schedule(0 seconds, 100 millis) { - streamingDataSet = collector.sample.metrics.flatMap(latest ⇒ streamingDataSet.collect { - case streaming if (latest.trendable && latest.isDefined) && (latest same streaming) - && (latest.value.get != streaming.value.get) ⇒ { - val updatedDataStream = streaming.average.get :+ latest.value.get - updatedDataStream.timestamp must be > (streaming.average.get.timestamp) - updatedDataStream.duration.length must be > (streaming.average.get.duration.length) - updatedDataStream.ewma must not be (streaming.average.get.ewma) - updatedDataStream.ewma must not be (latest.value.get) - streaming.copy(value = latest.value, average = Some(updatedDataStream)) + var streamingDataSet = Map.empty[String, Metric] + var usedMemory = Array.empty[Byte] + (1 to 50) foreach { _ ⇒ + Thread.sleep(100) + usedMemory = usedMemory ++ Array.fill(1024)(ThreadLocalRandom.current.nextInt(127).toByte) + val changes = collector.sample.metrics.flatMap { latest ⇒ + streamingDataSet.get(latest.name) match { + case None ⇒ Some(latest) + case Some(previous) ⇒ + if (latest.average.isDefined && latest.isDefined && latest.value.get != previous.value.get) { + val updated = previous :+ latest + updated.average.isDefined must be(true) + val updatedAverage = updated.average.get + updatedAverage.timestamp must be > (previous.average.get.timestamp) + updatedAverage.duration.length must be > (previous.average.get.duration.length) + updatedAverage.ewma must not be (previous.average.get.ewma) + (previous.value.get.longValue compare latest.value.get.longValue) must be( + previous.average.get.ewma.longValue compare updatedAverage.ewma.longValue) + Some(updated) + } else None } - }) - } - awaitCond(firstDataSet.size == streamingDataSet.size, longDuration) - cancellable.cancel() - - val finalDataSet = streamingDataSet.map(m ⇒ m.name -> m).toMap - firstDataSet map { - first ⇒ - val newMetric = finalDataSet(first.name) - val e1 = first.average.get - val e2 = newMetric.average.get - - if (first.value.get != newMetric.value.get) { - e2.ewma must not be (first.value.get) - e2.ewma must not be (newMetric.value.get) - } - if (first.value.get.longValue > newMetric.value.get.longValue) e1.ewma.longValue must be > e2.ewma.longValue - else if (first.value.get.longValue < newMetric.value.get.longValue) e1.ewma.longValue must be < e2.ewma.longValue + } + streamingDataSet ++= changes.map(m ⇒ m.name -> m).toMap } } } diff --git a/akka-cluster/src/test/scala/akka/cluster/MetricNumericConverterSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricNumericConverterSpec.scala index 1f23da769c..f866056d9f 100644 --- a/akka-cluster/src/test/scala/akka/cluster/MetricNumericConverterSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/MetricNumericConverterSpec.scala @@ -5,39 +5,43 @@ package akka.cluster import akka.testkit.{ ImplicitSender, AkkaSpec } +import akka.cluster.NodeMetrics.MetricValues._ @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class MetricNumericConverterSpec extends AkkaSpec(MetricsEnabledSpec.config) with MetricNumericConverter with ImplicitSender with AbstractClusterMetricsSpec { +class MetricNumericConverterSpec extends AkkaSpec(MetricsEnabledSpec.config) with MetricNumericConverter with ImplicitSender with MetricSpec + with MetricsCollectorFactory { "MetricNumericConverter" must { val collector = createMetricsCollector "convert " in { - convert(0).isLeft must be(true) - convert(1).left.get must be(1) - convert(1L).isLeft must be(true) - convert(0.0).isRight must be(true) + convertNumber(0).isLeft must be(true) + convertNumber(1).left.get must be(1) + convertNumber(1L).isLeft must be(true) + convertNumber(0.0).isRight must be(true) } "define a new metric" in { - val metric = Metric("heap-memory-used", Some(0L)) - metric.initializable must be(true) - metric.name must not be (null) - metric.average.isEmpty must be(true) - metric.trendable must be(true) + val metric = Metric(HeapMemoryUsed, Some(256L), decay = Some(10)) + metric.name must be(HeapMemoryUsed) + metric.isDefined must be(true) + metric.value must be(Some(256L)) + metric.average.isDefined must be(true) + metric.average.get.ewma must be(256L) - if (collector.isSigar) { - val cores = collector.totalCores - cores.isDefined must be(true) - cores.value.get.intValue must be > (0) - cores.initializable must be(false) + collector match { + case c: SigarMetricsCollector ⇒ + val cores = c.totalCores + cores.isDefined must be(true) + cores.value.get.intValue must be > (0) + case _ ⇒ } } "define an undefined value with a None " in { - Metric("x", Some(-1)).value.isDefined must be(false) - Metric("x", Some(java.lang.Double.NaN)).value.isDefined must be(false) - Metric("x", None).isDefined must be(false) + Metric("x", Some(-1), None).value.isDefined must be(false) + Metric("x", Some(java.lang.Double.NaN), None).value.isDefined must be(false) + Metric("x", None, None).isDefined must be(false) } "recognize whether a metric value is defined" in { diff --git a/akka-cluster/src/test/scala/akka/cluster/NodeMetricsComparatorSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricValuesSpec.scala similarity index 53% rename from akka-cluster/src/test/scala/akka/cluster/NodeMetricsComparatorSpec.scala rename to akka-cluster/src/test/scala/akka/cluster/MetricValuesSpec.scala index 54e540763b..5910d0510f 100644 --- a/akka-cluster/src/test/scala/akka/cluster/NodeMetricsComparatorSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/MetricValuesSpec.scala @@ -4,17 +4,42 @@ package akka.cluster +import scala.util.Try import akka.actor.Address +import akka.cluster.NodeMetrics.MetricValues._ +import akka.testkit.AkkaSpec @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class NodeMetricsComparatorSpec extends ClusterMetricsRouteeSelectorSpec { - +class MetricValuesSpec extends AkkaSpec(MetricsEnabledSpec.config) with MetricSpec + with MetricsCollectorFactory { import NodeMetrics._ + val collector = createMetricsCollector + + val node1 = NodeMetrics(Address("akka", "sys", "a", 2554), 1, collector.sample.metrics) + val node2 = NodeMetrics(Address("akka", "sys", "a", 2555), 1, collector.sample.metrics) + + var nodes: Seq[NodeMetrics] = Seq(node1, node2) + + // work up the data streams where applicable + for (i ← 1 to 100) { + nodes = nodes map { + n ⇒ + n.copy(metrics = collector.sample.metrics.flatMap(latest ⇒ n.metrics.collect { + case streaming if latest same streaming ⇒ + streaming.average match { + case Some(e) ⇒ streaming.copy(value = latest.value, average = + if (latest.isDefined) Some(e :+ latest.value.get.doubleValue) else None) + case None ⇒ streaming.copy(value = latest.value) + } + })) + } + } + "NodeMetrics.MetricValues" must { "extract expected metrics for load balancing" in { - val stream1 = node2.metric("heap-memory-committed").value.get.longValue() - val stream2 = node1.metric("heap-memory-used").value.get.longValue() + val stream1 = node2.metric(HeapMemoryCommitted).value.get.longValue + val stream2 = node1.metric(HeapMemoryUsed).value.get.longValue stream1 must be >= (stream2) } @@ -39,8 +64,9 @@ class NodeMetricsComparatorSpec extends ClusterMetricsRouteeSelectorSpec { } val (systemLoadAverage, processors, combinedCpu, cores) = MetricValues.unapply(node.cpu) - systemLoadAverage must be >= (0.0) processors must be > (0) + if (systemLoadAverage.isDefined) + systemLoadAverage.get must be >= (0.0) if (combinedCpu.isDefined) { combinedCpu.get must be <= (1.0) combinedCpu.get must be >= (0.0) @@ -53,29 +79,4 @@ class NodeMetricsComparatorSpec extends ClusterMetricsRouteeSelectorSpec { } } - "NodeMetricsComparator" must { - val seq = Seq((Address("akka", "sys", "a", 2554), 9L), (Address("akka", "sys", "a", 2555), 8L)) - val seq2 = Seq((Address("akka", "sys", "a", 2554), 9.0), (Address("akka", "sys", "a", 2555), 8.0)) - - "handle min ordering of a (Address, Long)" in { - import NodeMetricsComparator.longMinAddressOrdering - seq.min._1.port.get must be(2555) - seq.min._2 must be(8L) - } - "handle max ordering of a (Address, Long)" in { - val (address, value) = NodeMetricsComparator.maxAddressLong(seq) - value must be(9L) - address.port.get must be(2554) - } - "handle min ordering of a (Address, Double)" in { - import NodeMetricsComparator.doubleMinAddressOrdering - seq2.min._1.port.get must be(2555) - seq2.min._2 must be(8.0) - } - "handle max ordering of a (Address, Double)" in { - val (address, value) = NodeMetricsComparator.maxAddressDouble(seq2) - value must be(9.0) - address.port.get must be(2554) - } - } } \ No newline at end of file diff --git a/akka-cluster/src/test/scala/akka/cluster/MetricsAwareClusterNodeSelectorSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricsAwareClusterNodeSelectorSpec.scala deleted file mode 100644 index 01327d65f9..0000000000 --- a/akka-cluster/src/test/scala/akka/cluster/MetricsAwareClusterNodeSelectorSpec.scala +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2009-2012 Typesafe Inc. - */ - -package akka.cluster - -import akka.testkit.AkkaSpec -import akka.actor.Address -import akka.cluster.NodeMetrics.MetricValues -import util.control.NonFatal -import util.Try - -@org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class MetricsAwareClusterNodeSelectorSpec extends ClusterMetricsRouteeSelectorSpec with MetricsAwareClusterNodeSelector { - import NodeMetrics.NodeMetricsComparator.longMinAddressOrdering - - "MetricsAwareClusterNodeSelector" must { - - "select the address of the node with the lowest memory" in { - for (i ← 0 to 10) { // run enough times to insure we test differing metric values - - val map = nodes.map(n ⇒ n.address -> MetricValues.unapply(n.heapMemory)).toMap - val (used1, committed1, max1) = map.get(node1.address).get - val (used2, committed2, max2) = map.get(node2.address).get - val diff1 = max1 match { - case Some(m) ⇒ ((committed1 - used1) + (m - used1) + (m - committed1)) - case None ⇒ committed1 - used1 - } - val diff2 = max2 match { - case Some(m) ⇒ ((committed2 - used2) + (m - used2) + (m - committed2)) - case None ⇒ committed2 - used2 - } - val testMin = Set(diff1, diff2).min - val expectedAddress = if (testMin == diff1) node1.address else node2.address - val address = selectByMemory(nodes.toSet).get - address must be(expectedAddress) - } - } - "select the address of the node with the lowest network latency" in { - // TODO - } - "select the address of the node with the best CPU health" in { - // TODO - } - "select the address of the node with the best overall health based on all metric categories monitored" in { - // TODO - } - } -} - -abstract class ClusterMetricsRouteeSelectorSpec extends AkkaSpec(MetricsEnabledSpec.config) with AbstractClusterMetricsSpec { - - val collector = createMetricsCollector - - var node1 = NodeMetrics(Address("akka", "sys", "a", 2554), 1, collector.sample.metrics) - node1 = node1.copy(metrics = node1.metrics.collect { case m ⇒ m.initialize(DefaultRateOfDecay) }) - - var node2 = NodeMetrics(Address("akka", "sys", "a", 2555), 1, collector.sample.metrics) - node2 = node2.copy(metrics = node2.metrics.collect { case m ⇒ m.initialize(DefaultRateOfDecay) }) - - var nodes: Seq[NodeMetrics] = Seq(node1, node2) - - // work up the data streams where applicable - for (i ← 0 to samples) { - nodes = nodes map { - n ⇒ - n.copy(metrics = collector.sample.metrics.flatMap(latest ⇒ n.metrics.collect { - case streaming if latest same streaming ⇒ - streaming.average match { - case Some(e) ⇒ streaming.copy(value = latest.value, average = Try(Some(e :+ latest.value.get)) getOrElse None) - case None ⇒ streaming.copy(value = latest.value) - } - })) - } - } -} diff --git a/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala index c7a4ad4c73..ad836bf5f7 100644 --- a/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala @@ -7,17 +7,18 @@ package akka.cluster import scala.language.postfixOps import scala.concurrent.duration._ import scala.concurrent.Await +import scala.util.{ Success, Try, Failure } import akka.actor._ import akka.testkit._ +import akka.cluster.NodeMetrics.MetricValues._ import org.scalatest.WordSpec import org.scalatest.matchers.MustMatchers -import util.{ Success, Try, Failure } object MetricsEnabledSpec { val config = """ akka.cluster.metrics.enabled = on - akka.cluster.metrics.metrics-interval = 1 s + akka.cluster.metrics.collect-interval = 1 s akka.cluster.metrics.gossip-interval = 1 s akka.cluster.metrics.rate-of-decay = 10 akka.actor.provider = "akka.remote.RemoteActorRefProvider" @@ -25,22 +26,16 @@ object MetricsEnabledSpec { } @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class MetricsCollectorSpec extends AkkaSpec(MetricsEnabledSpec.config) with ImplicitSender with AbstractClusterMetricsSpec with MetricSpec { +class MetricsCollectorSpec extends AkkaSpec(MetricsEnabledSpec.config) with ImplicitSender with MetricSpec + with MetricsCollectorFactory { import system.dispatcher val collector = createMetricsCollector "Metric must" must { - "create and initialize a new metric or merge an existing one" in { - for (i ← 0 to samples) { - val metrics = collector.sample.metrics - assertCreatedUninitialized(metrics) - assertInitialized(DefaultRateOfDecay, metrics map (_.initialize(DefaultRateOfDecay))) - } - } "merge 2 metrics that are tracking the same metric" in { - for (i ← 0 to samples) { + for (i ← 1 to 20) { val sample1 = collector.sample.metrics val sample2 = collector.sample.metrics var merged = sample2 flatMap (latest ⇒ sample1 collect { @@ -51,8 +46,8 @@ class MetricsCollectorSpec extends AkkaSpec(MetricsEnabledSpec.config) with Impl } }) - val sample3 = collector.sample.metrics map (_.initialize(DefaultRateOfDecay)) - val sample4 = collector.sample.metrics map (_.initialize(DefaultRateOfDecay)) + val sample3 = collector.sample.metrics + val sample4 = collector.sample.metrics merged = sample4 flatMap (latest ⇒ sample3 collect { case peer if latest same peer ⇒ { val m = peer :+ latest @@ -74,62 +69,61 @@ class MetricsCollectorSpec extends AkkaSpec(MetricsEnabledSpec.config) with Impl "collect accurate metrics for a node" in { val sample = collector.sample - assertExpectedSampleSize(collector.isSigar, DefaultRateOfDecay, sample) val metrics = sample.metrics.collect { case m if m.isDefined ⇒ (m.name, m.value.get) } - val used = metrics collectFirst { case ("heap-memory-used", b) ⇒ b } - val committed = metrics collectFirst { case ("heap-memory-committed", b) ⇒ b } + val used = metrics collectFirst { case (HeapMemoryUsed, b) ⇒ b } + val committed = metrics collectFirst { case (HeapMemoryCommitted, b) ⇒ b } metrics foreach { - case ("total-cores", b) ⇒ b.intValue must be > (0) - case ("network-max-rx", b) ⇒ b.longValue must be > (0L) - case ("network-max-tx", b) ⇒ b.longValue must be > (0L) - case ("system-load-average", b) ⇒ b.doubleValue must be >= (0.0) - case ("processors", b) ⇒ b.intValue must be >= (0) - case ("heap-memory-used", b) ⇒ b.longValue must be >= (0L) - case ("heap-memory-committed", b) ⇒ b.longValue must be > (0L) - case ("cpu-combined", b) ⇒ - b.doubleValue must be <= (1.0) - b.doubleValue must be >= (0.0) - case ("heap-memory-max", b) ⇒ + case (TotalCores, b) ⇒ b.intValue must be > (0) + case (NetworkInboundRate, b) ⇒ b.longValue must be > (0L) + case (NetworkOutboundRate, b) ⇒ b.longValue must be > (0L) + case (SystemLoadAverage, b) ⇒ b.doubleValue must be >= (0.0) + case (Processors, b) ⇒ b.intValue must be >= (0) + case (HeapMemoryUsed, b) ⇒ b.longValue must be >= (0L) + case (HeapMemoryCommitted, b) ⇒ b.longValue must be > (0L) + case (HeapMemoryMax, b) ⇒ + b.longValue must be > (0L) used.get.longValue must be <= (b.longValue) committed.get.longValue must be <= (b.longValue) + case (CpuCombined, b) ⇒ + b.doubleValue must be <= (1.0) + b.doubleValue must be >= (0.0) + } } "collect SIGAR metrics if it is on the classpath" in { - if (collector.isSigar) { - // combined cpu may or may not be defined on a given sampling - // systemLoadAverage is SIGAR present - collector.systemLoadAverage.isDefined must be(true) - collector.networkStats.nonEmpty must be(true) - collector.networkMaxRx.isDefined must be(true) - collector.networkMaxTx.isDefined must be(true) - collector.totalCores.isDefined must be(true) + collector match { + case c: SigarMetricsCollector ⇒ + // combined cpu may or may not be defined on a given sampling + // systemLoadAverage is not present on all platforms + c.networkMaxRx.isDefined must be(true) + c.networkMaxTx.isDefined must be(true) + c.totalCores.isDefined must be(true) + case _ ⇒ } } "collect JMX metrics" in { // heap max may be undefined depending on the OS - // systemLoadAverage is JMX if SIGAR not present, but not available on all OS - collector.used.isDefined must be(true) - collector.committed.isDefined must be(true) - collector.processors.isDefined must be(true) + // systemLoadAverage is JMX when SIGAR not present, but + // it's not present on all platforms + val c = collector.asInstanceOf[JmxMetricsCollector] + c.heapUsed.isDefined must be(true) + c.heapCommitted.isDefined must be(true) + c.processors.isDefined must be(true) } - "collect [" + samples + "] node metrics samples in an acceptable duration" taggedAs LongRunningTest in { - val latch = TestLatch(samples) - val task = system.scheduler.schedule(0 seconds, interval) { + "collect 50 node metrics samples in an acceptable duration" taggedAs LongRunningTest in within(7 seconds) { + (1 to 50) foreach { _ ⇒ val sample = collector.sample - assertCreatedUninitialized(sample.metrics) - assertExpectedSampleSize(collector.isSigar, DefaultRateOfDecay, sample) - latch.countDown() + sample.metrics.size must be >= (3) + Thread.sleep(100) } - Await.ready(latch, longDuration) - task.cancel() } } } -trait MetricSpec extends WordSpec with MustMatchers { +trait MetricSpec extends WordSpec with MustMatchers { this: { def system: ActorSystem } ⇒ def assertMasterMetricsAgainstGossipMetrics(master: Set[NodeMetrics], gossip: MetricsGossip): Unit = { val masterMetrics = collectNodeMetrics(master) @@ -140,52 +134,22 @@ trait MetricSpec extends WordSpec with MustMatchers { def assertExpectedNodeAddresses(gossip: MetricsGossip, nodes: Set[NodeMetrics]): Unit = gossip.nodes.map(_.address) must be(nodes.map(_.address)) - def assertExpectedSampleSize(isSigar: Boolean, gossip: MetricsGossip): Unit = - gossip.nodes.foreach(n ⇒ assertExpectedSampleSize(isSigar, gossip.rateOfDecay, n)) - - def assertCreatedUninitialized(gossip: MetricsGossip): Unit = - gossip.nodes.foreach(n ⇒ assertCreatedUninitialized(n.metrics.filterNot(_.trendable))) - - def assertInitialized(gossip: MetricsGossip): Unit = - gossip.nodes.foreach(n ⇒ assertInitialized(gossip.rateOfDecay, n.metrics)) - - def assertCreatedUninitialized(metrics: Set[Metric]): Unit = { - metrics.size must be > (0) - metrics foreach { m ⇒ - m.average.isEmpty must be(true) - if (m.value.isDefined) m.isDefined must be(true) - if (m.initializable) (m.trendable && m.isDefined && m.average.isEmpty) must be(true) - } - } - - def assertInitialized(decay: Int, metrics: Set[Metric]): Unit = if (decay > 0) metrics.filter(_.trendable) foreach { m ⇒ - m.initializable must be(false) - if (m.isDefined) m.average.isDefined must be(true) - } - def assertMerged(latest: Metric, peer: Metric, merged: Metric): Unit = if (latest same peer) { if (latest.isDefined) { if (peer.isDefined) { merged.isDefined must be(true) merged.value.get must be(latest.value.get) - if (latest.trendable) { - if (latest.initializable) merged.average.isEmpty must be(true) - else merged.average.isDefined must be(true) - } + merged.average.isDefined must be(latest.average.isDefined) } else { merged.isDefined must be(true) merged.value.get must be(latest.value.get) - if (latest.average.isDefined) merged.average.get must be(latest.average.get) - else merged.average.isEmpty must be(true) + merged.average.isDefined must be(latest.average.isDefined || peer.average.isDefined) } } else { if (peer.isDefined) { merged.isDefined must be(true) merged.value.get must be(peer.value.get) - if (peer.trendable) { - if (peer.initializable) merged.average.isEmpty must be(true) - else merged.average.isDefined must be(true) - } + merged.average.isDefined must be(peer.average.isDefined) } else { merged.isDefined must be(false) merged.average.isEmpty must be(true) @@ -193,20 +157,6 @@ trait MetricSpec extends WordSpec with MustMatchers { } } - def assertExpectedSampleSize(isSigar: Boolean, decay: Int, node: NodeMetrics): Unit = { - node.metrics.size must be(9) - val metrics = node.metrics.filter(_.isDefined) - if (isSigar) { // combined cpu + jmx max heap - metrics.size must be >= (7) - metrics.size must be <= (9) - } else { // jmx max heap - metrics.size must be >= (4) - metrics.size must be <= (5) - } - - if (decay > 0) metrics.collect { case m if m.trendable && (!m.initializable) ⇒ m }.foreach(_.average.isDefined must be(true)) - } - def collectNodeMetrics(nodes: Set[NodeMetrics]): Seq[Metric] = { var r: Seq[Metric] = Seq.empty nodes.foreach(n ⇒ r ++= n.metrics.filter(_.isDefined)) @@ -214,19 +164,25 @@ trait MetricSpec extends WordSpec with MustMatchers { } } -trait AbstractClusterMetricsSpec extends DefaultTimeout { - this: AkkaSpec ⇒ +/** + * Used when testing metrics without full cluster + */ +trait MetricsCollectorFactory { this: AkkaSpec ⇒ - val selfAddress = new Address("akka", "localhost") + private def extendedActorSystem = system.asInstanceOf[ExtendedActorSystem] - val DefaultRateOfDecay = 10 + def selfAddress = extendedActorSystem.provider.rootPath.address - val interval: FiniteDuration = 100 millis + val defaultRateOfDecay = 10 - val longDuration = 120 seconds // for long running tests + def createMetricsCollector: MetricsCollector = + Try(new SigarMetricsCollector(selfAddress, defaultRateOfDecay, extendedActorSystem.dynamicAccess)) match { + case Success(sigarCollector) ⇒ sigarCollector + case Failure(e) ⇒ + log.debug("Metrics will be retreived from MBeans, Sigar failed to load. Reason: " + + e.getMessage) + new JmxMetricsCollector(selfAddress, defaultRateOfDecay) + } - val samples = 100 - - def createMetricsCollector: MetricsCollector = MetricsCollector(selfAddress, log, system.asInstanceOf[ExtendedActorSystem].dynamicAccess) - -} \ No newline at end of file + def isSigar(collector: MetricsCollector): Boolean = collector.isInstanceOf[SigarMetricsCollector] +} diff --git a/akka-cluster/src/test/scala/akka/cluster/MetricsGossipSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricsGossipSpec.scala index e44b02e409..3ec10001f2 100644 --- a/akka-cluster/src/test/scala/akka/cluster/MetricsGossipSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/MetricsGossipSpec.scala @@ -12,7 +12,8 @@ import akka.actor.Address import java.lang.System.{ currentTimeMillis ⇒ newTimestamp } @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class MetricsGossipSpec extends AkkaSpec(MetricsEnabledSpec.config) with ImplicitSender with AbstractClusterMetricsSpec with MetricSpec { +class MetricsGossipSpec extends AkkaSpec(MetricsEnabledSpec.config) with ImplicitSender with MetricSpec + with MetricsCollectorFactory { val collector = createMetricsCollector @@ -21,27 +22,25 @@ class MetricsGossipSpec extends AkkaSpec(MetricsEnabledSpec.config) with Implici val m1 = NodeMetrics(Address("akka", "sys", "a", 2554), newTimestamp, collector.sample.metrics) val m2 = NodeMetrics(Address("akka", "sys", "a", 2555), newTimestamp, collector.sample.metrics) - var localGossip = MetricsGossip(DefaultRateOfDecay) + var localGossip = MetricsGossip() localGossip :+= m1 localGossip.nodes.size must be(1) localGossip.nodeKeys.size must be(localGossip.nodes.size) assertMasterMetricsAgainstGossipMetrics(Set(m1), localGossip) - assertExpectedSampleSize(collector.isSigar, localGossip) - assertInitialized(localGossip.rateOfDecay, collectNodeMetrics(localGossip.nodes).toSet) + collector.sample.metrics.size must be > (3) localGossip :+= m2 localGossip.nodes.size must be(2) localGossip.nodeKeys.size must be(localGossip.nodes.size) assertMasterMetricsAgainstGossipMetrics(Set(m1, m2), localGossip) - assertExpectedSampleSize(collector.isSigar, localGossip) - assertInitialized(localGossip.rateOfDecay, collectNodeMetrics(localGossip.nodes).toSet) + collector.sample.metrics.size must be > (3) } "merge peer metrics" in { val m1 = NodeMetrics(Address("akka", "sys", "a", 2554), newTimestamp, collector.sample.metrics) val m2 = NodeMetrics(Address("akka", "sys", "a", 2555), newTimestamp, collector.sample.metrics) - var remoteGossip = MetricsGossip(DefaultRateOfDecay) + var remoteGossip = MetricsGossip() remoteGossip :+= m1 remoteGossip :+= m2 remoteGossip.nodes.size must be(2) @@ -51,7 +50,7 @@ class MetricsGossipSpec extends AkkaSpec(MetricsEnabledSpec.config) with Implici remoteGossip :+= m2Updated // merge peers remoteGossip.nodes.size must be(2) assertMasterMetricsAgainstGossipMetrics(beforeMergeNodes, remoteGossip) - assertExpectedSampleSize(collector.isSigar, remoteGossip) + remoteGossip.nodes.foreach(_.metrics.size must be > (3)) remoteGossip.nodes collect { case peer if peer.address == m2.address ⇒ peer.timestamp must be(m2Updated.timestamp) } } @@ -61,11 +60,11 @@ class MetricsGossipSpec extends AkkaSpec(MetricsEnabledSpec.config) with Implici val m3 = NodeMetrics(Address("akka", "sys", "a", 2556), newTimestamp, collector.sample.metrics) val m2Updated = m2 copy (metrics = collector.sample.metrics, timestamp = newTimestamp) - var localGossip = MetricsGossip(DefaultRateOfDecay) + var localGossip = MetricsGossip() localGossip :+= m1 localGossip :+= m2 - var remoteGossip = MetricsGossip(DefaultRateOfDecay) + var remoteGossip = MetricsGossip() remoteGossip :+= m3 remoteGossip :+= m2Updated @@ -76,15 +75,13 @@ class MetricsGossipSpec extends AkkaSpec(MetricsEnabledSpec.config) with Implici val mergedGossip = localGossip merge remoteGossip mergedGossip.nodes.size must be(3) assertExpectedNodeAddresses(mergedGossip, Set(m1, m2, m3)) - assertExpectedSampleSize(collector.isSigar, mergedGossip) - assertCreatedUninitialized(mergedGossip) - assertInitialized(mergedGossip) + mergedGossip.nodes.foreach(_.metrics.size must be > (3)) mergedGossip.nodes.find(_.address == m2.address).get.timestamp must be(m2Updated.timestamp) } "get the current NodeMetrics if it exists in the local nodes" in { val m1 = NodeMetrics(Address("akka", "sys", "a", 2554), newTimestamp, collector.sample.metrics) - var localGossip = MetricsGossip(DefaultRateOfDecay) + var localGossip = MetricsGossip() localGossip :+= m1 localGossip.metricsFor(m1).nonEmpty must be(true) } @@ -93,7 +90,7 @@ class MetricsGossipSpec extends AkkaSpec(MetricsEnabledSpec.config) with Implici val m1 = NodeMetrics(Address("akka", "sys", "a", 2554), newTimestamp, collector.sample.metrics) val m2 = NodeMetrics(Address("akka", "sys", "a", 2555), newTimestamp, collector.sample.metrics) - var localGossip = MetricsGossip(DefaultRateOfDecay) + var localGossip = MetricsGossip() localGossip :+= m1 localGossip :+= m2 diff --git a/akka-cluster/src/test/scala/akka/cluster/NodeMetricsSpec.scala b/akka-cluster/src/test/scala/akka/cluster/NodeMetricsSpec.scala index 5d58bc84e5..d6a47db670 100644 --- a/akka-cluster/src/test/scala/akka/cluster/NodeMetricsSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/NodeMetricsSpec.scala @@ -8,7 +8,8 @@ import akka.testkit.AkkaSpec import akka.actor.Address @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class NodeMetricsSpec extends AkkaSpec with AbstractClusterMetricsSpec with MetricSpec { +class NodeMetricsSpec extends AkkaSpec with MetricSpec + with MetricsCollectorFactory { val collector = createMetricsCollector diff --git a/akka-cluster/src/test/scala/akka/cluster/routing/HeapMetricsSelectorSpec.scala b/akka-cluster/src/test/scala/akka/cluster/routing/HeapMetricsSelectorSpec.scala new file mode 100644 index 0000000000..5a8fecc2eb --- /dev/null +++ b/akka-cluster/src/test/scala/akka/cluster/routing/HeapMetricsSelectorSpec.scala @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2009-2012 Typesafe Inc. + */ + +package akka.cluster.routing + +import akka.testkit.AkkaSpec +import akka.actor.Address +import akka.actor.RootActorPath +import akka.cluster.NodeMetrics +import akka.cluster.NodeMetrics.MetricValues._ +import akka.cluster.Metric +import com.typesafe.config.ConfigFactory + +@org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) +class HeapMetricsSelectorSpec extends AkkaSpec(ConfigFactory.parseString(""" + akka.actor.provider = "akka.cluster.ClusterActorRefProvider" + akka.remote.netty.port = 0 + """)) { + + val selector = HeapMetricsSelector + + val a1 = Address("akka", "sys", "a1", 2551) + val b1 = Address("akka", "sys", "b1", 2551) + val c1 = Address("akka", "sys", "c1", 2551) + val d1 = Address("akka", "sys", "d1", 2551) + + val decay = Some(10) + + val nodeMetricsA = NodeMetrics(a1, System.currentTimeMillis, Set( + Metric(HeapMemoryUsed, Some(BigInt(128)), decay), + Metric(HeapMemoryCommitted, Some(BigInt(256)), decay), + Metric(HeapMemoryMax, Some(BigInt(512)), None))) + + val nodeMetricsB = NodeMetrics(b1, System.currentTimeMillis, Set( + Metric(HeapMemoryUsed, Some(BigInt(256)), decay), + Metric(HeapMemoryCommitted, Some(BigInt(512)), decay), + Metric(HeapMemoryMax, Some(BigInt(1024)), None))) + + val nodeMetricsC = NodeMetrics(c1, System.currentTimeMillis, Set( + Metric(HeapMemoryUsed, Some(BigInt(1024)), decay), + Metric(HeapMemoryCommitted, Some(BigInt(1024)), decay), + Metric(HeapMemoryMax, Some(BigInt(1024)), None))) + + val nodeMetrics = Set(nodeMetricsA, nodeMetricsB, nodeMetricsC) + + "MetricsAwareClusterNodeSelector" must { + + "calculate capacity of heap metrics" in { + val capacity = selector.capacity(nodeMetrics) + capacity(a1) must be(0.75 plusOrMinus 0.0001) + capacity(b1) must be(0.75 plusOrMinus 0.0001) + capacity(c1) must be(0.0 plusOrMinus 0.0001) + } + + "calculate weights from capacity" in { + val capacity = Map(a1 -> 0.6, b1 -> 0.3, c1 -> 0.1) + val weights = selector.weights(capacity) + weights must be(Map(c1 -> 1, b1 -> 3, a1 -> 6)) + } + + "handle low and zero capacity" in { + val capacity = Map(a1 -> 0.0, b1 -> 1.0, c1 -> 0.005, d1 -> 0.004) + val weights = selector.weights(capacity) + weights must be(Map(a1 -> 0, b1 -> 100, c1 -> 1, d1 -> 0)) + } + + "allocate weighted refs" in { + val weights = Map(a1 -> 1, b1 -> 3, c1 -> 10) + val refs = IndexedSeq( + system.actorFor(RootActorPath(a1) / "user" / "a"), + system.actorFor(RootActorPath(b1) / "user" / "b"), + system.actorFor(RootActorPath(c1) / "user" / "c")) + val result = selector.weightedRefs(refs, a1, weights) + val grouped = result.groupBy(_.path.address) + grouped(a1).size must be(1) + grouped(b1).size must be(3) + grouped(c1).size must be(10) + } + + "allocate refs for undefined weight" in { + val weights = Map(a1 -> 1, b1 -> 2) + val refs = IndexedSeq( + system.actorFor(RootActorPath(a1) / "user" / "a"), + system.actorFor(RootActorPath(b1) / "user" / "b"), + system.actorFor(RootActorPath(c1) / "user" / "c")) + val result = selector.weightedRefs(refs, a1, weights) + val grouped = result.groupBy(_.path.address) + grouped(a1).size must be(1) + grouped(b1).size must be(2) + grouped(c1).size must be(1) + } + + "allocate weighted local refs" in { + val weights = Map(a1 -> 2, b1 -> 1, c1 -> 10) + val refs = IndexedSeq( + testActor, + system.actorFor(RootActorPath(b1) / "user" / "b"), + system.actorFor(RootActorPath(c1) / "user" / "c")) + val result = selector.weightedRefs(refs, a1, weights) + result.filter(_ == testActor).size must be(2) + } + + "not allocate ref with weight zero" in { + val weights = Map(a1 -> 0, b1 -> 2, c1 -> 10) + val refs = IndexedSeq( + system.actorFor(RootActorPath(a1) / "user" / "a"), + system.actorFor(RootActorPath(b1) / "user" / "b"), + system.actorFor(RootActorPath(c1) / "user" / "c")) + val result = selector.weightedRefs(refs, a1, weights) + result.filter(_ == refs.head).size must be(0) + } + } +} \ No newline at end of file From 8f131c680fb089f4e1a8be78cfe4ad72b0a1123a Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Tue, 30 Oct 2012 15:08:41 +0100 Subject: [PATCH 119/210] Switching to immutable.Seq instead of Seq --- .../akka/actor/RelativeActorPathSpec.scala | 12 +++-- .../scala/akka/actor/TypedActorSpec.scala | 13 +++--- .../workbench/BenchResultRepository.scala | 29 ++++++------ .../workbench/GoogleChartBuilder.scala | 23 +++++----- .../akka/performance/workbench/Report.scala | 18 ++++---- .../src/main/scala/akka/actor/ActorPath.scala | 2 +- .../scala/akka/actor/ActorRefProvider.scala | 2 +- .../main/scala/akka/actor/ActorSystem.scala | 34 +++++++------- .../src/main/scala/akka/actor/Address.scala | 5 ++- .../src/main/scala/akka/actor/Deployer.scala | 2 +- .../main/scala/akka/actor/DynamicAccess.scala | 10 ++--- .../src/main/scala/akka/actor/Extension.scala | 2 +- .../main/scala/akka/actor/FaultHandling.scala | 38 +++++++--------- akka-actor/src/main/scala/akka/actor/IO.scala | 19 ++++---- .../main/scala/akka/actor/TypedActor.scala | 22 +++++----- .../akka/dispatch/AbstractDispatcher.scala | 4 +- .../scala/akka/dispatch/Dispatchers.scala | 2 +- .../src/main/scala/akka/event/EventBus.scala | 5 ++- .../src/main/scala/akka/event/Logging.scala | 9 ++-- .../src/main/scala/akka/japi/JavaAPI.scala | 7 +-- .../scala/akka/routing/ConsistentHash.scala | 6 +-- .../akka/serialization/Serialization.scala | 21 ++++----- .../scala/akka/util/SubclassifiedIndex.scala | 6 ++- .../akka/camel/ConcurrentActivationTest.scala | 11 +++-- .../src/main/scala/akka/cluster/Cluster.scala | 2 +- .../cluster/ClusterMetricsCollector.scala | 2 +- ...ientDowningNodeThatIsUnreachableSpec.scala | 5 ++- .../ClientDowningNodeThatIsUpSpec.scala | 5 ++- ...aderDowningNodeThatIsUnreachableSpec.scala | 9 ++-- .../akka/cluster/LeaderElectionSpec.scala | 3 +- .../akka/cluster/MultiNodeClusterSpec.scala | 35 +++++++-------- .../akka/cluster/SingletonClusterSpec.scala | 3 +- .../scala/akka/cluster/SplitBrainSpec.scala | 7 +-- .../UnreachableNodeRejoinsClusterSpec.scala | 7 +-- .../cluster/AccrualFailureDetectorSpec.scala | 6 +-- .../akka/cluster/MetricsCollectorSpec.scala | 13 +++--- .../docs/actor/FaultHandlingTestBase.java | 4 +- .../jrouting/CustomRouterDocTestBase.java | 3 +- .../scala/code/docs/actor/FSMDocSpec.scala | 11 ++--- .../code/docs/testkit/TestKitUsageSpec.scala | 7 +-- .../code/docs/zeromq/ZeromqDocSpec.scala | 12 ++--- .../src/main/scala/akka/kernel/Main.scala | 7 +-- .../blueprint/NamespaceHandlerTest.scala | 6 +-- .../akka/osgi/ActorSystemActivatorTest.scala | 6 ++- .../scala/akka/osgi/PojoSRTestSupport.scala | 16 +++---- .../NetworkFailureInjector.scala | 18 ++++---- .../akka/remote/testconductor/Player.scala | 20 ++++----- .../akka/remote/testkit/MultiNodeSpec.scala | 24 +++++----- .../akka/remote/RemoteActorRefProvider.scala | 2 +- .../remote/netty/NettyRemoteSupport.scala | 11 ++--- .../provider/InternetSeedGenerator.scala | 5 ++- .../scala/akka/testkit/TestActorRef.scala | 2 +- .../akka/testkit/TestEventListener.scala | 19 ++++---- .../src/main/scala/akka/testkit/TestKit.scala | 44 +++++++++---------- .../src/main/scala/akka/testkit/package.scala | 8 ++-- .../UntypedCoordinatedIncrementTest.java | 4 +- .../transactor/UntypedTransactorTest.java | 4 +- .../transactor/CoordinatedIncrementSpec.scala | 7 +-- .../akka/transactor/FickleFriendsSpec.scala | 15 ++++--- .../akka/transactor/TransactorSpec.scala | 5 ++- .../akka/zeromq/ConcurrentSocketActor.scala | 13 +++--- .../main/scala/akka/zeromq/SocketOption.scala | 32 +++++++------- .../akka/zeromq/ZMQMessageDeserializer.scala | 9 ++-- .../scala/akka/zeromq/ZeroMQExtension.scala | 4 +- .../zeromq/ConcurrentSocketActorSpec.scala | 8 ++-- 65 files changed, 375 insertions(+), 350 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/actor/RelativeActorPathSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/RelativeActorPathSpec.scala index 179f4aa92c..6870a36125 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/RelativeActorPathSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/RelativeActorPathSpec.scala @@ -6,24 +6,22 @@ package akka.actor import org.scalatest.WordSpec import org.scalatest.matchers.MustMatchers import java.net.URLEncoder +import scala.collection.immutable class RelativeActorPathSpec extends WordSpec with MustMatchers { - def elements(path: String): Seq[String] = path match { - case RelativeActorPath(elem) ⇒ elem.toSeq - case _ ⇒ Nil - } + def elements(path: String): immutable.Seq[String] = RelativeActorPath.unapply(path).getOrElse(Nil) "RelativeActorPath" must { "match single name" in { - elements("foo") must be(Seq("foo")) + elements("foo") must be(List("foo")) } "match path separated names" in { - elements("foo/bar/baz") must be(Seq("foo", "bar", "baz")) + elements("foo/bar/baz") must be(List("foo", "bar", "baz")) } "match url encoded name" in { val name = URLEncoder.encode("akka://ClusterSystem@127.0.0.1:2552", "UTF-8") - elements(name) must be(Seq(name)) + elements(name) must be(List(name)) } } } diff --git a/akka-actor-tests/src/test/scala/akka/actor/TypedActorSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/TypedActorSpec.scala index 040c8e6211..201b6c6949 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/TypedActorSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/TypedActorSpec.scala @@ -5,18 +5,19 @@ package akka.actor import language.postfixOps import org.scalatest.{ BeforeAndAfterAll, BeforeAndAfterEach } -import akka.util.Timeout +import scala.annotation.tailrec +import scala.collection.immutable import scala.concurrent.{ Await, Future, Promise } import scala.concurrent.duration._ -import java.util.concurrent.atomic.AtomicReference -import annotation.tailrec import akka.testkit.{ EventFilter, filterEvents, AkkaSpec } +import akka.util.Timeout import akka.japi.{ Option ⇒ JOption } import akka.testkit.DefaultTimeout -import akka.dispatch.{ Dispatchers } +import akka.dispatch.Dispatchers import akka.pattern.ask import akka.serialization.JavaSerializer import akka.actor.TypedActor._ +import java.util.concurrent.atomic.AtomicReference import java.lang.IllegalStateException import java.util.concurrent.{ TimeoutException, TimeUnit, CountDownLatch } @@ -35,9 +36,9 @@ object TypedActorSpec { } """ - class CyclicIterator[T](val items: Seq[T]) extends Iterator[T] { + class CyclicIterator[T](val items: immutable.Seq[T]) extends Iterator[T] { - private[this] val current: AtomicReference[Seq[T]] = new AtomicReference(items) + private[this] val current = new AtomicReference(items) def hasNext = items != Nil diff --git a/akka-actor-tests/src/test/scala/akka/performance/workbench/BenchResultRepository.scala b/akka-actor-tests/src/test/scala/akka/performance/workbench/BenchResultRepository.scala index 1cccd19417..7bc3fec9d1 100644 --- a/akka-actor-tests/src/test/scala/akka/performance/workbench/BenchResultRepository.scala +++ b/akka-actor-tests/src/test/scala/akka/performance/workbench/BenchResultRepository.scala @@ -12,17 +12,18 @@ import java.io.PrintWriter import java.text.SimpleDateFormat import java.util.Date import scala.collection.mutable.{ Map ⇒ MutableMap } +import scala.collection.immutable import akka.actor.ActorSystem import akka.event.Logging trait BenchResultRepository { def add(stats: Stats) - def get(name: String): Seq[Stats] + def get(name: String): immutable.Seq[Stats] def get(name: String, load: Int): Option[Stats] - def getWithHistorical(name: String, load: Int): Seq[Stats] + def getWithHistorical(name: String, load: Int): immutable.Seq[Stats] def isBaseline(stats: Stats): Boolean @@ -38,9 +39,9 @@ object BenchResultRepository { } class FileBenchResultRepository extends BenchResultRepository { - private val statsByName = MutableMap[String, Seq[Stats]]() + private val statsByName = MutableMap[String, immutable.Seq[Stats]]() private val baselineStats = MutableMap[Key, Stats]() - private val historicalStats = MutableMap[Key, Seq[Stats]]() + private val historicalStats = MutableMap[Key, immutable.Seq[Stats]]() private def resultDir = BenchmarkConfig.config.getString("benchmark.resultDir") private val serDir = resultDir + "/ser" private def serDirExists: Boolean = new File(serDir).exists @@ -51,13 +52,13 @@ class FileBenchResultRepository extends BenchResultRepository { case class Key(name: String, load: Int) def add(stats: Stats): Unit = synchronized { - val values = statsByName.getOrElseUpdate(stats.name, IndexedSeq.empty) + val values = statsByName.getOrElseUpdate(stats.name, Vector.empty) statsByName(stats.name) = values :+ stats save(stats) } - def get(name: String): Seq[Stats] = synchronized { - statsByName.getOrElse(name, IndexedSeq.empty) + def get(name: String): immutable.Seq[Stats] = synchronized { + statsByName.getOrElse(name, Vector.empty) } def get(name: String, load: Int): Option[Stats] = synchronized { @@ -68,13 +69,13 @@ class FileBenchResultRepository extends BenchResultRepository { baselineStats.get(Key(stats.name, stats.load)) == Some(stats) } - def getWithHistorical(name: String, load: Int): Seq[Stats] = synchronized { + def getWithHistorical(name: String, load: Int): immutable.Seq[Stats] = synchronized { val key = Key(name, load) - val historical = historicalStats.getOrElse(key, IndexedSeq.empty) + val historical = historicalStats.getOrElse(key, Vector.empty) val baseline = baselineStats.get(key) val current = get(name, load) - val limited = (IndexedSeq.empty ++ historical ++ baseline ++ current).takeRight(maxHistorical) + val limited = (Vector.empty ++ historical ++ baseline ++ current).takeRight(maxHistorical) limited.sortBy(_.timestamp) } @@ -94,7 +95,7 @@ class FileBenchResultRepository extends BenchResultRepository { } val historical = load(historicalFiles) for (h ← historical) { - val values = historicalStats.getOrElseUpdate(Key(h.name, h.load), IndexedSeq.empty) + val values = historicalStats.getOrElseUpdate(Key(h.name, h.load), Vector.empty) historicalStats(Key(h.name, h.load)) = values :+ h } } @@ -120,7 +121,7 @@ class FileBenchResultRepository extends BenchResultRepository { } } - private def load(files: Iterable[File]): Seq[Stats] = { + private def load(files: Iterable[File]): immutable.Seq[Stats] = { val result = for (f ← files) yield { var in: ObjectInputStream = null @@ -132,11 +133,11 @@ class FileBenchResultRepository extends BenchResultRepository { case e: Throwable ⇒ None } finally { - if (in ne null) try { in.close() } catch { case ignore: Exception ⇒ } + if (in ne null) try in.close() catch { case ignore: Exception ⇒ } } } - result.flatten.toSeq.sortBy(_.timestamp) + result.flatten.toVector.sortBy(_.timestamp) } loadFiles() diff --git a/akka-actor-tests/src/test/scala/akka/performance/workbench/GoogleChartBuilder.scala b/akka-actor-tests/src/test/scala/akka/performance/workbench/GoogleChartBuilder.scala index 52b30ceee7..66b634d47f 100644 --- a/akka-actor-tests/src/test/scala/akka/performance/workbench/GoogleChartBuilder.scala +++ b/akka-actor-tests/src/test/scala/akka/performance/workbench/GoogleChartBuilder.scala @@ -3,7 +3,7 @@ package akka.performance.workbench import java.io.UnsupportedEncodingException import java.net.URLEncoder -import scala.collection.immutable.TreeMap +import scala.collection.immutable /** * Generates URLs to Google Chart API http://code.google.com/apis/chart/ @@ -16,7 +16,7 @@ object GoogleChartBuilder { /** * Builds a bar chart for tps in the statistics. */ - def tpsChartUrl(statsByTimestamp: TreeMap[Long, Seq[Stats]], title: String, legend: Stats ⇒ String): String = { + def tpsChartUrl(statsByTimestamp: immutable.TreeMap[Long, Seq[Stats]], title: String, legend: Stats ⇒ String): String = { if (statsByTimestamp.isEmpty) "" else { val loads = statsByTimestamp.values.head.map(_.load) @@ -46,7 +46,7 @@ object GoogleChartBuilder { //sb.append("&") // legend - val legendStats = statsByTimestamp.values.map(_.head).toSeq + val legendStats = statsByTimestamp.values.toVector.map(_.head) appendLegend(legendStats, sb, legend) sb.append("&") // bar spacing @@ -60,10 +60,7 @@ object GoogleChartBuilder { val loadStr = loads.mkString(",") sb.append("chd=t:") val maxValue = allStats.map(_.tps).max - val tpsSeries: Iterable[String] = - for (statsSeq ← statsByTimestamp.values) yield { - statsSeq.map(_.tps).mkString(",") - } + val tpsSeries: Iterable[String] = for (statsSeq ← statsByTimestamp.values) yield statsSeq.map(_.tps).mkString(",") sb.append(tpsSeries.mkString("|")) // y range @@ -83,7 +80,7 @@ object GoogleChartBuilder { /** * Builds a bar chart for all percentiles and the mean in the statistics. */ - def percentilesAndMeanChartUrl(statistics: Seq[Stats], title: String, legend: Stats ⇒ String): String = { + def percentilesAndMeanChartUrl(statistics: immutable.Seq[Stats], title: String, legend: Stats ⇒ String): String = { if (statistics.isEmpty) "" else { val current = statistics.last @@ -146,13 +143,13 @@ object GoogleChartBuilder { } } - private def percentileLabels(percentiles: TreeMap[Int, Long], sb: StringBuilder) { + private def percentileLabels(percentiles: immutable.TreeMap[Int, Long], sb: StringBuilder) { sb.append("chxl=1:|") val s = percentiles.keys.toList.map(_ + "%").mkString("|") sb.append(s) } - private def appendLegend(statistics: Seq[Stats], sb: StringBuilder, legend: Stats ⇒ String) { + private def appendLegend(statistics: immutable.Seq[Stats], sb: StringBuilder, legend: Stats ⇒ String) { val legends = statistics.map(legend(_)) sb.append("chdl=") val s = legends.map(urlEncode(_)).mkString("|") @@ -166,7 +163,7 @@ object GoogleChartBuilder { sb.append(s) } - private def dataSeries(allPercentiles: Seq[TreeMap[Int, Long]], meanValues: Seq[Double], sb: StringBuilder) { + private def dataSeries(allPercentiles: immutable.Seq[immutable.TreeMap[Int, Long]], meanValues: immutable.Seq[Double], sb: StringBuilder) { val percentileSeries = for { percentiles ← allPercentiles @@ -181,7 +178,7 @@ object GoogleChartBuilder { sb.append(series.mkString("|")) } - private def dataSeries(values: Seq[Double], sb: StringBuilder) { + private def dataSeries(values: immutable.Seq[Double], sb: StringBuilder) { val series = values.map(formatDouble(_)) sb.append(series.mkString("|")) } @@ -198,7 +195,7 @@ object GoogleChartBuilder { } } - def latencyAndThroughputChartUrl(statistics: Seq[Stats], title: String): String = { + def latencyAndThroughputChartUrl(statistics: immutable.Seq[Stats], title: String): String = { if (statistics.isEmpty) "" else { val sb = new StringBuilder diff --git a/akka-actor-tests/src/test/scala/akka/performance/workbench/Report.scala b/akka-actor-tests/src/test/scala/akka/performance/workbench/Report.scala index 18f87702f3..f7974e6784 100644 --- a/akka-actor-tests/src/test/scala/akka/performance/workbench/Report.scala +++ b/akka-actor-tests/src/test/scala/akka/performance/workbench/Report.scala @@ -5,7 +5,7 @@ import java.text.SimpleDateFormat import java.util.Date import akka.actor.ActorSystem import akka.event.Logging -import scala.collection.immutable.TreeMap +import scala.collection.immutable class Report( system: ActorSystem, @@ -19,7 +19,7 @@ class Report( val legendTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm") val fileTimestampFormat = new SimpleDateFormat("yyyyMMddHHmmss") - def html(statistics: Seq[Stats]) { + def html(statistics: immutable.Seq[Stats]) { val current = statistics.last val sb = new StringBuilder @@ -80,13 +80,13 @@ class Report( chartUrl } - def comparePercentilesAndMeanChart(stats: Stats): Seq[String] = { + def comparePercentilesAndMeanChart(stats: Stats): immutable.Seq[String] = { for { - compareName ← compareResultWith.toSeq + compareName ← compareResultWith.to[immutable.Seq] compareStats ← resultRepository.get(compareName, stats.load) } yield { val chartTitle = stats.name + " vs. " + compareName + ", " + stats.load + " clients" + ", Percentiles and Mean (microseconds)" - val chartUrl = GoogleChartBuilder.percentilesAndMeanChartUrl(Seq(compareStats, stats), chartTitle, _.name) + val chartUrl = GoogleChartBuilder.percentilesAndMeanChartUrl(List(compareStats, stats), chartTitle, _.name) chartUrl } } @@ -102,17 +102,17 @@ class Report( } } - def compareWithHistoricalTpsChart(statistics: Seq[Stats]): Option[String] = { + def compareWithHistoricalTpsChart(statistics: immutable.Seq[Stats]): Option[String] = { if (statistics.isEmpty) { None } else { val histTimestamps = resultRepository.getWithHistorical(statistics.head.name, statistics.head.load).map(_.timestamp) - val statsByTimestamp = TreeMap[Long, Seq[Stats]]() ++ + val statsByTimestamp = immutable.TreeMap[Long, Seq[Stats]]() ++ (for (ts ← histTimestamps) yield { val seq = for (stats ← statistics) yield { - val withHistorical: Seq[Stats] = resultRepository.getWithHistorical(stats.name, stats.load) + val withHistorical: immutable.Seq[Stats] = resultRepository.getWithHistorical(stats.name, stats.load) val cell = withHistorical.find(_.timestamp == ts) cell.getOrElse(Stats(stats.name, stats.load, ts)) } @@ -131,7 +131,7 @@ class Report( chartUrl } - def formatResultsTable(statsSeq: Seq[Stats]): String = { + def formatResultsTable(statsSeq: immutable.Seq[Stats]): String = { val name = statsSeq.head.name diff --git a/akka-actor/src/main/scala/akka/actor/ActorPath.scala b/akka-actor/src/main/scala/akka/actor/ActorPath.scala index cc21e0de16..a20e8220b1 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorPath.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorPath.scala @@ -121,7 +121,7 @@ final case class RootActorPath(address: Address, name: String = "/") extends Act else addr + name override def compareTo(other: ActorPath): Int = other match { - case r: RootActorPath ⇒ toString compareTo r.toString + case r: RootActorPath ⇒ toString compareTo r.toString // FIXME make this cheaper by comparing address and name in isolation case c: ChildActorPath ⇒ 1 } } diff --git a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala index 8fa84b2978..a11da0c150 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala @@ -480,7 +480,7 @@ class LocalActorRefProvider( def registerExtraNames(_extras: Map[String, InternalActorRef]): Unit = extraNames ++= _extras private def guardianSupervisorStrategyConfigurator = - dynamicAccess.createInstanceFor[SupervisorStrategyConfigurator](settings.SupervisorStrategyClass, Seq()).get + dynamicAccess.createInstanceFor[SupervisorStrategyConfigurator](settings.SupervisorStrategyClass, Nil).get /** * Overridable supervision strategy to be used by the “/user” guardian. diff --git a/akka-actor/src/main/scala/akka/actor/ActorSystem.scala b/akka-actor/src/main/scala/akka/actor/ActorSystem.scala index 212ee9372d..b4309bcb5c 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorSystem.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorSystem.scala @@ -9,17 +9,17 @@ import akka.dispatch._ import akka.pattern.ask import com.typesafe.config.{ Config, ConfigFactory } import scala.annotation.tailrec -import scala.concurrent.duration.Duration -import java.io.Closeable +import scala.collection.immutable +import scala.concurrent.duration.{ FiniteDuration, Duration } import scala.concurrent.{ Await, Awaitable, CanAwait, Future } +import scala.util.{ Failure, Success } import scala.util.control.NonFatal import akka.util._ +import java.io.Closeable import akka.util.internal.{ HashedWheelTimer, ConcurrentIdentityHashMap } import java.util.concurrent.{ ThreadFactory, CountDownLatch, TimeoutException, RejectedExecutionException } import java.util.concurrent.TimeUnit.MILLISECONDS import akka.actor.dungeon.ChildrenContainer -import scala.concurrent.duration.FiniteDuration -import util.{ Failure, Success } object ActorSystem { @@ -144,7 +144,7 @@ object ActorSystem { final val LogLevel: String = getString("akka.loglevel") final val StdoutLogLevel: String = getString("akka.stdout-loglevel") - final val EventHandlers: Seq[String] = getStringList("akka.event-handlers").asScala + final val EventHandlers: immutable.Seq[String] = getStringList("akka.event-handlers").asScala.to[Vector] final val EventHandlerStartTimeout: Timeout = Timeout(Duration(getMilliseconds("akka.event-handler-startup-timeout"), MILLISECONDS)) final val LogConfigOnStart: Boolean = config.getBoolean("akka.log-config-on-start") @@ -273,10 +273,8 @@ abstract class ActorSystem extends ActorRefFactory { /** * ''Java API'': Recursively create a descendant’s path by appending all child names. */ - def descendant(names: java.lang.Iterable[String]): ActorPath = { - import scala.collection.JavaConverters._ - /(names.asScala) - } + def descendant(names: java.lang.Iterable[String]): ActorPath = + /(scala.collection.JavaConverters.iterableAsScalaIterableConverter(names).asScala) /** * Start-up time in milliseconds since the epoch. @@ -536,7 +534,7 @@ private[akka] class ActorSystemImpl(val name: String, applicationConfig: Config, val scheduler: Scheduler = createScheduler() val provider: ActorRefProvider = { - val arguments = Seq( + val arguments = Vector( classOf[String] -> name, classOf[Settings] -> settings, classOf[EventStream] -> eventStream, @@ -676,15 +674,15 @@ private[akka] class ActorSystemImpl(val name: String, applicationConfig: Config, def hasExtension(ext: ExtensionId[_ <: Extension]): Boolean = findExtension(ext) != null private def loadExtensions() { - import scala.collection.JavaConverters.collectionAsScalaIterableConverter - settings.config.getStringList("akka.extensions").asScala foreach { fqcn ⇒ - dynamicAccess.getObjectFor[AnyRef](fqcn) recoverWith { case _ ⇒ dynamicAccess.createInstanceFor[AnyRef](fqcn, Seq()) } match { - case Success(p: ExtensionIdProvider) ⇒ registerExtension(p.lookup()) - case Success(p: ExtensionId[_]) ⇒ registerExtension(p) - case Success(other) ⇒ log.error("[{}] is not an 'ExtensionIdProvider' or 'ExtensionId', skipping...", fqcn) - case Failure(problem) ⇒ log.error(problem, "While trying to load extension [{}], skipping...", fqcn) + scala.collection.JavaConverters.collectionAsScalaIterableConverter( + settings.config.getStringList("akka.extensions")).asScala foreach { fqcn ⇒ + dynamicAccess.getObjectFor[AnyRef](fqcn) recoverWith { case _ ⇒ dynamicAccess.createInstanceFor[AnyRef](fqcn, Nil) } match { + case Success(p: ExtensionIdProvider) ⇒ registerExtension(p.lookup()) + case Success(p: ExtensionId[_]) ⇒ registerExtension(p) + case Success(other) ⇒ log.error("[{}] is not an 'ExtensionIdProvider' or 'ExtensionId', skipping...", fqcn) + case Failure(problem) ⇒ log.error(problem, "While trying to load extension [{}], skipping...", fqcn) + } } - } } override def toString: String = lookupRoot.path.root.address.toString diff --git a/akka-actor/src/main/scala/akka/actor/Address.scala b/akka-actor/src/main/scala/akka/actor/Address.scala index 7c87d696a4..b8f8a52e45 100644 --- a/akka-actor/src/main/scala/akka/actor/Address.scala +++ b/akka-actor/src/main/scala/akka/actor/Address.scala @@ -5,7 +5,8 @@ package akka.actor import java.net.URI import java.net.URISyntaxException import java.net.MalformedURLException -import annotation.tailrec +import scala.annotation.tailrec +import scala.collection.immutable /** * The address specifies the physical location under which an Actor can be @@ -71,7 +72,7 @@ private[akka] trait PathUtils { } object RelativeActorPath extends PathUtils { - def unapply(addr: String): Option[Iterable[String]] = { + def unapply(addr: String): Option[immutable.Seq[String]] = { try { val uri = new URI(addr) if (uri.isAbsolute) None diff --git a/akka-actor/src/main/scala/akka/actor/Deployer.scala b/akka-actor/src/main/scala/akka/actor/Deployer.scala index 06d3b01a1b..e74b54c320 100644 --- a/akka-actor/src/main/scala/akka/actor/Deployer.scala +++ b/akka-actor/src/main/scala/akka/actor/Deployer.scala @@ -160,7 +160,7 @@ private[akka] class Deployer(val settings: ActorSystem.Settings, val dynamicAcce val vnodes = deployment.getInt("virtual-nodes-factor") ConsistentHashingRouter(nrOfInstances, routees, resizer, virtualNodesFactor = vnodes) case fqn ⇒ - val args = Seq(classOf[Config] -> deployment) + val args = List(classOf[Config] -> deployment) dynamicAccess.createInstanceFor[RouterConfig](fqn, args).recover({ case exception ⇒ throw new IllegalArgumentException( ("Cannot instantiate router [%s], defined in [%s], " + diff --git a/akka-actor/src/main/scala/akka/actor/DynamicAccess.scala b/akka-actor/src/main/scala/akka/actor/DynamicAccess.scala index 7a73eb3b15..af891bc483 100644 --- a/akka-actor/src/main/scala/akka/actor/DynamicAccess.scala +++ b/akka-actor/src/main/scala/akka/actor/DynamicAccess.scala @@ -3,7 +3,7 @@ */ package akka.actor -import scala.util.control.NonFatal +import scala.collection.immutable import java.lang.reflect.InvocationTargetException import scala.reflect.ClassTag import scala.util.Try @@ -25,7 +25,7 @@ abstract class DynamicAccess { * val obj = DynamicAccess.createInstanceFor(clazz, Seq(classOf[Config] -> config, classOf[String] -> name)) * }}} */ - def createInstanceFor[T: ClassTag](clazz: Class[_], args: Seq[(Class[_], AnyRef)]): Try[T] + def createInstanceFor[T: ClassTag](clazz: Class[_], args: immutable.Seq[(Class[_], AnyRef)]): Try[T] /** * Obtain a `Class[_]` object loaded with the right class loader (i.e. the one @@ -40,7 +40,7 @@ abstract class DynamicAccess { * `args` argument. The exact usage of args depends on which type is requested, * see the relevant requesting code for details. */ - def createInstanceFor[T: ClassTag](fqcn: String, args: Seq[(Class[_], AnyRef)]): Try[T] + def createInstanceFor[T: ClassTag](fqcn: String, args: immutable.Seq[(Class[_], AnyRef)]): Try[T] /** * Obtain the Scala “object” instance for the given fully-qualified class name, if there is one. @@ -70,7 +70,7 @@ class ReflectiveDynamicAccess(val classLoader: ClassLoader) extends DynamicAcces if (t.isAssignableFrom(c)) c else throw new ClassCastException(t + " is not assignable from " + c) }) - override def createInstanceFor[T: ClassTag](clazz: Class[_], args: Seq[(Class[_], AnyRef)]): Try[T] = + override def createInstanceFor[T: ClassTag](clazz: Class[_], args: immutable.Seq[(Class[_], AnyRef)]): Try[T] = Try { val types = args.map(_._1).toArray val values = args.map(_._2).toArray @@ -81,7 +81,7 @@ class ReflectiveDynamicAccess(val classLoader: ClassLoader) extends DynamicAcces if (t.isInstance(obj)) obj.asInstanceOf[T] else throw new ClassCastException(clazz.getName + " is not a subtype of " + t) } recover { case i: InvocationTargetException if i.getTargetException ne null ⇒ throw i.getTargetException } - override def createInstanceFor[T: ClassTag](fqcn: String, args: Seq[(Class[_], AnyRef)]): Try[T] = + override def createInstanceFor[T: ClassTag](fqcn: String, args: immutable.Seq[(Class[_], AnyRef)]): Try[T] = getClassFor(fqcn) flatMap { c ⇒ createInstanceFor(c, args) } override def getObjectFor[T: ClassTag](fqcn: String): Try[T] = { diff --git a/akka-actor/src/main/scala/akka/actor/Extension.scala b/akka-actor/src/main/scala/akka/actor/Extension.scala index 6fab4ceb07..707c07982a 100644 --- a/akka-actor/src/main/scala/akka/actor/Extension.scala +++ b/akka-actor/src/main/scala/akka/actor/Extension.scala @@ -98,5 +98,5 @@ abstract class ExtensionKey[T <: Extension](implicit m: ClassTag[T]) extends Ext def this(clazz: Class[T]) = this()(ClassTag(clazz)) override def lookup(): ExtensionId[T] = this - def createExtension(system: ExtendedActorSystem): T = system.dynamicAccess.createInstanceFor[T](m.runtimeClass, Seq(classOf[ExtendedActorSystem] -> system)).get + def createExtension(system: ExtendedActorSystem): T = system.dynamicAccess.createInstanceFor[T](m.runtimeClass, List(classOf[ExtendedActorSystem] -> system)).get } diff --git a/akka-actor/src/main/scala/akka/actor/FaultHandling.scala b/akka-actor/src/main/scala/akka/actor/FaultHandling.scala index d72389ae5e..444618df00 100644 --- a/akka-actor/src/main/scala/akka/actor/FaultHandling.scala +++ b/akka-actor/src/main/scala/akka/actor/FaultHandling.scala @@ -5,9 +5,10 @@ package akka.actor import language.implicitConversions +import java.lang.{ Iterable ⇒ JIterable } import java.util.concurrent.TimeUnit import scala.collection.mutable.ArrayBuffer -import java.lang.{ Iterable ⇒ JIterable } +import scala.collection.immutable import scala.concurrent.duration.Duration /** * INTERNAL API @@ -170,7 +171,7 @@ object SupervisorStrategy extends SupervisorStrategyLowPriorityImplicits { * Implicit conversion from `Seq` of Throwables to a `Decider`. * This maps the given Throwables to restarts, otherwise escalates. */ - implicit def seqThrowable2Decider(trapExit: Seq[Class[_ <: Throwable]]): Decider = makeDecider(trapExit) + implicit def seqThrowable2Decider(trapExit: immutable.Seq[Class[_ <: Throwable]]): Decider = makeImmutableDecider(trapExit) type Decider = PartialFunction[Throwable, Directive] type JDecider = akka.japi.Function[Throwable, Directive] @@ -180,23 +181,21 @@ object SupervisorStrategy extends SupervisorStrategyLowPriorityImplicits { * Decider builder which just checks whether one of * the given Throwables matches the cause and restarts, otherwise escalates. */ - def makeDecider(trapExit: Array[Class[_]]): Decider = - { case x ⇒ if (trapExit exists (_ isInstance x)) Restart else Escalate } - + def makeDecider(trapExit: immutable.Seq[Class[_ <: Throwable]]): Decider = makeImmutableDecider(trapExit) /** * Decider builder which just checks whether one of * the given Throwables matches the cause and restarts, otherwise escalates. */ - def makeDecider(trapExit: Seq[Class[_ <: Throwable]]): Decider = - { case x ⇒ if (trapExit exists (_ isInstance x)) Restart else Escalate } + def makeDecider(trapExit: JIterable[Class[_ <: Throwable]]): Decider = + makeImmutableDecider(scala.collection.JavaConverters.iterableAsScalaIterableConverter(trapExit).asScala) - /** - * Decider builder which just checks whether one of - * the given Throwables matches the cause and restarts, otherwise escalates. - */ - def makeDecider(trapExit: JIterable[Class[_ <: Throwable]]): Decider = { - import scala.collection.JavaConverters.iterableAsScalaIterableConverter - makeDecider(trapExit.asScala.toSeq) + private[this] def makeImmutableDecider(trapExit: Iterable[Class[_]]): Decider = { + val traps = trapExit match { // This is the sad, awkward, truth + case s: immutable.Seq[_] ⇒ s.asInstanceOf[immutable.Seq[Class[_]]] + case other ⇒ other.to[immutable.Seq] + } + + { case x ⇒ if (traps exists (_ isInstance x)) Restart else Escalate } } /** @@ -222,14 +221,14 @@ object SupervisorStrategy extends SupervisorStrategyLowPriorityImplicits { * * INTERNAL API */ - private[akka] def sort(in: Iterable[CauseDirective]): Seq[CauseDirective] = + private[akka] def sort(in: Iterable[CauseDirective]): immutable.Seq[CauseDirective] = (new ArrayBuffer[CauseDirective](in.size) /: in) { (buf, ca) ⇒ buf.indexWhere(_._1 isAssignableFrom ca._1) match { case -1 ⇒ buf append ca case x ⇒ buf insert (x, ca) } buf - } + }.to[immutable.Seq] private[akka] def withinTimeRangeOption(withinTimeRange: Duration): Option[Duration] = if (withinTimeRange.isFinite && withinTimeRange >= Duration.Zero) Some(withinTimeRange) else None @@ -338,10 +337,6 @@ case class AllForOneStrategy(maxNrOfRetries: Int = -1, withinTimeRange: Duration def this(maxNrOfRetries: Int, withinTimeRange: Duration, trapExit: JIterable[Class[_ <: Throwable]]) = this(maxNrOfRetries, withinTimeRange)(SupervisorStrategy.makeDecider(trapExit)) - - def this(maxNrOfRetries: Int, withinTimeRange: Duration, trapExit: Array[Class[_]]) = - this(maxNrOfRetries, withinTimeRange)(SupervisorStrategy.makeDecider(trapExit)) - /* * this is a performance optimization to avoid re-allocating the pairs upon * every call to requestRestartPermission, assuming that strategies are shared @@ -380,9 +375,6 @@ case class OneForOneStrategy(maxNrOfRetries: Int = -1, withinTimeRange: Duration def this(maxNrOfRetries: Int, withinTimeRange: Duration, trapExit: JIterable[Class[_ <: Throwable]]) = this(maxNrOfRetries, withinTimeRange)(SupervisorStrategy.makeDecider(trapExit)) - def this(maxNrOfRetries: Int, withinTimeRange: Duration, trapExit: Array[Class[_]]) = - this(maxNrOfRetries, withinTimeRange)(SupervisorStrategy.makeDecider(trapExit)) - /* * this is a performance optimization to avoid re-allocating the pairs upon * every call to requestRestartPermission, assuming that strategies are shared diff --git a/akka-actor/src/main/scala/akka/actor/IO.scala b/akka-actor/src/main/scala/akka/actor/IO.scala index 635afe2a58..e1dedb3ba2 100644 --- a/akka-actor/src/main/scala/akka/actor/IO.scala +++ b/akka-actor/src/main/scala/akka/actor/IO.scala @@ -6,6 +6,7 @@ package akka.actor import language.higherKinds import language.postfixOps +import scala.collection.immutable import scala.concurrent.{ ExecutionContext, Future } import scala.concurrent.duration.Duration import scala.util.control.NonFatal @@ -122,7 +123,7 @@ object IO { * @return a new SocketHandle that can be used to perform actions on the * new connection's SocketChannel. */ - def accept(options: Seq[SocketOption] = Seq.empty)(implicit socketOwner: ActorRef): SocketHandle = { + def accept(options: immutable.Seq[SocketOption] = Nil)(implicit socketOwner: ActorRef): SocketHandle = { val socket = SocketHandle(socketOwner, ioManager) ioManager ! Accept(socket, this, options) socket @@ -250,7 +251,7 @@ object IO { * * Normally sent using IOManager.listen() */ - case class Listen(server: ServerHandle, address: SocketAddress, options: Seq[ServerSocketOption] = Seq.empty) extends IOMessage + case class Listen(server: ServerHandle, address: SocketAddress, options: immutable.Seq[ServerSocketOption] = Nil) extends IOMessage /** * Message from an [[akka.actor.IOManager]] that the ServerSocketChannel is @@ -272,7 +273,7 @@ object IO { * * Normally sent using [[akka.actor.IO.ServerHandle]].accept() */ - case class Accept(socket: SocketHandle, server: ServerHandle, options: Seq[SocketOption] = Seq.empty) extends IOMessage + case class Accept(socket: SocketHandle, server: ServerHandle, options: immutable.Seq[SocketOption] = Nil) extends IOMessage /** * Message to an [[akka.actor.IOManager]] to create a SocketChannel connected @@ -280,7 +281,7 @@ object IO { * * Normally sent using IOManager.connect() */ - case class Connect(socket: SocketHandle, address: SocketAddress, options: Seq[SocketOption] = Seq.empty) extends IOMessage + case class Connect(socket: SocketHandle, address: SocketAddress, options: immutable.Seq[SocketOption] = Nil) extends IOMessage /** * Message from an [[akka.actor.IOManager]] that the SocketChannel has @@ -832,7 +833,7 @@ final class IOManager private (system: ExtendedActorSystem) extends Extension { * @param option Seq of [[akka.actor.IO.ServerSocketOptions]] to setup on socket * @return a [[akka.actor.IO.ServerHandle]] to uniquely identify the created socket */ - def listen(address: SocketAddress, options: Seq[IO.ServerSocketOption])(implicit owner: ActorRef): IO.ServerHandle = { + def listen(address: SocketAddress, options: immutable.Seq[IO.ServerSocketOption])(implicit owner: ActorRef): IO.ServerHandle = { val server = IO.ServerHandle(owner, actor) actor ! IO.Listen(server, address, options) server @@ -847,7 +848,7 @@ final class IOManager private (system: ExtendedActorSystem) extends Extension { * @param owner the ActorRef that will receive messages from the IOManagerActor * @return a [[akka.actor.IO.ServerHandle]] to uniquely identify the created socket */ - def listen(address: SocketAddress)(implicit owner: ActorRef): IO.ServerHandle = listen(address, Seq.empty) + def listen(address: SocketAddress)(implicit owner: ActorRef): IO.ServerHandle = listen(address, Nil) /** * Create a ServerSocketChannel listening on a host and port. Messages will @@ -860,7 +861,7 @@ final class IOManager private (system: ExtendedActorSystem) extends Extension { * @param owner the ActorRef that will receive messages from the IOManagerActor * @return a [[akka.actor.IO.ServerHandle]] to uniquely identify the created socket */ - def listen(host: String, port: Int, options: Seq[IO.ServerSocketOption] = Seq.empty)(implicit owner: ActorRef): IO.ServerHandle = + def listen(host: String, port: Int, options: immutable.Seq[IO.ServerSocketOption] = Nil)(implicit owner: ActorRef): IO.ServerHandle = listen(new InetSocketAddress(host, port), options)(owner) /** @@ -873,7 +874,7 @@ final class IOManager private (system: ExtendedActorSystem) extends Extension { * @param owner the ActorRef that will receive messages from the IOManagerActor * @return a [[akka.actor.IO.SocketHandle]] to uniquely identify the created socket */ - def connect(address: SocketAddress, options: Seq[IO.SocketOption] = Seq.empty)(implicit owner: ActorRef): IO.SocketHandle = { + def connect(address: SocketAddress, options: immutable.Seq[IO.SocketOption] = Nil)(implicit owner: ActorRef): IO.SocketHandle = { val socket = IO.SocketHandle(owner, actor) actor ! IO.Connect(socket, address, options) socket @@ -991,7 +992,7 @@ final class IOManagerActor(val settings: Settings) extends Actor with ActorLoggi private def forwardFailure(f: ⇒ Unit): Unit = try f catch { case NonFatal(e) ⇒ sender ! Status.Failure(e) } - private def setSocketOptions(socket: java.net.Socket, options: Seq[IO.SocketOption]) { + private def setSocketOptions(socket: java.net.Socket, options: immutable.Seq[IO.SocketOption]) { options foreach { case IO.KeepAlive(on) ⇒ forwardFailure(socket.setKeepAlive(on)) case IO.OOBInline(on) ⇒ forwardFailure(socket.setOOBInline(on)) diff --git a/akka-actor/src/main/scala/akka/actor/TypedActor.scala b/akka-actor/src/main/scala/akka/actor/TypedActor.scala index 6dbe48ba40..f7b0e853ef 100644 --- a/akka-actor/src/main/scala/akka/actor/TypedActor.scala +++ b/akka-actor/src/main/scala/akka/actor/TypedActor.scala @@ -4,22 +4,24 @@ package akka.actor import language.existentials -import akka.japi.{ Creator, Option ⇒ JOption } -import java.lang.reflect.{ InvocationTargetException, Method, InvocationHandler, Proxy } -import akka.util.Timeout + import scala.util.control.NonFatal +import scala.util.{ Try, Success, Failure } +import scala.collection.immutable +import scala.concurrent.duration.FiniteDuration import scala.concurrent.duration.Duration +import scala.reflect.ClassTag import scala.concurrent.{ Await, Future } +import akka.japi.{ Creator, Option ⇒ JOption } +import akka.util.Timeout import akka.util.Reflect.instantiator +import akka.serialization.{ JavaSerializer, SerializationExtension } import akka.dispatch._ import java.util.concurrent.atomic.{ AtomicReference ⇒ AtomVar } import java.util.concurrent.TimeoutException import java.util.concurrent.TimeUnit.MILLISECONDS -import scala.reflect.ClassTag -import akka.serialization.{ JavaSerializer, SerializationExtension } import java.io.ObjectStreamException -import scala.util.{ Try, Success, Failure } -import scala.concurrent.duration.FiniteDuration +import java.lang.reflect.{ InvocationTargetException, Method, InvocationHandler, Proxy } /** * A TypedActorFactory is something that can created TypedActor instances. @@ -439,8 +441,8 @@ object TypedProps { * @return a sequence of interfaces that the specified class implements, * or a sequence containing only itself, if itself is an interface. */ - def extractInterfaces(clazz: Class[_]): Seq[Class[_]] = - if (clazz.isInterface) Seq[Class[_]](clazz) else clazz.getInterfaces.toList + def extractInterfaces(clazz: Class[_]): immutable.Seq[Class[_]] = + if (clazz.isInterface) List[Class[_]](clazz) else clazz.getInterfaces.to[List] /** * Uses the supplied class as the factory for the TypedActor implementation, @@ -489,7 +491,7 @@ object TypedProps { */ @SerialVersionUID(1L) case class TypedProps[T <: AnyRef] protected[TypedProps] ( - interfaces: Seq[Class[_]], + interfaces: immutable.Seq[Class[_]], creator: () ⇒ T, dispatcher: String = TypedProps.defaultDispatcherId, deploy: Deploy = Props.defaultDeploy, diff --git a/akka-actor/src/main/scala/akka/dispatch/AbstractDispatcher.scala b/akka-actor/src/main/scala/akka/dispatch/AbstractDispatcher.scala index 36afc8a24c..1b9de36e77 100644 --- a/akka-actor/src/main/scala/akka/dispatch/AbstractDispatcher.scala +++ b/akka-actor/src/main/scala/akka/dispatch/AbstractDispatcher.scala @@ -420,7 +420,7 @@ abstract class MessageDispatcherConfigurator(val config: Config, val prerequisit case "unbounded" ⇒ UnboundedMailbox() case "bounded" ⇒ new BoundedMailbox(prerequisites.settings, config) case fqcn ⇒ - val args = Seq(classOf[ActorSystem.Settings] -> prerequisites.settings, classOf[Config] -> config) + val args = List(classOf[ActorSystem.Settings] -> prerequisites.settings, classOf[Config] -> config) prerequisites.dynamicAccess.createInstanceFor[MailboxType](fqcn, args).recover({ case exception ⇒ throw new IllegalArgumentException( @@ -436,7 +436,7 @@ abstract class MessageDispatcherConfigurator(val config: Config, val prerequisit case null | "" | "fork-join-executor" ⇒ new ForkJoinExecutorConfigurator(config.getConfig("fork-join-executor"), prerequisites) case "thread-pool-executor" ⇒ new ThreadPoolExecutorConfigurator(config.getConfig("thread-pool-executor"), prerequisites) case fqcn ⇒ - val args = Seq( + val args = List( classOf[Config] -> config, classOf[DispatcherPrerequisites] -> prerequisites) prerequisites.dynamicAccess.createInstanceFor[ExecutorServiceConfigurator](fqcn, args).recover({ diff --git a/akka-actor/src/main/scala/akka/dispatch/Dispatchers.scala b/akka-actor/src/main/scala/akka/dispatch/Dispatchers.scala index e1ae0ae50b..910a5ceed5 100644 --- a/akka-actor/src/main/scala/akka/dispatch/Dispatchers.scala +++ b/akka-actor/src/main/scala/akka/dispatch/Dispatchers.scala @@ -147,7 +147,7 @@ class Dispatchers(val settings: ActorSystem.Settings, val prerequisites: Dispatc case "BalancingDispatcher" ⇒ new BalancingDispatcherConfigurator(cfg, prerequisites) case "PinnedDispatcher" ⇒ new PinnedDispatcherConfigurator(cfg, prerequisites) case fqn ⇒ - val args = Seq(classOf[Config] -> cfg, classOf[DispatcherPrerequisites] -> prerequisites) + val args = List(classOf[Config] -> cfg, classOf[DispatcherPrerequisites] -> prerequisites) prerequisites.dynamicAccess.createInstanceFor[MessageDispatcherConfigurator](fqn, args).recover({ case exception ⇒ throw new IllegalArgumentException( diff --git a/akka-actor/src/main/scala/akka/event/EventBus.scala b/akka-actor/src/main/scala/akka/event/EventBus.scala index cb83fbe806..403f7a0dfd 100644 --- a/akka-actor/src/main/scala/akka/event/EventBus.scala +++ b/akka-actor/src/main/scala/akka/event/EventBus.scala @@ -10,6 +10,7 @@ import java.util.concurrent.ConcurrentSkipListSet import java.util.Comparator import akka.util.{ Subclassification, SubclassifiedIndex } import scala.collection.immutable.TreeSet +import scala.collection.immutable /** * Represents the base type for EventBuses @@ -167,12 +168,12 @@ trait SubchannelClassification { this: EventBus ⇒ recv foreach (publish(event, _)) } - private def removeFromCache(changes: Seq[(Classifier, Set[Subscriber])]): Unit = + private def removeFromCache(changes: immutable.Seq[(Classifier, Set[Subscriber])]): Unit = cache = (cache /: changes) { case (m, (c, cs)) ⇒ m.updated(c, m.getOrElse(c, Set.empty[Subscriber]) -- cs) } - private def addToCache(changes: Seq[(Classifier, Set[Subscriber])]): Unit = + private def addToCache(changes: immutable.Seq[(Classifier, Set[Subscriber])]): Unit = cache = (cache /: changes) { case (m, (c, cs)) ⇒ m.updated(c, m.getOrElse(c, Set.empty[Subscriber]) ++ cs) } diff --git a/akka-actor/src/main/scala/akka/event/Logging.scala b/akka-actor/src/main/scala/akka/event/Logging.scala index c9286cf2c9..dbd561514d 100644 --- a/akka-actor/src/main/scala/akka/event/Logging.scala +++ b/akka-actor/src/main/scala/akka/event/Logging.scala @@ -9,12 +9,13 @@ import akka.actor._ import akka.{ ConfigurationException, AkkaException } import akka.actor.ActorSystem.Settings import akka.util.{ Timeout, ReentrantGuard } -import scala.concurrent.duration._ import java.util.concurrent.atomic.AtomicInteger -import scala.util.control.NoStackTrace import java.util.concurrent.TimeoutException +import scala.annotation.implicitNotFound +import scala.collection.immutable +import scala.concurrent.duration._ import scala.concurrent.Await -import annotation.implicitNotFound +import scala.util.control.NoStackTrace /** * This trait brings log level handling to the EventStream: it reads the log @@ -448,7 +449,7 @@ object Logging { } // these type ascriptions/casts are necessary to avoid CCEs during construction while retaining correct type - val AllLogLevels: Seq[LogLevel] = Seq(ErrorLevel, WarningLevel, InfoLevel, DebugLevel) + val AllLogLevels: immutable.Seq[LogLevel] = Vector(ErrorLevel, WarningLevel, InfoLevel, DebugLevel) /** * Obtain LoggingAdapter for the given actor system and source object. This diff --git a/akka-actor/src/main/scala/akka/japi/JavaAPI.scala b/akka-actor/src/main/scala/akka/japi/JavaAPI.scala index ee2a688345..fda674a02c 100644 --- a/akka-actor/src/main/scala/akka/japi/JavaAPI.scala +++ b/akka-actor/src/main/scala/akka/japi/JavaAPI.scala @@ -5,7 +5,8 @@ package akka.japi import language.implicitConversions -import scala.Some + +import scala.collection.immutable import scala.reflect.ClassTag import scala.util.control.NoStackTrace import scala.runtime.AbstractPartialFunction @@ -176,7 +177,7 @@ object Option { object Util { def classTag[T](clazz: Class[T]): ClassTag[T] = ClassTag(clazz) - def arrayToSeq[T](arr: Array[T]): Seq[T] = arr.toSeq + def arrayToSeq[T](arr: Array[T]): immutable.Seq[T] = arr.to[immutable.Seq] - def arrayToSeq(classes: Array[Class[_]]): Seq[Class[_]] = classes.toSeq + def arrayToSeq(classes: Array[Class[_]]): immutable.Seq[Class[_]] = classes.to[immutable.Seq] } diff --git a/akka-actor/src/main/scala/akka/routing/ConsistentHash.scala b/akka-actor/src/main/scala/akka/routing/ConsistentHash.scala index 819fea2586..84100f0f21 100644 --- a/akka-actor/src/main/scala/akka/routing/ConsistentHash.scala +++ b/akka-actor/src/main/scala/akka/routing/ConsistentHash.scala @@ -4,7 +4,7 @@ package akka.routing -import scala.collection.immutable.SortedMap +import scala.collection.immutable import scala.reflect.ClassTag import java.util.Arrays @@ -18,7 +18,7 @@ import java.util.Arrays * hash, i.e. make sure it is different for different nodes. * */ -class ConsistentHash[T: ClassTag] private (nodes: SortedMap[Int, T], val virtualNodesFactor: Int) { +class ConsistentHash[T: ClassTag] private (nodes: immutable.SortedMap[Int, T], val virtualNodesFactor: Int) { import ConsistentHash._ @@ -106,7 +106,7 @@ class ConsistentHash[T: ClassTag] private (nodes: SortedMap[Int, T], val virtual object ConsistentHash { def apply[T: ClassTag](nodes: Iterable[T], virtualNodesFactor: Int): ConsistentHash[T] = { - new ConsistentHash(SortedMap.empty[Int, T] ++ + new ConsistentHash(immutable.SortedMap.empty[Int, T] ++ (for (node ← nodes; vnode ← 1 to virtualNodesFactor) yield (nodeHashFor(node, vnode) -> node)), virtualNodesFactor) } diff --git a/akka-actor/src/main/scala/akka/serialization/Serialization.scala b/akka-actor/src/main/scala/akka/serialization/Serialization.scala index 003c9de2b1..1f78fbd3a7 100644 --- a/akka-actor/src/main/scala/akka/serialization/Serialization.scala +++ b/akka-actor/src/main/scala/akka/serialization/Serialization.scala @@ -4,14 +4,15 @@ package akka.serialization -import akka.AkkaException import com.typesafe.config.Config +import akka.AkkaException import akka.actor.{ Extension, ExtendedActorSystem, Address, DynamicAccess } import akka.event.Logging import java.util.concurrent.ConcurrentHashMap import scala.collection.mutable.ArrayBuffer import java.io.NotSerializableException -import util.{ Try, DynamicVariable } +import scala.util.{ Try, DynamicVariable } +import scala.collection.immutable object Serialization { @@ -97,7 +98,7 @@ class Serialization(val system: ExtendedActorSystem) extends Extension { serializerMap.get(clazz) match { case null ⇒ // bindings are ordered from most specific to least specific - def unique(possibilities: Seq[(Class[_], Serializer)]): Boolean = + def unique(possibilities: immutable.Seq[(Class[_], Serializer)]): Boolean = possibilities.size == 1 || (possibilities forall (_._1 isAssignableFrom possibilities(0)._1)) || (possibilities forall (_._2 == possibilities(0)._2)) @@ -122,8 +123,8 @@ class Serialization(val system: ExtendedActorSystem) extends Extension { * loading is performed by the system’s [[akka.actor.DynamicAccess]]. */ def serializerOf(serializerFQN: String): Try[Serializer] = - system.dynamicAccess.createInstanceFor[Serializer](serializerFQN, Seq(classOf[ExtendedActorSystem] -> system)) recoverWith { - case _ ⇒ system.dynamicAccess.createInstanceFor[Serializer](serializerFQN, Seq()) + system.dynamicAccess.createInstanceFor[Serializer](serializerFQN, List(classOf[ExtendedActorSystem] -> system)) recoverWith { + case _ ⇒ system.dynamicAccess.createInstanceFor[Serializer](serializerFQN, Nil) } /** @@ -137,21 +138,21 @@ class Serialization(val system: ExtendedActorSystem) extends Extension { * bindings is a Seq of tuple representing the mapping from Class to Serializer. * It is primarily ordered by the most specific classes first, and secondly in the configured order. */ - private[akka] val bindings: Seq[ClassSerializer] = - sort(for ((k: String, v: String) ← settings.SerializationBindings if v != "none") yield (system.dynamicAccess.getClassFor[Any](k).get, serializers(v))) + private[akka] val bindings: immutable.Seq[ClassSerializer] = + sort(for ((k: String, v: String) ← settings.SerializationBindings if v != "none") yield (system.dynamicAccess.getClassFor[Any](k).get, serializers(v))).to[immutable.Seq] /** * Sort so that subtypes always precede their supertypes, but without * obeying any order between unrelated subtypes (insert sort). */ - private def sort(in: Iterable[ClassSerializer]): Seq[ClassSerializer] = - (new ArrayBuffer[ClassSerializer](in.size) /: in) { (buf, ca) ⇒ + private def sort(in: Iterable[ClassSerializer]): immutable.Seq[ClassSerializer] = + ((new ArrayBuffer[ClassSerializer](in.size) /: in) { (buf, ca) ⇒ buf.indexWhere(_._1 isAssignableFrom ca._1) match { case -1 ⇒ buf append ca case x ⇒ buf insert (x, ca) } buf - } + }).to[immutable.Seq] /** * serializerMap is a Map whose keys is the class that is serializable and values is the serializer diff --git a/akka-actor/src/main/scala/akka/util/SubclassifiedIndex.scala b/akka-actor/src/main/scala/akka/util/SubclassifiedIndex.scala index 565d50e636..d0ee67c1fb 100644 --- a/akka-actor/src/main/scala/akka/util/SubclassifiedIndex.scala +++ b/akka-actor/src/main/scala/akka/util/SubclassifiedIndex.scala @@ -3,6 +3,8 @@ */ package akka.util +import scala.collection.immutable + /** * Typeclass which describes a classification hierarchy. Observe the contract between `isEqual` and `isSubclass`! */ @@ -74,7 +76,7 @@ private[akka] class SubclassifiedIndex[K, V] private (private var values: Set[V] import SubclassifiedIndex._ - type Changes = Seq[(K, Set[V])] + type Changes = immutable.Seq[(K, Set[V])] protected var subkeys = Vector.empty[Nonroot[K, V]] @@ -208,5 +210,5 @@ private[akka] class SubclassifiedIndex[K, V] private (private var values: Set[V] private def mergeChangesByKey(changes: Changes): Changes = (emptyMergeMap[K, V] /: changes) { case (m, (k, s)) ⇒ m.updated(k, m(k) ++ s) - }.toSeq + }.to[immutable.Seq] } diff --git a/akka-camel/src/test/scala/akka/camel/ConcurrentActivationTest.scala b/akka-camel/src/test/scala/akka/camel/ConcurrentActivationTest.scala index a4ad1564c2..ff5524ad6c 100644 --- a/akka-camel/src/test/scala/akka/camel/ConcurrentActivationTest.scala +++ b/akka-camel/src/test/scala/akka/camel/ConcurrentActivationTest.scala @@ -1,13 +1,18 @@ +/** + * Copyright (C) 2009-2012 Typesafe Inc. + */ package akka.camel +import language.postfixOps + import org.scalatest.WordSpec import org.scalatest.matchers.MustMatchers +import scala.concurrent.{ Promise, Await, Future } +import scala.collection.immutable import akka.camel.TestSupport.NonSharedCamelSystem import akka.actor.{ ActorRef, Props, Actor } import akka.routing.BroadcastRouter -import concurrent.{ Promise, Await, Future } import scala.concurrent.duration._ -import language.postfixOps import akka.testkit._ import akka.util.Timeout import org.apache.camel.model.RouteDefinition @@ -58,7 +63,7 @@ class ConcurrentActivationTest extends WordSpec with MustMatchers with NonShared activations.size must be(2 * number * number) // must be the size of the activated activated producers and consumers deactivations.size must be(2 * number * number) - def partitionNames(refs: Seq[ActorRef]) = refs.map(_.path.name).partition(_.startsWith("concurrent-test-echo-consumer")) + def partitionNames(refs: immutable.Seq[ActorRef]) = refs.map(_.path.name).partition(_.startsWith("concurrent-test-echo-consumer")) def assertContainsSameElements(lists: (Seq[_], Seq[_])) { val (a, b) = lists a.intersect(b).size must be(a.size) diff --git a/akka-cluster/src/main/scala/akka/cluster/Cluster.scala b/akka-cluster/src/main/scala/akka/cluster/Cluster.scala index 13f93d0482..80fdc69fed 100644 --- a/akka-cluster/src/main/scala/akka/cluster/Cluster.scala +++ b/akka-cluster/src/main/scala/akka/cluster/Cluster.scala @@ -75,7 +75,7 @@ class Cluster(val system: ExtendedActorSystem) extends Extension { val failureDetector: FailureDetector = { import settings.{ FailureDetectorImplementationClass ⇒ fqcn } system.dynamicAccess.createInstanceFor[FailureDetector]( - fqcn, Seq(classOf[ActorSystem] -> system, classOf[ClusterSettings] -> settings)).recover({ + fqcn, List(classOf[ActorSystem] -> system, classOf[ClusterSettings] -> settings)).recover({ case e ⇒ throw new ConfigurationException("Could not create custom failure detector [" + fqcn + "] due to:" + e.toString) }).get } diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala index 76c01a6381..7ed3699035 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala @@ -557,7 +557,7 @@ private[cluster] class MetricsCollector private (private val sigar: Option[AnyRe */ private[cluster] object MetricsCollector { def apply(address: Address, log: LoggingAdapter, dynamicAccess: DynamicAccess): MetricsCollector = - dynamicAccess.createInstanceFor[AnyRef]("org.hyperic.sigar.Sigar", Seq.empty) match { + dynamicAccess.createInstanceFor[AnyRef]("org.hyperic.sigar.Sigar", Nil) match { case Success(identity) ⇒ new MetricsCollector(Some(identity), address) case Failure(e) ⇒ log.debug(e.toString) diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/ClientDowningNodeThatIsUnreachableSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/ClientDowningNodeThatIsUnreachableSpec.scala index 3efb891a3b..bf1009b472 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/ClientDowningNodeThatIsUnreachableSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/ClientDowningNodeThatIsUnreachableSpec.scala @@ -8,6 +8,7 @@ import akka.remote.testkit.MultiNodeConfig import akka.remote.testkit.MultiNodeSpec import akka.testkit._ import akka.actor.Address +import scala.collection.immutable case class ClientDowningNodeThatIsUnreachableMultiNodeConfig(failureDetectorPuppet: Boolean) extends MultiNodeConfig { val first = role("first") @@ -51,7 +52,7 @@ abstract class ClientDowningNodeThatIsUnreachableSpec(multiNodeConfig: ClientDow cluster.down(thirdAddress) enterBarrier("down-third-node") - awaitUpConvergence(numberOfMembers = 3, canNotBePartOfMemberRing = Seq(thirdAddress)) + awaitUpConvergence(numberOfMembers = 3, canNotBePartOfMemberRing = List(thirdAddress)) clusterView.members.exists(_.address == thirdAddress) must be(false) } @@ -62,7 +63,7 @@ abstract class ClientDowningNodeThatIsUnreachableSpec(multiNodeConfig: ClientDow runOn(second, fourth) { enterBarrier("down-third-node") - awaitUpConvergence(numberOfMembers = 3, canNotBePartOfMemberRing = Seq(thirdAddress)) + awaitUpConvergence(numberOfMembers = 3, canNotBePartOfMemberRing = List(thirdAddress)) } enterBarrier("await-completion") diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/ClientDowningNodeThatIsUpSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/ClientDowningNodeThatIsUpSpec.scala index 5a7308ec92..2a0af15997 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/ClientDowningNodeThatIsUpSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/ClientDowningNodeThatIsUpSpec.scala @@ -8,6 +8,7 @@ import akka.remote.testkit.MultiNodeConfig import akka.remote.testkit.MultiNodeSpec import akka.testkit._ import akka.actor.Address +import scala.collection.immutable case class ClientDowningNodeThatIsUpMultiNodeConfig(failureDetectorPuppet: Boolean) extends MultiNodeConfig { val first = role("first") @@ -49,7 +50,7 @@ abstract class ClientDowningNodeThatIsUpSpec(multiNodeConfig: ClientDowningNodeT markNodeAsUnavailable(thirdAddress) - awaitUpConvergence(numberOfMembers = 3, canNotBePartOfMemberRing = Seq(thirdAddress)) + awaitUpConvergence(numberOfMembers = 3, canNotBePartOfMemberRing = List(thirdAddress)) clusterView.members.exists(_.address == thirdAddress) must be(false) } @@ -60,7 +61,7 @@ abstract class ClientDowningNodeThatIsUpSpec(multiNodeConfig: ClientDowningNodeT runOn(second, fourth) { enterBarrier("down-third-node") - awaitUpConvergence(numberOfMembers = 3, canNotBePartOfMemberRing = Seq(thirdAddress)) + awaitUpConvergence(numberOfMembers = 3, canNotBePartOfMemberRing = List(thirdAddress)) } enterBarrier("await-completion") diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderDowningNodeThatIsUnreachableSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderDowningNodeThatIsUnreachableSpec.scala index 134ed4d0d6..279e32ab66 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderDowningNodeThatIsUnreachableSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderDowningNodeThatIsUnreachableSpec.scala @@ -11,6 +11,7 @@ import akka.remote.testkit.MultiNodeSpec import akka.testkit._ import akka.actor._ import scala.concurrent.duration._ +import scala.collection.immutable case class LeaderDowningNodeThatIsUnreachableMultiNodeConfig(failureDetectorPuppet: Boolean) extends MultiNodeConfig { val first = role("first") @@ -59,7 +60,7 @@ abstract class LeaderDowningNodeThatIsUnreachableSpec(multiNodeConfig: LeaderDow // --- HERE THE LEADER SHOULD DETECT FAILURE AND AUTO-DOWN THE UNREACHABLE NODE --- - awaitUpConvergence(numberOfMembers = 3, canNotBePartOfMemberRing = Seq(fourthAddress), 30.seconds) + awaitUpConvergence(numberOfMembers = 3, canNotBePartOfMemberRing = List(fourthAddress), 30.seconds) } runOn(fourth) { @@ -69,7 +70,7 @@ abstract class LeaderDowningNodeThatIsUnreachableSpec(multiNodeConfig: LeaderDow runOn(second, third) { enterBarrier("down-fourth-node") - awaitUpConvergence(numberOfMembers = 3, canNotBePartOfMemberRing = Seq(fourthAddress), 30.seconds) + awaitUpConvergence(numberOfMembers = 3, canNotBePartOfMemberRing = List(fourthAddress), 30.seconds) } enterBarrier("await-completion-1") @@ -89,7 +90,7 @@ abstract class LeaderDowningNodeThatIsUnreachableSpec(multiNodeConfig: LeaderDow // --- HERE THE LEADER SHOULD DETECT FAILURE AND AUTO-DOWN THE UNREACHABLE NODE --- - awaitUpConvergence(numberOfMembers = 2, canNotBePartOfMemberRing = Seq(secondAddress), 30.seconds) + awaitUpConvergence(numberOfMembers = 2, canNotBePartOfMemberRing = List(secondAddress), 30.seconds) } runOn(second) { @@ -99,7 +100,7 @@ abstract class LeaderDowningNodeThatIsUnreachableSpec(multiNodeConfig: LeaderDow runOn(third) { enterBarrier("down-second-node") - awaitUpConvergence(numberOfMembers = 2, canNotBePartOfMemberRing = Seq(secondAddress), 30 seconds) + awaitUpConvergence(numberOfMembers = 2, canNotBePartOfMemberRing = List(secondAddress), 30 seconds) } enterBarrier("await-completion-2") diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderElectionSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderElectionSpec.scala index fc8c4d2619..dfe1553369 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderElectionSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderElectionSpec.scala @@ -10,6 +10,7 @@ import akka.remote.testkit.MultiNodeConfig import akka.remote.testkit.MultiNodeSpec import akka.testkit._ import scala.concurrent.duration._ +import scala.collection.immutable case class LeaderElectionMultiNodeConfig(failureDetectorPuppet: Boolean) extends MultiNodeConfig { val controller = role("controller") @@ -42,7 +43,7 @@ abstract class LeaderElectionSpec(multiNodeConfig: LeaderElectionMultiNodeConfig import multiNodeConfig._ // sorted in the order used by the cluster - lazy val sortedRoles = Seq(first, second, third, fourth).sorted + lazy val sortedRoles = List(first, second, third, fourth).sorted "A cluster of four nodes" must { diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala index 12fc8ebbc6..d696f9b62b 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala @@ -4,21 +4,21 @@ package akka.cluster import language.implicitConversions + +import org.scalatest.Suite +import org.scalatest.exceptions.TestFailedException + import com.typesafe.config.Config import com.typesafe.config.ConfigFactory -import akka.actor.{ Address, ExtendedActorSystem } import akka.remote.testconductor.RoleName import akka.remote.testkit.{ STMultiNodeSpec, MultiNodeSpec } import akka.testkit._ import akka.testkit.TestEvent._ -import scala.concurrent.duration._ -import org.scalatest.Suite -import org.scalatest.exceptions.TestFailedException -import java.util.concurrent.ConcurrentHashMap -import akka.actor.ActorPath -import akka.actor.RootActorPath +import akka.actor.{ ActorSystem, Address } import akka.event.Logging.ErrorLevel -import akka.actor.ActorSystem +import scala.concurrent.duration._ +import scala.collection.immutable +import java.util.concurrent.ConcurrentHashMap object MultiNodeClusterSpec { @@ -158,7 +158,7 @@ trait MultiNodeClusterSpec extends Suite with STMultiNodeSpec { self: MultiNodeS * nodes (roles). First node will be started first * and others will join the first. */ - def startCluster(roles: RoleName*): Unit = awaitStartCluster(false, roles.toSeq) + def startCluster(roles: RoleName*): Unit = awaitStartCluster(false, roles.to[immutable.Seq]) /** * Initialize the cluster of the specified member @@ -166,11 +166,9 @@ trait MultiNodeClusterSpec extends Suite with STMultiNodeSpec { self: MultiNodeS * First node will be started first and others will join * the first. */ - def awaitClusterUp(roles: RoleName*): Unit = { - awaitStartCluster(true, roles.toSeq) - } + def awaitClusterUp(roles: RoleName*): Unit = awaitStartCluster(true, roles.to[immutable.Seq]) - private def awaitStartCluster(upConvergence: Boolean = true, roles: Seq[RoleName]): Unit = { + private def awaitStartCluster(upConvergence: Boolean = true, roles: immutable.Seq[RoleName]): Unit = { runOn(roles.head) { // make sure that the node-to-join is started before other join startClusterNode() @@ -196,16 +194,15 @@ trait MultiNodeClusterSpec extends Suite with STMultiNodeSpec { self: MultiNodeS expectedAddresses.sorted.zipWithIndex.foreach { case (a, i) ⇒ members(i).address must be(a) } } - def assertLeader(nodesInCluster: RoleName*): Unit = if (nodesInCluster.contains(myself)) { - assertLeaderIn(nodesInCluster) - } + def assertLeader(nodesInCluster: RoleName*): Unit = + if (nodesInCluster.contains(myself)) assertLeaderIn(nodesInCluster.to[immutable.Seq]) /** * Assert that the cluster has elected the correct leader * out of all nodes in the cluster. First * member in the cluster ring is expected leader. */ - def assertLeaderIn(nodesInCluster: Seq[RoleName]): Unit = if (nodesInCluster.contains(myself)) { + def assertLeaderIn(nodesInCluster: immutable.Seq[RoleName]): Unit = if (nodesInCluster.contains(myself)) { nodesInCluster.length must not be (0) val expectedLeader = roleOfLeader(nodesInCluster) val leader = clusterView.leader @@ -221,7 +218,7 @@ trait MultiNodeClusterSpec extends Suite with STMultiNodeSpec { self: MultiNodeS */ def awaitUpConvergence( numberOfMembers: Int, - canNotBePartOfMemberRing: Seq[Address] = Seq.empty[Address], + canNotBePartOfMemberRing: immutable.Seq[Address] = Nil, timeout: FiniteDuration = 20.seconds): Unit = { within(timeout) { awaitCond(clusterView.members.size == numberOfMembers) @@ -239,7 +236,7 @@ trait MultiNodeClusterSpec extends Suite with STMultiNodeSpec { self: MultiNodeS def awaitSeenSameState(addresses: Address*): Unit = awaitCond((addresses.toSet -- clusterView.seenBy).isEmpty) - def roleOfLeader(nodesInCluster: Seq[RoleName] = roles): RoleName = { + def roleOfLeader(nodesInCluster: immutable.Seq[RoleName] = roles): RoleName = { nodesInCluster.length must not be (0) nodesInCluster.sorted.head } diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/SingletonClusterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/SingletonClusterSpec.scala index 291a59a44f..33ce67ecb5 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/SingletonClusterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/SingletonClusterSpec.scala @@ -8,6 +8,7 @@ import akka.remote.testkit.MultiNodeConfig import akka.remote.testkit.MultiNodeSpec import akka.testkit._ import scala.concurrent.duration._ +import scala.collection.immutable case class SingletonClusterMultiNodeConfig(failureDetectorPuppet: Boolean) extends MultiNodeConfig { val first = role("first") @@ -65,7 +66,7 @@ abstract class SingletonClusterSpec(multiNodeConfig: SingletonClusterMultiNodeCo markNodeAsUnavailable(secondAddress) - awaitUpConvergence(numberOfMembers = 1, canNotBePartOfMemberRing = Seq(secondAddress), 30.seconds) + awaitUpConvergence(numberOfMembers = 1, canNotBePartOfMemberRing = List(secondAddress), 30.seconds) clusterView.isSingletonCluster must be(true) awaitCond(clusterView.isLeader) } diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/SplitBrainSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/SplitBrainSpec.scala index e1b1a4af96..a7a7c6f4ba 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/SplitBrainSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/SplitBrainSpec.scala @@ -9,9 +9,10 @@ import com.typesafe.config.ConfigFactory import akka.remote.testkit.MultiNodeConfig import akka.remote.testkit.MultiNodeSpec import akka.testkit._ -import scala.concurrent.duration._ import akka.actor.Address import akka.remote.testconductor.Direction +import scala.concurrent.duration._ +import scala.collection.immutable case class SplitBrainMultiNodeConfig(failureDetectorPuppet: Boolean) extends MultiNodeConfig { val first = role("first") @@ -53,8 +54,8 @@ abstract class SplitBrainSpec(multiNodeConfig: SplitBrainMultiNodeConfig) muteMarkingAsUnreachable() - val side1 = IndexedSeq(first, second) - val side2 = IndexedSeq(third, fourth, fifth) + val side1 = Vector(first, second) + val side2 = Vector(third, fourth, fifth) "A cluster of 5 members" must { diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/UnreachableNodeRejoinsClusterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/UnreachableNodeRejoinsClusterSpec.scala index db2f9fc930..395d803865 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/UnreachableNodeRejoinsClusterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/UnreachableNodeRejoinsClusterSpec.scala @@ -6,13 +6,14 @@ package akka.cluster import language.postfixOps import org.scalatest.BeforeAndAfter +import com.typesafe.config.ConfigFactory import akka.remote.testkit.MultiNodeConfig import akka.remote.testkit.MultiNodeSpec import akka.testkit._ -import com.typesafe.config.ConfigFactory import akka.actor.Address import akka.remote.testconductor.{ RoleName, Direction } import scala.concurrent.duration._ +import scala.collection.immutable case class UnreachableNodeRejoinsClusterMultiNodeConfig(failureDetectorPuppet: Boolean) extends MultiNodeConfig { val first = role("first") @@ -45,7 +46,7 @@ abstract class UnreachableNodeRejoinsClusterSpec(multiNodeConfig: UnreachableNod muteMarkingAsUnreachable() - def allBut(role: RoleName, roles: Seq[RoleName] = roles): Seq[RoleName] = { + def allBut(role: RoleName, roles: immutable.Seq[RoleName] = roles): immutable.Seq[RoleName] = { roles.filterNot(_ == role) } @@ -125,7 +126,7 @@ abstract class UnreachableNodeRejoinsClusterSpec(multiNodeConfig: UnreachableNod } runOn(allBut(victim): _*) { - awaitUpConvergence(roles.size - 1, Seq(victim)) + awaitUpConvergence(roles.size - 1, List(victim)) } endBarrier diff --git a/akka-cluster/src/test/scala/akka/cluster/AccrualFailureDetectorSpec.scala b/akka-cluster/src/test/scala/akka/cluster/AccrualFailureDetectorSpec.scala index 45476864db..8a9d6eb6fc 100644 --- a/akka-cluster/src/test/scala/akka/cluster/AccrualFailureDetectorSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/AccrualFailureDetectorSpec.scala @@ -7,7 +7,7 @@ package akka.cluster import akka.actor.Address import akka.testkit._ import akka.testkit.TestEvent._ -import scala.collection.immutable.TreeMap +import scala.collection.immutable import scala.concurrent.duration._ @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) @@ -27,7 +27,7 @@ class AccrualFailureDetectorSpec extends AkkaSpec(""" val conn = Address("akka", "", "localhost", 2552) val conn2 = Address("akka", "", "localhost", 2553) - def fakeTimeGenerator(timeIntervals: Seq[Long]): () ⇒ Long = { + def fakeTimeGenerator(timeIntervals: immutable.Seq[Long]): () ⇒ Long = { var times = timeIntervals.tail.foldLeft(List[Long](timeIntervals.head))((acc, c) ⇒ acc ::: List[Long](acc.last + c)) def timeGenerator(): Long = { val currentTime = times.head @@ -73,7 +73,7 @@ class AccrualFailureDetectorSpec extends AkkaSpec(""" "return realistic phi values" in { val fd = createFailureDetector() - val test = TreeMap(0 -> 0.0, 500 -> 0.1, 1000 -> 0.3, 1200 -> 1.6, 1400 -> 4.7, 1600 -> 10.8, 1700 -> 15.3) + val test = immutable.TreeMap(0 -> 0.0, 500 -> 0.1, 1000 -> 0.3, 1200 -> 1.6, 1400 -> 4.7, 1600 -> 10.8, 1700 -> 15.3) for ((timeDiff, expectedPhi) ← test) { fd.phi(timeDiff = timeDiff, mean = 1000.0, stdDeviation = 100.0) must be(expectedPhi plusOrMinus (0.1)) } diff --git a/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala index 6589ba0efc..609975db6a 100644 --- a/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala @@ -5,14 +5,16 @@ package akka.cluster import scala.language.postfixOps + +import scala.collection.immutable import scala.concurrent.duration._ import scala.concurrent.Await +import scala.util.{ Success, Try, Failure } import akka.actor._ import akka.testkit._ import org.scalatest.WordSpec import org.scalatest.matchers.MustMatchers -import util.{ Success, Try, Failure } object MetricsEnabledSpec { val config = """ @@ -207,11 +209,10 @@ trait MetricSpec extends WordSpec with MustMatchers { if (decay > 0) metrics.collect { case m if m.trendable && (!m.initializable) ⇒ m }.foreach(_.average.isDefined must be(true)) } - def collectNodeMetrics(nodes: Set[NodeMetrics]): Seq[Metric] = { - var r: Seq[Metric] = Seq.empty - nodes.foreach(n ⇒ r ++= n.metrics.filter(_.isDefined)) - r - } + def collectNodeMetrics(nodes: Set[NodeMetrics]): immutable.Seq[Metric] = + nodes.foldLeft(Vector[Metric]()) { + case (r, n) ⇒ r ++ n.metrics.filter(_.isDefined) + } } trait AbstractClusterMetricsSpec extends DefaultTimeout { diff --git a/akka-docs/rst/java/code/docs/actor/FaultHandlingTestBase.java b/akka-docs/rst/java/code/docs/actor/FaultHandlingTestBase.java index c78da61fb1..9ea2a332b1 100644 --- a/akka-docs/rst/java/code/docs/actor/FaultHandlingTestBase.java +++ b/akka-docs/rst/java/code/docs/actor/FaultHandlingTestBase.java @@ -30,7 +30,7 @@ import static java.util.concurrent.TimeUnit.SECONDS; import akka.japi.Function; import scala.Option; import scala.collection.JavaConverters; -import scala.collection.Seq; +import scala.collection.immutable.Seq; import org.junit.Test; import org.junit.BeforeClass; @@ -220,7 +220,7 @@ public class FaultHandlingTestBase { //#testkit public Seq seq(A... args) { return JavaConverters.collectionAsScalaIterableConverter( - java.util.Arrays.asList(args)).asScala().toSeq(); + java.util.Arrays.asList(args)).asScala().toList(); } //#testkit } diff --git a/akka-docs/rst/java/code/docs/jrouting/CustomRouterDocTestBase.java b/akka-docs/rst/java/code/docs/jrouting/CustomRouterDocTestBase.java index c4e7414ce1..73b8c5c639 100644 --- a/akka-docs/rst/java/code/docs/jrouting/CustomRouterDocTestBase.java +++ b/akka-docs/rst/java/code/docs/jrouting/CustomRouterDocTestBase.java @@ -11,6 +11,7 @@ import static docs.jrouting.CustomRouterDocTestBase.Message.RepublicanVote; import static org.junit.Assert.assertEquals; import java.util.Arrays; +import java.util.Collections; import java.util.List; import org.junit.After; @@ -69,7 +70,7 @@ public class CustomRouterDocTestBase { //#supervision final SupervisorStrategy strategy = new OneForOneStrategy(5, Duration.create("1 minute"), - new Class[] { Exception.class }); + Collections.>singletonList(Exception.class)); final ActorRef router = system.actorOf(new Props(MyActor.class) .withRouter(new RoundRobinRouter(5).withSupervisorStrategy(strategy))); //#supervision diff --git a/akka-docs/rst/scala/code/docs/actor/FSMDocSpec.scala b/akka-docs/rst/scala/code/docs/actor/FSMDocSpec.scala index bcc908990f..cc88416b0e 100644 --- a/akka-docs/rst/scala/code/docs/actor/FSMDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/actor/FSMDocSpec.scala @@ -8,6 +8,7 @@ import language.postfixOps import akka.testkit.{ AkkaSpec ⇒ MyFavoriteTestFrameWorkPlusAkkaTestKit } //#test-code import akka.actor.Props +import scala.collection.immutable class FSMDocSpec extends MyFavoriteTestFrameWorkPlusAkkaTestKit { @@ -24,7 +25,7 @@ class FSMDocSpec extends MyFavoriteTestFrameWorkPlusAkkaTestKit { case object Flush // sent events - case class Batch(obj: Seq[Any]) + case class Batch(obj: immutable.Seq[Any]) //#simple-events //#simple-state // states @@ -34,7 +35,7 @@ class FSMDocSpec extends MyFavoriteTestFrameWorkPlusAkkaTestKit { sealed trait Data case object Uninitialized extends Data - case class Todo(target: ActorRef, queue: Seq[Any]) extends Data + case class Todo(target: ActorRef, queue: immutable.Seq[Any]) extends Data //#simple-state //#simple-fsm class Buncher extends Actor with FSM[State, Data] { @@ -193,12 +194,12 @@ class FSMDocSpec extends MyFavoriteTestFrameWorkPlusAkkaTestKit { buncher ! SetTarget(testActor) buncher ! Queue(42) buncher ! Queue(43) - expectMsg(Batch(Seq(42, 43))) + expectMsg(Batch(immutable.Seq(42, 43))) buncher ! Queue(44) buncher ! Flush buncher ! Queue(45) - expectMsg(Batch(Seq(44))) - expectMsg(Batch(Seq(45))) + expectMsg(Batch(immutable.Seq(44))) + expectMsg(Batch(immutable.Seq(45))) } "batch not if uninitialized" in { diff --git a/akka-docs/rst/scala/code/docs/testkit/TestKitUsageSpec.scala b/akka-docs/rst/scala/code/docs/testkit/TestKitUsageSpec.scala index 48e6b6664b..8b153c5944 100644 --- a/akka-docs/rst/scala/code/docs/testkit/TestKitUsageSpec.scala +++ b/akka-docs/rst/scala/code/docs/testkit/TestKitUsageSpec.scala @@ -22,6 +22,7 @@ import akka.testkit.DefaultTimeout import akka.testkit.ImplicitSender import akka.testkit.TestKit import scala.concurrent.duration._ +import scala.collection.immutable /** * a Test to show some TestKit examples @@ -38,8 +39,8 @@ class TestKitUsageSpec val filterRef = system.actorOf(Props(new FilteringActor(testActor))) val randomHead = Random.nextInt(6) val randomTail = Random.nextInt(10) - val headList = Seq().padTo(randomHead, "0") - val tailList = Seq().padTo(randomTail, "1") + val headList = immutable.Seq().padTo(randomHead, "0") + val tailList = immutable.Seq().padTo(randomTail, "1") val seqRef = system.actorOf(Props(new SequencingActor(testActor, headList, tailList))) @@ -145,7 +146,7 @@ object TestKitUsageSpec { * like to test that the interesting value is received and that you cant * be bothered with the rest */ - class SequencingActor(next: ActorRef, head: Seq[String], tail: Seq[String]) + class SequencingActor(next: ActorRef, head: immutable.Seq[String], tail: immutable.Seq[String]) extends Actor { def receive = { case msg ⇒ { diff --git a/akka-docs/rst/scala/code/docs/zeromq/ZeromqDocSpec.scala b/akka-docs/rst/scala/code/docs/zeromq/ZeromqDocSpec.scala index 0e3b4df262..28ff2e3d34 100644 --- a/akka-docs/rst/scala/code/docs/zeromq/ZeromqDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/zeromq/ZeromqDocSpec.scala @@ -5,13 +5,13 @@ package docs.zeromq import language.postfixOps -import akka.actor.{ Actor, Props } import scala.concurrent.duration._ +import scala.collection.immutable +import akka.actor.{ Actor, Props } import akka.testkit._ -import akka.zeromq.{ ZeroMQVersion, ZeroMQExtension } +import akka.zeromq.{ ZeroMQVersion, ZeroMQExtension, SocketType, Bind } import java.text.SimpleDateFormat import java.util.Date -import akka.zeromq.{ SocketType, Bind } object ZeromqDocSpec { @@ -52,12 +52,12 @@ object ZeromqDocSpec { val heapPayload = ser.serialize(Heap(timestamp, currentHeap.getUsed, currentHeap.getMax)).get // the first frame is the topic, second is the message - pubSocket ! ZMQMessage(Seq(Frame("health.heap"), Frame(heapPayload))) + pubSocket ! ZMQMessage(immutable.Seq(Frame("health.heap"), Frame(heapPayload))) // use akka SerializationExtension to convert to bytes val loadPayload = ser.serialize(Load(timestamp, os.getSystemLoadAverage)).get // the first frame is the topic, second is the message - pubSocket ! ZMQMessage(Seq(Frame("health.load"), Frame(loadPayload))) + pubSocket ! ZMQMessage(immutable.Seq(Frame("health.load"), Frame(loadPayload))) } } //#health @@ -146,7 +146,7 @@ class ZeromqDocSpec extends AkkaSpec("akka.loglevel=INFO") { val payload = Array.empty[Byte] //#pub-topic - pubSocket ! ZMQMessage(Seq(Frame("foo.bar"), Frame(payload))) + pubSocket ! ZMQMessage(Frame("foo.bar"), Frame(payload)) //#pub-topic system.stop(subSocket) diff --git a/akka-kernel/src/main/scala/akka/kernel/Main.scala b/akka-kernel/src/main/scala/akka/kernel/Main.scala index 97ff625ab8..3fe3cac403 100644 --- a/akka-kernel/src/main/scala/akka/kernel/Main.scala +++ b/akka-kernel/src/main/scala/akka/kernel/Main.scala @@ -9,6 +9,7 @@ import java.io.File import java.lang.Boolean.getBoolean import java.net.URLClassLoader import java.util.jar.JarFile +import scala.collection.immutable import scala.collection.JavaConverters._ /** @@ -77,8 +78,8 @@ object Main { Thread.currentThread.setContextClassLoader(classLoader) - val bootClasses: Seq[String] = args.toSeq - val bootables: Seq[Bootable] = bootClasses map { c ⇒ classLoader.loadClass(c).newInstance.asInstanceOf[Bootable] } + val bootClasses: immutable.Seq[String] = args.to[immutable.Seq] + val bootables: immutable.Seq[Bootable] = bootClasses map { c ⇒ classLoader.loadClass(c).newInstance.asInstanceOf[Bootable] } for (bootable ← bootables) { log("Starting up " + bootable.getClass.getName) @@ -122,7 +123,7 @@ object Main { new URLClassLoader(urls, Thread.currentThread.getContextClassLoader) } - private def addShutdownHook(bootables: Seq[Bootable]): Unit = { + private def addShutdownHook(bootables: immutable.Seq[Bootable]): Unit = { Runtime.getRuntime.addShutdownHook(new Thread(new Runnable { def run = { log("") diff --git a/akka-osgi-aries/src/test/scala/akka/osgi/aries/blueprint/NamespaceHandlerTest.scala b/akka-osgi-aries/src/test/scala/akka/osgi/aries/blueprint/NamespaceHandlerTest.scala index 2728a80894..79d07c65a3 100644 --- a/akka-osgi-aries/src/test/scala/akka/osgi/aries/blueprint/NamespaceHandlerTest.scala +++ b/akka-osgi-aries/src/test/scala/akka/osgi/aries/blueprint/NamespaceHandlerTest.scala @@ -32,7 +32,7 @@ class SimpleNamespaceHandlerTest extends WordSpec with MustMatchers with PojoSRT import NamespaceHandlerTest._ - val testBundles: Seq[BundleDescriptor] = buildTestBundles(Seq( + val testBundles = buildTestBundles(List( AKKA_OSGI_BLUEPRINT, bundle(TEST_BUNDLE_NAME).withBlueprintFile(getClass.getResource("simple.xml")))) @@ -62,7 +62,7 @@ class ConfigNamespaceHandlerTest extends WordSpec with MustMatchers with PojoSRT import NamespaceHandlerTest._ - val testBundles: Seq[BundleDescriptor] = buildTestBundles(Seq( + val testBundles = buildTestBundles(List( AKKA_OSGI_BLUEPRINT, bundle(TEST_BUNDLE_NAME).withBlueprintFile(getClass.getResource("config.xml")))) @@ -94,7 +94,7 @@ class DependencyInjectionNamespaceHandlerTest extends WordSpec with MustMatchers import NamespaceHandlerTest._ - val testBundles: Seq[BundleDescriptor] = buildTestBundles(Seq( + val testBundles = buildTestBundles(List( AKKA_OSGI_BLUEPRINT, bundle(TEST_BUNDLE_NAME).withBlueprintFile(getClass.getResource("injection.xml")))) diff --git a/akka-osgi/src/test/scala/akka/osgi/ActorSystemActivatorTest.scala b/akka-osgi/src/test/scala/akka/osgi/ActorSystemActivatorTest.scala index d582209d76..27455be75e 100644 --- a/akka-osgi/src/test/scala/akka/osgi/ActorSystemActivatorTest.scala +++ b/akka-osgi/src/test/scala/akka/osgi/ActorSystemActivatorTest.scala @@ -10,6 +10,7 @@ import akka.actor.ActorSystem import akka.pattern.ask import scala.concurrent.Await import scala.concurrent.duration._ +import scala.collection.immutable import akka.util.Timeout import de.kalpatec.pojosr.framework.launch.BundleDescriptor import test.{ RuntimeNameActorSystemActivator, TestActivators, PingPongActorSystemActivator } @@ -32,7 +33,7 @@ class PingPongActorSystemActivatorTest extends WordSpec with MustMatchers with P import ActorSystemActivatorTest._ - val testBundles: Seq[BundleDescriptor] = buildTestBundles(Seq( + val testBundles: immutable.Seq[BundleDescriptor] = buildTestBundles(List( bundle(TEST_BUNDLE_NAME).withActivator(classOf[PingPongActorSystemActivator]))) "PingPongActorSystemActivator" must { @@ -65,7 +66,8 @@ class RuntimeNameActorSystemActivatorTest extends WordSpec with MustMatchers wit import ActorSystemActivatorTest._ - val testBundles: Seq[BundleDescriptor] = buildTestBundles(Seq(bundle(TEST_BUNDLE_NAME).withActivator(classOf[RuntimeNameActorSystemActivator]))) + val testBundles: immutable.Seq[BundleDescriptor] = + buildTestBundles(List(bundle(TEST_BUNDLE_NAME).withActivator(classOf[RuntimeNameActorSystemActivator]))) "RuntimeNameActorSystemActivator" must { diff --git a/akka-osgi/src/test/scala/akka/osgi/PojoSRTestSupport.scala b/akka-osgi/src/test/scala/akka/osgi/PojoSRTestSupport.scala index e993d04f01..b8c7ea24e5 100644 --- a/akka-osgi/src/test/scala/akka/osgi/PojoSRTestSupport.scala +++ b/akka-osgi/src/test/scala/akka/osgi/PojoSRTestSupport.scala @@ -17,7 +17,7 @@ import java.io._ import org.scalatest.{ BeforeAndAfterAll, Suite } import java.util.{ UUID, Date, ServiceLoader, HashMap } import scala.reflect.ClassTag -import scala.Some +import scala.collection.immutable /** * Trait that provides support for building akka-osgi tests using PojoSR @@ -31,7 +31,7 @@ trait PojoSRTestSupport extends Suite with BeforeAndAfterAll { * All bundles being found on the test classpath are automatically installed and started in the PojoSR runtime. * Implement this to define the extra bundles that should be available for testing. */ - def testBundles: Seq[BundleDescriptor] + def testBundles: immutable.Seq[BundleDescriptor] val bufferedLoadingErrors = new ByteArrayOutputStream() @@ -82,15 +82,11 @@ trait PojoSRTestSupport extends Suite with BeforeAndAfterAll { } } - protected def buildTestBundles(builders: Seq[BundleDescriptorBuilder]): Seq[BundleDescriptor] = builders map (_.build) + protected def buildTestBundles(builders: immutable.Seq[BundleDescriptorBuilder]): immutable.Seq[BundleDescriptor] = + builders map (_.build) - def filterErrors()(block: ⇒ Unit): Unit = { - try { - block - } catch { - case e: Throwable ⇒ System.err.write(bufferedLoadingErrors.toByteArray); throw e - } - } + def filterErrors()(block: ⇒ Unit): Unit = + try block catch { case e: Throwable ⇒ System.err.write(bufferedLoadingErrors.toByteArray); throw e } } object PojoSRTestSupport { diff --git a/akka-remote-tests/src/main/scala/akka/remote/testconductor/NetworkFailureInjector.scala b/akka-remote-tests/src/main/scala/akka/remote/testconductor/NetworkFailureInjector.scala index 3f2e739308..26d6f6f243 100644 --- a/akka-remote-tests/src/main/scala/akka/remote/testconductor/NetworkFailureInjector.scala +++ b/akka-remote-tests/src/main/scala/akka/remote/testconductor/NetworkFailureInjector.scala @@ -6,13 +6,13 @@ package akka.remote.testconductor import language.postfixOps import java.net.InetSocketAddress import scala.annotation.tailrec -import scala.collection.immutable.Queue +import scala.collection.immutable +import scala.concurrent.duration._ import org.jboss.netty.buffer.ChannelBuffer import org.jboss.netty.channel.{ SimpleChannelHandler, MessageEvent, Channels, ChannelStateEvent, ChannelHandlerContext, ChannelFutureListener, ChannelFuture } import akka.actor.{ Props, LoggingFSM, Address, ActorSystem, ActorRef, ActorLogging, Actor, FSM } import akka.event.Logging import akka.remote.netty.ChannelAddress -import scala.concurrent.duration._ /** * INTERNAL API. @@ -230,7 +230,7 @@ private[akka] object ThrottleActor { case object Throttle extends State case object Blackhole extends State - case class Data(lastSent: Long, rateMBit: Float, queue: Queue[Send]) + case class Data(lastSent: Long, rateMBit: Float, queue: immutable.Queue[Send]) case class Send(ctx: ChannelHandlerContext, direction: Direction, future: Option[ChannelFuture], msg: AnyRef) case class SetRate(rateMBit: Float) @@ -248,7 +248,7 @@ private[akka] class ThrottleActor(channelContext: ChannelHandlerContext) private val packetSplitThreshold = TestConductor(context.system).Settings.PacketSplitThreshold - startWith(PassThrough, Data(0, -1, Queue())) + startWith(PassThrough, Data(0, -1, immutable.Queue())) when(PassThrough) { case Event(s @ Send(_, _, _, msg), _) ⇒ @@ -258,8 +258,8 @@ private[akka] class ThrottleActor(channelContext: ChannelHandlerContext) } when(Throttle) { - case Event(s: Send, data @ Data(_, _, Queue())) ⇒ - stay using sendThrottled(data.copy(lastSent = System.nanoTime, queue = Queue(s))) + case Event(s: Send, data @ Data(_, _, immutable.Queue())) ⇒ + stay using sendThrottled(data.copy(lastSent = System.nanoTime, queue = immutable.Queue(s))) case Event(s: Send, data) ⇒ stay using sendThrottled(data.copy(queue = data.queue.enqueue(s))) case Event(Tick, data) ⇒ @@ -286,7 +286,7 @@ private[akka] class ThrottleActor(channelContext: ChannelHandlerContext) whenUnhandled { case Event(SetRate(rate), d) ⇒ if (rate > 0) { - goto(Throttle) using d.copy(lastSent = System.nanoTime, rateMBit = rate, queue = Queue()) + goto(Throttle) using d.copy(lastSent = System.nanoTime, rateMBit = rate, queue = immutable.Queue()) } else if (rate == 0) { goto(Blackhole) } else { @@ -328,7 +328,7 @@ private[akka] class ThrottleActor(channelContext: ChannelHandlerContext) */ private def schedule(d: Data): (Data, Seq[Send], Option[FiniteDuration]) = { val now = System.nanoTime - @tailrec def rec(d: Data, toSend: Seq[Send]): (Data, Seq[Send], Option[FiniteDuration]) = { + @tailrec def rec(d: Data, toSend: immutable.Seq[Send]): (Data, immutable.Seq[Send], Option[FiniteDuration]) = { if (d.queue.isEmpty) (d, toSend, None) else { val timeForPacket = d.lastSent + (1000 * size(d.queue.head.msg) / d.rateMBit).toLong @@ -344,7 +344,7 @@ private[akka] class ThrottleActor(channelContext: ChannelHandlerContext) } } } - rec(d, Seq()) + rec(d, Nil) } /** diff --git a/akka-remote-tests/src/main/scala/akka/remote/testconductor/Player.scala b/akka-remote-tests/src/main/scala/akka/remote/testconductor/Player.scala index 2a3957d146..95bfab1ee5 100644 --- a/akka-remote-tests/src/main/scala/akka/remote/testconductor/Player.scala +++ b/akka-remote-tests/src/main/scala/akka/remote/testconductor/Player.scala @@ -4,20 +4,20 @@ package akka.remote.testconductor import language.postfixOps + +import java.util.concurrent.TimeoutException import akka.actor.{ Actor, ActorRef, ActorSystem, LoggingFSM, Props, PoisonPill, Status, Address, Scheduler } -import RemoteConnection.getAddrString +import akka.remote.testconductor.RemoteConnection.getAddrString +import scala.collection.immutable +import scala.concurrent.{ ExecutionContext, Await, Future } import scala.concurrent.duration._ +import scala.util.control.NoStackTrace +import scala.reflect.classTag import akka.util.Timeout import org.jboss.netty.channel.{ Channel, SimpleChannelUpstreamHandler, ChannelHandlerContext, ChannelStateEvent, MessageEvent, WriteCompletionEvent, ExceptionEvent } -import com.typesafe.config.ConfigFactory -import java.util.concurrent.TimeUnit.MILLISECONDS -import java.util.concurrent.TimeoutException import akka.pattern.{ ask, pipe, AskTimeoutException } -import scala.util.control.NoStackTrace import akka.event.{ LoggingAdapter, Logging } import java.net.{ InetSocketAddress, ConnectException } -import scala.reflect.classTag -import concurrent.{ ExecutionContext, Await, Future } /** * The Player is the client component of the @@ -67,15 +67,13 @@ trait Player { this: TestConductorExt ⇒ * Enter the named barriers, one after the other, in the order given. Will * throw an exception in case of timeouts or other errors. */ - def enter(name: String*) { - enter(Settings.BarrierTimeout, name) - } + def enter(name: String*): Unit = enter(Settings.BarrierTimeout, name.to[immutable.Seq]) /** * Enter the named barriers, one after the other, in the order given. Will * throw an exception in case of timeouts or other errors. */ - def enter(timeout: Timeout, name: Seq[String]) { + def enter(timeout: Timeout, name: immutable.Seq[String]) { system.log.debug("entering barriers " + name.mkString("(", ", ", ")")) val stop = Deadline.now + timeout.duration name foreach { b ⇒ diff --git a/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala b/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala index c40a4e5a7b..e79ab4a1ee 100644 --- a/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala +++ b/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala @@ -7,16 +7,17 @@ import language.implicitConversions import language.postfixOps import java.net.InetSocketAddress +import java.util.concurrent.TimeoutException import com.typesafe.config.{ ConfigObject, ConfigFactory, Config } +import scala.concurrent.{ Await, Awaitable } +import scala.util.control.NonFatal +import scala.collection.immutable import akka.actor._ import akka.util.Timeout import akka.remote.testconductor.{ TestConductorExt, TestConductor, RoleName } import akka.remote.RemoteActorRefProvider import akka.testkit._ -import scala.concurrent.{ Await, Awaitable } -import scala.util.control.NonFatal import scala.concurrent.duration._ -import java.util.concurrent.TimeoutException import akka.remote.testconductor.RoleName import akka.remote.testconductor.TestConductorTransport import akka.actor.RootActorPath @@ -30,7 +31,7 @@ abstract class MultiNodeConfig { private var _commonConf: Option[Config] = None private var _nodeConf = Map[RoleName, Config]() private var _roles = Vector[RoleName]() - private var _deployments = Map[RoleName, Seq[String]]() + private var _deployments = Map[RoleName, immutable.Seq[String]]() private var _allDeploy = Vector[String]() private var _testTransport = false @@ -106,9 +107,9 @@ abstract class MultiNodeConfig { configs reduce (_ withFallback _) } - private[testkit] def deployments(node: RoleName): Seq[String] = (_deployments get node getOrElse Nil) ++ _allDeploy + private[testkit] def deployments(node: RoleName): immutable.Seq[String] = (_deployments get node getOrElse Nil) ++ _allDeploy - private[testkit] def roles: Seq[RoleName] = _roles + private[testkit] def roles: immutable.Seq[RoleName] = _roles } @@ -234,7 +235,7 @@ object MultiNodeSpec { * `AskTimeoutException: sending to terminated ref breaks promises`. Using lazy * val is fine. */ -abstract class MultiNodeSpec(val myself: RoleName, _system: ActorSystem, _roles: Seq[RoleName], deployments: RoleName ⇒ Seq[String]) +abstract class MultiNodeSpec(val myself: RoleName, _system: ActorSystem, _roles: immutable.Seq[RoleName], deployments: RoleName ⇒ Seq[String]) extends TestKit(_system) with MultiNodeSpecCallbacks { import MultiNodeSpec._ @@ -294,7 +295,7 @@ abstract class MultiNodeSpec(val myself: RoleName, _system: ActorSystem, _roles: /** * All registered roles */ - def roles: Seq[RoleName] = _roles + def roles: immutable.Seq[RoleName] = _roles /** * TO BE DEFINED BY USER: Defines the number of participants required for starting the test. This @@ -335,9 +336,10 @@ abstract class MultiNodeSpec(val myself: RoleName, _system: ActorSystem, _roles: * Enter the named barriers in the order given. Use the remaining duration from * the innermost enclosing `within` block or the default `BarrierTimeout` */ - def enterBarrier(name: String*) { - testConductor.enter(Timeout.durationToTimeout(remainingOr(testConductor.Settings.BarrierTimeout.duration)), name) - } + def enterBarrier(name: String*): Unit = + testConductor.enter( + Timeout.durationToTimeout(remainingOr(testConductor.Settings.BarrierTimeout.duration)), + name.to[immutable.Seq]) /** * Query the controller for the transport address of the given node (by role name) and diff --git a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala index 4967978582..48fca0af08 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala @@ -70,7 +70,7 @@ class RemoteActorRefProvider( _transport = { val fqn = remoteSettings.RemoteTransport - val args = Seq( + val args = List( classOf[ExtendedActorSystem] -> system, classOf[RemoteActorRefProvider] -> this) diff --git a/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala b/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala index a65bac1a66..2a067237a7 100644 --- a/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala +++ b/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala @@ -8,7 +8,9 @@ import java.net.InetSocketAddress import java.util.concurrent.atomic.{ AtomicReference, AtomicBoolean } import java.util.concurrent.locks.ReentrantReadWriteLock import java.util.concurrent.Executors -import scala.collection.mutable.HashMap +import scala.collection.mutable +import scala.collection.immutable +import scala.util.control.NonFatal import org.jboss.netty.channel.group.{ DefaultChannelGroup, ChannelGroupFuture } import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory import org.jboss.netty.channel.{ ChannelHandlerContext, Channel, DefaultChannelPipeline, ChannelHandler, ChannelPipelineFactory, ChannelLocal } @@ -20,7 +22,6 @@ import org.jboss.netty.util.{ DefaultObjectSizeEstimator, HashedWheelTimer } import akka.event.Logging import akka.remote.RemoteProtocol.AkkaRemoteProtocol import akka.remote.{ RemoteTransportException, RemoteTransport, RemoteActorRefProvider, RemoteActorRef, RemoteServerStarted } -import scala.util.control.NonFatal import akka.actor.{ ExtendedActorSystem, Address, ActorRef } import com.google.protobuf.MessageLite @@ -53,7 +54,7 @@ private[akka] class NettyRemoteTransport(_system: ExtendedActorSystem, _provider * Construct a DefaultChannelPipeline from a sequence of handlers; to be used * in implementations of ChannelPipelineFactory. */ - def apply(handlers: Seq[ChannelHandler]): DefaultChannelPipeline = + def apply(handlers: immutable.Seq[ChannelHandler]): DefaultChannelPipeline = (new DefaultChannelPipeline /: handlers) { (p, h) ⇒ p.addLast(Logging.simpleName(h.getClass), h); p } /** @@ -69,7 +70,7 @@ private[akka] class NettyRemoteTransport(_system: ExtendedActorSystem, _provider * Construct a default protocol stack, excluding the “head” handler (i.e. the one which * actually dispatches the received messages to the local target actors). */ - def defaultStack(withTimeout: Boolean, isClient: Boolean): Seq[ChannelHandler] = + def defaultStack(withTimeout: Boolean, isClient: Boolean): immutable.Seq[ChannelHandler] = (if (settings.EnableSSL) List(NettySSLSupport(settings, NettyRemoteTransport.this.log, isClient)) else Nil) ::: (if (withTimeout) List(timeout) else Nil) ::: msgFormat ::: @@ -138,7 +139,7 @@ private[akka] class NettyRemoteTransport(_system: ExtendedActorSystem, _provider def createPipeline(endpoint: ⇒ ChannelHandler, withTimeout: Boolean, isClient: Boolean): ChannelPipelineFactory = PipelineFactory(Seq(endpoint), withTimeout, isClient) - private val remoteClients = new HashMap[Address, RemoteClient] + private val remoteClients = new mutable.HashMap[Address, RemoteClient] private val clientsLock = new ReentrantReadWriteLock override protected def useUntrustedMode = remoteSettings.UntrustedMode diff --git a/akka-remote/src/main/scala/akka/remote/security/provider/InternetSeedGenerator.scala b/akka-remote/src/main/scala/akka/remote/security/provider/InternetSeedGenerator.scala index f049a4e678..b274c4c0b6 100644 --- a/akka-remote/src/main/scala/akka/remote/security/provider/InternetSeedGenerator.scala +++ b/akka-remote/src/main/scala/akka/remote/security/provider/InternetSeedGenerator.scala @@ -16,6 +16,7 @@ package akka.remote.security.provider import org.uncommons.maths.random.{ SeedGenerator, SeedException, SecureRandomSeedGenerator, RandomDotOrgSeedGenerator, DevRandomSeedGenerator } +import scala.collection.immutable /** * Internal API @@ -33,8 +34,8 @@ object InternetSeedGenerator { /**Singleton instance. */ private final val Instance: InternetSeedGenerator = new InternetSeedGenerator /**Delegate generators. */ - private final val Generators: Seq[SeedGenerator] = - Seq(new RandomDotOrgSeedGenerator, // first try the Internet seed generator + private final val Generators: immutable.Seq[SeedGenerator] = + List(new RandomDotOrgSeedGenerator, // first try the Internet seed generator new SecureRandomSeedGenerator) // this is last because it always works } diff --git a/akka-testkit/src/main/scala/akka/testkit/TestActorRef.scala b/akka-testkit/src/main/scala/akka/testkit/TestActorRef.scala index 520f2557c7..132e3f5e78 100644 --- a/akka-testkit/src/main/scala/akka/testkit/TestActorRef.scala +++ b/akka-testkit/src/main/scala/akka/testkit/TestActorRef.scala @@ -138,7 +138,7 @@ object TestActorRef { def apply[T <: Actor](implicit t: ClassTag[T], system: ActorSystem): TestActorRef[T] = apply[T](randomName) def apply[T <: Actor](name: String)(implicit t: ClassTag[T], system: ActorSystem): TestActorRef[T] = apply[T](Props({ - system.asInstanceOf[ExtendedActorSystem].dynamicAccess.createInstanceFor[T](t.runtimeClass, Seq()).recover({ + system.asInstanceOf[ExtendedActorSystem].dynamicAccess.createInstanceFor[T](t.runtimeClass, Nil).recover({ case exception ⇒ throw ActorInitializationException(null, "Could not instantiate Actor" + "\nMake sure Actor is NOT defined inside a class/trait," + diff --git a/akka-testkit/src/main/scala/akka/testkit/TestEventListener.scala b/akka-testkit/src/main/scala/akka/testkit/TestEventListener.scala index 1fdd339ca5..c46f15a26a 100644 --- a/akka-testkit/src/main/scala/akka/testkit/TestEventListener.scala +++ b/akka-testkit/src/main/scala/akka/testkit/TestEventListener.scala @@ -6,14 +6,15 @@ package akka.testkit import language.existentials import scala.util.matching.Regex +import scala.collection.JavaConverters +import scala.collection.immutable +import scala.concurrent.duration.Duration +import scala.reflect.ClassTag import akka.actor.{ DeadLetter, ActorSystem, Terminated, UnhandledMessage } import akka.dispatch.{ SystemMessage, Terminate } import akka.event.Logging.{ Warning, LogEvent, InitializeLogger, Info, Error, Debug, LoggerInitialized } import akka.event.Logging import java.lang.{ Iterable ⇒ JIterable } -import scala.collection.JavaConverters -import scala.concurrent.duration.Duration -import scala.reflect.ClassTag import akka.actor.NoSerializationVerificationNeeded /** @@ -38,22 +39,22 @@ sealed trait TestEvent */ object TestEvent { object Mute { - def apply(filter: EventFilter, filters: EventFilter*): Mute = new Mute(filter +: filters.toSeq) + def apply(filter: EventFilter, filters: EventFilter*): Mute = new Mute(filter +: filters.to[immutable.Seq]) } - case class Mute(filters: Seq[EventFilter]) extends TestEvent with NoSerializationVerificationNeeded { + case class Mute(filters: immutable.Seq[EventFilter]) extends TestEvent with NoSerializationVerificationNeeded { /** * Java API */ - def this(filters: JIterable[EventFilter]) = this(JavaConverters.iterableAsScalaIterableConverter(filters).asScala.toSeq) + def this(filters: JIterable[EventFilter]) = this(JavaConverters.iterableAsScalaIterableConverter(filters).asScala.to[immutable.Seq]) } object UnMute { - def apply(filter: EventFilter, filters: EventFilter*): UnMute = new UnMute(filter +: filters.toSeq) + def apply(filter: EventFilter, filters: EventFilter*): UnMute = new UnMute(filter +: filters.to[immutable.Seq]) } - case class UnMute(filters: Seq[EventFilter]) extends TestEvent with NoSerializationVerificationNeeded { + case class UnMute(filters: immutable.Seq[EventFilter]) extends TestEvent with NoSerializationVerificationNeeded { /** * Java API */ - def this(filters: JIterable[EventFilter]) = this(JavaConverters.iterableAsScalaIterableConverter(filters).asScala.toSeq) + def this(filters: JIterable[EventFilter]) = this(JavaConverters.iterableAsScalaIterableConverter(filters).asScala.to[immutable.Seq]) } } diff --git a/akka-testkit/src/main/scala/akka/testkit/TestKit.scala b/akka-testkit/src/main/scala/akka/testkit/TestKit.scala index 4f6744b74b..e81acb23a3 100644 --- a/akka-testkit/src/main/scala/akka/testkit/TestKit.scala +++ b/akka-testkit/src/main/scala/akka/testkit/TestKit.scala @@ -5,15 +5,15 @@ package akka.testkit import language.postfixOps +import scala.annotation.{ varargs, tailrec } +import scala.collection.immutable +import scala.concurrent.duration._ +import scala.reflect.ClassTag +import java.util.concurrent.{ BlockingDeque, LinkedBlockingDeque, TimeUnit, atomic } +import java.util.concurrent.atomic.AtomicInteger import akka.actor._ import akka.actor.Actor._ -import scala.concurrent.duration._ -import java.util.concurrent.{ BlockingDeque, LinkedBlockingDeque, TimeUnit, atomic } -import atomic.AtomicInteger -import scala.annotation.tailrec import akka.util.{ Timeout, BoxedType } -import scala.annotation.varargs -import scala.reflect.ClassTag object TestActor { type Ignore = Option[PartialFunction[Any, Boolean]] @@ -415,7 +415,7 @@ trait TestKitBase { /** * Same as `expectMsgAllOf(remaining, obj...)`, but correctly treating the timeFactor. */ - def expectMsgAllOf[T](obj: T*): Seq[T] = expectMsgAllOf_internal(remaining, obj: _*) + def expectMsgAllOf[T](obj: T*): immutable.Seq[T] = expectMsgAllOf_internal(remaining, obj: _*) /** * Receive a number of messages from the test actor matching the given @@ -430,19 +430,19 @@ trait TestKitBase { * expectMsgAllOf(1 second, Result1(), Result2()) * */ - def expectMsgAllOf[T](max: FiniteDuration, obj: T*): Seq[T] = expectMsgAllOf_internal(max.dilated, obj: _*) + def expectMsgAllOf[T](max: FiniteDuration, obj: T*): immutable.Seq[T] = expectMsgAllOf_internal(max.dilated, obj: _*) - private def expectMsgAllOf_internal[T](max: FiniteDuration, obj: T*): Seq[T] = { + private def expectMsgAllOf_internal[T](max: FiniteDuration, obj: T*): immutable.Seq[T] = { val recv = receiveN_internal(obj.size, max) obj foreach (x ⇒ assert(recv exists (x == _), "not found " + x)) recv foreach (x ⇒ assert(obj exists (x == _), "found unexpected " + x)) - recv.asInstanceOf[Seq[T]] + recv.asInstanceOf[immutable.Seq[T]] } /** * Same as `expectMsgAllClassOf(remaining, obj...)`, but correctly treating the timeFactor. */ - def expectMsgAllClassOf[T](obj: Class[_ <: T]*): Seq[T] = internalExpectMsgAllClassOf(remaining, obj: _*) + def expectMsgAllClassOf[T](obj: Class[_ <: T]*): immutable.Seq[T] = internalExpectMsgAllClassOf(remaining, obj: _*) /** * Receive a number of messages from the test actor matching the given @@ -452,19 +452,19 @@ trait TestKitBase { * Wait time is bounded by the given duration, with an AssertionFailure * being thrown in case of timeout. */ - def expectMsgAllClassOf[T](max: FiniteDuration, obj: Class[_ <: T]*): Seq[T] = internalExpectMsgAllClassOf(max.dilated, obj: _*) + def expectMsgAllClassOf[T](max: FiniteDuration, obj: Class[_ <: T]*): immutable.Seq[T] = internalExpectMsgAllClassOf(max.dilated, obj: _*) - private def internalExpectMsgAllClassOf[T](max: FiniteDuration, obj: Class[_ <: T]*): Seq[T] = { + private def internalExpectMsgAllClassOf[T](max: FiniteDuration, obj: Class[_ <: T]*): immutable.Seq[T] = { val recv = receiveN_internal(obj.size, max) obj foreach (x ⇒ assert(recv exists (_.getClass eq BoxedType(x)), "not found " + x)) recv foreach (x ⇒ assert(obj exists (c ⇒ BoxedType(c) eq x.getClass), "found non-matching object " + x)) - recv.asInstanceOf[Seq[T]] + recv.asInstanceOf[immutable.Seq[T]] } /** * Same as `expectMsgAllConformingOf(remaining, obj...)`, but correctly treating the timeFactor. */ - def expectMsgAllConformingOf[T](obj: Class[_ <: T]*): Seq[T] = internalExpectMsgAllConformingOf(remaining, obj: _*) + def expectMsgAllConformingOf[T](obj: Class[_ <: T]*): immutable.Seq[T] = internalExpectMsgAllConformingOf(remaining, obj: _*) /** * Receive a number of messages from the test actor matching the given @@ -477,13 +477,13 @@ trait TestKitBase { * Beware that one object may satisfy all given class constraints, which * may be counter-intuitive. */ - def expectMsgAllConformingOf[T](max: FiniteDuration, obj: Class[_ <: T]*): Seq[T] = internalExpectMsgAllConformingOf(max.dilated, obj: _*) + def expectMsgAllConformingOf[T](max: FiniteDuration, obj: Class[_ <: T]*): immutable.Seq[T] = internalExpectMsgAllConformingOf(max.dilated, obj: _*) - private def internalExpectMsgAllConformingOf[T](max: FiniteDuration, obj: Class[_ <: T]*): Seq[T] = { + private def internalExpectMsgAllConformingOf[T](max: FiniteDuration, obj: Class[_ <: T]*): immutable.Seq[T] = { val recv = receiveN_internal(obj.size, max) obj foreach (x ⇒ assert(recv exists (BoxedType(x) isInstance _), "not found " + x)) recv foreach (x ⇒ assert(obj exists (c ⇒ BoxedType(c) isInstance x), "found non-matching object " + x)) - recv.asInstanceOf[Seq[T]] + recv.asInstanceOf[immutable.Seq[T]] } /** @@ -520,7 +520,7 @@ trait TestKitBase { * assert(series == (1 to 7).toList) * */ - def receiveWhile[T](max: Duration = Duration.Undefined, idle: Duration = Duration.Inf, messages: Int = Int.MaxValue)(f: PartialFunction[AnyRef, T]): Seq[T] = { + def receiveWhile[T](max: Duration = Duration.Undefined, idle: Duration = Duration.Inf, messages: Int = Int.MaxValue)(f: PartialFunction[AnyRef, T]): immutable.Seq[T] = { val stop = now + remainingOrDilated(max) var msg: Message = NullMessage @@ -553,14 +553,14 @@ trait TestKitBase { * Same as `receiveN(n, remaining)` but correctly taking into account * Duration.timeFactor. */ - def receiveN(n: Int): Seq[AnyRef] = receiveN_internal(n, remaining) + def receiveN(n: Int): immutable.Seq[AnyRef] = receiveN_internal(n, remaining) /** * Receive N messages in a row before the given deadline. */ - def receiveN(n: Int, max: FiniteDuration): Seq[AnyRef] = receiveN_internal(n, max.dilated) + def receiveN(n: Int, max: FiniteDuration): immutable.Seq[AnyRef] = receiveN_internal(n, max.dilated) - private def receiveN_internal(n: Int, max: Duration): Seq[AnyRef] = { + private def receiveN_internal(n: Int, max: Duration): immutable.Seq[AnyRef] = { val stop = max + now for { x ← 1 to n } yield { val timeout = stop - now diff --git a/akka-testkit/src/main/scala/akka/testkit/package.scala b/akka-testkit/src/main/scala/akka/testkit/package.scala index 38d6d853af..ff8926154e 100644 --- a/akka-testkit/src/main/scala/akka/testkit/package.scala +++ b/akka-testkit/src/main/scala/akka/testkit/package.scala @@ -4,14 +4,16 @@ import language.implicitConversions import akka.actor.ActorSystem import scala.concurrent.duration.{ Duration, FiniteDuration } -import java.util.concurrent.TimeUnit.MILLISECONDS import scala.reflect.ClassTag +import scala.collection.immutable +import java.util.concurrent.TimeUnit.MILLISECONDS package object testkit { def filterEvents[T](eventFilters: Iterable[EventFilter])(block: ⇒ T)(implicit system: ActorSystem): T = { def now = System.currentTimeMillis - system.eventStream.publish(TestEvent.Mute(eventFilters.toSeq)) + system.eventStream.publish(TestEvent.Mute(eventFilters.to[immutable.Seq])) + try { val result = block @@ -23,7 +25,7 @@ package object testkit { result } finally { - system.eventStream.publish(TestEvent.UnMute(eventFilters.toSeq)) + system.eventStream.publish(TestEvent.UnMute(eventFilters.to[immutable.Seq])) } } diff --git a/akka-transactor/src/test/java/akka/transactor/UntypedCoordinatedIncrementTest.java b/akka-transactor/src/test/java/akka/transactor/UntypedCoordinatedIncrementTest.java index 5aecd341e0..27323787aa 100644 --- a/akka-transactor/src/test/java/akka/transactor/UntypedCoordinatedIncrementTest.java +++ b/akka-transactor/src/test/java/akka/transactor/UntypedCoordinatedIncrementTest.java @@ -32,7 +32,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import scala.collection.JavaConverters; -import scala.collection.Seq; +import scala.collection.immutable.Seq; public class UntypedCoordinatedIncrementTest { private static ActorSystem system; @@ -110,6 +110,6 @@ public class UntypedCoordinatedIncrementTest { } public Seq seq(A... args) { - return JavaConverters.collectionAsScalaIterableConverter(Arrays.asList(args)).asScala().toSeq(); + return JavaConverters.collectionAsScalaIterableConverter(Arrays.asList(args)).asScala().toList(); } } diff --git a/akka-transactor/src/test/java/akka/transactor/UntypedTransactorTest.java b/akka-transactor/src/test/java/akka/transactor/UntypedTransactorTest.java index 5aae61d9c1..3b841e300b 100644 --- a/akka-transactor/src/test/java/akka/transactor/UntypedTransactorTest.java +++ b/akka-transactor/src/test/java/akka/transactor/UntypedTransactorTest.java @@ -32,7 +32,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import scala.collection.JavaConverters; -import scala.collection.Seq; +import scala.collection.immutable.Seq; public class UntypedTransactorTest { @@ -120,6 +120,6 @@ public class UntypedTransactorTest { public Seq seq(A... args) { return JavaConverters .collectionAsScalaIterableConverter(Arrays.asList(args)).asScala() - .toSeq(); + .toList(); } } diff --git a/akka-transactor/src/test/scala/akka/transactor/CoordinatedIncrementSpec.scala b/akka-transactor/src/test/scala/akka/transactor/CoordinatedIncrementSpec.scala index 1aa9fb555c..6dad1079a3 100644 --- a/akka-transactor/src/test/scala/akka/transactor/CoordinatedIncrementSpec.scala +++ b/akka-transactor/src/test/scala/akka/transactor/CoordinatedIncrementSpec.scala @@ -6,12 +6,13 @@ package akka.transactor import org.scalatest.BeforeAndAfterAll -import akka.actor._ import scala.concurrent.Await import scala.concurrent.duration._ +import scala.concurrent.stm._ +import scala.collection.immutable +import akka.actor._ import akka.util.Timeout import akka.testkit._ -import scala.concurrent.stm._ import akka.pattern.{ AskTimeoutException, ask } object CoordinatedIncrement { @@ -30,7 +31,7 @@ object CoordinatedIncrement { } """ - case class Increment(friends: Seq[ActorRef]) + case class Increment(friends: immutable.Seq[ActorRef]) case object GetCount class Counter(name: String) extends Actor { diff --git a/akka-transactor/src/test/scala/akka/transactor/FickleFriendsSpec.scala b/akka-transactor/src/test/scala/akka/transactor/FickleFriendsSpec.scala index a087ab5b6d..eb75247164 100644 --- a/akka-transactor/src/test/scala/akka/transactor/FickleFriendsSpec.scala +++ b/akka-transactor/src/test/scala/akka/transactor/FickleFriendsSpec.scala @@ -8,21 +8,22 @@ import language.postfixOps import org.scalatest.BeforeAndAfterAll -import akka.actor._ import scala.concurrent.Await import scala.concurrent.duration._ +import scala.concurrent.stm._ +import scala.collection.immutable +import scala.util.Random.{ nextInt ⇒ random } +import scala.util.control.NonFatal +import akka.actor._ import akka.testkit._ import akka.testkit.TestEvent.Mute -import scala.concurrent.stm._ -import scala.util.Random.{ nextInt ⇒ random } import java.util.concurrent.CountDownLatch import akka.pattern.{ AskTimeoutException, ask } import akka.util.Timeout -import scala.util.control.NonFatal object FickleFriends { - case class FriendlyIncrement(friends: Seq[ActorRef], timeout: Timeout, latch: CountDownLatch) - case class Increment(friends: Seq[ActorRef]) + case class FriendlyIncrement(friends: immutable.Seq[ActorRef], timeout: Timeout, latch: CountDownLatch) + case class Increment(friends: immutable.Seq[ActorRef]) case object GetCount /** @@ -120,7 +121,7 @@ class FickleFriendsSpec extends AkkaSpec with BeforeAndAfterAll { "Coordinated fickle friends" should { "eventually succeed to increment all counters by one" in { - val ignoreExceptions = Seq( + val ignoreExceptions = immutable.Seq( EventFilter[ExpectedFailureException](), EventFilter[CoordinatedTransactionException](), EventFilter[AskTimeoutException]()) diff --git a/akka-transactor/src/test/scala/akka/transactor/TransactorSpec.scala b/akka-transactor/src/test/scala/akka/transactor/TransactorSpec.scala index 4fd05a0e1e..0de8a13d97 100644 --- a/akka-transactor/src/test/scala/akka/transactor/TransactorSpec.scala +++ b/akka-transactor/src/test/scala/akka/transactor/TransactorSpec.scala @@ -7,15 +7,16 @@ package akka.transactor import language.postfixOps import akka.actor._ +import scala.collection.immutable import scala.concurrent.Await import scala.concurrent.duration._ +import scala.concurrent.stm._ import akka.util.Timeout import akka.testkit._ -import scala.concurrent.stm._ import akka.pattern.{ AskTimeoutException, ask } object TransactorIncrement { - case class Increment(friends: Seq[ActorRef], latch: TestLatch) + case class Increment(friends: immutable.Seq[ActorRef], latch: TestLatch) case object GetCount class Counter(name: String) extends Transactor { diff --git a/akka-zeromq/src/main/scala/akka/zeromq/ConcurrentSocketActor.scala b/akka-zeromq/src/main/scala/akka/zeromq/ConcurrentSocketActor.scala index 20c8b2d723..a9efa56c1e 100644 --- a/akka-zeromq/src/main/scala/akka/zeromq/ConcurrentSocketActor.scala +++ b/akka-zeromq/src/main/scala/akka/zeromq/ConcurrentSocketActor.scala @@ -6,13 +6,14 @@ package akka.zeromq import org.zeromq.ZMQ.{ Socket, Poller } import org.zeromq.{ ZMQ ⇒ JZMQ } import akka.actor._ +import scala.collection.immutable +import scala.annotation.tailrec import scala.concurrent.{ Promise, Future } import scala.concurrent.duration.Duration -import scala.annotation.tailrec import scala.collection.mutable.ListBuffer +import scala.util.control.NonFatal import akka.event.Logging import java.util.concurrent.TimeUnit -import scala.util.control.NonFatal private[zeromq] object ConcurrentSocketActor { private sealed trait PollMsg @@ -25,7 +26,7 @@ private[zeromq] object ConcurrentSocketActor { private val DefaultContext = Context() } -private[zeromq] class ConcurrentSocketActor(params: Seq[SocketOption]) extends Actor { +private[zeromq] class ConcurrentSocketActor(params: immutable.Seq[SocketOption]) extends Actor { import ConcurrentSocketActor._ private val noBytes = Array[Byte]() @@ -40,7 +41,7 @@ private[zeromq] class ConcurrentSocketActor(params: Seq[SocketOption]) extends A private val socket: Socket = zmqContext.socket(socketType) private val poller: Poller = zmqContext.poller - private val pendingSends = new ListBuffer[Seq[Frame]] + private val pendingSends = new ListBuffer[immutable.Seq[Frame]] def receive = { case m: PollMsg ⇒ doPoll(m) @@ -151,7 +152,7 @@ private[zeromq] class ConcurrentSocketActor(params: Seq[SocketOption]) extends A } } finally notifyListener(Closed) - @tailrec private def flushMessage(i: Seq[Frame]): Boolean = + @tailrec private def flushMessage(i: immutable.Seq[Frame]): Boolean = if (i.isEmpty) true else { @@ -198,7 +199,7 @@ private[zeromq] class ConcurrentSocketActor(params: Seq[SocketOption]) extends A case frames ⇒ notifyListener(deserializer(frames)); doPoll(mode, togo - 1) } - @tailrec private def receiveMessage(mode: PollMsg, currentFrames: Vector[Frame] = Vector.empty): Seq[Frame] = + @tailrec private def receiveMessage(mode: PollMsg, currentFrames: Vector[Frame] = Vector.empty): immutable.Seq[Frame] = if (mode == PollCareful && (poller.poll(0) <= 0)) { if (currentFrames.isEmpty) currentFrames else throw new IllegalStateException("Received partial transmission!") } else { diff --git a/akka-zeromq/src/main/scala/akka/zeromq/SocketOption.scala b/akka-zeromq/src/main/scala/akka/zeromq/SocketOption.scala index f935a9c31d..b70c245327 100644 --- a/akka-zeromq/src/main/scala/akka/zeromq/SocketOption.scala +++ b/akka-zeromq/src/main/scala/akka/zeromq/SocketOption.scala @@ -4,9 +4,10 @@ package akka.zeromq import com.google.protobuf.Message -import org.zeromq.{ ZMQ ⇒ JZMQ } import akka.actor.ActorRef import scala.concurrent.duration._ +import scala.collection.immutable +import org.zeromq.{ ZMQ ⇒ JZMQ } import org.zeromq.ZMQ.{ Poller, Socket } /** @@ -36,7 +37,7 @@ sealed trait SocketConnectOption extends SocketOption { * A base trait for pubsub options for the ZeroMQ socket */ sealed trait PubSubOption extends SocketOption { - def payload: Seq[Byte] + def payload: immutable.Seq[Byte] } /** @@ -79,7 +80,7 @@ class Context(numIoThreads: Int) extends SocketMeta { * A base trait for message deserializers */ trait Deserializer extends SocketOption { - def apply(frames: Seq[Frame]): Any + def apply(frames: immutable.Seq[Frame]): Any } /** @@ -172,12 +173,12 @@ case class Bind(endpoint: String) extends SocketConnectOption * * @param payload the topic to subscribe to */ -case class Subscribe(payload: Seq[Byte]) extends PubSubOption { - def this(topic: String) = this(topic.getBytes("UTF-8")) +case class Subscribe(payload: immutable.Seq[Byte]) extends PubSubOption { + def this(topic: String) = this(topic.getBytes("UTF-8").to[immutable.Seq]) } object Subscribe { def apply(topic: String): Subscribe = new Subscribe(topic) - val all = Subscribe(Seq.empty) + val all = Subscribe("") } /** @@ -189,8 +190,8 @@ object Subscribe { * * @param payload */ -case class Unsubscribe(payload: Seq[Byte]) extends PubSubOption { - def this(topic: String) = this(topic.getBytes("UTF-8")) +case class Unsubscribe(payload: immutable.Seq[Byte]) extends PubSubOption { + def this(topic: String) = this(topic.getBytes("UTF-8").to[immutable.Seq]) } object Unsubscribe { def apply(topic: String): Unsubscribe = new Unsubscribe(topic) @@ -200,17 +201,17 @@ object Unsubscribe { * Send a message over the zeromq socket * @param frames */ -case class Send(frames: Seq[Frame]) extends Request +case class Send(frames: immutable.Seq[Frame]) extends Request /** * A message received over the zeromq socket * @param frames */ -case class ZMQMessage(frames: Seq[Frame]) { +case class ZMQMessage(frames: immutable.Seq[Frame]) { - def this(frame: Frame) = this(Seq(frame)) - def this(frame1: Frame, frame2: Frame) = this(Seq(frame1, frame2)) - def this(frameArray: Array[Frame]) = this(frameArray.toSeq) + def this(frame: Frame) = this(List(frame)) + def this(frame1: Frame, frame2: Frame) = this(List(frame1, frame2)) + def this(frameArray: Array[Frame]) = this(frameArray.to[immutable.Seq]) /** * Convert the bytes in the first frame to a String, using specified charset. @@ -224,8 +225,9 @@ case class ZMQMessage(frames: Seq[Frame]) { def payload(frameIndex: Int): Array[Byte] = frames(frameIndex).payload.toArray } object ZMQMessage { - def apply(bytes: Array[Byte]): ZMQMessage = ZMQMessage(Seq(Frame(bytes))) - def apply(message: Message): ZMQMessage = ZMQMessage(message.toByteArray) + def apply(bytes: Array[Byte]): ZMQMessage = new ZMQMessage(List(Frame(bytes))) + def apply(frames: Frame*): ZMQMessage = new ZMQMessage(frames.to[immutable.Seq]) + def apply(message: Message): ZMQMessage = apply(message.toByteArray) } /** diff --git a/akka-zeromq/src/main/scala/akka/zeromq/ZMQMessageDeserializer.scala b/akka-zeromq/src/main/scala/akka/zeromq/ZMQMessageDeserializer.scala index 2d41424e88..d0141bf515 100644 --- a/akka-zeromq/src/main/scala/akka/zeromq/ZMQMessageDeserializer.scala +++ b/akka-zeromq/src/main/scala/akka/zeromq/ZMQMessageDeserializer.scala @@ -3,7 +3,10 @@ */ package akka.zeromq +import scala.collection.immutable + object Frame { + def apply(bytes: Array[Byte]): Frame = new Frame(bytes) def apply(text: String): Frame = new Frame(text) } @@ -11,8 +14,8 @@ object Frame { * A single message frame of a zeromq message * @param payload */ -case class Frame(payload: Seq[Byte]) { - def this(bytes: Array[Byte]) = this(bytes.toSeq) +case class Frame(payload: immutable.Seq[Byte]) { + def this(bytes: Array[Byte]) = this(bytes.to[immutable.Seq]) def this(text: String) = this(text.getBytes("UTF-8")) } @@ -20,5 +23,5 @@ case class Frame(payload: Seq[Byte]) { * Deserializes ZeroMQ messages into an immutable sequence of frames */ class ZMQMessageDeserializer extends Deserializer { - def apply(frames: Seq[Frame]): ZMQMessage = ZMQMessage(frames) + def apply(frames: immutable.Seq[Frame]): ZMQMessage = ZMQMessage(frames) } diff --git a/akka-zeromq/src/main/scala/akka/zeromq/ZeroMQExtension.scala b/akka-zeromq/src/main/scala/akka/zeromq/ZeroMQExtension.scala index 85e05e54f3..bc40ea580b 100644 --- a/akka-zeromq/src/main/scala/akka/zeromq/ZeroMQExtension.scala +++ b/akka-zeromq/src/main/scala/akka/zeromq/ZeroMQExtension.scala @@ -7,6 +7,7 @@ import org.zeromq.{ ZMQ ⇒ JZMQ } import org.zeromq.ZMQ.Poller import akka.actor._ import akka.pattern.ask +import scala.collection.immutable import scala.concurrent.Await import scala.concurrent.duration.Duration import java.util.concurrent.TimeUnit @@ -66,7 +67,8 @@ class ZeroMQExtension(system: ActorSystem) extends Extension { case s: SocketType.ZMQSocketType ⇒ true case _ ⇒ false }, "A socket type is required") - Props(new ConcurrentSocketActor(socketParameters)).withDispatcher("akka.zeromq.socket-dispatcher") + val params = socketParameters.to[immutable.Seq] + Props(new ConcurrentSocketActor(params)).withDispatcher("akka.zeromq.socket-dispatcher") } /** diff --git a/akka-zeromq/src/test/scala/akka/zeromq/ConcurrentSocketActorSpec.scala b/akka-zeromq/src/test/scala/akka/zeromq/ConcurrentSocketActorSpec.scala index 68123761c5..6feaffd6d6 100644 --- a/akka-zeromq/src/test/scala/akka/zeromq/ConcurrentSocketActorSpec.scala +++ b/akka-zeromq/src/test/scala/akka/zeromq/ConcurrentSocketActorSpec.scala @@ -51,7 +51,7 @@ class ConcurrentSocketActorSpec extends AkkaSpec { val msgGenerator = system.scheduler.schedule(100 millis, 10 millis, new Runnable { var number = 0 def run() { - publisher ! ZMQMessage(Seq(Frame(number.toString.getBytes), Frame(Seq()))) + publisher ! ZMQMessage(Frame(number.toString), Frame(Nil)) number += 1 } }) @@ -88,8 +88,8 @@ class ConcurrentSocketActorSpec extends AkkaSpec { try { replierProbe.expectMsg(Connecting) - val request = ZMQMessage(Seq(Frame("Request"))) - val reply = ZMQMessage(Seq(Frame("Reply"))) + val request = ZMQMessage(Frame("Request")) + val reply = ZMQMessage(Frame("Reply")) requester ! request replierProbe.expectMsg(request) @@ -112,7 +112,7 @@ class ConcurrentSocketActorSpec extends AkkaSpec { try { pullerProbe.expectMsg(Connecting) - val message = ZMQMessage(Seq(Frame("Pushed message"))) + val message = ZMQMessage(Frame("Pushed message")) pusher ! message pullerProbe.expectMsg(message) From f5185860ef7dde09041f4e35b6a1efbbcfc7a0ef Mon Sep 17 00:00:00 2001 From: Roland Date: Wed, 14 Nov 2012 14:21:56 +0100 Subject: [PATCH 120/210] amend one place in docs referring to blocking system.actorOf --- akka-docs/rst/general/actor-systems.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/akka-docs/rst/general/actor-systems.rst b/akka-docs/rst/general/actor-systems.rst index 99df8bd334..22768a7342 100644 --- a/akka-docs/rst/general/actor-systems.rst +++ b/akka-docs/rst/general/actor-systems.rst @@ -108,8 +108,8 @@ Actor Best Practices #. Top-level actors are the innermost part of your Error Kernel, so create them sparingly and prefer truly hierarchical systems. This has benefits wrt. fault-handling (both considering the granularity of configuration and the - performance) and it also reduces the number of blocking calls made, since - the creation of top-level actors involves synchronous messaging. + performance) and it also reduces the strain on the guardian actor, which is + a single point of contention if over-used. Blocking Needs Careful Management --------------------------------- From dcde7d35944dc527847314ebe6fc0ecd295390d7 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Thu, 8 Nov 2012 18:49:54 +0100 Subject: [PATCH 121/210] AdaptiveLoadBalancingRouter and more refactoring of metrics, see #2547 * Refactoring of standard metrics extractors and data structures * Removed optional value in Metric, simplified a lot * Configuration of EWMA by using half-life duration * Renamed DataStream to EWMA * Incorporate review feedback * Use binarySearch for selecting weighted routees * More metrics selectors for the router * Removed network metrics, since not supported on linux * Configuration of router * Rename to AdaptiveLoadBalancingRouter * Remove total cores metrics, since it's the same as jmx getAvailableProcessors, tested on intel 24 core server and amd 48 core server, and MBP * API cleanup * Java API additions * Documentation of metrics and AdaptiveLoadBalancingRouter * New cluster sample to illustrate metrics in the documentation, and play around with (factorial) --- .../src/main/scala/akka/actor/Deployer.scala | 21 +- .../src/main/resources/reference.conf | 30 +- .../cluster/ClusterActorRefProvider.scala | 41 +- .../scala/akka/cluster/ClusterEvent.scala | 15 +- .../cluster/ClusterMetricsCollector.scala | 514 +++++++++--------- .../scala/akka/cluster/ClusterSettings.scala | 6 +- .../routing/AdaptiveLoadBalancingRouter.scala | 414 ++++++++++++++ .../routing/ClusterLoadBalancingRouter.scala | 271 --------- .../akka/cluster/ClusterMetricsSpec.scala | 2 +- ... => AdaptiveLoadBalancingRouterSpec.scala} | 85 ++- .../akka/cluster/ClusterConfigSpec.scala | 4 +- .../scala/akka/cluster/DataStreamSpec.scala | 81 --- .../test/scala/akka/cluster/EWMASpec.scala | 101 ++++ .../cluster/MetricNumericConverterSpec.scala | 28 +- .../scala/akka/cluster/MetricValuesSpec.scala | 90 ++- .../akka/cluster/MetricsCollectorSpec.scala | 97 +--- .../akka/cluster/MetricsGossipSpec.scala | 87 ++- .../scala/akka/cluster/NodeMetricsSpec.scala | 7 +- .../routing/HeapMetricsSelectorSpec.scala | 114 ---- .../cluster/routing/MetricsSelectorSpec.scala | 119 ++++ .../cluster/routing/WeightedRouteesSpec.scala | 84 +++ akka-docs/rst/cluster/cluster-usage-java.rst | 102 +++- akka-docs/rst/cluster/cluster-usage-scala.rst | 95 +++- .../akka/remote/RemoteActorRefProvider.scala | 3 +- .../sigar/libsigar-amd64-freebsd-6.so | Bin 0 -> 210641 bytes .../sigar/libsigar-amd64-linux.so | Bin 0 -> 246605 bytes .../sigar/libsigar-amd64-solaris.so | Bin 0 -> 251360 bytes .../sigar/libsigar-ia64-hpux-11.sl | Bin 0 -> 577452 bytes .../sigar/libsigar-ia64-linux.so | Bin 0 -> 494929 bytes .../sigar/libsigar-pa-hpux-11.sl | Bin 0 -> 516096 bytes .../sigar/libsigar-ppc-aix-5.so | Bin 0 -> 400925 bytes .../sigar/libsigar-ppc-linux.so | Bin 0 -> 258547 bytes .../sigar/libsigar-ppc64-aix-5.so | Bin 0 -> 425077 bytes .../sigar/libsigar-ppc64-linux.so | Bin 0 -> 330767 bytes .../sigar/libsigar-s390x-linux.so | Bin 0 -> 269932 bytes .../sigar/libsigar-sparc-solaris.so | Bin 0 -> 285004 bytes .../sigar/libsigar-sparc64-solaris.so | Bin 0 -> 261896 bytes .../sigar/libsigar-universal-macosx.dylib | Bin 0 -> 377668 bytes .../sigar/libsigar-universal64-macosx.dylib | Bin 0 -> 397440 bytes .../sigar/libsigar-x86-freebsd-5.so | Bin 0 -> 179751 bytes .../sigar/libsigar-x86-freebsd-6.so | Bin 0 -> 179379 bytes .../sigar/libsigar-x86-linux.so | Bin 0 -> 233385 bytes .../sigar/libsigar-x86-solaris.so | Bin 0 -> 242880 bytes .../sigar/sigar-amd64-winnt.dll | Bin 0 -> 402432 bytes .../sigar/sigar-x86-winnt.dll | Bin 0 -> 266240 bytes .../sigar/sigar-x86-winnt.lib | Bin 0 -> 99584 bytes .../factorial/japi/FactorialBackend.java | 49 ++ .../factorial/japi/FactorialBackendMain.java | 22 + .../factorial/japi/FactorialFrontend.java | 72 +++ .../factorial/japi/FactorialFrontendMain.java | 38 ++ .../factorial/japi/FactorialResult.java | 14 + .../factorial/japi/MetricsListener.java | 60 ++ .../src/main/resources/application.conf | 22 +- .../cluster/factorial/FactorialSample.scala | 151 +++++ .../stats/StatsSampleSingleMasterSpec.scala | 2 + .../cluster/stats/StatsSampleSpec.scala | 2 + .../stats/japi/StatsSampleJapiSpec.scala | 2 + .../StatsSampleSingleMasterJapiSpec.scala | 2 + .../TransformationSampleSpec.scala | 2 + .../japi/TransformationSampleJapiSpec.scala | 2 + project/AkkaBuild.scala | 9 +- 61 files changed, 1885 insertions(+), 975 deletions(-) create mode 100644 akka-cluster/src/main/scala/akka/cluster/routing/AdaptiveLoadBalancingRouter.scala delete mode 100644 akka-cluster/src/main/scala/akka/cluster/routing/ClusterLoadBalancingRouter.scala rename akka-cluster/src/multi-jvm/scala/akka/cluster/routing/{ClusterLoadBalancingRouterSpec.scala => AdaptiveLoadBalancingRouterSpec.scala} (63%) delete mode 100644 akka-cluster/src/test/scala/akka/cluster/DataStreamSpec.scala create mode 100644 akka-cluster/src/test/scala/akka/cluster/EWMASpec.scala delete mode 100644 akka-cluster/src/test/scala/akka/cluster/routing/HeapMetricsSelectorSpec.scala create mode 100644 akka-cluster/src/test/scala/akka/cluster/routing/MetricsSelectorSpec.scala create mode 100644 akka-cluster/src/test/scala/akka/cluster/routing/WeightedRouteesSpec.scala create mode 100644 akka-samples/akka-sample-cluster/sigar/libsigar-amd64-freebsd-6.so create mode 100644 akka-samples/akka-sample-cluster/sigar/libsigar-amd64-linux.so create mode 100644 akka-samples/akka-sample-cluster/sigar/libsigar-amd64-solaris.so create mode 100644 akka-samples/akka-sample-cluster/sigar/libsigar-ia64-hpux-11.sl create mode 100644 akka-samples/akka-sample-cluster/sigar/libsigar-ia64-linux.so create mode 100644 akka-samples/akka-sample-cluster/sigar/libsigar-pa-hpux-11.sl create mode 100644 akka-samples/akka-sample-cluster/sigar/libsigar-ppc-aix-5.so create mode 100644 akka-samples/akka-sample-cluster/sigar/libsigar-ppc-linux.so create mode 100644 akka-samples/akka-sample-cluster/sigar/libsigar-ppc64-aix-5.so create mode 100644 akka-samples/akka-sample-cluster/sigar/libsigar-ppc64-linux.so create mode 100644 akka-samples/akka-sample-cluster/sigar/libsigar-s390x-linux.so create mode 100644 akka-samples/akka-sample-cluster/sigar/libsigar-sparc-solaris.so create mode 100644 akka-samples/akka-sample-cluster/sigar/libsigar-sparc64-solaris.so create mode 100644 akka-samples/akka-sample-cluster/sigar/libsigar-universal-macosx.dylib create mode 100644 akka-samples/akka-sample-cluster/sigar/libsigar-universal64-macosx.dylib create mode 100644 akka-samples/akka-sample-cluster/sigar/libsigar-x86-freebsd-5.so create mode 100644 akka-samples/akka-sample-cluster/sigar/libsigar-x86-freebsd-6.so create mode 100644 akka-samples/akka-sample-cluster/sigar/libsigar-x86-linux.so create mode 100644 akka-samples/akka-sample-cluster/sigar/libsigar-x86-solaris.so create mode 100644 akka-samples/akka-sample-cluster/sigar/sigar-amd64-winnt.dll create mode 100644 akka-samples/akka-sample-cluster/sigar/sigar-x86-winnt.dll create mode 100644 akka-samples/akka-sample-cluster/sigar/sigar-x86-winnt.lib create mode 100644 akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialBackend.java create mode 100644 akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialBackendMain.java create mode 100644 akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialFrontend.java create mode 100644 akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialFrontendMain.java create mode 100644 akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialResult.java create mode 100644 akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/MetricsListener.java create mode 100644 akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/factorial/FactorialSample.scala diff --git a/akka-actor/src/main/scala/akka/actor/Deployer.scala b/akka-actor/src/main/scala/akka/actor/Deployer.scala index 06d3b01a1b..39d1c47758 100644 --- a/akka-actor/src/main/scala/akka/actor/Deployer.scala +++ b/akka-actor/src/main/scala/akka/actor/Deployer.scala @@ -138,16 +138,24 @@ private[akka] class Deployer(val settings: ActorSystem.Settings, val dynamicAcce } def parseConfig(key: String, config: Config): Option[Deploy] = { - val deployment = config.withFallback(default) + val router = createRouterConfig(deployment.getString("router"), key, config, deployment) + Some(Deploy(key, deployment, router, NoScopeGiven)) + } + /** + * Factory method for creating `RouterConfig` + * @param routerType the configured name of the router, or FQCN + * @param key the full configuration key of the deployment section + * @param config the user defined config of the deployment, without defaults + * @param deployment the deployment config, with defaults + */ + protected def createRouterConfig(routerType: String, key: String, config: Config, deployment: Config): RouterConfig = { val routees = Vector() ++ deployment.getStringList("routees.paths").asScala - val nrOfInstances = deployment.getInt("nr-of-instances") + val resizer = if (config.hasPath("resizer")) Some(DefaultResizer(deployment.getConfig("resizer"))) else None - val resizer: Option[Resizer] = if (config.hasPath("resizer")) Some(DefaultResizer(deployment.getConfig("resizer"))) else None - - val router: RouterConfig = deployment.getString("router") match { + routerType match { case "from-code" ⇒ NoRouter case "round-robin" ⇒ RoundRobinRouter(nrOfInstances, routees, resizer) case "random" ⇒ RandomRouter(nrOfInstances, routees, resizer) @@ -169,7 +177,6 @@ private[akka] class Deployer(val settings: ActorSystem.Settings, val dynamicAcce .format(fqn, key), exception) }).get } - - Some(Deploy(key, deployment, router, NoScopeGiven)) } + } diff --git a/akka-cluster/src/main/resources/reference.conf b/akka-cluster/src/main/resources/reference.conf index 8539e56b1c..f24aa2dee8 100644 --- a/akka-cluster/src/main/resources/reference.conf +++ b/akka-cluster/src/main/resources/reference.conf @@ -70,7 +70,7 @@ akka { failure-detector { # FQCN of the failure detector implementation. - # It must implement akka.cluster.cluster.FailureDetector and + # It must implement akka.cluster.FailureDetector and # have constructor with akka.actor.ActorSystem and # akka.cluster.ClusterSettings parameters implementation-class = "akka.cluster.AccrualFailureDetector" @@ -106,14 +106,6 @@ akka { max-sample-size = 1000 } - # Uses JMX and Hyperic SIGAR, if SIGAR is on the classpath. - # Metrics that are only available with SIGAR for load balancing of nodes are: - # 1. Network latency - # 2. CPU - # A. Combined CPU (sum of User + Sys + Nice + Wait, in percentage) - # B. System load average: on some OS the JMX load average may not be available, - # however if SIGAR is on the classpath it is available on any OS. - # C. The number of cores per processor metrics { # Enable or disable metrics collector for load-balancing nodes. enabled = on @@ -121,6 +113,8 @@ akka { # FQCN of the metrics collector implementation. # It must implement akka.cluster.cluster.MetricsCollector and # have constructor with akka.actor.ActorSystem parameter. + # The default SigarMetricsCollector uses JMX and Hyperic SIGAR, if SIGAR + # is on the classpath, otherwise only JMX. collector-class = "akka.cluster.SigarMetricsCollector" # How often metrics is sampled on a node. @@ -131,10 +125,9 @@ akka { # How quickly the exponential weighting of past data is decayed compared to # new data. Set lower to increase the bias toward newer values. - # Corresponds to 'N time periods' as explained in - # http://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average - # Must be >= 1 - rate-of-decay = 10 + # It takes about 4 half-life to drop below 10% contribution, and 7 to drop + # below 1%. + decay-half-life-duration = 12s } # If the tick-duration of the default scheduler is longer than the @@ -156,6 +149,16 @@ akka { } # Default configuration for routers + actor.deployment.default { + # MetricsSelector to use + # - available: "mix", "heap", "cpu", "load" + # - or: Fully qualified class name of the MetricsSelector class. + # The class must extend akka.cluster.routing.MetricsSelector + # and have a constructor with com.typesafe.config.Config + # parameter. + # - default is "mix" + metrics-selector = mix + } actor.deployment.default.cluster { # enable cluster aware router that deploys to nodes in the cluster enabled = off @@ -182,4 +185,5 @@ akka { routees-path = "" } + } diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterActorRefProvider.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterActorRefProvider.scala index 024dfdc00c..eb58d6ef4a 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterActorRefProvider.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterActorRefProvider.scala @@ -3,6 +3,7 @@ */ package akka.cluster +import scala.collection.JavaConverters.iterableAsScalaIterableConverter import com.typesafe.config.Config import akka.ConfigurationException import akka.actor.Actor @@ -25,6 +26,14 @@ import akka.event.EventStream import akka.remote.RemoteActorRefProvider import akka.remote.RemoteDeployer import akka.remote.routing.RemoteRouterConfig +import akka.routing.RouterConfig +import akka.routing.DefaultResizer +import akka.cluster.routing.AdaptiveLoadBalancingRouter +import akka.cluster.routing.MixMetricsSelector +import akka.cluster.routing.HeapMetricsSelector +import akka.cluster.routing.SystemLoadAverageMetricsSelector +import akka.cluster.routing.CpuMetricsSelector +import akka.cluster.routing.MetricsSelector /** * INTERNAL API @@ -45,7 +54,7 @@ class ClusterActorRefProvider( remoteDeploymentWatcher = system.systemActorOf(Props[RemoteDeploymentWatcher], "RemoteDeploymentWatcher") } - override val deployer: ClusterDeployer = new ClusterDeployer(settings, dynamicAccess) + override lazy val deployer: ClusterDeployer = new ClusterDeployer(settings, dynamicAccess) /** * This method is overridden here to keep track of remote deployed actors to @@ -108,6 +117,36 @@ private[akka] class ClusterDeployer(_settings: ActorSystem.Settings, _pm: Dynami case None ⇒ None } } + + override protected def createRouterConfig(routerType: String, key: String, config: Config, deployment: Config): RouterConfig = { + val routees = Vector() ++ deployment.getStringList("routees.paths").asScala + val nrOfInstances = deployment.getInt("nr-of-instances") + val resizer = if (config.hasPath("resizer")) Some(DefaultResizer(deployment.getConfig("resizer"))) else None + + routerType match { + case "adaptive" ⇒ + val metricsSelector = deployment.getString("metrics-selector") match { + case "mix" ⇒ MixMetricsSelector() + case "heap" ⇒ HeapMetricsSelector + case "cpu" ⇒ CpuMetricsSelector + case "load" ⇒ SystemLoadAverageMetricsSelector + case fqn ⇒ + val args = Seq(classOf[Config] -> deployment) + dynamicAccess.createInstanceFor[MetricsSelector](fqn, args).recover({ + case exception ⇒ throw new IllegalArgumentException( + ("Cannot instantiate metrics-selector [%s], defined in [%s], " + + "make sure it extends [akka.cluster.routing.MetricsSelector] and " + + "has constructor with [com.typesafe.config.Config] parameter") + .format(fqn, key), exception) + }).get + } + + AdaptiveLoadBalancingRouter(metricsSelector, nrOfInstances, routees, resizer) + + case _ ⇒ super.createRouterConfig(routerType, key, config, deployment) + } + + } } @SerialVersionUID(1L) diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterEvent.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterEvent.scala index 8d87f3fe53..feed89c24c 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterEvent.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterEvent.scala @@ -10,6 +10,8 @@ import akka.cluster.ClusterEvent._ import akka.cluster.MemberStatus._ import akka.event.EventStream import akka.actor.AddressTerminated +import java.lang.Iterable +import scala.collection.JavaConverters /** * Domain events published to the event bus. @@ -139,11 +141,18 @@ object ClusterEvent { } /** - * INTERNAL API * - * Current snapshot of cluster member metrics. Published to subscribers. + * Current snapshot of cluster node metrics. Published to subscribers. */ - case class ClusterMetricsChanged(nodes: Set[NodeMetrics]) extends ClusterDomainEvent + case class ClusterMetricsChanged(nodeMetrics: Set[NodeMetrics]) extends ClusterDomainEvent { + /** + * Java API + */ + def getNodeMetrics: java.lang.Iterable[NodeMetrics] = { + import scala.collection.JavaConverters._ + nodeMetrics.asJava + } + } /** * INTERNAL API diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala index ab3b6f5777..50f0fd81c6 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala @@ -9,13 +9,11 @@ import java.lang.System.{ currentTimeMillis ⇒ newTimestamp } import java.lang.management.{ OperatingSystemMXBean, MemoryMXBean, ManagementFactory } import java.lang.reflect.InvocationTargetException import java.lang.reflect.Method - import scala.collection.immutable.{ SortedSet, Map } import scala.concurrent.duration._ import scala.concurrent.forkjoin.ThreadLocalRandom import scala.runtime.{ RichLong, RichDouble, RichInt } import scala.util.{ Try, Success, Failure } - import akka.ConfigurationException import akka.actor.Actor import akka.actor.ActorLogging @@ -26,6 +24,7 @@ import akka.actor.DynamicAccess import akka.actor.ExtendedActorSystem import akka.cluster.MemberStatus.Up import akka.event.Logging +import java.lang.management.MemoryUsage /** * INTERNAL API. @@ -37,8 +36,8 @@ import akka.event.Logging * * Metrics sampling is delegated to the [[akka.cluster.MetricsCollector]]. * - * Calculation of statistical data for each monitored process is delegated to the - * [[akka.cluster.DataStream]] for exponential smoothing, with additional decay factor. + * Smoothing of the data for each monitored process is delegated to the + * [[akka.cluster.EWMA]] for exponential weighted moving average. */ private[cluster] class ClusterMetricsCollector(publisher: ActorRef) extends Actor with ActorLogging { @@ -58,7 +57,7 @@ private[cluster] class ClusterMetricsCollector(publisher: ActorRef) extends Acto /** * The latest metric values with their statistical data. */ - var latestGossip: MetricsGossip = MetricsGossip() + var latestGossip: MetricsGossip = MetricsGossip.empty /** * The metrics collector that samples data on the node. @@ -160,6 +159,13 @@ private[cluster] class ClusterMetricsCollector(publisher: ActorRef) extends Acto } +/** + * INTERNAL API + */ +private[cluster] object MetricsGossip { + val empty = MetricsGossip() +} + /** * INTERNAL API * @@ -195,11 +201,11 @@ private[cluster] case class MetricsGossip(nodes: Set[NodeMetrics] = Set.empty) { * Adds new local [[akka.cluster.NodeMetrics]] and initializes the data, or merges an existing. */ def :+(data: NodeMetrics): MetricsGossip = { - val previous = metricsFor(data) + val previous = metricsFor(data.address) val names = previous map (_.name) val (toMerge: Set[Metric], unseen: Set[Metric]) = data.metrics partition (a ⇒ names contains a.name) - val merged = toMerge flatMap (latest ⇒ previous.collect { case peer if latest same peer ⇒ peer :+ latest }) + val merged = toMerge flatMap (latest ⇒ previous.collect { case peer if latest sameAs peer ⇒ peer :+ latest }) val refreshed = nodes filterNot (_.address == data.address) copy(nodes = refreshed + data.copy(metrics = unseen ++ merged)) @@ -213,7 +219,9 @@ private[cluster] case class MetricsGossip(nodes: Set[NodeMetrics] = Set.empty) { /** * Returns metrics for a node if exists. */ - def metricsFor(node: NodeMetrics): Set[Metric] = nodes flatMap (n ⇒ if (n same node) n.metrics else Set.empty[Metric]) + def metricsFor(address: Address): Set[Metric] = nodes collectFirst { + case n if (n.address == address) ⇒ n.metrics + } getOrElse Set.empty[Metric] } @@ -223,155 +231,139 @@ private[cluster] case class MetricsGossip(nodes: Set[NodeMetrics] = Set.empty) { */ private[cluster] case class MetricsGossipEnvelope(from: Address, gossip: MetricsGossip) extends ClusterMessage +object EWMA { + /** + * Calculate the alpha (decay factor) used in [[akka.cluster.EWMA]] + * from specified half-life and interval between observations. + * It takes about 4 half-life to drop below 10% contribution, and 7 to drop + * below 1%. + */ + def alpha(halfLife: FiniteDuration, collectInterval: FiniteDuration): Double = { + val halfLifeMillis = halfLife.toMillis + require(halfLife.toMillis > 0, "halfLife must be > 0 s") + val decayRate = 0.69315 / halfLifeMillis + 1 - math.exp(-decayRate * collectInterval.toMillis) + } +} + /** * The exponentially weighted moving average (EWMA) approach captures short-term * movements in volatility for a conditional volatility forecasting model. By virtue * of its alpha, or decay factor, this provides a statistical streaming data model * that is exponentially biased towards newer entries. * + * http://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average + * * An EWMA only needs the most recent forecast value to be kept, as opposed to a standard * moving average model. * * INTERNAL API * - * @param decay sets how quickly the exponential weighting decays for past data compared to new data - * Corresponds to 'N time periods' as explained in - * http://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average + * @param alpha decay factor, sets how quickly the exponential weighting decays for past data compared to new data, + * see http://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average * - * @param ewma the current exponentially weighted moving average, e.g. Y(n - 1), or, + * @param value the current exponentially weighted moving average, e.g. Y(n - 1), or, * the sampled value resulting from the previous smoothing iteration. * This value is always used as the previous EWMA to calculate the new EWMA. * - * @param timestamp the most recent time of sampling - * - * @param startTime the time of initial sampling for this data stream */ -private[cluster] case class DataStream(decay: Int, ewma: Double, startTime: Long, timestamp: Long) - extends ClusterMessage { +private[cluster] case class EWMA(value: Double, alpha: Double) extends ClusterMessage { - require(decay >= 1, "Rate of decay must be >= 1") - - /** - * The rate at which the weights of past observations - * decay as they become more distant. - */ - private val α = 2.0 / (decay + 1) + require(0.0 <= alpha && alpha <= 1.0, "alpha must be between 0.0 and 1.0") /** * Calculates the exponentially weighted moving average for a given monitored data set. * * @param xn the new data point - * - * @return a [[akka.cluster.DataStream]] with the updated yn and timestamp + * @return a new [[akka.cluster.EWMA]] with the updated value */ - def :+(xn: Double): DataStream = copy(ewma = (α * xn) + (1 - α) * ewma, timestamp = newTimestamp) - - /** - * The duration of observation for this data stream - */ - def duration: FiniteDuration = (timestamp - startTime).millis + def :+(xn: Double): EWMA = copy(value = (alpha * xn) + (1 - alpha) * value) } /** - * INTERNAL API - * * @param name the metric name - * * @param value the metric value, which may or may not be defined, it must be a valid numerical value, * see [[akka.cluster.MetricNumericConverter.defined()]] - * * @param average the data stream of the metric value, for trending over time. Metrics that are already - * averages (e.g. system load average) or finite (e.g. as total cores), are not trended. + * averages (e.g. system load average) or finite (e.g. as number of processors), are not trended. */ -private[cluster] case class Metric private (name: String, value: Option[Number], average: Option[DataStream], - dummy: Boolean) // dummy because of overloading clash with apply +case class Metric private (name: String, value: Number, private val average: Option[EWMA]) extends ClusterMessage with MetricNumericConverter { - require(value.isEmpty || defined(value.get), "Invalid Metric [%s] value [%]".format(name, value)) + require(defined(value), "Invalid Metric [%s] value [%]".format(name, value)) /** * If defined ( [[akka.cluster.MetricNumericConverter.defined()]] ), updates the new * data point, and if defined, updates the data stream. Returns the updated metric. */ - def :+(latest: Metric): Metric = latest.value match { - case Some(v) if this same latest ⇒ average match { - case Some(previous) ⇒ copy(value = latest.value, average = Some(previous :+ v.doubleValue)) - case None if latest.average.isDefined ⇒ copy(value = latest.value, average = latest.average) - case None if latest.average.isEmpty ⇒ copy(value = latest.value) - } - case None ⇒ this + def :+(latest: Metric): Metric = if (this sameAs latest) average match { + case Some(avg) ⇒ copy(value = latest.value, average = Some(avg :+ latest.value.doubleValue)) + case None if latest.average.isDefined ⇒ copy(value = latest.value, average = latest.average) + case _ ⇒ copy(value = latest.value) } - - def isDefined: Boolean = value.isDefined + else this /** - * The numerical value of the average, if defined, otherwise the latest value, - * if defined. + * The numerical value of the average, if defined, otherwise the latest value */ - def averageValue: Option[Double] = - average map (_.ewma) orElse value.map(_.doubleValue) + def smoothValue: Double = average match { + case Some(avg) ⇒ avg.value + case None ⇒ value.doubleValue + } + + /** + * @return true if this value is smoothed + */ + def isSmooth: Boolean = average.isDefined /** * Returns true if that is tracking the same metric as this. */ - def same(that: Metric): Boolean = name == that.name + def sameAs(that: Metric): Boolean = name == that.name } /** - * INTERNAL API - * - * Companion object of Metric class. + * Factory for creating valid Metric instances. */ -private[cluster] object Metric extends MetricNumericConverter { - import NodeMetrics.MetricValues._ - - private def definedValue(value: Option[Number]): Option[Number] = - if (value.isDefined && defined(value.get)) value else None +object Metric extends MetricNumericConverter { /** - * Evaluates validity of value based on whether it is available (SIGAR on classpath) - * or defined for the OS (JMX). If undefined we set the value option to None and do not modify - * the latest sampled metric to avoid skewing the statistical trend. - * - * @param decay rate of decay for values applicable for trending + * Creates a new Metric instance if the value is valid, otherwise None + * is returned. Invalid numeric values are negative Int/Long and NaN/Infinite + * Double values. */ - def apply(name: String, value: Option[Number], decay: Option[Int]): Metric = { - val dv = definedValue(value) - val average = - if (decay.isDefined && dv.isDefined) { - val now = newTimestamp - Some(DataStream(decay.get, dv.get.doubleValue, now, now)) - } else - None - new Metric(name, dv, average, true) + def create(name: String, value: Number, decayFactor: Option[Double]): Option[Metric] = + if (defined(value)) Some(new Metric(name, value, ceateEWMA(value.doubleValue, decayFactor))) + else None + + /** + * Creates a new Metric instance if the Try is successful and the value is valid, + * otherwise None is returned. Invalid numeric values are negative Int/Long and + * NaN/Infinite Double values. + */ + def create(name: String, value: Try[Number], decayFactor: Option[Double]): Option[Metric] = value match { + case Success(v) ⇒ create(name, v, decayFactor) + case Failure(_) ⇒ None + } + + private def ceateEWMA(value: Double, decayFactor: Option[Double]): Option[EWMA] = decayFactor match { + case Some(alpha) ⇒ Some(EWMA(value, alpha)) + case None ⇒ None } - def apply(name: String): Metric = new Metric(name, None, None, true) } /** - * INTERNAL API - * * The snapshot of current sampled health metrics for any monitored process. * Collected and gossipped at regular intervals for dynamic cluster management strategies. * - * For the JVM memory. The amount of used and committed memory will always be <= max if max is defined. - * A memory allocation may fail if it attempts to increase the used memory such that used > committed - * even if used <= max is true (e.g. when the system virtual memory is low). - * - * The system is possibly nearing a bottleneck if the system load average is nearing in cpus/cores. - * * @param address [[akka.actor.Address]] of the node the metrics are gathered at - * - * @param timestamp the time of sampling - * - * @param metrics the array of sampled [[akka.actor.Metric]] + * @param timestamp the time of sampling, in milliseconds since midnight, January 1, 1970 UTC + * @param metrics the set of sampled [[akka.actor.Metric]] */ -private[cluster] case class NodeMetrics(address: Address, timestamp: Long, metrics: Set[Metric] = Set.empty[Metric]) extends ClusterMessage { - import NodeMetrics._ - import NodeMetrics.MetricValues._ +case class NodeMetrics(address: Address, timestamp: Long, metrics: Set[Metric] = Set.empty[Metric]) extends ClusterMessage { /** * Returns the most recent data. @@ -381,101 +373,147 @@ private[cluster] case class NodeMetrics(address: Address, timestamp: Long, metri /** * Returns true if that address is the same as this and its metric set is more recent. */ - def updatable(that: NodeMetrics): Boolean = (this same that) && (that.timestamp > timestamp) + def updatable(that: NodeMetrics): Boolean = (this sameAs that) && (that.timestamp > timestamp) /** * Returns true if that address is the same as this */ - def same(that: NodeMetrics): Boolean = address == that.address + def sameAs(that: NodeMetrics): Boolean = address == that.address + + def metric(key: String): Option[Metric] = metrics.collectFirst { case m if m.name == key ⇒ m } /** - * Of all the data streams, this fluctuates the most. + * Java API */ - def heapMemory: HeapMemory = HeapMemory(metric(HeapMemoryUsed), metric(HeapMemoryCommitted), metric(HeapMemoryMax)) - - def networkLatency: NetworkLatency = NetworkLatency(metric(NetworkInboundRate), metric(NetworkOutboundRate)) - - def cpu: Cpu = Cpu(metric(SystemLoadAverage), metric(Processors), metric(CpuCombined), metric(TotalCores)) - - def metric(key: String): Metric = metrics.collectFirst { case m if m.name == key ⇒ m } getOrElse Metric(key) + def getMetrics: java.lang.Iterable[Metric] = { + import scala.collection.JavaConverters._ + metrics.asJava + } } /** - * INTERNAL API + * Definitions of the built-in standard metrics. * - * Companion object of Metric class - used by metrics consumers such as the load balancing routers. - * - * The following extractors and orderings hide the implementation from cluster metric consumers - * such as load balancers. + * The following extractors and data structures makes it easy to consume the + * [[akka.cluster.NodeMetrics]] in for example load balancers. */ -private[cluster] object NodeMetrics { +object StandardMetrics { - sealed trait MetricValues + object HeapMemory { + /** + * Constants for the heap related Metric names + */ + object Fields { + final val HeapMemoryUsed = "heap-memory-used" + final val HeapMemoryCommitted = "heap-memory-committed" + final val HeapMemoryMax = "heap-memory-max" + } + import Fields._ - object MetricValues { + /** + * Given a NodeMetrics it returns the HeapMemory data if the nodeMetrics contains + * necessary heap metrics. + * @return if possible a tuple matching the HeapMemory constructor parameters + */ + def unapply(nodeMetrics: NodeMetrics): Option[(Address, Long, Long, Long, Option[Long])] = { + for { + used ← nodeMetrics.metric(HeapMemoryUsed) + committed ← nodeMetrics.metric(HeapMemoryCommitted) + maxOption = nodeMetrics.metric(HeapMemoryMax).map(_.smoothValue.longValue) + } yield (nodeMetrics.address, nodeMetrics.timestamp, + used.smoothValue.longValue, committed.smoothValue.longValue, maxOption) + } - final val HeapMemoryUsed = "heap-memory-used" - final val HeapMemoryCommitted = "heap-memory-committed" - final val HeapMemoryMax = "heap-memory-max" - final val NetworkInboundRate = "network-max-inbound" - final val NetworkOutboundRate = "network-max-outbound" - final val SystemLoadAverage = "system-load-average" - final val Processors = "processors" - final val CpuCombined = "cpu-combined" - final val TotalCores = "total-cores" - - def unapply(v: HeapMemory): Tuple3[Long, Long, Option[Long]] = - (v.used.averageValue.get.longValue, - v.committed.averageValue.get.longValue, - v.max.averageValue map (_.longValue) orElse None) - - def unapply(v: NetworkLatency): Option[(Long, Long)] = - (v.inbound.averageValue, v.outbound.averageValue) match { - case (Some(a), Some(b)) ⇒ Some((a.longValue, b.longValue)) - case _ ⇒ None - } - - def unapply(v: Cpu): Tuple4[Option[Double], Int, Option[Double], Option[Int]] = - (v.systemLoadAverage.averageValue map (_.doubleValue), - v.processors.averageValue.get.intValue, - v.combinedCpu.averageValue map (_.doubleValue), - v.cores.averageValue map (_.intValue)) } /** + * Java API to extract HeapMemory data from nodeMetrics, if the nodeMetrics + * contains necessary heap metrics, otherwise it returns null. + */ + def extractHeapMemory(nodeMetrics: NodeMetrics): HeapMemory = nodeMetrics match { + case HeapMemory(address, timestamp, used, committed, max) ⇒ + HeapMemory(address, timestamp, used, committed, max) + case _ ⇒ null + } + + /** + * The amount of used and committed memory will always be <= max if max is defined. + * A memory allocation may fail if it attempts to increase the used memory such that used > committed + * even if used <= max is true (e.g. when the system virtual memory is low). + * + * @param address [[akka.actor.Address]] of the node the metrics are gathered at + * @param timestamp the time of sampling, in milliseconds since midnight, January 1, 1970 UTC * @param used the current sum of heap memory used from all heap memory pools (in bytes) - * * @param committed the current sum of heap memory guaranteed to be available to the JVM - * from all heap memory pools (in bytes). Committed will always be greater than or equal to used. - * + * from all heap memory pools (in bytes). Committed will always be greater than or equal to used. * @param max the maximum amount of memory (in bytes) that can be used for JVM memory management. - * Can be undefined on some OS. + * Can be undefined on some OS. */ - case class HeapMemory(used: Metric, committed: Metric, max: Metric) extends MetricValues { - require(used.isDefined, "used must be defined") - require(committed.isDefined, "committed must be defined") + case class HeapMemory(address: Address, timestamp: Long, used: Long, committed: Long, max: Option[Long]) { + require(committed > 0L, "committed heap expected to be > 0 bytes") + require(max.isEmpty || max.get > 0L, "max heap expected to be > 0 bytes") + } + + object Cpu { + /** + * Constants for the cpu related Metric names + */ + object Fields { + final val SystemLoadAverage = "system-load-average" + final val Processors = "processors" + final val CpuCombined = "cpu-combined" + } + import Fields._ + + /** + * Given a NodeMetrics it returns the Cpu data if the nodeMetrics contains + * necessary cpu metrics. + * @return if possible a tuple matching the Cpu constructor parameters + */ + def unapply(nodeMetrics: NodeMetrics): Option[(Address, Long, Option[Double], Option[Double], Int)] = { + for { + processors ← nodeMetrics.metric(Processors) + systemLoadAverageOption = nodeMetrics.metric(SystemLoadAverage).map(_.smoothValue) + cpuCombinedOption = nodeMetrics.metric(CpuCombined).map(_.smoothValue) + } yield (nodeMetrics.address, nodeMetrics.timestamp, + systemLoadAverageOption, cpuCombinedOption, processors.value.intValue) + } + } /** - * @param inbound the inbound network IO rate, in bytes - * - * @param outbound the outbound network IO rate, in bytes + * Java API to extract Cpu data from nodeMetrics, if the nodeMetrics + * contains necessary cpu metrics, otherwise it returns null. */ - case class NetworkLatency(inbound: Metric, outbound: Metric) extends MetricValues + def extractCpu(nodeMetrics: NodeMetrics): Cpu = nodeMetrics match { + case Cpu(address, timestamp, systemLoadAverage, cpuCombined, processors) ⇒ + Cpu(address, timestamp, systemLoadAverage, cpuCombined, processors) + case _ ⇒ null + } /** - * @param systemLoadAverage OS-specific average load on the CPUs in the system, for the past 1 minute - * + * @param address [[akka.actor.Address]] of the node the metrics are gathered at + * @param timestamp the time of sampling, in milliseconds since midnight, January 1, 1970 UTC + * @param systemLoadAverage OS-specific average load on the CPUs in the system, for the past 1 minute, + * The system is possibly nearing a bottleneck if the system load average is nearing number of cpus/cores. + * @param cpuCombined combined CPU sum of User + Sys + Nice + Wait, in percentage ([0.0 - 1.0]. This + * metric can describe the amount of time the CPU spent executing code during n-interval and how + * much more it could theoretically. * @param processors the number of available processors - * - * @param combinedCpu combined CPU sum of User + Sys + Nice + Wait, in percentage. This metric can describe - * the amount of time the CPU spent executing code during n-interval and how much more it could theoretically. - * - * @param cores the number of cores (multi-core: per processor) */ - private[cluster] case class Cpu(systemLoadAverage: Metric, processors: Metric, combinedCpu: Metric, cores: Metric) extends MetricValues { - require(processors.isDefined, "processors must be defined") + case class Cpu( + address: Address, + timestamp: Long, + systemLoadAverage: Option[Double], + cpuCombined: Option[Double], + processors: Int) { + + cpuCombined match { + case Some(x) ⇒ require(0.0 <= x && x <= 1.0, "cpuCombined must be between [0.0 - 1.0], was [%s]" format x) + case None ⇒ + } + } } @@ -527,22 +565,22 @@ private[cluster] trait MetricsCollector extends Closeable { } /** - * INTERNAL API - * - * Loads JVM metrics through JMX monitoring beans. + * Loads JVM and system metrics through JMX monitoring beans. * * @param address The [[akka.actor.Address]] of the node being sampled * @param decay how quickly the exponential weighting of past data is decayed */ -private[cluster] class JmxMetricsCollector(address: Address, decay: Int) extends MetricsCollector { - import NodeMetrics.MetricValues._ +class JmxMetricsCollector(address: Address, decayFactor: Double) extends MetricsCollector { + import StandardMetrics.HeapMemory.Fields._ + import StandardMetrics.Cpu.Fields._ private def this(cluster: Cluster) = - this(cluster.selfAddress, cluster.settings.MetricsRateOfDecay) + this(cluster.selfAddress, + EWMA.alpha(cluster.settings.MetricsDecayHalfLifeDuration, cluster.settings.MetricsInterval)) def this(system: ActorSystem) = this(Cluster(system)) - private val decayOption = Some(decay) + private val decayFactorOption = Some(decayFactor) private val memoryMBean: MemoryMXBean = ManagementFactory.getMemoryMXBean @@ -551,63 +589,68 @@ private[cluster] class JmxMetricsCollector(address: Address, decay: Int) extends /** * Samples and collects new data points. */ - def sample: NodeMetrics = NodeMetrics(address, newTimestamp, Set( - systemLoadAverage, heapUsed, heapCommitted, heapMax, processors)) + def sample: NodeMetrics = NodeMetrics(address, newTimestamp, metrics) + + def metrics: Set[Metric] = { + val heap = heapMemoryUsage + Set(systemLoadAverage, heapUsed(heap), heapCommitted(heap), heapMax(heap), processors).flatten + } /** * JMX Returns the OS-specific average load on the CPUs in the system, for the past 1 minute. - * On some systems the JMX OS system load average may not be available, in which case a -1 is returned, - * which means that the returned Metric is undefined. + * On some systems the JMX OS system load average may not be available, in which case a -1 is + * returned from JMX, and None is returned from this method. */ - def systemLoadAverage: Metric = Metric( + def systemLoadAverage: Option[Metric] = Metric.create( name = SystemLoadAverage, - value = Some(osMBean.getSystemLoadAverage), - decay = None) + value = osMBean.getSystemLoadAverage, + decayFactor = None) /** * (JMX) Returns the number of available processors */ - def processors: Metric = Metric( + def processors: Option[Metric] = Metric.create( name = Processors, - value = Some(osMBean.getAvailableProcessors), - decay = None) + value = osMBean.getAvailableProcessors, + decayFactor = None) - // FIXME those three heap calls should be done at once + /** + * Current heap to be passed in to heapUsed, heapCommitted and heapMax + */ + def heapMemoryUsage: MemoryUsage = memoryMBean.getHeapMemoryUsage /** * (JMX) Returns the current sum of heap memory used from all heap memory pools (in bytes). */ - def heapUsed: Metric = Metric( + def heapUsed(heap: MemoryUsage): Option[Metric] = Metric.create( name = HeapMemoryUsed, - value = Some(memoryMBean.getHeapMemoryUsage.getUsed), - decay = decayOption) + value = heap.getUsed, + decayFactor = decayFactorOption) /** * (JMX) Returns the current sum of heap memory guaranteed to be available to the JVM * from all heap memory pools (in bytes). */ - def heapCommitted: Metric = Metric( + def heapCommitted(heap: MemoryUsage): Option[Metric] = Metric.create( name = HeapMemoryCommitted, - value = Some(memoryMBean.getHeapMemoryUsage.getCommitted), - decay = decayOption) + value = heap.getCommitted, + decayFactor = decayFactorOption) /** * (JMX) Returns the maximum amount of memory (in bytes) that can be used * for JVM memory management. If not defined the metrics value is None, i.e. * never negative. */ - def heapMax: Metric = Metric( + def heapMax(heap: MemoryUsage): Option[Metric] = Metric.create( name = HeapMemoryMax, - value = Some(memoryMBean.getHeapMemoryUsage.getMax), - decay = None) + value = heap.getMax, + decayFactor = None) - def close(): Unit = () + override def close(): Unit = () } /** - * INTERNAL API - * * Loads metrics through Hyperic SIGAR and JMX monitoring beans. This * loads wider and more accurate range of metrics compared to JmxMetricsCollector * by using SIGAR's native OS library. @@ -621,32 +664,25 @@ private[cluster] class JmxMetricsCollector(address: Address, decay: Int) extends * @param decay how quickly the exponential weighting of past data is decayed * @param sigar the org.hyperic.Sigar instance */ -private[cluster] class SigarMetricsCollector(address: Address, decay: Int, sigar: AnyRef) - extends JmxMetricsCollector(address, decay) { - import NodeMetrics.MetricValues._ +class SigarMetricsCollector(address: Address, decayFactor: Double, sigar: AnyRef) + extends JmxMetricsCollector(address, decayFactor) { - def this(address: Address, decay: Int, dynamicAccess: DynamicAccess) = - this(address, decay, dynamicAccess.createInstanceFor[AnyRef]("org.hyperic.sigar.Sigar", Seq.empty).get) + import StandardMetrics.HeapMemory.Fields._ + import StandardMetrics.Cpu.Fields._ private def this(cluster: Cluster) = - this(cluster.selfAddress, cluster.settings.MetricsRateOfDecay, cluster.system.dynamicAccess) + this(cluster.selfAddress, + EWMA.alpha(cluster.settings.MetricsDecayHalfLifeDuration, cluster.settings.MetricsInterval), + cluster.system.dynamicAccess.createInstanceFor[AnyRef]("org.hyperic.sigar.Sigar", Seq.empty).get) def this(system: ActorSystem) = this(Cluster(system)) - private val decayOption = Some(decay) + private val decayFactorOption = Some(decayFactor) private val LoadAverage: Option[Method] = createMethodFrom(sigar, "getLoadAverage") - - private val CpuList: Option[Method] = createMethodFrom(sigar, "getCpuInfoList").map(m ⇒ m) - - private val NetInterfaces: Option[Method] = createMethodFrom(sigar, "getNetInterfaceList") - private val Cpu: Option[Method] = createMethodFrom(sigar, "getCpuPerc") - private val CombinedCpu: Option[Method] = Try(Cpu.get.getReturnType.getMethod("getCombined")).toOption - private val Pid: Option[Method] = createMethodFrom(sigar, "getPid") - // Do something initially, in constructor, to make sure that the native library can be loaded. // This will by design throw exception if sigar isn't usable val pid: Long = createMethodFrom(sigar, "getPid") match { @@ -661,25 +697,20 @@ private[cluster] class SigarMetricsCollector(address: Address, decay: Int, sigar case None ⇒ throw new IllegalArgumentException("Wrong version of Sigar, expected 'getPid' method") } - /** - * Samples and collects new data points. - */ - override def sample: NodeMetrics = NodeMetrics(address, newTimestamp, Set(cpuCombined, totalCores, - systemLoadAverage, heapUsed, heapCommitted, heapMax, processors, networkMaxRx, networkMaxTx)) + override def metrics: Set[Metric] = { + super.metrics.filterNot(_.name == SystemLoadAverage) ++ Set(systemLoadAverage, cpuCombined).flatten + } /** * (SIGAR / JMX) Returns the OS-specific average load on the CPUs in the system, for the past 1 minute. - * On some systems the JMX OS system load average may not be available, in which case a -1 is returned, - * which means that the returned Metric is undefined. + * On some systems the JMX OS system load average may not be available, in which case a -1 is returned + * from JMX, which means that None is returned from this method. * Hyperic SIGAR provides more precise values, thus, if the library is on the classpath, it is the default. */ - override def systemLoadAverage: Metric = { - val m = Metric( - name = SystemLoadAverage, - value = Try(LoadAverage.get.invoke(sigar).asInstanceOf[Array[AnyRef]].head.asInstanceOf[Number]).toOption, - decay = None) - if (m.isDefined) m else super.systemLoadAverage - } + override def systemLoadAverage: Option[Metric] = Metric.create( + name = SystemLoadAverage, + value = Try(LoadAverage.get.invoke(sigar).asInstanceOf[Array[AnyRef]](0).asInstanceOf[Number]), + decayFactor = None) orElse super.systemLoadAverage /** * (SIGAR) Returns the combined CPU sum of User + Sys + Nice + Wait, in percentage. This metric can describe @@ -689,59 +720,16 @@ private[cluster] class SigarMetricsCollector(address: Address, decay: Int, sigar * In the data stream, this will sometimes return with a valid metric value, and sometimes as a NaN or Infinite. * Documented bug https://bugzilla.redhat.com/show_bug.cgi?id=749121 and several others. */ - def cpuCombined: Metric = Metric( + def cpuCombined: Option[Metric] = Metric.create( name = CpuCombined, - value = Try(CombinedCpu.get.invoke(Cpu.get.invoke(sigar)).asInstanceOf[Number]).toOption, - decay = decayOption) - - /** - * FIXME: Array[Int].head - expose all if cores per processor might differ. - * (SIGAR) Returns the total number of cores. - * - * FIXME do we need this information, isn't it enough with jmx processors? - */ - def totalCores: Metric = Metric( - name = TotalCores, - value = Try(CpuList.get.invoke(sigar).asInstanceOf[Array[AnyRef]].map(cpu ⇒ - createMethodFrom(cpu, "getTotalCores").get.invoke(cpu).asInstanceOf[Number]).head).toOption, - decay = None) - - // FIXME those two network calls should be combined into one - - /** - * (SIGAR) Returns the max network IO read/write value, in bytes, for network latency evaluation. - */ - def networkMaxRx: Metric = networkFor("getRxBytes", NetworkInboundRate) - - /** - * (SIGAR) Returns the max network IO outbound value, in bytes. - */ - def networkMaxTx: Metric = networkFor("getTxBytes", NetworkOutboundRate) + value = Try(CombinedCpu.get.invoke(Cpu.get.invoke(sigar)).asInstanceOf[Number]), + decayFactor = decayFactorOption) /** * Releases any native resources associated with this instance. */ override def close(): Unit = Try(createMethodFrom(sigar, "close").get.invoke(sigar)) - // FIXME network metrics needs thought and refactoring - - /** - * Returns the max bytes for the given method in metric for metric from the network interface stats. - */ - private def networkFor(method: String, metric: String): Metric = Metric( - name = metric, - value = Try(networkStats.collect { - case (_, a) ⇒ - createMethodFrom(a, method).get.invoke(a).asInstanceOf[Long] - }.max.asInstanceOf[Number]).toOption.orElse(None), - decay = decayOption) - - /** - * Returns the network stats per interface. - */ - private def networkStats: Map[String, AnyRef] = Try(NetInterfaces.get.invoke(sigar).asInstanceOf[Array[String]].map(arg ⇒ - arg -> (createMethodFrom(sigar, "getNetInterfaceStat", Array(classOf[String])).get.invoke(sigar, arg))).toMap) getOrElse Map.empty[String, AnyRef] - private def createMethodFrom(ref: AnyRef, method: String, types: Array[(Class[_])] = Array.empty[(Class[_])]): Option[Method] = Try(ref.getClass.getMethod(method, types: _*)).toOption @@ -749,7 +737,9 @@ private[cluster] class SigarMetricsCollector(address: Address, decay: Int, sigar /** * INTERNAL API - * Companion object of MetricsCollector class. + * Factory to create configured MetricsCollector. + * If instantiation of SigarMetricsCollector fails (missing class or native library) + * it falls back to use JmxMetricsCollector. */ private[cluster] object MetricsCollector { def apply(system: ExtendedActorSystem, settings: ClusterSettings): MetricsCollector = { diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala index 1b2d11745e..cc87c1e112 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala @@ -77,9 +77,9 @@ class ClusterSettings(val config: Config, val systemName: String) { require(d > Duration.Zero, "metrics.collect-interval must be > 0"); d } final val MetricsGossipInterval: FiniteDuration = Duration(getMilliseconds("akka.cluster.metrics.gossip-interval"), MILLISECONDS) - final val MetricsRateOfDecay: Int = { - val n = getInt("akka.cluster.metrics.rate-of-decay") - require(n >= 1, "metrics.rate-of-decay must be >= 1"); n + final val MetricsDecayHalfLifeDuration: FiniteDuration = { + val d = Duration(getMilliseconds("akka.cluster.metrics.decay-half-life-duration"), MILLISECONDS) + require(d > Duration.Zero, "metrics.decay-half-life-duration must be > 0"); d } } diff --git a/akka-cluster/src/main/scala/akka/cluster/routing/AdaptiveLoadBalancingRouter.scala b/akka-cluster/src/main/scala/akka/cluster/routing/AdaptiveLoadBalancingRouter.scala new file mode 100644 index 0000000000..7208976926 --- /dev/null +++ b/akka-cluster/src/main/scala/akka/cluster/routing/AdaptiveLoadBalancingRouter.scala @@ -0,0 +1,414 @@ +/* + * Copyright (C) 2009-2012 Typesafe Inc. + */ + +package akka.cluster.routing + +import java.util.Arrays +import scala.concurrent.forkjoin.ThreadLocalRandom +import scala.collection.JavaConverters.iterableAsScalaIterableConverter +import akka.actor.Actor +import akka.actor.ActorRef +import akka.actor.Address +import akka.actor.OneForOneStrategy +import akka.actor.Props +import akka.actor.SupervisorStrategy +import akka.dispatch.Dispatchers +import akka.cluster.Cluster +import akka.cluster.ClusterEvent.ClusterMetricsChanged +import akka.cluster.ClusterEvent.CurrentClusterState +import akka.cluster.NodeMetrics +import akka.cluster.StandardMetrics.Cpu +import akka.cluster.StandardMetrics.HeapMemory +import akka.event.Logging +import akka.routing.Broadcast +import akka.routing.Destination +import akka.routing.FromConfig +import akka.routing.NoRouter +import akka.routing.Resizer +import akka.routing.Route +import akka.routing.RouteeProvider +import akka.routing.RouterConfig + +object AdaptiveLoadBalancingRouter { + private val defaultSupervisorStrategy: SupervisorStrategy = OneForOneStrategy() { + case _ ⇒ SupervisorStrategy.Escalate + } +} + +/** + * A Router that performs load balancing to cluster nodes based on + * cluster metric data. + * + * It uses random selection of routees based probabilities derived from + * the remaining capacity of corresponding node. + * + * Please note that providing both 'nrOfInstances' and 'routees' does not make logical + * sense as this means that the router should both create new actors and use the 'routees' + * actor(s). In this case the 'nrOfInstances' will be ignored and the 'routees' will be used. + *
+ * The configuration parameter trumps the constructor arguments. This means that + * if you provide either 'nrOfInstances' or 'routees' during instantiation they will + * be ignored if the router is defined in the configuration file for the actor being used. + * + *

Supervision Setup

+ * + * The router creates a “head” actor which supervises and/or monitors the + * routees. Instances are created as children of this actor, hence the + * children are not supervised by the parent of the router. Common choices are + * to always escalate (meaning that fault handling is always applied to all + * children simultaneously; this is the default) or use the parent’s strategy, + * which will result in routed children being treated individually, but it is + * possible as well to use Routers to give different supervisor strategies to + * different groups of children. + * + * @param metricsSelector decides what probability to use for selecting a routee, based + * on remaining capacity as indicated by the node metrics + * @param routees string representation of the actor paths of the routees that will be looked up + * using `actorFor` in [[akka.actor.ActorRefProvider]] + */ +@SerialVersionUID(1L) +case class AdaptiveLoadBalancingRouter( + metricsSelector: MetricsSelector = MixMetricsSelector(), + nrOfInstances: Int = 0, routees: Iterable[String] = Nil, + override val resizer: Option[Resizer] = None, + val routerDispatcher: String = Dispatchers.DefaultDispatcherId, + val supervisorStrategy: SupervisorStrategy = AdaptiveLoadBalancingRouter.defaultSupervisorStrategy) + extends RouterConfig with AdaptiveLoadBalancingRouterLike { + + /** + * Constructor that sets nrOfInstances to be created. + * Java API + * @param selector the selector is responsible for producing weighted mix of routees from the node metrics + * @param nr number of routees to create + */ + def this(selector: MetricsSelector, nr: Int) = this(metricsSelector = selector, nrOfInstances = nr) + + /** + * Constructor that sets the routees to be used. + * Java API + * @param selector the selector is responsible for producing weighted mix of routees from the node metrics + * @param routeePaths string representation of the actor paths of the routees that will be looked up + * using `actorFor` in [[akka.actor.ActorRefProvider]] + */ + def this(selector: MetricsSelector, routeePaths: java.lang.Iterable[String]) = + this(metricsSelector = selector, routees = routeePaths.asScala) + + /** + * Constructor that sets the resizer to be used. + * Java API + * @param selector the selector is responsible for producing weighted mix of routees from the node metrics + */ + def this(selector: MetricsSelector, resizer: Resizer) = + this(metricsSelector = selector, resizer = Some(resizer)) + + /** + * Java API for setting routerDispatcher + */ + def withDispatcher(dispatcherId: String): AdaptiveLoadBalancingRouter = + copy(routerDispatcher = dispatcherId) + + /** + * Java API for setting the supervisor strategy to be used for the “head” + * Router actor. + */ + def withSupervisorStrategy(strategy: SupervisorStrategy): AdaptiveLoadBalancingRouter = + copy(supervisorStrategy = strategy) + + /** + * Uses the resizer of the given RouterConfig if this RouterConfig + * doesn't have one, i.e. the resizer defined in code is used if + * resizer was not defined in config. + */ + override def withFallback(other: RouterConfig): RouterConfig = other match { + case _: FromConfig | _: NoRouter ⇒ this + case otherRouter: AdaptiveLoadBalancingRouter ⇒ + val useResizer = + if (this.resizer.isEmpty && otherRouter.resizer.isDefined) otherRouter.resizer + else this.resizer + copy(resizer = useResizer) + case _ ⇒ throw new IllegalArgumentException("Expected AdaptiveLoadBalancingRouter, got [%s]".format(other)) + } + +} + +/** + * INTERNAL API. + * + * This strategy is a metrics-aware router which performs load balancing of + * cluster nodes based on cluster metric data. It consumes [[akka.cluster.ClusterMetricsChanged]] + * events and the [[akka.cluster.routing.MetricsSelector]] creates an mix of + * weighted routees based on the node metrics. Messages are routed randomly to the + * weighted routees, i.e. nodes with lower load are more likely to be used than nodes with + * higher load + */ +trait AdaptiveLoadBalancingRouterLike { this: RouterConfig ⇒ + + def metricsSelector: MetricsSelector + + def nrOfInstances: Int + + def routees: Iterable[String] + + def routerDispatcher: String + + override def createRoute(routeeProvider: RouteeProvider): Route = { + if (resizer.isEmpty) { + if (routees.isEmpty) routeeProvider.createRoutees(nrOfInstances) + else routeeProvider.registerRouteesFor(routees) + } + + val log = Logging(routeeProvider.context.system, routeeProvider.context.self) + + // The current weighted routees, if any. Weights are produced by the metricsSelector + // via the metricsListener Actor. It's only updated by the actor, but accessed from + // the threads of the senders. + @volatile var weightedRoutees: Option[WeightedRoutees] = None + + // subscribe to ClusterMetricsChanged and update weightedRoutees + val metricsListener = routeeProvider.context.actorOf(Props(new Actor { + + val cluster = Cluster(context.system) + + override def preStart(): Unit = cluster.subscribe(self, classOf[ClusterMetricsChanged]) + override def postStop(): Unit = cluster.unsubscribe(self) + + def receive = { + case ClusterMetricsChanged(metrics) ⇒ receiveMetrics(metrics) + case _: CurrentClusterState ⇒ // ignore + } + + def receiveMetrics(metrics: Set[NodeMetrics]): Unit = { + // update the state outside of the actor, not a recommended practice, but works fine here + weightedRoutees = Some(new WeightedRoutees(routeeProvider.routees, cluster.selfAddress, + metricsSelector.weights(metrics))) + } + + }).withDispatcher(routerDispatcher), name = "metricsListener") + + def getNext(): ActorRef = weightedRoutees match { + case Some(weighted) ⇒ + if (weighted.total == 0) routeeProvider.context.system.deadLetters + else weighted(ThreadLocalRandom.current.nextInt(weighted.total) + 1) + case None ⇒ + val currentRoutees = routeeProvider.routees + if (currentRoutees.isEmpty) routeeProvider.context.system.deadLetters + else currentRoutees(ThreadLocalRandom.current.nextInt(currentRoutees.size)) + } + + { + case (sender, message) ⇒ + message match { + case Broadcast(msg) ⇒ toAll(sender, routeeProvider.routees) + case msg ⇒ List(Destination(sender, getNext())) + } + } + } +} + +/** + * MetricsSelector that uses the heap metrics. + * Low heap capacity => small weight. + */ +@SerialVersionUID(1L) +case object HeapMetricsSelector extends CapacityMetricsSelector { + /** + * Java API: get the singleton instance + */ + def getInstance = this + + override def capacity(nodeMetrics: Set[NodeMetrics]): Map[Address, Double] = { + nodeMetrics.collect { + case HeapMemory(address, _, used, committed, max) ⇒ + val capacity = max match { + case None ⇒ (committed - used).toDouble / committed + case Some(m) ⇒ (m - used).toDouble / m + } + (address, capacity) + }.toMap + } +} + +/** + * MetricsSelector that uses the combined CPU metrics. + * Combined CPU is sum of User + Sys + Nice + Wait, in percentage. + * Low cpu capacity => small weight. + */ +@SerialVersionUID(1L) +case object CpuMetricsSelector extends CapacityMetricsSelector { + /** + * Java API: get the singleton instance + */ + def getInstance = this + + override def capacity(nodeMetrics: Set[NodeMetrics]): Map[Address, Double] = { + nodeMetrics.collect { + case Cpu(address, _, _, Some(cpuCombined), _) ⇒ + val capacity = 1.0 - cpuCombined + (address, capacity) + }.toMap + } +} + +/** + * MetricsSelector that uses the system load average metrics. + * System load average is OS-specific average load on the CPUs in the system, + * for the past 1 minute. The system is possibly nearing a bottleneck if the + * system load average is nearing number of cpus/cores. + * Low load average capacity => small weight. + */ +@SerialVersionUID(1L) +case object SystemLoadAverageMetricsSelector extends CapacityMetricsSelector { + /** + * Java API: get the singleton instance + */ + def getInstance = this + + override def capacity(nodeMetrics: Set[NodeMetrics]): Map[Address, Double] = { + nodeMetrics.collect { + case Cpu(address, _, Some(systemLoadAverage), _, processors) ⇒ + val capacity = 1.0 - math.min(1.0, systemLoadAverage / processors) + (address, capacity) + }.toMap + } +} + +/** + * MetricsSelector that combines other selectors and aggregates their capacity + * values. By default it uses [akka.cluster.routing.HeapMetricsSelector], + * [akka.cluster.routing.CpuMetricsSelector], and [akka.cluster.routing.SystemLoadAverageMetricsSelector] + */ +@SerialVersionUID(1L) +case class MixMetricsSelector( + selectors: IndexedSeq[CapacityMetricsSelector] = Vector( + HeapMetricsSelector, CpuMetricsSelector, SystemLoadAverageMetricsSelector)) + extends CapacityMetricsSelector { + + /** + * Java API + */ + def this(selectors: java.lang.Iterable[CapacityMetricsSelector]) = this(selectors.asScala.toIndexedSeq) + + override def capacity(nodeMetrics: Set[NodeMetrics]): Map[Address, Double] = { + val combined: IndexedSeq[(Address, Double)] = selectors.flatMap(_.capacity(nodeMetrics).toSeq) + // aggregated average of the capacities by address + combined.foldLeft(Map.empty[Address, (Double, Int)].withDefaultValue((0.0, 0))) { + case (acc, (address, capacity)) ⇒ + val (sum, count) = acc(address) + acc + (address -> (sum + capacity, count + 1)) + }.mapValues { + case (sum, count) ⇒ sum / count + }.toMap + } + +} + +case object MixMetricsSelector { + /** + * Java API: get the default singleton instance + */ + def getInstance = MixMetricsSelector() +} + +/** + * A MetricsSelector is responsible for producing weights from the node metrics. + */ +@SerialVersionUID(1L) +trait MetricsSelector extends Serializable { + /** + * The weights per address, based on the the nodeMetrics. + */ + def weights(nodeMetrics: Set[NodeMetrics]): Map[Address, Int] +} + +/** + * A MetricsSelector producing weights from remaining capacity. + * The weights are typically proportional to the remaining capacity. + */ +abstract class CapacityMetricsSelector extends MetricsSelector { + + /** + * Remaining capacity for each node. The value is between + * 0.0 and 1.0, where 0.0 means no remaining capacity (full + * utilization) and 1.0 means full remaining capacity (zero + * utilization). + */ + def capacity(nodeMetrics: Set[NodeMetrics]): Map[Address, Double] + + /** + * Converts the capacity values to weights. The node with lowest + * capacity gets weight 1 (lowest usable capacity is 1%) and other + * nodes gets weights proportional to their capacity compared to + * the node with lowest capacity. + */ + def weights(capacity: Map[Address, Double]): Map[Address, Int] = { + if (capacity.isEmpty) Map.empty[Address, Int] + else { + val (_, min) = capacity.minBy { case (_, c) ⇒ c } + // lowest usable capacity is 1% (>= 0.5% will be rounded to weight 1), also avoids div by zero + val divisor = math.max(0.01, min) + capacity mapValues { c ⇒ math.round((c) / divisor).toInt } + } + } + + /** + * The weights per address, based on the capacity produced by + * the nodeMetrics. + */ + override def weights(nodeMetrics: Set[NodeMetrics]): Map[Address, Int] = + weights(capacity(nodeMetrics)) + +} + +/** + * INTERNAL API + * + * Pick routee based on its weight. Higher weight, higher probability. + */ +private[cluster] class WeightedRoutees(refs: IndexedSeq[ActorRef], selfAddress: Address, weights: Map[Address, Int]) { + + // fill an array of same size as the refs with accumulated weights, + // binarySearch is used to pick the right bucket from a requested value + // from 1 to the total sum of the used weights. + private val buckets: Array[Int] = { + def fullAddress(actorRef: ActorRef): Address = actorRef.path.address match { + case Address(_, _, None, None) ⇒ selfAddress + case a ⇒ a + } + val buckets = Array.ofDim[Int](refs.size) + val meanWeight = if (weights.isEmpty) 1 else weights.values.sum / weights.size + val w = weights.withDefaultValue(meanWeight) + var sum = 0 + refs.zipWithIndex foreach { + case (ref, i) ⇒ + sum += w(fullAddress(ref)) + buckets(i) = sum + } + buckets + } + + def total: Int = + if (buckets.length == 0) 0 + else buckets(buckets.length - 1) + + /** + * Pick the routee matching a value, from 1 to total. + */ + def apply(value: Int): ActorRef = { + // converts the result of Arrays.binarySearch into a index in the buckets array + // see documentation of Arrays.binarySearch for what it returns + def idx(i: Int): Int = { + if (i >= 0) i // exact match + else { + val j = math.abs(i + 1) + if (j >= buckets.length) throw new IndexOutOfBoundsException( + "Requested index [%s] is > max index [%s]".format(i, buckets.length)) + else j + } + } + + require(1 <= value && value <= total, "value must be between [1 - %s]" format total) + refs(idx(Arrays.binarySearch(buckets, value))) + + } +} \ No newline at end of file diff --git a/akka-cluster/src/main/scala/akka/cluster/routing/ClusterLoadBalancingRouter.scala b/akka-cluster/src/main/scala/akka/cluster/routing/ClusterLoadBalancingRouter.scala deleted file mode 100644 index 52b63ef5f6..0000000000 --- a/akka-cluster/src/main/scala/akka/cluster/routing/ClusterLoadBalancingRouter.scala +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Copyright (C) 2009-2012 Typesafe Inc. - */ - -package akka.cluster.routing - -import scala.concurrent.forkjoin.ThreadLocalRandom -import scala.collection.JavaConverters.iterableAsScalaIterableConverter - -import akka.actor.Actor -import akka.actor.ActorRef -import akka.actor.Address -import akka.actor.OneForOneStrategy -import akka.actor.Props -import akka.actor.SupervisorStrategy -import akka.cluster.Cluster -import akka.cluster.ClusterEvent.ClusterMetricsChanged -import akka.cluster.ClusterEvent.CurrentClusterState -import akka.cluster.NodeMetrics -import akka.cluster.NodeMetrics.MetricValues -import akka.dispatch.Dispatchers -import akka.event.Logging -import akka.routing.Broadcast -import akka.routing.Destination -import akka.routing.Resizer -import akka.routing.Route -import akka.routing.RouteeProvider -import akka.routing.RouterConfig - -/** - * INTERNAL API - */ -private[cluster] object ClusterLoadBalancingRouter { - val defaultSupervisorStrategy: SupervisorStrategy = OneForOneStrategy() { - case _ ⇒ SupervisorStrategy.Escalate - } -} - -/** - * A Router that performs load balancing to cluster nodes based on - * cluster metric data. - * - * It uses random selection of routees based probabilities derived from - * the remaining capacity of corresponding node. - * - * Please note that providing both 'nrOfInstances' and 'routees' does not make logical - * sense as this means that the router should both create new actors and use the 'routees' - * actor(s). In this case the 'nrOfInstances' will be ignored and the 'routees' will be used. - *
- * The configuration parameter trumps the constructor arguments. This means that - * if you provide either 'nrOfInstances' or 'routees' during instantiation they will - * be ignored if the router is defined in the configuration file for the actor being used. - * - *

Supervision Setup

- * - * The router creates a “head” actor which supervises and/or monitors the - * routees. Instances are created as children of this actor, hence the - * children are not supervised by the parent of the router. Common choices are - * to always escalate (meaning that fault handling is always applied to all - * children simultaneously; this is the default) or use the parent’s strategy, - * which will result in routed children being treated individually, but it is - * possible as well to use Routers to give different supervisor strategies to - * different groups of children. - * - * @param metricsSelector decides what probability to use for selecting a routee, based - * on remaining capacity as indicated by the node metrics - * @param routees string representation of the actor paths of the routees that will be looked up - * using `actorFor` in [[akka.actor.ActorRefProvider]] - */ -@SerialVersionUID(1L) -case class ClusterLoadBalancingRouter( - metricsSelector: MetricsSelector, - nrOfInstances: Int = 0, routees: Iterable[String] = Nil, - override val resizer: Option[Resizer] = None, - val routerDispatcher: String = Dispatchers.DefaultDispatcherId, - val supervisorStrategy: SupervisorStrategy = ClusterLoadBalancingRouter.defaultSupervisorStrategy) - extends RouterConfig with ClusterLoadBalancingRouterLike { - - /** - * Constructor that sets nrOfInstances to be created. - * Java API - * @param selector the selector is responsible for producing weighted mix of routees from the node metrics - * @param nr number of routees to create - */ - def this(selector: MetricsSelector, nr: Int) = this(metricsSelector = selector, nrOfInstances = nr) - - /** - * Constructor that sets the routees to be used. - * Java API - * @param selector the selector is responsible for producing weighted mix of routees from the node metrics - * @param routeePaths string representation of the actor paths of the routees that will be looked up - * using `actorFor` in [[akka.actor.ActorRefProvider]] - */ - def this(selector: MetricsSelector, routeePaths: java.lang.Iterable[String]) = - this(metricsSelector = selector, routees = routeePaths.asScala) - - /** - * Constructor that sets the resizer to be used. - * Java API - * @param selector the selector is responsible for producing weighted mix of routees from the node metrics - */ - def this(selector: MetricsSelector, resizer: Resizer) = - this(metricsSelector = selector, resizer = Some(resizer)) - - /** - * Java API for setting routerDispatcher - */ - def withDispatcher(dispatcherId: String): ClusterLoadBalancingRouter = - copy(routerDispatcher = dispatcherId) - - /** - * Java API for setting the supervisor strategy to be used for the “head” - * Router actor. - */ - def withSupervisorStrategy(strategy: SupervisorStrategy): ClusterLoadBalancingRouter = - copy(supervisorStrategy = strategy) - -} - -/** - * INTERNAL API. - * - * This strategy is a metrics-aware router which performs load balancing of - * cluster nodes based on cluster metric data. It consumes [[akka.cluster.ClusterMetricsChanged]] - * events and the [[akka.cluster.routing.MetricsSelector]] creates an mix of - * weighted routees based on the node metrics. Messages are routed randomly to the - * weighted routees, i.e. nodes with lower load are more likely to be used than nodes with - * higher load - */ -trait ClusterLoadBalancingRouterLike { this: RouterConfig ⇒ - - def metricsSelector: MetricsSelector - - def nrOfInstances: Int - - def routees: Iterable[String] - - def routerDispatcher: String - - override def createRoute(routeeProvider: RouteeProvider): Route = { - if (resizer.isEmpty) { - if (routees.isEmpty) routeeProvider.createRoutees(nrOfInstances) - else routeeProvider.registerRouteesFor(routees) - } - - val log = Logging(routeeProvider.context.system, routeeProvider.context.self) - - // Function that points to the routees to use, starts with the plain routees - // of the routeeProvider and then changes to the current weighted routees - // produced by the metricsSelector. The reason for using a function is that - // routeeProvider.routees can change. - @volatile var weightedRoutees: () ⇒ IndexedSeq[ActorRef] = () ⇒ routeeProvider.routees - - // subscribe to ClusterMetricsChanged and update weightedRoutees - val metricsListener = routeeProvider.context.actorOf(Props(new Actor { - - val cluster = Cluster(routeeProvider.context.system) - - override def preStart(): Unit = cluster.subscribe(self, classOf[ClusterMetricsChanged]) - override def postStop(): Unit = cluster.unsubscribe(self) - - def receive = { - case ClusterMetricsChanged(metrics) ⇒ receiveMetrics(metrics) - case _: CurrentClusterState ⇒ // ignore - } - - def receiveMetrics(metrics: Set[NodeMetrics]): Unit = { - val routees = metricsSelector.weightedRefs(routeeProvider.routees, cluster.selfAddress, metrics) - weightedRoutees = () ⇒ routees - } - - }).withDispatcher(routerDispatcher), name = "metricsListener") - - def getNext(): ActorRef = { - val currentRoutees = weightedRoutees.apply - if (currentRoutees.isEmpty) routeeProvider.context.system.deadLetters - else currentRoutees(ThreadLocalRandom.current.nextInt(currentRoutees.size)) - } - - { - case (sender, message) ⇒ - message match { - case Broadcast(msg) ⇒ toAll(sender, routeeProvider.routees) - case msg ⇒ List(Destination(sender, getNext())) - } - } - } -} - -/** - * MetricsSelector that uses the heap metrics. - * Low heap capacity => lower weight. - */ -@SerialVersionUID(1L) -case object HeapMetricsSelector extends MetricsSelector { - /** - * Java API: get the singleton instance - */ - def getInstance = this - - override def capacity(nodeMetrics: Set[NodeMetrics]): Map[Address, Double] = { - nodeMetrics.map { n ⇒ - val (used, committed, max) = MetricValues.unapply(n.heapMemory) - val capacity = max match { - case None ⇒ (committed - used).toDouble / committed - case Some(m) ⇒ (m - used).toDouble / m - } - (n.address, capacity) - }.toMap - } -} - -// FIXME implement more MetricsSelectors, such as CpuMetricsSelector, -// LoadAverageMetricsSelector, NetworkMetricsSelector. -// Also a CompositeMetricsSelector which uses a mix of other -// selectors. - -/** - * A MetricsSelector is responsible for producing weighted mix of routees - * from the node metrics. The weights are typically proportional to the - * remaining capacity. - */ -abstract class MetricsSelector { - - /** - * Remaining capacity for each node. The value is between - * 0.0 and 1.0, where 0.0 means no remaining capacity (full - * utilization) and 1.0 means full remaining capacity (zero - * utilization). - */ - def capacity(nodeMetrics: Set[NodeMetrics]): Map[Address, Double] - - /** - * Converts the capacity values to weights. The node with lowest - * capacity gets weight 1 (lowest usable capacity is 1%) and other - * nodes gets weights proportional to their capacity compared to - * the node with lowest capacity. - */ - def weights(capacity: Map[Address, Double]): Map[Address, Int] = { - if (capacity.isEmpty) Map.empty[Address, Int] - else { - val (_, min) = capacity.minBy { case (_, c) ⇒ c } - // lowest usable capacity is 1% (>= 0.5% will be rounded to weight 1), also avoids div by zero - val divisor = math.max(0.01, min) - capacity mapValues { c ⇒ math.round((c) / divisor).toInt } - } - } - - /** - * Allocates a list of actor refs according to the weight of their node, i.e. - * weight 3 of node A will allocate 3 slots for each ref with address A. - */ - def weightedRefs(refs: IndexedSeq[ActorRef], selfAddress: Address, weights: Map[Address, Int]): IndexedSeq[ActorRef] = { - def fullAddress(actorRef: ActorRef): Address = actorRef.path.address match { - case Address(_, _, None, None) ⇒ selfAddress - case a ⇒ a - } - - val w = weights.withDefaultValue(1) - refs.foldLeft(IndexedSeq.empty[ActorRef]) { (acc, ref) ⇒ - acc ++ IndexedSeq.fill(w(fullAddress(ref)))(ref) - } - } - - /** - * Combines the different pieces to allocate a list of weighted actor refs - * based on the node metrics. - */ - def weightedRefs(refs: IndexedSeq[ActorRef], selfAddress: Address, nodeMetrics: Set[NodeMetrics]): IndexedSeq[ActorRef] = - weightedRefs(refs, selfAddress, weights(capacity(nodeMetrics))) -} \ No newline at end of file diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterMetricsSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterMetricsSpec.scala index aa7c10b1ed..6712502312 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterMetricsSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/ClusterMetricsSpec.scala @@ -28,7 +28,7 @@ class ClusterMetricsMultiJvmNode3 extends ClusterMetricsSpec class ClusterMetricsMultiJvmNode4 extends ClusterMetricsSpec class ClusterMetricsMultiJvmNode5 extends ClusterMetricsSpec -abstract class ClusterMetricsSpec extends MultiNodeSpec(ClusterMetricsMultiJvmSpec) with MultiNodeClusterSpec with MetricSpec { +abstract class ClusterMetricsSpec extends MultiNodeSpec(ClusterMetricsMultiJvmSpec) with MultiNodeClusterSpec { import ClusterMetricsMultiJvmSpec._ def isSigar(collector: MetricsCollector): Boolean = collector.isInstanceOf[SigarMetricsCollector] diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterLoadBalancingRouterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/AdaptiveLoadBalancingRouterSpec.scala similarity index 63% rename from akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterLoadBalancingRouterSpec.scala rename to akka-cluster/src/multi-jvm/scala/akka/cluster/routing/AdaptiveLoadBalancingRouterSpec.scala index 028693f04c..79143a6b4c 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/ClusterLoadBalancingRouterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/AdaptiveLoadBalancingRouterSpec.scala @@ -5,21 +5,25 @@ package akka.cluster.routing import language.postfixOps -import scala.concurrent.duration._ import java.lang.management.ManagementFactory -import akka.remote.testkit.{ MultiNodeSpec, MultiNodeConfig } -import akka.testkit.{ LongRunningTest, DefaultTimeout, ImplicitSender } -import akka.actor._ -import akka.cluster.{ MemberStatus, MultiNodeClusterSpec } import scala.concurrent.Await -import akka.routing.RouterRoutees -import akka.pattern.ask -import akka.routing.CurrentRoutees -import akka.cluster.Cluster +import scala.concurrent.duration._ import scala.concurrent.forkjoin.ThreadLocalRandom +import com.typesafe.config.Config import com.typesafe.config.ConfigFactory -object ClusterLoadBalancingRouterMultiJvmSpec extends MultiNodeConfig { +import akka.actor._ +import akka.cluster.Cluster +import akka.cluster.MultiNodeClusterSpec +import akka.cluster.NodeMetrics +import akka.pattern.ask +import akka.remote.testkit.{ MultiNodeSpec, MultiNodeConfig } +import akka.routing.CurrentRoutees +import akka.routing.FromConfig +import akka.routing.RouterRoutees +import akka.testkit.{ LongRunningTest, DefaultTimeout, ImplicitSender } + +object AdaptiveLoadBalancingRouterMultiJvmSpec extends MultiNodeConfig { class Routee extends Actor { var usedMemory: Array[Byte] = _ @@ -51,18 +55,38 @@ object ClusterLoadBalancingRouterMultiJvmSpec extends MultiNodeConfig { commonConfig(debugConfig(on = false).withFallback(ConfigFactory.parseString(""" akka.cluster.metrics.collect-interval = 1s akka.cluster.metrics.gossip-interval = 1s + akka.actor.deployment { + /router3 = { + router = adaptive + metrics-selector = cpu + nr-of-instances = 9 + } + /router4 = { + router = adaptive + metrics-selector = "akka.cluster.routing.TestCustomMetricsSelector" + nr-of-instances = 10 + cluster { + enabled = on + max-nr-of-instances-per-node = 2 + } + } + } """)).withFallback(MultiNodeClusterSpec.clusterConfig)) } -class ClusterLoadBalancingRouterMultiJvmNode1 extends ClusterLoadBalancingRouterSpec -class ClusterLoadBalancingRouterMultiJvmNode2 extends ClusterLoadBalancingRouterSpec -class ClusterLoadBalancingRouterMultiJvmNode3 extends ClusterLoadBalancingRouterSpec +class TestCustomMetricsSelector(config: Config) extends MetricsSelector { + override def weights(nodeMetrics: Set[NodeMetrics]): Map[Address, Int] = Map.empty +} -abstract class ClusterLoadBalancingRouterSpec extends MultiNodeSpec(ClusterLoadBalancingRouterMultiJvmSpec) +class AdaptiveLoadBalancingRouterMultiJvmNode1 extends AdaptiveLoadBalancingRouterSpec +class AdaptiveLoadBalancingRouterMultiJvmNode2 extends AdaptiveLoadBalancingRouterSpec +class AdaptiveLoadBalancingRouterMultiJvmNode3 extends AdaptiveLoadBalancingRouterSpec + +abstract class AdaptiveLoadBalancingRouterSpec extends MultiNodeSpec(AdaptiveLoadBalancingRouterMultiJvmSpec) with MultiNodeClusterSpec with ImplicitSender with DefaultTimeout { - import ClusterLoadBalancingRouterMultiJvmSpec._ + import AdaptiveLoadBalancingRouterMultiJvmSpec._ def currentRoutees(router: ActorRef) = Await.result(router ? CurrentRoutees, remaining).asInstanceOf[RouterRoutees].routees @@ -86,7 +110,7 @@ abstract class ClusterLoadBalancingRouterSpec extends MultiNodeSpec(ClusterLoadB def startRouter(name: String): ActorRef = { val router = system.actorOf(Props[Routee].withRouter(ClusterRouterConfig( - local = ClusterLoadBalancingRouter(HeapMetricsSelector), + local = AdaptiveLoadBalancingRouter(HeapMetricsSelector), settings = ClusterRouterSettings(totalInstances = 10, maxInstancesPerNode = 1))), name) awaitCond { // it may take some time until router receives cluster member events @@ -96,7 +120,7 @@ abstract class ClusterLoadBalancingRouterSpec extends MultiNodeSpec(ClusterLoadB router } - "A cluster with a ClusterLoadBalancingRouter" must { + "A cluster with a AdaptiveLoadBalancingRouter" must { "start cluster nodes" taggedAs LongRunningTest in { awaitClusterUp(roles: _*) enterBarrier("after-1") @@ -112,6 +136,7 @@ abstract class ClusterLoadBalancingRouterSpec extends MultiNodeSpec(ClusterLoadB val iterationCount = 100 for (i ← 0 until iterationCount) { router1 ! "hit" + // wait a while between each message, since metrics is collected periodically Thread.sleep(10) } @@ -146,6 +171,7 @@ abstract class ClusterLoadBalancingRouterSpec extends MultiNodeSpec(ClusterLoadB val iterationCount = 100 for (i ← 0 until iterationCount) { router2 ! "hit" + // wait a while between each message, since metrics is collected periodically Thread.sleep(10) } @@ -158,5 +184,30 @@ abstract class ClusterLoadBalancingRouterSpec extends MultiNodeSpec(ClusterLoadB enterBarrier("after-3") } + + "create routees from configuration" taggedAs LongRunningTest in { + runOn(first) { + val router3 = system.actorOf(Props[Memory].withRouter(FromConfig()), "router3") + awaitCond { + // it may take some time until router receives cluster member events + currentRoutees(router3).size == 9 + } + currentRoutees(router3).map(fullAddress).toSet must be(Set(address(first))) + } + enterBarrier("after-4") + } + + "create routees from cluster.enabled configuration" taggedAs LongRunningTest in { + runOn(first) { + val router4 = system.actorOf(Props[Memory].withRouter(FromConfig()), "router4") + awaitCond { + // it may take some time until router receives cluster member events + currentRoutees(router4).size == 6 + } + currentRoutees(router4).map(fullAddress).toSet must be(Set( + address(first), address(second), address(third))) + } + enterBarrier("after-5") + } } } diff --git a/akka-cluster/src/test/scala/akka/cluster/ClusterConfigSpec.scala b/akka-cluster/src/test/scala/akka/cluster/ClusterConfigSpec.scala index 34513076c0..547cfb8211 100644 --- a/akka-cluster/src/test/scala/akka/cluster/ClusterConfigSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/ClusterConfigSpec.scala @@ -47,10 +47,10 @@ class ClusterConfigSpec extends AkkaSpec { callTimeout = 2 seconds, resetTimeout = 30 seconds)) MetricsEnabled must be(true) - MetricsCollectorClass must be("akka.cluster.SigarMetricsCollector") + MetricsCollectorClass must be(classOf[SigarMetricsCollector].getName) MetricsInterval must be(3 seconds) MetricsGossipInterval must be(3 seconds) - MetricsRateOfDecay must be(10) + MetricsDecayHalfLifeDuration must be(12 seconds) } } } diff --git a/akka-cluster/src/test/scala/akka/cluster/DataStreamSpec.scala b/akka-cluster/src/test/scala/akka/cluster/DataStreamSpec.scala deleted file mode 100644 index f6519f000f..0000000000 --- a/akka-cluster/src/test/scala/akka/cluster/DataStreamSpec.scala +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2009-2012 Typesafe Inc. - */ - -package akka.cluster - -import language.postfixOps -import scala.concurrent.duration._ -import akka.testkit.{ LongRunningTest, AkkaSpec } -import scala.concurrent.forkjoin.ThreadLocalRandom -import System.currentTimeMillis - -@org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class DataStreamSpec extends AkkaSpec(MetricsEnabledSpec.config) with MetricSpec with MetricsCollectorFactory { - import system.dispatcher - - val collector = createMetricsCollector - - "DataStream" must { - - "calcualate same ewma for constant values" in { - val ds = DataStream(decay = 5, ewma = 100.0, currentTimeMillis, currentTimeMillis) :+ - 100.0 :+ 100.0 :+ 100.0 - ds.ewma must be(100.0 plusOrMinus 0.001) - } - - "calcualate correct ewma for normal decay" in { - val d0 = DataStream(decay = 10, ewma = 1000.0, currentTimeMillis, currentTimeMillis) - d0.ewma must be(1000.0 plusOrMinus 0.01) - val d1 = d0 :+ 10.0 - d1.ewma must be(820.0 plusOrMinus 0.01) - val d2 = d1 :+ 10.0 - d2.ewma must be(672.73 plusOrMinus 0.01) - val d3 = d2 :+ 10.0 - d3.ewma must be(552.23 plusOrMinus 0.01) - val d4 = d3 :+ 10.0 - d4.ewma must be(453.64 plusOrMinus 0.01) - - val dn = (1 to 100).foldLeft(d0)((d, _) ⇒ d :+ 10.0) - dn.ewma must be(10.0 plusOrMinus 0.1) - } - - "calculate ewma for decay 1" in { - val d0 = DataStream(decay = 1, ewma = 100.0, currentTimeMillis, currentTimeMillis) - d0.ewma must be(100.0 plusOrMinus 0.01) - val d1 = d0 :+ 1.0 - d1.ewma must be(1.0 plusOrMinus 0.01) - val d2 = d1 :+ 57.0 - d2.ewma must be(57.0 plusOrMinus 0.01) - val d3 = d2 :+ 10.0 - d3.ewma must be(10.0 plusOrMinus 0.01) - } - - "calculate the ewma for multiple, variable, data streams" taggedAs LongRunningTest in { - var streamingDataSet = Map.empty[String, Metric] - var usedMemory = Array.empty[Byte] - (1 to 50) foreach { _ ⇒ - Thread.sleep(100) - usedMemory = usedMemory ++ Array.fill(1024)(ThreadLocalRandom.current.nextInt(127).toByte) - val changes = collector.sample.metrics.flatMap { latest ⇒ - streamingDataSet.get(latest.name) match { - case None ⇒ Some(latest) - case Some(previous) ⇒ - if (latest.average.isDefined && latest.isDefined && latest.value.get != previous.value.get) { - val updated = previous :+ latest - updated.average.isDefined must be(true) - val updatedAverage = updated.average.get - updatedAverage.timestamp must be > (previous.average.get.timestamp) - updatedAverage.duration.length must be > (previous.average.get.duration.length) - updatedAverage.ewma must not be (previous.average.get.ewma) - (previous.value.get.longValue compare latest.value.get.longValue) must be( - previous.average.get.ewma.longValue compare updatedAverage.ewma.longValue) - Some(updated) - } else None - } - } - streamingDataSet ++= changes.map(m ⇒ m.name -> m).toMap - } - } - } -} diff --git a/akka-cluster/src/test/scala/akka/cluster/EWMASpec.scala b/akka-cluster/src/test/scala/akka/cluster/EWMASpec.scala new file mode 100644 index 0000000000..760f64206f --- /dev/null +++ b/akka-cluster/src/test/scala/akka/cluster/EWMASpec.scala @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2009-2012 Typesafe Inc. + */ + +package akka.cluster + +import language.postfixOps +import scala.concurrent.duration._ +import akka.testkit.{ LongRunningTest, AkkaSpec } +import scala.concurrent.forkjoin.ThreadLocalRandom + +@org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) +class EWMASpec extends AkkaSpec(MetricsEnabledSpec.config) with MetricsCollectorFactory { + import system.dispatcher + + val collector = createMetricsCollector + + "DataStream" must { + + "calcualate same ewma for constant values" in { + val ds = EWMA(value = 100.0, alpha = 0.18) :+ + 100.0 :+ 100.0 :+ 100.0 + ds.value must be(100.0 plusOrMinus 0.001) + } + + "calcualate correct ewma for normal decay" in { + val d0 = EWMA(value = 1000.0, alpha = 2.0 / (1 + 10)) + d0.value must be(1000.0 plusOrMinus 0.01) + val d1 = d0 :+ 10.0 + d1.value must be(820.0 plusOrMinus 0.01) + val d2 = d1 :+ 10.0 + d2.value must be(672.73 plusOrMinus 0.01) + val d3 = d2 :+ 10.0 + d3.value must be(552.23 plusOrMinus 0.01) + val d4 = d3 :+ 10.0 + d4.value must be(453.64 plusOrMinus 0.01) + + val dn = (1 to 100).foldLeft(d0)((d, _) ⇒ d :+ 10.0) + dn.value must be(10.0 plusOrMinus 0.1) + } + + "calculate ewma for alpha 1.0, max bias towards latest value" in { + val d0 = EWMA(value = 100.0, alpha = 1.0) + d0.value must be(100.0 plusOrMinus 0.01) + val d1 = d0 :+ 1.0 + d1.value must be(1.0 plusOrMinus 0.01) + val d2 = d1 :+ 57.0 + d2.value must be(57.0 plusOrMinus 0.01) + val d3 = d2 :+ 10.0 + d3.value must be(10.0 plusOrMinus 0.01) + } + + "calculate alpha from half-life and collect interval" in { + // according to http://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average + val expectedAlpha = 0.1 + // alpha = 2.0 / (1 + N) + val n = 19 + val halfLife = n.toDouble / 2.8854 + val collectInterval = 1.second + val halfLifeDuration = (halfLife * 1000).millis + EWMA.alpha(halfLifeDuration, collectInterval) must be(expectedAlpha plusOrMinus 0.001) + } + + "calculate sane alpha from short half-life" in { + val alpha = EWMA.alpha(1.millis, 3.seconds) + alpha must be <= (1.0) + alpha must be >= (0.0) + alpha must be(1.0 plusOrMinus 0.001) + } + + "calculate sane alpha from long half-life" in { + val alpha = EWMA.alpha(1.day, 3.seconds) + alpha must be <= (1.0) + alpha must be >= (0.0) + alpha must be(0.0 plusOrMinus 0.001) + } + + "calculate the ewma for multiple, variable, data streams" taggedAs LongRunningTest in { + var streamingDataSet = Map.empty[String, Metric] + var usedMemory = Array.empty[Byte] + (1 to 50) foreach { _ ⇒ + // wait a while between each message to give the metrics a chance to change + Thread.sleep(100) + usedMemory = usedMemory ++ Array.fill(1024)(ThreadLocalRandom.current.nextInt(127).toByte) + val changes = collector.sample.metrics.flatMap { latest ⇒ + streamingDataSet.get(latest.name) match { + case None ⇒ Some(latest) + case Some(previous) ⇒ + if (latest.isSmooth && latest.value != previous.value) { + val updated = previous :+ latest + updated.isSmooth must be(true) + updated.smoothValue must not be (previous.smoothValue) + Some(updated) + } else None + } + } + streamingDataSet ++= changes.map(m ⇒ m.name -> m).toMap + } + } + } +} diff --git a/akka-cluster/src/test/scala/akka/cluster/MetricNumericConverterSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricNumericConverterSpec.scala index f866056d9f..e20e670879 100644 --- a/akka-cluster/src/test/scala/akka/cluster/MetricNumericConverterSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/MetricNumericConverterSpec.scala @@ -5,10 +5,11 @@ package akka.cluster import akka.testkit.{ ImplicitSender, AkkaSpec } -import akka.cluster.NodeMetrics.MetricValues._ +import akka.cluster.StandardMetrics.HeapMemory.Fields._ +import scala.util.Try @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class MetricNumericConverterSpec extends AkkaSpec(MetricsEnabledSpec.config) with MetricNumericConverter with ImplicitSender with MetricSpec +class MetricNumericConverterSpec extends AkkaSpec(MetricsEnabledSpec.config) with MetricNumericConverter with ImplicitSender with MetricsCollectorFactory { "MetricNumericConverter" must { @@ -22,26 +23,17 @@ class MetricNumericConverterSpec extends AkkaSpec(MetricsEnabledSpec.config) wit } "define a new metric" in { - val metric = Metric(HeapMemoryUsed, Some(256L), decay = Some(10)) + val Some(metric) = Metric.create(HeapMemoryUsed, 256L, decayFactor = Some(0.18)) metric.name must be(HeapMemoryUsed) - metric.isDefined must be(true) - metric.value must be(Some(256L)) - metric.average.isDefined must be(true) - metric.average.get.ewma must be(256L) - - collector match { - case c: SigarMetricsCollector ⇒ - val cores = c.totalCores - cores.isDefined must be(true) - cores.value.get.intValue must be > (0) - case _ ⇒ - } + metric.value must be(256L) + metric.isSmooth must be(true) + metric.smoothValue must be(256.0 plusOrMinus 0.0001) } "define an undefined value with a None " in { - Metric("x", Some(-1), None).value.isDefined must be(false) - Metric("x", Some(java.lang.Double.NaN), None).value.isDefined must be(false) - Metric("x", None, None).isDefined must be(false) + Metric.create("x", -1, None).isDefined must be(false) + Metric.create("x", java.lang.Double.NaN, None).isDefined must be(false) + Metric.create("x", Try(throw new RuntimeException), None).isDefined must be(false) } "recognize whether a metric value is defined" in { diff --git a/akka-cluster/src/test/scala/akka/cluster/MetricValuesSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricValuesSpec.scala index 5910d0510f..b174375ece 100644 --- a/akka-cluster/src/test/scala/akka/cluster/MetricValuesSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/MetricValuesSpec.scala @@ -6,75 +6,69 @@ package akka.cluster import scala.util.Try import akka.actor.Address -import akka.cluster.NodeMetrics.MetricValues._ import akka.testkit.AkkaSpec +import akka.cluster.StandardMetrics.HeapMemory +import akka.cluster.StandardMetrics.Cpu @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class MetricValuesSpec extends AkkaSpec(MetricsEnabledSpec.config) with MetricSpec - with MetricsCollectorFactory { - import NodeMetrics._ +class MetricValuesSpec extends AkkaSpec(MetricsEnabledSpec.config) with MetricsCollectorFactory { val collector = createMetricsCollector val node1 = NodeMetrics(Address("akka", "sys", "a", 2554), 1, collector.sample.metrics) val node2 = NodeMetrics(Address("akka", "sys", "a", 2555), 1, collector.sample.metrics) - var nodes: Seq[NodeMetrics] = Seq(node1, node2) - - // work up the data streams where applicable - for (i ← 1 to 100) { - nodes = nodes map { - n ⇒ + val nodes: Seq[NodeMetrics] = { + var nodes = Seq(node1, node2) + // work up the data streams where applicable + for (i ← 1 to 100) { + nodes = nodes map { n ⇒ n.copy(metrics = collector.sample.metrics.flatMap(latest ⇒ n.metrics.collect { - case streaming if latest same streaming ⇒ - streaming.average match { - case Some(e) ⇒ streaming.copy(value = latest.value, average = - if (latest.isDefined) Some(e :+ latest.value.get.doubleValue) else None) - case None ⇒ streaming.copy(value = latest.value) - } + case streaming if latest sameAs streaming ⇒ streaming :+ latest })) + } } + nodes } "NodeMetrics.MetricValues" must { "extract expected metrics for load balancing" in { - val stream1 = node2.metric(HeapMemoryCommitted).value.get.longValue - val stream2 = node1.metric(HeapMemoryUsed).value.get.longValue + import HeapMemory.Fields._ + val stream1 = node2.metric(HeapMemoryCommitted).get.value.longValue + val stream2 = node1.metric(HeapMemoryUsed).get.value.longValue stream1 must be >= (stream2) } "extract expected MetricValue types for load balancing" in { - nodes foreach { - node ⇒ - val (used, committed, max) = MetricValues.unapply(node.heapMemory) - committed must be >= (used) - max match { - case Some(m) ⇒ - used must be <= (m) - committed must be <= (m) - case None ⇒ - used must be > (0L) - committed must be > (0L) - } + nodes foreach { node ⇒ + node match { + case HeapMemory(address, _, used, committed, Some(max)) ⇒ + committed must be >= (used) + used must be <= (max) + committed must be <= (max) + // extract is the java api + StandardMetrics.extractHeapMemory(node) must not be (null) + case HeapMemory(address, _, used, committed, None) ⇒ + used must be > (0L) + committed must be > (0L) + // extract is the java api + StandardMetrics.extractCpu(node) must not be (null) + case _ ⇒ fail("no heap") + } - val network = MetricValues.unapply(node.networkLatency) - if (network.isDefined) { - network.get._1 must be > (0L) - network.get._2 must be > (0L) - } - - val (systemLoadAverage, processors, combinedCpu, cores) = MetricValues.unapply(node.cpu) - processors must be > (0) - if (systemLoadAverage.isDefined) - systemLoadAverage.get must be >= (0.0) - if (combinedCpu.isDefined) { - combinedCpu.get must be <= (1.0) - combinedCpu.get must be >= (0.0) - } - if (cores.isDefined) { - cores.get must be > (0) - cores.get must be >= (processors) - } + node match { + case Cpu(address, _, systemLoadAverageOption, cpuCombinedOption, processors) ⇒ + processors must be > (0) + if (systemLoadAverageOption.isDefined) + systemLoadAverageOption.get must be >= (0.0) + if (cpuCombinedOption.isDefined) { + cpuCombinedOption.get must be <= (1.0) + cpuCombinedOption.get must be >= (0.0) + } + // extract is the java api + StandardMetrics.extractCpu(node) must not be (null) + case _ ⇒ fail("no cpu") + } } } } diff --git a/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala index ad836bf5f7..55c57b9775 100644 --- a/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala @@ -1,4 +1,5 @@ /* + * Copyright (C) 2009-2012 Typesafe Inc. */ @@ -11,7 +12,8 @@ import scala.util.{ Success, Try, Failure } import akka.actor._ import akka.testkit._ -import akka.cluster.NodeMetrics.MetricValues._ +import akka.cluster.StandardMetrics.HeapMemory.Fields._ +import akka.cluster.StandardMetrics.Cpu.Fields._ import org.scalatest.WordSpec import org.scalatest.matchers.MustMatchers @@ -20,14 +22,12 @@ object MetricsEnabledSpec { akka.cluster.metrics.enabled = on akka.cluster.metrics.collect-interval = 1 s akka.cluster.metrics.gossip-interval = 1 s - akka.cluster.metrics.rate-of-decay = 10 akka.actor.provider = "akka.remote.RemoteActorRefProvider" """ } @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class MetricsCollectorSpec extends AkkaSpec(MetricsEnabledSpec.config) with ImplicitSender with MetricSpec - with MetricsCollectorFactory { +class MetricsCollectorSpec extends AkkaSpec(MetricsEnabledSpec.config) with ImplicitSender with MetricsCollectorFactory { import system.dispatcher val collector = createMetricsCollector @@ -38,25 +38,25 @@ class MetricsCollectorSpec extends AkkaSpec(MetricsEnabledSpec.config) with Impl for (i ← 1 to 20) { val sample1 = collector.sample.metrics val sample2 = collector.sample.metrics - var merged = sample2 flatMap (latest ⇒ sample1 collect { - case peer if latest same peer ⇒ { + val merged12 = sample2 flatMap (latest ⇒ sample1 collect { + case peer if latest sameAs peer ⇒ { val m = peer :+ latest - assertMerged(latest, peer, m) + m.value must be(latest.value) + m.isSmooth must be(peer.isSmooth || latest.isSmooth) m } }) val sample3 = collector.sample.metrics val sample4 = collector.sample.metrics - merged = sample4 flatMap (latest ⇒ sample3 collect { - case peer if latest same peer ⇒ { + val merged34 = sample4 flatMap (latest ⇒ sample3 collect { + case peer if latest sameAs peer ⇒ { val m = peer :+ latest - assertMerged(latest, peer, m) + m.value must be(latest.value) + m.isSmooth must be(peer.isSmooth || latest.isSmooth) m } }) - merged.size must be(sample3.size) - merged.size must be(sample4.size) } } } @@ -69,13 +69,10 @@ class MetricsCollectorSpec extends AkkaSpec(MetricsEnabledSpec.config) with Impl "collect accurate metrics for a node" in { val sample = collector.sample - val metrics = sample.metrics.collect { case m if m.isDefined ⇒ (m.name, m.value.get) } + val metrics = sample.metrics.collect { case m ⇒ (m.name, m.value) } val used = metrics collectFirst { case (HeapMemoryUsed, b) ⇒ b } val committed = metrics collectFirst { case (HeapMemoryCommitted, b) ⇒ b } metrics foreach { - case (TotalCores, b) ⇒ b.intValue must be > (0) - case (NetworkInboundRate, b) ⇒ b.longValue must be > (0L) - case (NetworkOutboundRate, b) ⇒ b.longValue must be > (0L) case (SystemLoadAverage, b) ⇒ b.doubleValue must be >= (0.0) case (Processors, b) ⇒ b.intValue must be >= (0) case (HeapMemoryUsed, b) ⇒ b.longValue must be >= (0L) @@ -91,25 +88,14 @@ class MetricsCollectorSpec extends AkkaSpec(MetricsEnabledSpec.config) with Impl } } - "collect SIGAR metrics if it is on the classpath" in { - collector match { - case c: SigarMetricsCollector ⇒ - // combined cpu may or may not be defined on a given sampling - // systemLoadAverage is not present on all platforms - c.networkMaxRx.isDefined must be(true) - c.networkMaxTx.isDefined must be(true) - c.totalCores.isDefined must be(true) - case _ ⇒ - } - } - "collect JMX metrics" in { // heap max may be undefined depending on the OS // systemLoadAverage is JMX when SIGAR not present, but // it's not present on all platforms val c = collector.asInstanceOf[JmxMetricsCollector] - c.heapUsed.isDefined must be(true) - c.heapCommitted.isDefined must be(true) + val heap = c.heapMemoryUsage + c.heapUsed(heap).isDefined must be(true) + c.heapCommitted(heap).isDefined must be(true) c.processors.isDefined must be(true) } @@ -123,47 +109,6 @@ class MetricsCollectorSpec extends AkkaSpec(MetricsEnabledSpec.config) with Impl } } -trait MetricSpec extends WordSpec with MustMatchers { this: { def system: ActorSystem } ⇒ - - def assertMasterMetricsAgainstGossipMetrics(master: Set[NodeMetrics], gossip: MetricsGossip): Unit = { - val masterMetrics = collectNodeMetrics(master) - val gossipMetrics = collectNodeMetrics(gossip.nodes) - gossipMetrics.size must be(masterMetrics.size plusOrMinus 1) // combined cpu - } - - def assertExpectedNodeAddresses(gossip: MetricsGossip, nodes: Set[NodeMetrics]): Unit = - gossip.nodes.map(_.address) must be(nodes.map(_.address)) - - def assertMerged(latest: Metric, peer: Metric, merged: Metric): Unit = if (latest same peer) { - if (latest.isDefined) { - if (peer.isDefined) { - merged.isDefined must be(true) - merged.value.get must be(latest.value.get) - merged.average.isDefined must be(latest.average.isDefined) - } else { - merged.isDefined must be(true) - merged.value.get must be(latest.value.get) - merged.average.isDefined must be(latest.average.isDefined || peer.average.isDefined) - } - } else { - if (peer.isDefined) { - merged.isDefined must be(true) - merged.value.get must be(peer.value.get) - merged.average.isDefined must be(peer.average.isDefined) - } else { - merged.isDefined must be(false) - merged.average.isEmpty must be(true) - } - } - } - - def collectNodeMetrics(nodes: Set[NodeMetrics]): Seq[Metric] = { - var r: Seq[Metric] = Seq.empty - nodes.foreach(n ⇒ r ++= n.metrics.filter(_.isDefined)) - r - } -} - /** * Used when testing metrics without full cluster */ @@ -173,15 +118,15 @@ trait MetricsCollectorFactory { this: AkkaSpec ⇒ def selfAddress = extendedActorSystem.provider.rootPath.address - val defaultRateOfDecay = 10 + val defaultDecayFactor = 2.0 / (1 + 10) def createMetricsCollector: MetricsCollector = - Try(new SigarMetricsCollector(selfAddress, defaultRateOfDecay, extendedActorSystem.dynamicAccess)) match { + Try(new SigarMetricsCollector(selfAddress, defaultDecayFactor, + extendedActorSystem.dynamicAccess.createInstanceFor[AnyRef]("org.hyperic.sigar.Sigar", Seq.empty).get)) match { case Success(sigarCollector) ⇒ sigarCollector case Failure(e) ⇒ - log.debug("Metrics will be retreived from MBeans, Sigar failed to load. Reason: " + - e.getMessage) - new JmxMetricsCollector(selfAddress, defaultRateOfDecay) + log.debug("Metrics will be retreived from MBeans, Sigar failed to load. Reason: " + e) + new JmxMetricsCollector(selfAddress, defaultDecayFactor) } def isSigar(collector: MetricsCollector): Boolean = collector.isInstanceOf[SigarMetricsCollector] diff --git a/akka-cluster/src/test/scala/akka/cluster/MetricsGossipSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricsGossipSpec.scala index 3ec10001f2..36470a4725 100644 --- a/akka-cluster/src/test/scala/akka/cluster/MetricsGossipSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/MetricsGossipSpec.scala @@ -12,8 +12,7 @@ import akka.actor.Address import java.lang.System.{ currentTimeMillis ⇒ newTimestamp } @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class MetricsGossipSpec extends AkkaSpec(MetricsEnabledSpec.config) with ImplicitSender with MetricSpec - with MetricsCollectorFactory { +class MetricsGossipSpec extends AkkaSpec(MetricsEnabledSpec.config) with ImplicitSender with MetricsCollectorFactory { val collector = createMetricsCollector @@ -22,82 +21,76 @@ class MetricsGossipSpec extends AkkaSpec(MetricsEnabledSpec.config) with Implici val m1 = NodeMetrics(Address("akka", "sys", "a", 2554), newTimestamp, collector.sample.metrics) val m2 = NodeMetrics(Address("akka", "sys", "a", 2555), newTimestamp, collector.sample.metrics) - var localGossip = MetricsGossip() - localGossip :+= m1 - localGossip.nodes.size must be(1) - localGossip.nodeKeys.size must be(localGossip.nodes.size) - assertMasterMetricsAgainstGossipMetrics(Set(m1), localGossip) - collector.sample.metrics.size must be > (3) + m1.metrics.size must be > (3) + m2.metrics.size must be > (3) - localGossip :+= m2 - localGossip.nodes.size must be(2) - localGossip.nodeKeys.size must be(localGossip.nodes.size) - assertMasterMetricsAgainstGossipMetrics(Set(m1, m2), localGossip) - collector.sample.metrics.size must be > (3) + val g1 = MetricsGossip.empty :+ m1 + g1.nodes.size must be(1) + g1.nodeKeys.size must be(g1.nodes.size) + g1.metricsFor(m1.address).size must be(m1.metrics.size) + + val g2 = g1 :+ m2 + g2.nodes.size must be(2) + g2.nodeKeys.size must be(g2.nodes.size) + g2.metricsFor(m1.address).size must be(m1.metrics.size) + g2.metricsFor(m2.address).size must be(m2.metrics.size) } "merge peer metrics" in { val m1 = NodeMetrics(Address("akka", "sys", "a", 2554), newTimestamp, collector.sample.metrics) val m2 = NodeMetrics(Address("akka", "sys", "a", 2555), newTimestamp, collector.sample.metrics) - var remoteGossip = MetricsGossip() - remoteGossip :+= m1 - remoteGossip :+= m2 - remoteGossip.nodes.size must be(2) - val beforeMergeNodes = remoteGossip.nodes + val g1 = MetricsGossip.empty :+ m1 :+ m2 + g1.nodes.size must be(2) + val beforeMergeNodes = g1.nodes - val m2Updated = m2 copy (metrics = collector.sample.metrics, timestamp = newTimestamp) - remoteGossip :+= m2Updated // merge peers - remoteGossip.nodes.size must be(2) - assertMasterMetricsAgainstGossipMetrics(beforeMergeNodes, remoteGossip) - remoteGossip.nodes.foreach(_.metrics.size must be > (3)) - remoteGossip.nodes collect { case peer if peer.address == m2.address ⇒ peer.timestamp must be(m2Updated.timestamp) } + val m2Updated = m2 copy (metrics = collector.sample.metrics, timestamp = m2.timestamp + 1000) + val g2 = g1 :+ m2Updated // merge peers + g2.nodes.size must be(2) + g2.metricsFor(m1.address).size must be(m1.metrics.size) + g2.metricsFor(m2.address).size must be(m2Updated.metrics.size) + g2.nodes collect { case peer if peer.address == m2.address ⇒ peer.timestamp must be(m2Updated.timestamp) } } "merge an existing metric set for a node and update node ring" in { val m1 = NodeMetrics(Address("akka", "sys", "a", 2554), newTimestamp, collector.sample.metrics) val m2 = NodeMetrics(Address("akka", "sys", "a", 2555), newTimestamp, collector.sample.metrics) val m3 = NodeMetrics(Address("akka", "sys", "a", 2556), newTimestamp, collector.sample.metrics) - val m2Updated = m2 copy (metrics = collector.sample.metrics, timestamp = newTimestamp) + val m2Updated = m2 copy (metrics = collector.sample.metrics, timestamp = m2.timestamp + 1000) - var localGossip = MetricsGossip() - localGossip :+= m1 - localGossip :+= m2 + val g1 = MetricsGossip.empty :+ m1 :+ m2 + val g2 = MetricsGossip.empty :+ m3 :+ m2Updated - var remoteGossip = MetricsGossip() - remoteGossip :+= m3 - remoteGossip :+= m2Updated - - localGossip.nodeKeys.contains(m1.address) must be(true) - remoteGossip.nodeKeys.contains(m3.address) must be(true) + g1.nodeKeys.contains(m1.address) must be(true) + g2.nodeKeys.contains(m3.address) must be(true) // must contain nodes 1,3, and the most recent version of 2 - val mergedGossip = localGossip merge remoteGossip + val mergedGossip = g1 merge g2 mergedGossip.nodes.size must be(3) - assertExpectedNodeAddresses(mergedGossip, Set(m1, m2, m3)) + mergedGossip.metricsFor(m1.address).size must be(m1.metrics.size) + mergedGossip.metricsFor(m2.address).size must be(m2Updated.metrics.size) + mergedGossip.metricsFor(m3.address).size must be(m3.metrics.size) mergedGossip.nodes.foreach(_.metrics.size must be > (3)) mergedGossip.nodes.find(_.address == m2.address).get.timestamp must be(m2Updated.timestamp) } "get the current NodeMetrics if it exists in the local nodes" in { val m1 = NodeMetrics(Address("akka", "sys", "a", 2554), newTimestamp, collector.sample.metrics) - var localGossip = MetricsGossip() - localGossip :+= m1 - localGossip.metricsFor(m1).nonEmpty must be(true) + val g1 = MetricsGossip.empty :+ m1 + g1.metricsFor(m1.address).nonEmpty must be(true) } "remove a node if it is no longer Up" in { val m1 = NodeMetrics(Address("akka", "sys", "a", 2554), newTimestamp, collector.sample.metrics) val m2 = NodeMetrics(Address("akka", "sys", "a", 2555), newTimestamp, collector.sample.metrics) - var localGossip = MetricsGossip() - localGossip :+= m1 - localGossip :+= m2 - - localGossip.nodes.size must be(2) - localGossip = localGossip remove m1.address - localGossip.nodes.size must be(1) - localGossip.nodes.exists(_.address == m1.address) must be(false) + val g1 = MetricsGossip.empty :+ m1 :+ m2 + g1.nodes.size must be(2) + val g2 = g1 remove m1.address + g2.nodes.size must be(1) + g2.nodes.exists(_.address == m1.address) must be(false) + g2.metricsFor(m1.address).size must be(0) + g2.metricsFor(m2.address).size must be(m2.metrics.size) } } } diff --git a/akka-cluster/src/test/scala/akka/cluster/NodeMetricsSpec.scala b/akka-cluster/src/test/scala/akka/cluster/NodeMetricsSpec.scala index d6a47db670..2c62bc5a41 100644 --- a/akka-cluster/src/test/scala/akka/cluster/NodeMetricsSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/NodeMetricsSpec.scala @@ -8,8 +8,7 @@ import akka.testkit.AkkaSpec import akka.actor.Address @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class NodeMetricsSpec extends AkkaSpec with MetricSpec - with MetricsCollectorFactory { +class NodeMetricsSpec extends AkkaSpec with MetricsCollectorFactory { val collector = createMetricsCollector @@ -27,11 +26,11 @@ class NodeMetricsSpec extends AkkaSpec with MetricSpec } "return correct result for 2 'same' nodes" in { - (NodeMetrics(node1, 0) same NodeMetrics(node1, 0)) must be(true) + (NodeMetrics(node1, 0) sameAs NodeMetrics(node1, 0)) must be(true) } "return correct result for 2 not 'same' nodes" in { - (NodeMetrics(node1, 0) same NodeMetrics(node2, 0)) must be(false) + (NodeMetrics(node1, 0) sameAs NodeMetrics(node2, 0)) must be(false) } "merge 2 NodeMetrics by most recent" in { diff --git a/akka-cluster/src/test/scala/akka/cluster/routing/HeapMetricsSelectorSpec.scala b/akka-cluster/src/test/scala/akka/cluster/routing/HeapMetricsSelectorSpec.scala deleted file mode 100644 index 5a8fecc2eb..0000000000 --- a/akka-cluster/src/test/scala/akka/cluster/routing/HeapMetricsSelectorSpec.scala +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) 2009-2012 Typesafe Inc. - */ - -package akka.cluster.routing - -import akka.testkit.AkkaSpec -import akka.actor.Address -import akka.actor.RootActorPath -import akka.cluster.NodeMetrics -import akka.cluster.NodeMetrics.MetricValues._ -import akka.cluster.Metric -import com.typesafe.config.ConfigFactory - -@org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class HeapMetricsSelectorSpec extends AkkaSpec(ConfigFactory.parseString(""" - akka.actor.provider = "akka.cluster.ClusterActorRefProvider" - akka.remote.netty.port = 0 - """)) { - - val selector = HeapMetricsSelector - - val a1 = Address("akka", "sys", "a1", 2551) - val b1 = Address("akka", "sys", "b1", 2551) - val c1 = Address("akka", "sys", "c1", 2551) - val d1 = Address("akka", "sys", "d1", 2551) - - val decay = Some(10) - - val nodeMetricsA = NodeMetrics(a1, System.currentTimeMillis, Set( - Metric(HeapMemoryUsed, Some(BigInt(128)), decay), - Metric(HeapMemoryCommitted, Some(BigInt(256)), decay), - Metric(HeapMemoryMax, Some(BigInt(512)), None))) - - val nodeMetricsB = NodeMetrics(b1, System.currentTimeMillis, Set( - Metric(HeapMemoryUsed, Some(BigInt(256)), decay), - Metric(HeapMemoryCommitted, Some(BigInt(512)), decay), - Metric(HeapMemoryMax, Some(BigInt(1024)), None))) - - val nodeMetricsC = NodeMetrics(c1, System.currentTimeMillis, Set( - Metric(HeapMemoryUsed, Some(BigInt(1024)), decay), - Metric(HeapMemoryCommitted, Some(BigInt(1024)), decay), - Metric(HeapMemoryMax, Some(BigInt(1024)), None))) - - val nodeMetrics = Set(nodeMetricsA, nodeMetricsB, nodeMetricsC) - - "MetricsAwareClusterNodeSelector" must { - - "calculate capacity of heap metrics" in { - val capacity = selector.capacity(nodeMetrics) - capacity(a1) must be(0.75 plusOrMinus 0.0001) - capacity(b1) must be(0.75 plusOrMinus 0.0001) - capacity(c1) must be(0.0 plusOrMinus 0.0001) - } - - "calculate weights from capacity" in { - val capacity = Map(a1 -> 0.6, b1 -> 0.3, c1 -> 0.1) - val weights = selector.weights(capacity) - weights must be(Map(c1 -> 1, b1 -> 3, a1 -> 6)) - } - - "handle low and zero capacity" in { - val capacity = Map(a1 -> 0.0, b1 -> 1.0, c1 -> 0.005, d1 -> 0.004) - val weights = selector.weights(capacity) - weights must be(Map(a1 -> 0, b1 -> 100, c1 -> 1, d1 -> 0)) - } - - "allocate weighted refs" in { - val weights = Map(a1 -> 1, b1 -> 3, c1 -> 10) - val refs = IndexedSeq( - system.actorFor(RootActorPath(a1) / "user" / "a"), - system.actorFor(RootActorPath(b1) / "user" / "b"), - system.actorFor(RootActorPath(c1) / "user" / "c")) - val result = selector.weightedRefs(refs, a1, weights) - val grouped = result.groupBy(_.path.address) - grouped(a1).size must be(1) - grouped(b1).size must be(3) - grouped(c1).size must be(10) - } - - "allocate refs for undefined weight" in { - val weights = Map(a1 -> 1, b1 -> 2) - val refs = IndexedSeq( - system.actorFor(RootActorPath(a1) / "user" / "a"), - system.actorFor(RootActorPath(b1) / "user" / "b"), - system.actorFor(RootActorPath(c1) / "user" / "c")) - val result = selector.weightedRefs(refs, a1, weights) - val grouped = result.groupBy(_.path.address) - grouped(a1).size must be(1) - grouped(b1).size must be(2) - grouped(c1).size must be(1) - } - - "allocate weighted local refs" in { - val weights = Map(a1 -> 2, b1 -> 1, c1 -> 10) - val refs = IndexedSeq( - testActor, - system.actorFor(RootActorPath(b1) / "user" / "b"), - system.actorFor(RootActorPath(c1) / "user" / "c")) - val result = selector.weightedRefs(refs, a1, weights) - result.filter(_ == testActor).size must be(2) - } - - "not allocate ref with weight zero" in { - val weights = Map(a1 -> 0, b1 -> 2, c1 -> 10) - val refs = IndexedSeq( - system.actorFor(RootActorPath(a1) / "user" / "a"), - system.actorFor(RootActorPath(b1) / "user" / "b"), - system.actorFor(RootActorPath(c1) / "user" / "c")) - val result = selector.weightedRefs(refs, a1, weights) - result.filter(_ == refs.head).size must be(0) - } - } -} \ No newline at end of file diff --git a/akka-cluster/src/test/scala/akka/cluster/routing/MetricsSelectorSpec.scala b/akka-cluster/src/test/scala/akka/cluster/routing/MetricsSelectorSpec.scala new file mode 100644 index 0000000000..851152413e --- /dev/null +++ b/akka-cluster/src/test/scala/akka/cluster/routing/MetricsSelectorSpec.scala @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2009-2012 Typesafe Inc. + */ + +package akka.cluster.routing + +import org.scalatest.WordSpec +import org.scalatest.matchers.MustMatchers + +import akka.actor.Address +import akka.cluster.Metric +import akka.cluster.NodeMetrics +import akka.cluster.StandardMetrics.HeapMemory.Fields._ +import akka.cluster.StandardMetrics.Cpu.Fields._ + +@org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) +class MetricsSelectorSpec extends WordSpec with MustMatchers { + + val abstractSelector = new CapacityMetricsSelector { + override def capacity(nodeMetrics: Set[NodeMetrics]): Map[Address, Double] = Map.empty + } + + val a1 = Address("akka", "sys", "a1", 2551) + val b1 = Address("akka", "sys", "b1", 2551) + val c1 = Address("akka", "sys", "c1", 2551) + val d1 = Address("akka", "sys", "d1", 2551) + + val decayFactor = Some(0.18) + + val nodeMetricsA = NodeMetrics(a1, System.currentTimeMillis, Set( + Metric.create(HeapMemoryUsed, 128, decayFactor), + Metric.create(HeapMemoryCommitted, 256, decayFactor), + Metric.create(HeapMemoryMax, 512, None), + Metric.create(CpuCombined, 0.1, decayFactor), + Metric.create(SystemLoadAverage, 0.5, None), + Metric.create(Processors, 8, None)).flatten) + + val nodeMetricsB = NodeMetrics(b1, System.currentTimeMillis, Set( + Metric.create(HeapMemoryUsed, 256, decayFactor), + Metric.create(HeapMemoryCommitted, 512, decayFactor), + Metric.create(HeapMemoryMax, 1024, None), + Metric.create(CpuCombined, 0.5, decayFactor), + Metric.create(SystemLoadAverage, 1.0, None), + Metric.create(Processors, 16, None)).flatten) + + val nodeMetricsC = NodeMetrics(c1, System.currentTimeMillis, Set( + Metric.create(HeapMemoryUsed, 1024, decayFactor), + Metric.create(HeapMemoryCommitted, 1024, decayFactor), + Metric.create(HeapMemoryMax, 1024, None), + Metric.create(CpuCombined, 1.0, decayFactor), + Metric.create(SystemLoadAverage, 16.0, None), + Metric.create(Processors, 16, None)).flatten) + + val nodeMetricsD = NodeMetrics(d1, System.currentTimeMillis, Set( + Metric.create(HeapMemoryUsed, 511, decayFactor), + Metric.create(HeapMemoryCommitted, 512, decayFactor), + Metric.create(HeapMemoryMax, 512, None), + Metric.create(Processors, 2, decayFactor)).flatten) + + val nodeMetrics = Set(nodeMetricsA, nodeMetricsB, nodeMetricsC, nodeMetricsD) + + "CapacityMetricsSelector" must { + + "calculate weights from capacity" in { + val capacity = Map(a1 -> 0.6, b1 -> 0.3, c1 -> 0.1) + val weights = abstractSelector.weights(capacity) + weights must be(Map(c1 -> 1, b1 -> 3, a1 -> 6)) + } + + "handle low and zero capacity" in { + val capacity = Map(a1 -> 0.0, b1 -> 1.0, c1 -> 0.005, d1 -> 0.004) + val weights = abstractSelector.weights(capacity) + weights must be(Map(a1 -> 0, b1 -> 100, c1 -> 1, d1 -> 0)) + } + + } + + "HeapMetricsSelector" must { + "calculate capacity of heap metrics" in { + val capacity = HeapMetricsSelector.capacity(nodeMetrics) + capacity(a1) must be(0.75 plusOrMinus 0.0001) + capacity(b1) must be(0.75 plusOrMinus 0.0001) + capacity(c1) must be(0.0 plusOrMinus 0.0001) + capacity(d1) must be(0.001953125 plusOrMinus 0.0001) + } + } + + "CpuMetricsSelector" must { + "calculate capacity of cpuCombined metrics" in { + val capacity = CpuMetricsSelector.capacity(nodeMetrics) + capacity(a1) must be(0.9 plusOrMinus 0.0001) + capacity(b1) must be(0.5 plusOrMinus 0.0001) + capacity(c1) must be(0.0 plusOrMinus 0.0001) + capacity.contains(d1) must be(false) + } + } + + "SystemLoadAverageMetricsSelector" must { + "calculate capacity of systemLoadAverage metrics" in { + val capacity = SystemLoadAverageMetricsSelector.capacity(nodeMetrics) + capacity(a1) must be(0.9375 plusOrMinus 0.0001) + capacity(b1) must be(0.9375 plusOrMinus 0.0001) + capacity(c1) must be(0.0 plusOrMinus 0.0001) + capacity.contains(d1) must be(false) + } + } + + "MixMetricsSelector" must { + "aggregate capacity of all metrics" in { + val capacity = MixMetricsSelector().capacity(nodeMetrics) + capacity(a1) must be((0.75 + 0.9 + 0.9375) / 3 plusOrMinus 0.0001) + capacity(b1) must be((0.75 + 0.5 + 0.9375) / 3 plusOrMinus 0.0001) + capacity(c1) must be((0.0 + 0.0 + 0.0) / 3 plusOrMinus 0.0001) + capacity(d1) must be((0.001953125) / 1 plusOrMinus 0.0001) + } + } + +} + diff --git a/akka-cluster/src/test/scala/akka/cluster/routing/WeightedRouteesSpec.scala b/akka-cluster/src/test/scala/akka/cluster/routing/WeightedRouteesSpec.scala new file mode 100644 index 0000000000..3b5ad27c9e --- /dev/null +++ b/akka-cluster/src/test/scala/akka/cluster/routing/WeightedRouteesSpec.scala @@ -0,0 +1,84 @@ +/** + * Copyright (C) 2009-2012 Typesafe Inc. + */ + +package akka.cluster.routing + +import com.typesafe.config.ConfigFactory + +import akka.actor.Address +import akka.actor.RootActorPath +import akka.testkit.AkkaSpec + +@org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) +class WeightedRouteesSpec extends AkkaSpec(ConfigFactory.parseString(""" + akka.actor.provider = "akka.cluster.ClusterActorRefProvider" + akka.remote.netty.port = 0 + """)) { + + val a1 = Address("akka", "sys", "a1", 2551) + val b1 = Address("akka", "sys", "b1", 2551) + val c1 = Address("akka", "sys", "c1", 2551) + val d1 = Address("akka", "sys", "d1", 2551) + + val refA = system.actorFor(RootActorPath(a1) / "user" / "a") + val refB = system.actorFor(RootActorPath(b1) / "user" / "b") + val refC = system.actorFor(RootActorPath(c1) / "user" / "c") + + "WeightedRoutees" must { + + "allocate weighted refs" in { + val weights = Map(a1 -> 1, b1 -> 3, c1 -> 10) + val refs = IndexedSeq(refA, refB, refC) + val weighted = new WeightedRoutees(refs, a1, weights) + + weighted(1) must be(refA) + 2 to 4 foreach { weighted(_) must be(refB) } + 5 to 14 foreach { weighted(_) must be(refC) } + weighted.total must be(14) + } + + "check boundaries" in { + val empty = new WeightedRoutees(Vector(), a1, Map.empty) + empty.total must be(0) + val weighted = new WeightedRoutees(IndexedSeq(refA, refB, refC), a1, Map.empty) + weighted.total must be(3) + intercept[IllegalArgumentException] { + weighted(0) + } + intercept[IllegalArgumentException] { + weighted(4) + } + } + + "allocate refs for undefined weight" in { + val weights = Map(a1 -> 1, b1 -> 7) + val refs = IndexedSeq(refA, refB, refC) + val weighted = new WeightedRoutees(refs, a1, weights) + + weighted(1) must be(refA) + 2 to 8 foreach { weighted(_) must be(refB) } + // undefined, uses the mean of the weights, i.e. 4 + 9 to 12 foreach { weighted(_) must be(refC) } + weighted.total must be(12) + } + + "allocate weighted local refs" in { + val weights = Map(a1 -> 2, b1 -> 1, c1 -> 10) + val refs = IndexedSeq(testActor, refB, refC) + val weighted = new WeightedRoutees(refs, a1, weights) + + 1 to 2 foreach { weighted(_) must be(testActor) } + 3 to weighted.total foreach { weighted(_) must not be (testActor) } + } + + "not allocate ref with weight zero" in { + val weights = Map(a1 -> 0, b1 -> 2, c1 -> 10) + val refs = IndexedSeq(refA, refB, refC) + val weighted = new WeightedRoutees(refs, a1, weights) + + 1 to weighted.total foreach { weighted(_) must not be (refA) } + } + + } +} diff --git a/akka-docs/rst/cluster/cluster-usage-java.rst b/akka-docs/rst/cluster/cluster-usage-java.rst index c674bff3a6..b91b3d943d 100644 --- a/akka-docs/rst/cluster/cluster-usage-java.rst +++ b/akka-docs/rst/cluster/cluster-usage-java.rst @@ -38,8 +38,7 @@ Try it out: 1. Add the following ``application.conf`` in your project, place it in ``src/main/resources``: -.. literalinclude:: ../../../akka-samples/akka-sample-cluster/src/main/resources/application.conf - :language: none +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/resources/application.conf#cluster To enable cluster capabilities in your Akka project you should, at a minimum, add the :ref:`remoting-java` settings, but with ``akka.cluster.ClusterActorRefProvider``. @@ -438,6 +437,105 @@ service nodes and 1 client:: .. note:: The above example, especially the last part, will be simplified when the cluster handles automatic actor partitioning. +Cluster Metrics +^^^^^^^^^^^^^^^ + +The member nodes of the cluster collects system health metrics and publish that to other nodes and to +registered subscribers. This information is primarily used for load-balancing of nodes. + +Hyperic Sigar +------------- + +The built-in metrics is gathered from JMX MBeans, and optionally you can use `Hyperic Sigar `_ +for a wider and more accurate range of metrics compared to what can be retrieved from ordinary MBeans. +Sigar is using a native OS library. To enable usage of Sigar you need to add the directory of the native library to +``-Djava.libarary.path=`` add the following dependency:: + + + org.hyperic + sigar + 1.6.4 + + + + +Adaptive Load Balancing +----------------------- + +The ``AdaptiveLoadBalancingRouter`` performs load balancing of messages to cluster nodes based on the cluster metrics data. +It uses random selection of routees with probabilities derived from the remaining capacity of corresponding node. +It can be configured to use a specific MetricsSelector to produce the probabilities, a.k.a. weights: + +* ``heap`` / ``HeapMetricsSelector`` - Used and max JVM heap memory. Weights based on remaining heap capacity; (max - used) / max +* ``load`` / ``SystemLoadAverageMetricsSelector`` - System load average for the past 1 minute, corresponding value can be found in ``top`` of Linux systems. The system is possibly nearing a bottleneck if the system load average is nearing number of cpus/cores. Weights based on remaining load capacity; 1 - (load / processors) +* ``cpu`` / ``CpuMetricsSelector`` - CPU utilization in percentage, sum of User + Sys + Nice + Wait. Weights based on remaining cpu capacity; 1 - utilization +* ``mix`` / ``MixMetricsSelector`` - Combines heap, cpu and load. Weights based on mean of remaining capacity of the combined selectors. +* Any custom implementation of ``akka.cluster.routing.MetricsSelector`` + +The collected metrics values are smoothed with `exponential weighted moving average `_. In the :ref:`cluster_configuration_java` you can adjust how quickly past data is decayed compared to new data. + +Let's take a look at this router in action. + +In this example the following imports are used: + +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialBackend.java#imports + +The backend worker that performs the factorial calculation: + +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialBackend.java#backend + +The frontend that receives user jobs and delegates to the backends via the router: + +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialFrontend.java#frontend + + +As you can see, the router is defined in the same way as other routers, and in this case it's configured as follows: + +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/resources/application.conf#adaptive-router + +It's only router type ``adaptive`` and the ``metrics-selector`` that is specific to this router, other things work +in the same way as other routers. + +The same type of router could also have been defined in code: + +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialFrontend.java#router-lookup-in-code + +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialFrontend.java#router-deploy-in-code + +This example is included in ``akka-samples/akka-sample-cluster`` and you can try it by copying the +`source <@github@/akka-samples/akka-sample-cluster>`_ to your +maven project, defined as in :ref:`cluster_simple_example_java`. +Run it by starting nodes in different terminal windows. For example, starting 3 backend nodes and +one frontend:: + + mvn exec:java \ + -Dexec.mainClass="sample.cluster.factorial.FactorialBackendMain" \ + -Dexec.args="2551" + + mvn exec:java \ + -Dexec.mainClass="sample.cluster.factorial.FactorialBackendMain" \ + -Dexec.args="2552" + + mvn exec:java \ + -Dexec.mainClass="sample.cluster.factorial.FactorialBackendMain" + + mvn exec:java \ + -Dexec.mainClass="sample.cluster.factorial.FactorialFrontendMain" + + +Subscribe to Metrics Events +--------------------------- + +It's possible to subscribe to the metrics events directly to implement other functionality. + +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/MetricsListener.java#metrics-listener + +Custom Metrics Collector +------------------------ + +You can plug-in your own metrics collector instead of +``akka.cluster.SigarMetricsCollector`` or ``akka.cluster.JmxMetricsCollector``. Look at those two implementations +for inspiration. The implementation class can be defined in the :ref:`cluster_configuration_java`. .. _cluster_jmx_java: diff --git a/akka-docs/rst/cluster/cluster-usage-scala.rst b/akka-docs/rst/cluster/cluster-usage-scala.rst index 31ce7e7191..00369e2303 100644 --- a/akka-docs/rst/cluster/cluster-usage-scala.rst +++ b/akka-docs/rst/cluster/cluster-usage-scala.rst @@ -32,8 +32,7 @@ Try it out: 1. Add the following ``application.conf`` in your project, place it in ``src/main/resources``: -.. literalinclude:: ../../../akka-samples/akka-sample-cluster/src/main/resources/application.conf - :language: none +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/resources/application.conf#cluster To enable cluster capabilities in your Akka project you should, at a minimum, add the :ref:`remoting-scala` settings, but with ``akka.cluster.ClusterActorRefProvider``. @@ -265,6 +264,8 @@ This is how the curve looks like for ``acceptable-heartbeat-pause`` configured t .. image:: images/phi3.png +.. _cluster_aware_routers_scala: + Cluster Aware Routers ^^^^^^^^^^^^^^^^^^^^^ @@ -397,6 +398,96 @@ service nodes and 1 client:: .. note:: The above example, especially the last part, will be simplified when the cluster handles automatic actor partitioning. +Cluster Metrics +^^^^^^^^^^^^^^^ + +The member nodes of the cluster collects system health metrics and publish that to other nodes and to +registered subscribers. This information is primarily used for load-balancing of nodes. + +Hyperic Sigar +------------- + +The built-in metrics is gathered from JMX MBeans, and optionally you can use `Hyperic Sigar `_ +for a wider and more accurate range of metrics compared to what can be retrieved from ordinary MBeans. +Sigar is using a native OS library. To enable usage of Sigar you need to add the directory of the native library to +``-Djava.libarary.path=`` add the following dependency:: + + "org.hyperic" % "sigar" % "1.6.4" + + +Adaptive Load Balancing +----------------------- + +The ``AdaptiveLoadBalancingRouter`` performs load balancing of messages to cluster nodes based on the cluster metrics data. +It uses random selection of routees with probabilities derived from the remaining capacity of corresponding node. +It can be configured to use a specific MetricsSelector to produce the probabilities, a.k.a. weights: + +* ``heap`` / ``HeapMetricsSelector`` - Used and max JVM heap memory. Weights based on remaining heap capacity; (max - used) / max +* ``load`` / ``SystemLoadAverageMetricsSelector`` - System load average for the past 1 minute, corresponding value can be found in ``top`` of Linux systems. The system is possibly nearing a bottleneck if the system load average is nearing number of cpus/cores. Weights based on remaining load capacity; 1 - (load / processors) +* ``cpu`` / ``CpuMetricsSelector`` - CPU utilization in percentage, sum of User + Sys + Nice + Wait. Weights based on remaining cpu capacity; 1 - utilization +* ``mix`` / ``MixMetricsSelector`` - Combines heap, cpu and load. Weights based on mean of remaining capacity of the combined selectors. +* Any custom implementation of ``akka.cluster.routing.MetricsSelector`` + +The collected metrics values are smoothed with `exponential weighted moving average `_. In the :ref:`cluster_configuration_scala` you can adjust how quickly past data is decayed compared to new data. + +Let's take a look at this router in action. + +In this example the following imports are used: + +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/factorial/FactorialSample.scala#imports + +The backend worker that performs the factorial calculation: + +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/factorial/FactorialSample.scala#backend + +The frontend that receives user jobs and delegates to the backends via the router: + +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/factorial/FactorialSample.scala#frontend + + +As you can see, the router is defined in the same way as other routers, and in this case it's configured as follows: + +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/resources/application.conf#adaptive-router + +It's only router type ``adaptive`` and the ``metrics-selector`` that is specific to this router, other things work +in the same way as other routers. + +The same type of router could also have been defined in code: + +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/factorial/FactorialSample.scala#router-lookup-in-code + +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/factorial/FactorialSample.scala#router-deploy-in-code + +This example is included in ``akka-samples/akka-sample-cluster`` +and you can try by starting nodes in different terminal windows. For example, starting 3 backend nodes and one frontend:: + + sbt + + project akka-sample-cluster-experimental + + run-main sample.cluster.factorial.FactorialBackend 2551 + + run-main sample.cluster.factorial.FactorialBackend 2552 + + run-main sample.cluster.factorial.FactorialBackend + + run-main sample.cluster.factorial.FactorialFrontend + + +Subscribe to Metrics Events +--------------------------- + +It's possible to subscribe to the metrics events directly to implement other functionality. + +.. includecode:: ../../../akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/factorial/FactorialSample.scala#metrics-listener + +Custom Metrics Collector +------------------------ + +You can plug-in your own metrics collector instead of +``akka.cluster.SigarMetricsCollector`` or ``akka.cluster.JmxMetricsCollector``. Look at those two implementations +for inspiration. The implementation class can be defined in the :ref:`cluster_configuration_scala`. + How to Test ^^^^^^^^^^^ diff --git a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala index 4967978582..f7bdb47e0e 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala @@ -24,7 +24,8 @@ class RemoteActorRefProvider( val remoteSettings: RemoteSettings = new RemoteSettings(settings.config, systemName) - val deployer: RemoteDeployer = new RemoteDeployer(settings, dynamicAccess) + // this is lazy to be able to override it in subclass + lazy val deployer: RemoteDeployer = new RemoteDeployer(settings, dynamicAccess) private val local = new LocalActorRefProvider(systemName, settings, eventStream, scheduler, dynamicAccess, deployer) diff --git a/akka-samples/akka-sample-cluster/sigar/libsigar-amd64-freebsd-6.so b/akka-samples/akka-sample-cluster/sigar/libsigar-amd64-freebsd-6.so new file mode 100644 index 0000000000000000000000000000000000000000..3e94f0d2bfb6b317dd718d58db2407e400950962 GIT binary patch literal 210641 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 @ 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 literal 0 HcmV?d00001 diff --git a/akka-samples/akka-sample-cluster/sigar/libsigar-amd64-linux.so b/akka-samples/akka-sample-cluster/sigar/libsigar-amd64-linux.so new file mode 100644 index 0000000000000000000000000000000000000000..5a2e4c24febe6dbd1483c0dec0062d9258ed0bd7 GIT binary patch literal 246605 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 z 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 XBdQJfjWMqH=W(GS31doBi0V>GB7*3=9Q) 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�|SFHw7;f` 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
1)By}3okNku_#`T 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

_M{&j6=C?g&OX34sR< z);!SpXSDM|h?qYft$*?E{{^LY;_C~P`iVZ{^N9E(t33ls&t&=!wf-ft{X|;*i`@Qh z`0?L^!^2Ucf%QOxVTGFmVn4wF(0-u>p!0+v=Px`sV9n%|z{+rjfxCghP0+FdydHy< z;Rpj)fr0>Zy)kV6Bl>=&5C+8yOpx^)3<{D4p#4)|^BFQ^VC`?{eu4nld0Qa)L(B~9 zSoRZSFuE})g3F5otPBh-G8Ulq9$-F400V5(Mw3g6yvX zo%h2Dp8r*V>=z7RY~e{@^n;qefK`C8MYaI69{_AVgU7pn5rP~HAq6u!^Q7uXn_IW-=7Fe-xF@3eq5k)eePJYNsi|A3)D;)xijlmP`Q!vwH;sCy4s z;&3n2e4P8ikk*4gV0B<bUNR_1Ld~DU;KZ;(<9`IH_CwBJ0-uKh9e)PJ-vb95@cuUj1wrusS)}*@ z+Xo&GS-_ga(868tK!!^ZlKw#Jfe58PGTql;0roFwKL-i!OQXH}pz(JA<~~S!iIn)f zh%-KKsF5C@Q1>vv>QmC)qbR|QBYk<0?;Z#8-BXCuJv&s%4j*`XgY@t@h|@h9caz#WbAk5fP@cdzj8w>E5ig~1x7E}e&`v`{zY&g z#>*8L0vO@xaR%tTKS+NY)c<#Sde`Sc>pB0K)aq}8*UO{X2dZy5D-OuBDn4L(vJz?^ zxV}Z~FXjigHz45!s=p*5{SSEk2Z>)u{RhfFSk9AhkPv{b*T-Z3v-uGFX*J(Z!2eD# z|6|%uo&Gif`w!u^AJqSVg+KZCGZ3(!=_xe+G5t@S{x$*on{e9?>Yvcw|IcvxAJku= zx&2Nc`?2rWq2hi8-1)BwxBZ~{kBa_BE??p23p_Z4+kQ}eNXUKx(E53Be-6372<|U| z>j!Z81Mc5&7l6j^5aTOc1)%y5F&{RR`!^?~NpJ6s_HR(nDZLzDi^4GFTthbH|S5AxkJ+P}el9vP_p44EHB?cWgDe*=~8#P@HI>koy` z|2;Si3KdOEE<83JJ;~-}|kR10R#sf)mp8&nw z2d^(BNpRoMG>Y8E06LG3$pdsA-3HM3Ill2`wE7c0J%aNSxV?$q-<9EDfQ`q4hC&oT z1S1230cboVfQx}$5S-r*G#GF}$3wvB18klGXgowV05snK<}*nA`xgPpj{*#!@#_Pi z@e2pU_=U$c@c4xbbUrWvJbvN9=)s@}EbOh{g!fiiw#xLOZBd0HT|7`)&Q=I-M zX8eM1`3|xlG(Uyee*=$CIKa+>qeB0Ur1BQh-bODU2>YkOKw-4LVqjr_)~BQO6>L9$ z0Rt@k(WSmZZtn(w_BTMq^l$HS{QVaJIS&_mdlxic%>~~73N9}lTF~0Np!x}4 zdv^mHgEQp(f9&nu18hU9y~~(S`qcsEK1ll=y}bvnkFd7iiR=$D7-$gg4|06K-ygI%LEHWyD`-9& zsXut)IMMw<(0n#s`-8Cl2(8wSgZd+&@igTAFH(Q>5X}Ao>JKtK!`UCBa(@u1|BvK< z(0n>LzA^nzOn(q}ej>6z?1bC@;Qk`?{sHpm(+R~tZu_Y-pH0Airsp{0pE~o|1nh6Z zZ9jG9v*GsR7>{_e7T0(TG4t7k`|lw8v5!Z9=c|Y0c*JObg0k_5(f$NH{6_l|nBzI5 z^mj)46O@JDuk#)>f#;_mpw3S>u*kyZry=)m zcI-l%p9bj%?~jA*M?U~M?@j=IUO&=)bjbY{7eMBN_fsO@Z;>DYTE7e1-w#>Oy#c;o zo#6cz1)%-tA3*mXf%oUZ?gN6&S4)D=cRc_%5A(hP(0mV>`>B!`;P(%;fbJ)6muQi! zP>@6T2iy6Pp!Pg@_K~+=8`OR$&px{EM<;9l9jJXyg8#ttxsdb!7*oLa2Y5&bK+iwn zU~D0LzdfiuPM&>@IPJrCzdfk^O}u?n-T!_cF@AyVJidzU;PDI4`gc(Nqs{$e5}@*A z0uvL12LlJlKIHjqwEMpXa{v32wUG1gXf=L8VE;Mj{(uJT>ybg_8@PWCTG~MN`FjNH z$8&!wsJx@O{fA)TPpk0@0{(Y;3XOkE`>8X2LBRe)VEeJ29}g-YsTls)_uo4`1Nk4T z{h;!aQv1RC?@{ijgsi_~VZc1U9aLU|*K1&$-wry@MIr&b{tLAJ9GoAxBS8E2NjSfK zw7o%~eKXqLfUUm*?PmaO#b#s}Z0!wv_c4L;5Ap2{t5Zf8%iqfB)tICxbKOye$K) z_w#<>grB$N)C1jbPVsqLi1G%d{Ig(i0^bkFlmNP)6;{4tJO3Y4{}UgdDCc2}_HPs* z{ZZumDM0l(dEwbekNyqP`D~#64N`v?Y5hIE`$IwXHJSb+>wFQ?${UpQnMzLo8#JFl zrvJ#Y4>Z3(o_(PE`$&&J(EbVX>}yOTCpg6=;h*}em0+Xue?lw|uJkZm6$=sr@C?PHJu-G@s~c!KXg zCD}d&vh8C`Vj*jMk8J;uWnTjM{!1pue+^{Y*NAE#(s>v7>Z1iD*+=B~SA!uFbo~xE zJ%QU#4&eP95uo-Yn9tyGhQRpO61t6lH8C=IFmNpS7a@Td{{r`4ah=}`+7ANSzrY!> z@Ut)EK8geu(D||8^Qs{J1IcrP$3qe4S3&l#pqvkZa^4nfJqLmDh^FVW2X;IRWR`^-1dXo|1`JX>B)Rt^)IMDKy&+>aNF-713iBL+8d?BbkNM3qr9379vGCu)o-;o!dqvNsI$}>=VjlA$29goEp zo}l&@dEq%a9*ZqJLG3B>!V_&gmdN=*PW0&Ay2m-CYg|80)-vS259{dxcy4`eE=SeEj$tM^N$_eJ=!k1n^(8e*gF4 z0s9wf9_YOF40w6Nkg*XlzqN$Hi2;1xdIaLUvKgJ=`7PLa>yY)`383@VA?_jPymd(V z%;3;rpbQQlLGXF&8^G(kH9E20PZ|W8e{W!LYG5@0ou_y}mQ|4fbY44HKWE0n&t7T| zn4V1aq3Zpl;PbCN7+YZJ1$5p!V!!kSrYF;V4uIBM(`vmp0sEa`_M?w?NPy2v2FEuz ze8?SNB4B?LZu>#yE6wd^dI}AHO#g$*TbkSNgxh{l`Ac*An{e9?DvzmXKXQJDpC5PO z5N`WHlls8Hz%I$o4NNzYrgu$o)41 zr1jl~b@X4~J!2iL{{}s84z&NY0Cc|c0`UIT11zZPyIJH>_piQ~gMWSZ0v7!1yEm|m zuJ7h50M+lr_y3XC>w^1F;Q1TSeqmzQUxMm$^6UfmpGdY3RNjzhAGo|B**;KxO`d(= z{u9aef$C@S>;w0oNVX4D-jHV>BU$77RGUvg>L21;p9oq{LcIToU7rZ=4}!xR+@8W% zpSWT%qW^|%f9{QHaQ}@S`*WK>`*Sm@$yuM6_&JRJ>l2-xgZ3+)(4I-F{u_byfrnuB zWAYze~@e+ zsJ%y~eW39HlI;VP=j7Q3F3(A}57fRR&pz<}Z<6f;?JptEKJfl;lI;VnHzdzK@Ond% z?E~!}A(dbYB?(`!880GWKhsm3{s*-O!1)W@ z9wc|XjDY=4xa|kE4`^*F=mnPiygW4mM+7IqeqO3Q8tY5}H{*v6LkI;$?*p&|H-p&g!MOx9A5&J@5F~E^7!wBkBIX(jR#nOyK)KH-Pu6uqbf0$a;Y4D@gr$A_@QcEC!H%0nmAu;QcO0 z_X|Mww+Jx7*JmkBP|yIk$Ek4srWC-ai74m)A&rk5V6wnzAE^IDynV#3e=&fKhk)n5!0E#Q zJbr<6KG%u{#P|i)^)C_N@e4QTee00@3&``qMJz4c;PC_E&%cu3Uu@BLeIGg#ZRc@cFb3tQuJMFGM(g_J^#0q3ZsH9?<>kXy@Z2_AhKW^bC4F1FhD- z5VHTtW?bt}sI&eBZa;E-!`H8GV0wzveo+1ar#DcBCjGp8aC%i>>M>A&o=+j@A%ORM z3Q+z5x91`I9>LT0Rw}xga=~~X#PtP zy59=fKRY7-MQ{W#dN3#oFf3qj0^fHfVZb2JZV9sg5c2^B24@~{eG4*=0o)&ijBib7 zVqoxq)V~!9E}-+cTNn;8Z(xAezwr4;PVoMV51{@ixc-EUA0pB>q4`fz>kDN6byT6& z4;TLb_du545k$B8!HI#vgTVu2AM*G%TKS9^-`;TO`BX^xC;_gYAmI;Mk4N%(jfnCH z5`O`p{lTF5YRGvxTnV7@0p$HLp!sP;dBg-RkHGdHU@Vtt;f`RGlMp~wkAFW6a(FxZ zgXbRxg97^RABd>K)jkEaM-MSyV1%_#7cliOI61H=qP9;p0&%ua!TS$3FcP@0o{_5e z)ijAhb806U$!TAkbpKyWaE703#c<##trw(x0+u;W; zFI=GQ$p#h&h8AYz_5~U3Ne*!N4&KkIz{2g1d*<{ZF9&5b@<9M*+w_u=~N~ zFBiD{1(&ao^EeVf`)R@92hKm3>%~C*A8Oi1==={*|Az$oki!#n{s+n737W4Z&px#M zYpCNRDCqq$J(DnO} z`>cO>;_S~efyT2GIPjkbV88(%?;5@D4V=DMh*>WHzaI&$Jw;@C1(pBAx2I6{H<4Ao zfy#UG>;v^baL(U>!wcK|J!$Pl6#s$N`$O9^#NS5_T7N;N|H!frv|f)q`v&+t03y>T zX#EA5{sXPQAUXa(>o3T&54`?@Wcxtt?Z~qayxyN=`#|gK$g>Z;-k)UqK+FO+NcONhiuz#fA7sm7)XZ(ZOXEYCg zJolA>+G{koAJ2Vd)Y)G_DE;BSuL{(jqq+a_+*bu^-_hKDJoid;4*xKhXUXG`F9A_l02}Z^d(87pVP6f&annf0EAQ0o~8#U;$n)1wOCA zK|%nrUTO3^9?TKLXY7 zemo`Ws^K=n0w;W>I=6t?grZ9E5ge#+n-e13{yAm*oD1jFX1aO{Tyoi`0$&jeb3 z>Xgu;gu32zhB5y6DF%>!#QJQ=dTj9eJJ9;xL(Br8^RU75?F@_-1_}=vYb9E^3LGRD zLG={_X#WtneIo~I-@w*4F@ev=Kfts>gW&+S^YLNp^%_9?8xk2>xCzAFLf%apaO{d!WWdiGqoSxo=u9qfp{W55)CnE!7{W54j zhA?L zM|^l9_pbuJ|My_DFcoTG1(z2JOwa4*aU>WhF(`odj~xKr*UIU@$OPa2&cO)kFUT^I z&|iS;w_m^nIS+|JK@w@dNQWD){uQV{g=IgVGHU-yLJ?>G3cR210D=8{p#6eFX+M%^ zVgo4rN$sz}_Dg}+D-ZO3KFImY28|2{Jiz6>Ah^GKAi;;hp@D;;g@Fe=-VaWX82kGw z>`>ds8_@Rmtq=pZkLk9*&jMs0k?mu6dlj@l2~_EU&l_P-AbCG9w0%fuf8Ud>kXj&eKS(E8dwiB7}mKRU^|&TlM}q3(t(+U!D#^-17izE!9xiK#Rmf42lWNp!KRd9AM=+^!)e*j4hG^pz{tAnhh8ZF*EQnI7>D_ z&I^K_XCS+RF@XVm-T?!HhYnhKzJRd>VqXID6oy006L=Y%A^X`Cm{u}49RTmQ-*NC$ zlv;!H^W{DYp!>He-apHr5CYvFtiZ5BB<&faQK4V!@$HKFp&v7pOC=q$lw6ZU!Dgc3&bS|36@0 zXz^$eDPm~gE@1Fr5O^@bqRtJRo*?QA7%X^-nI|wXI6>5Z;9zL+I3QRBRu39)x`0i6 z0$e?VAXt49Tzv*iJ+}peOxw?o5)3V%{s{{MxW97XA%`tEJu@i$EntuV7aGv^JF#JdxeNm;`PAFdz8! z-y3G$5uQ)X1}qHD%;5H20CNL_(}BiP($BjaEnh+7k>K%0r1X=3d%ST2=sYb%ek7y3 zA1z-MDJcI(%U1>PdMhRdjPljs+kY=ac`LxM;Mac-X#1=A`Boor{UKR^I{r^;{R=Md z7zCIVpyf5B{7PUx!r;Wv@cX|94>*3n<=X)^0mc^D9ia9pn9p!S=U;>jqI?6@450F! zfkBZ0Ufx5@LzMR%4wfPftOpv5>)alI#~UpeT-YopFtIQ=Ik1BIv*7yU0O-6~hKmdg z6Cm};1}4yXFQD`7pyPKAR^*;1#K926ptu2aUf2Q9c~BeyApaa-n!w<+0Ce6bN`1)w zFMSU~J(nV332=4~!CwEs*j&fx&|B6SDyWgEJ^l7#SEG zK=oe%7X!ThgPoTO^-lxbKWOb$K@L!P1}VQl^|K(@Jq-+?`UNx|#-X6d)4&=43cmzU zctYYc0Y3hU?4KQi{~|aoK>h`ncL!J)KuYd-4eCEe z9|pw_pz)OjEDQ`S9N_-o1tuE>g$9-+h8AuC(D)1S>u(_O1vVe-A1-iz5S;%WFce5! zK`I}ZFR;Me0}hV`p!CTt(CH$i@Zf+IlaqtWrI*1ZhqnYMe8K4jl#~^iGC=18fz5~X z*D|)cFeni3AC3YBC(wSa1_Ol$;PdbjK>6tcI6s2UyXC@q9v<+~?s*fZd01 zFE`kH@cCm4t_m?W@Pfy~z~Q%mHG`Gl_!pV(b+7=Jrz{MR^-t*T2it!D+xd7L(DB|D z(0V2Y#uly&aDNnJ-h;+Ei59K~2Jn5cko|5f3{2qifpLb{xjNO^u|U9*=LK^Bs6PoVk3r?N6N3f=qCdF?oS(q`Nk0Zfh5%4~ zIssn)9AJQ*uO*v+bpGR?zY!b^3Qo}RLCAUH8KCkRT7Hpt{$m*QJn@EBW`+sE0*p@J z_8aK@N05C2iZ0Ob1DDrK(D0i98jmU$Y2jp00F56WdbZl<0r)&dM0o@*U&);xY5|=e z9>LgxY#$_j9FS*Ke9-iCJJddKc>zuzVEYK2{|Jd6qVg+-f067z1hyaR`X%bDpCaIY zrf1uI9?dQ`!SVuJ9z9?n zV1E;C`zc#L#SJbm5$la1#34D5ax@Oh>X|0R6;@4*Akk6``+R#1PY0Mxz#^BFi4 z!2KCe{sy-PLG4TMFc6;d2Bp1wqL{AjT?2Loz*H-Q^}dsl%C z*1iO{M+voe9YF10ZiPk(1`^hfkkZ}_fVaQFMaX_gd(&aS?1!{B69&wFMsRztVZiK%v^N(FnEl}PWy661 zv%eA4zHN9wnf>7U;{)it3vhWxxV;U@{}u)c4lE*!sO{|%NPAmih_tsa{QB=Dh}7Pe z`1Th*e?v}tTjC>)+uJOt?d=sG{zh;R+1`G#5Yqmmc>M-(?H$m0sNnV{t?ug~(B1;A z*9Y5AtNjWD>~DGs4R1{Qsk2{!fc=MX+Yeg*46cvC^*fE)yG+k;`kyZCZ71CJQ`X)_ z8lS?~-)q8cKk9r1jlv&v9x#sd4_ZG>e*EL;Z!lPa$0t}Akoy}CzTod~%n&BKztLb& z;|3l-=ZpZY*S-K6?+4dk$m9JIlHmD^Fb2hhCM5=^2Mi7pPax~DLG9T?%mzH*_Ph^t zJaz$iya&9$RiSArgVO@g`Q0293*^`o!TqZTENKiaTn+~%Kw4&`;^l`!E1&n$URPA`AoH0Ijb;jE8X*fXXNG>;s?A3hv*6 z#|w$H4^$qJXCL@}1d{Col|SU!2R@&bWcxtn4SDu~@2e%*K2Z5Wo_*l^c){cS;Pgpk z{DIEfBF{eXc^**zO<-_hXljD(cgCGQB_a1!J1BtH)4}G$P{s!ZVB?{n`AP}&{LY}@ z2hV>Bj4jm8@5uQNd|oQTe?*2S1^GQ4k>4lKBfpbn9|ie6fdyWk5$`_=@;h1fQIOw3 z`{_tdFBIf=kbN1T^+(|RPE`KmDj+exXF%2m8ZtRS+iQ-X{Q^v&`&StlSQuoH#z$v7 z`U_g`0BSEVbwKBzxH3TZ&lNDt;3)#v$1)WPK9Kcm4dC-CBpnz6BqR{?t)TWkJN!N~ z@cAGzp#CtVy}+OVS$_y_e}UH@qVNBN%wIw8(@kapjjy>#2!O+90V@Y%3nys4M1q0Q zfe%`rg6G4L&tm}1C!myvauOmC`>@Wpg4Z)Z>|;zJ$3Bemf@u31$+8cleL%E*jH%@K z52L&w+P+4z?87K8h_;V0jU4}Blov$X*GQIq807`g_A#d8^4|vs8wMu^rUsc7%=1Yw z$_qIO5!~x1WDxVU;Qld)U}V6UZ*4G!o^OFX-zsq*JpKck-vr%92wq>s3@uMvKj!Tkji*0+G?3&8FLm$zJC|37H3=5jjFdeV6&SH;24 zUTO&QAoJni@(C2wp#BYB|G@g+u=1H3Ts}kkXN~nNp!k;o^*>%?gogl9{REnigUmfsj0o4z*@ek|ifruYa{X-l7v<`@WK=m7K{KI-? zAmRs9f6~T3tpnm8Q2k6B|FE7Ni1-23|FrQ>>&aru>lbi)J^|kTht)4LK>b+*MvVFe z(jS417l6;F1D&VD1gn2Q>oM3d_8)=$Kid8uZU2MPlN_kM0z1!;s{mAfk=cJEt33`X zU&ym>@U;K&^@mAo|3lXE3owA@e+9n$_uw!v6@abh2kkH5v;fUFOaQOH2d(Evo^M#e z0G@9E?MG}-fXz2>fY#4U0I$Cf0NvLs0a_o!zyLoFzyY+r8C)JPL|p$H!2@1@59TW{ zSTMFoR5*av4>2`>*5iZjdk3$#2g@H|EYfM=_F$9~5J0r23C%xng7+VT*Drz1hqS*N z;N_L9!$Jlj(9xJo3=AHZ{zhzlytVQyex zaE9zxabPk8&j*3FJTfpaGAJ;D)(e5gTQ~|FR0I_SI9)*dD>*$IxEetId%$1;UZ2du zzyvklMTOx2V?hK1WIaMb!y29p$oLC`h1?8KBr!EGANc>@3$p*90kr=Cd>#UG0BC=~ z0Z{xLU@S7h*#C^aJ{L0H0=@6Ug0Tf+UjtabK#|M?aQt>K3NSP%GFUwN3)=4kT7L^) zA14ToKT!NSG0eDwSU)fa>VF0Y1{VfJ1_RJ~-2g1>b$J{>>;J*wrvMt?kp=I^0rMFu zeqh=MU5|&;JPrdxSb9}xJq25jR{+|7!T?IINc&F~fYLL`>%%x0{1_C$`+>myHAxT9 z_!v0+8CLxL8^HnIZvs6J!-BCz5}bY}fcGy6FfllDD!|h}`2KWR2hjK*#J@j4<8R>f zFTgMdls*y}S|kEM`2%GBA?5{);Q2c6`SuJ9P70v)bzBml^>q&ztYQ11NX!qA{i5Lf z07`2u++hE~=A&TyNGzXv*h#|@6Z4+m^ToDMJ+dNe@h>mc_vLi=m@ z`?FyE;Qq1$DE>LY=VOAx%Sk~5eEt+@y*X_D54Il~@BU>!21TfUIKcat<-qe1Obibg z3Q_kjJN*CeB?u0GNc#Qpin{4{$5%4auY;`!Xg^m2gA-(boCm19-2lpu3@nU{EldiE zUeNIl@Oep~{n8Qw;QcM&@`2R!%mLm%1SCtUQY`)59~gs2u3dnfeTFF_3wooEuj545+sz@ko|WJ450HbK>O!FMIUrO9b~^5 zbU&eCom&Fy8CZTt>?cIZ@8IwxIeZjA^%ppOCV=-Vf%o4n0F}1~8VfjDm=Yd-@>09N z^lU1X&KCinmj<>^fx&~Zg((75J|Nkbk@z`A?ZBZYyQyQJ1lT{|{fvem{hAyV511HL7z`{8ln;RBPbDKj zBK9QkCmVrTL0w_^2F)+-y{WpRG9Ntj- z6c}4L!0`bN577SoXW;q}RB19yfb8#dV2}ar2LaV@p!6vK4iChBSLpuE1D3GyM9BUN z_<1Dg^|1tae<|30NPI+q&YJ**w-ZCg$G;K01q`75wV?VJoIV)P><4*;5$Svd4h>bl z2G$1+4Gc~Vp!$x}0aRZlfa=2sEew$UoPdA;6X^UDP^ z{mq~O+wUo8!RRL;z;Fn(|1#pv-v}NK2I%|{!vhu$#uf>1`=Ee9fu|VUUV*NkIbaE^ zuShIkAnhv#hXz>ug6(VIU|{fIz~(-V09y&req+Nr!s}&Te1+HFpz;Phek*CgD9NA* z+D{5OpAgdC3TRSba5})s088%-408>X!Q;n}@Ol8+pS*xofw6^C162McI2kcGF@VnF zBDwrwQ1F57UjmyCDW5NZ^49^z5;D%qX2H9ve_0rq z7;I!_2tELv_W`b-K=X~T{HAf^Zv@JI3ipzf^ zBs@Uw2e(JTBAsK3$x+OG?4zj9VAU}8{VPym;|i3}}Fkn{l759;s8g5w|3zO4Yo zH@JNX=7Y;qX7K)Eu=@^!($ghyc>uBsTE2qIQ;hxtD1CwJf5`c89~=xp^Gn4n;Qk=y z`8l}TixS}WC&GV__WS~n{}_I}hP4MF0?>L8 zDxOb(d|q7yV+$8}Jq9>_FwQ4<0N+0b4vz(_p!2B&I$eZe=M#{zUyB1=e?4HDV4wir zpM|{t^{EhJ19JZ00PW9(?)RYV`~k544q#nRf^ZKwykYex3GV-qmtR2V(b7GALiU3-P!>LviUo8yufpLcc>kOagCgX-iW|FO?L|cUAA0^FyuSf$ z--G&B;Pxx>`l%Z`!Rx2c&#Ulbfb@3`G*WtA1uN?QxeSnfIQGxY0gbmH&Z}U0x)OSR z1h~BjuKz$yH3e#&R{^pQ>AVQ0XS<>HLB>lMVDrheIsdkblQ8?K zb-z6N{xuBycjK}jbv+RzzaZw{A?u^S@q@j6f+*j>;~TK{5}N%@pzz0jUIyy=9~#+z z2zU6SuGgWN{m}G>8ULX9X>j<0(?5;uZ^G?=(0nz`?Pq$9GyS2iU!jrzop9R^n$M=W z|C>PegU;u{jDO1Rmxqpj!rSkV{_z8N{fE4NFyIsZ{euy=!ShQbomV0OJ}>Y9gFyl4 zd|d_wM)3HA0TV+K!vPl1c_l~W z$6L?Sp+63u-vIYN8GeA)D}&Dq1kdM!%R|U{fe#?_wcHHO92Q9ZaXHo&t_*niG=TcA z$o3i136DcqSs9T z(mziyA?N%++~=t@fX9!Z=c#mHIZwrqobyzm{TtZ&XjuOnRKGoyVr-BtP=xnyK;wJ3 z+N%>lOKQqwu^Dg5iVI z|9gdde1bsu9H8R)hw$)$p1+4Xe8A_i;20kOudl(nUlFoCfI)x(v|kanz8-0OglPLA z{c{8C{VyumPcVIe&qJYbd;;3vhvgs0dLZz8Q-TTB^9SMQp(M1(qMnBW?vGc1<`YQB zAISYV(EJ&AKIH;vzZ&}ag9$9uJAY6DbpD_K)-GnLLC z>;cU;g3d#cK%74~WA)z%4hcm!0_P8c?vp+AWG|$DL8tRjoSyEbZ+{Ln-ip+pJOr{I zdw&MBUl7vX0nHyk%5%#5Q)u=(J%jomvpq?h{v4Y9OwZ=~JQ%?92SN7*MUfSbWt*1*B9-4eoY;AU`!j2D8|&wOTP;AU`!tXBZ7 zk0@qdz`)>yvVOt8ws zx#9nRFQo8yU@>BBp>+QzWPYyzv>$~56#lUBsus}tYYWLI5(Nr=p!@8M84fWoU}kXU z0*`MoFj^QWK+el9P>=+j#|~Rx4cQ<2fC;|eph7_gx}FmIev}FZ7YP9d#s&k00|!$O z=R1JTpGVw(`+*5!K6t-7+I|L5{X#(*22l8aVDNyh50qfA@tYyY(BJ}H-@uEA9|fj#(0VHyr5S?Y{H4%@ z#%D@kY2jo*l85ub>vt5G5?NX#87!2b>#4xwcbo+YGTe~y^#xBE7$%UsJ`3DF1(y#D zY!-|y(EZAw^5Frp8DY=1boykyP*-M;`H zZy;-a15!UQILv{j7eNE?{%$5l1`mb~kbMSTOue$4g=sJsG~|KR*VZhM%3{Z7xI{>QW*RDMxvKe)aC z*Z;8ni=h1!pz#Ap{(Ar)pWp4WMEKvaKM1U$$<&9-mqhV zBy@fh93SZQ2?v9N5@@~m90O%={Q=qU1&coh1(f=N3iSy$xIQ6%e3k=I{*Klk3=INE z_t`KU`1#+11Kb{c09udv095};Hh}J@fXugRtp6JU$$yagrUBHy0rfW^?P<^^y%uQs zRj@!o8Js>K>Ot-4V&(&1(C*jz|KEeRfCJVZ2kVz*un2&ySHAH7zXykcD$(mZXB__< zApxHM0I$adm#3T-p!PLnJt=6tHS+pS(EdS50o3)KvIZdakn&JsHfVi1X#FF2y(D-& zsUSOa)}WdZ|(Gh{tw0%(8A1JHa9a{r3sD!Ba)nva35&t(AZbOiYmV}1sHp9XmT z0Al}(1Bmf3V%J+j!apELhJhQh|G)sW9u~a6@B!%lDP;F$90U0ebYGJI1E~MZ$iUDd zVc{qMTF(l)|7!tcy|Taz!3m)B0FF;t3-JB}uzzNN!pDF?fZg%|sK2Se0NSq(c7FjV zJeWb@16}`0_WlFddU6HO{k#US@y-SY(0Di2{Ra}NTn((?_L~EE|Ahj`{{bNP902W) z;4XMT+WooU`75w_3JeO2EnFI)^}XQsAOmQ8hsy$d-!bTZPjL7^$~#E>f$Aqh`(ru4 z>s7(#gWU(2KY_THu}FgC`*{Vy>-hy3K<5ia%mmLT3P9Uq3qbMD4Zc5?gz^&He}$N* zfY^^B0o#v4%6(`ZGyc;4KC}o|Dd>9e1FYxjq3ewgfcD=kK--V%K-PU|8KC$VVAud2 z?_p4ogv1|cy*Y!#VbJ`Ig8*dzijx9E0_;At2jKFefStja(*r)g+0Y`+*dm+37zA6N z+A$q5pSgkI5VHU~Vm=eHpBXlv0@@$?i8%m%{}^~a6XL%L(0XGAW(EeQ1EBd!$bD!J zK=+|70N;nk0a`y!eEg%_kDUNoj|Ms)7M#8@)*Cl4!`44v0OvQ*d@Z*?tCJvPKGQ*k z%M z_1ytbe*yb_Xdgi1UEur;S?`1UJR}LQ`w;HshL{g3{|Fr-3vX>xB*n2gWCU)`U^e0!RZbA`ld1&MFa{Mi8!@O_n_{nTLh zE3g<4b$?d`v^>Cfe-{U6{%paY|6YRN@&i=9I5C`9jA$>w$|vZ0$OzDW$p!H88)<(> z2IBs%6BEGW1s>4x8t{G+X7K(6XnrGaJtW9K4jl%{3s{-J>mfZr`)L>$1Q;Sf_93r_ zOkjlPN6`8KM)-Qj4~L#C^kHZ_=RcEL;{_8y`_s_u1Lc3veKV|zADo`ghuTM@@d5(& zA9}tYVn1eoojT(M1nhTu!syGuc0zk5ru~$S7eM#V!^&)8 z^UneB{ZSR5{n21P!-=in_BAMdf!m{?_7?QK3Y_Vkl=jMuiL`I8z}ANugYRF*zdp>P z2i%@>fVStr<9VdE=WwkLgY`dn6l8fCSi#{7-cQF1Uatn`gV(De_a7=IfyxWec`M-l z5z_uI@P0DLdNag%0Sc@f3@woRl)?ME6F}!r@PgapVDrg3FF*pkUmI!vHn_bGHlLvb zyxtm=UO@fNBJlogi3(8r3?zSu8L=J=d_E5NJO-`=Q2PkHpBP+!aw{;(k$!$c0BAoT z_&f$l@c9~$`;|SqK>I~O?g7^q4WRw>%;5d=Aon;OU@Xx*^hg{ zX#(`Tamj)MvTPXV3m<@=-$U?x;R4Wn&Ii!>q~P-jxFSIPY3TWxbrPWR-a`Q7Nl?Yj zz`_98-wd8V0Jrxb_YWLEYkz^=kG(yBJpKn7uL6e;C_J1PnA&0ItzW=1e*`Mu$g>Z8 z{{YGMfyU#=vk$a?mkF1B(D@z6{2TIl&7k>z^6UfOKR~j5p!t6C>}yPBXd&Hyp!t3B z>;vCFK(hZp>$AzT4|IM8>HY()$0pOhRC2--wEmhr`@r+5i138o2XH`)FC(2djQ6}|8Swci;PL=mUVsSbc{L26^Fbi<`H1rdkjl#haC;&FblwX@f5lqF z_~sG@Cx!$6|9i*=Alk<(T0!+4_&!-sdA0zwo|ZWR)c%K*-{kBUf}97#;4lR?pQZrn ze=IlzIxpFx^>2iPf+A==B*;FH*AzIx{sr5Y0J?8nqTqlmt0IHL1gL(_goB^_)h;kS znd$>B@2S;Z2G1{n&c}hqCuqD7(Oy0PTJN*~G#*B)`?m<#-}G$0&jRf0ji}RJCSd;| z-1dX&6G-|3wND}aThiCN5wM@>IZpqB>KB^Z59%-B2!Bw0Lv#C^aQh!r|Ipn2L%8h+ z)kie9pXtd$TMJVRk6hjsfbN3@-M4+93Ag>A`ilbl!R1{5Xgw6T zzrvlN=piBUz+npLd|nO6c}~dt6}bvP^%o+4L)z1b_A)oPJq>H$!p_$NyAS(%sL}Sb z90RDm0A0_I*`5WJZ{)R4M%&NW+FzjZioEa~Z9iiRPf++NFepOi+d=ckoDQJ*bMSmI_=!1JpO4;gHr3q5a4F(L5{g250?O2EyFP{OO&tq`-^YgztZvBMLyOn^P z4+}kygF%58Jbwx<-@)gJk-FYd0(|}z=sY~o`B4lCkn^&@=XWuzSO%NF$2k8MJl_a9 z|5g%l{w*kI6j08;t@|6n0bb7lK937L-yjhHia(I~kn?XL<8>QA>np+M--6DU$QmJXQg8ek7^m z>5%n5knlj9w+%i&4?O-2F0U9S9D;=}a(G(I0hgbC42qETN!avrNGNiF)-xDXxFM}) zNdT=k0I%mjF3)Bx0gRx*_uK?Z zFD;CWEu0FB4iW<3^NSN&85mm_3mCj41PVauA3T1~Wx*iB2H78S7^EJtUTy+7y>o)+ zpTXnHVD%)Y9|=%>2R^?UJRSvE|3m%rpnE|3tBYhn=Ry0BGM~W!9&ci>U~OP#V03U` zfSy0Ypuph7(7?2c0bKtwfY)O|(mOOf)p3mP7v^%-FMq2W;=1G*3M zbAs9hr)S{uiiLsF@hu+kd9UE~2cAEX1fTZ{o-blH`1junlE1s#R9?b^ zF$gq2ZUg0`@0Ih$U09udZ0Ge+@HqT=& z_`FdEP<{r*Cn*0&axeriC@uiqZ_VH_57xeL0H41LYTrTRLFOF-?T2#aQDB73=QA;Y z`^QY+^Qgh|UEutHY~PE2|3T-QdVtJ_t!IRow*kDq(4!4>KO87O2rw*QZ~~XdlHmIl z!0iu)jKaSWycP^zZIJw^z~I2x0$v~30NU?%=&&FI!vyI0t`?y64hdM+J8*#Oy8{fy zd2SC_;Pa87_Kp*{K9Nvp1l`vOuD?Lx!5aW7Kf&pPto9p60I0r)o_7JdpTMC}f&1 zQ2}(Hhe!6`2w45b+Q6*9puyMz2|w_BIi$TMz{3EYe`h!``>zMYKMWF}@)s0;5ch%A zgUefJe}t&>ib3l^A^i#PeGed~C`f|O+XttAhKO0P{BD4p-~B-O71VzNoo5Rv4-J?= z_fde?Q-bq5xPOuWT3;>e0X`2NydLAnum2Ge0S6@*6d~aWa=#?_eDVoQp!zzZ0@VJ2 z=&X-;>9o(MtgPy++i7#;Z z0Ew>^Ghp$B)c*sA2T1-9^9CjcXATMYdQK>-xr$nN#{`9A`3emo?8 z!0`nR?*&Z;3{DIyGGOtw02Dvq_Bkv*LH9+R$o?B4VbQ|SW&rUoSU5%_&zfmfbJ&(mq$qb$$|zMZbkI=BiOy*_M2rG&;+KZhkd~HzhnVuyciaq3j2iUz0p!PXzY&o8;K1Xr;Pj3(z6&0oMNdzV@PW2Z85o>Fnvln1A@T_S zksAIC;QL4LjL!~WczF~L!SM316@!lVGl2HPa4IM=DXT01?U#Y<=LP2{15kUdfklzA zg-Juv4SIe<0%-jrH+Z}RJpKc2zml5%B*6RMA27h~D`H9jonN&9bbrSIM$r9L8KC|p z3GD&sc*+z51*rQT$b!b#kk%97zaK3EwBHdl|4^jBD53a7f`cIhq#rcC8NkTkEC@cI z;{a0+!yy*Xc&8*-J;MFm1q!lUB(z^(_kqFO3+WGl%y%O1z8P?Q6)<%uC@3%lfXBB4 z7!)^v`u`1}^+Li1a|GIVK+1QCOxSn=gF>f*GFUw%zc+yH!vkeq1x~R4!0rK`PlzwS zgWBI9O^gf-9-#hr0~Z53mi+DozAuE>`wF;mqUZx3{gb-%SDh=dpm><52TK_n`$m{FJD+ z!Rgsy(D*&!@i0Mf`x$bd9BBNNi9x|*h9IOq1GR^^92l7xRT`KUfXDAx7?Ar1FF@nL z(D(p{7kqpL+#Uq?M;SSI*&0|GK>cM0P<@4>KLM8B5bY^QcrtLn+E4iOcVrXRF9D7} z2d5V3`ejDMe1-#yKqLdCeJa4zVxYhPsjor%haMcTW^w|LFOXV(LHeT~7(n|eK=H!` zzTfbJgAI$*0mk=>=W<0H{G6!P06kBeg#o($3)DY$P$}|g0JkSWnFhT6nLz>4zF7cT zZ-TwQ1HMlcJU$9_KZ)fVIR3!p8(2TYe(-!PXuqx#bbkhe1(Ep^8lK?t0@NRX z)&@|02Oclw1)C3U|0sak>&WTX0yIAj9v=nYhj)O{k)cHreE%qD{NoV#z93GA29Ft{ z0igA*VEs&B|AWnQU@d^oUo$}3M-M>z#|;?V*eyZhsZQYWKduNy28M+bLG>TFKD`4T z{{-s?&!0ovOAhe+?ZEA0M0tXqzj-`B^%+<{c)S#n-y!3>;QSt;$i%3!feA8RkDA{r z%EA4$0O3;3d#qKw}QhH>b?fJ`@sDz*!d4E4CwJA$iM(De-?ns_y7Mr zB*6FQC4k}sY#*ZqXuquks61g{6+rDzu4w-o!2{l}4)vb_V~YehK0x4I5@P2r3_=5MZBm4hG4rn~+k6@cM_b)!TbFcK z-VpbL?&I=cc#-`#f(dLtXnyB2vk3!Z3s*(L=VUbjrUvl%Itz4u3*sL}jz9)zd*_EG zbbpqhL5xhh>4Sm~`!qpAGtQu5n~~u`fepA}!ot8^0lpuv!UD>N*bmvilfcjb+L+D2 z$nb!nMSpKZA}3Oki*Vs~0p__$ldGV*u#Bvj7GLXO#4n`8R?W9NysYe8Au!@eCXu2O1MV z>Ot`@16gkast>{G0}>t#0M9T}+U^C1JOdp`X8kK!KC_yeTB07*{|i-}H8 z5wP?@WO~YgsV9`4!1Cbvxd!G!H1`{zxnJQQC_Ei;hGzxR_!}a^?35%1DJYn zc;Lx@kn{z~{|tZO^UWQg`&B{Z9Yh{c-Xq8NLgM4Q0p=cL|Kf4~4VZdD?gz_5f1-$=asNlmYC|AO6zC;TDhD>(eY?SsFdSv~N1Mh(mjzyEtd!XKLd zf1|p;u=r08xIAM3>Ho~!z{cRj3ocJV>5T!L{sar|$k;z_6ab}HgWs_50IA1Y-jkZ% z;OYta7l->4K<=CHi)i2CxhxV{F3KLez`E;s;6 zzc)bY3x2@d4-GHe<)sJi_`=#=DS)Ym#uv`^3RoUm-aJIBuP=OuxepS)2fl;Cm+@0F zj`o5?B5HgYqQzGOnt26a^AvHKcOn5>_-z4&Uj!)p48H&OMlLT7Fflkm+h0vjj>Fnt zHQ3r;6~F(hGGruRi_gSQ$RfXu(}4K+S35>Wleh!$Q8zM+QKgm0kmYQ*Wk7xCEa zUkI{a17v>yn*BSlsy_%)Ujb6DfTq3!tNMo^^$S4iKYT^?Uj$b5jGvRAHLd`uKY*rQ zBOWz864AnA!dKMr0G)5gWT5yNSNgdThicwJH1izL%rp233SUQ@=5?T%cM#3I4_{E- z_u$Ka4;=l439$TxTwWIZ{O^UMzW^_vxk2SGQhoWkfI$Yl$d5sQ0dyV*4*M*y*=O(< zr+x7DB)WZ{knH>L=f4N2DbC2yU;rzRA^8W<9%2EFXB{|m=FAzN0~cFT^C0zkLjtV4 zmoTtkcqjoHI0l_Z2s=NEfw2Wt$1{NDEB^@ED;G2{95Mvg|48@UJz%hqc*9*F!|)JP zNiZ=SNG$je#93h>Bd8$2WWnHcfT2L<8Kgb)p@Kodfq|(~q(QRbfC9Ar3GL4~2sD5k z4RRRBz5)gp0f7e`u=9>&7%W^SfaM#Q3;zH2Li9fb!2My!cmue<10HYS0QYY}>nDmI zuy8~&fV46)Bm^-qc!0(`oRIW0RCs{a&#(x9*582E+ko1W5cP=g69o59!1@_DLJ6zq zRFLFpU=09`CxFifLALKiGDtsYeFk{_(*s5ZhKbx9j1J)R!^Chv@RMvXcY%cfgTey_ z3jxqkh@kuG!S#EEg#>6KorOWhfI$Yfeht*0jy;@BY1r6GxLT2|Gjtx7#SQuam@s3j|GCA0+BBUuNOjgKSwfnyuph>@dJ3h zGSt0tSllaM33D$fzkur_22l7z#{(F+VCfIp|Df>%WcN+@4{vWUfYc-I-$q*BWub~P zJ}KeA;J}~=x}Q9mxq*?v8NB|HApo=OV3+0Nrl@S#Ja$9|FxU2r~3I z%n(G(FL0o(cV-2xcYcVd4>-Z){|3jMQ+>Vptyc!45ZfxCbq46Qx@yN`hhQXha6F)}zXP0#_AU!Dxy8j=nSiXRq$%5%{8 z9H?4hWGE=G;d!CldTRd6mjR5QGM*i5dUE|tvMD>m1jzgjI6Z-kQb3G1H89Tz_#4Rq zo*#GsE`L5TF-+j9IKarDBG6#Lpbf4MA^nRDOlzR~?Kn7WWEw<2Okig4NMMbKgpQXA zR9G-*KlsSTFo6joFTo66f5pPU1?Dp}Sb)PDb$;PS?B56u@cN_&p#4aY@+kteUitxi zeI>Mf0j;lG5K_d@AP9DEfYw9?2ZkB3;PsIKp!s=F`3cHz3=9lj4T21y{K$Z9{kH^k zy@OE|^!}8HgP$|h7J%wA@cIWt_%JY7c>Rsw1g|FmjTaYz=f_Vd9F$;MSO}U%Io!g* z*m4QHp9U1P6PQ0RGC1>q&vOEYcLR7mY{o$eCdhpy3>`jyBLu+XQQ-M(@ct1l0nqve z@cc43yutO+3C0G{cxy!rV!m?)gVO;+LBtTL4U8=wi&+>PCUAK$Ix#GCOtJvof5^-+5u6@D zjR=Mb%mR!I&ax4PGT^FA8oe2su4_fYS4dNLcy+@9#KZ zD9PBu2~N)wK>OLi`-MU6IR=3T1vUzh_8^GQA@D#0mY%`=g`E!>VC!#B7qG}MEMzR` zFi<|g$jmVj*?kfy?mGl-U(1602hEQ&>|o&mnO`elS_Rr82g0EGJ%NdtV(FFc703a-KP&{mcly?-g8LJV4)1FvADzJ}(Bv2LcQX9uFEA zBn}CH+jk929Xbu*`CuOKegv?7@O}eX0nqt%U_QeRE716n0z;btn16uLA%cM!d_FpO z|H9#i9E=T@85m?5E<*Mvya@Xn0clTy+wTV$1yIl1#@0SX4i63gzY#nFjG*8E)z{$t z4YCOTF?59ejSwsVt*-@}4_+_N0bUPZ04jgM>un(G{lW9o;Pd!+5$7|3=l_xIt8n`p zApu?w3|qg#pdbm}FACXT^TQRE-azXeiWw9gRGvZVGq8Hl{G*eMBM;Je3#erS>W?sJ zptbMd>jfCW_ius2Q-SHhb7=nk!1UxYB>yr*fYuvN0Oj8Up#4@n4T>=H7d&N`n8<4Y zkDmpg_=cu0$ohKMzY#ncaCz|kxUvbL^_^h*7&^RQ>w60v7b%XX_ z7qDhTqOAWp;Sb(#69!t3K1GM&04ql%gCzL8#Q^aBEl~L_R@h99ASBP77? zgWMMYl9vR>Cq!NX=>9+%1{)X1{cH`)0igO59Db1S`T?pBK;t6} zVEaM(T0kuoMg|7>ePodQV8F=G2U#x<3JOMs16a#D5AVMbkn{qXj|aym*!%(k3!Y+- z(F!L(^YafIB|zgf3lQb02Wta!0uzG_-tu$>$i3k30J|3)UXlf%{X~%PSrJTG_<;6v zB9|Ya`BMo4MS%v^4-75fN{vB*7rb5!9Dd;P2-g0z(O`JMP$2OP+&^h>toqWo64ZWk zLhet4`;!ukG7O5K^*zO)@)>13M#Bn}|3LjK$oPWdE7@T1d^}|RzyrrBh6c$7(0-){ z@bfJo={2Fifv*sppZ|i#LqP6p0QXlR>AirVho?9}gn_X|Sb)`u;UQxNsJ`7{`8R^o z0n}aumv;(G5{xYz4Gc;Q0t$>B3P@yWpGpuuoJ@uh4q zXN3)Dyrw{b!9jtsLE#zbd`{5)JQmRYfRKfST-y#t35EtmmJMj*8KC|eIJ_7T{WXYv z4;Vba{axhs3=N?18tD8s1Gqc^?Z1Qg4^lsa%!8y)gn1m`@eu|_(D@#W>3@1S3ly9{ z=K-*Q)?;!rwn#8=DBO^QowvlGz}T?Bi2>5STF}DH*aGqI2M5bA%>IuoiQ&M)a*iPG0vlNS=RjdWK@eAg1%r^ng9-~SNP7j+e@L)k z0QKP+7!)Ax2hEoxKloT6(!f-}pa9*!c)+pnO3-ToML7n=2NITC4i6XwA{k@~K;w%F z3=&L`{K(B<<1|C?L4k!5#C-k&3kE?*`2$W5ycVGG%?Sb=ATb6O2Bh)J0|g8P(De}w zVDoN7GX?N~*RO%n55oaQF2)vq(E3kMA;83-peWz~8c%@juLQe~yP!vgRRLi?H`sj- z3K*d7VFKF^HV^C`bpJ#65c?ydnF1t0`@1C@Ap2<;7(nM41~4cJfbORQx1V?f7?f^E zK+HqxzroLMfvj%|@RDKRKETKaYCkS;W>6G3)DF7ufPOL{~+n0?z~+J74>li~zi_Ts<77~DU{!1Y z?N>Sg+8-^;VBr87|6pKZ0Jmo${s-qTFkb?^9`XQ#0d&0+rv{@FqatE`BxJwI1||k3 z4+qfte_07e`27_eet#nb!TV7l?O|~L4qTozFereRw=pO%6*z$RgDzljdH@=~1?|T| z9>0Q=4_5he2frfJA22v*Fo0Gx2uj*o)syCQJ^4`c}=!-I+!Uo;&=1Q=Vm!QmlL1lpJn8n2QBm(L5p z>#srW2c`%{*#2DbcoK4WS-61uFYxtL;PO!xUVb%z*V{tE3v3^_{NXOJ@Bok3L)Wi^ z{Rf^8_yq3%LB@|3fa@1f`;!4;9(=qAqW%Db0TX0A0ct)dze3H2&WE9`|kxRdKnoEq#)`U6og>$#UQ|t0N!7g;KZQ#p`itI z9s=mRL2!62fSU$fyg8LBcY%Px=#zVp9~aL3QXYh-NF0Y4}kg) zTpWKv=U*{E+Lz$*W%&FJV*xCGf#SOuGTw#g-#uVqVweExe+q!cQbFSbp#CSgyaSh4 zVDovw{ZBBT0W|)AblyMn0?_$ENb^Og^CjT>cb$>bM}#MMet_)x8qoX_BfLGu06zap zlA%Fvh9GRdi9rDxpA0Rq_6mGHqygMNkpTN2vR@sPo+T|n{j~lR4`XS)~(hpicja*&{TkMc&`^gvpYR_pn{*8dBhxDI8 z>Y?|MNrC47K>Zg;dMY>s>yJX}Ux@jj@j2M|Bj~($(D^^i1q==h0s_B2|Mx$D8o!@G z=bv~mI50RdD1zsskk0o3%TW(b1E z8x)=}xHKTg-wqv=@dgDECx!+IgFnvg*5LiC;PfeJ;rJ<2tpV)6hX4P)K~*ED%?7U6 z85k5K4M6AfL;T0#04`r)^Ecr2E8z0(z(bB!r31=O7#tc1`G-e9lmj+C2UYyunaQZ%;*6!4|={317iy(xIP5?x4|Wm zp@mz4L1u!e1A~PEWc(e%XJD{UP(Gl@z%W6U!9uPBl&P5*7$gip>&rpws~H?7C@6#b zcaZo8-G^|9`2uLa8hC#^X#C?d^8`i)Ck_Mf`6i(8qy?;L0xg^x3nf7P=~kX%aDBzW zU;(#40XROu-=>v0hK2Vp!p(&fB(Ii3K9fB^FxsHd{`JD_qQB?pVtTR?*XO_ z(Ds;Y1mt`OP=4}o`5PesK5q%!9%Q)i_rC{61!ELwe7u9f2|V7x0U9q>ydcED-~mn# z$o>VDFUWk*`d-NT1@Qi5@cIQ#jzmW$#Q>(Kmwg&Q`@_ymmvf!cSV{?aE% z`vpxNdVU9JJvj3DV4(69+v_QvO2-(kDp}@=tss9c%g7P!CKf+L90UDo9WN49PXaJx01PbpPpz<8N-VVIJ z1C$g%<(UA3VgYzO5Hx*t-o`(a?~r@`)lmbY;K3xnMQk`iEO`1jv~BLH;Y z9)qI+gOdVN0xY}~8b8(hgA^%nBp9eLC>&s#;KFghkpVRRFkj)O_y*8;F9RzhV+(J? zY^9r^NMmA90PR1PXqc{WQyez`2daN3DBXaRcMl$LNFIW^N5XN#Vvv8FI2sZe98?}K zEHF@b02*&&0`Jd#z{Jqt!N8Wx0Nq~)2`^Cp0TO}MoH-ZCvAJGSpeFqvD7+aVsK;w4|&7kv9K;?mC0VqE`aIk^yKSaN8jR!p5 z3Q2E}@iF}NbAZod1@DIf@9$>>kM|oKYGQF>_{xO5KR|%tg*u{q1&@C+fcB@c3NR>6 z@B*!e1GRUU93FnkR8w$jK^d=rxaWigsJ#vL4`}@U0BC#_+J9wG;Q0(XUln@aDdapf zZ0C=GqLKkx{z=$_+CL0F42mBV8bJ9;Ad-QTLBVZ?-~v$p7;=6=fr1Q!!Uynpmn#Fq z1dvux{cgda4DPQ&>azj~8=l8l?T5xEe18^1{RF3H;PlOaG~dm@prH>w-ve|%IjBDj zzTbhPBUJ;m|J}&OErE^U3_un=g289>IJqb(}42M`i=dW@XFgPK%=b-WxmVCwF^KUpdG=9!hb6_@N za(ckV!PvsIf{{T%MS%-6ehN-c;Qq4!(**`6h75CX{!D?6&x7-q#0pS+IdDVNGbl)I z0JT3CI2kfHF<4l`+9%NYf(fAUFi`pWfq~(`Y32j049=1T3?Tvn4$QFmUFHHC86JfX z3=9pP4?Yw~JUUsBAi=PZvC)9x&|%PhEH^;=ny$p!+i#K=(PKq(6hd5fU318JJYS>cQb9xd3#&Z2)r% zgA>CH#lI0e1%F%_q4R;D`7T}#2AF#fFc^T>x5z-&YczoG+l099!~BE$L6>Af28|gR z7&<`v-5IzU*dhKo&|v5U=|9RYu!Yvo3=AG1_dv{t-`9aVeSBvA@b|wL=Zb~k^Z`1* zCk)*F1H~UWycr}+QNkD8-n{^t|9hwiPCp+&^|wW%1f!w@a|3Apf`Orhvw^{9qUD4p zLnfyLR)&V@94kQgg&tsHXz)DHn#|B5nUN^Lp!fl-Ujj5<4UR8R`>|Mo0XhAE?k8n| z?Pq$xFbA3*AmIZlZ?nMTWgHbYa>5D>j7tm@4zMLMK+ih^r`H1?FT4!qt^kdv3RF3$ zIXqxwkeJ9@&>{y8RVIc7p!@*I&xrZ}YQBI4&u8#_jU;qD0%kv?e*3`C18(1d#&2w7 z*i1m-1?jH|E&%N(4PXZCU$0OE&u657){nr_BgA}=e~ZB74R-;90G9mAV8Qp9nc?4m zFImvAEHwRq>Jx~564HkQqmu$ue}_3}J{>e)3reqtm>VGHW1;3xaC|%{SR>)^;6Z}q zqZ1-x*}S(*aO=;#$BMz@Ql5 z{2W|fvM|UNF!)G-JOK(w23UIx)ZhQaya27eF~bN}zJSeZU}NKet~UbB-xV_#psCN0 z1J?(j{N*siK-mG*p5|Bqn(s_tW@hog$iERfeI!DYbU)BZD&`RUa&%^>}6 z!TLewH7o}C56S(^1%FZ7hZ-7~^#`Q9g0%Mo{{Hu{*!1vIR+-be8l;RP(J8>c5r_}vO+;dLZpBRR=%L`Ux&0; zAmcIE)<-ZEI5;pUGJyKC;PfiV&;nY&C}3%z3^5<v-`2ci2EyyJ3{0aDc0?2%&f{>*OsNiE^ko5rFR|QIc3=Auf$^%^I z(@JoNvVq!Lu=_62&u0^q0JUEnK;r=nKNP_An+vqP10FwQY5>It*uDph7heX0)(1%l ze5i1Mwr3&X(NOW^lO{uBg-8RpgMxw(Xl{&&fuZrl(_mHy1sR5f$4h4)Q8@51WnVfc zc>XHE0kr=AqdP+o^86Wtfy_JZ0txu~|BnR^f*2euK=c2g^GX;P;QQr~#>2q(XCl`3 zK_!lTB6_DE}7HWSZB*5o+K++GW{@?|#4+Q%UJl@7>koY-U4KiQmz_f}%7?fTP zfY$SZCUsgEWH~_Vb0O+an1I$>FgQpEfa@=?eVpL&R)~I3`aDs=!ocw4BWOSWg60CA z7LE%7vJ8qF9IaTK8kkEtS~wa6WI*$A77R`fO`!XAW`M>!91dDAI4x)b$ulsROb|?P zv}SR7z*NT3!g1h$ER!NbMT>&6LUTDsi$n$J{)7h%7HpvX*$fJt3=C$V^$7(E$_ya) zOEB0dfXZtZXn$IQfk6c%?}OlLfcPN@z7B{VgWwy0_$g4nBm)DuKV1UNPmuXR2P+8% zZt(sDP60(H(D}wJp!q>gMo@d+1$6#3=)6jhdm!Z>BL52;Fvzg~L<(O6MtFU=LIb?s z&uNArq`U;h7Y8_e85lYYl)>=@H4k2XNPy2vc;Eo)uYuGvf%k8K&nE!qXI>3>`}sg4 zD<^zDWeVRX<^X0``wD!X2sl0=I!Nd5y8gEKcrqa%}I0(3rw1>95twWnwBeF81G zaON&p03L6FoqvU*A2i-xZ~&(~Xnz5B!2_J~p!I;D@oHv8nEMd+gWLxiU*;}QaKI%G z>W?G#$1^aTkVMq4pz#ZA`&E$h&kfDL5s>{W;PW*YI!M$%Lla!Sz{WccG&1l)?iXQz z`3KSdnZj4ZobVsDJ_prT$nNn#Gmnvgd7$wd@cMjECBh&8K3@RYydN59?qlb~>psx@ z6F&1m=@;odh69WQ%oF&B>R-_L2gvayp#aVg42%qr@CT)DSq(-fSo^U;^=||(IQ@ak zC-C?cq&&nPz71&YCD3_Xvf%U$*3Y1!3U04^fYxt-&Tj(Q2TRX0_==bn(DWyut=D~_ zf)<{v_``F^|`MLCEnpLl4~E4FKKO++&~szAq9~ zZ8I_~U}}N)Phj^8G%z1vVsHkXp9~K_9k6?0^TiFI{xi1&XnY%1zOz8~e;qIcji-R; zLwO4tVC(lDFbXlYNHl=XBVo{h%;zyEa5GGin<40+miRFoCCt*#WeEy+8qW zz8`o#0aBhe6m%Fs=OaM-O%xd%Eetdsfcndl4i0iNM8SM;`9z2>0agziKL-urg4-tr zkn`?g7IQ|FFd_5$7 z7;I!_2tHtNF#t7+VEc~>3a0S90I!FIrH3gzMWFt>6KBB!7f}BgR9`~Zu=LL0&|{$N09qf4oSs)e%16BE8Eii|Js)CrK+Depp!slv2@DS< z9u!RBa&Tx7Vr+r*cP4<>H-X9nVbFRS&>%6mCIt8I7#JBK>yK`jf!EIjFeoN)DDZ&> zmEh+Ig4TP3*B^n?djlg!hk-G;e*Vj#;4%YLXhGM@K+YRF&|q8vna|?|*XQ8;51!u; z)Bv?#1r`~wI5Aj=gZHO^%Bx8R;PccN6eKkm9hejgm_Yqk34YLe#y^hCis15d0Skj; z3lsSM6o@=1JqW|rr!ojIyx;@hj{rLF=SQ=W6SzFZr+x=iJ)7c#AI(fK^`QPRcJn(x z>cQt(J^0bg2UV}Z=)eMXFS>goK@FZNce-#p8}_61`UvZ z!0o9AEDQk?KvBiWkO1yKfYJkUdCVaLZZ9~&_QOV~{EgrN`xhL4;P6DQ-y(Rx>-!mC z>an#)IKcf?@cb5}y$SBGg4_Gx{*$Z&C_RA9XW$S8=MT_&e(?P%p!o_8aQ}1y=zbpX z{W?hQ1&=>L=bJ$7Nu>5AqQ3$0FL-?cI6P!6;Ol7^Zb*RK&*;LU2zHMGD}%rUNPG1G z$bK~YCNMAf4_lA&U;$)4gFyk=ybN`4eFU3d2bZ^m+{Xc)PY3TW1D{8RG@s7E!pPXd z2`-O6Ffg!qG_WuzOb`Z_Pav-dFj(+_(+8*?a%h0I_c;ihR|YwsOaRp12Iog621n3% zK6t(flzt@*K<$$N`2I{TgPE}Pd_4mvR?g70H;0G+?c=)mAHLlnGTA_27C z0CYYjs6MiQ)sNux13F(7d;Jb7e`Y||D}c*$VFn8?Q2&vEL4W~Ne!=SFB@E#68=W`{ z8XTDv4M61wczv6s0K9(&N|Xu$29B`t2r!=u9KPWFaA5PH`4PH53D$prjE6UX&U*xh z=L3cr1`1&RLB=b<_vIY;Sm4qCnvVyM|A5v{i6PnxOBkF$>&cyAv%UPKg)oIX&~cqVE2LuZ0ijSq3hka3l>N)Dt-X1X8`+$+u)Bp`|pR)`5G36*98`G z3=bF!rhwI6A}5`29q+&&ow3psFlVqyTNXUKV<;Pt5o1Pd5iAo&FrKMV?z3>F@s z_7^PvAo;ZbJYEc%??JXd0BpYl(e^9+2e}utz8yUN2@X$4cp=W40IeT_x%UHT{+_t< zIe~$}qk)Bu0i}GN!A76*89IJwqY4EW|+NDJXw~_isF46!3(Pf5Yk{hTAzeyFF@i~L4ZTe z;eg_Wm%%W;1%rcw0)tP3tU)8sUQpM9iGg8;1TpDT1AqDiw;w?3Q9=Db1_efN`vJOM zmqB78H$$TggTe!b2Jn6ySpOMR-+Tt0C+ZA3k6b_iG@tMBAfZ6w8k0e*9D~A#1K+Nn z1K*bh9?w6(SkR!L3@(o$@e4c86w>~a03|Xe28I{l`W=!ULHDM?(MuS3wQD{s=&;KLi*VoOml3 zK9y2Xe?aViz~G?3a6qvT>v@?jpzQK=(EJh1zsU1_D})jE$$-`$J1{UfFUUkgW^>LY|u z!w1xUKyGh?_BS$FB;wQ$8b3p<2X|uLfHvN;;NO1_uzx{YRlvhVu=ebOAE5Mo;m>~$ zCW}U#=I;>18GhjN;vnaPf#x$2=@~uz{vxGkhrj{c$}gb$7g8P|_BTSxD{y&v zKoC@37J&AjJeU9qe^C1u5{goZ+`+4BZCKMzl=8r1A{<=-~uT@DX#=ol=Be<7xt$iZcQ`i*1iLkf1Cv`7#LI_^PQ0Jv~X)cIxh$so*WD< z9?0PdFW-^F@4&zRUQqP{XzEeRckuaN4UY{OI3_~WgZ$rc7!+T~=h+qf`|ly^09tB6dV8n_vUMs+`15_RmjE?}k@iCakA9k=J+WT`DoJbyjs9>eS_ycj}CnS9^*r243 zAD?NTKH&A40-`?ShvwHA9K@8L_|pe1^Xm;}GV&{UJm^6~gMkKkK7+GD!I?pkA+Zf~ z9|#9Si$uW#StdouehyH3g{y%WUj%XAiqC%{ zAoFLC^%o%fA?-6n{qqv!p9zADpz}XL>&sqNJWyg-`0)YAKTJIgpz(4!I-ii+A&`MV4-#G#AO1u@`Zo*?p!4WJ_nk{v zfY#$REP||e2Ay{bHXk&<#c+Zf(Vhj3FM#gTmVn;pX#^gBVNl?dcnDta20q_~;Rpi{ zc>EM>A9(*cuLEd3Ihe1|%EB-KdF|;Vm5QMF#0Nob^+TRS>-v`?7C(F7;@%Y;;PWg%_hEtdQ!ya+cO8J=j}E(!*09bEydMn`AK>-X;QMKr zkmI8Oc3u@Ey>Cd6;aLApaf$@Bb0B0F7UR&110m@F#)?v0oFs|5*YY zUtoFge5ov0J=p&Y9_--#o*?&w(-Y`^HYN*De`^9Xy|FOJIxs@+4~NDN?7TbJemUrT zHirM<_fdoIBLmx~pvuTF0eOC3gAGw%g3W{P9|e^c#mol(|9cTKUjjVd%g_W{56)Qt zDqoS;6NAc6*mwf$d?E1q_y-Jy63=7=K=L5>HGsww;rsPKMSKz~u#GzbOM_D}&Pk(E51+3mX|W(B+np`B7(1@cBgoid~@cg$sT@a)kv?0c8C^ z0fQ2#ya$zkpz<72KEmdo7!-sVEI{Qm18DwLf)Tu**$c9tx%k0BVaAr%1q^Zm7aqdr z*B*h(#|H^*;Q9b^zZSGSe85-{!N6T%kq-_g(`r~8{|dY7nlGl|B%ZUj-P)bI5Zq3LF-u-FgStt<8p$_5Ab;? z;Pq=99iaX69~fAfJiz4%!i=mD=cGlIq+6T<`$AGBW^+#ZmD?}u&x?cZ>g1)m=T@vj66xI6-_7lWVA0!hCI z7>uC%+M(=URN~8F+6+-=Y!+-03v<= zMa&b9f?$6Q|9ml|JfY3_ zv&Ro`c#$-|B;jBw0^UypU5|)zz6b~Ee0j!)KM`Eu^Bp!gJ=qL8uat#>E8rl~cq?>1 z3DmL!)sNr)pq_v2!Ps&_LlJa7Flavea7!9T%O!@7p!CJSz%YRsv>!nt19V;^_`DF1 zDGHJijttBy2f+JDJKloodlmsueGgjCG6B5*0CfHgIKLyEKLZ-S{>%)T&j#lg2JrbP z;PL`=o)-tG&<3wJ2?0+XGBPAsfc9g8&hO`F0L|Be@8bra$Hf!@+V6P)G@cDT&&>gR zzO@6xA@Kc;5(1qHLJE-m-Jtr48@zr?LC6-izX@?4EJMcAKM@=ep#8BAet^!;XBA>> zVFHII*nF`2gkkF)83Y(CKTK@?uACc8_fYgKA z{zpM4+En0zQUJk--79zqtT;zY}ylCUW_k0V;nX=dUof7$_((fc=Xa{#*qt3Ji)0 zLXObz#TVW`9;1Xe#Jqq;7f|?t<}=X4?*vFa3E@5C@t+7zaQuB>=wfkl_#zD658%=u z2wtBB4qxQ;J)rX_k^O7&?GNZY)FANrZz%nz1n~a#3!w0YoZkXoPp1JNuL8#}*n9>D z(E4xO;mhb@DF!=_i0Rq?d64$afdm(D#4v!)q-O%1cgc{%06s5V5O$tBmj{EyM{s@* zVNg7P$nO!1pK{^zE2#NB;}a~ugW9W*^X^}0>~vyzSa_?A<52SvUcr`62C7c1pz#d` z0q}kWo(TB*R**9%%7XJhI6pH)JO}k>K z&UYiXW)=$H4W2tOD(y0+lDA z`!Yb01iG))MuVZD_2l-MkoGKWeLsT&pFt1oz8Y};2m7aku>!O|_QsDt5gY=V;QM!0 zfX*Lwkaz-?Kf#y*lArMh#lN8Sh7-9#=VJ>zC{R!UE!+dmA2P^bzuyLO9|$+te-9X7 z{sY~wgXKN|`29GD`*pzQt%AO7S7(Bp*Hn{u_U=Rk~ z*Rm6`9+l$(IKB8Z2!hi~0_gq(PN&qAR6c~Dd;FbV8*Vo*Hriw_I590`WawZ}c6h?Y+42!wzC+@F#`ixF%y9Le4`1XGZ21G02c`c8@O}!U`%%F5 zGZ#28IH+u3YG813I8wmSAPWv(ka`A&6<_|q_lK-tIK<4r$l$~QSzpS?*x;eS#K6$P zRl&dj>MvRFWF;^aFto@P7$|^)o{0fGz9BOKyx#}h{{__-Oa-9x7X&z67@QiOPVi`e z)~5_Ep!-Bp7+ZK71R|i}qwsNt!UahBM(odl<_7@_J`GTR(g`N-fKuK;>TA&YR>b02gT&yV~?oWW&X8`g)IQ$^-i#VT}Cj&Hp3=Y2p(0XCn zgg}^o7-qZ!kMF?ZA1V(@&tUZoGw%P1fcOub-WVqQ|L?(rh>ryD`KB2=!R={KdpYCo zp9nz)20v)}WDxlM-$Nq6QUcumf{jlZIR4I52cK^QKF1%fKO`eWxPGK5+STmtlbibp0nNeL71BfX{ohm1_=Dq<3o^b8ir)ht>OuS6 z5$98b!XHvzAk-s=Kj?f3M1F^y2PO+zr4L>Ic;o3G@O==_@&z0|kn`ig`}M&288luB zO^*y4{{Hu1jBu0!H6$3A7!;VE|DVSJxgQ0zf5QQMK3E3mJhKO&^U%QhB`ZMVy`Ze+ z#L)2)Tz@byGJwxt2H%&##laB4u(0ru0fUn>3o9pNJ$3`5QxnS}<^om*XATF@`~ztJ zWAOt}eZy7Y$snW(SziKbU&;x(lY*oHXuYrjXg>mj2Wb8QoPGotHh|{iKuDY^F*KY2w=ZQgKM*6R)F#+ z_C!uAO1veBGQ`z zLjvghJqtM@1;lu%1cL%-KL+T2DuVI1;}&xK9byKZ#|)`IE`ZZR#WT$G0IhE#K>gtb zTny}x^k~osI&Tov-h!lOMEiuhfDv@xC(}+I$a+9Qh8->w1RpT%&|zSxcm*o2K>Nu) zFmxy=fXg3F1_i$vg5dC306KpaQocNx#GvBE@ZuR}`EmzVzA!N`Z}^S6Uwy`NSbhiJ z*8$#tE@%-U(`E^--$Cs;XNdbhK<`_F&Hp7R*z$d3PWb)bOE!bi4;mi~D?sBDpz>6) zfnkb*0>cKx{T>0}`#l&D=O_ALIX{sDlwU!o4GVz%N0fe9MEj0m#fLu;f?)eEfa+(4 z9q$OI2TA1g@bABe1h{@V&|m-?FH2x#Vo+QFy02#esQt)kuuzg&@d5b!P0)TbSq26l zSp9V3CM3PIL-V@JK>c+lh6l*!Rl&~hgQQo;{t?iAF+uS8mJt8n zxc>)q9&7~YK9dD}pF#6&PCStDCQ$jf06gDNa1b*7$Hee}m6Zo{@H4nSX2Dm)oCsSl z+QC==>hHdIOE^D4+=B=|Ncsei=YjJxM83elf=2^9pT=9j;0J9FA6Uu^o9_k9Hx`4+ zFE7x3K?#8e0+!&6%fcX=f!JRoaSsw+pz+8J3{KGf{Gj>_9G(kU!SliJ{sq{7Q2QAy zcp&G~!rZq6+I~gIe+G}QLHG^e@lW*eqZ@C){R!~-85pc=DQ*Ds|KL-3En>n zzHfp<0(5>es2k^`019t#`~L)^0aJq_gU0XI<$1goV>cR7)4}O5ogJm#aY+-T;We`%G0M1XK_LMBVf6Txj@d!K~?*r=3 zDnRcK;son&xW%C2r2uM=y)2j@!SGPfv76-(vy&KS%Og;EcLBEFfra4*Xg$P5M$mc) zaQXm;2dELjAi%KWAx`sWp_#AP$##gDNr;yu^CKRD!V|K;Wd^AK!_Y86Vgdt$fJ#7P z7mE{f0TY8WM*)Kyhd@CiDEyiQ8C#e(IJht?Ivng`abjR92!ZV1V0iH3^L*%exfMPN zJPHC69V8qW9yJ&=a2GsqVOC6Fu;D9ya8Q7^#~a3%V5;(jJGo2Xx;;gN=gngO4JNEnEx^DiZ`5 z3S1PF4;V5qOn{_k28Iamd?|wh3xkE$guuic1)ux_2TLlFVe&o*dA%8diOJav3PZs z9~UsV30(Nd(8YG>FsQ%t88#osAiz)oD*vGEl^G09p!rEBUXXfFren1g{6506q_bfaDj9 z^$4)_Bar&008}3^Xgmj(ukiH`AoG#)LkFmQ0M}P2_f>+_<2E1ce#rj46)*lo5L(ZI z93Q2OsPUn35AJ^kwETVwEk8a4<@Y9W((?O>yEx6aVni)Z8avnyF&`2jEx&`te|W*` zPr&I7u^*^Gu&Il|i5YZ$5okRUbbjgqiy&hQvj-#SK3$MJ=)U+Tha4V$%6-=8^z1fd z{tcF&K>2~=G^jiQ&6hk7Fl2Cg0Lq`74FRr9iUx{?3{DP7p!{6`8V_b*uwhVEU=rnQ z;RL&7#tYn7!(=M=g%9ApzS{i z30<&%Vdot(qWPBteE&lO===}xdM_peMJE=;1xzg*P717`@m&VU`F5c6vEuR{(0R(B z`Fc?M3p}0zT2CY)fN4MI{ss<)76yriTs6>o0)srrc{PmS^Q{$_8PXUUzKQ?skpQo! z6kuinug_pmV4MMJ?|cBYha1=yL^5z2@W`}p1l6}Ez~@`bg73EjhZlndsC-=W!n;Slo$HU`LjEgmck%ngbRFHXYZQ-I+JgVO_We;u4YLFMx&<^VPZ zXC@8M`YeZHMh1@q3>vaegl8~%F)U;>0G(Hnapg}0X#WtXzkP(kDFJjoFgSg6K<+Q) z0M+*^K>dHP`QY>*3DU3V06y>e#qB>4g3$DN1a!YK2ZJ-m3dT=)Y6(uD{ZF9tR5=%b z(gV1?4!)lgdB4qzOW^swB+z^kY<&=@Dgezt*nrL-V}za82it!S?@uv++QSTt49>g- zQ{{qMm5^FOG+i{$?VE(T|g9iaJo@OcFZApc8({hz?x!f=RV0V@Oa{`mkV$a%^P z3fz$Xw+3u}9JJpH+CK!BZ{YqsxcxN&ynm5n#lcT`Y6}jbhVKL>10g2{Q2z>~l#yXW z6X-tq)KM;Piw&{6XX490d;G@Lyt}e1NThv4wL1qo0640P`9Jg$Hbj3@ses^STHKZ4^s0X@Bg`Y%}G+Y1)o zKW;$!H=zC?D7}B+U~oo?AC3lA24_wKMK{p-m<*u(e+&$u`^9}g_k+XEyMVb5k$!u? z;Rm`uj@0zK0@OdilYTuw^*5gMtAXa94WRMc9ia7H;PG?h^xJGCaEJqRekR2I227yw za!~w0)2{@v=~vQ$H2{>~LFo^qA2J@!z_2y0@5QsC@pB$z zz8&m7CUE{@U~Ex>+>eb?z8pfy-{A5AT)uIzECBWIGR{NFFHnCK6rTnl|3lK#;V1Wf zz~*y7%m>vE;PFz3eo#>;z|eu)dJ>UT(e(sA}r1P?fUfcXjx9gHoq3lQyr6^CK< z2dKU%0?R|@s|rB_8rk;lI#a0tM|CxM}buLzufghBah3F8XTc%sBPWdB0;TO;y^ z0D}QDg9CE-d0hDuAt8ZLzktq{VpdR4VCcB`CxT}KNFL#S<{6;&oCD~7h6QbB_oK8Y zW}JbQZw(AR3JMSOo9jWx1Ayks;Nb~r-y_142|WH1aQOLsp96tKu=!kA`OLx~djMXa zFj$p$qw zd+_{LhYmvnn+9zB-2mLa0hLdJE5P-+R4ao6!;XF6^27nO-WSwf`Xc|g2U0!+Fh6|^ z>3=XWFo5<)!^;cEd5VzmiP#73PbNX+c&^ zA^9ItKRSWa6F2C5Q&1rWU7rH+FJwG%!LR>bJO&G3>wUoG3AlXdV08HVUzMTb8Z19M zFoWj9LHC6-33LjuC_E@&WbjB3kzxd2B?3B6y#ri-Feor_ShzKa1~5+mwJ#(XTVxd` zx`AhHnHU&;?D-SH0ZxzL^x5!5{cjH!IJ^UxpFD-cpDbu&B*>AViiv?i0en6`D5gNy zR{Z+!0d^m#k;Ndu&~YAremDUtkFe(lQ2JWXcIq@rez=NcEEfV+-*p2GDphj{+mC{05Kb@&+(ULd%l` zRtC^kHU^Iwg5dKX7&1WR9kf3=hrtOnpNP``0jE!Jc!9^Sz~@bX9LWf|Uz`DS-UBEr zFftrqFcN^YKNvh1JtPDS!2K7{{fS)Q@wNhnB|MP!mrMYtyaa`R18BXmx2y*vZ2pm< zVkfM<0Y0DMfT0j$10;OG<==si<$rph<8ua}_767uB{U5AK3OcU@KAwWsf3e{E1nRFs`um_n z4jO;o53VnL7!)6HfbKH}?U#V+|6vVXFC_yR--Omb;F1s2{=poNgt}kQfl&r@J|rkT z-q?<5KByQ3-QNx|AKbo#-S5Hx-cP8Y3%dW70UjSn=V^h?pOgU4Z!|DL_Ny=`NP2+c zV*!(qfD^-tePH{%K=WY=e8nJlwwx|tkmOkS5VYP2+}=K2;2^^Q;)CadSQzdwShzs; zlQMwjTT#;U5BPWpIR3!rdxAop5ptdu@_DcD^vnU?e~Z`;#%Ta*UxLr;1mE9*e7?wz zU7+z2(0C5`{4MZ!fdnM|gWJoX^Y@X{Q^&SH5lrCyqYnf??FUeL;41hd3p&ry0zBT1 z*gpjdf6)FZNPa`?pMspvTfo7{lL+#Pf`Eg9BWQgzLsA2{{E{eOV6;$0E+0YePXLd% zu`qB<5cIHc>M(e~z-V!jrGSCKS;E4?sm&=pWyR{4>>e^ zDp!MyuYtk?eE$Z>CD8j>ko9+*K$I7_?k`}FP~>W01&?<&fbPHK&`@*)pJxvm4`bk% z0LdQ=R0Nuy<02KZUSQ$7ba6#^4)OXyZ4^Gcq4U<9lGfFsa0PU}4VGw5MfZWFj z%HKyp^$7!PeI>&Lrd13a3~NC5DT4EJ1JZs0*n90 z3Q3^#Pz4MMpsN&I7#1I9)kc9=~c}e!#%s#8a>!KoB%E#Kdrb<;?w= zydI1}(Dl*_K;;u?|2uR)hytreAap(ZhaZ*AIriBqf+!iVUZ66uA z8W;{SvogTWBZbTtN$kR`@1gf2gYpMB{X_E00r+}KP6Nfy+p1t=0tCz5_2xv2CU|Iqx>J>m8Ud96;_c<}JIs`Hx&zFJfUx@vX z{0O>#0&-tb0z->|0eF6#!yysuo(@oZiG!hq1=K!pIJe-0tAs+Ss#hW;yutM~IR5x8 zmM}a76%wHHX&EvYxDfaID6oLmr-Jk|BycbuGEDfw&xmm!5F~$2Fk(0a>Xb4lK*D>% zttBa%3R9&-8w5RAf;tQn7?$vX*XKLw1~z_bgN%Q;u%1bt1+p62{sWaF3J~)kV}12*pggN4L9ZVy?8hXND4VC6g1{ZUIwAnu2R*94{|;Qk2<120l| zee_2Q4-1KRQ1=_6hR277B@7M^Hded{Vy&=|VO_9l)v8rm2Q~(Urh>Xwj0^&dHemA^ z6nMe+FM-|1@QJ~vfziN);h}`WPj?1Q2Bu1p2CfDN20?`hUazbaTi#quqr$#uz>HUuwW2U5a_f(x&Hz@pAMeimGxj$g0@c?eryBx z=X{{&Pay4wX8^TN!1V`{1LNm1wE`#5eh5(gfSez85TPG*WX1$R0Y(D`CkF6!V{cc8WNcr`EvBCkmzM-K4 zP%5VW6@v6!JnvcZ8tKtZ6O16qD_SJ)^(%|8G# zpS$1y=)NkbJPU&?hlfjpDA@lC7(nHZz+YE;Wk~*4;8?|gv>yW;e~|Kpfzd*Nfd#bR z5R#r78gRLn8_m5a;lbbl3y%gHX!?Sf4_fcazyP|B2GTzI06ni2w4R&6Nk9P69*{M# zkZZR9xgWY8+JHk2ww@n!9tp&}1OXeqY;byou-h?o510T za()UlzCh)(e5t1IJ24{DJ1DKMSO_|S_8)@QH-YlEq=6;_gUW;= z(EdybP<%t@uR!O$g3dEVw66pp<6F@6pdj-=?t!Flg#S4!K<9&k^DlV+lPpqx_`tvb z-5*oHVZ)Ps7<9k*9S7)odnSfv4u%#cCIcS1cFP6^2B8AyCI*HH7iVxVFf3tI0=0)8 zFfcfC88E1|Z*=5jU^vkX+F!*3vIOdXW5MQ2*VD z*?_^Z-SPng1Cs|c<4H{QQ1c2J_zIaDPd-K-4+NVBEk7NeUI&ezp^Qf&yQiUnub7$f z6k+}7{VhoNCuB76WrM=siMK-GQx&9rb%5~^>Gui1-TM*ZUUd7Q@(oY%%O4;h&+rVt zeg^{b4Fu#Fp5r&afq?u00`d+|KI09a0|ew9o)XYcK;GdQ4*ihxGQi^r;Qpi}1A|k8 zU;#q|59EA)(0z2U_S_55`~vv=hXxKs28RP1Ss5m9S2Qp%s0b7&FlZlm$igsziNivm zLG(cd=)5IRdyW^(2baGG5?L4~aBC%LgWF5o1qPt?U10r!2>li?{ZR8}pz&Y8 z_*`J~1u7K4?Hd*b$o?z_1_kJN3pBkmH1KJF*Iy(1M*`#@aD4;m9|<}!G;kM$z}>^h z3il5Ks5}Pw2Vx(F`2ryGH!v_bA)CKrFSz~d!Jr5UFGUtmc(K6ES45bPHM|@_>Ji~} zzz`8W@bJJ4&j7gjj7*^L2E_-4dlf+Loq*2>!b1RVULXs@1RijBL*f(UA4qs3 z$0s8E3K8xl6n+LE_n?Pg1!#T)DZL#8rJo8Ln0uh<#{tAg#6Kdupz<6bd3gFlc0VXQ zG2O2NSC1$B96;_pfEIoyK=UC8_c}1KGECqs0J-;r2PnNhVquuT%i$paZC@)mf$|SH zJQ3-ao5KN=KRRIP8B%`2!k0mT8>}D9KLBzcH^jdUF!fvg(sADo}LD?H%g@evW93qbw>a4a&cm=}`r)9~6Jk{H%dZzacn0;N=6@ ze-QQH^al2i40yjhj1M1QPXPI60a|=mfW~hT@o@l@-?%F*;O+@z1;qy>e=smH9GJ)g zTfYs94^Vg`+yhF_(C`L@FDdRT0J#r6zs*3J9|5)JA>|LkeW370POsqbh2&3={owH6 zEx-fvX3l zXB_401dw~t<2PalYWWHZAMOf7eR2^|e!|NKNP2p(0+#-ue0X}smwxfMZv)7E=;gtV z?WpbpyQczCK7-O9)cypRdyw-JDEu(pg9tB>f1&!}^#QVehW$De!$d3_6eS z6XJe$<_XLU&Y(dSMg|7>{&k4?28~QD;H4hW^%jWzgt7^s`6!Tk7#M!62G0k8#`{3$ zwJR`0Ft$M2=MJFxorc!4&ym~b3@dj0iQt6pmtDi))WGV%(DEqZ;O9!U3-I${AofGd zk5~gc4+gs4DuNNR{<7g=14DzyW6=2(rwbeyoR$P8Sui*pW@P1<2o8^i#v}`d1I!Hn z|9kT!faV*(<}F}lV3;Ud0Gn@RV6a#SbH4z?8U`l?#Cl-R`tBm|ep+!*0D&SIbUp_t zJwnfiSp%9MfSeEG1nplRAnSY>4pt}7`o0!u{~Z#34~RY=2CAOHMuXvjL6O8Wu>Tnf z7%X}|gZH0FWH5fJQhU$jNnK7&x|q=6iVrK>G_p=M!82 zogb9I=)<6R0leQfV;xAI0WQDc-+wQr48{Nf0r31e#`ysjTfpnZ!=UY71z3mUJ@Bv1T#SUryqdNR{^DOP}DFo2!PTX zIQ>D!KS1&K3A~?HHUSae8ldzFKF{C)Q-gs5cz-X__zQ!_oIerF(D8yb42Qt^IQ(#K?)5Dq2AZe%k095`sG;uPva4>Kx+>m9Ea@k2$I)w*iHr(K=%PNWEdzoFc`2*-~+cWAo0&=!7>3d-ci7y!2~H!k;b1L z7!z0~@FjrEe^B7S<#2$(1ExMffB||xFp_!&#t4}F1_lGDdBO?M@pEt?#Grs={{oQt zVEY>mf+{R4xsUB2F3BYae@I%e;`~x*nS2D1(^Gx_FKTrL$<%j0;b=Q5nMbnFepIn_kgKK zvfm*<06F{{7Ekhk=?_HLAAn82gCL52=S2Z9{fg-NBe3ZYK-HhTDFUY75M6%;HvI}H z`Wcj&K$~ko;dwwX(*zn{$o@4DWSM}>7Z7Bb04dKVfa5n~4`Toyc)vO*J{S_<@yP&@ z2c>T${S1x@4h+H$JZ>{UhA;>)XrSt6Xo95&9Qp$_92jI79NcC|8Z_`Qc`&@#jbi@- zg7z;2=@;>sA!(oi(!T5{S*9M)Jh%nD#4yt`Kd=wZMB#`76pvrf+C@?Vm*u@yY!JrT{L-GMb7lRY1 zT?E=67r~&Y09sFwz?1|!kD5njhNJ?6=LXQEJA(qFM1$H58N~j5NreWL8!`b5zEF9| z1`uC>5ze0g;v2yE5(^kqZb$?$`fM-+=WpSJ1_?&c_%U>S2#C<_QHlk&wl$fAkKFw z0H1FI>W@R(C*b_TaAP6teko}CGk~$>WWfOjmnDHsh8#|ZTa=;aPd6BX+nWh249+|e zp#30V{R_bJ7YU&D3YgDuVj4I++(7M_6%0<`^-!D~pzye$#lYZ^!0N!zBAc-Ab1h^% z88qJJ49bciKY}(Ntyqd!FT8@m34C6SEcpH^i1{m4fXoNw4+e)G17(c!=@dZwDI(zK z=`ctv0^Y} zV<>2W@{!{oG{3_HKhF+wzu;R1kb6M>Yd8#AKM8KH9{89rfy)VeekywWGDR?cs#6na zn!ts*ze59*zQN`*IJ6ijC$J{5pq|e=19aZ!LPJ% zA|lXc2$l!uZ*Y1$@R5Uo!2=v$T;TTKg98>&`=R|s(D}#U{v#+6GBRMCFW1P}0cjtA z&0|3Hw;<_pL(`MLknwNi^bi4Z57)yG*4qW zxIX|}uLa(}d>RzL6CQ%%6C6Hw7#LvgV|D=De+H5lcmN9D2L}~ITae>h0dzkg$3qVW z#SP&2@t6rquaNi!-4`bePS2oF7hpI6l8;~o-A4hMpMs=kaQHDews1KqIDyjhgajvM zMFFN(HYad;mPj}V%8w3^^V>n`7kvK(=)3}up$c3K7NGMBK;p?*KeL(d$SU&@(zf;T{@aMl5$Wi#x7dZbQ zr7w;MQ2BEJ)Sp_g6mxt~Ws z6j%Mzz`}rP-if(j``keO1I;I5tA8Nw2ThVf)>os{N6-Gxl>ndDw!!HcG`}zffW}uE zKnYea|QSB zzzt~l`Lhfb8VnCMltIS}4j4*ZeYFyN9wWDfiEJCFX~NWyY!bCLm?L2!C_E%4g5p1s zp@qpJ(TM?aKRrfxWGsS*#{oomC=wkWFQyHF@F)PCH<@mFfuYg*0)3I6GZz1!Y^O|-IoPgpT-p7_^DnEah^A%JO$gw zumaq^1+_oH=aGWy_a~6?NpO4VFeB`IwuVG-d$|BKJ{tiVUj*w1wYNa$ce_Bx3mIl~ zgU-hQm9JoVuzzJ4K=l=v&+Nd+;LHdPKQO<6_0)fq@n%r{Bmo_72AwAjsxKwM^&MzG z(;?7$7jLG7g`eux7_>m+RiO4ia(bOH_fG^5SU=c&u>Iir_ypq$(0O7Jp!^IS4+fpD z4Lx7cfq|6svl&<&K=*AmK+9+1&trs~pDh9Q{{c|_0*YD%@n|8rDyfa>F)p!H}h;PO}jv>x+N3xktF>)HP^IT&m}=Q)GYFX-gpi4p;z@C2t% zP^wgrU~mAPS1mCWOL;8O^CtpSzJT`cE&%5T1_epb$~zTs`UI_ac7}xK0;lKT_+nu| zE?+D_{SgKQ7tnYB=sqL{2bm|r9*hDE3mF4I=gr&z^+yr%;PlE70qT!}<3|BBUVt3G zD|-J#@GyYpOTg|2$FHyl^nN?g{#z2wivYF%A^Fo`0%$zJfw2WgeFDE92~r>6J};fq zBk^;s8u)$|aCjq!$B8b~{0_Q598~mx?mu8`@Ni%~{~vlDFF1T5=hs8r2kw8pn2uIo zIDqC8K;b(9G(W@~@c+Lza(Got2aT726t3849q1Qza=2}}$M zF^KX3mL3flB$zxHGP?gna1?;nyB0Vw95RHQZ|lI|CIK3>0rxK=7?8$`9T+TFp!>y; z=35Z)aiD;q0Gi$>fX%^?~Ng6jSO^h5!ix$o@7^dr`6jbY8Rq;}qz8BB*^2Qa=I8=Wbwd0jYOka8Lk^|8o^ssDQn~ z#BktY1p{td-{|D!PuzpB+3&~Fv?X->G7Yi8!WWeWjf#Vk(evtbe4H(-% z_faK~9=`kq77Ebt1*Z?@0t+Pu1p!7w2B!lLConWf6j;cCc3^f07=!JDg+HXf1=>GM zTKIB+(--(We)RHc0Vus8ofqD~!p+#i1TMe8@re=M9Bs4>?}`QB{O^U5|4A=jgW&nU zmA39ZF(2$+4;1%;%L7FEC8E6Yg1L7^3vJyiF`uaN$^&0{g(z>Fm=~apmpXvY?*Q%3 zKEPnW068y_Qv=jqLaZ<6FaYImaQb?{0$R_6sBalM8o}eI9-#3=1<3r;GY;_i9pLpL z2SEFGWx?kQfc1mN6VcC)1XZn!3<`{(@ljBH3wAHVfdmiedFtE_3^FrB8yGAMK>L|l z7)a%V&T9s@KNtiUIKKZ!K2H*S{x~7`K*oO&?qLi-y07B_Gju)@eE&@YE5jKE4)A&6 z1x^iIP77E#q4RYN6F}p^;POFI0W{v70B&EsX!#StBmf#;0IvsI(0ca!Or`?GPmyX2 zj2%jl`6x*EfWwbr2Pl7l#|Iuj`kN7qEt25#xghsH7%($9GdY09e?NfQp9@$WP{+G> zRDsWv4+E9op!QuyJ^1`s5Fa$22ytHpsJ{m?&x4_(3f6xEyAOPynPdeo1A_{}G#~j4y#MC};{k>SMGnw; zfJ_CT^9jNF53m+QqRiLcn9CTz1lA9pe*l+vKSB3nUiioWs}I5BKL;KbSg0I0{IJ5K z0i2!=JUnDscMN>rGAH!D#2KLVSRA1BNg($oG+6Lu9AIqpXn^>KffIILB2xu}7wo*p zrxhLz+zbv*GXx(n>;Tt)q^CzNwDb&}uVaASpTkoDpDzWU&o8UM3O}F5`|WCh#K0M-MO-Ft(t(k5oQ#d1mqHe}o`7KY-__ z7(nx1jNtQ9!1)J!pAckzDuL+OX+jTRh_c*MAM5{HcH^d_eo_!Tar@ z=ELt-!52OmHQ@3av|rz$!vL~Ak^_7{JXZS{ENZ~<2Ri@Up~JwK0es&ISp5X>c&BqSb*x&2a}i?JRW>yW0=6v&9JcxfYDiP~zt}r-(%U7-)jG+GitUI9lGj~Wr z&O1KA*Z>-z1J$1r91L0D_7<$aSHR!`8vnO}pZ5SdFa3dor37dq26jFxsQmuS47zU% zT;GBcIl}}F(D}@g6_ERbmq5*fgik_+1>Xzi3oM}f99ZN)=NW;{gJox6XyF9AZ$dBw zgNFl%&mmyzBB;Osx_{__*-q5<#)(|e_!THT7#unjl)>@I2@Y@U;So`R93F>2>*>8@ zcfjXs7;b>f1N$Fb-aW`ioFBRXbRL-jH{yOGMi%VzOH2g^7@SlJm^&Dp5^>U#4pHo8A4Rqe+6;S#DooCFk zMy5ejpu-Znzml6{1BgEX#+P8&05-1&>K|nPOMuFE@O>!)3|BzsBRep(K+X$o0G-#U zz|O!h5v=|MVEZ8D1t`A3;m^SY z4i673_A{Y}2UtI7KR#$dFUoq10}m_U_ou`1RilclnjU900n{YX@lm3E2G%6-D6s4_tnN+P9$ci&KCx zL_z>jo^gWLyA&{k=F`6jxHbra+iwN4?=Uzq{Kx>E&!OM~TCWPqZw|lzd+_X7_^AQ9 zeupKQqlNbbs67R?4|Ed^^n9!a(D|qg5k=tjXz=vQ;2`r19G(Zj^%=N-f_@$=#J`a9 zSV8yALc$k(em!_R5-fkfkqfjR@xp(!^G`wT5or7N3WF0_<)v&vjwk3mJkWYjQ2OHl zpYI2*FAp#>b4=o70M)MzObiMh3169D_2q>oW(JP~s-XI@VlN|u3WGE=gNK3{h@Wtg zkwFDfUkZAF);lc#%_lNE`0?L^u_IBfft7&~be|GpKKB7rBO7RaC4&M71Bb#5Nd@rz z4WRY|=*%An6$54l2B!x{3mBmHfii&BKZA-M1z84%I9U5^Mj<%)sG=3YH4{$O#OE4&a=I=OmLf4Zb zou9xUQ3sCS6j=F$6u%4#42PHFz+!?XlP?%m>{cxXb*tXC%8Q!z;J@W zDM7@6p+%BG!E1&fXuahp<_DY%jvNdcEx7D@2>XVCe)hnN>|GC1;D{BdoAoClM@RtDWacR=wMGlPc%i-0GC;0jRxQ$c7a zg9C#`Be*{Z3NMZc3{DO#Vxajg2A2jwhJqzz92^29iG>bo@ZQ?;LI(IKMD} z^3!L~`KMl-6$}cX^st-BiGhicVIl{E3#fjqm|~#(;AjIw1EjnKB_#od8}%su17(Sc zOfwkcpyLA%1ZOa|a2GJ7f!bqe_n9}q{DZK+7`%R0lEEep6rX#b?Jvm+mNbxi&VUE) z85D4=&w!gJgH&ID*2{1R9E<_ohp>miX~8nk`pONU@umQ#oeWM47AfHKf8!(s!0GEj zOA%=N12iA0aA+r}z6YI`=-?R3pg7^sE(Rxuqs5FZk`aut42lj;yBM4pK;uUo3<`0e z`9)CrWOHC>;Y@IhVNkqqXa|GS0oO9t7FmObOp4I;_~7v)4hB$uaM)v@+`v}B*ut>_ zH2;1893nc2^^sD zFtC1b{DH$8IecG$`kQF-_~PS70_c2lP<$~stWZz}=PwR${sNch;P65=|3m^JeXW7j z7vS&)xmAE61B?C0`aR(C4$QFp49S1k^G^iGec<_j2WEJBnE~ogL)s&t`;Cyz@91O< z;DGvnf`RgZMrKCP{V;J1ieUeM{l{FuAR{3FwvVB)fT4lgK|w%Jp}|1`cK#id&j7vu zSQu5T%R)tFldya z73X{0ai{9a!Y?<*ymB z;PIyzQ2Y7>gVO=f`Pn=(8WM+o!26ZJ<Hc=1Q{wk!1X2C{ya#34ZJ=Q zKHdyIzaH!QC)jv1Xuksb`Y@d1sj?o7ZqW7{!;Lg>eh2{hcZ!071897d6D*Ig58Pj4 zXmGHYU;_>>VFv||8KCnw83Y(+kfR@|yo^W#x3^*TgXbsF?c)Hi&ud_?VQ^w7K+L}w zfahOe>z$GI+c0`KBKA){|342hAMn8G8EifPv0nvzzcFMy3Ov6EN>&rODr6ZLR5pOd z!@=nVQs08(k3pjlbiX`<0BHOPwB8rgKa`9B^`}7dbDx<%Ffuqn#&-@h!R&+0cYzwu zp!Nxmh9YeJ^#K>q`IHuhFg`;^!Ji0@1kioH;Pu=GKE)~|#28-nH!pFrj-E*yfG z&jMY)1$H0v0!9W$S;+cp@O;LPe9(BL0&G8I11Nqu5c}=G`yr9*M~+CadT@V#1%nfK zzY+&{ztRTKeP&?&$m(xIfYd|AJEwrgI|CS7xFbO6>wwb}X3+c#Z2cS9eGDr=?g6i- zM)DunzZm{&g6W6sX9w#CoqvkrKM9a|koDD|{g`0);q#vc$h}bYGeG+%B^X;c!0x>O zTF-X?ZN7rxM>x2A_5+pAp#7wv@)^8kToH4BA#6S$l76wz2X-WZ%S+h)yaS;9X{4IR zp`ggqz>2sZfERIoDEPh!zM+-0zU&8I>3H-qmJ0mmnJz79HH0xG{3urM59kaPf*-xEOP zH^Yy2|06gg0$mstk>-~;82mu@Lo{$WIj}OYOhCF10ahM@=F8ysb%5Q&fS7*+*H1|0 z1s8aH0_>g!^zm^C(D(`1Jr5WfxSSf81Xx=*S2#E_D<&v*FgZPFV&!e&C;*MWHaLR# z2U&SrI2#OH7!?H=A>qr~!ogsn(I9A`2%g`uU~G{r0G)pUwhvsM3NTpcfcGfIn{M?`ho-YK=?@eS10F5^uumYV&3@YD{%gZ0xel3&eOh#6K(yvJ#0d;QjVY3=A2d_BA;ELGCL8?d)jb z2Gu7MAA65RiIE zc?RC!ZNb>W1#S;DFjz1+F(e@B9}QUjgPxuwJs4#K1R9unpywBZB9W1yfoXvbg957u z>iQ0jYQ_LT1_d`z`7(#W2|Qnq=l&1y`M}8Ty%7X+FZlis@O(3*`~lBDL-HH)`B)3! z^`QeOzk}*8Uc~uW3ZU}^pz+OM0d+sbe+3*CJfE2pK=++jI0!JPd}sp2R~rN9{6J9r zgZFzrU=aeX&oKn84+PggAoFFB&Iei%^CyBQ12jGZihl-hc`XZ`&j<4vIub$t0rlSs z92j^K!RHNefY*B*0L`}?V0Azq|C_)(fr-IcRsnQ>Cq(}W|348t383-=%m?e21+NzZ z^BG=%(hs;j4Q~HEV02`d$PKnXps0tz;Q(kplgGls3wr;6J;3~yug=wF)@JW zLuA0~jUeWM{3nGL*T%h!v0NQWx0JQ(@ z0jPbzkpY@7e82?SUj-Up;s*QogM)nIVIrL4XJB9_e}!Ye0>*k0g(mF# z@3{*E96{|*NP2_M-*Q;;6oT*9grrA@CRlovO#t2Z1a?2e4p4l8_j`iZYk~JG3MYW~ zckBS|AG?tOYEMDJtCPWr0Te!*6$vh&^TqykSP>1n z-&}#A%>XQafYBj>K{5h#-aE*=L(B<`49*+{9Wo3G3!I)aL++=7tjBr4Vc`Ip??9Z7 z3!4u`F7Glx_Ji#Mn-7W<1xfIIM-!MB96T5_u-WecDxWrJF)%>#AJqP)=ghv~^*<2% zK}UeY?!N(rAIN9{aQhFkp5=i6ct4i`V+$A9|B&>jT7)`Yz9I^Ce!2oE|9}ip-~`Vv ze*m2qp}=6k*m78)gM~o>+@En)5MY>ihk=0woWGeM`46OtkpX=F1k(B##ClO!`hcw$ zMGl{icyRjj0k4;Urf2ASPqg(cxXr`fe}bGp1B!3Pf`^|Q)xi7xA^j(C|K|WGeLM(- zrw0n|To76kW? z4k&^0p9HA>g!Tt|K>P1O^Z(%b3VVOxg*VJU1saMx1)%-6Pr>nVAdrcH;Sh7d|NmaH z8ld_M;vR7S7_om9)TEin#K8#be?Ji90FU=MkvM+>>d%4tW1ys>AX&lU1S&rv=Npnf ze(}e?&F{5q~eDz~d3%^EW`}Q-JQ90-epn z$iUzLYj1(W8>#({lKx{L^Hl-@VDrKERT0t;>7OTfDKKy|FeQNIcR=@Pf$tN30J^^m za(^F#fWrpJeg^@E7KS-0p!*LSz~|%0O2E@214lS4{Xy;%WMpA%;Zjg^lMwj;ZBMZ< zFd0k$&u_3fc{~8^CkOAx0VPsUMa#g#z-s|Iua3C+j2HQg0g&_B!1DzPOah?wR}5|v z0t$^Cp!I_mj4d1b(r`3*jB`3_F6;Pde$JwWbj5O5KItgl0nH&B>> zr2hfZd3px0`3Mww3xx?X3=&Emk_8qpc}RFOSa^W#cazXMu72GTDCUM~SEN(8|D1&IEH1I~P( zLG!g3?uW`7So3`X^|vwH3ki>e8PmQ15?@0FOt3>SIv-P^`cp!PtVV-vDiV*#UH3sD|RFCba}9Q27q>A98(jA`-FQ z4z!*ObblFo_;7&32XqaH2ZI9BD(L-2VE2OpNkM?YLIB)f2Ip4>1@!QP`sdJ-n~?qE z$o6+cK<;-3?Pmtr@9_V>2a|>)PWMVgqN*48|K9^{K9=wTjc*BBFbKfRfA9}vej~_y zaD9g!9y`$716nT*HQ(te7V}Spqq?WzAHqG@)XzXuAMo$L2S)(t{=x$dhIwuYtQ?^7 zmhp2FZ?0ZI?x{UG4>K6rnI1o*sNgC@}ZJq9cc&VmLD zB^VR~m<&Pdm%RT(K=xmJ;9?N)0G|&8**^d|pLa(bth@%d4;n!IDNs?&$N)AUG@k1$ z0bMT&+i%EK0BZj#RM@CF9QaTmb3wKOv>pSLJ{p)Am|*L19|*ko0=j>TL4m&kR30-_ zfX;6Kg}7%jHwDO z$mUf*&0|tQn8yt^@4*l5I;RF!0nqwR2GIIVxO*hQ?zzAO+J9n!Pk$T8KLQh(!0iRF z`QY&xnEn|C3JgCS!Q-Kb{%@*63&j2dOdJeO4j;rtCJIB^$4}Jiz!%CX$bkD-VE=;i zqeKE|{SG*O!F=TSy#ZqE>2kn@n?nu={qw@eei+e2fgz z`N7ck2Pizi^JfiO&arQP&Gb1i|7Pd_ONFz9H!gK7N57-y9C7LK;{Z8jb4Q6qwRL z=R-S4N+~NivpIPv9AglLo)4YCaKgagL5lz*XnZ(HKmc-Hbc-Np{L#^cLGc0TJmv<_ zdCZ&*j;;)fADp@voDx_?K0y&pK zfuDgP0yN*a13LaL!N34M4{HIK4?0heAp|5p0m1hJ@jKvriMSb(3mP*?^zHN!Eb_Hs1^iFa<&I_!vmOm^lG- zKNqxoSi)BXI={k;CxFQT+8#~dOrOvq8vq}#WbkkUr@u*1`2&m|oGp;@1h!uTbP^D# zy#iWq2e}`VyMQ4{Kma!W!@}?)fYF8FVWE=|!y#vu6o!@;1qUS=9v(bo%y5XAEs>=K zy#MCFM<)ZOL&>ZOEG--b2P9P#FE}k@aXQfA!P&y8z!)JR(9pDm#mPaFfnfr~zX=Q$ z1_ogN@i#E|fX>5$)GsW^=Sdt$V8~&RD3Ac%_h_&N-2P^O-cS00VGFcA0yS$G84?(5 z_&yzeSRv9NY4OLC&H4iaq<_bt@WX&1MM5F~blwHnKF$ILKhSyI4qOKov-ohfaDmSc z2d4+{eD_}laQb3kU}^x5pYj@j`Zop)B1|3&K<8oa}OW4BNr`XE3Ps|3t|9kNSu))f=1Wxez#)l-8AnAia zA`o=G8fZKgoc<1g?oX5jr*9Cyfw_Pew7wV=-{|F6frJImV`c?z24{|dL!k3!U7l?A zIlz{d(ZZ>*P*O#);IM(4(}Hj8H4`A^FUUNG1hxmw^CcJjWn@$lVEXXapW%l)Xgruf zfXxz|-WGt)Q<8{aW8hFZzyewy{(%Qpzbs(6!QjNeVGF+R5>~!~KAY_Frb`Q{KFhPo;nGX9_~QX1El`@aKIuB(!S^IxF7>A zDwr4;mn{2yNw`v{uX;e=2>!9W?J9&8@=@Qnbe2getK!wk^*R~}3) z9ANh@V3}f|fDs=WNbZHNHwK#zN-6>j93;B;h9l@aYEXJ%a9BZv{VN<1;RS17A%|Co z55oUbVEzaD=K|L7j{w;Z$&U^jVCupC!5&^3Ap61P{Raln{zOoD$O%4g3Y?xDK=}ib zz8)0Zc%%8?%)1_oGv_5foV14ut;-#y4YsCoy4`cz1N7J~~NCLd(Y=-uTPM01o`+V*x9;eEeLiwgFT=E@(-Z09sEhDX3_0*w_f8 zd^`XyA5VbF#|6xw@)4B(I57_)X<(Xp@qYMNm518;m_y){s|q)6Iukp=?B!F{lvV0oxzzWfGGnM-V96(36cy7 z6J!&ZqM&?+73Q$|gaK4ug6nr!`%!_fh}nT1c3;&376k?;aQ>AqW!08j5 z-oW#%91$S*V^6O;j6m!A!1E!DXABg;_CeC;hX#i{%>#@rH9^c3SLApU9&E6baCq>r z!UA%B1w(;^El&Zn!~g$Y5cLlZIHYMlnAmIpu0=uPr!e)PYMhbb1A~nU!-0khnFmPe z8+_g}q`U@&PZ9G6P=6onen@$G!vmII9~=PP&(4(0(85^(8ZTi0op+?rlmt58?FTr$ zdV%uiS?*aJ0ZgFz`y+-PP763e@xgFMZiXO(fRlmpfld&=!bws^k>RM3hm!(V+JqKK zhCiV7o(?RAph0NV@y#DzeP%_g4 z#+H+y{J6x>(a6KexhZu5q`z~3u>i83ltJNr0Yi_(g^vs(hM@Kh@c_#ccHae{`iB$JK2~91@HoKf0U9p>wO<)n z!Q-0`n&*R}8I;Btm>3>#w$ued_#X~9q-#ESSz*+`RlxA$pZbRa8&LbKQ4cE5!0MpL z@Ze{OMT2aE-2y&P)?s2`xM2a>{|Yi6T;4G#`~uaF2@=YR2V9;GfO|YF5aU@Yj7|&% zUqIvOpz)9mp!P)rsQoGlZtof}88SIBSm=Vwd#46Lu=^K)+Pj<;pz>=03uu2nsD9u~ zaQfV=_JGBN(P;rovPui2zX-`cHyr*%K-$w_{gC_|z~siDcz}mNz=NT}3~^tb3gaQ> z4e$PYF-b5=s3#2gaCNH4HBLWZ~uF6 zG%$35#%q2UC?qtcOlXmqkRYj|_<-RLw7g`hU}!*;zbp(A3^t(iMH^;7%Wnw=mjKXt z<{J!@861B7_ds^f3~N~Z0;*O$7z9A}fzO9Iz+h1423h|DJ`bh+j1FyGPz$C`l!m(k2D}!Re!EVrfb>fUI95WbP7!@5r>tDg^6NN$Z`#TvG zK<5Sgu)#XM3ObJkz8(dV-w!YtFhTB{;3`M}&Hpe$$}1KIu7U;-AJpG}@UfjCh-m_7 zzT?3GLk6b@59<_yI4wZ;!wG=YA7D&jXpv}ekYi9lly_VVE^4sy&ZzN55HEv;29$rG zF^Qpt(*SgTodQIEGD8c}_|gLg3yBvJ4KfT51qvp>?z@B756K^(^vw%y4;L`V@RTqp zHT(#YU~tfyA^5?9;Sea1FeosA-G{C|0i^zcV#SXj$p!~GRt1KN2xxptGB_B_5EL+k z>4${R0|A#BNPkn9!9ox0eg*-C8&=@_1PV`w9s}bCEDVe-f)1edP7^@;T^M#~!NMOL zf8g}a06Hc`5wX4qVm>1L85d;gfELz(&li7Q4?XWKfSHBC34DHyJ>^R6&B z9bjZ^0G&S~z@V5gn~C8Ba{v#6v#bGPzj%f*s611M0Iin=sb^zgY+>F3T3D%Vr-bm1>O$ls-X?kXrcu!5306J-4YBbcAS zyhVp$foKLJbbP#kc>-iW7JA=p0rMRl28JJgi~)k6^1>2y{>mZd3IG0kLE4`am|H;e zm5dA%IV%_vBm^3qpK$s2jyHkN?>aE?v?p|ZDk46(Hh|^>!TbbJd?3d+ht;15 zi35Kbi%#2Kaqbk_8MNi1qZ~_A$zOe0~S8eg=sDVe4BH94z=U!RseLk;=%Bz^tIc@PMtr z1NHnrKk$BFQ2ayl59mAyPFCJh7tsi3mozL-s1GGO1R333V*vQNfg_VDB`zkE> zGMGX4AIWY2l@H+XVVD7`ufXLOBs>KE{`ZhIH~>!{p#BJ?|CF%78nhk+)ZX5a_&HQ9 z0d$@aLplQk^gcw0c^RPg33UAd=zJ%GzyG}iA>n%&v_87S0JOgwbl(KnJ_pcw58(Le zV4MJ|FEZ>A?MKl09nkw8T#(Z@j`IQF?McM>0O0iK%q_qQnr~z1U;s7h(9VN#fS(5g z*AGqq450LX0W?2k!QjGX3G(kD(EOJ(*u9`c${@f{0UCeYz~})wUrqtE-f9J7i{uVa z`U9;6@L-To2JIhW2x$;Z_|eao3_cGETwWY_$k3zHa2T|{8eAS8c=*E_ydH=_;SYGe z91@e6uk76Tt)z??aE-&I-?hn3o7ukKEsE0Ilb7X4;X6 z)4Ug^i1i(y_$vU7FYj3RxkU}^o&#(OjPUUqNdJ$8LG}P610!^Ok%khueHsU9Z-UN? zG5G!80~($Np!B2g`@a|Gj)P$PLF>8E(~kzIJqh=Z6Eo<%9OU%lp@%d5bb!*2257t- zy54dyrXNswjhucgK=t1Yn6fXO(*m@fFadOaJ;O(Lh9IQ&(g6konRncf z`9)B9b>L&c18D#1L4gAF{$CmJc{$n8V_<>rU zSm@wP4-KI8|KRrPAWjbn|4{Es0MAcs0Nu|GE+4_;Yslrv2|3Vu4+cL*MX)?LJ%G;p zgsdNDU={$~=Ld=}h6fBip#2*bj18RN^}7ko4Gc~XK>1e~R=$AF7m@t~TAdG19}V9j z@ev6v->0LM?;S?q`EOW#1X}+LxexuoL-2ie4q*L?pIV{%%hB|E7@@|e0V4w_y}B?c z7J%!A3@uoChxiY4Uk4ZHyx@h6p!M?(BCz}MIv68B`Q5^D;Oh%${RpowWE~jb>xn?+ zHwS})&kVr?Q2P|rzH8w)pvl0XG69tT4zNr>9Y5g!k2fd;K-;$rAHIU(!x0{y==tM^ z0cv<2_==i8Bs572Pf-7uV}SDuN#SY0*dmAsPX-SeP!qu9S3y%4ru%ebp9%+slmvwfXPU}Nr5#* zqeU`-QIZ>SA1uQRP=0~-pY|{~HGu9n6mDR2VtB~7gQ-E0p+fFYghT_QBxt|-9`JY` zgMwrSBLjzu0=RydArJ2V#4$kH@1Ulr0uNX{xO`S%1I-^y0JU$xe1;5p$o(lgrO=7_U(E7|q zLxw}lADBV=fk5j=7?_Pf{mTGG$odxs1`l7*`AH5SK6rgxlZA@I0=5*L7LI}h(0VBb z(D*}>7-I`(#{pLcMTNuN3{D5y!0V?hK=-?W`qK~CM8W5Gf##PQ0-*hCSq2v^aQ~T! zfuX_}lz&vf_s#BMIK(`Gfx(#vbiOty5i&6_u%$4xFeAe2z{m1GJ)rwX!TK2l7$W2# z<6n^QfS%vkfCw)Mr2aQ7{Gt8t0?_*F3tSBBAgdS|4lo#rLB>D8?Kg%G3>%>RC5Sxe zez+Cj{Us3o2L>DPa!3XR&H@Hk2E_m+(D|OA`v8R@_bq|fzk%vcSbhebr^CeHFoAOc z0|S$a0pkh=Cx;@?cy9rV8iR;|6r-90_`E{!dUA#j1)%f1m%5g1I(cFXL&1B6zxG%9ZU=dCN}-)0jFOFqpBVm zhmbD3x@`5ybWbNDX4sf=XXed2$A0zCnRbh z#@k@~vmKnD-iGWS;9LP3KQjQ0zbSyue+1_zP)LKyCkD`YiJ<-gq&ptDQ`ulsX$*=Ep#A5d z_U;o&@Olf#`H}+v|9dlWFnBbG27tyF!Tob#h6$kYd2snVLk;5pc1uur9%6m~8sCxt zo&Vwhs(%--6)?6)ZUD6h3qb8b1`m*Z3ZU{1JU^nqFavacAS3vE!yN_+2SDc=a_j(= z9|oZP&xDT$`Z*Xt@#D~8pbR#jV*z7~gg^r5ygf+!)8U{C==_W> z1}BGB5zu*up!LTG4uR4?sDHr$)!&0dzhFkAD}y2fH)wy&3^`c%Fo5o_!)hOL`pN*Q z2m2Si{s7`0uze29I}8-S`jORJfZ8u$c?S6Sry$rr0m2~rBP0;^?|``%Y(6+V8$jdH z$mYF}MW~+xQx7%|5kAQ3cOa=>K!o}ZB=t*(P#=M$egzTgHIUS=AwvBR8H9g9=h1=E z8+v*`_U{RhdhmI39~?mKsgKY9&*y@Ke}N6S{lvl`3qHRQl7B4}!Tmu{dIRP60}Kta z&rUcK%`IKb-}J}}rA zC@f%^0bYLuYCksmfXhP`1{nhjId&6}{~MSYm>HZUJHYE77#*PVb({q*N&*TBjx7cn z3PK$WEugt*MurCkFTQ9#0FBp5g74P?=?4|!3p!?)5ybK=A56I~m zR31<_zcV4u>jJk=Bq8w$&L1EC{P$pdG1URy{(Sg<9s~G3=?}~dX$%M0IY9lt1B?zT z2be+ojSdxn?;CJnP&9C|Fwl6w(!kInS>fQus_4K3IlqNLfk}c1c0L%`J_!aM#TkML z3_Sdwm>u{ToS8V3K=*xt*SCY_tB}WgPe>xhtA2p?LxIl&2eofO>-Rn}9}oh~#}zO* zs62SU*x zp`gaVFoB~0EDyS$c>$>X%Q=CSfk7n!blxlj+X2QF!4)8R0mcam8VnVDp!JIkHK6-h z7#lnu9Assf$gu-t-h^Zu28RQTYzz~*Di$z0s4PgfU~ot{Ucu17TVTNG0GSVYzz9+g z&JPA4`G#W^3=KS>BLX4)Aq5W5e6Ii#Z2uzz2OrG;;Pog93?E?Q7vTMi%o}(aoH@b$ z#|Pm1Izi{vfr>@YeG?X-<9--G{pkkyesTx!{4k3EgCau#czsI&1L(YN0q~>&_`cZy zFq4s?fWeaIGxLN0|Gl^?K;tnF7$E11qt2Hx6v;sP`=Im0`@s8~oVmgG2Y}6g06wp@ z0CC^-AFQMDZ`m{To~cxXhaXu0II-_XT?V z5#!$rF#kg8GX|D91_}xsp!4PgoER8X3_$C{7&O@bL~uH65a3bx06ISkoW3Ca8CZNX zC{R881CYWWbUtJOLkKw0LDL`Z@WKdx22ls_`Uy~b3_1RXO!%*0#Tx!mp!KVe{6_uo zhm0pafbZ{vs4zYn;)mtp9DjsGxj;9_v%GywHi13>p>G_WvmOn|nB8D{7(B!I>%Wj!q8 z1VK~tp!5Ae{a0}QYG6mEGR7;5K;xBDXgXfWX}}6ve6w4web9@bLikpNDAp zEQE#+Bz+;mhlAlr-ULAdCQx|=N)Jfskpa{{<^hj~g3E7kdBw4Sfk8mUfRTa4!$Al# ze(lB}BEUt=__ZN;{5k+jdJybt!8?8}RMjHmpz?%+@c6Z40jU0D;CKoi-(^tXD&PQ} zM+z^mxC%h+sRHPIdMpgwX!Ru|d_eVaF=%}d!TJ@U9#Ve`N`T5+0r2@-5;CCkH=*a( zF)?6-A9VbGP=y~O*!>R}T2vSmK7C1UgR@cAni21}A2NPyfAS84&$B2_EqHYYoUe(0yJ15%)K~0L}j%K)Sz?xdC*( z00VS=?12Oy==dm)z@pEsko9-q{w@=^zw2NE+8=}7f7amt6TuAbUkWh%U~p3CIFUXR zxqqF(^(R6CyngtB0_glH(0HjN2dIC$0W`nC%mA7nDqw)!Kk~q!K;js}zY~}zFeCO~ zt>O8^?C{~gH%A5i`r|MD{f^)SyZ6BXa{J=~GeG@!2T=c=q2a@S4=xJ@H|Y6mhZ#}! ze@_6f2asT}$eAF>FySh+J{RO*3;~@_v4H0>bHKO%UR)Lm0l4%VFfuqxFjy3T^xuW) z2iI?q`nf^`GTtpA0FJK)(EPl>4AA_%0w-vG!{GaW4_R=3AKd<7@IY0cz@)&~!np#} z9&!M;hoJTOpqkH@EC8Jcg9twvNO*$!(+mgxq53aF7$rOsm_YNpL&Sfu_?3agH`sp) z|4`?LUvNVF2b$mb!Qk|Oyz<}>qCAjbY+>RM0`>1(450H9$oXA@3A`VvhC#7_VGU0a zbHX3g`Rj%^|2?=11iTUfcOcF49?(fr;zbDr15?R@OVAQJ^^rl3o&27 zX|V89n_2+qyzK`pjHv71PrUjc0o%_of#DE%yob}^Ax`x(Uj2{Y^0WrR& z02*Hdtv`p@kHm&j?5h*LcW0ry<^_umT|9(dfd5Me$G zYWS>pi5fl&{{8pjGeE~X;5L#b@_mhLx&r9&a>`MTpCkD{^J<$H1 zc1zHHyhEV%RL%?z450I<6hQ3-(ES_`{~cg3Vt}j{Lw5g*U%w+D`3Z9VHz@rQ($7&4 z2wI=mV4UX$UVq5hp!lg>O~CodW}gSF9H9O0Ape2S%THiQRDi9|1EsG9Rq*;=3;6y{ z4klRs2CokUpU()%pP>BxiCKV=!I`H4zW&334RrqvczqqDe&hK58`?er>j&pYNw9ha zZP0lx4dDAQLGBSa{Dj{ZERS5?fyIlN|k z`yBylzd_dTIf2*L$s~Zrt03+Hg`aE#*gTMb89Y$^$H15X8=o&=*ue7{ydMkXC`JYb z^z}Xs1_GGzb%UAc^+Is{90HCK9EuFgJq8L2VW9Q<5}^G&4&eJ_J-+{r;Lu2PVo+oN zt^ZJ90Np>?0dl_rX#Gb5=)Ogc2GDw-1g2I7rw1*d`A&y}PN4fQTN#`fPJr6O;P7g2 z=rPb%0L2eS1L*vGgnq#QMrQ`a4Nh$gP7E{P>LKe@u&GB5?+hgM6AYBGnvbmB0!jT8 zBGhvrsh>fF`WwH0M{t1s3z=^r%>K71Ueg%^HB}AzAKvEAnkA{$YB!2&n;9&r* zcLt|daC}3`hX#fX3{DIUfB$=MSQrX5up;h9V+5av4_3cGg#r0K4FQG~p!ostdF+t; z&R7{3TbKes>(3mRCVwT z4Yd3UzW)tk{)~U1{vEiyU|7K5#K5S**aCJR1A_r*J|2|6A>qXUx<3s(zm2;8^*{9f zuma|%(DH_11-SkI&4(TU?LURwFE;^npR&U-(0$AY;N=^rC{U1Pc#r~KFU-Wi(DCno z1QU4uIA}ia^I=8@l=G&*{$&8&5247g09@W9^$&5~FU27M%Kr(>CkzxGfaW(PB^;d? z6dewM`iB;v@CDn);Bdk~`2pJmMwI;rp!HE48jVg2iV04j@_>b#u|?A1A*eiH0_E== zKfw7Ti$Sr$p~FBMqJINpiiAJ|s60^s-6zfwpa?1tn%Wqg8d`Z7TO>0Yof#A#IJGl4 zF;u|ygUchV`Xwq3Ix{FL90I8a#fM}AqZ6Z|fO8Az`~oEXJuvs9*^iPwkkn5gLj4U; zc?k_4(EZ2Y@WEsL3MBP2h%mnbN&Orm)Pu`!sCyO=p^E;5#Zy-W_1d{qKM5xz5Qon-;^*_EM{JVz;^(T@jC7aV>DEB_9F%D)6q`KQ1Rsvki2b%54~Gzu#y6*#P`L_U4{z1ym0%-XM(SL$5OG01+sQhaHmwz63%0IY%aQTN_KT`R} z#=+Vm*`esfsHo5kF8`49_rTnbWSrLSpFxEB3?%h)h){2Vq<#Sr>N$|quOLGGjgN@%Swe*R6-esW5TU*TN&N;Q z)O#SQ-$I0X2_*G9h*1CH1H!+1h)}-+Nqq+q>N}9sA0R?~1d{qAM5xz5Qh$O7^*`Pt z{CkE7^(T8uAH!CnD z^0a{NYX+@X?om*Fz}~?C<8#<5C_i9Kg3C{^F;ITcn8ee<;lLm>LzJNb%unWN;c5Ww z4+PDxXoJ^_FflmDfyPUW!1jUG^Mch2*h1%fLHDzP>~lrq!_K?o2Ahv$9+(el|AXpB z(0*rd{lg%@0P4Si`um{$7(W;ef!fd_xfb41Jy;DUA6WjvtMm8q_8<88bLBurfGIV4cv*7?+X{Qp@lys3{pT z-}j)&n9Hf*Sb{{06p@7z`QuJRX4V%i`<+tzUe=z|iOUfRRCF62}a%JSPL6=L6PMo)*pw z(EP`SB+&ZBZ%hmmICg;K8x9+DIVrHGGPFo=faZfB<24_c8JsyA6c~=Hd;p*K!QsK! zBFkX}vJV_yGhY9Wfc3{f^Ir>?8JxL(FosA7FwFYH;PimuhvXA*{c?iw0Aqt9L&xvm z5fJk~facRcVW7ZW0J_-xL4gf)eK2Bx#pKSR5-%CPcFX+7E zhPlxB6eflfNgaY8K>ORl=}DMjN?HS`QwKU93DO?`t>3g@=<{eOabRfSWB{G-E&!VE zQs8iiU=aKP3J(Tw|5gLk|7KwFV^Dlx(a7Kc9-n6V0a_m_z_J4|zAghcpNWBC$9Itb zLFX%j#=F7$d%PtJ7%~I|J}_JXkEesqg8}tF6DlnDJ~AKp_uot62V(?-A_EKPzE5y} zhXdpuhagaYZN)Eec?EKBLL-C20TzWw25zu=0S!wA?FR>q7#p}aUdS|vGTg9a0By1a z-QUU}2X+sG07J%eM1S`OgVO@=cp|v`fW)W6zyIEx6$}i=RTxk@P)=F2Pi&w{QMmONxvZfI~_0t?XReSuQz$X z4q0z11G?XgnD_;qHv~2xWGLu-H&FlP2V)q6A|$>*>tQ7sm?9Vy1z14$4_5sA9l=wu z#s|FB3%b6A>Bn6k1_c3@7U+0|B*P6*e6hgJx0hw`Yk=)vv-tTtLINDW4-{INK064xI!22B%K<)b<@bMRhj=R4j1UNwX8zS%U8+Crl162P( z_s9QWaALTC*uV1tynly5W-=&iF(Tc+hU^~=kbl7TL)?Gi_kRxw2UC#-Rt2U8a3nD( zFnECa4+Ws{ckuc@P6g0@MDY5+1EBSR(Dj529kBJx1`M$Exy%ZT3@GRCSbYB-!3ka; zCcvU~oCn5U{*F*v~Xw?M*&fw6(XNdYv!%v=Dv{fmLq0kl7~ zAb^3X!a_hmp`pN12y&hmXgvvsz=IBK=W{ABFgPKt-)2!@fSn&^zy(@Qu;D-aydQ=h zzGCow8W8ss81(YI1fS;%D)bo{6qtH+7!p9^i;((u0aJ?%q`e^szRyQNsFlHi0o1?d zt1q90{`hXFOebo~7v!NbAe1{%3UoSwvjV96`0^XsJq|1ap78UPI-un{r$yuE zb~VWS&{VYf#vgBfM{q#LL#Kewmt)|Vz+AxK#HR>R&w4_67UVt*PkU@C`5nPy!05ySnGXfu|IQ3Hzk!K?#p6NCNoAz-^%}tQ9h?@8 zpE{uKV?}dc#2Zj}g3JSlA1LY-7#$cHm{b@fSR0r@`)Qx?g7t&k2fDm%6@xG+{~TcC zU}#VTkH;eCuM^k7>p#306d(L(mvRE%cMZLd5;Q*sR?p{Xc7hUoAcLaw7s{nNT9IRg=0~9_1 zP7PcKAm`zN@3RKqpUQCJ8aTa$K<6h9Flt0Ha56CXH3%LEVqow{0N-Z}_TPgF$bC|v z^^y#r`VYJxnd9;A2+j!5{$|klOA*+<&kPI#4WL3D)INUyI|7nl!S{cH{m)s!;Km>T z-v68cx*rWB2tIFHgWSs-B911WF7_dOn9WN?6{ccuab7YUIIOg#)v;PqC*91mP2!GQ?5f0-G4U+V*n ziJ<*A1reb8vKc`8D;pRb7*q=2_aiaPo1PO9zb~Fa;ulx^901kF7L1=d)e=DG<$}W(ZXXi^!wRT=Ceq^v zYk7C$5_ilynmY0;vh4F3V6K>c)f(I1!#Ra zq`ZFd>wg4~2BQ-PtiDiSY+-g_1lK>H`hw-8I#PYXz|a8-A8`33zyP|xQ~{nJ5$iP= zJzOQA@vXr0{5N#|4RQZ8M?&MLPPKrhFE{-XSQ*ZMn@Wrf;PM$1;|g3B$n$})`VHdV zj<>%fn4t5UD?syAr_~|nB{G2a`+@p5$mb<8Fhsol9l_DTAP`{rfME(~KMH6)ngMA3 zoPiNk--5;qWDOW(*kR|bg3^Z(6X~E?E9lr$H-v+O*pyA)h(1d+`upqep1-qYN#i#!f$mMIm|NkC5 z0-_wS`~*4=fmZ_5o&kqn1L(YHWc4fVBl`28_B`mmU{KS5k%2(~)}P=2*OvjH@*x3a z9wht(m>P5#6hxRj8e|O;LE|&v@u7%wzauyb6a*L)KO}(9N7Z0#VFI1!r-&#&B^esz zK<6P_C@3>%fYgKY7r1_90JS$HA^91!o`pf<4tV?sygmzbekdqC@gkkK2Wrpp7C11$ z&LedI?Y9S)H?Z??LHXN44m=*n1lj*DAt4J|Uzh;te=#U9g4Y)+fcmEkKPKqGj3Pr(HgzY3uHoH9V`vs%FG?I7ouz}&|Wf!1G6fTeHF09PeO zg$5=M2B!m{{YQ}Tp8%#6Dhv)Gp!8h;YHxx4&rkufA6lPmVQ@MCy5CF^yk6`Bc>h(! z&EFBA{XU@ezFR>3kpc$DeJ$Yo!Lyk`?FmTu7&t9}o(BPm{{)5}z9MjclNYjn8kD{s zu!8fCq734E5Ecg60!A6wc@#6gG6e8~;}hb(Mg>o3dVByMZ{=hFuh)}MG*C_ewOzD(Hy_<1S}6}Lg*zrt^V-~ok318oHc_<7$C zK;6G~k1q@XJP7wWv?zEsfC@ZD2JGog;opC6NPYv4cZ1Cn29NiEm;wwB z{{Q#jaL^TLU`+s}_XnWzh*JaPJ_pcwFbbgci@XI4K2ZC?<4q9%g39Y`<_+-mgbGem z(89liuLzvpxC

=SRctBM=B+lmX3OTkw4X>*wNt*VhiLp#A{3yioxAKjPN!2pRDB z1tdN|pO7$BM7eF5-M04m>EF(S9lQa2kVyw-A@W> z&oRun`8z@oyuJuLp2YyFPnawe9NJ7D9Qbng9CHh3z8&mei2FePgX9+mrjPqH8CZ%K z8iXC7=j}l6bLE)P@Tps^fuV)L$$^366a(i31_lO2hfGEW5Ab;*i17-L&p`82AbEj< zY)&2w3LIJt%mp3_3<|LEs|W_}0t+?d_724U2Mm@H4xsY}p1dqzP-2+CxWI-%8GIhk z2L=nd20`%oatlE1T}XOYko16#@5>k{sI(h`{L=tlFDl3Y9$yz=fu0v5QSsn&ml^}( zQ*qGv34;PJXxJDMUJ(Bvg+~L276W&If`Wty*gfFz=LWSGe?DZeQBZi`Si#T&F24^n zI#@6`EC8ivFrR?|ZXYNSK2T*~WN7ew@Q}ff~b*zje7v^sGYFfcf%Box^26@qRqnFN+^Xp~@J@BpjlG_a6sw|Kz7aKQTkBSXUk z!2$~ho&}8pFnLJ$fX1&2nHw1xCV=%HXw+a}@Bojuz`~oM!Rx?-3YkY>`G!UVn0_#y z0c3wBsQz$*nD>BzfdQhPw}64+fhyQP$o6x<^h4C+wjUx7GS3@qKMwOOaG3`VZzTUn zD9G|Ous%2d>Ay25aDv8T6%p+nZbWcB4R~F^z`*k4 zV}Xr~!+`?^vH`CO7#NtK`~?QG0g&;Ij|_G(4hI^L__i?)2NDqc2Add%0}ckV0pRlS zz()lTU%@~&;Bf_qoSs4g!wkL^j|D4sGzdG`xPazI85jf@Ui|$J+Rx?!x<4MYo{y24 zv4yii!HGf9;9vuTQv(wd_&#bG34w-2(0v$(7(n}n7C3S z7@Qt7F*CMsoKSFPP+Y*+#Nd?B%*)s!0XhGu5!Sxoe4yY6I$sua-w&w$#Zkc^Cm_I3 z06KpO)c)csU~rNUU?_l`zY4y;MrnfJ1BL_x(D*!q0#^lt3P?TZyhTubBgtT+0NURe z0hNce*BL5e43r;ytZ-@IYG5#u5MXG?0Np3s=+YorVIwD~@PHu)s-CmJLPk)5q0vFf z0jwT{4^Fe7`M3uK7D^5bOpG24Obj-V`&5`14m@OlwcjA-gUT~m1`7*Ndx8PhUIe#) z4>TA<#|JsU`w76~&*1hjmjP(L5S*SFK>Z8k_O%9R{0=;R3~t{(U`b?X5eAJP{e;|? zbK)v&{XWY1k)ZJu@OTa=e8K6J;XniIz8qxpBmVx!w*H@iK@mJ&10F9z*AE&0BF{fN zZh*&2T%hrf;h!H@DDzLpA2R$?5DMDQz+h|x9lr&iw|oKA{$*g}K%EcRaSJ@28V5Qr zlEJ|PEYAsU&lQ0CyR4x5+6^oPSQRE5>R@nkU=?C)kxT%cx3~dxe>=mElaTRuHpqF% z;Q3aG4$yjB(Efu%;Pc^RC$KUoK>N2G2Y*K}g4dfrV3?r8@PILqp@o~nR)#_00YeLT z&=@}d#9*PpaNt9c%(FKId!YTPhQnXX|Mo!255a;K25oSCBHMtNPt-UF=|98vGduu| zM}q4kf!UDx4DfjaNm%-?1(rO;p!O!Ld|rU09_4%$XnD>6y8nH`|NmaB1rDI|h5r9% zV0ggDz>vUI0O~(KfZwM9zCVD0L5~3{57l2`!B+s9AM%Er2jajqLx%wz{(=)g;{y&# zp!uI0`+rC9fI6>`@B^=J2UQFWf&$H;`x@Dj8c^=*1?4Z;`VP=}&Y=4qnHnB|+HVa; z4xsrV76!=*u=^Nb=k+laSjaIbd^lhTl?UJVEXcrY18t8X=dX?*p#4iS0_~>Y{VAaN z9Vgz31)sYi>oE^BKBx@_m)8sr3T(gwEi9nRf zw7(fAHVsgD40b=m5@`9y)xi)VA%L)7 zvVtK(LV$sB4OAXlUlzE)+z0mm1JEi?aC$OU2O`;RgV7NGmlK>a7?2Y>#1Ni=}&uL7qZuzw`M`-KdcLE{}ae*XvW2Lg>h zfzCJI@aMmmAVfXr{CMls>SHhk=qEBSV5fD_;RK==?`;{dxd= z{wcV943RGoXyw5t57M83Pd`T|4?g(>j!r&&@*w;1$%E`K#Am-iD-S+-kp4`3`Z+pz z@X3SRk53-te(dtd_s=wV$T(bdV1b=K3l4uI`3DUi68Pi~OmL9#z@r}|?}$&n!2`ek z1`inw{T$%^sSHYu3{K$oBc}nV{QzE1uz-aFc0TO`h6ZST1Su~;_lIeK>mTIuHsd&K zejGGjR}60Noh$%_$3yUXAW(Z8oIV*E7%ZUsM+Fh~F}yfUx_)Z9f5kDF{h;+~q`O}O z?tbF+Q`7w~j>6mz3jbu1!$0E`>H4YZevPBx_OKU&V#5#RC>OB%!R<{@`N_n<@X(nd z2$Ful{RwdXLQX#`K<#1h`WoW(Q`7w!M_~1B!v{qMO^~Y<1irQ#_J*FT>=9G@_B^}GY){~|9n8>u?l>}he7o(X#54X zz6*37DWv{xU;ypkcRYvTn|2u*cdVeNt{Dn|?kFtL4^zR4>2S|Gsq#xuTNw9s8_@4nPk4ZEi5+30BDRB6b zpFdWB>NjWP{F!kQIeiy_%O^tqMNYpbQ1S0N@MN8yGbgMjM>WiTHcpB;<>p!?q>4ua=bLZJB_EYITrzRw#} zK7rRaa4@X#&|-mGl(0DKCJa0M|d@`~Xg`koC;MfXn z5AuS?DW?=IUKj2_szr+Duug@?6oZrCV3o0~0`w18t1Z2SO2dfAB7h*r|`c$HT zK}kY@;Sel5k>*Fh{^tSBe?ZpDFo4>l;P%CVkD&D!;PHn?@bGLn3|f!z88lyYfpN$G z|El2f1hU>2FF%0WCmf zaF%dT{5(+&F@MboK0lxUblwYiy%V2>jSL&)ek!p0z~OU((E*hHb{za2!3-`h!R7OV z7PRx$W~>H}kAm;V2CWxjaFBSy!2l|6A>}J*z8Gqr2FN^)O`!EY;PD9tPR*1M35YR?z+th9eA|3Ly7PIP^^3 z_W`Is!czf1A1rQ>tBddKL-~5 z;QIK$Lkp1p07eEU?g|Ds(D)kUJZ8}OJ>dC*8;u~mz7N@nyMRLuG~SKo-Ul%C5cfTl0JWDu^D*G@%mWYM{sToN=)8Cfp5h0f z_ydO@!vhb{`8=TYt2~JLP=)~T{dN|h^*si#^%XemzX7u!vL6Cr|EB^5$oMmZ00a0u zFph(tC#oqhO@O8kP6=>&1DE$8`*@MkO9Im>2ITRojGvh6Lpdx=g&J57G#J;p9RRg| zIV&cB&d&hX2cY!>oCVHUS<#$oaQpH>iAL5CDy@g3fONwdW-R5^<`J*bOc(0+8GH zp!rnLeSom>VdU@v?N{S4U~p@<`~b>d2`!-gXbK?z1%T>raR19NNk1S|1U~o!U3Oaua z>AWhA&EWODVD${3^@)iLEfSFSg99u+q4|}e0h)gx_Jj5(7J%!2m^|dZdQkcXm4Bf9 zuf^c=$Uyspu*@HU_h&x%``-&vJ}hv0s_Lr%>Q6C6fZPj7U!d{?IX&F?`X97D2IgK+ z(gNiy(E3Ms`hvI*k-oSKII!g(c=-h@KOCU*2gv2efj|E}cmhD>2iQGe_ep}?cK~a8 zwfOoUem^qk{GbB({w8pIgVQ^QfuR7j{8#`kKNu82=d~$<=HEf}C6ffm{{l{+`E)@E z@ck2R3<3`}!15>5z3}@sV0;JgcptPrIq*=y0=!?Fh2akaXgwU*{owe3&c}etS8#a? z$?u5pLau)^wu93XX#FrEJvo5Z(@p@VCsqcA7TEyM`50jH89?m^4h97$(0#;nK>NiK z8Ctj;Km?p!q`v$an;NJ*0vKp9Z)-=LGK`2cPGfz>>rOzAqKD{}XgyDJZ>z z>R&cfu=(KqJUj)U_63;F0CEpA_-m0s{vRRHz#uTulA#fF z9wErRg5dF&4-73j4WRoPpzA9iz~?g|`31CI<^^~?pP&P{{RWC(hK&8N_M`yA3P`XvU?cnL)R2m6EjK{L1DMhz%Gg2qc2K;tJ6`2!5F{u6hBf(wJ<2YC2E z%DaLJ2A+q^OoD3>XeQ{#d}!0MVaN!N8XYPQSbmc~E)!fUzP1T(mGUK->>n zFU!-wz#s@&?*tAnSr0^f&DaMX5Ab17e8R!NaN-1_e*_-iW^nlb--ENDK>~E&A!t4f z6yBiyq&iW?%x)8yd($`6Jfg&7wa6)Y7N zgU?HYnD+tXe(-n|Wc=?ygJGT9fkpw)cpYfHBX~Rzy#5;0zXz?)wJ=aP&*(nbcfp2rY$e?UF{REY_4;M1Q>T4NrdIOao4a^^y7@WB)!1Lws`UBJ~Wn_4e0BcX9 zw2x5Qf1jB_{UsdwBVhVLw-`X9NyI%7R7|1%)h=MEAA;PT1=+&+w81g-x9`(I-&xP1t!KSBHh zp!G+jv=0;D>!lwsU~3;j?i)k9{|ny#Y+weJcZl_>6Tt0VNdBJyYA=H0lM5W5p!5xj zF4X(6SG-2F$3W+2IDpQF2Dd-J_s@egD1iH`3?ClYFgP7JSjf;K2`+CNK<9|Eo4d;qUs5%z=I<4&Oa*(C%R4uaIP!uJ<|-1iBz-^rN?vi=fe-ve-X zfXfe%d=aR=apHyaZ$a`5PF%45Oo0OEyp;>^^RhwXWgzE*?z4gPHyM~19(*W}K-%9t z0ldFo7Bc<=HZNi|sK3PE09~J=z+k}$+7Idh<%0}V0M%!(@mmehco{gqg4@?f`4dt9 zf%?}H0=U<+L&8UZ0hB%jK>J6* z58OV%Z6755!S+316o`cGrw6A8u>Ti|ho@_#)W93^!){j^M}u@dX&JFgP6mohQr5 zpx`h=@IjLTgHr=&{E=zL!cUXc446(p`%B3EGm97hLFeOw&i`cCVxWD%kbz+W*M>w! zMiqvFE#Uq!YW~as*#}Nv3=TU$`)^h-wn%IM^)CvN85tn^*CaI#N-!uUfZL-LOTgt< z7Nmb)qyTmgMEz@sdKL!c{plVc^|v1q5bkeaHsE4# zme{cqJiaysI-bGA!648engCw!1!_+SGbn)f2Qh%wPcH_Yf50FB-OmXrAHnBw78Elw zcrYK}WN_vJ>t~R#1hror7+QokfWj9P)dCDF7Q@;jp!P=*xVDWI&wv0ou>n4jnI?04lExRODg& z1`Y;i0Rsp5c1s5?(E0WWoD9yO{3rlguLtd)N`m{R222wmT?Yk5u>BDCuuB9oK-XI` zJb!Hzg3H|1${jn zseDNJ1YW;)fH4WwzJ{E)W&w6T3xi|zIs63R`W>+7N5n6!;!gx_{{co+_isdV z{|8QN?w5e;Z$Q(3v4H6G=Rs_G$4q}RaQhk1?0-nS{S?GMV*Uv;lY9eiD$eF76G9B;0#QV`~Se@*MWx(a~KYR>%&(& z5z&rb2%7(9F#zBH3_8CDqMxwivyhw0(g4;h}`x#!`#q=M81Ni5gAb1uO4^* zL(e|~x7QdLe*E{4++isrq>#Y80~UWf?lK60nodj%58C#!qU=BESOja2J%Hc0%MaOq z0csC}$KycOGBP}nfX!dYFjz#v`a>7K|My_p(fDZ!j__M?2i1KE-!bQ#pytEtBXEBE z`4C?JBF~37{QB>~d14_mqYA`-?V$U5PB0ch^AE$0slOwb!RZwo9uL^gY(}|HP6Ew6 zp#C^VgrXa${nf)$1Uj^^MREgZ{2{?<4ro06?|*M5@OTwCJv6XXAl5hAK*JXj|Dg0) z1ipU_l3yQexTyrmuiQHreIx`7iYCCuZ;|q=#(ezw6|~U|0a2UxLl=f!zO^*#R`3Xpra! znqQp(wT~Ng{s72Pp!r02`B9(%x^EnDegTGk8X)@~FfustRxo^?2F-sD$=DyoQK29s zA(Fs6hr#IqXulKJ0Z{oVzyKPL2CWZ5?hk|ZvkO4iD_&tZ#C+k`e=p?l2KBdj3m5{R zZ2~O_^#6a_Pkp2t94RC)3w13V*P5@NiL;FvlpkZW4 z*Z`Uj0N&gJs`CCQ@4+icNj1dw72@X&AG7fw^|F`Gm4#v+@o;5PhFjxSt z9})e<2Id8S|9eBydqIH$&xgls=YnUwJpjr-p!C~-p}yhge{Wd&KpWrFu;6MLiESVlk{g`2cj^ z7O4Jx!UP&GnE3F(RA~S84g&+MKg!JT_rI4Qcs#)15J>*VLa_T87#YCn30z(XGblj% zo1pb9e?Z}v@H=1q12{i2X*0HPTQDR*$J-(0Q-uv^JP>*wH4B3bgM|XLz5tJ(Lc$kf zA1HieH^AbTfuRD6{eocoA@R52JIMY8zY55-p8>R90m;4$Q2A@X0vkU8kI%@0(*r2I zF)#-(GdN4`SomqGS_3nrd|^;PjMp$QoVfZw0y)1jfZdnyn_TxLfZ{{qp%;Uq1CtSh z69agB3X*<63iz9|LgscuWV6UkQNb`>%k?FA2sL4siSifX>TiSPoim0-9xo&KJ*^01F=j_<9;4 z1_j9YE_fyvG@bydkI=$P0u){f|Nnb)7ch7U2!O)}oZdgf>Kg_D(D}B|@(X-FHCP@o z{?NeO@EdhJ6*T|KQK0avkj(UK@cX})pai2N=>8;7{jJYYK$K8xuDXnYjZUV!dT2Dg_X<>ih`Xz~3WG@s4jBO&ksT>gOOQ*GKLJp<@|F3|ZVVDlL+eE#pjQ~+8J3|o&2IuEY}G#)Pi8h_+qXkp-paFha#KO5J$ zIe^z^gXaqlfcAqZuyQiC@H&9nZ(#F4`@5m%%Ygd-SiE!y)Dkj0pEY+z)FnB?y4(`w0vTP7(zV+(7f=u=T3k4WRG< z&(}OS*a@0{vXBu{_yC`O5}0A3Af%9>VZ)aVnh$aUjYTptJgE4vPxAre`RG}Y`76Z! zZEo=Ttq;)iTru~Lb9aE&lRS9f0s1?=6_{ZCxdd?g47A^bx1!?WE{Tm|vJpi5m z$DILMe}kU>@Z2X34j%yqQ2GO{Cu9K4DylHR{Rgq{0Nj7P1qrbGV;?X|GPZDKfZdy6 ztDwAqHNz9-{NodKzawNA6nvoV2ZjgW_J@NKX#LI%1BC+!_afpGGXD3WY7c`0L&kY< z{~a1WpymuLKY-?Aib3r|59InAbY2ukg@T%d$b$wK1}6t5X~q_&22lA0KHv8NV}vNkOP%3ko*One?g2YA3%xyu=H5~Di6rBKjH6x4~Ys; z`2eeLLFci7>pM_*fWsfs|3LVk-vgBX8WFTnASRDOZ;7wCQ>34sSppz;dT|B@_ljA2k9-ah312I#&Hj*eJ0 zaC^+o4cz|XYyh2~^?<3F#mRw<1GJudp@f2B18996r~p>rC;*+0cYz6XehnML5eCrx z2r~o=7#w)Az~{|NR)E?c58&s+AhplH?&mI;0M1{K_5!Rum0$pB-zb3g(}2@|0Q|gd zNc~g5Foow6xIMvL0U4iyoRG|{9H8-}4-5=WJQgf+(Ejm(MhV6i-UZz zYA`h@GDJ*3>^C^U;KU5Np9tz61_i!i@OZVX1iXC<4o{eT4`}?Gg~3?{9RA?=2g`$M z8AgT%t_7g=&<>HHRy_kFLqUN9^t^d)@OeI<_AO{(E!2OI^FWv{FfqXHkLm!mR~Wb% z*dg{EU@&xmv{!g7MBx6rSPz|lg5IYa@E4ueG$xWB;! z+3&+)At2Xg`M{xv!6^ZBUJcg<#wdn`j?D}VCz{!q7$(TB0F@6A|7Ely)<2(M0N-ci zB@0?63+?ZL(l^Atp!E%(nL+o#qvTfx1_#+0@bxGR5oO^15NLh@e10!TzoY|$zzk6X zX4v`dOkh65eo%QW%)lT3Zl5p+Fj$oQju6lQov$gt09v22;O~DA!5N_TlmloyjiI6n zJYEJe9~A$f@tJ4f_R0Z6CI!&?&VT>CI4VH%@duo~-uHU|I?t68oc=&d1Dq0CH9+Ux zf%+q0`yE&{VdJ|G;N>~Qzo7J)#r)v!e{YEbP<{M?0g`?h6gXEfMhOUj&kuSaV!_zL zQDGAS9Zz1swgPrOcLT`01B`_(4U!6=@J5sm4B+-k0;v7cz@`w1(q7A8Xb^z)M?mQp zG~dqIz~BYipSH$8AptZVDq!Fs!*23{!-3%tXgw!ry%*^IEpT{%?Bimv@tPsXpkN6d zZ{!7s2iU(1Ocs&w^-8ev3+mqn3!WFu3h?`748Y~hhd-#{|DyuDKPLsUey8{_BO7PS zX;69rrAKi6$HH&`a-J1Dy@TV20g>L3%fAzC;PpV@_=N9wnE}e*4$ONPoE9ttjX!|r z6Cm!FXaM!k6{0}v750GI2Z;>O^>^U(0y+=!!CeOi59oL=v%nwN_+|sf`b9;)V&)IO z|9eCH59zOf&YKbhmoEX#p!4B6YEkpYf#0a(%b@k<$o~0J^E-kQeBKiSBl!II35+dF z72y3}4HinEfC8O|I03YtxnhceGD87qJs7yWHGtk{#-Jd(0F?eA{_Utkj3+v6KD8yK+eBr0M#$x{VU+}uMy|{!}~kn_+(HJHfWJy z-vK$V@JB5u{6YCA0JOhCfk6SeKQF)#(G1?74eOtP%THK)4YWT3+xh<-9<~zD{WRe7 z{W-w*uYmW5F95BdhxC`h=lz4vXO=Ahr4LB>-1q@H{}SRJ@Ok3_u>8ybTF=h`%0Ds= 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 literal 0 HcmV?d00001 diff --git a/akka-samples/akka-sample-cluster/sigar/libsigar-pa-hpux-11.sl b/akka-samples/akka-sample-cluster/sigar/libsigar-pa-hpux-11.sl new file mode 100644 index 0000000000000000000000000000000000000000..0dfd8a112254ee5cc8b8afcc54ff99dcfda9d9d4 GIT binary patch literal 516096 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

-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 literal 0 HcmV?d00001 diff --git a/akka-samples/akka-sample-cluster/sigar/libsigar-ppc-linux.so b/akka-samples/akka-sample-cluster/sigar/libsigar-ppc-linux.so new file mode 100644 index 0000000000000000000000000000000000000000..4394b1b00f95e561ee30e38ea3bfbb5c92039105 GIT binary patch literal 258547 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

C@wPvok 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 OOq6r^5W)qpGxz{41~(%B literal 0 HcmV?d00001 diff --git a/akka-samples/akka-sample-cluster/sigar/libsigar-ppc64-linux.so b/akka-samples/akka-sample-cluster/sigar/libsigar-ppc64-linux.so new file mode 100644 index 0000000000000000000000000000000000000000..a1ba2529c9073b08a0e2c04a6fb79d65371ed596 GIT binary patch literal 330767 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�t}T3?;roPXWZe~#F)?^&zJ$4X9W4xQh|Z_ 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�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∋$o(*TVeSVR2CCyA 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 Ge+2*&MfaNk literal 0 HcmV?d00001 diff --git a/akka-samples/akka-sample-cluster/sigar/libsigar-s390x-linux.so b/akka-samples/akka-sample-cluster/sigar/libsigar-s390x-linux.so new file mode 100644 index 0000000000000000000000000000000000000000..c275f4ac693af6d3ce185714a02a573ee04a715e GIT binary patch literal 269932 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 Gn|Bo6B6CMjVgIbi} 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Ν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 L8?rz{!6^&?9HjRI literal 0 HcmV?d00001 diff --git a/akka-samples/akka-sample-cluster/sigar/libsigar-sparc-solaris.so b/akka-samples/akka-sample-cluster/sigar/libsigar-sparc-solaris.so new file mode 100644 index 0000000000000000000000000000000000000000..aa847d2b54d52b8de50748ca2402cace88674fec GIT binary patch literal 285004 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%0AD9_9uBm|Lu)uqb!RdU0 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%0AtKB>_i2?b=fguKbRuj|= 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%0AsF>U)wgeH7 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 literal 0 HcmV?d00001 diff --git a/akka-samples/akka-sample-cluster/sigar/libsigar-sparc64-solaris.so b/akka-samples/akka-sample-cluster/sigar/libsigar-sparc64-solaris.so new file mode 100644 index 0000000000000000000000000000000000000000..6c4fe809c5330d272b434adad2ef05729194842a GIT binary patch literal 261896 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%0D7#Lvvc2F7znKk$E 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 YBC7}8yM@F4Z=kdd((xEXAYr(E0KJ8(egFUf literal 0 HcmV?d00001 diff --git a/akka-samples/akka-sample-cluster/sigar/libsigar-universal-macosx.dylib b/akka-samples/akka-sample-cluster/sigar/libsigar-universal-macosx.dylib new file mode 100644 index 0000000000000000000000000000000000000000..27ab10711136455c298d47d2ced8d8ef26e82b19 GIT binary patch literal 377668 zcmX^0Z`VEs1_mYu1_mJpFc4s1V0xFqz`(%6z`(%Hz`(%FzzkAx*aa#ERy9hDhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb23Q5cv1@*EvMrpMi~mfq|QWfz5tHxttf#=gGfyMyaf!5pCT9- zcncU97+64RK)30@&5@120jM{Fby8R02#s1z`()* zW-u@)#K$KWmlS2@r9%ZU%wXc<8v}gQi~FEEFdD7X6P(n zU|`YX#x};AetdQJ|(dv5hM)3@$uO7yMBS_M~MrF1_lO@ z8I?IHa4rL;8Kqws7#KJhn7}mL{RkZ(GjbB+A?Yf4`+SJ3y`mmBx7N@bvf2 zEWvI#SPEn+$UmTh8*C%H ztmlNJ2V~DE9u0xf5Eu=C(GVC7fzc2^3V|99re#j^8CYvOn3mOWFfXfZNUpH$VPI

$h3>M!1|L<*JWU$b0U|?{Z#~@L|$-E3C53;i% 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

sFtG`A=paKzV;nnNCP{*zMPdpfy0ugRq@PGzx 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 {W$nQO;9}ya=^LI3=9x8knxJ# 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

GVK=Z?( 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

IL)!U_<}E~f4{38Hni@o7 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

  • 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

    jl3A7-mReMtnV-i1 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 g%r4z(dl}I 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 ZgBQBu%wymH2Ng}AMN9cbDUd3Q0RX&nYli>; literal 0 HcmV?d00001 diff --git a/akka-samples/akka-sample-cluster/sigar/libsigar-x86-linux.so b/akka-samples/akka-sample-cluster/sigar/libsigar-x86-linux.so new file mode 100644 index 0000000000000000000000000000000000000000..a0b64eddb0d2a94054802aba9690f54945f9db5b GIT binary patch literal 233385 zcmb<-^>JflWMqH=W(H;k5U-((fx(10|N+y||tM zC}m_|@MUCRP-I|W*ulWSkj2QrunDRLWJM>GUB<}3(7?#RFp-gg!I^=9L6d=jVId;} zLj*_>0|Ub@sJb1D3=E4H7#O4&85ou_GBEfsGB9jsWMG)a$iT3Ik%3_yBLl-B1_p-L z3=9k`j0_A03=9k_85tPd7#J8p$)}Hzfq|EifuWs|fnhQu149TS14AbR14AMM1H%gj z28PX0``j2A7}OaU7_=A}7*wEkgQW67b}}$990YL~7#Nl@GBEToGB9*AGB7M*WMEKY zWMD{SWMEjp$iUFZ$iU#oz`(GFk%7UUk%1wPk%3`40|Ub!1_p)*Mh1oqMg|6NMh1p$ zj0_C5P&;ZE85lN0*|VT_lrSl`>2uf#+ z3=HXv3=BDp3=BsY7#O-385oL?^nvt7F)}dZGBPkkGcYhbU|?X71BEvu1H(}U28OQ; z3=9^G3=9((85rJx6f-a|R6%JFwFE>kFfgbyGBB)UU|`tI$iQI8$iNW8$iQ#_Dksm# z!0-;r-pa_puz`VrVLl@R!z~5|21P~&hH|KT+!+}d3K$s}>=+psZa~#fXJla5$jHF3 zoRNWH3sl_)1_p*z3=9lGQ2q}F1_otD1_mBbT47{hsAFVccnj692350xk%3`80|P?| z0|UcL1_p-XPM z2141J7#JANFfcI0LHWqkE(QjM5C#T@>rlZ~1_lO4C>uo0U|?Wq0hQ$p3=F0W3=AqD zK`1^2r9qS(h+tq~=z-F=q4Z4#1_mW4dkq5v!y_pB7Xt&sUnu(-lm<~93=9m`3=9lh zj0_A}3=9nQpz?-+fng~~l7WHY9s>hI9+VBD;z0zc>}FtKU}a=r_|L$=@DM6?fq{V` zl!1ZaDgy(Q`o9U|<8)ji9{B$iU#p$iVQ8fq}sYlt&pE7y=j>7>pSi7+!%4fMPEO28Ia?3=IDm z7#J2XFfh1)?17r+4{A4n>P#r#97=<`SVGIlm zR*Vb`@}RuT$iTo4s_#JU3{d()($~z$z~BXHA3)oj(TofXYZ(|AJ~A*c_(9d#KxvTO z-$8aj`6n3|7<@tH50u}=z`#(!z`&3V9#v_<|0Wg0KoG%FGFM;!g!2C6EzA%^%>T`e? z%nTwRilN~-%sf#rA4V`Uh{2d(nwdcyOv4Cf1_?0p2{)vF#LOVcP%g&6z+=kD04hs` z7HR=;QAfJe+00VR2djF)R`C-LgR~riGiV@4$}7o$yW<7 zFlv3@o}#aQ+ccWdJHW!TK2(lKB}J8Wa)s&6j6j5NKuu*UcdPpduDl zJ_s^={Ljq8z!1U92p*3B$v@&}V0h5X2=3p3_$p!y3^h(n@ceX@i-F<8Uj}&kn#|9@ zV9~+I0BR$G)E@&Ci9U?rz9EPoz|Fwm5|0R?VF))7K@=+gkcEL^#$!fsn+@ciY6%90 zJ$8)XJ|T$T#mm6ZvX~LvW&`ncco-N&A{iM#ZATD48JeGA<)JqO~yP+(vPkVT}IwcHF0ACSU#J2ZVl%0~tU16c-! z8wrfyaW0U3lF;-58eagJSHa1^!10EGL4*U6UK7|E7@nMDV2FkK|GqQ>gTN9-22Cg* z6wfK;3=Gep<;62028JIcj0}p<{QFsgfkDKHkpa|?2iXT|uY$rC)aC`*7sAKDa6*ES zK^I!yT^3|un4`rA?i+#B!`f${u?3KNTMh;Wi+caY-p!V&8N(KgqejbKOK?a69Ul|z+!TE=W!HS82VL=@O zJpNvCFfbh0!pHz>3xdqs1+|Y0THZPeF)%0;GJ?kRr}3=C)D5c%;4Hv_{2Hb#b{ z(D-kXWMEj~&dAUOb3=G~-_wWcaFx=5av|na%GcfclWCV|Og4Bb?7eV;}Gm+~x=ILGAU5T1X!Z#NVRKz%WG_(H`oTWnj3F$Os-Y0LlM@ z#@B3ccrY-m=VxHJp~%PpN_QanOce%(7b;BPek_Q;h?9X~4^sJ-q`<&%;WHzHGgv28N7h3=E+DA4uL?lz~CVi-|!RTK=RnF)*;yL;AoV`NPZ% z3>#V*7}BBT7mEY~!vi0Le}8i@Ff=@ej5CAOn`$sHe9>is=NHhJIIKM{#K6UH6`CGE zW7eSfIR=e?P)`C>-=7m_U^rpJ$N(C50GZdt%)s!Y5z$_`qRznJgH%6*`o^HJ0gW?* z%v%RF4`%*DX!wH0X+iS5G7JnSHX+IzUQq@H6FVk&elUls2aUOd)Mu+RFdWcff|noW zk_-$5evIJp9gzFBLhS=}aX{+V@-Q&$;b#Po_k-j?;{+i0fyTu__1|Y<1_m2_M({W| zNZx^mf#FUBBLA&|+HVUkj~N)^WEdD+Vi_4g{b`VTGf?|Phlv3+CIaHmmu6s?P>pCG zz{Vh8;i)Uaz+fZA1Rg&Jsc)2LU?{0)1dpAA_$u-Y3^x6Y44|GFh_4TAZ-V;4ApZ!n zF))a%V`Ko$1%Tu)K7wYpEw}~ z2A4!e@SFrlK8}}xVU7?Zc-#TRuUBMXP?2YXw_lRQ7#MyyA^Jb9nhXpaCW!vdBTfc} z9~&9L<4z#`Uj!H!mZ&nq%VQ^KdIM1)|D1-pA2fah;)g-q4;q^Q@m-*N(6|wZAIZwV zaA7JV!wP8r$Y5n)*s+Fz0a8ElFbGR9FkG=^1oziL_W$H!V0hro$N;GidBF2FXKEm0 zl??Fhs~B%Bu~`3=BtpGs62H4WNjEj*Wrz_lYtv#CS5n+pF)O=I?^0w;o{z1_d!D z@Z1>4eV{omgIY%L+!KgD6I8G=FhKi<3=DUm`h%eH{|FS&43K#skbUaR3=A!1j0`8i z=JPOEFf%ZuG%_7t28K0}j0~W0UXb~d1sNDP)EF72fZfN#P{hK(u;&M&z1qeH z8n8o@XB(mQGiXc%`40+vPenpz(8%{$HA)@*Oh10c!9605vq#m>43V>C;M{fniQ9BLiqo5~RM7hk?N& z3K70J91ILME;2HlhPH$SI5}@%1Stj^+fjch)!;!6w;JHeWc?<#!3@%ED z{&p%S1A|2{BLfrEyrlvR3+4N@Ng<%5PSL3|r1AJ$)60OfjFUP)u8zs=3g&p_<_dALGnwX>LL9T28K_v3=A2mjPUk!7HE7RoDtqWSOs+tWc-PN z!AymLp+|)Y-rkuCO`o9oB9Qr@wGjeH<0+3d7#LO{jqhYa!v{2f4^lq?H2xCA2%gUd z`6o}7fni1>qJ4Tvf`P%u5g{)l&cMK9#t0s{1*vD1W?(1@UrX{3P{|3wpz>-S8v{eh9tH+4aQVi=z{|nFU~-FrffVHr%2=dQowDR#HD+5Ev2}bZ-2grS(>URxv{21gO@WK}8oHs~6 zn-&8DZ2T7_zXTe8u=v`e#K3Svfr$Y$zXCFEy9@&ZOFSb3B){=6oPmySfaY64<`qEW z545HN#DB}m!0=}a1H&e0eldfl2Uz*B6{;RIUj$OWA8H;2m8n=B>51H!$x%Z#~1H&6OCh$5A5TA*kf#E`{B!JBGkYr#;`NRmGvjg!{xfmE+b}=%5`sE=0 z8c_y@1ICE@+lYmMVaGGXc#|PCyg~D$Apai}VqmDzL6n!F(C|_Mrxyl>HPG@7mVeDy z85m+#F))Cp963^HFB7}UV#@i6R{WneJ4%Ltw; z1?d-IXJELJ!N_nQ+MfBz&cN^osXg}}>Rwp-Yf)lg@K8YXX9JZO7(U1&#v9sM7#RM{ zW?)zi%^wGt7#MPT5dELc(hLkDHH`57@LZ_*u<^0|QVa|e{29UXi6HmoX@bI&2|Qm9 z;zxn{`)Y{tVHZ0C!xW_OO%!Ed=s_Ca{iDRd@J1049{$ks0a8CPFl>T`H!S^!NHH*6 z@MQ$A7XjH<2EeKP+XFd zT2#c4R#23gSCYn%o0yZ6pUjYwlV6aU#}FT%T2z#mAD@$-oLG{XpU04rQ(T#g!_?x8 z(vpGPf;)_8dcy*?ymiQ%>WR|6dr4|)~ybRG_2H}ANl{o!QrI|S?E{P?n_+1LO zFE}|jD77pTY$skDz%c`H6_|-vaUR$&&fxff=z+uyUQOw#B>|Z!(2y(0Od;&+?97}T znEImp3*fTP;JGT>3OBOV4EQB%u6kaPfSTEN-ZvqFUbd`l+3(zTwxhn zP?DLO8lRq6l95^jHL(;bmRf>KmrG_*a7khbs#^4aa5t441IjN2%B}K)k`qMIV zQsWaL;<&AME+|FSmJAZWt==!K*f}RNHLoPh2vr}*xyfLe_%b7W&UMKw&JHb3Oh=2S zl+5Dn_)>^CZtH`~6AMu7Ee4C=))7#YpB#dbDhfc!6OvePYXt>taAk2xYAzP{f`hjh zEKAtgAV>J7=AybB?1o&BC~hZ&WE7<)reH);30OFuKwN=r#Z1{?Ym31N9=E-IsU@Cy zC88Nf8Wy?&Mg7{>p3IgV(=K6J?}!jeuv1qs1q9g>Wes!KouxI+awdN5-cHF5|=H7J!h z7p114#tk@?B!h)%%RHUR9mlWk!;;I{i0-WOuKs7F;HZCeihH!CIMIhzy#vDQm zTnL9YxZj)$NjQxL9f@V>MCtZREeXmmElEX+98lp} z1QJ6}k!TVGLewv{#4RTg5*warU}kVh5hAC7OhZ(#X<(%U+rMyM`=ypR=jY|6CWE?b zXpT>YOJMT>x-4ODfQmv;@3jP)&_FH+6@&2w`9&q*P=+KnxHu?L6DkP&QcFP2PR(KagijMc;7x&+d}0DHC= zoPI${apg*6;{sBPax;rT{oG=dU_>&t0HFlh@gvr7-~1Ft~IHeV)?1S`RVC!Kjh@66U?V5np4YCVS{}jy*VI0$W&Z03f2rN z9H3P(XlxOOBT)y|JpJ4}{X9b=aT#2mnP+Si9}Xr#Y2LLWHMz7TF)0UUGZUf%RNRNb z26VwCJ_C5bvbdxu57d^0hbpLeWXMg;1*H&(ASgq|gY!gUZYo23d}48NYEemiT4E+F zNZ=}rP&;2pT(A;wK@MW2K^o?uvD}o*B8K?*WN@XL1Wg+tCD2;DD8HN`9#kQgBWaXh%~4{AYytOc0>9`*;B1Th5J za)?@x0y8a4!OCaB^aDMrwRs zYB@u39(3v13f;DSZ@IXR^TP{Tl?pvFQ@d}2ygX)!F&z`_|-@o7c*x$$6maJMI;h#?bHJA;O) zp$4ReRGODx9-o_;lapD@ke*rs63S0YNrc5fX=X`&B2;;Cc4k35s1^Zd zn+(|K16a5uKRY!KSzT^vPDy4#PHH@|Onz}ZI88#F1c`N6^$HQoFOCN%bWrNcEl9~U zf|-dlI2d0FjsUm@lz~HJxzgg)B19hmqCUMSzq9~d5Rnfdu>-Xpr+Oe>BDmlg=K@{8j!1(A(F8r1=%Ys44}ilwMh zNH&5bFx?0jMN$dM8b}>x6ywq4&~$-|HqZz(Bv>(YqRFG_M(T@UIuv9vx&kEqkn{$s zOrY_LroKEe2i7$J$$)Y`Xo4!Wurx6THsAuz)uly6@u|fniLhcE-tj{53|tiKgfwu% zPXm|2X^lFan@ zf}+ga#G*=2Rm@PFpPZdq!jPGtT#^IQ4Kg26YQ+~J_#pqq!!j|rtjh!C^|Z8{(&7w| zvVz27u=5JaOEXg-I@62N!OUWm;v1aLpi_zIsU-#Fd5O7jlkF{I|DK-kc@2GyEnX~m!t7Zeup z@uj)>DG*Z=OUlxU%}f}ebt{;a1FmMxOu&|7#mz+6qlyt zgPT0y7EA#+jTS&sXJIj@uZyECSC(6zSdjT)kBA`0uqZ7bBke> zB`I29l?8r15NCl}q^U*3*@B{j3`5A_ixOf`r)3sH10)sak_T+sphX;M zHU&XfoRDT!dTI$mV^}U|ZU<+F6`NDR`XTe_q&PRVA~l(ydSYWXp4j+|Cm|N&Nr^kq zR4P$v15_G9Iy#y8dElW#!l3{T;@tca(2Op~lFa-(!chdW2(qq%C<{DN6N^fcQWJ5m zwt&Yy$l#Ft{G4K+#NraiWYA(8qHG8%&2uacElw>WN;T3jBT?!hlih@sf=2;B^Wub+ zf`gsNlnn|L_tMnj640nCVWW#vOGr=+TF_IJpHiAktm&X7X+$^zRE-iUX5;aWN+1$N zacOZuY98T24w|Jw#Y{?YUSdIUMm`Zq4$|s!Nli;E%_$*XTTyCRYEel@J}EkK^UG2l zb8=u>h{$LeiN!G0gaaKEmzhKaQ+jHNClShu6U$PAlZ#SQ^N0(`lvL2P3A9ck>{^I& z7vihFc!&;9q-qb^nkz|8Pb~q>Ixv(Z7eiU)MVTe345<~FuznY8K(08oq&zdF1U85a z6E4rpOUW-!&PdElPfcMcCT_ValW1zLwtOE zQc*T|)(O<%EGk6-W%G3Y~_ig@|IR1DSykMX(_DBXogIxPj0EvOZ7$gQ_gTz2=2!@d`bC}>UijV>60AY{_h=!R0V#D-- zwlNlO_sn7}74 zl|bnRDBT04XF%yCP-F1EqgJX_lD~djz1g43yS@(k4*a0ZRKo z=?EyD0;LO}bPbg5fYMW-^a3co21@UM(np~51t@(7O22^8U!XL@EQmXKptJ;(R)Nw6 zP}&AcyFh6VC>;Q$L!fj5l+J6~&YoPQ7D7^(r?|{;Kp!5MKeFRFMfznr? z^c^Vu1WLbw(qEwTA1KW-8|qIeEdr%wptK5<)`8L{P}&AcyFh6lC>;W&W1w^jl+J)wt>@PX z8YtZWrCXqM2bAuC(i5Qc6ev9dO3#7P3!wB8D7^wouYuAVp!60fy#q?`fzk({^bsh1 z0!p8O(ifog6)1fJO5cIf51{lDDE$ITzk$*pp!63g{R2w>fzk}~Ao0ior8%H9&paju zMjHkO1t?zy%C~^>ZJ_)BC_eRf$|?f`A?vH zf%y>kiOgqWV60FIz6X@=1LDtRU`T-SQ=t3`D8B~Ep8(}gf$|SP`A0zf zw+sw7p!_>f{s$=k3zW~X5aJ%5g-i^LZy6XApnMf5-vY|Ff${^O{17NV1Io{V@@GK# zb3pt~28J_G{v9a&1WJE_(tn^d&mxFBM4+?^l-7aLHc;9HN{2w{2q+x`r4yiZ3Y5-( z(m7DN07{oY=?W-a1Em|FbPJU3fYLosdIFT50;Oj_={Zn(0hC?>rB^`dHBfp3l->fR zcR=YqQ2GFrJ_4m*KAf+7#KEy=yV2#6CkeWzJO>`28JIX+MI#m4~PaGnE059f!&&cfdxd{Ffed{ zXj=vb9uRHEz#sskof#NJK(q@3g9M0nWnhp2(e4Zk3Lx5>fk6dC`!FzQfM{O^1|1OX z$G~6!q5~NiOh9xn1A_&Kj$mN00nw2R3=SYVnt{OuM8_~Nc!20w1_mDx9nZiJ0HPBa z7(zgF5(7g7h)!c*hyl^*3=9b%I+KAR1w>~tFl2z}YzBrL5S_!oPynKH85l}HbUp(^ z1&A(SV5kAng$xW0Ai9`=p#?;jFfeq0=rRU|9uQs0z%T(sS1~Y50nybA3^PD<4Fkg* z5M9f_umD6iFfc3u(M=2tD?oHJ1H&2+-O9kQ0YtYmFl+(QoeT^+Ky(-A{3Rv^_HG7- z10a461H%yz-OIpm0z~&QFq{F=6BrmSfanXB>f2!1N&MA1{M&# zj)8##M6YLH-~rK_85jgW^cDsN5fHtdfk6U9?_gk%0ns}d7!*MCZUzPw5WSayK?6kZ z1MO#JVqo9Tz+eF4A7o%K0ntYo7%V{a2?hom5Pgb)!2v{{Wngdt(dQT#JV5k$1_mDx zeSv`?07PG8U;cg~7#I$K=${M>M?my128I(L`Zoi^84&%4f#Cv({>Q*@1w{X6V7LLI85kMv zfM`ZWh6f;;iIL$6h-PMFcmbkW7#ZGxXjVps4Lx7W@lvh0irn=8UBE1&|%R} znHbo485vkWG#?`a2Z$D6WZ(hOf{Y9TAX5=zfM``l1{)Bq#>n6RqSYB0TtKu2BZCKs z)?#Gv0ns{)3;`fopOGO1L>n?PM1W``Mur#=ZOX`y0HVzp8B##BB_l%yh_+&6$N|x| zj0^=J+K!Q-1Vr02GE{(Q2S$b(5bemw&;X*H85vqYv@0V+2Z;7!Wat6W-i!!dn7$d_L5FO6Q zumeO#Ff!}`(UFV{2S9WbBf}989nHva0z}6!GMoX?v5X8CKy(}5_GBW%D(V&By zpD{78moPH0fao$t1`ZHi!N|Y^qN^Ag1VD5RBZCNtu4QD90MT`f3^E|Pk&!_GM7J<9 zsDS8pMg|QK-NDG91ERYa84N&lHzR`yi0)-%umI70j0`p)dIBSZ1Bjl;$lwB^Co?j5 zfaocV3_c)wCL==th@QpB5CWoSGcrVg=sAoGF(7&YBSQj+UdYIh0-_f&GGu`0#f%I& zAbJTSLjj0h#>h|tqE|99RDkGJj0`m(dJQ8(1BhPB$j}0!*E2G7far~k3_T!vGb6(U z5WR(wVG4-e%E&MSL~mzgm;<7BFfuFv(K{I#mVoFzj0~ZjPlG|{iZDbs9@eg5Vrbs| z2Xv5f3G0hP{0t18-(G|ZFfhEx`@+c39sB3xVTS*kL8n^$Ukn-x0S%n|Uko}76nvup z%Lo7e|Np-jbmCG5Nc!akFdsDXk^vHYc>v4@9Zmo~!RX}%FdsBxlL6Yc|8fDC4`OD3 zjtY1=0n7)T(vSffVtv^F=7Xd%KrMln1z4A4~wF9X1Q(5X!s zprck^I)M2gtr?(eS6&)``Jhu`GC~<|PA|4>CFf zblmvM5C1^^^#R>z06J>=9+Zz4{4Xbf`JfwFGC)VOzia^WK|zxN zy29mU0hqrAPSJ%800P{h&%w&MBae2uA=7WMZ19Yv?%MX7*{s-N-kO8{d=j8)1 z9~9IXpzD%eUI6n!Hw0vWuA6yz0L%vkeFo^rpO+iJe9)}{8KCQQUM>LhK~a$by6WfU z1TY_TntcZ7x|f#?U_K~nGC}plkot=R{--tQJL`q#1{bbLAMNLd;swozMA9U(Yh5!=-!^;C;J}BxlBtZNPU_R)Up9}>Me*u^e zN(vboApQg}A9OoWh5?A*0Oo^|Mur85UjXKVPT$UO0Pz#Rd{9!!@Br}xzZ54vR_BLT!$0P{gfDI){K7Xb5JKsOl`fcOkxJ}7BrRDk#&eu4ZC zx}hnf0mOd*=7W-2MhA$00n7*8z?1YEFE@bspqqs<7J$?*0P{gf zF=GXYKLN}K-8hx80mN?r^Fc{7V+V*|0Oo^kLdpOgN%JxR%m*daj1wUF05BhPYG=j; z5Z?jJ2PNH%8z8;`m=C& z6Xbu;?NAw@Bja8^0P{gfJ%fXpf#Kx^Fn5gI)y7k0mNSb z=7X|Ah6ac~0n7*8I+bAn;x~Z#psbMrIs)-!0hkZE%_swO)cnf?FdvjvGCV-)1HgRH zElU{zAie{b56U_j5g@(+n7;?)z620o0n7(wrHl*^UjWQM0+KHP@fpB;P}a(*0P#Qk z0Qvt6NWKBYe*or#vRXz5h<^dhzXFn<0OB72^FdiJ19a5?%MD=u9gzG2ko*ELACwg{ zKu2Z1oB-xO0m*}oqhAHIY9&%*?| z(T9bB;pGD`AC%QIKu18oya48lfaC>0@&~|tP}a|o0P#0~`7$7R1rUD$m=7unGBiN^ z31GeoNZtU%ZvgW_MMH)Kh+hEa>wx4PK>P$SA5>Iic!2l;V7>`RJ^;jb0P{gbM@9sQ zZvf`ofaDWEd<8HcRFq_7fcOGnz6(gc0K{hi^Fc*RMg@rf;Ty>RJ|Ou95dQ&~4=QRh zIzapjV15WlegcSp0L%v!JsC4V{0(3}==8jd1t9(cFdtMDWvl@4CxH1WApILa{01-| zR5WGm0PzdJ{2Y+{0T4d{%m)=!87Dye05HDJOfaEWL_zqw`sOZkP0pc5g`F}w24?uhcFdtNuXS@LM1;Bh3W(J0g4hA3lTp&jXSN-6{F<0hkXe>N7alK=BXei-6<>K>Pz>KB(x=kO1*FfcY{Y zc?A%E0hkY}3Nkc6{0U&b3P|1n#BTueK~+PB1&Ch&=Iemu9YFj9FdtM^WO#u10bsrf zNIn3>cL4K2RYyhyh;IPq+koT~Kzs!-A5@iOWPtbrV7?1Tz5v8$0P{grOGX8V|KStJ z|2`o31`z)Nm=CIIGCDx~3t&Fzc9x6@ApQX`A5`^Z%mDE>fcY^X{R=?+1zP+UA5=AE>;Ul#!2BGL`~eU@0n7(gRT(Eh`~Wb&1SEd}#CHJmK~-1A z4G`Y|%&!5-KLGI+zBUzAHFdtO)X3PM|ZvgY}faDi|_zS>%P*t3<0>qyH=05?+ZvgQdzsH)C50pbUM`CmZt7eIUmFdtNPXWRhs4LJm|KH8<|3Y^&h}CStQ2L^IH~5;F5}w}XH~;_t z4|vi2?f?Jd%^=O7;C@_ z=xzozcK#c@X#Dj5|4Y!_q@eK10Cgi@{QL6%f2Zq@POxK|kFaze@BHv*CuoG?^Xe?d zZdZ)pL)>;M1FV3L8q7Fas>7^Zvh(#vtAZ#JIUwOZ0=5ow7#QkUSq~)t|KI$B zx5TJkp!o+=iS$cQ(u0Jrt)d?TLy6`~&}a-OeRunEbTjr&o>Kq+|4Yz44^aLU5Fd2c zVYe?&_e9W8PV1%8B#@+FZ!_3mfsimc4ijtm|39F&*%d^E2X;4sTHoLx1DPKb9@yOg zYJY=7nvbY}^e_emb~}XpztHW=)7c2Jp!o<#=OMU^$^Q$lEqlutzyiIKLD2xx0E&j= z%||#u!iL?x0)gGWJpT(hUcCMM|9?O@D5Z6~Aw>^34I#ykU^+Z**}}uR9cunx=sXCD zWIi1g6Tr--s=UmDoR|D`-(FZ%z3k|Rg! zfl~h7=2(zfVK3(Y{r~^9Q1=AT@L21m60V?tuow3K{{IIh^dHf2&~(`Rh6Tx)Sr9Wp zNf7Q#*FWg)?DqYG>Qqp8fSn8KDubN+0iH$??&X7+4R){b|NsA650r3s8gx5wyk-NX z2e`8!`J(v^2a>xkr80pdM6kEH800&68YtxeIj$Wf*4x|-qQb+vn?NIu|1W^bU$Nfi zNg&bQ<`p0cS@H)c0T?zP(dcIDF8vb*i9?5i{};MTc{<%#x_y6i`f-5rBO53lm>C%U zUuZeNKlOkrsLJb2eFOF)dOT}_92&~eZPaZC@@RKEsB`lFLO^#Y$NwUZ|3xfe-R+i>mq?8ZWJH!KV+kiy_x3KK(jEk|$ZiLmZafo@-sz@QiRL8Ux#Gc;NJz!@+ z^drK45=d_;#|!_r;9{Nae-TF*LJv4KproxNsCs#rdLwk@pz;S{z7bUY`!_K2Sxd|NqWopsMY=;ekIpK_?M^ULDr$%M%F7R4*d`{{P?W#u4zM z<@5jloo%4R+`v)#Tw0$=ES`TswQp}Up`oFHFB{`vpE+x1Ux z>I-nhg3}u!+;=4*%7FX7L17Q_-K7$tZYPdTqktFsU;qD~`I--uzd)nb;0tRQdQ-s> z4oM?Oft3p~td`?{DNp!|Ng%_HfeiarBGYO2zf|IXslW??4qto2nY**@$n}j z=t1cLHP6aHjO%9a4gDVkDj~wV8$ez0{}(!sg}wL+igwo@%|`?pYX38o2z0ZDLDhh| z=l?HsyZ%7QW6f_2keqrb5t1O|5`saV?kM1Cr|3(nkHh{(#L4_dZZ=RFf>t%IJGx5+!oay;$4^i$*aFT({4Kf63=G``9G#^bIxU)OMHotCy4gXg zPb9p%6jVe&BCPocPp9je*X+k#L31Sxy{-oWx@*^jcb9Gmdoc%;fb^0hQEZy}P$I{QuusyC%H1c{@08 zOLu_nL8@56_P~Q!9ORMS=DmazgW?UM^e{oC9L+}*x}gT2Ca9VRrt}Iyr2-yx`4 z1ZMCPf=VTj41PmUwG62J?gow-@$S+C-L*$RO&XT}2A~uNPB%@UG4lTxy2ZLnPjuIw z2@mTAM_RW7%l`tF?ou9ToIq58s$lW%(hJ?SS5OpkpeyVa?=HR3U3&*b6%V>9sBsUv zYoDMf6hK!9GVVop?Hd$TBIv51#(n6n{eq%U0$m}vka8sC7j z6H?ZF9fO&5TVp_d99ZuC_4WV%&ejlcb5Ef40Dp@h2LnTQ07s`qZ!2i_Iw0u9?}xB* zN;sfztdd?l!Ms1_k!#L z#b*e(845O_+fAlZAS>WS0Z8E?5HElQlrP15H-q!r)`hVCeYCn& znxHF$8VYSvps2M#R|_%}+NwZNXoId0YACc}fuhy{T`kB^Xxjosp$ob~sG-p21&Ue^ zbhRKup)Cv)g+AyCdzX6r|NkGUodH^+gw)Px4#CpS@B!rmSUY19sN>)2f@o*lL$otM ztKtHJUIagbwKGHly0?OqhK0Yl_xk_;mzy{k7$$V@1qpS#D}Wjr_aO}pgL|Nch61#q z0kRO3@u3Y3uyQwrPJyh57wjN~hq~PqI?);$Ab*ARHeZ00H((Rc8yaA9+!c@;8cjWXh8McBT^5np#jzQj7V+Zh6Ys6TO#$q8X8b-Ux?HOZfHRD{3TKktf2wb#?%CE zbrA~o0B}PCs)vI}J+OubR2x5$+Q1DBs2))w^}re$P;IhAY6CYkpn8;v)B|g1K(%QR zsSVuFfa)jD%x__Z(xlkWVKk^H?T$%vO-+#8(5V2vhZwOHFXutpQILX7qeTB8YBZ2)>(2)WUO ztS|&!Vee84SfdF%rka4%U<&faY%sa5fsd)CJOPcVu7HlIrm{fCRF@DOQ(XWWQw2>Z zF!Z`^3Fxj}5Z+z7BH_RzsvE##svE+)OILu$)m}tC`v3ps zebC5m>56VQ6;K0An+ZJ9v;GQbOjQLmcEb)DqeYCVuIP4G=@iJ)dC>z>atOpj8&h2n z-rJl9E)&6nyBy)jW2zu~;4Lok-e%~uW))aHc&L~Id2+KBWF1I7xUE&XAgs5!o}f}_ z6AP@mnV@P=%L=TtouE=^g9@y=m!N7;I|{6H3PGjN<`Y=;EP|>*ttPP2`2>|h8%to- zO9`q5wUNL|R})kUZW_6(fLiEcpb`1n9XPA8|D}7nVeyF48HY>)gJ#?LyIl_$UJ456 z2B$-C1qWK*0GV58gpB@n^L4u(0V_fnhNz^Vil7-DT8tqSVym0r1If@d_P+pEl>{xo z5XNDxkDx^tLKUvc2wHR@6k@H3pdC1bDqPhNv`dIkh*1aircQzP@tWTt&jBrR!%|*t zftOcX?t{vgHPG@Z5mZuuhmc)&1O&aPz6|Tv2?T)4h!>pq{{Mez4N_IRrrTWuRGyq? z1eYiA7eF044N!7ngNzD*R#tQ#>MmW=?WWNwkfrj%2BhQ=h=fMrdP;%$T!Lkbg+(p?0V!U_|R>iq;&g9{Uo(jx?wBD?q`LDk^G1Z418 zf=Xe92}t!-f~vuV2}mhq8mty~5C?z@6L)YViglMl+aC_to360g9#{mSWPC`5M$4<9 z6a&rqX!Aaxni<;IKp2O}`b{Xt!SX8HIILM8mRI4baAkd1UWF^fn)P8>5UvVW)`w+k zxI&Dqk2>!ITE>9Xy!h;dnO$2!L!R&)%X9}c?*ketg=She&|D5U)3$=fJ3-?yCt>*( zG#&#|8W#S-@7DkSFQwSQ<1rwiZg(9}_T_|($1FGl%Dy^~>KChM*p3 z{)TD01I{oIFQN|^fjtUwU;rqi!}LJMa0prj&G9g8(D4|8+CW(!rUyD6Lr@R241j5S zNTjbog#kp=T(*qqOA*cu3=s;Kn9q=Hi4LlwLO@PqR z4uX1M<1tWe&=Dho+Q8#6P(9F*DS~=n<1tWe(4ilK+Q8#6P(9G`7=n6W<1tWe(6JSQ z+FZaR7vStK){Qy>fTQ?F>-Qsa4(@sY*6&AFi*3xJ6xQ!YR*0)Mfc5*4)ncs>VEuk% zg}CYjSic`xE!JuQ*6&AFh^uCR_4|?4VpI;Gnh;v=A{Cea3ve|JVf}t&Lor&1AVZ-I zW)wqljZi?VVidJlM<}3GF^WQ5BNWgI8AUDD5ejI9jG_?N2nDoSMp27(gaTSEqbS4} zq3B%-8jb@uq{03E9Hfdl${Mp`c3l9km2*ISW!EXtD)}^M6%%MJ)tpX3YpG^{`u(7N z>l!YHIt5u&CywF8_fAnQb%-y3b*7q1V)+Nq%a<(aVX7c0;I|NrteBLhQs z?U`kd3^{Wu3oTUVfI3zSqL%imld1pF@*33_p77bto0v>qq{C9f-C;V-<-{{R1SIyiY< z>2`MkC9h8m;Ngn}`$5Ue1)97->k47X>q@tqOQ%4Vz>8Xtl0zUKTJpLP*4u0eiLE;r z$qQr;a`FNxhK_aMRt!mAAf?ce4m?U>$qS?!+QY}Ang>*7xr6;F)(uM(xY7(PDM0;z zJI%mS16(22Gy_Wta8(#-rZ@EjI4OYFwl}^3?Fv9j4%dw_lS3=0p$ktD&p@5iR#00A znkXK!LI&W$vu4n`SOM3%X7KvT*W441gBhUhTfLATHFSawvP>!LMGL5I1b50|)w4XL zD%}cNFp0H>26s0>ORB+)@NRII8d6nnJN5tnOG}VD!Ghgx9-w5�*ZBoO?kvwFlIA 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

    {{@nh%_)e7bLxSbBig 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 z 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

    PgX>CW1_@DChJ=;O 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 literal 0 HcmV?d00001 diff --git a/akka-samples/akka-sample-cluster/sigar/sigar-x86-winnt.dll b/akka-samples/akka-sample-cluster/sigar/sigar-x86-winnt.dll new file mode 100644 index 0000000000000000000000000000000000000000..6afdc0166c193aef098f1676ae8605ffc4791d38 GIT binary patch literal 266240 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

    */ - def defined(value: ScalaNumericConversions): Boolean = + def defined(value: ScalaNumericAnyConversions): Boolean = convert(value) fold (a ⇒ value.underlying != -1, b ⇒ !(b.isNaN || b.isInfinite)) /** * May involve rounding or truncation. */ - def convert(from: ScalaNumericConversions): Either[Long, Double] = from match { + def convert(from: ScalaNumericAnyConversions): Either[Long, Double] = from match { case n: BigInt ⇒ Left(n.longValue()) case n: BigDecimal ⇒ Right(n.doubleValue()) case n: RichInt ⇒ Left(n.abs) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 8c1a4a6335..2b4f1f93f0 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -30,7 +30,8 @@ object AkkaBuild extends Build { organization := "com.typesafe.akka", version := "2.2-SNAPSHOT", // FIXME: use 2.10.0 for final - scalaVersion := System.getProperty("akka.scalaVersion", "2.10.0-RC1") + scalaVersion := System.getProperty("akka.scalaVersion", "2.10.0-RC2"), + scalaBinaryVersion <<= scalaVersion.identity // FIXME remove for 2.10.0 final ) lazy val akka = Project( @@ -221,7 +222,6 @@ object AkkaBuild extends Build { base = file("akka-zeromq"), dependencies = Seq(actor, testkit % "test;test->test"), settings = defaultSettings ++ OSGi.zeroMQ ++ Seq( - resolvers += "sonatype" at "http://oss.sonatype.org/content/repositories/releases", libraryDependencies ++= Dependencies.zeroMQ, previousArtifact := akkaPreviousArtifact("akka-zeromq") ) @@ -406,7 +406,9 @@ object AkkaBuild extends Build { shellPrompt := { s => Project.extract(s).currentProject.id + " > " } ) - lazy val baseSettings = Defaults.defaultSettings ++ Publish.settings + lazy val baseSettings = Defaults.defaultSettings ++ Publish.settings ++ Seq( + resolvers += "Sonatype Release" at "https://oss.sonatype.org/content/repositories/releases" // FIXME remove after staging RC2 + ) lazy val parentSettings = baseSettings ++ Seq( publishArtifact in Compile := false @@ -664,7 +666,7 @@ object Dependencies { val scalaStm = "org.scala-stm" % "scala-stm" % "0.6" cross CrossVersion.full // Modified BSD (Scala) val slf4jApi = "org.slf4j" % "slf4j-api" % "1.7.2" // MIT - val zeroMQClient = "org.zeromq" % "zeromq-scala-binding_2.10" % "0.0.6-RC1" // ApacheV2 + val zeroMQClient = "org.zeromq" % "zeromq-scala-binding" % "0.0.6" cross CrossVersion.full // ApacheV2 val uncommonsMath = "org.uncommons.maths" % "uncommons-maths" % "1.2.2a" exclude("jfree", "jcommon") exclude("jfree", "jfreechart") // ApacheV2 val ariesBlueprint = "org.apache.aries.blueprint" % "org.apache.aries.blueprint" % "0.3.2" // ApacheV2 val osgiCore = "org.osgi" % "org.osgi.core" % "4.2.0" // ApacheV2 @@ -681,7 +683,7 @@ object Dependencies { val junit = "junit" % "junit" % "4.10" % "test" // Common Public License 1.0 val logback = "ch.qos.logback" % "logback-classic" % "1.0.7" % "test" // EPL 1.0 / LGPL 2.1 val mockito = "org.mockito" % "mockito-all" % "1.8.1" % "test" // MIT - val scalatest = "org.scalatest" % "scalatest" % "1.8" % "test" cross CrossVersion.full // ApacheV2 + val scalatest = "org.scalatest" % "scalatest" % "1.8-B2" % "test" cross CrossVersion.full // ApacheV2 val scalacheck = "org.scalacheck" % "scalacheck" % "1.10.0" % "test" cross CrossVersion.full // New BSD val ariesProxy = "org.apache.aries.proxy" % "org.apache.aries.proxy.impl" % "0.3" % "test" // ApacheV2 val pojosr = "com.googlecode.pojosr" % "de.kalpatec.pojosr.framework" % "0.1.4" % "test" // ApacheV2 From c2bf33afbf8d501c93c5c58daebd5eee793472b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Antonsson?= Date: Thu, 8 Nov 2012 09:00:31 +0100 Subject: [PATCH 127/210] Update doc with correct version of ScalaTest --- akka-docs/rst/dev/multi-jvm-testing.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/akka-docs/rst/dev/multi-jvm-testing.rst b/akka-docs/rst/dev/multi-jvm-testing.rst index 92a4e9c6b1..bee19cbe71 100644 --- a/akka-docs/rst/dev/multi-jvm-testing.rst +++ b/akka-docs/rst/dev/multi-jvm-testing.rst @@ -72,7 +72,7 @@ Here is an example Build.scala file that uses the MultiJvm plugin: "test" cross CrossVersion.full, "com.typesafe.akka" %% "akka-remote-tests-experimental" % "@version@" % "test" cross CrossVersion.full, - "org.scalatest" %% "scalatest" % "1.8" % "test" cross CrossVersion.full, + "org.scalatest" %% "scalatest" % "1.8-B2" % "test" cross CrossVersion.full, "junit" % "junit" % "4.5" % "test" ) } From 21c55a8387abc6739cc964667212d64e1b5b4a26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Antonsson?= Date: Fri, 9 Nov 2012 08:00:30 +0100 Subject: [PATCH 128/210] Cleaning up after 2.1.0-RC2 staging --- project/AkkaBuild.scala | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 2b4f1f93f0..ef67a662be 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -30,8 +30,7 @@ object AkkaBuild extends Build { organization := "com.typesafe.akka", version := "2.2-SNAPSHOT", // FIXME: use 2.10.0 for final - scalaVersion := System.getProperty("akka.scalaVersion", "2.10.0-RC2"), - scalaBinaryVersion <<= scalaVersion.identity // FIXME remove for 2.10.0 final + scalaVersion := System.getProperty("akka.scalaVersion", "2.10.0-RC2") ) lazy val akka = Project( @@ -406,9 +405,7 @@ object AkkaBuild extends Build { shellPrompt := { s => Project.extract(s).currentProject.id + " > " } ) - lazy val baseSettings = Defaults.defaultSettings ++ Publish.settings ++ Seq( - resolvers += "Sonatype Release" at "https://oss.sonatype.org/content/repositories/releases" // FIXME remove after staging RC2 - ) + lazy val baseSettings = Defaults.defaultSettings ++ Publish.settings lazy val parentSettings = baseSettings ++ Seq( publishArtifact in Compile := false From 524bb65e0fe6354383b13d5819cea24476e2f1a0 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Thu, 15 Nov 2012 08:28:35 +0100 Subject: [PATCH 129/210] Increase within timeouts in cluster sample tests, see #2699 --- .../sample/cluster/stats/StatsSampleSingleMasterSpec.scala | 2 +- .../scala/sample/cluster/stats/StatsSampleSpec.scala | 6 +++--- .../sample/cluster/stats/japi/StatsSampleJapiSpec.scala | 6 +++--- .../stats/japi/StatsSampleSingleMasterJapiSpec.scala | 2 +- .../cluster/transformation/TransformationSampleSpec.scala | 2 +- .../transformation/japi/TransformationSampleJapiSpec.scala | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSingleMasterSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSingleMasterSpec.scala index ad678d377f..7acd2ff202 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSingleMasterSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSingleMasterSpec.scala @@ -67,7 +67,7 @@ abstract class StatsSampleSingleMasterSpec extends MultiNodeSpec(StatsSampleSing override def afterAll() = multiNodeSpecAfterAll() "The stats sample with single master" must { - "illustrate how to startup cluster" in within(10 seconds) { + "illustrate how to startup cluster" in within(15 seconds) { Cluster(system).subscribe(testActor, classOf[MemberUp]) expectMsgClass(classOf[CurrentClusterState]) diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSpec.scala index 64c2e2994d..b9eeef3159 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSpec.scala @@ -76,7 +76,7 @@ abstract class StatsSampleSpec extends MultiNodeSpec(StatsSampleSpecConfig) "The stats sample" must { //#startup-cluster - "illustrate how to startup cluster" in within(10 seconds) { + "illustrate how to startup cluster" in within(15 seconds) { Cluster(system).subscribe(testActor, classOf[MemberUp]) expectMsgClass(classOf[CurrentClusterState]) @@ -106,7 +106,7 @@ abstract class StatsSampleSpec extends MultiNodeSpec(StatsSampleSpecConfig) //#test-statsService - "show usage of the statsService from one node" in within(5 seconds) { + "show usage of the statsService from one node" in within(15 seconds) { runOn(second) { val service = system.actorFor(node(third) / "user" / "statsService") service ! StatsJob("this is the text that will be analyzed") @@ -120,7 +120,7 @@ abstract class StatsSampleSpec extends MultiNodeSpec(StatsSampleSpecConfig) } //#test-statsService - "show usage of the statsService from all nodes" in within(5 seconds) { + "show usage of the statsService from all nodes" in within(15 seconds) { val service = system.actorFor(node(third) / "user" / "statsService") service ! StatsJob("this is the text that will be analyzed") val meanWordLength = expectMsgPF() { diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala index 0712305b4b..1f4624674b 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala @@ -65,7 +65,7 @@ abstract class StatsSampleJapiSpec extends MultiNodeSpec(StatsSampleJapiSpecConf "The japi stats sample" must { - "illustrate how to startup cluster" in within(10 seconds) { + "illustrate how to startup cluster" in within(15 seconds) { Cluster(system).subscribe(testActor, classOf[MemberUp]) expectMsgClass(classOf[CurrentClusterState]) @@ -89,7 +89,7 @@ abstract class StatsSampleJapiSpec extends MultiNodeSpec(StatsSampleJapiSpecConf } - "show usage of the statsService from one node" in within(5 seconds) { + "show usage of the statsService from one node" in within(15 seconds) { runOn(second) { val service = system.actorFor(node(third) / "user" / "statsService") service ! new StatsJob("this is the text that will be analyzed") @@ -103,7 +103,7 @@ abstract class StatsSampleJapiSpec extends MultiNodeSpec(StatsSampleJapiSpecConf } //#test-statsService - "show usage of the statsService from all nodes" in within(5 seconds) { + "show usage of the statsService from all nodes" in within(15 seconds) { val service = system.actorFor(node(third) / "user" / "statsService") service ! new StatsJob("this is the text that will be analyzed") val meanWordLength = expectMsgPF() { diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleSingleMasterJapiSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleSingleMasterJapiSpec.scala index 7a5275a7f8..9299e007c4 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleSingleMasterJapiSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleSingleMasterJapiSpec.scala @@ -66,7 +66,7 @@ abstract class StatsSampleSingleMasterJapiSpec extends MultiNodeSpec(StatsSample override def afterAll() = multiNodeSpecAfterAll() "The japi stats sample with single master" must { - "illustrate how to startup cluster" in within(10 seconds) { + "illustrate how to startup cluster" in within(15 seconds) { Cluster(system).subscribe(testActor, classOf[MemberUp]) expectMsgClass(classOf[CurrentClusterState]) diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/TransformationSampleSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/TransformationSampleSpec.scala index 131997730f..8129bad77e 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/TransformationSampleSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/TransformationSampleSpec.scala @@ -52,7 +52,7 @@ abstract class TransformationSampleSpec extends MultiNodeSpec(TransformationSamp override def afterAll() = multiNodeSpecAfterAll() "The transformation sample" must { - "illustrate how to start first frontend" in { + "illustrate how to start first frontend" in within(15 seconds) { runOn(frontend1) { // this will only run on the 'first' node Cluster(system) join node(frontend1).address diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/japi/TransformationSampleJapiSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/japi/TransformationSampleJapiSpec.scala index d7d328f81d..a37458a129 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/japi/TransformationSampleJapiSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/japi/TransformationSampleJapiSpec.scala @@ -53,7 +53,7 @@ abstract class TransformationSampleJapiSpec extends MultiNodeSpec(Transformation override def afterAll() = multiNodeSpecAfterAll() "The japi transformation sample" must { - "illustrate how to start first frontend" in { + "illustrate how to start first frontend" in within(15 seconds) { runOn(frontend1) { // this will only run on the 'first' node Cluster(system) join node(frontend1).address From 5eec693fd08e50e60b5446924a571078305d1ca5 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Thu, 15 Nov 2012 12:48:13 +0100 Subject: [PATCH 130/210] Incorparate review feedback, see #2547 * case object and case class for MixMetricsSelector * Rename decay-half-life-duration to moving-average-half-life * Clarification of decay-half-life-duration and collect-interval * Removed Fields, Java compatibility issue * Adapt for-yield variables * Comment metrics collector constructor that takes system param * Don't copy EWMA if not needed * LogOf2 constant 0.69315 * Don't use mapValues * Remove RichInt conversion * sigar version replace tag in docs * createDeployer factory method to make it possible to override deployer in subclass * Improve readability of MetricsListener (in sample) * Better startup of factorial sample (no sleep) * Many minor enhancements and cleanups --- .../akka/serialization/Serialization.scala | 2 +- .../src/main/resources/reference.conf | 12 +- .../cluster/ClusterActorRefProvider.scala | 8 +- .../cluster/ClusterMetricsCollector.scala | 111 ++++++++++-------- .../scala/akka/cluster/ClusterSettings.scala | 6 +- .../routing/AdaptiveLoadBalancingRouter.scala | 87 ++++++++------ .../AdaptiveLoadBalancingRouterSpec.scala | 4 +- .../akka/cluster/ClusterConfigSpec.scala | 2 +- .../test/scala/akka/cluster/EWMASpec.scala | 2 +- .../cluster/MetricNumericConverterSpec.scala | 6 +- .../scala/akka/cluster/MetricValuesSpec.scala | 13 +- .../akka/cluster/MetricsCollectorSpec.scala | 21 ++-- .../cluster/routing/MetricsSelectorSpec.scala | 5 +- akka-docs/rst/cluster/cluster-usage-java.rst | 8 +- akka-docs/rst/cluster/cluster-usage-scala.rst | 7 +- .../akka/remote/RemoteActorRefProvider.scala | 9 +- .../factorial/japi/FactorialFrontend.java | 30 ++++- .../factorial/japi/FactorialFrontendMain.java | 33 ++---- .../factorial/japi/MetricsListener.java | 26 ++-- .../factorial/japi/StartupFrontend.java | 56 +++++++++ .../cluster/factorial/FactorialSample.scala | 79 +++++++++---- project/AkkaBuild.scala | 1 + 22 files changed, 334 insertions(+), 194 deletions(-) create mode 100644 akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/StartupFrontend.java diff --git a/akka-actor/src/main/scala/akka/serialization/Serialization.scala b/akka-actor/src/main/scala/akka/serialization/Serialization.scala index 071195c11e..2fb6a37469 100644 --- a/akka-actor/src/main/scala/akka/serialization/Serialization.scala +++ b/akka-actor/src/main/scala/akka/serialization/Serialization.scala @@ -32,7 +32,7 @@ object Serialization { private final def configToMap(path: String): Map[String, String] = { import scala.collection.JavaConverters._ - config.getConfig(path).root.unwrapped.asScala.mapValues(_.toString).toMap + config.getConfig(path).root.unwrapped.asScala.toMap map { case (k, v) ⇒ (k -> v.toString) } } } } diff --git a/akka-cluster/src/main/resources/reference.conf b/akka-cluster/src/main/resources/reference.conf index f24aa2dee8..53b14e2842 100644 --- a/akka-cluster/src/main/resources/reference.conf +++ b/akka-cluster/src/main/resources/reference.conf @@ -117,7 +117,8 @@ akka { # is on the classpath, otherwise only JMX. collector-class = "akka.cluster.SigarMetricsCollector" - # How often metrics is sampled on a node. + # How often metrics are sampled on a node. + # Shorter interval will collect the metrics more often. collect-interval = 3s # How often a node publishes metrics information. @@ -125,9 +126,12 @@ akka { # How quickly the exponential weighting of past data is decayed compared to # new data. Set lower to increase the bias toward newer values. - # It takes about 4 half-life to drop below 10% contribution, and 7 to drop - # below 1%. - decay-half-life-duration = 12s + # The relevance of each data sample is halved for every passing half-life duration, + # i.e. after 4 times the half-life, a data sample’s relevance is reduced to 6% of + # its original relevance. The initial relevance of a data sample is given by + # 1 – 0.5 ^ (collect-interval / half-life). + # See http://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average + moving-average-half-life = 12s } # If the tick-duration of the default scheduler is longer than the diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterActorRefProvider.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterActorRefProvider.scala index 3b0b8a1d1a..a4a1b37e86 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterActorRefProvider.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterActorRefProvider.scala @@ -54,7 +54,11 @@ class ClusterActorRefProvider( remoteDeploymentWatcher = system.systemActorOf(Props[RemoteDeploymentWatcher], "RemoteDeploymentWatcher") } - override lazy val deployer: ClusterDeployer = new ClusterDeployer(settings, dynamicAccess) + /** + * Factory method to make it possible to override deployer in subclass + * Creates a new instance every time + */ + override protected def createDeployer: ClusterDeployer = new ClusterDeployer(settings, dynamicAccess) /** * This method is overridden here to keep track of remote deployed actors to @@ -126,7 +130,7 @@ private[akka] class ClusterDeployer(_settings: ActorSystem.Settings, _pm: Dynami routerType match { case "adaptive" ⇒ val metricsSelector = deployment.getString("metrics-selector") match { - case "mix" ⇒ MixMetricsSelector() + case "mix" ⇒ MixMetricsSelector case "heap" ⇒ HeapMetricsSelector case "cpu" ⇒ CpuMetricsSelector case "load" ⇒ SystemLoadAverageMetricsSelector diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala index 3823434f5b..26fd48b494 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala @@ -12,7 +12,6 @@ import java.lang.reflect.Method import scala.collection.immutable import scala.concurrent.duration._ import scala.concurrent.forkjoin.ThreadLocalRandom -import scala.runtime.{ RichLong, RichDouble, RichInt } import scala.util.{ Try, Success, Failure } import akka.ConfigurationException import akka.actor.Actor @@ -183,9 +182,10 @@ private[cluster] case class MetricsGossip(nodes: Set[NodeMetrics]) { */ def merge(remoteGossip: MetricsGossip): MetricsGossip = { val remoteNodes = remoteGossip.nodes.map(n ⇒ n.address -> n).toMap - val toMerge = nodeKeys intersect remoteNodes.keySet - val onlyInRemote = remoteNodes.keySet -- nodeKeys - val onlyInLocal = nodeKeys -- remoteNodes.keySet + val remoteNodesKeySet = remoteNodes.keySet + val toMerge = nodeKeys intersect remoteNodesKeySet + val onlyInRemote = remoteNodesKeySet -- nodeKeys + val onlyInLocal = nodeKeys -- remoteNodesKeySet val seen = nodes.collect { case n if toMerge contains n.address ⇒ n merge remoteNodes(n.address) @@ -198,7 +198,7 @@ private[cluster] case class MetricsGossip(nodes: Set[NodeMetrics]) { } /** - * Adds new local [[akka.cluster.NodeMetrics]] and initializes the data, or merges an existing. + * Adds new local [[akka.cluster.NodeMetrics]], or merges an existing. */ def :+(data: NodeMetrics): MetricsGossip = { val previous = metricsFor(data.address) @@ -232,16 +232,24 @@ private[cluster] case class MetricsGossip(nodes: Set[NodeMetrics]) { private[cluster] case class MetricsGossipEnvelope(from: Address, gossip: MetricsGossip) extends ClusterMessage object EWMA { + /** + * math.log(2) + */ + private val LogOf2 = 0.69315 + /** * Calculate the alpha (decay factor) used in [[akka.cluster.EWMA]] * from specified half-life and interval between observations. - * It takes about 4 half-life to drop below 10% contribution, and 7 to drop - * below 1%. + * Half-life is the interval over which the weights decrease by a factor of two. + * The relevance of each data sample is halved for every passing half-life duration, + * i.e. after 4 times the half-life, a data sample’s relevance is reduced to 6% of + * its original relevance. The initial relevance of a data sample is given by + * 1 – 0.5 ^ (collect-interval / half-life). */ def alpha(halfLife: FiniteDuration, collectInterval: FiniteDuration): Double = { val halfLifeMillis = halfLife.toMillis require(halfLife.toMillis > 0, "halfLife must be > 0 s") - val decayRate = 0.69315 / halfLifeMillis + val decayRate = LogOf2 / halfLifeMillis 1 - math.exp(-decayRate * collectInterval.toMillis) } } @@ -277,7 +285,11 @@ private[cluster] case class EWMA(value: Double, alpha: Double) extends ClusterMe * @param xn the new data point * @return a new [[akka.cluster.EWMA]] with the updated value */ - def :+(xn: Double): EWMA = copy(value = (alpha * xn) + (1 - alpha) * value) + def :+(xn: Double): EWMA = { + val newValue = (alpha * xn) + (1 - alpha) * value + if (newValue == value) this // no change + else copy(value = newValue) + } } @@ -291,7 +303,7 @@ private[cluster] case class EWMA(value: Double, alpha: Double) extends ClusterMe case class Metric private (name: String, value: Number, private val average: Option[EWMA]) extends ClusterMessage with MetricNumericConverter { - require(defined(value), "Invalid Metric [%s] value [%]".format(name, value)) + require(defined(value), s"Invalid Metric [$name] value [$value]") /** * If defined ( [[akka.cluster.MetricNumericConverter.defined()]] ), updates the new @@ -398,16 +410,17 @@ case class NodeMetrics(address: Address, timestamp: Long, metrics: Set[Metric] = */ object StandardMetrics { + // Constants for the heap related Metric names + final val HeapMemoryUsed = "heap-memory-used" + final val HeapMemoryCommitted = "heap-memory-committed" + final val HeapMemoryMax = "heap-memory-max" + + // Constants for the cpu related Metric names + final val SystemLoadAverage = "system-load-average" + final val Processors = "processors" + final val CpuCombined = "cpu-combined" + object HeapMemory { - /** - * Constants for the heap related Metric names - */ - object Fields { - final val HeapMemoryUsed = "heap-memory-used" - final val HeapMemoryCommitted = "heap-memory-committed" - final val HeapMemoryMax = "heap-memory-max" - } - import Fields._ /** * Given a NodeMetrics it returns the HeapMemory data if the nodeMetrics contains @@ -418,9 +431,9 @@ object StandardMetrics { for { used ← nodeMetrics.metric(HeapMemoryUsed) committed ← nodeMetrics.metric(HeapMemoryCommitted) - maxOption = nodeMetrics.metric(HeapMemoryMax).map(_.smoothValue.longValue) } yield (nodeMetrics.address, nodeMetrics.timestamp, - used.smoothValue.longValue, committed.smoothValue.longValue, maxOption) + used.smoothValue.longValue, committed.smoothValue.longValue, + nodeMetrics.metric(HeapMemoryMax).map(_.smoothValue.longValue)) } } @@ -431,6 +444,7 @@ object StandardMetrics { */ def extractHeapMemory(nodeMetrics: NodeMetrics): HeapMemory = nodeMetrics match { case HeapMemory(address, timestamp, used, committed, max) ⇒ + // note that above extractor returns tuple HeapMemory(address, timestamp, used, committed, max) case _ ⇒ null } @@ -454,15 +468,6 @@ object StandardMetrics { } object Cpu { - /** - * Constants for the cpu related Metric names - */ - object Fields { - final val SystemLoadAverage = "system-load-average" - final val Processors = "processors" - final val CpuCombined = "cpu-combined" - } - import Fields._ /** * Given a NodeMetrics it returns the Cpu data if the nodeMetrics contains @@ -472,10 +477,9 @@ object StandardMetrics { def unapply(nodeMetrics: NodeMetrics): Option[(Address, Long, Option[Double], Option[Double], Int)] = { for { processors ← nodeMetrics.metric(Processors) - systemLoadAverageOption = nodeMetrics.metric(SystemLoadAverage).map(_.smoothValue) - cpuCombinedOption = nodeMetrics.metric(CpuCombined).map(_.smoothValue) } yield (nodeMetrics.address, nodeMetrics.timestamp, - systemLoadAverageOption, cpuCombinedOption, processors.value.intValue) + nodeMetrics.metric(SystemLoadAverage).map(_.smoothValue), + nodeMetrics.metric(CpuCombined).map(_.smoothValue), processors.value.intValue) } } @@ -486,6 +490,7 @@ object StandardMetrics { */ def extractCpu(nodeMetrics: NodeMetrics): Cpu = nodeMetrics match { case Cpu(address, timestamp, systemLoadAverage, cpuCombined, processors) ⇒ + // note that above extractor returns tuple Cpu(address, timestamp, systemLoadAverage, cpuCombined, processors) case _ ⇒ null } @@ -508,7 +513,7 @@ object StandardMetrics { processors: Int) { cpuCombined match { - case Some(x) ⇒ require(0.0 <= x && x <= 1.0, "cpuCombined must be between [0.0 - 1.0], was [%s]" format x) + case Some(x) ⇒ require(0.0 <= x && x <= 1.0, s"cpuCombined must be between [0.0 - 1.0], was [$x]") case None ⇒ } @@ -542,12 +547,9 @@ private[cluster] trait MetricNumericConverter { case n: Long ⇒ Left(n) case n: Double ⇒ Right(n) case n: Float ⇒ Right(n) - case n: RichInt ⇒ Left(n.abs) - case n: RichLong ⇒ Left(n.self) - case n: RichDouble ⇒ Right(n.self) case n: BigInt ⇒ Left(n.longValue) case n: BigDecimal ⇒ Right(n.doubleValue) - case x ⇒ throw new IllegalArgumentException("Not a number [%s]" format x) + case x ⇒ throw new IllegalArgumentException(s"Not a number [$x]") } } @@ -569,13 +571,15 @@ private[cluster] trait MetricsCollector extends Closeable { * @param decay how quickly the exponential weighting of past data is decayed */ class JmxMetricsCollector(address: Address, decayFactor: Double) extends MetricsCollector { - import StandardMetrics.HeapMemory.Fields._ - import StandardMetrics.Cpu.Fields._ + import StandardMetrics._ private def this(cluster: Cluster) = this(cluster.selfAddress, - EWMA.alpha(cluster.settings.MetricsDecayHalfLifeDuration, cluster.settings.MetricsInterval)) + EWMA.alpha(cluster.settings.MetricsMovingAverageHalfLife, cluster.settings.MetricsInterval)) + /** + * This constructor is used when creating an instance from configured FQCN + */ def this(system: ActorSystem) = this(Cluster(system)) private val decayFactorOption = Some(decayFactor) @@ -586,6 +590,7 @@ class JmxMetricsCollector(address: Address, decayFactor: Double) extends Metrics /** * Samples and collects new data points. + * Creates a new instance each time. */ def sample: NodeMetrics = NodeMetrics(address, newTimestamp, metrics) @@ -598,6 +603,7 @@ class JmxMetricsCollector(address: Address, decayFactor: Double) extends Metrics * JMX Returns the OS-specific average load on the CPUs in the system, for the past 1 minute. * On some systems the JMX OS system load average may not be available, in which case a -1 is * returned from JMX, and None is returned from this method. + * Creates a new instance each time. */ def systemLoadAverage: Option[Metric] = Metric.create( name = SystemLoadAverage, @@ -606,6 +612,7 @@ class JmxMetricsCollector(address: Address, decayFactor: Double) extends Metrics /** * (JMX) Returns the number of available processors + * Creates a new instance each time. */ def processors: Option[Metric] = Metric.create( name = Processors, @@ -619,6 +626,7 @@ class JmxMetricsCollector(address: Address, decayFactor: Double) extends Metrics /** * (JMX) Returns the current sum of heap memory used from all heap memory pools (in bytes). + * Creates a new instance each time. */ def heapUsed(heap: MemoryUsage): Option[Metric] = Metric.create( name = HeapMemoryUsed, @@ -628,6 +636,7 @@ class JmxMetricsCollector(address: Address, decayFactor: Double) extends Metrics /** * (JMX) Returns the current sum of heap memory guaranteed to be available to the JVM * from all heap memory pools (in bytes). + * Creates a new instance each time. */ def heapCommitted(heap: MemoryUsage): Option[Metric] = Metric.create( name = HeapMemoryCommitted, @@ -638,6 +647,7 @@ class JmxMetricsCollector(address: Address, decayFactor: Double) extends Metrics * (JMX) Returns the maximum amount of memory (in bytes) that can be used * for JVM memory management. If not defined the metrics value is None, i.e. * never negative. + * Creates a new instance each time. */ def heapMax(heap: MemoryUsage): Option[Metric] = Metric.create( name = HeapMemoryMax, @@ -665,14 +675,16 @@ class JmxMetricsCollector(address: Address, decayFactor: Double) extends Metrics class SigarMetricsCollector(address: Address, decayFactor: Double, sigar: AnyRef) extends JmxMetricsCollector(address, decayFactor) { - import StandardMetrics.HeapMemory.Fields._ - import StandardMetrics.Cpu.Fields._ + import StandardMetrics._ private def this(cluster: Cluster) = this(cluster.selfAddress, - EWMA.alpha(cluster.settings.MetricsDecayHalfLifeDuration, cluster.settings.MetricsInterval), + EWMA.alpha(cluster.settings.MetricsMovingAverageHalfLife, cluster.settings.MetricsInterval), cluster.system.dynamicAccess.createInstanceFor[AnyRef]("org.hyperic.sigar.Sigar", Nil).get) + /** + * This constructor is used when creating an instance from configured FQCN + */ def this(system: ActorSystem) = this(Cluster(system)) private val decayFactorOption = Some(decayFactor) @@ -689,7 +701,7 @@ class SigarMetricsCollector(address: Address, decayFactor: Double, sigar: AnyRef try method.invoke(sigar).asInstanceOf[Long] catch { case e: InvocationTargetException if e.getCause.isInstanceOf[LinkageError] ⇒ // native libraries not in place - // don't throw fatal LinkageError, but something less harmless + // don't throw fatal LinkageError, but something harmless throw new IllegalArgumentException(e.getCause.toString) case e: InvocationTargetException ⇒ throw e.getCause } @@ -705,6 +717,7 @@ class SigarMetricsCollector(address: Address, decayFactor: Double, sigar: AnyRef * On some systems the JMX OS system load average may not be available, in which case a -1 is returned * from JMX, which means that None is returned from this method. * Hyperic SIGAR provides more precise values, thus, if the library is on the classpath, it is the default. + * Creates a new instance each time. */ override def systemLoadAverage: Option[Metric] = Metric.create( name = SystemLoadAverage, @@ -718,6 +731,8 @@ class SigarMetricsCollector(address: Address, decayFactor: Double, sigar: AnyRef * * In the data stream, this will sometimes return with a valid metric value, and sometimes as a NaN or Infinite. * Documented bug https://bugzilla.redhat.com/show_bug.cgi?id=749121 and several others. + * + * Creates a new instance each time. */ def cpuCombined: Option[Metric] = Metric.create( name = CpuCombined, @@ -756,10 +771,10 @@ private[cluster] object MetricsCollector { } } else { - system.dynamicAccess.createInstanceFor[MetricsCollector]( - fqcn, List(classOf[ActorSystem] -> system)).recover({ + system.dynamicAccess.createInstanceFor[MetricsCollector](fqcn, List(classOf[ActorSystem] -> system)). + recover { case e ⇒ throw new ConfigurationException("Could not create custom metrics collector [" + fqcn + "] due to:" + e.toString) - }).get + }.get } } } diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala index da03e2009e..6861459168 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala @@ -77,9 +77,9 @@ class ClusterSettings(val config: Config, val systemName: String) { require(d > Duration.Zero, "metrics.collect-interval must be > 0"); d } final val MetricsGossipInterval: FiniteDuration = Duration(getMilliseconds("akka.cluster.metrics.gossip-interval"), MILLISECONDS) - final val MetricsDecayHalfLifeDuration: FiniteDuration = { - val d = Duration(getMilliseconds("akka.cluster.metrics.decay-half-life-duration"), MILLISECONDS) - require(d > Duration.Zero, "metrics.decay-half-life-duration must be > 0"); d + final val MetricsMovingAverageHalfLife: FiniteDuration = { + val d = Duration(getMilliseconds("akka.cluster.metrics.moving-average-half-life"), MILLISECONDS) + require(d > Duration.Zero, "metrics.moving-average-half-life must be > 0"); d } } diff --git a/akka-cluster/src/main/scala/akka/cluster/routing/AdaptiveLoadBalancingRouter.scala b/akka-cluster/src/main/scala/akka/cluster/routing/AdaptiveLoadBalancingRouter.scala index fc850e2d69..430aeaeeaf 100644 --- a/akka-cluster/src/main/scala/akka/cluster/routing/AdaptiveLoadBalancingRouter.scala +++ b/akka-cluster/src/main/scala/akka/cluster/routing/AdaptiveLoadBalancingRouter.scala @@ -33,13 +33,13 @@ import akka.routing.RouteeProvider import akka.routing.RouterConfig object AdaptiveLoadBalancingRouter { - private val defaultSupervisorStrategy: SupervisorStrategy = OneForOneStrategy() { + private val escalateStrategy: SupervisorStrategy = OneForOneStrategy() { case _ ⇒ SupervisorStrategy.Escalate } } /** - * A Router that performs load balancing to cluster nodes based on + * A Router that performs load balancing of messages to cluster nodes based on * cluster metric data. * * It uses random selection of routees based probabilities derived from @@ -71,11 +71,11 @@ object AdaptiveLoadBalancingRouter { */ @SerialVersionUID(1L) case class AdaptiveLoadBalancingRouter( - metricsSelector: MetricsSelector = MixMetricsSelector(), + metricsSelector: MetricsSelector = MixMetricsSelector, nrOfInstances: Int = 0, routees: immutable.Iterable[String] = Nil, override val resizer: Option[Resizer] = None, val routerDispatcher: String = Dispatchers.DefaultDispatcherId, - val supervisorStrategy: SupervisorStrategy = AdaptiveLoadBalancingRouter.defaultSupervisorStrategy) + val supervisorStrategy: SupervisorStrategy = AdaptiveLoadBalancingRouter.escalateStrategy) extends RouterConfig with AdaptiveLoadBalancingRouterLike { /** @@ -137,7 +137,7 @@ case class AdaptiveLoadBalancingRouter( /** * INTERNAL API. * - * This strategy is a metrics-aware router which performs load balancing of + * This strategy is a metrics-aware router which performs load balancing of messages to * cluster nodes based on cluster metric data. It consumes [[akka.cluster.ClusterMetricsChanged]] * events and the [[akka.cluster.routing.MetricsSelector]] creates an mix of * weighted routees based on the node metrics. Messages are routed randomly to the @@ -181,7 +181,7 @@ trait AdaptiveLoadBalancingRouterLike { this: RouterConfig ⇒ } def receiveMetrics(metrics: Set[NodeMetrics]): Unit = { - // update the state outside of the actor, not a recommended practice, but works fine here + // this is the only place from where weightedRoutees is updated weightedRoutees = Some(new WeightedRoutees(routeeProvider.routees, cluster.selfAddress, metricsSelector.weights(metrics))) } @@ -275,6 +275,20 @@ case object SystemLoadAverageMetricsSelector extends CapacityMetricsSelector { } } +/** + * Singleton instance of the default MixMetricsSelector, which uses [akka.cluster.routing.HeapMetricsSelector], + * [akka.cluster.routing.CpuMetricsSelector], and [akka.cluster.routing.SystemLoadAverageMetricsSelector] + */ +@SerialVersionUID(1L) +object MixMetricsSelector extends MixMetricsSelectorBase( + Vector(HeapMetricsSelector, CpuMetricsSelector, SystemLoadAverageMetricsSelector)) { + + /** + * Java API: get the default singleton instance + */ + def getInstance = this +} + /** * MetricsSelector that combines other selectors and aggregates their capacity * values. By default it uses [akka.cluster.routing.HeapMetricsSelector], @@ -282,8 +296,14 @@ case object SystemLoadAverageMetricsSelector extends CapacityMetricsSelector { */ @SerialVersionUID(1L) case class MixMetricsSelector( - selectors: immutable.IndexedSeq[CapacityMetricsSelector] = Vector( - HeapMetricsSelector, CpuMetricsSelector, SystemLoadAverageMetricsSelector)) + selectors: immutable.IndexedSeq[CapacityMetricsSelector]) + extends MixMetricsSelectorBase(selectors) + +/** + * Base class for MetricsSelector that combines other selectors and aggregates their capacity. + */ +@SerialVersionUID(1L) +abstract class MixMetricsSelectorBase(selectors: immutable.IndexedSeq[CapacityMetricsSelector]) extends CapacityMetricsSelector { /** @@ -298,20 +318,13 @@ case class MixMetricsSelector( case (acc, (address, capacity)) ⇒ val (sum, count) = acc(address) acc + (address -> (sum + capacity, count + 1)) - }.mapValues { - case (sum, count) ⇒ sum / count - }.toMap + }.map { + case (addr, (sum, count)) ⇒ (addr -> sum / count) + } } } -case object MixMetricsSelector { - /** - * Java API: get the default singleton instance - */ - def getInstance = MixMetricsSelector() -} - /** * A MetricsSelector is responsible for producing weights from the node metrics. */ @@ -349,7 +362,7 @@ abstract class CapacityMetricsSelector extends MetricsSelector { val (_, min) = capacity.minBy { case (_, c) ⇒ c } // lowest usable capacity is 1% (>= 0.5% will be rounded to weight 1), also avoids div by zero val divisor = math.max(0.01, min) - capacity mapValues { c ⇒ math.round((c) / divisor).toInt } + capacity map { case (addr, c) ⇒ (addr -> math.round((c) / divisor).toInt) } } } @@ -379,12 +392,13 @@ private[cluster] class WeightedRoutees(refs: immutable.IndexedSeq[ActorRef], sel } val buckets = Array.ofDim[Int](refs.size) val meanWeight = if (weights.isEmpty) 1 else weights.values.sum / weights.size - val w = weights.withDefaultValue(meanWeight) + val w = weights.withDefaultValue(meanWeight) // we don’t necessarily have metrics for all addresses + var i = 0 var sum = 0 - refs.zipWithIndex foreach { - case (ref, i) ⇒ - sum += w(fullAddress(ref)) - buckets(i) = sum + refs foreach { ref ⇒ + sum += w(fullAddress(ref)) + buckets(i) = sum + i += 1 } buckets } @@ -397,20 +411,21 @@ private[cluster] class WeightedRoutees(refs: immutable.IndexedSeq[ActorRef], sel * Pick the routee matching a value, from 1 to total. */ def apply(value: Int): ActorRef = { - // converts the result of Arrays.binarySearch into a index in the buckets array - // see documentation of Arrays.binarySearch for what it returns - def idx(i: Int): Int = { - if (i >= 0) i // exact match - else { - val j = math.abs(i + 1) - if (j >= buckets.length) throw new IndexOutOfBoundsException( - "Requested index [%s] is > max index [%s]".format(i, buckets.length)) - else j - } - } - require(1 <= value && value <= total, "value must be between [1 - %s]" format total) refs(idx(Arrays.binarySearch(buckets, value))) + } + /** + * Converts the result of Arrays.binarySearch into a index in the buckets array + * see documentation of Arrays.binarySearch for what it returns + */ + private def idx(i: Int): Int = { + if (i >= 0) i // exact match + else { + val j = math.abs(i + 1) + if (j >= buckets.length) throw new IndexOutOfBoundsException( + "Requested index [%s] is > max index [%s]".format(i, buckets.length)) + else j + } } } \ No newline at end of file diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/AdaptiveLoadBalancingRouterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/AdaptiveLoadBalancingRouterSpec.scala index 79143a6b4c..f936c5d0a7 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/AdaptiveLoadBalancingRouterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/AdaptiveLoadBalancingRouterSpec.scala @@ -131,10 +131,10 @@ abstract class AdaptiveLoadBalancingRouterSpec extends MultiNodeSpec(AdaptiveLoa val router1 = startRouter("router1") // collect some metrics before we start - Thread.sleep(10000) + Thread.sleep(cluster.settings.MetricsInterval.toMillis * 10) val iterationCount = 100 - for (i ← 0 until iterationCount) { + 1 to iterationCount foreach { _ ⇒ router1 ! "hit" // wait a while between each message, since metrics is collected periodically Thread.sleep(10) diff --git a/akka-cluster/src/test/scala/akka/cluster/ClusterConfigSpec.scala b/akka-cluster/src/test/scala/akka/cluster/ClusterConfigSpec.scala index 547cfb8211..a857a3363c 100644 --- a/akka-cluster/src/test/scala/akka/cluster/ClusterConfigSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/ClusterConfigSpec.scala @@ -50,7 +50,7 @@ class ClusterConfigSpec extends AkkaSpec { MetricsCollectorClass must be(classOf[SigarMetricsCollector].getName) MetricsInterval must be(3 seconds) MetricsGossipInterval must be(3 seconds) - MetricsDecayHalfLifeDuration must be(12 seconds) + MetricsMovingAverageHalfLife must be(12 seconds) } } } diff --git a/akka-cluster/src/test/scala/akka/cluster/EWMASpec.scala b/akka-cluster/src/test/scala/akka/cluster/EWMASpec.scala index 760f64206f..ed954b7bb6 100644 --- a/akka-cluster/src/test/scala/akka/cluster/EWMASpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/EWMASpec.scala @@ -94,7 +94,7 @@ class EWMASpec extends AkkaSpec(MetricsEnabledSpec.config) with MetricsCollector } else None } } - streamingDataSet ++= changes.map(m ⇒ m.name -> m).toMap + streamingDataSet ++= changes.map(m ⇒ m.name -> m) } } } diff --git a/akka-cluster/src/test/scala/akka/cluster/MetricNumericConverterSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricNumericConverterSpec.scala index e20e670879..1b7e30eae1 100644 --- a/akka-cluster/src/test/scala/akka/cluster/MetricNumericConverterSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/MetricNumericConverterSpec.scala @@ -5,8 +5,8 @@ package akka.cluster import akka.testkit.{ ImplicitSender, AkkaSpec } -import akka.cluster.StandardMetrics.HeapMemory.Fields._ -import scala.util.Try +import akka.cluster.StandardMetrics._ +import scala.util.Failure @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) class MetricNumericConverterSpec extends AkkaSpec(MetricsEnabledSpec.config) with MetricNumericConverter with ImplicitSender @@ -33,7 +33,7 @@ class MetricNumericConverterSpec extends AkkaSpec(MetricsEnabledSpec.config) wit "define an undefined value with a None " in { Metric.create("x", -1, None).isDefined must be(false) Metric.create("x", java.lang.Double.NaN, None).isDefined must be(false) - Metric.create("x", Try(throw new RuntimeException), None).isDefined must be(false) + Metric.create("x", Failure(new RuntimeException), None).isDefined must be(false) } "recognize whether a metric value is defined" in { diff --git a/akka-cluster/src/test/scala/akka/cluster/MetricValuesSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricValuesSpec.scala index b174375ece..8a38b59da6 100644 --- a/akka-cluster/src/test/scala/akka/cluster/MetricValuesSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/MetricValuesSpec.scala @@ -7,8 +7,7 @@ package akka.cluster import scala.util.Try import akka.actor.Address import akka.testkit.AkkaSpec -import akka.cluster.StandardMetrics.HeapMemory -import akka.cluster.StandardMetrics.Cpu +import akka.cluster.StandardMetrics._ @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) class MetricValuesSpec extends AkkaSpec(MetricsEnabledSpec.config) with MetricsCollectorFactory { @@ -19,21 +18,17 @@ class MetricValuesSpec extends AkkaSpec(MetricsEnabledSpec.config) with MetricsC val node2 = NodeMetrics(Address("akka", "sys", "a", 2555), 1, collector.sample.metrics) val nodes: Seq[NodeMetrics] = { - var nodes = Seq(node1, node2) - // work up the data streams where applicable - for (i ← 1 to 100) { - nodes = nodes map { n ⇒ + (1 to 100).foldLeft(List(node1, node2)) { (nodes, _) ⇒ + nodes map { n ⇒ n.copy(metrics = collector.sample.metrics.flatMap(latest ⇒ n.metrics.collect { case streaming if latest sameAs streaming ⇒ streaming :+ latest })) } } - nodes } "NodeMetrics.MetricValues" must { "extract expected metrics for load balancing" in { - import HeapMemory.Fields._ val stream1 = node2.metric(HeapMemoryCommitted).get.value.longValue val stream2 = node1.metric(HeapMemoryUsed).get.value.longValue stream1 must be >= (stream2) @@ -53,7 +48,6 @@ class MetricValuesSpec extends AkkaSpec(MetricsEnabledSpec.config) with MetricsC committed must be > (0L) // extract is the java api StandardMetrics.extractCpu(node) must not be (null) - case _ ⇒ fail("no heap") } node match { @@ -67,7 +61,6 @@ class MetricValuesSpec extends AkkaSpec(MetricsEnabledSpec.config) with MetricsC } // extract is the java api StandardMetrics.extractCpu(node) must not be (null) - case _ ⇒ fail("no cpu") } } } diff --git a/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala index a7cb445649..2ce3892645 100644 --- a/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/MetricsCollectorSpec.scala @@ -14,8 +14,7 @@ import scala.util.{ Success, Try, Failure } import akka.actor._ import akka.testkit._ -import akka.cluster.StandardMetrics.HeapMemory.Fields._ -import akka.cluster.StandardMetrics.Cpu.Fields._ +import akka.cluster.StandardMetrics._ import org.scalatest.WordSpec import org.scalatest.matchers.MustMatchers @@ -41,23 +40,21 @@ class MetricsCollectorSpec extends AkkaSpec(MetricsEnabledSpec.config) with Impl val sample1 = collector.sample.metrics val sample2 = collector.sample.metrics val merged12 = sample2 flatMap (latest ⇒ sample1 collect { - case peer if latest sameAs peer ⇒ { + case peer if latest sameAs peer ⇒ val m = peer :+ latest m.value must be(latest.value) m.isSmooth must be(peer.isSmooth || latest.isSmooth) m - } }) val sample3 = collector.sample.metrics val sample4 = collector.sample.metrics val merged34 = sample4 flatMap (latest ⇒ sample3 collect { - case peer if latest sameAs peer ⇒ { + case peer if latest sameAs peer ⇒ val m = peer :+ latest m.value must be(latest.value) m.isSmooth must be(peer.isSmooth || latest.isSmooth) m - } }) } } @@ -124,12 +121,12 @@ trait MetricsCollectorFactory { this: AkkaSpec ⇒ def createMetricsCollector: MetricsCollector = Try(new SigarMetricsCollector(selfAddress, defaultDecayFactor, - extendedActorSystem.dynamicAccess.createInstanceFor[AnyRef]("org.hyperic.sigar.Sigar", Nil).get)) match { - case Success(sigarCollector) ⇒ sigarCollector - case Failure(e) ⇒ - log.debug("Metrics will be retreived from MBeans, Sigar failed to load. Reason: " + e) - new JmxMetricsCollector(selfAddress, defaultDecayFactor) - } + extendedActorSystem.dynamicAccess.createInstanceFor[AnyRef]("org.hyperic.sigar.Sigar", Nil))). + recover { + case e ⇒ + log.debug("Metrics will be retreived from MBeans, Sigar failed to load. Reason: " + e) + new JmxMetricsCollector(selfAddress, defaultDecayFactor) + }.get def isSigar(collector: MetricsCollector): Boolean = collector.isInstanceOf[SigarMetricsCollector] } diff --git a/akka-cluster/src/test/scala/akka/cluster/routing/MetricsSelectorSpec.scala b/akka-cluster/src/test/scala/akka/cluster/routing/MetricsSelectorSpec.scala index 851152413e..5b5b92d950 100644 --- a/akka-cluster/src/test/scala/akka/cluster/routing/MetricsSelectorSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/routing/MetricsSelectorSpec.scala @@ -10,8 +10,7 @@ import org.scalatest.matchers.MustMatchers import akka.actor.Address import akka.cluster.Metric import akka.cluster.NodeMetrics -import akka.cluster.StandardMetrics.HeapMemory.Fields._ -import akka.cluster.StandardMetrics.Cpu.Fields._ +import akka.cluster.StandardMetrics._ @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) class MetricsSelectorSpec extends WordSpec with MustMatchers { @@ -107,7 +106,7 @@ class MetricsSelectorSpec extends WordSpec with MustMatchers { "MixMetricsSelector" must { "aggregate capacity of all metrics" in { - val capacity = MixMetricsSelector().capacity(nodeMetrics) + val capacity = MixMetricsSelector.capacity(nodeMetrics) capacity(a1) must be((0.75 + 0.9 + 0.9375) / 3 plusOrMinus 0.0001) capacity(b1) must be((0.75 + 0.5 + 0.9375) / 3 plusOrMinus 0.0001) capacity(c1) must be((0.0 + 0.0 + 0.0) / 3 plusOrMinus 0.0001) diff --git a/akka-docs/rst/cluster/cluster-usage-java.rst b/akka-docs/rst/cluster/cluster-usage-java.rst index b91b3d943d..9059bfd13d 100644 --- a/akka-docs/rst/cluster/cluster-usage-java.rst +++ b/akka-docs/rst/cluster/cluster-usage-java.rst @@ -440,8 +440,8 @@ service nodes and 1 client:: Cluster Metrics ^^^^^^^^^^^^^^^ -The member nodes of the cluster collects system health metrics and publish that to other nodes and to -registered subscribers. This information is primarily used for load-balancing of nodes. +The member nodes of the cluster collects system health metrics and publishes that to other nodes and to +registered subscribers. This information is primarily used for load-balancing routers. Hyperic Sigar ------------- @@ -454,7 +454,7 @@ Sigar is using a native OS library. To enable usage of Sigar you need to add the org.hyperic sigar - 1.6.4 + @sigarVersion@ @@ -522,6 +522,8 @@ one frontend:: mvn exec:java \ -Dexec.mainClass="sample.cluster.factorial.FactorialFrontendMain" +Press ctrl-c in the terminal window of the frontend to stop the factorial calculations. + Subscribe to Metrics Events --------------------------- diff --git a/akka-docs/rst/cluster/cluster-usage-scala.rst b/akka-docs/rst/cluster/cluster-usage-scala.rst index 00369e2303..eacbefc9d6 100644 --- a/akka-docs/rst/cluster/cluster-usage-scala.rst +++ b/akka-docs/rst/cluster/cluster-usage-scala.rst @@ -401,8 +401,8 @@ service nodes and 1 client:: Cluster Metrics ^^^^^^^^^^^^^^^ -The member nodes of the cluster collects system health metrics and publish that to other nodes and to -registered subscribers. This information is primarily used for load-balancing of nodes. +The member nodes of the cluster collects system health metrics and publishes that to other nodes and to +registered subscribers. This information is primarily used for load-balancing routers. Hyperic Sigar ------------- @@ -412,7 +412,7 @@ for a wider and more accurate range of metrics compared to what can be retrieved Sigar is using a native OS library. To enable usage of Sigar you need to add the directory of the native library to ``-Djava.libarary.path=`` add the following dependency:: - "org.hyperic" % "sigar" % "1.6.4" + "org.hyperic" % "sigar" % "@sigarVersion@" Adaptive Load Balancing @@ -473,6 +473,7 @@ and you can try by starting nodes in different terminal windows. For example, st run-main sample.cluster.factorial.FactorialFrontend +Press ctrl-c in the terminal window of the frontend to stop the factorial calculations. Subscribe to Metrics Events --------------------------- diff --git a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala index 847617a10c..f8f38a8a17 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala @@ -24,8 +24,13 @@ class RemoteActorRefProvider( val remoteSettings: RemoteSettings = new RemoteSettings(settings.config, systemName) - // this is lazy to be able to override it in subclass - lazy val deployer: RemoteDeployer = new RemoteDeployer(settings, dynamicAccess) + override val deployer: Deployer = createDeployer + + /** + * Factory method to make it possible to override deployer in subclass + * Creates a new instance every time + */ + protected def createDeployer: RemoteDeployer = new RemoteDeployer(settings, dynamicAccess) private val local = new LocalActorRefProvider(systemName, settings, eventStream, scheduler, dynamicAccess, deployer) diff --git a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialFrontend.java b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialFrontend.java index 63656a43ad..13af688739 100644 --- a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialFrontend.java +++ b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialFrontend.java @@ -14,6 +14,8 @@ import akka.cluster.routing.SystemLoadAverageMetricsSelector; //#frontend public class FactorialFrontend extends UntypedActor { + final int upToN; + final boolean repeat; LoggingAdapter log = Logging.getLogger(getContext().system(), this); @@ -21,21 +23,37 @@ public class FactorialFrontend extends UntypedActor { new Props(FactorialBackend.class).withRouter(FromConfig.getInstance()), "factorialBackendRouter"); + public FactorialFrontend(int upToN, boolean repeat) { + this.upToN = upToN; + this.repeat = repeat; + } + + @Override + public void preStart() { + sendJobs(); + } + @Override public void onReceive(Object message) { - if (message instanceof Integer) { - Integer n = (Integer) message; - backend.tell(n, getSelf()); - - } else if (message instanceof FactorialResult) { + if (message instanceof FactorialResult) { FactorialResult result = (FactorialResult) message; - log.info("{}! = {}", result.n, result.factorial); + if (result.n == upToN) { + log.debug("{}! = {}", result.n, result.factorial); + if (repeat) sendJobs(); + } } else { unhandled(message); } } + void sendJobs() { + log.info("Starting batch of factorials up to [{}]", upToN); + for (int n = 1; n <= upToN; n++) { + backend.tell(n, getSelf()); + } + } + } //#frontend diff --git a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialFrontendMain.java b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialFrontendMain.java index 31d0ff5f12..8d52bdf54a 100644 --- a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialFrontendMain.java +++ b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialFrontendMain.java @@ -1,38 +1,27 @@ package sample.cluster.factorial.japi; -import java.util.concurrent.TimeUnit; - -import sample.cluster.transformation.japi.TransformationMessages.TransformationJob; -import scala.concurrent.ExecutionContext; -import scala.concurrent.duration.Duration; import akka.actor.ActorRef; import akka.actor.ActorSystem; import akka.actor.Props; -import akka.dispatch.OnSuccess; -import akka.util.Timeout; -import static akka.pattern.Patterns.ask; +import akka.actor.UntypedActor; +import akka.actor.UntypedActorFactory; + public class FactorialFrontendMain { public static void main(String[] args) throws Exception { - int upToN = (args.length == 0 ? 200 : Integer.valueOf(args[0])); + final int upToN = (args.length == 0 ? 200 : Integer.valueOf(args[0])); ActorSystem system = ActorSystem.create("ClusterSystem"); - ActorRef frontend = system.actorOf(new Props( - FactorialFrontend.class), "factorialFrontend"); + // start the calculations when there is at least 2 other members + system.actorOf(new Props(new UntypedActorFactory() { + @Override + public UntypedActor create() { + return new StartupFrontend(upToN); + } + }), "startup"); - system.log().info("Starting up"); - // wait to let cluster converge and gather metrics - Thread.sleep(10000); - - system.log().info("Starting many factorials up to [{}]", upToN); - for (int i = 0; i < 1000; i++) { - for (int n = 1; n <= upToN; n++) { - frontend.tell(n, null); - } - } - } } diff --git a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/MetricsListener.java b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/MetricsListener.java index 8931c3bed2..3acbf3e4c0 100644 --- a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/MetricsListener.java +++ b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/MetricsListener.java @@ -36,15 +36,8 @@ public class MetricsListener extends UntypedActor { ClusterMetricsChanged clusterMetrics = (ClusterMetricsChanged) message; for (NodeMetrics nodeMetrics : clusterMetrics.getNodeMetrics()) { if (nodeMetrics.address().equals(cluster.selfAddress())) { - HeapMemory heap = StandardMetrics.extractHeapMemory(nodeMetrics); - if (heap != null) { - log.info("Used heap: {} MB", ((double) heap.used()) / 1024 / 1024); - } - Cpu cpu = StandardMetrics.extractCpu(nodeMetrics); - if (cpu != null && cpu.systemLoadAverage().isDefined()) { - log.info("Load: {} ({} processors)", cpu.systemLoadAverage().get(), - cpu.processors()); - } + logHeap(nodeMetrics); + logCpu(nodeMetrics); } } @@ -56,5 +49,20 @@ public class MetricsListener extends UntypedActor { } } + void logHeap(NodeMetrics nodeMetrics) { + HeapMemory heap = StandardMetrics.extractHeapMemory(nodeMetrics); + if (heap != null) { + log.info("Used heap: {} MB", ((double) heap.used()) / 1024 / 1024); + } + } + + void logCpu(NodeMetrics nodeMetrics) { + Cpu cpu = StandardMetrics.extractCpu(nodeMetrics); + if (cpu != null && cpu.systemLoadAverage().isDefined()) { + log.info("Load: {} ({} processors)", cpu.systemLoadAverage().get(), + cpu.processors()); + } + } + } //#metrics-listener \ No newline at end of file diff --git a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/StartupFrontend.java b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/StartupFrontend.java new file mode 100644 index 0000000000..54ca680988 --- /dev/null +++ b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/StartupFrontend.java @@ -0,0 +1,56 @@ +package sample.cluster.factorial.japi; + +import akka.actor.Props; +import akka.actor.UntypedActor; +import akka.actor.UntypedActorFactory; +import akka.cluster.Cluster; +import akka.cluster.ClusterEvent.CurrentClusterState; +import akka.cluster.ClusterEvent.MemberUp; +import akka.event.Logging; +import akka.event.LoggingAdapter; + +public class StartupFrontend extends UntypedActor { + final int upToN; + LoggingAdapter log = Logging.getLogger(getContext().system(), this); + int memberCount = 0; + + public StartupFrontend(int upToN) { + this.upToN = upToN; + } + + //subscribe to ClusterMetricsChanged + @Override + public void preStart() { + log.info("Factorials will start when 3 members in the cluster."); + Cluster.get(getContext().system()).subscribe(getSelf(), MemberUp.class); + } + + @Override + public void onReceive(Object message) { + if (message instanceof CurrentClusterState) { + CurrentClusterState state = (CurrentClusterState) message; + memberCount = state.members().size(); + runWhenReady(); + + } else if (message instanceof MemberUp) { + memberCount++; + runWhenReady(); + + } else { + unhandled(message); + } + + } + + void runWhenReady() { + if (memberCount >= 3) { + getContext().system().actorOf(new Props(new UntypedActorFactory() { + @Override + public UntypedActor create() { + return new FactorialFrontend(upToN, true); + } + }), "factorialFrontend"); + getContext().stop(getSelf()); + } + } +} diff --git a/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/factorial/FactorialSample.scala b/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/factorial/FactorialSample.scala index 6e55e03656..9e219a933a 100644 --- a/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/factorial/FactorialSample.scala +++ b/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/factorial/FactorialSample.scala @@ -13,34 +13,62 @@ import akka.routing.FromConfig //#imports +import akka.cluster.Cluster +import akka.cluster.ClusterEvent.CurrentClusterState +import akka.cluster.ClusterEvent.MemberUp + object FactorialFrontend { def main(args: Array[String]): Unit = { val upToN = if (args.isEmpty) 200 else args(0).toInt val system = ActorSystem("ClusterSystem") - val frontend = system.actorOf(Props[FactorialFrontend], name = "factorialFrontend") - system.log.info("Starting up") - // wait to let cluster converge and gather metrics - Thread.sleep(10000) + // start the calculations when there is at least 2 other members + system.actorOf(Props(new Actor with ActorLogging { + var memberCount = 0 + + log.info("Factorials will start when 3 members in the cluster.") + Cluster(context.system).subscribe(self, classOf[MemberUp]) + + def receive = { + case state: CurrentClusterState ⇒ + memberCount = state.members.size + runWhenReady() + case MemberUp(member) ⇒ + memberCount += 1 + runWhenReady() + } + + def runWhenReady(): Unit = if (memberCount >= 3) { + context.system.actorOf(Props(new FactorialFrontend(upToN, repeat = true)), + name = "factorialFrontend") + context stop self + } + + }), name = "startup") - system.log.info("Starting many factorials up to [{}]", upToN) - for (_ ← 1 to 1000; n ← 1 to upToN) { - frontend ! n - } } } //#frontend -class FactorialFrontend extends Actor with ActorLogging { +class FactorialFrontend(upToN: Int, repeat: Boolean) extends Actor with ActorLogging { val backend = context.actorOf(Props[FactorialBackend].withRouter(FromConfig), name = "factorialBackendRouter") + override def preStart(): Unit = sendJobs() + def receive = { - case n: Int ⇒ backend ! n case (n: Int, factorial: BigInt) ⇒ - log.info("{}! = {}", n, factorial) + if (n == upToN) { + log.debug("{}! = {}", n, factorial) + if (repeat) sendJobs() + } + } + + def sendJobs(): Unit = { + log.info("Starting batch of factorials up to [{}]", upToN) + 1 to upToN foreach { backend ! _ } } } //#frontend @@ -83,6 +111,7 @@ class FactorialBackend extends Actor with ActorLogging { import akka.cluster.Cluster import akka.cluster.ClusterEvent.ClusterMetricsChanged import akka.cluster.ClusterEvent.CurrentClusterState +import akka.cluster.NodeMetrics import akka.cluster.StandardMetrics.HeapMemory import akka.cluster.StandardMetrics.Cpu @@ -97,21 +126,25 @@ class MetricsListener extends Actor with ActorLogging { Cluster(context.system).unsubscribe(self) def receive = { - case ClusterMetricsChanged(nodeMetrics) ⇒ - nodeMetrics.filter(_.address == selfAddress) foreach { n ⇒ - n match { - case HeapMemory(address, timestamp, used, committed, max) ⇒ - log.info("Used heap: {} MB", used.doubleValue / 1024 / 1024) - case _ ⇒ // no heap info - } - n match { - case Cpu(address, timestamp, Some(systemLoadAverage), cpuCombined, processors) ⇒ - log.info("Load: {} ({} processors)", systemLoadAverage, processors) - case _ ⇒ // no cpu info - } + case ClusterMetricsChanged(clusterMetrics) ⇒ + clusterMetrics.filter(_.address == selfAddress) foreach { nodeMetrics ⇒ + logHeap(nodeMetrics) + logCpu(nodeMetrics) } case state: CurrentClusterState ⇒ // ignore } + + def logHeap(nodeMetrics: NodeMetrics): Unit = nodeMetrics match { + case HeapMemory(address, timestamp, used, committed, max) ⇒ + log.info("Used heap: {} MB", used.doubleValue / 1024 / 1024) + case _ ⇒ // no heap info + } + + def logCpu(nodeMetrics: NodeMetrics): Unit = nodeMetrics match { + case Cpu(address, timestamp, Some(systemLoadAverage), cpuCombined, processors) ⇒ + log.info("Load: {} ({} processors)", systemLoadAverage, processors) + case _ ⇒ // no cpu info + } } //#metrics-listener diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 570fe83a53..f68a224902 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -553,6 +553,7 @@ object AkkaBuild extends Build { case BinVer(bv) => bv case _ => s }), + "sigarVersion" -> Dependencies.Compile.sigar.revision, "github" -> "http://github.com/akka/akka/tree/%s".format((if (isSnapshot) "master" else "v" + v)) ) }, From 5d874fec176dce452ab8403c721d4a8eed5e0ad3 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Fri, 16 Nov 2012 12:34:21 +0100 Subject: [PATCH 131/210] Incorparate more review feedback, see #2547 * negative double check * correction of cluster specification * add isEmpty in WeightedRoutees --- .../scala/akka/cluster/ClusterMetricsCollector.scala | 10 ++++------ .../cluster/routing/AdaptiveLoadBalancingRouter.scala | 11 +++++++---- .../akka/cluster/MetricNumericConverterSpec.scala | 3 ++- akka-docs/rst/cluster/cluster-usage-java.rst | 2 +- akka-docs/rst/cluster/cluster-usage-scala.rst | 2 +- akka-docs/rst/cluster/cluster.rst | 9 ++++----- 6 files changed, 19 insertions(+), 18 deletions(-) diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala index 26fd48b494..a9f60b3675 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala @@ -343,8 +343,7 @@ object Metric extends MetricNumericConverter { /** * Creates a new Metric instance if the value is valid, otherwise None - * is returned. Invalid numeric values are negative Int/Long and NaN/Infinite - * Double values. + * is returned. Invalid numeric values are negative and NaN/Infinite. */ def create(name: String, value: Number, decayFactor: Option[Double]): Option[Metric] = if (defined(value)) Some(new Metric(name, value, ceateEWMA(value.doubleValue, decayFactor))) @@ -352,8 +351,7 @@ object Metric extends MetricNumericConverter { /** * Creates a new Metric instance if the Try is successful and the value is valid, - * otherwise None is returned. Invalid numeric values are negative Int/Long and - * NaN/Infinite Double values. + * otherwise None is returned. Invalid numeric values are negative and NaN/Infinite. */ def create(name: String, value: Try[Number], decayFactor: Option[Double]): Option[Metric] = value match { case Success(v) ⇒ create(name, v, decayFactor) @@ -530,13 +528,13 @@ object StandardMetrics { private[cluster] trait MetricNumericConverter { /** - * An undefined value is neither a -1 (negative) or NaN/Infinite: + * An defined value is neither negative nor NaN/Infinite: *
    • JMX system load average and max heap can be 'undefined' for certain OS, in which case a -1 is returned
    • *
    • SIGAR combined CPU can occasionally return a NaN or Infinite (known bug)
    */ def defined(value: Number): Boolean = convertNumber(value) match { case Left(a) ⇒ a >= 0 - case Right(b) ⇒ !(b.isNaN || b.isInfinite) + case Right(b) ⇒ !(b < 0.0 || b.isNaN || b.isInfinite) } /** diff --git a/akka-cluster/src/main/scala/akka/cluster/routing/AdaptiveLoadBalancingRouter.scala b/akka-cluster/src/main/scala/akka/cluster/routing/AdaptiveLoadBalancingRouter.scala index 430aeaeeaf..60a9c5b6a7 100644 --- a/akka-cluster/src/main/scala/akka/cluster/routing/AdaptiveLoadBalancingRouter.scala +++ b/akka-cluster/src/main/scala/akka/cluster/routing/AdaptiveLoadBalancingRouter.scala @@ -190,7 +190,7 @@ trait AdaptiveLoadBalancingRouterLike { this: RouterConfig ⇒ def getNext(): ActorRef = weightedRoutees match { case Some(weighted) ⇒ - if (weighted.total == 0) routeeProvider.context.system.deadLetters + if (weighted.isEmpty) routeeProvider.context.system.deadLetters else weighted(ThreadLocalRandom.current.nextInt(weighted.total) + 1) case None ⇒ val currentRoutees = routeeProvider.routees @@ -403,9 +403,12 @@ private[cluster] class WeightedRoutees(refs: immutable.IndexedSeq[ActorRef], sel buckets } - def total: Int = - if (buckets.length == 0) 0 - else buckets(buckets.length - 1) + def isEmpty: Boolean = buckets.length == 0 + + def total: Int = { + require(!isEmpty, "WeightedRoutees must not be used when empty") + buckets(buckets.length - 1) + } /** * Pick the routee matching a value, from 1 to total. diff --git a/akka-cluster/src/test/scala/akka/cluster/MetricNumericConverterSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricNumericConverterSpec.scala index 1b7e30eae1..58e157d12e 100644 --- a/akka-cluster/src/test/scala/akka/cluster/MetricNumericConverterSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/MetricNumericConverterSpec.scala @@ -15,7 +15,7 @@ class MetricNumericConverterSpec extends AkkaSpec(MetricsEnabledSpec.config) wit "MetricNumericConverter" must { val collector = createMetricsCollector - "convert " in { + "convert" in { convertNumber(0).isLeft must be(true) convertNumber(1).left.get must be(1) convertNumber(1L).isLeft must be(true) @@ -43,6 +43,7 @@ class MetricNumericConverterSpec extends AkkaSpec(MetricsEnabledSpec.config) wit "recognize whether a metric value is not defined" in { defined(-1) must be(false) + defined(-1.0) must be(false) defined(Double.NaN) must be(false) } } diff --git a/akka-docs/rst/cluster/cluster-usage-java.rst b/akka-docs/rst/cluster/cluster-usage-java.rst index 9059bfd13d..1df441ef18 100644 --- a/akka-docs/rst/cluster/cluster-usage-java.rst +++ b/akka-docs/rst/cluster/cluster-usage-java.rst @@ -463,7 +463,7 @@ Adaptive Load Balancing ----------------------- The ``AdaptiveLoadBalancingRouter`` performs load balancing of messages to cluster nodes based on the cluster metrics data. -It uses random selection of routees with probabilities derived from the remaining capacity of corresponding node. +It uses random selection of routees with probabilities derived from the remaining capacity of the corresponding node. It can be configured to use a specific MetricsSelector to produce the probabilities, a.k.a. weights: * ``heap`` / ``HeapMetricsSelector`` - Used and max JVM heap memory. Weights based on remaining heap capacity; (max - used) / max diff --git a/akka-docs/rst/cluster/cluster-usage-scala.rst b/akka-docs/rst/cluster/cluster-usage-scala.rst index eacbefc9d6..810b5ed9e8 100644 --- a/akka-docs/rst/cluster/cluster-usage-scala.rst +++ b/akka-docs/rst/cluster/cluster-usage-scala.rst @@ -419,7 +419,7 @@ Adaptive Load Balancing ----------------------- The ``AdaptiveLoadBalancingRouter`` performs load balancing of messages to cluster nodes based on the cluster metrics data. -It uses random selection of routees with probabilities derived from the remaining capacity of corresponding node. +It uses random selection of routees with probabilities derived from the remaining capacity of the corresponding node. It can be configured to use a specific MetricsSelector to produce the probabilities, a.k.a. weights: * ``heap`` / ``HeapMetricsSelector`` - Used and max JVM heap memory. Weights based on remaining heap capacity; (max - used) / max diff --git a/akka-docs/rst/cluster/cluster.rst b/akka-docs/rst/cluster/cluster.rst index 1190da953a..dfcb4f0a42 100644 --- a/akka-docs/rst/cluster/cluster.rst +++ b/akka-docs/rst/cluster/cluster.rst @@ -84,9 +84,9 @@ Gossip The cluster membership used in Akka is based on Amazon's `Dynamo`_ system and particularly the approach taken in Basho's' `Riak`_ distributed database. Cluster membership is communicated using a `Gossip Protocol`_, where the current -state of the cluster is gossiped randomly through the cluster. Joining a cluster -is initiated by issuing a ``Join`` command to one of the nodes in the cluster to -join. +state of the cluster is gossiped randomly through the cluster, with preference to +members that have not seen the latest version. Joining a cluster is initiated +by issuing a ``Join`` command to one of the nodes in the cluster to join. .. _Gossip Protocol: http://en.wikipedia.org/wiki/Gossip_protocol .. _Dynamo: http://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf @@ -209,8 +209,7 @@ node to initiate a round of gossip with. The choice of node is random but can also include extra gossiping nodes with either newer or older state versions. The gossip overview contains the current state version for all nodes and also a -list of unreachable nodes. Whenever a node receives a gossip overview it updates -the `Failure Detector`_ with the liveness information. +list of unreachable nodes. The nodes defined as ``seed`` nodes are just regular member nodes whose only "special role" is to function as contact points in the cluster. From 39d81b37dfc11a70767e244decc7d0282bd359d5 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Fri, 16 Nov 2012 13:35:10 +0100 Subject: [PATCH 132/210] Fix failing WeightedRouteesSpec, see #2547 --- .../scala/akka/cluster/routing/WeightedRouteesSpec.scala | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/akka-cluster/src/test/scala/akka/cluster/routing/WeightedRouteesSpec.scala b/akka-cluster/src/test/scala/akka/cluster/routing/WeightedRouteesSpec.scala index f8fb48417b..f34b81c5ec 100644 --- a/akka-cluster/src/test/scala/akka/cluster/routing/WeightedRouteesSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/routing/WeightedRouteesSpec.scala @@ -40,7 +40,10 @@ class WeightedRouteesSpec extends AkkaSpec(ConfigFactory.parseString(""" "check boundaries" in { val empty = new WeightedRoutees(Vector(), a1, Map.empty) - empty.total must be(0) + empty.isEmpty must be(true) + intercept[IllegalArgumentException] { + empty.total + } val weighted = new WeightedRoutees(Vector(refA, refB, refC), a1, Map.empty) weighted.total must be(3) intercept[IllegalArgumentException] { From c57f84fd28b2f4471a09c03c8aed11f26baee593 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Fri, 16 Nov 2012 13:42:34 +0100 Subject: [PATCH 133/210] Add Typesafe repo in cluster sample, for sigar, see #2547 --- project/AkkaBuild.scala | 2 ++ 1 file changed, 2 insertions(+) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index f68a224902..fc872bbaee 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -325,6 +325,8 @@ object AkkaBuild extends Build { base = file("akka-samples/akka-sample-cluster"), dependencies = Seq(cluster, remoteTests % "test", testkit % "test"), settings = sampleSettings ++ multiJvmSettings ++ experimentalSettings ++ Seq( + // sigar is in Typesafe repo + resolvers += "Typesafe Repo" at "http://repo.typesafe.com/typesafe/releases/", libraryDependencies ++= Dependencies.clusterSample, javaOptions in run ++= Seq( "-Djava.library.path=./sigar", From 4c440c91af4b562b3e624b315acd0a89fbc5f066 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Fri, 16 Nov 2012 14:09:26 +0100 Subject: [PATCH 134/210] Silencing unhandled message in IOActor --- .../src/test/scala/akka/actor/IOActor.scala | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/actor/IOActor.scala b/akka-actor-tests/src/test/scala/akka/actor/IOActor.scala index 441f1515be..5cd9075e38 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/IOActor.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/IOActor.scala @@ -14,7 +14,7 @@ import akka.dispatch.MessageDispatcher import akka.pattern.ask import java.net.{ Socket, InetSocketAddress, InetAddress, SocketAddress } import scala.util.Failure -import annotation.tailrec +import scala.annotation.tailrec object IOActorSpec { @@ -55,6 +55,8 @@ object IOActorSpec { def receive = { + case _: IO.Connected ⇒ //don't care + case bytes: ByteString ⇒ val source = sender socket write bytes @@ -65,9 +67,9 @@ object IOActorSpec { case IO.Closed(`socket`, cause) ⇒ state(cause) - throw cause match { - case IO.Error(e) ⇒ e - case _ ⇒ new RuntimeException("Socket closed") + cause match { + case IO.Error(e) ⇒ throw e + case _ ⇒ throw new RuntimeException("Socket closed") } } @@ -154,6 +156,8 @@ object IOActorSpec { case IO.Read(socket, bytes) ⇒ state(socket)(IO Chunk bytes) + case _: IO.Connected ⇒ //don't care + case IO.Closed(socket, cause) ⇒ state -= socket @@ -181,6 +185,8 @@ object IOActorSpec { readResult map (source !) } + case _: IO.Connected ⇒ //don't care + case IO.Read(`socket`, bytes) ⇒ state(IO Chunk bytes) @@ -276,7 +282,7 @@ class IOActorSpec extends AkkaSpec with DefaultTimeout { } "an IO Actor" must { - implicit val ec = system.dispatcher + import system.dispatcher "run echo server" in { filterException[java.net.ConnectException] { val addressPromise = Promise[SocketAddress]() From cc6e94021cd02211de6b34341cd190490cc3bf5c Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Fri, 16 Nov 2012 14:10:39 +0100 Subject: [PATCH 135/210] Fixing SupervisorHierarchySpec after discovered bug in patmat --- .../scala/akka/actor/SupervisorHierarchySpec.scala | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/actor/SupervisorHierarchySpec.scala b/akka-actor-tests/src/test/scala/akka/actor/SupervisorHierarchySpec.scala index a34d220cc5..eb30bb182b 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/SupervisorHierarchySpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/SupervisorHierarchySpec.scala @@ -194,7 +194,7 @@ object SupervisorHierarchySpec { case x ⇒ (x, x) } override val supervisorStrategy = OneForOneStrategy()(unwrap andThen { - case _: Failure if pongsToGo > 0 ⇒ + case (_: Failure, _) if pongsToGo > 0 ⇒ log :+= Event("pongOfDeath resuming " + sender, identityHashCode(this)) Resume case (f: Failure, orig) ⇒ @@ -391,10 +391,10 @@ object SupervisorHierarchySpec { // don’t escalate from this one! override val supervisorStrategy = OneForOneStrategy() { - case f: Failure ⇒ f.directive - case OriginalRestartException(f: Failure) ⇒ f.directive - case ActorInitializationException(f: Failure) ⇒ f.directive - case _ ⇒ Stop + case f: Failure ⇒ f.directive + case OriginalRestartException(f: Failure) ⇒ f.directive + case ActorInitializationException(_, _, f: Failure) ⇒ f.directive + case _ ⇒ Stop } var children = Vector.empty[ActorRef] From 37643ca84eae82a1aef8e70a7c59b5711316d1a9 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Fri, 16 Nov 2012 14:11:02 +0100 Subject: [PATCH 136/210] Adding ConfigSpec test for unstarted-push-timeout --- akka-actor-tests/src/test/scala/akka/config/ConfigSpec.scala | 3 +++ 1 file changed, 3 insertions(+) diff --git a/akka-actor-tests/src/test/scala/akka/config/ConfigSpec.scala b/akka-actor-tests/src/test/scala/akka/config/ConfigSpec.scala index 1aa168b924..9a43631894 100644 --- a/akka-actor-tests/src/test/scala/akka/config/ConfigSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/config/ConfigSpec.scala @@ -45,6 +45,9 @@ class ConfigSpec extends AkkaSpec(ConfigFactory.defaultReference(ActorSystem.fin getInt("akka.actor.deployment.default.virtual-nodes-factor") must be(10) settings.DefaultVirtualNodesFactor must be(10) + + getMilliseconds("akka.actor.unstarted-push-timeout") must be(10.seconds.toMillis) + settings.UnstartedPushTimeout.duration must be(10.seconds) } { From 6a8bed784bd737c2b1c186bc47594f6e2e805f8d Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Fri, 16 Nov 2012 14:12:32 +0100 Subject: [PATCH 137/210] Making RoutingSpec a bit more elaborate, to put pressure on the implementation --- .../test/scala/akka/routing/RoutingSpec.scala | 48 +++++++++++-------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala b/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala index 94a650e8c7..6dcb564190 100644 --- a/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala @@ -5,7 +5,6 @@ package akka.routing import language.postfixOps -import java.util.concurrent.atomic.AtomicInteger import akka.actor._ import scala.collection.immutable import akka.testkit._ @@ -18,6 +17,8 @@ import java.util.concurrent.ConcurrentHashMap import com.typesafe.config.Config import akka.dispatch.Dispatchers import akka.util.Collections.EmptyImmutableSeq +import akka.util.Timeout +import java.util.concurrent.atomic.AtomicInteger object RoutingSpec { @@ -100,33 +101,36 @@ class RoutingSpec extends AkkaSpec(RoutingSpec.config) with DefaultTimeout with } "be able to send their routees" in { - class TheActor extends Actor { - val routee1 = context.actorOf(Props[TestActor], "routee1") - val routee2 = context.actorOf(Props[TestActor], "routee2") - val routee3 = context.actorOf(Props[TestActor], "routee3") - val router = context.actorOf(Props[TestActor].withRouter( - ScatterGatherFirstCompletedRouter( - routees = List(routee1, routee2, routee3), - within = 5 seconds))) + val actor = system.actorOf(Props(new Actor { def receive = { - case "doIt" ⇒ router ! CurrentRoutees - case routees: RouterRoutees ⇒ testActor forward routees + case (id: String, names: immutable.Iterable[_], actors: Int) ⇒ + val routerProps = Props[TestActor].withRouter( + ScatterGatherFirstCompletedRouter( + routees = names collect { case name: String ⇒ context.actorOf(Props(new TestActor), name) }, + within = 5 seconds)) + + 1 to actors foreach { i ⇒ context.actorOf(routerProps, id + i).tell(CurrentRoutees, testActor) } } - } + })) - val theActor = system.actorOf(Props(new TheActor), "theActor") - theActor ! "doIt" - val routees = expectMsgPF() { - case RouterRoutees(routees) ⇒ routees.toSet - } + val actors = 15 + val names = 1 to 20 map { "routee" + _ } toList - routees.map(_.path.name) must be(Set("routee1", "routee2", "routee3")) + actor ! (("test", names, actors)) + + 1 to actors foreach { _ ⇒ + val routees = expectMsgType[RouterRoutees].routees + routees.map(_.path.name) must be === names + } + expectNoMsg(500.millis) + actor ! PoisonPill } "use configured nr-of-instances when FromConfig" in { val router = system.actorOf(Props[TestActor].withRouter(FromConfig), "router1") - Await.result(router ? CurrentRoutees, remaining).asInstanceOf[RouterRoutees].routees.size must be(3) + router ! CurrentRoutees + expectMsgType[RouterRoutees].routees.size must be(3) watch(router) system.stop(router) expectMsgType[Terminated] @@ -134,7 +138,8 @@ class RoutingSpec extends AkkaSpec(RoutingSpec.config) with DefaultTimeout with "use configured nr-of-instances when router is specified" in { val router = system.actorOf(Props[TestActor].withRouter(RoundRobinRouter(nrOfInstances = 2)), "router2") - Await.result(router ? CurrentRoutees, remaining).asInstanceOf[RouterRoutees].routees.size must be(3) + router ! CurrentRoutees + expectMsgType[RouterRoutees].routees.size must be(3) system.stop(router) } @@ -149,7 +154,8 @@ class RoutingSpec extends AkkaSpec(RoutingSpec.config) with DefaultTimeout with } val router = system.actorOf(Props[TestActor].withRouter(RoundRobinRouter(resizer = Some(resizer))), "router3") Await.ready(latch, remaining) - Await.result(router ? CurrentRoutees, remaining).asInstanceOf[RouterRoutees].routees.size must be(3) + router ! CurrentRoutees + expectMsgType[RouterRoutees].routees.size must be(3) system.stop(router) } From 8067ffda3d35f0f35f00a32212dc6d161e2d5eaa Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Fri, 16 Nov 2012 14:18:44 +0100 Subject: [PATCH 138/210] Clarifying docs in ActorCell --- akka-actor/src/main/scala/akka/actor/ActorCell.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorCell.scala b/akka-actor/src/main/scala/akka/actor/ActorCell.scala index 75dbd3fefa..9cf2b5b3df 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorCell.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorCell.scala @@ -259,12 +259,12 @@ private[akka] trait Cell { */ def isLocal: Boolean /** - * If the actor isLocal, returns whether messages are currently queued, + * If the actor isLocal, returns whether "user messages" are currently queued, * “false” otherwise. */ def hasMessages: Boolean /** - * If the actor isLocal, returns the number of messages currently queued, + * If the actor isLocal, returns the number of "user messages" currently queued, * which may be a costly operation, 0 otherwise. */ def numberOfMessages: Int From ae11fe4b538e3f296b9ac7c3d3e17973e5fc9ed2 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Fri, 16 Nov 2012 14:20:10 +0100 Subject: [PATCH 139/210] Adding return type on foreachChild --- akka-actor/src/main/scala/akka/actor/ActorRef.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorRef.scala b/akka-actor/src/main/scala/akka/actor/ActorRef.scala index 00b06dc594..50df88c171 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRef.scala @@ -530,7 +530,7 @@ private[akka] class VirtualPathContainer( def hasChildren: Boolean = !children.isEmpty - def foreachChild(f: ActorRef ⇒ Unit) = { + def foreachChild(f: ActorRef ⇒ Unit): Unit = { val iter = children.values.iterator while (iter.hasNext) f(iter.next) } From 36bfdaddcc36ba73953283ce8573b6e1ec76767c Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Thu, 15 Nov 2012 10:42:14 +0100 Subject: [PATCH 140/210] Rewriting PriorityDispatcherSpec not to rely on suspension --- .../dispatch/PriorityDispatcherSpec.scala | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/dispatch/PriorityDispatcherSpec.scala b/akka-actor-tests/src/test/scala/akka/dispatch/PriorityDispatcherSpec.scala index 1e71627e69..4dad37c1be 100644 --- a/akka-actor-tests/src/test/scala/akka/dispatch/PriorityDispatcherSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/dispatch/PriorityDispatcherSpec.scala @@ -6,10 +6,9 @@ import org.junit.runner.RunWith import org.scalatest.junit.JUnitRunner import com.typesafe.config.Config -import akka.actor.{ Props, InternalActorRef, ActorSystem, Actor } +import akka.actor.{ Props, ActorSystem, Actor } import akka.pattern.ask import akka.testkit.{ DefaultTimeout, AkkaSpec } -import scala.concurrent.Await import scala.concurrent.duration._ object PriorityDispatcherSpec { @@ -50,24 +49,23 @@ class PriorityDispatcherSpec extends AkkaSpec(PriorityDispatcherSpec.config) wit } def testOrdering(dispatcherKey: String) { + val msgs = (1 to 100) toList val actor = system.actorOf(Props(new Actor { - var acc: List[Int] = Nil + + val acc = scala.collection.mutable.ListBuffer[Int]() + + scala.util.Random.shuffle(msgs) foreach { m ⇒ self ! m } + + self.tell('Result, testActor) def receive = { - case i: Int ⇒ acc = i :: acc - case 'Result ⇒ sender ! acc + case i: Int ⇒ acc += i + case 'Result ⇒ sender ! acc.toList } - }).withDispatcher(dispatcherKey)).asInstanceOf[InternalActorRef] + }).withDispatcher(dispatcherKey)) - actor.suspend //Make sure the actor isn't treating any messages, let it buffer the incoming messages - - val msgs = (1 to 100).toList - for (m ← msgs) actor ! m - - actor.resume(causedByFailure = null) //Signal the actor to start treating it's message backlog - - Await.result(actor.?('Result).mapTo[List[Int]], timeout.duration) must be === msgs.reverse + expectMsgType[List[_]] must be === msgs } } From da78a7c1678d280070c1fb57abd92017fdc491a0 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Wed, 14 Nov 2012 17:15:58 +0100 Subject: [PATCH 141/210] #2694 - Fixing DataflowDocSpec examples --- .../src/main/scala/akka/dataflow/package.scala | 6 +++--- .../scala/code/docs/dataflow/DataflowDocSpec.scala | 13 ++++++++----- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/akka-dataflow/src/main/scala/akka/dataflow/package.scala b/akka-dataflow/src/main/scala/akka/dataflow/package.scala index 9f4e6a0da2..31248958d1 100644 --- a/akka-dataflow/src/main/scala/akka/dataflow/package.scala +++ b/akka-dataflow/src/main/scala/akka/dataflow/package.scala @@ -46,7 +46,7 @@ package object dataflow { implicit class DataflowPromise[T](val promise: Promise[T]) extends AnyVal { /** - * Completes the Promise with the speicifed value or throws an exception if already + * Completes the Promise with the specified value or throws an exception if already * completed. See Promise.success(value) for semantics. * * @param value The value which denotes the successful value of the Promise @@ -59,7 +59,7 @@ package object dataflow { /** * Completes this Promise with the value of the specified Future when/if it completes. * - * @param other The Future whose value will be transfered to this Promise upon completion + * @param other The Future whose value will be transferred to this Promise upon completion * @param ec An ExecutionContext which will be used to execute callbacks registered in this method * @return A Future representing the result of this operation */ @@ -75,7 +75,7 @@ package object dataflow { /** * Completes this Promise with the value of the specified Promise when/if it completes. * - * @param other The Promise whose value will be transfered to this Promise upon completion + * @param other The Promise whose value will be transferred to this Promise upon completion * @param ec An ExecutionContext which will be used to execute callbacks registered in this method * @return A Future representing the result of this operation */ diff --git a/akka-docs/rst/scala/code/docs/dataflow/DataflowDocSpec.scala b/akka-docs/rst/scala/code/docs/dataflow/DataflowDocSpec.scala index a32ee6fcae..345d23b4ac 100644 --- a/akka-docs/rst/scala/code/docs/dataflow/DataflowDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/dataflow/DataflowDocSpec.scala @@ -44,21 +44,23 @@ class DataflowDocSpec extends WordSpec with MustMatchers { } "demonstrate the use of dataflow variables" in { - def println[T](any: Try[T]): Unit = any.get must be === 20 + val result = Promise[Int]() + def println(any: Try[Int]): Unit = result.complete(any) //#dataflow-variable-a + val v1, v2 = Promise[Int]() flow { - val v1, v2 = Promise[Int]() - // v1 will become the value of v2 + 10 when v2 gets a value v1 << v2() + 10 - v2 << flow { 5 } // As you can see, no blocking! v1() + v2() } onComplete println + flow { v2 << 5 } // As you can see, no blocking above! //#dataflow-variable-a + Await.result(result.future, 10.seconds) must be === 20 } "demonstrate the difference between for and flow" in { - def println[T](any: Try[T]): Unit = any.get must be === 2 + val result = Promise[Int]() + def println(any: Try[Int]): Unit = result.tryComplete(any) //#for-vs-flow val f1, f2 = Future { 1 } @@ -68,6 +70,7 @@ class DataflowDocSpec extends WordSpec with MustMatchers { usingFor onComplete println usingFlow onComplete println //#for-vs-flow + Await.result(result.future, 10.seconds) must be === 2 } } From 9205c1eef7c9ae79787d8731814b47753e10995c Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Thu, 15 Nov 2012 15:47:55 +0100 Subject: [PATCH 142/210] #2710 - requiring sender and recipient of DeadLetters to be non-null --- akka-actor/src/main/scala/akka/actor/ActorRef.scala | 12 +++++++++--- .../main/scala/akka/actor/RepointableActorRef.scala | 7 ++++--- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorRef.scala b/akka-actor/src/main/scala/akka/actor/ActorRef.scala index 00b06dc594..6bf3b3bf7c 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRef.scala @@ -419,7 +419,10 @@ private[akka] trait MinimalActorRef extends InternalActorRef with LocalRef { * to the ActorSystem's EventStream */ @SerialVersionUID(1L) -case class DeadLetter(message: Any, sender: ActorRef, recipient: ActorRef) +case class DeadLetter(message: Any, sender: ActorRef, recipient: ActorRef) { + require(sender ne null, "DeadLetter sender may not be null") + require(recipient ne null, "DeadLetter recipient may not be null") +} private[akka] object DeadLetterActorRef { @SerialVersionUID(1L) @@ -446,8 +449,11 @@ private[akka] class EmptyLocalActorRef(override val provider: ActorRefProvider, override def sendSystemMessage(message: SystemMessage): Unit = specialHandle(message) override def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit = message match { - case d: DeadLetter ⇒ specialHandle(d.message) // do NOT form endless loops, since deadLetters will resend! - case _ ⇒ if (!specialHandle(message)) eventStream.publish(DeadLetter(message, sender, this)) + case d: DeadLetter ⇒ + specialHandle(d.message) // do NOT form endless loops, since deadLetters will resend! + case _ if !specialHandle(message) ⇒ + eventStream.publish(DeadLetter(message, if (sender eq Actor.noSender) provider.deadLetters else sender, this)) + case _ ⇒ } protected def specialHandle(msg: Any): Boolean = msg match { diff --git a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala index b644ba6445..8ecb1cbb72 100644 --- a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala @@ -189,15 +189,16 @@ private[akka] class UnstartedCell(val systemImpl: ActorSystemImpl, val self: Rep def childrenRefs: ChildrenContainer = ChildrenContainer.EmptyChildrenContainer def getChildByName(name: String): Option[ChildRestartStats] = None def tell(message: Any, sender: ActorRef): Unit = { + val useSender = if (sender eq Actor.noSender) system.deadLetters else sender if (lock.tryLock(timeout, TimeUnit.MILLISECONDS)) { try { - if (self.underlying eq this) queue enqueue Envelope(message, sender, system) - else self.underlying.tell(message, sender) + if (self.underlying eq this) queue enqueue Envelope(message, useSender, system) + else self.underlying.tell(message, useSender) } finally { lock.unlock() } } else { - system.deadLetters ! DeadLetter(message, sender, self) + system.deadLetters ! DeadLetter(message, useSender, self) } } def sendSystemMessage(msg: SystemMessage): Unit = { From 8194ddd13c4992ed732773c971aafa0b2b9d5df8 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Thu, 15 Nov 2012 02:31:40 +0100 Subject: [PATCH 143/210] #2703 - unprivatizing NoLogging and adding a Java API for obtaining the reference --- .../test/java/akka/japi/JavaAPITestBase.java | 8 +++++ .../src/main/scala/akka/event/Logging.scala | 30 ++++++++++++------- .../code/docs/event/LoggingDocTestBase.java | 1 - 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/akka-actor-tests/src/test/java/akka/japi/JavaAPITestBase.java b/akka-actor-tests/src/test/java/akka/japi/JavaAPITestBase.java index c0361530da..b3a092b1f9 100644 --- a/akka-actor-tests/src/test/java/akka/japi/JavaAPITestBase.java +++ b/akka-actor-tests/src/test/java/akka/japi/JavaAPITestBase.java @@ -1,5 +1,7 @@ package akka.japi; +import akka.event.LoggingAdapter; +import akka.event.NoLogging; import org.junit.Test; import static org.junit.Assert.*; @@ -46,4 +48,10 @@ public class JavaAPITestBase { public void shouldBeSingleton() { assertSame(Option.none(), Option.none()); } + + @Test + public void mustBeAbleToGetNoLogging() { + LoggingAdapter a = NoLogging.getInstance(); + assertNotNull(a); + } } diff --git a/akka-actor/src/main/scala/akka/event/Logging.scala b/akka-actor/src/main/scala/akka/event/Logging.scala index dbd561514d..14ba99bcaa 100644 --- a/akka-actor/src/main/scala/akka/event/Logging.scala +++ b/akka-actor/src/main/scala/akka/event/Logging.scala @@ -878,15 +878,25 @@ class BusLogging(val bus: LoggingBus, val logSource: String, val logClass: Class protected def notifyDebug(message: String): Unit = bus.publish(Debug(logSource, logClass, message)) } -private[akka] object NoLogging extends LoggingAdapter { - def isErrorEnabled = false - def isWarningEnabled = false - def isInfoEnabled = false - def isDebugEnabled = false +/** + * NoLogging is a LoggingAdapter that does absolutely nothing – no logging at all. + */ +object NoLogging extends LoggingAdapter { - protected def notifyError(message: String): Unit = () - protected def notifyError(cause: Throwable, message: String): Unit = () - protected def notifyWarning(message: String): Unit = () - protected def notifyInfo(message: String): Unit = () - protected def notifyDebug(message: String): Unit = () + /** + * Java API to return the reference to NoLogging + * @return The NoLogging instance + */ + def getInstance = this + + final override def isErrorEnabled = false + final override def isWarningEnabled = false + final override def isInfoEnabled = false + final override def isDebugEnabled = false + + final protected override def notifyError(message: String): Unit = () + final protected override def notifyError(cause: Throwable, message: String): Unit = () + final protected override def notifyWarning(message: String): Unit = () + final protected override def notifyInfo(message: String): Unit = () + final protected override def notifyDebug(message: String): Unit = () } diff --git a/akka-docs/rst/java/code/docs/event/LoggingDocTestBase.java b/akka-docs/rst/java/code/docs/event/LoggingDocTestBase.java index 54847c4f66..3e3fa46844 100644 --- a/akka-docs/rst/java/code/docs/event/LoggingDocTestBase.java +++ b/akka-docs/rst/java/code/docs/event/LoggingDocTestBase.java @@ -119,5 +119,4 @@ public class LoggingDocTestBase { } } //#deadletter-actor - } From 0e37586d17d48d612f2782ac46b5c2208f6bff70 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Fri, 16 Nov 2012 14:09:26 +0100 Subject: [PATCH 144/210] Silencing unhandled message in IOActor --- .../src/test/scala/akka/actor/IOActor.scala | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/actor/IOActor.scala b/akka-actor-tests/src/test/scala/akka/actor/IOActor.scala index 441f1515be..5cd9075e38 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/IOActor.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/IOActor.scala @@ -14,7 +14,7 @@ import akka.dispatch.MessageDispatcher import akka.pattern.ask import java.net.{ Socket, InetSocketAddress, InetAddress, SocketAddress } import scala.util.Failure -import annotation.tailrec +import scala.annotation.tailrec object IOActorSpec { @@ -55,6 +55,8 @@ object IOActorSpec { def receive = { + case _: IO.Connected ⇒ //don't care + case bytes: ByteString ⇒ val source = sender socket write bytes @@ -65,9 +67,9 @@ object IOActorSpec { case IO.Closed(`socket`, cause) ⇒ state(cause) - throw cause match { - case IO.Error(e) ⇒ e - case _ ⇒ new RuntimeException("Socket closed") + cause match { + case IO.Error(e) ⇒ throw e + case _ ⇒ throw new RuntimeException("Socket closed") } } @@ -154,6 +156,8 @@ object IOActorSpec { case IO.Read(socket, bytes) ⇒ state(socket)(IO Chunk bytes) + case _: IO.Connected ⇒ //don't care + case IO.Closed(socket, cause) ⇒ state -= socket @@ -181,6 +185,8 @@ object IOActorSpec { readResult map (source !) } + case _: IO.Connected ⇒ //don't care + case IO.Read(`socket`, bytes) ⇒ state(IO Chunk bytes) @@ -276,7 +282,7 @@ class IOActorSpec extends AkkaSpec with DefaultTimeout { } "an IO Actor" must { - implicit val ec = system.dispatcher + import system.dispatcher "run echo server" in { filterException[java.net.ConnectException] { val addressPromise = Promise[SocketAddress]() From 75ccbef0f75948017ca6dcb1c3b8e45d1e3262bc Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Fri, 16 Nov 2012 14:10:39 +0100 Subject: [PATCH 145/210] Fixing SupervisorHierarchySpec after discovered bug in patmat --- .../scala/akka/actor/SupervisorHierarchySpec.scala | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/actor/SupervisorHierarchySpec.scala b/akka-actor-tests/src/test/scala/akka/actor/SupervisorHierarchySpec.scala index a34d220cc5..eb30bb182b 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/SupervisorHierarchySpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/SupervisorHierarchySpec.scala @@ -194,7 +194,7 @@ object SupervisorHierarchySpec { case x ⇒ (x, x) } override val supervisorStrategy = OneForOneStrategy()(unwrap andThen { - case _: Failure if pongsToGo > 0 ⇒ + case (_: Failure, _) if pongsToGo > 0 ⇒ log :+= Event("pongOfDeath resuming " + sender, identityHashCode(this)) Resume case (f: Failure, orig) ⇒ @@ -391,10 +391,10 @@ object SupervisorHierarchySpec { // don’t escalate from this one! override val supervisorStrategy = OneForOneStrategy() { - case f: Failure ⇒ f.directive - case OriginalRestartException(f: Failure) ⇒ f.directive - case ActorInitializationException(f: Failure) ⇒ f.directive - case _ ⇒ Stop + case f: Failure ⇒ f.directive + case OriginalRestartException(f: Failure) ⇒ f.directive + case ActorInitializationException(_, _, f: Failure) ⇒ f.directive + case _ ⇒ Stop } var children = Vector.empty[ActorRef] From a3f9e12d9f0a3f875601b195227328471d8d9f9c Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Fri, 16 Nov 2012 14:11:02 +0100 Subject: [PATCH 146/210] Adding ConfigSpec test for unstarted-push-timeout --- akka-actor-tests/src/test/scala/akka/config/ConfigSpec.scala | 3 +++ 1 file changed, 3 insertions(+) diff --git a/akka-actor-tests/src/test/scala/akka/config/ConfigSpec.scala b/akka-actor-tests/src/test/scala/akka/config/ConfigSpec.scala index 1aa168b924..9a43631894 100644 --- a/akka-actor-tests/src/test/scala/akka/config/ConfigSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/config/ConfigSpec.scala @@ -45,6 +45,9 @@ class ConfigSpec extends AkkaSpec(ConfigFactory.defaultReference(ActorSystem.fin getInt("akka.actor.deployment.default.virtual-nodes-factor") must be(10) settings.DefaultVirtualNodesFactor must be(10) + + getMilliseconds("akka.actor.unstarted-push-timeout") must be(10.seconds.toMillis) + settings.UnstartedPushTimeout.duration must be(10.seconds) } { From 672c5971fc7e64c95c60e58edb25c0f060f4d1f3 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Fri, 16 Nov 2012 14:12:32 +0100 Subject: [PATCH 147/210] Making RoutingSpec a bit more elaborate, to put pressure on the implementation --- .../test/scala/akka/routing/RoutingSpec.scala | 48 +++++++++++-------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala b/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala index 94a650e8c7..6dcb564190 100644 --- a/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala @@ -5,7 +5,6 @@ package akka.routing import language.postfixOps -import java.util.concurrent.atomic.AtomicInteger import akka.actor._ import scala.collection.immutable import akka.testkit._ @@ -18,6 +17,8 @@ import java.util.concurrent.ConcurrentHashMap import com.typesafe.config.Config import akka.dispatch.Dispatchers import akka.util.Collections.EmptyImmutableSeq +import akka.util.Timeout +import java.util.concurrent.atomic.AtomicInteger object RoutingSpec { @@ -100,33 +101,36 @@ class RoutingSpec extends AkkaSpec(RoutingSpec.config) with DefaultTimeout with } "be able to send their routees" in { - class TheActor extends Actor { - val routee1 = context.actorOf(Props[TestActor], "routee1") - val routee2 = context.actorOf(Props[TestActor], "routee2") - val routee3 = context.actorOf(Props[TestActor], "routee3") - val router = context.actorOf(Props[TestActor].withRouter( - ScatterGatherFirstCompletedRouter( - routees = List(routee1, routee2, routee3), - within = 5 seconds))) + val actor = system.actorOf(Props(new Actor { def receive = { - case "doIt" ⇒ router ! CurrentRoutees - case routees: RouterRoutees ⇒ testActor forward routees + case (id: String, names: immutable.Iterable[_], actors: Int) ⇒ + val routerProps = Props[TestActor].withRouter( + ScatterGatherFirstCompletedRouter( + routees = names collect { case name: String ⇒ context.actorOf(Props(new TestActor), name) }, + within = 5 seconds)) + + 1 to actors foreach { i ⇒ context.actorOf(routerProps, id + i).tell(CurrentRoutees, testActor) } } - } + })) - val theActor = system.actorOf(Props(new TheActor), "theActor") - theActor ! "doIt" - val routees = expectMsgPF() { - case RouterRoutees(routees) ⇒ routees.toSet - } + val actors = 15 + val names = 1 to 20 map { "routee" + _ } toList - routees.map(_.path.name) must be(Set("routee1", "routee2", "routee3")) + actor ! (("test", names, actors)) + + 1 to actors foreach { _ ⇒ + val routees = expectMsgType[RouterRoutees].routees + routees.map(_.path.name) must be === names + } + expectNoMsg(500.millis) + actor ! PoisonPill } "use configured nr-of-instances when FromConfig" in { val router = system.actorOf(Props[TestActor].withRouter(FromConfig), "router1") - Await.result(router ? CurrentRoutees, remaining).asInstanceOf[RouterRoutees].routees.size must be(3) + router ! CurrentRoutees + expectMsgType[RouterRoutees].routees.size must be(3) watch(router) system.stop(router) expectMsgType[Terminated] @@ -134,7 +138,8 @@ class RoutingSpec extends AkkaSpec(RoutingSpec.config) with DefaultTimeout with "use configured nr-of-instances when router is specified" in { val router = system.actorOf(Props[TestActor].withRouter(RoundRobinRouter(nrOfInstances = 2)), "router2") - Await.result(router ? CurrentRoutees, remaining).asInstanceOf[RouterRoutees].routees.size must be(3) + router ! CurrentRoutees + expectMsgType[RouterRoutees].routees.size must be(3) system.stop(router) } @@ -149,7 +154,8 @@ class RoutingSpec extends AkkaSpec(RoutingSpec.config) with DefaultTimeout with } val router = system.actorOf(Props[TestActor].withRouter(RoundRobinRouter(resizer = Some(resizer))), "router3") Await.ready(latch, remaining) - Await.result(router ? CurrentRoutees, remaining).asInstanceOf[RouterRoutees].routees.size must be(3) + router ! CurrentRoutees + expectMsgType[RouterRoutees].routees.size must be(3) system.stop(router) } From b47ed349d0d73a9889f7bae52b18ef7de56865f2 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Fri, 16 Nov 2012 14:18:44 +0100 Subject: [PATCH 148/210] Clarifying docs in ActorCell --- akka-actor/src/main/scala/akka/actor/ActorCell.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorCell.scala b/akka-actor/src/main/scala/akka/actor/ActorCell.scala index 75dbd3fefa..9cf2b5b3df 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorCell.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorCell.scala @@ -259,12 +259,12 @@ private[akka] trait Cell { */ def isLocal: Boolean /** - * If the actor isLocal, returns whether messages are currently queued, + * If the actor isLocal, returns whether "user messages" are currently queued, * “false” otherwise. */ def hasMessages: Boolean /** - * If the actor isLocal, returns the number of messages currently queued, + * If the actor isLocal, returns the number of "user messages" currently queued, * which may be a costly operation, 0 otherwise. */ def numberOfMessages: Int From ef84352289fdbdb267039690282d3e045a246af3 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Fri, 16 Nov 2012 14:20:10 +0100 Subject: [PATCH 149/210] Adding return type on foreachChild --- akka-actor/src/main/scala/akka/actor/ActorRef.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorRef.scala b/akka-actor/src/main/scala/akka/actor/ActorRef.scala index 6bf3b3bf7c..a6685ae549 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRef.scala @@ -536,7 +536,7 @@ private[akka] class VirtualPathContainer( def hasChildren: Boolean = !children.isEmpty - def foreachChild(f: ActorRef ⇒ Unit) = { + def foreachChild(f: ActorRef ⇒ Unit): Unit = { val iter = children.values.iterator while (iter.hasNext) f(iter.next) } From b5bcdb081fe5628f5db904563d98bb2a0aeaf8d1 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Fri, 16 Nov 2012 17:30:27 +0100 Subject: [PATCH 150/210] Minor RoutingSpec refactoring --- .../src/test/scala/akka/routing/RoutingSpec.scala | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala b/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala index 6dcb564190..9d7522f950 100644 --- a/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala @@ -101,13 +101,13 @@ class RoutingSpec extends AkkaSpec(RoutingSpec.config) with DefaultTimeout with } "be able to send their routees" in { - + case class TestRun(id: String, names: immutable.Iterable[String], actors: Int) val actor = system.actorOf(Props(new Actor { def receive = { - case (id: String, names: immutable.Iterable[_], actors: Int) ⇒ + case TestRun(id, names, actors) ⇒ val routerProps = Props[TestActor].withRouter( ScatterGatherFirstCompletedRouter( - routees = names collect { case name: String ⇒ context.actorOf(Props(new TestActor), name) }, + routees = names map { context.actorOf(Props(new TestActor), _) }, within = 5 seconds)) 1 to actors foreach { i ⇒ context.actorOf(routerProps, id + i).tell(CurrentRoutees, testActor) } @@ -117,14 +117,13 @@ class RoutingSpec extends AkkaSpec(RoutingSpec.config) with DefaultTimeout with val actors = 15 val names = 1 to 20 map { "routee" + _ } toList - actor ! (("test", names, actors)) + actor ! TestRun("test", names, actors) 1 to actors foreach { _ ⇒ val routees = expectMsgType[RouterRoutees].routees routees.map(_.path.name) must be === names } expectNoMsg(500.millis) - actor ! PoisonPill } "use configured nr-of-instances when FromConfig" in { From 975bd1dbe9349a6c241fbdc3e763f046962ee829 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Sat, 17 Nov 2012 14:26:06 +0100 Subject: [PATCH 151/210] #2717 - Fixing the backoff strategy in PojoSRTestSupport --- .../scala/akka/osgi/PojoSRTestSupport.scala | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/akka-osgi/src/test/scala/akka/osgi/PojoSRTestSupport.scala b/akka-osgi/src/test/scala/akka/osgi/PojoSRTestSupport.scala index 1c70d03d7b..95963bd0f5 100644 --- a/akka-osgi/src/test/scala/akka/osgi/PojoSRTestSupport.scala +++ b/akka-osgi/src/test/scala/akka/osgi/PojoSRTestSupport.scala @@ -10,13 +10,14 @@ import org.apache.commons.io.IOUtils.copy import org.osgi.framework._ import java.net.URL - import java.util.jar.JarInputStream import java.io._ import org.scalatest.{ BeforeAndAfterAll, Suite } import java.util.{ UUID, Date, ServiceLoader, HashMap } import scala.reflect.ClassTag import scala.collection.immutable +import scala.concurrent.duration._ +import scala.annotation.tailrec /** * Trait that provides support for building akka-osgi tests using PojoSR @@ -72,13 +73,18 @@ trait PojoSRTestSupport extends Suite with BeforeAndAfterAll { def awaitReference(serviceType: Class[_]): ServiceReference = awaitReference(serviceType, START_WAIT_TIME) def awaitReference(serviceType: Class[_], wait: Long): ServiceReference = { - val option = Option(context.getServiceReference(serviceType.getName)) - Thread.sleep(wait) //FIXME No sleep please - option match { - case Some(reference) ⇒ reference - case None if (wait > MAX_WAIT_TIME) ⇒ fail("Gave up waiting for service of type %s".format(serviceType)) - case None ⇒ awaitReference(serviceType, wait * 2) + + @tailrec def poll(step: Duration, deadline: Deadline): ServiceReference = context.getServiceReference(serviceType.getName) match { + case null ⇒ + if (deadline.isOverdue()) fail("Gave up waiting for service of type %s".format(serviceType)) + else { + Thread.sleep((step min deadline.timeLeft).toMillis) + poll(step, deadline) + } + case some ⇒ some } + + poll(wait.millis, Deadline.now + MAX_WAIT_TIME.millis) } protected def buildTestBundles(builders: immutable.Seq[BundleDescriptorBuilder]): immutable.Seq[BundleDescriptor] = From 739583e384e3d97c8f04d99e70be25cd53b92547 Mon Sep 17 00:00:00 2001 From: Michael Pilquist Date: Thu, 15 Nov 2012 21:28:40 -0500 Subject: [PATCH 152/210] Fix bug where ActorSystems created via OsgiActorSystemFactory(ctx).createActorSystem fail to load akka.event classes unless bundle imports akka.event package (cherry picked from commit 3070343a5de78cd7b363e93a09d56565b1e6df9b) --- akka-osgi/src/main/scala/akka/osgi/OsgiActorSystemFactory.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/akka-osgi/src/main/scala/akka/osgi/OsgiActorSystemFactory.scala b/akka-osgi/src/main/scala/akka/osgi/OsgiActorSystemFactory.scala index 608b80403b..859d671ed3 100644 --- a/akka-osgi/src/main/scala/akka/osgi/OsgiActorSystemFactory.scala +++ b/akka-osgi/src/main/scala/akka/osgi/OsgiActorSystemFactory.scala @@ -17,7 +17,7 @@ class OsgiActorSystemFactory(val context: BundleContext) { /* * Classloader that delegates to the bundle for which the factory is creating an ActorSystem */ - private val classloader = BundleDelegatingClassLoader(context) + private val classloader = new BundleDelegatingClassLoader(context.getBundle, Some(classOf[ActorSystem].getClassLoader)) /** * Creates the [[akka.actor.ActorSystem]], using the name specified From 44c317832a5dabafdeb0e55c45a3cdbce1daaa0e Mon Sep 17 00:00:00 2001 From: Michael Pilquist Date: Fri, 16 Nov 2012 12:55:27 -0500 Subject: [PATCH 153/210] Allow fallback classloader to be explicitly specified (cherry picked from commit f51a2894150e0f5cc6923b8e3aa42d7ebdd6663d) --- .../src/main/scala/akka/osgi/OsgiActorSystemFactory.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/akka-osgi/src/main/scala/akka/osgi/OsgiActorSystemFactory.scala b/akka-osgi/src/main/scala/akka/osgi/OsgiActorSystemFactory.scala index 859d671ed3..3f02936bfd 100644 --- a/akka-osgi/src/main/scala/akka/osgi/OsgiActorSystemFactory.scala +++ b/akka-osgi/src/main/scala/akka/osgi/OsgiActorSystemFactory.scala @@ -12,12 +12,12 @@ import org.osgi.framework.BundleContext * Factory class to create ActorSystem implementations in an OSGi environment. This mainly involves dealing with * bundle classloaders appropriately to ensure that configuration files and classes get loaded properly */ -class OsgiActorSystemFactory(val context: BundleContext) { +class OsgiActorSystemFactory(val context: BundleContext, val fallbackClassLoader: Option[ClassLoader]) { /* * Classloader that delegates to the bundle for which the factory is creating an ActorSystem */ - private val classloader = new BundleDelegatingClassLoader(context.getBundle, Some(classOf[ActorSystem].getClassLoader)) + private val classloader = new BundleDelegatingClassLoader(context.getBundle, fallbackClassLoader) /** * Creates the [[akka.actor.ActorSystem]], using the name specified @@ -52,5 +52,5 @@ object OsgiActorSystemFactory { /* * Create an [[OsgiActorSystemFactory]] instance to set up Akka in an OSGi environment */ - def apply(context: BundleContext): OsgiActorSystemFactory = new OsgiActorSystemFactory(context) + def apply(context: BundleContext): OsgiActorSystemFactory = new OsgiActorSystemFactory(context, Some(classOf[ActorSystem].getClassLoader)) } From 608d04c0501dcbd075e62ba2fe2351133cf46430 Mon Sep 17 00:00:00 2001 From: Michael Pilquist Date: Fri, 16 Nov 2012 13:41:36 -0500 Subject: [PATCH 154/210] Fix build breakage in akka-osgi-aries due to last commit (cherry picked from commit 68b60745f2d7b30d9ccd57536cd9427b04303b84) --- .../aries/blueprint/BlueprintActorSystemFactory.scala | 4 +++- .../main/scala/akka/osgi/OsgiActorSystemFactory.scala | 9 +++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/akka-osgi-aries/src/main/scala/akka/osgi/aries/blueprint/BlueprintActorSystemFactory.scala b/akka-osgi-aries/src/main/scala/akka/osgi/aries/blueprint/BlueprintActorSystemFactory.scala index 30720a230c..ce759a4fa8 100644 --- a/akka-osgi-aries/src/main/scala/akka/osgi/aries/blueprint/BlueprintActorSystemFactory.scala +++ b/akka-osgi-aries/src/main/scala/akka/osgi/aries/blueprint/BlueprintActorSystemFactory.scala @@ -15,7 +15,9 @@ import com.typesafe.config.{ Config, ConfigFactory } * If you're looking for a way to set up Akka using Blueprint without the namespace handler, you should use * [[akka.osgi.OsgiActorSystemFactory]] instead. */ -class BlueprintActorSystemFactory(context: BundleContext, name: String) extends OsgiActorSystemFactory(context) { +class BlueprintActorSystemFactory(context: BundleContext, name: String, fallbackClassLoader: Option[ClassLoader]) extends OsgiActorSystemFactory(context, fallbackClassLoader) { + + def this(context: BundleContext, name: String) = this(context, name, Some(OsgiActorSystemFactory.akkaActorClassLoader)) var config: Option[String] = None diff --git a/akka-osgi/src/main/scala/akka/osgi/OsgiActorSystemFactory.scala b/akka-osgi/src/main/scala/akka/osgi/OsgiActorSystemFactory.scala index 3f02936bfd..447719ef39 100644 --- a/akka-osgi/src/main/scala/akka/osgi/OsgiActorSystemFactory.scala +++ b/akka-osgi/src/main/scala/akka/osgi/OsgiActorSystemFactory.scala @@ -37,7 +37,7 @@ class OsgiActorSystemFactory(val context: BundleContext, val fallbackClassLoader * loaded from the akka-actor bundle. */ def actorSystemConfig(context: BundleContext): Config = - ConfigFactory.load(classloader).withFallback(ConfigFactory.defaultReference(classOf[ActorSystem].getClassLoader)) + ConfigFactory.load(classloader).withFallback(ConfigFactory.defaultReference(OsgiActorSystemFactory.akkaActorClassLoader)) /** * Determine the name for the [[akka.actor.ActorSystem]] @@ -49,8 +49,13 @@ class OsgiActorSystemFactory(val context: BundleContext, val fallbackClassLoader } object OsgiActorSystemFactory { + /** + * Class loader of akka-actor bundle. + */ + def akkaActorClassLoader = classOf[ActorSystem].getClassLoader + /* * Create an [[OsgiActorSystemFactory]] instance to set up Akka in an OSGi environment */ - def apply(context: BundleContext): OsgiActorSystemFactory = new OsgiActorSystemFactory(context, Some(classOf[ActorSystem].getClassLoader)) + def apply(context: BundleContext): OsgiActorSystemFactory = new OsgiActorSystemFactory(context, Some(akkaActorClassLoader)) } From a08e5e7c247159785056463c30d40e9405023214 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Tue, 20 Nov 2012 15:03:00 +0100 Subject: [PATCH 155/210] #2717 - Changing names of the PojoSR constants to be more Scala-like and switching to FiniteDuration instead of Long --- .../src/test/scala/akka/osgi/PojoSRTestSupport.scala | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/akka-osgi/src/test/scala/akka/osgi/PojoSRTestSupport.scala b/akka-osgi/src/test/scala/akka/osgi/PojoSRTestSupport.scala index 95963bd0f5..d1d77daf1e 100644 --- a/akka-osgi/src/test/scala/akka/osgi/PojoSRTestSupport.scala +++ b/akka-osgi/src/test/scala/akka/osgi/PojoSRTestSupport.scala @@ -24,8 +24,8 @@ import scala.annotation.tailrec */ trait PojoSRTestSupport extends Suite with BeforeAndAfterAll { - val MAX_WAIT_TIME = 12800 - val START_WAIT_TIME = 50 + val MaxWaitDuration = 12800.millis + val SleepyTime = 50.millis /** * All bundles being found on the test classpath are automatically installed and started in the PojoSR runtime. @@ -70,21 +70,21 @@ trait PojoSRTestSupport extends Suite with BeforeAndAfterAll { def serviceForType[T](implicit t: ClassTag[T]): T = context.getService(awaitReference(t.runtimeClass)).asInstanceOf[T] - def awaitReference(serviceType: Class[_]): ServiceReference = awaitReference(serviceType, START_WAIT_TIME) + def awaitReference(serviceType: Class[_]): ServiceReference = awaitReference(serviceType, SleepyTime) - def awaitReference(serviceType: Class[_], wait: Long): ServiceReference = { + def awaitReference(serviceType: Class[_], wait: FiniteDuration): ServiceReference = { @tailrec def poll(step: Duration, deadline: Deadline): ServiceReference = context.getServiceReference(serviceType.getName) match { case null ⇒ if (deadline.isOverdue()) fail("Gave up waiting for service of type %s".format(serviceType)) else { - Thread.sleep((step min deadline.timeLeft).toMillis) + Thread.sleep((step min deadline.timeLeft max Duration.Zero).toMillis) poll(step, deadline) } case some ⇒ some } - poll(wait.millis, Deadline.now + MAX_WAIT_TIME.millis) + poll(wait, Deadline.now + MaxWaitDuration) } protected def buildTestBundles(builders: immutable.Seq[BundleDescriptorBuilder]): immutable.Seq[BundleDescriptor] = From cbd301247a6bed9cb3d0191d4bcacd7d87b247d9 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Tue, 13 Nov 2012 20:07:33 +0100 Subject: [PATCH 156/210] Attempting to hunt down and find the race in the RoutingSpec --- .../akka/actor/RepointableActorRef.scala | 119 +++++++++--------- .../src/main/scala/akka/routing/Routing.scala | 29 ++--- 2 files changed, 69 insertions(+), 79 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala index 8ecb1cbb72..1f1c9cae0a 100644 --- a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala @@ -5,11 +5,11 @@ package akka.actor import java.io.ObjectStreamException +import java.util.{ LinkedList ⇒ JLinkedList, Queue ⇒ JQueue } import java.util.concurrent.TimeUnit import java.util.concurrent.locks.ReentrantLock import scala.annotation.tailrec -import scala.collection.mutable.Queue import scala.concurrent.forkjoin.ThreadLocalRandom import akka.actor.dungeon.ChildrenContainer @@ -122,24 +122,26 @@ private[akka] class RepointableActorRef( protected def writeReplace(): AnyRef = SerializedActorRef(path) } -private[akka] class UnstartedCell(val systemImpl: ActorSystemImpl, val self: RepointableActorRef, val props: Props, val supervisor: InternalActorRef, val uid: Int) - extends Cell { +private[akka] class UnstartedCell(val systemImpl: ActorSystemImpl, + val self: RepointableActorRef, + val props: Props, + val supervisor: InternalActorRef, + val uid: Int) extends Cell { /* * This lock protects all accesses to this cell’s queues. It also ensures * safe switching to the started ActorCell. */ - val lock = new ReentrantLock + private[this] final val lock = new ReentrantLock - // use Envelope to keep on-send checks in the same place - val queue: Queue[Envelope] = Queue() - val systemQueue: Queue[SystemMessage] = Queue() - var suspendCount: Int = 0 + // use Envelope to keep on-send checks in the same place ACCESS MUST BE PROTECTED BY THE LOCK + private[this] final val queue: JQueue[Envelope] = new JLinkedList() + private[this] final val systemQueue: JQueue[SystemMessage] = new JLinkedList() + private[this] var suspendCount: Int = 0 - private def timeout = system.settings.UnstartedPushTimeout.duration.toMillis + import systemImpl.settings.UnstartedPushTimeout.{ duration ⇒ timeout } - def replaceWith(cell: Cell): Unit = { - lock.lock() + def replaceWith(cell: Cell): Unit = locked { try { /* * The CallingThreadDispatcher nicely dives under the ReentrantLock and @@ -149,13 +151,13 @@ private[akka] class UnstartedCell(val systemImpl: ActorSystemImpl, val self: Rep * lock, double-tap (well, N-tap, really); concurrent modification is * still not possible because we’re the only thread accessing the queues. */ - while (systemQueue.nonEmpty || queue.nonEmpty) { - while (systemQueue.nonEmpty) { - val msg = systemQueue.dequeue() + while (!systemQueue.isEmpty || !queue.isEmpty) { + while (!systemQueue.isEmpty) { + val msg = systemQueue.poll() cell.sendSystemMessage(msg) } - if (queue.nonEmpty) { - val envelope = queue.dequeue() + if (!queue.isEmpty) { + val envelope = queue.poll() cell.tell(envelope.message, envelope.sender) } } @@ -163,76 +165,67 @@ private[akka] class UnstartedCell(val systemImpl: ActorSystemImpl, val self: Rep self.swapCell(cell) finally try for (_ ← 1 to suspendCount) cell.suspend() - finally - lock.unlock() } def system: ActorSystem = systemImpl - def suspend(): Unit = { - lock.lock() - try suspendCount += 1 - finally lock.unlock() - } - def resume(causedByFailure: Throwable): Unit = { - lock.lock() - try suspendCount -= 1 - finally lock.unlock() - } - def restart(cause: Throwable): Unit = { - lock.lock() - try suspendCount -= 1 - finally lock.unlock() - } + def suspend(): Unit = locked { suspendCount += 1 } + def resume(causedByFailure: Throwable): Unit = locked { suspendCount -= 1 } + def restart(cause: Throwable): Unit = locked { suspendCount -= 1 } def stop(): Unit = sendSystemMessage(Terminate()) def isTerminated: Boolean = false def parent: InternalActorRef = supervisor def childrenRefs: ChildrenContainer = ChildrenContainer.EmptyChildrenContainer def getChildByName(name: String): Option[ChildRestartStats] = None + def tell(message: Any, sender: ActorRef): Unit = { val useSender = if (sender eq Actor.noSender) system.deadLetters else sender - if (lock.tryLock(timeout, TimeUnit.MILLISECONDS)) { + if (lock.tryLock(timeout.length, timeout.unit)) { try { - if (self.underlying eq this) queue enqueue Envelope(message, useSender, system) - else self.underlying.tell(message, useSender) - } finally { - lock.unlock() - } + val cell = self.underlying + if (cell ne this) { + cell.tell(message, useSender) + } else if (!queue.offer(Envelope(message, useSender, system))) { + system.eventStream.publish(Warning(self.path.toString, getClass, "dropping message of type " + message.getClass + " due to enqueue failure")) + system.deadLetters ! DeadLetter(message, useSender, self) + } + } finally lock.unlock() } else { + system.eventStream.publish(Warning(self.path.toString, getClass, "dropping message of type" + message.getClass + " due to lock timeout")) system.deadLetters ! DeadLetter(message, useSender, self) } } - def sendSystemMessage(msg: SystemMessage): Unit = { - if (lock.tryLock(timeout, TimeUnit.MILLISECONDS)) { + + // FIXME: once we have guaranteed delivery of system messages, hook this in! + def sendSystemMessage(msg: SystemMessage): Unit = + if (lock.tryLock(timeout.length, timeout.unit)) { try { - if (self.underlying eq this) systemQueue enqueue msg - else self.underlying.sendSystemMessage(msg) - } finally { - lock.unlock() - } + val cell = self.underlying + if (cell ne this) { + cell.sendSystemMessage(msg) + } else if (!systemQueue.offer(msg)) { + system.eventStream.publish(Warning(self.path.toString, getClass, "dropping system message " + msg + " due to enqueue failure")) + system.deadLetters ! DeadLetter(msg, self, self) + } + } finally lock.unlock() } else { - // FIXME: once we have guaranteed delivery of system messages, hook this in! system.eventStream.publish(Warning(self.path.toString, getClass, "dropping system message " + msg + " due to lock timeout")) system.deadLetters ! DeadLetter(msg, self, self) } - } + def isLocal = true - def hasMessages: Boolean = { - lock.lock() - try { - if (self.underlying eq this) !queue.isEmpty - else self.underlying.hasMessages - } finally { - lock.unlock() - } + def hasMessages: Boolean = locked { + val cell = self.underlying + if (cell eq this) !queue.isEmpty else cell.hasMessages } - def numberOfMessages: Int = { + + def numberOfMessages: Int = locked { + val cell = self.underlying + if (cell eq this) queue.size else cell.numberOfMessages + } + + private[this] final def locked[T](body: ⇒ T): T = { lock.lock() - try { - if (self.underlying eq this) queue.size - else self.underlying.numberOfMessages - } finally { - lock.unlock() - } + try body finally lock.unlock() } } diff --git a/akka-actor/src/main/scala/akka/routing/Routing.scala b/akka-actor/src/main/scala/akka/routing/Routing.scala index 8c3f059a40..d460bed7f3 100644 --- a/akka-actor/src/main/scala/akka/routing/Routing.scala +++ b/akka-actor/src/main/scala/akka/routing/Routing.scala @@ -91,7 +91,7 @@ private[akka] class RoutedActorCell(_system: ActorSystemImpl, _ref: InternalActo * `RouterConfig.createRoute` and `Resizer.resize` */ private[akka] def addRoutees(newRoutees: immutable.Iterable[ActorRef]): Unit = { - _routees = _routees ++ newRoutees + _routees ++= newRoutees // subscribe to Terminated messages for all route destinations, to be handled by Router actor newRoutees foreach watch } @@ -107,30 +107,27 @@ private[akka] class RoutedActorCell(_system: ActorSystemImpl, _ref: InternalActo } override def tell(message: Any, sender: ActorRef): Unit = { - resize() - + resize() // Mucho importante val s = if (sender eq null) system.deadLetters else sender - - val msg = message match { - case wrapped: RouterEnvelope ⇒ wrapped.message - case m ⇒ m - } - applyRoute(s, message) match { - case Destination(_, x) :: Nil if x == self ⇒ super.tell(message, s) - case refs ⇒ - refs foreach (p ⇒ - if (p.recipient == self) super.tell(msg, p.sender) - else p.recipient.!(msg)(p.sender)) + case Destination(_, x) :: Nil if x == self ⇒ + super.tell(message, s) + case refs ⇒ refs foreach { p ⇒ + val msg = message match { + case wrapped: RouterEnvelope ⇒ wrapped.message + case m ⇒ m + } + if (p.recipient == self) super.tell(msg, p.sender) + else p.recipient.!(msg)(p.sender) + } } } - def resize(): Unit = { + def resize(): Unit = for (r ← routerConfig.resizer) { if (r.isTimeForResize(resizeCounter.getAndIncrement()) && resizeInProgress.compareAndSet(false, true)) super.tell(Router.Resize, self) } - } } /** From 5478fe094c97fc6c72936aee8d4066cc35ef98d9 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Wed, 14 Nov 2012 14:34:31 +0100 Subject: [PATCH 157/210] Simplifying the code inside Children and RepointableActorRef --- .../akka/actor/RepointableActorRef.scala | 24 ++++++----- .../scala/akka/actor/dungeon/Children.scala | 43 ++++++++++--------- 2 files changed, 35 insertions(+), 32 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala index 1f1c9cae0a..87c02455bc 100644 --- a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala @@ -52,12 +52,15 @@ private[akka] class RepointableActorRef( * * This is protected so that others can have different initialization. */ - def initialize(): this.type = { - val uid = ThreadLocalRandom.current.nextInt() - swapCell(new UnstartedCell(system, this, props, supervisor, uid)) - supervisor.sendSystemMessage(Supervise(this, uid)) - this - } + def initialize(): this.type = + underlying match { + case null ⇒ + val uid = ThreadLocalRandom.current.nextInt() + swapCell(new UnstartedCell(system, this, props, supervisor, uid)) + supervisor.sendSystemMessage(Supervise(this, uid)) + this + case other ⇒ this + } /** * This method is supposed to be called by the supervisor in handleSupervise() @@ -65,13 +68,12 @@ private[akka] class RepointableActorRef( * modification of the `underlying` field, though it is safe to send messages * at any time. */ - def activate(): this.type = { + def activate(): this.type = underlying match { - case u: UnstartedCell ⇒ u.replaceWith(newCell(u)) - case _ ⇒ // this happens routinely for things which were created async=false + case u: UnstartedCell ⇒ u.replaceWith(newCell(u)); this + case null ⇒ throw new IllegalStateException("underlying cell is null") + case _ ⇒ this // this happens routinely for things which were created async=false } - this - } /** * This is called by activate() to obtain the cell which is to replace the diff --git a/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala b/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala index 74e06f3034..a9c1383374 100644 --- a/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala +++ b/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala @@ -52,19 +52,24 @@ private[akka] trait Children { this: ActorCell ⇒ } final def stop(actor: ActorRef): Unit = { - val started = actor match { - case r: RepointableRef ⇒ r.isStarted - case _ ⇒ true + if (childrenRefs.getByRef(actor).isDefined) { + @tailrec def shallDie(ref: ActorRef): Boolean = { + val c = childrenRefs + swapChildrenRefs(c, c.shallDie(ref)) || shallDie(ref) + } + + if (actor match { + case r: RepointableRef ⇒ r.isStarted + case _ ⇒ true + }) shallDie(actor) } - if (childrenRefs.getByRef(actor).isDefined && started) shallDie(actor) actor.asInstanceOf[InternalActorRef].stop() } /* * low level CAS helpers */ - - @inline private def swapChildrenRefs(oldChildren: ChildrenContainer, newChildren: ChildrenContainer): Boolean = + @inline private final def swapChildrenRefs(oldChildren: ChildrenContainer, newChildren: ChildrenContainer): Boolean = Unsafe.instance.compareAndSwapObject(this, AbstractActorCell.childrenOffset, oldChildren, newChildren) @tailrec final def reserveChild(name: String): Boolean = { @@ -89,18 +94,6 @@ private[akka] trait Children { this: ActorCell ⇒ } } - @tailrec final protected def shallDie(ref: ActorRef): Boolean = { - val c = childrenRefs - swapChildrenRefs(c, c.shallDie(ref)) || shallDie(ref) - } - - @tailrec final private def removeChild(ref: ActorRef): ChildrenContainer = { - val c = childrenRefs - val n = c.remove(ref) - if (swapChildrenRefs(c, n)) n - else removeChild(ref) - } - @tailrec final protected def setChildrenTerminationReason(reason: ChildrenContainer.SuspendReason): Boolean = { childrenRefs match { case c: ChildrenContainer.TerminatingChildrenContainer ⇒ @@ -143,10 +136,18 @@ private[akka] trait Children { this: ActorCell ⇒ protected def getAllChildStats: immutable.Iterable[ChildRestartStats] = childrenRefs.stats protected def removeChildAndGetStateChange(child: ActorRef): Option[SuspendReason] = { - childrenRefs match { + @tailrec def removeChild(ref: ActorRef): ChildrenContainer = { + val c = childrenRefs + val n = c.remove(ref) + if (swapChildrenRefs(c, n)) n else removeChild(ref) + } + + childrenRefs match { // The match must be performed BEFORE the removeChild case TerminatingChildrenContainer(_, _, reason) ⇒ - val newContainer = removeChild(child) - if (!newContainer.isInstanceOf[TerminatingChildrenContainer]) Some(reason) else None + removeChild(child) match { + case c: TerminatingChildrenContainer ⇒ None + case _ ⇒ Some(reason) + } case _ ⇒ removeChild(child) None From 456f7ee293b738163b60b2456323383be6fd7b11 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Tue, 13 Nov 2012 20:07:33 +0100 Subject: [PATCH 158/210] Attempting to hunt down and find the race in the RoutingSpec --- akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala | 1 + akka-actor/src/main/scala/akka/routing/Routing.scala | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala b/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala index 22a5e66971..9d7522f950 100644 --- a/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala @@ -118,6 +118,7 @@ class RoutingSpec extends AkkaSpec(RoutingSpec.config) with DefaultTimeout with val names = 1 to 20 map { "routee" + _ } toList actor ! TestRun("test", names, actors) + 1 to actors foreach { _ ⇒ val routees = expectMsgType[RouterRoutees].routees routees.map(_.path.name) must be === names diff --git a/akka-actor/src/main/scala/akka/routing/Routing.scala b/akka-actor/src/main/scala/akka/routing/Routing.scala index d460bed7f3..6fb2d8b2a5 100644 --- a/akka-actor/src/main/scala/akka/routing/Routing.scala +++ b/akka-actor/src/main/scala/akka/routing/Routing.scala @@ -7,7 +7,6 @@ import language.implicitConversions import language.postfixOps import scala.collection.immutable -import scala.collection.JavaConverters.iterableAsScalaIterableConverter import scala.concurrent.duration._ import akka.actor._ import akka.ConfigurationException @@ -19,6 +18,7 @@ import java.util.concurrent.atomic.{ AtomicLong, AtomicBoolean } import java.util.concurrent.TimeUnit import scala.concurrent.forkjoin.ThreadLocalRandom import scala.annotation.tailrec +import akka.event.Logging.Warning /** * A RoutedActorRef is an ActorRef that has a set of connected ActorRef and it uses a Router to From 735b1369bb32d9c5e8daa75a2051bb1bde9dcc2d Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Wed, 21 Nov 2012 20:22:10 +0100 Subject: [PATCH 159/210] #2720 - Adding OSGi manifest to testkit --- project/AkkaBuild.scala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index ef67a662be..b0b084115f 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -97,7 +97,7 @@ object AkkaBuild extends Build { id = "akka-testkit", base = file("akka-testkit"), dependencies = Seq(actor), - settings = defaultSettings ++ Seq( + settings = defaultSettings ++ OSGi.testkit ++ Seq( libraryDependencies ++= Dependencies.testkit, initialCommands += "import akka.testkit._", previousArtifact := akkaPreviousArtifact("akka-testkit") @@ -635,6 +635,8 @@ object AkkaBuild extends Build { val transactor = exports(Seq("akka.transactor.*")) + val testkit = exports(Seq("akka.testkit.*")) + val zeroMQ = exports(Seq("akka.zeromq.*")) def exports(packages: Seq[String] = Seq()) = osgiSettings ++ Seq( From f386c4136f79cee6aa96ffb574f3c95428d5ee9b Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Wed, 21 Nov 2012 20:33:54 +0100 Subject: [PATCH 160/210] #2729 - Removing uses of Future.either in favor of firstCompletedOf --- akka-docs/rst/java/code/docs/future/FutureDocTestBase.java | 4 ++-- akka-docs/rst/scala/code/docs/future/FutureDocSpec.scala | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/akka-docs/rst/java/code/docs/future/FutureDocTestBase.java b/akka-docs/rst/java/code/docs/future/FutureDocTestBase.java index fb49a9a48d..975814ded2 100644 --- a/akka-docs/rst/java/code/docs/future/FutureDocTestBase.java +++ b/akka-docs/rst/java/code/docs/future/FutureDocTestBase.java @@ -43,10 +43,10 @@ import scala.concurrent.ExecutionContext$; //#imports8 import static akka.pattern.Patterns.after; +import java.util.Arrays; //#imports8 import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -564,7 +564,7 @@ public class FutureDocTestBase { return "foo"; } }, ec); - Future result = future.either(delayed); + Future result = Futures.firstCompletedOf(Arrays.asList(future, delayed), ec); //#after Await.result(result, Duration.create(2, SECONDS)); } diff --git a/akka-docs/rst/scala/code/docs/future/FutureDocSpec.scala b/akka-docs/rst/scala/code/docs/future/FutureDocSpec.scala index 48feec13d9..a80f920a6b 100644 --- a/akka-docs/rst/scala/code/docs/future/FutureDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/future/FutureDocSpec.scala @@ -417,7 +417,7 @@ class FutureDocSpec extends AkkaSpec { val delayed = after(200 millis, using = system.scheduler)(Future.failed( new IllegalStateException("OHNOES"))) val future = Future { Thread.sleep(1000); "foo" } - val result = future either delayed + val result = Future firstCompletedOf Seq(future, delayed) //#after intercept[IllegalStateException] { Await.result(result, 2 second) } } From 866ac0d6ae59733e8ceb55c4d7b6ee20d6d3edd7 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Wed, 21 Nov 2012 20:54:17 +0100 Subject: [PATCH 161/210] #2719 - removing deployReadme from Dist task since it isn't used or needed. --- project/Dist.scala | 1 - 1 file changed, 1 deletion(-) diff --git a/project/Dist.scala b/project/Dist.scala index 53fd40fed2..86d4263346 100644 --- a/project/Dist.scala +++ b/project/Dist.scala @@ -57,7 +57,6 @@ object Dist { val base = unzipped / ("akka-" + version) val distBase = projectBase / "akka-kernel" / "src" / "main" / "dist" val deploy = base / "deploy" - val deployReadme = deploy / "readme" val doc = base / "doc" / "akka" val api = doc / "api" val docs = doc / "docs" From fbd96162a0007fd5954bc870ad9d8aace8d3f47c Mon Sep 17 00:00:00 2001 From: Roland Date: Thu, 22 Nov 2012 14:40:54 +0100 Subject: [PATCH 162/210] add ActorRefProvider.getDefaultAddress, see #2732 - use it in ConsistentHashingRouter instead of relying on provider.rootPath.address - remove transport.address from RemoteActorRefProvider.rootPath --- .../src/main/scala/akka/actor/ActorRefProvider.scala | 7 +++++++ .../scala/akka/routing/ConsistentHashingRouter.scala | 2 +- .../scala/akka/remote/RemoteActorRefProvider.scala | 12 +++++------- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala index b0b4c3d939..fcb0a6ddc9 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala @@ -146,6 +146,11 @@ trait ActorRefProvider { * attempt is made to verify actual reachability). */ def getExternalAddressFor(addr: Address): Option[Address] + + /** + * Obtain the external address of the default transport. + */ + def getDefaultAddress: Address } /** @@ -597,4 +602,6 @@ class LocalActorRefProvider( } def getExternalAddressFor(addr: Address): Option[Address] = if (addr == rootPath.address) Some(addr) else None + + def getDefaultAddress: Address = rootPath.address } diff --git a/akka-actor/src/main/scala/akka/routing/ConsistentHashingRouter.scala b/akka-actor/src/main/scala/akka/routing/ConsistentHashingRouter.scala index 0214c6736e..e88195f577 100644 --- a/akka-actor/src/main/scala/akka/routing/ConsistentHashingRouter.scala +++ b/akka-actor/src/main/scala/akka/routing/ConsistentHashingRouter.scala @@ -237,7 +237,7 @@ trait ConsistentHashingLike { this: RouterConfig ⇒ } val log = Logging(routeeProvider.context.system, routeeProvider.context.self) - val selfAddress = routeeProvider.context.system.asInstanceOf[ExtendedActorSystem].provider.rootPath.address + val selfAddress = routeeProvider.context.system.asInstanceOf[ExtendedActorSystem].provider.getDefaultAddress val vnodes = if (virtualNodesFactor == 0) routeeProvider.context.system.settings.DefaultVirtualNodesFactor else virtualNodesFactor diff --git a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala index 48fca0af08..d7800e8d96 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala @@ -32,9 +32,7 @@ class RemoteActorRefProvider( private var _log = local.log def log: LoggingAdapter = _log - @volatile - private var _rootPath = local.rootPath - override def rootPath: ActorPath = _rootPath + override def rootPath: ActorPath = local.rootPath override def deadLetters: InternalActorRef = local.deadLetters // these are only available after init() @@ -63,7 +61,7 @@ class RemoteActorRefProvider( def init(system: ActorSystemImpl): Unit = { local.init(system) - _remoteDaemon = new RemoteSystemDaemon(system, local.rootPath / "remote", rootGuardian, log, untrustedMode = remoteSettings.UntrustedMode) + _remoteDaemon = new RemoteSystemDaemon(system, rootPath / "remote", rootGuardian, log, untrustedMode = remoteSettings.UntrustedMode) local.registerExtraNames(Map(("remote", remoteDaemon))) _serialization = SerializationExtension(system) @@ -84,8 +82,6 @@ class RemoteActorRefProvider( // this enables reception of remote requests _transport.start() - _rootPath = RootActorPath(local.rootPath.address.copy(host = transport.address.host, port = transport.address.port)) - val remoteClientLifeCycleHandler = system.systemActorOf(Props(new Actor { def receive = { case RemoteClientError(cause, remote, address) ⇒ remote.shutdownClientConnection(address) @@ -201,8 +197,10 @@ class RemoteActorRefProvider( } } + def getDefaultAddress: Address = transport.address + private def isSelfAddress(address: Address): Boolean = - address == local.rootPath.address || address == rootPath.address || address == transport.address + address == rootPath.address || address == transport.address } From 5e2127a6c7a70ef942d60a93763a80ef14c3a3a3 Mon Sep 17 00:00:00 2001 From: Roland Date: Thu, 22 Nov 2012 15:14:24 +0100 Subject: [PATCH 163/210] clarify internal nature of ActorRefProvider impls --- .../src/main/scala/akka/actor/ActorRefProvider.scala | 7 +++++-- .../main/scala/akka/remote/RemoteActorRefProvider.scala | 4 ++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala index fcb0a6ddc9..df1599da30 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala @@ -42,8 +42,7 @@ trait ActorRefProvider { def deadLetters: ActorRef /** - * The root path for all actors within this actor system, including remote - * address if enabled. + * The root path for all actors within this actor system, not including any remote address information. */ def rootPath: ActorPath @@ -322,6 +321,10 @@ private[akka] object SystemGuardian { /** * Local ActorRef provider. + * + * INTERNAL API! + * + * Depending on this class is not supported, only the [[ActorRefProvider]] interface is supported. */ class LocalActorRefProvider( _systemName: String, diff --git a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala index d7800e8d96..f65e8b6ad2 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala @@ -14,6 +14,10 @@ import scala.util.control.NonFatal /** * Remote ActorRefProvider. Starts up actor on remote node and creates a RemoteActorRef representing it. + * + * INTERNAL API! + * + * Depending on this class is not supported, only the [[ActorRefProvider]] interface is supported. */ class RemoteActorRefProvider( val systemName: String, From b06b0fa0876aa8631889c063ea6c7e208cac084c Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Tue, 20 Nov 2012 17:18:37 +0100 Subject: [PATCH 164/210] DOC: Formatting issues, see #2723 (cherry picked from commit 15abee84875cdb534056986b9172a38b57d24d92) --- .../src/main/scala/akka/actor/Scheduler.scala | 7 ++- .../throttle/TimerBasedThrottlerSpec.scala | 3 +- akka-docs/rst/cluster/cluster-usage-java.rst | 3 +- akka-docs/rst/cluster/cluster-usage-scala.rst | 3 +- akka-docs/rst/java/camel.rst | 2 + akka-docs/rst/modules/durable-mailbox.rst | 3 +- akka-docs/rst/project/links.rst | 3 +- .../project/migration-guide-2.0.x-2.1.x.rst | 45 ++++++++++++------- akka-docs/rst/scala/camel.rst | 2 + .../code/docs/zeromq/ZeromqDocSpec.scala | 3 +- akka-remote/src/main/resources/reference.conf | 3 +- akka-sbt-plugin/sample/project/Build.scala | 6 +-- .../src/main/resources/reference.conf | 3 +- 13 files changed, 56 insertions(+), 30 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/Scheduler.scala b/akka-actor/src/main/scala/akka/actor/Scheduler.scala index 2f8310a071..4aa91f916f 100644 --- a/akka-actor/src/main/scala/akka/actor/Scheduler.scala +++ b/akka-actor/src/main/scala/akka/actor/Scheduler.scala @@ -15,6 +15,7 @@ import akka.util.internal._ import concurrent.ExecutionContext import scala.concurrent.duration.FiniteDuration +// The Scheduler trait is included in the documentation. KEEP THE LINES SHORT!!! //#scheduler /** * An Akka scheduler service. This one needs one special behavior: if @@ -50,7 +51,8 @@ trait Scheduler { */ def schedule( initialDelay: FiniteDuration, - interval: FiniteDuration)(f: ⇒ Unit)(implicit executor: ExecutionContext): Cancellable + interval: FiniteDuration)(f: ⇒ Unit)( + implicit executor: ExecutionContext): Cancellable /** * Schedules a function to be run repeatedly with an initial delay and @@ -93,7 +95,8 @@ trait Scheduler { * Scala API */ def scheduleOnce( - delay: FiniteDuration)(f: ⇒ Unit)(implicit executor: ExecutionContext): Cancellable + delay: FiniteDuration)(f: ⇒ Unit)( + implicit executor: ExecutionContext): Cancellable } //#scheduler diff --git a/akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala b/akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala index cf13f42a24..7304df1448 100644 --- a/akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala +++ b/akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala @@ -46,7 +46,8 @@ class TimerBasedThrottlerSpec extends TestKit(ActorSystem("TimerBasedThrottlerSp } })) // The throttler for this example, setting the rate - val throttler = system.actorOf(Props(new TimerBasedThrottler(3 msgsPer (1.second.dilated)))) + val throttler = system.actorOf(Props(new TimerBasedThrottler( + 3 msgsPer (1.second.dilated)))) // Set the target throttler ! SetTarget(Some(printer)) // These three messages will be sent to the echoer immediately diff --git a/akka-docs/rst/cluster/cluster-usage-java.rst b/akka-docs/rst/cluster/cluster-usage-java.rst index c674bff3a6..cbc16791b9 100644 --- a/akka-docs/rst/cluster/cluster-usage-java.rst +++ b/akka-docs/rst/cluster/cluster-usage-java.rst @@ -482,7 +482,8 @@ Run it without parameters to see instructions about how to use the script:: is-available - Checks if the member node is available is-running - Checks if the member node is running has-convergence - Checks if there is a cluster convergence - Where the should be on the format of 'akka://actor-system-name@hostname:port' + Where the should be on the format of + 'akka://actor-system-name@hostname:port' Examples: bin/akka-cluster localhost:9999 is-available bin/akka-cluster localhost:9999 join akka://MySystem@darkstar:2552 diff --git a/akka-docs/rst/cluster/cluster-usage-scala.rst b/akka-docs/rst/cluster/cluster-usage-scala.rst index 31ce7e7191..0ba8d5bccc 100644 --- a/akka-docs/rst/cluster/cluster-usage-scala.rst +++ b/akka-docs/rst/cluster/cluster-usage-scala.rst @@ -496,7 +496,8 @@ Run it without parameters to see instructions about how to use the script:: is-available - Checks if the member node is available is-running - Checks if the member node is running has-convergence - Checks if there is a cluster convergence - Where the should be on the format of 'akka://actor-system-name@hostname:port' + Where the should be on the format of + 'akka://actor-system-name@hostname:port' Examples: bin/akka-cluster localhost:9999 is-available bin/akka-cluster localhost:9999 join akka://MySystem@darkstar:2552 diff --git a/akka-docs/rst/java/camel.rst b/akka-docs/rst/java/camel.rst index 9eff4ae561..4825e4e4a1 100644 --- a/akka-docs/rst/java/camel.rst +++ b/akka-docs/rst/java/camel.rst @@ -388,6 +388,8 @@ URI options The following URI options are supported: +.. tabularcolumns:: |l|l|l|L| + +--------------+----------+---------+------------------------------------------------+ | Name | Type | Default | Description | +==============+==========+=========+================================================+ diff --git a/akka-docs/rst/modules/durable-mailbox.rst b/akka-docs/rst/modules/durable-mailbox.rst index f76cee0dbd..7fa5aa2480 100644 --- a/akka-docs/rst/modules/durable-mailbox.rst +++ b/akka-docs/rst/modules/durable-mailbox.rst @@ -96,7 +96,8 @@ added in concrete subclass like this: To use ``DurableMailboxDocSpec`` add this dependency:: - "com.typesafe.akka" %% "akka-mailboxes-common" % "@version@" classifier "test" @crossString@ + "com.typesafe.akka" %% "akka-mailboxes-common" % + "@version@" classifier "test" @crossString@ For more inspiration you can look at the old implementations based on Redis, MongoDB, Beanstalk, and ZooKeeper, which can be found in Akka git repository tag diff --git a/akka-docs/rst/project/links.rst b/akka-docs/rst/project/links.rst index 54734e0e5c..842042cdec 100644 --- a/akka-docs/rst/project/links.rst +++ b/akka-docs/rst/project/links.rst @@ -73,7 +73,8 @@ Make sure that you add the repository to the sbt resolvers:: Define the library dependencies with the timestamp as version. For example:: - libraryDependencies += "com.typesafe.akka" % "akka-remote_@binVersion@" % "2.1-20121016-001042" + libraryDependencies += "com.typesafe.akka" % "akka-remote_@binVersion@" % + "2.1-20121016-001042" maven definition of snapshot repository --------------------------------------- diff --git a/akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst b/akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst index e9458c7614..dc160a7170 100644 --- a/akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst +++ b/akka-docs/rst/project/migration-guide-2.0.x-2.1.x.rst @@ -66,8 +66,9 @@ Java: :: // Use this Actors' Dispatcher as ExecutionContext - getContext().system().scheduler().scheduleOnce(Duration.create(10, TimeUnit.SECONDS)", - getSelf(), new Reconnect(), getContext().getDispatcher()); + getContext().system().scheduler().scheduleOnce(Duration.create( + 10, TimeUnit.SECONDS), getSelf(), new Reconnect(), + getContext().getDispatcher()); // Use ActorSystem's default Dispatcher as ExecutionContext system.scheduler().scheduleOnce(Duration.create(50, TimeUnit.MILLISECONDS), @@ -394,13 +395,17 @@ This has been done to enable OSGi bundles that don't have conflicting package na Change the following import statements. Please note that the serializers are often referenced from configuration. -================================================ ======================================================= -Search Replace with -================================================ ======================================================= -``akka.routing.RemoteRouterConfig`` ``akka.remote.routing.RemoteRouterConfig`` -``akka.serialization.ProtobufSerializer`` ``akka.remote.serialization.ProtobufSerializer`` -``akka.serialization.DaemonMsgCreateSerializer`` ``akka.remote.serialization.DaemonMsgCreateSerializer`` -================================================ ======================================================= +Search -> Replace with:: + + akka.routing.RemoteRouterConfig -> + akka.remote.routing.RemoteRouterConfig + + akka.serialization.ProtobufSerializer -> + akka.remote.serialization.ProtobufSerializer + + akka.serialization.DaemonMsgCreateSerializer -> + akka.remote.serialization.DaemonMsgCreateSerializer + Package Name Changes in Durable Mailboxes ========================================= @@ -410,14 +415,20 @@ This has been done to enable OSGi bundles that don't have conflicting package na Change the following import statements. Please note that the ``FileBasedMailboxType`` is often referenced from configuration. -================================================ ========================================================= -Search Replace with -================================================ ========================================================= -``akka.actor.mailbox.FileBasedMailboxType`` ``akka.actor.mailbox.filebased.FileBasedMailboxType`` -``akka.actor.mailbox.FileBasedMailboxSettings`` ``akka.actor.mailbox.filebased.FileBasedMailboxSettings`` -``akka.actor.mailbox.FileBasedMessageQueue`` ``akka.actor.mailbox.filebased.FileBasedMessageQueue`` -``akka.actor.mailbox.filequeue.*`` ``akka.actor.mailbox.filebased.filequeue.*`` -================================================ ========================================================= +Search -> Replace with:: + + akka.actor.mailbox.FileBasedMailboxType -> + akka.actor.mailbox.filebased.FileBasedMailboxType + + akka.actor.mailbox.FileBasedMailboxSettings -> + akka.actor.mailbox.filebased.FileBasedMailboxSettings + + akka.actor.mailbox.FileBasedMessageQueue -> + akka.actor.mailbox.filebased.FileBasedMessageQueue + + akka.actor.mailbox.filequeue.* -> + akka.actor.mailbox.filebased.filequeue.* + Actor Receive Timeout ===================== diff --git a/akka-docs/rst/scala/camel.rst b/akka-docs/rst/scala/camel.rst index c1a0e35789..c556827a69 100644 --- a/akka-docs/rst/scala/camel.rst +++ b/akka-docs/rst/scala/camel.rst @@ -384,6 +384,8 @@ URI options The following URI options are supported: +.. tabularcolumns:: |l|l|l|L| + +--------------+----------+---------+-------------------------------------------+ | Name | Type | Default | Description | +==============+==========+=========+===========================================+ diff --git a/akka-docs/rst/scala/code/docs/zeromq/ZeromqDocSpec.scala b/akka-docs/rst/scala/code/docs/zeromq/ZeromqDocSpec.scala index 28ff2e3d34..0ce9ee61bf 100644 --- a/akka-docs/rst/scala/code/docs/zeromq/ZeromqDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/zeromq/ZeromqDocSpec.scala @@ -29,7 +29,8 @@ object ZeromqDocSpec { class HealthProbe extends Actor { - val pubSocket = ZeroMQExtension(context.system).newSocket(SocketType.Pub, Bind("tcp://127.0.0.1:1235")) + val pubSocket = ZeroMQExtension(context.system).newSocket(SocketType.Pub, + Bind("tcp://127.0.0.1:1235")) val memory = ManagementFactory.getMemoryMXBean val os = ManagementFactory.getOperatingSystemMXBean val ser = SerializationExtension(context.system) diff --git a/akka-remote/src/main/resources/reference.conf b/akka-remote/src/main/resources/reference.conf index f0f78f3ec3..cd4259e3d9 100644 --- a/akka-remote/src/main/resources/reference.conf +++ b/akka-remote/src/main/resources/reference.conf @@ -220,7 +220,8 @@ akka { # Example: ["TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_RSA_WITH_AES_256_CBC_SHA"] # You need to install the JCE Unlimited Strength Jurisdiction Policy # Files to use AES 256. - # More info here: http://docs.oracle.com/javase/7/docs/technotes/guides/security/SunProviders.html#SunJCEProvider + # More info here: + # http://docs.oracle.com/javase/7/docs/technotes/guides/security/SunProviders.html#SunJCEProvider enabled-algorithms = ["TLS_RSA_WITH_AES_128_CBC_SHA"] # Using /dev/./urandom is only necessary when using SHA1PRNG on Linux to diff --git a/akka-sbt-plugin/sample/project/Build.scala b/akka-sbt-plugin/sample/project/Build.scala index 6fbf075359..8a3172430e 100644 --- a/akka-sbt-plugin/sample/project/Build.scala +++ b/akka-sbt-plugin/sample/project/Build.scala @@ -52,7 +52,7 @@ object Dependency { val Akka = "2.2-SNAPSHOT" } - val akkaKernel = "com.typesafe.akka" %% "akka-kernel" % V.Akka cross CrossVersion.full - val akkaSlf4j = "com.typesafe.akka" %% "akka-slf4j" % V.Akka cross CrossVersion.full - val logback = "ch.qos.logback" % "logback-classic" % "1.0.0" + val akkaKernel = "com.typesafe.akka" %% "akka-kernel" % V.Akka cross CrossVersion.full + val akkaSlf4j = "com.typesafe.akka" %% "akka-slf4j" % V.Akka cross CrossVersion.full + val logback = "ch.qos.logback" % "logback-classic" % "1.0.0" } diff --git a/akka-testkit/src/main/resources/reference.conf b/akka-testkit/src/main/resources/reference.conf index 17da88c22e..7adeb68331 100644 --- a/akka-testkit/src/main/resources/reference.conf +++ b/akka-testkit/src/main/resources/reference.conf @@ -15,7 +15,8 @@ akka { # all required messages are received filter-leeway = 3s - # duration to wait in expectMsg and friends outside of within() block by default + # duration to wait in expectMsg and friends outside of within() block + # by default single-expect-default = 3s # The timeout that is added as an implicit by DefaultTimeout trait From c736c9ea5ea60650ae8f928a5a08ae0c59ed9a44 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Tue, 20 Nov 2012 17:53:59 +0100 Subject: [PATCH 165/210] Fix various small things in docs, see #2707 * Forward port of 2.0.3 erratai, commit 93883896b6602341cc001e292f000a93a53d6885 (cherry picked from commit 0025332473518eb7e6606f7923286aacbec8727c) --- akka-docs/rst/general/jmm.rst | 8 ++++---- akka-docs/rst/intro/why-akka.rst | 2 +- akka-docs/rst/java/event-bus.rst | 2 +- akka-docs/rst/java/fault-tolerance.rst | 3 --- akka-docs/rst/java/routing.rst | 6 +++--- akka-docs/rst/scala/fault-tolerance.rst | 3 --- akka-docs/rst/scala/routing.rst | 4 ++-- 7 files changed, 11 insertions(+), 17 deletions(-) diff --git a/akka-docs/rst/general/jmm.rst b/akka-docs/rst/general/jmm.rst index 085a347451..dc0c87e2a4 100644 --- a/akka-docs/rst/general/jmm.rst +++ b/akka-docs/rst/general/jmm.rst @@ -13,9 +13,9 @@ Prior to Java 5, the Java Memory Model (JMM) was ill defined. It was possible to shared memory was accessed by multiple threads, such as: * a thread not seeing values written by other threads: a visibility problem -* a thread observing 'impossible' behavior of other threads, caused by instructions not being executed in the order - -expected: an instruction reordering problem. +* a thread observing 'impossible' behavior of other threads, caused by + instructions not being executed in the order expected: an instruction + reordering problem. With the implementation of JSR 133 in Java 5, a lot of these issues have been resolved. The JMM is a set of rules based on the "happens-before" relation, which constrain when one memory access must happen before another, and conversely, @@ -120,4 +120,4 @@ Since Akka runs on the JVM there are still some rules to be followed. } } -* Messages **should** be immutable, this is to avoid the shared mutable state trap. \ No newline at end of file +* Messages **should** be immutable, this is to avoid the shared mutable state trap. diff --git a/akka-docs/rst/intro/why-akka.rst b/akka-docs/rst/intro/why-akka.rst index 85789fdf19..e11cfee187 100644 --- a/akka-docs/rst/intro/why-akka.rst +++ b/akka-docs/rst/intro/why-akka.rst @@ -24,7 +24,7 @@ and then there's the whole package, the Akka Microkernel, which is a standalone container to deploy your Akka application in. With CPUs growing more and more cores every cycle, Akka is the alternative that provides outstanding performance even if you're only running it on one machine. Akka also supplies a wide array -of concurrency-paradigms, allowing for users to choose the right tool for the +of concurrency-paradigms, allowing users to choose the right tool for the job. diff --git a/akka-docs/rst/java/event-bus.rst b/akka-docs/rst/java/event-bus.rst index faecd1d209..fa71e356d8 100644 --- a/akka-docs/rst/java/event-bus.rst +++ b/akka-docs/rst/java/event-bus.rst @@ -185,7 +185,7 @@ at runtime:: system.eventStream.setLogLevel(Logging.DebugLevel()); -This means that log events for a level which will not be logged are not +This means that log events for a level which will not be logged are typically not dispatched at all (unless manual subscriptions to the respective event class have been done) diff --git a/akka-docs/rst/java/fault-tolerance.rst b/akka-docs/rst/java/fault-tolerance.rst index 3794ebd3fe..9cb9d234fd 100644 --- a/akka-docs/rst/java/fault-tolerance.rst +++ b/akka-docs/rst/java/fault-tolerance.rst @@ -24,9 +24,6 @@ sample as it is easy to follow the log output to understand what is happening in fault-tolerance-sample -.. includecode:: code/docs/actor/japi/FaultHandlingDocSample.java#all - :exclude: imports,messages,dummydb - Creating a Supervisor Strategy ------------------------------ diff --git a/akka-docs/rst/java/routing.rst b/akka-docs/rst/java/routing.rst index 4d21bdd187..9f74e6d902 100644 --- a/akka-docs/rst/java/routing.rst +++ b/akka-docs/rst/java/routing.rst @@ -66,7 +66,7 @@ In addition to being able to supply looked-up remote actors as routees, you can make the router deploy its created children on a set of remote hosts; this will be done in round-robin fashion. In order to do that, wrap the router configuration in a :class:`RemoteRouterConfig`, attaching the remote addresses of -the nodes to deploy to. Naturally, this requires your to include the +the nodes to deploy to. Naturally, this requires you to include the ``akka-remote`` module on your classpath: .. includecode:: code/docs/jrouting/RouterViaProgramExample.java#remoteRoutees @@ -114,7 +114,7 @@ Routers vs. Supervision ^^^^^^^^^^^^^^^^^^^^^^^ As explained in the previous section, routers create new actor instances as -children of the “head” router, who therefor also is their supervisor. The +children of the “head” router, who therefore also is their supervisor. The supervisor strategy of this actor can be configured by means of the :meth:`RouterConfig.supervisorStrategy` property, which is supported for all built-in router types. It defaults to “always escalate”, which leads to the @@ -434,7 +434,7 @@ Configured Custom Router It is possible to define configuration properties for custom routers. In the ``router`` property of the deployment configuration you define the fully qualified class name of the router class. The router class must extend -``akka.routing.CustomRouterConfig`` and and have constructor with ``com.typesafe.config.Config`` parameter. +``akka.routing.CustomRouterConfig`` and have constructor with one ``com.typesafe.config.Config`` parameter. The deployment section of the configuration is passed to the constructor. Custom Resizer diff --git a/akka-docs/rst/scala/fault-tolerance.rst b/akka-docs/rst/scala/fault-tolerance.rst index f0e3952c99..6b6559e647 100644 --- a/akka-docs/rst/scala/fault-tolerance.rst +++ b/akka-docs/rst/scala/fault-tolerance.rst @@ -24,9 +24,6 @@ sample as it is easy to follow the log output to understand what is happening in fault-tolerance-sample -.. includecode:: code/docs/actor/FaultHandlingDocSample.scala#all - :exclude: imports,messages,dummydb - Creating a Supervisor Strategy ------------------------------ diff --git a/akka-docs/rst/scala/routing.rst b/akka-docs/rst/scala/routing.rst index 9dc356c98c..f04223b5d3 100644 --- a/akka-docs/rst/scala/routing.rst +++ b/akka-docs/rst/scala/routing.rst @@ -66,7 +66,7 @@ In addition to being able to supply looked-up remote actors as routees, you can make the router deploy its created children on a set of remote hosts; this will be done in round-robin fashion. In order to do that, wrap the router configuration in a :class:`RemoteRouterConfig`, attaching the remote addresses of -the nodes to deploy to. Naturally, this requires your to include the +the nodes to deploy to. Naturally, this requires you to include the ``akka-remote`` module on your classpath: .. includecode:: code/docs/routing/RouterViaProgramExample.scala#remoteRoutees @@ -430,7 +430,7 @@ Configured Custom Router It is possible to define configuration properties for custom routers. In the ``router`` property of the deployment configuration you define the fully qualified class name of the router class. The router class must extend -``akka.routing.RouterConfig`` and and have constructor with ``com.typesafe.config.Config`` parameter. +``akka.routing.RouterConfig`` and have constructor with one ``com.typesafe.config.Config`` parameter. The deployment section of the configuration is passed to the constructor. Custom Resizer From 9c66407b66ead50d2f65619d1ea0eff6a56f0d81 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Fri, 16 Nov 2012 15:26:01 +0100 Subject: [PATCH 166/210] #2575 - attempting to fix RepointableActors --- .../akka/actor/RepointableActorRef.scala | 83 +++++++++++-------- .../scala/akka/actor/dungeon/Children.scala | 2 +- .../src/main/scala/akka/routing/Routing.scala | 1 + 3 files changed, 49 insertions(+), 37 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala index 87c02455bc..8621ca116e 100644 --- a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala @@ -5,7 +5,7 @@ package akka.actor import java.io.ObjectStreamException -import java.util.{ LinkedList ⇒ JLinkedList, Queue ⇒ JQueue } +import java.util.{ LinkedList ⇒ JLinkedList, ListIterator ⇒ JListIterator } import java.util.concurrent.TimeUnit import java.util.concurrent.locks.ReentrantLock @@ -13,9 +13,10 @@ import scala.annotation.tailrec import scala.concurrent.forkjoin.ThreadLocalRandom import akka.actor.dungeon.ChildrenContainer -import akka.dispatch.{ Envelope, Supervise, SystemMessage, Terminate } import akka.event.Logging.Warning import akka.util.Unsafe +import akka.dispatch._ +import util.Try /** * This actor ref starts out with some dummy cell (by default just enqueuing @@ -93,7 +94,11 @@ private[akka] class RepointableActorRef( def restart(cause: Throwable): Unit = underlying.restart(cause) - def isStarted: Boolean = !underlying.isInstanceOf[UnstartedCell] + def isStarted: Boolean = underlying match { + case _: UnstartedCell ⇒ false + case null ⇒ throw new IllegalStateException("isStarted called before initialized") + case _ ⇒ true + } def isTerminated: Boolean = underlying.isTerminated @@ -137,44 +142,36 @@ private[akka] class UnstartedCell(val systemImpl: ActorSystemImpl, private[this] final val lock = new ReentrantLock // use Envelope to keep on-send checks in the same place ACCESS MUST BE PROTECTED BY THE LOCK - private[this] final val queue: JQueue[Envelope] = new JLinkedList() - private[this] final val systemQueue: JQueue[SystemMessage] = new JLinkedList() - private[this] var suspendCount: Int = 0 + private[this] final val queue = new JLinkedList[Any]() + // ACCESS MUST BE PROTECTED BY THE LOCK, is used to detect when messages are sent during replace + private[this] final var isBeingReplaced = false import systemImpl.settings.UnstartedPushTimeout.{ duration ⇒ timeout } def replaceWith(cell: Cell): Unit = locked { + isBeingReplaced = true try { - /* - * The CallingThreadDispatcher nicely dives under the ReentrantLock and - * breaks things by enqueueing into stale queues from within the message - * processing which happens in-line for sendSystemMessage() and tell(). - * Since this is the only possible way to f*ck things up within this - * lock, double-tap (well, N-tap, really); concurrent modification is - * still not possible because we’re the only thread accessing the queues. - */ - while (!systemQueue.isEmpty || !queue.isEmpty) { - while (!systemQueue.isEmpty) { - val msg = systemQueue.poll() - cell.sendSystemMessage(msg) - } - if (!queue.isEmpty) { - val envelope = queue.poll() - cell.tell(envelope.message, envelope.sender) + while (!queue.isEmpty) { + queue.poll() match { + case s: SystemMessage ⇒ cell.sendSystemMessage(s) + case e: Envelope ⇒ cell.tell(e.message, e.sender) } } - } finally try + } finally { + isBeingReplaced = false self.swapCell(cell) - finally try - for (_ ← 1 to suspendCount) cell.suspend() + } } def system: ActorSystem = systemImpl - def suspend(): Unit = locked { suspendCount += 1 } - def resume(causedByFailure: Throwable): Unit = locked { suspendCount -= 1 } - def restart(cause: Throwable): Unit = locked { suspendCount -= 1 } + def suspend(): Unit = sendSystemMessage(Suspend()) + def resume(causedByFailure: Throwable): Unit = sendSystemMessage(Resume(causedByFailure)) + def restart(cause: Throwable): Unit = sendSystemMessage(Recreate(cause)) def stop(): Unit = sendSystemMessage(Terminate()) - def isTerminated: Boolean = false + def isTerminated: Boolean = locked { + val cell = self.underlying + if (cellIsReady(cell)) cell.isTerminated else false + } def parent: InternalActorRef = supervisor def childrenRefs: ChildrenContainer = ChildrenContainer.EmptyChildrenContainer def getChildByName(name: String): Option[ChildRestartStats] = None @@ -184,7 +181,7 @@ private[akka] class UnstartedCell(val systemImpl: ActorSystemImpl, if (lock.tryLock(timeout.length, timeout.unit)) { try { val cell = self.underlying - if (cell ne this) { + if (cellIsReady(cell)) { cell.tell(message, useSender) } else if (!queue.offer(Envelope(message, useSender, system))) { system.eventStream.publish(Warning(self.path.toString, getClass, "dropping message of type " + message.getClass + " due to enqueue failure")) @@ -202,11 +199,22 @@ private[akka] class UnstartedCell(val systemImpl: ActorSystemImpl, if (lock.tryLock(timeout.length, timeout.unit)) { try { val cell = self.underlying - if (cell ne this) { + if (cellIsReady(cell)) { cell.sendSystemMessage(msg) - } else if (!systemQueue.offer(msg)) { - system.eventStream.publish(Warning(self.path.toString, getClass, "dropping system message " + msg + " due to enqueue failure")) - system.deadLetters ! DeadLetter(msg, self, self) + } else { + // systemMessages that are sent during replace need to jump to just after the last system message in the queue, so it's processed before other messages + val wasEnqueued = if (isBeingReplaced && !queue.isEmpty()) { + @tailrec def tryEnqueue(i: JListIterator[Any] = queue.listIterator(), insertIntoIndex: Int = -1): Boolean = + if (i.hasNext()) tryEnqueue(i, if (i.next().isInstanceOf[SystemMessage]) i.nextIndex() else insertIntoIndex) + else if (insertIntoIndex == -1) queue.offer(msg) + else Try(queue.add(insertIntoIndex, msg)).isSuccess + tryEnqueue() + } else queue.offer(msg) + + if (!wasEnqueued) { + system.eventStream.publish(Warning(self.path.toString, getClass, "dropping system message " + msg + " due to enqueue failure")) + system.deadLetters ! DeadLetter(msg, self, self) + } } } finally lock.unlock() } else { @@ -215,14 +223,17 @@ private[akka] class UnstartedCell(val systemImpl: ActorSystemImpl, } def isLocal = true + + private[this] final def cellIsReady(cell: Cell): Boolean = (cell ne this) && (cell ne null) + def hasMessages: Boolean = locked { val cell = self.underlying - if (cell eq this) !queue.isEmpty else cell.hasMessages + if (cellIsReady(cell)) cell.hasMessages else !queue.isEmpty } def numberOfMessages: Int = locked { val cell = self.underlying - if (cell eq this) queue.size else cell.numberOfMessages + if (cellIsReady(cell)) cell.numberOfMessages else queue.size } private[this] final def locked[T](body: ⇒ T): T = { diff --git a/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala b/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala index a9c1383374..ba856206ea 100644 --- a/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala +++ b/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala @@ -145,7 +145,7 @@ private[akka] trait Children { this: ActorCell ⇒ childrenRefs match { // The match must be performed BEFORE the removeChild case TerminatingChildrenContainer(_, _, reason) ⇒ removeChild(child) match { - case c: TerminatingChildrenContainer ⇒ None + case _: TerminatingChildrenContainer ⇒ None case _ ⇒ Some(reason) } case _ ⇒ diff --git a/akka-actor/src/main/scala/akka/routing/Routing.scala b/akka-actor/src/main/scala/akka/routing/Routing.scala index 6fb2d8b2a5..49f54c70ae 100644 --- a/akka-actor/src/main/scala/akka/routing/Routing.scala +++ b/akka-actor/src/main/scala/akka/routing/Routing.scala @@ -16,6 +16,7 @@ import akka.japi.Util.immutableSeq import com.typesafe.config.Config import java.util.concurrent.atomic.{ AtomicLong, AtomicBoolean } import java.util.concurrent.TimeUnit +import akka.event.Logging.Warning import scala.concurrent.forkjoin.ThreadLocalRandom import scala.annotation.tailrec import akka.event.Logging.Warning From 532131493f8b4185d081af836ea7aea9f78f0e2f Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Fri, 23 Nov 2012 09:03:35 +0100 Subject: [PATCH 167/210] Correction of doc of unhandled, see #2736 * Fix wrong config property * Adjusted description in java api --- akka-docs/rst/java/untyped-actors.rst | 7 ++++--- akka-docs/rst/scala/actors.rst | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/akka-docs/rst/java/untyped-actors.rst b/akka-docs/rst/java/untyped-actors.rst index f10fc30787..2acc8bbee1 100644 --- a/akka-docs/rst/java/untyped-actors.rst +++ b/akka-docs/rst/java/untyped-actors.rst @@ -127,10 +127,11 @@ UntypedActor API The :class:`UntypedActor` class defines only one abstract method, the above mentioned :meth:`onReceive(Object message)`, which implements the behavior of the actor. -If the current actor behavior does not match a received message, -:meth:`unhandled` is called, which by default publishes a ``new +If the current actor behavior does not match a received message, it's recommended that +you call the :meth:`unhandled` method, which by default publishes a ``new akka.actor.UnhandledMessage(message, sender, recipient)`` on the actor system’s -event stream. +event stream (set configuration item ``akka.actor.debug.unhandled`` to ``on`` +to have them converted into actual Debug messages). In addition, it offers: diff --git a/akka-docs/rst/scala/actors.rst b/akka-docs/rst/scala/actors.rst index e52d9ba973..4f44497485 100644 --- a/akka-docs/rst/scala/actors.rst +++ b/akka-docs/rst/scala/actors.rst @@ -234,8 +234,8 @@ If the current actor behavior does not match a received message, :meth:`unhandled` is called, which by default publishes an ``akka.actor.UnhandledMessage(message, sender, recipient)`` on the actor system’s event stream (set configuration item -``akka.event-handler-startup-timeout`` to ``true`` to have them converted into -actual Debug messages) +``akka.actor.debug.unhandled`` to ``on`` to have them converted into +actual Debug messages). In addition, it offers: From cba535c9b735169100bf4304ad1f00750f07f64c Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Fri, 23 Nov 2012 11:22:01 +0100 Subject: [PATCH 168/210] Hardening AdaptiveLoadBalancingRouterSpec, see #2547 * Problems with OOME for large heaps * Create many small arrays instead of one large array * Reduce half-life to get faster updates --- .../AdaptiveLoadBalancingRouterSpec.scala | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/AdaptiveLoadBalancingRouterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/AdaptiveLoadBalancingRouterSpec.scala index f936c5d0a7..723ef6b8ec 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/AdaptiveLoadBalancingRouterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/routing/AdaptiveLoadBalancingRouterSpec.scala @@ -8,7 +8,6 @@ import language.postfixOps import java.lang.management.ManagementFactory import scala.concurrent.Await import scala.concurrent.duration._ -import scala.concurrent.forkjoin.ThreadLocalRandom import com.typesafe.config.Config import com.typesafe.config.ConfigFactory @@ -26,22 +25,26 @@ import akka.testkit.{ LongRunningTest, DefaultTimeout, ImplicitSender } object AdaptiveLoadBalancingRouterMultiJvmSpec extends MultiNodeConfig { class Routee extends Actor { - var usedMemory: Array[Byte] = _ def receive = { case _ ⇒ sender ! Reply(Cluster(context.system).selfAddress) } } class Memory extends Actor with ActorLogging { - var usedMemory: Array[Byte] = _ + var usedMemory: Array[Array[Int]] = _ def receive = { case AllocateMemory ⇒ val heap = ManagementFactory.getMemoryMXBean.getHeapMemoryUsage // getMax can be undefined (-1) val max = math.max(heap.getMax, heap.getCommitted) val used = heap.getUsed - val allocate = (0.8 * (max - used)).toInt - usedMemory = Array.fill(allocate)(ThreadLocalRandom.current.nextInt(127).toByte) + log.debug("used heap before: [{}] bytes, of max [{}]", used, heap.getMax) + // allocate 70% of free space + val allocateBytes = (0.7 * (max - used)).toInt + val numberOfArrays = allocateBytes / 1024 + usedMemory = Array.ofDim(numberOfArrays, 248) // each 248 element Int array will use ~ 1 kB + log.debug("used heap after: [{}] bytes", ManagementFactory.getMemoryMXBean.getHeapMemoryUsage.getUsed) + sender ! "done" } } @@ -55,6 +58,7 @@ object AdaptiveLoadBalancingRouterMultiJvmSpec extends MultiNodeConfig { commonConfig(debugConfig(on = false).withFallback(ConfigFactory.parseString(""" akka.cluster.metrics.collect-interval = 1s akka.cluster.metrics.gossip-interval = 1s + akka.cluster.metrics.moving-average-half-life = 2s akka.actor.deployment { /router3 = { router = adaptive @@ -157,7 +161,10 @@ abstract class AdaptiveLoadBalancingRouterSpec extends MultiNodeSpec(AdaptiveLoa enterBarrier("gc") runOn(second) { - system.actorOf(Props[Memory], "memory") ! AllocateMemory + within(20.seconds) { + system.actorOf(Props[Memory], "memory") ! AllocateMemory + expectMsg("done") + } } enterBarrier("heap-allocated") @@ -166,13 +173,11 @@ abstract class AdaptiveLoadBalancingRouterSpec extends MultiNodeSpec(AdaptiveLoa router2 // collect some metrics before we start - Thread.sleep(10000) + Thread.sleep(cluster.settings.MetricsInterval.toMillis * 10) - val iterationCount = 100 - for (i ← 0 until iterationCount) { + val iterationCount = 3000 + 1 to iterationCount foreach { _ ⇒ router2 ! "hit" - // wait a while between each message, since metrics is collected periodically - Thread.sleep(10) } val replies = receiveReplies(iterationCount) From 1466ad84af2e926b1322700dafbdc551f93d6237 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Fri, 23 Nov 2012 15:37:44 +0100 Subject: [PATCH 169/210] -Xmx256m for multi-node jvms, see #2547 --- project/AkkaBuild.scala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index fc872bbaee..807de9d466 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -452,7 +452,9 @@ object AkkaBuild extends Build { case key: String if key.startsWith("multinode.") => "-D" + key + "=" + System.getProperty(key) case key: String if key.startsWith("akka.") => "-D" + key + "=" + System.getProperty(key) } - akkaProperties ::: (if (getBoolean("sbt.log.noformat")) List("-Dakka.test.nocolor=true") else Nil) + + "-Xmx256m" :: akkaProperties ::: + (if (getBoolean("sbt.log.noformat")) List("-Dakka.test.nocolor=true") else Nil) } // for excluding tests by name use system property: -Dakka.test.names.exclude=TimingSpec From 84aef558461b29411aaf0b6ebe18183cbb9b93ca Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Fri, 23 Nov 2012 17:53:33 +0100 Subject: [PATCH 170/210] Roland found a nasty race between activate in supervisor and locally, this commit should fix it, and rename activate to point --- .../src/main/scala/akka/actor/ActorCell.scala | 18 +++++++++--------- .../scala/akka/actor/ActorRefProvider.scala | 7 +++---- .../scala/akka/actor/RepointableActorRef.scala | 14 +++++++------- .../scala/akka/actor/dungeon/Dispatch.scala | 2 +- .../akka/dispatch/AbstractDispatcher.scala | 2 +- .../src/main/scala/akka/routing/Routing.scala | 2 +- 6 files changed, 22 insertions(+), 23 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorCell.scala b/akka-actor/src/main/scala/akka/actor/ActorCell.scala index 9cf2b5b3df..9b2ef58d04 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorCell.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorCell.scala @@ -361,10 +361,10 @@ private[akka] class ActorCell( case null ⇒ faultResume(inRespToFailure) case w: WaitingForChildren ⇒ w.enqueue(message) } - case Terminate() ⇒ terminate() - case Supervise(child, uid) ⇒ supervise(child, uid) - case ChildTerminated(child) ⇒ todo = handleChildTerminated(child) - case NoMessage ⇒ // only here to suppress warning + case Terminate() ⇒ terminate() + case Supervise(child, async, uid) ⇒ supervise(child, async, uid) + case ChildTerminated(child) ⇒ todo = handleChildTerminated(child) + case NoMessage ⇒ // only here to suppress warning } } catch { case e @ (_: InterruptedException | NonFatal(_)) ⇒ handleInvokeFailure(Nil, e, "error while processing " + message) @@ -492,21 +492,21 @@ private[akka] class ActorCell( } } - private def supervise(child: ActorRef, uid: Int): Unit = if (!isTerminating) { + private def supervise(child: ActorRef, async: Boolean, uid: Int): Unit = if (!isTerminating) { // Supervise is the first thing we get from a new child, so store away the UID for later use in handleFailure() initChild(child) match { case Some(crs) ⇒ crs.uid = uid - handleSupervise(child) + handleSupervise(child, async) if (system.settings.DebugLifecycle) publish(Debug(self.path.toString, clazz(actor), "now supervising " + child)) case None ⇒ publish(Error(self.path.toString, clazz(actor), "received Supervise from unregistered child " + child + ", this will not end well")) } } // future extension point - protected def handleSupervise(child: ActorRef): Unit = child match { - case r: RepointableActorRef ⇒ r.activate() - case _ ⇒ + protected def handleSupervise(child: ActorRef, async: Boolean): Unit = child match { + case r: RepointableActorRef if async ⇒ r.point() + case _ ⇒ } final protected def clearActorFields(actorInstance: Actor): Unit = { diff --git a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala index b0b4c3d939..5c6cfc640c 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala @@ -381,7 +381,7 @@ class LocalActorRefProvider( override def sendSystemMessage(message: SystemMessage): Unit = stopped ifOff { message match { - case Supervise(_, _) ⇒ // TODO register child in some map to keep track of it and enable shutdown after all dead + case Supervise(_, _, _) ⇒ // TODO register child in some map to keep track of it and enable shutdown after all dead case ChildTerminated(_) ⇒ stop() case _ ⇒ log.error(this + " received unexpected system message [" + message + "]") } @@ -585,14 +585,13 @@ class LocalActorRefProvider( if (settings.DebugRouterMisconfiguration && deployer.lookup(path).isDefined) log.warning("Configuration says that {} should be a router, but code disagrees. Remove the config or add a routerConfig to its Props.") - if (async) new RepointableActorRef(system, props, supervisor, path).initialize() + if (async) new RepointableActorRef(system, props, supervisor, path).initialize(async) else new LocalActorRef(system, props, supervisor, path) case router ⇒ val lookup = if (lookupDeploy) deployer.lookup(path) else None val fromProps = Iterator(props.deploy.copy(routerConfig = props.deploy.routerConfig withFallback router)) val d = fromProps ++ deploy.iterator ++ lookup.iterator reduce ((a, b) ⇒ b withFallback a) - val ref = new RoutedActorRef(system, props.withRouter(d.routerConfig), supervisor, path).initialize() - if (async) ref else ref.activate() + new RoutedActorRef(system, props.withRouter(d.routerConfig), supervisor, path).initialize(async) } } diff --git a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala index 8621ca116e..ddc49b1e22 100644 --- a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala @@ -53,14 +53,15 @@ private[akka] class RepointableActorRef( * * This is protected so that others can have different initialization. */ - def initialize(): this.type = + def initialize(async: Boolean): this.type = underlying match { case null ⇒ val uid = ThreadLocalRandom.current.nextInt() swapCell(new UnstartedCell(system, this, props, supervisor, uid)) - supervisor.sendSystemMessage(Supervise(this, uid)) + supervisor.sendSystemMessage(Supervise(this, async, uid)) + if (!async) point() this - case other ⇒ this + case other ⇒ throw new IllegalStateException("initialize called more than once!") } /** @@ -69,7 +70,7 @@ private[akka] class RepointableActorRef( * modification of the `underlying` field, though it is safe to send messages * at any time. */ - def activate(): this.type = + def point(): this.type = underlying match { case u: UnstartedCell ⇒ u.replaceWith(newCell(u)); this case null ⇒ throw new IllegalStateException("underlying cell is null") @@ -80,9 +81,8 @@ private[akka] class RepointableActorRef( * This is called by activate() to obtain the cell which is to replace the * unstarted cell. The cell must be fully functional. */ - def newCell(old: Cell): Cell = - new ActorCell(system, this, props, supervisor). - init(old.asInstanceOf[UnstartedCell].uid, sendSupervise = false).start() + def newCell(old: UnstartedCell): Cell = + new ActorCell(system, this, props, supervisor).init(old.uid, sendSupervise = false).start() def start(): Unit = () diff --git a/akka-actor/src/main/scala/akka/actor/dungeon/Dispatch.scala b/akka-actor/src/main/scala/akka/actor/dungeon/Dispatch.scala index aefd2bcc55..469aac78c2 100644 --- a/akka-actor/src/main/scala/akka/actor/dungeon/Dispatch.scala +++ b/akka-actor/src/main/scala/akka/actor/dungeon/Dispatch.scala @@ -55,7 +55,7 @@ private[akka] trait Dispatch { this: ActorCell ⇒ if (sendSupervise) { // ➡➡➡ NEVER SEND THE SAME SYSTEM MESSAGE OBJECT TO TWO ACTORS ⬅⬅⬅ - parent.sendSystemMessage(akka.dispatch.Supervise(self, uid)) + parent.sendSystemMessage(akka.dispatch.Supervise(self, async = false, uid)) parent ! NullMessage // read ScalaDoc of NullMessage to see why } this diff --git a/akka-actor/src/main/scala/akka/dispatch/AbstractDispatcher.scala b/akka-actor/src/main/scala/akka/dispatch/AbstractDispatcher.scala index 1b9de36e77..8f13e5fa11 100644 --- a/akka-actor/src/main/scala/akka/dispatch/AbstractDispatcher.scala +++ b/akka-actor/src/main/scala/akka/dispatch/AbstractDispatcher.scala @@ -108,7 +108,7 @@ private[akka] case class Terminate() extends SystemMessage // sent to self from /** * INTERNAL API */ -private[akka] case class Supervise(child: ActorRef, uid: Int) extends SystemMessage // sent to supervisor ActorRef from ActorCell.start +private[akka] case class Supervise(child: ActorRef, async: Boolean, uid: Int) extends SystemMessage // sent to supervisor ActorRef from ActorCell.start /** * INTERNAL API */ diff --git a/akka-actor/src/main/scala/akka/routing/Routing.scala b/akka-actor/src/main/scala/akka/routing/Routing.scala index 49f54c70ae..1363d1d8d6 100644 --- a/akka-actor/src/main/scala/akka/routing/Routing.scala +++ b/akka-actor/src/main/scala/akka/routing/Routing.scala @@ -37,7 +37,7 @@ private[akka] class RoutedActorRef(_system: ActorSystemImpl, _props: Props, _sup _props.routerConfig.verifyConfig() - override def newCell(old: Cell): Cell = new RoutedActorCell(system, this, props, supervisor, old.asInstanceOf[UnstartedCell].uid) + override def newCell(old: UnstartedCell): Cell = new RoutedActorCell(system, this, props, supervisor, old.uid) } From e9e1580d475d5751bc57cbd99303e1be113e6fdf Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Sat, 24 Nov 2012 22:01:27 +0100 Subject: [PATCH 171/210] Simplify MetricsGossip and NodeMetrics merge, see #2547 * Also fixed problem with removed nodes potentially added back to MetricsGossip --- .../cluster/ClusterMetricsCollector.scala | 124 ++++++++++-------- .../cluster/MetricNumericConverterSpec.scala | 7 +- .../akka/cluster/MetricsGossipSpec.scala | 46 ++++--- .../scala/akka/cluster/NodeMetricsSpec.scala | 33 ++--- 4 files changed, 110 insertions(+), 100 deletions(-) diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala index a9f60b3675..271ad1d29a 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala @@ -84,7 +84,7 @@ private[cluster] class ClusterMetricsCollector(publisher: ActorRef) extends Acto case GossipTick ⇒ gossip() case MetricsTick ⇒ collect() case state: CurrentClusterState ⇒ receiveState(state) - case MemberUp(m) ⇒ receiveMember(m) + case MemberUp(m) ⇒ addMember(m) case e: MemberEvent ⇒ removeMember(e) case msg: MetricsGossipEnvelope ⇒ receiveGossip(msg) } @@ -99,7 +99,7 @@ private[cluster] class ClusterMetricsCollector(publisher: ActorRef) extends Acto /** * Adds a member to the node ring. */ - def receiveMember(member: Member): Unit = nodes += member.address + def addMember(member: Member): Unit = nodes += member.address /** * Removes a member from the member node ring. @@ -113,7 +113,8 @@ private[cluster] class ClusterMetricsCollector(publisher: ActorRef) extends Acto /** * Updates the initial node ring for those nodes that are [[akka.cluster.MemberStatus.Up]]. */ - def receiveState(state: CurrentClusterState): Unit = nodes = state.members collect { case m if m.status == Up ⇒ m.address } + def receiveState(state: CurrentClusterState): Unit = + nodes = state.members collect { case m if m.status == Up ⇒ m.address } /** * Samples the latest metrics for the node, updates metrics statistics in @@ -128,16 +129,16 @@ private[cluster] class ClusterMetricsCollector(publisher: ActorRef) extends Acto /** * Receives changes from peer nodes, merges remote with local gossip nodes, then publishes - * changes to the event stream for load balancing router consumption, and gossips to peers. + * changes to the event stream for load balancing router consumption, and gossip back. */ def receiveGossip(envelope: MetricsGossipEnvelope): Unit = { - val remoteGossip = envelope.gossip - - if (remoteGossip != latestGossip) { - latestGossip = latestGossip merge remoteGossip - publish() - gossipTo(envelope.from) - } + // remote node might not have same view of member nodes, this side should only care + // about nodes that are known here, otherwise removed nodes can come back + val otherGossip = envelope.gossip.filter(nodes) + latestGossip = latestGossip merge otherGossip + publish() + if (!envelope.reply) + replyGossipTo(envelope.from) } /** @@ -146,7 +147,13 @@ private[cluster] class ClusterMetricsCollector(publisher: ActorRef) extends Acto def gossip(): Unit = selectRandomNode((nodes - selfAddress).toVector) foreach gossipTo def gossipTo(address: Address): Unit = - context.actorFor(self.path.toStringWithAddress(address)) ! MetricsGossipEnvelope(selfAddress, latestGossip) + sendGossip(address, MetricsGossipEnvelope(selfAddress, latestGossip, reply = false)) + + def replyGossipTo(address: Address): Unit = + sendGossip(address, MetricsGossipEnvelope(selfAddress, latestGossip, reply = true)) + + def sendGossip(address: Address, envelope: MetricsGossipEnvelope): Unit = + context.actorFor(self.path.toStringWithAddress(address)) ! envelope def selectRandomNode(addresses: immutable.IndexedSeq[Address]): Option[Address] = if (addresses.isEmpty) None else Some(addresses(ThreadLocalRandom.current nextInt addresses.size)) @@ -177,51 +184,31 @@ private[cluster] case class MetricsGossip(nodes: Set[NodeMetrics]) { */ def remove(node: Address): MetricsGossip = copy(nodes = nodes filterNot (_.address == node)) + /** + * Only the nodes that are in the `includeNodes` Set. + */ + def filter(includeNodes: Set[Address]): MetricsGossip = + copy(nodes = nodes filter { includeNodes contains _.address }) + /** * Adds new remote [[akka.cluster.NodeMetrics]] and merges existing from a remote gossip. */ - def merge(remoteGossip: MetricsGossip): MetricsGossip = { - val remoteNodes = remoteGossip.nodes.map(n ⇒ n.address -> n).toMap - val remoteNodesKeySet = remoteNodes.keySet - val toMerge = nodeKeys intersect remoteNodesKeySet - val onlyInRemote = remoteNodesKeySet -- nodeKeys - val onlyInLocal = nodeKeys -- remoteNodesKeySet - - val seen = nodes.collect { - case n if toMerge contains n.address ⇒ n merge remoteNodes(n.address) - case n if onlyInLocal contains n.address ⇒ n - } - - val unseen = remoteGossip.nodes.collect { case n if onlyInRemote contains n.address ⇒ n } - - copy(nodes = seen ++ unseen) - } + def merge(otherGossip: MetricsGossip): MetricsGossip = + otherGossip.nodes.foldLeft(this) { (gossip, nodeMetrics) ⇒ gossip :+ nodeMetrics } /** * Adds new local [[akka.cluster.NodeMetrics]], or merges an existing. */ - def :+(data: NodeMetrics): MetricsGossip = { - val previous = metricsFor(data.address) - val names = previous map (_.name) - - val (toMerge: Set[Metric], unseen: Set[Metric]) = data.metrics partition (a ⇒ names contains a.name) - val merged = toMerge flatMap (latest ⇒ previous.collect { case peer if latest sameAs peer ⇒ peer :+ latest }) - - val refreshed = nodes filterNot (_.address == data.address) - copy(nodes = refreshed + data.copy(metrics = unseen ++ merged)) + def :+(newNodeMetrics: NodeMetrics): MetricsGossip = nodeMetricsFor(newNodeMetrics.address) match { + case Some(existingNodeMetrics) ⇒ + copy(nodes = nodes - existingNodeMetrics + (existingNodeMetrics merge newNodeMetrics)) + case None ⇒ copy(nodes = nodes + newNodeMetrics) } /** - * Returns a set of [[akka.actor.Address]] for a given node set. + * Returns [[akka.cluster.NodeMetrics]] for a node if exists. */ - def nodeKeys: Set[Address] = nodes map (_.address) - - /** - * Returns metrics for a node if exists. - */ - def metricsFor(address: Address): Set[Metric] = nodes collectFirst { - case n if (n.address == address) ⇒ n.metrics - } getOrElse Set.empty[Metric] + def nodeMetricsFor(address: Address): Option[NodeMetrics] = nodes find { n ⇒ n.address == address } } @@ -229,7 +216,8 @@ private[cluster] case class MetricsGossip(nodes: Set[NodeMetrics]) { * INTERNAL API * Envelope adding a sender address to the gossip. */ -private[cluster] case class MetricsGossipEnvelope(from: Address, gossip: MetricsGossip) extends ClusterMessage +private[cluster] case class MetricsGossipEnvelope(from: Address, gossip: MetricsGossip, reply: Boolean) + extends ClusterMessage object EWMA { /** @@ -294,6 +282,10 @@ private[cluster] case class EWMA(value: Double, alpha: Double) extends ClusterMe } /** + * Metrics key/value. + * + * Equality of Metric is based on its name. + * * @param name the metric name * @param value the metric value, which may or may not be defined, it must be a valid numerical value, * see [[akka.cluster.MetricNumericConverter.defined()]] @@ -334,6 +326,12 @@ case class Metric private (name: String, value: Number, private val average: Opt */ def sameAs(that: Metric): Boolean = name == that.name + override def hashCode = name.## + override def equals(obj: Any) = obj match { + case other: Metric ⇒ sameAs(other) + case _ ⇒ false + } + } /** @@ -369,6 +367,8 @@ object Metric extends MetricNumericConverter { * The snapshot of current sampled health metrics for any monitored process. * Collected and gossipped at regular intervals for dynamic cluster management strategies. * + * Equality of NodeMetrics is based on its address. + * * @param address [[akka.actor.Address]] of the node the metrics are gathered at * @param timestamp the time of sampling, in milliseconds since midnight, January 1, 1970 UTC * @param metrics the set of sampled [[akka.actor.Metric]] @@ -378,17 +378,14 @@ case class NodeMetrics(address: Address, timestamp: Long, metrics: Set[Metric] = /** * Returns the most recent data. */ - def merge(that: NodeMetrics): NodeMetrics = if (this updatable that) copy(metrics = that.metrics, timestamp = that.timestamp) else this - - /** - * Returns true if that address is the same as this and its metric set is more recent. - */ - def updatable(that: NodeMetrics): Boolean = (this sameAs that) && (that.timestamp > timestamp) - - /** - * Returns true if that address is the same as this - */ - def sameAs(that: NodeMetrics): Boolean = address == that.address + def merge(that: NodeMetrics): NodeMetrics = { + require(address == that.address, s"merge only allowed for same address, [$address] != [$that.address]") + if (timestamp >= that.timestamp) this // that is older + else { + // equality is based on the name of the Metric and Set doesn't replace existing element + copy(metrics = that.metrics ++ metrics, timestamp = that.timestamp) + } + } def metric(key: String): Option[Metric] = metrics.collectFirst { case m if m.name == key ⇒ m } @@ -398,6 +395,17 @@ case class NodeMetrics(address: Address, timestamp: Long, metrics: Set[Metric] = def getMetrics: java.lang.Iterable[Metric] = scala.collection.JavaConverters.asJavaIterableConverter(metrics).asJava + /** + * Returns true if that address is the same as this + */ + def sameAs(that: NodeMetrics): Boolean = address == that.address + + override def hashCode = address.## + override def equals(obj: Any) = obj match { + case other: NodeMetrics ⇒ sameAs(other) + case _ ⇒ false + } + } /** diff --git a/akka-cluster/src/test/scala/akka/cluster/MetricNumericConverterSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricNumericConverterSpec.scala index 58e157d12e..f572b13233 100644 --- a/akka-cluster/src/test/scala/akka/cluster/MetricNumericConverterSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/MetricNumericConverterSpec.scala @@ -4,16 +4,15 @@ package akka.cluster -import akka.testkit.{ ImplicitSender, AkkaSpec } +import org.scalatest.WordSpec +import org.scalatest.matchers.MustMatchers import akka.cluster.StandardMetrics._ import scala.util.Failure @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class MetricNumericConverterSpec extends AkkaSpec(MetricsEnabledSpec.config) with MetricNumericConverter with ImplicitSender - with MetricsCollectorFactory { +class MetricNumericConverterSpec extends WordSpec with MustMatchers with MetricNumericConverter { "MetricNumericConverter" must { - val collector = createMetricsCollector "convert" in { convertNumber(0).isLeft must be(true) diff --git a/akka-cluster/src/test/scala/akka/cluster/MetricsGossipSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MetricsGossipSpec.scala index 36470a4725..6d54a69bc2 100644 --- a/akka-cluster/src/test/scala/akka/cluster/MetricsGossipSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/MetricsGossipSpec.scala @@ -17,7 +17,7 @@ class MetricsGossipSpec extends AkkaSpec(MetricsEnabledSpec.config) with Implici val collector = createMetricsCollector "A MetricsGossip" must { - "add and initialize new NodeMetrics" in { + "add new NodeMetrics" in { val m1 = NodeMetrics(Address("akka", "sys", "a", 2554), newTimestamp, collector.sample.metrics) val m2 = NodeMetrics(Address("akka", "sys", "a", 2555), newTimestamp, collector.sample.metrics) @@ -26,14 +26,12 @@ class MetricsGossipSpec extends AkkaSpec(MetricsEnabledSpec.config) with Implici val g1 = MetricsGossip.empty :+ m1 g1.nodes.size must be(1) - g1.nodeKeys.size must be(g1.nodes.size) - g1.metricsFor(m1.address).size must be(m1.metrics.size) + g1.nodeMetricsFor(m1.address).map(_.metrics) must be(Some(m1.metrics)) val g2 = g1 :+ m2 g2.nodes.size must be(2) - g2.nodeKeys.size must be(g2.nodes.size) - g2.metricsFor(m1.address).size must be(m1.metrics.size) - g2.metricsFor(m2.address).size must be(m2.metrics.size) + g2.nodeMetricsFor(m1.address).map(_.metrics) must be(Some(m1.metrics)) + g2.nodeMetricsFor(m2.address).map(_.metrics) must be(Some(m2.metrics)) } "merge peer metrics" in { @@ -47,8 +45,8 @@ class MetricsGossipSpec extends AkkaSpec(MetricsEnabledSpec.config) with Implici val m2Updated = m2 copy (metrics = collector.sample.metrics, timestamp = m2.timestamp + 1000) val g2 = g1 :+ m2Updated // merge peers g2.nodes.size must be(2) - g2.metricsFor(m1.address).size must be(m1.metrics.size) - g2.metricsFor(m2.address).size must be(m2Updated.metrics.size) + g2.nodeMetricsFor(m1.address).map(_.metrics) must be(Some(m1.metrics)) + g2.nodeMetricsFor(m2.address).map(_.metrics) must be(Some(m2Updated.metrics)) g2.nodes collect { case peer if peer.address == m2.address ⇒ peer.timestamp must be(m2Updated.timestamp) } } @@ -61,23 +59,22 @@ class MetricsGossipSpec extends AkkaSpec(MetricsEnabledSpec.config) with Implici val g1 = MetricsGossip.empty :+ m1 :+ m2 val g2 = MetricsGossip.empty :+ m3 :+ m2Updated - g1.nodeKeys.contains(m1.address) must be(true) - g2.nodeKeys.contains(m3.address) must be(true) + g1.nodes.map(_.address) must be(Set(m1.address, m2.address)) // must contain nodes 1,3, and the most recent version of 2 val mergedGossip = g1 merge g2 - mergedGossip.nodes.size must be(3) - mergedGossip.metricsFor(m1.address).size must be(m1.metrics.size) - mergedGossip.metricsFor(m2.address).size must be(m2Updated.metrics.size) - mergedGossip.metricsFor(m3.address).size must be(m3.metrics.size) + mergedGossip.nodes.map(_.address) must be(Set(m1.address, m2.address, m3.address)) + mergedGossip.nodeMetricsFor(m1.address).map(_.metrics) must be(Some(m1.metrics)) + mergedGossip.nodeMetricsFor(m2.address).map(_.metrics) must be(Some(m2Updated.metrics)) + mergedGossip.nodeMetricsFor(m3.address).map(_.metrics) must be(Some(m3.metrics)) mergedGossip.nodes.foreach(_.metrics.size must be > (3)) - mergedGossip.nodes.find(_.address == m2.address).get.timestamp must be(m2Updated.timestamp) + mergedGossip.nodeMetricsFor(m2.address).map(_.timestamp) must be(Some(m2Updated.timestamp)) } "get the current NodeMetrics if it exists in the local nodes" in { val m1 = NodeMetrics(Address("akka", "sys", "a", 2554), newTimestamp, collector.sample.metrics) val g1 = MetricsGossip.empty :+ m1 - g1.metricsFor(m1.address).nonEmpty must be(true) + g1.nodeMetricsFor(m1.address).map(_.metrics) must be(Some(m1.metrics)) } "remove a node if it is no longer Up" in { @@ -89,8 +86,21 @@ class MetricsGossipSpec extends AkkaSpec(MetricsEnabledSpec.config) with Implici val g2 = g1 remove m1.address g2.nodes.size must be(1) g2.nodes.exists(_.address == m1.address) must be(false) - g2.metricsFor(m1.address).size must be(0) - g2.metricsFor(m2.address).size must be(m2.metrics.size) + g2.nodeMetricsFor(m1.address) must be(None) + g2.nodeMetricsFor(m2.address).map(_.metrics) must be(Some(m2.metrics)) + } + + "filter nodes" in { + val m1 = NodeMetrics(Address("akka", "sys", "a", 2554), newTimestamp, collector.sample.metrics) + val m2 = NodeMetrics(Address("akka", "sys", "a", 2555), newTimestamp, collector.sample.metrics) + + val g1 = MetricsGossip.empty :+ m1 :+ m2 + g1.nodes.size must be(2) + val g2 = g1 filter Set(m2.address) + g2.nodes.size must be(1) + g2.nodes.exists(_.address == m1.address) must be(false) + g2.nodeMetricsFor(m1.address) must be(None) + g2.nodeMetricsFor(m2.address).map(_.metrics) must be(Some(m2.metrics)) } } } diff --git a/akka-cluster/src/test/scala/akka/cluster/NodeMetricsSpec.scala b/akka-cluster/src/test/scala/akka/cluster/NodeMetricsSpec.scala index 2c62bc5a41..7e80a04d64 100644 --- a/akka-cluster/src/test/scala/akka/cluster/NodeMetricsSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/NodeMetricsSpec.scala @@ -4,26 +4,17 @@ package akka.cluster -import akka.testkit.AkkaSpec +import org.scalatest.WordSpec +import org.scalatest.matchers.MustMatchers import akka.actor.Address @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class NodeMetricsSpec extends AkkaSpec with MetricsCollectorFactory { - - val collector = createMetricsCollector +class NodeMetricsSpec extends WordSpec with MustMatchers { val node1 = Address("akka", "sys", "a", 2554) - val node2 = Address("akka", "sys", "a", 2555) "NodeMetrics must" must { - "recognize updatable nodes" in { - (NodeMetrics(node1, 0) updatable NodeMetrics(node1, 1)) must be(true) - } - - "recognize non-updatable nodes" in { - (NodeMetrics(node1, 1) updatable NodeMetrics(node2, 0)) must be(false) - } "return correct result for 2 'same' nodes" in { (NodeMetrics(node1, 0) sameAs NodeMetrics(node1, 0)) must be(true) @@ -34,21 +25,23 @@ class NodeMetricsSpec extends AkkaSpec with MetricsCollectorFactory { } "merge 2 NodeMetrics by most recent" in { - val sample1 = NodeMetrics(node1, 1, collector.sample.metrics) - val sample2 = NodeMetrics(node1, 2, collector.sample.metrics) + val sample1 = NodeMetrics(node1, 1, Set(Metric.create("a", 10, None), Metric.create("b", 20, None)).flatten) + val sample2 = NodeMetrics(node1, 2, Set(Metric.create("a", 11, None), Metric.create("c", 30, None)).flatten) val merged = sample1 merge sample2 merged.timestamp must be(sample2.timestamp) - merged.metrics must be(sample2.metrics) + merged.metric("a").map(_.value) must be(Some(11)) + merged.metric("b").map(_.value) must be(Some(20)) + merged.metric("c").map(_.value) must be(Some(30)) } "not merge 2 NodeMetrics if master is more recent" in { - val sample1 = NodeMetrics(node1, 1, collector.sample.metrics) - val sample2 = NodeMetrics(node2, 0, sample1.metrics) + val sample1 = NodeMetrics(node1, 1, Set(Metric.create("a", 10, None), Metric.create("b", 20, None)).flatten) + val sample2 = NodeMetrics(node1, 0, Set(Metric.create("a", 11, None), Metric.create("c", 30, None)).flatten) - val merged = sample2 merge sample2 // older and not same - merged.timestamp must be(sample2.timestamp) - merged.metrics must be(sample2.metrics) + val merged = sample1 merge sample2 // older and not same + merged.timestamp must be(sample1.timestamp) + merged.metrics must be(sample1.metrics) } } } From a5778cbc709c06e2f7f0ea95c400f909277942fa Mon Sep 17 00:00:00 2001 From: Rich Dougherty Date: Fri, 23 Nov 2012 15:16:10 +0800 Subject: [PATCH 172/210] Updated instructions for Sphinx install on Mac OS. Fixes #2735 * Updated dir name for texlive install * Removed unneeded instructions for symlinking pygments style --- akka-docs/rst/dev/documentation.rst | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/akka-docs/rst/dev/documentation.rst b/akka-docs/rst/dev/documentation.rst index a9a87f013e..b990a6bbf3 100644 --- a/akka-docs/rst/dev/documentation.rst +++ b/akka-docs/rst/dev/documentation.rst @@ -127,7 +127,7 @@ Add texlive bin to $PATH: :: - /usr/local/texlive/2010basic/bin/universal-darwin + /usr/local/texlive/2012basic/bin/universal-darwin Add missing tex packages: @@ -140,10 +140,3 @@ Add missing tex packages: sudo tlmgr install wrapfig sudo tlmgr install helvetic sudo tlmgr install courier - -Link the akka pygments style: - -:: - - cd /usr/local/Cellar/python/2.7.1/lib/python2.7/site-packages/pygments/styles - ln -s /path/to/akka/akka-docs/themes/akka/pygments/akka.py akka.py From 486278726b2f3399139118d10110877f29b2f8ae Mon Sep 17 00:00:00 2001 From: Raymond Roestenburg Date: Sat, 24 Nov 2012 18:08:34 +0100 Subject: [PATCH 173/210] ticket #2739 fix. Also removed author tags since that's so 1990's --- .../camel/ActorNotRegisteredException.scala | 1 - .../main/scala/akka/camel/CamelMessage.scala | 4 +- .../src/main/scala/akka/camel/Consumer.scala | 2 +- .../src/main/scala/akka/camel/Producer.scala | 8 +- .../camel/internal/ActivationTracker.scala | 16 ++- .../camel/internal/CamelExchangeAdapter.scala | 2 +- .../akka/camel/internal/CamelSupervisor.scala | 4 +- .../internal/ConsumerActorRouteBuilder.scala | 2 +- .../internal/component/ActorComponent.scala | 6 +- .../camel/javaapi/UntypedProducerActor.scala | 2 +- .../java/akka/camel/ConsumerJavaTestBase.java | 2 +- .../java/akka/camel/MessageJavaTestBase.java | 2 +- .../camel/SampleErrorHandlingConsumer.java | 2 +- .../akka/camel/SampleUntypedConsumer.java | 2 +- .../SampleUntypedForwardingProducer.java | 2 +- .../camel/SampleUntypedReplyingProducer.java | 2 +- .../akka/camel/ConsumerIntegrationTest.scala | 2 +- .../akka/camel/ProducerFeatureTest.scala | 121 ++++++++++++------ .../internal/ActivationTrackerTest.scala | 8 ++ 19 files changed, 118 insertions(+), 72 deletions(-) diff --git a/akka-camel/src/main/scala/akka/camel/ActorNotRegisteredException.scala b/akka-camel/src/main/scala/akka/camel/ActorNotRegisteredException.scala index 7a303e47b3..29889d8bf6 100644 --- a/akka-camel/src/main/scala/akka/camel/ActorNotRegisteredException.scala +++ b/akka-camel/src/main/scala/akka/camel/ActorNotRegisteredException.scala @@ -3,7 +3,6 @@ package akka.camel * Thrown to indicate that the actor referenced by an endpoint URI cannot be * found in the actor system. * - * @author Martin Krasser */ class ActorNotRegisteredException(uri: String) extends RuntimeException { override def getMessage: String = "Actor [%s] doesn't exist" format uri diff --git a/akka-camel/src/main/scala/akka/camel/CamelMessage.scala b/akka-camel/src/main/scala/akka/camel/CamelMessage.scala index 70fd61bd2a..c569ae0997 100644 --- a/akka-camel/src/main/scala/akka/camel/CamelMessage.scala +++ b/akka-camel/src/main/scala/akka/camel/CamelMessage.scala @@ -14,7 +14,6 @@ import akka.dispatch.Mapper /** * An immutable representation of a Camel message. - * @author Martin Krasser */ case class CamelMessage(body: Any, headers: Map[String, Any]) { def this(body: Any, headers: JMap[String, Any]) = this(body, headers.toMap) //for Java @@ -138,7 +137,6 @@ case class CamelMessage(body: Any, headers: Map[String, Any]) { /** * Companion object of CamelMessage class. * - * @author Martin Krasser */ object CamelMessage { @@ -182,7 +180,7 @@ object CamelMessage { /** * Positive acknowledgement message (used for application-acknowledged message receipts). * When `autoAck` is set to false in the [[akka.camel.Consumer]], you can send an `Ack` to the sender of the CamelMessage. - * @author Martin Krasser + * */ case object Ack { /** Java API to get the Ack singleton */ diff --git a/akka-camel/src/main/scala/akka/camel/Consumer.scala b/akka-camel/src/main/scala/akka/camel/Consumer.scala index 2915235745..19ddc85b59 100644 --- a/akka-camel/src/main/scala/akka/camel/Consumer.scala +++ b/akka-camel/src/main/scala/akka/camel/Consumer.scala @@ -13,7 +13,7 @@ import akka.dispatch.Mapper /** * Mixed in by Actor implementations that consume message from Camel endpoints. * - * @author Martin Krasser + * */ trait Consumer extends Actor with CamelSupport { import Consumer._ diff --git a/akka-camel/src/main/scala/akka/camel/Producer.scala b/akka-camel/src/main/scala/akka/camel/Producer.scala index 683ff4f20f..017304ea4d 100644 --- a/akka-camel/src/main/scala/akka/camel/Producer.scala +++ b/akka-camel/src/main/scala/akka/camel/Producer.scala @@ -13,8 +13,6 @@ import org.apache.camel.processor.SendProcessor /** * Support trait for producing messages to Camel endpoints. - * - * @author Martin Krasser */ trait ProducerSupport extends Actor with CamelSupport { private[this] var messages = Map[ActorRef, Any]() @@ -160,20 +158,20 @@ trait Producer extends ProducerSupport { this: Actor ⇒ /** * For internal use only. - * @author Martin Krasser + * */ private case class MessageResult(message: CamelMessage) extends NoSerializationVerificationNeeded /** * For internal use only. - * @author Martin Krasser + * */ private case class FailureResult(cause: Throwable, headers: Map[String, Any] = Map.empty) extends NoSerializationVerificationNeeded /** * A one-way producer. * - * @author Martin Krasser + * */ trait Oneway extends Producer { this: Actor ⇒ override def oneway: Boolean = true diff --git a/akka-camel/src/main/scala/akka/camel/internal/ActivationTracker.scala b/akka-camel/src/main/scala/akka/camel/internal/ActivationTracker.scala index 43ca2701c6..9beb6a8894 100644 --- a/akka-camel/src/main/scala/akka/camel/internal/ActivationTracker.scala +++ b/akka-camel/src/main/scala/akka/camel/internal/ActivationTracker.scala @@ -6,15 +6,14 @@ package akka.camel.internal import akka.actor._ import collection.mutable.WeakHashMap -import akka.camel._ -import internal.ActivationProtocol._ +import akka.camel.internal.ActivationProtocol._ /** * For internal use only. An actor that tracks activation and de-activation of endpoints. */ -private[akka] final class ActivationTracker extends Actor with ActorLogging { - val activations = new WeakHashMap[ActorRef, ActivationStateMachine] +private[camel] class ActivationTracker extends Actor with ActorLogging { + val activations = new WeakHashMap[ActorRef, ActivationStateMachine] /** * A state machine that keeps track of the endpoint activation status of an actor. */ @@ -22,7 +21,6 @@ private[akka] final class ActivationTracker extends Actor with ActorLogging { type State = PartialFunction[ActivationMessage, Unit] var receive: State = notActivated() - /** * Not activated state * @return a partial function that handles messages in the 'not activated' state @@ -68,8 +66,12 @@ private[akka] final class ActivationTracker extends Actor with ActorLogging { * @return a partial function that handles messages in the 'de-activated' state */ def deactivated: State = { + // deactivated means it was activated at some point, so tell sender it was activated case AwaitActivation(ref) ⇒ sender ! EndpointActivated(ref) case AwaitDeActivation(ref) ⇒ sender ! EndpointDeActivated(ref) + //resurrected at restart. + case msg @ EndpointActivated(ref) ⇒ + receive = activated(Nil) } /** @@ -80,6 +82,7 @@ private[akka] final class ActivationTracker extends Actor with ActorLogging { def failedToActivate(cause: Throwable): State = { case AwaitActivation(ref) ⇒ sender ! EndpointFailedToActivate(ref, cause) case AwaitDeActivation(ref) ⇒ sender ! EndpointFailedToActivate(ref, cause) + case EndpointDeActivated(_) ⇒ // the de-register at termination always sends a de-activated when the cleanup is done. ignoring. } /** @@ -90,6 +93,7 @@ private[akka] final class ActivationTracker extends Actor with ActorLogging { def failedToDeActivate(cause: Throwable): State = { case AwaitActivation(ref) ⇒ sender ! EndpointActivated(ref) case AwaitDeActivation(ref) ⇒ sender ! EndpointFailedToDeActivate(ref, cause) + case EndpointDeActivated(_) ⇒ // the de-register at termination always sends a de-activated when the cleanup is done. ignoring. } } @@ -114,4 +118,4 @@ private[camel] case class AwaitActivation(ref: ActorRef) extends ActivationMessa * For internal use only. * @param ref the actorRef */ -private[camel] case class AwaitDeActivation(ref: ActorRef) extends ActivationMessage(ref) \ No newline at end of file +private[camel] case class AwaitDeActivation(ref: ActorRef) extends ActivationMessage(ref) diff --git a/akka-camel/src/main/scala/akka/camel/internal/CamelExchangeAdapter.scala b/akka-camel/src/main/scala/akka/camel/internal/CamelExchangeAdapter.scala index 1d16c3003e..b6a991d4d5 100644 --- a/akka-camel/src/main/scala/akka/camel/internal/CamelExchangeAdapter.scala +++ b/akka-camel/src/main/scala/akka/camel/internal/CamelExchangeAdapter.scala @@ -11,7 +11,7 @@ import akka.camel.{ FailureResult, AkkaCamelException, CamelMessage } * This adapter is used to convert to immutable messages to be used with Actors, and convert the immutable messages back * to org.apache.camel.Message when using Camel. * - * @author Martin Krasser + * */ private[camel] class CamelExchangeAdapter(val exchange: Exchange) { /** diff --git a/akka-camel/src/main/scala/akka/camel/internal/CamelSupervisor.scala b/akka-camel/src/main/scala/akka/camel/internal/CamelSupervisor.scala index b19bdbc0a2..bbad41e02f 100644 --- a/akka-camel/src/main/scala/akka/camel/internal/CamelSupervisor.scala +++ b/akka-camel/src/main/scala/akka/camel/internal/CamelSupervisor.scala @@ -115,9 +115,9 @@ private[camel] class Registry(activationTracker: ActorRef) extends Actor with Ca case msg @ Register(producer, _, None) ⇒ if (!producers(producer)) { producers += producer - producerRegistrar forward msg parent ! AddWatch(producer) } + producerRegistrar forward msg case DeRegister(actorRef) ⇒ producers.find(_ == actorRef).foreach { p ⇒ deRegisterProducer(p) @@ -155,6 +155,8 @@ private[camel] class ProducerRegistrar(activationTracker: ActorRef) extends Acto } catch { case NonFatal(e) ⇒ throw new ActorActivationException(producer, e) } + } else { + camelObjects.get(producer).foreach { case (endpoint, processor) ⇒ producer ! CamelProducerObjects(endpoint, processor) } } case DeRegister(producer) ⇒ camelObjects.get(producer).foreach { diff --git a/akka-camel/src/main/scala/akka/camel/internal/ConsumerActorRouteBuilder.scala b/akka-camel/src/main/scala/akka/camel/internal/ConsumerActorRouteBuilder.scala index 2caf952c6a..a27c23ec2f 100644 --- a/akka-camel/src/main/scala/akka/camel/internal/ConsumerActorRouteBuilder.scala +++ b/akka-camel/src/main/scala/akka/camel/internal/ConsumerActorRouteBuilder.scala @@ -16,7 +16,7 @@ import org.apache.camel.model.RouteDefinition * * @param endpointUri endpoint URI of the consumer actor. * - * @author Martin Krasser + * */ private[camel] class ConsumerActorRouteBuilder(endpointUri: String, consumer: ActorRef, config: ConsumerConfig, settings: CamelSettings) extends RouteBuilder { diff --git a/akka-camel/src/main/scala/akka/camel/internal/component/ActorComponent.scala b/akka-camel/src/main/scala/akka/camel/internal/component/ActorComponent.scala index 7400de9810..2585b970c9 100644 --- a/akka-camel/src/main/scala/akka/camel/internal/component/ActorComponent.scala +++ b/akka-camel/src/main/scala/akka/camel/internal/component/ActorComponent.scala @@ -31,7 +31,7 @@ import scala.util.{ Failure, Success, Try } * Messages are sent to [[akka.camel.Consumer]] actors through a [[akka.camel.internal.component.ActorEndpoint]] that * this component provides. * - * @author Martin Krasser + * */ private[camel] class ActorComponent(camel: Camel, system: ActorSystem) extends DefaultComponent { /** @@ -52,7 +52,7 @@ private[camel] class ActorComponent(camel: Camel, system: ActorSystem) extends D * [actorPath]?[options]%s, * where [actorPath] refers to the actor path to the actor. * - * @author Martin Krasser + * */ private[camel] class ActorEndpoint(uri: String, comp: ActorComponent, @@ -104,7 +104,7 @@ private[camel] trait ActorEndpointConfig { * @see akka.camel.component.ActorComponent * @see akka.camel.component.ActorEndpoint * - * @author Martin Krasser + * */ private[camel] class ActorProducer(val endpoint: ActorEndpoint, camel: Camel) extends DefaultProducer(endpoint) with AsyncProcessor { /** diff --git a/akka-camel/src/main/scala/akka/camel/javaapi/UntypedProducerActor.scala b/akka-camel/src/main/scala/akka/camel/javaapi/UntypedProducerActor.scala index cd353e04a0..7688df5130 100644 --- a/akka-camel/src/main/scala/akka/camel/javaapi/UntypedProducerActor.scala +++ b/akka-camel/src/main/scala/akka/camel/javaapi/UntypedProducerActor.scala @@ -12,7 +12,7 @@ import org.apache.camel.impl.DefaultCamelContext /** * Subclass this abstract class to create an untyped producer actor. This class is meant to be used from Java. * - * @author Martin Krasser + * */ abstract class UntypedProducerActor extends UntypedActor with ProducerSupport { /** diff --git a/akka-camel/src/test/java/akka/camel/ConsumerJavaTestBase.java b/akka-camel/src/test/java/akka/camel/ConsumerJavaTestBase.java index e8b178a463..d8aec8a761 100644 --- a/akka-camel/src/test/java/akka/camel/ConsumerJavaTestBase.java +++ b/akka-camel/src/test/java/akka/camel/ConsumerJavaTestBase.java @@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit; import akka.testkit.AkkaSpec; import static org.junit.Assert.*; /** - * @author Martin Krasser + * */ public class ConsumerJavaTestBase { diff --git a/akka-camel/src/test/java/akka/camel/MessageJavaTestBase.java b/akka-camel/src/test/java/akka/camel/MessageJavaTestBase.java index 95cdc5007b..6b366b0a10 100644 --- a/akka-camel/src/test/java/akka/camel/MessageJavaTestBase.java +++ b/akka-camel/src/test/java/akka/camel/MessageJavaTestBase.java @@ -18,7 +18,7 @@ import java.util.*; import static org.junit.Assert.assertEquals; /** - * @author Martin Krasser + * */ public class MessageJavaTestBase { static Camel camel; diff --git a/akka-camel/src/test/java/akka/camel/SampleErrorHandlingConsumer.java b/akka-camel/src/test/java/akka/camel/SampleErrorHandlingConsumer.java index e8a057e1ac..92fb124a11 100644 --- a/akka-camel/src/test/java/akka/camel/SampleErrorHandlingConsumer.java +++ b/akka-camel/src/test/java/akka/camel/SampleErrorHandlingConsumer.java @@ -15,7 +15,7 @@ import scala.Option; import scala.concurrent.duration.FiniteDuration; /** - * @author Martin Krasser + * */ public class SampleErrorHandlingConsumer extends UntypedConsumerActor { private static Mapper> mapper = new Mapper>() { diff --git a/akka-camel/src/test/java/akka/camel/SampleUntypedConsumer.java b/akka-camel/src/test/java/akka/camel/SampleUntypedConsumer.java index be293c21b9..030c951cc9 100644 --- a/akka-camel/src/test/java/akka/camel/SampleUntypedConsumer.java +++ b/akka-camel/src/test/java/akka/camel/SampleUntypedConsumer.java @@ -7,7 +7,7 @@ package akka.camel; import akka.camel.javaapi.UntypedConsumerActor; /** - * @author Martin Krasser + * */ public class SampleUntypedConsumer extends UntypedConsumerActor { diff --git a/akka-camel/src/test/java/akka/camel/SampleUntypedForwardingProducer.java b/akka-camel/src/test/java/akka/camel/SampleUntypedForwardingProducer.java index 375ef36835..b99a7ecc31 100644 --- a/akka-camel/src/test/java/akka/camel/SampleUntypedForwardingProducer.java +++ b/akka-camel/src/test/java/akka/camel/SampleUntypedForwardingProducer.java @@ -6,7 +6,7 @@ package akka.camel; import akka.camel.javaapi.UntypedProducerActor; /** - * @author Martin Krasser + * */ public class SampleUntypedForwardingProducer extends UntypedProducerActor { diff --git a/akka-camel/src/test/java/akka/camel/SampleUntypedReplyingProducer.java b/akka-camel/src/test/java/akka/camel/SampleUntypedReplyingProducer.java index 039494fd00..c47187d1da 100644 --- a/akka-camel/src/test/java/akka/camel/SampleUntypedReplyingProducer.java +++ b/akka-camel/src/test/java/akka/camel/SampleUntypedReplyingProducer.java @@ -7,7 +7,7 @@ package akka.camel; import akka.camel.javaapi.UntypedProducerActor; /** - * @author Martin Krasser + * */ public class SampleUntypedReplyingProducer extends UntypedProducerActor { diff --git a/akka-camel/src/test/scala/akka/camel/ConsumerIntegrationTest.scala b/akka-camel/src/test/scala/akka/camel/ConsumerIntegrationTest.scala index acc72ff9b1..6462e0b191 100644 --- a/akka-camel/src/test/scala/akka/camel/ConsumerIntegrationTest.scala +++ b/akka-camel/src/test/scala/akka/camel/ConsumerIntegrationTest.scala @@ -30,7 +30,7 @@ class ConsumerIntegrationTest extends WordSpec with MustMatchers with NonSharedC "Consumer must throw FailedToCreateRouteException, while awaiting activation, if endpoint is invalid" in { filterEvents(EventFilter[ActorActivationException](occurrences = 1)) { - val actorRef = system.actorOf(Props(new TestActor(uri = "some invalid uri"))) + val actorRef = system.actorOf(Props(new TestActor(uri = "some invalid uri")), "invalidActor") intercept[FailedToCreateRouteException] { Await.result(camel.activationFutureFor(actorRef), defaultTimeoutDuration) } diff --git a/akka-camel/src/test/scala/akka/camel/ProducerFeatureTest.scala b/akka-camel/src/test/scala/akka/camel/ProducerFeatureTest.scala index 7cf9e92464..07a46781c8 100644 --- a/akka-camel/src/test/scala/akka/camel/ProducerFeatureTest.scala +++ b/akka-camel/src/test/scala/akka/camel/ProducerFeatureTest.scala @@ -19,13 +19,20 @@ import scala.concurrent.duration._ import akka.util.Timeout import org.scalatest.matchers.MustMatchers import akka.testkit._ +import akka.actor.Status.Failure /** * Tests the features of the Camel Producer. */ -class ProducerFeatureTest extends WordSpec with BeforeAndAfterAll with BeforeAndAfterEach with SharedCamelSystem with MustMatchers { +class ProducerFeatureTest extends TestKit(ActorSystem("test", AkkaSpec.testConf)) with WordSpec with BeforeAndAfterAll with BeforeAndAfterEach with MustMatchers { import ProducerFeatureTest._ + implicit def camel = CamelExtension(system) + + override protected def afterAll() { + super.afterAll() + system.shutdown() + } val camelContext = camel.context // to make testing equality of messages easier, otherwise the breadcrumb shows up in the result. @@ -40,9 +47,8 @@ class ProducerFeatureTest extends WordSpec with BeforeAndAfterAll with BeforeAnd "produce a message and receive normal response" in { val producer = system.actorOf(Props(new TestProducer("direct:producer-test-2", true)), name = "direct-producer-2") val message = CamelMessage("test", Map(CamelMessage.MessageExchangeId -> "123")) - val future = producer.ask(message)(timeoutDuration) - val expected = CamelMessage("received TEST", Map(CamelMessage.MessageExchangeId -> "123")) - Await.result(future, timeoutDuration) must be === expected + producer.tell(message, testActor) + expectMsg(CamelMessage("received TEST", Map(CamelMessage.MessageExchangeId -> "123"))) stopGracefully(producer) } @@ -65,12 +71,17 @@ class ProducerFeatureTest extends WordSpec with BeforeAndAfterAll with BeforeAnd case _: AkkaCamelException ⇒ Stop } }), name = "prod-anonymous-supervisor") - val producer = Await.result[ActorRef](supervisor.ask(Props(new TestProducer("direct:producer-test-2"))).mapTo[ActorRef], timeoutDuration) + + supervisor.tell(Props(new TestProducer("direct:producer-test-2")), testActor) + val producer = receiveOne(timeoutDuration).asInstanceOf[ActorRef] val message = CamelMessage("fail", Map(CamelMessage.MessageExchangeId -> "123")) filterEvents(EventFilter[AkkaCamelException](occurrences = 1)) { - val e = intercept[AkkaCamelException] { Await.result(producer.ask(message)(timeoutDuration), timeoutDuration) } - e.getMessage must be("failure") - e.headers must be(Map(CamelMessage.MessageExchangeId -> "123")) + producer.tell(message, testActor) + expectMsgPF(timeoutDuration) { + case Failure(e: AkkaCamelException) ⇒ + e.getMessage must be("failure") + e.headers must be(Map(CamelMessage.MessageExchangeId -> "123")) + } } Await.ready(latch, timeoutDuration) deadActor must be(Some(producer)) @@ -101,15 +112,8 @@ class ProducerFeatureTest extends WordSpec with BeforeAndAfterAll with BeforeAnd "produce message to direct:producer-test-3 and receive normal response" in { val producer = system.actorOf(Props(new TestProducer("direct:producer-test-3")), name = "direct-producer-test-3") val message = CamelMessage("test", Map(CamelMessage.MessageExchangeId -> "123")) - val future = producer.ask(message)(timeoutDuration) - - Await.result(future, timeoutDuration) match { - case result: CamelMessage ⇒ - // a normal response must have been returned by the producer - val expected = CamelMessage("received test", Map(CamelMessage.MessageExchangeId -> "123")) - result must be(expected) - case unexpected ⇒ fail("Actor responded with unexpected message:" + unexpected) - } + producer.tell(message, testActor) + expectMsg(CamelMessage("received test", Map(CamelMessage.MessageExchangeId -> "123"))) stopGracefully(producer) } @@ -118,9 +122,12 @@ class ProducerFeatureTest extends WordSpec with BeforeAndAfterAll with BeforeAnd val message = CamelMessage("fail", Map(CamelMessage.MessageExchangeId -> "123")) filterEvents(EventFilter[AkkaCamelException](occurrences = 1)) { - val e = intercept[AkkaCamelException] { Await.result(producer.ask(message)(timeoutDuration), timeoutDuration) } - e.getMessage must be("failure") - e.headers must be(Map(CamelMessage.MessageExchangeId -> "123")) + producer.tell(message, testActor) + expectMsgPF(timeoutDuration) { + case Failure(e: AkkaCamelException) ⇒ + e.getMessage must be("failure") + e.headers must be(Map(CamelMessage.MessageExchangeId -> "123")) + } } stopGracefully(producer) } @@ -129,15 +136,8 @@ class ProducerFeatureTest extends WordSpec with BeforeAndAfterAll with BeforeAnd val target = system.actorOf(Props[ReplyingForwardTarget], name = "reply-forwarding-target") val producer = system.actorOf(Props(new TestForwarder("direct:producer-test-2", target)), name = "direct-producer-test-2-forwarder") val message = CamelMessage("test", Map(CamelMessage.MessageExchangeId -> "123")) - val future = producer.ask(message)(timeoutDuration) - - Await.result(future, timeoutDuration) match { - case result: CamelMessage ⇒ - // a normal response must have been returned by the forward target - val expected = CamelMessage("received test", Map(CamelMessage.MessageExchangeId -> "123", "test" -> "result")) - result must be(expected) - case unexpected ⇒ fail("Actor responded with unexpected message:" + unexpected) - } + producer.tell(message, testActor) + expectMsg(CamelMessage("received test", Map(CamelMessage.MessageExchangeId -> "123", "test" -> "result"))) stopGracefully(target, producer) } @@ -147,9 +147,12 @@ class ProducerFeatureTest extends WordSpec with BeforeAndAfterAll with BeforeAnd val message = CamelMessage("fail", Map(CamelMessage.MessageExchangeId -> "123")) filterEvents(EventFilter[AkkaCamelException](occurrences = 1)) { - val e = intercept[AkkaCamelException] { Await.result(producer.ask(message)(timeoutDuration), timeoutDuration) } - e.getMessage must be("failure") - e.headers must be(Map(CamelMessage.MessageExchangeId -> "123", "test" -> "failure")) + producer.tell(message, testActor) + expectMsgPF(timeoutDuration) { + case Failure(e: AkkaCamelException) ⇒ + e.getMessage must be("failure") + e.headers must be(Map(CamelMessage.MessageExchangeId -> "123", "test" -> "failure")) + } } stopGracefully(target, producer) } @@ -180,13 +183,8 @@ class ProducerFeatureTest extends WordSpec with BeforeAndAfterAll with BeforeAnd val producer = system.actorOf(Props(new TestForwarder("direct:producer-test-3", target)), name = "direct-producer-test-3-to-replying-actor") val message = CamelMessage("test", Map(CamelMessage.MessageExchangeId -> "123")) - val future = producer.ask(message)(timeoutDuration) - Await.result(future, timeoutDuration) match { - case message: CamelMessage ⇒ - val expected = CamelMessage("received test", Map(CamelMessage.MessageExchangeId -> "123", "test" -> "result")) - message must be(expected) - case unexpected ⇒ fail("Actor responded with unexpected message:" + unexpected) - } + producer.tell(message, testActor) + expectMsg(CamelMessage("received test", Map(CamelMessage.MessageExchangeId -> "123", "test" -> "result"))) stopGracefully(target, producer) } @@ -196,9 +194,12 @@ class ProducerFeatureTest extends WordSpec with BeforeAndAfterAll with BeforeAnd val message = CamelMessage("fail", Map(CamelMessage.MessageExchangeId -> "123")) filterEvents(EventFilter[AkkaCamelException](occurrences = 1)) { - val e = intercept[AkkaCamelException] { Await.result(producer.ask(message)(timeoutDuration), timeoutDuration) } - e.getMessage must be("failure") - e.headers must be(Map(CamelMessage.MessageExchangeId -> "123", "test" -> "failure")) + producer.tell(message, testActor) + expectMsgPF(timeoutDuration) { + case Failure(e: AkkaCamelException) ⇒ + e.getMessage must be("failure") + e.headers must be(Map(CamelMessage.MessageExchangeId -> "123", "test" -> "failure")) + } } stopGracefully(target, producer) } @@ -224,6 +225,23 @@ class ProducerFeatureTest extends WordSpec with BeforeAndAfterAll with BeforeAnd } stopGracefully(target, producer) } + + "keep producing messages after error" in { + import TestSupport._ + val consumer = start(new IntermittentErrorConsumer("direct:intermittentTest-1"), "intermittentTest-error-consumer") + val producer = start(new SimpleProducer("direct:intermittentTest-1"), "intermittentTest-producer") + filterEvents(EventFilter[AkkaCamelException](occurrences = 1)) { + val futureFailed = producer.tell("fail", testActor) + expectMsgPF(timeoutDuration) { + case Failure(e) ⇒ + e.getMessage must be("fail") + } + producer.tell("OK", testActor) + expectMsg("OK") + } + stop(consumer) + stop(producer) + } } private def mockEndpoint = camel.context.getEndpoint("mock:mock", classOf[MockEndpoint]) @@ -239,6 +257,11 @@ object ProducerFeatureTest { class TestProducer(uri: String, upper: Boolean = false) extends Actor with Producer { def endpointUri = uri + override def preRestart(reason: Throwable, message: Option[Any]) { + //overriding on purpose so it doesn't try to deRegister and reRegister at restart, + // which would cause a deadletter message in the test output. + } + override protected def transformOutgoingMessage(msg: Any) = msg match { case msg: CamelMessage ⇒ if (upper) msg.mapBody { body: String ⇒ body.toUpperCase @@ -303,4 +326,18 @@ object ProducerFeatureTest { } } + class SimpleProducer(override val endpointUri: String) extends Producer { + override protected def transformResponse(msg: Any) = msg match { + case m: CamelMessage ⇒ m.bodyAs[String] + case m: Any ⇒ m + } + } + + class IntermittentErrorConsumer(override val endpointUri: String) extends Consumer { + def receive = { + case msg: CamelMessage if msg.bodyAs[String] == "fail" ⇒ sender ! Failure(new Exception("fail")) + case msg: CamelMessage ⇒ sender ! msg + } + } + } diff --git a/akka-camel/src/test/scala/akka/camel/internal/ActivationTrackerTest.scala b/akka-camel/src/test/scala/akka/camel/internal/ActivationTrackerTest.scala index 99ebeafed7..783e7ab9a5 100644 --- a/akka-camel/src/test/scala/akka/camel/internal/ActivationTrackerTest.scala +++ b/akka-camel/src/test/scala/akka/camel/internal/ActivationTrackerTest.scala @@ -109,6 +109,14 @@ class ActivationTrackerTest extends TestKit(ActorSystem("test")) with WordSpec w awaiting.verifyActivated() } + + "send activation message when an actor is activated, deactivated and activated again" taggedAs TimingTest in { + publish(EndpointActivated(actor.ref)) + publish(EndpointDeActivated(actor.ref)) + publish(EndpointActivated(actor.ref)) + awaiting.awaitActivation() + awaiting.verifyActivated() + } } class Awaiting(actor: TestProbe) { From 99b02c08268fe363ec6ee5687dc5365a3ec56c78 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Sun, 25 Nov 2012 17:01:50 +0100 Subject: [PATCH 174/210] Reset StreamCache in getBodyAs to be able to re-read it, see #2724 --- .../main/scala/akka/camel/CamelMessage.scala | 18 ++++++++++++++++-- .../java/akka/camel/MessageJavaTestBase.java | 9 +++++++++ .../scala/akka/camel/MessageScalaTest.scala | 9 +++++++-- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/akka-camel/src/main/scala/akka/camel/CamelMessage.scala b/akka-camel/src/main/scala/akka/camel/CamelMessage.scala index 70fd61bd2a..dd4e2f418a 100644 --- a/akka-camel/src/main/scala/akka/camel/CamelMessage.scala +++ b/akka-camel/src/main/scala/akka/camel/CamelMessage.scala @@ -5,7 +5,7 @@ package akka.camel import java.util.{ Map ⇒ JMap, Set ⇒ JSet } -import org.apache.camel.{ CamelContext, Message ⇒ JCamelMessage } +import org.apache.camel.{ CamelContext, Message ⇒ JCamelMessage, StreamCache } import akka.AkkaException import scala.reflect.ClassTag import scala.util.Try @@ -108,7 +108,21 @@ case class CamelMessage(body: Any, headers: Map[String, Any]) { * Java API * */ - def getBodyAs[T](clazz: Class[T], camelContext: CamelContext): T = camelContext.getTypeConverter.mandatoryConvertTo[T](clazz, body) + def getBodyAs[T](clazz: Class[T], camelContext: CamelContext): T = { + val result = camelContext.getTypeConverter.mandatoryConvertTo[T](clazz, body) + // to be able to re-read a StreamCache we must "undo" the side effect by resetting the StreamCache + resetStreamCache() + result + } + + /** + * Reset StreamCache body. Nothing is done if the body is not a StreamCache. + * See http://camel.apache.org/stream-caching.html + */ + def resetStreamCache(): Unit = body match { + case stream: StreamCache ⇒ stream.reset + case _ ⇒ + } /** * Returns a new CamelMessage with a new body, while keeping the same headers. diff --git a/akka-camel/src/test/java/akka/camel/MessageJavaTestBase.java b/akka-camel/src/test/java/akka/camel/MessageJavaTestBase.java index 95cdc5007b..4779b59376 100644 --- a/akka-camel/src/test/java/akka/camel/MessageJavaTestBase.java +++ b/akka-camel/src/test/java/akka/camel/MessageJavaTestBase.java @@ -8,6 +8,7 @@ import akka.actor.ActorSystem; import akka.dispatch.Mapper; import akka.japi.Function; import org.apache.camel.NoTypeConversionAvailableException; +import org.apache.camel.converter.stream.InputStreamCache; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -100,6 +101,14 @@ public class MessageJavaTestBase { message("test1" , createMap("A", "1")).withHeaders(createMap("C", "3"))); } + @Test + public void shouldBeAbleToReReadStreamCacheBody() throws Exception { + CamelMessage msg = new CamelMessage(new InputStreamCache("test1".getBytes("utf-8")), empty); + assertEquals("test1", msg.getBodyAs(String.class, camel.context())); + // re-read + assertEquals("test1", msg.getBodyAs(String.class, camel.context())); + } + private static Set createSet(String... entries) { HashSet set = new HashSet(); set.addAll(Arrays.asList(entries)); diff --git a/akka-camel/src/test/scala/akka/camel/MessageScalaTest.scala b/akka-camel/src/test/scala/akka/camel/MessageScalaTest.scala index dd73027624..cbf0190e91 100644 --- a/akka-camel/src/test/scala/akka/camel/MessageScalaTest.scala +++ b/akka-camel/src/test/scala/akka/camel/MessageScalaTest.scala @@ -5,11 +5,11 @@ package akka.camel import java.io.InputStream - import org.apache.camel.NoTypeConversionAvailableException import akka.camel.TestSupport.{ SharedCamelSystem } import org.scalatest.FunSuite import org.scalatest.matchers.MustMatchers +import org.apache.camel.converter.stream.InputStreamCache class MessageScalaTest extends FunSuite with MustMatchers with SharedCamelSystem { implicit def camelContext = camel.context @@ -44,12 +44,17 @@ class MessageScalaTest extends FunSuite with MustMatchers with SharedCamelSystem test("mustSetBodyAndPreserveHeaders") { CamelMessage("test1", Map("A" -> "1")).copy(body = "test2") must be( CamelMessage("test2", Map("A" -> "1"))) - } test("mustSetHeadersAndPreserveBody") { CamelMessage("test1", Map("A" -> "1")).copy(headers = Map("C" -> "3")) must be( CamelMessage("test1", Map("C" -> "3"))) + } + test("mustBeAbleToReReadStreamCacheBody") { + val msg = CamelMessage(new InputStreamCache("test1".getBytes("utf-8")), Map.empty) + msg.bodyAs[String] must be("test1") + // re-read + msg.bodyAs[String] must be("test1") } } From 12f9c7f6643889d8c002a772d011cba7476b7d4f Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Mon, 26 Nov 2012 09:24:18 +0100 Subject: [PATCH 175/210] Correction of router with resizer doc sample, see #2740 --- .../rst/java/code/docs/jrouting/RouterViaProgramExample.java | 2 +- akka-docs/rst/scala/code/docs/zeromq/ZeromqDocSpec.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/akka-docs/rst/java/code/docs/jrouting/RouterViaProgramExample.java b/akka-docs/rst/java/code/docs/jrouting/RouterViaProgramExample.java index 7065524e52..a3a48f300c 100644 --- a/akka-docs/rst/java/code/docs/jrouting/RouterViaProgramExample.java +++ b/akka-docs/rst/java/code/docs/jrouting/RouterViaProgramExample.java @@ -70,7 +70,7 @@ public class RouterViaProgramExample { int upperBound = 15; DefaultResizer resizer = new DefaultResizer(lowerBound, upperBound); ActorRef router3 = system.actorOf( - new Props(ExampleActor.class).withRouter(new RoundRobinRouter(nrOfInstances))); + new Props(ExampleActor.class).withRouter(new RoundRobinRouter(resizer))); //#programmaticRoutingWithResizer for (int i = 1; i <= 6; i++) { router3.tell(new ExampleActor.Message(i), null); diff --git a/akka-docs/rst/scala/code/docs/zeromq/ZeromqDocSpec.scala b/akka-docs/rst/scala/code/docs/zeromq/ZeromqDocSpec.scala index 0ce9ee61bf..ab2e4f4d27 100644 --- a/akka-docs/rst/scala/code/docs/zeromq/ZeromqDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/zeromq/ZeromqDocSpec.scala @@ -29,7 +29,7 @@ object ZeromqDocSpec { class HealthProbe extends Actor { - val pubSocket = ZeroMQExtension(context.system).newSocket(SocketType.Pub, + val pubSocket = ZeroMQExtension(context.system).newSocket(SocketType.Pub, Bind("tcp://127.0.0.1:1235")) val memory = ManagementFactory.getMemoryMXBean val os = ManagementFactory.getOperatingSystemMXBean From 7eec5a0858bdb4fddb408a7dd37d4e37907746f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Antonsson?= Date: Mon, 26 Nov 2012 09:27:53 +0100 Subject: [PATCH 176/210] Return only the changes to the SubclassifiedIndex. #2738 --- akka-actor/src/main/scala/akka/util/SubclassifiedIndex.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/akka-actor/src/main/scala/akka/util/SubclassifiedIndex.scala b/akka-actor/src/main/scala/akka/util/SubclassifiedIndex.scala index d0ee67c1fb..236f645864 100644 --- a/akka-actor/src/main/scala/akka/util/SubclassifiedIndex.scala +++ b/akka-actor/src/main/scala/akka/util/SubclassifiedIndex.scala @@ -32,7 +32,7 @@ private[akka] object SubclassifiedIndex { val kids = subkeys flatMap (_ addValue value) if (!(values contains value)) { values += value - kids :+ ((key, values)) + kids :+ ((key, Set(value))) } else kids } From 39a119191209f7cce1de5064801404249c16334c Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Wed, 21 Nov 2012 10:10:58 +0100 Subject: [PATCH 177/210] #2718 - Adding version range OSGi importPackage for Protobuf --- project/AkkaBuild.scala | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index b0b084115f..fcc3947a7d 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -621,13 +621,13 @@ object AkkaBuild extends Build { val fileMailbox = exports(Seq("akka.actor.mailbox.filebased.*")) - val mailboxesCommon = exports(Seq("akka.actor.mailbox.*")) + val mailboxesCommon = exports(Seq("akka.actor.mailbox.*"), imports = Seq(protobufImport())) val osgi = exports(Seq("akka.osgi")) ++ Seq(OsgiKeys.privatePackage := Seq("akka.osgi.impl")) val osgiAries = exports() ++ Seq(OsgiKeys.privatePackage := Seq("akka.osgi.aries.*")) - val remote = exports(Seq("akka.remote.*")) + val remote = exports(Seq("akka.remote.*"), imports = Seq(protobufImport())) val slf4j = exports(Seq("akka.event.slf4j.*")) @@ -637,16 +637,17 @@ object AkkaBuild extends Build { val testkit = exports(Seq("akka.testkit.*")) - val zeroMQ = exports(Seq("akka.zeromq.*")) + val zeroMQ = exports(Seq("akka.zeromq.*"), imports = Seq(protobufImport()) ) - def exports(packages: Seq[String] = Seq()) = osgiSettings ++ Seq( - OsgiKeys.importPackage := defaultImports, + def exports(packages: Seq[String] = Seq(), imports: Seq[String] = Nil) = osgiSettings ++ Seq( + OsgiKeys.importPackage := imports ++ defaultImports, OsgiKeys.exportPackage := packages ) def defaultImports = Seq("!sun.misc", akkaImport(), configImport(), scalaImport(), "*") def akkaImport(packageName: String = "akka.*") = "%s;version=\"[2.1,2.2)\"".format(packageName) def configImport(packageName: String = "com.typesafe.config.*") = "%s;version=\"[0.4.1,1.1.0)\"".format(packageName) + def protobufImport(packageName: String = "com.google.protobuf.*") = "%s;version=\"[2.4.0,2.5.0)\"".format(packageName) def scalaImport(packageName: String = "scala.*") = "%s;version=\"[2.10,2.11)\"".format(packageName) } } From 41ecd4749c412ef6c5396fa309ab3d4c5f9d3f2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Antonsson?= Date: Thu, 22 Nov 2012 10:59:20 +0100 Subject: [PATCH 178/210] Don't replace the active connection with a passive one. See #2654 --- .../akka/remote/testkit/MultiNodeSpec.scala | 2 +- .../akka/remote/netty/NettyRemoteSupport.scala | 16 +++------------- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala b/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala index 8a076dd683..350c9a3171 100644 --- a/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala +++ b/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala @@ -104,7 +104,7 @@ abstract class MultiNodeConfig { else ConfigFactory.empty val configs = (_nodeConf get myself).toList ::: _commonConf.toList ::: transportConfig :: MultiNodeSpec.nodeConfig :: MultiNodeSpec.baseConfig :: Nil - configs reduce (_ withFallback _) + configs reduceLeft (_ withFallback _) } private[testkit] def deployments(node: RoleName): immutable.Seq[String] = (_deployments get node getOrElse Nil) ++ _allDeploy diff --git a/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala b/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala index 2a067237a7..f9da767c56 100644 --- a/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala +++ b/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala @@ -243,10 +243,10 @@ private[akka] class NettyRemoteTransport(_system: ExtendedActorSystem, _provider } } - def bindClient(remoteAddress: Address, client: RemoteClient, putIfAbsent: Boolean = false): Boolean = { + def bindClient(remoteAddress: Address, client: RemoteClient): Boolean = { clientsLock.writeLock().lock() try { - if (putIfAbsent && remoteClients.contains(remoteAddress)) false + if (remoteClients.contains(remoteAddress)) false else { client.connect() remoteClients.put(remoteAddress, client).foreach(_.shutdown()) @@ -257,17 +257,7 @@ private[akka] class NettyRemoteTransport(_system: ExtendedActorSystem, _provider } } - def unbindClient(remoteAddress: Address): Unit = { - clientsLock.writeLock().lock() - try { - remoteClients foreach { - case (k, v) ⇒ - if (v.isBoundTo(remoteAddress)) { v.shutdown(); remoteClients.remove(k) } - } - } finally { - clientsLock.writeLock().unlock() - } - } + def unbindClient(remoteAddress: Address): Unit = shutdownClientConnection(remoteAddress) def shutdownClientConnection(remoteAddress: Address): Boolean = { clientsLock.writeLock().lock() From b2522ba02d1648bb8762b46859f0526e9ebedeff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Antonsson?= Date: Thu, 22 Nov 2012 11:39:51 +0100 Subject: [PATCH 179/210] Mark tests that use unstable experimental features as ignored. See #2654 These tests use the throttling in the experimental test conductor which relies on the fact that the same connection is used for both inbound and outbound traffic. This is not always the case when starting multiple cluster nodes at the same time. --- .../src/multi-jvm/scala/akka/cluster/SplitBrainSpec.scala | 2 +- .../scala/akka/cluster/UnreachableNodeRejoinsClusterSpec.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/SplitBrainSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/SplitBrainSpec.scala index a7a7c6f4ba..967e5adb52 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/SplitBrainSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/SplitBrainSpec.scala @@ -57,7 +57,7 @@ abstract class SplitBrainSpec(multiNodeConfig: SplitBrainMultiNodeConfig) val side1 = Vector(first, second) val side2 = Vector(third, fourth, fifth) - "A cluster of 5 members" must { + "A cluster of 5 members" ignore { "reach initial convergence" taggedAs LongRunningTest in { awaitClusterUp(first, second, third, fourth, fifth) diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/UnreachableNodeRejoinsClusterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/UnreachableNodeRejoinsClusterSpec.scala index 395d803865..c78cbf904d 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/UnreachableNodeRejoinsClusterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/UnreachableNodeRejoinsClusterSpec.scala @@ -60,7 +60,7 @@ abstract class UnreachableNodeRejoinsClusterSpec(multiNodeConfig: UnreachableNod enterBarrier("after_" + endBarrierNumber) } - "A cluster of " + roles.size + " members" must { + "A cluster of " + roles.size + " members" ignore { "reach initial convergence" taggedAs LongRunningTest in { awaitClusterUp(roles: _*) From 6d13a72001895ff060a6d0bf47a87803eff6202b Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Thu, 22 Nov 2012 16:09:19 +0100 Subject: [PATCH 180/210] Hardening the tests in cluster sample, see #2654 --- .../cluster/stats/japi/StatsAggregator.java | 2 +- .../cluster/stats/japi/StatsFacade.java | 2 +- .../sample/cluster/stats/StatsSample.scala | 4 +- .../stats/StatsSampleSingleMasterSpec.scala | 5 ++- .../cluster/stats/StatsSampleSpec.scala | 41 ++++++++++--------- .../stats/japi/StatsSampleJapiSpec.scala | 38 ++++++++++------- .../StatsSampleSingleMasterJapiSpec.scala | 5 ++- .../TransformationSampleSpec.scala | 2 + .../japi/TransformationSampleJapiSpec.scala | 1 + 9 files changed, 58 insertions(+), 42 deletions(-) diff --git a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsAggregator.java b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsAggregator.java index 81b5b74ce5..0716cc38ec 100644 --- a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsAggregator.java +++ b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsAggregator.java @@ -25,7 +25,7 @@ public class StatsAggregator extends UntypedActor { @Override public void preStart() { - getContext().setReceiveTimeout(Duration.create(5, TimeUnit.SECONDS)); + getContext().setReceiveTimeout(Duration.create(3, TimeUnit.SECONDS)); } @Override diff --git a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsFacade.java b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsFacade.java index 89582882fa..15a271027c 100644 --- a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsFacade.java +++ b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/stats/japi/StatsFacade.java @@ -49,7 +49,7 @@ public class StatsFacade extends UntypedActor { } else if (message instanceof StatsJob) { StatsJob job = (StatsJob) message; - Future f = ask(currentMaster, job, new Timeout(10, SECONDS)). + Future f = ask(currentMaster, job, new Timeout(5, SECONDS)). recover(new Recover() { public Object recover(Throwable t) { return new JobFailed("Service unavailable, try again later"); diff --git a/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala b/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala index d35c475780..a1cab85069 100644 --- a/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala +++ b/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/stats/StatsSample.scala @@ -54,7 +54,7 @@ class StatsService extends Actor { class StatsAggregator(expectedResults: Int, replyTo: ActorRef) extends Actor { var results = IndexedSeq.empty[Int] - context.setReceiveTimeout(5 seconds) + context.setReceiveTimeout(3 seconds) def receive = { case wordCount: Int ⇒ @@ -106,7 +106,7 @@ class StatsFacade extends Actor with ActorLogging { case job: StatsJob if currentMaster.isEmpty ⇒ sender ! JobFailed("Service unavailable, try again later") case job: StatsJob ⇒ - implicit val timeout = Timeout(10.seconds) + implicit val timeout = Timeout(5.seconds) currentMaster foreach { _ ? job recover { case _ ⇒ JobFailed("Service unavailable, try again later") diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSingleMasterSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSingleMasterSpec.scala index 7acd2ff202..d801a476bf 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSingleMasterSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSingleMasterSpec.scala @@ -72,7 +72,6 @@ abstract class StatsSampleSingleMasterSpec extends MultiNodeSpec(StatsSampleSing expectMsgClass(classOf[CurrentClusterState]) Cluster(system) join node(first).address - system.actorOf(Props[StatsFacade], "statsFacade") expectMsgAllOf( MemberUp(Member(node(first).address, MemberStatus.Up)), @@ -80,11 +79,13 @@ abstract class StatsSampleSingleMasterSpec extends MultiNodeSpec(StatsSampleSing MemberUp(Member(node(third).address, MemberStatus.Up))) Cluster(system).unsubscribe(testActor) + + system.actorOf(Props[StatsFacade], "statsFacade") testConductor.enter("all-up") } - "show usage of the statsFacade" in within(15 seconds) { + "show usage of the statsFacade" in within(20 seconds) { val facade = system.actorFor(RootActorPath(node(third).address) / "user" / "statsFacade") // eventually the service should be ok, diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSpec.scala index b9eeef3159..524d7699b4 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSpec.scala @@ -71,7 +71,7 @@ abstract class StatsSampleSpec extends MultiNodeSpec(StatsSampleSpecConfig) override def afterAll() = multiNodeSpecAfterAll() -//#abstract-test + //#abstract-test "The stats sample" must { @@ -80,7 +80,7 @@ abstract class StatsSampleSpec extends MultiNodeSpec(StatsSampleSpecConfig) Cluster(system).subscribe(testActor, classOf[MemberUp]) expectMsgClass(classOf[CurrentClusterState]) - //#addresses + //#addresses val firstAddress = node(first).address val secondAddress = node(second).address val thirdAddress = node(third).address @@ -104,34 +104,37 @@ abstract class StatsSampleSpec extends MultiNodeSpec(StatsSampleSpecConfig) } //#startup-cluster - //#test-statsService "show usage of the statsService from one node" in within(15 seconds) { runOn(second) { - val service = system.actorFor(node(third) / "user" / "statsService") - service ! StatsJob("this is the text that will be analyzed") - val meanWordLength = expectMsgPF() { - case StatsResult(meanWordLength) ⇒ meanWordLength - } - meanWordLength must be(3.875 plusOrMinus 0.001) + assertServiceOk } testConductor.enter("done-2") } - //#test-statsService - - "show usage of the statsService from all nodes" in within(15 seconds) { - val service = system.actorFor(node(third) / "user" / "statsService") - service ! StatsJob("this is the text that will be analyzed") - val meanWordLength = expectMsgPF() { - case StatsResult(meanWordLength) ⇒ meanWordLength - } - meanWordLength must be(3.875 plusOrMinus 0.001) + def assertServiceOk: Unit = { + val service = system.actorFor(node(third) / "user" / "statsService") + // eventually the service should be ok, + // first attempts might fail because worker actors not started yet + awaitCond { + service ! StatsJob("this is the text that will be analyzed") + expectMsgPF() { + case unavailble: JobFailed ⇒ false + case StatsResult(meanWordLength) ⇒ + meanWordLength must be(3.875 plusOrMinus 0.001) + true + } + } + + } + //#test-statsService + + "show usage of the statsService from all nodes" in within(15 seconds) { + assertServiceOk testConductor.enter("done-3") } - } } \ No newline at end of file diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala index 1f4624674b..de05089b9f 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala @@ -76,6 +76,11 @@ abstract class StatsSampleJapiSpec extends MultiNodeSpec(StatsSampleJapiSpecConf Cluster(system) join firstAddress system.actorOf(Props[StatsWorker], "statsWorker") + // FIXME 2654 + // statsWorker must be started on all nodes before the + // statsService router is started and looks it up + testConductor.enter("statsWorker-started") + system.actorOf(Props[StatsService], "statsService") expectMsgAllOf( @@ -88,33 +93,36 @@ abstract class StatsSampleJapiSpec extends MultiNodeSpec(StatsSampleJapiSpecConf testConductor.enter("all-up") } - "show usage of the statsService from one node" in within(15 seconds) { runOn(second) { - val service = system.actorFor(node(third) / "user" / "statsService") - service ! new StatsJob("this is the text that will be analyzed") - val meanWordLength = expectMsgPF() { - case r: StatsResult ⇒ r.getMeanWordLength - } - meanWordLength must be(3.875 plusOrMinus 0.001) + assertServiceOk } testConductor.enter("done-2") } - //#test-statsService - - "show usage of the statsService from all nodes" in within(15 seconds) { + + def assertServiceOk: Unit = { val service = system.actorFor(node(third) / "user" / "statsService") - service ! new StatsJob("this is the text that will be analyzed") - val meanWordLength = expectMsgPF() { - case r: StatsResult ⇒ r.getMeanWordLength + // eventually the service should be ok, + // first attempts might fail because worker actors not started yet + awaitCond { + service ! new StatsJob("this is the text that will be analyzed") + expectMsgPF() { + case unavailble: JobFailed ⇒ false + case r: StatsResult ⇒ + r.getMeanWordLength must be(3.875 plusOrMinus 0.001) + true + } } - meanWordLength must be(3.875 plusOrMinus 0.001) + } + //#test-statsService + + "show usage of the statsService from all nodes" in within(15 seconds) { + assertServiceOk testConductor.enter("done-3") } - } } \ No newline at end of file diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleSingleMasterJapiSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleSingleMasterJapiSpec.scala index 9299e007c4..a104dec8e8 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleSingleMasterJapiSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleSingleMasterJapiSpec.scala @@ -71,7 +71,6 @@ abstract class StatsSampleSingleMasterJapiSpec extends MultiNodeSpec(StatsSample expectMsgClass(classOf[CurrentClusterState]) Cluster(system) join node(first).address - system.actorOf(Props[StatsFacade], "statsFacade") expectMsgAllOf( MemberUp(Member(node(first).address, MemberStatus.Up)), @@ -80,10 +79,12 @@ abstract class StatsSampleSingleMasterJapiSpec extends MultiNodeSpec(StatsSample Cluster(system).unsubscribe(testActor) + system.actorOf(Props[StatsFacade], "statsFacade") + testConductor.enter("all-up") } - "show usage of the statsFacade" in within(15 seconds) { + "show usage of the statsFacade" in within(20 seconds) { val facade = system.actorFor(RootActorPath(node(third).address) / "user" / "statsFacade") // eventually the service should be ok, diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/TransformationSampleSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/TransformationSampleSpec.scala index 8129bad77e..f4aeca963b 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/TransformationSampleSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/TransformationSampleSpec.scala @@ -88,6 +88,8 @@ abstract class TransformationSampleSpec extends MultiNodeSpec(TransformationSamp Cluster(system) join node(frontend1).address system.actorOf(Props[TransformationFrontend], name = "frontend") } + testConductor.enter("frontend2-started") + runOn(backend2, backend3) { Cluster(system) join node(backend1).address system.actorOf(Props[TransformationBackend], name = "backend") diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/japi/TransformationSampleJapiSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/japi/TransformationSampleJapiSpec.scala index a37458a129..cac690a994 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/japi/TransformationSampleJapiSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/japi/TransformationSampleJapiSpec.scala @@ -89,6 +89,7 @@ abstract class TransformationSampleJapiSpec extends MultiNodeSpec(Transformation Cluster(system) join node(frontend1).address system.actorOf(Props[TransformationFrontend], name = "frontend") } + testConductor.enter("frontend2-started") runOn(backend2, backend3) { Cluster(system) join node(backend1).address system.actorOf(Props[TransformationBackend], name = "backend") From 5ab0010a6809571a93f7cf9d703226257744a054 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Thu, 22 Nov 2012 16:50:26 +0100 Subject: [PATCH 181/210] Hardening the tests in cluster sample, see #2654 --- .../sample/cluster/stats/japi/StatsSampleJapiSpec.scala | 5 ----- 1 file changed, 5 deletions(-) diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala index de05089b9f..192f4f1785 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala @@ -76,11 +76,6 @@ abstract class StatsSampleJapiSpec extends MultiNodeSpec(StatsSampleJapiSpecConf Cluster(system) join firstAddress system.actorOf(Props[StatsWorker], "statsWorker") - // FIXME 2654 - // statsWorker must be started on all nodes before the - // statsService router is started and looks it up - testConductor.enter("statsWorker-started") - system.actorOf(Props[StatsService], "statsService") expectMsgAllOf( From bd05211893b1df63bd2a533017ddd2b71178b611 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Antonsson?= Date: Mon, 26 Nov 2012 10:22:21 +0100 Subject: [PATCH 182/210] Cleanup according to comments --- akka-remote/src/main/scala/akka/remote/netty/Client.scala | 2 -- .../src/main/scala/akka/remote/netty/NettyRemoteSupport.scala | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/akka-remote/src/main/scala/akka/remote/netty/Client.scala b/akka-remote/src/main/scala/akka/remote/netty/Client.scala index 7568f859ec..517b568b76 100644 --- a/akka-remote/src/main/scala/akka/remote/netty/Client.scala +++ b/akka-remote/src/main/scala/akka/remote/netty/Client.scala @@ -44,8 +44,6 @@ private[akka] abstract class RemoteClient private[akka] (val netty: NettyRemoteT def shutdown(): Boolean - def isBoundTo(address: Address): Boolean = remoteAddress == address - /** * Converts the message to the wireprotocol and sends the message across the wire */ diff --git a/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala b/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala index f9da767c56..814bdc0c07 100644 --- a/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala +++ b/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala @@ -249,7 +249,7 @@ private[akka] class NettyRemoteTransport(_system: ExtendedActorSystem, _provider if (remoteClients.contains(remoteAddress)) false else { client.connect() - remoteClients.put(remoteAddress, client).foreach(_.shutdown()) + remoteClients.put(remoteAddress, client) true } } finally { From 17e6b13b65917dba053d921bb9746257e26fb33f Mon Sep 17 00:00:00 2001 From: Roland Date: Mon, 26 Nov 2012 11:18:26 +0100 Subject: [PATCH 183/210] =?UTF-8?q?fix=20lookup=20of=20top-level=E2=80=99s?= =?UTF-8?q?=20children,=20see=20#2675?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - the problem existed only when creating children within the constructor of a top-level actor - add a test which verifies this --- .../scala/akka/actor/ActorSystemSpec.scala | 59 ++++++++++++++++++- .../java/akka/actor/AbstractActorRef.java | 2 + .../src/main/scala/akka/actor/ActorCell.scala | 5 ++ .../akka/actor/RepointableActorRef.scala | 48 ++++++++++++--- .../src/main/scala/akka/routing/Routing.scala | 6 +- 5 files changed, 107 insertions(+), 13 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/actor/ActorSystemSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ActorSystemSpec.scala index 038cb2d0e6..781b8d4cab 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ActorSystemSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ActorSystemSpec.scala @@ -4,7 +4,6 @@ package akka.actor import language.postfixOps - import akka.testkit._ import org.scalatest.junit.JUnitSuite import com.typesafe.config.ConfigFactory @@ -15,6 +14,10 @@ import akka.util.Timeout import akka.japi.Util.immutableSeq import scala.concurrent.Future import akka.pattern.ask +import akka.dispatch._ +import com.typesafe.config.Config +import java.util.concurrent.{ LinkedBlockingQueue, BlockingQueue, TimeUnit } +import akka.util.Switch class JavaExtensionSpec extends JavaExtension with JUnitSuite @@ -68,10 +71,57 @@ object ActorSystemSpec { } } + case class FastActor(latch: TestLatch, testActor: ActorRef) extends Actor { + val ref1 = context.actorOf(Props.empty) + val ref2 = context.actorFor(ref1.path.toString) + testActor ! ref2.getClass + latch.countDown() + + def receive = { + case _ ⇒ + } + } + + class SlowDispatcher(_config: Config, _prerequisites: DispatcherPrerequisites) extends MessageDispatcherConfigurator(_config, _prerequisites) { + private val instance = new Dispatcher( + prerequisites, + config.getString("id"), + config.getInt("throughput"), + Duration(config.getNanoseconds("throughput-deadline-time"), TimeUnit.NANOSECONDS), + mailboxType, + configureExecutor(), + Duration(config.getMilliseconds("shutdown-timeout"), TimeUnit.MILLISECONDS)) { + val doneIt = new Switch + override protected[akka] def registerForExecution(mbox: Mailbox, hasMessageHint: Boolean, hasSystemMessageHint: Boolean): Boolean = { + val ret = super.registerForExecution(mbox, hasMessageHint, hasSystemMessageHint) + doneIt.switchOn { + TestKit.awaitCond(mbox.actor.actor != null, 1.second) + mbox.actor.actor match { + case FastActor(latch, _) ⇒ Await.ready(latch, 1.second) + } + } + ret + } + } + + /** + * Returns the same dispatcher instance for each invocation + */ + override def dispatcher(): MessageDispatcher = instance + } + + val config = s""" + akka.extensions = ["akka.actor.TestExtension"] + slow { + type="${classOf[SlowDispatcher].getName}" + }""" + } @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class ActorSystemSpec extends AkkaSpec("""akka.extensions = ["akka.actor.TestExtension"]""") with ImplicitSender { +class ActorSystemSpec extends AkkaSpec(ActorSystemSpec.config) with ImplicitSender { + + import ActorSystemSpec.FastActor "An ActorSystem" must { @@ -165,6 +215,11 @@ class ActorSystemSpec extends AkkaSpec("""akka.extensions = ["akka.actor.TestExt Await.result(Future.sequence(waves), timeout.duration + 5.seconds) must be === Seq("done", "done", "done") } + "find actors that just have been created" in { + system.actorOf(Props(new FastActor(TestLatch(), testActor)).withDispatcher("slow")) + expectMsgType[Class[_]] must be(classOf[LocalActorRef]) + } + "reliable deny creation of actors while shutting down" in { val system = ActorSystem() import system.dispatcher diff --git a/akka-actor/src/main/java/akka/actor/AbstractActorRef.java b/akka-actor/src/main/java/akka/actor/AbstractActorRef.java index 97ef09c501..650182a457 100644 --- a/akka-actor/src/main/java/akka/actor/AbstractActorRef.java +++ b/akka-actor/src/main/java/akka/actor/AbstractActorRef.java @@ -8,10 +8,12 @@ import akka.util.Unsafe; final class AbstractActorRef { final static long cellOffset; + final static long lookupOffset; static { try { cellOffset = Unsafe.instance.objectFieldOffset(RepointableActorRef.class.getDeclaredField("_cellDoNotCallMeDirectly")); + lookupOffset = Unsafe.instance.objectFieldOffset(RepointableActorRef.class.getDeclaredField("_lookupDoNotCallMeDirectly")); } catch(Throwable t){ throw new ExceptionInInitializerError(t); } diff --git a/akka-actor/src/main/scala/akka/actor/ActorCell.scala b/akka-actor/src/main/scala/akka/actor/ActorCell.scala index 9b2ef58d04..51f11c044c 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorCell.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorCell.scala @@ -208,6 +208,11 @@ private[akka] trait Cell { * The system internals where this Cell lives. */ def systemImpl: ActorSystemImpl + /** + * Start the cell: enqueued message must not be processed before this has + * been called. The usual action is to attach the mailbox to a dispatcher. + */ + def start(): this.type /** * Recursively suspend this actor and all its children. Must not throw exceptions. */ diff --git a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala index ddc49b1e22..1385e7053c 100644 --- a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala @@ -33,17 +33,34 @@ private[akka] class RepointableActorRef( val path: ActorPath) extends ActorRefWithCell with RepointableRef { - import AbstractActorRef.cellOffset + import AbstractActorRef.{ cellOffset, lookupOffset } + /* + * H E R E B E D R A G O N S ! + * + * There are two main functions of a Cell: message queueing and child lookup. + * When switching out the UnstartedCell for its real replacement, the former + * must be switched after all messages have been drained from the temporary + * queue into the real mailbox, while the latter must be switched before + * processing the very first message (i.e. before Cell.start()). Hence there + * are two refs here, one for each function, and they are switched just so. + */ @volatile private var _cellDoNotCallMeDirectly: Cell = _ + @volatile private var _lookupDoNotCallMeDirectly: Cell = _ def underlying: Cell = Unsafe.instance.getObjectVolatile(this, cellOffset).asInstanceOf[Cell] + private def lookup = Unsafe.instance.getObjectVolatile(this, lookupOffset).asInstanceOf[Cell] @tailrec final def swapCell(next: Cell): Cell = { val old = underlying if (Unsafe.instance.compareAndSwapObject(this, cellOffset, old, next)) old else swapCell(next) } + @tailrec final def swapLookup(next: Cell): Cell = { + val old = lookup + if (Unsafe.instance.compareAndSwapObject(this, lookupOffset, old, next)) old else swapLookup(next) + } + /** * Initialize: make a dummy cell which holds just a mailbox, then tell our * supervisor that we exist so that he can create the real Cell in @@ -58,6 +75,7 @@ private[akka] class RepointableActorRef( case null ⇒ val uid = ThreadLocalRandom.current.nextInt() swapCell(new UnstartedCell(system, this, props, supervisor, uid)) + swapLookup(underlying) supervisor.sendSystemMessage(Supervise(this, async, uid)) if (!async) point() this @@ -72,9 +90,21 @@ private[akka] class RepointableActorRef( */ def point(): this.type = underlying match { - case u: UnstartedCell ⇒ u.replaceWith(newCell(u)); this - case null ⇒ throw new IllegalStateException("underlying cell is null") - case _ ⇒ this // this happens routinely for things which were created async=false + case u: UnstartedCell ⇒ + /* + * The problem here was that if the real actor (which will start running + * at cell.start()) creates children in its constructor, then this may + * happen before the swapCell in u.replaceWith, meaning that those + * children cannot be looked up immediately, e.g. if they shall become + * routees. + */ + val cell = newCell(u) + swapLookup(cell) + cell.start() + u.replaceWith(cell) + this + case null ⇒ throw new IllegalStateException("underlying cell is null") + case _ ⇒ this // this happens routinely for things which were created async=false } /** @@ -82,7 +112,7 @@ private[akka] class RepointableActorRef( * unstarted cell. The cell must be fully functional. */ def newCell(old: UnstartedCell): Cell = - new ActorCell(system, this, props, supervisor).init(old.uid, sendSupervise = false).start() + new ActorCell(system, this, props, supervisor).init(old.uid, sendSupervise = false) def start(): Unit = () @@ -114,7 +144,7 @@ private[akka] class RepointableActorRef( case ".." ⇒ getParent.getChild(name) case "" ⇒ getChild(name) case other ⇒ - underlying.getChildByName(other) match { + lookup.getChildByName(other) match { case Some(crs: ChildRestartStats) ⇒ crs.child.asInstanceOf[InternalActorRef].getChild(name) case _ ⇒ Nobody } @@ -164,6 +194,7 @@ private[akka] class UnstartedCell(val systemImpl: ActorSystemImpl, } def system: ActorSystem = systemImpl + def start(): this.type = this def suspend(): Unit = sendSystemMessage(Suspend()) def resume(causedByFailure: Throwable): Unit = sendSystemMessage(Resume(causedByFailure)) def restart(cause: Throwable): Unit = sendSystemMessage(Recreate(cause)) @@ -205,7 +236,10 @@ private[akka] class UnstartedCell(val systemImpl: ActorSystemImpl, // systemMessages that are sent during replace need to jump to just after the last system message in the queue, so it's processed before other messages val wasEnqueued = if (isBeingReplaced && !queue.isEmpty()) { @tailrec def tryEnqueue(i: JListIterator[Any] = queue.listIterator(), insertIntoIndex: Int = -1): Boolean = - if (i.hasNext()) tryEnqueue(i, if (i.next().isInstanceOf[SystemMessage]) i.nextIndex() else insertIntoIndex) + if (i.hasNext()) + tryEnqueue(i, + if (i.next().isInstanceOf[SystemMessage]) i.nextIndex() // update last sysmsg seen so far + else insertIntoIndex) // or just keep the last seen one else if (insertIntoIndex == -1) queue.offer(msg) else Try(queue.add(insertIntoIndex, msg)).isSuccess tryEnqueue() diff --git a/akka-actor/src/main/scala/akka/routing/Routing.scala b/akka-actor/src/main/scala/akka/routing/Routing.scala index 1363d1d8d6..f41eb33ad3 100644 --- a/akka-actor/src/main/scala/akka/routing/Routing.scala +++ b/akka-actor/src/main/scala/akka/routing/Routing.scala @@ -37,11 +37,11 @@ private[akka] class RoutedActorRef(_system: ActorSystemImpl, _props: Props, _sup _props.routerConfig.verifyConfig() - override def newCell(old: UnstartedCell): Cell = new RoutedActorCell(system, this, props, supervisor, old.uid) + override def newCell(old: UnstartedCell): Cell = new RoutedActorCell(system, this, props, supervisor).init(old.uid, sendSupervise = false) } -private[akka] class RoutedActorCell(_system: ActorSystemImpl, _ref: InternalActorRef, _props: Props, _supervisor: InternalActorRef, _uid: Int) +private[akka] class RoutedActorCell(_system: ActorSystemImpl, _ref: InternalActorRef, _props: Props, _supervisor: InternalActorRef) extends ActorCell( _system, _ref, @@ -72,8 +72,6 @@ private[akka] class RoutedActorCell(_system: ActorSystemImpl, _ref: InternalActo r } - init(_uid, sendSupervise = false).start() - /* * end of construction */ From db5e04f3d8c3e1a94fca06c66fea96b60b500079 Mon Sep 17 00:00:00 2001 From: Christian Krause Date: Tue, 13 Nov 2012 07:49:06 +0100 Subject: [PATCH 184/210] introduces new setting for a Bootable to sbt plugin (#2701) - type is Setting[String] - defaults to empty String - is used for generating the start and start.bat scripts (cherry picked from commit b1a011466052fa0f5ef8ca2ad45e77453381704a) --- .../src/main/scala/AkkaKernelPlugin.scala | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/akka-sbt-plugin/src/main/scala/AkkaKernelPlugin.scala b/akka-sbt-plugin/src/main/scala/AkkaKernelPlugin.scala index f000763a70..c4625961b8 100644 --- a/akka-sbt-plugin/src/main/scala/AkkaKernelPlugin.scala +++ b/akka-sbt-plugin/src/main/scala/AkkaKernelPlugin.scala @@ -19,6 +19,7 @@ object AkkaKernelPlugin extends Plugin { configSourceDirs: Seq[File], distJvmOptions: String, distMainClass: String, + distBootClass: String, libFilter: File ⇒ Boolean, additionalLibs: Seq[File]) @@ -30,8 +31,12 @@ object AkkaKernelPlugin extends Plugin { val configSourceDirs = TaskKey[Seq[File]]("config-source-directories", "Configuration files are copied from these directories") - val distJvmOptions = SettingKey[String]("kernel-jvm-options", "JVM parameters to use in start script") - val distMainClass = SettingKey[String]("kernel-main-class", "Kernel main class to use in start script") + val distJvmOptions = SettingKey[String]("kernel-jvm-options", + "JVM parameters to use in start script") + val distMainClass = SettingKey[String]("kernel-main-class", + "main class to use in start script, defaults to akka.kernel.Main to load an akka.kernel.Bootable") + val distBootClass = SettingKey[String]("kernel-boot-class", + "class implementing akka.kernel.Bootable, which gets loaded by the default 'distMainClass'") val libFilter = SettingKey[File ⇒ Boolean]("lib-filter", "Filter of dependency jar files") val additionalLibs = TaskKey[Seq[File]]("additional-libs", "Additional dependency jar files") @@ -50,9 +55,10 @@ object AkkaKernelPlugin extends Plugin { configSourceDirs <<= defaultConfigSourceDirs, distJvmOptions := "-Xms1024M -Xmx1024M -Xss1M -XX:MaxPermSize=256M -XX:+UseParallelGC", distMainClass := "akka.kernel.Main", + distBootClass := "", libFilter := { f ⇒ true }, additionalLibs <<= defaultAdditionalLibs, - distConfig <<= (outputDirectory, configSourceDirs, distJvmOptions, distMainClass, libFilter, additionalLibs) map DistConfig)) ++ + distConfig <<= (outputDirectory, configSourceDirs, distJvmOptions, distMainClass, distBootClass, libFilter, additionalLibs) map DistConfig)) ++ Seq(dist <<= (dist in Dist), distNeedsPackageBin) private def distTask: Initialize[Task[File]] = @@ -69,7 +75,7 @@ object AkkaKernelPlugin extends Plugin { log.info("Creating distribution %s ..." format conf.outputDirectory) IO.createDirectory(conf.outputDirectory) - Scripts(conf.distJvmOptions, conf.distMainClass).writeScripts(distBinPath) + Scripts(conf.distJvmOptions, conf.distMainClass, conf.distBootClass).writeScripts(distBinPath) copyDirectories(conf.configSourceDirs, distConfigPath) copyJars(tgt, distDeployPath) @@ -109,7 +115,7 @@ object AkkaKernelPlugin extends Plugin { Seq.empty[File] } - private case class Scripts(jvmOptions: String, mainClass: String) { + private case class Scripts(jvmOptions: String, mainClass: String, bootClass: String) { def writeScripts(to: File) = { scripts.map { script ⇒ @@ -131,8 +137,8 @@ object AkkaKernelPlugin extends Plugin { |AKKA_CLASSPATH="$AKKA_HOME/config:$AKKA_HOME/lib/*" |JAVA_OPTS="%s" | - |java $JAVA_OPTS -cp "$AKKA_CLASSPATH" -Dakka.home="$AKKA_HOME" %s "$@" - |""".stripMargin.format(jvmOptions, mainClass) + |java $JAVA_OPTS -cp "$AKKA_CLASSPATH" -Dakka.home="$AKKA_HOME" %s %s "$@" + |""".stripMargin.format(jvmOptions, mainClass, bootClass) private def distBatScript = """|@echo off @@ -140,8 +146,8 @@ object AkkaKernelPlugin extends Plugin { |set AKKA_CLASSPATH=%%AKKA_HOME%%\config;%%AKKA_HOME%%\lib\* |set JAVA_OPTS=%s | - |java %%JAVA_OPTS%% -cp "%%AKKA_CLASSPATH%%" -Dakka.home="%%AKKA_HOME%%" %s %%* - |""".stripMargin.format(jvmOptions, mainClass) + |java %%JAVA_OPTS%% -cp "%%AKKA_CLASSPATH%%" -Dakka.home="%%AKKA_HOME%%" %s %s %%* + |""".stripMargin.format(jvmOptions, mainClass, bootClass) private def setExecutable(target: File, executable: Boolean): Option[String] = { val success = target.setExecutable(executable, false) From 4d441966735a7632c6e8a0a8bd2f62d62364c18b Mon Sep 17 00:00:00 2001 From: Christian Krause Date: Wed, 14 Nov 2012 18:42:12 +0100 Subject: [PATCH 185/210] drop extra space between main class and bootable (cherry picked from commit a6c6078c58cf16918f8e0c58fe1beb6ed79354c6) --- akka-sbt-plugin/src/main/scala/AkkaKernelPlugin.scala | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/akka-sbt-plugin/src/main/scala/AkkaKernelPlugin.scala b/akka-sbt-plugin/src/main/scala/AkkaKernelPlugin.scala index c4625961b8..0a22709b1c 100644 --- a/akka-sbt-plugin/src/main/scala/AkkaKernelPlugin.scala +++ b/akka-sbt-plugin/src/main/scala/AkkaKernelPlugin.scala @@ -137,8 +137,8 @@ object AkkaKernelPlugin extends Plugin { |AKKA_CLASSPATH="$AKKA_HOME/config:$AKKA_HOME/lib/*" |JAVA_OPTS="%s" | - |java $JAVA_OPTS -cp "$AKKA_CLASSPATH" -Dakka.home="$AKKA_HOME" %s %s "$@" - |""".stripMargin.format(jvmOptions, mainClass, bootClass) + |java $JAVA_OPTS -cp "$AKKA_CLASSPATH" -Dakka.home="$AKKA_HOME" %s%s "$@" + |""".stripMargin.format(jvmOptions, mainClass, if (bootClass.nonEmpty) " " + bootClass else "") private def distBatScript = """|@echo off @@ -146,8 +146,8 @@ object AkkaKernelPlugin extends Plugin { |set AKKA_CLASSPATH=%%AKKA_HOME%%\config;%%AKKA_HOME%%\lib\* |set JAVA_OPTS=%s | - |java %%JAVA_OPTS%% -cp "%%AKKA_CLASSPATH%%" -Dakka.home="%%AKKA_HOME%%" %s %s %%* - |""".stripMargin.format(jvmOptions, mainClass, bootClass) + |java %%JAVA_OPTS%% -cp "%%AKKA_CLASSPATH%%" -Dakka.home="%%AKKA_HOME%%" %s%s %%* + |""".stripMargin.format(jvmOptions, mainClass, if (bootClass.nonEmpty) " " + bootClass else "") private def setExecutable(target: File, executable: Boolean): Option[String] = { val success = target.setExecutable(executable, false) From e8610e1ddde55ffa21fcc056e7ab36c692fa3fff Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Mon, 26 Nov 2012 17:42:25 +0100 Subject: [PATCH 186/210] Scalariforming --- akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala | 4 ++-- .../src/main/scala/akka/remote/RemoteActorRefProvider.scala | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala index ee766a5977..5a3bb7dac2 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala @@ -321,9 +321,9 @@ private[akka] object SystemGuardian { /** * Local ActorRef provider. - * + * * INTERNAL API! - * + * * Depending on this class is not supported, only the [[ActorRefProvider]] interface is supported. */ class LocalActorRefProvider( diff --git a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala index f65e8b6ad2..338d9c1280 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala @@ -14,9 +14,9 @@ import scala.util.control.NonFatal /** * Remote ActorRefProvider. Starts up actor on remote node and creates a RemoteActorRef representing it. - * + * * INTERNAL API! - * + * * Depending on this class is not supported, only the [[ActorRefProvider]] interface is supported. */ class RemoteActorRefProvider( From 51f0630ef1521a0b06d5d9fa986db1f2027b8517 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Mon, 26 Nov 2012 18:48:00 +0100 Subject: [PATCH 187/210] Updating to Scala 2.10.0-RC3 --- project/AkkaBuild.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index fcc3947a7d..4cf9c71002 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -30,7 +30,7 @@ object AkkaBuild extends Build { organization := "com.typesafe.akka", version := "2.2-SNAPSHOT", // FIXME: use 2.10.0 for final - scalaVersion := System.getProperty("akka.scalaVersion", "2.10.0-RC2") + scalaVersion := System.getProperty("akka.scalaVersion", "2.10.0-RC3") ) lazy val akka = Project( @@ -666,7 +666,7 @@ object Dependencies { val scalaStm = "org.scala-stm" % "scala-stm" % "0.6" cross CrossVersion.full // Modified BSD (Scala) val slf4jApi = "org.slf4j" % "slf4j-api" % "1.7.2" // MIT - val zeroMQClient = "org.zeromq" % "zeromq-scala-binding" % "0.0.6" cross CrossVersion.full // ApacheV2 + val zeroMQClient = "org.zeromq" % "zeromq-scala-binding_2.10.0-RC2" % "0.0.6" //cross CrossVersion.full // ApacheV2 val uncommonsMath = "org.uncommons.maths" % "uncommons-maths" % "1.2.2a" exclude("jfree", "jcommon") exclude("jfree", "jfreechart") // ApacheV2 val ariesBlueprint = "org.apache.aries.blueprint" % "org.apache.aries.blueprint" % "0.3.2" // ApacheV2 val osgiCore = "org.osgi" % "org.osgi.core" % "4.2.0" // ApacheV2 @@ -683,7 +683,7 @@ object Dependencies { val junit = "junit" % "junit" % "4.10" % "test" // Common Public License 1.0 val logback = "ch.qos.logback" % "logback-classic" % "1.0.7" % "test" // EPL 1.0 / LGPL 2.1 val mockito = "org.mockito" % "mockito-all" % "1.8.1" % "test" // MIT - val scalatest = "org.scalatest" % "scalatest" % "1.8-B2" % "test" cross CrossVersion.full // ApacheV2 + val scalatest = "org.scalatest" % "scalatest" % "1.8-B1" % "test" cross CrossVersion.full // ApacheV2 val scalacheck = "org.scalacheck" % "scalacheck" % "1.10.0" % "test" cross CrossVersion.full // New BSD val ariesProxy = "org.apache.aries.proxy" % "org.apache.aries.proxy.impl" % "0.3" % "test" // ApacheV2 val pojosr = "com.googlecode.pojosr" % "de.kalpatec.pojosr.framework" % "0.1.4" % "test" // ApacheV2 From f2755a932d4fa17ebde0ae24f1db1d997f3cfced Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Mon, 26 Nov 2012 23:21:40 +0100 Subject: [PATCH 188/210] Adding the correct, published, version for the zeromq binding for scala 2.10.0-RC3 --- project/AkkaBuild.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 4cf9c71002..64df349ed6 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -666,7 +666,7 @@ object Dependencies { val scalaStm = "org.scala-stm" % "scala-stm" % "0.6" cross CrossVersion.full // Modified BSD (Scala) val slf4jApi = "org.slf4j" % "slf4j-api" % "1.7.2" // MIT - val zeroMQClient = "org.zeromq" % "zeromq-scala-binding_2.10.0-RC2" % "0.0.6" //cross CrossVersion.full // ApacheV2 + val zeroMQClient = "org.zeromq" % "zeromq-scala-binding" % "0.0.6" cross CrossVersion.full // ApacheV2 val uncommonsMath = "org.uncommons.maths" % "uncommons-maths" % "1.2.2a" exclude("jfree", "jcommon") exclude("jfree", "jfreechart") // ApacheV2 val ariesBlueprint = "org.apache.aries.blueprint" % "org.apache.aries.blueprint" % "0.3.2" // ApacheV2 val osgiCore = "org.osgi" % "org.osgi.core" % "4.2.0" // ApacheV2 From 42b6bad65e2b78246614b7258f8d9e88127b4cbc Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Tue, 27 Nov 2012 17:46:27 +0100 Subject: [PATCH 189/210] Eliminate race in RoundRobinRoutedRemoteActorSpec, see #2725 * Resize is done via a message to the router so it might happen later. * For this test this could cause all messages to pass through before the actual resize took place. * The change in RoutedActorCell was done because it doesn't make sense and complicates testing to trigger resize when sending CurrentRoutees to the router. --- .../src/main/scala/akka/routing/Routing.scala | 2 +- .../RoundRobinRoutedRemoteActorSpec.scala | 21 ++++++++++--------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/akka-actor/src/main/scala/akka/routing/Routing.scala b/akka-actor/src/main/scala/akka/routing/Routing.scala index f41eb33ad3..2bb2215cf9 100644 --- a/akka-actor/src/main/scala/akka/routing/Routing.scala +++ b/akka-actor/src/main/scala/akka/routing/Routing.scala @@ -106,12 +106,12 @@ private[akka] class RoutedActorCell(_system: ActorSystemImpl, _ref: InternalActo } override def tell(message: Any, sender: ActorRef): Unit = { - resize() // Mucho importante val s = if (sender eq null) system.deadLetters else sender applyRoute(s, message) match { case Destination(_, x) :: Nil if x == self ⇒ super.tell(message, s) case refs ⇒ refs foreach { p ⇒ + resize() // Mucho importante val msg = message match { case wrapped: RouterEnvelope ⇒ wrapped.message case m ⇒ m diff --git a/akka-remote-tests/src/multi-jvm/scala/akka/remote/router/RoundRobinRoutedRemoteActorSpec.scala b/akka-remote-tests/src/multi-jvm/scala/akka/remote/router/RoundRobinRoutedRemoteActorSpec.scala index 52c2fa56b8..a75b983f07 100644 --- a/akka-remote-tests/src/multi-jvm/scala/akka/remote/router/RoundRobinRoutedRemoteActorSpec.scala +++ b/akka-remote-tests/src/multi-jvm/scala/akka/remote/router/RoundRobinRoutedRemoteActorSpec.scala @@ -12,8 +12,10 @@ import akka.actor.PoisonPill import akka.actor.Address import scala.concurrent.Await import akka.pattern.ask -import akka.remote.testkit.{STMultiNodeSpec, MultiNodeConfig, MultiNodeSpec} +import akka.remote.testkit.{ STMultiNodeSpec, MultiNodeConfig, MultiNodeSpec } import akka.routing.Broadcast +import akka.routing.CurrentRoutees +import akka.routing.RouterRoutees import akka.routing.RoundRobinRouter import akka.routing.RoutedActorRef import akka.routing.Resizer @@ -59,7 +61,7 @@ class RoundRobinRoutedRemoteActorMultiJvmNode3 extends RoundRobinRoutedRemoteAct class RoundRobinRoutedRemoteActorMultiJvmNode4 extends RoundRobinRoutedRemoteActorSpec class RoundRobinRoutedRemoteActorSpec extends MultiNodeSpec(RoundRobinRoutedRemoteActorMultiJvmSpec) - with STMultiNodeSpec with ImplicitSender with DefaultTimeout { + with STMultiNodeSpec with ImplicitSender with DefaultTimeout { import RoundRobinRoutedRemoteActorMultiJvmSpec._ def initialParticipants = 4 @@ -105,7 +107,7 @@ class RoundRobinRoutedRemoteActorSpec extends MultiNodeSpec(RoundRobinRoutedRemo } "A new remote actor configured with a RoundRobin router and Resizer" must { - "be locally instantiated on a remote node after several resize rounds" taggedAs LongRunningTest in { + "be locally instantiated on a remote node after several resize rounds" taggedAs LongRunningTest in within(5 seconds) { runOn(first, second, third) { enterBarrier("start", "broadcast-end", "end", "done") @@ -117,22 +119,21 @@ class RoundRobinRoutedRemoteActorSpec extends MultiNodeSpec(RoundRobinRoutedRemo resizer = Some(new TestResizer))), "service-hello2") actor.isInstanceOf[RoutedActorRef] must be(true) - val iterationCount = 9 + actor ! CurrentRoutees + expectMsgType[RouterRoutees].routees.size must be(1) val repliesFrom: Set[ActorRef] = - (for { - i ← 0 until iterationCount - } yield { + (for (n ← 2 to 8) yield { actor ! "hit" - receiveOne(5 seconds) match { case ref: ActorRef ⇒ ref } + awaitCond(Await.result(actor ? CurrentRoutees, remaining).asInstanceOf[RouterRoutees].routees.size == n) + expectMsgType[ActorRef] }).toSet enterBarrier("broadcast-end") actor ! Broadcast(PoisonPill) enterBarrier("end") - // at least more than one actor per node - repliesFrom.size must be > (3) + repliesFrom.size must be(7) val repliesFromAddresses = repliesFrom.map(_.path.address) repliesFromAddresses must be === (Set(node(first), node(second), node(third)).map(_.address)) From 3a3dad5c53412a1af735c115d5a47a9da570ab73 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Wed, 28 Nov 2012 10:56:08 +0100 Subject: [PATCH 190/210] #2709 - Adding documentation for wildcards in deployments. --- akka-docs/rst/java/remoting.rst | 9 +++++++++ akka-docs/rst/scala/remoting.rst | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/akka-docs/rst/java/remoting.rst b/akka-docs/rst/java/remoting.rst index aab5a1b013..fae73cfde7 100644 --- a/akka-docs/rst/java/remoting.rst +++ b/akka-docs/rst/java/remoting.rst @@ -122,6 +122,15 @@ actor systems has to have a JAR containing the class. object, which in most cases is not serializable. It is best to make a static inner class which implements :class:`UntypedActorFactory`. +.. note:: + + You can use asterisks as wildcard matches for the actor path sections, so you could specify: + ``/*/sampleActor`` and that would match all ``sampleActor`` on that level in the hierarchy. + You can also use wildcard in the last position to match all actors at a certain level: + ``/someParent/*``. Non-wildcard matches always have higher priority to match than wildcards, so: + ``/foo/bar`` is considered **more specific** than ``/foo/*`` and only the highest priority match is used. + Please note that it **cannot** be used to partially match section, like this: ``/foo*/bar``, ``/f*o/bar`` etc. + .. warning:: *Caveat:* Remote deployment ties both systems together in a tight fashion, diff --git a/akka-docs/rst/scala/remoting.rst b/akka-docs/rst/scala/remoting.rst index db5ddbf170..cf12c93c60 100644 --- a/akka-docs/rst/scala/remoting.rst +++ b/akka-docs/rst/scala/remoting.rst @@ -129,6 +129,15 @@ actor systems has to have a JAR containing the class. most cases is not serializable. It is best to create a factory method in the companion object of the actor’s class. +.. note:: + + You can use asterisks as wildcard matches for the actor paths, so you could specify: + ``/*/sampleActor`` and that would match all ``sampleActor`` on that level in the hierarchy. + You can also use wildcard in the last position to match all actors at a certain level: + ``/someParent/*``. Non-wildcard matches always have higher priority to match than wildcards, so: + ``/foo/bar`` is considered **more specific** than ``/foo/*`` and only the highest priority match is used. + Please note that it **cannot** be used to partially match section, like this: ``/foo*/bar``, ``/f*o/bar`` etc. + .. warning:: *Caveat:* Remote deployment ties both systems together in a tight fashion, From a46b74654f4a0ef1cbc93286dca8d706b6c7ccd9 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Thu, 29 Nov 2012 14:46:42 +0100 Subject: [PATCH 191/210] #2754 - adding the stopping of 0mq actors in the Java doc example as the Scala version has. --- akka-docs/rst/java/code/docs/zeromq/ZeromqDocTestBase.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/akka-docs/rst/java/code/docs/zeromq/ZeromqDocTestBase.java b/akka-docs/rst/java/code/docs/zeromq/ZeromqDocTestBase.java index d9d09a9bac..9ec3bc49f9 100644 --- a/akka-docs/rst/java/code/docs/zeromq/ZeromqDocTestBase.java +++ b/akka-docs/rst/java/code/docs/zeromq/ZeromqDocTestBase.java @@ -99,6 +99,9 @@ public class ZeromqDocTestBase { pubSocket.tell(new ZMQMessage(new Frame("foo.bar"), new Frame(payload)), null); //#pub-topic + system.stop(subSocket); + system.stop(subTopicSocket); + //#high-watermark ActorRef highWatermarkSocket = ZeroMQExtension.get(system).newRouterSocket( new SocketOption[] { new Listener(listener), From 2d38abadaee8f0683f2a7c645a4c016024296995 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Fri, 30 Nov 2012 22:28:11 +0100 Subject: [PATCH 192/210] #2755 - fixing the JMX_CLIENT_CLASSPATH --- akka-kernel/src/main/dist/bin/akka-cluster | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/akka-kernel/src/main/dist/bin/akka-cluster b/akka-kernel/src/main/dist/bin/akka-cluster index 0cbff520dd..c7bb125c52 100755 --- a/akka-kernel/src/main/dist/bin/akka-cluster +++ b/akka-kernel/src/main/dist/bin/akka-cluster @@ -16,7 +16,7 @@ declare AKKA_HOME="$(cd "$(cd "$(dirname "$0")"; pwd -P)"/..; pwd)" -[ -n "$JMX_CLIENT_CLASSPATH" ] || JMX_CLIENT_CLASSPATH="$AKKA_HOME/lib/akka/akka-kernel-*" +[ -n "$JMX_CLIENT_CLASSPATH" ] || JMX_CLIENT_CLASSPATH="$AKKA_HOME/lib/akka/akka-kernel*" # NOTE: The 'cmdline-jmxclient' is available as part of the Akka distribution. JMX_CLIENT="java -cp $JMX_CLIENT_CLASSPATH akka.jmx.Client -" From f6d12149b14efc8f486c9432904ff112b9020290 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Wed, 28 Nov 2012 11:35:45 +0100 Subject: [PATCH 193/210] Streamline tell and applyRoute in RoutedActorCell, see #2725 * Added some documentation of the behaviour for RouterEnvelope resize and CurrentRoutees. --- .../src/main/scala/akka/routing/Routing.scala | 43 ++++++++++++------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/akka-actor/src/main/scala/akka/routing/Routing.scala b/akka-actor/src/main/scala/akka/routing/Routing.scala index 2bb2215cf9..8c2c81bac2 100644 --- a/akka-actor/src/main/scala/akka/routing/Routing.scala +++ b/akka-actor/src/main/scala/akka/routing/Routing.scala @@ -23,7 +23,7 @@ import akka.event.Logging.Warning /** * A RoutedActorRef is an ActorRef that has a set of connected ActorRef and it uses a Router to - * send a message to on (or more) of these actors. + * send a message to one (or more) of these actors. */ private[akka] class RoutedActorRef(_system: ActorSystemImpl, _props: Props, _supervisor: InternalActorRef, _path: ActorPath) extends RepointableActorRef(_system, _props, _supervisor, _path) { @@ -77,7 +77,7 @@ private[akka] class RoutedActorCell(_system: ActorSystemImpl, _ref: InternalActo */ def applyRoute(sender: ActorRef, message: Any): immutable.Iterable[Destination] = message match { - case _: AutoReceivedMessage ⇒ Destination(self, self) :: Nil + case _: AutoReceivedMessage ⇒ Destination(sender, self) :: Nil case CurrentRoutees ⇒ sender ! RouterRoutees(_routees); Nil case msg if route.isDefinedAt(sender, msg) ⇒ route(sender, message) case _ ⇒ Nil @@ -105,20 +105,31 @@ private[akka] class RoutedActorCell(_system: ActorSystemImpl, _ref: InternalActo _routees = abandonedRoutees.foldLeft(_routees) { (xs, x) ⇒ unwatch(x); xs.filterNot(_ == x) } } + /** + * Send the message to the destinations defined by the `route` function. + * + * If the message is a [[akka.routing.RouterEnvelope]] it will be + * unwrapped before sent to the destinations. + * + * When [[akka.routing.CurrentRoutees]] is sent to the RoutedActorRef it + * replies with [[akka.routing.RouterRoutees]]. + * + * Resize is triggered when messages are sent to the routees, and the + * resizer is invoked asynchronously, i.e. not necessarily before the + * message has been sent. + */ override def tell(message: Any, sender: ActorRef): Unit = { val s = if (sender eq null) system.deadLetters else sender - applyRoute(s, message) match { - case Destination(_, x) :: Nil if x == self ⇒ - super.tell(message, s) - case refs ⇒ refs foreach { p ⇒ - resize() // Mucho importante - val msg = message match { - case wrapped: RouterEnvelope ⇒ wrapped.message - case m ⇒ m - } - if (p.recipient == self) super.tell(msg, p.sender) - else p.recipient.!(msg)(p.sender) - } + val msg = message match { + case wrapped: RouterEnvelope ⇒ wrapped.message + case m ⇒ m + } + applyRoute(s, message) foreach { + case Destination(snd, `self`) ⇒ + super.tell(msg, snd) + case Destination(snd, recipient) ⇒ + resize() // only resize when the message target is one of the routees + recipient.tell(msg, snd) } } @@ -195,7 +206,9 @@ trait RouterConfig { /** * Routers with dynamically resizable number of routees return the [[akka.routing.Resizer]] - * to use. + * to use. The resizer is invoked once when the router is created, before any messages can + * be sent to it. Resize is also triggered when messages are sent to the routees, and the + * resizer is invoked asynchronously, i.e. not necessarily before the message has been sent. */ def resizer: Option[Resizer] = None From 59895cea9dd8811a99efefccc9052e6d27822cd8 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Mon, 3 Dec 2012 14:16:45 +0100 Subject: [PATCH 194/210] Adopt ResizerSpec, resize not triggered by CurrentRoutees, see #2725 --- .../src/test/scala/akka/routing/ResizerSpec.scala | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/routing/ResizerSpec.scala b/akka-actor-tests/src/test/scala/akka/routing/ResizerSpec.scala index 9a9dbe24ac..5f3d2bdce1 100644 --- a/akka-actor-tests/src/test/scala/akka/routing/ResizerSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/routing/ResizerSpec.scala @@ -173,7 +173,7 @@ class ResizerSpec extends AkkaSpec(ResizerSpec.config) with DefaultTimeout with routeeSize(router) must be(resizer.upperBound) } - "backoff" in { + "backoff" in within(10 seconds) { val resizer = DefaultResizer( lowerBound = 1, @@ -202,12 +202,11 @@ class ResizerSpec extends AkkaSpec(ResizerSpec.config) with DefaultTimeout with Thread.sleep((300 millis).dilated.toMillis) // let it cool down - for (m ← 0 to 5) { - router ! 1 - Thread.sleep((500 millis).dilated.toMillis) - } + awaitCond({ + router ! 1 // trigger resize + routeeSize(router) < z + }, interval = 500.millis.dilated) - awaitCond(Try(routeeSize(router) < (z)).getOrElse(false)) } } From 370eeb00a445bd40f275be642f986917e8d9b967 Mon Sep 17 00:00:00 2001 From: Roland Date: Tue, 27 Nov 2012 16:33:37 +0100 Subject: [PATCH 195/210] #2747 - warn against use-dispatcher-for-io --- akka-remote/src/main/resources/reference.conf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/akka-remote/src/main/resources/reference.conf b/akka-remote/src/main/resources/reference.conf index cd4259e3d9..bb91d1a34c 100644 --- a/akka-remote/src/main/resources/reference.conf +++ b/akka-remote/src/main/resources/reference.conf @@ -109,6 +109,11 @@ akka { # (I) EXPERIMENTAL If "" then the specified dispatcher # will be used to accept inbound connections, and perform IO. If "" then # dedicated threads will be used. + # + # CAUTION: This might lead to the used dispatcher not shutting down properly! + # - may prevent the JVM from shutting down normally + # - may leak threads when shutting down an ActorSystem + # use-dispatcher-for-io = "" # (I) The hostname or ip to bind the remoting to, From cda2c2b62a8b2e294f03530a8ec6cac8c47a2d11 Mon Sep 17 00:00:00 2001 From: Roland Date: Wed, 28 Nov 2012 14:56:53 +0100 Subject: [PATCH 196/210] #2746 - document provider.getDefaultAddress --- .../serialization/SerializationDocTestBase.java | 7 +------ akka-docs/rst/java/serialization.rst | 8 ++------ .../serialization/SerializationDocSpec.scala | 15 +-------------- akka-docs/rst/scala/serialization.rst | 16 ++-------------- 4 files changed, 6 insertions(+), 40 deletions(-) diff --git a/akka-docs/rst/java/code/docs/serialization/SerializationDocTestBase.java b/akka-docs/rst/java/code/docs/serialization/SerializationDocTestBase.java index 7fdb6420f1..db46031584 100644 --- a/akka-docs/rst/java/code/docs/serialization/SerializationDocTestBase.java +++ b/akka-docs/rst/java/code/docs/serialization/SerializationDocTestBase.java @@ -138,12 +138,7 @@ public class SerializationDocTestBase { } public Address getAddress() { - final ActorRefProvider provider = system.provider(); - if (provider instanceof RemoteActorRefProvider) { - return ((RemoteActorRefProvider) provider).transport().address(); - } else { - throw new UnsupportedOperationException("need RemoteActorRefProvider"); - } + return system.provider().getDefaultAddress(); } } diff --git a/akka-docs/rst/java/serialization.rst b/akka-docs/rst/java/serialization.rst index caec1ba325..4668597c4f 100644 --- a/akka-docs/rst/java/serialization.rst +++ b/akka-docs/rst/java/serialization.rst @@ -149,16 +149,12 @@ concrete address handy you can create a dummy one for the right protocol using ``new Address(protocol, "", "", 0)`` (assuming that the actual transport used is as lenient as Akka’s RemoteActorRefProvider). -There is a possible simplification available if you are just using the default -:class:`NettyRemoteTransport` with the :meth:`RemoteActorRefProvider`, which is -enabled by the fact that this combination has just a single remote address: +There is also a default remote address which is the one used by cluster support +(and typical systems have just this one); you can get it like this: .. includecode:: code/docs/serialization/SerializationDocTestBase.java :include: external-address-default -This solution has to be adapted once other providers are used (like the planned -extensions for clustering). - Deep serialization of Actors ---------------------------- diff --git a/akka-docs/rst/scala/code/docs/serialization/SerializationDocSpec.scala b/akka-docs/rst/scala/code/docs/serialization/SerializationDocSpec.scala index d979952887..1607556ab2 100644 --- a/akka-docs/rst/scala/code/docs/serialization/SerializationDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/serialization/SerializationDocSpec.scala @@ -2,19 +2,6 @@ * Copyright (C) 2009-2012 Typesafe Inc. */ -//#extract-transport -package object akka { - // needs to be inside the akka package because accessing unsupported API ! - def transportOf(system: actor.ExtendedActorSystem): remote.RemoteTransport = - system.provider match { - case r: remote.RemoteActorRefProvider ⇒ r.transport - case _ ⇒ - throw new UnsupportedOperationException( - "this method requires the RemoteActorRefProvider to be configured") - } -} -//#extract-transport - package docs.serialization { import org.scalatest.matchers.MustMatchers @@ -216,7 +203,7 @@ package docs.serialization { object ExternalAddress extends ExtensionKey[ExternalAddressExt] class ExternalAddressExt(system: ExtendedActorSystem) extends Extension { - def addressForAkka: Address = akka.transportOf(system).address + def addressForAkka: Address = system.provider.getDefaultAddress } def serializeAkkaDefault(ref: ActorRef): String = diff --git a/akka-docs/rst/scala/serialization.rst b/akka-docs/rst/scala/serialization.rst index 10283b441f..70a02faecd 100644 --- a/akka-docs/rst/scala/serialization.rst +++ b/akka-docs/rst/scala/serialization.rst @@ -138,24 +138,12 @@ concrete address handy you can create a dummy one for the right protocol using ``Address(protocol, "", "", 0)`` (assuming that the actual transport used is as lenient as Akka’s RemoteActorRefProvider). -There is a possible simplification available if you are just using the default -:class:`NettyRemoteTransport` with the :meth:`RemoteActorRefProvider`, which is -enabled by the fact that this combination has just a single remote address. -This approach relies on internal API, which means that it is not guaranteed to -be supported in future versions. To make this caveat more obvious, some bridge -code in the ``akka`` package is required to make it work: - -.. includecode:: code/docs/serialization/SerializationDocSpec.scala - :include: extract-transport - -And with this, the address extraction goes like this: +There is also a default remote address which is the one used by cluster support +(and typical systems have just this one); you can get it like this: .. includecode:: code/docs/serialization/SerializationDocSpec.scala :include: external-address-default -This solution has to be adapted once other providers are used (like the planned -extensions for clustering). - Deep serialization of Actors ---------------------------- From 5cf2e7f8fd31324395fae122a31138add5043f12 Mon Sep 17 00:00:00 2001 From: Roland Date: Wed, 28 Nov 2012 15:43:42 +0100 Subject: [PATCH 197/210] #2644 - doc FSM.NullFunction and when-requirements --- akka-docs/rst/scala/code/docs/actor/FSMDocSpec.scala | 9 +++++++++ akka-docs/rst/scala/fsm.rst | 12 ++++++++++++ 2 files changed, 21 insertions(+) diff --git a/akka-docs/rst/scala/code/docs/actor/FSMDocSpec.scala b/akka-docs/rst/scala/code/docs/actor/FSMDocSpec.scala index cc88416b0e..15821419d4 100644 --- a/akka-docs/rst/scala/code/docs/actor/FSMDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/actor/FSMDocSpec.scala @@ -189,6 +189,15 @@ class FSMDocSpec extends MyFavoriteTestFrameWorkPlusAkkaTestKit { } //#fsm-code-elided + "demonstrate NullFunction" in { + class A extends Actor with FSM[Int, Null] { + val SomeState = 0 + //#NullFunction + when(SomeState)(FSM.NullFunction) + //#NullFunction + } + } + "batch correctly" in { val buncher = system.actorOf(Props(new Buncher)) buncher ! SetTarget(testActor) diff --git a/akka-docs/rst/scala/fsm.rst b/akka-docs/rst/scala/fsm.rst index 4ace396a14..1d87890db3 100644 --- a/akka-docs/rst/scala/fsm.rst +++ b/akka-docs/rst/scala/fsm.rst @@ -179,6 +179,18 @@ demonstrated below: The :class:`Event(msg: Any, data: D)` case class is parameterized with the data type held by the FSM for convenient pattern matching. +.. warning:: + + It is required that you define handlers for each of the possible FSM states, + otherwise there will be failures when trying to switch to undeclared states. + +It is recommended practice to declare the states as objects extending a +sealed trait and then verify that there is a ``when`` clause for each of the +states. If you want to leave the handling of a state “unhandled” (more below), +it still needs to be declared like this: + +.. includecode:: code/docs/actor/FSMDocSpec.scala#NullFunction + Defining the Initial State -------------------------- From 6140892a5fc9879c7c5ae95d39f1952c013bfeb8 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Mon, 3 Dec 2012 14:29:50 +0100 Subject: [PATCH 198/210] Removing the boolean var in UnstartedActorCell and replace it with an inspection of lookup and underlying. --- .../src/main/scala/akka/actor/RepointableActorRef.scala | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala index 1385e7053c..02aef18564 100644 --- a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala @@ -49,7 +49,7 @@ private[akka] class RepointableActorRef( @volatile private var _lookupDoNotCallMeDirectly: Cell = _ def underlying: Cell = Unsafe.instance.getObjectVolatile(this, cellOffset).asInstanceOf[Cell] - private def lookup = Unsafe.instance.getObjectVolatile(this, lookupOffset).asInstanceOf[Cell] + def lookup = Unsafe.instance.getObjectVolatile(this, lookupOffset).asInstanceOf[Cell] @tailrec final def swapCell(next: Cell): Cell = { val old = underlying @@ -173,13 +173,10 @@ private[akka] class UnstartedCell(val systemImpl: ActorSystemImpl, // use Envelope to keep on-send checks in the same place ACCESS MUST BE PROTECTED BY THE LOCK private[this] final val queue = new JLinkedList[Any]() - // ACCESS MUST BE PROTECTED BY THE LOCK, is used to detect when messages are sent during replace - private[this] final var isBeingReplaced = false import systemImpl.settings.UnstartedPushTimeout.{ duration ⇒ timeout } def replaceWith(cell: Cell): Unit = locked { - isBeingReplaced = true try { while (!queue.isEmpty) { queue.poll() match { @@ -188,7 +185,6 @@ private[akka] class UnstartedCell(val systemImpl: ActorSystemImpl, } } } finally { - isBeingReplaced = false self.swapCell(cell) } } @@ -234,7 +230,7 @@ private[akka] class UnstartedCell(val systemImpl: ActorSystemImpl, cell.sendSystemMessage(msg) } else { // systemMessages that are sent during replace need to jump to just after the last system message in the queue, so it's processed before other messages - val wasEnqueued = if (isBeingReplaced && !queue.isEmpty()) { + val wasEnqueued = if ((self.lookup ne this) && (self.underlying eq this) && !queue.isEmpty()) { @tailrec def tryEnqueue(i: JListIterator[Any] = queue.listIterator(), insertIntoIndex: Int = -1): Boolean = if (i.hasNext()) tryEnqueue(i, From 075dbe1ec69eb69e30fe6f7b8e36c9bed7271533 Mon Sep 17 00:00:00 2001 From: Rich Dougherty Date: Tue, 4 Dec 2012 15:26:57 +0100 Subject: [PATCH 199/210] Cancel all timers when FSM terminated. Fixes #2689 --- .../test/scala/akka/actor/FSMActorSpec.scala | 42 +++++++++++++++++++ .../src/main/scala/akka/actor/FSM.scala | 7 ++++ .../main/scala/akka/testkit/TestFSMRef.scala | 4 ++ 3 files changed, 53 insertions(+) diff --git a/akka-actor-tests/src/test/scala/akka/actor/FSMActorSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/FSMActorSpec.scala index f0e5e44ad4..dbdeb8bef9 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/FSMActorSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/FSMActorSpec.scala @@ -13,6 +13,9 @@ import akka.event._ import com.typesafe.config.ConfigFactory import scala.concurrent.Await import akka.util.Timeout +import org.scalatest.matchers.Matcher +import org.scalatest.matchers.HavePropertyMatcher +import org.scalatest.matchers.HavePropertyMatchResult object FSMActorSpec { val timeout = Timeout(2 seconds) @@ -199,6 +202,45 @@ class FSMActorSpec extends AkkaSpec(Map("akka.actor.debug.fsm" -> true)) with Im expectMsg(1 second, fsm.StopEvent(FSM.Shutdown, 1, null)) } + "cancel all timers when terminated" in { + val timerNames = List("timer-1", "timer-2", "timer-3") + + // Lazy so fsmref can refer to checkTimersActive + lazy val fsmref = TestFSMRef(new Actor with FSM[String, Null] { + startWith("not-started", null) + when("not-started") { + case Event("start", _) ⇒ goto("started") replying "starting" + } + when("started", stateTimeout = 10 seconds) { + case Event("stop", _) ⇒ stop() + } + onTransition { + case "not-started" -> "started" ⇒ + for (timerName ← timerNames) setTimer(timerName, (), 10 seconds, false) + } + onTermination { + case _ ⇒ { + checkTimersActive(false) + testActor ! "stopped" + } + } + }) + + def checkTimersActive(active: Boolean) { + for (timer ← timerNames) fsmref.timerActive_?(timer) must be(active) + fsmref.isStateTimerActive must be(active) + } + + checkTimersActive(false) + + fsmref ! "start" + expectMsg(1 second, "starting") + checkTimersActive(true) + + fsmref ! "stop" + expectMsg(1 second, "stopped") + } + "log events and transitions if asked to do so" in { import scala.collection.JavaConverters._ val config = ConfigFactory.parseMap(Map("akka.loglevel" -> "DEBUG", diff --git a/akka-actor/src/main/scala/akka/actor/FSM.scala b/akka-actor/src/main/scala/akka/actor/FSM.scala index 069691ce67..8a915f8906 100644 --- a/akka-actor/src/main/scala/akka/actor/FSM.scala +++ b/akka-actor/src/main/scala/akka/actor/FSM.scala @@ -380,6 +380,11 @@ trait FSM[S, D] extends Listeners with ActorLogging { */ final def setStateTimeout(state: S, timeout: Timeout): Unit = stateTimeouts(state) = timeout + /** + * Internal API, used for testing. + */ + private[akka] final def isStateTimerActive = timeoutFuture.isDefined + /** * Set handler which is called upon each state transition, i.e. not when * staying in the same state. This may use the pair extractor defined in the @@ -634,6 +639,8 @@ trait FSM[S, D] extends Listeners with ActorLogging { case Failure(msg: AnyRef) ⇒ log.error(msg.toString) case _ ⇒ } + for (timer ← timers.values) timer.cancel() + timers.clear() val stopEvent = StopEvent(reason, currentState.stateName, currentState.stateData) if (terminateEvent.isDefinedAt(stopEvent)) terminateEvent(stopEvent) diff --git a/akka-testkit/src/main/scala/akka/testkit/TestFSMRef.scala b/akka-testkit/src/main/scala/akka/testkit/TestFSMRef.scala index c60d9d85f4..0fda681922 100644 --- a/akka-testkit/src/main/scala/akka/testkit/TestFSMRef.scala +++ b/akka-testkit/src/main/scala/akka/testkit/TestFSMRef.scala @@ -80,6 +80,10 @@ class TestFSMRef[S, D, T <: Actor]( */ def timerActive_?(name: String) = fsm.timerActive_?(name) + /** + * Proxy for FSM.timerActive_?. + */ + def isStateTimerActive = fsm.isStateTimerActive } object TestFSMRef { From 503e992d44df94a52cb47899fdfb021641e6530a Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Tue, 4 Dec 2012 17:07:08 +0100 Subject: [PATCH 200/210] Await leader in awaitUpConvergence, see #2752 It's a glitch in how ClusterReadView (used in tests) is updated. First we do awaitUpConvergence, which checks readView.members and readView.convergence. Then we do assertLeader, which checks readView.leader. The problem is that readView.leader might not have been updated yet (if there already was convergence). Solution is to await the expected leader in awaitUpConvergence, so that readView is in a consistent state after awaitUpConvergence. We will change the semantics in ticket #2692, but this change will be needed and should work with that as well. --- .../multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala | 3 +++ 1 file changed, 3 insertions(+) diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala index fe3c910312..43af47b70f 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/MultiNodeClusterSpec.scala @@ -224,6 +224,9 @@ trait MultiNodeClusterSpec extends Suite with STMultiNodeSpec { self: MultiNodeS awaitCond(clusterView.members.size == numberOfMembers) awaitCond(clusterView.members.forall(_.status == MemberStatus.Up)) awaitCond(clusterView.convergence) + // clusterView.leader is updated by LeaderChanged, await that to be updated also + val expectedLeader = clusterView.members.headOption.map(_.address) + awaitCond(clusterView.leader == expectedLeader) if (!canNotBePartOfMemberRing.isEmpty) // don't run this on an empty set awaitCond( canNotBePartOfMemberRing forall (address ⇒ !(clusterView.members exists (_.address == address)))) From 1673ccd51c09867854d0e0128a3092ca8c4f2063 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Tue, 4 Dec 2012 17:54:17 +0100 Subject: [PATCH 201/210] Load Cluster extension from ClusterActorRefProvider, see #2704 --- .../akka/cluster/ClusterActorRefProvider.scala | 7 +++++++ .../cluster/ClusterDomainEventPublisherSpec.scala | 14 +------------- akka-docs/rst/cluster/cluster-usage-java.rst | 5 ++--- akka-docs/rst/cluster/cluster-usage-scala.rst | 5 ++--- .../src/main/resources/application.conf | 2 -- 5 files changed, 12 insertions(+), 21 deletions(-) diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterActorRefProvider.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterActorRefProvider.scala index a4a1b37e86..5adb57615a 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterActorRefProvider.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterActorRefProvider.scala @@ -37,6 +37,10 @@ import akka.cluster.routing.MetricsSelector /** * INTERNAL API + * + * The `ClusterActorRefProvider` will load the [[akka.cluster.Cluster]] + * extension, i.e. the cluster will automatically be started when + * the `ClusterActorRefProvider` is used. */ class ClusterActorRefProvider( _systemName: String, @@ -51,6 +55,9 @@ class ClusterActorRefProvider( override def init(system: ActorSystemImpl): Unit = { super.init(system) + // initialize/load the Cluster extension + Cluster(system) + remoteDeploymentWatcher = system.systemActorOf(Props[RemoteDeploymentWatcher], "RemoteDeploymentWatcher") } diff --git a/akka-cluster/src/test/scala/akka/cluster/ClusterDomainEventPublisherSpec.scala b/akka-cluster/src/test/scala/akka/cluster/ClusterDomainEventPublisherSpec.scala index 188c91505c..59252ba599 100644 --- a/akka-cluster/src/test/scala/akka/cluster/ClusterDomainEventPublisherSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/ClusterDomainEventPublisherSpec.scala @@ -18,21 +18,9 @@ import akka.testkit.ImplicitSender import akka.actor.ActorRef import akka.testkit.TestProbe -object ClusterDomainEventPublisherSpec { - val config = """ - akka.cluster.auto-join = off - akka.actor.provider = "akka.cluster.ClusterActorRefProvider" - akka.remote.log-remote-lifecycle-events = off - akka.remote.netty.port = 0 - """ - - case class GossipTo(address: Address) -} - @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) -class ClusterDomainEventPublisherSpec extends AkkaSpec(ClusterDomainEventPublisherSpec.config) +class ClusterDomainEventPublisherSpec extends AkkaSpec with BeforeAndAfterEach with ImplicitSender { - import ClusterDomainEventPublisherSpec._ var publisher: ActorRef = _ val a1 = Member(Address("akka", "sys", "a", 2552), Up) diff --git a/akka-docs/rst/cluster/cluster-usage-java.rst b/akka-docs/rst/cluster/cluster-usage-java.rst index 113b6f2b90..c1f00d638e 100644 --- a/akka-docs/rst/cluster/cluster-usage-java.rst +++ b/akka-docs/rst/cluster/cluster-usage-java.rst @@ -31,7 +31,7 @@ A Simple Cluster Example ^^^^^^^^^^^^^^^^^^^^^^^^ The following small program together with its configuration starts an ``ActorSystem`` -with the Cluster extension enabled. It joins the cluster and logs some membership events. +with the Cluster enabled. It joins the cluster and logs some membership events. Try it out: @@ -42,8 +42,7 @@ Try it out: To enable cluster capabilities in your Akka project you should, at a minimum, add the :ref:`remoting-java` settings, but with ``akka.cluster.ClusterActorRefProvider``. -The ``akka.cluster.seed-nodes`` and cluster extension should normally also be added to your -``application.conf`` file. +The ``akka.cluster.seed-nodes`` should normally also be added to your ``application.conf`` file. The seed nodes are configured contact points for initial, automatic, join of the cluster. diff --git a/akka-docs/rst/cluster/cluster-usage-scala.rst b/akka-docs/rst/cluster/cluster-usage-scala.rst index fd57471633..5e0bc94e2b 100644 --- a/akka-docs/rst/cluster/cluster-usage-scala.rst +++ b/akka-docs/rst/cluster/cluster-usage-scala.rst @@ -25,7 +25,7 @@ A Simple Cluster Example ^^^^^^^^^^^^^^^^^^^^^^^^ The following small program together with its configuration starts an ``ActorSystem`` -with the Cluster extension enabled. It joins the cluster and logs some membership events. +with the Cluster enabled. It joins the cluster and logs some membership events. Try it out: @@ -36,8 +36,7 @@ Try it out: To enable cluster capabilities in your Akka project you should, at a minimum, add the :ref:`remoting-scala` settings, but with ``akka.cluster.ClusterActorRefProvider``. -The ``akka.cluster.seed-nodes`` and cluster extension should normally also be added to your -``application.conf`` file. +The ``akka.cluster.seed-nodes`` should normally also be added to your ``application.conf`` file. The seed nodes are configured contact points for initial, automatic, join of the cluster. diff --git a/akka-samples/akka-sample-cluster/src/main/resources/application.conf b/akka-samples/akka-sample-cluster/src/main/resources/application.conf index 09f6cd446d..507191b79c 100644 --- a/akka-samples/akka-sample-cluster/src/main/resources/application.conf +++ b/akka-samples/akka-sample-cluster/src/main/resources/application.conf @@ -12,8 +12,6 @@ akka { } } - extensions = ["akka.cluster.Cluster"] - cluster { seed-nodes = [ "akka://ClusterSystem@127.0.0.1:2551", From d2ce939db49fda4c2264bde372e93ddc843b526c Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Wed, 5 Dec 2012 09:32:10 +0100 Subject: [PATCH 202/210] Adjust backoffThreshold in ResizerSpec, see #2763 * When it failed the backoff calculation was often based on pressure=1 and capacity=4, 1/4=0.25 which is greater than the backoffThreshold=0.2, i.e no backoff was done. * Changed backoffThreshold to 0.4. * Avoid sleep inside the target actor when cool down --- .../src/test/scala/akka/routing/ResizerSpec.scala | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/routing/ResizerSpec.scala b/akka-actor-tests/src/test/scala/akka/routing/ResizerSpec.scala index 5f3d2bdce1..b2eeccf3bf 100644 --- a/akka-actor-tests/src/test/scala/akka/routing/ResizerSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/routing/ResizerSpec.scala @@ -180,13 +180,14 @@ class ResizerSpec extends AkkaSpec(ResizerSpec.config) with DefaultTimeout with upperBound = 5, rampupRate = 1.0, backoffRate = 1.0, - backoffThreshold = 0.20, + backoffThreshold = 0.40, pressureThreshold = 1, messagesPerResize = 1) val router = system.actorOf(Props(new Actor { def receive = { - case n: Int ⇒ Thread.sleep((n millis).dilated.toMillis) + case n: Int if n <= 0 ⇒ // done + case n: Int ⇒ Thread.sleep((n millis).dilated.toMillis) } }).withRouter(RoundRobinRouter(resizer = Some(resizer)))) @@ -203,7 +204,7 @@ class ResizerSpec extends AkkaSpec(ResizerSpec.config) with DefaultTimeout with // let it cool down awaitCond({ - router ! 1 // trigger resize + router ! 0 // trigger resize routeeSize(router) < z }, interval = 500.millis.dilated) From 7695bb0697f2856df4075b6ce9fd2b25d8ea8e36 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Wed, 5 Dec 2012 12:17:39 +0100 Subject: [PATCH 203/210] Don't use top level actor in PriorityDispatcherSpec, see #2745 * The actor was a top level, i.e. RepointableActorRef. Messages sent to self from constructor could be queued in UnstartedCell, and then sent to the real PriorityQueue later, processed immediately without the ordering taking place first. --- .../dispatch/PriorityDispatcherSpec.scala | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/dispatch/PriorityDispatcherSpec.scala b/akka-actor-tests/src/test/scala/akka/dispatch/PriorityDispatcherSpec.scala index 4dad37c1be..4e76c5bea6 100644 --- a/akka-actor-tests/src/test/scala/akka/dispatch/PriorityDispatcherSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/dispatch/PriorityDispatcherSpec.scala @@ -51,19 +51,28 @@ class PriorityDispatcherSpec extends AkkaSpec(PriorityDispatcherSpec.config) wit def testOrdering(dispatcherKey: String) { val msgs = (1 to 100) toList + // It's important that the actor under test is not a top level actor + // with RepointableActorRef, since messages might be queued in + // UnstartedCell and the sent to the PriorityQueue and consumed immediately + // without the ordering taking place. val actor = system.actorOf(Props(new Actor { + context.actorOf(Props(new Actor { - val acc = scala.collection.mutable.ListBuffer[Int]() + val acc = scala.collection.mutable.ListBuffer[Int]() - scala.util.Random.shuffle(msgs) foreach { m ⇒ self ! m } + scala.util.Random.shuffle(msgs) foreach { m ⇒ self ! m } - self.tell('Result, testActor) + self.tell('Result, testActor) - def receive = { - case i: Int ⇒ acc += i - case 'Result ⇒ sender ! acc.toList - } - }).withDispatcher(dispatcherKey)) + def receive = { + case i: Int ⇒ acc += i + case 'Result ⇒ sender ! acc.toList + } + }).withDispatcher(dispatcherKey)) + + def receive = Actor.emptyBehavior + + })) expectMsgType[List[_]] must be === msgs } From 6a26dda6f70e2a81911e02a750d3304d46b334d6 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Wed, 5 Dec 2012 12:58:48 +0100 Subject: [PATCH 204/210] DOCS: tick-duration.tick-duration, see #2748 --- akka-docs/rst/cluster/cluster-usage-java.rst | 2 +- akka-docs/rst/cluster/cluster-usage-scala.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/akka-docs/rst/cluster/cluster-usage-java.rst b/akka-docs/rst/cluster/cluster-usage-java.rst index 113b6f2b90..ab2fe1d356 100644 --- a/akka-docs/rst/cluster/cluster-usage-java.rst +++ b/akka-docs/rst/cluster/cluster-usage-java.rst @@ -623,7 +623,7 @@ introduce the extra overhead of another thread. :: # shorter tick-duration of default scheduler when using cluster - akka.scheduler.tick-duration.tick-duration = 33ms + akka.scheduler.tick-duration = 33ms diff --git a/akka-docs/rst/cluster/cluster-usage-scala.rst b/akka-docs/rst/cluster/cluster-usage-scala.rst index fd57471633..0495e9a9b6 100644 --- a/akka-docs/rst/cluster/cluster-usage-scala.rst +++ b/akka-docs/rst/cluster/cluster-usage-scala.rst @@ -629,7 +629,7 @@ introduce the extra overhead of another thread. :: # shorter tick-duration of default scheduler when using cluster - akka.scheduler.tick-duration.tick-duration = 33ms + akka.scheduler.tick-duration = 33ms From 208dff5166a755b49f7b7f613d463a07a6407a2d Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Wed, 5 Dec 2012 13:27:50 +0100 Subject: [PATCH 205/210] DOCS: Remove reference to non-existing bundled sample, see #2753 --- akka-docs/rst/java/microkernel.rst | 6 +----- akka-docs/rst/scala/microkernel.rst | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/akka-docs/rst/java/microkernel.rst b/akka-docs/rst/java/microkernel.rst index db7c547b89..832e02ef90 100644 --- a/akka-docs/rst/java/microkernel.rst +++ b/akka-docs/rst/java/microkernel.rst @@ -19,11 +19,7 @@ Put your application jar in the ``deploy`` directory to have it automatically loaded. To start the kernel use the scripts in the ``bin`` directory, passing the boot -classes for your application. - -There is a simple example of an application setup for running with the -microkernel included in the akka download. This can be run with the following -command (on a unix-based system): +classes for your application. Example command (on a unix-based system): .. code-block:: none diff --git a/akka-docs/rst/scala/microkernel.rst b/akka-docs/rst/scala/microkernel.rst index 51e0bf4ac4..5a1908346a 100644 --- a/akka-docs/rst/scala/microkernel.rst +++ b/akka-docs/rst/scala/microkernel.rst @@ -19,11 +19,7 @@ Put your application jar in the ``deploy`` directory to have it automatically loaded. To start the kernel use the scripts in the ``bin`` directory, passing the boot -classes for your application. - -There is a simple example of an application setup for running with the -microkernel included in the akka download. This can be run with the following -command (on a unix-based system): +classes for your application. Example command (on a unix-based system): .. code-block:: none From 3a2240085a9e272add8b969d1fdfa67d8e41dab1 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Wed, 5 Dec 2012 13:35:09 +0100 Subject: [PATCH 206/210] DOCS: Correct ScalaVersion in microkernel Build sample, see #2758 --- akka-sbt-plugin/sample/project/Build.scala | 2 +- project/AkkaBuild.scala | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/akka-sbt-plugin/sample/project/Build.scala b/akka-sbt-plugin/sample/project/Build.scala index 8a3172430e..5223e097bd 100644 --- a/akka-sbt-plugin/sample/project/Build.scala +++ b/akka-sbt-plugin/sample/project/Build.scala @@ -7,7 +7,7 @@ import akka.sbt.AkkaKernelPlugin.{ Dist, outputDirectory, distJvmOptions} object HelloKernelBuild extends Build { val Organization = "akka.sample" val Version = "2.2-SNAPSHOT" - val ScalaVersion = "2.10.0-RC1" + val ScalaVersion = "2.10.0-RC3" lazy val HelloKernel = Project( id = "hello-kernel", diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 70911c9080..d71bb7ee17 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -30,6 +30,7 @@ object AkkaBuild extends Build { organization := "com.typesafe.akka", version := "2.2-SNAPSHOT", // FIXME: use 2.10.0 for final + // Also change ScalaVersion in akka-sbt-plugin/sample/project/Build.scala scalaVersion := System.getProperty("akka.scalaVersion", "2.10.0-RC3") ) From dea3ea843fdf18285dcaa7fbf5b25894fe5d0e37 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Wed, 5 Dec 2012 13:51:03 +0100 Subject: [PATCH 207/210] DOCS: corr then -> than, see #2757 --- akka-docs/rst/scala/io.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/akka-docs/rst/scala/io.rst b/akka-docs/rst/scala/io.rst index 866fa8bffc..abeb6b729c 100644 --- a/akka-docs/rst/scala/io.rst +++ b/akka-docs/rst/scala/io.rst @@ -138,9 +138,9 @@ Receiving messages from the ``IOManager``: IO.Iteratee ^^^^^^^^^^^ -Included with Akka's IO support is a basic implementation of ``Iteratee``\s. ``Iteratee``\s are an effective way of handling a stream of data without needing to wait for all the data to arrive. This is especially useful when dealing with non blocking IO since we will usually receive data in chunks which may not include enough information to process, or it may contain much more data then we currently need. +Included with Akka's IO support is a basic implementation of ``Iteratee``\s. ``Iteratee``\s are an effective way of handling a stream of data without needing to wait for all the data to arrive. This is especially useful when dealing with non blocking IO since we will usually receive data in chunks which may not include enough information to process, or it may contain much more data than we currently need. -This ``Iteratee`` implementation is much more basic then what is usually found. There is only support for ``ByteString`` input, and enumerators aren't used. The reason for this limited implementation is to reduce the amount of explicit type signatures needed and to keep things simple. It is important to note that Akka's ``Iteratee``\s are completely optional, incoming data can be handled in any way, including other ``Iteratee`` libraries. +This ``Iteratee`` implementation is much more basic than what is usually found. There is only support for ``ByteString`` input, and enumerators aren't used. The reason for this limited implementation is to reduce the amount of explicit type signatures needed and to keep things simple. It is important to note that Akka's ``Iteratee``\s are completely optional, incoming data can be handled in any way, including other ``Iteratee`` libraries. ``Iteratee``\s work by processing the data that it is given and returning either the result (with any unused input) or a continuation if more input is needed. They are monadic, so methods like ``flatMap`` can be used to pass the result of an ``Iteratee`` to another. @@ -204,7 +204,7 @@ Following the path we read in the query (if it exists): .. includecode:: code/docs/io/HTTPServer.scala :include: read-query -It is much simpler then reading the path since we aren't doing any parsing of the query since there is no standard format of the query string. +It is much simpler than reading the path since we aren't doing any parsing of the query since there is no standard format of the query string. Both the path and query used the ``readUriPart`` ``Iteratee``, which is next: From a7b7ab040d79aec62cd5d4a5e27e6773b84ec5fd Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Thu, 6 Dec 2012 10:47:24 +0100 Subject: [PATCH 208/210] Tests for the Cluster JMX API, see #2018 * MBeanSpec * Added Members and Unreachable to JMX API * Removed Convergence from JMX API, because it will not be exposed when ticket #2692 is merged * Updated documentation and akka-cluster script --- .../main/scala/akka/cluster/ClusterJmx.scala | 70 ++++++-- .../scala/akka/cluster/ClusterReadView.scala | 2 +- .../scala/akka/cluster/MBeanSpec.scala | 149 ++++++++++++++++++ akka-docs/rst/cluster/cluster-usage-java.rst | 3 +- akka-docs/rst/cluster/cluster-usage-scala.rst | 3 +- akka-kernel/src/main/dist/bin/akka-cluster | 42 +++-- 6 files changed, 238 insertions(+), 31 deletions(-) create mode 100644 akka-cluster/src/multi-jvm/scala/akka/cluster/MBeanSpec.scala diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterJmx.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterJmx.scala index 4eb27e836e..8c53108a40 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterJmx.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterJmx.scala @@ -16,17 +16,65 @@ import javax.management.InstanceNotFoundException * Interface for the cluster JMX MBean. */ trait ClusterNodeMBean { + + /** + * Member status for this node. + */ def getMemberStatus: String + + /** + * Comma separated addresses of member nodes, sorted in the cluster ring order. + */ + def getMembers: String + + /** + * Comma separated addresses of unreachable member nodes. + */ + def getUnreachable: String + + /* + * String that will list all nodes in the node ring as follows: + * {{{ + * Members: + * Member(address = akka://system0@localhost:5550, status = Up) + * Member(address = akka://system1@localhost:5551, status = Up) + * Unreachable: + * Member(address = akka://system2@localhost:5553, status = Down) + * }}} + */ def getClusterStatus: String + + /** + * Get the address of the current leader. + */ def getLeader: String + /** + * Does the cluster consist of only one member? + */ def isSingleton: Boolean - def isConvergence: Boolean + + /** + * Returns true if the node is UP or JOINING. + */ def isAvailable: Boolean + /** + * Returns true if the cluster node is up and running, false if it is shut down. + */ def isRunning: Boolean + /** + * Try to join this cluster node with the node specified by 'address'. + * A 'Join(thisNodeAddress)' command is sent to the node to join. + */ def join(address: String) + /** + * Send command to issue state transition to LEAVING for the node specified by 'address'. + */ def leave(address: String) + /** + * Send command to DOWN the node specified by 'address'. + */ def down(address: String) } @@ -47,30 +95,24 @@ private[akka] class ClusterJmx(cluster: Cluster, log: LoggingAdapter) { // JMX attributes (bean-style) - /* - * Sends a string to the JMX client that will list all nodes in the node ring as follows: - * {{{ - * Members: - * Member(address = akka://system0@localhost:5550, status = Up) - * Member(address = akka://system1@localhost:5551, status = Up) - * Unreachable: - * Member(address = akka://system2@localhost:5553, status = Down) - * }}} - */ def getClusterStatus: String = { val unreachable = clusterView.unreachableMembers "\nMembers:\n\t" + clusterView.members.mkString("\n\t") + { if (unreachable.nonEmpty) "\nUnreachable:\n\t" + unreachable.mkString("\n\t") else "" } } + def getMembers: String = + clusterView.members.toSeq.map(_.address).mkString(", ") + + def getUnreachable: String = + clusterView.unreachableMembers.map(_.address).mkString(", ") + def getMemberStatus: String = clusterView.status.toString - def getLeader: String = clusterView.leader.toString + def getLeader: String = clusterView.leader.getOrElse("").toString def isSingleton: Boolean = clusterView.isSingletonCluster - def isConvergence: Boolean = clusterView.convergence - def isAvailable: Boolean = clusterView.isAvailable def isRunning: Boolean = clusterView.isRunning diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterReadView.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterReadView.scala index deb817f03c..c1f42048ee 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterReadView.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterReadView.scala @@ -108,7 +108,7 @@ private[akka] class ClusterReadView(cluster: Cluster) extends Closeable { def leader: Option[Address] = state.leader /** - * Is this node a singleton cluster? + * Does the cluster consist of only one member? */ def isSingletonCluster: Boolean = members.size == 1 diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/MBeanSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/MBeanSpec.scala new file mode 100644 index 0000000000..6b714e03f0 --- /dev/null +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/MBeanSpec.scala @@ -0,0 +1,149 @@ +/** + * Copyright (C) 2009-2012 Typesafe Inc. + */ +package akka.cluster + +import language.postfixOps +import com.typesafe.config.ConfigFactory +import scala.concurrent.duration._ +import java.lang.management.ManagementFactory +import javax.management.InstanceNotFoundException +import javax.management.ObjectName +import akka.remote.testkit.MultiNodeConfig +import akka.remote.testkit.MultiNodeSpec +import akka.testkit._ +import scala.util.Try + +object MBeanMultiJvmSpec extends MultiNodeConfig { + val first = role("first") + val second = role("second") + val third = role("third") + val fourth = role("fourth") + + commonConfig(debugConfig(on = false).withFallback(ConfigFactory.parseString(""" + akka.cluster.jmx.enabled = on + """)).withFallback(MultiNodeClusterSpec.clusterConfig)) + +} + +class MBeanMultiJvmNode1 extends MBeanSpec +class MBeanMultiJvmNode2 extends MBeanSpec +class MBeanMultiJvmNode3 extends MBeanSpec +class MBeanMultiJvmNode4 extends MBeanSpec + +abstract class MBeanSpec + extends MultiNodeSpec(MBeanMultiJvmSpec) + with MultiNodeClusterSpec { + + import MBeanMultiJvmSpec._ + import ClusterEvent._ + + val mbeanName = new ObjectName("akka:type=Cluster") + lazy val mbeanServer = ManagementFactory.getPlatformMBeanServer + + "Cluster MBean" must { + "expose attributes" taggedAs LongRunningTest in { + val info = mbeanServer.getMBeanInfo(mbeanName) + info.getAttributes.map(_.getName).toSet must be(Set( + "ClusterStatus", "Members", "Unreachable", "MemberStatus", "Leader", "Singleton", "Available", "Running")) + enterBarrier("after-1") + } + + "expose operations" taggedAs LongRunningTest in { + val info = mbeanServer.getMBeanInfo(mbeanName) + info.getOperations.map(_.getName).toSet must be(Set( + "join", "leave", "down")) + enterBarrier("after-2") + } + + "change attributes after startup" taggedAs LongRunningTest in { + runOn(first) { + mbeanServer.getAttribute(mbeanName, "Running").asInstanceOf[Boolean] must be(true) + mbeanServer.getAttribute(mbeanName, "Available").asInstanceOf[Boolean] must be(true) + mbeanServer.getAttribute(mbeanName, "Singleton").asInstanceOf[Boolean] must be(false) + mbeanServer.getAttribute(mbeanName, "Leader") must be("") + mbeanServer.getAttribute(mbeanName, "Members") must be("") + mbeanServer.getAttribute(mbeanName, "Unreachable") must be("") + mbeanServer.getAttribute(mbeanName, "MemberStatus") must be("Removed") + } + awaitClusterUp(first) + runOn(first) { + awaitCond(mbeanServer.getAttribute(mbeanName, "MemberStatus") == "Up") + awaitCond(mbeanServer.getAttribute(mbeanName, "Leader") == address(first).toString) + mbeanServer.getAttribute(mbeanName, "Singleton").asInstanceOf[Boolean] must be(true) + mbeanServer.getAttribute(mbeanName, "Members") must be(address(first).toString) + mbeanServer.getAttribute(mbeanName, "Unreachable") must be("") + } + enterBarrier("after-3") + } + + "support join" taggedAs LongRunningTest in { + runOn(second, third, fourth) { + mbeanServer.invoke(mbeanName, "join", Array(address(first).toString), Array("java.lang.String")) + } + enterBarrier("joined") + + awaitUpConvergence(4) + assertMembers(clusterView.members, roles.map(address(_)): _*) + awaitCond(mbeanServer.getAttribute(mbeanName, "MemberStatus") == "Up") + val expectedMembers = roles.sorted.map(address(_)).mkString(", ") + awaitCond(mbeanServer.getAttribute(mbeanName, "Members") == expectedMembers) + val expectedLeader = address(roleOfLeader()) + awaitCond(mbeanServer.getAttribute(mbeanName, "Leader") == expectedLeader.toString) + mbeanServer.getAttribute(mbeanName, "Singleton").asInstanceOf[Boolean] must be(false) + + enterBarrier("after-4") + } + + "support down" taggedAs LongRunningTest in { + val fourthAddress = address(fourth) + runOn(first) { + testConductor.shutdown(fourth, 0).await + } + enterBarrier("fourth-shutdown") + + runOn(first, second, third) { + awaitCond(mbeanServer.getAttribute(mbeanName, "Unreachable") == fourthAddress.toString) + val expectedMembers = Seq(first, second, third).sorted.map(address(_)).mkString(", ") + awaitCond(mbeanServer.getAttribute(mbeanName, "Members") == expectedMembers) + } + enterBarrier("fourth-unreachable") + + runOn(second) { + mbeanServer.invoke(mbeanName, "down", Array(fourthAddress.toString), Array("java.lang.String")) + } + enterBarrier("fourth-down") + + runOn(first, second, third) { + awaitUpConvergence(3, canNotBePartOfMemberRing = List(fourthAddress)) + assertMembers(clusterView.members, first, second, third) + } + + enterBarrier("after-5") + } + + "support leave" taggedAs LongRunningTest in within(20 seconds) { + runOn(second) { + mbeanServer.invoke(mbeanName, "leave", Array(address(third).toString), Array("java.lang.String")) + } + enterBarrier("third-left") + runOn(first, second) { + awaitUpConvergence(2) + assertMembers(clusterView.members, first, second) + val expectedMembers = Seq(first, second).sorted.map(address(_)).mkString(", ") + awaitCond(mbeanServer.getAttribute(mbeanName, "Members") == expectedMembers) + } + runOn(third) { + awaitCond(!cluster.isRunning) + // mbean should be unregistered, i.e. throw InstanceNotFoundException + awaitCond(Try { mbeanServer.getMBeanInfo(mbeanName); false } recover { + case e: InstanceNotFoundException ⇒ true + case _ ⇒ false + } get) + } + + enterBarrier("after-6") + } + + } +} diff --git a/akka-docs/rst/cluster/cluster-usage-java.rst b/akka-docs/rst/cluster/cluster-usage-java.rst index c1f00d638e..647a40d8a1 100644 --- a/akka-docs/rst/cluster/cluster-usage-java.rst +++ b/akka-docs/rst/cluster/cluster-usage-java.rst @@ -573,6 +573,8 @@ Run it without parameters to see instructions about how to use the script:: leave - Sends a request for node with URL to LEAVE the cluster down - Sends a request for marking node with URL as DOWN member-status - Asks the member node for its current status + members - Asks the cluster for addresses of current members + unreachable - Asks the cluster for addresses of unreachable members cluster-status - Asks the cluster for its current status (member ring, unavailable nodes, meta data etc.) leader - Asks the cluster who the current leader is @@ -580,7 +582,6 @@ Run it without parameters to see instructions about how to use the script:: node cluster) is-available - Checks if the member node is available is-running - Checks if the member node is running - has-convergence - Checks if there is a cluster convergence Where the should be on the format of 'akka://actor-system-name@hostname:port' diff --git a/akka-docs/rst/cluster/cluster-usage-scala.rst b/akka-docs/rst/cluster/cluster-usage-scala.rst index 5e0bc94e2b..0383f38a90 100644 --- a/akka-docs/rst/cluster/cluster-usage-scala.rst +++ b/akka-docs/rst/cluster/cluster-usage-scala.rst @@ -579,6 +579,8 @@ Run it without parameters to see instructions about how to use the script:: leave - Sends a request for node with URL to LEAVE the cluster down - Sends a request for marking node with URL as DOWN member-status - Asks the member node for its current status + members - Asks the cluster for addresses of current members + unreachable - Asks the cluster for addresses of unreachable members cluster-status - Asks the cluster for its current status (member ring, unavailable nodes, meta data etc.) leader - Asks the cluster who the current leader is @@ -586,7 +588,6 @@ Run it without parameters to see instructions about how to use the script:: node cluster) is-available - Checks if the member node is available is-running - Checks if the member node is running - has-convergence - Checks if there is a cluster convergence Where the should be on the format of 'akka://actor-system-name@hostname:port' diff --git a/akka-kernel/src/main/dist/bin/akka-cluster b/akka-kernel/src/main/dist/bin/akka-cluster index c7bb125c52..1d3b67bff1 100755 --- a/akka-kernel/src/main/dist/bin/akka-cluster +++ b/akka-kernel/src/main/dist/bin/akka-cluster @@ -103,6 +103,32 @@ case "$2" in $JMX_CLIENT $HOST akka:type=Cluster ClusterStatus ;; + members) + if [ $# -ne 2 ]; then + echo "Usage: $SELF members" + exit 1 + fi + + ensureNodeIsRunningAndAvailable + shift + + echo "Querying members" + $JMX_CLIENT $HOST akka:type=Cluster Members + ;; + + unreachable) + if [ $# -ne 2 ]; then + echo "Usage: $SELF unreachable" + exit 1 + fi + + ensureNodeIsRunningAndAvailable + shift + + echo "Querying unreachable members" + $JMX_CLIENT $HOST akka:type=Cluster Unreachable + ;; + leader) if [ $# -ne 2 ]; then echo "Usage: $SELF leader" @@ -129,19 +155,6 @@ case "$2" in $JMX_CLIENT $HOST akka:type=Cluster Singleton ;; - has-convergence) - if [ $# -ne 2 ]; then - echo "Usage: $SELF is-convergence" - exit 1 - fi - - ensureNodeIsRunningAndAvailable - shift - - echo "Checking for cluster convergence" - $JMX_CLIENT $HOST akka:type=Cluster Convergence - ;; - is-available) if [ $# -ne 2 ]; then echo "Usage: $SELF is-available" @@ -176,12 +189,13 @@ case "$2" in printf "%26s - %s\n" "leave " "Sends a request for node with URL to LEAVE the cluster" printf "%26s - %s\n" "down " "Sends a request for marking node with URL as DOWN" printf "%26s - %s\n" member-status "Asks the member node for its current status" + printf "%26s - %s\n" members "Asks the cluster for addresses of current members" + printf "%26s - %s\n" unreachable "Asks the cluster for addresses of unreachable members" printf "%26s - %s\n" cluster-status "Asks the cluster for its current status (member ring, unavailable nodes, meta data etc.)" printf "%26s - %s\n" leader "Asks the cluster who the current leader is" printf "%26s - %s\n" is-singleton "Checks if the cluster is a singleton cluster (single node cluster)" printf "%26s - %s\n" is-available "Checks if the member node is available" printf "%26s - %s\n" is-running "Checks if the member node is running" - printf "%26s - %s\n" has-convergence "Checks if there is a cluster convergence" printf "Where the should be on the format of 'akka://actor-system-name@hostname:port'\n" printf "\n" printf "Examples: bin/$SELF localhost:9999 is-available\n" From 1df787d0c5e8bc12406e4282d979ffb6acf24de6 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Thu, 6 Dec 2012 15:26:57 +0100 Subject: [PATCH 209/210] Incorporate review comments and cleanup isAvailable, see #2018 * Renamed isRunning to isTerminated (with negation of course) * Removed Running from JMX API, since the mbean is deregistered anyway * Cleanup isAvailable, isUnavailbe * Misc minor --- .../src/main/scala/akka/cluster/Cluster.scala | 8 +++---- .../scala/akka/cluster/ClusterDaemon.scala | 2 +- .../main/scala/akka/cluster/ClusterJmx.scala | 23 +++++++++++-------- .../scala/akka/cluster/ClusterReadView.scala | 11 +++++---- .../src/main/scala/akka/cluster/Gossip.scala | 11 +++------ .../src/main/scala/akka/cluster/Member.scala | 8 +------ .../akka/cluster/LeaderLeavingSpec.scala | 2 +- .../scala/akka/cluster/MBeanSpec.scala | 14 +++++------ ...LeavingAndExitingAndBeingRemovedSpec.scala | 2 +- akka-docs/rst/cluster/cluster-usage-java.rst | 1 - akka-docs/rst/cluster/cluster-usage-scala.rst | 1 - akka-kernel/src/main/dist/bin/akka-cluster | 14 ----------- 12 files changed, 38 insertions(+), 59 deletions(-) diff --git a/akka-cluster/src/main/scala/akka/cluster/Cluster.scala b/akka-cluster/src/main/scala/akka/cluster/Cluster.scala index ffd3ffcf29..e362b4ac34 100644 --- a/akka-cluster/src/main/scala/akka/cluster/Cluster.scala +++ b/akka-cluster/src/main/scala/akka/cluster/Cluster.scala @@ -67,7 +67,7 @@ class Cluster(val system: ExtendedActorSystem) extends Extension { format(system, other.getClass.getName)) } - private val _isRunning = new AtomicBoolean(true) + private val _isTerminated = new AtomicBoolean(false) private val log = Logging(system, "Cluster") log.info("Cluster Node [{}] - is starting up...", selfAddress) @@ -169,9 +169,9 @@ class Cluster(val system: ExtendedActorSystem) extends Extension { // ====================================================== /** - * Returns true if the cluster node is up and running, false if it is shut down. + * Returns true if this cluster instance has be shutdown. */ - def isRunning: Boolean = _isRunning.get + def isTerminated: Boolean = _isTerminated.get /** * Subscribe to cluster domain events. @@ -253,7 +253,7 @@ class Cluster(val system: ExtendedActorSystem) extends Extension { * to go through graceful handoff process `LEAVE -> EXITING -> REMOVED -> SHUTDOWN`. */ private[cluster] def shutdown(): Unit = { - if (_isRunning.compareAndSet(true, false)) { + if (_isTerminated.compareAndSet(false, true)) { log.info("Cluster Node [{}] - Shutting down cluster Node and cluster daemons...", selfAddress) system.stop(clusterDaemons) diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala index 31d53cb7e5..99fa7e2821 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala @@ -763,7 +763,7 @@ private[cluster] final class ClusterCoreDaemon(publisher: ActorRef) extends Acto def isSingletonCluster: Boolean = latestGossip.isSingletonCluster - def isAvailable: Boolean = latestGossip.isAvailable(selfAddress) + def isAvailable: Boolean = !latestGossip.isUnreachable(selfAddress) /** * Gossips latest gossip to a random member in the set of members passed in as argument. diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterJmx.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterJmx.scala index 8c53108a40..ae023263c8 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterJmx.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterJmx.scala @@ -24,11 +24,13 @@ trait ClusterNodeMBean { /** * Comma separated addresses of member nodes, sorted in the cluster ring order. + * The address format is `akka://actor-system-name@hostname:port` */ def getMembers: String /** * Comma separated addresses of unreachable member nodes. + * The address format is `akka://actor-system-name@hostname:port` */ def getUnreachable: String @@ -46,6 +48,7 @@ trait ClusterNodeMBean { /** * Get the address of the current leader. + * The address format is `akka://actor-system-name@hostname:port` */ def getLeader: String @@ -55,25 +58,27 @@ trait ClusterNodeMBean { def isSingleton: Boolean /** - * Returns true if the node is UP or JOINING. + * Returns true if the node is not unreachable and not `Down` + * and not `Removed`. */ def isAvailable: Boolean - /** - * Returns true if the cluster node is up and running, false if it is shut down. - */ - def isRunning: Boolean /** * Try to join this cluster node with the node specified by 'address'. + * The address format is `akka://actor-system-name@hostname:port`. * A 'Join(thisNodeAddress)' command is sent to the node to join. */ def join(address: String) + /** * Send command to issue state transition to LEAVING for the node specified by 'address'. + * The address format is `akka://actor-system-name@hostname:port` */ def leave(address: String) + /** * Send command to DOWN the node specified by 'address'. + * The address format is `akka://actor-system-name@hostname:port` */ def down(address: String) } @@ -102,21 +107,19 @@ private[akka] class ClusterJmx(cluster: Cluster, log: LoggingAdapter) { } def getMembers: String = - clusterView.members.toSeq.map(_.address).mkString(", ") + clusterView.members.toSeq.map(_.address).mkString(",") def getUnreachable: String = - clusterView.unreachableMembers.map(_.address).mkString(", ") + clusterView.unreachableMembers.map(_.address).mkString(",") def getMemberStatus: String = clusterView.status.toString - def getLeader: String = clusterView.leader.getOrElse("").toString + def getLeader: String = clusterView.leader.fold("")(_.toString) def isSingleton: Boolean = clusterView.isSingletonCluster def isAvailable: Boolean = clusterView.isAvailable - def isRunning: Boolean = clusterView.isRunning - // JMX commands def join(address: String) = cluster.join(AddressFromURIString(address)) diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterReadView.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterReadView.scala index c1f42048ee..5f80cfd044 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterReadView.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterReadView.scala @@ -74,9 +74,9 @@ private[akka] class ClusterReadView(cluster: Cluster) extends Closeable { } /** - * Returns true if the cluster node is up and running, false if it is shut down. + * Returns true if this cluster instance has be shutdown. */ - def isRunning: Boolean = cluster.isRunning + def isTerminated: Boolean = cluster.isTerminated /** * Current cluster members, sorted by address. @@ -118,11 +118,14 @@ private[akka] class ClusterReadView(cluster: Cluster) extends Closeable { def convergence: Boolean = state.convergence /** - * Returns true if the node is UP or JOINING. + * Returns true if the node is not unreachable and not `Down` + * and not `Removed`. */ def isAvailable: Boolean = { val myself = self - !unreachableMembers.contains(myself) && !myself.status.isUnavailable + !unreachableMembers.contains(myself) && + myself.status != MemberStatus.Down && + myself.status != MemberStatus.Removed } /** diff --git a/akka-cluster/src/main/scala/akka/cluster/Gossip.scala b/akka-cluster/src/main/scala/akka/cluster/Gossip.scala index 279cdcaf45..81618f4a68 100644 --- a/akka-cluster/src/main/scala/akka/cluster/Gossip.scala +++ b/akka-cluster/src/main/scala/akka/cluster/Gossip.scala @@ -168,15 +168,10 @@ private[cluster] case class Gossip( def isSingletonCluster: Boolean = members.size == 1 /** - * Returns true if the node is UP or JOINING. + * Returns true if the node is in the unreachable set */ - def isAvailable(address: Address): Boolean = !isUnavailable(address) - - def isUnavailable(address: Address): Boolean = { - val isUnreachable = overview.unreachable exists { _.address == address } - val hasUnavailableMemberStatus = members exists { m ⇒ m.status.isUnavailable && m.address == address } - isUnreachable || hasUnavailableMemberStatus - } + def isUnreachable(address: Address): Boolean = + overview.unreachable exists { _.address == address } def member(address: Address): Member = { members.find(_.address == address).orElse(overview.unreachable.find(_.address == address)). diff --git a/akka-cluster/src/main/scala/akka/cluster/Member.scala b/akka-cluster/src/main/scala/akka/cluster/Member.scala index 7ca8df1187..1ee4aae804 100644 --- a/akka-cluster/src/main/scala/akka/cluster/Member.scala +++ b/akka-cluster/src/main/scala/akka/cluster/Member.scala @@ -87,13 +87,7 @@ object Member { * * Can be one of: Joining, Up, Leaving, Exiting and Down. */ -abstract class MemberStatus extends ClusterMessage { - - /** - * Using the same notion for 'unavailable' as 'non-convergence': DOWN - */ - def isUnavailable: Boolean = this == Down -} +abstract class MemberStatus extends ClusterMessage object MemberStatus { case object Joining extends MemberStatus diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderLeavingSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderLeavingSpec.scala index ddbab3edbb..acaf909d57 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderLeavingSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/LeaderLeavingSpec.scala @@ -57,7 +57,7 @@ abstract class LeaderLeavingSpec enterBarrier("leader-left") // verify that the LEADER is shut down - awaitCond(!cluster.isRunning) + awaitCond(cluster.isTerminated) // verify that the LEADER is REMOVED awaitCond(clusterView.status == Removed) diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/MBeanSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/MBeanSpec.scala index 6b714e03f0..e6d83f881e 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/MBeanSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/MBeanSpec.scala @@ -45,7 +45,7 @@ abstract class MBeanSpec "expose attributes" taggedAs LongRunningTest in { val info = mbeanServer.getMBeanInfo(mbeanName) info.getAttributes.map(_.getName).toSet must be(Set( - "ClusterStatus", "Members", "Unreachable", "MemberStatus", "Leader", "Singleton", "Available", "Running")) + "ClusterStatus", "Members", "Unreachable", "MemberStatus", "Leader", "Singleton", "Available")) enterBarrier("after-1") } @@ -58,8 +58,7 @@ abstract class MBeanSpec "change attributes after startup" taggedAs LongRunningTest in { runOn(first) { - mbeanServer.getAttribute(mbeanName, "Running").asInstanceOf[Boolean] must be(true) - mbeanServer.getAttribute(mbeanName, "Available").asInstanceOf[Boolean] must be(true) + mbeanServer.getAttribute(mbeanName, "Available").asInstanceOf[Boolean] must be(false) mbeanServer.getAttribute(mbeanName, "Singleton").asInstanceOf[Boolean] must be(false) mbeanServer.getAttribute(mbeanName, "Leader") must be("") mbeanServer.getAttribute(mbeanName, "Members") must be("") @@ -73,6 +72,7 @@ abstract class MBeanSpec mbeanServer.getAttribute(mbeanName, "Singleton").asInstanceOf[Boolean] must be(true) mbeanServer.getAttribute(mbeanName, "Members") must be(address(first).toString) mbeanServer.getAttribute(mbeanName, "Unreachable") must be("") + mbeanServer.getAttribute(mbeanName, "Available").asInstanceOf[Boolean] must be(true) } enterBarrier("after-3") } @@ -86,7 +86,7 @@ abstract class MBeanSpec awaitUpConvergence(4) assertMembers(clusterView.members, roles.map(address(_)): _*) awaitCond(mbeanServer.getAttribute(mbeanName, "MemberStatus") == "Up") - val expectedMembers = roles.sorted.map(address(_)).mkString(", ") + val expectedMembers = roles.sorted.map(address(_)).mkString(",") awaitCond(mbeanServer.getAttribute(mbeanName, "Members") == expectedMembers) val expectedLeader = address(roleOfLeader()) awaitCond(mbeanServer.getAttribute(mbeanName, "Leader") == expectedLeader.toString) @@ -104,7 +104,7 @@ abstract class MBeanSpec runOn(first, second, third) { awaitCond(mbeanServer.getAttribute(mbeanName, "Unreachable") == fourthAddress.toString) - val expectedMembers = Seq(first, second, third).sorted.map(address(_)).mkString(", ") + val expectedMembers = Seq(first, second, third).sorted.map(address(_)).mkString(",") awaitCond(mbeanServer.getAttribute(mbeanName, "Members") == expectedMembers) } enterBarrier("fourth-unreachable") @@ -130,11 +130,11 @@ abstract class MBeanSpec runOn(first, second) { awaitUpConvergence(2) assertMembers(clusterView.members, first, second) - val expectedMembers = Seq(first, second).sorted.map(address(_)).mkString(", ") + val expectedMembers = Seq(first, second).sorted.map(address(_)).mkString(",") awaitCond(mbeanServer.getAttribute(mbeanName, "Members") == expectedMembers) } runOn(third) { - awaitCond(!cluster.isRunning) + awaitCond(cluster.isTerminated) // mbean should be unregistered, i.e. throw InstanceNotFoundException awaitCond(Try { mbeanServer.getMBeanInfo(mbeanName); false } recover { case e: InstanceNotFoundException ⇒ true diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeLeavingAndExitingAndBeingRemovedSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeLeavingAndExitingAndBeingRemovedSpec.scala index d7eaddf402..2dfddc330f 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeLeavingAndExitingAndBeingRemovedSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeLeavingAndExitingAndBeingRemovedSpec.scala @@ -51,7 +51,7 @@ abstract class NodeLeavingAndExitingAndBeingRemovedSpec runOn(second) { // verify that the second node is shut down and has status REMOVED - awaitCond(!cluster.isRunning, reaperWaitingTime) + awaitCond(cluster.isTerminated, reaperWaitingTime) awaitCond(clusterView.status == MemberStatus.Removed, reaperWaitingTime) } diff --git a/akka-docs/rst/cluster/cluster-usage-java.rst b/akka-docs/rst/cluster/cluster-usage-java.rst index 647a40d8a1..728d03745b 100644 --- a/akka-docs/rst/cluster/cluster-usage-java.rst +++ b/akka-docs/rst/cluster/cluster-usage-java.rst @@ -581,7 +581,6 @@ Run it without parameters to see instructions about how to use the script:: is-singleton - Checks if the cluster is a singleton cluster (single node cluster) is-available - Checks if the member node is available - is-running - Checks if the member node is running Where the should be on the format of 'akka://actor-system-name@hostname:port' diff --git a/akka-docs/rst/cluster/cluster-usage-scala.rst b/akka-docs/rst/cluster/cluster-usage-scala.rst index 0383f38a90..a317b0b9d1 100644 --- a/akka-docs/rst/cluster/cluster-usage-scala.rst +++ b/akka-docs/rst/cluster/cluster-usage-scala.rst @@ -587,7 +587,6 @@ Run it without parameters to see instructions about how to use the script:: is-singleton - Checks if the cluster is a singleton cluster (single node cluster) is-available - Checks if the member node is available - is-running - Checks if the member node is running Where the should be on the format of 'akka://actor-system-name@hostname:port' diff --git a/akka-kernel/src/main/dist/bin/akka-cluster b/akka-kernel/src/main/dist/bin/akka-cluster index 1d3b67bff1..e544772a13 100755 --- a/akka-kernel/src/main/dist/bin/akka-cluster +++ b/akka-kernel/src/main/dist/bin/akka-cluster @@ -168,19 +168,6 @@ case "$2" in $JMX_CLIENT $HOST akka:type=Cluster Available ;; - is-running) - if [ $# -ne 2 ]; then - echo "Usage: $SELF is-running" - exit 1 - fi - - ensureNodeIsRunningAndAvailable - shift - - echo "Checking if member node on $HOST is RUNNING" - $JMX_CLIENT $HOST akka:type=Cluster Running - ;; - *) printf "Usage: bin/$SELF ...\n" printf "\n" @@ -195,7 +182,6 @@ case "$2" in printf "%26s - %s\n" leader "Asks the cluster who the current leader is" printf "%26s - %s\n" is-singleton "Checks if the cluster is a singleton cluster (single node cluster)" printf "%26s - %s\n" is-available "Checks if the member node is available" - printf "%26s - %s\n" is-running "Checks if the member node is running" printf "Where the should be on the format of 'akka://actor-system-name@hostname:port'\n" printf "\n" printf "Examples: bin/$SELF localhost:9999 is-available\n" From 9a1e7d0519f0f09ca53e5ff563753f3c3b4cb4db Mon Sep 17 00:00:00 2001 From: Rich Dougherty Date: Thu, 6 Dec 2012 17:28:49 +0100 Subject: [PATCH 210/210] Rename FSM and TestFSMRef's timerActive_? to isTimerActive. Fixes #2766 --- .../src/test/scala/akka/actor/FSMActorSpec.scala | 2 +- akka-actor/src/main/scala/akka/actor/FSM.scala | 12 ++++++++++-- .../rst/project/migration-guide-2.1.x-2.2.x.rst | 9 ++++++++- .../rst/scala/code/docs/testkit/TestkitDocSpec.scala | 6 +++--- akka-docs/rst/scala/fsm.rst | 2 +- .../testconductor/NetworkFailureInjector.scala | 2 +- .../src/main/scala/akka/testkit/TestFSMRef.scala | 8 +++++++- .../src/test/scala/akka/testkit/TestFSMRefSpec.scala | 6 +++--- 8 files changed, 34 insertions(+), 13 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/actor/FSMActorSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/FSMActorSpec.scala index dbdeb8bef9..b4860154ea 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/FSMActorSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/FSMActorSpec.scala @@ -227,7 +227,7 @@ class FSMActorSpec extends AkkaSpec(Map("akka.actor.debug.fsm" -> true)) with Im }) def checkTimersActive(active: Boolean) { - for (timer ← timerNames) fsmref.timerActive_?(timer) must be(active) + for (timer ← timerNames) fsmref.isTimerActive(timer) must be(active) fsmref.isStateTimerActive must be(active) } diff --git a/akka-actor/src/main/scala/akka/actor/FSM.scala b/akka-actor/src/main/scala/akka/actor/FSM.scala index 8a915f8906..9a9b56c470 100644 --- a/akka-actor/src/main/scala/akka/actor/FSM.scala +++ b/akka-actor/src/main/scala/akka/actor/FSM.scala @@ -238,7 +238,7 @@ object FSM { * setTimer("tock", TockMsg, 1 second, true) // repeating * setTimer("lifetime", TerminateMsg, 1 hour, false) // single-shot * cancelTimer("tock") - * timerActive_? ("tock") + * isTimerActive("tock") * */ trait FSM[S, D] extends Listeners with ActorLogging { @@ -372,7 +372,15 @@ trait FSM[S, D] extends Listeners with ActorLogging { * timer does not exist, has previously been canceled or if it was a * single-shot timer whose message was already received. */ - final def timerActive_?(name: String) = timers contains name + @deprecated("Use isTimerActive(name) instead.", "2.2") + final def timerActive_?(name: String) = isTimerActive(name) + + /** + * Inquire whether the named timer is still active. Returns true unless the + * timer does not exist, has previously been canceled or if it was a + * single-shot timer whose message was already received. + */ + final def isTimerActive(name: String) = timers contains name /** * Set state timeout explicitly. This method can safely be used from within a diff --git a/akka-docs/rst/project/migration-guide-2.1.x-2.2.x.rst b/akka-docs/rst/project/migration-guide-2.1.x-2.2.x.rst index 80bdccd803..3002db8233 100644 --- a/akka-docs/rst/project/migration-guide-2.1.x-2.2.x.rst +++ b/akka-docs/rst/project/migration-guide-2.1.x-2.2.x.rst @@ -23,4 +23,11 @@ Search Replace with ==================================== ==================================== If you need to convert from Java to ``scala.collection.immutable.Seq`` or ``scala.collection.immutable.Iterable`` you should use ``akka.japi.Util.immutableSeq(…)``, -and if you need to convert from Scala you can simply switch to using immutable collections yourself or use the ``to[immutable.]`` method. \ No newline at end of file +and if you need to convert from Scala you can simply switch to using immutable collections yourself or use the ``to[immutable.]`` method. + +API changes to FSM and TestFSMRef +================================= + +The ``timerActive_?`` method has been deprecated in both the ``FSM`` trait and the ``TestFSMRef`` +class. You should now use the ``isTimerActive`` method instead. The old method will remain +throughout 2.2.x. It will be removed in Akka 2.3. \ No newline at end of file diff --git a/akka-docs/rst/scala/code/docs/testkit/TestkitDocSpec.scala b/akka-docs/rst/scala/code/docs/testkit/TestkitDocSpec.scala index 028c4efbaa..e50b6e8fdf 100644 --- a/akka-docs/rst/scala/code/docs/testkit/TestkitDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/testkit/TestkitDocSpec.scala @@ -110,11 +110,11 @@ class TestkitDocSpec extends AkkaSpec with DefaultTimeout with ImplicitSender { fsm.setState(stateName = 1) assert(fsm.stateName == 1) - assert(fsm.timerActive_?("test") == false) + assert(fsm.isTimerActive("test") == false) fsm.setTimer("test", 12, 10 millis, true) - assert(fsm.timerActive_?("test") == true) + assert(fsm.isTimerActive("test") == true) fsm.cancelTimer("test") - assert(fsm.timerActive_?("test") == false) + assert(fsm.isTimerActive("test") == false) //#test-fsm-ref } diff --git a/akka-docs/rst/scala/fsm.rst b/akka-docs/rst/scala/fsm.rst index 1d87890db3..f30c4f36dc 100644 --- a/akka-docs/rst/scala/fsm.rst +++ b/akka-docs/rst/scala/fsm.rst @@ -371,7 +371,7 @@ which is guaranteed to work immediately, meaning that the scheduled message will not be processed after this call even if the timer already fired and queued it. The status of any timer may be inquired with - :func:`timerActive_?(name)` + :func:`isTimerActive(name)` These named timers complement state timeouts because they are not affected by intervening reception of other messages. diff --git a/akka-remote-tests/src/main/scala/akka/remote/testconductor/NetworkFailureInjector.scala b/akka-remote-tests/src/main/scala/akka/remote/testconductor/NetworkFailureInjector.scala index 26d6f6f243..1ac1bc4839 100644 --- a/akka-remote-tests/src/main/scala/akka/remote/testconductor/NetworkFailureInjector.scala +++ b/akka-remote-tests/src/main/scala/akka/remote/testconductor/NetworkFailureInjector.scala @@ -302,7 +302,7 @@ private[akka] class ThrottleActor(channelContext: ChannelHandlerContext) log.debug("sending msg (Tick): {}", s.msg) send(s) } - if (!timerActive_?("send")) + if (!isTimerActive("send")) for (time ← toTick) { log.debug("scheduling next Tick in {}", time) setTimer("send", Tick, time, false) diff --git a/akka-testkit/src/main/scala/akka/testkit/TestFSMRef.scala b/akka-testkit/src/main/scala/akka/testkit/TestFSMRef.scala index 0fda681922..302942dc4c 100644 --- a/akka-testkit/src/main/scala/akka/testkit/TestFSMRef.scala +++ b/akka-testkit/src/main/scala/akka/testkit/TestFSMRef.scala @@ -78,7 +78,13 @@ class TestFSMRef[S, D, T <: Actor]( /** * Proxy for FSM.timerActive_?. */ - def timerActive_?(name: String) = fsm.timerActive_?(name) + @deprecated("Use isTimerActive(name) instead.", "2.2") + def timerActive_?(name: String) = isTimerActive(name) + + /** + * Proxy for FSM.isTimerActive. + */ + def isTimerActive(name: String) = fsm.isTimerActive(name) /** * Proxy for FSM.timerActive_?. diff --git a/akka-testkit/src/test/scala/akka/testkit/TestFSMRefSpec.scala b/akka-testkit/src/test/scala/akka/testkit/TestFSMRefSpec.scala index 6ed7d51708..41efe55e6d 100644 --- a/akka-testkit/src/test/scala/akka/testkit/TestFSMRefSpec.scala +++ b/akka-testkit/src/test/scala/akka/testkit/TestFSMRefSpec.scala @@ -51,11 +51,11 @@ class TestFSMRefSpec extends AkkaSpec { case x ⇒ stay } }, "test-fsm-ref-2") - fsm.timerActive_?("test") must be(false) + fsm.isTimerActive("test") must be(false) fsm.setTimer("test", 12, 10 millis, true) - fsm.timerActive_?("test") must be(true) + fsm.isTimerActive("test") must be(true) fsm.cancelTimer("test") - fsm.timerActive_?("test") must be(false) + fsm.isTimerActive("test") must be(false) } } }

    HFooc9Ay>&_3k(}o#1 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 PMnhmU1V%%EJ|O@AhlYp6 literal 0 HcmV?d00001 diff --git a/akka-samples/akka-sample-cluster/sigar/sigar-x86-winnt.lib b/akka-samples/akka-sample-cluster/sigar/sigar-x86-winnt.lib new file mode 100644 index 0000000000000000000000000000000000000000..04924a1fc1d99c056113eefc7db43b84cd1e58d2 GIT binary patch literal 99584 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 z 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 f = future(new Callable() { + public BigInteger call() { + return factorial(n); + } + }, getContext().dispatcher()); + + Future result = f.map( + new Mapper() { + public FactorialResult apply(BigInteger factorial) { + return new FactorialResult(n, factorial); + } + }, getContext().dispatcher()); + + pipe(result, getContext().dispatcher()).to(getSender()); + + } else { + unhandled(message); + } + } + + BigInteger factorial(int n) { + BigInteger acc = BigInteger.ONE; + for (int i = 1; i <= n; ++i) { + acc = acc.multiply(BigInteger.valueOf(i)); + } + return acc; + } +} +//#backend + diff --git a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialBackendMain.java b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialBackendMain.java new file mode 100644 index 0000000000..4bf907748d --- /dev/null +++ b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialBackendMain.java @@ -0,0 +1,22 @@ +package sample.cluster.factorial.japi; + +import akka.actor.ActorSystem; +import akka.actor.Props; + +public class FactorialBackendMain { + + public static void main(String[] args) throws Exception { + // Override the configuration of the port + // when specified as program argument + if (args.length > 0) + System.setProperty("akka.remote.netty.port", args[0]); + + ActorSystem system = ActorSystem.create("ClusterSystem"); + + system.actorOf(new Props(FactorialBackend.class), "factorialBackend"); + + system.actorOf(new Props(MetricsListener.class), "metricsListener"); + + } + +} diff --git a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialFrontend.java b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialFrontend.java new file mode 100644 index 0000000000..63656a43ad --- /dev/null +++ b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialFrontend.java @@ -0,0 +1,72 @@ +package sample.cluster.factorial.japi; + +import akka.actor.UntypedActor; +import akka.actor.ActorRef; +import akka.actor.Props; +import akka.event.Logging; +import akka.event.LoggingAdapter; +import akka.routing.FromConfig; +import akka.cluster.routing.AdaptiveLoadBalancingRouter; +import akka.cluster.routing.ClusterRouterConfig; +import akka.cluster.routing.ClusterRouterSettings; +import akka.cluster.routing.HeapMetricsSelector; +import akka.cluster.routing.SystemLoadAverageMetricsSelector; + +//#frontend +public class FactorialFrontend extends UntypedActor { + + LoggingAdapter log = Logging.getLogger(getContext().system(), this); + + ActorRef backend = getContext().actorOf( + new Props(FactorialBackend.class).withRouter(FromConfig.getInstance()), + "factorialBackendRouter"); + + @Override + public void onReceive(Object message) { + if (message instanceof Integer) { + Integer n = (Integer) message; + backend.tell(n, getSelf()); + + } else if (message instanceof FactorialResult) { + FactorialResult result = (FactorialResult) message; + log.info("{}! = {}", result.n, result.factorial); + + } else { + unhandled(message); + } + } + +} +//#frontend + + +//not used, only for documentation +abstract class FactorialFrontend2 extends UntypedActor { + //#router-lookup-in-code + int totalInstances = 100; + String routeesPath = "/user/statsWorker"; + boolean allowLocalRoutees = true; + ActorRef backend = getContext().actorOf( + new Props(FactorialBackend.class).withRouter(new ClusterRouterConfig( + new AdaptiveLoadBalancingRouter(HeapMetricsSelector.getInstance(), 0), + new ClusterRouterSettings( + totalInstances, routeesPath, allowLocalRoutees))), + "factorialBackendRouter2"); + //#router-lookup-in-code +} + +//not used, only for documentation +abstract class StatsService3 extends UntypedActor { + //#router-deploy-in-code + int totalInstances = 100; + int maxInstancesPerNode = 3; + boolean allowLocalRoutees = false; + ActorRef backend = getContext().actorOf( + new Props(FactorialBackend.class).withRouter(new ClusterRouterConfig( + new AdaptiveLoadBalancingRouter( + SystemLoadAverageMetricsSelector.getInstance(), 0), + new ClusterRouterSettings( + totalInstances, maxInstancesPerNode, allowLocalRoutees))), + "factorialBackendRouter3"); + //#router-deploy-in-code +} \ No newline at end of file diff --git a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialFrontendMain.java b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialFrontendMain.java new file mode 100644 index 0000000000..31d0ff5f12 --- /dev/null +++ b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialFrontendMain.java @@ -0,0 +1,38 @@ +package sample.cluster.factorial.japi; + +import java.util.concurrent.TimeUnit; + +import sample.cluster.transformation.japi.TransformationMessages.TransformationJob; +import scala.concurrent.ExecutionContext; +import scala.concurrent.duration.Duration; +import akka.actor.ActorRef; +import akka.actor.ActorSystem; +import akka.actor.Props; +import akka.dispatch.OnSuccess; +import akka.util.Timeout; +import static akka.pattern.Patterns.ask; + +public class FactorialFrontendMain { + + public static void main(String[] args) throws Exception { + int upToN = (args.length == 0 ? 200 : Integer.valueOf(args[0])); + + ActorSystem system = ActorSystem.create("ClusterSystem"); + + ActorRef frontend = system.actorOf(new Props( + FactorialFrontend.class), "factorialFrontend"); + + system.log().info("Starting up"); + // wait to let cluster converge and gather metrics + Thread.sleep(10000); + + system.log().info("Starting many factorials up to [{}]", upToN); + for (int i = 0; i < 1000; i++) { + for (int n = 1; n <= upToN; n++) { + frontend.tell(n, null); + } + } + + } + +} diff --git a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialResult.java b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialResult.java new file mode 100644 index 0000000000..0cb74b6b54 --- /dev/null +++ b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/FactorialResult.java @@ -0,0 +1,14 @@ +package sample.cluster.factorial.japi; + +import java.math.BigInteger; +import java.io.Serializable; + +public class FactorialResult implements Serializable { + public final int n; + public final BigInteger factorial; + + FactorialResult(int n, BigInteger factorial) { + this.n = n; + this.factorial = factorial; + } +} \ No newline at end of file diff --git a/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/MetricsListener.java b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/MetricsListener.java new file mode 100644 index 0000000000..8931c3bed2 --- /dev/null +++ b/akka-samples/akka-sample-cluster/src/main/java/sample/cluster/factorial/japi/MetricsListener.java @@ -0,0 +1,60 @@ +package sample.cluster.factorial.japi; + +//#metrics-listener +import akka.actor.UntypedActor; +import akka.cluster.Cluster; +import akka.cluster.ClusterEvent.ClusterMetricsChanged; +import akka.cluster.ClusterEvent.CurrentClusterState; +import akka.cluster.NodeMetrics; +import akka.cluster.StandardMetrics; +import akka.cluster.StandardMetrics.HeapMemory; +import akka.cluster.StandardMetrics.Cpu; +import akka.event.Logging; +import akka.event.LoggingAdapter; + +public class MetricsListener extends UntypedActor { + LoggingAdapter log = Logging.getLogger(getContext().system(), this); + + Cluster cluster = Cluster.get(getContext().system()); + + //subscribe to ClusterMetricsChanged + @Override + public void preStart() { + cluster.subscribe(getSelf(), ClusterMetricsChanged.class); + } + + //re-subscribe when restart + @Override + public void postStop() { + cluster.unsubscribe(getSelf()); + } + + + @Override + public void onReceive(Object message) { + if (message instanceof ClusterMetricsChanged) { + ClusterMetricsChanged clusterMetrics = (ClusterMetricsChanged) message; + for (NodeMetrics nodeMetrics : clusterMetrics.getNodeMetrics()) { + if (nodeMetrics.address().equals(cluster.selfAddress())) { + HeapMemory heap = StandardMetrics.extractHeapMemory(nodeMetrics); + if (heap != null) { + log.info("Used heap: {} MB", ((double) heap.used()) / 1024 / 1024); + } + Cpu cpu = StandardMetrics.extractCpu(nodeMetrics); + if (cpu != null && cpu.systemLoadAverage().isDefined()) { + log.info("Load: {} ({} processors)", cpu.systemLoadAverage().get(), + cpu.processors()); + } + } + } + + } else if (message instanceof CurrentClusterState) { + // ignore + + } else { + unhandled(message); + } + } + +} +//#metrics-listener \ No newline at end of file diff --git a/akka-samples/akka-sample-cluster/src/main/resources/application.conf b/akka-samples/akka-sample-cluster/src/main/resources/application.conf index 62554a65cf..09f6cd446d 100644 --- a/akka-samples/akka-sample-cluster/src/main/resources/application.conf +++ b/akka-samples/akka-sample-cluster/src/main/resources/application.conf @@ -1,3 +1,4 @@ +# //#cluster akka { actor { provider = "akka.cluster.ClusterActorRefProvider" @@ -20,4 +21,23 @@ akka { auto-down = on } -} \ No newline at end of file +} +# //#cluster + +# //#adaptive-router +akka.actor.deployment { + /factorialFrontend/factorialBackendRouter = { + router = adaptive + # metrics-selector = heap + # metrics-selector = load + # metrics-selector = cpu + metrics-selector = mix + nr-of-instances = 100 + cluster { + enabled = on + routees-path = "/user/factorialBackend" + allow-local-routees = off + } + } +} +# //#adaptive-router \ No newline at end of file diff --git a/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/factorial/FactorialSample.scala b/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/factorial/FactorialSample.scala new file mode 100644 index 0000000000..6e55e03656 --- /dev/null +++ b/akka-samples/akka-sample-cluster/src/main/scala/sample/cluster/factorial/FactorialSample.scala @@ -0,0 +1,151 @@ +package sample.cluster.factorial + +//#imports +import scala.annotation.tailrec +import scala.concurrent.Future +import akka.actor.Actor +import akka.actor.ActorLogging +import akka.actor.ActorRef +import akka.actor.ActorSystem +import akka.actor.Props +import akka.pattern.pipe +import akka.routing.FromConfig + +//#imports + +object FactorialFrontend { + def main(args: Array[String]): Unit = { + val upToN = if (args.isEmpty) 200 else args(0).toInt + + val system = ActorSystem("ClusterSystem") + val frontend = system.actorOf(Props[FactorialFrontend], name = "factorialFrontend") + + system.log.info("Starting up") + // wait to let cluster converge and gather metrics + Thread.sleep(10000) + + system.log.info("Starting many factorials up to [{}]", upToN) + for (_ ← 1 to 1000; n ← 1 to upToN) { + frontend ! n + } + } +} + +//#frontend +class FactorialFrontend extends Actor with ActorLogging { + + val backend = context.actorOf(Props[FactorialBackend].withRouter(FromConfig), + name = "factorialBackendRouter") + + def receive = { + case n: Int ⇒ backend ! n + case (n: Int, factorial: BigInt) ⇒ + log.info("{}! = {}", n, factorial) + } +} +//#frontend + +object FactorialBackend { + def main(args: Array[String]): Unit = { + // Override the configuration of the port + // when specified as program argument + if (args.nonEmpty) System.setProperty("akka.remote.netty.port", args(0)) + + val system = ActorSystem("ClusterSystem") + system.actorOf(Props[FactorialBackend], name = "factorialBackend") + + system.actorOf(Props[MetricsListener], name = "metricsListener") + } +} + +//#backend +class FactorialBackend extends Actor with ActorLogging { + + import context.dispatcher + + def receive = { + case (n: Int) ⇒ + Future(factorial(n)) map { result ⇒ (n, result) } pipeTo sender + } + + def factorial(n: Int): BigInt = { + @tailrec def factorialAcc(acc: BigInt, n: Int): BigInt = { + if (n <= 1) acc + else factorialAcc(acc * n, n - 1) + } + factorialAcc(BigInt(1), n) + } + +} +//#backend + +//#metrics-listener +import akka.cluster.Cluster +import akka.cluster.ClusterEvent.ClusterMetricsChanged +import akka.cluster.ClusterEvent.CurrentClusterState +import akka.cluster.StandardMetrics.HeapMemory +import akka.cluster.StandardMetrics.Cpu + +class MetricsListener extends Actor with ActorLogging { + val selfAddress = Cluster(context.system).selfAddress + + // subscribe to ClusterMetricsChanged + // re-subscribe when restart + override def preStart(): Unit = + Cluster(context.system).subscribe(self, classOf[ClusterMetricsChanged]) + override def postStop(): Unit = + Cluster(context.system).unsubscribe(self) + + def receive = { + case ClusterMetricsChanged(nodeMetrics) ⇒ + nodeMetrics.filter(_.address == selfAddress) foreach { n ⇒ + n match { + case HeapMemory(address, timestamp, used, committed, max) ⇒ + log.info("Used heap: {} MB", used.doubleValue / 1024 / 1024) + case _ ⇒ // no heap info + } + n match { + case Cpu(address, timestamp, Some(systemLoadAverage), cpuCombined, processors) ⇒ + log.info("Load: {} ({} processors)", systemLoadAverage, processors) + case _ ⇒ // no cpu info + } + } + case state: CurrentClusterState ⇒ // ignore + } +} + +//#metrics-listener + +// not used, only for documentation +abstract class FactorialFrontend2 extends Actor { + //#router-lookup-in-code + import akka.cluster.routing.ClusterRouterConfig + import akka.cluster.routing.ClusterRouterSettings + import akka.cluster.routing.AdaptiveLoadBalancingRouter + import akka.cluster.routing.HeapMetricsSelector + + val backend = context.actorOf(Props[FactorialBackend].withRouter( + ClusterRouterConfig(AdaptiveLoadBalancingRouter(HeapMetricsSelector), + ClusterRouterSettings( + totalInstances = 100, routeesPath = "/user/statsWorker", + allowLocalRoutees = true))), + name = "factorialBackendRouter2") + //#router-lookup-in-code +} + +// not used, only for documentation +abstract class FactorialFrontend3 extends Actor { + //#router-deploy-in-code + import akka.cluster.routing.ClusterRouterConfig + import akka.cluster.routing.ClusterRouterSettings + import akka.cluster.routing.AdaptiveLoadBalancingRouter + import akka.cluster.routing.SystemLoadAverageMetricsSelector + + val backend = context.actorOf(Props[FactorialBackend].withRouter( + ClusterRouterConfig(AdaptiveLoadBalancingRouter( + SystemLoadAverageMetricsSelector), ClusterRouterSettings( + totalInstances = 100, maxInstancesPerNode = 3, + allowLocalRoutees = false))), + name = "factorialBackendRouter3") + //#router-deploy-in-code +} \ No newline at end of file diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSingleMasterSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSingleMasterSpec.scala index ad678d377f..8df3a7fafb 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSingleMasterSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSingleMasterSpec.scala @@ -33,6 +33,8 @@ object StatsSampleSingleMasterSpecConfig extends MultiNodeConfig { akka.actor.provider = "akka.cluster.ClusterActorRefProvider" akka.remote.log-remote-lifecycle-events = off akka.cluster.auto-join = off + # don't use sigar for tests, native lib not in path + akka.cluster.metrics.collector-class = akka.cluster.JmxMetricsCollector #//#router-deploy-config akka.actor.deployment { /statsFacade/statsService/workerRouter { diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSpec.scala index 64c2e2994d..aff0d66f68 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/StatsSampleSpec.scala @@ -27,6 +27,8 @@ object StatsSampleSpecConfig extends MultiNodeConfig { akka.actor.provider = "akka.cluster.ClusterActorRefProvider" akka.remote.log-remote-lifecycle-events = off akka.cluster.auto-join = off + # don't use sigar for tests, native lib not in path + akka.cluster.metrics.collector-class = akka.cluster.JmxMetricsCollector #//#router-lookup-config akka.actor.deployment { /statsService/workerRouter { diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala index 0712305b4b..0076807f30 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleJapiSpec.scala @@ -31,6 +31,8 @@ object StatsSampleJapiSpecConfig extends MultiNodeConfig { akka.actor.provider = "akka.cluster.ClusterActorRefProvider" akka.remote.log-remote-lifecycle-events = off akka.cluster.auto-join = off + # don't use sigar for tests, native lib not in path + akka.cluster.metrics.collector-class = akka.cluster.JmxMetricsCollector akka.actor.deployment { /statsService/workerRouter { router = consistent-hashing diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleSingleMasterJapiSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleSingleMasterJapiSpec.scala index 7a5275a7f8..6207a67fd6 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleSingleMasterJapiSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/stats/japi/StatsSampleSingleMasterJapiSpec.scala @@ -34,6 +34,8 @@ object StatsSampleSingleMasterJapiSpecConfig extends MultiNodeConfig { akka.actor.provider = "akka.cluster.ClusterActorRefProvider" akka.remote.log-remote-lifecycle-events = off akka.cluster.auto-join = off + # don't use sigar for tests, native lib not in path + akka.cluster.metrics.collector-class = akka.cluster.JmxMetricsCollector akka.actor.deployment { /statsFacade/statsService/workerRouter { router = consistent-hashing diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/TransformationSampleSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/TransformationSampleSpec.scala index 131997730f..22bfdd6865 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/TransformationSampleSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/TransformationSampleSpec.scala @@ -29,6 +29,8 @@ object TransformationSampleSpecConfig extends MultiNodeConfig { akka.actor.provider = "akka.cluster.ClusterActorRefProvider" akka.remote.log-remote-lifecycle-events = off akka.cluster.auto-join = off + # don't use sigar for tests, native lib not in path + akka.cluster.metrics.collector-class = akka.cluster.JmxMetricsCollector """)) } diff --git a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/japi/TransformationSampleJapiSpec.scala b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/japi/TransformationSampleJapiSpec.scala index d7d328f81d..40a541ff72 100644 --- a/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/japi/TransformationSampleJapiSpec.scala +++ b/akka-samples/akka-sample-cluster/src/multi-jvm/scala/sample/cluster/transformation/japi/TransformationSampleJapiSpec.scala @@ -30,6 +30,8 @@ object TransformationSampleJapiSpecConfig extends MultiNodeConfig { akka.actor.provider = "akka.cluster.ClusterActorRefProvider" akka.remote.log-remote-lifecycle-events = off akka.cluster.auto-join = off + # don't use sigar for tests, native lib not in path + akka.cluster.metrics.collector-class = akka.cluster.JmxMetricsCollector """)) } diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 8c1a4a6335..fead85bb32 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -327,6 +327,10 @@ object AkkaBuild extends Build { dependencies = Seq(cluster, remoteTests % "test", testkit % "test"), settings = sampleSettings ++ multiJvmSettings ++ experimentalSettings ++ Seq( libraryDependencies ++= Dependencies.clusterSample, + javaOptions in run ++= Seq( + "-Djava.library.path=./sigar", + "-Xms128m", "-Xmx1024m"), + Keys.fork in run := true, // disable parallel tests parallelExecution in Test := false, extraOptions in MultiJvm <<= (sourceDirectory in MultiJvm) { src => @@ -673,6 +677,9 @@ object Dependencies { // Camel Sample val camelJetty = "org.apache.camel" % "camel-jetty" % camelCore.revision // ApacheV2 + // Cluster Sample + val sigar = "org.hyperic" % "sigar" % "1.6.4" // ApacheV2 + // Test object Test { @@ -729,7 +736,7 @@ object Dependencies { val zeroMQ = Seq(protobuf, zeroMQClient, Test.scalatest, Test.junit) - val clusterSample = Seq(Test.scalatest) + val clusterSample = Seq(Test.scalatest, sigar) val contrib = Seq(Test.junitIntf) From b00c47854b5a6645896ba3cdc9e24ce2e7696264 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Wed, 7 Nov 2012 16:35:14 +0100 Subject: [PATCH 122/210] Switching over to immutable.Iterable where possible --- .../java/akka/routing/CustomRouteTest.java | 3 +- .../scala/akka/actor/ActorSystemSpec.scala | 11 +- .../scala/akka/routing/CustomRouteSpec.scala | 6 +- .../test/scala/akka/routing/ResizerSpec.scala | 7 +- .../test/scala/akka/routing/RoutingSpec.scala | 21 +-- akka-actor/src/main/java/akka/japi/JAPI.java | 2 +- .../src/main/scala/akka/actor/ActorCell.scala | 6 +- .../src/main/scala/akka/actor/ActorPath.scala | 23 ++- .../scala/akka/actor/ActorRefProvider.scala | 10 +- .../main/scala/akka/actor/ActorSystem.scala | 22 ++- .../src/main/scala/akka/actor/Address.scala | 9 +- .../src/main/scala/akka/actor/Deployer.scala | 5 +- .../main/scala/akka/actor/FaultHandling.scala | 23 +-- .../src/main/scala/akka/actor/Scheduler.scala | 4 +- .../main/scala/akka/actor/TypedActor.scala | 3 +- .../scala/akka/actor/dungeon/Children.scala | 11 +- .../actor/dungeon/ChildrenContainer.scala | 43 +++-- .../akka/actor/dungeon/FaultHandling.scala | 4 +- .../src/main/scala/akka/dispatch/Future.scala | 2 +- .../src/main/scala/akka/event/EventBus.scala | 4 +- .../src/main/scala/akka/japi/JavaAPI.scala | 36 +++- .../routing/ConsistentHashingRouter.scala | 17 +- .../src/main/scala/akka/routing/Routing.scala | 160 +++++++++--------- .../src/main/scala/akka/routing/package.scala | 4 +- .../akka/serialization/Serialization.scala | 30 ++-- .../main/scala/akka/util/Collections.scala | 54 ++++++ .../src/main/scala/akka/util/Convert.scala | 45 ----- .../src/main/scala/akka/util/Index.scala | 2 +- .../src/main/scala/akka/camel/Camel.scala | 9 +- .../scala/akka/cluster/ClusterSettings.scala | 4 +- .../cluster/routing/ClusterRouterConfig.scala | 20 +-- .../docs/actor/FaultHandlingTestBase.java | 4 +- .../jrouting/CustomRouterDocTestBase.java | 8 +- .../project/migration-guide-2.1.x-2.2.x.rst | 26 +++ akka-docs/rst/project/migration-guides.rst | 1 + .../scala/akka/osgi/PojoSRTestSupport.scala | 7 +- .../akka/remote/testkit/MultiNodeSpec.scala | 6 +- .../scala/akka/remote/RemoteDeployer.scala | 9 +- .../scala/akka/remote/netty/Settings.scala | 41 +---- .../remote/routing/RemoteRouterConfig.scala | 22 ++- .../main/java/akka/testkit/JavaTestKit.java | 12 +- .../akka/testkit/TestEventListener.scala | 8 +- .../UntypedCoordinatedIncrementTest.java | 4 +- .../transactor/UntypedTransactorTest.java | 6 +- 44 files changed, 385 insertions(+), 369 deletions(-) create mode 100644 akka-actor/src/main/scala/akka/util/Collections.scala delete mode 100644 akka-actor/src/main/scala/akka/util/Convert.scala create mode 100644 akka-docs/rst/project/migration-guide-2.1.x-2.2.x.rst diff --git a/akka-actor-tests/src/test/java/akka/routing/CustomRouteTest.java b/akka-actor-tests/src/test/java/akka/routing/CustomRouteTest.java index d47c49e28d..c0ccd4de26 100644 --- a/akka-actor-tests/src/test/java/akka/routing/CustomRouteTest.java +++ b/akka-actor-tests/src/test/java/akka/routing/CustomRouteTest.java @@ -15,7 +15,8 @@ public class CustomRouteTest { // only to test compilability public void testRoute() { final ActorRef ref = system.actorOf(new Props().withRouter(new RoundRobinRouter(1))); - final scala.Function1, scala.collection.Iterable> route = ExtractRoute.apply(ref); + final scala.Function1, + scala.collection.immutable.Iterable> route = ExtractRoute.apply(ref); route.apply(null); } diff --git a/akka-actor-tests/src/test/scala/akka/actor/ActorSystemSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ActorSystemSpec.scala index bf0128a7e3..038cb2d0e6 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ActorSystemSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ActorSystemSpec.scala @@ -4,14 +4,15 @@ package akka.actor import language.postfixOps + import akka.testkit._ import org.scalatest.junit.JUnitSuite import com.typesafe.config.ConfigFactory import scala.concurrent.Await import scala.concurrent.duration._ -import scala.collection.JavaConverters -import java.util.concurrent.{ TimeUnit, RejectedExecutionException, CountDownLatch, ConcurrentLinkedQueue } +import java.util.concurrent.{ RejectedExecutionException, ConcurrentLinkedQueue } import akka.util.Timeout +import akka.japi.Util.immutableSeq import scala.concurrent.Future import akka.pattern.ask @@ -102,8 +103,6 @@ class ActorSystemSpec extends AkkaSpec("""akka.extensions = ["akka.actor.TestExt } "run termination callbacks in order" in { - import scala.collection.JavaConverters._ - val system2 = ActorSystem("TerminationCallbacks", AkkaSpec.testConf) val result = new ConcurrentLinkedQueue[Int] val count = 10 @@ -121,13 +120,11 @@ class ActorSystemSpec extends AkkaSpec("""akka.extensions = ["akka.actor.TestExt Await.ready(latch, 5 seconds) val expected = (for (i ← 1 to count) yield i).reverse - result.asScala.toSeq must be(expected) + immutableSeq(result) must be(expected) } "awaitTermination after termination callbacks" in { - import scala.collection.JavaConverters._ - val system2 = ActorSystem("AwaitTermination", AkkaSpec.testConf) @volatile var callbackWasRun = false diff --git a/akka-actor-tests/src/test/scala/akka/routing/CustomRouteSpec.scala b/akka-actor-tests/src/test/scala/akka/routing/CustomRouteSpec.scala index 945be2b97d..00bd46f430 100644 --- a/akka-actor-tests/src/test/scala/akka/routing/CustomRouteSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/routing/CustomRouteSpec.scala @@ -19,7 +19,7 @@ class CustomRouteSpec extends AkkaSpec { provider.createRoutees(1) { - case (sender, message: String) ⇒ Seq(Destination(sender, target)) + case (sender, message: String) ⇒ List(Destination(sender, target)) case (sender, message) ⇒ toAll(sender, provider.routees) } } @@ -43,8 +43,8 @@ class CustomRouteSpec extends AkkaSpec { val r = Await.result(router.ask(CurrentRoutees)(1 second). mapTo[RouterRoutees], 1 second) r.routees.size must be(1) - route(testActor -> "hallo") must be(Seq(Destination(testActor, target))) - route(testActor -> 12) must be(Seq(Destination(testActor, r.routees.head))) + route(testActor -> "hallo") must be(List(Destination(testActor, target))) + route(testActor -> 12) must be(List(Destination(testActor, r.routees.head))) //#test-route } diff --git a/akka-actor-tests/src/test/scala/akka/routing/ResizerSpec.scala b/akka-actor-tests/src/test/scala/akka/routing/ResizerSpec.scala index ac0de07dcf..9a9dbe24ac 100644 --- a/akka-actor-tests/src/test/scala/akka/routing/ResizerSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/routing/ResizerSpec.scala @@ -10,10 +10,9 @@ import akka.testkit.TestEvent._ import akka.actor.Props import scala.concurrent.Await import scala.concurrent.duration._ +import scala.collection.immutable import akka.actor.ActorRef -import java.util.concurrent.atomic.AtomicInteger import akka.pattern.ask -import java.util.concurrent.TimeoutException import scala.util.Try object ResizerSpec { @@ -61,10 +60,10 @@ class ResizerSpec extends AkkaSpec(ResizerSpec.config) with DefaultTimeout with lowerBound = 2, upperBound = 3) - val c1 = resizer.capacity(IndexedSeq.empty[ActorRef]) + val c1 = resizer.capacity(immutable.IndexedSeq.empty[ActorRef]) c1 must be(2) - val current = IndexedSeq(system.actorOf(Props[TestActor]), system.actorOf(Props[TestActor])) + val current = immutable.IndexedSeq(system.actorOf(Props[TestActor]), system.actorOf(Props[TestActor])) val c2 = resizer.capacity(current) c2 must be(0) } diff --git a/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala b/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala index 6d643005aa..94a650e8c7 100644 --- a/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/routing/RoutingSpec.scala @@ -7,7 +7,7 @@ import language.postfixOps import java.util.concurrent.atomic.AtomicInteger import akka.actor._ -import scala.collection.mutable.LinkedList +import scala.collection.immutable import akka.testkit._ import scala.concurrent.duration._ import scala.concurrent.Await @@ -17,7 +17,7 @@ import akka.pattern.{ ask, pipe } import java.util.concurrent.ConcurrentHashMap import com.typesafe.config.Config import akka.dispatch.Dispatchers -import akka.util.Timeout +import akka.util.Collections.EmptyImmutableSeq object RoutingSpec { @@ -54,11 +54,10 @@ object RoutingSpec { class MyRouter(config: Config) extends RouterConfig { val foo = config.getString("foo") def createRoute(routeeProvider: RouteeProvider): Route = { - val routees = IndexedSeq(routeeProvider.context.actorOf(Props[Echo])) - routeeProvider.registerRoutees(routees) + routeeProvider.registerRoutees(List(routeeProvider.context.actorOf(Props[Echo]))) { - case (sender, message) ⇒ Nil + case (sender, message) ⇒ EmptyImmutableSeq } } def routerDispatcher: String = Dispatchers.DefaultDispatcherId @@ -251,15 +250,15 @@ class RoutingSpec extends AkkaSpec(RoutingSpec.config) with DefaultTimeout with val doneLatch = new TestLatch(connectionCount) //lets create some connections. - var actors = new LinkedList[ActorRef] - var counters = new LinkedList[AtomicInteger] + @volatile var actors = immutable.IndexedSeq[ActorRef]() + @volatile var counters = immutable.IndexedSeq[AtomicInteger]() for (i ← 0 until connectionCount) { counters = counters :+ new AtomicInteger() val actor = system.actorOf(Props(new Actor { def receive = { case "end" ⇒ doneLatch.countDown() - case msg: Int ⇒ counters.get(i).get.addAndGet(msg) + case msg: Int ⇒ counters(i).addAndGet(msg) } })) actors = actors :+ actor @@ -278,10 +277,8 @@ class RoutingSpec extends AkkaSpec(RoutingSpec.config) with DefaultTimeout with //now wait some and do validations. Await.ready(doneLatch, remaining) - for (i ← 0 until connectionCount) { - val counter = counters.get(i).get - counter.get must be((iterationCount * (i + 1))) - } + for (i ← 0 until connectionCount) + counters(i).get must be((iterationCount * (i + 1))) } "deliver a broadcast message using the !" in { diff --git a/akka-actor/src/main/java/akka/japi/JAPI.java b/akka-actor/src/main/java/akka/japi/JAPI.java index 4808b3e725..4c040220f3 100644 --- a/akka-actor/src/main/java/akka/japi/JAPI.java +++ b/akka-actor/src/main/java/akka/japi/JAPI.java @@ -5,7 +5,7 @@ import scala.collection.Seq; public class JAPI { public static Seq seq(T... ts) { - return Util.arrayToSeq(ts); + return Util.immutableSeq(ts); } } diff --git a/akka-actor/src/main/scala/akka/actor/ActorCell.scala b/akka-actor/src/main/scala/akka/actor/ActorCell.scala index 14d280eb98..75dbd3fefa 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorCell.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorCell.scala @@ -6,7 +6,7 @@ package akka.actor import java.io.{ ObjectOutputStream, NotSerializableException } import scala.annotation.tailrec -import scala.collection.immutable.TreeSet +import scala.collection.immutable import scala.concurrent.duration.Duration import scala.util.control.NonFatal import akka.actor.dungeon.ChildrenContainer @@ -108,7 +108,7 @@ trait ActorContext extends ActorRefFactory { * val goodLookup = context.actorFor("kid") * }}} */ - def children: Iterable[ActorRef] + def children: immutable.Iterable[ActorRef] /** * Get the child with the given name if it exists. @@ -287,7 +287,7 @@ private[akka] object ActorCell { final val emptyBehaviorStack: List[Actor.Receive] = Nil - final val emptyActorRefSet: Set[ActorRef] = TreeSet.empty + final val emptyActorRefSet: Set[ActorRef] = immutable.TreeSet.empty } //ACTORCELL IS 64bytes and should stay that way unless very good reason not to (machine sympathy, cache line fit) diff --git a/akka-actor/src/main/scala/akka/actor/ActorPath.scala b/akka-actor/src/main/scala/akka/actor/ActorPath.scala index a20e8220b1..4cb61d2212 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorPath.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorPath.scala @@ -3,6 +3,8 @@ */ package akka.actor import scala.annotation.tailrec +import scala.collection.immutable +import akka.japi.Util.immutableSeq import java.net.MalformedURLException object ActorPath { @@ -20,6 +22,8 @@ object ActorPath { * http://www.ietf.org/rfc/rfc2396.txt */ val ElementRegex = """(?:[-\w:@&=+,.!~*'_;]|%\p{XDigit}{2})(?:[-\w:@&=+,.!~*'$_;]|%\p{XDigit}{2})*""".r + + private[akka] final val emptyActorPath: immutable.Iterable[String] = List("") } /** @@ -68,23 +72,18 @@ sealed trait ActorPath extends Comparable[ActorPath] with Serializable { /** * ''Java API'': Recursively create a descendant’s path by appending all child names. */ - def descendant(names: java.lang.Iterable[String]): ActorPath = { - import scala.collection.JavaConverters._ - /(names.asScala) - } + def descendant(names: java.lang.Iterable[String]): ActorPath = /(immutableSeq(names)) /** * Sequence of names for this path from root to this. Performance implication: has to allocate a list. */ - def elements: Iterable[String] + def elements: immutable.Iterable[String] /** * ''Java API'': Sequence of names for this path from root to this. Performance implication: has to allocate a list. */ - def getElements: java.lang.Iterable[String] = { - import scala.collection.JavaConverters._ - elements.asJava - } + def getElements: java.lang.Iterable[String] = + scala.collection.JavaConverters.asJavaIterableConverter(elements).asJava /** * Walk up the tree to obtain and return the RootActorPath. @@ -112,7 +111,7 @@ final case class RootActorPath(address: Address, name: String = "/") extends Act override def /(child: String): ActorPath = new ChildActorPath(this, child) - override val elements: Iterable[String] = List("") + override def elements: immutable.Iterable[String] = ActorPath.emptyActorPath override val toString: String = address + name @@ -134,9 +133,9 @@ final class ChildActorPath(val parent: ActorPath, val name: String) extends Acto override def /(child: String): ActorPath = new ChildActorPath(this, child) - override def elements: Iterable[String] = { + override def elements: immutable.Iterable[String] = { @tailrec - def rec(p: ActorPath, acc: List[String]): Iterable[String] = p match { + def rec(p: ActorPath, acc: List[String]): immutable.Iterable[String] = p match { case r: RootActorPath ⇒ acc case _ ⇒ rec(p.parent, p.name :: acc) } diff --git a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala index a11da0c150..b0b4c3d939 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala @@ -8,8 +8,9 @@ import akka.dispatch._ import akka.routing._ import akka.event._ import akka.util.{ Switch, Helpers } +import akka.japi.Util.immutableSeq +import akka.util.Collections.EmptyImmutableSeq import scala.util.{ Success, Failure } -import scala.util.control.NonFatal import scala.concurrent.{ Future, Promise } import java.util.concurrent.atomic.AtomicLong @@ -271,10 +272,7 @@ trait ActorRefFactory { * * For maximum performance use a collection with efficient head & tail operations. */ - def actorFor(path: java.lang.Iterable[String]): ActorRef = { - import scala.collection.JavaConverters._ - provider.actorFor(lookupRoot, path.asScala) - } + def actorFor(path: java.lang.Iterable[String]): ActorRef = provider.actorFor(lookupRoot, immutableSeq(path)) /** * Construct an [[akka.actor.ActorSelection]] from the given path, which is @@ -480,7 +478,7 @@ class LocalActorRefProvider( def registerExtraNames(_extras: Map[String, InternalActorRef]): Unit = extraNames ++= _extras private def guardianSupervisorStrategyConfigurator = - dynamicAccess.createInstanceFor[SupervisorStrategyConfigurator](settings.SupervisorStrategyClass, Nil).get + dynamicAccess.createInstanceFor[SupervisorStrategyConfigurator](settings.SupervisorStrategyClass, EmptyImmutableSeq).get /** * Overridable supervision strategy to be used by the “/user” guardian. diff --git a/akka-actor/src/main/scala/akka/actor/ActorSystem.scala b/akka-actor/src/main/scala/akka/actor/ActorSystem.scala index b4309bcb5c..8bada6e0ba 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorSystem.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorSystem.scala @@ -6,7 +6,7 @@ package akka.actor import akka.event._ import akka.dispatch._ -import akka.pattern.ask +import akka.japi.Util.immutableSeq import com.typesafe.config.{ Config, ConfigFactory } import scala.annotation.tailrec import scala.collection.immutable @@ -144,7 +144,7 @@ object ActorSystem { final val LogLevel: String = getString("akka.loglevel") final val StdoutLogLevel: String = getString("akka.stdout-loglevel") - final val EventHandlers: immutable.Seq[String] = getStringList("akka.event-handlers").asScala.to[Vector] + final val EventHandlers: immutable.Seq[String] = immutableSeq(getStringList("akka.event-handlers")) final val EventHandlerStartTimeout: Timeout = Timeout(Duration(getMilliseconds("akka.event-handler-startup-timeout"), MILLISECONDS)) final val LogConfigOnStart: Boolean = config.getBoolean("akka.log-config-on-start") @@ -273,8 +273,7 @@ abstract class ActorSystem extends ActorRefFactory { /** * ''Java API'': Recursively create a descendant’s path by appending all child names. */ - def descendant(names: java.lang.Iterable[String]): ActorPath = - /(scala.collection.JavaConverters.iterableAsScalaIterableConverter(names).asScala) + def descendant(names: java.lang.Iterable[String]): ActorPath = /(immutableSeq(names)) /** * Start-up time in milliseconds since the epoch. @@ -674,15 +673,14 @@ private[akka] class ActorSystemImpl(val name: String, applicationConfig: Config, def hasExtension(ext: ExtensionId[_ <: Extension]): Boolean = findExtension(ext) != null private def loadExtensions() { - scala.collection.JavaConverters.collectionAsScalaIterableConverter( - settings.config.getStringList("akka.extensions")).asScala foreach { fqcn ⇒ - dynamicAccess.getObjectFor[AnyRef](fqcn) recoverWith { case _ ⇒ dynamicAccess.createInstanceFor[AnyRef](fqcn, Nil) } match { - case Success(p: ExtensionIdProvider) ⇒ registerExtension(p.lookup()) - case Success(p: ExtensionId[_]) ⇒ registerExtension(p) - case Success(other) ⇒ log.error("[{}] is not an 'ExtensionIdProvider' or 'ExtensionId', skipping...", fqcn) - case Failure(problem) ⇒ log.error(problem, "While trying to load extension [{}], skipping...", fqcn) - } + immutableSeq(settings.config.getStringList("akka.extensions")) foreach { fqcn ⇒ + dynamicAccess.getObjectFor[AnyRef](fqcn) recoverWith { case _ ⇒ dynamicAccess.createInstanceFor[AnyRef](fqcn, Nil) } match { + case Success(p: ExtensionIdProvider) ⇒ registerExtension(p.lookup()) + case Success(p: ExtensionId[_]) ⇒ registerExtension(p) + case Success(other) ⇒ log.error("[{}] is not an 'ExtensionIdProvider' or 'ExtensionId', skipping...", fqcn) + case Failure(problem) ⇒ log.error(problem, "While trying to load extension [{}], skipping...", fqcn) } + } } override def toString: String = lookupRoot.path.root.address.toString diff --git a/akka-actor/src/main/scala/akka/actor/Address.scala b/akka-actor/src/main/scala/akka/actor/Address.scala index b8f8a52e45..d98bbcb208 100644 --- a/akka-actor/src/main/scala/akka/actor/Address.scala +++ b/akka-actor/src/main/scala/akka/actor/Address.scala @@ -120,13 +120,12 @@ object AddressFromURIString { * Given an ActorPath it returns the Address and the path elements if the path is well-formed */ object ActorPathExtractor extends PathUtils { - def unapply(addr: String): Option[(Address, Iterable[String])] = + def unapply(addr: String): Option[(Address, immutable.Iterable[String])] = try { val uri = new URI(addr) - if (uri.getRawPath == null) None - else AddressFromURIString.unapply(uri) match { - case None ⇒ None - case Some(addr) ⇒ Some((addr, split(uri.getRawPath).drop(1))) + uri.getRawPath match { + case null ⇒ None + case path ⇒ AddressFromURIString.unapply(uri).map((_, split(path).drop(1))) } } catch { case _: URISyntaxException ⇒ None diff --git a/akka-actor/src/main/scala/akka/actor/Deployer.scala b/akka-actor/src/main/scala/akka/actor/Deployer.scala index e74b54c320..0edb0a0490 100644 --- a/akka-actor/src/main/scala/akka/actor/Deployer.scala +++ b/akka-actor/src/main/scala/akka/actor/Deployer.scala @@ -7,10 +7,11 @@ package akka.actor import scala.concurrent.duration.Duration import com.typesafe.config._ import akka.routing._ +import akka.japi.Util.immutableSeq import java.util.concurrent.{ TimeUnit } import akka.util.WildcardTree import java.util.concurrent.atomic.AtomicReference -import annotation.tailrec +import scala.annotation.tailrec /** * This class represents deployment configuration for a given actor path. It is @@ -141,7 +142,7 @@ private[akka] class Deployer(val settings: ActorSystem.Settings, val dynamicAcce val deployment = config.withFallback(default) - val routees = Vector() ++ deployment.getStringList("routees.paths").asScala + val routees = immutableSeq(deployment.getStringList("routees.paths")) val nrOfInstances = deployment.getInt("nr-of-instances") diff --git a/akka-actor/src/main/scala/akka/actor/FaultHandling.scala b/akka-actor/src/main/scala/akka/actor/FaultHandling.scala index 444618df00..7f65c84d02 100644 --- a/akka-actor/src/main/scala/akka/actor/FaultHandling.scala +++ b/akka-actor/src/main/scala/akka/actor/FaultHandling.scala @@ -7,9 +7,11 @@ import language.implicitConversions import java.lang.{ Iterable ⇒ JIterable } import java.util.concurrent.TimeUnit +import akka.japi.Util.immutableSeq import scala.collection.mutable.ArrayBuffer import scala.collection.immutable import scala.concurrent.duration.Duration + /** * INTERNAL API */ @@ -171,7 +173,7 @@ object SupervisorStrategy extends SupervisorStrategyLowPriorityImplicits { * Implicit conversion from `Seq` of Throwables to a `Decider`. * This maps the given Throwables to restarts, otherwise escalates. */ - implicit def seqThrowable2Decider(trapExit: immutable.Seq[Class[_ <: Throwable]]): Decider = makeImmutableDecider(trapExit) + implicit def seqThrowable2Decider(trapExit: immutable.Seq[Class[_ <: Throwable]]): Decider = makeDecider(trapExit) type Decider = PartialFunction[Throwable, Directive] type JDecider = akka.japi.Function[Throwable, Directive] @@ -181,22 +183,15 @@ object SupervisorStrategy extends SupervisorStrategyLowPriorityImplicits { * Decider builder which just checks whether one of * the given Throwables matches the cause and restarts, otherwise escalates. */ - def makeDecider(trapExit: immutable.Seq[Class[_ <: Throwable]]): Decider = makeImmutableDecider(trapExit) + def makeDecider(trapExit: immutable.Seq[Class[_ <: Throwable]]): Decider = { + case x ⇒ if (trapExit exists (_ isInstance x)) Restart else Escalate + } + /** * Decider builder which just checks whether one of * the given Throwables matches the cause and restarts, otherwise escalates. */ - def makeDecider(trapExit: JIterable[Class[_ <: Throwable]]): Decider = - makeImmutableDecider(scala.collection.JavaConverters.iterableAsScalaIterableConverter(trapExit).asScala) - - private[this] def makeImmutableDecider(trapExit: Iterable[Class[_]]): Decider = { - val traps = trapExit match { // This is the sad, awkward, truth - case s: immutable.Seq[_] ⇒ s.asInstanceOf[immutable.Seq[Class[_]]] - case other ⇒ other.to[immutable.Seq] - } - - { case x ⇒ if (traps exists (_ isInstance x)) Restart else Escalate } - } + def makeDecider(trapExit: JIterable[Class[_ <: Throwable]]): Decider = makeDecider(immutableSeq(trapExit)) /** * Decider builder for Iterables of cause-directive pairs, e.g. a map obtained @@ -228,7 +223,7 @@ object SupervisorStrategy extends SupervisorStrategyLowPriorityImplicits { case x ⇒ buf insert (x, ca) } buf - }.to[immutable.Seq] + }.to[immutable.IndexedSeq] private[akka] def withinTimeRangeOption(withinTimeRange: Duration): Option[Duration] = if (withinTimeRange.isFinite && withinTimeRange >= Duration.Zero) Some(withinTimeRange) else None diff --git a/akka-actor/src/main/scala/akka/actor/Scheduler.scala b/akka-actor/src/main/scala/akka/actor/Scheduler.scala index 8e11baada0..2f8310a071 100644 --- a/akka-actor/src/main/scala/akka/actor/Scheduler.scala +++ b/akka-actor/src/main/scala/akka/actor/Scheduler.scala @@ -203,8 +203,8 @@ class DefaultScheduler(hashedWheelTimer: HashedWheelTimer, log: LoggingAdapter) } override def close(): Unit = { - import scala.collection.JavaConverters._ - hashedWheelTimer.stop().asScala foreach execDirectly + val i = hashedWheelTimer.stop().iterator() + while (i.hasNext) execDirectly(i.next()) } } diff --git a/akka-actor/src/main/scala/akka/actor/TypedActor.scala b/akka-actor/src/main/scala/akka/actor/TypedActor.scala index f7b0e853ef..cc12ed07a2 100644 --- a/akka-actor/src/main/scala/akka/actor/TypedActor.scala +++ b/akka-actor/src/main/scala/akka/actor/TypedActor.scala @@ -13,6 +13,7 @@ import scala.concurrent.duration.Duration import scala.reflect.ClassTag import scala.concurrent.{ Await, Future } import akka.japi.{ Creator, Option ⇒ JOption } +import akka.japi.Util.{ immutableSeq, immutableSingletonSeq } import akka.util.Timeout import akka.util.Reflect.instantiator import akka.serialization.{ JavaSerializer, SerializationExtension } @@ -442,7 +443,7 @@ object TypedProps { * or a sequence containing only itself, if itself is an interface. */ def extractInterfaces(clazz: Class[_]): immutable.Seq[Class[_]] = - if (clazz.isInterface) List[Class[_]](clazz) else clazz.getInterfaces.to[List] + if (clazz.isInterface) immutableSingletonSeq(clazz) else immutableSeq(clazz.getInterfaces) /** * Uses the supplied class as the factory for the TypedActor implementation, diff --git a/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala b/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala index d59b0b71da..74e06f3034 100644 --- a/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala +++ b/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala @@ -5,14 +5,12 @@ package akka.actor.dungeon import scala.annotation.tailrec -import scala.collection.JavaConverters.asJavaIterableConverter import scala.util.control.NonFatal +import scala.collection.immutable import akka.actor._ -import akka.actor.ActorCell import akka.actor.ActorPath.ElementRegex import akka.serialization.SerializationExtension import akka.util.{ Unsafe, Helpers } -import akka.actor.ChildNameReserved private[akka] trait Children { this: ActorCell ⇒ @@ -24,8 +22,9 @@ private[akka] trait Children { this: ActorCell ⇒ def childrenRefs: ChildrenContainer = Unsafe.instance.getObjectVolatile(this, AbstractActorCell.childrenOffset).asInstanceOf[ChildrenContainer] - final def children: Iterable[ActorRef] = childrenRefs.children - final def getChildren(): java.lang.Iterable[ActorRef] = children.asJava + final def children: immutable.Iterable[ActorRef] = childrenRefs.children + final def getChildren(): java.lang.Iterable[ActorRef] = + scala.collection.JavaConverters.asJavaIterableConverter(children).asJava final def child(name: String): Option[ActorRef] = Option(getChild(name)) final def getChild(name: String): ActorRef = childrenRefs.getByName(name) match { @@ -141,7 +140,7 @@ private[akka] trait Children { this: ActorCell ⇒ protected def getChildByRef(ref: ActorRef): Option[ChildRestartStats] = childrenRefs.getByRef(ref) - protected def getAllChildStats: Iterable[ChildRestartStats] = childrenRefs.stats + protected def getAllChildStats: immutable.Iterable[ChildRestartStats] = childrenRefs.stats protected def removeChildAndGetStateChange(child: ActorRef): Option[SuspendReason] = { childrenRefs match { diff --git a/akka-actor/src/main/scala/akka/actor/dungeon/ChildrenContainer.scala b/akka-actor/src/main/scala/akka/actor/dungeon/ChildrenContainer.scala index eeb28cf018..1fccbf8078 100644 --- a/akka-actor/src/main/scala/akka/actor/dungeon/ChildrenContainer.scala +++ b/akka-actor/src/main/scala/akka/actor/dungeon/ChildrenContainer.scala @@ -4,10 +4,11 @@ package akka.actor.dungeon -import scala.collection.immutable.TreeMap +import scala.collection.immutable import akka.actor.{ InvalidActorNameException, ChildStats, ChildRestartStats, ChildNameReserved, ActorRef } import akka.dispatch.SystemMessage +import akka.util.Collections.{ EmptyImmutableSeq, PartialImmutableValuesIterable } /** * INTERNAL API @@ -20,8 +21,8 @@ private[akka] trait ChildrenContainer { def getByName(name: String): Option[ChildStats] def getByRef(actor: ActorRef): Option[ChildRestartStats] - def children: Iterable[ActorRef] - def stats: Iterable[ChildRestartStats] + def children: immutable.Iterable[ActorRef] + def stats: immutable.Iterable[ChildRestartStats] def shallDie(actor: ActorRef): ChildrenContainer @@ -49,6 +50,18 @@ private[akka] object ChildrenContainer { case class Creation() extends SuspendReason with WaitingForChildren case object Termination extends SuspendReason + class ChildRestartsIterable(stats: immutable.MapLike[_, ChildStats, _]) extends PartialImmutableValuesIterable[ChildStats, ChildRestartStats] { + override final def apply(c: ChildStats) = c.asInstanceOf[ChildRestartStats] + override final def isDefinedAt(c: ChildStats) = c.isInstanceOf[ChildRestartStats] + override final def valuesIterator = stats.valuesIterator + } + + class ChildrenIterable(stats: immutable.MapLike[_, ChildStats, _]) extends PartialImmutableValuesIterable[ChildStats, ActorRef] { + override final def apply(c: ChildStats) = c.asInstanceOf[ChildRestartStats].child + override final def isDefinedAt(c: ChildStats) = c.isInstanceOf[ChildRestartStats] + override final def valuesIterator = stats.valuesIterator + } + trait WaitingForChildren { private var todo: SystemMessage = null def enqueue(message: SystemMessage) = { message.next = todo; todo = message } @@ -56,13 +69,13 @@ private[akka] object ChildrenContainer { } trait EmptyChildrenContainer extends ChildrenContainer { - val emptyStats = TreeMap.empty[String, ChildStats] + val emptyStats = immutable.TreeMap.empty[String, ChildStats] override def add(name: String, stats: ChildRestartStats): ChildrenContainer = new NormalChildrenContainer(emptyStats.updated(name, stats)) override def remove(child: ActorRef): ChildrenContainer = this override def getByName(name: String): Option[ChildRestartStats] = None override def getByRef(actor: ActorRef): Option[ChildRestartStats] = None - override def children: Iterable[ActorRef] = Nil - override def stats: Iterable[ChildRestartStats] = Nil + override def children: immutable.Iterable[ActorRef] = EmptyImmutableSeq + override def stats: immutable.Iterable[ChildRestartStats] = EmptyImmutableSeq override def shallDie(actor: ActorRef): ChildrenContainer = this override def reserve(name: String): ChildrenContainer = new NormalChildrenContainer(emptyStats.updated(name, ChildNameReserved)) override def unreserve(name: String): ChildrenContainer = this @@ -95,7 +108,7 @@ private[akka] object ChildrenContainer { * calling context.stop(child) and processing the ChildTerminated() system * message). */ - class NormalChildrenContainer(val c: TreeMap[String, ChildStats]) extends ChildrenContainer { + class NormalChildrenContainer(val c: immutable.TreeMap[String, ChildStats]) extends ChildrenContainer { override def add(name: String, stats: ChildRestartStats): ChildrenContainer = new NormalChildrenContainer(c.updated(name, stats)) @@ -108,9 +121,11 @@ private[akka] object ChildrenContainer { case _ ⇒ None } - override def children: Iterable[ActorRef] = c.values.view.collect { case ChildRestartStats(child, _, _) ⇒ child } + override def children: immutable.Iterable[ActorRef] = + if (c.isEmpty) EmptyImmutableSeq else new ChildrenIterable(c) - override def stats: Iterable[ChildRestartStats] = c.values.view.collect { case c: ChildRestartStats ⇒ c } + override def stats: immutable.Iterable[ChildRestartStats] = + if (c.isEmpty) EmptyImmutableSeq else new ChildRestartsIterable(c) override def shallDie(actor: ActorRef): ChildrenContainer = TerminatingChildrenContainer(c, Set(actor), UserRequest) @@ -130,7 +145,7 @@ private[akka] object ChildrenContainer { } object NormalChildrenContainer { - def apply(c: TreeMap[String, ChildStats]): ChildrenContainer = + def apply(c: immutable.TreeMap[String, ChildStats]): ChildrenContainer = if (c.isEmpty) EmptyChildrenContainer else new NormalChildrenContainer(c) } @@ -145,7 +160,7 @@ private[akka] object ChildrenContainer { * type of container, depending on whether or not children are left and whether or not * the reason was “Terminating”. */ - case class TerminatingChildrenContainer(c: TreeMap[String, ChildStats], toDie: Set[ActorRef], reason: SuspendReason) + case class TerminatingChildrenContainer(c: immutable.TreeMap[String, ChildStats], toDie: Set[ActorRef], reason: SuspendReason) extends ChildrenContainer { override def add(name: String, stats: ChildRestartStats): ChildrenContainer = copy(c.updated(name, stats)) @@ -166,9 +181,11 @@ private[akka] object ChildrenContainer { case _ ⇒ None } - override def children: Iterable[ActorRef] = c.values.view.collect { case ChildRestartStats(child, _, _) ⇒ child } + override def children: immutable.Iterable[ActorRef] = + if (c.isEmpty) EmptyImmutableSeq else new ChildrenIterable(c) - override def stats: Iterable[ChildRestartStats] = c.values.view.collect { case c: ChildRestartStats ⇒ c } + override def stats: immutable.Iterable[ChildRestartStats] = + if (c.isEmpty) EmptyImmutableSeq else new ChildRestartsIterable(c) override def shallDie(actor: ActorRef): ChildrenContainer = copy(toDie = toDie + actor) diff --git a/akka-actor/src/main/scala/akka/actor/dungeon/FaultHandling.scala b/akka-actor/src/main/scala/akka/actor/dungeon/FaultHandling.scala index 5ea0772f61..ac4f5b5c36 100644 --- a/akka-actor/src/main/scala/akka/actor/dungeon/FaultHandling.scala +++ b/akka-actor/src/main/scala/akka/actor/dungeon/FaultHandling.scala @@ -10,7 +10,7 @@ import akka.dispatch._ import akka.event.Logging.{ Warning, Error, Debug } import scala.util.control.NonFatal import akka.event.Logging -import scala.Some +import scala.collection.immutable import akka.dispatch.ChildTerminated import akka.actor.PreRestartException import akka.actor.Failed @@ -160,7 +160,7 @@ private[akka] trait FaultHandling { this: ActorCell ⇒ } } - final def handleInvokeFailure(childrenNotToSuspend: Iterable[ActorRef], t: Throwable, message: String): Unit = { + final def handleInvokeFailure(childrenNotToSuspend: immutable.Iterable[ActorRef], t: Throwable, message: String): Unit = { publish(Error(t, self.path.toString, clazz(actor), message)) // prevent any further messages to be processed until the actor has been restarted if (!isFailed) try { diff --git a/akka-actor/src/main/scala/akka/dispatch/Future.scala b/akka-actor/src/main/scala/akka/dispatch/Future.scala index 59c0afe5aa..a7c964b750 100644 --- a/akka-actor/src/main/scala/akka/dispatch/Future.scala +++ b/akka-actor/src/main/scala/akka/dispatch/Future.scala @@ -95,7 +95,7 @@ object Futures { */ def find[T <: AnyRef](futures: JIterable[Future[T]], predicate: JFunc[T, java.lang.Boolean], executor: ExecutionContext): Future[JOption[T]] = { implicit val ec = executor - Future.find[T](futures.asScala)(predicate.apply(_))(executor).map(JOption.fromScalaOption(_)) + Future.find[T](futures.asScala)(predicate.apply(_))(executor) map JOption.fromScalaOption } /** diff --git a/akka-actor/src/main/scala/akka/event/EventBus.scala b/akka-actor/src/main/scala/akka/event/EventBus.scala index 403f7a0dfd..6e3e25e42c 100644 --- a/akka-actor/src/main/scala/akka/event/EventBus.scala +++ b/akka-actor/src/main/scala/akka/event/EventBus.scala @@ -266,9 +266,9 @@ trait ActorClassification { this: ActorEventBus with ActorClassifier ⇒ } } - protected final def dissociate(monitored: ActorRef): Iterable[ActorRef] = { + protected final def dissociate(monitored: ActorRef): immutable.Iterable[ActorRef] = { @tailrec - def dissociateAsMonitored(monitored: ActorRef): Iterable[ActorRef] = { + def dissociateAsMonitored(monitored: ActorRef): immutable.Iterable[ActorRef] = { val current = mappings get monitored current match { case null ⇒ empty diff --git a/akka-actor/src/main/scala/akka/japi/JavaAPI.scala b/akka-actor/src/main/scala/akka/japi/JavaAPI.scala index fda674a02c..87bb338b0f 100644 --- a/akka-actor/src/main/scala/akka/japi/JavaAPI.scala +++ b/akka-actor/src/main/scala/akka/japi/JavaAPI.scala @@ -10,6 +10,7 @@ import scala.collection.immutable import scala.reflect.ClassTag import scala.util.control.NoStackTrace import scala.runtime.AbstractPartialFunction +import akka.util.Collections.EmptyImmutableSeq import java.util.Collections.{ emptyList, singletonList } /** @@ -175,9 +176,40 @@ object Option { * This class hold common utilities for Java */ object Util { + + /** + * Returns a ClassTag describing the provided Class. + * + * Java API + */ def classTag[T](clazz: Class[T]): ClassTag[T] = ClassTag(clazz) - def arrayToSeq[T](arr: Array[T]): immutable.Seq[T] = arr.to[immutable.Seq] + /** + * Returns an immutable.Seq representing the provided array of Classes, + * an overloading of the generic immutableSeq in Util, to accommodate for erasure. + * + * Java API + */ + def immutableSeq(arr: Array[Class[_]]): immutable.Seq[Class[_]] = immutableSeq[Class[_]](arr) - def arrayToSeq(classes: Array[Class[_]]): immutable.Seq[Class[_]] = classes.to[immutable.Seq] + /** + * + */ + def immutableSeq[T](arr: Array[T]): immutable.Seq[T] = if ((arr ne null) && arr.length > 0) Vector(arr: _*) else Nil + + def immutableSeq[T](iterable: java.lang.Iterable[T]): immutable.Seq[T] = + iterable match { + case imm: immutable.Seq[_] ⇒ imm.asInstanceOf[immutable.Seq[T]] + case other ⇒ + val i = other.iterator() + if (i.hasNext) { + val builder = new immutable.VectorBuilder[T] + + do { builder += i.next() } while (i.hasNext) + + builder.result() + } else EmptyImmutableSeq + } + + def immutableSingletonSeq[T](value: T): immutable.Seq[T] = value :: Nil } diff --git a/akka-actor/src/main/scala/akka/routing/ConsistentHashingRouter.scala b/akka-actor/src/main/scala/akka/routing/ConsistentHashingRouter.scala index ca9027c8e8..0214c6736e 100644 --- a/akka-actor/src/main/scala/akka/routing/ConsistentHashingRouter.scala +++ b/akka-actor/src/main/scala/akka/routing/ConsistentHashingRouter.scala @@ -3,11 +3,11 @@ */ package akka.routing -import scala.collection.JavaConverters.iterableAsScalaIterableConverter +import scala.collection.immutable +import akka.japi.Util.immutableSeq import scala.util.control.NonFatal import akka.actor.ActorRef import akka.actor.SupervisorStrategy -import akka.actor.Props import akka.dispatch.Dispatchers import akka.event.Logging import akka.serialization.SerializationExtension @@ -19,16 +19,13 @@ object ConsistentHashingRouter { /** * Creates a new ConsistentHashingRouter, routing to the specified routees */ - def apply(routees: Iterable[ActorRef]): ConsistentHashingRouter = + def apply(routees: immutable.Iterable[ActorRef]): ConsistentHashingRouter = new ConsistentHashingRouter(routees = routees map (_.path.toString)) /** * Java API to create router with the supplied 'routees' actors. */ - def create(routees: java.lang.Iterable[ActorRef]): ConsistentHashingRouter = { - import scala.collection.JavaConverters._ - apply(routees.asScala) - } + def create(routees: java.lang.Iterable[ActorRef]): ConsistentHashingRouter = apply(immutableSeq(routees)) /** * If you don't define the `hashMapping` when @@ -146,7 +143,7 @@ object ConsistentHashingRouter { */ @SerialVersionUID(1L) case class ConsistentHashingRouter( - nrOfInstances: Int = 0, routees: Iterable[String] = Nil, override val resizer: Option[Resizer] = None, + nrOfInstances: Int = 0, routees: immutable.Iterable[String] = Nil, override val resizer: Option[Resizer] = None, val routerDispatcher: String = Dispatchers.DefaultDispatcherId, val supervisorStrategy: SupervisorStrategy = Router.defaultSupervisorStrategy, val virtualNodesFactor: Int = 0, @@ -165,7 +162,7 @@ case class ConsistentHashingRouter( * @param routeePaths string representation of the actor paths of the routees that will be looked up * using `actorFor` in [[akka.actor.ActorRefProvider]] */ - def this(routeePaths: java.lang.Iterable[String]) = this(routees = routeePaths.asScala) + def this(routeePaths: java.lang.Iterable[String]) = this(routees = immutableSeq(routeePaths)) /** * Constructor that sets the resizer to be used. @@ -227,7 +224,7 @@ trait ConsistentHashingLike { this: RouterConfig ⇒ def nrOfInstances: Int - def routees: Iterable[String] + def routees: immutable.Iterable[String] def virtualNodesFactor: Int diff --git a/akka-actor/src/main/scala/akka/routing/Routing.scala b/akka-actor/src/main/scala/akka/routing/Routing.scala index 9ccf43fb58..8c3f059a40 100644 --- a/akka-actor/src/main/scala/akka/routing/Routing.scala +++ b/akka-actor/src/main/scala/akka/routing/Routing.scala @@ -5,18 +5,20 @@ package akka.routing import language.implicitConversions import language.postfixOps -import akka.actor._ -import scala.concurrent.duration._ -import akka.ConfigurationException -import akka.pattern.pipe -import com.typesafe.config.Config + +import scala.collection.immutable import scala.collection.JavaConverters.iterableAsScalaIterableConverter +import scala.concurrent.duration._ +import akka.actor._ +import akka.ConfigurationException +import akka.dispatch.Dispatchers +import akka.pattern.pipe +import akka.japi.Util.immutableSeq +import com.typesafe.config.Config import java.util.concurrent.atomic.{ AtomicLong, AtomicBoolean } import java.util.concurrent.TimeUnit import scala.concurrent.forkjoin.ThreadLocalRandom -import akka.dispatch.Dispatchers import scala.annotation.tailrec -import concurrent.ExecutionContext /** * A RoutedActorRef is an ActorRef that has a set of connected ActorRef and it uses a Router to @@ -50,7 +52,7 @@ private[akka] class RoutedActorCell(_system: ActorSystemImpl, _ref: InternalActo private val resizeCounter = new AtomicLong @volatile - private var _routees: IndexedSeq[ActorRef] = IndexedSeq.empty[ActorRef] // this MUST be initialized during createRoute + private var _routees: immutable.IndexedSeq[ActorRef] = immutable.IndexedSeq.empty[ActorRef] // this MUST be initialized during createRoute def routees = _routees @volatile @@ -75,14 +77,11 @@ private[akka] class RoutedActorCell(_system: ActorSystemImpl, _ref: InternalActo * end of construction */ - def applyRoute(sender: ActorRef, message: Any): Iterable[Destination] = message match { - case _: AutoReceivedMessage ⇒ Destination(self, self) :: Nil - case CurrentRoutees ⇒ - sender ! RouterRoutees(_routees) - Nil - case _ ⇒ - if (route.isDefinedAt(sender, message)) route(sender, message) - else Nil + def applyRoute(sender: ActorRef, message: Any): immutable.Iterable[Destination] = message match { + case _: AutoReceivedMessage ⇒ Destination(self, self) :: Nil + case CurrentRoutees ⇒ sender ! RouterRoutees(_routees); Nil + case msg if route.isDefinedAt(sender, msg) ⇒ route(sender, message) + case _ ⇒ Nil } /** @@ -91,7 +90,7 @@ private[akka] class RoutedActorCell(_system: ActorSystemImpl, _ref: InternalActo * Not thread safe, but intended to be called from protected points, such as * `RouterConfig.createRoute` and `Resizer.resize` */ - private[akka] def addRoutees(newRoutees: Iterable[ActorRef]): Unit = { + private[akka] def addRoutees(newRoutees: immutable.Iterable[ActorRef]): Unit = { _routees = _routees ++ newRoutees // subscribe to Terminated messages for all route destinations, to be handled by Router actor newRoutees foreach watch @@ -103,7 +102,7 @@ private[akka] class RoutedActorCell(_system: ActorSystemImpl, _ref: InternalActo * Not thread safe, but intended to be called from protected points, such as * `Resizer.resize` */ - private[akka] def removeRoutees(abandonedRoutees: Iterable[ActorRef]): Unit = { + private[akka] def removeRoutees(abandonedRoutees: immutable.Iterable[ActorRef]): Unit = { _routees = abandonedRoutees.foldLeft(_routees) { (xs, x) ⇒ unwatch(x); xs.filterNot(_ == x) } } @@ -195,7 +194,7 @@ trait RouterConfig { */ def withFallback(other: RouterConfig): RouterConfig = this - protected def toAll(sender: ActorRef, routees: Iterable[ActorRef]): Iterable[Destination] = + protected def toAll(sender: ActorRef, routees: immutable.Iterable[ActorRef]): immutable.Iterable[Destination] = routees.map(Destination(sender, _)) /** @@ -207,7 +206,7 @@ trait RouterConfig { /** * Check that everything is there which is needed. Called in constructor of RoutedActorRef to fail early. */ - def verifyConfig(): Unit = {} + def verifyConfig(): Unit = () } @@ -226,7 +225,7 @@ class RouteeProvider(val context: ActorContext, val routeeProps: Props, val resi * Not thread safe, but intended to be called from protected points, such as * `RouterConfig.createRoute` and `Resizer.resize`. */ - def registerRoutees(routees: Iterable[ActorRef]): Unit = routedCell.addRoutees(routees) + def registerRoutees(routees: immutable.Iterable[ActorRef]): Unit = routedCell.addRoutees(routees) /** * Adds the routees to the router. @@ -235,7 +234,7 @@ class RouteeProvider(val context: ActorContext, val routeeProps: Props, val resi * `RouterConfig.createRoute` and `Resizer.resize`. * Java API. */ - def registerRoutees(routees: java.lang.Iterable[ActorRef]): Unit = registerRoutees(routees.asScala) + def registerRoutees(routees: java.lang.Iterable[ActorRef]): Unit = registerRoutees(immutableSeq(routees)) /** * Removes routees from the router. This method doesn't stop the routees. @@ -243,7 +242,7 @@ class RouteeProvider(val context: ActorContext, val routeeProps: Props, val resi * Not thread safe, but intended to be called from protected points, such as * `Resizer.resize`. */ - def unregisterRoutees(routees: Iterable[ActorRef]): Unit = routedCell.removeRoutees(routees) + def unregisterRoutees(routees: immutable.Iterable[ActorRef]): Unit = routedCell.removeRoutees(routees) /** * Removes routees from the router. This method doesn't stop the routees. @@ -252,28 +251,25 @@ class RouteeProvider(val context: ActorContext, val routeeProps: Props, val resi * `Resizer.resize`. * JAVA API */ - def unregisterRoutees(routees: java.lang.Iterable[ActorRef]): Unit = unregisterRoutees(routees.asScala) + def unregisterRoutees(routees: java.lang.Iterable[ActorRef]): Unit = unregisterRoutees(immutableSeq(routees)) /** * Looks up routes with specified paths and registers them. */ - def registerRouteesFor(paths: Iterable[String]): Unit = registerRoutees(paths.map(context.actorFor(_))) + def registerRouteesFor(paths: immutable.Iterable[String]): Unit = registerRoutees(paths.map(context.actorFor(_))) /** * Looks up routes with specified paths and registers them. * JAVA API */ - def registerRouteesFor(paths: java.lang.Iterable[String]): Unit = registerRouteesFor(paths.asScala) + def registerRouteesFor(paths: java.lang.Iterable[String]): Unit = registerRouteesFor(immutableSeq(paths)) /** * Creates new routees from specified `Props` and registers them. */ - def createRoutees(nrOfInstances: Int): Unit = { - if (nrOfInstances <= 0) throw new IllegalArgumentException( - "Must specify nrOfInstances or routees for [%s]" format context.self.path.toString) - else - registerRoutees(IndexedSeq.fill(nrOfInstances)(context.actorOf(routeeProps))) - } + def createRoutees(nrOfInstances: Int): Unit = + if (nrOfInstances <= 0) throw new IllegalArgumentException("Must specify nrOfInstances or routees for [%s]" format context.self.path.toString) + else registerRoutees(immutable.IndexedSeq.fill(nrOfInstances)(context.actorOf(routeeProps))) /** * Remove specified number of routees by unregister them @@ -296,7 +292,7 @@ class RouteeProvider(val context: ActorContext, val routeeProps: Props, val resi * Give concurrent messages a chance to be placed in mailbox before * sending PoisonPill. */ - protected def delayedStop(scheduler: Scheduler, abandon: Iterable[ActorRef], stopDelay: FiniteDuration): Unit = { + protected def delayedStop(scheduler: Scheduler, abandon: immutable.Iterable[ActorRef], stopDelay: FiniteDuration): Unit = { if (abandon.nonEmpty) { if (stopDelay <= Duration.Zero) { abandon foreach (_ ! PoisonPill) @@ -314,7 +310,7 @@ class RouteeProvider(val context: ActorContext, val routeeProps: Props, val resi /** * All routees of the router */ - def routees: IndexedSeq[ActorRef] = routedCell.routees + def routees: immutable.IndexedSeq[ActorRef] = routedCell.routees /** * All routees of the router @@ -335,7 +331,7 @@ abstract class CustomRouterConfig extends RouterConfig { val customRoute = createCustomRoute(routeeProvider) { - case (sender, message) ⇒ customRoute.destinationsFor(sender, message).asScala + case (sender, message) ⇒ customRoute.destinationsFor(sender, message) } } @@ -344,7 +340,13 @@ abstract class CustomRouterConfig extends RouterConfig { } trait CustomRoute { - def destinationsFor(sender: ActorRef, message: Any): java.lang.Iterable[Destination] + /** + * use akka.japi.Util.immutableSeq to convert a java.lang.Iterable to the return type needed for destinationsFor, + * or if you just want to return a single Destination, use akka.japi.Util.immutableSingletonSeq + * + * Java API + */ + def destinationsFor(sender: ActorRef, message: Any): immutable.Seq[Destination] } /** @@ -366,7 +368,7 @@ trait Router extends Actor { if (ab.get) try ref.routerConfig.resizer foreach (_.resize(ref.routeeProvider)) finally ab.set(false) case Terminated(child) ⇒ - ref.removeRoutees(IndexedSeq(child)) + ref.removeRoutees(child :: Nil) if (ref.routees.isEmpty) context.stop(self) }: Receive) orElse routerReceive @@ -426,7 +428,7 @@ case object CurrentRoutees extends CurrentRoutees { * Message used to carry information about what routees the router is currently using. */ @SerialVersionUID(1L) -case class RouterRoutees(routees: Iterable[ActorRef]) +case class RouterRoutees(routees: immutable.Iterable[ActorRef]) /** * For every message sent to a router, its route determines a set of destinations, @@ -494,16 +496,14 @@ object RoundRobinRouter { /** * Creates a new RoundRobinRouter, routing to the specified routees */ - def apply(routees: Iterable[ActorRef]): RoundRobinRouter = + def apply(routees: immutable.Iterable[ActorRef]): RoundRobinRouter = new RoundRobinRouter(routees = routees map (_.path.toString)) /** * Java API to create router with the supplied 'routees' actors. */ - def create(routees: java.lang.Iterable[ActorRef]): RoundRobinRouter = { - import scala.collection.JavaConverters._ - apply(routees.asScala) - } + def create(routees: java.lang.Iterable[ActorRef]): RoundRobinRouter = + apply(immutableSeq(routees)) } /** * A Router that uses round-robin to select a connection. For concurrent calls, round robin is just a best effort. @@ -547,7 +547,7 @@ object RoundRobinRouter { * using `actorFor` in [[akka.actor.ActorRefProvider]] */ @SerialVersionUID(1L) -case class RoundRobinRouter(nrOfInstances: Int = 0, routees: Iterable[String] = Nil, override val resizer: Option[Resizer] = None, +case class RoundRobinRouter(nrOfInstances: Int = 0, routees: immutable.Iterable[String] = Nil, override val resizer: Option[Resizer] = None, val routerDispatcher: String = Dispatchers.DefaultDispatcherId, val supervisorStrategy: SupervisorStrategy = Router.defaultSupervisorStrategy) extends RouterConfig with RoundRobinLike { @@ -564,7 +564,7 @@ case class RoundRobinRouter(nrOfInstances: Int = 0, routees: Iterable[String] = * @param routeePaths string representation of the actor paths of the routees that will be looked up * using `actorFor` in [[akka.actor.ActorRefProvider]] */ - def this(routeePaths: java.lang.Iterable[String]) = this(routees = routeePaths.asScala) + def this(routeePaths: java.lang.Iterable[String]) = this(routees = immutableSeq(routeePaths)) /** * Constructor that sets the resizer to be used. @@ -602,7 +602,7 @@ trait RoundRobinLike { this: RouterConfig ⇒ def nrOfInstances: Int - def routees: Iterable[String] + def routees: immutable.Iterable[String] def createRoute(routeeProvider: RouteeProvider): Route = { if (resizer.isEmpty) { @@ -622,7 +622,7 @@ trait RoundRobinLike { this: RouterConfig ⇒ case (sender, message) ⇒ message match { case Broadcast(msg) ⇒ toAll(sender, routeeProvider.routees) - case msg ⇒ List(Destination(sender, getNext())) + case msg ⇒ Destination(sender, getNext()) :: Nil } } } @@ -632,15 +632,13 @@ object RandomRouter { /** * Creates a new RandomRouter, routing to the specified routees */ - def apply(routees: Iterable[ActorRef]): RandomRouter = new RandomRouter(routees = routees map (_.path.toString)) + def apply(routees: immutable.Iterable[ActorRef]): RandomRouter = new RandomRouter(routees = routees map (_.path.toString)) /** * Java API to create router with the supplied 'routees' actors. */ - def create(routees: java.lang.Iterable[ActorRef]): RandomRouter = { - import scala.collection.JavaConverters._ - apply(routees.asScala) - } + def create(routees: java.lang.Iterable[ActorRef]): RandomRouter = + apply(immutableSeq(routees)) } /** * A Router that randomly selects one of the target connections to send a message to. @@ -684,7 +682,7 @@ object RandomRouter { * using `actorFor` in [[akka.actor.ActorRefProvider]] */ @SerialVersionUID(1L) -case class RandomRouter(nrOfInstances: Int = 0, routees: Iterable[String] = Nil, override val resizer: Option[Resizer] = None, +case class RandomRouter(nrOfInstances: Int = 0, routees: immutable.Iterable[String] = Nil, override val resizer: Option[Resizer] = None, val routerDispatcher: String = Dispatchers.DefaultDispatcherId, val supervisorStrategy: SupervisorStrategy = Router.defaultSupervisorStrategy) extends RouterConfig with RandomLike { @@ -701,7 +699,7 @@ case class RandomRouter(nrOfInstances: Int = 0, routees: Iterable[String] = Nil, * @param routeePaths string representation of the actor paths of the routees that will be looked up * using `actorFor` in [[akka.actor.ActorRefProvider]] */ - def this(routeePaths: java.lang.Iterable[String]) = this(routees = routeePaths.asScala) + def this(routeePaths: java.lang.Iterable[String]) = this(routees = immutableSeq(routeePaths)) /** * Constructor that sets the resizer to be used. @@ -738,7 +736,7 @@ case class RandomRouter(nrOfInstances: Int = 0, routees: Iterable[String] = Nil, trait RandomLike { this: RouterConfig ⇒ def nrOfInstances: Int - def routees: Iterable[String] + def routees: immutable.Iterable[String] def createRoute(routeeProvider: RouteeProvider): Route = { if (resizer.isEmpty) { @@ -756,7 +754,7 @@ trait RandomLike { this: RouterConfig ⇒ case (sender, message) ⇒ message match { case Broadcast(msg) ⇒ toAll(sender, routeeProvider.routees) - case msg ⇒ List(Destination(sender, getNext())) + case msg ⇒ Destination(sender, getNext()) :: Nil } } } @@ -766,16 +764,14 @@ object SmallestMailboxRouter { /** * Creates a new SmallestMailboxRouter, routing to the specified routees */ - def apply(routees: Iterable[ActorRef]): SmallestMailboxRouter = + def apply(routees: immutable.Iterable[ActorRef]): SmallestMailboxRouter = new SmallestMailboxRouter(routees = routees map (_.path.toString)) /** * Java API to create router with the supplied 'routees' actors. */ - def create(routees: java.lang.Iterable[ActorRef]): SmallestMailboxRouter = { - import scala.collection.JavaConverters._ - apply(routees.asScala) - } + def create(routees: java.lang.Iterable[ActorRef]): SmallestMailboxRouter = + apply(immutableSeq(routees)) } /** * A Router that tries to send to the non-suspended routee with fewest messages in mailbox. @@ -828,7 +824,7 @@ object SmallestMailboxRouter { * using `actorFor` in [[akka.actor.ActorRefProvider]] */ @SerialVersionUID(1L) -case class SmallestMailboxRouter(nrOfInstances: Int = 0, routees: Iterable[String] = Nil, override val resizer: Option[Resizer] = None, +case class SmallestMailboxRouter(nrOfInstances: Int = 0, routees: immutable.Iterable[String] = Nil, override val resizer: Option[Resizer] = None, val routerDispatcher: String = Dispatchers.DefaultDispatcherId, val supervisorStrategy: SupervisorStrategy = Router.defaultSupervisorStrategy) extends RouterConfig with SmallestMailboxLike { @@ -845,7 +841,7 @@ case class SmallestMailboxRouter(nrOfInstances: Int = 0, routees: Iterable[Strin * @param routeePaths string representation of the actor paths of the routees that will be looked up * using `actorFor` in [[akka.actor.ActorRefProvider]] */ - def this(routeePaths: java.lang.Iterable[String]) = this(routees = routeePaths.asScala) + def this(routeePaths: java.lang.Iterable[String]) = this(routees = immutableSeq(routeePaths)) /** * Constructor that sets the resizer to be used. @@ -882,7 +878,7 @@ case class SmallestMailboxRouter(nrOfInstances: Int = 0, routees: Iterable[Strin trait SmallestMailboxLike { this: RouterConfig ⇒ def nrOfInstances: Int - def routees: Iterable[String] + def routees: immutable.Iterable[String] /** * Returns true if the actor is currently processing a message. @@ -954,7 +950,7 @@ trait SmallestMailboxLike { this: RouterConfig ⇒ // 4. An ActorRef with unknown mailbox size that isn't processing anything // 5. An ActorRef with a known mailbox size // 6. An ActorRef without any messages - @tailrec def getNext(targets: IndexedSeq[ActorRef] = routeeProvider.routees, + @tailrec def getNext(targets: immutable.IndexedSeq[ActorRef] = routeeProvider.routees, proposedTarget: ActorRef = routeeProvider.context.system.deadLetters, currentScore: Long = Long.MaxValue, at: Int = 0, @@ -985,7 +981,7 @@ trait SmallestMailboxLike { this: RouterConfig ⇒ case (sender, message) ⇒ message match { case Broadcast(msg) ⇒ toAll(sender, routeeProvider.routees) - case msg ⇒ List(Destination(sender, getNext())) + case msg ⇒ Destination(sender, getNext()) :: Nil } } } @@ -995,15 +991,13 @@ object BroadcastRouter { /** * Creates a new BroadcastRouter, routing to the specified routees */ - def apply(routees: Iterable[ActorRef]): BroadcastRouter = new BroadcastRouter(routees = routees map (_.path.toString)) + def apply(routees: immutable.Iterable[ActorRef]): BroadcastRouter = new BroadcastRouter(routees = routees map (_.path.toString)) /** * Java API to create router with the supplied 'routees' actors. */ - def create(routees: java.lang.Iterable[ActorRef]): BroadcastRouter = { - import scala.collection.JavaConverters._ - apply(routees.asScala) - } + def create(routees: java.lang.Iterable[ActorRef]): BroadcastRouter = + apply(immutableSeq(routees)) } /** * A Router that uses broadcasts a message to all its connections. @@ -1047,7 +1041,7 @@ object BroadcastRouter { * using `actorFor` in [[akka.actor.ActorRefProvider]] */ @SerialVersionUID(1L) -case class BroadcastRouter(nrOfInstances: Int = 0, routees: Iterable[String] = Nil, override val resizer: Option[Resizer] = None, +case class BroadcastRouter(nrOfInstances: Int = 0, routees: immutable.Iterable[String] = Nil, override val resizer: Option[Resizer] = None, val routerDispatcher: String = Dispatchers.DefaultDispatcherId, val supervisorStrategy: SupervisorStrategy = Router.defaultSupervisorStrategy) extends RouterConfig with BroadcastLike { @@ -1064,7 +1058,7 @@ case class BroadcastRouter(nrOfInstances: Int = 0, routees: Iterable[String] = N * @param routeePaths string representation of the actor paths of the routees that will be looked up * using `actorFor` in [[akka.actor.ActorRefProvider]] */ - def this(routeePaths: java.lang.Iterable[String]) = this(routees = routeePaths.asScala) + def this(routeePaths: java.lang.Iterable[String]) = this(routees = immutableSeq(routeePaths)) /** * Constructor that sets the resizer to be used. @@ -1102,7 +1096,7 @@ trait BroadcastLike { this: RouterConfig ⇒ def nrOfInstances: Int - def routees: Iterable[String] + def routees: immutable.Iterable[String] def createRoute(routeeProvider: RouteeProvider): Route = { if (resizer.isEmpty) { @@ -1120,16 +1114,14 @@ object ScatterGatherFirstCompletedRouter { /** * Creates a new ScatterGatherFirstCompletedRouter, routing to the specified routees, timing out after the specified Duration */ - def apply(routees: Iterable[ActorRef], within: FiniteDuration): ScatterGatherFirstCompletedRouter = + def apply(routees: immutable.Iterable[ActorRef], within: FiniteDuration): ScatterGatherFirstCompletedRouter = new ScatterGatherFirstCompletedRouter(routees = routees map (_.path.toString), within = within) /** * Java API to create router with the supplied 'routees' actors. */ - def create(routees: java.lang.Iterable[ActorRef], within: FiniteDuration): ScatterGatherFirstCompletedRouter = { - import scala.collection.JavaConverters._ - apply(routees.asScala, within) - } + def create(routees: java.lang.Iterable[ActorRef], within: FiniteDuration): ScatterGatherFirstCompletedRouter = + apply(immutableSeq(routees), within) } /** * Simple router that broadcasts the message to all routees, and replies with the first response. @@ -1175,7 +1167,7 @@ object ScatterGatherFirstCompletedRouter { * using `actorFor` in [[akka.actor.ActorRefProvider]] */ @SerialVersionUID(1L) -case class ScatterGatherFirstCompletedRouter(nrOfInstances: Int = 0, routees: Iterable[String] = Nil, within: FiniteDuration, +case class ScatterGatherFirstCompletedRouter(nrOfInstances: Int = 0, routees: immutable.Iterable[String] = Nil, within: FiniteDuration, override val resizer: Option[Resizer] = None, val routerDispatcher: String = Dispatchers.DefaultDispatcherId, val supervisorStrategy: SupervisorStrategy = Router.defaultSupervisorStrategy) @@ -1196,7 +1188,7 @@ case class ScatterGatherFirstCompletedRouter(nrOfInstances: Int = 0, routees: It * @param routeePaths string representation of the actor paths of the routees that will be looked up * using `actorFor` in [[akka.actor.ActorRefProvider]] */ - def this(routeePaths: java.lang.Iterable[String], w: FiniteDuration) = this(routees = routeePaths.asScala, within = w) + def this(routeePaths: java.lang.Iterable[String], w: FiniteDuration) = this(routees = immutableSeq(routeePaths), within = w) /** * Constructor that sets the resizer to be used. @@ -1234,7 +1226,7 @@ trait ScatterGatherFirstCompletedLike { this: RouterConfig ⇒ def nrOfInstances: Int - def routees: Iterable[String] + def routees: immutable.Iterable[String] def within: FiniteDuration @@ -1394,7 +1386,7 @@ case class DefaultResizer( * @param routees The current actor in the resizer * @return the number of routees by which the resizer should be adjusted (positive, negative or zero) */ - def capacity(routees: IndexedSeq[ActorRef]): Int = { + def capacity(routees: immutable.IndexedSeq[ActorRef]): Int = { val currentSize = routees.size val press = pressure(routees) val delta = filter(press, currentSize) @@ -1422,7 +1414,7 @@ case class DefaultResizer( * @param routees the current resizer of routees * @return number of busy routees, between 0 and routees.size */ - def pressure(routees: IndexedSeq[ActorRef]): Int = { + def pressure(routees: immutable.IndexedSeq[ActorRef]): Int = { routees count { case a: ActorRefWithCell ⇒ a.underlying match { diff --git a/akka-actor/src/main/scala/akka/routing/package.scala b/akka-actor/src/main/scala/akka/routing/package.scala index 0b40793861..76dc2f3104 100644 --- a/akka-actor/src/main/scala/akka/routing/package.scala +++ b/akka-actor/src/main/scala/akka/routing/package.scala @@ -4,10 +4,12 @@ package akka +import scala.collection.immutable + package object routing { /** * Routing logic, partial function from (sender, message) to a * set of destinations. */ - type Route = PartialFunction[(akka.actor.ActorRef, Any), Iterable[Destination]] + type Route = PartialFunction[(akka.actor.ActorRef, Any), immutable.Iterable[Destination]] } diff --git a/akka-actor/src/main/scala/akka/serialization/Serialization.scala b/akka-actor/src/main/scala/akka/serialization/Serialization.scala index 1f78fbd3a7..071195c11e 100644 --- a/akka-actor/src/main/scala/akka/serialization/Serialization.scala +++ b/akka-actor/src/main/scala/akka/serialization/Serialization.scala @@ -5,8 +5,7 @@ package akka.serialization import com.typesafe.config.Config -import akka.AkkaException -import akka.actor.{ Extension, ExtendedActorSystem, Address, DynamicAccess } +import akka.actor.{ Extension, ExtendedActorSystem, Address } import akka.event.Logging import java.util.concurrent.ConcurrentHashMap import scala.collection.mutable.ArrayBuffer @@ -28,17 +27,13 @@ object Serialization { val currentTransportAddress = new DynamicVariable[Address](null) class Settings(val config: Config) { + val Serializers: Map[String, String] = configToMap("akka.actor.serializers") + val SerializationBindings: Map[String, String] = configToMap("akka.actor.serialization-bindings") - import scala.collection.JavaConverters._ - import config._ - - val Serializers: Map[String, String] = configToMap(getConfig("akka.actor.serializers")) - - val SerializationBindings: Map[String, String] = configToMap(getConfig("akka.actor.serialization-bindings")) - - private def configToMap(cfg: Config): Map[String, String] = - cfg.root.unwrapped.asScala.toMap.map { case (k, v) ⇒ (k, v.toString) } - + private final def configToMap(path: String): Map[String, String] = { + import scala.collection.JavaConverters._ + config.getConfig(path).root.unwrapped.asScala.mapValues(_.toString).toMap + } } } @@ -63,16 +58,16 @@ class Serialization(val system: ExtendedActorSystem) extends Extension { * using the optional type hint to the Serializer and the optional ClassLoader ot load it into. * Returns either the resulting object or an Exception if one was thrown. */ - def deserialize(bytes: Array[Byte], - serializerId: Int, - clazz: Option[Class[_]]): Try[AnyRef] = Try(serializerByIdentity(serializerId).fromBinary(bytes, clazz)) + def deserialize(bytes: Array[Byte], serializerId: Int, clazz: Option[Class[_]]): Try[AnyRef] = + Try(serializerByIdentity(serializerId).fromBinary(bytes, clazz)) /** * Deserializes the given array of bytes using the specified type to look up what Serializer should be used. * You can specify an optional ClassLoader to load the object into. * Returns either the resulting object or an Exception if one was thrown. */ - def deserialize(bytes: Array[Byte], clazz: Class[_]): Try[AnyRef] = Try(serializerFor(clazz).fromBinary(bytes, Some(clazz))) + def deserialize(bytes: Array[Byte], clazz: Class[_]): Try[AnyRef] = + Try(serializerFor(clazz).fromBinary(bytes, Some(clazz))) /** * Returns the Serializer configured for the given object, returns the NullSerializer if it's null. @@ -96,8 +91,7 @@ class Serialization(val system: ExtendedActorSystem) extends Extension { */ def serializerFor(clazz: Class[_]): Serializer = serializerMap.get(clazz) match { - case null ⇒ - // bindings are ordered from most specific to least specific + case null ⇒ // bindings are ordered from most specific to least specific def unique(possibilities: immutable.Seq[(Class[_], Serializer)]): Boolean = possibilities.size == 1 || (possibilities forall (_._1 isAssignableFrom possibilities(0)._1)) || diff --git a/akka-actor/src/main/scala/akka/util/Collections.scala b/akka-actor/src/main/scala/akka/util/Collections.scala new file mode 100644 index 0000000000..0ccbcd408c --- /dev/null +++ b/akka-actor/src/main/scala/akka/util/Collections.scala @@ -0,0 +1,54 @@ +/** + * Copyright (C) 2009-2012 Typesafe Inc. + */ + +package akka.util + +import scala.collection.immutable +import scala.annotation.tailrec + +/** + * INTERNAL API + */ +private[akka] object Collections { + + case object EmptyImmutableSeq extends immutable.Seq[Nothing] { + override final def iterator = Iterator.empty + override final def apply(idx: Int): Nothing = throw new java.lang.IndexOutOfBoundsException(idx.toString) + override final def length: Int = 0 + } + + abstract class PartialImmutableValuesIterable[From, To] extends immutable.Iterable[To] { + def isDefinedAt(from: From): Boolean + def apply(from: From): To + def valuesIterator: Iterator[From] + final def iterator: Iterator[To] = { + val superIterator = valuesIterator + new Iterator[To] { + private[this] var _next: To = _ + private[this] var _hasNext = false + + @tailrec override final def hasNext: Boolean = + if (!_hasNext && superIterator.hasNext) { // If we need and are able to look for the next value + val potentiallyNext = superIterator.next() + if (isDefinedAt(potentiallyNext)) { + _next = apply(potentiallyNext) + _hasNext = true + true + } else hasNext //Attempt to find the next + } else _hasNext // Return if we found one + + override final def next(): To = if (hasNext) { + val ret = _next + _next = null.asInstanceOf[To] // Mark as consumed (nice to the GC, don't leak the last returned value) + _hasNext = false // Mark as consumed (we need to look for the next value) + ret + } else throw new java.util.NoSuchElementException("next") + } + } + + override lazy val size: Int = iterator.size + override def foreach[C](f: To ⇒ C) = iterator foreach f + } + +} \ No newline at end of file diff --git a/akka-actor/src/main/scala/akka/util/Convert.scala b/akka-actor/src/main/scala/akka/util/Convert.scala deleted file mode 100644 index 3fead7aef7..0000000000 --- a/akka-actor/src/main/scala/akka/util/Convert.scala +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright (C) 2009-2012 Typesafe Inc. - */ - -package akka.util -//FIXME DOCS! -object Convert { - - def intToBytes(value: Int): Array[Byte] = { - val bytes = Array.fill[Byte](4)(0) - bytes(0) = (value >>> 24).asInstanceOf[Byte] - bytes(1) = (value >>> 16).asInstanceOf[Byte] - bytes(2) = (value >>> 8).asInstanceOf[Byte] - bytes(3) = value.asInstanceOf[Byte] - bytes - } - - def bytesToInt(bytes: Array[Byte], offset: Int): Int = { - (0 until 4).foldLeft(0)((value, index) ⇒ value + ((bytes(index + offset) & 0x000000FF) << ((4 - 1 - index) * 8))) - } - - def longToBytes(value: Long): Array[Byte] = { - val writeBuffer = Array.fill[Byte](8)(0) - writeBuffer(0) = (value >>> 56).asInstanceOf[Byte] - writeBuffer(1) = (value >>> 48).asInstanceOf[Byte] - writeBuffer(2) = (value >>> 40).asInstanceOf[Byte] - writeBuffer(3) = (value >>> 32).asInstanceOf[Byte] - writeBuffer(4) = (value >>> 24).asInstanceOf[Byte] - writeBuffer(5) = (value >>> 16).asInstanceOf[Byte] - writeBuffer(6) = (value >>> 8).asInstanceOf[Byte] - writeBuffer(7) = (value >>> 0).asInstanceOf[Byte] - writeBuffer - } - - def bytesToLong(buf: Array[Byte]): Long = { - ((buf(0) & 0xFFL) << 56) | - ((buf(1) & 0xFFL) << 48) | - ((buf(2) & 0xFFL) << 40) | - ((buf(3) & 0xFFL) << 32) | - ((buf(4) & 0xFFL) << 24) | - ((buf(5) & 0xFFL) << 16) | - ((buf(6) & 0xFFL) << 8) | - ((buf(7) & 0xFFL) << 0) - } -} diff --git a/akka-actor/src/main/scala/akka/util/Index.scala b/akka-actor/src/main/scala/akka/util/Index.scala index ccaab901c3..83d8a40885 100644 --- a/akka-actor/src/main/scala/akka/util/Index.scala +++ b/akka-actor/src/main/scala/akka/util/Index.scala @@ -75,7 +75,7 @@ class Index[K, V](val mapSize: Int, val valueComparator: Comparator[V]) { def findValue(key: K)(f: (V) ⇒ Boolean): Option[V] = container get key match { case null ⇒ None - case set ⇒ set.iterator.asScala.find(f) + case set ⇒ set.iterator.asScala find f } /** diff --git a/akka-camel/src/main/scala/akka/camel/Camel.scala b/akka-camel/src/main/scala/akka/camel/Camel.scala index afb2d3c3d8..c72193becb 100644 --- a/akka-camel/src/main/scala/akka/camel/Camel.scala +++ b/akka-camel/src/main/scala/akka/camel/Camel.scala @@ -4,16 +4,15 @@ package akka.camel -import internal._ +import akka.camel.internal._ import akka.actor._ +import akka.ConfigurationException import org.apache.camel.ProducerTemplate import org.apache.camel.impl.DefaultCamelContext import org.apache.camel.model.RouteDefinition import com.typesafe.config.Config -import akka.ConfigurationException -import scala.concurrent.duration.Duration +import scala.concurrent.duration.{ Duration, FiniteDuration } import java.util.concurrent.TimeUnit._ -import scala.concurrent.duration.FiniteDuration /** * Camel trait encapsulates the underlying camel machinery. @@ -88,8 +87,8 @@ class CamelSettings private[camel] (config: Config, dynamicAccess: DynamicAccess final val StreamingCache: Boolean = config.getBoolean("akka.camel.streamingCache") final val Conversions: (String, RouteDefinition) ⇒ RouteDefinition = { - import scala.collection.JavaConverters.asScalaSetConverter val specifiedConversions = { + import scala.collection.JavaConverters.asScalaSetConverter val section = config.getConfig("akka.camel.conversions") section.entrySet.asScala.map(e ⇒ (e.getKey, section.getString(e.getKey))) } diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala index b8fa31fbc3..88c408e70c 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterSettings.scala @@ -45,9 +45,7 @@ class ClusterSettings(val config: Config, val systemName: String) { require(n > 0, "failure-detector.monitored-by-nr-of-members must be > 0"); n } - final val SeedNodes: IndexedSeq[Address] = getStringList("akka.cluster.seed-nodes").asScala.map { - case AddressFromURIString(addr) ⇒ addr - }.toIndexedSeq + final val SeedNodes: IndexedSeq[Address] = getStringList("akka.cluster.seed-nodes").asScala.map { case AddressFromURIString(addr) ⇒ addr }.toIndexedSeq final val SeedNodeTimeout: FiniteDuration = Duration(getMilliseconds("akka.cluster.seed-node-timeout"), MILLISECONDS) final val PeriodicTasksInitialDelay: FiniteDuration = Duration(getMilliseconds("akka.cluster.periodic-tasks-initial-delay"), MILLISECONDS) final val GossipInterval: FiniteDuration = Duration(getMilliseconds("akka.cluster.gossip-interval"), MILLISECONDS) diff --git a/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala b/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala index ef99ced2d8..ee6cd88a7d 100644 --- a/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala +++ b/akka-cluster/src/main/scala/akka/cluster/routing/ClusterRouterConfig.scala @@ -5,16 +5,13 @@ package akka.cluster.routing import java.lang.IllegalStateException import java.util.concurrent.atomic.AtomicInteger -import scala.collection.immutable.SortedSet +import scala.collection.immutable import com.typesafe.config.ConfigFactory import akka.ConfigurationException -import akka.actor.Actor import akka.actor.ActorContext import akka.actor.ActorRef -import akka.actor.ActorSystemImpl import akka.actor.Address import akka.actor.Deploy -import akka.actor.InternalActorRef import akka.actor.Props import akka.actor.SupervisorStrategy import akka.cluster.Cluster @@ -51,7 +48,7 @@ final case class ClusterRouterConfig(local: RouterConfig, settings: ClusterRoute // Intercept ClusterDomainEvent and route them to the ClusterRouterActor ({ - case (sender, message: ClusterDomainEvent) ⇒ Seq(Destination(sender, routeeProvider.context.self)) + case (sender, message: ClusterDomainEvent) ⇒ List(Destination(sender, routeeProvider.context.self)) }: Route) orElse localRoute } @@ -156,7 +153,7 @@ private[akka] class ClusterRouteeProvider( // need this counter as instance variable since Resizer may call createRoutees several times private val childNameCounter = new AtomicInteger - override def registerRouteesFor(paths: Iterable[String]): Unit = + override def registerRouteesFor(paths: immutable.Iterable[String]): Unit = throw new ConfigurationException("Cluster deployment can not be combined with routees for [%s]" format context.self.path.toString) @@ -183,7 +180,7 @@ private[akka] class ClusterRouteeProvider( context.asInstanceOf[ActorCell].attachChild(routeeProps.withDeploy(deploy), name, systemService = false) } // must register each one, since registered routees are used in selectDeploymentTarget - registerRoutees(Some(ref)) + registerRoutees(List(ref)) // recursion until all created doCreateRoutees() @@ -222,27 +219,26 @@ private[akka] class ClusterRouteeProvider( case a ⇒ a } - private[routing] def availableNodes: SortedSet[Address] = { + private[routing] def availableNodes: immutable.SortedSet[Address] = { import Member.addressOrdering val currentNodes = nodes if (currentNodes.isEmpty && settings.allowLocalRoutees) //use my own node, cluster information not updated yet - SortedSet(cluster.selfAddress) + immutable.SortedSet(cluster.selfAddress) else currentNodes } @volatile - private[routing] var nodes: SortedSet[Address] = { + private[routing] var nodes: immutable.SortedSet[Address] = { import Member.addressOrdering cluster.readView.members.collect { case m if isAvailable(m) ⇒ m.address } } - private[routing] def isAvailable(m: Member): Boolean = { + private[routing] def isAvailable(m: Member): Boolean = m.status == MemberStatus.Up && (settings.allowLocalRoutees || m.address != cluster.selfAddress) - } } diff --git a/akka-docs/rst/java/code/docs/actor/FaultHandlingTestBase.java b/akka-docs/rst/java/code/docs/actor/FaultHandlingTestBase.java index 9ea2a332b1..4494bb0c51 100644 --- a/akka-docs/rst/java/code/docs/actor/FaultHandlingTestBase.java +++ b/akka-docs/rst/java/code/docs/actor/FaultHandlingTestBase.java @@ -27,6 +27,7 @@ import akka.testkit.ErrorFilter; import akka.testkit.EventFilter; import akka.testkit.TestEvent; import static java.util.concurrent.TimeUnit.SECONDS; +import static akka.japi.Util.immutableSeq; import akka.japi.Function; import scala.Option; import scala.collection.JavaConverters; @@ -219,8 +220,7 @@ public class FaultHandlingTestBase { //#testkit public Seq seq(A... args) { - return JavaConverters.collectionAsScalaIterableConverter( - java.util.Arrays.asList(args)).asScala().toList(); + return immutableSeq(args); } //#testkit } diff --git a/akka-docs/rst/java/code/docs/jrouting/CustomRouterDocTestBase.java b/akka-docs/rst/java/code/docs/jrouting/CustomRouterDocTestBase.java index 73b8c5c639..239a3c318d 100644 --- a/akka-docs/rst/java/code/docs/jrouting/CustomRouterDocTestBase.java +++ b/akka-docs/rst/java/code/docs/jrouting/CustomRouterDocTestBase.java @@ -180,16 +180,14 @@ public class CustomRouterDocTestBase { //#crRoutingLogic return new CustomRoute() { @Override - public Iterable destinationsFor(ActorRef sender, Object msg) { + public scala.collection.immutable.Seq destinationsFor(ActorRef sender, Object msg) { switch ((Message) msg) { case DemocratVote: case DemocratCountResult: - return Arrays.asList( - new Destination[] { new Destination(sender, democratActor) }); + return akka.japi.Util.immutableSingletonSeq(new Destination(sender, democratActor)); case RepublicanVote: case RepublicanCountResult: - return Arrays.asList( - new Destination[] { new Destination(sender, republicanActor) }); + return akka.japi.Util.immutableSingletonSeq(new Destination(sender, republicanActor)); default: throw new IllegalArgumentException("Unknown message: " + msg); } diff --git a/akka-docs/rst/project/migration-guide-2.1.x-2.2.x.rst b/akka-docs/rst/project/migration-guide-2.1.x-2.2.x.rst new file mode 100644 index 0000000000..80bdccd803 --- /dev/null +++ b/akka-docs/rst/project/migration-guide-2.1.x-2.2.x.rst @@ -0,0 +1,26 @@ +.. _migration-2.2: + +################################ + Migration Guide 2.1.x to 2.2.x +################################ + +The 2.2 release contains several structural changes that require some +simple, mechanical source-level changes in client code. + +When migrating from 1.3.x to 2.1.x you should first follow the instructions for +migrating `1.3.x to 2.0.x `_ and then :ref:`2.0.x to 2.1.x `. + +Immutable everywhere +==================== + +Akka has in 2.2 been refactored to require ``scala.collection.immutable`` data structures as much as possible, +this leads to fewer bugs and more opportunity for sharing data safely. + +==================================== ==================================== +Search Replace with +==================================== ==================================== +``akka.japi.Util.arrayToSeq`` ``akka.japi.Util.immutableSeq`` +==================================== ==================================== + +If you need to convert from Java to ``scala.collection.immutable.Seq`` or ``scala.collection.immutable.Iterable`` you should use ``akka.japi.Util.immutableSeq(…)``, +and if you need to convert from Scala you can simply switch to using immutable collections yourself or use the ``to[immutable.]`` method. \ No newline at end of file diff --git a/akka-docs/rst/project/migration-guides.rst b/akka-docs/rst/project/migration-guides.rst index 79e2f7b8cc..5f464f3a08 100644 --- a/akka-docs/rst/project/migration-guides.rst +++ b/akka-docs/rst/project/migration-guides.rst @@ -8,3 +8,4 @@ Migration Guides migration-guide-1.3.x-2.0.x migration-guide-2.0.x-2.1.x + migration-guide-2.1.x-2.2.x diff --git a/akka-osgi/src/test/scala/akka/osgi/PojoSRTestSupport.scala b/akka-osgi/src/test/scala/akka/osgi/PojoSRTestSupport.scala index b8c7ea24e5..1c70d03d7b 100644 --- a/akka-osgi/src/test/scala/akka/osgi/PojoSRTestSupport.scala +++ b/akka-osgi/src/test/scala/akka/osgi/PojoSRTestSupport.scala @@ -6,7 +6,6 @@ package akka.osgi import de.kalpatec.pojosr.framework.launch.{ BundleDescriptor, PojoServiceRegistryFactory, ClasspathScanner } import scala.collection.JavaConversions.seqAsJavaList -import scala.collection.JavaConversions.collectionAsScalaIterable import org.apache.commons.io.IOUtils.copy import org.osgi.framework._ @@ -138,12 +137,12 @@ class BundleDescriptorBuilder(name: String) { } def extractHeaders(file: File): HashMap[String, String] = { + import scala.collection.JavaConverters.iterableAsScalaIterableConverter val headers = new HashMap[String, String]() - val jis = new JarInputStream(new FileInputStream(file)) try { - for (entry ← jis.getManifest().getMainAttributes().entrySet()) - headers.put(entry.getKey().toString(), entry.getValue().toString()) + for (entry ← jis.getManifest.getMainAttributes.entrySet.asScala) + headers.put(entry.getKey.toString, entry.getValue.toString) } finally jis.close() headers diff --git a/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala b/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala index e79ab4a1ee..8a076dd683 100644 --- a/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala +++ b/akka-remote-tests/src/main/scala/akka/remote/testkit/MultiNodeSpec.scala @@ -402,10 +402,8 @@ abstract class MultiNodeSpec(val myself: RoleName, _system: ActorSystem, _roles: } import scala.collection.JavaConverters._ ConfigFactory.parseString(deployString).root.asScala foreach { - case (key, value: ConfigObject) ⇒ - deployer.parseConfig(key, value.toConfig) foreach deployer.deploy - case (key, x) ⇒ - throw new IllegalArgumentException("key " + key + " must map to deployment section, not simple value " + x) + case (key, value: ConfigObject) ⇒ deployer.parseConfig(key, value.toConfig) foreach deployer.deploy + case (key, x) ⇒ throw new IllegalArgumentException(s"key $key must map to deployment section, not simple value $x") } } diff --git a/akka-remote/src/main/scala/akka/remote/RemoteDeployer.scala b/akka-remote/src/main/scala/akka/remote/RemoteDeployer.scala index fbc9c7b913..60c77fb4cc 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteDeployer.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteDeployer.scala @@ -6,8 +6,9 @@ package akka.remote import akka.actor._ import akka.routing._ import akka.remote.routing._ -import com.typesafe.config._ import akka.ConfigurationException +import akka.japi.Util.immutableSeq +import com.typesafe.config._ @SerialVersionUID(1L) case class RemoteScope(node: Address) extends Scope { @@ -22,9 +23,9 @@ private[akka] class RemoteDeployer(_settings: ActorSystem.Settings, _pm: Dynamic case d @ Some(deploy) ⇒ deploy.config.getString("remote") match { case AddressFromURIString(r) ⇒ Some(deploy.copy(scope = RemoteScope(r))) - case str ⇒ - if (!str.isEmpty) throw new ConfigurationException("unparseable remote node name " + str) - val nodes = deploy.config.getStringList("target.nodes").asScala.toIndexedSeq map (AddressFromURIString(_)) + case str if !str.isEmpty ⇒ throw new ConfigurationException("unparseable remote node name " + str) + case _ ⇒ + val nodes = immutableSeq(deploy.config.getStringList("target.nodes")).map(AddressFromURIString(_)) if (nodes.isEmpty || deploy.routerConfig == NoRouter) d else Some(deploy.copy(routerConfig = RemoteRouterConfig(deploy.routerConfig, nodes))) } diff --git a/akka-remote/src/main/scala/akka/remote/netty/Settings.scala b/akka-remote/src/main/scala/akka/remote/netty/Settings.scala index 7c1ca16540..5852f7a3ca 100644 --- a/akka-remote/src/main/scala/akka/remote/netty/Settings.scala +++ b/akka-remote/src/main/scala/akka/remote/netty/Settings.scala @@ -8,7 +8,7 @@ import scala.concurrent.duration.Duration import java.util.concurrent.TimeUnit._ import java.net.InetAddress import akka.ConfigurationException -import scala.collection.JavaConverters.iterableAsScalaIterableConverter +import akka.japi.Util.immutableSeq import scala.concurrent.duration.FiniteDuration import akka.dispatch.ThreadPoolConfig @@ -89,42 +89,19 @@ private[akka] class NettySettings(config: Config, val systemName: String) { case sz ⇒ sz } - val SSLKeyStore = getString("ssl.key-store") match { - case "" ⇒ None - case keyStore ⇒ Some(keyStore) - } + val SSLKeyStore = Option(getString("ssl.key-store")).filter(_.length > 0) + val SSLTrustStore = Option(getString("ssl.trust-store")).filter(_.length > 0) + val SSLKeyStorePassword = Option(getString("ssl.key-store-password")).filter(_.length > 0) - val SSLTrustStore = getString("ssl.trust-store") match { - case "" ⇒ None - case trustStore ⇒ Some(trustStore) - } + val SSLTrustStorePassword = Option(getString("ssl.trust-store-password")).filter(_.length > 0) - val SSLKeyStorePassword = getString("ssl.key-store-password") match { - case "" ⇒ None - case password ⇒ Some(password) - } + val SSLEnabledAlgorithms = immutableSeq(getStringList("ssl.enabled-algorithms")).to[Set] - val SSLTrustStorePassword = getString("ssl.trust-store-password") match { - case "" ⇒ None - case password ⇒ Some(password) - } + val SSLProtocol = Option(getString("ssl.protocol")).filter(_.length > 0) - val SSLEnabledAlgorithms = iterableAsScalaIterableConverter(getStringList("ssl.enabled-algorithms")).asScala.toSet[String] + val SSLRandomSource = Option(getString("ssl.sha1prng-random-source")).filter(_.length > 0) - val SSLProtocol = getString("ssl.protocol") match { - case "" ⇒ None - case protocol ⇒ Some(protocol) - } - - val SSLRandomSource = getString("ssl.sha1prng-random-source") match { - case "" ⇒ None - case path ⇒ Some(path) - } - - val SSLRandomNumberGenerator = getString("ssl.random-number-generator") match { - case "" ⇒ None - case rng ⇒ Some(rng) - } + val SSLRandomNumberGenerator = Option(getString("ssl.random-number-generator")).filter(_.length > 0) val EnableSSL = { val enableSSL = getBoolean("ssl.enable") diff --git a/akka-remote/src/main/scala/akka/remote/routing/RemoteRouterConfig.scala b/akka-remote/src/main/scala/akka/remote/routing/RemoteRouterConfig.scala index 8a4e3bce7c..369d8b0c7b 100644 --- a/akka-remote/src/main/scala/akka/remote/routing/RemoteRouterConfig.scala +++ b/akka-remote/src/main/scala/akka/remote/routing/RemoteRouterConfig.scala @@ -6,19 +6,17 @@ package akka.remote.routing import akka.routing.{ Route, Router, RouterConfig, RouteeProvider, Resizer } import com.typesafe.config.ConfigFactory import akka.actor.ActorContext -import akka.actor.ActorRef import akka.actor.Deploy -import akka.actor.InternalActorRef import akka.actor.Props -import akka.ConfigurationException -import akka.remote.RemoteScope -import akka.actor.AddressFromURIString import akka.actor.SupervisorStrategy import akka.actor.Address -import scala.collection.JavaConverters._ +import akka.actor.ActorCell +import akka.ConfigurationException +import akka.remote.RemoteScope +import akka.japi.Util.immutableSeq +import scala.collection.immutable import java.util.concurrent.atomic.AtomicInteger import java.lang.IllegalStateException -import akka.actor.ActorCell /** * [[akka.routing.RouterConfig]] implementation for remote deployment on defined @@ -29,7 +27,7 @@ import akka.actor.ActorCell @SerialVersionUID(1L) final case class RemoteRouterConfig(local: RouterConfig, nodes: Iterable[Address]) extends RouterConfig { - def this(local: RouterConfig, nodes: java.lang.Iterable[Address]) = this(local, nodes.asScala) + def this(local: RouterConfig, nodes: java.lang.Iterable[Address]) = this(local, immutableSeq(nodes)) def this(local: RouterConfig, nodes: Array[Address]) = this(local, nodes: Iterable[Address]) override def createRouteeProvider(context: ActorContext, routeeProps: Props) = @@ -64,20 +62,20 @@ final case class RemoteRouterConfig(local: RouterConfig, nodes: Iterable[Address final class RemoteRouteeProvider(nodes: Iterable[Address], _context: ActorContext, _routeeProps: Props, _resizer: Option[Resizer]) extends RouteeProvider(_context, _routeeProps, _resizer) { - if (nodes.isEmpty) throw new ConfigurationException("Must specify list of remote target.nodes for [%s]" - format context.self.path.toString) + if (nodes.isEmpty) + throw new ConfigurationException("Must specify list of remote target.nodes for [%s]" format context.self.path.toString) // need this iterator as instance variable since Resizer may call createRoutees several times private val nodeAddressIter: Iterator[Address] = Stream.continually(nodes).flatten.iterator // need this counter as instance variable since Resizer may call createRoutees several times private val childNameCounter = new AtomicInteger - override def registerRouteesFor(paths: Iterable[String]): Unit = + override def registerRouteesFor(paths: immutable.Iterable[String]): Unit = throw new ConfigurationException("Remote target.nodes can not be combined with routees for [%s]" format context.self.path.toString) override def createRoutees(nrOfInstances: Int): Unit = { - val refs = IndexedSeq.fill(nrOfInstances) { + val refs = immutable.IndexedSeq.fill(nrOfInstances) { val name = "c" + childNameCounter.incrementAndGet val deploy = Deploy(config = ConfigFactory.empty(), routerConfig = routeeProps.routerConfig, scope = RemoteScope(nodeAddressIter.next)) diff --git a/akka-testkit/src/main/java/akka/testkit/JavaTestKit.java b/akka-testkit/src/main/java/akka/testkit/JavaTestKit.java index 8fbb628d7c..835fd1939a 100644 --- a/akka-testkit/src/main/java/akka/testkit/JavaTestKit.java +++ b/akka-testkit/src/main/java/akka/testkit/JavaTestKit.java @@ -184,31 +184,31 @@ public class JavaTestKit { } public Object expectMsgAnyOf(Object... msgs) { - return p.expectMsgAnyOf(Util.arrayToSeq(msgs)); + return p.expectMsgAnyOf(Util.immutableSeq(msgs)); } public Object expectMsgAnyOf(FiniteDuration max, Object... msgs) { - return p.expectMsgAnyOf(max, Util.arrayToSeq(msgs)); + return p.expectMsgAnyOf(max, Util.immutableSeq(msgs)); } public Object[] expectMsgAllOf(Object... msgs) { - return (Object[]) p.expectMsgAllOf(Util.arrayToSeq(msgs)).toArray( + return (Object[]) p.expectMsgAllOf(Util.immutableSeq(msgs)).toArray( Util.classTag(Object.class)); } public Object[] expectMsgAllOf(FiniteDuration max, Object... msgs) { - return (Object[]) p.expectMsgAllOf(max, Util.arrayToSeq(msgs)).toArray( + return (Object[]) p.expectMsgAllOf(max, Util.immutableSeq(msgs)).toArray( Util.classTag(Object.class)); } @SuppressWarnings("unchecked") public T expectMsgAnyClassOf(Class... classes) { - final Object result = p.expectMsgAnyClassOf(Util.arrayToSeq(classes)); + final Object result = p.expectMsgAnyClassOf(Util.immutableSeq(classes)); return (T) result; } public Object expectMsgAnyClassOf(FiniteDuration max, Class... classes) { - return p.expectMsgAnyClassOf(max, Util.arrayToSeq(classes)); + return p.expectMsgAnyClassOf(max, Util.immutableSeq(classes)); } public void expectNoMsg() { diff --git a/akka-testkit/src/main/scala/akka/testkit/TestEventListener.scala b/akka-testkit/src/main/scala/akka/testkit/TestEventListener.scala index c46f15a26a..dfcd7b9dd2 100644 --- a/akka-testkit/src/main/scala/akka/testkit/TestEventListener.scala +++ b/akka-testkit/src/main/scala/akka/testkit/TestEventListener.scala @@ -6,7 +6,6 @@ package akka.testkit import language.existentials import scala.util.matching.Regex -import scala.collection.JavaConverters import scala.collection.immutable import scala.concurrent.duration.Duration import scala.reflect.ClassTag @@ -14,8 +13,9 @@ import akka.actor.{ DeadLetter, ActorSystem, Terminated, UnhandledMessage } import akka.dispatch.{ SystemMessage, Terminate } import akka.event.Logging.{ Warning, LogEvent, InitializeLogger, Info, Error, Debug, LoggerInitialized } import akka.event.Logging -import java.lang.{ Iterable ⇒ JIterable } import akka.actor.NoSerializationVerificationNeeded +import akka.japi.Util.immutableSeq +import java.lang.{ Iterable ⇒ JIterable } /** * Implementation helpers of the EventFilter facilities: send `Mute` @@ -45,7 +45,7 @@ object TestEvent { /** * Java API */ - def this(filters: JIterable[EventFilter]) = this(JavaConverters.iterableAsScalaIterableConverter(filters).asScala.to[immutable.Seq]) + def this(filters: JIterable[EventFilter]) = this(immutableSeq(filters)) } object UnMute { def apply(filter: EventFilter, filters: EventFilter*): UnMute = new UnMute(filter +: filters.to[immutable.Seq]) @@ -54,7 +54,7 @@ object TestEvent { /** * Java API */ - def this(filters: JIterable[EventFilter]) = this(JavaConverters.iterableAsScalaIterableConverter(filters).asScala.to[immutable.Seq]) + def this(filters: JIterable[EventFilter]) = this(immutableSeq(filters)) } } diff --git a/akka-transactor/src/test/java/akka/transactor/UntypedCoordinatedIncrementTest.java b/akka-transactor/src/test/java/akka/transactor/UntypedCoordinatedIncrementTest.java index 27323787aa..f73a659c46 100644 --- a/akka-transactor/src/test/java/akka/transactor/UntypedCoordinatedIncrementTest.java +++ b/akka-transactor/src/test/java/akka/transactor/UntypedCoordinatedIncrementTest.java @@ -25,7 +25,7 @@ import akka.testkit.ErrorFilter; import akka.testkit.TestEvent; import akka.util.Timeout; -import java.util.Arrays; +import static akka.japi.Util.immutableSeq; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; @@ -110,6 +110,6 @@ public class UntypedCoordinatedIncrementTest { } public Seq seq(A... args) { - return JavaConverters.collectionAsScalaIterableConverter(Arrays.asList(args)).asScala().toList(); + return immutableSeq(args); } } diff --git a/akka-transactor/src/test/java/akka/transactor/UntypedTransactorTest.java b/akka-transactor/src/test/java/akka/transactor/UntypedTransactorTest.java index 3b841e300b..ade645dfd8 100644 --- a/akka-transactor/src/test/java/akka/transactor/UntypedTransactorTest.java +++ b/akka-transactor/src/test/java/akka/transactor/UntypedTransactorTest.java @@ -25,7 +25,7 @@ import akka.testkit.ErrorFilter; import akka.testkit.TestEvent; import akka.util.Timeout; -import java.util.Arrays; +import static akka.japi.Util.immutableSeq; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; @@ -118,8 +118,6 @@ public class UntypedTransactorTest { } public Seq seq(A... args) { - return JavaConverters - .collectionAsScalaIterableConverter(Arrays.asList(args)).asScala() - .toList(); + return immutableSeq(args); } } From 69505855fdf87c13c4786ab118b4a5ae359363c9 Mon Sep 17 00:00:00 2001 From: Roland Date: Wed, 14 Nov 2012 16:19:54 +0100 Subject: [PATCH 123/210] make HashedWheelTimer tolerate wrap-arounds, see #2686 --- .../test/scala/akka/util/DurationSpec.scala | 23 ++++++++++++++++++- .../akka/util/internal/HashedWheelTimer.java | 22 +++++++++++++----- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/util/DurationSpec.scala b/akka-actor-tests/src/test/scala/akka/util/DurationSpec.scala index d5c020be49..ca285274aa 100644 --- a/akka-actor-tests/src/test/scala/akka/util/DurationSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/util/DurationSpec.scala @@ -8,10 +8,31 @@ import language.postfixOps import org.scalatest.WordSpec import org.scalatest.matchers.MustMatchers import scala.concurrent.duration._ +import scala.concurrent.Await import java.util.concurrent.TimeUnit._ +import akka.testkit.AkkaSpec +import akka.testkit.TestLatch +import java.util.concurrent.TimeoutException +import akka.testkit.LongRunningTest -class DurationSpec extends WordSpec with MustMatchers { +class DurationSpec extends AkkaSpec { + + "A HashedWheelTimer" must { + + "not mess up long timeouts" taggedAs LongRunningTest in { + val longish = Long.MaxValue.nanos + val barrier = TestLatch() + import system.dispatcher + val job = system.scheduler.scheduleOnce(longish)(barrier.countDown()) + intercept[TimeoutException] { + // this used to fire after 46 seconds due to wrap-around + Await.ready(barrier, 90 seconds) + } + job.cancel() + } + + } "Duration" must { diff --git a/akka-actor/src/main/java/akka/util/internal/HashedWheelTimer.java b/akka-actor/src/main/java/akka/util/internal/HashedWheelTimer.java index fc50854ab7..e95ff9ad95 100644 --- a/akka-actor/src/main/java/akka/util/internal/HashedWheelTimer.java +++ b/akka-actor/src/main/java/akka/util/internal/HashedWheelTimer.java @@ -263,8 +263,11 @@ public class HashedWheelTimer implements Timer { void scheduleTimeout(HashedWheelTimeout timeout, long delay) { // Prepare the required parameters to schedule the timeout object. - final long relativeIndex = Math.max(1, (delay + tickDuration - 1) / tickDuration); // If relative index < 1 then it should be 1 - + long relativeIndex = (delay + tickDuration - 1) / tickDuration; + // if the previous line had an overflow going on, then we’ll just schedule this timeout + // one tick early; that shouldn’t matter since we’re talking 270 years here + if (relativeIndex < 0) relativeIndex = delay / tickDuration; + if (relativeIndex == 0) relativeIndex = 1; final long remainingRounds = relativeIndex / wheel.length; // Add the timeout to the wheel. @@ -304,7 +307,7 @@ public class HashedWheelTimer implements Timer { while (!shutdown()) { final long deadline = waitForNextTick(); - if (deadline > 0) + if (deadline > Long.MIN_VALUE) notifyExpiredTimeouts(fetchExpiredTimeouts(deadline)); } } @@ -332,7 +335,7 @@ public class HashedWheelTimer implements Timer { HashedWheelTimeout timeout = i.next(); if (timeout.remainingRounds <= 0) { i.remove(); - if (timeout.deadline <= deadline) { + if (timeout.deadline - deadline <= 0) { expiredTimeouts.add(timeout); } else { // Handle the case where the timeout is put into a wrong @@ -368,6 +371,12 @@ public class HashedWheelTimer implements Timer { expiredTimeouts.clear(); } + /** + * calculate goal nanoTime from startTime and current tick number, + * then wait until that goal has been reached. + * + * @return Long.MIN_VALUE if received a shutdown request, current time otherwise (with Long.MIN_VALUE changed by +1) + */ private long waitForNextTick() { long deadline = startTime + tickDuration * tick; @@ -378,7 +387,8 @@ public class HashedWheelTimer implements Timer { if (sleepTimeMs <= 0) { tick += 1; - return currentTime; + if (currentTime == Long.MIN_VALUE) return -Long.MAX_VALUE; + else return currentTime; } // Check if we run on windows, as if thats the case we will need @@ -394,7 +404,7 @@ public class HashedWheelTimer implements Timer { Thread.sleep(sleepTimeMs); } catch (InterruptedException e) { if (shutdown()) { - return -1; + return Long.MIN_VALUE; } } } From b1d96c87943486f0a29ad283a8a385b8efc5abc0 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Thu, 15 Nov 2012 00:46:13 +0100 Subject: [PATCH 124/210] Preventing the TimerBasedThrottlerSpec printing to the console --- .../scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala b/akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala index be077489ee..cf13f42a24 100644 --- a/akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala +++ b/akka-contrib/src/test/scala/akka/contrib/throttle/TimerBasedThrottlerSpec.scala @@ -36,7 +36,7 @@ class TimerBasedThrottlerSpec extends TestKit(ActorSystem("TimerBasedThrottlerSp } "A throttler" must { - + def println(a: Any) = () "must pass the ScalaDoc class documentation example program" in { //#demo-code // A simple actor that prints whatever it receives From 5569cd676ad4942510098feb49fa0ec862bf081c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Antonsson?= Date: Wed, 7 Nov 2012 11:51:59 +0100 Subject: [PATCH 125/210] Release script instructions added. --- project/scripts/release | 85 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 81 insertions(+), 4 deletions(-) diff --git a/project/scripts/release b/project/scripts/release index a803277959..c660aaeeda 100755 --- a/project/scripts/release +++ b/project/scripts/release @@ -2,11 +2,88 @@ # # Release script for Akka. # -# To run this script you need access to repo.akka.io and github.com/akka/akka. +# Prerequisites and Installation Instructions # -# To always use the akkarepo user with repo.akka.io add the following to .ssh/config: -# Host repo.akka.io -# User akkarepo +# 1) You must be able to sign the artifacts with PGP +# +# 1.1) If you don't have PGP and a PGP key +# On OS X from othe command line: +# shell> brew install gnupg +# shell> gpg --gen-key +# +# Default values for the key type and 2048 bits is OK. +# Make sure to use the email address that you will use later to register +# with Sonatype. +# +# 1.2) Install the sbt-pgp plugin from http://www.scala-sbt.org/sbt-pgp/ +# The plugin will try to use the default key stored in ~/.gnupg/pubring.gpg +# and ~/.gnupg/secring.gpg. +# +# 1.3) Check that signing works +# From inside sbt do the following +# sbt> publish-local +# It should should ask you for your pass phrase, and create .asc files for +# all artifacts +# +# 1.4) Publish your key to a server that Sonatype use +# From the command line: +# shell> gpg --keyserver hkp://pool.sks-keyservers.net/ --send-keys +# To find out your key id do this from the command line: +# shell> gpg --list-keys +# pub 2048/ ... +# +# 2) You must have publishing rights to oss.sonatype.org +# +# 2.1) Register with oss.sonatype.org by only following the instructions under +# sign up here https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide +# Use the same email address as you used for the pgp key. +# +# 2.2) Ask Jonas who is the original creator of this ticket https://issues.sonatype.org/browse/OSSRH-3097 +# to add a comment that says that your username (not your full name) should +# have publish access to that project. There is manual administration of +# the ticket at Sonatype, so it could take a little while. +# +# 2.3) Add your credentials to sbt by adding a global.sbt file in your sbt home +# directory containing the following. +# credentials += Credentials("Sonatype Nexus Repository Manager", +# "oss.sonatype.org", +# "", +# "") +# +# 3) You must have publishing rights to scalasbt.artifactoryonline.com +# +# 3.1) Politely ask the Q-branch to create a user for you +# +# 3.2) Add your credentials to sbt by adding this to your global.sbt file +# credentials += Credentials("Artifactory Realm", +# "scalasbt.artifactoryonline.com", +# "", +# "") +# The encrypted password is available in your profile here +# http://scalasbt.artifactoryonline.com/scalasbt/webapp/profile.html +# +# 4) You must have access to repo.akka.io +# +# 4.1) Ask someone in the team for login information for the akkarepo user. +# +# 4.2) Install your public ssh key to avoid typing in your password. +# From the command line: +# shell> cat ~/.ssh/id_rsa.pub | ssh akkarepo@repo.akka.io "cat >> ~/.ssh/authorized_keys" +# +# 5) Have access to github.com/akka/akka. This should be a given. +# +# Now you should be all set to run the script +# +# Run the script in two stages. +# First a dry run: +# shell> project/scripts/release --dry-run +# And if all goes well a real run: +# shell> project/scripts/release +# +# The sbt plugin is published directly to scalasbt.artifactoryonline.com, but the +# artifacts published to oss.sonatype.org needs to be released by following the +# instructions under release here +# https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide # defaults declare -r default_server="akkarepo@repo.akka.io" From c33bd9fb9e719b0fd01c9cc3fc00361ed7dbc742 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Antonsson?= Date: Wed, 7 Nov 2012 09:44:02 +0100 Subject: [PATCH 126/210] Building with 2.10.0-RC2 and all dependencies that are published. --- .../cluster/ClusterMetricsCollector.scala | 20 +++++++++---------- project/AkkaBuild.scala | 12 ++++++----- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala index 7ed3699035..a3abd94316 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterMetricsCollector.scala @@ -9,8 +9,8 @@ import scala.concurrent.duration._ import scala.collection.immutable.{ SortedSet, Map } import scala.concurrent.forkjoin.ThreadLocalRandom import scala.util.{ Try, Success, Failure } -import scala.math.ScalaNumericConversions -import scala.runtime.{ RichLong, RichDouble, RichInt } +import scala.math.ScalaNumericAnyConversions +import runtime.{ ScalaNumberProxy, RichLong, RichDouble, RichInt } import akka.actor._ import akka.event.LoggingAdapter @@ -238,7 +238,7 @@ private[cluster] case class MetricsGossipEnvelope(from: Address, gossip: Metrics * * @param startTime the time of initial sampling for this data stream */ -private[cluster] case class DataStream(decay: Int, ewma: ScalaNumericConversions, startTime: Long, timestamp: Long) +private[cluster] case class DataStream(decay: Int, ewma: ScalaNumericAnyConversions, startTime: Long, timestamp: Long) extends ClusterMessage with MetricNumericConverter { /** @@ -249,13 +249,13 @@ private[cluster] case class DataStream(decay: Int, ewma: ScalaNumericConversions /** * Calculates the exponentially weighted moving average for a given monitored data set. - * The datam can be too large to fit into an int or long, thus we use ScalaNumericConversions, + * The datam can be too large to fit into an int or long, thus we use ScalaNumericAnyConversions, * and defer to BigInt or BigDecimal. * * @param xn the new data point * @return an new [[akka.cluster.DataStream]] with the updated yn and timestamp */ - def :+(xn: ScalaNumericConversions): DataStream = convert(xn) fold ( + def :+(xn: ScalaNumericAnyConversions): DataStream = convert(xn) fold ( nl ⇒ copy(ewma = BigInt(α * nl + 1 - α * ewma.longValue()), timestamp = newTimestamp), nd ⇒ copy(ewma = BigDecimal(α * nd + 1 - α * ewma.doubleValue()), timestamp = newTimestamp)) @@ -273,7 +273,7 @@ private[cluster] case class DataStream(decay: Int, ewma: ScalaNumericConversions */ private[cluster] object DataStream { - def apply(decay: Int, data: ScalaNumericConversions): Option[DataStream] = if (decay > 0) + def apply(decay: Int, data: ScalaNumericAnyConversions): Option[DataStream] = if (decay > 0) Some(DataStream(decay, data, newTimestamp, newTimestamp)) else None } @@ -288,7 +288,7 @@ private[cluster] object DataStream { * @param average the data stream of the metric value, for trending over time. Metrics that are already * averages (e.g. system load average) or finite (e.g. as total cores), are not trended. */ -private[cluster] case class Metric(name: String, value: Option[ScalaNumericConversions], average: Option[DataStream]) +private[cluster] case class Metric(name: String, value: Option[ScalaNumericAnyConversions], average: Option[DataStream]) extends ClusterMessage with MetricNumericConverter { /** @@ -352,7 +352,7 @@ private[cluster] object Metric extends MetricNumericConverter { * or defined for the OS (JMX). If undefined we set the value option to None and do not modify * the latest sampled metric to avoid skewing the statistical trend. */ - def apply(name: String, value: Option[ScalaNumericConversions]): Metric = value match { + def apply(name: String, value: Option[ScalaNumericAnyConversions]): Metric = value match { case Some(v) if defined(v) ⇒ Metric(name, value, None) case _ ⇒ Metric(name, None, None) } @@ -409,13 +409,13 @@ private[cluster] trait MetricNumericConverter { *

    YBYM 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 P!bQlvJy634wbTXx*FUoX literal 0 HcmV?d00001 diff --git a/akka-samples/akka-sample-cluster/sigar/libsigar-x86-solaris.so b/akka-samples/akka-sample-cluster/sigar/libsigar-x86-solaris.so new file mode 100644 index 0000000000000000000000000000000000000000..c6452e56559c56681705902f45f6852960322e93 GIT binary patch literal 242880 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 GrUd}B?9tr- literal 0 HcmV?d00001 diff --git a/akka-samples/akka-sample-cluster/sigar/sigar-amd64-winnt.dll b/akka-samples/akka-sample-cluster/sigar/sigar-amd64-winnt.dll new file mode 100644 index 0000000000000000000000000000000000000000..1ec8a0353e61238a0a1483e9112e8753eeffa51b GIT binary patch literal 402432 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

  • 1KXnK;IEA!j3i)_iS5 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 z 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 literal 0 HcmV?d00001 diff --git a/akka-samples/akka-sample-cluster/sigar/libsigar-ppc-aix-5.so b/akka-samples/akka-sample-cluster/sigar/libsigar-ppc-aix-5.so new file mode 100644 index 0000000000000000000000000000000000000000..7d4b5199210e2975902b81c5d768f77e434bc902 GIT binary patch literal 400925 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̌ImN3KKLs++_=FoPe>1K?bRfm7AYZnv+@_pOc@Qm;)(gVDSekTfprsXdepH z#%g}Z0CGcy2g7w=a5y|=U;u@6!eRyn@cdL0g9x}^(a2EX{r~Sz&{!F?tUw)`L!Zxv z*M$r@3}RT^hqNjPJ(U8KV0BRFC zg2oNNV`fYWpn4TFj_v*bzbiPrni&|NV+f$}5>TJ30IG(?`~QDM9BO4I#|yJ zrGth>hAlPA{}ouAI>k_P)bN@m*C~dYr4C|X`nlt^nx$4EHR=BfWSN;?SSB#Ps7a0x zlX=ekqUNy`@|+8#J-d(rG}Z;`n-Og$4)Y-Wr-cj-;67R+gGVDHxUaOOX63&Ei&v)@ zYMxqNv+M%7H9-tS*J>tSt6AzLQgiZOfovP|i<)B*VzQddFKX4iL~4#Fh}10g6sgIC z>U|8=o17qK>2->sRx|KgO|q9rE$6=iSr6tHwH#2r8eZ7um%x2TP`+tkWS9ZXGZRqj z1{PR9>SLIMusyM3mHIjyiB0^Q}6$$ z!Q~t%|3k{2g6VU z?GHA{By)rMku6X&6BKQ=eXrO)@vUr3=JwpSMdSzt!eK=-g9}0?hWGzd;Q8hW ziQuv~!u$Uz@HnbPGkCrblzwtRYC&Aq>f_{0O_?z zX8#9{OGx;~SR`{m!}BP3eh^^}C&(Olo3H_z&K(>6g4R0vc>g~MZWn>VA6i%Lfad!R z*yo2}^#b!11}R8Al$M#38ed#lT#}lLYe*ewbOusCfXW9*+3D^4;|=fsCm2ED11c9l`e#7O1|Lw_YLN)) zi!FyLJE_L2g43< zynxI`EhiX{G=S!u8W|j9S{QGD)7N2!28%?7DHaWk3>N#D1ib&B0+%rjNsNCi7BVid zXk?gTae$ElG&bPDupQiIn2^XgWkMq3jD|$UDbThTsICL`sTn3DGH+;TWL^L%ml#27 zI%ilMWZq+u%)nzYpGg5UF5tni9c%}ve1eu63=35`rW6BaT}XlP{Wu}EZ+uvoz0U~|CPV8TJB2%7`0AUeVO{~_=?C6GI2 zBr=6tK-LpUK=TBn2g6oySb)+pbS#|BgMpEwVIiYILn0$+z1ReJUvMF#MnfW_4tQM? zbggtFBcnmXK}M5?hl~P^ilBK*rU^A^p4V!Yd5G0=cwVbn>LgNg%<@{zQt((FcucpE zkx`@JAfpbEdcbXnhDJtjB7E2oncXEnHngBBR0$Wzbv*qr!wlhARi`nKW)FgWHx@PJn5!_ziG)Br@DMq0A8A z{r^0;9|RsFYGz<)Xk=8F(8zFS!V>7Zz(j^S4T~8p8j=}6V|^gG2NRY+*AFH#JZM-4`gEM@?$W#a+M!RJ00!E=HWQW(JN zo4{e#%%q~h0$PjApy2)g=S5KXg7O4v_=47CGRlDRi1+^^;B`=tGL8XM#(~B^Jy6Rh z@O&3&odl>42AY3zfRs-R7a9^7ETxY|=60~l} zp@~tU;UHwsLc>DFh6zWZa|H((L1V@uP%+3D-9gYA3`P~Gm;hw%fUyBu4oE<08IU}b zjZ|*H)gj7_gN&eYYZH+A2}c<$CbTlxG#q5qXlP{Afr=SSXk{>IILK(x(8y>56$7uQ z1+k%actB|%B(VUfSV+S`Mu&z*Mi-FWgrf`*6IvN!Ky0Xd0+dc^I0%`00Le`_%8)Uk zl_3XIpL+k_52=g6eHhRhct+@aI3wD8ILf&B4%k=*DE>3^N>Yo`5|dNoK?CThWge*9 zgJDqogVPvv{}3phO<2f~FySD$FBH*`%oqU5XATVv0yYT@j26jrd_5Sz^QU0BhDL@I zP}{`&|6Xw03B(7rVL*Ke@BjP2C<}El4@*k-EiRhpH`GDx3GHWy>GK0!Q&=?%3jRRt{ zfXCoK>xm9C=0N9oW_bVqcN3I`k;;7!Xt@vSV+Kq}WMXMZWMToe+Z~%gY*3${iN&Ik zNx)(O14#c&?D|3bX25C#EE*YJSS(+cw$ zKYq3aR;DWM2{V66W8?;7&8OjFrR~eyf z(7G$odTx+jP&<_cDsE$uz`zY<8(1VTa6;KC76}ZjP_~3c0s|YA4O*wb2V#TbzpogMp#B^aXx%zXLnA`~czho+1}gxIe}|@jETHlb(zaxl zfb_AL1+e$A;O)y93<98>o1CAQ2gZ&n9#^vW0O#l zY>`|5&O4Cw#j*-C29H<^_H-2}98l{8CTP8|8{8I$q)+fV4<-)=h64=?8E!Oy+Bl8O zpglye@wf*Ki40E~AY!mFwGR!63}2vPkhaP~24pdCd$wUAc>m!Ws5;2{goO+T8WI_f zK*hl85gHbP+XYvkV$ikR%-}UZ6JUEX4l0h9Rzr}o}2v9wYx*qQdXq_NO&ElsZS_Vuf zFfd?`gPpygJ`-vjFcvf{1kE=xfckXEaR6#J!NLa?2gq>+iv#4i!WRd~aRrNm9}S5N zf52f1Ytt?St&?PAfr>%<35=k&HV;$`(vDonDA14y>f?aZ4X8f}s+%Pm5*cNn>Ok}6 zA)vNeLn5OJR1CD%6I3@t`%YlJ2@_HnQV@MCuvo@~6o#CJg^+#@R4-_4M+u@I16BuG z^H$TakkJFQMgXd=VL}Q+O9N!BK?qc=V?qi8cz*_wY32(9bUkBUT5)`GPG)LeNqm_R z!PEmOKS1>#ZPL$n@Vp0R`e96HNMuZb`W2do88aFZ8FQdw(DcJt(2&Sj0u_U%AI6G? zM8+DZ7&QHW+o3H`F=!rU>}W^?txE%kJ2d?;P5_MuK-EF=@Iug-0plE~7%crPfUL0u z>xHGC6%C1uYoO|2=?66SumvgxOFy9XnR}pOu=E4op9vL%r62GfOsE(v{ak2BWQ64* zSo*oqkjQukst%TZ9yBB}!pb{X`gzfi$OtRPC`v!YsYPX}MN~;Y8I+YjTVZqSjL`87 zCJzQiP#pjo_Z=;Nz+*h%Gzv>U;BgjcT7jh>=r{^k9W4D2RsJ+AWQ=G?WQ>8D2igxe zrC}jT-i53iT8NT&7feWDSkkZ%CGW17kOCfOWFW3QV}h^GMlR2cv6N>7>OTt8-zIGJ z-vLm6tRayRR^GtMFXZwDR(>IuH?Z;xG`J{6a2oVC5Hbc>^oIkjoob`uot3$Ovn5!P4K4hD1hKoefQY zObnp5Ff?63%P-LQ7!$0{2A5wA3zK4Xh>v&)!ESW$E47Z2pT^Ir*UZd zV*>5R*MaJ#DE-08L&E9rFLeD2WDlzaXn(+brULK(8^B{ApuQidUj$nJ=ly>@_>2Qc z-)}0JL6kE4aU`0X`#xQJ@35#t_<%d$0mLN5H@i?Q>j!?qy{_ zorBx~Ui$!*1NDopfb5%)$aDid2HwbYr=gMQ3S4r=)XuN^x4rCmR=>ljh&0+y) z%xyKK&kfqo2Wl&(FvvF~GF`ApW>BzbWb}ioDFn3@8xU&jp=ul~8X1>B=J!^E+XDzS zjP?zQpt_go0(2jY!-N!UVX*}~-wO&0$EJTj8WNdKc>iAy9%};iA0YiGCg_?RCM;`m z;B9O8{{Qlf{P@z6+yYSff!u!rt$%Mw1dX$7*97|qwDujc4qOt{#{;`@=x}Ucm{8 zU^WkE4AFyuDaYa=^9{(lx3&)Gx;F>Jy0`y7EEzy)bQO5LAS7Iv-$2qPDBnTmCqZ?# z1~UUIR2BG|E(aJc{UA+EG7^!xO+5E^@H5Q3d*+@-v8f#_J@G{33U&{ zpB0I$6B-(s??A`BK;y$N8WLH1P|akxg2l`O77IXgc5iASYGHl^jdimgfcgkr^K6jt&0=y#N0N?PUS==UE_Y57}l| zU|o9%8^2@v0$Xy*pIT{QvEb18~K=ZpGw}9q@HzYCyY)E7X znvuv5G9!^8)M7pZXs!aZ=Ot!CB16K4M24gpi3}+-5*bo0<};{F0PSl@WXRc&$WX8$ zk)dctB16fHM21p}`3yRsx%~-=3^f}P85%YuGBnLdWN4X@$k1vrpTT58BSXi8M24OX zi3}4qBr;5zk;pJ*Mk2#hi}?&T6BQWH_)Pk>SvcM1~_X5*dzeNMs1x zkjRj>A(5eMLn1@lhD3&G8xk3oZAfI;wjq(>7-XF)1Bb-|1_AH?%fa;zD6S#nt}DUo z`#^O8XdO2wjC7b8*g<8RLj!{aXx&uEVg<9BL@5#I-i;R_O9iYzbHNi*7(wd@!D|R$ zdK?@6UjUf_DTf)r=SNs5GF(8N-vEt8!^V^tmq7MdXXmG-6{nU!Z@mB)cxVJ#{KDto zAY+RR9v1aXC7?3T`~PzA{5>SjnKZorF9*-5gT_fgb1~rkk_n*mOBf44>mC{wGD<<6-&5 z@%aU*c_=9als=H_Z}9jhAn^rOsjCDlShf zD2`7nN(C>Qgt{M8w}aP5HY75v0Hq1<|Nk{XY*1W*;?SWHw4Ztrcuf*i9K0V7RL6S% zUkc9OQ1J<%b|zHZ5!!}X0a{-H6Zc?PHy249y#5k$mKK8pD6YK!Up)&l%lrRQ@Z228 zf4J8G!tyl34%pthe9#b7elgg8pt2bhKahEI$o@i5`wEmMZ5lx9;OF=v)r+9>06ZY; zU_obfG2l2C0M?#k@PVC4mtP#8T2z!@6kl9Yl$noLk8_E)npSR}KtSTr#F0nJ|}ECspe2Qz5R7C1Z_8D(aqu>Eg72%3-C8=HI-v9{MD znTY|?-dzA*YlBeF1XX|FEcna@*x6%;nHVgRnHeB!g+P0qm#u`v52K95Lxu*6gA5BS zk{O}$Oby=umx0?|pflYpQrHX6QX!#@823u{LB`G5Jv@x_(J@!)OK;6<6uxWNBbzftE`wIL^jnI09RDonIUeZj#_?!$bUkhhYMv3de**6^RLr zDl!ums(|(v$Uyf+IH2x}mKXG|1Sj3 zr-J>QsQkqH|ALPoz2N;oi7E=1VYdowR|9mvP{Tryp1F5HX&kg?rvan~9G=P_K=w}n z?I!}AkF-$v$Am`ZKMjq_A0XkW`~?!8%0C(smH&Xk6Xc$TM&&1<_B_bFu>DaEP5;5? zPeR%XD$sCNK?`U2`Wzkfa84{rFGd~)YHVU8>MV84lnD_5l?~AHX#r^eGqikX0iOp_ zFQJG1oEUhSrvqE}n3JC#pOadangcC>U~UA(KgbTq`1&i*`mZGu5=A>EG>Y~#B#L%e z%xCyhv!rEJ&EnQo4UM9pxlg7UDGZDaiK0E;|5rlOHduWOxQ!v{MH&|J~a0JqRE6z{OPE1KbzKRSItZ)+K|0#<9Crn^u z0Ig33?`fH^kYU1vgA7wZ_HBUluRB2PRqy}*u7cVT(0(gupGpp-55fqVvt^o)2wvL^ znomqwkjRj+A(6og+)e?Votnr1>Q5;+G=bJHF-&M!$S}o{kpVRS<=IH72xeLheq&Om=z6)3ZS+e4>Uf&b%jNuLIEgk zTO>0uhomuBO*qKl(6CSev~R=(v`5VQ|9o(}6_f@+aSJx1nSrBWp+XLLz8|z_{tW{| z%}X5N%%}jJH&+Ni4Py@Io(P5$4AAo@KxIQgQD$CA8pO}YB*g#!;o%EgUjtg>4O$Zp zYkNZd3fgxP(U8o5>{k;|oHT&l&JY7i>mc_x;B`9#j`cFIa+jfnfwLHV)^JWfqAi8& zZWtT9HVC@@474r?=5FY|ci4G3Jecd!;C30n#==11l$l$Q6JLxt)ff~$pz;%`{RTP< zY(euO#wDQg8Z=%9+G{o8AOomRlmm{-Muq}#n|{B7Uc*6#5{r4DHri~+*dtOK9eaBR zmPZ&eU}Fw&cYzkS!#ob9Vg3il0qBl0eCIbq_v?eqgVYs-T2Blp>-&(xmIX6B;bpS| zvb!PnAO$GY-7pFizEc$cgZ9RP%1TiCpTYb80`MAnP}ybEz`$?O;^a`1tauHyrU+D@ zTQo4gsA*QdR@3~i0QVkz@R?2lu=Y84>wR8+d3ur7Y8Ko(DeTaNFF2(3O~@EOz;15U~{ve_5PqT7lc9kg))%ML8zY%UQ-V- zj{$Ti9B6Gw1}OY-ry+PfvISO_g8f;NpA8!ZK=&W0JOHH|P&k6lZvpi!9U4GmC=40i z|Nngj#Stjpp>722cgg{&aclsOp%8EnJddTo)g- zzhD9*Lk4L7&xA$>(78!9GeBn}gZ2=C&wK)n*)V|55a?)Rr~$jDi9rAwcA#(tVI5?5 zgW>|4TJQh=?|{^S_ae10FhI@&U~mEX*Zcnz@E!=z7#U2yVIkIP69gW^61$oW3taX?U5qq^rm=uCG|*n;N!7(nN{L*p5`{)r(0wa$cv zE29i-tS3FSq&&YU1#NxVe^478cJ@>a$WCZ_0-c>!;laST1au}9Ox&@F!NU9hbnxER zgnH0ft_)y3-v6hA+sMgi`*9&{O>mn6w5JcgXA8|d@Sbus^T6kSVKdMBKj^$Jh6gQrgwuDB@&nZVf%G5$L;H`AvjJfJs0j}lX28ol(76Gi^L82;CVnK(?0i}vafYWUw!<2@Fpta4touK|DsQu88 z$S?!CKN7U(7qpKIR6cYd_gOI01uLvg{Rh^z0S~%>0xvHS&*^oL@B_CopzC8n^#dq< zfZB@_9)izy0?*@u(g3Kf*zk~{!u$WfUQj<2GzSE#%R&87@Be?%*Jp#)(aM14;6Q$b zmK~t}Av35v1m!*4=>YDZ9t{7WB?eIXMv8yX`dU!C7hDEf)H5FO{y!bOClpjpgY1Q@ zE$D~L#V3QtEEz!ctOJ@l7tmd)pt$Tv28}CE2IqHB9)Zk{g2SZ-bG&Ey@il5BZdITm=XBg z%m~Ps5on*`H1HlqsDE4>n*M|Gse||bY2dLcP&y}}9D$F|fYVD3=wM+GD-Aw|gc`o@ zq2Vh~F`-eQX2L>&hK7X#puH>}77YRn7WWy?SUg~0_Wu7Tx1mv>0pu2tUqItBknxMD z;PE!7+d*f5iFp6-1-ly*79I?cve)}RiaJnSfacUdt6vZ>yKe&6C(p^noNmL&M(cwbiwe>Zr( zWKK=eSyd*6V<8+48n*zASMUnVpv z{{Wre1WNA>iOL@!c^7ow;+E)(kEg(7_$z5rB9{=Sf3J_lhKESp)GF+1u8qID1y%o29=wTbAuBZ z=77gb7BldKG;a_JSiEUpNXw>upgt$4EQg){+W?kNPzzX`Y8TRyY6m)NW6hB=Tm zPoQ~c&^d0P@hJwEhJy@q8qydv8jdmOgrsi}3OK%LUr5@feKqMC0yS-l0-!n_T(*MF zAZcXqkx5}lu{gkxQqy7}CbJYoYl)nwXMFI-L1IEqO9OZe^@Jir26(^ie8v}l7ASzu z7D_qc$dK^INds~(2zbtz!R5~aBt4D{8DRMXQ1uHL68t|q4h^m0MuWcb3>WI z0CYwYs1MQbkYP?kI)g&Pa|V@=j158oFE;H9N#C@uCPPD@rX9Pxk==~Vz4+V;_Z!%q z5*nbhIZh-pB!JK7calJMqXj6un;$aNSST_yAo?9j4v4d2nc(NogYG&?PRvP;FG|b> zr68>7XCcF!hE#@xhE|4@hNBD_4NnydFZ~>>Yg$x0p^Jg_6XX_R?HZhdQBr~Ld(-3HHQL^$h&{zh@f8f1Fpz)Cw&1;}O zAE+(>t@(oN(_#SiYe8)jP}>!=4zd&a&E}4+X z>M@~_6?CQx$jx^e5?MV!^By|Q3@kMX3~C|C`u{ROb5Wo@&0sl38<3wJnn35%GVpsa z^nv#PH#D+(Oh{q0X*kI0(~$-~n_SQC&1M`22{fs}n|967NyFg+S62W$Y z&X@qLjnilV@#ll)a~W8@|964QS7^Bn3Qw>)u$o5D+2b7u`3CTrBH%leK;tD~_a9{S zf$o*%@c#dj6H@LmgU;{>K--&~Fd>lzd}cfJTnP_I+F*IokjU}`)UTP)$Z%i+Xpa)q z?+uOMy-`Oz7<$2T$Dp<#=>8N?m_XX5OrSe!?tt75x>L&{fic1Rf6GNs{V^et6}%2& zLJH_S5mpY12F3*RIqwFr8de|3ymljatqREf4UMcEGg27-HzYFP@~eXP{}-|#{T>WV zDxh$%Xat>84+*P;6mXn?;`oMR6N5?fK~@jQ-4&3!3_MScxZ8lmVn36G_y6Z-L3V@M z03dooBEyx2MurpMxv&OC&{>!l8X6g{$h2@n%UqT>4b9x3Go+XtnizdR^JL!t+raBz zK;bbVk>vw)j0nvSEN`Ik732N?d87veXb%wsmbhXC)!U#xFX&7tXk4)}G$gWu?iFL0 z(8%&*LL$o_kl!1U8EqOGS$;GuWclO4&<*Z$PDo_=f*Mz#^?fXFz~{lh(_T9`%t7vT zXadbMf#R5>6-)(R;6Kz&e_21Zus8KA5N*vIE#V+1T3u(8j~{FGFbLm!b! z8rb+es2s!`GiQYLD@9=EK!6UeO3p7zg*AGS^y9mmQG@|{HzHhrQGQNNX#srv3RJ!! z&L0J@L0N!wA0nt8I00VIk;vd-(ZbMBvxH@p1?Vhv*tz~h@WJ~k!FM1ug3pr&l>wkT zE@~2`L@biQ_dkNxFP(sn)qv(oLF3b)b74T`7+l=3>Hizhxm8H&G(h_rLFofJ9)AX8 zF6e9om>S2X|DZhrGT#3iA!j4hGB8YD$l%Zn-V@0v1Ip9MOF?b?mc5`d2Yx3F=zg)o z3=E+0a)%~{1V}l@Z~~e}G#r{3R63d&77MH4hw@OxF3+r0P1Ul_5#7( z4mx+aA&~)>pJ3+dLiL0F4e}SL-3K~%v!))r=1~G#Zi42NTwvnXhZ!U$A7lWX&wrv} z9s@(eJ_Z)=|IOevH=y-DI-vD;;Biq#nTA#d4(R-PgZKX$@c0LGk2`oQ7MpzzP5(jb z17$#E8R+f<@BbCx^IafqV@Bv&2}TCO=N2-hz}8KG(qk^@!j$;Ll&sQXjBXre{rex< z2WF^%&aH#SCqd(spz%o;P`rT7xd81gwrBwD4QK%OZ$aS&@)I;qgU&4it+503X&FFr zpgPd|e{&)z?xEoX%I_cynlpfh2`D`wsW(Jc@BRNjXe`48at$tO6Afhi4Ace&m0!>?NO<}HjkPx1RiGs%{@#=VKnhzV901lV!Q(KJIE|hJT@O>r~rkz2SW>ZObOYq zps`F3hI&Z54m@`Pw_C!Zo@s^m|0dXZ5fvcwL1u#7M|@Z?+<}dKfNr8GPR&V+FGwuO zK&nsBnfUS#Xs&0%LhzUmDF1-srpBUyLErm-Jvg0!!VTniQ2c?)AP)wH9&oy=V_>wH z&$Py30RyM^|9bG48*(^+(w##S1L#b@8c_O>%LNlWY^h{Uq zd=5wqw1z~71$=LvNW)=96KMNphxh+`m7qEj)aD1dg>aa``r`~A7(_rlaZrjW%>f^B z8xIOONJvcq%`HRccfo5@k{N7Z`+;?s88|@YJ7}yP+#iSDd4_b3F?cT=$UT^Iw6Jyn zLjZ#aXs3K~X;D#pYH>+o60Gh9xd0YF(6kF$I{;c|5AFkbFx11_RG_ry(8Tb=qMpIV z`+qffJ_i&(&^{EXeF_@?hqd{^Wg%$oFK8VVWK4u112kR=ax3WGH-sGM%q<4cniYl# zDWJ1u7&1U(d7!oB;4`Kn>yklx2zd~C!0VEsdO+tY!SpkL&Rc|vgUVKllH8*3NHw$YgG1@S2LHc^Ih1j6*1;;Vc_&PYAn;BR@ zc^`DHD`=gy_x}oT8xu6&0vcz5h7;)S0|!vQ4lJGmzu$$>ymtz0zdJbPfyZ@IK$ArI z=(kZr-3MP^1MVv)GwML&mdE>l1$h1pDh@8oAZw>9z~wzyyqVDg>K6&`|NjNSV#$ma z-v7(N`54Lv_dh{;Js29nW4KUp2bf(R42|HiNT|3Ak~nxS9V+gD5O08v*D*viBs2OT zi9^Q_86rFwYQS@uM6AX70b9$EoC95)jkq5IEqoX>pmmst_y0=BK1ImASD>>hLF>8A{Q?io0pfX=~7U;yPA^3#tPBprk5 zJUqz<+{6O_Hw0r~A%^P6r48VCTk--7her-r* zPyn4P>DUC?=YbFh?c)T^(}2n^9To--hen1N(43bJ_^cj=5KtMY!_2@9YV&!3?w3md z?ft6*w@pD~k)ZkqeBWFGg98#@#3rGE0oqUSfvN$meFy-JEkpX?Wt^Zk7$~iQ+6P$F zgUTikn}!Ak*jiW6nrP5i7kFJ9Wc&-XCeDX|8n8JHpt1jj3;_*G88|>^iq;&_)B}z8 zgXV9b<194|5P2RnIrw}zdRRI%{o4TwXGj|z*S%E8YiAi3z}j0ysm1xFMaiIJ*m5&r z8`{t^2q=EReNfo?%SHz9`e|^T17bUj257= zH}C)d-h#pynnyrm?4Y?|P@iWDNKFI8PoVKi2C!KR7#LvZaDvPQwfVqnZ9waD!1q6Z z_H%*GlVk8`XaTK3WpIJ)x6{zGSjZ6I!B7nDV}bGssGS1oV}Z`RV|dYUkO6!~HOP%M ztP-F(M~)gc36Oh0`>kvmo-i0RvM`t+-LC{bH=v`D;R4kC!4n!8c|c>!pfkC2m>EFx zk)ZNF$gv6B7XqD;!=u9tE(Z#9m>HrRn;1Gg7#Nm-{MN99L8IXagAP)gO=Cg|gN_FS z=zMENn}#I}0u4tPM3Cgc=OBRYw}k2k-${=o4?a5qbiXB39()fjl03Lg2r6%&^5A=< zkmSKA7Z{k!Lb3cu5k&h3cLWVsxOa2vjFqDDkI6>(iX^fNyl!rj$DHaK! zIpREUJp!7G0<|9?_B58gG zfztVbnk7ddX2b4rUIOtuc#Z&czjOj*p!qq_Ipm=8+7Hw- zRDkCDK=+%RP-N%;%{v{K&rk!M?`t{X$j|_udsGzA08 zB0~e(T;G8k$_yHyuy0^wfZlb?umCkrD=uD&w%0w><)74U+|1JO8tx3K2Bx;pK0LO!~i-Y5!62gt+&hp z^+zG|AmBZ&pgaJc+X1hKPgcw0(6M_Ieb7CwV13^Iv%&2NXqy&vo+7xd z0b1`yMxSj5N}mnvN9=tzq~M2zKZ^fB>$e&bL3gJ7O9hV|G=k1vV<_-oC;+d8LaHZ0 zb8DdWT?O9%|Lp|%8TXnj_;^MFN?8wfC!{Tb>@FA^R6Y{dKga~ILes%(GH^S;8h7<-lNdEC}yX=)FXs6G4&Aa>mF|Q1_v)Kd%7wzdRVSz~c*`@(NT}gT@s> zV>6KY1b$x`s7?XhhXSe}O2GAIB7=*}VTO*H6eH025H2C9?0Z1*Uc-#2^FZT1P2U7%iJOp$e4S1XzsjUVo!yFqx^C1jiw|f8oHxpzBq|Jut zXQ8%l;Q8YTY<)gx95*F3EwMDGBtAW{B(*#db%Y2MKA`*o=|8^*t*>1%AyJ@XLZd)W zL!v;BMFUe8XfE7?0lN3Qo?(u~e1>)2|I@&I6HvcrLZX0&V-sUb!$JWM(D|mIwSwON zv%vc+pzd6<3P|5L$b z>4ZdqfQCi^7f@da6#kI)XaYSQ%}jcrF)@cG1`V)$GLxRg0tP+r|B2u+Xpq{5MuDCg zDNNCzb{Z%wJDQnd(DcMW^+5005CETfIU|Ls6EqGDZsVhbX$E*dEW*$KHZ&v(czFL$ z1-CgZ8W{eA(l5v^i)4^nlEL#05PyNrY!U#ieRcq?KL)vPMhb(T2LotK6=pAk9;z9P zdfxw&!QqVC3`R6F81)(w1v)@}_x}H<6=Y8XqX2YItpJ`qwM-ST_6R6XgU5W*Q%gYU z6SRJ90wefb8SwfwkeT3iZ2|-6&Lk#K`t<&v1fC}Vxf8TL2y%B)GB_?k<1HQxjG%oX zGa3+MpP;(Y1*9Id9tN~7yP=uUz@mkzVL~$_Xig5S*86`FxbM;cI=dzXbngfQNF21b z4YW=P#MXhf?IS>aRhxzb92PB^D&GIIz~e(8^Bo#MdrXobW0sKn>_PV;g4Rob$`;TW z$)G(%ptFQRVE*v_p9Ee%33WS24s<8#jD{9Q1JM2$hX(LI4NzYQB<=zd1C70c!UdXk zKzocpevI(`9}fwKMrfG^xswN^Zw{yqhP2%h!S|muG%|q1I6(K%gWAE+um-h}Ant5n z0NtJH(UHsmIwwj9T2_L>!o&N2I(RG=RGxy@5Q5iIg6_^{0JYC@z;n?sWeD*N3JcQntiM+lI)Zc@Z zhfF5e&wdBD7;rak5aYur?Jw~7EZObP1W3Flg8c}Ze+T&q-fl&0e#DqpBaQ_aJHYOx8NlXBpMVQDG0XhfX`~RO% zP~0QcrJ%7C(6|ujymC+)0QnV^jzD$kmxe?p(0cd?&^{8_cu&JZrWg+frn8`Y14_$~ z`7x%LhGfP)At~(Ou`_r*%K{$f0nMR{G$ex6gn-IMXkAd#kjNy_(8weMDjyL2JaB&x zBpzb{+E2fL@q+jNXvqFAh#473W`NgDg8J34{(}X$y_W!A=MGK(pnfALEO+A12+FgdJm$dwYQtf7FKFBu$oc`$++YW&oQ1Y&L1hytzNdh~1(a^k%8r!ggAAbgxE|2F zxA*@DaQ_TTd)vmM8FZE(c+9n@;|K$5#}WoMa9b*wF~p(;w5Kvk5fm;B;Cn+sceF7E zK+ib#7WblB> zgUcqcTp~j_D84KfGI-cD9MG_6$yD_IpA5GT)Sk5fk6(k=ZXcMC!U*bTg3JZ2u>;*n z=76ME6|Efsy5kZwj|RFU0Hk*b$lsv(_X#PC3()Kp^!}d=9@_)?6MR-hA_MgPEQSKm z+FkJ8r9^O@a$v#|M$kCg9uEfay@w9o|0BTlu=oFHa61N4pEB`)#*-RSah53!4XunB z6IvNT^C1T;8WtYL>XJ0?Ao4 zFfdPO1)ZzLaKO@@VUI-%gFwy7npHJRYFAm#X9%fT^8_?L#b2}JDTtP-S+W+C?hedI zVet0=o$(K<8xY~HZ0R8QK=1eEbHwW*!ut=sj6mIo(tn4}FVuMd|F;yh#tBrXG$exW^8}3{gZ2^! zG$b+Z0kz9P`_eoZAbB5@hCt;cXg(LD4>UjF{r^8BD9s|T_d%^UVQGM&fW_+sWJd5>2<p;ztC97%{FI@#Hd!S`3_>5ZQG7?AL zxPsij0u?%`dGVm8P--!JrzujPATgogLqz!#3@gubKw}&rH-gGdaNZ?n{203a1%CcC za-oCfKBW8$+TRJ9KbHWd9q<2v;C=w;Tv71(grK|K!1wt2gX=udxu+m^&PZYW4^hLx z0NOtZ*+b$FPIn-Akh&Qu91u02wLK6sz;!-C9<;}VQ38BUBB)LStMLQxpFpT#hL{05 ze-WVuJb#E#!vt0X+S6{4%*p`28wYg$U@`-TMFYbREN4AR%t&GVkNfUEP#%G=kyBuh zfRvNSha|?Ag63C|0v5`|75^3uT%f(x49IQ)^}D_Q|0{&ed3Z2{gV&jX{f2a|5o#KR zjR7!3z{)aYcVV+1WFDxVfZ1cQgh|4pg^9)ce++oNGN>K_?^{h|$gxOf0^NrOT5~Mn z{XYi09|hFL1lN-(pmY9-I>)92Hs_L_T9T1pT#{4?4K8f%1I_<{_V1&+6Wk64o%i&N zNy6e7$i30}+ zhxdO!@O~B0`ZG`;*n=Syy!H}p?-!%Rent%shEQ-C^ZxG#9`6Ljod*Lucx()6rVQ9E z2PJr*Vd3Gy5CR!{OqAdO)g|8l|MG&ubV8zNghLYpxW5I}>jH95^Fj$8@Be<_emKHS zA>cC=;QLl!XSX&muvqM8Oz~g{0k3%ih4+L+@dF?~gX{o}U05`L#-jbfZ5pT;bR98B zojB+mchLAJBn%rtcK?O$Z(}QHNED4|KFq+NAqPHB3bG#oVjj3(2Q{w-S6K!rhL#=f;S22iPA3{QJa%Ap~58K>W)BI%nGf znpO-zes4G^!PD?id`Cm0Xas2PGUTa%RV|AKXdVHyPfo;xAqYJ8(vT>=!=f2<2R-(1 zaA^AX2V@>3ESVfU7=j>Y&p^Twx_6H02Q)0f=>oLA1r%POv#TND!gK=~mI4ip;*c}& zk`?qOB#N(TSST9NkP4dXK!`WAGVp-cLLLP5y?)J{kSM+Z)SiI)50Z}>#n*t=6j&@2 zukm2=g052*-vF`?y8aIq9uAvq(*_XCe};E#JZa2~-Q_e@hf7=plQ z3ljHCpfk{5epLa*RYRlrhK45$3>FCg9PnTW0GAWccq(ZCg=sPa3u-)p*6N6F0Of^- zM)4Am9QHKt4L;uj)8C#C8yp!#Q2p%-Zgb)Hw=1~aPr%;~JQxDOeR z{6p~)u-{u4Sm5a$9tO+;9t{5AvZ*0ayabx&v4#UA&5IX6)nHB24o!c-c0%$6vkff0 zfZR4AQ9K2+ob>{)4S6T)i>W`LFP0t zibL8jd5`yhcksMBXuW{(0`9hCRI|GR?A43Hf7+*Ht>pcDocP@f9a#{-2G?lnQM zeg{JYg9xPG0bb7r>V(Fp7v+~Dy9Seu-+c@`5cj!&>p)ERLDs&J9gN|(>uk!&1A-=&wEc2tFFlvCuF9R3o3IK)BqbFNzTvB z&CiQZD~>OzEC6pD#a=#v(l50B0PWud?Qa6rw~+aC(EJDFY!6T$O2mV~5uPTXV}qc1 z#SHKNe}01efT#;0d!<2Q;JUDp0c0j4D6T>Iv>^q&7Lwhu0etr~L>y`ts7$Pxub^j< z%>K{&zXfER6)FE>jwi$X&aj6;5K>0t^)ym2fbuVa`4bjM`Nyc>{ofw!ce2VqDTupJ z_nQ$Y{0NtSEHW)1ciG`8|G;i1y8MHVtD(9PPvM7fAHMnn>;}mElP$PUNLKhEo&SMc zZ$RS@KE4Y{Td?|{fkmbT)c3N*QU5c5-9~iyK+hKkg%8*b_=5(V%AoGU7d~u|^u^HO z{oe+B-U3Q}Jai4H%cd+w3kh&L3W z?!y;;;Q39+8Z&Efdy}m2lZWI_Q21r$p{!lP8-`H#;R-(yP+8{v-wHC054!UX)OLZl zKOu9oM28==4TZ&xIKz;T`ylzl3fykM62IWECE9(^HS-|%Va#9RXo;e`5467sG%gNm zD}l!2LH&w`B*qh+VQBT z8i2Da1_5;+zVrv)p8~qu)%(8%WZVF@&z_X_F|>Sx&lf>c9n^kY>5E6Eh0(+NzXh)H zAM7?zSm6#Ac-HFY%&EesZ*J8&JE73Aj1mm| zp!5Qsm4_!1X!<}8zY5Tq9N_S4W&rJ92CuPbSj=Fd!^!}<59tnQUInx+6*N8!T|4U1 zkOEz^n*wP&L&h%|YAjk9SUi|az~}Wq+tZ+a2S`0~c!1XPf&482N>8AD&Y(RW;Jd3D z89-`XpkV}Z3n-m|*2aO%mhoUR2G5IAqF)c zp1&;;K=-*CgTorsjzC)r09u0xy6+vdemw)y<}d>H2SH&DF1H#PGC*~{2g3vKU4{)w zjBB8Bp#7tuy-_&MUV*#00e0?Qa$<5uYJ6TQz9A;4`{DP0H6${0fYM$_G6y97Kxf87 z#6bNy&^(?C)ZO5DLQuU5+P{VDW>B1g(=KT3E$Ccb@E&@G9iTPEpmYmaKf?ejvsu9P zb0PzHU9@8pc&sA?ss?m^QV4XchNl5^-q!-qT$u$pyg+-{5)Om&24wFlXfJLfLkh?p zpmC6fMure@ctZ9E`!p;-)AyBe6IGoRDx3 zp!h-RU&HU$0I$tj$WYPz6moAyLnA{&!%+s%eZmah|INYaJNYpKL&6aT21uAFiGa)B zWCrkgZ=m>bY+?ZAMQ~jTI!hU}Kd<2-LqiQ{uW=ItM-8h5c<-?X1H%_k7@_NTX!;LY z8wol)D*#m1fWi|Lj-Wkgpgsw>tX>R0D=DOgMZ>|N5p>7f--)2HVjS)U&m9xtZcv#H zI?Kcblvbc|>EO`xA9U7&g!g}a@H$|SA3 z0Od;tkUybu39tV##|vO%?2J9Ac@1-r9WDMgfYyhC+5n(65)BI(GN9p*)6mFJfQUac z@P2tB!T~-0avB~o6kv%z&^l{u;RQaE9qM0rxq{oj40{-$ccwwoZ(3#^p0)ufNrU{4 zeEtGBO+eag;Cd4pN1%PB9N_w<0X*Lij#qHm0y!fBR8D~W3Oi#7w4TfdG`|Xpdq?md zH-?JF76u*yckhApfXXpYzV`9{uL~YeXh>uT0GR`_&!Oo*=p0_qdVJ7+3DABJxZ4~X z{)6gBP~FVn{a+V0&r#w1Ul%;S3Jphiy1`Kfz|Zf8gdvWFU7)~&j*lSn|2@$84qGN9 zD(;xjsJO?Xp3%YkzaDs<1;qUd9^iE-^^69fyGt7q6+A5FGe*GN2T{WS%F`m=|8>CS zC@BAUFfeL>+7ghxkqV%)4%}ads8;~(k@?b)r~us?X$amY3##iOdleNR?E-{6xSRyZ zL-r~{^yx5z_eO%wDFKZGg4WJ7fXuXbs2E~#P$9r#p+bnoe8w2>|Aydo9XiYm%+T?{ zh=xSPJr<3MA>RMh!0la-*-$x~hD6034GR?lAZJmSfalaEBr5j6(gvu_XpyK8;{D$c z;@?Ka9&lS3GzJVxTMZ!p8i42eVE%Pz0_}wX-F2Y@?vH`W2uR#2LeDKwL_4r;~N=jKyz)NHZrJx z16mslYL|l6t#~ki&b(o$ut;VEolomxQP0obAr+__`aih2H3rb4xq3EmuHEPGZVc3tL_A?B>?M9WGFzLhi1q@?%UxB-zhLZ z6+`d%gas=;_k+eypl$^1(*(_%gU$^C)m1q*2@H%D$#WcPSR@!68W}+QQ8PRk^uYVY zv7`%7emAkG2c3rpK6gDwhuKd7a%cKKM`&LRWNwB<3xf`1{pr7z`27aUZwwn?^V~4M zAw>_Ye+qA(gW?4i7Z%AdyHvny5KAt zeL>I}CIz5&7RX(=!w%MNVn~6_vy>L67R8fz{va&;Kz4z{Adw-*`@c50>_T%ZxE%#` zD=3W?fZBYZ^->KB8A`nWD}m?!z-_NYh7y##g)>~?YfL*}<6U4s;3%s=;R`CGkmkow z$_G$7fP}RkxZXr{zbbfLAk_U4ptdPU-Vt;r0rc!%&^#sRtQClV6v1r)XnraH-Hl~2 zpE1SzzdCrm9U*^WmLG7xZh?(?rWfUx7Q`bw3vSzi_H{He)PUlJsO}pMnPtR%mLlwNv?hm1_mFH89K}ioDQHh?hOoF)8V)lsG(2Wtft?v;v%uM4!a{}S9xZjz`05YGW;V}ab%=|wM$Yv>M;4lZ2 zu0ZApG%N<)X9PA!py4rt2#Mx^`U4_(eRi-hD38fc@$)hLc?OvxglWp zpqyPsq`yG@8<05~4U56`B`AC}8Xhy~kmw#zdkAEXLBnEjTM=ZALBnGP6B5lSXh>uL znPbtg7<_IO$Q+A?#|$ zgd2(sD^4gftN`7;bHb4!15MoqsJe_BiVPc0C^Brgp~#SN!jYi>P2CQtx`G>u3_DIJ zGVHja$WU;?k)Z-j-2te&iW`ay2Tmw59Jry#01m$si3}cpk|eZ1euvT#P&xrhXF%zK zKcG9790jy)I5ISV!WeX4P(vak!wqEy22fan&u|0Z69pFIH~|T(1|)R?Cm`X1EGBV6 zks$$1uL9`)Dl{<-(0xT{Vg@H5{y;X*0_3I>AU8QPaDdXv31sQ(A0eJmC*NYotGzE-o;5PT;$ zXnX@S1`Dr0k4OYe0G(~HkiiFZzX#|(gXV+aGZ!6d>ZC+Kca3`gmj|D}jeOn#%wACc z6Q&+?ULjOZkN1B$@ZJ_|dO+dSz{mhU4+V2Al9FQs6Rh3A2)}=`v;cfVd2vZmW*+j5 z_ptbb#vN$?DyV%0K06K692@)t%AG0GexRn32K&+K1cV!N3SQBe?>s7j(bo0p_#daVzk6Dfo;=(AZ>y z#eBv&-v4F6;|HLbY}`U%+Sq*o7KqR(Q$-cAFo4EBBtUbtpmWurV^^T@7SI|;(3}tGY#|oVJe z1{UxCir{nsYIB0kY6SQ1VDbXq{}sXGlAyD^vB-0H|5pUB^8uF`2@D`NfzAPekKZE7 zNaQny7;eDINKn%dv>gt#`8Bn$G%=?bQ68eRK;Z*wBSP~R%J>G%Z5>M(7&?wHFm^m) zVCrOHVD405VCi&WV6~XfxW)Uw6nHKcl+Td+g_wN}c)vOUHpZM6K% zpn4E=o*T$5p!2Xj7#KkFN1$~8KA`i#92ywbfaE~uqfJNz-~SCdivx5X6R6Dy8f!pS z3mQ`bVNjbpCM4NG4>WEGu7_GQ)>Xh>RJqGux5#8~S`7 zC~tw%FSN}8N<$gYGz+>*6jZJ#z{Y!Zn8D=?h~EH;FVHwIXv`N%gU(_zNv4K=}{k2c-5BXx;h_xPL%*%Yggu|Nm<+Gw?b# zGKhfYk8A2A^bl*+8FDP@89?oF5WNO;_P9ko1E{?mV^Pm=1XP!R*0+PoON)92(7lhK zG3^(ia|pSn62k@LvsIARrGXZ5;8+z64IGU58}L21p!Ny8ZP}2>umDug&sYqe$DIK> z-wsiKgX?|J`sf7~^FjA1bArdXKxfy5q_F=3m{wj2kC1%n3m`FuMvQ#W&4KPT+m){PRLjt z*bQu3@Te8>{?7rfQ=sM+;ZdvL{htFoX9QJifJd#4_kRx9oZg&}6xMfm)S7tz=YWi< zf!)grF1N791(SpKe-7}R7Q_v#;4`pssP*yw&jDT|4oVj&?PT2Tod5=9Y->-`auU;v z<8jpsuoT+Z#CT_dBZEi-4+BGk4+BdLCusi&ivn1lX91XEU|^7FY+`&sq`D_Ws(VAE zx(`IE`$D9;AH=C+Vjxl-3z6zLh*ZZzj5=7vfa(s=ngUQeBP4}I4N`X`fa-J?$3_Mj zon{3F$2Nuxon{9R?cvzO0J>`!R7bmj`>9JB7;2a`KJoQ zAb05sfaZZgX9KcAv%R)+}(SzQ_uS#7-k^MUvE zOh{yLQAlQi-j~AyK1X;$B8v}1jVO4%38;-YA(15jbe4tpe_lwL3OVOarlFD520XvM zfQ7;PKeQZg1nFmSf$UL*vJ<65I+7Vc=e~mOK?apq`k-;&hC~)0NZSRX4$5|ENM!K< zwWTH`vUoHkvIKbl7X_EOP`89QHZf^5B(j8bG&At%K<-}D=xAo(h0ZfdK*eM_k{S3w zdO&+^pl3C5fbQ=F+1t>_64J1c1$6HzkN1C0@ZK-5+d*Op4B)%#EE-uNK>qXoF9bgG z1vKsfnSW)R(9p>0(6EHTqTvXGO~XT$3yq8{SCH;I0j;UDX-H&A@c#eTbOPv3-ehoF zfemSIn+j-67oxqur~oySqu~ex57ONt;B`G742+=g2HA=AZj*+CtS&li;PVomnC(qzw(ZIlDv5(<_ z2ZIoJ&7TJY!vd(=aNT>-0F}peZ%P7G9@o7s4p4c6h9e9nNPY+38w2iNK*F1$;Rpi@ zl05Wo08knc2KxmR-xCs9LL8d@J^-27*uuckyo7*@Z!*(S<>xF@-^L_(JQUr89;OVp!J##6uPToLMuZJ$c+t084?S0h^f%YYW@6T)m?@#1_$$|Sm^%8o`4;g$g>NrMt9p}OTJueYd z)5Ry2loUZXVL}E#5$PRdH^^*g+(Xv*B{F1$B(uH)Fx4=C;uzVkZ&=hQfW~D&kzNZY;&EPY2k<4MQ!eR~! znmK#0s9{1=^AC#}&>j+)U7)ppE*Noy+`otJxhc)dtN`7vnrc*#T9k{LKA`y(0QvF6P7T5>jUsO807r93{XFF!V(7X{aa9R(AYLeEqEUkNNhzi z1Nfd($a$p<;Jd;=;-I?;L2iMHL+fnt9ZsOTlQN*?43N}&Oh^Im!^vnk z!eG&`guzB8mHCCm1LhYsOD)7?j)7<+kqJu}Am)Phw;f>s)!!~4b!ciJc0km4G%R88 z!J-CYAI>!#u(3wQ9tOVT{DMkIB?3CrA672IXlVR7OkiXH?IF7{p^@RvgoO;CbB69f z&IaQGx3@rf9<O6l-J;~hZB%H%@__~FLM}DVCyZA z@;}x}gs}TK!Dqc-y6@*SjEl!SxAf%|ikM z18B_!h!35c$N;Td0gbjz%~A`Cnq&hD@cod?;JF%( z8dd|)I2mZ(#Ra_9eZGrL)G4qmk3u&#F-Z{9A8%}8 zk|9!^0+H%eh*YORq&giU)fo_}&V)#H7DTGEAySD+Qe6U(>QabQmqDbu93s^f5UH+&NOcuNs;ePVT?3KoT8LEFL8Q7KBGpYGQr#3H z)y*JM-5es-Eg(|e5+c>DAX42LBGqjmQr#9J)$Jfs-5w&<9UxNO5hB%{AX42KBGp|W zQr#6I)!iUc9g*`GOhnFOFcCSA!SsSi_YpbY!9?VI2NRL=9ZbZ|cl;sFAIwC~i!c*8 zFTzaJya-C842c6idnu72VghK4Y9T`cs7-C5h_as>X?-+<41>N`Vp(E*eo=aSMrA>2 zQD$;Hq%l~YnP+Si@0OX98kSlFYN&#)Bg{Y?g?~{6z51No4(a^ocO=K=g&?h7nXATVreI6F~8GH!n1FhW#>8koP!QfcDf^fY$spwlGh?w+|FL?gN^80?lcG&!PmS8_+ry@cwS3`?+zi zQ)0|u5Xge09q?gJnR%HdkT^jmVex~sJ_59k6uF-WTJs0mLj&5E3ffQZ(ENmfrTGYW z-*gQmOqu53i#yOdOVD}w326+Vb^9(2j~N&m+Zm?d3x7~wkBqPat!V?z(}COyia!sO zHF*dB|G)?@CRo3a;Rgdha(F?G6@i5hqW=d@zu<8K(3l{23?7oMYVd^tH2s3co-!a| z##mvopCQHKK0^_{Z~%?JO;`vX9|f(w$pP(iXl!GgfH&(UN=sx<(0-=T)d!t{-8aPj!mFDm>C}M%_~CB5+d|~(nn20 zGQ$E;esgGIxPoTy4SZ%m;}bNuQ2~ihCI^fCj2ssC8AXVQPmtZ9vc&-spG+?J;uC5Y zXbm6KE`|_%ZiALRptB!Ac7V>XSpab(g9$!;9t_|!2%u#Ys7z+`z^5J*_RR;uX%iHV zpgndC-v7ULg7$-g&+ASF=l2ST9~mt0`H}d1%G3Z$wn*S3Y7=dO(RHgbJjgw(pt^?xdF%{zOd4LE zMZoJjki)<=AKd;1gq~2kg0~#mCm;RC0KcTt_ zHV4d*!=R3%Jr|sro>&wQSppu6dj&Ws{?WtFgYh=_>{XOB*}?$YtH#jSioY%_y;HF2Bnr|f;t1(10QpJ=LTrq4Q{_c*B3zA74&Sw9Aqef zv;i5n;HxW<(<)|p1aG%pfYk@ZsU`8~#Stj}P{;2P?Kg`Ah9%zrUV!hU0F|8<^BG%e zmONR7xSR3mDvM+W8QlD%t6*gr=zJ3I|No{!=P)=t7;k{f6HxmNBnFy8nXs4vG_T{) zkjyX#G~WeUD*@H-;QjyGOwfD}em}#@x+4sVc+*IJK`NsD0PlfjWXM42cQrE9c>n*o z6k7g5&Sgmeo%6>C+LH-#BWO(kq|MRD0Gh7^wcUL@7_WoZl7YetG)DuvI}W;53v|~S ztbG!Jx7vt1?*2WdGCMEz-LK-`YF(PDzLj88~%gr_VE7q3|z*6+mz6~ zQr`dnl!DR%G@fys!vl+B#uW@2c;h$^TnIbo(c#RaO{HtmHSAd*mQR_jNUl>Xll=1o{J+&kt z6FlI6R+548FM9n4Dz`xA5=?jqK93FRmv1+rY1svO4y6rvzXhTl0lG82!h`WDc>OXc zUxM-=C>?{&tbzK`#rywfLEQd<-(%Q9Apd1&=H!5Vg3J9-`wF0S2DlA^uYC-P2M@+8 z;JI>8S<;cn-~jS3Xbm9TEcn<2(+YfMfzvZm9}zXq;N|KH1~o!)7Mz*xSDFjH?r?HU!j` z^Zx$?yjB(|?m_E~L2Y5MTJQfKMLif8{(#QgYDi|_0h#a61m5$*;r;I+WN$+w1ISF! z`WBELA4vQW?2iRBw1DrrU;yny^8WV_T!wUHwxWwW<;~Kp6VMR zf;PrM5(HZOCqUaD@OwNb90c#N0^OUu2O5@m$5AFEGJw_rfYcxG{{QJID2^s1GW0;w z0Bc7>A_M4bEl}MBIyVud4s@OtXdTfJXx#w1lYR%pE~X`*HAncuWI`gt6!5;B1P0KU z(v*fqhA9(3=SC(nOn~$oE`rOG35g7#v-@CnfYz_?XjsV50qOe^$d3yd8j$*BU^jdJ zf7j{3zydmx667BdkUt%om_YmFIK2Pej|8}hBLpUVwO ziwfTV?t|MuAhV$2ptOi&9yl#-u(;2-jX+uin~Rhd(aqRFq8ZrSaezcKK>b>Dcbp*6 z3{YN2H{%M4W`Neep__4sL^D9;6uKEtNHhbqM-knOHzb+?TE_%3V^70EhMtC{3?dCn z8NlUC186MhA%jaJGXq0o2jh-L9tMV5P8{Rop!<6p8PLsOX#nl_f5_lNff*bP2N?ny z9x{YbU!Jvwx9&yPm3NA@3A!ddPt$tyE)Gv$@6B-$1 zpzG8n8X6g8pk*VWy5$Mzp5cZ@(48Z1IzeUbghYlHkh+B%bS}mVX#3&~L>*yOA z!Dh-p&3^)QH=*&~7Y!{8G9b5DBrpVc|GNpk+YMwERGbCXJaC!*gNS?&HWyK*gZ%+@ z6UYoE1`^G{;tnRzm^q=k1=$@On0{drA<-Q?Sjlc8kj?Oc zxPwuqVIjkdhNTQLuWu$nR0843*t85$ZMGPDrYj>2w+O2a{hj)sQ}JrtOs(QuGqLc>FbDHNEY z({PYsM#DpfITV;-&~T7pLBm6aB@~!p(r}PrMZ-geH58a((QuGqL&HOcEfknx({PYs zN5eygJrtPX&~T99K*K|ZBNUk7(r}RBM8iXdGZdKN(QuIALc>FbD-@XF({PaCM#Dpf zJ4Bhm$jAZNbHvDid#;E34udw1K0{Dyaeir0a;i^eZYEOC0kwbd?*p`dpfRD5QD?$J zMo=BC(a^}K18rv$>K}Y*NMr=5H}L-dAQRMnpODD#1JXa>0i8kl1KL0M15wBD1Jou5 zolObqA9(-21U?r8seb_8FAG!a{r}EX4+b9483Z766hP)XG_irsD&X+`cNTmK~w+ zK};V5*$gc1U?!%Ifouk-e}Lu=W@7pn$Yy~02k2%9kQg4I{sFof5+s@d>K~w+p+ce= zp#A~68N~Ecki!GiKR`FbghY3srCCrKW40mD3{d|7-5o9@ngQw`pqt@Cq8Xt60lFE) z^mUNK6k7H$K=Uv-JYq<62dIC5?v4}^%>eZe(9Osp(F{=k0Nsod63qbh575mZroV(7 zrl9@-x*5dumypc>^$*a^m_VXmK>Y)BGl=PPA-f|0S}!1{573+tp|KKVGeRI{FzPfc zWcbmrltF>aehR40LpOueehM}-NbRR!GlSHA3N|x9{S;FA7}(4J^;1ac>tHj3)P4#! zGf3^HU^9c%ehM}-NbRR!GlSHA3N|xH?WbTfgVcTsHZw@=r(iRK)P4#!Gf3^HU^9c% zehM}-NbRR!GlSHA3N|xH>!(24|LA35K*K?X2MrGyo)Fd7!EQ!K!$F1@4G$UK5M>4< zqXe|SB!IiW#Pfzh6Gwl^FReH@wWut$D9jk&JPT_7>3;yE|HN=&LLL!qFG8pfHKieu0i^zd_y5bV^}llCSvCAmmtmGF9EIhozTbtIwN@jWd435>|Wam4G23x^YNx z&EEgdo%CQ}1FfF}`9}rPmtzir%=PStt^WY|4RrS%NY50Ap9s$1&uM63PyvOBMFNA4 z_rLw%JH&b^zejcl zX#O7EFGoo93uyix-3(&JjFH^|n!iUk;{u890L|Z{n{k6gGeC2P=w>`1(F{-?LpS3E ziDoE3^DuJyAZEM(IZV;gJvfaKGhTpf2577V*!`c+PC1n zY6R9PL&`IB{TvMs8GIn+2jdRVc`yXlLtygXY&_MiJ25f!-wQY%C%YZ#@No?C<^$VzNOZ;2_Bf}0zeb2A~v%Y6x zgsiq>pM!J1325iABlw&)XJV|+Yk;lOA#QzU4^;gD@BgPgL3Q4QM1~2F zx*fbWZvwP#2ekn}YltR*>am7IhAEKo(VgJ4Ig!RkJ0R;P7{F@1{~s^)U|yN9ZVclmm!%4 zDyvwC8J7g>ht`Ln_4DXv5Hl``Yz8)W@DNdUBbx!LQ_k&2d1>p_@U> zoD{MdX!#G6)|rW!lR`EFG{1)K4r1mCk<9?juc4bk%$y~%8KC(!bTf#V=R-CFG{1&! z1~Kz%$Yy}%*U-%%W^N4G4AA@ImU=?28nGHtY(ndM!{+Z ziER|DW{}uM!DU+)i%m6>9d%{8R{g^iz8X4|D+nR*h$e=R>KdN zXk=J3p^*VJH?smXf8zar75J{l37~UR5O#p(Pi{0UWLN+hyCk^(aR$=-3E0iv|F?E} zFffDc0r>}f4}e1x6KH&f!~5Sd*#1Y5-yn81GR%SaiQxRnl7<%W+4CT?B)tDEgYAEW ziG#*iKyHAV2Woq;5VJlAtRK-<2Zuef8N{@skj=p64r1C3$YwzLI`FUo`-Paj5XfeL z#(L1h1Jw2)v^N>q4A58)x*4FgJ*1cc8tVa>ai?J+!;*%j3?@-bHL?fbPYf0Lga*_IpFh2lTKI0o`>@lzv7A_&ourWhiLBIBZOs zC|dd104+a}?BZo?6p+RjG9cp%3?MTLy#H^w>cPMa8pi{f z13sU@p^0%1WPEzzQs|g6$V|`}Hb_qn)ZK)}7YZ6$7(n+*fXXZp?|%znI}jX#3*Bb8ZbX0Q;`KR`AEi#u3|Sv!Yp2B^$JcLyc6R`5n;xQP6hL0{Hn)&~s)Ikjjb-@BeF7dN447)}esRask=l(8O2)DJ$ky zLdyz}xu7#cL2geWvaHBxXkl;xm0O^@kG=oRh1~54x{n4T4$GrZ^FU<<3o(27z~-Wr z706}~GarU*1~zvPGarU*2CS?=atBf69l9`LAT8DR#(DEc$l&1p zf9^_9UY?N1Z~@5<$k-%k3=MpaD8c^G1w{V{G_JvL$NT?^Ob-V3kcLDCkbgWt{&Z+! zz5^*gX2SOWgZu_s&yF(EOQyGp!F7{ zn1N+3gB7$^f)q0#L^n7&tfwJR7a7re-@h= zpgM|_{j=E20JTL)**}ZT4A8jy2@>|tVlx9Y?(Wb)^jS!tvJgBUf*dcPad!{U8bYGh zgCoYwk<9>&yOYqq$LbEyxH}2`46J5ooKR#Sa!dlNejTF6B(R5r!3jm!T5bYkA~?r| zk;gPRmf$=i8MMwWxU#q;HJ8B12BZmu*8VAgj&H1(02*gq$gp9;L53|89x{N=fm;C@ zdxiD^2#s@q#xFqXH+cVFd=S(&0G<5`X#+8T0iQ{l%m6wgucjf90i>=1+y+Wy0Nu^G z12V2V8Qg|I8tW*4_Fus2z5maD>A}DZ>Q{m8^z;GQff%2i09*e6G8eQ49;BxP>UKh7 z9iVeteL(K9NMMlg{x<=9=4C@8156y$Z$L5+)PG?nrhWnIN3=h{{)V~&B4H zz~T;8V&>bC%>eaZ(EP$m%=|L48KC|Px*5cr-GgifXsiR>3}VKsk<9>&&w|WY)3A`C zqG2h64^kaPLRkoo7j!c~brcC@AyzX$brcEZ7*;btbrcEZDONK;byNZg=fYtNQ&1h1 zLG-zBj0`iNb6pcq$7vND8yI2zIhG2X=dpqMbH1s$NW(6W!VB|!@d?oKt7AeVL(hbT z3=<|CWSBDHA$Y${2l$Lh;>KTM8WI^m>L+;rpU(&?TP7qjBtXh9CeS%-3D7FH@FW7G7BmWDm#$O1C>8SttSSX zi&Tc8n?cO@39=bj+(A@d4%rM)83uAkPs2ingodRIptEPmIS&$>8KmZWY-W&_?->~? zpn0VLcV1z7f^$wIB%>%bF$HavBs{xdFbLKE(E51|G~E%Z_hI$<2Jio~PlD1j=v-Pz zzG0~V-O~fjH=r|gLFGyVG~cv<<~KYTtJZ?jJW_tCfaVvlTJQhUzj`pRfaY5p8j=|z zK;}C%F}XnUO9%K)iiSo8keLxsch^AOO{mUqXlP-G0J+5?fkDRmUk7ab6DAHyryw^# z%>(5ZqS7f?KT>`{GlPYgb??Y#U~va4G3V1En*qu%XzpMoW=XBE~I{-2qyE4{`^n&TnW~$`CSQFr^m>j50+<7Y64W#y%o z#3!bt6r~my$CuKuju#ac(A+hDIip35`q=4T($&p#Guyb5_E9$lg6wQ)WCHmu25eU&lL*95 zgvPmA^H(@4%i=1H-XJqL82L0 z+`+tqL^C+B_+HAo@)9UtfYNXC5(Wlh??Ovn%D@1= z^ACK-CsPFUey0U^?+i#}iojwgOG6{5Okteh{r{IL70u;9@=E}|`-!M%Cl8XH6X;|o zsQgv1Sjf1<`~Q!pRP>7oG+uUi|NqfTMRO&f=AQBX|HG7u=E^|Lec=87`(1L)1=q(5 znLy|J#z5Pp3JnJte>6N~{6pNhJh=RiX+SkYrQskGL&HNR77EPJXgJ8k(eRLohbS`` znLHrMD>q2_W+k>-Z|c zXLvR=g3U~Tnty@FHpi8Q7VvlyXk19d`(Gva>=}?*P;nMi^T6$eA4JqkU~@rbHpHJ` ze?Z*?GJ}nSL^H6sgH41)GdM8)!lpo?89Z3b&>_(baN24<$jk!^XHYniU$-%H5LdS` zb6~NP1*tyBBfdVM$WEkskC9$>BGr3L^s-X`5w`g6;6$wphzwgsCg^?BGox8^s-X~QO~i`%T5V|oow{7QwCut zJH6~wK-kGaFFREbc5+hRPDU>1J;PiHgxf6~H8|TX!Ij0Hd5Crktb+$@zd**d|5JK? z7-(J+bjHmA@Bj6%^Itlk{kk9E@q5U+CD=J*9gzB*p$F7%@&2C+UMqxXw=gt7+AZL7 zggU(cSDSh;uxx;ulL2YB!0yz{fsX$&fXoE#1p~RGg}8PLLq|gk18A=Xs9&ex{VyA~ z{s|@ynm0r;57cfUYW@8(;~2*6n1_h=q_MHyvm$VWT+rYKhC=}LF-Xr{Y};qoac4nSht0}{HEsp zIF+#TA4#|$CwnTWzlT(Qquq~FT8eZ(P7b8}hTV^o2JW+h?zEYZ!jJ>G_W*Xc2BEn? z2GE@eIiNDuB7q^o`(G;T{70BLXs-#{eGWvO-v!o>D8E5>2f^F~ssosaIll|p3@q*- z>ijNbGeCP@(ELKw*;~kFfcCtgn?daTI62Vp0PT4}H-nh-yO7-h+Vg^L1~KP%A)5i( z^MY;$F=uZfn*rMMf^G&eYk`r?0PT4}H-nh9z{qBR_Pn5*LCl#~$Yy}{yr7#w%=s6{ zW`Op*pqoL=dSYZVKzm-$%^>Fd3uH4u=Xar-LCjfX$Yy}f??N|&n6t=`%>bR>g>D8h z>$Q;00G;23ZU!;ywUEsKo!^CS1~Gg5k<9?@Cqy@cm_7c;W>9iJ4y^p3)R!Y_&p)ym*xW(P{W!>GU>S>JBxcV) zvKd&$;uwk9^N(x>ma#ZSV(wH&HUrC893v6yDH)K>z%mxcNW^+d6f=;=;(8jEg3o?} zjm0?-zo#3V&Ou{w$Yzk(Cd6t6iEToxW{}t>#A*hKZ9=SOkk}@~Y6gjILab(x)+WR` zCI{M230p(Q#({HBgG*)+QJcdt_g7-vzXrXB=?tX2C$uhv0d(&Q=uVsq-v3i!=ikkM z)GchFJUjzhw}8$V1*w|>u3Hir=0N6G!fQcw0n+%~1nB$%29ZVclmLi!4Dv#NS zDF?y&k;-&*Gl(e%kB&RboL3My>= z8KAquW;84X?~^B|Zoy^-sdWoBGf1slu$e(>-Ga>wQtK9MW{_I9U^9c%x&@mVq}45m z`^J#d2Z`ei@cYJ)%^+>O0q=cduz4r89-Q+|A<4+cG{UBvFle;(0|tMPg@!i89?ekc>j-so&UB6Qpa(C`Wt(ob=(1{x;@}J zu94vjQvc}%#4aXc&VM_C)PFhx>LX2P1fSP(0JJa8`@cVUE@?s{!-fWg9iaZxi-v^^ zJ0Np_g!aWTY(VNif&8||`+pSZ{I?eki3}kB)IjQ576r&&Y;W+{Ee(wfAish3goE^K zf%u8wT-ct57KR#7m{=q*Sa|>Qf}Q^c69?6CNalg+T6SXYe*x=9s%z2BAm+{#WHYe2 zgP3^=WHUf@ExJ1*h^QBk%>dQ4=w=Wz$AD}GsIEmfqku$rfa+RwGb%_l160?do6$g` z8KAlr-HaX*%>dQ4=w=YJJ_I>TL3J&<8N{p)K{f+)k081kp!Fey+8)Se=s?REX#NA| z7h?MP$Ywywi$(@yGtQ70rY2B#ylGg-u%}@uLk-eg2MO~O;Ib9n3{cyHl)f=2Owr9C zwe5k;3{u-3*vufc?Sah}HVK_Q2*B z(%K%_-9h492i9~-;#>z-Gf154z-k6*a~+HfHz0fW7%pI*Ndp^i;Iv@SBVx}U+F1%{ z?JsJb-vm0B7IYTR1n>W$j-a;5ghYl2NE-}%es%=34F)^s34HcTLn1>=LnFfsNW019 zA=+3&0CcPYWNw7_|G-S>`Pm?|8bEd+&d+v&wSPe7Hh|ZAHZp_|+5U-WXaS#L0~%`( z@c!orYyZH+LG2EZ8=&Ta%5!F7%5$)Or1lTG8N}Rcj%)@Ncd!#PUV&@|sQrWH4t8S3 zZIR6YwSPcnfX;sco!tUDZv@h(eaPSdY2Olc|1~x=&@Q}fSLNh@3a1(!* zH&JIu5ja2FxhORSwn+@5*Mty2%fHZlV+<7&8X0OPEM#byaFC&8!b9+UPDMi_Lk%|pahFmX`6K{5}Ne~Fs^0qaM~zaTSe8Ww`jJ8MB|OA+4=Vq}1>&1Xo!EZ1S@ z@-bduP{C2IgU;o1!=FlE=>zrrncvWK!csAzk)>wBLY9UJ2U%JsJY?x;NMxyKXk;NW zov^q-)i-$m_m2d{;e8ZhMiy{7@nF=~L@no8 zpnDC$?(p#b@7?IZ!1w}cRtLxqhbD#(kaS`LJ^zITWG>9@F2to17SLWp&{}^`InUw! z&jz~wA1=-Ubu-jFP&xsf(MRa~7l?jDIsy9w$qe=%=x<>j5^>p3{v@tcK)tMrUwJ_5~x`{kbD8VAI%c17j$OsgcJtQ zUK!9iUM0lk3-CF+pm}#tzL4<#X8~*ffX;daiG#{dB=bP|f*mx+N@%|WSU)0PfX_yS zx(RFsF>@TqW?*p#QTLc2n*nP7p!o%q#~BIr?~%;_wSUmfAm$uSWHSVy=OrSA2T^qr zvKgT9ACNmh=huPG-v!M(gWF*z6d5w0?Vke;XBZf2PBJf>;K(4-n8U!);KRV;*TA9( zDubbJK-UlI+mm}Ucb-iK3NX&~sI&asRq|C#Xyz?f!L3^z%c}?q7G_ zigf?_1d#cN``1lc!D$e3|M~>z-7L`iK?sgngYGDv0B!Smc>gnjm47gC(7p+zJ5WI7 z4N?0y!1@to7U*nxIh)%^+s~2C^BT{Tt|J5VL;+*$mMB4Ky=|zJDDS9-#djXl4+7|2oVJ(Ebf{Gl$Yy}*c@pYZtY(1fdE)C=?0x~&^CYxcu(|_O&y%oE6ssAa zG5i9e&&tK_7tk1f1@ZF$SlvP57(P}rNF2k*Y6gj8_*l&#aSR`;86=M3V>N@cF?{TC zOX_|FYiE}x2FN-S zMu`cHj4~4zGAc|s$fz>mAtR{nlxS#Vl!5k@35}CJX-H%QsaNp+Zv!3wVt4`R=d(iQ zup#GFyn(1=cmZmoHY75~7gP8s`*dI`LfZELHei5*^&rn2yUqEeU zG&5LuNHhb~W=1oELxe;#Ky79;Ggyf^b00Z8Ky79;GdL7TbO)%-3`+Yl4GS4wG%RJ9 z0&9zO9Ar2E9b?2lCX~o1(R`3mrU5CGpmxg%s2jH6O;?aI1KkavHp>MH^n=yT%hV3y#Jd)%YPoE`41lG z{0EN@R2^uZf}tUi$ETr@2R#4b{a+1jo{R@N{{eP~hxdOY===xRtQnBcyT8j@F=jHJJrwlFs;o>Z)<`G+VL-a$-U65Zv;R$sU$P5l5 z&TmCA1MH6GgFH12jRGtbjSSGa5H`>nJ<$Duu)7FB>cRUw8WI_5EE*X+y#K36g2n}r=0QOD1GG*N ztk(O#ej>R<%C4g*)-ri zNXYtfh_DZI?-{y%1kbjd0J;+mat0BSeW3dz@V9*?Br?FxK=Wu=$WQ{Q8<{p(9AIF; zSGP?7tpNbp2Tmu<6B>FL7-~AP*Q21a%(01q2NHiQ5+Hg)B7;jqBZEf`vx0*|1M{1P zM23KdMg|v|7H*FE!%8BP4>Ghg)NwQDFf%YaG%<8o)N%Z?n9tGR{ZG;qlunY5GBAMB zTEb!m1|1d#28Skw6pLi${}%H(TD_fuui%90F#5_Si!0Bqf}fK=X$?nh!E`G%sX`XlP`B?u#Ym z%wvWf&^nqxTZsW?4`^K$+#ZV-=KuKohI+m-$#x|m`^ln(;~x#}N(5-yAG7TuK@iGSq&6Kpx$Z40S!NfI}GwT!Y?Sm zIldq>FC8tApy6|10waS5s4kt*$PhCDbPr@ALxKk*H+by;s61{+WPsf@H3wgQZeV19 z-c!Ngfa*rrm=Hq(gEAgB7MB#I78T_eLEQ;*ALjjA{~I9VKMXS_G%|qpy3Rl<`&Zy| zAIOj3{jH4*bG-j+rGnyPLLx(q1H2w%1D*E}16>~ns86w6gkj((C z??89Q1tRuMAe#YN-+^w%9TMFETHk?g#tRb70IlypH{%D1W`NqwATvO1x(E{6bkICP zN?V0_2Phpw%QRS<4zwN#Ic6o&aEy`IwgM>b(9Hv_j|QFb<08w(s8Dm<31l8e&2uM_hUbjL-A|MV zE-%o{1&xV;<`a?KDFO|9LTwss?gWjIp_?Z_fq9@YGj#J{tz@P ztDm9kFH!cNfcI^H+nAs}87Bw6yaBD3!Fve2|0|sZ)t9LCGCO*`3{nfKKauKXLGT$B zSn6f4TJQgIUqR)W2Ln5-Ue*BFSc5@h&fvV*$hyH* zts5B{9x_1dG6s*D;|_X|dW?a{yZRWgnF-p*gk&bDeq?~wj|{}tkJ!uw&0C?HD*$z` z2yyc`Slx?MpM$~x>|P0|xiS=(D}WldU~?6q=BiL&t_T)$HK69|P++bE7IO`t=9*Ao zt_&7)EuiMwP++bC7IPh-=DLtzE~)JjGV&kJb_po|L)s+_zyE^kz(j@+=vWZ^PHxQo zQn2<2hXaEy5$zFBTZGWy561ah|1Lnr4H!KpG&1^3SjZSK;UHtkgolg~4T+2%4ULQe z-v6ZnL2ZHwiHs7Ebs#)b8X6fv^X;HHI?#Fukh+kDg^UsnOBoPl4tNZQaSFb%AyB&{ zp_zdpVF?4nghmDjaJdPw7u`G-NWX?8^FZS_pmUkAxsQVk^8z4q0pM^!cOMTK=7GlF zVxZxSZk_-c<|RPpMzFe1gbedCAagrd&4b>5PEve;<`+tE_*aGu_f;v_sNwJTDya>(@pnf+g_JP(xQs6&M1&jNPq}T`AX9Tei z(uM@JBUu`jGBBJ_WVirr7ZBLz2`)2zpmjD(Kg$V4h8q;<=QyFr@PGpSJSP+xUQnQ4 z;DjQ>2MY9yoKR%=L4kgW6N-!s6zG>Zp~whpmyi>G3MUj9VeJO|`WYE5Amh7?2B`fg z7U(D?2Y#s3o~FfxGJpB)n#8G4{&KA^KhKw}y`-v4=J zL3JWX9J)RXdR7o4=n#m5mZ-$`avK!Oh{w^ zt!;tMgE4^22hBqzge(!Ts!3MRYiMK$30W#(QIqzspyr6C9%xQ#LJ9+TttG{Sh=MeSqfYv5o&vSjaG8!a-0Q9yYcJo(Iq& z5N{FScxz7wXg$y1Z3~#`D;z50G z9cJ+QN91%B)WvCzp_=0#-FG8hViQ zfPYPgn=O;9ikU9j>phJAdkC{Fdi>pkpNzkUBe7ITOtRck2A#LK4%00eW10>AblIW|Fac>`hgP? z!E2a7>%15|7#KnGCKb?n3N)_@QVUzh3}WXrEQH+`%20rBj1M$t3HBE_EJ&(%K#WLlqKer;#r#r3IveK_ve7t&w$%3khK|WAnAapGqF=ZdK(%UV0sqd zOFN)-m7p*Jjh{lxA<)|FlnJ1<-;lTqX-HyLKufzN4UG&dAZhnA_>4ECvWL%6P1=J_;{`Vd{Hi)C` znBe{I&swP8R)FmSm-S3HEE*V?3FH${JBgfjmjl?IMh56UEanJ{hYTK|euBjT24;fo z2*P~;6T)kNeDV`h9LrLR64Q~3G*I}1+W%5oc?mx(a(lM6!1FQA^_vmCcin*2o50Kf>zS|F3b#29H5&)%z3=X?f|U=LNkN)1Bvbc ztph?cgOk*F0j&ch2G6TEGJwZN92!{B(gsoMk;t%{1#}+? z@_J!#`i8DoPG|t_^*YGlB6EzPqh_g*i1+_wPAaTPhS>pX`(oH(v6Ml?`+w3xa_vD{ zcN_v;TLoIL6wz>y!9|vhp#!o`n1R&wDWLQKTeAf-7qngp-CPgox)&cvf0=OyfqD*` zxuEq*=;j7M%_a5>L2TxN)+?c#8v!*phFJF^tu2SeBj`*AZ1Je!{XgL*72^@KehJxQW3EkWbsJS^5n5)w8kOAG?0;stq#F~pGyg~P%M}Wr6WR@~?K>Hcs zy#y953>Em=DHOy7Xq*u==1b2tVByuLHVU6so2MjL498k2DKljDE>Y$fsw^yLLy7VghrN_2@6>gCLCl* zX-H&AXlP_f0qwc-V7PV?+$Kw8iGYlYF@f(i#1}^mj4aT-Xe?-Z(cpcK90mg%{_smJ zamz_eF9wZ+d8UDx!6ii)8|XmpC)EB0_2dOQJU;dWpSwZ*Gq8Hl9<_g;4}#jJ zpm8NcABG)tCru2r4+9!60+mtlHgLm2h6SK@um{7{y`V6|-41^L6jWb&FtFVL-`$YR zPy(_Gevj|p2jKY+P`hzL3ivz#kUgZdgG-?8Ufaa|f1oFc&drHiFuYFf*{UgSk9Nj9XYcm`-g+<{O~AfZBFsUIWdCuryDry>6hn zQBdB3wTnui?Jb6egA5U%bC+eFGkDZIv(SUoQAFLxf!r1a#|!vurbY(j_Js$iEo!lp zfyMiOL?s1v8oIkd`_mBa2JKIK#sFJ$wgYqq1);VaQe6#mJ5K|4x663{58q2gw}bYq zp}PGTg9T(xjggo=Vd!B2+Ovjko(%=&f%dGSn)i&Pds?uiGtjwD=w`Z*lGZ?Het_Ch z4WPNm#|#XO?R41-2W{8<0p%ZPyXM?SP@M;w`+}}HC!$>g+ndh5hwvDrUuubSeqLT` za!F=>9{$D+bp1KD^9Mk48V!vM(0MGTHTc>C&^cbv7$9gbYz}DN1CoB26)c`Iuz*B zm_T(mbUslG+dK&B*f=Z<86GgmXC+mZq&gNAC053luthXgJg)FsOwj+yBc*W?&3SX0w|CI;Sy_QKO-e(ZKuPt4dJYWK15)eQ1e$9C>$k92$Z*5^|36dEcsghf*`bL6 zG(PgBVIiYQ!$U>~i-Qa|Kx4-q3}QY!3zo2T=P;hnazILL$Qt zhXw}FotQsDQUt7O5|u<6k{LW|8kIyQq%bUKNM!f{I%5W=*0JIL4RHPh_n(-~STr#3 z;VUmEfaU^0`5CO9s5y8J4+e%6U^^NaWS0e*7Z-Mi| z0*m`xc-Mr2`eYLpg4RYs9=z}&gfaerF7>?frl^r1e!pcri zy#t-kit+yU5PJR_1E}8tG9v*z7x~}!B@uImYjF18;d|HpQcFO!bZVX>M&*O>KhE=k zVD+^3zbBT^FmOTi!@+%G7ib*<8nXt~&n}>H6V(0y)vFB)87e#&j)B+Xf!4i1%>b=M z1Ev2ANLs_c9sybhgX(6`c}h6W0D`TSqS<8Vy+3K>R>>&je`C8(7a`28PB~P(C5tzXhe637|8QK^ddU0VW$+#wP})H&bHHl7|J{Mk|FVG2;scpw1Im|(w$oYU`CpKI zAbrsAC+d7A8&DYlX*-=op8o}j!^WGS=7I77=o|<__tJsKifj;VC-9meBr}*V5IODz zGXsk|xK5C025j65$sJt8p3ekx2W;F6G%ikuGmV)3fZ8F@aUSSeZYI#0Z{#?p(Krti z=q_92aT#zJK<5ZS<6JH>OBtbeoic&vA@JoDa>qQ7##UhVgXRyh+HcXqpg<=#fY#vR zas%G=q~wMJ()^VTw7m|RhlHNTz~}*)-(-Z&Z!!|Q{~nZ%AnUN{I~D>?%Z?3yL2KSX zV<8^i|1R}{>JOx~*hGwl!0I{H6FAqn!P^nx8Tp{L6{0%BV1eof-1XZ&NI6aI`b`%{ z{RTQZ5_FCcaaA+eFHrX{n7{~LgNm}IydjaH0dyv)#X`_t)4kw21KQrGfV7DS*45DS zq8SoU$5N2yr*NHziR_nv)S}$X;^NHwykhj$2Gso+?TZNq!R>d@+P@SJhP|rbbb|Bj zM!0)yaHa`l_xR?gz}l1``w`7$+JU8O}h$41YTk zvL~DYr2c~UzZ*+I^)_fw(@!M|ce^C>|$( z`htlJ3n1~k2fR;dLL&G~P>{J-8Wu9lfQ*q6Sev?#VFF^T2keeH-v6#-dN8no*1FAU zNM=w0`2(^3>?rL1JCNH!<4hp?ra;4o(AdqKh86}Dke?yz&yIlCLpOlV$%Kf5>U|{h zKB2WTFv zfcX2`u(|_u*IEVf_qAa)gT%Ymu$lq7YptQ-AwvsMX_S#+2V`83VFTv4Agumoufcie zHlqGcEXhbM^2yB01~q^{^*6TpE7gCW#P4hUcm6FjtdRC| zFoM<^fW{)Q?rQ~&Yj`kh#uh%HG9NT<8sq)%j3_94M)$N5HRcc9`-kfsGvqz3n`%Mn z5~&}BXHP4v|HPz0)Y!CVUP)?ET4FMeb#kEmhm`&>$6vv79H2F23^(xg)1mEI$Q<%Q zh8#${mB9kvI4W|U!Yor@{$!ZIAPkw|Ey*a#FOSd5FUia;fbH_b=YG&0KZ|;<8{U5* zZEH}TfX)qMSj^{o-6ve+ACNMHZ zOh{zPn9#_S(~!uN(a^}0^sur~mUfzuf=Yc83fVZnrUM*%#&9AHo(6b^2IE`E># z7?yru5pABTb;)un5ZUKw?+#>k)8pHOEg3>b5JP~N07--M918A>#^AZM7y;TEo z3;wi~Py-(O2kC7fMtyP{0|R_K3}wGL;}v{!n4t9%D0{^l|9`-_4wwa&rWtz}gtH)- zzo4WrC%z~(9x3mGVh|L6*v5aL;}4+wZ&E;g)rLlf6i|AbkOJO|4_c#^GNBc`rxzp- z>Z8Sg)HEz&*6?6h3t3A_c)TKqfg9?k_~KNgY8~V>FowDh>-^`0hYT~I^OQZ_{|@g2 z?O%oRCwTump$Up(v^i1OxzgC`a8Ml$@>h?=LD0Qe|6YRDVmCB0M1aN-JQ&u1$B#he z7Dyb_ege%sdoZl21m#mudIZg7K+_axUox!z0?i4+>mwX(pDPTw=6t~M1}=a=yR=h_ zivvqjiz?%D6HAgapydy7^$)krfYm=zkR%AHf50BfP0UHlFUn0#fyD3c4HFnyA|@oV zWK3ve$(gW_rJx~^C8ME{1yP@X<`~Z~Fw~sHe%BSKOqkHf;9;?lA;2P$!N-GPwIL{8 zK=IX)$lwA>3yw{owglANg$%H9{1y1>DOkKh?u=#00Il2h{{OGng8?)j4mJz4-pj}P z-^rg1j4aTyl?APAh2=+vJ2>yp0S60aJSP{WCYHbk>%chzm4JjF>is#0HvfU8pl|`T z#i8f^fa(w#4~A8?ps<0d1Epi{eCXYz5ukNFpu3nBGR(0! z$PnTE|L4*M(7lF@3>ly`BOVMZ!1LvxJP8sQ{l(LwAC_95{9eB??INTdSdx{pp>MhV2RPcEx z)O-(1pG+nUxYktQ$oHW12}+I7^oO#3ry+^iWkoWBkoVv9oS^&#%3Gi{ui!PV;B!I2 zXM2FoU;_1r9H4Cw-&r?ioiK`Qd*Lk6Yri{l9QR28lPF5SW*HnkU;K3sz0%| zSsNM|U~N0l{bC;Y>I+cX_Fz~FFHbrW89Wem4?_jmEYKZg;4wjheH>W5CE~%b6gmc#ycMl%EuEL!DBnnc`pVFi~Zb<`1}FMPvA9xAU6}+&w|gF;qGTK zCg42F041K%A@K!DM0hYL{;-XILF+c6+YgXn_Zt!4FU5HW94s#}EFjMR z8JWc;i76>~{0@?$vj4&5GtK>vYi}Y-{Db_TnU{&JQvmWf6odSalz%~IQiIPx1g(*5 ze#9KnP!B#!%mI9FBeLj+RU2eEG< z19VP>VA+RqCJmnQ%aR0=r+b`4Dr&ggS6PzhFWg_`FD@u`a@66%*z$fcnSKwWOf4)VNzL z?sHGTmzI)`Fff4o+DXhY9t`ur`x21b=gkNI|G)?nCU_b11n1Z$N**f)?UjLt6*Nns zP@w#UK0e^VFdx!?z}dft*U37>)yYMvDMg9pC>BFG*zKS96r9$Gv0oEMyBZ}Nic+zU zK448hpf*B6^C4y)&>3|T8X0OPEM#by0J;x0k)Z}ukHF6_1f6Br4BpcNT6+wwLkXuB z(7Kh7WC5$1{Stbhz6WGHl%d7q9yi`QW1;7Hk#a5}XpJ*eJ^u0sI!^=|=V~EloC~@q z3N)Vt(gRvM7yvCpzu-&vC}Uh$(>QFdjIo1(ADZuT^3&1BwV=rdod2=44?y!{ur`AC zzpZ~k`5zQ_kUkE>32-?MS*HT32SEAV0aT`e#hV#eKz$;|Ch+-XuzVeXZ+r#R7X+0p z;PYl18A_n~LE!__PiWl;$bQh83{ZGFG%R9H@nD$43d#o_4B&pL3!*IiLLWbWmXm3sfW;nm(hFlZbO zJ$ym_EAe2M4LSb+XL}0f2ZjRt^M)`#q?V<^COwF7KQwLRc>mk{5XtSx;|-uaNud5o z1~grO(}=|aKSl3<8+1W&0UCF~9S6+Ny&wz)ILkgWMVW2!DVwILj>qv zU{Lz9X=q@uX!-x&LJ?(sxkCd3yi8WWd4Eq(YH@yPQF5wJW^QIlyr-X=r=Mp?BvNQ$ zGC}bVs$cQctr-^cxi5JCe{vJ#KIHJgsJ|HDVd8>wpJ#byp0QDUIG6-=GF>ZDlS@ky zlX9>Rl7ZaT{D@f~`7r|nntcuoj0~VS5MdC6j8B%O7J=62fdU-vQJDWg?T5(=|9^q| z^ANL0^CM;n(3nZ{LWT^``LW5185k@UFfe=nT@3D9gU0zmeXoSY3=BFf;5iN+i)037 zkRDL_>VTYc>tK=mf4>GZgScZOg9y0XuanTL$zWdQ*TA9R!N3AKqdUW5J_C#Q-+cETA*NLGlXTe`mt`qEL5;crY+O0Qt#cK7)q$-+O7??rh zP9Sqky#LMskI^BiVf0{N4)I`M2A8cC^BF9>|IPr%2a*~l4+dsX-3Kzm#{2IK@cGFDvV z;K2ZzV`KoiA;bIc^g=Xu%6c#`X?QR&f!gsPH96jYr~9I*VfJ8PV)0;L1g+f!sVVXP zI~_g#xjh&dVewz%{dYQg{PTD)FoMqC0_kt?{yPnR7A`b>2zoFuF7RMr1kLAw)O2|N zopuz>9jqPw9gzQKg0X)v{p3zLLLl^puHj>`32s8 zr-A3Fko1dsFfhXMzzXlb(_GQ?gZ5be@n8U-PYE((gZJNQ;4{pT%nS2)l9q+$W!DCiP@{*u^ zZJ<5+7773Vqm@m*I`Ka+k@}2 zZ)Au;P5)ZM|d$hK6JYfrb_a2GHK>niPou3q_PMNaVWJhCvuSAevN^n3tRZ z?uaH9VXv7$zGq+n`yE<;PguwRnzsPWqk`^W0F^(W_1_@22xff_uPY50#Gw8|n&JgD z+dwuz!xwA&Y{El^iiwO2H4_yX8YVh|?iypr0JU{M^JEr@3^^9b3@o7fDkP1;YQjMV za2?XHkRivSfrY{Q?`&{+2CCCR?Pl~eg4*8XfTjzE8U`+K_@ovUz1H>-yUB!+~V7m+m*yR8n>j#aAWPs8Z$X|{P|H1hYdXuHQZtOkuiip0vztpbeWS`ToO-cY7P`Vu>KQ#e*!3PdjJ3D z3#R{0YXp^FP&eSnhcGuVSTIN+rPD(2G&Vsupr>Duzd`W|S}S7F!oUoQd+)zf!SyCc z4m@T8x{o~tl6FD;EvWl&%pbtr7r`Kk5k~1n`B;Y~z+nR-K<)#zG2!jPN6b2~_MOFi zMiuYB{ouXDNaZT%JbQ3FTg+$F@c!F>7Zip_@{Aq~jNtJii}{Q?-hcbi%YP;h28K7F zd}1-5(ZKs}KYIIz*@J=M3{>94`)@yZZ5)#MEFKIDptXz{7V{Y`y#Mxt_xK>mgXT1Q zp!#jR|Mr8&dXVJV5OoiugZJNl@L9e{^6VZA;JF5n`7Yjn`_TOl%0n>!dwBotL-#)? zsNS(iVBiAPJ;-Srt^MxUzzB;w#u5eraNOk=#3$#cq$27YSp2}+??~&DKzAh=G#>)T z*NO>^3~MGVWY_>oE1-E`&{!^XJY@}NJhx#n14|8yhJ#}R1Bdtjzqt*dy8xRRK>gPg zP<;f7b8wyp)gz4zpfxez_OeVeg9YdunVMuJ5pX#Hi6gu`h?UP}Ew-=(=3JnrfvznDRyrsjnn)U7Pue|x~`AH1$=2?GOYy)x`%Y)({ zG-d$mD^6%+NN{Wd)i*4lbqyZS_y(mZ&{}QK`9LfV4WRWb;QLZQ>44Rt5q#zi%v~G} zM;I6yo`BtU!2AFApB@Y>pmBUq8sY)LNfS_BG7q7D<-5cfZ8))J)nHz z{dXd`T(C&~{~x4&LJ9+DJY@~Y%{9yhpnL{O?=bs$Eaou@c>n)y>cPMaDw{y=gs5*} z0FQTo>QA&Z2GV2T{r@|tKNtZmlaTEPw|8M-4jPY}(8v%1THosZcPhBw33HbR1A_pF z4bDp`3>uKNKk#q|g%xOA&I6QAK=G%+!oWJAk)gt|kwF4aTfqBM`w8d?FaY6K<(g_^S`RrW90O=`b@WLB~2l`e2p(Zk)x`~TOy z9t=z(9t=#NJ-`kKcZ13k@ZFi9y+AOx_jv#91NTGmyL}3{e+G6lDDFXb%_M`@U4|gJ z7hDdJ;a*-32F4WddXYv3boUydg>{Gb-(E;KrZ9l+00qsvpoF#e-$~$pGpIjsLzw|o zj$jGfUT`@?x?8^_g8GEuIvLZgpnVv~VGHWdt!Q4%zylg<^8VWk9@hYs(;CbSjF2^I z3>z%wF%@|K{{pHIH2KahZ_8JC$a6JuehY~lx4QgM(>ThT}3$)Jz)Xsv>^@7%m zSu`-%djIVO_e(%^2dKUU^&3HRmlpGxTD<>%`s%^J_@e=KM;@q5YGiPjkpiCELvEAz zOh^IG*>zYnFz9*z?Oh0Jqk-}n$nT*0!8KSJ7$z(P--V|E)eo8n1?dB&9k^K&5*a$6 z<;4Vx`AieM|9>j_IaZRL0;lR}wmY(E*BUkXepR z;IRfUe?}sM3us>7`)|K4$S*3M){b zDgji-r!auVH;~0ZXOMx!Kx?rkbSz|Wv6#;^$NT?B(E3Qwxn~`qvK|x$AU7f0&<8%R z4CDrfrvIQb7hqurY8!&eBT!iF@c#eN6*Pv?e2}51c^?Cd#e7B?NV;zU>j&T6bp)f% z2c1y`Dhqoo>KQ=y?682s68Wqmoa?5UVSQ?*6b3=$bXt&DRE)hB4{Be6`|!~53-Fr4 z1n}G~$PEz|2@K4jJ_x8C=>4}7JRSs!Yp|OZGDJ*hW#DMQIgbfz-!gVMoiw4jg8(rYF0U&>a z(j_Qgg8J1UyP#=&4)jdq2=D)Y1VQNnD30jMg z0qciD&13|*9W*}V!2oF=f$Rj8jnK5{0CFQ#9+cMRfYK&NjYHFakbhjf|F(nE7idfX zlnv!oX3}YM=)?qZYhx_aH+~!!rhs zhGPs2jcg1YHOC$Fpl86dG&VD+;M?B-8=D2+8@8B%pCQTJeA0G*wLFzYA-XpeDD!*T|WhUW|n4bK@kK<=qoY9&(BVkAPqkI4HA z;A0!8X$ExPENmQ<@dxVo26zWSd{Jr|xSYU6;7UJ4q@4z|v;)qo4T~ADr=7zL8V!#b zbU^+mkWN5(77>Q9bh4O11EiNgn1RRUQQ}fXXWa>Bs9yZ(0Mrjdw|89!arT1RVW9C! z@E9R<&I7b|3)G%Nm}$P~Q+VmI`tgw7(zGkj%gX>Z^PIZ2PYhc?W`f2C zkm_w6csRB&Xn?~JGM*2b&kOPX|I-#U76&?`6s#9Ct^o-P7KpnUB|zg|kop01ch6s4 zsCrNx8{+-{H&{QYT>=UVSU7kvfa`2{o4TP95!a3l|0FCg-rAHFf6k>SpSg$$rMQ}DUO-hUer^N|ebY22dUW ztpP}BXk>U$!>qvI&%gjkNDlP#}^x(*WpzxWZh`N6Xw0@`|kpa}k1dXqP=AA%n z2@PfjP<(^#(go!~ALux-04QxYG&1;r=YK%^fA;Z|7!-1O@rFC$m7V^UZ;KFf%YY zG=aw5!Qvbf5?MSf7BK&xun;un1{MRWg^W?LfcE)%cra9e+k_JmSwMb~Xh>x7XjsS+ z06I&+`~TmQAn}Go7I6C#QXVke@%~#2jvr9o0>ulc9ct0Y;9`*ozHgAr`)@P2f7j5+ z(g2ccfXX4pRBFKeV^H}79Rm{a{#yec{{V@3Fo4cOWdQBJgZU3s-tbr?_$hiYFvKAF z8$36r!OXx6p8rZ@sc2|qscBfq(%}97pDxIKNaY!5-x;WH2bz}_fttYqb0f$f4U8<% zy#p+0XKlgK7Gnhi54cOC0Bz;k5a zJvpF#HVYXV8kRCJc>n*Kij1`mcD$XG1sjJjmdoJ%D*UxUhBP#y&J zrIErM?jOg7|DZhsaCaioCwQ+}1!ykCgCPgJ)&ocS1dZ!efYTt%PYK{U2DDEZngxgX)B^(F{1@|POS-a&p|eLO%UjwBk#Wz;Q0hleBy5J z!TL1}0Ssbj?m?PW2HB5PK47FDkR9OmRU&wAR*l6%1|RSLe|xcq9V4jj0p%Ug8UP=p zGzOZJ0L5)h189E(Xurro1{ZK1UTUD{{r~G+XgUail$8viv zV-JiVvq1g^x2F)}5g@xNEao%4fu(2Yy5b5@nPf4aS-^v#44fB0YdxU(otX4ez#xk; zRsmYM8DCJ8pPY(v+XQ9-0E)jUivMx$54Knc+N=NjE{^yD&4WzvU?>8Q&4c_5ZVNOr zcp$|c=xkYV*$?t3v~7zNcb^}E!VuJ+bZ7#fCyu3@tq0c!ptwUX*Fj^?pgu2Xe<-M| z0QCvLaYsbC3l0AO0`U*`i(|uo(EeADUp&13|3Qv_P@V^gPw-&K0I%5qr44BN3Dmv> z<$ZYBjlF%uSivBQH6Ae|4M_wVf2iw6{+2-IbqJ4p>M(GoB$gz`rxm59BAJR{g3A`9 z^;4j8D<(Vy&uv5clnWVBKzH8MG;26O?jbRN-$R1ArV4%*l?!y9BEKNMG}Fu^KD7{G zB?^lY`$6}h;BkWonj7-4g#h{XoBzXOH@g4Rac#pR-+q1YJurCOfbM^kd#z!SK#Bc$ z>_+#04)y(SPOAU0u5d^9KdAl$-NRMWtbiw-!`jpgI>>3v*a$P76JtL1bPTt{0L>1R zbWGTMZ0QtkHoE&U(kWr{aiv4J9q8^yNr%LkkD1QkW}~|wBb^a8A6Ghp+kx(Wlyn3$ z|Arz%%ne6|loN^!F((`uQvNgwFu?9>LUq5ALjwaNYXu|&>OjZZ@(bcql5#MU4}5(q zKJzit4~iWIsCJ+vA0o_0Pd_MTqq!d=`QSC*=csWL5n+Vpew5^c*L;ZC`e@}eKKElJ zAH3%K93jX3D9Hyleu}Za7&<>76OzpK4b-24&Y|Ui&Xe^1TMk}N0Bz5L+MQ7GG}t^O zXw1h!rOS*-M7XU2)oqZxK%V?gjf`&(q_uowLz8+{F%AqDjA`sMfc4z>PM}zti;5{h~$)L6I@O%#%U(RVb$N*Zy z2tG%nCfP{D`)?L>>=V4M9yGRwMNJMYo4n{5W(R8Z>W*T#i{ZA7sdBe#lS&+EeKLHyu2lntY6b0kj7Yv_=TD{?z+#CU{*B zDC|J%1km(=*B4^y$##U5JE-w%kCJ~0?EQz$e?iN^Vyym#RNt8UPe6TS)cRh*p@9M3 zmXJXW(;|H72R+Y;K7gx-nR@58>I3-4?OMz5(oKT1F8HcFMTJMz}h#+^O`df zLF3pA2{RHI5;_tYVmcZb5^9Gq?yhfv}d&41}+gde0VC*FUk?ID=IU^MCeLvJtP^Ir}b{v+7lMvFhx_7corFd9_; zfc*$vKZcY}L36Pz-hVS8#m{V$*{3~kT`f;68BgsJpaZph=9jRq3bU} z=j+5L=D|5EcmxtP@f|w-ahEvy1oN z81S4qnp$?KT2Ng9Rm?5oY2&AK-Gfwy%vD>4K*xbfUM)64_e26;w)%=7^o~n zu4nL!iHo4_uL6f_acWUnW-_)x8$|Ge+s~lzMXG;rjZuTv!qtH0&5^>o0<;&*Vm_mU z_uuHLpt=Jz4hnKNXb%B+J`!|3NeTm~j0LIXv6#>77Jg4AA*TkollB zJRYERcOW-F`vwgSjSLkHOBi@8<}>+t|3B^t+Di-aiw6S(XpFX^`7me=D04vaVbFX@ z6nOt{@=*o`ke^|D>>ZmJG%V&bM|l5@0^5t+W&qg*s#~CYUmQSu=(%%Dpf(M3JQTD( z0<>oXG`3y?N+&RXdH+oXr#p22djE|Fw`-x|;JgSv7ZNnL1Mw45+B#N9_>2=+er4jp zl3xpuPk{iJ9Z2J!pzy*|_QL9K&>SkZ^$DQ$fuQ*{ME(ZNr$h2+iud10aC;0CZVpWh zpfxNx(DcYMA%y`nx7*|WHx4Bog68F*eL)t;+18+a3kl%$)S&VJvbKZ)oL@of%MtU` zap1WI(3m+|x^X~DH?aK6VlkgN!~6eHLDKRr!w2ZPxWuCL;&`Nj5u8gw{ZadF>Id}XpINx zY%K?e2Jqf((3m}F-%v!uL538>e9|pnP#l2lg_sF0cT>Rg3W*GGGaMWKAAro+gZHX% zfZPMsm*CI<-j5RiU9XhTaF8KEhmC>3u>rhyB%p>(0^|lz`3QFd!v33QL3V@u3_1_j zgCPK1#)9TQK;}d96lk6-1}RU0*7C$4ufxVM&yWBeF9gR2IFW*50y_bXAFTa*P+o6< zoWJA(N~a;o@bCuB#e((_F@V;DdjG%i7nJruYyP3`2dxVLo#6~}KWN?zv}PEz?+P@3 z?gI+vhDHX^-VE>@9(e6hB7;v2vxWoo-f?8J7sAX2?X$v`HnE2T!wCi<& zPHHjswQNxTW1AlXr%zBEf#$A2?P<^)6sUXv%|U_A#coJqwgIi3u}EYHfW;>?4SRV1 ziv{;JL1_kQ9S7)cdQkZd>eIzQ!wOv9O-N)&K#FV7ddCF9am}y>I+u*ok0Aen>PJ}n z1G#SoI%5d5hrRhBL&oHX3=R$T;Pc1}z-y$M7;Hdi|AERF@4q3CeKJqLbr1t&%@{)o zwCn-Rmx9h#g2g!pD2(ve`|x?99{9R1&}4XOUKwc7P<(bOyhR0a{}jdl80YUcBr+@j zrB9Gu;IIen{b^y~m;lky0i%rm_I27%i%p!A8 zsQiQ52j1s7pLv1z|9xvc7#J3S(iW&(fwjlH|AvFl;Q)m-I9?(9ia_q-LDYS*kUJki zXH0<3(udTqp!)_K5OrTTcpQp^x)0iB+9!&we8JOh&4Jc^NYx&A?HjzX1;q_$eO~h; zW)D!_1J&iwI*VsQJp*VBB2PmSvk!>f{E)#1<7^E09&H8-25HFrF~%{Cu)`|gwjvmy z^f5*8KgRuzpf;KJ-!O2#hNjgT@Y%YcGa{0eL~2sx3Tj#yr-ZafSb)y#PyqE$Kx=~% z89@F3wWY!9a6n~+V*_}PHfWuLLrn^JZNCd>PeV7`Q<8A*=$W4^SF~`VZ881;sD;OeD~`(KA5tgX&+4hI$4QsQ*Fz zq73i9u_*l^a9&MdV6<4k!07!q4BVE(Umw8M*fZ2Hu&3w57nGJHL&E`|`@H`KBkq(y zbt9;4odG%%095vS{|$xovyjfh!;BBO8xmk{D8?QB;PdPqo516??B4(X?Ij}YZNTOx zrJ|gl1M?qJ{}ptHC@2o#cZkCBiABTz|Dbj-Xp94NpQsMY|9{{$HH(-7KxO8HRtA9y ztqeS%J#iD}GuTXMWnh?458lId!u$WfoelL224H?8!wHLe1rG1OUf^>Mq2`}yz7K8( zpYZ-01YWm{+&2W30Tb#ORG@oGuJvgQkTW5Ho{dKSYr7BVE%Bx{L4&9rGixCdO9G&C^>G=R$f7SJ9h2~d5U0Ls(gwpIf8JYvwjDn8IM z19Zj>=u8Jo(3vWrwk5cJZv?d`6&M^F{yzcx4;~JGH-h*L^BD{#%x5rZSi~Fv+S3FI ztA_auG7SqEQfgWi0w&C7P??a(aHb)NIRLb#AL>VuhI$4SXnB?ao?8I<2jpImTT>)J z?Lcte0hg&Dy`X*Ni$VLm6aprI);2aWoB@q3I5vRHVcy~WHvl~TJpp7+Bg2^*771{^ z2HTy;aG_y7gALf9jSLbx%<>CBWe)iKjCux8+Y?mwT>!Za)F1Kw|2Gumw+SG9AUCBj z@POq&=WM2c_dbBy0H8Ha7r<@q`3x#GEm|TC`xz8!mhu(UEM=Sm@;lhR1_n^O6x6Q| zfwoyd{Si=G{sL&NE9ktShI$4CP`osN&5;NMwR1u1a2*;M6dL9;DAY77Ujy+W>J+bm z+R;d6f#Nj)9M?-2IBJ+RKyKRraxbV|32ifh%K9ltdO&B}O#$fv?Xdu-r6mj;5c{=6 zK<74s-QEaxJ4i3+EHF^J6y$bLn{EauJ|{FY@PPI(O#rnMn;Ce(@d4VS2)YlcosT+5*K%0n{##*`RYu3c&dWROd88+60b`;PW*=YO&<`pRTy_ zJgCnIb}K0Ff#RZxK?St83hHmr-V_z@|36tF?GtF50(2)7XBat>T(rGVEEL(Zv!xB)Z<2uees@=d|}|BpyCd%^Oc@(rAJK;`8^1`klV3U2p+ z${tV~s*&LWG~6Q`K9lueJw;UI9%asp<#3ZG9~zhU|L?LOI~zdfe=T8PuxR-I4;21H)Y$; zK^sR%?GvQ-18Dr)qxleXh($d^hWB4D@OUC9PC;dtLnGq~cs$mF%N`w&oI?}C4Ny4& z+V28N>pINx^BqC+(sc|h-v9s0g5*H{0f!@~kH8G7TN!M?{DTY*H7Q0Sp#0IWkO9*6 zU!o;4BNcpJDd>DwP#SZ9t{G-Otl(WPr_G!oUFTN3>{( z%t(Qm1x{0NeU1(P&w$l};udtqAjtkDS|Z;6zpVtF3j*^i%wI_LsR61V|5<|7g6eCK z87*2OpgIoZPLSOo8ti{qKBmOIpt7}|K?A$HzkUSuLB0Qf?Ib+T4eCQMegU^DD-$6X z+9Hw$m<39o=AC#6sXV1Fe4RwcU?xvQZ~DW`wS5^M~p;fEMwTy zu%98qVkrY-%@HjTuw4i-Ca9PKk~(Hk8*4@i!=8qE2C(@cw}ST`)8pjmoJdEIB483pkY1(=-eSt8_ob!pIJ08q|_`{zE;zsd99{J0@R)k z0Oc>pehnqid1)Hp^p(iq02&VgoizrUmja1-|Nqnrs+UpRjkSINrIV%hRB;ctSlxOhY{bcuos^ZU!{$Ce$;4=N7#G|E&b|?V)NNKz^Cg z%)G-QnPCrDd;w^`(kD|728Ju3c!s94BOrf(*-Z>vy#N2(IstT!3}h}3G>)nRG6$p| z)2xp#!FECJa{{%WTtICLi+KzY-hX|->s&zL25K)kHi7S%cCn}f^(Sn>YmPu+2^wRE zl*bAIFn4TRPIAQ;3yK#a)7KVg`YI?&Ed!US$OIPuVWcm@Y3sKvC=Gz)yPg3@+IoMJ zK-!u~eA;^73$_bu+VTXSD~>&FS?vYQbK_21?@dWdTkn>VkhUV=X)7r)8GLy=_Vy3B z4G1cq8tNf^UWY~o4bXX*-v8fjO97F5onwg=x;qO=Ebmp3U4(EB*y)$spIMmFO5&^Z@ELuSM*b+R34eKKy>ICK; zFn5E_(enQP_8=smzKtZ({Vm}30`webnERmZXK>y`)UV)kqb0!k4_0P1g3eR~pS70( zDnlHa7&LNx`^XDH`~P0oLh{GUub{n&6F~g}Mh3**M4ac9 zgX&*K6Y!XFUTQh$dO%Q`N5-)5MNVH0^$g%W`3?=>w4?z}E0DXfK=ZyV4f`2|13HI+Ck){Gc^@$FrRRXpX^$^TP0!57D3f4e1ER5o4_f?GfcRj4 zLHm8sb1xGb<}>(!-MW~80aOP&G%$e95C_E}XuJk=zAe1$0O$XD1|M*mhK}!m#<;xy z|4Rg$k<7pX8n1`s=NE7B=VNeuuK~w*d1e8=C1Rky4|vW7IvxT_OK9l_c8`e+19y53 zXeuo}H?au0enIcw&q!p*fVLe$X98w;|8)e@zDLlp!ODcofIf+kk?ru`yHkHVt}=?7+M&3GmGQPGcrq3iwhF*ERw?-zp$`? z!~?i&1D6jC3<{vQ0F~FEzP$JU|EwVQL*pB?ZUHoQ>;OFj7>~YxXJPuh|NjS#7vodA z5Tq6wMx@x03DXC*1L7xe8iJG^&p`cu(7s$ec?Oh@7)2O(L1RnhDe;E!<@rUZR|KJj zAGlrsg%Rki2vB(q8p{QzX;3@0p1}rtIR4!Wb1SHx@&FA%B{H}`!x2=c;L_I$(+Bn= zsvRmIcUZJAFe2jXZzxDTQhb5WV8&t(HocNCz25)-gU&w(kFj|F|8)?Y_d)e8=zQoU zpnlF%Uub!Rs3S1yT5#AJAj%>vfeUTF!SWZ#KcKtOKxF{v{Atknpy0M!%m4ofKmI8M zxf3)$0IC~6{RU9}0o7%ov2gI*LlQH1T^1w_|8az>2c<0#2A%)lV3Pd*Kd9aX>BXW4 ze0~WiO?vpa0E@(dk6h=^YfaW>C;{}cL8Calg7;xPTYLnn=!yu;*P+P?N z|6^U`G7PP}b!=b+xt*a0-kvW>Ey@K|Mp!T`|AE?P$bJB|&A@eNJ%bHu8|+nKLp=j{ zOcS(z7M!L)-N~4Fjls37QXqk9RRJg4&pP#xX(jZyE5h zB+ytHYJ@x<1LeQENa2jY}2tXRU5NN1pNC1r=f#-Fam;*rR2Gp*Ek1K)F zEUeGntR&LV!lVI8E8c%~z+=v^@e0Vegf)2G4yZo^-s98EzyQkUpng0kpM&P2EEY5G zs9B0UR`K8|==@qFH)%A~GsJ-03d;W=_jvz*2O3`l&x?8g|4<5cD`-6i%DBvfxg><8 z0s|j(3F#sS#+z->`bnFaDUX#NDvKJZyxX!e25 zspEm#2cB=$VMehJyk7{}KJWkFGyDmxnE~hDH{kYHdMbRa1}HqxF{tbTj z@@+#sta$4e+=+sBnmfdmY99Xnu#RF9P4y@y`*I-n{=B%mw)w zl)gaaDyYoz{%e4|P7ss_87I^;hI@xb@ELdl-v4j$g2LQ`fgN-n5lEcTp@CryDDQ&Kzq6=kZ~&zt@BjavTGTUmK-o9F z|NjGxzs&)S-GRn-L2F(?v|PX*^RfJ2bK4r zy$lWi|5+@MU*P@!Hfa8R2Gm`k_-F87U_0Uc|JPek9Dwq$V*^_W$S)J>AZJB-|1|-R zFM{MjdrcbZAY<;J@*LEj^Zx%c5aebE`v*pX&vZ(_j|AE%FXs|FygVq~5$9ul4e1s0H2KsSV#x)i{rV2Xt-~cx>$q14GS8>}OAd#==19 z4AegZjZJ{|SHR|=L2(P}lY`EQ(_sd$ql1lAfX2l@>$*L>|KCXUU|^o${r{D%2Lp45 z_y3nuJs6l9KyLH?|KugOF0KWQ)ha{wQY~g+ATK|G+6+?OgY~F?^k*-Fr|3^|Mn5&K2YBnlxK8U82q7m29y_^9NQRNbeb7l zptKu^c5Gq*oz(`a(?NM68k9$Lm>H5lc>z?vL+LaS?ZLnp;{E^QSq}zA(0THy9t?~g z-v8grdN43Lc>n)aie|SX*zP9qd6iC%O$-$}%nZ(sO$?wlbD+H#PeAj+kZ^q(3DOHn zQ{I0S!Fwqw57%p|pmpvL^B?U*GQSj52T^YR)uZ4u=&nv?dU=2LL3_2wnpOSqBTcmlr0^ z1QG|8qaE`Ym_cmln3oW!4cq{3_k!jaLF=F{D}wmme|5lXQN90vFZBL@M;BDCfXZ(q zH*t9Xzfua?W1+*$fP4mDg!lh1wIFwc)H^i%1g#NtfYwPe4R!Ff+MqROj1%g>duKuZ zU;web|6f`NE;Ab#7(n$Qq+DYFjT^!DW#GQ=0#^UCUt!=wStkVV&Vt%6;5~-W{mHQV zExiAK2lej=-T9}(z>8uos7Zu^LFS{iUs2je&^k%Pp^-smLOpnWZ-zw!19MHX^0f)| z3<{vS)}oFf#rywlOXB-T3@NaEJFq#h;?$Dz%#@N06vsiwA7K6mg)?gTahcWo|C5Kv zZCK1P4h9q0naD7^ic*VHVKeKzyuz-@dM25FQqi!aa2OUW-!&PdElPemQwL$uGJ z?O)LN9;i)Lft3C#y#K0#=i)&12xxxOq5-rAQw>}nf!bQ2xgf_T@cFYY-hWkML3taL z*FohU^j<8``MscfUqE{#TtMq+y#FdHg4BWR0ktnc^YkEb&^`y~SONHqO7Fia;Pa@l zmmfkqH_T`70F8e-HZk#7Br~d5%wyQ${Z|P*F9C8B zQd$Jv{i4&bpCQF!9>X5*zslhC`Jg^IcrL0Qyl>XS`>!&19Y07MR0lgWGHwCc4K@3K z_g^LOdF!CG58D6e{Z|WIeuLN+^B4|!|5XC-`v8~sjSL=8e{?|o203#$Q6Q&bA%h2K z-=Dg%7B`gh+q#;C>{?{}U1!L3uQ!VIiY~MIxwg%*f#VR~g*T z2g!r(V{QQ154wX3L?<#hc>n*ciKZSrz6Mec3UBcF11Rw?4-Q|DT@8th;5BQIxR3|m z!w51TPm=Ir$VH< z3L@3j5UH+#NOdhls_P(9T@R7!CJ?D^3X$q&5UFksk?Ix@scs38>Q)e`ZVi#@HV~<9 z3z6z}5UFktk?IZ*sqP4o>P`@;?hKLYE)c2i3X$q=5UK7Ck?I~0sqP7p>Ru43?hTRZ zJ`kzy3z6!65UK7Daq3tYh*ZZyq&f~F)$tIiPJl>tB1Ec_AX1$Sk?ItPR7Yg}#-c%_ zc{)U@Gayo(36bh7h*W1oq&f#8)wvL<&VxvGK18YuAW~fjk?JCdR2M^}x&$KCr4Xr( z$aW$Nk?lklBHM{9M79%Ih;09{5ZV4?A+r6)LS*}og~;|F3z6+V79!h!EJU{dScq)@ zu@Kq*V5d|5%A^|FII;{$nMw{l`jV`;V2#_8%*e?LSr`+kdP?w*Od(Z2z$m+5TfCvi-+O zWc!bm$o3yAk?lWLBHMqgM7IA}iERI|650M^C9?g;N@V+wmB{uVE0OI#RwCPftVFi| zScz=^u@c$-V5d|5%A^|FII;{$nMw{l`jV`;V2# z_8%*e?LSr`+kdP?w*Od(Z2z$m+5TfCvi-+OWc!bm$o3yAk?lWLBHMqgM7IA}iERI| z650M^BeMO+Mr8YsjmY*N8xXJCj(h3tEdaP{{CO>zgM=9OfY z<|=r4dNLr`3^2AvkS16PnQwxu55$4$1F7{zmIHC1atZ-O`3%mfIjKeYc?|vqC1BdI zBqImp8kbU#CZcJ9%KWqi81EG7=H?m{ zAM6?Bs-UfqmY0~D8V}N{tzf7LGFLw%KQ~oBCBHO1S3fVYB(p3vKB+V_Cq+M_G^IE{ zPrp3BC>y+ESs%P+LBF^t8N!M$Ey>K$O9q<(ibDoZC;hY(2L0sR6!5tMo=(0Bo=(25 z1`G`K|NsAwY+&GsY+zt;Isx&qeoAVYzG^W8m}c;Fiq6bWNiB<2C@x7X(NHbcR7gwA z%t=jQfQhRXD`XbOr=*tImK2qyGI+wo(=u~X#BKEN@=gTYge!P6-xGYK3Bx(uF9 zDXAr?$t9^N3J{T;%p_ZN)navq(!A`v{PH}8ynM(#MmhP(i8%}m3`MEA`6a0g3`L2# z49O`)`Je@-#pQ_wpwRI5W?%q?Bg8)EfY5j!&)|^wV1H+C*N|WaPmmfyIJ1F)0TjM@ zX~hiDX~ppcnR)4;!~^jaI5<4@Q%jQdi&Bg8bISBU`&}43ix@x&0(5apY7v8{56Gn#=xOTYv4Xm4v6X6y zIw&5~3RCi6(wPOwD%2Iy@{1He@(6Y5sU;ct#U&tDAjh1iQ#43jtOAm}hNdkfh&@r| zk}5&Ek8T|ML1_3u%Ab;wN(Rqz2GwE)&*I#q zG*Fx+rWG?}7Ux@J?sVvAzEJ@2R z%4KjZD#|ZXC@v`iWiybL;)2xV%(TqZ6opFAV(L&xIiuhotN>ODDj#5CFagkc*dXze zKq1QyLtM> zhdX+P7&0(0z}QBhdd$<;6)eHPz~JoTAM6UFp@Ke+!6EUE&Y;qb0aT*7`a#rr`nfZB zy7+*UGdTH&`nfPLFogPf`}v3aF@Vb`P=S=049+`{GSSa9BtFQxsAXD^-hi6c{{JjZ&;s4UAGiWteJ;LT+XrgQvHz zdq{vQgQu!-iULGjPc=m~nL*VUM0z@@8W=@@G+`w`Y0l4I!Oh3fJvdf@Av8dN!70e! z(Z$&@I7ETL6I{nDFnId-`v*8VI(vgG2=Mpx3-Je&Ag-^Ue@Kv{r;lq;umVF+sGpyw zpF33CF(^QR!80Jp-`6wP87$`Lon#TY-`K-9I zI5RITpCL01RERS$l;!4v`N;*PV7eqZiNOtA%_@}SE94iX<|%-ynM}j2X-fOc>0J3>eIe4Hz7aO&NlM%}jJXJz+Gst_$!FcMURO zVDJraHa9UfU;y(?85p4Ho59zRfx*{^aJ?7}s$gRkK#c~~Vuixe)S^mgwg*=co+$EG z3W>>}=8r8X-IU~)B<9$v=H!(6Cg~`Y7N@2_ISjCL7TLhS;!?%HkX%rznxasUT9gK^ z95Yj(brhO-azQDm)I+h}39c)-pfnzAC91rqlP`m3UP)>WIITk(C*b^1T9RA9;OS)E zz`&rNTnu@*6yHfZd~~3MyZU%Aq%7GcZnIU|;~X?m$~MG#D5dL>L$t zxEL51SQr=>n4o(-KvqD7KunM@h-L&4APm|Q0-_=7T^SezKpbouVC}1-)b!Gv#3F{2 z%%arflKdjjMKqvo(}~F?sYRfuhu%n+l#`#Fjl?g29z#@InVXcKlbNiLlLyLa8hZBCE)g7DyTeXU|=XuECQeJ z1kQjA3=Ao$Nu}uwo=#bbWr_NrCbhm}QBh*0PiAomgAHh5u^oe_hGrN8Xf3yf4_H-B zVqUtwe^ORza*4HO6oaP|xCt6wlvq#zYQ=dniWT%>4`;dnK`L` z`6X`orFki?70IaupehMe{^3v`kXn?RSzMf%pXZXAmzheG9>4q&PeiqbWQ(U?aEPOy zGpO6+>x08W9Gb21xDm+)Ctq+lfa_Rr{hFMUUz`fc95^EfDp6Wcl9`*z;OWBP=>*P( z3|el2G8VzQs2Z122YTA!I@R5AVC-#Bmqi?AaP_iNKHy&Ng|8}$rYC*CTD{L zJe_>OY>=R*lW%f<5!g%+4HC*t&CM^WgeZitL86{cpe|Z!adB!fM9LS=he-Q^N`FuS zfyu-9Q2DaVqLR|Y9A6~keNn`q>f-ZCb3o-)dTL2xNl6hyF_g~9&(AI`VDL;#PEIW@ zX7B`6Eua7e#Vv>pqRWdiOTb}QlnOe|)-yLdB@`G9Y~*P#EUsW|lB`7QhpH zF+)jZ0mv!7rI{%V>6s}E;65a{-v_?q(lZZgS#f3+SY09{2{|Q0>0BsXS`5mQPQJyJ z#SD3%vdGiPH!~#%tfxE?WUG^JW>FzSaei8fCx|Y|&q>W=@GQ#D2e%=?VUnDfoB{H0 zYGMi~0fNP#Vdzv@0&XXP#h{$R(o|3v*$LW=3IQc8YN144xp` zzqEv*xFoTt1gz52DX}au6BLIawcs=X@^@x&b`aElP&y9>#Z@tbCx{Iahg$6f;)CU& z0w8`M)IA_}FyxX@uuY}KsR5})$*FlIp!86jnF3}x`4(p+7J(d@o0*qigWL=i_ADyR%L6r0igQv^L4973AB#)!3kp(G7^?DflQL5oJWDb_DWMqL*9FNV z6{Er62DUYWXGS@wXTso_l3JWxlnE&sK_Z~Unvz;vk_j3d$-Dvo>)FM#n%K$p#8RYKV#N>?3yi|sQ#FFF;pVTr?1z(n$ zmy%z^;0d9_pgKIAAbf}&5VmuEN-Bg88iPno24&|^Z~+NnyMa>%D4oC}1r+}O?r3ezso=!y-{$;5}MWvuHEUIuT0tIskRDTJQ{t_hpB}n>9ko1>SIOpf&WP-vS zY)?srb7E0ZCO8up7o>vglT=Wl;OXR>3Mv>poqW@a@P!kXi&0!e+m7K`E%71m)2@aIpF!S~rkv z3Gy#k4BRgANG#6qO$4=j3rb5Eu(XAcvNf!Agee3v6VtDLsU<=ArJ%|u9hzZ_Qqz(_ z?}%6PR%S!g>ijLk_$ZZl0Z$l5Kv!*p(MG$zqABN z0F*Cta!}MH=Hy_gDM>B}E=h#cA<>@L{1Tp#4;tgh2N!w1&}z-s&p+PJF~l>>HQwDd zB)~B^7*aNPX@0*wd8X`#r zg-uZgR{RMSj^eO2h<$)b@p*#aPuhLGS82tUNr4=f+z9}1#FgWMTHgM$pg?BF0H5FHi*ae26> zpR)&pr&EM;09b8=TW}O8%t1I9-mYO_2nDsp7#J9WD~lN*xdt?!1ZjY{gUfIR25`~F zz`zic3T=;o)Pvh23=FIdLE~WMDGZ^RDGctJDGaWl`T{gB z1gbAU=7BOC0|P?jl3xVr zB|G^d%jJRw{Zk+^$l|KS3ZOniW>RTMDnu4lUp~}K@E8YpfJ(I(Gzx)i2C5oxK~$Dl zlnE-Azyl~@2#!L2X^BF9nnF=xUV5s6hH46ELJV2HI5j6tp(r&iwJ0?&IhDaP5IllZ zmY7qT3UNXvWHdKXA+Izy3EV{R1G;$cI7K7YT zlAoNP1CD-BItJOxrKP0>8RfQuOt*n99R^J@YG_(1Wabr=mMA2ZrlqA8Ddd->7NzCn zmvb>lM;m#8^ycNKCW9)l)S|>_$wF~7`Pdjxj{4! z12gv)@c0^p28kbFU|`@wlE1*fzyMPB0IKc{l>Z09=iz{u2c~%#n0Y|sb?i`@gMpbx zhJk?r#0SwJz6t{a0~-S~4~Pbd>o71dure_7fM}37Xv~+3ftd$1h6j@OfZ79^Phf|6 zA5Js#B``4aWiT-F6)-UKRWLB~H83#qwJIOhz|@H@z12z(-hf#KvG28I($AT)>##|{h(Cu&f| zPkdouIDQ9J45a=93zAp{5*ws;2Lr>m4hDvA6Bro2&0t{owt#`*+X@DTZyOjGzJcTp zFfe>O!NBnC0t3Uh8w?EJ9xyO`d%?i)?E?dYx(Wk>x()+_`V^8XqKv zjC~jwjNdRYnD8(#82@2lFuudUU?Ri7V4uOjV1Iyt!F~ny@LR*cEPjH4S^NS6 zv-k}LX7MKs%;G;7m?bzEm?Z=lm?ab#m?bnA82;^GVEA`~f#H7%1H=C*3=IFTFfjZN zVPN>bg@IWmfPq;hg@IWmhk;q8f`M73g@IXR4g<5w8t7Ox8#q5QFbIO2Bw@TQ1%W6rkpzvc5VWM2C0GJ+!h9=JPwF>o(=<3-UJ4wd=mzy z{22^P`Fj|c@*jX^I~W*zV;C5GGZ+|rOBfh@8yFaTdl(peXD~4ME@5Es-N3-$yN7|n z_XGoj?-d3HUyzuSK%)w^0VZ%7#H^OUz~J=*BF_V&AnKXbG9cn0E|NG%1vbpA`hkJL3p6hRk_DAT zAew;z>`t&a$WKV(YAjIopt%oZaZosb%mI~s2yuvMm?X1W4g-VN9;gJ!EKpg-z`(3l z02K#$09m{QDh_fFvUm+t9OPMqIMiSaidpRd0|V;^24=Mr3=HfM49se07#LU+7?{;= zFfg#cU|?3e!@$70f`M7>0RsbD1_QHN3j+hk1O{fc7Yq!n1`NzO2e#EFa+ZgTvV$RF;E;Ky?C$hK4g(9ON$~ zaZose#X){T7Uy7K0E>gd8ChHaDh{ekK;ldg3viIkY6=VtUK^mYAoUO?vzi7}9Nj%8 zP;qqk*g(b6-Qxij2c-pM^FyHGFn2=i#YKX{-|Gqk0|Tg@1LbdKuu@3+2Z@8YAaPK7 z0i~ZF1_rSD76t|ekT@(|O@WGo>Plqs8BlRhy@@Qo04ffu?~%pVK*d4rA&@x8evrLe zpyHr12_z1&7b1&EGF4YFFx40^Fx5O@V5;q5V5OaTM4Lxb^_Sz66yAiC=L*h+jn#2OXsVG7F@p z4@ocRhzOXtB$Bu+=*XiRAk_@u4_u`IQKqU3SNbU?pQWJrs zCI(4OEK>L+A+b}D;w}xz&1p#f1sy2`b5ACcng%2_kC4Rkkjy-Tq~qzXI2)&GqNN#9C3g>(zcV0v?^CD6hZbwpc2TA-Wl3$J@ z*(HK7pGgFvo=E~>4x>1dco4$POw*9`PDc`-jwC(=rNaidH^Y zH>^cc13KCYnkJdnBbl=i$(_rQ+_M@<%_b!Al}PLrNaoK&a_2lG_s>UCzW_=70wnVn zBDrA^lKU4Uv6mpT5q2>k#S6o1Br~TWnOTUWcO83NwEr+CD9^nQ?c_cLoNaiRZsaHl~t0J-0kjw#{w*-w-Ms*}JHIdi`h%jfg zK{Ce^$zG&#k}(_+4va}i<{*`6j5$bVg3d34xuF6P?~Jub<}@IQw;`F?kHnsWq-HLX z-o=P`WJHQD#_dSquop@1aU}Jpk=%I}$?q4C)LcbU^8iWBGbHv)B=sMV!tEoHJ3k?* z|A}x96B9x`6Fgd3P-k@RXHsnI|ZH$oCON4S&80*P&j zJYQV%-* z6q=S8wjsIUK2n%`MPh$Ln90bD#O6d|b0FNn$d2US3XsGL5Oy&XBB?1tGP4LtO)%z1)j&QqkYx{bs}s;3w}BDv=wlD&_R?0t-+_X(2vw@B>I z2=z?e2=z=)5N>9AieQ7fiVU6)7#KWXFfe$2U|{h4!NA}J79Ax9NeD1=PhbF@yUgGv z!oa}D!N4q3z`(%dz`)=II;&ELfx*jyfx!z@kwYEq6~MqO0y=XP$_G(QptF%d3<8+h zgMnEbRN+I_d4bL^jbUK$0-c`X-EY#11PJQx^!LKql)5*QeKau^tVDi|1iS{N97CNMDg%wb^gS;4^IvxR{H)UNS4 z!@%HkgMq>42?K-A2L=Y8KMV}MpfiXI7#Ns47#Ns$FfglfFfjNkFfjP)FfjO9FfjPK zFo4f0WdWT>o5R51U%|lO-@?G)4;s{AU|`_fz`)=?hk+qJfq_|b0|P_T4h9DQ6$}iX zCm0y~w=gjHiZC$vA7EhcKf}P_e}jR+{|N(w{|5#J|33^20UQhr0U`_x0SXKZ0Xhr} z0Tv7l0WJ&-0RapQ0Wk~=0T~Po0VNC!0Sycc0X+;10W%mF0+ui^1Z-en2-w5G5O9Kl zA>axFL%;(DhJZH=3;{nF7y?-s7y<mI7y?Zg7(i{eKpzH%zz7D0z!V0C zzybz_z#0aIzzzn6z$pw2feRQI0@pAw1nyv92t2~T5O{%sA@B|ZL*NSrhQKcj44~Vw zgLoJif+QFif>an7f(#fKf@~NVf;<=)fUXU$r0aC~Nd5=0C{I6$UVjvPBUR+WHy4w#Vh+<9}Ngm`*tNopSG0%5QOLOih~AJhQ`iz26I zr~ou+A=DR_6eVYXF0BD8Ko(EL6+R{TSkhrJ4u65~JOrB!A`s@Mr`1 z5=C}@aUQY-2y@cXa!QLqLtbDF2yrl%fdP606ha)?6lC*D@^e5pB}26#)PwR7R1hUS z6qgj`CFg>!p#aGu)EAc&Aq6NxJQH;7PAV**5#nj-sU^_D1jYQ!;*`vEcoIdZFD@x6 z$%m$LWcL>rCnx5?k`+=plUZC`keHkbawLlRxv9BW}eLD$oj{k=27!5JVVLJ*aL&aZhGGQn8JszOWc{*BsOs zB=O>sqT&)*GC>jt6+bDNFbRZvK+%Ft99*2hB@pUC@eWV6Nah!SHDJ1@0Aw*t7)gD6 zd}48NY7w-IK$u^WTL4cD$nl<@T9RG_y;}=eytuL$e8nro3WPbC#py+f1+a{b5QnH^ zSPG#r#6cZ>l<zM9-6;$(8VEqMrR0(Fh4!D1bi(nx;TW-2ku>_d|pk7(o*|AoZa37_xX9L;;5SX*k3|gQnQbIfg_1T^!<|0T`G$ zAU{Bqfts0M7T7(=;^JUoNcxAy5lDmybm0Ze9At3|kSsKvBa6G^5D$lngX{#~?Eq@8 zg6?L9ii5%pEDox#AvLq-0|q8RkT_TgNW1`C+j+h~7l-6`&ktzgdC6c6o?vowImfH2k10*?z}if;jr6=8~>1CJkJii5_D7GSaWFL;~@ zLp`f7ckbxi(3lrWeuSh4)>`oR7N+^rz++yR;;R`L ze0Z>!zXv=vhN=EMc)Sc#{5g0G4O9Ftcw7xboJ|Tm)`lr=3LbyM6!!*?$zh5|gU9JG z#jC+%cbMWc!Q*+D;%mWUe3;_V_ulzzrpt< zVTf}GfX6Q}#bv=`nwa7`;Bih&aeMICC#HB1csvwSyaqf*iYdMZJZ_39eh)mBiXqM^ z1Rh_-6gLBpxnhbZg2!Po#oNJSvzX$m!Q-`<;-GO^EcGDgZ}7M-hI%e#@K`UVcp!NE z7gM|zJSL1Oz8pMGj46H^Ja&vJ{vAA?j3Lgg2p(g`6n6uUJ7bFHgU6yV#pi>^r!mEk zgU75f#Xo|_u`$GXq`+g_nBuP6bFsJ7ho}GH+YO5Q$1)*z5`P|A85>f3Knr2@c2H4Iecm0 zF@H?)KJYvMrub3t+yJKdbMSlthB!Yjcn$$m+!{QufGG|NpD&p1=bsFof523~kAWcw zOFhW{5U9ZVjH#z!c91&v9Ui&jrtWV2Xq0H$pJoFYq5cKZ2oN&=@>t zf+-#eo=3qH?*Y%PV2XpnVFISTf}g>2Fc|8EG{N&SnBu|Uxf)FIX7KzCruZ)KoDQZq zXnyAgrh9}z;r|4SIA|UTr9T2`7YT#H{|^@R3&8V681@Pu2hSy8ivI=AFJXv_n1JV; zFvWAg^H7-LE5LJ8nBsTA^Hmt)qFmrPEKG6G99IUWzeLj*KyzJ~>ZgL|zc9r?b6-7J z%=rqQC&N%LrU;%p!xZ-g&!=IES1^F)*f7PHg6G{Z#jk?r;xNR;Il=RDnBubFIXg^o zL-0Hvrnnt=ZVyu&G_NOs84luc;5k4{^@ZShK}_*B@LVCL_(JgfA*MKJju1=vFMbX@ z&xoo14S4PmLtKIvJRgZEt^}T=#1uCN&s$=O`!X%FDz*N5lysiUN{44`QIF|BX?iqOf2d4V};58u_;_{%iC0NG6 zATI)<^P(7#Je3l>hRN!0S^m%u!$luUWwqmjbV2 z!4!wAZNU_G2d{U*6psS0fx#39t%pg#biYD714Bd(7IDyenF=i88^LR8FwH*+UT1?T zeiyv<22=bqcs&k=xFTp>&lXI36_vp2b}-djGcZJ;jDw{m#~0_Pl_WDT#D_323xnn_ zAWeBNsTj$?5Fddl&cGlK*?b9}3xcvicWuMOLHC%$*r2<%VQdkQu~7A(jg&BP(EZvl zHt0@m7#n=&HdH-$P6o<$Kr+Vzi49&02~`t;Bo4l_94Zc;l!UUuGuco!c+Dl04Z5cr z<_6GR+b}kG{UB5g=gV%mS)m%Ul2k#|?ia$US z2W?J?;nIXWXcWVcP6AX#)RZYCL}*HA^DLB$&XA(eq=)OBNLJz znN*PMMM`^2I!NM3>5$0;NgOFnGJ!VPLj3|-?+eQ#OyIS?P`@ChRVL8lSeSaGbjuWi zWIj?FW{N=)M@rA2IX$>tNNJl1JXZ|07b%@Hf#>|8;z((psRqe>r1Z}Ox`Q6(PNclR z1iDimCXSRZn80f&pyngx5%8u>n0loA!UWoI2op!jJ4~RBlrV9me8dFWlmZh+%2P~x zklc@yznDN9NMP!b@){FpO(RSkDc><&K{5v^{WBq@e#mDg84crGM~LG1P6$Na>#$Dg84erGI9m^v{fx{+W@|KQmJLXGTi@%t+~<87ciU zBc*?4r1Z~>l>V8K(myj&`Uma(fu%`ir1Z~>l>V8K(myj&`e#N;|IA3~pBX9rGb5#c zX7Fk%NP1&NO8?AA>7N-X{WBw_e`cig&y1A*nUT^zGgA5otv84J3n~3GBc*?4r1Z~> zl>V7Po0eg5ij@ADkQ>%#4(VnUT^kGg2C6MoPoX zNNJcEDGf6trD0~IG|Y^YhMAGlFf&pb1}9sne_6mBNF1>srC}DNG|YmOhFOr(FlY@w z10z%~C=J8dpfn6)gVHdJ4NAi>HYg3l*q}5FV}sH#j15Y|Fg7R+!`PrU28<0#!!R}| z4a3-=Gz?>d(lCq-O2aTVC=J8dpfn6)gVHdJ4NAi>HYg3l*q}5FV}sH#j15Y|Fg7UN z!q}iR31frOA&d}su!vrDL=A;!U`silrLC8VbTdv&jtzysJ(2UaDa(} z`~?#S`3oivN{29UP&$N(gVF;`9F!h9pynf$QEZ?x3MP(J=CFav9GEy#9m)o(Lt)}b z<<5&{hCgnaPfnPS}ychaD6?F!i8x z0`)IDQaWJ=r4yJqQaSki6hk) z?4bM$6Gw_Kc2In^L+k|yGt^!VQ24{dk;0P$6rM0~r10SYg%3;|$-f*R|H8zP@)rjv zf5F6&>O>AuS=0q}4^sZ(0Oc>3I8y%N0Oc>3I8yz^0V<1N;z;R`1C$P-;+$X)L+s)N zr7M^?QoiE^r4yJqQoM75;vFWAlP3 z;z;q%35s`^I8wNAg2D|Zj+C!CLHQacj+9O~LFoi0jug(Epm2tXgVGE%ZF?f6RZmb_ zg{lFa{{zcYo}f5|i6e!HCsLSrB87=3QkZxmg^4Fpn1Ig2fSZpLCZ0%P;)xU{o=9Qh zi4-QDNMYiM6egZXVd9AtCZ0%P;)xU{o=9b*C#Y zln!CyNNLXtl=fiaNa@WBl-^+CNNLOql*VAx969?5JF!i7`024>5TfISP045HqUtsD%X#ggUR9<<5(f~{x zsf_Xlr2&{YQn};}N&_%)q_W5xlm=kpNac?=C=I~Gk;)uzP#S=VBb77WpfmszM=D#q zL1_Rcj#Qp_gVF#@9H|WP2BiU*I8wRc4N3zraip@s8OpxQrXG|AVB(;>4-*Ha0hl-_@597FX#ge;%KI>JP#S=VgYrI19FzuN z;-I__69=UMm^di!!^A;p045H~`!I1(8i0v|@;*!)lm=kppu7(g2c-d+I4JMK#6f8Q zCJxH`FmX^CfQf_hK1>{x24Lc#ybluxr2&{YDDT6>L1_Rc4$Av5aZnn7iG%V!OdOO3 zVB(;>4-*Ha0hl-_@597FX#gtj2g>_UaX(NRfQf_hK1>{`{PzRpeV8~X4Zzfc@;*!) zlm=kppu7(g2c-d+I4JMK#6f8QCJxH`FmX^CfQf_hK1>{x24Lc#ybluxr2&{YDDT6> zL1_Rc4$Av5aZnn7iG%V!OdOO3VB(;>4-*Ha0hl-_@597FX#ge;%KI>JP#S=VgYrI1 z9FzuN;-I__69=UMm^di!!^A;p045H~`!I1(8i0v|@;*!)lm=kppu7(g2c-e1xIZZG zL&g0;X#ge;%KI>JP#S=VgYrI19FzuN;-I__69=UMm^di!!^A;p045H~`!I1(8i0v| z@;*!)lm=kppu7(g2c-d+I4JMK#6f8QCJxH`FmX^CfQf_hK1>{x24Lc#ybluxr2&{Y zDDT6>L1_Rc4$Av5aZnn7iG%V!OdOO3VB(;>4-*Ha0hl-_@597FX#ge;%KI>JP#S=V zgYrI19FzuN;-I__69=UMm^di!!^A;p045H~`%rOE_JWPCg3dO9mGc3hGyqi(I`0H7 z4oU+saZuienFC4#FmX`chlzvI08AW|_hI6oGyoF^<$ahqC=I~G!H$FUQvyI~045H~ z`!MyOGyoF^<$ahqC=I~GL3tl04oU+saZuieiG$JrOdOQ=Vd9`P022r0eV8~X4Zy@f zc^@VYN&_%)P~L}$gVF#@9F+HA;-EAD69?sem^dg6z{Ej$A0`e;12Az=-iL{U(f~{x zl=orcpfmsz2jzX3I4BK3#X;xKz~VO$sr(0>Ndp&0D*r*})WF3-X#i#pDDOkf4+NzF zm^di!!^A;p045H~`!I1(8i0v|@;*!)lm=kppu7(g2c-d+I4JMK#6f8QCJxH`FmX^C zfQf_hK1>{x24Lc#ybluxr2&{YDDT6>L1_Rc4$Av5aZnn7iG%V!OdOO3VB(;>4-*Ha z0hl-_@597FX#ge;%KI>JP#S=VgYrI19FzuN;-I__69=UMm^di!!^A;p04fgI1`Nqx zK}h94=-eP!{01SF|Ddyk;NnQ-Kj?fRxHu>cz|05beW<-bpfmsz2jzX3I4BLk#6fu< zCJssiFmX`chlzvI08AW|_hI6oGyoF^<$ahqC=I~GL3tl04oU+saZuieiG$JrOdOQ= zVd9`P022r0eV8~X4Zy@fc^@VYN&_%)P~L}$gVF#@9F+HA;-EAD69?sem^dg6z{Ej$ zA0`e;12Az=-iL{U(f~{xl=orcpfmsz2jzXJcrd6902K$F?F5U*V5IUNblwwO9I5;V zodE?GM=Jk8=R(27L1_SHJ}B?Q>;{x24Lc#ybluxr2&{YDDT6>L1_Rc z4$Av5aZnn7iG%V!OdOO3VB(;>4-*Ha0hl-_@597FX#ge;%KI>JP#S=VgYrI19FzuN z;-I__69=UMs5t2SEm(YoAeH~1Gr8d6Naa81oG!RHQuz-$y9+LkRQ`j`^MZ?m(g4g} zP~L~SCj^uRVB(;>4-*Ha0hl-_@597FX#ge;%KI>JP#S=VgYrI19FzuN;-I__69=UM zm^di!!^A;p045H~`!I1(8i0v|@;*!)lm=kppu7(g2c-d+I4JMK#6f8QCJxH`FmX^C zfQf_hK1>{x24Lc#ybluxr2&{YDDT6>L1_Rc4$Av5aZnn7ii6HZgT+fIQu!YW%KK3D zp-AOF=nOTudZh9nbgmj)9I5;VowWuRM=Jk8=dZ!VL1_Ty9#Gzg*$YYoFmX`chlzvI z08AW|_hI6oGyoF^<$ahqC=I~GL3tl04oU+saZuieiG$JrOdOQ=Vd9`P022r0eV8~X z4Zy@fc^@VYN&_%)P~L}$gVF#@9F+HA;-EAD69?sem^dg6z{Ej$A0`e;12Az=-iL{U z(f~{xl=orcpfmsz2jzXJco4-*Ha0hl-_@597F zX#ge;%KI>JP#S=VgYrI19FzuN;-I__69=UMm^di!!^A;p045H~`!I1(8i0v|@;*!) zlm=kppu7(g2c-d+I4JMK#6f8QCJxH`FmX^CfQf_hK1>{x24Lc#ybluxr2(io=-feA z_=h8v|Ddx7;o?Z;Kj?fyxHwYz4?43DE{;_GgU&I8izAi)ptB9(;z;E`=)6O?I4BLk z+zHD2Q1^#}(f~{xl=orcpfmsz2jzX3I4BLk#6fuD+w1z zD*r)eO~S>I%74)LlW=jQ@*i|2C0rb-{0E&=2^R-B8s>gb-iNs#lm=kppu7(g2c-d+ zI4JMK#6f8QCJxH`FmX^CfQf_hK1>{x24Lc#ybluxr2&{YDDT6>L1_Rc4$Av5aZnn7 ziG%V!OdOO3VB(;>4-*Ha0hl-_?~6hDYZ0I{Pz7a!(m*wo4Jrp}plncjsD-jY>7fqF z29*hHP&O!SutV9Pw7~&ogUSa^2s;u~M{q&epmf3wWrNBJ9w-}BU+_ZNpftk=WrNBM zekdDMcL+e)p!6dMWrNBPAt)PEj|fBAptK|cWrNBSQ79W!r$|8ApmZe(WrNBVDJUCM zzsNw@pfn~6WrNBYIVc-c*T_TJp!B8yWrNBbMJO9o?DdCx29;@+ zP&O!STS3{Nv~3M#gUUA>C>xZ{ZJ}&XI=6$eL1mpilnqMr4p25I%{xNbpmNU%$_Ax> zXDAz#{#~GKQ2KX;vO($J4ax?ke|IPwl>R-SY*705gt9^D-wVnHrGIZI8e<&N2{sW+FQ2GyqvO(!T2+9Vf|6nK^l>S4YY*6|Sg|b2EKMcwS zrT=g!8xaiW1wtM`j3UOLFqpZ$_AzXcqki`{u7{V zQ2I}VvO(!T3Caeg|70i|l>SqoY*6}7g|b2EKMl$TrT=s&8A0`e;|1dTv{lnOx^bcc$(m#w1 zO8;3<_khyBG?WcW|1dS6^bfNOl>Q5#YC!2f2g(Me|7<85l>T9QLFvB;Dh^8j#ZWdV z{pUj2p!8n~WrNax1(Xd+|7B1%DE(JL*`V}a4rPPVe+iTgO8+o>LFpgnW>EUihpGXk z|3WAml>Y0XY*6}dfUu)M>Aw-m2BrTdC>xaio1tt_`fq`VXXU86ziAG!uF8kGLKp?X2-AG)SD8kGK_>u;k$>Aw%E29*B$p=?n4 zp8#cp(*Hy#8TQy*`V}48_EWy|2a@LDE-fcvO(#89+VAA|MQ`2Q2Jj0WrNcHLMR)Q{ue>np!B~O z$_AzXB~Ugf{V#>GLFs=PlnqM%%b{#g`dC>xaiS3%jJ^uHR)2BrTsP&O$2 zuZ6Nf>3VXVJQ^weM}yKoG%rMh(mzZMDE-64LFpgH2BrVq5Hmqh z4Vxp20i}Pa-WX8&hpLYOrGFS3l>T9CQ2K|lLFpgH2Bm*-sQIAu4-*Hae;6B-{+Xa^ zKxaiPea+D z^nV7*2BrVAP&O$2pM$bN>Hj>G4NCtPplne3zX)Z6(*GqW8To+*`V})2g(Me|GQ8&DE;4qvO($p zK9mhg{|}&SQ2KueWrNcHBPbh`{vSixp!EL)$_AzXr%*O1{Xc`ULFxZFlnqM%FQ9Bt z`hN*!gVO&iC>xaiUqjiT^#2CJ2Hp9^@D|DjrT=$OHYokShq6KG{{xf_O8+0BY*70D z1Z9KL|7R#0l>Wa!*`W0Q70L#s|8Gz>DE)tjvO($p2b2v;|39H@Q2PG`WrNcHZzvm- z{{KMPp!EM2$_AzXe^53k{r`uueHa)Rq4_H|fPsM#ns;JD7#J9#c`Y`Afq{`3sy>E+ zfsqBuPGDeQWQDR*7#J9#eXH0E1_nlG-zqi-bRP^=FhBMra>1b_D|iBeaZ)UBke@C;?T! zfq{V$+UJVh!oa`??Q_NMU|?W`wwGe}FfcI6K-C{$U|@vyzhaLtFfc;4Fdxsv|kqcfq{V$+AoX!!oa|&0agElfq@a)FN^)dz`zLYm&JjuJAn4f z;#e3M7S{}E92p!5&zm&Jk7KeS&4x+jql+AoU(rT-YHdQkd@_RHcx=^xrJivy*9 zXum8Dl>VXpvN%xshxW_jKvvnh#3<(0*AQDE&kGWpSYN z5AB!5fzp2lR6QvDL;GcMp!5&z2Z64yV1)K%;z8*@2ckY6l>VW8mUvM5hxX&*LFpgb zzlaB={{pCbQ2K}VHR3_(AKDL!2c>^#KPVoQ{!5_hLFpgb4~hq+e`wz)9+du}{hfGF z`mcbh2c>^#pC}%b{-NVz@u2h%9UqGarT-eJdQkd@j*rEI(m!;3EFP5p!TlgTJ$-_x zw75t=Co{=PAI`|h1RtcHlbMtpU!<4FP@GYum(ReElbMvCl8eGmPD@AO7o--Yf$l&+ z6)edB-4jp@5sa@WNH+x;#~mLZpPQPSn-4k&pDQOnF{Q9HwWyMTfiFF^BqcvLF*6Tx zTMSQnYDq?ZaS4Pc7GGRhT#}j_4?4I%GrhDZu_QA;kAVTCsvt2vwK%gXm4SgPJ+-7L zCo>mxhXoJ#wv5E$RPc=%TxE#MJb2SnOF&nCQdz(fIO=%;XG+WyvsC3PAmwR0%Q|WIaLz6b>K}-uU=5Gn111 zQZtjHDh39=qJm_o%TtSr7#MhAkrAICoFggb>0-`6cnqDYJ46jQ1Vl9<4aPDax?S5F~ASvXXa&=WG3c-BbFB=ke*r+54qTg z55xuC$^+$dJD0kY#XI{r1_v`Rh!$t2ClIu>c|fRghdz3gHVw6oB|3TOooH2*J#}w0yAr5E(&;OlbiqX+ea9AVQ!-o>-O+ z5rdivy5|X$4)*kT?eGk-^l1Br6G# z1!bzD{L+$Cq>z^V74p>>pzyM9)Ir-`F;Ol78;7$M~3$Qh?5)|rFxOjR| zemMgJG|_-W!LCKo0*!xENr*nEX<*-gQXHrxghy>bCNy2kL4paS03}Jn+=M0hfgJ#` z1DaD%N(=#riOGq{8L9DkspSj|C?ep%hQ=N!HG*#pQiA9~b_FDng9Em-I5mZVfeWH0 zCqJEm0qQqILIH;qG-~0ZFh4+J5H6mQT3k|;UkNt`;#9aOG$Voo4#}^`!jMD&w$#8Y zu`Dq@zbHLEqp~2iC^I=8;?DBSJY%DHx6GW>u+*aB%>2Cg^u&@3(6v$mSr8RqvlCNN z7#N_j2(}Sikb&X~lFp%t3?c<9W4XQjJmdZIeDV`h7#MgVoX|W_fyuxih-^BjGC&A{ zY67s;3=A4LTpbLq1k&=0auZ8}!F7lpUX|&oC4Pw|nPo6fGBDr@4~WTd^-iUkIVmpS zYRiZ?8-kN_gHp>fK|#sDpoCWsq)5=jt0oWZZ08(sVWEOoX?ki&0O-0p{FXwl6;vl= zQgCLvUuiA_gDMV%q0pKTnpo6uD09gy3NA@3fhQ^*9O{Bni}Op1l2d&^%{#biEgY)- z(u#w@#dw%8TrIAo0!rGBB_&10aFw{i#~GAvq5i>RvopAA2{VG5hs$P{%;M}&a4QIw zrIc~_Cm7sJfm)3#Y66P#lS49dQ{ndFO7b8d2ZP(wsJ7#ZBap$qpoSCF0l54V0&emn zhY~)gqC~qP4v+h#mUzNip3eDsX_@J8-{EpCSW8+yL3P2E#h#!x94zc{#X7Rj3CB7j zz2Wk^OJ)&ju;a2gB)I_Y34J2M2PHsp*$#?JXK))68kxBAFG!(V3fuwOI2-^{1~Sht z5h>x}iW;zD;xZ95`x4GXATvQeMeQj0M#;0grig3^H0qGWiy z;;&plHAYc>GRR;C2BMTYf^WRVWjiRcTp`^PN6<~WxJnWvbzzA)rKt=I1S?mN7GFr; z1r`PbLm1TXa4btLN=#2>V9>=8ukaA|ODzck^-Un5fv3cB%SnW^tv%Dg%wTAfouD85 zQcIlSeHe%}xYCkeY6&RSgF8YDIEznYw}Z?}&2vmiDM|%h5=gjxlUf4Ggqg{y#h}d1 zz+j9cfKXfwYVCzo7No-bY(lIikZ<6+aHR{lf5J2JLH@y=FF<)0lzY(KgDcY`s}BGT zMHGV?XvHvZ;BpYMHsAb|R0alI1tmfyxcKqO%*!S+O9gU?%R~kprQk0rf zlvvKdfUC`frnne1N{34=I8piJr^gqkmiXkSr-K}Uw>pBUO)X2!!5uYVV?iYZw4ej` zj&Rkqs67x*KQ~W5&yYymH4~)c91iY2gHniVMQUwqYR4yk~~>_Fqysl~>EMLDV5FsP!OUKt@x*V=qt(z;1=k4uD4@;3WWb2n#eq z4r!M`4F?Gznqg31ppHDj&43QMfMih(hXx`@q5#yM0uAt#=77fmpw0z{7FZM5xzG_t zgecq&Wc82%8BjPXjkekfH}VUIq$%q+wHpbD<+y z*yQ0hL7fOv15Oo)QB7z_!)3rBfaGqFJ*j!%`4dpG0ZT(80<0&ss0`HZh)0YcVRtWL zd>@(`K)R9q19BF0j9U>BEa2nkfcCm9C*wb+`NR2VWP>y z$8F(N8?@Ae^5awU5#!1*F;GIIWLn8zx3#*r)*$yEL zu7RL|3>xM}1RYch3VSoi{>h#nSP@4~-y`%^<0|~wY9+sLib5f1K0#I*&OD&KWAfiy8gGIqf7{p4$Qdy*> z#3$#M=9R$b3ZM$X1sd4z&}u9*KP449YXyxiP|2E{UzCbw09?2zKPRWO0G_Nt;-Ea3 z6Q7upRa#sEAB+Y|WK_kc73Jr~gH^zz0X&YJnv)h^kXVv|EDD-=Dd zMe(V{C5cJ!um|1$j#TJF6{i>FmlhxiLmN7f=?+k_1J4}bS@}G0c7X;E$fdB>Norwf zVoosw12m7r+5nI+M;8Q_2GE=dR|%W>f|gof=fY;7pjibv0}QEG;K>Ks85xPih}2eG znvx$6N-B_?1x-}2La8{lq&zbPlsKW03X>?$%uC5HPtHipO9#y=9B!cGi zK?~m*7+B00_!%HKo_ynHW?*2P#K6Gt1H=N|RKa2ml4V}Sz`*beBnDa_$>IbOV+Ac7 z`vVeVUBJM=;t3X8#K6D+HiaFut>hm_mc4<2fyECb3qApuZKebR1N$-1dPK17JJ1S5 z5Q{?$wB``ZvIDI$1hdjW>k7fFKF~@+Fl!rV?I4(S542hk#NuQFtq%mV^gt^D!K^UQ z8bC0s4z%hI%vuIo=Lcq;1Fh@>v%WDfFv@^fTymh*dtjCuXuTeol?Pg(2WCwJt;qwk z_JLO0fmzQ$>+3))Za&b8Ixx!&w1y7MiUX~h1GCx~7#Iz}taYH3abVUp&{{Y!>mO+K z8;HfD23qe1X8D0uxPe(^pfzn^);tCVMmsPI6n+k17AX9jKrGPxuZ%8W7AXAOz${Ss zd4O4<@bdz*K;h>DW`V-b55(dFgz${SswSifn@aq7xK;hQ~W`V-52h0M6Umu7i3<|#qU=}F+CV^R?@S6f=fx>SZ zm<0;I8DJJD{APh!pzxamVu^slZyuNh3cm$l7AX7{fmxvNTLNZ*!fzRv1q#0vAeJa7 z{8oWkpzvD*W`V+Q9he0QzYSm(DEu~oS)lOS0%n22ZySgu1`59&U=}F+c7a)-@Y@4s zfx>Sem<0;I17H>?{0@Ow;tLoUc(rFrF)&DSFfed^1haY=7L1I!3Fm+NB7#Mi1z+xL17Yt!0b=}#SGX53Ra*}3gi|A&~&mV$P|Ss3=F(}VAdCyy`USYc!NP=iZw9v zlo;Tw960L^jHR3dvrV}M<|AcLxPX16;stZPiXY4cDxla0yGqr7fr0x3$Tn3Um?^3; zFjG`3V6IYq1v5qU9n2IpP#nDi`ADq_CaYEllU0YS(+GmeYJf`bZy+5SAeTmf?A2Jq zz`z>|VrlZh^lEu9FmMNe#I!EK^lCj}VBk6e7W)BnskR6M19v7!Oj`vmX2HO~H3=*R zTFwAr!A;RoVPN3)2FdDdf|;xv0@JIz1176`gMoqT5lEdLC|nkTSVkZnVE-C}(%LeR zn6V2316K!#WwM8Xfol$!bp~dh$sYy=Ze5U=sR9E7*KaVZ1*XGv4NT1J0Rsb15lGhT z15B^^Cz$&zBp4XDrh{ZHG+?q8HZZ*wAlHLkU;zr#B(S6qI&H=NQ zFfi~If>?H-5)K?{c2Y1O*%>e}aP0@nI>79(1Nj3S;&vccL1a4^7`VW8*iC?|1DRX~ z*878jfwvmO0&PZs#DaqkEOZ?}rhr4-0pwB$YX@BR2?GO55J<111e|38lXdiAVBl>4 z%htffK(PgOi<1$|A5I<&47{x%bxxo>2zI>_s8oT7fx;f5V-EuZZx>kI83qR4eh|x< z1D3{}g%}tZzkqUuvkC(P?-a0X4g&-4OfYK#0|U1am<2KqY=`p+n5$es<=Q-utV;ka ztXw)67mlzzcSPCtR;5Nbh!#4$!&ikeKmOU|`_g0}}HF#Wc92_5tOi zT_749c}& z{|5hosSAbc4YPrXMZon&!1YGK)kU)~FmN+~?1%>CMzE`*Ef^TM7l6e;Iqw*l1g365z zAlXDv?gqOc30|@$Wxz_uqzYI*Pujx3z#|LNk*vYMz|93_&487T$yXQ{xXyva9xyO) zD}z`m@br=bD*wP~Hx*R=flEvfq{Yd7RcUAP+0;l z9W&u&NhU}yILBv#Tnf%JnR6Hzc<+OCY=GtXtRw~o#v`D1MAj+>2F7EcJeUp2A1A;p zP#td#(ve-jz#s@=ErIFH>0w~tz5|lYIl#cc;{axXT1Iz3dUHW-vwL9H6$S<#SCDMp z3bqTCws0M}5SFqR;1_tgXFbh! zygE=ggWDx_pc)5Uuhw0G`LgZ@EUfAUU?Efw(hE+p^`Nv1PO)`R-G;M%GI zR8E3(Swj~rTX=Cy-L0kC=Pe;63}!T#+8wF-`ba!MyCrXgaWRuGugB>;1C7pRm1o7@dgFWsOT ztPbR=Zcq&Y_IWo*9k|Wa!vjktJ)k-T9IHJs3=G`hRMG=-J%j~H&tQ{#K;Z&r^~%8V zTQ4XtK*T_O7qA_@9~c<8L!5lAlTkXpqdk$4km&68W0vJ ztwC6KU~Pd(pne6oe4fn1z`zS(fm#_57O3`vutMOnppsPxWZUEe3=G_EAl4Lkt8WS@ zPlN543aXjTf!sIs1_QL7nFb0qNsx}|@Kikg3#=TP0kTaIBs&A{x0x;s3_R;VVzXHo z7KRDIR z^@$S^SQ-vF~fYC-Cjg3<=K9A65m8zC%Eo8dKBwgpz+F9qdph%6}f!FgsWDEEMK z*)mYC2*LuTVz9}}K;;^^<*^J@H{J!Aw+!SWP3&*#MW_04n9d>NYYkFmOXypxA=2 zKg3H-TymaO&IyYQckjz8Tbaz5>cen_Czdc%Fj7ehb`3TR`o5a2nqN8qc`~ zQnzISTpg%B0{eU`sOG!@lHFPXOKV#}Z8LD1+`0g!W19g3gJ2uTj%^ii)(lwby&ay< zx5M+>c2HRYZYORB)i+HfrIt#1NEc8diQ}^=3u@1 zKqF6Jz55wpF4zyMQ^2O|Kf}Nv*bNGy{h)jfb~C8LhKyt#0F{Ygbq7G{6l~i8P|SdB zJ5T_tXAXe+5MbL5fO(_AUxM`>1ohRxdJls31A<+85T2e7f_jx;y$3<{ z4A|a7pl}9@9Rk?~HsuhgZ2>M{4uQr-z~&u>r=i23(i^Pfa0D#W4p+cRfg|wPKcWNc zgB=NgwUv*6>hn-gXdLNbVBqlrv*y71R!2eU09F!UC1HVAd&6o(8+>Q~?76PdUhMryejcaDiJqr{VrM1NX-nkPE=& z%UQV3&w@f6EOri5H-f|9Jjh32vGbr78CdKBXe0~50`+2Ufy$DL9I$fZA}G$mIxfL& zy9^p<0N1*gLA5DZ_R1AlsdDuN1B2iMkejc$z*(RY1YGJ}2c;{pj_aV(0>T2FCBg*i z8D3w+z`%G0)(5zGznpWMr?XOKEDTw4{%)G1NBqDVRi2XtR;9KG^PMHF;+K7(Q(?B=ha zeiT^UH&Czq5-9e+fqLa&vF~vIeh0;6B}ngg(AWr=^#c^95Edx>AS_VH0AYdJ3=kG* zOclZcSRl7RSfCsVVS!qzVAd}t1_s6_pfQSHpm~UAU=}F$Uw~Pl*25bx z3zTQxfmxtb@&U{OwGTdlSieENEbtuZZzl!@M(|AQ?<@ueM)3UVZ&0cO&#L|fja&Q! zg~4Ag(DW>r1uD6~W%gfCodWJV|Ap6~e?h%AaGd`IjU<43%>O{40T%lQ$`$)Sq4r+` zR2>*g4)Z-xPXCyd*@6k21Z6u_<>@Jk=cuZff3|B zMs`r2=`cu^9TaL{S$0t04`dr7=w4RvY!D+y7R)?OFBpq!5{$*I#K6GB#LvvY$PJQZ z0keu27?{|=tXT{UOdMd=AqEB}E->pA0|OHeh{Yqsz`(=@W?3;XFbRNJNem23LSR-G z0|S!?n6-(4fk_O^y2Zf2BmrXaGBGePNr72f3=B-5nP5iVAO;2|Ij~q20|S!+n6-$3 zfk_F>I>o@iqylDvLP!n7;*(-vVA24yoER9Gw7@Koe|5ktkT3PXtX&KYOa@@qBL)U0 zBM^%p6u%~5mJtI3lNp#5#lXO10cJHZFfdtxS*sWrm~6nTOAHK5pqXGs{$C6XOrV)y zMgdUxfo6gk1wi2knh9nU0EHiDCYVtG6n>zYU`7E@_zYU`An3_*-wfWi+n z6U->dVw4wQ zVBlX3O6~GjU@Xw=Aw*0Ou2%`c0<|$gwI8F>4h9B((8w{P@&pD3e$dPhqY9{Z2deWJ zRX{Bd2n*B(2D4N_JqOST2BTU40|P&3gq~5Ihk=0~G%LfX4)>7;sE<7rsGkg$jR2KRU{(^`zsaEf)cDoLE{^Y8KC|k*py7TjvRQn7Q z`wBoK(bqus7Q#cV5Z1n8tbnVltYBc^nGaG|33q)JsHF-vuNLm#I?xFCage$?P;VA2 zTL)@MgINu5^BQv)82CZGZN^4W4+t#V2zP0l3$)k9*aphKV3)S9U|`?}_0K~50;$(su3Y9P`d=ongS|^z~)UYVPN0~wO$#gZh(dOR8Xr0tZpvc zNAo~22pU^roCmjU9y|;dgGw&2d5b|Q;wQ-GOW-MD2|Pt?fSb3mfq{V^oM$$|{ksVs zGuz=Yy&V+OuR!K)hsX2|cuenwha{-)$MXQBZa+K*_rqiGINW{5e?Uje7*D{}oq(%5 z4Np0zK`Cbk$h^~V_nm>e?<}ai0{i#u0|o|ua24E*0f=3Ru_ zdl7E$Rk*!Z*Dx^fd;zHg^#dUJ?HXLi1Gv2pKr`Q<@ju3gaC;xZ?R^GU_Y9Ry7%d$2!VfmTX@#;FiB1pmriS)%^nX7eFi~ z#y<=U0{kNr6o7+{tFXpB)3q(cDKw_*|mwR1pe zjY+VCfk6P&J7E%pxqwNif`LIm8KgrPG(xHYV!`VkCUHLo2BwyNW(Fql3##cz@!1!s|gANbC7wOa9?V{N^~ZJ0tN;FP`jPU2$rsx zj6i;K1nDs5VPFsdjZQNe!^$QmV_4b51Uj}*0JP47$&!VEK>#%W!DI<5pP8&cVFemB zV6wJhU=RTHg_x}2uCgg%VBlp2*bz0>tu%)qYF?aFYW-t69M5AOIASpuQwiASlE^a~(`UanM!5Nubdb(1-|A(l?lYlSLR91VB9p zrermkx@1sGa0y69GANF~vMDAE3<9A30#nKs1_l98Z-Ob+jDdk^8Ax3!s8tFoRhZI2 z?Y|Wuv2;*r0UAkQO25LuAOL1%fI|E%C|t5Y;SAQ1^^AdmsSczg8)QlYm}SSnz|;h0 zf%>}O6p;-oEkLCdQ#PpY3}J!B^}wtgQ0W6~H1#0I&SfF$dVS#$!5Eg9oh$#m) ze#Mjv>ZO8Zb3vm*5Ef|61HuB8q7W8nj0eJkyDAs%s$9@43RpG|R7ycua98EQT?JZB z51uh$0?l_rS)i6BLRLG$O}RSZleAltyHvjk)wsP({93W~uV zP#l$l%6qVRrJ%eDVZmKc3J>Q}P>&ugTLvm4AS_Ui8NveP1qcgn9%vRG5-w%`7#NuP zK(>{G`ZHjA%i9ROMz<8xD+_2RDCLz5-8M~LF3fVK>lq8nF0>oHcc#MLn4<6!upb{AD(tc3c z1a1NJgUkc1abTJNYIlNNIuRZk6G5Y^pw%Z#6G62aI2}v`^~T3qqQk%-2jsta_r4bxOm{R_5Z8mKi4 zHf0{D1rQ0cZ63S?nJ>b?zylVW51R7=$M1Yl>j5GLFI5(Vz|?`}VIjF+!EK*KpjiNL8M_#i2f?z7L9;ht*~K8&L&QMi z#b9-y_PqdT?2u^*NDS0sWLgdyg94|&<)AVQtYZZzHGxBI1-z760Sa-jt5(3%^9p#$ zuoBeY2kTe~YW;)NtpueZFl!Ykje}b43Nr+y zx^1BR3y}ro9x!V=Xf=TnNOn7Dgc;mo+zwZ_9aN`)!)iNd{v09;w_`^b0|OJ-lpUb5 z7;M`PkXyj5j2$4qf%WbH^)JD`+zF}?!D2f>`4Ykc`4_BXC&)aoDLX--EPnb6@&$9K|xrc@&L@*18TuTSfJDiVSz^EAgnr=$$LP) z1dHtzgNf~(2WP=uwGWhr!0PtF!(boWE&JZVbnJ(_em|()1lF-1ln%h*w;wci2o^g4 zDyhNYasV`A0uJ#5p!yfomt;Bs${%1I2S9c#0LAYCP+beru?=S10l4cAg6d1K$p=Bb zHV6yu(u1J39z^UMOz$Ch2ps~o!@#nKK;Z|r_YmBU!|+scxDTfH@IDyp2&jDk)_Vlh z+63!80_r({-F#FJrtT=nJh1FhkStioF?b9f%Y&&q2Fi`#lI9p_d;^?bj)OuHtoJym z?Fcsccp6N{2~fO&WlzA<)d_eEo&b$unDNx%MEPEOr`=>!8sSq)^-qUbjo(7HQfZco=)NTj+=nOoy zp8>T-z%hLWuHy_S{J`d&1*K=O-m{>R0U`#Ex3ln=ISU#U0?j!vor9;{bMO#42Y3BB z(D*ahl=JX3bRIN{4H1Leaef)B6gUr0#TP&&HMpgJK?1tAjOha0Ef?T!z5ucfY~Dq9 zs=EjZU5FUmmlr`}+z>HP$_D%LA}C#f#V*0a^b$PPU4rN2OYnHR1dor)pk6*$?`2R- zLs;+>aT#O>SnLX@w1u$XWyBS@Kd!*T^a{K@xC)QytDw>c?9!{CQ5SGrUWMnkt8l$n z;W_UbJPfYE!{8bytiYyRgU81;P>ln2)pby50Zw(-;i=?0Xbm$sJzt0W?FJ|oz`bqI z>@cJ)bpzC&0oN%vK&?55EU5Gbi`@j}P_Vr>LFo$Y`kU}LzX@tZf?aU)8Z7p2!rgZh z)GpBh)hV|?ie3k~TYm9;2CHh7F>cn1GTvzVxYbs*j3L! z<~;}b5+Vk&1KhHF0V=b>Zg~L;XK<_e1*o2Zh=E$F zpcMv8FF>mfz~h83Kx+cQqk}KtA^8Gi9$4K=(7Fs^Q0%`1NTiM15WL);id9xP)`m#!uJ}~ZU@`@8niAKY{zTR zN(2ZC?$XzAmx3-|0q>w-dIPE(!M42tr4rD7M5Z^OQV+Brk?9Sn)C28DWO@s76=**q z(_2tY4BBDI^cFPR2ilp)^cIwlKsyte-hxV2(9T4rx1jP5v@?2yIcmd1;l|Gk1tPh}C?FyI$DkH9eS)lUj2ABn^Np68zpwi+F zm<6hJ?}1n!K{ee2Fbh=jKLWErbqZ)*0nx; z227to;Rjk_!1M_eexMZwOrJpE2U=mk^a&JxUqCuOfx-{8)_~~~DEvTc4VXTI!Vk38 zfax2nhU12Y3i@8?wv49uYUc&5*n7#NsA^YKide=#sHgXZIz zz9=y;FoWjfnZ9^2FffDWZ%wk|*2F=GaeL2Lyzzmv?XZrGrfq@w` zAJ6nvh=G9_G#}6O)rx_E88jcy^fifrff+O(&jeZp!VH>^XZpH{fq@w`AJ6pl76St_ zXg;3l8xsQqGiW}Z>6;b<12bqop6Oc<0|PT?KA!1Y6$1k^Xg;3l+ad-AX3%^*)3;L$ z49uYUc&2Zk7#Ns!Kz{o!#lXM}nvZAt?!>^r44RK;`kuwWzzmv?XZk*gfq~fstZo+r z12bqop6UA|1_ox(d_2<+E(Qi>(0n}84KFJkt+Q_<`o*nSOx6 z4>TXo^aB)rp!s;FAE599&BrtS1ce`HKA!0(DEvV4@k~EK;Rl+JXZi^WKhS(U(@#+N zf#&0xeuBaeG#}6O3lx5!`FN&Zpzs6D$20u`g&$}>p6OQ?0|PT?KA!0pDEvV4@l3x! z;Rl+JXZj5aKhS(U({E7tf#&0xeuKgfG#}6O8x($^`FN(^pzs6D$20u~g&$}>p6NFz z{6O>ZOn*S(2bzy(`U46-(0n}8A5i##=Hr?EfWi+nAJ6m$6n>!jc&0y~@B_`qGl5pK zFoWjfnf`*p541Cz=`Se!Ks&RU{(`~}v@@IOFDU##JF}Vog2E59Gn?rzDEvS>vzh*Z z!Vg?-`~!s_XlFLlKT!CAc4jmE1BD-GXExJ6Q22p%W;6W*g&$~VHq(Dl_vzZw{;Ro88&CCD_ zKhVx>W(H9Bfp%syGl0Smv@@HT0Th0ql8_m+o`xAz5;8M_!VgpuGBbk04^$E|GlIeo zRQ@r8PGDdLm4D2Ppzs5gf6R=a@B@{9%uJy42P*%VnLyzOD*u?7K;Z`}|CpIT;Rh=J zn3+J~2P*%VnLyzOD*u?7K;Z`}|CpIU;Rh=Jm_h4!m_g+qGczdsK;<7ZGbsE(A2Ty3{6OU&GYcsEK;<7Z3n=_RA2SOm{6OU&GYcsEK;<7Z3n=_R zA2TZ`{6OU&GbA2TZ`{6OU&Gb z1C@WwpwlXtLFFGadlLf#3#j~KW?#j?zyd1&nAtBeFtC8iKW6q{3=Axw@{gHAiGhIy zRQ@q@crh@rfXY8+jv@vI7Et-e%rT3Bfdy3lF>@SZU|<22f6N@O7#LVU`KWU|<22f6Sb>7#LVU0hNEuTtN&BETHm_nX8I{fdy3lF>@_qU|<22f6QE`7#LVU0B2diSq^ZP2b>iEXGOqS32;^hoK*m4Rlr#da8?JLH380=0cS0M zvsS=a8{n)RaMl4h>ja#20nWMsXFY(kUcgx&U@S&Z_z=2n%E{g!Ke2266#J>QwVlop8TnyxTuwEvR>me+V>me+V>me+V>me+V>me+V>me)^xOt!y0TI)Ii-FPx zM9c&(21+FmF&ns;0|NsG=uRpICKou%1J3e+vjX6(5I8FW&WeGv65y;9I4c9r%7L>A z;H(ljtAc@nB@PrHOf_&8=)4<dnQTGBa z_6E-S0B3!Hvwpx?e_$+T1~?0}yAW(1GY4FZ2hI|Jvqa!5&0v7|7ju5dqa4}Fh2@%`Dz`(W(l-im1z*z_2tRryN2{`KvoOJ=tx&mk2fV1wv zSr6c>CvesaIO`3Z^#RWM0%!ezv;M$Xp!2FAZf0SDi*dkNJaCo(oFxKhNiZ;Qf^H{e zV3A>9-~^YzED8(^oS+*{8CX;p7&t+9pfa#%Ffed}Zb@Ze(P3cVya5U!76S$bPS8!O z3@j!L44k05SQ%I>7#KJ~x3w~`*f20~g6?x=U~ynz-~`?H%E02nz`zNPOBN3X22Rke zu?#Fe3=Ev0du16|0vH%LK{wAbu!Jx$aDwipWnhV5VBiGZUdzA|!@$4^y5E+8C4qr~ za~0SHDGUspE5NJ_1_sV$U{($T1LqPjtAK%la}k(T!oa|}0L-dkVBiGZ*37`t!@$5f z3oJH;fq`=ln6(5hwuXU$a|T#!4+8_|G%)K30|Vy-FzX5f1LqVl>keG(4Fdz`B(T^Q zm>4Sy0|RFtNQ{+(fq@frYcB&U4+8@y=&nl!RsjYEPHECVYjtRP}33=Hg` zdsZ1(D;O9!A!0Rfu@!JJP-zRgPnLo809*`IibBLbz{Nl%9605$f&2zGj}26ELBv3A zhKPYmB#0O&Z9v38B@ILj6mJkQ&<;y*`eSQ=*}(>?T_9pJ;9{U!10uEoF1Ce%fdwM= z050}~fq}CJ6fSHp;9{USf{4NW!3K&gh}aLfx<4?z>7$|Q+#6WoqA_mGw5V05r26oWBx(w`~`~eXwfs1v({R=8ZA?g;u#g@R;?SPBz zfs4VznH^Lkf=dw41;dcE2HGRR0uh6U3kRqMgNVWX%K=Ke5HYwvID8lwpnBoynIi=* zHUZ`q4p1utbf+={2RuD#RNF(u;Aw*cl*YkgobWj31f_9^ z7(6aHL1`Q!29G07P#TAbfoeL?jl~R{pqdWC0@ZX77O19!us}5(gaxYUAS_T#2VsF~ zItZ(Sfq?_U>VdN+z*$q^tQm0D95`zMoV5hbS^;ORfwMq!7@%8A89YHL2W*=ss04A!UC1q5EiIpfUxGk^@36?L=04-Ls*~`0bzm4b_fepfR)OP{b=U$+jyCGtr9t*hM_X6G24G{zNQ^5Js3v@F#M9hVO zfgN;LErS(yJz-<99c)WRoTL0iSgEy$41grA~wfVvA4R6rR>ku(e zISFo!fcBF>(uOyveGhK6c!O?Mho}RUo#57uH)u&RL=4oH2e*B^LA&B1VxaOA+%obG zU|@in7s0^50&Yur$H2uvWh}U*<(&Z+D_~$?0k=22OW%raP&p266MBQr zw}6-j>eGQ+jNVt^>Of^XxIO6&x@jDu4wT=(txa#x{Am-hHi-AUaz-@V-7jUr;3=ACLbl?Lo z6MaAC|NKC070`X@ z41VzP&kxi>sRG*zFaP{N?GkX^;|DMQK>IZ~!S$dYy!`XKz`(#+2G$EN|NKC`)DW;3 zy!`V6wbsMHV({|M57ZX|kAwKZ%Rhfm4=4(x&L3X>`GfjBF<>!x`R5O6)q}^S{AFNq z&T;z{|gY z9}Env;B+4VFaH8r7#LW=X*>{K{sjs!FtCElwLp0J7bwHPzzQzc0^#Lfpaug2E4W+> zgqMGTCJYR$;BqYxUj79-Ffg!!%e6pw`4{NJz`zPF*8)Ka23%hTMldk2g3F;mc=;EY z!oa`^E=vO8an7SixhApq<_jJAw=t7+AsW_8@rq7i7c0 zzzS}+2f@p~AP)uxR&cvL2wwgLg)lI%g4^vu@bWJxfq{V)+(rt5mw!Py3=FK`wtNu0 z{0pjJU|K9|SM|f+jF9u!7t2LGbb~XbuAdE4VEm1TX)BK;<8} zEgu9g|AIi}AGjSB1TX)BK;<8}9To&H|AIi}AGkdk1TX)BK;<8}eHsKW|AIi}AGoa- z1TX)BK;<8}%^CzR|AIi}AGoa?3~&DhgUUZ}+dCLu{sn`|Kk%q?FueQ=299FaLr;c;PIwlc=;C$ zD*wRaz`^kHFBnw*fyZ)#;pJa2sQh~as(XUr>?^oj3xSt^A)r|baQueA%fApA z1_m~8ItYQ6e<2zS3>;wphQQ0e5YVhDxLgZ?mwzFkxm0kNhQQ0e5FZ8xc5oRM0x$nU zK=W4MGAsmM{)K?X%)xm&1YZ7yfac@Di>evI?(=KNSud)`oG{ZF%(|@g@R_j!DSt2cQ8~P zsQ(Kt6GP$UUnr>k2QL3Y;pJZ_Xl@Z)Cx^nzzfjOPE4ZEsg_nP!pwU%`Kj7tGC}>O- zoL58PYn6kh&?g8IMUGBy-m{)K|(Fu?83PUjBuF<|eejV({`W3^aj@bWJVG_MP8--C9nL&E?xn+q;u!{Fs#7-$X` zT*ijM%fB$t%q_T#4THD;!a?)3;4(HGUjBuH%0F-!8xAl3!a?O9xRn+TFaN?d7#P^T zfx<5wUjBufFfg$F0E@xPzi5p77j1}!a?O9 z3)nn(`4t%fE0?`3G);gu~0faM0X4xc&%- zmw(}F7#P^W`8OP1{)L0eKX6+w9A5r~gUUZ}J1iVt{)L0qErG{w!r|p#IH>#s&kl#f z%fE0?`3D~B3x}6~pwkD~!R>=^c=-n^XxPDX))DaXF9KBlfzw(9y!?v*tqTIT86x22 zUj(T91DEX)@cwUv0RsaExXz1!mwyp93=ACLwtNJ<{TBgRZvk!(MZn9y2+%4EaCsjA zauzs6M1aaaaM>OKFaIJy@VbrT6HEx`T8 zNKn}hZuLciYGQC59|ExXg(Hr9W_s zI|`Kk!0quUQ2GPUQbd8$AGp621xkP5URD$+{ej2Aqd@5oT(U-i(jT}yjRK`Va48xE zN`K(86Lgvj1GvPD0;NB2IT-~?f8g3Q3N&8<&c9Kh+6A1aqd@Ck!Sz1q{1*<0t3dS( zxbBVu&4z>HG740Nf#Wg?G#d`i(@~(=aBxnJ0+nXq{2K+Td%$&k6e#_HTij8g^ambG zivra`;G7Z#nlps>1C;*2wRjXL{Xz7C(jUYHpmm23UxLyfxE7BBr9beTO%y2ofm;tz zp!5gs4@QB~AGkFV1xkP5c1{#1{Xu*QN`K(?OB5*mfm^CkFBlj&AR+XIfq?^J9w_~R z+Z$1!^apNHM1kfTA>j;KcL)yWXwbSta5#f*m|+3?HySig3^q9$w6X#0s%X$0B-ky{ zpmm2}7l3Y}fvmxZ2F*r--4_j7cL?@*G<*d_G-zHD?5b!T1_l40=HzMLH%xU`z0DQN&;@RM1#h(z-^Ui zP!AkjlSG5YOTeiv8Z^2EPKnW=zBsrhi3W|FfNPRyQ2GOx&(Wat2QDL`LF*2|bxJfS z{ejEuXi)kCm)X&v^an26qd}`NAbLS7YrwTZG-#zZB!ob#F~BJ?dIJLk2e^ia-on7Z z0j?pUcQ7z;fOBK?9tH*uaBhq~z`(!((F@1~h64PGKc%`;B*xe!@$4>PFFDr3=C}GbQP1rz`zDhS1}n33~bGzwt= zYOBP6`b^*y5d)gx1*ZtmO;T*&)ENWnJ%Lka3}~(woH}DbD`mlHJOLEXnr5uR*41m#=vcrSOo?KHgH=dR)v9q4cu0V1@+6oZIxIZ z1_m~8TP4p~QmHAGn1Q3rc_Bc1bKK z{ejyhv7qz^ZkNP@(jT}r5(`Ry;MPbiDE)z3Be9_L2X2kTg3=$jH4+P2jRvs;RQ^F? z22}roYm!*do)vJ(5DQ9w;8H3Uv{D<~@`weMf8bmj3mR(ymr}7u7#KLfbxJI#{Da7X z%0F=4j|G)~;QST~D*wPaG!|6;f%8HvsQiQ22HJN5E(KyiD-pn@KrE>K1?Tu!&?qN3 zuf~G*oq+RdENBD`VlQaC6I{Q={$XI?0Ea2)LP~aUITQyP`2^REaU2W`9N@Af4z#KS zTu#ObFfed{OOQCwiY;*26bBk#1D67EG7JnHVB6vp7#KLfIX+H>fq?^D9>jshMZq~f zPKSYk1DrPEKz&Yd9L1S1FmQn5D9(a`fdlNmI8g5s;wsQsDY#6G1MNEjhh!Y69||tH z;y~;E!6jE5Xx%@!WQYUxNWrB=9BBR=99waq)eaDoLF)v;^-&yXCLQ8m(7FeR$)H(U zh;5*=A;GyU4m1J;&NFeK^X9-gDh{;cADpA&K>OptbxIuQ9t3a>jRT#91kR0dpcSi- zFaXuR;PNjHG~xh`={V53e{eY&2U_6btE5PMn94P&P%fC2K`U97LaiH`EaSJH@LBbD|{=hX;+!qE0 z4sb0L_k)3f16;erfzls1oyIdTFmQnV7SF=KzyY>59+dvT_JU46wp?s!A=& zXJ7y|lo=S97(pF;CRq<-*fXyl1q?Wgw3w}g48@D zW3bv)l$w~5lbHv%4x2fpd5O7%;;T46IXjg&zw5)?gv~Cf9O#HxFcXg&Pp|^?@BxiH zFfcI0XXYotEEC@&u@4JNSJm0FRB6v}9M5bEaQlA;{sn8#*L8d~DOrY5sEv81FD z>=ZD8O$}IrfdN$Xf|=OVq!kop=9Q#@r<3=9l-(`tHZNopSG@KC5? zZ001EQYeizzKTnVk~4~6DsaU`A~Eq*l20Hn7ZVYN02SnWc!35T2WbMnhm z5s`t-E>Kwqvj;?DQ&U`0l$V?f8n6SYz;0J@NfAoKV>2hSxU`^vfP2!?Q%m5L4thBT z&C8j^DVga=Sst5R#U({0`S6kjhntI&6Y~&R5NkMR78e&JCL>Z1HoJ0Da|x#TqQp#s z^?MpxWMH!klvd005_2Ijf!$wVHKm9Yjm@0mlA@GSM3iFnJ2(tW5t$IXIf*4@X^0rZ zrY5JjB(cN{Gz<-KH8wS9O0c>oK0YP0tQ27oHghtI6LShO5+N4hNIy`?ZYYh_u1rYb z0#kxj4O9{|%K>I$bx%G@lLV_dg~jMJD^p$MBfpd>~} z4Y=AtQiRPMP?|?760o|b0BjIAXut$Ea|%F?2FpSSY--};6N`&e5kZ7aO-XJ6Qm(+6 zFVc(B3FM2);^cg!LIImynZ@Zvi3Ny49Ge=5Zy1(CX{_M`mD>cR@u>mLH-MF4v#TgI zH@^%~MBy{%7}yZ}`2sXk0ak|1F0cdx!+j`?)hSxbbP-9)IlNQ9c_M5qDH4TF{8_B#_FSOMO+V3NkCCdA(vDjjhHbh=kI z(pZ5YJSTvacrq{`se$GsLC}FE3=9mQ_B^Du9&rb54i+^9;672r1AJ;A^+m)JJZkci z!3IUVz@;WBIUlTofg$1zE;Wd1C*lJxHK23|8B2-yf=3N>EG6Ox9yQRhl!!lg)Ii5l zB0<*zGJxX(EesK3DUmF=%t4H$L~`I#1CCJ!22}=zNFH2j5MwEk0=U#5#!@0haH&C5 z-H{Tw)PUL>kg=3V8C+@*V=0jexYQuVQX*Awse$@kpMfD#gMb=a28Ku-Txt+wAdv>R z)F8${B293qL5zV!THsQH7~hDr!KDTfyMAqO^18R>!TD_4C zxYQuVHzHebsVRn!Z$x(BQiB-Zi0r|o1{%(d3=EMIaH)ZNogs1xE;S|a@r}qCxYU5k zABcUCb8x9ajBi9Pz@r8_z7e?umm0+QM&t@yY7pZak!x_NL5y!iZos7m+!h6oZ$xgv zsRlm25xE1G8pQZUR`4PtyF@(3<9i1Cfc6S&lX(rP)lCl`4JuNv_9 zM&t!tY7pZakyr4jDai+qZ$u*6NNDvkXj}p^z7dJD{eu|ah{V(WfenE~;%xsQ#y28y zwto=g8<9BMKalj!(9OUQiL?EK7~hD*+5Ul=GlPL45@-7-6F$BXiL?EK7~cRL$jpGX z{eu|ah{D!vv;70EcEF0FaJPR_bD=|?Q8?Q_i1Cdmob4aP z_(l}Y_77rwBMN8x2Qj`8g|q#Wo>~GO--yE5{wao!Z$#m2{~*RUqHwlO|3KB;XJClJ z+5Q2QQIPSCD4gvds5x&K7@}~tf1qlyZU%-Zob8`@mEaJ^5Km_YhA5ov zABZ_1G74w=2P6x@Q8?Q_5P2p828Jk{?H?rf;B5au%mI;6INLu+=HP7qfJ|UuV6tXl zh{DfMd57!Am($UaJGLS<}giQ zV2Hxm{(-0gkx@9?KOk8K2FB+M3{g1SKTtKZ7#N~(wtt{%dKnm^_TXwKAjKEX_7B7y z(6~($&h`&fjWh#86wdY!L=EFw28Jk{?H{O`2nL2Iob4Z|nkEK@D4gvdsG4*JhA5ov zAJ8}nWV|j4XZr_gP6-1;6wdY!RE-w{Llo}z4x$uh{oCefvRa{V2H-q{(-8Q#=sDbv;6~Avx0#knn3%9c{c+?G=cUH z^Cbp`XaemY=I0Cy(Ky>b5cjY!F)&0EX#cQ?GcZIGX#cQ);)_802XsPjG|u)9)IFID z4ABJIKP;fQAkh9{naIEpO`!e5vXX%znn3%9UjmFvjftbT8!N3qrp#8(D#=sDbv;6}#$CQB~nn3%9)tiAKnn3%9HIacKnn3#p zbWU(I&h`(~J^c&}(FEE*pnEQ&akhV;=4@nOh$hhfVLima5KW-{!+L{(A(}w@hxH8u zLo|W*4;woJLo|W*51Rr5Lp09z55!+=CJYSG1lm8K`#quww13zV7#N}nw13!Y7#N}n zw13$87#N}nw13#O`!e5-p;@fO`!e5KAnLfhCurVh5JRB-!+wW>AqHpr2eIZh250*R$zM3zKj}H~ zC5hnGyDj2(*7VCNnU^5NQ8!>}FtyA<+Ke zc*(#JL!kY`2?|33?H^8W28I{{?H|ru28NgnTzz3s$^qSuz`zhgp#8(Si-94AK>LRi zly?ZUf4G<#7-9&tf4DRl7-9&tf4KY@7-9&te?T`)#Sm!!a4lhAh#}Da;X1>>5JRB- z!}X4VA%;Nvhg*VyA%;NvhueXHA%;NvhdY^pA%;Nvhr5e`A%;NvhkFMDLkxlT5BEI= zh8P0vA09Rah8P0vA0Ax>h8P0vAD%b{h8P0vAD$Klh8P0vAD&eV3^4@SKRlo~CD8ui z`NqHyL!kY`E6czTL!kY`YtO(CL!kY`o5#QqL!kY`JC%VUhCus=7nDy4w10S?GBCst zX#enWGcd#uX#en;GBCv8Z2v&Y7QR>ph8UdfAE=sU28I{{?H@i+S|!l_;k&`W5JRB- z!}o`QA%;NvhaXh_5NQAKhcPh35@`SM*Dx@|;%xsw{La6WfgzSa`-lG=14Ar<_7DFT z28LJy?H>Ud28LJy?H>U@28LLi?H`Dn1*#YrVsW;AplX&gFvQ|)|3KB;U|@(P(EbtR zVql0R(EbtBV_=9S(EbsOXJCjW(EbtZXJClM+5UmJS?~}8Lo9*zkKi{3hFAjaA0asg zhFAjaA0ZzGhFAjaAE8DDhFAjaAEA{D46y{-KSEa+7-9*ue}w)rFvJpQ{|JNPf{&bB2O6@VhOZ=LJ7HCIdqpf%cEY zHwK0{0_`73DF%i(0_`733kHTb0_`8kCIefv9D(+a)MW;SI0Ee-saFgPaRk~w(u@oY zaRk~w(vl1eaRk~w(nbsnaRk~w(g6$%aRk~w(rF9~aRk~w(j^QGaRk~w(rpY3aRk~w z(sLLX;s~^Vq&G7##1Ux!NS|k5h$GPck$%F!5J#Z>BmIMcA&x-%M~0h$A&x-%2XwSe z9D(+aj1>bz9D(+aj2{C-9D(+aOcDb_9D(+aOa%i&9D(+aObY`;9D(+a%oGNOI0Ee- znWYR2aRk~wGW!`A;s~^VWX>`$#1Ux!$lPOKh$GPck$KC&5O)CoxTq{B4-#nq$b!l` z0_`7J0|tgT0_`7JHwK0{0_`8!Fb0M=0_`8!YzBrn0_`7JP~Ahnst7l+{C(!A zcmnMo`MC@X@dVmG@*5Z!;t8~W0oNhSydwjHblbXO}A#DxsFZTCR39lY6< z1z~#(#7Gp|A!=AaAqBSG38DtscCZo#PjEQ~QiE@7#JA5z6x}6rdps^BY87Tmj@SP^t@dfQZ0C9>P<2&%gjyqX2Rb zOB_TL)eJ>e1_p6ZI4gk6!J$Tmfk6V4#_*Y=&A=e}fPs+#pBifh1{qLl!Dp901A{Cf zyW$uaz&RhET}2EGDh?p`;PF=j1A_|K&3M#IW?)byq-Hq-gIWRsyLK@!s1q{hBm;v6 z*v)w2>k$Kk)&T-`y=7p~2CKni&VL359dKOWR-+`uz@Q6OgFAeblo%NFz-sWAW5&Q> z08V3g)Oa&67!p#Gz`$Tc$gVO51`|T&bTKfP5mGakfx#RcUwGWSk%7Syln3#oXQlHD z3|559dCtIK4R#NnaQ?%%n4y&a3he$lnWUc zJi++_cNi*nGcb7KG)FHRw9^h$Zh3>%;0_<;BQ`@>s? zt28k%B!Jz6JDgP}Ffb$$D92RhGccqOGG{ddLn=6};t9ju3=C-m(yGcO28J|n{=#F< zO9qAv0_LbPGB9KkP{Y8$z$|hCRxdNPfzmDmgCw*nN32z2LX0&*PePJ}o?Qdc0oo7Z z1@3==+{^&F!2_u+3RSa2bc!9@B z@TkdSVDJKuZ{ShW%)sD<=sRGIFXm|s3|`>z1U%-fU|{e2Wjol24h_*ToyY4YChQr&&*wtuqGB73)@Rz0$10$jhiNl;Q2F4r$e%GvH zV9ba23vigTmVvQ?keVwDjJ1UP^_PLMfq*$$stk;6U^nAV&sw$&jBNzMM=PI!v7eBd zX$*{02)So31LIr*{?dBDz_^$|S*Oj-z_@{cIoieyjN1w19qlj%#=QjGtlh@Ic$|=X z)-f=i28T25GC}(a1LIi&`9g<*f$;(XyL8kU7_SnrODBkd@c|*bsu>uc5mK{=f$=3F z_uOD${6HWt>-=P3{74|abmbTrKM`<`t~UeYPXh6!TgAY{M8G||3mKUB38ZJ;(+o_4 zgzWmtz$5|=AKdv%kClOmQ2nl_!@wi~j#E75*fB6kg4N(oV|wWfOwxqZ%wk}Y0lOKG zIma28WC{3P?<)h71_8VD)ft#H2$-WE#lU0;&ZoHju3yc-WJJiW1q@8)1k#xPB?cx7 z0%{DH8JH{yqzwae1}19)?lH(=V6rCQcY~=6Oip0GO}3 z1%cJzw#!JHfhh!R7albh3``*e(uPqk15+s2?|97VWMB#-5En-K8JNPs=HT(yHwLB% z0_GSSGB8CFNMpvS3`{Wu^1Jaw2BuhW_~3Sr@jeEoI09}qe$BuXPe6@{Bm+|dSPkwl zG%;piN+RGdlT-$#6asnBWFiAo3V}E^*~7pD8LPzOp0f;0X@uPKgMldnoDOk^p{WuB z6Ji_^d;8GTkAW!@96or=sbyfwB48J2JX4|oHlE3S8{BEdGM?!P9zz599W+%4QiVF6 z3EJn|v;)*P2de?yL(IUyAdS+02kpJ}1+N1Exf%PICur}jKX`o<9yKWp4F2GCO?cE4 zGBEgq*CXLp1KMxy3tm%!TMcM`u0MFK5gs*@85sN#bL&{g^g#P_{lRN{@R;+Gfgymv zm@sI6ZUBKW1ntia0Iz|;Z5L>NZUA`g3LZ7n7#IQwgb!$cZUA_#2p)6pFfasw*LdJo z1KOV(KwzvJv_Ch1z*skEe{KMQv2M`*+yDY&-Jt!s0R+anLHlz92#j@ey<=bqATZVq z+MgRhV5}RoKR1BDST|^YZU8u+;tprf{@efpW8I+rxd8;mxegDg7)VIf!AK*Rs%YB#TQ)8gX>(Z^$!0z28JN;x=K9elrb>)g6jf2=6qpb z2m-H}#BB~}pKlO&ts@>aehdsj;5CYP)KoDr1cBEU;!(4lfguRICjyU}8w?CV;JpmE z)qqz21%dY<;8CN;zz_tU&&8uAo`E3K>K`y2(-08`+S24w4*@#e1izIqd@z7 zg9x;vK>K`y3ACd?=Lq?N+by`$JZLX)FoCufXfJRuI1l0uXV6~YU~vAztp>CgIG8|N z3$zzF80=;|=JYWz1QTd$f%XCi6KHFJ_5ueJXlsG?0tXXlYk`)z`h(Ld?r;X}7Y-)S z9s}(c4kpkZ1ML?MCeR)Ooe|^@&KG#xbA*8*m_VBiw5K?jK${J;r#P5En+>$5IG8}2 z4Ya2?7-yReY2Nb$^1P?%21sp#AWc6**aYT1nX*CsWzf7Q11scuWcWI2h<-C(28bH) zTqN5rh$!m1Q!{x6rULl51a>u`zNab&tnbP25MmDIS{i0>8vq<%2~agC{Yuc@RIMAg|puGl1BKAc+h^hAhx{0yqp+p>9Tu28I&&I2#UsO$1+$3tgv&L(KvPhB88a-^9RBLCCH{3=EZo%(>3MP({dJ zZx|S=37BKS!N5>MATBIq85n8_gtLVS149D=_gHu^Ff z)qq&X2)aBDve%3eRFyL@Frbe6f%cY$5vX%P=M01p=nsO<83-ZJA7tIgz~DomF9SLk z)Q3Qu7PPN6j6iz>v>!H%KpOzGA2y6Y8vwLFH;h2L1+-^2j6gd9v}ZPqKsy1nXEqFH zI{{L|fcDIW5g6M6?U@ZDFt!8QGaE)=YzMSwHk`oN4rtG8IL>+*;%3l!xjqE?dZ2x^ z;RMjQ3!;%?7__UDEZ7)Ju_ z&kZLqjs)7D8%|&x3A8^qoWM8|Xn$@vfpH|z{@ic^<4B;p8@#~%6i^w3J{N%09*aY6 z(^|4YQUrpugzkER7F@X2@-bzB%0qB_i~;LjD$5E6h#GJ^fjtCb18RE=RA#CKz{*Sp z=$Ln1fnog3k5{#+knme&+~5Zi`yNZ<>af$-qFQ-x(%=>K(A(-LSUj zEsrxm)PVOFu!GNs1t(pYMWFqTcNrKa!0SOAYF;uhOaz59Bn+{dW5vY4Fo}RUR{RVM zli~FscDtuwxs%orG^!0SpJYJwRUro!7uIMn1aFieNHZE&b*Wnh?2$gWuo z3^NG%eLVxiEJ9&;l7V41A-nD}Fw7&Q<|_lkd;nRKjO9-SN>lF+P%L)1G7z4vf0%2(Vf`MTb0W~%P z3=C_)YH+*RMwx+O9VnmT$vZaA3=EqHsYzvE*hIkZHXRHMn+f>cW;p}H7D9IIW?lBhV2CMvMm<_!**~Og6c}_@ouZaz_62$ITj2II|+o3tuF(^E^zqZ zjxXCJ28P{Wf8kM+&%m&okelln7>H$P@zI8VUM_Dl>67YL+hdnE>j3k1@by#)iqMFMr4 zy*~rPMFMWNPhnuV1a>p-G;iO)z;GFC7ale97#OaA!w`>}^$ZMG3D^Z{kMV)*0=I2g zplePr+hdI2xd4z|j24h44QhLgshWYo3p}n4QiI+Wh3EjCwHQpGzaue~fgyyz{2=H& z#t;I1BGBC*J_P2iK z;-E8v!U@C$=q$ld0&~8gvnWFd^wB_P(}fb~SAx!_3neg40y?uOoIn}_ou3&(pkE0( z*C?F8{5$Au!%zZq$DlJ3LkY}5gYG)?0?)_c&dZ?l4?_veFEfQPFnEFI?C_Wq#lR3s zU@n^}je)@nJgOnj}N*F$%nu^KIk4O z9|G|Xx(CXKKpJB`#K7P~AU(6*U|{eekS{>zeT5UKcR=TTg%c>pK<9l$5GW5p=Y2&G zD5F5s?F|{M^Lh?S3=lQou@sI7hz+RYNDgKU4EMop8&G=2p(dDt;Q_c^2P!vks7YsF zcnEGs;W4M0f#DIn-HXGVZU%-&@U|ZgHS-x59)sFi;QlENHQN{%o)EI@Bm=_}P#EGf z=N<#YQ$luqVPHV)OTz9RM^*-g7X;knD9^y~mXI0~28MUwxWFCGj_wQ$9|@V0$iVOk z+@8lBr;f!844(+uHGzTQGlBSWT*1Kbl|UMEJkG%IjX?Twe9pk|oj_cG+TlX*HRMd; zkTj3k4rc<7nS=b!fVCYCI!`#1K)Vifo?ZljavpSVpbvpE3UuaP1cAB$bmm?Jfw};6 z=3WGWHC>={3nK`W;h=L1BM8(fpfd?02(%MGXK05IXlsGa0E{58#td{ueK3J}BGCDV z5d`83bOw6}fw>9Ld4mz)HA0~Lg}t8wI!8K`K)i#_kq#vgr=YXALvhwkNc9EES{f(l z+Db^u29ZwC)947*7uP`f6kK1h9RTS=oJk1bIb|>~fYm_i3+S31)cV4ygn{8YBA;Sc z)5^eb16=-q@)rkoH8U9)ZX(KF>}pmqFx*DuckF8RFfiO9paygYx)*ru9LPP`;}mqK zqz{3-1G-bvhd^2do#z=rpsfYEpV0^B+Crpw|ApL6aJmSIB?L)qy#EH3;ox}Z$J$PC z7Gq!ltAWHj*0mzeS_}+-KM*jxPfvBcd+At|o?okr|Q3u&b$K zU}OgQ3!i(YGBC1&(*`KsakytG10y@Q9>nA3-3*NEV7u_BxyZoC0k#W|nl}uLoCN&k zBFezXMId}Yb(}bS?vGIck|HqcIA(A<1o<5{&xktK1iAwv1Ux?oax;#6v5tYkhfsO= zn}H#eK-~noMBJ&_qA*ehA=Rs#^e4!fUlEnZ~14+;SAaROX_PW$FFcl)w26i>m8JG&e zc@Pxu9N5(?W?(7;n}bKqUIwNTM83do&UFT+5^x!g$DDTzOr_v7k6Vo^0|QeT0XMq} zGBDKX9WXOH==C88W*m68JKzq#Hs5A2BuzcoZ|7v-JU zz`z8VTgRhjA_LP50_o6g5d+fzDg)Cj0`czljDcwuf%N0{ zoq-9m9ssxB-8mSTW)pC;yCehCY;c_7F-MDmX%2zB<8H;kG>1UEyL&M(%^?sz?okX( za|wixdlm!JTms?aUd6yP7o48)_^XS7X&#~QnZ>{~kB~X57?|c0a?dUXrUiujb&7#$ z0ip1@#lW-V@#J7&T1UVxPZ8d_<`qz z@u=};VDJO?W$>u6W?=9G&t>CLqs_qJ2kwL5Q6tU3;E(9XLC1bTJ4GQW2}F8uGcfpr z$LnyLlnZ2`4^z~es_4G}AiubQq`Kq2~B8FdZS}_ecgN$XZ!E?nz@{Iu1%d;Bh1zZZ2eCI)T&gQ1{d^FrCEd zcTo6bXM*DE6i&N9YEn{j7#NsN;Y=G)yJj&koyMsKWKL>Das~s_S)6u3%~{641X%}* zEqp-clxG&CGBBOPX&2O-Z46B33B~DQ2B!0b;_DIv(*;82JY-;ktY5|EW~h5UGB8~x zkmkJ^8JMmRu*;i|f$1uNbm%R`z;q3#IiN61PX*<7#GD=WH0G_vz;u&9e0iHPFx|u% z7a+Sb^D;{qm~P=z0|_5*X9gz7+#l{R^p0d;xQY$j#Wz0o`dE25yhxQIp2N5C&c|iCYcmPQVBP>rO#;QaHHxe?!cUUuM zK-?q<-NA^swGg5PWHMJdL=6*E4U)+XNG5~tvtwQXPe0g9Mp6Sdxdx}ntw<(=uL)$0 z!D}*-8nDTYI8E+Cm<+ilkUavQ$;fKJCPVMm!4ew%P?O=;^06PmX)>A`u*uM!lvqrj z0yQ}~C%+hcnIHQboF=2G0h#V96AGB9wY5HK0825j0|OS5H^EHK%gHP*VPIh3 zxP#kdR5f6e*WomIJH%v&ypJve11I=4PduRkR|7T~+8@H=<~T_+Q?o(lbL!x9 zGnyK($vZ%Lu!hD#sL8o`CCMc@3=9mMAvjG&Qv)`6FHVz>K~2stNX-K);;g}GGMXB& z$%nw2u*KkMh{+In9}5Ns&Ly}^Mppwi`8Y%rOE_PEn5B&sCclK5T$Bnm znrjM9lhM?GO@4|qG~Pi?PAf_US1Al!dvKbJrUq>CE1V{OhMFAjT2zz=8Yba-g41L) zHDHt9<23mP)a2BPOi-F*VBqG#X)>A`u*qL=n*0}Pa&bvf4mf{vo8UAVO%2%OpSVos zW`dfW1}hY}akpg9)PPNfjsIZeL2h=a$(hB8B_)*%3=G^YINgk<24pff^d?};RL9K& zF&W|~pEw2v?lrhfMppwi8MI=EEN)hSn5>tcT9TRvy8esD z2bam{YQQGT;51nkYI0&pekNEEPYF(w(bRxVRs?IpQd@CrK}?3o`;;*-@XWzwGP)YD z$!ZW$ETN$fF&W$k$tYrAVBo>seg^erkko)p*2ZbF3EX7pjqE(Q+t0-%C~CkaL(kj8 z;$};@$wejkp!NnY?)GzW35pu9$)-5nYzH$LmQ#3fwx9KiQPqG=w!&$$Gt}hrqRbL- z(a(#s{j7(k25hoDPLn}*#DnfqPfsl=$V_2iVBp2seg>syWHn%uU2vKVy8j(ya!F<` z*vSmMxZBTYYQQFY;xsu35*iSBpJoOIUYzY`bTwd;p)2mOq>XTh$$DvNIi zINQ(YYQQE3L+rz1aty>|h`diP0|TE9fjkIT12!2t-h##CM2N|Humr`xhr9iZrUq~b zv$(XN02I#rINQ&9XllSFgQ_9yZmx%#oR*$iQVg=6A7}en4^0i&pAz0BgooPvx*1_nXg?PoMKV3SYdH2Dg|WQe@a zHUC z6PzZ$g_>MkQdC?5>RSonZa<@`0h|01r^%n7CWD4IQZkDe7=&=PpY_nxfK7gf)8y|^ zlR12*|DPLtW7CKtfQE`)KnpV8ESOy+@ZAj9HjZkWlS=mFU;jJy3@fT{*; zGCN2Qwsswl0K{a7yw5!b24S4-XLL1Slc8%|vA9_jVzORIZb4pRE&~IDFz)sa6XZsml4cKH$h$t2}JE52?&%hvxv;7P)!xydw zY_c6h6pP93C?@MOFo+UpKl{SffK7JBX|fN*WbhbKVsSA8gDB4SGrAhE$sRaO4uqHt zk@vM_U=YRGenwXVHrW>#Y%-{$huzJU5R)P9QFzb5$PGX727PT0x*D*_r4Ugp;arDo zvZ4$FBliqk{XvKs2sL1nt01CSOm0RoS(|~88?*`zydoOAn-$?|z$Vw@G`R!CWPb)m z?iU2y3|9j-xdo@my(lKfF);E75HK0825fRCPLn60n0%6fkq2~k2ENdMs{xzbhtuTg zC?>yUVB`U<0K{i9Tn*Ud$v91(gJSZ321cF^0-*s{12!4D_YF(hScq)0k`eOK-HcEJHW|9U7mJ%OqnK>Rz{ux7z+|`@ zu*v6fy7>l*$sr7kd>I5xhN}Uad7woXu#EgO@52h$bee$dK%JmHK`12*|PE|Yl~P)s&pVC2WS{uyG13S14?`Xz{r0A ze>kha)qqUqg>FK_Vlo$s$+--S{67eo3|9j-89JAV#bkaIlP54R3V?P=;0tHC8nDUS zI734O#pKlti~=46+zeL(HW_*bI~F%fqL{p!fl+`!`&k9925hn@PB+V;n0$$WQGh`E zSp}{JY_b$ila*0Se#yWnK%o7s0#^ezSstg!8ptNAGBPj<5NJOm)PPM^!D+HCvdO-4 z85pt%v_%nWz$QbtNMeaWBV>~;Oc)pi3AD@+YQQGz;dHY(vdO+%7#MyLXxAasfK4{W zX|fHn$qv;FjDiH({0KE*lcDF7VhIgLWRuPIGcXDg2xo*Eu*tSK-Ry>JvhOJdhF=8Q zq6jr$lbvvy?2T-)T^s|WAc5WlLJintcbp~%pqO0Bz$i$dH(>`?12)+Qr^%tnCi~uF zVE9F#{ftlpHaQTd$x+BA+i5T`3KHn2Ak=_O4#R13Jc`LK42(hq(z6|04cO#poF=Cr zn{0lFfl-J++CZoQn+!dR5=(l{L^j!qpMg<`KsY1RfK3Js(qbJs;mt!f+4l_t!!H8; z6oeYE$yqolc(b}c>%;^h`iHG21a25Zbqm9n>+`i z6HB?V6xn1yTLy;T1bUhXHDHq$;xu^`ipf3<48IBVH2vUez$P!lY4UnxlbwAT7=>|$ zGsFyp8nDT$A);79V+*p$79I?Y!URGCp$2R+?7U@Y+aIw5ly@hx$z~TB7=;Oh20{(k zWaw>`Slql1*<`clLFp9~q7?|D>D3R3QYQQG*<1|?U z*<^JC2BvoeN+g6Du*o7gO_oJ5IhcXz9f1-_9j*p!vLsHEl~7EsWng+ophQxKs{xxV zhtp(r6q6S*Fufx%dZ`Xq12$P1r^z}fCLd*BdPiXNQXQ@aY%+9=8cW(RL^1g-1JgSK zqnGM%HDHrumsc0e&X zoq_2+fzeA1xEip@HaJaoMKO621Jio~qn8?RHDHq+ahmLfV)AYVruPI!FE!w5z$Uxl zG}#};oVatN}?nw$(w9|(*wBGiCQ4!~)0B#OyK3``#gj09@J z)qqV7#c6UJipgONOdkl01Zu+7fK86VX>u}($#o1&9|(-sX~NZjO^(NDat4aYYZ;h6 z5E!r1gsTCY4BFs>brgax7scc&3``#gjH+qE)qqWgY@)?h!xo{K{Fi|VeBTzHSr1LP z8nDTb!z8eoT#jtAmMsI*M*^d22sL1n!F#l@jrQ=>pqQM`!1R&8sG1gB4cO!goH5vl zV)8TwrjGJx6t_E!K0-PqVL^1ga z1Jfr0?PqPc8nDSrahkji*<>9C2BuF0+Rq3zV3SwjG|b>M2iCa=e7 z@(vV}gBX}T6KFr{z}0|F-h$KQy(lJEGcbK7(0|b>M2iCZE7*@$eC zJ`-p^Bh-LRK8w@jYbYjrGcbK2(0*yKAnO@4}E@@WR9F9h1px^OjMlON(V`4zIsdaMjgUkJ3H5o*9D zKf`JAdlZxH7?{2gXg}-0)qqWYjnm{WC?=;fFnuM^e%6Dl0h{~*r^!E2OrFKS^p!yS zSr4uTZ1Pu}CjUb*`8Wg9R|4&4J-8aM$-i)!%+HKs@>d3?uLRo9dT=#hlmFv1nFHBm zeRT$=uLRo92sI#+`B`w9%!^`jH3QRE0_|sgxEip@oH$JuLNR#(1JgGGv(ox-HDHsW zgI}0q1^nVDCSPJ;`bMDrtPfWMHdz>_n`MwqHehC8`bMDrj8FqM8G3Fi7B?%Rm~76# z^o>CK*#NEvY_cp)H>;tToWsEMjX?X^0ImjXvJy^{wNXr-%E0uEK>OJMt_EzfI!==f zP)t6;!1Rqk``G}l25hnpPLoYhO#a2d^qoNa*#NEvY_cIvldX_VHdJO{`c9zzj8FqM z*$k)2_9!O%GcbK8(0(?As{xyAjniZo6q73%n7$KeKO4f;fK7J5X|gAZ$p;viz7uFa z8^YCqO?Jg;vLA}c9~hXv6KFph!qtFH_QGj$FtW);77R>32(+IOYQQG@<1{$}#pF%~ zrXK{_&qi=HV3R{|njDK_@_q)U9|YRZMsPJ?lOu7OoP=WXHwLC31lrF=a5Z3)<8Yds zj%>2AAp_G70_|sn8nDTrgBG!l_VDMRn4HSM^n*bA*%+<{Y%=JuChR5`qL@69f$0Z< z_Omfu4cKJRR%Pram!X)vkAdkYf%da8Tn*S{(58OuCPUAEhQx#MYX+vD1lrFCHDHr* zp8w1bJ^vYEvWYPR(@z5JXM`HC$vDq{=7*mD3^h5Gf$1lK_Ol6G4cKIy=Rfm9&wqxR zJduIvCxP~}30w`>WSr+e^Fz;nhMIhqf$1lK_Ol6G4cKIy=Rfm9&wqxR{DXn%7lHP( z30w`>WSr+e^Fz;nhL~)s#K826K>Hb?25d6U^Pl-q&VM%bV_^D4p#6+c12!4w`Oo|) z=Rcd)GBEuj(0)d!0h^5T{AYfY^Pe3}7?^$$Xg?#=fKA4E{xd)H{AWlwTUIbI{UXqQ zMyLUsjPv|we(3qnP?PU6F#RUbezt_G0h^5T{AYfY^PjDl7?^$&Xg?#=fKA4E{xd)H z{AY-p&Ey%FeiLXvBh-LR#(DlTKlJ=(sL8wxOuq@VpUvQEz$W87|Ct|p{xig67f}YL z-vrvv2sL1nai0Iok8=LARWJk7ZvyRSgc`8PIM09Pho1ioakKMM2BzNx+Rq3zV3Tp4 z|I80P{~2Pk)hq_4KLpy(2sL1nai0Ioe+#)DbS!3I`a_`oj8FqM8Rz-W{3z!?+bAHb?25d6U^Pl;l=RZSCwpC$Z`a_`oj8FqM z8Rz-W{Lu5CAtpOpFfjcg(0)d!0h^5T{AYgX`OgrOt=2Oz{Uy+TMyLUsjPv|we(3qn zP?JwGF#RRaeztYOlX0H^EP!(UvsEht z(?0_3XM`HC$vDq{7J#1r3~{sNO9rNY1lrFCHDHr*p8qTWJ^vYEvNazA(?0_3XM`HC z$vDq{7C<@w+3G6;(?0_3XM`HC$vDq{7J#1r40Urf1JgeO?PqJa8nDSY&wmzxp8pIn z+3`68(|-c(XM`HC$vDq{7J#1r3^CcJgMsNkf%Y>(4cKIy=RXTT&wqxRoXWuTpFsQB z2CfEdGS2g#1)%3YLrvbz!1SL$``HGr25hoDL?`Cxr2zE&XNbJbat5aV1lrFCHDHr* zp8qTWJ^vYM@)ZWA{{-64HgGjylX0H^EP!(Uvx6DvPAdF+OA%_oCgVK+Spa(eGsMk~ zD;Ss=2(+IOYQQGrJpWk$<@{&I;|$CU1lrFCHDHr*p8qTWJ^vZvX6G0NW(ET7XM`HC z$vDq{7J#1r3^n-;12Y4G_Omlw4cKIy=RXTT&wqxRe35~ffk6A&8LkFwGS2g#1)%3Y zLrvbzz|26X{R~$FHaQ2P6H88kp8pJyw_d@(%t)a9j8FqM8Rz-W0?_lHp(Y<=U}hxH zezu0I0h^5T{AU5^`OgrOZR;7B840wX5o*9D<2?Ua0DAs2)Z}~yX2|VhxNjP=g{uLZ zjPv|w0qFV95R+X%ZYI!vMyLUsjPv|w0qFV95R+XeFfcO`Xg?#=fKA4E{<8q|{AZ}i zwhYWn1lrH8a5Z3)ai0Gy06qU1VzSF#24*G#?Pr7je-?nA{|qtNO_qU~i9q`q zp$2R+&hwuIpyxkBO}1fRW+Kpjc7v+{n~d}PX91M+pS?2~n3)K)pAl-nCgVK+Speny zXYW4@%uEE@&j>YOlX0H^EC4VPIw^(0)d!0h^5T{AU5^`OgqHn@ce; zGZSb(Bh-LR#(Dm;0LuB#W`zvQECkxm2sL1nai0Gy06qU1;%2iC49qM9+Rq3zV3Tp4 z|15xV{&rp+t8JJlJw4cr4YQQGrJpWk$dj2!iHb?25d6U^PdHw=RZT; zynun3l|cL19IggzGS2g#1)=9ZLrvbqz|2aZ{cH|b12S0<=lRcq(DR?6CSPY@W+l*m zHixSLn~d}PXF-(npUvMeFtZY9KO@wDO~!ftvmo^RXNa3EI2f4O2(+IOYQQGrJpWk` z<@{$0Sq5e{2mJj(gc`8PIM06;gr5Hlb#pcYGaG^SvjtoY*kqjNKMO+7e};&4+2sL1nai0Gy2tEH98qT*FnAr)mpDo~Oz$W87|5*^_{AXJW24>v1 z5<_f9r~#Xd^ZaK)l=Gjhav7M}3ACRPYQQGrJpWk`<@{%>y9~_i1lrFCHDHr*p8qTe zJ^vZvQ)_1iW_AMYXM`HC$vDq{7DPG!+4=2sL1nai0Gyh;sh3 z!$}5aP6F*`gc`8PIM06;L^=Q2;T{7sCxP}eLJintoaa9aqMZNiw2Fb5lR*0!p$2R+ z&hwuIQO(4cKIy=RXUgod4`FpMjZ+K>Hb?25d6U^PdG# z&VP2;#=y))p#6+c12!4w`OktV=RZ5jGca=zXg?#=fKA4E{<9#;`Ol6M7?`;Tw4V`b zz$W87|5*^_{Abq{49wgF+Rq3zV3Tp4|15}d{)_A^2a*kl~%KmP}Te>}|4 z!FmSor3}p61lrFCHDHs`&VOcL@N3nJkB?8PN-fG~h>wrYP0a;g>j4skv2*ehQwmE{ ziz*q?Q%h3va}zW3z;~&qr

    8awe`W${6&>6xHx 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 J@Lned1^}BfW_SPq literal 0 HcmV?d00001 diff --git a/akka-samples/akka-sample-cluster/sigar/libsigar-ia64-linux.so b/akka-samples/akka-sample-cluster/sigar/libsigar-ia64-linux.so new file mode 100644 index 0000000000000000000000000000000000000000..2bd2fc8e323f9b54552092a8529c260ad12c1af5 GIT binary patch literal 494929 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