summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosiah Carlson <josiah@chownow.com>2012-04-11 16:27:19 -0700
committerJosiah Carlson <josiah@chownow.com>2012-04-11 16:27:19 -0700
commitb8dd22455dc4f16eef28e848fc05b0b723022899 (patch)
tree3ceb449ae2af8bce2b0115962492c69d25115ec2
parentd92405bf6186c9b0fab6d98fbed9aedee81b39e0 (diff)
downloadredis-py-b8dd22455dc4f16eef28e848fc05b0b723022899.tar.gz
Fix re-used connection errors after fork().
-rw-r--r--redis/connection.py16
1 files changed, 14 insertions, 2 deletions
diff --git a/redis/connection.py b/redis/connection.py
index 1a5466f..df875ad 100644
--- a/redis/connection.py
+++ b/redis/connection.py
@@ -1,3 +1,4 @@
+import os
import socket
from itertools import chain, imap
from redis.exceptions import (
@@ -163,6 +164,7 @@ class Connection(object):
def __init__(self, host='localhost', port=6379, db=0, password=None,
socket_timeout=None, encoding='utf-8',
encoding_errors='strict', parser_class=DefaultParser):
+ self.pid = os.getpid()
self.host = host
self.port = port
self.db = db
@@ -284,6 +286,7 @@ class UnixDomainSocketConnection(Connection):
def __init__(self, path='', db=0, password=None,
socket_timeout=None, encoding='utf-8',
encoding_errors='strict', parser_class=DefaultParser):
+ self.pid = os.getpid()
self.path = path
self.db = db
self.password = password
@@ -316,6 +319,7 @@ class ConnectionPool(object):
"Generic connection pool"
def __init__(self, connection_class=Connection, max_connections=None,
**connection_kwargs):
+ self.pid = os.getpid()
self.connection_class = connection_class
self.connection_kwargs = connection_kwargs
self.max_connections = max_connections or 2**31
@@ -323,8 +327,14 @@ class ConnectionPool(object):
self._available_connections = []
self._in_use_connections = set()
+ def _checkpid(self):
+ if self.pid != os.getpid():
+ self.disconnect()
+ self.__init__(self.connection_class, self.max_connections, **self.connection_kwargs)
+
def get_connection(self, command_name, *keys, **options):
"Get a connection from the pool"
+ self._checkpid()
try:
connection = self._available_connections.pop()
except IndexError:
@@ -341,8 +351,10 @@ class ConnectionPool(object):
def release(self, connection):
"Releases the connection back to the pool"
- self._in_use_connections.remove(connection)
- self._available_connections.append(connection)
+ self._checkpid()
+ if connection.pid == self.pid:
+ self._in_use_connections.remove(connection)
+ self._available_connections.append(connection)
def disconnect(self):
"Disconnects all connections in the pool"