From c5b93eb18dc7d8fc1463d24cfa5676f35a7588af Mon Sep 17 00:00:00 2001 From: lloydmeta Date: Sun, 29 Apr 2018 19:50:46 +0900 Subject: [PATCH] * Move mconn.enqueueOperation into prepareFuture and wrap it in try-catch because it can fail. On failure, complete the future with a failure, passing it the caught Throwable --- .../internals/SpyMemcachedIntegration.scala | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/scala/shade/memcached/internals/SpyMemcachedIntegration.scala b/src/main/scala/shade/memcached/internals/SpyMemcachedIntegration.scala index 41d49f9..edb12a7 100644 --- a/src/main/scala/shade/memcached/internals/SpyMemcachedIntegration.scala +++ b/src/main/scala/shade/memcached/internals/SpyMemcachedIntegration.scala @@ -201,7 +201,6 @@ class SpyMemcachedIntegration(cf: ConnectionFactory, addrs: Seq[InetSocketAddres } }) - mconn.enqueueOperation(key, op) prepareFuture(key, op, promise, timeout) } @@ -225,7 +224,6 @@ class SpyMemcachedIntegration(cf: ConnectionFactory, addrs: Seq[InetSocketAddres } }) - mconn.enqueueOperation(key, op) prepareFuture(key, op, promise, timeout) } @@ -251,7 +249,6 @@ class SpyMemcachedIntegration(cf: ConnectionFactory, addrs: Seq[InetSocketAddres } }) - mconn.enqueueOperation(key, op) prepareFuture(key, op, promise, timeout) } @@ -276,7 +273,6 @@ class SpyMemcachedIntegration(cf: ConnectionFactory, addrs: Seq[InetSocketAddres } }) - mconn.enqueueOperation(key, op) prepareFuture(key, op, promise, timeout) } @@ -307,7 +303,6 @@ class SpyMemcachedIntegration(cf: ConnectionFactory, addrs: Seq[InetSocketAddres } }) - mconn.enqueueOperation(key, op) prepareFuture(key, op, promise, timeout) } @@ -336,7 +331,6 @@ class SpyMemcachedIntegration(cf: ConnectionFactory, addrs: Seq[InetSocketAddres } }) - mconn.enqueueOperation(key, op) prepareFuture(key, op, promise, timeout) } @@ -362,11 +356,17 @@ class SpyMemcachedIntegration(cf: ConnectionFactory, addrs: Seq[InetSocketAddres } }) - mconn.enqueueOperation(key, op) prepareFuture(key, op, promise, timeout) } protected final def prepareFuture[T](key: String, op: Operation, promise: Promise[Result[T]], atMost: FiniteDuration)(implicit ec: ExecutionContext): CancelableFuture[Result[T]] = { + try { + mconn.enqueueOperation(key, op) + } catch { + // enqueueOperation can throw IllegalStateException when + // the queue is full (see #60) + case NonFatal(e) => promise.tryFailure(e) + } val operationCancelable = Cancelable(() => { try { if (!op.isCancelled)