parent
8f6ee85413
commit
d19855542b
11 changed files with 53 additions and 13 deletions
|
|
@ -55,6 +55,7 @@ object RandomizedSplitBrainResolverIntegrationSpec extends MultiNodeConfig {
|
||||||
active-strategy = lease-majority
|
active-strategy = lease-majority
|
||||||
lease-majority {
|
lease-majority {
|
||||||
lease-implementation = test-lease
|
lease-implementation = test-lease
|
||||||
|
release-after = 20s
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -396,6 +396,7 @@ class SplitBrainResolverIntegrationSpec
|
||||||
lease-majority {
|
lease-majority {
|
||||||
lease-implementation = test-lease
|
lease-implementation = test-lease
|
||||||
acquire-lease-delay-for-minority = 3s
|
acquire-lease-delay-for-minority = 3s
|
||||||
|
release-after = 20s
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
test-lease {
|
test-lease {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
# #30090 adding releaseAfter to LeaseMajority
|
||||||
|
ProblemFilters.exclude[Problem]("akka.cluster.sbr.LeaseMajoritySettings$")
|
||||||
|
ProblemFilters.exclude[Problem]("akka.cluster.sbr.LeaseMajoritySettings.*")
|
||||||
|
ProblemFilters.exclude[DirectMissingMethodProblem]("akka.cluster.sbr.LeaseMajority.this")
|
||||||
|
|
@ -495,6 +495,9 @@ akka.cluster.split-brain-resolver.lease-majority {
|
||||||
# as an best effort to try to keep the majority side.
|
# as an best effort to try to keep the majority side.
|
||||||
acquire-lease-delay-for-minority = 2s
|
acquire-lease-delay-for-minority = 2s
|
||||||
|
|
||||||
|
# Release the lease after this duration.
|
||||||
|
release-after = 40s
|
||||||
|
|
||||||
# If the 'role' is defined the majority/minority is based only on members with that 'role'.
|
# If the 'role' is defined the majority/minority is based only on members with that 'role'.
|
||||||
role = ""
|
role = ""
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -591,6 +591,7 @@ import akka.coordination.lease.scaladsl.Lease
|
||||||
override val role: Option[String],
|
override val role: Option[String],
|
||||||
_lease: Lease,
|
_lease: Lease,
|
||||||
acquireLeaseDelayForMinority: FiniteDuration,
|
acquireLeaseDelayForMinority: FiniteDuration,
|
||||||
|
val releaseAfter: FiniteDuration,
|
||||||
selfUniqueAddress: UniqueAddress)
|
selfUniqueAddress: UniqueAddress)
|
||||||
extends DowningStrategy(selfDc, selfUniqueAddress) {
|
extends DowningStrategy(selfDc, selfUniqueAddress) {
|
||||||
import DowningStrategy._
|
import DowningStrategy._
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ import java.time.temporal.ChronoUnit
|
||||||
|
|
||||||
import scala.concurrent.ExecutionContext
|
import scala.concurrent.ExecutionContext
|
||||||
import scala.concurrent.duration._
|
import scala.concurrent.duration._
|
||||||
|
|
||||||
import akka.actor.Actor
|
import akka.actor.Actor
|
||||||
import akka.actor.Address
|
import akka.actor.Address
|
||||||
import akka.actor.ExtendedActorSystem
|
import akka.actor.ExtendedActorSystem
|
||||||
|
|
@ -161,7 +162,11 @@ import akka.remote.artery.ThisActorSystemQuarantinedEvent
|
||||||
def downAllWhenUnstable: FiniteDuration =
|
def downAllWhenUnstable: FiniteDuration =
|
||||||
settings.DownAllWhenUnstable
|
settings.DownAllWhenUnstable
|
||||||
|
|
||||||
private val releaseLeaseAfter = stableAfter * 2
|
private def releaseLeaseAfter: FiniteDuration = strategy match {
|
||||||
|
case lm: LeaseMajority => lm.releaseAfter
|
||||||
|
case other =>
|
||||||
|
throw new IllegalStateException(s"Unexpected use of releaseLeaseAfter for strategy [${other.getClass.getName}]")
|
||||||
|
}
|
||||||
|
|
||||||
def tickInterval: FiniteDuration = 1.second
|
def tickInterval: FiniteDuration = 1.second
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,13 @@ final class SplitBrainResolverProvider(system: ActorSystem) extends DowningProvi
|
||||||
val leaseOwnerName = cluster.selfUniqueAddress.address.hostPort
|
val leaseOwnerName = cluster.selfUniqueAddress.address.hostPort
|
||||||
val leaseName = s.safeLeaseName(system.name)
|
val leaseName = s.safeLeaseName(system.name)
|
||||||
val lease = LeaseProvider(system).getLease(leaseName, s.leaseImplementation, leaseOwnerName)
|
val lease = LeaseProvider(system).getLease(leaseName, s.leaseImplementation, leaseOwnerName)
|
||||||
new LeaseMajority(selfDc, s.role, lease, s.acquireLeaseDelayForMinority, cluster.selfUniqueAddress)
|
new LeaseMajority(
|
||||||
|
selfDc,
|
||||||
|
s.role,
|
||||||
|
lease,
|
||||||
|
s.acquireLeaseDelayForMinority,
|
||||||
|
s.releaseAfter,
|
||||||
|
cluster.selfUniqueAddress)
|
||||||
}
|
}
|
||||||
|
|
||||||
Some(SplitBrainResolver.props(settings.DowningStableAfter, strategy))
|
Some(SplitBrainResolver.props(settings.DowningStableAfter, strategy))
|
||||||
|
|
|
||||||
|
|
@ -100,7 +100,12 @@ import akka.util.Helpers.Requiring
|
||||||
case "" => None
|
case "" => None
|
||||||
case name => Some(name)
|
case name => Some(name)
|
||||||
}
|
}
|
||||||
LeaseMajoritySettings(leaseImplementation, acquireLeaseDelayForMinority, role(c), leaseName)
|
|
||||||
|
val releaseAfter =
|
||||||
|
FiniteDuration(c.getDuration("release-after").toMillis, TimeUnit.MILLISECONDS)
|
||||||
|
|
||||||
|
LeaseMajoritySettings(leaseImplementation, acquireLeaseDelayForMinority, releaseAfter, role(c), leaseName)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private def strategyConfig(strategyName: String): Config = cc.getConfig(strategyName)
|
private def strategyConfig(strategyName: String): Config = cc.getConfig(strategyName)
|
||||||
|
|
@ -128,6 +133,7 @@ import akka.util.Helpers.Requiring
|
||||||
@InternalApi private[sbr] final case class LeaseMajoritySettings(
|
@InternalApi private[sbr] final case class LeaseMajoritySettings(
|
||||||
leaseImplementation: String,
|
leaseImplementation: String,
|
||||||
acquireLeaseDelayForMinority: FiniteDuration,
|
acquireLeaseDelayForMinority: FiniteDuration,
|
||||||
|
releaseAfter: FiniteDuration,
|
||||||
role: Option[String],
|
role: Option[String],
|
||||||
leaseName: Option[String]) {
|
leaseName: Option[String]) {
|
||||||
def safeLeaseName(systemName: String) = leaseName.getOrElse(s"$systemName-akka-sbr")
|
def safeLeaseName(systemName: String) = leaseName.getOrElse(s"$systemName-akka-sbr")
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@ object LeaseMajority5NodeSpec extends MultiNodeConfig {
|
||||||
lease-majority {
|
lease-majority {
|
||||||
lease-implementation = test-lease
|
lease-implementation = test-lease
|
||||||
acquire-lease-delay-for-minority = 1s
|
acquire-lease-delay-for-minority = 1s
|
||||||
|
release-after = 3s
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,17 +13,17 @@ class LeaseMajoritySpec extends AkkaSpec() with Eventually {
|
||||||
val default = ConfigFactory
|
val default = ConfigFactory
|
||||||
.parseString(
|
.parseString(
|
||||||
"""
|
"""
|
||||||
| akka.cluster.split-brain-resolver.lease-majority.lease-implementation = "akka.coordination.lease.kubernetes"
|
akka.cluster.split-brain-resolver.lease-majority.lease-implementation = "akka.coordination.lease.kubernetes"
|
||||||
|""".stripMargin)
|
""")
|
||||||
.withFallback(ConfigFactory.load())
|
.withFallback(ConfigFactory.load())
|
||||||
val blank = ConfigFactory.parseString("""
|
val blank = ConfigFactory.parseString("""
|
||||||
|akka.cluster.split-brain-resolver.lease-majority {
|
akka.cluster.split-brain-resolver.lease-majority {
|
||||||
| lease-name = " "
|
lease-name = " "
|
||||||
|}""".stripMargin).withFallback(default)
|
}""").withFallback(default)
|
||||||
val named = ConfigFactory.parseString("""
|
val named = ConfigFactory.parseString("""
|
||||||
|akka.cluster.split-brain-resolver.lease-majority {
|
akka.cluster.split-brain-resolver.lease-majority {
|
||||||
| lease-name = "shopping-cart-akka-sbr"
|
lease-name = "shopping-cart-akka-sbr"
|
||||||
|}""".stripMargin).withFallback(default)
|
}""").withFallback(default)
|
||||||
|
|
||||||
"Split Brain Resolver Lease Majority provider" must {
|
"Split Brain Resolver Lease Majority provider" must {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -827,7 +827,13 @@ class SplitBrainResolverSpec
|
||||||
val acquireLeaseDelayForMinority: FiniteDuration = 2.seconds
|
val acquireLeaseDelayForMinority: FiniteDuration = 2.seconds
|
||||||
|
|
||||||
override def createStrategy() =
|
override def createStrategy() =
|
||||||
new LeaseMajority(selfDc, role, testLease, acquireLeaseDelayForMinority, selfUniqueAddress)
|
new LeaseMajority(
|
||||||
|
selfDc,
|
||||||
|
role,
|
||||||
|
testLease,
|
||||||
|
acquireLeaseDelayForMinority,
|
||||||
|
releaseAfter = 10.seconds,
|
||||||
|
selfUniqueAddress)
|
||||||
}
|
}
|
||||||
|
|
||||||
"decide AcquireLeaseAndDownUnreachable, and DownReachable as reverse decision" in {
|
"decide AcquireLeaseAndDownUnreachable, and DownReachable as reverse decision" in {
|
||||||
|
|
@ -1115,7 +1121,13 @@ class SplitBrainResolverSpec
|
||||||
tickInterval: FiniteDuration = Duration.Zero)
|
tickInterval: FiniteDuration = Duration.Zero)
|
||||||
extends Setup(
|
extends Setup(
|
||||||
stableAfter,
|
stableAfter,
|
||||||
new LeaseMajority(selfDc, role, testLease, acquireLeaseDelayForMinority = 20.millis, selfUniqueAddress),
|
new LeaseMajority(
|
||||||
|
selfDc,
|
||||||
|
role,
|
||||||
|
testLease,
|
||||||
|
acquireLeaseDelayForMinority = 20.millis,
|
||||||
|
releaseAfter = 10.seconds,
|
||||||
|
selfUniqueAddress),
|
||||||
selfUniqueAddress,
|
selfUniqueAddress,
|
||||||
downAllWhenUnstable,
|
downAllWhenUnstable,
|
||||||
tickInterval)
|
tickInterval)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue