From 05282b59c96db62307c7d21bec6eda7fa76ff1ab Mon Sep 17 00:00:00 2001 From: promanski Date: Tue, 1 May 2018 16:43:56 +0200 Subject: [PATCH] Handle a negative value returned by Math.abs() #25034 --- .../src/main/scala/akka/dispatch/affinity/AffinityPool.scala | 2 +- .../src/main/scala/akka/cluster/sharding/Shard.scala | 2 +- .../src/main/scala/akka/cluster/ddata/Replicator.scala | 4 ++-- akka-docs/src/test/java/jdocs/stream/HubDocTest.java | 2 +- akka-docs/src/test/scala/docs/stream/HubsDocSpec.scala | 2 +- .../src/main/scala/akka/remote/artery/ArteryTransport.scala | 2 +- .../src/main/scala/akka/remote/artery/Association.scala | 2 +- akka-stream/src/main/scala/akka/stream/javadsl/Hub.scala | 2 +- akka-stream/src/main/scala/akka/stream/scaladsl/Hub.scala | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/akka-actor/src/main/scala/akka/dispatch/affinity/AffinityPool.scala b/akka-actor/src/main/scala/akka/dispatch/affinity/AffinityPool.scala index 2d6b22063b..2001f0300d 100644 --- a/akka-actor/src/main/scala/akka/dispatch/affinity/AffinityPool.scala +++ b/akka-actor/src/main/scala/akka/dispatch/affinity/AffinityPool.scala @@ -401,7 +401,7 @@ private[akka] final class FairDistributionHashCache( final val config: Config) e override final def create(): QueueSelector = new AtomicReference[ImmutableIntMap](ImmutableIntMap.empty) with QueueSelector { override def toString: String = s"FairDistributionHashCache(fairDistributionThreshold = $fairDistributionThreshold)" - private[this] final def improve(h: Int): Int = Math.abs(reverseBytes(h * 0x9e3775cd) * 0x9e3775cd) // `sbhash`: In memory of Phil Bagwell. + private[this] final def improve(h: Int): Int = 0x7FFFFFFF & (reverseBytes(h * 0x9e3775cd) * 0x9e3775cd) // `sbhash`: In memory of Phil Bagwell. override final def getQueue(command: Runnable, queues: Int): Int = { val runnableHash = command.hashCode() if (fairDistributionThreshold == 0) diff --git a/akka-cluster-sharding/src/main/scala/akka/cluster/sharding/Shard.scala b/akka-cluster-sharding/src/main/scala/akka/cluster/sharding/Shard.scala index 71b2cf263a..3e9e292a32 100644 --- a/akka-cluster-sharding/src/main/scala/akka/cluster/sharding/Shard.scala +++ b/akka-cluster-sharding/src/main/scala/akka/cluster/sharding/Shard.scala @@ -603,7 +603,7 @@ private[akka] class DDataShard( Array.tabulate(numberOfKeys)(i ⇒ ORSetKey[EntityId](s"shard-${typeName}-${shardId}-$i")) private def key(entityId: EntityId): ORSetKey[EntityId] = { - val i = (math.abs(entityId.hashCode) % numberOfKeys) + val i = (math.abs(entityId.hashCode % numberOfKeys)) stateKeys(i) } diff --git a/akka-distributed-data/src/main/scala/akka/cluster/ddata/Replicator.scala b/akka-distributed-data/src/main/scala/akka/cluster/ddata/Replicator.scala index 67e1fd90cd..a17211e8aa 100644 --- a/akka-distributed-data/src/main/scala/akka/cluster/ddata/Replicator.scala +++ b/akka-distributed-data/src/main/scala/akka/cluster/ddata/Replicator.scala @@ -1623,7 +1623,7 @@ final class Replicator(settings: ReplicatorSettings) extends Actor with ActorLog } val chunk = (statusCount % totChunks).toInt val status = Status(dataEntries.collect { - case (key, (_, _)) if math.abs(key.hashCode) % totChunks == chunk ⇒ (key, getDigest(key)) + case (key, (_, _)) if math.abs(key.hashCode % totChunks) == chunk ⇒ (key, getDigest(key)) }, chunk, totChunks) to ! status } @@ -1651,7 +1651,7 @@ final class Replicator(settings: ReplicatorSettings) extends Actor with ActorLog val otherKeys = otherDigests.keySet val myKeys = if (totChunks == 1) dataEntries.keySet - else dataEntries.keysIterator.filter(key ⇒ math.abs(key.hashCode) % totChunks == chunk).toSet + else dataEntries.keysIterator.filter(key ⇒ math.abs(key.hashCode % totChunks) == chunk).toSet val otherMissingKeys = myKeys diff otherKeys val keys = (otherDifferentKeys ++ otherMissingKeys).take(maxDeltaElements) if (keys.nonEmpty) { diff --git a/akka-docs/src/test/java/jdocs/stream/HubDocTest.java b/akka-docs/src/test/java/jdocs/stream/HubDocTest.java index 06b592ac6b..17ecfbfaf5 100644 --- a/akka-docs/src/test/java/jdocs/stream/HubDocTest.java +++ b/akka-docs/src/test/java/jdocs/stream/HubDocTest.java @@ -158,7 +158,7 @@ public class HubDocTest extends AbstractJavaTest { RunnableGraph> runnableGraph = producer.toMat(PartitionHub.of( String.class, - (size, elem) -> Math.abs(elem.hashCode()) % size, + (size, elem) -> Math.abs(elem.hashCode() % size), 2, 256), Keep.right()); // By running/materializing the producer, we get back a Source, which diff --git a/akka-docs/src/test/scala/docs/stream/HubsDocSpec.scala b/akka-docs/src/test/scala/docs/stream/HubsDocSpec.scala index 8dfa856e12..b8a46eb32a 100644 --- a/akka-docs/src/test/scala/docs/stream/HubsDocSpec.scala +++ b/akka-docs/src/test/scala/docs/stream/HubsDocSpec.scala @@ -118,7 +118,7 @@ class HubsDocSpec extends AkkaSpec with CompileOnlySpec { // value to the left is used) val runnableGraph: RunnableGraph[Source[String, NotUsed]] = producer.toMat(PartitionHub.sink( - (size, elem) ⇒ math.abs(elem.hashCode) % size, + (size, elem) ⇒ math.abs(elem.hashCode % size), startAfterNrOfConsumers = 2, bufferSize = 256))(Keep.right) // By running/materializing the producer, we get back a Source, which diff --git a/akka-remote/src/main/scala/akka/remote/artery/ArteryTransport.scala b/akka-remote/src/main/scala/akka/remote/artery/ArteryTransport.scala index 5515a62845..ab8f9738cf 100644 --- a/akka-remote/src/main/scala/akka/remote/artery/ArteryTransport.scala +++ b/akka-remote/src/main/scala/akka/remote/artery/ArteryTransport.scala @@ -485,7 +485,7 @@ private[remote] abstract class ArteryTransport(_system: ExtendedActorSystem, _pr val b = env.originUid val hashA = 23 + a val hash: Int = 23 * hashA + java.lang.Long.hashCode(b) - math.abs(hash) % inboundLanes + math.abs(hash % inboundLanes) case OptionVal.None ⇒ // the lane is set by the DuplicateHandshakeReq stage, otherwise 0 env.lane diff --git a/akka-remote/src/main/scala/akka/remote/artery/Association.scala b/akka-remote/src/main/scala/akka/remote/artery/Association.scala index d9fd5a0786..4c616df451 100644 --- a/akka-remote/src/main/scala/akka/remote/artery/Association.scala +++ b/akka-remote/src/main/scala/akka/remote/artery/Association.scala @@ -408,7 +408,7 @@ private[remote] class Association( OrdinaryQueueIndex } else { // select lane based on destination, to preserve message order - OrdinaryQueueIndex + (math.abs(r.path.uid) % outboundLanes) + OrdinaryQueueIndex + (math.abs(r.path.uid % outboundLanes)) } r.cachedSendQueueIndex = idx idx diff --git a/akka-stream/src/main/scala/akka/stream/javadsl/Hub.scala b/akka-stream/src/main/scala/akka/stream/javadsl/Hub.scala index c9de2493fa..d532c753e1 100644 --- a/akka-stream/src/main/scala/akka/stream/javadsl/Hub.scala +++ b/akka-stream/src/main/scala/akka/stream/javadsl/Hub.scala @@ -172,7 +172,7 @@ object PartitionHub { * @param partitioner Function that decides where to route an element. The function takes two parameters; * the first is the number of active consumers and the second is the stream element. The function should * return the index of the selected consumer for the given element, i.e. int greater than or equal to 0 - * and less than number of consumers. E.g. `(size, elem) -> Math.abs(elem.hashCode()) % size`. It's also + * and less than number of consumers. E.g. `(size, elem) -> Math.abs(elem.hashCode() % size)`. It's also * possible to use `-1` to drop the element. * @param startAfterNrOfConsumers Elements are buffered until this number of consumers have been connected. * This is only used initially when the stage is starting up, i.e. it is not honored when consumers have diff --git a/akka-stream/src/main/scala/akka/stream/scaladsl/Hub.scala b/akka-stream/src/main/scala/akka/stream/scaladsl/Hub.scala index 0f088cfd32..9be8a947a0 100644 --- a/akka-stream/src/main/scala/akka/stream/scaladsl/Hub.scala +++ b/akka-stream/src/main/scala/akka/stream/scaladsl/Hub.scala @@ -789,7 +789,7 @@ object PartitionHub { * @param partitioner Function that decides where to route an element. The function takes two parameters; * the first is the number of active consumers and the second is the stream element. The function should * return the index of the selected consumer for the given element, i.e. int greater than or equal to 0 - * and less than number of consumers. E.g. `(size, elem) => math.abs(elem.hashCode) % size`. It's also + * and less than number of consumers. E.g. `(size, elem) => math.abs(elem.hashCode % size)`. It's also * possible to use `-1` to drop the element. * @param startAfterNrOfConsumers Elements are buffered until this number of consumers have been connected. * This is only used initially when the stage is starting up, i.e. it is not honored when consumers have