From cda56c117ba77977b9d2f14ba7ca85229445565d Mon Sep 17 00:00:00 2001 From: Roey Berman Date: Mon, 27 Jan 2014 18:54:43 +0200 Subject: [PATCH 1/2] fix (rare) race condition in ConnectionPool.get() --- cqlengine/connection.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/cqlengine/connection.py b/cqlengine/connection.py index 01b94023..6872bb8e 100644 --- a/cqlengine/connection.py +++ b/cqlengine/connection.py @@ -3,7 +3,11 @@ #http://cassandra.apache.org/doc/cql/CQL.html from collections import namedtuple -import Queue +try: + import Queue as queue +except ImportError: + # python 3 + import queue import random import cql @@ -118,7 +122,7 @@ class ConnectionPool(object): self._consistency = consistency self._timeout = timeout - self._queue = Queue.Queue(maxsize=_max_connections) + self._queue = queue.Queue(maxsize=_max_connections) def clear(self): """ @@ -138,11 +142,14 @@ class ConnectionPool(object): a new one. """ try: - if self._queue.empty(): - return self._create_connection() + # get with blocking=False (default) returns an item if one + # is immediately available, else raises the Empty exception return self._queue.get() - except CQLConnectionError as cqle: - raise cqle + except queue.Empty: + try: + return self._create_connection() + except CQLConnectionError as cqle: + raise cqle def put(self, conn): """ From 1b0cbe27d59e1869b8de410de5b52ca06620db15 Mon Sep 17 00:00:00 2001 From: Roey Berman Date: Sun, 2 Feb 2014 13:46:25 +0200 Subject: [PATCH 2/2] connection queue - issue non-blocking get to pool queue --- cqlengine/connection.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cqlengine/connection.py b/cqlengine/connection.py index 6872bb8e..2eb2d30e 100644 --- a/cqlengine/connection.py +++ b/cqlengine/connection.py @@ -142,9 +142,9 @@ class ConnectionPool(object): a new one. """ try: - # get with blocking=False (default) returns an item if one + # get with block=False returns an item if one # is immediately available, else raises the Empty exception - return self._queue.get() + return self._queue.get(block=False) except queue.Empty: try: return self._create_connection()