Skip to content

Commit f30abbf

Browse files
sw-squaresvc-squareup-copybara
authored andcommitted
This PR deprecates wisp's FakeLeaseManager, and moves the functionality
exclusive to it over to misk's FakeLeaseManager GitOrigin-RevId: 1ce45b74bd58317e8164a32ddcd08508aa9d924f
1 parent 998fcf6 commit f30abbf

File tree

6 files changed

+147
-4
lines changed

6 files changed

+147
-4
lines changed

misk-clustering/api/misk-clustering.api

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,26 @@ public final class misk/clustering/fake/FakeClusterModule : misk/inject/KAbstrac
145145
public fun <init> ()V
146146
}
147147

148-
public final class misk/clustering/fake/lease/FakeLeaseManager : wisp/lease/FakeLeaseManager {
148+
public final class misk/clustering/fake/lease/FakeLease : wisp/lease/Lease {
149+
public fun <init> (Ljava/lang/String;Lmisk/clustering/fake/lease/FakeLeaseManager;)V
150+
public fun acquire ()Z
151+
public fun addListener (Lwisp/lease/Lease$StateChangeListener;)V
152+
public fun checkHeld ()Z
153+
public fun checkHeldElsewhere ()Z
154+
public fun getName ()Ljava/lang/String;
155+
public final fun notifyAfterAcquire ()V
156+
public final fun notifyBeforeRelease ()V
157+
public fun release ()Z
158+
}
159+
160+
public final class misk/clustering/fake/lease/FakeLeaseManager : misk/testing/FakeFixture, wisp/lease/LeaseManager {
149161
public fun <init> ()V
162+
public final fun isLeaseHeld (Ljava/lang/String;)Z
163+
public final fun isLeaseHeldElsewhere (Ljava/lang/String;)Z
164+
public final fun markLeaseHeld (Ljava/lang/String;)V
165+
public final fun markLeaseHeldElsewhere (Ljava/lang/String;)V
166+
public fun releaseAll ()V
167+
public fun requestLease (Ljava/lang/String;)Lwisp/lease/Lease;
150168
}
151169

152170
public final class misk/clustering/fake/lease/FakeLeaseModule : misk/inject/KAbstractModule {

misk-clustering/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ dependencies {
1111
api(libs.jakartaInject)
1212
api(libs.loggingApi)
1313
api(project(":wisp:wisp-config"))
14-
api(project(":wisp:wisp-lease-testing"))
1514
api(project(":misk-inject"))
1615
implementation(libs.guice)
1716
implementation(libs.kubernetesClient)
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package misk.clustering.fake.lease
2+
3+
import wisp.lease.Lease
4+
5+
class FakeLease(
6+
override val name: String,
7+
private val manager: FakeLeaseManager
8+
) : Lease {
9+
private val listeners = mutableListOf<Lease.StateChangeListener>()
10+
11+
override fun checkHeld() = manager.isLeaseHeld(name)
12+
13+
/**
14+
* @return true if the other process holds the lease.
15+
*/
16+
override fun checkHeldElsewhere() = manager.isLeaseHeldElsewhere(name)
17+
18+
/**
19+
* @return true if this process acquires the lease.
20+
*/
21+
override fun acquire(): Boolean {
22+
val result = checkHeld()
23+
if (checkHeld()) {
24+
notifyAfterAcquire()
25+
}
26+
return result
27+
}
28+
29+
/**
30+
* Release the lease. This will return true if released. Note that it will return false
31+
* if the lease was not held.
32+
*/
33+
override fun release(): Boolean {
34+
if (!checkHeld()) {
35+
return false
36+
}
37+
notifyBeforeRelease()
38+
return true
39+
}
40+
41+
override fun addListener(listener: Lease.StateChangeListener) {
42+
listeners.add(listener)
43+
if (checkHeld()) {
44+
listener.afterAcquire(this)
45+
}
46+
}
47+
48+
fun notifyAfterAcquire() {
49+
listeners.forEach {
50+
it.afterAcquire(this)
51+
}
52+
}
53+
54+
fun notifyBeforeRelease() {
55+
listeners.forEach {
56+
it.beforeRelease(this)
57+
}
58+
}
59+
}
Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,44 @@
11
package misk.clustering.fake.lease
22

3-
import wisp.lease.FakeLeaseManager
43
import jakarta.inject.Inject
54
import jakarta.inject.Singleton
5+
import misk.testing.FakeFixture
6+
import wisp.lease.Lease
7+
import wisp.lease.LeaseManager
8+
import java.util.concurrent.ConcurrentHashMap
69

710
/**
811
* A [FakeLeaseManager] provides explicit control over leases for the purposes of testing. By
912
* default a lease is considered held, but it can be explicitly marked as not held if desired
1013
*/
1114
@Singleton
12-
class FakeLeaseManager @Inject constructor() : FakeLeaseManager()
15+
class FakeLeaseManager @Inject constructor() : LeaseManager, FakeFixture() {
16+
private val leasesHeldElsewhere by resettable { ConcurrentHashMap<String, Int>() }
17+
private val leases by resettable { ConcurrentHashMap<String, FakeLease>() }
18+
19+
override fun requestLease(name: String): Lease {
20+
return leases.computeIfAbsent(name) {
21+
FakeLease(name, this)
22+
}
23+
}
24+
25+
override fun releaseAll() {
26+
leases.forEachValue(1) {
27+
it.release()
28+
}
29+
}
30+
31+
fun isLeaseHeldElsewhere(name: String) = leasesHeldElsewhere.containsKey(name)
32+
33+
fun isLeaseHeld(name: String) = !leasesHeldElsewhere.containsKey(name)
34+
35+
fun markLeaseHeld(name: String) {
36+
leasesHeldElsewhere.remove(name)
37+
(requestLease(name) as FakeLease).acquire()
38+
}
39+
40+
fun markLeaseHeldElsewhere(name: String) {
41+
(requestLease(name) as FakeLease).release()
42+
leasesHeldElsewhere[name] = 1
43+
}
44+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package misk.clustering.fake.lease
2+
3+
import org.assertj.core.api.Assertions.assertThat
4+
import org.junit.jupiter.api.Test
5+
6+
internal class FakeLeaseManagerTest {
7+
8+
private var leaseManager = FakeLeaseManager()
9+
10+
@Test
11+
fun leaseRespectsAuthority() {
12+
val lease = leaseManager.requestLease("my-lease")
13+
val otherLease = leaseManager.requestLease("my-other-lease")
14+
15+
// leases are held by the current process by default
16+
assertThat(lease.checkHeld()).isTrue()
17+
assertThat(otherLease.checkHeld()).isTrue()
18+
19+
leaseManager.markLeaseHeldElsewhere("my-lease")
20+
assertThat(lease.checkHeld()).isFalse()
21+
assertThat(lease.acquire()).isFalse()
22+
assertThat(otherLease.checkHeld()).isTrue()
23+
24+
leaseManager.markLeaseHeld("my-lease")
25+
assertThat(lease.checkHeld()).isTrue()
26+
assertThat(otherLease.checkHeld()).isTrue()
27+
}
28+
}

wisp/wisp-lease-testing/src/main/kotlin/wisp/lease/FakeLeaseManager.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@ import java.util.concurrent.ConcurrentHashMap
77
* A [FakeLeaseManager] provides explicit control over leases for the purposes of testing. By
88
* default, a fake lease is considered held, but it can be explicitly marked as not held if desired
99
*/
10+
@Deprecated(
11+
message = "Duplicate implementations in Wisp are being migrated to the unified type in Misk.",
12+
replaceWith = ReplaceWith(
13+
expression = "FakeLeaseManager()",
14+
imports = ["misk.clustering.fake.lease"]
15+
)
16+
)
1017
open class FakeLeaseManager : LeaseManager, FakeFixture() {
1118
private val leasesHeldElsewhere by resettable { ConcurrentHashMap<String, Int>() }
1219
private val leases by resettable { ConcurrentHashMap<String, FakeLease>() }

0 commit comments

Comments
 (0)