]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Put a mutex around the QueuePool's overflow handlings
authorJason Kirtland <jek@discorporate.us>
Sat, 16 Jun 2007 15:51:13 +0000 (15:51 +0000)
committerJason Kirtland <jek@discorporate.us>
Sat, 16 Jun 2007 15:51:13 +0000 (15:51 +0000)
lib/sqlalchemy/pool.py

index a77e979abd6c73600d8fa3892bc78df7e29ecee3..075e5cbc4e4bcc0f52113bb5ff20d9ee96ec3488 100644 (file)
@@ -23,9 +23,11 @@ from sqlalchemy import exceptions, logging
 from sqlalchemy import queue as Queue
 
 try:
-    import thread
+    import dummy_threading
+    import thread, threading
 except:
     import dummy_thread as thread
+    import dummy_threading as threading
 
 proxies = {}
 
@@ -469,6 +471,7 @@ class QueuePool(Pool):
         self._overflow = 0 - pool_size
         self._max_overflow = max_overflow
         self._timeout = timeout
+        self._overflow_lock = max_overflow > 0 and threading.Lock() or dummy_threading.Lock()
 
     def recreate(self):
         self.log("Pool recreating")
@@ -478,16 +481,22 @@ class QueuePool(Pool):
         try:
             self._pool.put(conn, False)
         except Queue.Full:
+            self._overflow_lock.acquire()
             self._overflow -= 1
+            self._overflow_lock.release()
 
     def do_get(self):
         try:
             return self._pool.get(self._max_overflow > -1 and self._overflow >= self._max_overflow, self._timeout)
         except Queue.Empty:
-            if self._max_overflow > -1 and self._overflow >= self._max_overflow:
-                raise exceptions.TimeoutError("QueuePool limit of size %d overflow %d reached, connection timed out" % (self.size(), self.overflow()))
-            con = self.create_connection()
-            self._overflow += 1
+            self._overflow_lock.acquire()
+            try:
+                if self._max_overflow > -1 and self._overflow >= self._max_overflow:
+                    raise exceptions.TimeoutError("QueuePool limit of size %d overflow %d reached, connection timed out" % (self.size(), self.overflow()))
+                con = self.create_connection()
+                self._overflow += 1
+            finally:
+                self._overflow_lock.release()
             return con
 
     def dispose(self):