From b569869b61aa64cd4d0027131697d1a336c03a34 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Fri, 25 May 2012 12:10:17 +0200 Subject: [PATCH] Use better sort order of members. See #2133 --- .../src/main/scala/akka/cluster/Cluster.scala | 12 +++++++- .../test/scala/akka/cluster/MemberSpec.scala | 30 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 akka-cluster/src/test/scala/akka/cluster/MemberSpec.scala diff --git a/akka-cluster/src/main/scala/akka/cluster/Cluster.scala b/akka-cluster/src/main/scala/akka/cluster/Cluster.scala index 76e3356143..55f9967596 100644 --- a/akka-cluster/src/main/scala/akka/cluster/Cluster.scala +++ b/akka-cluster/src/main/scala/akka/cluster/Cluster.scala @@ -100,7 +100,17 @@ class Member(val address: Address, val status: MemberStatus) extends ClusterMess object Member { import MemberStatus._ - implicit val ordering = Ordering.fromLessThan[Member](_.address.toString < _.address.toString) + implicit val addressOrdering: Ordering[Address] = Ordering.fromLessThan[Address] { (a, b) ⇒ + if (a.protocol < b.protocol) true + else if (a.system < b.system) true + else if (a.host.getOrElse("") < b.host.getOrElse("")) true + else if (a.port.getOrElse(0) < b.port.getOrElse(0)) true + else false + } + + implicit val ordering: Ordering[Member] = new Ordering[Member] { + def compare(x: Member, y: Member) = addressOrdering.compare(x.address, y.address) + } def apply(address: Address, status: MemberStatus): Member = new Member(address, status) diff --git a/akka-cluster/src/test/scala/akka/cluster/MemberSpec.scala b/akka-cluster/src/test/scala/akka/cluster/MemberSpec.scala new file mode 100644 index 0000000000..a75ead0149 --- /dev/null +++ b/akka-cluster/src/test/scala/akka/cluster/MemberSpec.scala @@ -0,0 +1,30 @@ +/** + * Copyright (C) 2009-2012 Typesafe Inc. + */ + +package akka.cluster + +import org.scalatest.WordSpec +import org.scalatest.matchers.MustMatchers +import akka.actor.Address +import scala.util.Random + +@org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) +class MemberSpec extends WordSpec with MustMatchers { + + "Member" must { + + "be sorted by address correctly" in { + import Member.ordering + val m1 = Member(Address("akka", "sys1", "host1", 9000), MemberStatus.Up) + val m2 = Member(Address("akka", "sys1", "host1", 10000), MemberStatus.Up) + val m3 = Member(Address("cluster", "sys1", "host1", 10000), MemberStatus.Up) + val m4 = Member(Address("cluster", "sys1", "host2", 10000), MemberStatus.Up) + val m5 = Member(Address("cluster", "sys2", "host2", 10000), MemberStatus.Up) + + val expected = IndexedSeq(m1, m2, m3, m4, m5) + val shuffled = Random.shuffle(expected) + shuffled.sorted must be(expected) + } + } +}