Skip to content

Commit 1910017

Browse files
authored
Merge pull request #255 from voidconductor/fix-reconnect
fix initialization after reconnect #185
2 parents 082b9c1 + 169daf1 commit 1910017

File tree

4 files changed

+55
-26
lines changed

4 files changed

+55
-26
lines changed

src/main/scala/com/redis/IO.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ trait IO extends Log {
1919
socket != null && socket.isBound && !socket.isClosed && socket.isConnected && !socket.isInputShutdown && !socket.isOutputShutdown
2020
}
2121

22+
def onConnect(): Unit
23+
2224
// Connects the socket, and sets the input and output streams.
2325
def connect: Boolean = {
2426
try {
@@ -31,6 +33,7 @@ trait IO extends Log {
3133

3234
out = socket.getOutputStream
3335
in = new BufferedInputStream(socket.getInputStream)
36+
onConnect()
3437
true
3538
} catch {
3639
case x: Throwable =>

src/main/scala/com/redis/RedisClient.scala

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ trait Redis extends IO with Protocol {
3030
result
3131
} catch {
3232
case e: RedisConnectionException =>
33-
if (reconnect) send(command, args)(result)
33+
if (disconnect) send(command, args)(result)
3434
else throw e
3535
case e: SocketException =>
36-
if (reconnect) send(command, args)(result)
36+
if (disconnect) send(command, args)(result)
3737
else throw e
3838
}
3939

@@ -42,10 +42,10 @@ trait Redis extends IO with Protocol {
4242
result
4343
} catch {
4444
case e: RedisConnectionException =>
45-
if (reconnect) send(command)(result)
45+
if (disconnect) send(command)(result)
4646
else throw e
4747
case e: SocketException =>
48-
if (reconnect) send(command)(result)
48+
if (disconnect) send(command)(result)
4949
else throw e
5050
}
5151

@@ -54,11 +54,6 @@ trait Redis extends IO with Protocol {
5454
protected def flattenPairs(in: Iterable[Product2[Any, Any]]): List[Any] =
5555
in.iterator.flatMap(x => Iterator(x._1, x._2)).toList
5656

57-
def reconnect: Boolean = {
58-
disconnect && initialize
59-
}
60-
61-
protected def initialize : Boolean
6257
}
6358

6459
trait RedisCommand extends Redis
@@ -78,16 +73,11 @@ trait RedisCommand extends Redis
7873
val database: Int = 0
7974
val secret: Option[Any] = None
8075

81-
override def initialize : Boolean = {
82-
if(connect) {
83-
secret.foreach {s =>
84-
auth(s)
85-
}
86-
selectDatabase()
87-
true
88-
} else {
89-
false
76+
override def onConnect: Unit = {
77+
secret.foreach {s =>
78+
auth(s)
9079
}
80+
selectDatabase()
9181
}
9282

9383
private def selectDatabase(): Unit = {
@@ -106,8 +96,6 @@ class RedisClient(override val host: String, override val port: Int,
10696
override val database: Int = 0, override val secret: Option[Any] = None, override val timeout : Int = 0)
10797
extends RedisCommand with PubSub {
10898

109-
initialize
110-
11199
def this() = this("localhost", 6379)
112100
def this(connectionUri: java.net.URI) = this(
113101
host = connectionUri.getHost,
@@ -217,13 +205,12 @@ class RedisClient(override val host: String, override val port: Int,
217205
// TODO: Find a better abstraction
218206
override def connected = parent.connected
219207
override def connect = parent.connect
220-
override def reconnect = parent.reconnect
221208
override def disconnect = parent.disconnect
222209
override def clearFd = parent.clearFd
223210
override def write(data: Array[Byte]) = parent.write(data)
224211
override def readLine = parent.readLine
225212
override def readCounted(count: Int) = parent.readCounted(count)
226-
override def initialize = parent.initialize
213+
override def onConnect() = parent.onConnect()
227214

228215
override def close(): Unit = parent.close()
229216
}

src/main/scala/com/redis/ds/Deque.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ class RedisDequeClient(val h: String, val p: Int, val d: Int = 0, val s: Option[
8484
val key = k
8585
override val database = d
8686
override val secret = s
87-
initialize
8887

8988
override def close(): Unit = disconnect
9089
}

src/test/scala/com/redis/RedisClientSpec.scala

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package com.redis
22

3-
import java.net.URI
3+
import java.net.{ServerSocket, URI}
44

5+
import com.github.dockerjava.core.DefaultDockerClientConfig
56
import com.redis.api.ApiSpec
6-
import org.scalatest.FunSpec
7-
import org.scalatest.Matchers
7+
import com.whisk.docker.DockerContainerManager
8+
import com.whisk.docker.impl.dockerjava.Docker
9+
import org.scalatest.{FunSpec, Matchers}
10+
11+
import scala.concurrent.Await
12+
import scala.concurrent.duration._
813

914
class RedisClientSpec extends FunSpec
1015
with Matchers with ApiSpec {
@@ -67,4 +72,39 @@ class RedisClientSpec extends FunSpec
6772
r.get("vvl:qm")
6873
r.close()
6974
}}
75+
76+
describe("test reconnect") {
77+
it("should re-init after server restart") {
78+
val docker = new Docker(DefaultDockerClientConfig.createDefaultConfigBuilder().build()).client
79+
80+
val port = {
81+
val s = new ServerSocket(0)
82+
val p = s.getLocalPort
83+
s.close()
84+
p
85+
}
86+
87+
val manager = new DockerContainerManager(
88+
createContainer(ports = Map(redisPort -> port)) :: Nil, dockerFactory.createExecutor()
89+
)
90+
91+
val key = "test-1"
92+
val value = "test-value-1"
93+
94+
val (cs, _) :: _ = Await.result(manager.initReadyAll(20.seconds), 21.second)
95+
val id = Await.result(cs.id, 10.seconds)
96+
97+
val c = new RedisClient(redisContainerHost, port, 8, timeout = 10.seconds.toMillis.toInt)
98+
c.set(key, value)
99+
docker.stopContainerCmd(id).exec()
100+
try {c.get(key)} catch { case e: Throwable => }
101+
docker.startContainerCmd(id).exec()
102+
val got = c.get(key)
103+
c.close()
104+
docker.removeContainerCmd(id).withForce(true).withRemoveVolumes(true).exec()
105+
docker.close()
106+
107+
got shouldBe Some(value)
108+
}
109+
}
70110
}

0 commit comments

Comments
 (0)