From 8188412db0b0d1b7cab0cc949dfe82e9eba2c5e9 Mon Sep 17 00:00:00 2001 From: kamekoopa Date: Wed, 16 Jul 2014 17:21:23 +0900 Subject: [PATCH 1/3] Fix: a jedis client returning destination A client has to be returned to the broken client pool, when an exception occurred. --- .gitignore | 1 + src/main/scala/sedis.scala | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index e6d28c8..1aa973e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ project/plugins/target project/plugins/project/* .idea/* logs/ +*iml diff --git a/src/main/scala/sedis.scala b/src/main/scala/sedis.scala index b8df144..436fe93 100644 --- a/src/main/scala/sedis.scala +++ b/src/main/scala/sedis.scala @@ -91,21 +91,32 @@ class Pool(val underlying: JedisPool) { def withClient[T](body: Dress.Wrap => T): T = { val jedis: Jedis = underlying.getResource + var result = null.asInstanceOf[T] try { - body(Dress.up(jedis)) + result = body(Dress.up(jedis)) + result } finally { - underlying.returnResourceObject(jedis) + if(result == null){ + underlying.returnBrokenResource(jedis) + }else{ + underlying.returnResourceObject(jedis) + } } } def withJedisClient[T](body: Jedis => T): T = { val jedis: Jedis = underlying.getResource + var result = null.asInstanceOf[T] try { - body(jedis) + result = body(jedis) + result } finally { - underlying.returnResourceObject(jedis) + if(result == null){ + underlying.returnBrokenResource(jedis) + }else{ + underlying.returnResourceObject(jedis) + } } } - } class SentinelPool(val underlying: JedisSentinelPool) { From de67eed5419a82d2df2d0db36c3a8e8f5e345aa5 Mon Sep 17 00:00:00 2001 From: kamekoopa Date: Sun, 7 Jul 2013 04:15:29 +0900 Subject: [PATCH 2/3] Fixed the error handling that use a "Try". --- src/main/scala/sedis.scala | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/main/scala/sedis.scala b/src/main/scala/sedis.scala index 436fe93..57f20f8 100644 --- a/src/main/scala/sedis.scala +++ b/src/main/scala/sedis.scala @@ -1,6 +1,8 @@ package org.sedis import redis.clients.jedis._ +import scala.util.{Failure, Try} +import redis.clients.jedis.exceptions.JedisConnectionException trait Dress { implicit def delegateToJedis(d: Wrap) = d.j @@ -91,31 +93,32 @@ class Pool(val underlying: JedisPool) { def withClient[T](body: Dress.Wrap => T): T = { val jedis: Jedis = underlying.getResource - var result = null.asInstanceOf[T] - try { - result = body(Dress.up(jedis)) - result - } finally { - if(result == null){ + val result = Try(body(Dress.up(jedis))) + + result match { + case Failure(e:JedisConnectionException) => { underlying.returnBrokenResource(jedis) - }else{ - underlying.returnResourceObject(jedis) + } + case _ => { + underlying.returnResource(jedis) } } + result.get } + def withJedisClient[T](body: Jedis => T): T = { val jedis: Jedis = underlying.getResource - var result = null.asInstanceOf[T] - try { - result = body(jedis) - result - } finally { - if(result == null){ + val result = Try(body(jedis)) + + result match { + case Failure(e:JedisConnectionException) => { underlying.returnBrokenResource(jedis) - }else{ - underlying.returnResourceObject(jedis) + } + case _ => { + underlying.returnResource(jedis) } } + result.get } } From 55339aac33ad4b068ecb79a11209d078e0520ba5 Mon Sep 17 00:00:00 2001 From: kamekoopa Date: Wed, 16 Jul 2014 17:39:07 +0900 Subject: [PATCH 3/3] Fix: duplicate code --- src/main/scala/sedis.scala | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/main/scala/sedis.scala b/src/main/scala/sedis.scala index 57f20f8..c1d717d 100644 --- a/src/main/scala/sedis.scala +++ b/src/main/scala/sedis.scala @@ -92,18 +92,7 @@ object Dress extends Dress class Pool(val underlying: JedisPool) { def withClient[T](body: Dress.Wrap => T): T = { - val jedis: Jedis = underlying.getResource - val result = Try(body(Dress.up(jedis))) - - result match { - case Failure(e:JedisConnectionException) => { - underlying.returnBrokenResource(jedis) - } - case _ => { - underlying.returnResource(jedis) - } - } - result.get + withJedisClient({ jedis: Jedis => body(Dress.up(jedis)) }) } def withJedisClient[T](body: Jedis => T): T = {