Fixes an interesting "bug" in RandomRouter. Tests failed on my 12 core Linux box. After some investigation I found that it hanged randomly inside the SecureRandom seed generator.
[JVM-Node4] "main" prio=10 tid=0x0000000001701000 nid=0x1942 runnable [0x00007fee631dc000]
[JVM-Node4] java.lang.Thread.State: RUNNABLE
[JVM-Node4] at java.io.FileInputStream.readBytes(Native Method)
[JVM-Node4] at java.io.FileInputStream.read(FileInputStream.java:236)
[JVM-Node4] at sun.security.provider.SeedGenerator$URLSeedGenerator.getSeedBytes(SeedGenerator.java:509)
[JVM-Node4] at sun.security.provider.SeedGenerator.generateSeed(SeedGenerator.java:135)
[JVM-Node4] at sun.security.provider.SecureRandom.engineGenerateSeed(SecureRandom.java:131)
[JVM-Node4] at sun.security.provider.SecureRandom.engineNextBytes(SecureRandom.java:188)
[JVM-Node4] - locked <0x00000007c3d84130> (a sun.security.provider.SecureRandom)
[JVM-Node4] at java.security.SecureRandom.nextBytes(SecureRandom.java:450)
[JVM-Node4] - locked <0x00000007c3d843d0> (a java.security.SecureRandom)
[JVM-Node4] at java.security.SecureRandom.next(SecureRandom.java:472)
[JVM-Node4] at java.util.Random.nextInt(Random.java:272)
[JVM-Node4] at akka.routing.RandomLike$class.getNext$2(Routing.scala:466)
Puzzled at first I Googled the problem and found this bug report: http://bugs.sun.com/view_bug.do?bug_id=6521844
In short it is designed to block on /dev/random (on Linux) when the entropy pool is empty until some "environmental noise is gathered".
From the Linux manual:
"Hanging at generateSeed is not a bug, since that's what was designed:
When the entropy pool is empty, reads from /dev/random will block until
additional environmental noise is gathered.
(Source: Linux Programmer's Manual, section 4)"
Fix was to switch to java.util.Random.
Fun one
Signed-off-by: Jonas Bonér <jonas@jonasboner.com>
- add Deploy to Props, which is used as the basis (overridden by
configuration)
- utilize general mechanism .withFallback (introduced on Deploy,
RouterConfig and Scope)
- actually pass Props over the wire when deploying remotely in order to
retain settings (this was an oversight before)
- write tests for the new functionality
* Added member status, ring convergence flags etc to Gossip state.
* Updated Gossiper to use Member throughout instead of ParsedTransportAddress.
* Commented out cluster membership updating to be replaced by the one in the cluster specification.
Signed-off-by: Jonas Bonér <jonas@jonasboner.com>
- Added JoinCluster phase (connect and get initial data from seed nodes) to Gossiper.
- Added '/system/cluster' daemon actor to Gossiper responsible for gossip communication.
- Added various config options to Gossiper.
- Fixed misc bugs in Gossiper.
Signed-off-by: Jonas Bonér <jonas@jonasboner.com>
- re-label Client/Server to Inbound/Outbound for netty settings
description
- move to just using exactly one class loader for all reflective
activities of the ActorSystem, which is either the context class
loader or the one which loaded the ActorSystem’s class; document that
putting Akka on boot class path will not work
- be more careful with initializing the Client- and ServerBootstrap
- rename Port to DesiredPortFromConfig to discourage misuse
- write test for NettySettings
- various small fixes
- move all creation of ActorRefs into the ActorRefProvider (deadLetters,
locker)
- rootPath does not contain remote transport address any longer in order
to start the LocalActorRefProvider before the RemoteTransport; the
transport address is inserted during serialization only, which enables
us later to have more than one transport available for one actor
system (maybe even needed for clustering)
- fix inheritance between DeadLetterActorRef and EmptyLocalActorRef
- document some start-up dependencies by reordering constructor code
- fix remote tests which used self.path for identifying remote actors
(since that no longer includes the remote transport address)