make jedis unit tests pass to Redis 2.8.1

* increase sentinel instance to test JedisSentinelTest
** clear() called, slave promoted to master (slave of no one), New
Sentinel force to restore it (demote) -> slave is not reusable
* ipv6 applied at Redis 2.8 -> localhost / 127.0.0.1 / ::1 is now all same

* Makefile: sleep some time for launch each sentinel (workaround to sentinel's issue)
** issue to sentinel leader vote: https://github.com/antirez/redis/issues/1419
*** sentinel may confused to vote with sentinels launched approximately same time
This commit is contained in:
Jungtaek Lim
2013-12-02 22:11:52 +09:00
parent e10cdda5c7
commit 15891c4117
5 changed files with 58 additions and 78 deletions

View File

@@ -50,6 +50,17 @@ save ""
appendonly no appendonly no
endef endef
define REDIS6_CONF
daemonize yes
port 6384
requirepass foobared
masterauth foobared
pidfile /tmp/redis6.pid
logfile /tmp/redis6.log
save ""
appendonly no
endef
define REDIS_SENTINEL1 define REDIS_SENTINEL1
port 26379 port 26379
daemonize yes daemonize yes
@@ -91,6 +102,7 @@ export REDIS2_CONF
export REDIS3_CONF export REDIS3_CONF
export REDIS4_CONF export REDIS4_CONF
export REDIS5_CONF export REDIS5_CONF
export REDIS6_CONF
export REDIS_SENTINEL1 export REDIS_SENTINEL1
export REDIS_SENTINEL2 export REDIS_SENTINEL2
export REDIS_SENTINEL3 export REDIS_SENTINEL3
@@ -101,8 +113,11 @@ start:
echo "$$REDIS3_CONF" | redis-server - echo "$$REDIS3_CONF" | redis-server -
echo "$$REDIS4_CONF" | redis-server - echo "$$REDIS4_CONF" | redis-server -
echo "$$REDIS5_CONF" | redis-server - echo "$$REDIS5_CONF" | redis-server -
echo "$$REDIS6_CONF" | redis-server -
echo "$$REDIS_SENTINEL1" > /tmp/sentinel1.conf && redis-server /tmp/sentinel1.conf --sentinel echo "$$REDIS_SENTINEL1" > /tmp/sentinel1.conf && redis-server /tmp/sentinel1.conf --sentinel
@sleep 0.5
echo "$$REDIS_SENTINEL2" > /tmp/sentinel2.conf && redis-server /tmp/sentinel2.conf --sentinel echo "$$REDIS_SENTINEL2" > /tmp/sentinel2.conf && redis-server /tmp/sentinel2.conf --sentinel
@sleep 0.5
echo "$$REDIS_SENTINEL3" > /tmp/sentinel3.conf && redis-server /tmp/sentinel3.conf --sentinel echo "$$REDIS_SENTINEL3" > /tmp/sentinel3.conf && redis-server /tmp/sentinel3.conf --sentinel
stop: stop:
@@ -112,76 +127,26 @@ stop:
kill `cat /tmp/redis3.pid` || true kill `cat /tmp/redis3.pid` || true
kill `cat /tmp/redis4.pid` || true kill `cat /tmp/redis4.pid` || true
kill `cat /tmp/redis5.pid` || true kill `cat /tmp/redis5.pid` || true
kill `cat /tmp/redis6.pid` || true
kill `cat /tmp/sentinel1.pid` kill `cat /tmp/sentinel1.pid`
kill `cat /tmp/sentinel2.pid` kill `cat /tmp/sentinel2.pid`
kill `cat /tmp/sentinel3.pid` kill `cat /tmp/sentinel3.pid`
test: test:
echo "$$REDIS1_CONF" | redis-server - make start
echo "$$REDIS2_CONF" | redis-server -
echo "$$REDIS3_CONF" | redis-server -
echo "$$REDIS4_CONF" | redis-server -
echo "$$REDIS5_CONF" | redis-server -
echo "$$REDIS_SENTINEL1" | redis-server - --sentinel
echo "$$REDIS_SENTINEL2" | redis-server - --sentinel
echo "$$REDIS_SENTINEL3" | redis-server - --sentinel
mvn clean compile test mvn clean compile test
make stop
kill `cat /tmp/redis1.pid`
kill `cat /tmp/redis2.pid`
# this get's segfaulted by the tests
kill `cat /tmp/redis3.pid` || true
kill `cat /tmp/redis4.pid` || true
kill `cat /tmp/redis5.pid` || true
kill `cat /tmp/sentinel1.pid`
kill `cat /tmp/sentinel2.pid`
kill `cat /tmp/sentinel3.pid`
deploy: deploy:
echo "$$REDIS1_CONF" | redis-server - make start
echo "$$REDIS2_CONF" | redis-server -
echo "$$REDIS3_CONF" | redis-server -
echo "$$REDIS4_CONF" | redis-server -
echo "$$REDIS5_CONF" | redis-server -
echo "$$REDIS_SENTINEL1" | redis-server - --sentinel
echo "$$REDIS_SENTINEL2" | redis-server - --sentinel
echo "$$REDIS_SENTINEL3" | redis-server - --sentinel
mvn clean deploy mvn clean deploy
make stop
kill `cat /tmp/redis1.pid`
kill `cat /tmp/redis2.pid`
# this get's segfaulted by the tests
kill `cat /tmp/redis3.pid` || true
kill `cat /tmp/redis4.pid` || true
kill `cat /tmp/redis5.pid` || true
kill `cat /tmp/sentinel1.pid`
kill `cat /tmp/sentinel2.pid`
kill `cat /tmp/sentinel3.pid`
release: release:
echo "$$REDIS1_CONF" | redis-server - make start
echo "$$REDIS2_CONF" | redis-server -
echo "$$REDIS3_CONF" | redis-server -
echo "$$REDIS4_CONF" | redis-server -
echo "$$REDIS5_CONF" | redis-server -
echo "$$REDIS_SENTINEL1" | redis-server - --sentinel
echo "$$REDIS_SENTINEL2" | redis-server - --sentinel
echo "$$REDIS_SENTINEL3" | redis-server - --sentinel
mvn release:clean mvn release:clean
mvn release:prepare mvn release:prepare
mvn release:perform mvn release:perform
make stop
kill `cat /tmp/redis1.pid`
kill `cat /tmp/redis2.pid`
# this get's segfaulted by the tests
kill `cat /tmp/redis3.pid` || true
kill `cat /tmp/redis4.pid` || true
kill `cat /tmp/redis5.pid` || true
kill `cat /tmp/sentinel1.pid`
kill `cat /tmp/sentinel2.pid`
kill `cat /tmp/sentinel3.pid`
.PHONY: test .PHONY: test

View File

@@ -45,9 +45,9 @@
</scm> </scm>
<properties> <properties>
<redis-hosts>localhost:6379,localhost:6380,localhost:6381,localhost:6382,localhost:6383</redis-hosts> <redis-hosts>localhost:6379,localhost:6380,localhost:6381,localhost:6382,localhost:6383,localhost:6384</redis-hosts>
<sentinel-hosts>localhost:26379,localhost:26380</sentinel-hosts> <sentinel-hosts>localhost:26379,localhost:26380,localhost:26381</sentinel-hosts>
<github.global.server>github</github.global.server> <github.global.server>github</github.global.server>
</properties> </properties>
<dependencies> <dependencies>

View File

@@ -1,6 +1,8 @@
package redis.clients.jedis; package redis.clients.jedis;
public class HostAndPort { public class HostAndPort {
public static final String LOCALHOST_STR = "localhost";
private String host; private String host;
private int port; private int port;
@@ -22,11 +24,11 @@ public class HostAndPort {
if (obj instanceof HostAndPort) { if (obj instanceof HostAndPort) {
HostAndPort hp = (HostAndPort) obj; HostAndPort hp = (HostAndPort) obj;
// localhost and 127.0.0.1 is same String thisHost = convertHost(host);
return port == hp.port && String hpHost = convertHost(hp.host);
(host.equals(hp.host) || return port == hp.port &&
(host.equals("localhost") && hp.host.equals("127.0.0.1")) || thisHost.equals(hpHost);
(host.equals("127.0.0.1") && hp.host.equals("localhost")) );
} }
return false; return false;
@@ -36,4 +38,13 @@ public class HostAndPort {
public String toString() { public String toString() {
return host + ":" + port; return host + ":" + port;
} }
private String convertHost(String host) {
if (host.equals("127.0.0.1"))
return LOCALHOST_STR;
else if (host.equals("::1"))
return LOCALHOST_STR;
return host;
}
} }

View File

@@ -27,14 +27,17 @@ public class HostAndPortUtil {
HostAndPort defaulthnp5 = new HostAndPort("localhost", Protocol.DEFAULT_PORT + 4); HostAndPort defaulthnp5 = new HostAndPort("localhost", Protocol.DEFAULT_PORT + 4);
redisHostAndPortList.add(defaulthnp5); redisHostAndPortList.add(defaulthnp5);
HostAndPort defaulthnp6 = new HostAndPort("localhost", Protocol.DEFAULT_SENTINEL_PORT); HostAndPort defaulthnp6 = new HostAndPort("localhost", Protocol.DEFAULT_PORT + 5);
sentinelHostAndPortList.add(defaulthnp6); redisHostAndPortList.add(defaulthnp6);
HostAndPort defaulthnp7 = new HostAndPort("localhost", Protocol.DEFAULT_SENTINEL_PORT + 1); HostAndPort defaulthnp7 = new HostAndPort("localhost", Protocol.DEFAULT_SENTINEL_PORT);
sentinelHostAndPortList.add(defaulthnp7); sentinelHostAndPortList.add(defaulthnp7);
HostAndPort defaulthnp8 = new HostAndPort("localhost", Protocol.DEFAULT_SENTINEL_PORT + 2); HostAndPort defaulthnp8 = new HostAndPort("localhost", Protocol.DEFAULT_SENTINEL_PORT + 1);
sentinelHostAndPortList.add(defaulthnp8); sentinelHostAndPortList.add(defaulthnp8);
HostAndPort defaulthnp9 = new HostAndPort("localhost", Protocol.DEFAULT_SENTINEL_PORT + 2);
sentinelHostAndPortList.add(defaulthnp9);
String envRedisHosts = System.getProperty("redis-hosts"); String envRedisHosts = System.getProperty("redis-hosts");
String envSentinelHosts = System.getProperty("sentinel-hosts"); String envSentinelHosts = System.getProperty("sentinel-hosts");

View File

@@ -17,8 +17,8 @@ public class JedisSentinelTest extends JedisTestBase {
protected static HostAndPort master = HostAndPortUtil.getRedisServers() protected static HostAndPort master = HostAndPortUtil.getRedisServers()
.get(0); .get(0);
protected static HostAndPort slave = HostAndPortUtil.getRedisServers().get( protected static HostAndPort slave = HostAndPortUtil.getRedisServers()
1); .get(5);
protected static HostAndPort sentinel = HostAndPortUtil protected static HostAndPort sentinel = HostAndPortUtil
.getSentinelServers().get(0); .getSentinelServers().get(0);
@@ -44,14 +44,14 @@ public class JedisSentinelTest extends JedisTestBase {
@After @After
public void clear() throws InterruptedException { public void clear() throws InterruptedException {
Jedis j = new Jedis("localhost", 6380); // New Sentinel (after 2.8.1)
j.auth("foobared"); // when slave promoted to master (slave of no one), New Sentinel force to restore it (demote)
j.slaveofNoOne(); // so, promote(slaveof) slave to master has no effect, not same to old Sentinel's behavior
} }
@Test @Test
public void sentinel() { public void sentinel() {
Jedis j = new Jedis("localhost", 26379); Jedis j = new Jedis(sentinel.getHost(), sentinel.getPort());
List<Map<String, String>> masters = j.sentinelMasters(); List<Map<String, String>> masters = j.sentinelMasters();
final String masterName = masters.get(0).get("name"); final String masterName = masters.get(0).get("name");
@@ -59,12 +59,13 @@ public class JedisSentinelTest extends JedisTestBase {
List<String> masterHostAndPort = j List<String> masterHostAndPort = j
.sentinelGetMasterAddrByName(masterName); .sentinelGetMasterAddrByName(masterName);
assertEquals("127.0.0.1", masterHostAndPort.get(0)); HostAndPort masterFromSentinel = new HostAndPort(masterHostAndPort.get(0),
assertEquals("6379", masterHostAndPort.get(1)); Integer.parseInt(masterHostAndPort.get(1)));
assertEquals(master, masterFromSentinel);
List<Map<String, String>> slaves = j.sentinelSlaves(masterName); List<Map<String, String>> slaves = j.sentinelSlaves(masterName);
assertTrue(slaves.size() > 0); assertTrue(slaves.size() > 0);
assertEquals("6379", slaves.get(0).get("master-port")); assertEquals(master.getPort(), Integer.parseInt(slaves.get(0).get("master-port")));
// DO NOT RE-RUN TEST TOO FAST, RESET TAKES SOME TIME TO... RESET // DO NOT RE-RUN TEST TOO FAST, RESET TAKES SOME TIME TO... RESET
assertEquals(Long.valueOf(1), j.sentinelReset(masterName)); assertEquals(Long.valueOf(1), j.sentinelReset(masterName));