Skip to content

Commit

Permalink
Makes the SBR lease name configurable (#30049)
Browse files Browse the repository at this point in the history
  • Loading branch information
ignasi35 committed Feb 22, 2021
1 parent e6c5e32 commit 59364c0
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ProblemFilters.exclude[Problem]("akka.cluster.sbr.LeaseMajoritySettings$")
ProblemFilters.exclude[Problem]("akka.cluster.sbr.LeaseMajoritySettings.*")
4 changes: 4 additions & 0 deletions akka-cluster/src/main/resources/reference.conf
Original file line number Diff line number Diff line change
Expand Up @@ -487,6 +487,10 @@ akka.cluster.split-brain-resolver.keep-oldest {
akka.cluster.split-brain-resolver.lease-majority {
lease-implementation = ""

# The recommended format for the lease name is "<service-name>-akka-sbr".
# When lease-name is not defined, the name will be set to "<actor-system-name>-akka-sbr"
lease-name = ""

# This delay is used on the minority side before trying to acquire the lease,
# as an best effort to try to keep the majority side.
acquire-lease-delay-for-minority = 2s
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ final class SplitBrainResolverProvider(system: ActorSystem) extends DowningProvi
case LeaseMajorityName =>
val s = settings.leaseMajoritySettings
val leaseOwnerName = cluster.selfUniqueAddress.address.hostPort
val lease = LeaseProvider(system).getLease(s"${system.name}-akka-sbr", s.leaseImplementation, leaseOwnerName)
val leaseName = s.safeLeaseName(system.name)
val lease = LeaseProvider(system).getLease(leaseName, s.leaseImplementation, leaseOwnerName)
new LeaseMajority(selfDc, s.role, lease, s.acquireLeaseDelayForMinority, cluster.selfUniqueAddress)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,11 @@ import akka.util.Helpers.Requiring
val acquireLeaseDelayForMinority =
FiniteDuration(c.getDuration("acquire-lease-delay-for-minority").toMillis, TimeUnit.MILLISECONDS)

LeaseMajoritySettings(leaseImplementation, acquireLeaseDelayForMinority, role(c))
val leaseName = c.getString("lease-name").trim match {
case "" => None
case name => Some(name)
}
LeaseMajoritySettings(leaseImplementation, acquireLeaseDelayForMinority, role(c), leaseName)
}

private def strategyConfig(strategyName: String): Config = cc.getConfig(strategyName)
Expand Down Expand Up @@ -124,4 +128,7 @@ import akka.util.Helpers.Requiring
@InternalApi private[sbr] final case class LeaseMajoritySettings(
leaseImplementation: String,
acquireLeaseDelayForMinority: FiniteDuration,
role: Option[String])
role: Option[String],
leaseName: Option[String]) {
def safeLeaseName(systemName: String) = leaseName.getOrElse(s"$systemName-akka-sbr")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* Copyright (C) 2015-2021 Lightbend Inc. <https://www.lightbend.com>
*/

package akka.cluster.sbr

import akka.testkit.AkkaSpec
import com.typesafe.config.ConfigFactory
import org.scalatest.concurrent.Eventually

class LeaseMajoritySpec extends AkkaSpec() with Eventually {

val default = ConfigFactory
.parseString(
"""
| akka.cluster.split-brain-resolver.lease-majority.lease-implementation = "akka.coordination.lease.kubernetes"
|""".stripMargin)
.withFallback(ConfigFactory.load())
val blank = ConfigFactory.parseString("""
|akka.cluster.split-brain-resolver.lease-majority {
| lease-name = " "
|}""".stripMargin).withFallback(default)
val named = ConfigFactory.parseString("""
|akka.cluster.split-brain-resolver.lease-majority {
| lease-name = "shopping-cart-akka-sbr"
|}""".stripMargin).withFallback(default)

"Split Brain Resolver Lease Majority provider" must {

"read the configured name" in {
new SplitBrainResolverSettings(default).leaseMajoritySettings.leaseName shouldBe None
new SplitBrainResolverSettings(blank).leaseMajoritySettings.leaseName shouldBe None
new SplitBrainResolverSettings(named).leaseMajoritySettings.leaseName shouldBe Some("shopping-cart-akka-sbr")
}

"use a safe name" in {
new SplitBrainResolverSettings(default).leaseMajoritySettings.safeLeaseName("sysName") shouldBe "sysName-akka-sbr"
new SplitBrainResolverSettings(blank).leaseMajoritySettings.safeLeaseName("sysName") shouldBe "sysName-akka-sbr"
new SplitBrainResolverSettings(named).leaseMajoritySettings
.safeLeaseName("sysName") shouldBe "shopping-cart-akka-sbr"
}

}
}

0 comments on commit 59364c0

Please sign in to comment.