Skip to content

Commit b3dfa98

Browse files
committed
🐛 Re-use ExecutableProvider in RedisHighAvailabilityContextCustomizer
1 parent b887f3b commit b3dfa98

File tree

1 file changed

+46
-46
lines changed

1 file changed

+46
-46
lines changed

src/main/kotlin/io/github/tobi/laa/spring/boot/embedded/redis/highavailability/RedisHighAvailabilityContextCustomizer.kt

Lines changed: 46 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import redis.embedded.RedisCluster
1717
import redis.embedded.RedisSentinel
1818
import redis.embedded.RedisServer
1919
import redis.embedded.core.ExecutableProvider
20+
import redis.embedded.core.ExecutableProvider.newJarResourceProvider
2021
import redis.embedded.core.RedisServerBuilder
2122
import java.io.File
2223
import java.util.stream.IntStream
@@ -27,17 +28,22 @@ private const val DEFAULT_BIND = "127.0.0.1"
2728
private const val QUORUM_SIZE = (1 / 2) + 1 // quorom size for one main node
2829

2930
internal class RedisHighAvailabilityContextCustomizer(
30-
private val config: EmbeddedRedisHighAvailability,
31-
private val portProvider: PortProvider = PortProvider()
31+
private val config: EmbeddedRedisHighAvailability,
32+
private val portProvider: PortProvider = PortProvider()
3233
) : ContextCustomizer {
3334

3435
private val log = LoggerFactory.getLogger(javaClass)
3536

3637
private val manuallySpecifiedPorts =
37-
config.ports.filter { it != 0 }.toSet() + config.sentinels.map { it.port }.filter { it != 0 }.toSet()
38+
config.ports.filter { it != 0 }.toSet() + config.sentinels.map { it.port }.filter { it != 0 }.toSet()
3839
private val name = config.name.ifEmpty { BirdNameProvider.next() }.replace(Regex("[^a-zA-Z0-9]"), "")
3940
private var nodeProvider: NodeProvider? = null
4041
private val customizer = config.customizer.map { c -> c.createInstance() }.toList()
42+
private val executableProvider = if (config.executeInDirectory.isNotEmpty()) {
43+
newJarResourceProvider(File(config.executeInDirectory))
44+
} else {
45+
newJarResourceProvider()
46+
}
4147

4248
override fun customizeContext(context: ConfigurableApplicationContext, mergedConfig: MergedContextConfiguration) {
4349
RedisStore.computeIfAbsent(context) {
@@ -71,9 +77,9 @@ internal class RedisHighAvailabilityContextCustomizer(
7177

7278
private fun createReplicas(mainNode: Pair<Node, RedisServer>): List<RedisServer> {
7379
val replicaBuilders =
74-
IntStream.range(0, config.replicas)
75-
.mapToObj { _ -> createReplicaBuilder(mainNode.first) }
76-
.toList()
80+
IntStream.range(0, config.replicas)
81+
.mapToObj { _ -> createReplicaBuilder(mainNode.first) }
82+
.toList()
7783
customizer.forEach { c -> c.customizeReplicas(replicaBuilders, config) }
7884

7985
return replicaBuilders.map { it.build() }
@@ -83,11 +89,9 @@ internal class RedisHighAvailabilityContextCustomizer(
8389
nodeProvider = nodeProvider()
8490
val nextNode = nodeProvider!!.next()
8591
val builder = RedisServer.newRedisServer()
86-
.bind(nextNode.bind)
87-
.port(nextNode.port)
88-
if (config.executeInDirectory.isNotEmpty()) {
89-
builder.executableProvider(ExecutableProvider.newJarResourceProvider(File(config.executeInDirectory)))
90-
}
92+
.bind(nextNode.bind)
93+
.port(nextNode.port)
94+
builder.executableProvider(executableProvider)
9195
customizer.forEach { c -> c.customizeMainNode(builder, config) }
9296
val mainNode = builder.build()
9397
mainNode.start()
@@ -103,16 +107,14 @@ internal class RedisHighAvailabilityContextCustomizer(
103107
}
104108

105109
private fun createReplicaBuilder(
106-
mainNode: Node
110+
mainNode: Node
107111
): RedisServerBuilder {
108112
val nextNode = nodeProvider!!.next()
109113
val builder = RedisServer.newRedisServer()
110-
.bind(nextNode.bind)
111-
.port(nextNode.port)
112-
.slaveOf(mainNode.bind, mainNode.port)
113-
if (config.executeInDirectory.isNotEmpty()) {
114-
builder.executableProvider(ExecutableProvider.newJarResourceProvider(File(config.executeInDirectory)))
115-
}
114+
.bind(nextNode.bind)
115+
.port(nextNode.port)
116+
.slaveOf(mainNode.bind, mainNode.port)
117+
builder.executableProvider(executableProvider)
116118
return builder
117119
}
118120

@@ -141,56 +143,54 @@ internal class RedisHighAvailabilityContextCustomizer(
141143
}
142144

143145
private fun createSentinel(
144-
sentinelConfig: EmbeddedRedisHighAvailability.Sentinel,
145-
mainNode: Pair<Node, RedisServer>
146+
sentinelConfig: EmbeddedRedisHighAvailability.Sentinel,
147+
mainNode: Pair<Node, RedisServer>
146148
): RedisSentinel {
147149
val builder = RedisSentinel.newRedisSentinel()
148-
.bind(sentinelConfig.bind.ifEmpty { DEFAULT_BIND })
149-
.port(if (sentinelConfig.port == 0) unspecifiedUnusedPort(true) else sentinelConfig.port)
150-
.setting("sentinel monitor $name ${mainNode.first.bind} ${mainNode.first.port} $QUORUM_SIZE")
151-
.setting("sentinel down-after-milliseconds $name ${sentinelConfig.downAfterMillis}")
152-
.setting("sentinel failover-timeout $name ${sentinelConfig.failOverTimeoutMillis}")
153-
.setting("sentinel parallel-syncs $name ${sentinelConfig.parallelSyncs}")
154-
if (config.executeInDirectory.isNotEmpty()) {
155-
builder.executableProvider(ExecutableProvider.newJarResourceProvider(File(config.executeInDirectory)))
156-
}
150+
.bind(sentinelConfig.bind.ifEmpty { DEFAULT_BIND })
151+
.port(if (sentinelConfig.port == 0) unspecifiedUnusedPort(true) else sentinelConfig.port)
152+
.setting("sentinel monitor $name ${mainNode.first.bind} ${mainNode.first.port} $QUORUM_SIZE")
153+
.setting("sentinel down-after-milliseconds $name ${sentinelConfig.downAfterMillis}")
154+
.setting("sentinel failover-timeout $name ${sentinelConfig.failOverTimeoutMillis}")
155+
.setting("sentinel parallel-syncs $name ${sentinelConfig.parallelSyncs}")
156+
builder.executableProvider(executableProvider)
157157
customizer.forEach { c -> c.customizeSentinels(builder, config, sentinelConfig) }
158158
return builder.build()
159159
}
160160

161161
private fun parseSentinelAddresses(redisHighAvailability: RedisCluster): List<Pair<String, Int>> =
162-
redisHighAvailability.sentinels()
163-
.map { parseBindAddress(it) to it.ports().first() }
164-
.toList()
162+
redisHighAvailability.sentinels()
163+
.map { parseBindAddress(it) to it.ports().first() }
164+
.toList()
165165

166166
private fun createClient(sentinelAddresses: List<Pair<String, Int>>): RedisClient {
167167
val jedisSentinelPool =
168-
JedisSentinelPool(name, sentinelAddresses.map { createAddress(it.first, it.second) }.toSet())
168+
JedisSentinelPool(name, sentinelAddresses.map { createAddress(it.first, it.second) }.toSet())
169169
return RedisHighAvailabilityClient(jedisSentinelPool)
170170
}
171171

172172
private fun setSpringProperties(
173-
context: ConfigurableApplicationContext,
174-
sentinelAddresses: List<Pair<String, Int>>
173+
context: ConfigurableApplicationContext,
174+
sentinelAddresses: List<Pair<String, Int>>
175175
) {
176176
val nodes = sentinelAddresses.joinToString(",") {
177177
createAddress(
178-
it.first,
179-
it.second
178+
it.first,
179+
it.second
180180
)
181181
}
182182
TestPropertyValues.of(
183-
mapOf(
184-
"spring.data.redis.sentinel.master" to name,
185-
"spring.data.redis.sentinel.nodes" to nodes
186-
)
183+
mapOf(
184+
"spring.data.redis.sentinel.master" to name,
185+
"spring.data.redis.sentinel.nodes" to nodes
186+
)
187187
).applyTo(context.environment)
188188
}
189189

190190
private fun addShutdownListener(
191-
context: ConfigurableApplicationContext,
192-
redisHighAvailability: RedisCluster,
193-
client: RedisClient
191+
context: ConfigurableApplicationContext,
192+
redisHighAvailability: RedisCluster,
193+
client: RedisClient
194194
) {
195195
context.addApplicationListener { event ->
196196
if (event is ContextClosedEvent) {
@@ -227,8 +227,8 @@ internal class RedisHighAvailabilityContextCustomizer(
227227

228228
internal data class Node(val port: Int, val bind: String) {
229229
constructor(node: RedisServer) : this(
230-
node.ports().first(),
231-
parseBindAddress(node)
230+
node.ports().first(),
231+
parseBindAddress(node)
232232
)
233233
}
234234

0 commit comments

Comments
 (0)