Skip to content

Commit

Permalink
fix connection reset. empty the pool on error so we make sure connection
Browse files Browse the repository at this point in the history
is really reset.
  • Loading branch information
benoitc committed Nov 22, 2009
1 parent fe4cbf3 commit 49f4366
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 27 deletions.
3 changes: 3 additions & 0 deletions restkit/ext/eventlet_pool.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,9 @@ def __init__(self, uri, use_proxy=False, key_file=None,
def create(self):
return make_connection(self.uri, use_proxy=self.use_proxy,
key_file=self.key_file, cert_file=self.cert_file)

def clean(self):
return True

def put(self, connection):
if self.current_size > self.max_size:
Expand Down
29 changes: 11 additions & 18 deletions restkit/httpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import types
import urllib
import urlparse
import sys

import restkit
from restkit import errors
Expand Down Expand Up @@ -135,8 +136,11 @@ def _get_connection(self, uri, headers=None):
def _release_connection(self, uri, connection):
pool = self._get_pool(uri)
pool.put(connection)



def _clean_pool(self, uri):
pool = self._get_pool(uri)
pool.clean()

def _make_request(self, uri, method, body, headers):
for i in range(2):
connection = self._get_connection(uri, headers)
Expand Down Expand Up @@ -183,23 +187,12 @@ def _make_request(self, uri, method, body, headers):
_send_body_part(body_part, connection)
else:
_send_body_part(body, connection)

except socket.gaierror:
connection.close()
self._release_connection(uri, connection)
raise errors.ResourceNotFound("Unable to find the server at %s" % connection.host, 404)
except (socket.error, httplib.HTTPException):
connection.close()
self._release_connection(uri, connection)
if i == 0:
continue
else:
raise
try:
response = connection.getresponse()
except httplib.HTTPException:
connection.close()
self._release_connection(uri, connection)
except socket.gaierror, e:
self._clean_pool(uri)
raise errors.ResourceNotFound("Unable to find the server at %s" % connection.host, 404)
except (socket.error, httplib.BadStatusLine), e:
self._clean_pool(uri)
if i == 0:
continue
else:
Expand Down
25 changes: 19 additions & 6 deletions restkit/pool.py
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,10 @@ def create(self):
"""Generate a new pool item
"""
raise NotImplementedError("Implement in subclass")

def clean(self):
""" clean the pool """
raise NotImplementedError("Implement in subclass")

class ConnectionPool(Pool):
def __init__(self, uri, use_proxy=False, key_file=None, cert_file=None,
Expand All @@ -205,6 +209,17 @@ def __init__(self, uri, use_proxy=False, key_file=None, cert_file=None,
self.cert_file = cert_file
self.timeout = timeout
Pool.__init__(self, min_size, max_size)

def clean(self):
while True:
if self.free_items:
self.free_items.popleft()
else:
try:
connection = self.channel.get(False)
connection.close()
except Queue.Empty:
break

def create(self):
connection = make_connection(self.uri, use_proxy=self.use_proxy,
Expand All @@ -218,9 +233,11 @@ def get(self):
connection = self.do_get()
since = time.time() - connection.started
if since < self.timeout:

if connection._HTTPConnection__response:
connection._HTTPConnection__response.read()
return connection
else:

connection.close()
self.lock.acquire()
if self.current_size > self.max_size:
Expand All @@ -235,11 +252,7 @@ def put(self, connection):
connection.close()
self.lock.release()
return


if connection._HTTPConnection__response:
connection._HTTPConnection__response.read()


if connection.sock is None:
connection = self.create()

Expand Down
6 changes: 3 additions & 3 deletions restkit/rest.py
Original file line number Diff line number Diff line change
Expand Up @@ -465,13 +465,13 @@ def request(self, method, uri, path=None, body=None, headers=None, _stream=False

try:
resp, data = self.transport.request(self.make_uri(uri, path, **params),
method=method, body=body, headers=_headers,
stream=_stream, stream_size=_stream_size)
method=method, body=body, headers=_headers, stream=_stream,
stream_size=_stream_size)
except (socket.error, httplib.BadStatusLine), e:
raise restkit.errors.RequestFailed(str(e), http_code=0,
response=HTTPResponse({}))
except restkit.errors.RequestError, e:
raise restkit.errors.RequestFailed(str(e), http_code=0,
raise restkit.errors.RequestFailed(str(e), http_code=0,
response=HTTPResponse({}))
except:
raise
Expand Down

0 comments on commit 49f4366

Please sign in to comment.