Merge branch 'master' into debian-0.11
[pithos] / snf-pithos-app / pithos / api / util.py
index ebfc037..197156b 100644 (file)
@@ -56,12 +56,12 @@ from pithos.api.faults import (Fault, NotModified, BadRequest, Unauthorized, For
                                 RangeNotSatisfiable, InternalServerError, NotImplemented)
 from pithos.api.short_url import encode_url
 from pithos.api.settings import (BACKEND_DB_MODULE, BACKEND_DB_CONNECTION,
-                                    BACKEND_BLOCK_MODULE, BACKEND_BLOCK_PATH,
-                                    BACKEND_BLOCK_UMASK,
-                                    BACKEND_QUEUE_MODULE, BACKEND_QUEUE_CONNECTION,
-                                    BACKEND_QUOTA, BACKEND_VERSIONING,
-                                    AUTHENTICATION_URL, AUTHENTICATION_USERS,
-                                    SERVICE_TOKEN, COOKIE_NAME)
+                                 BACKEND_BLOCK_MODULE, BACKEND_BLOCK_PATH,
+                                 BACKEND_BLOCK_UMASK,
+                                 BACKEND_QUEUE_MODULE, BACKEND_QUEUE_CONNECTION,
+                                 BACKEND_QUOTA, BACKEND_VERSIONING,
+                                 AUTHENTICATION_URL, AUTHENTICATION_USERS,
+                                 SERVICE_TOKEN, COOKIE_NAME)
 
 from pithos.backends import connect_backend
 from pithos.backends.base import NotAllowedError, QuotaError, ItemNotExists, VersionNotExists
@@ -788,18 +788,29 @@ def simple_list_response(request, l):
     if request.serialization == 'json':
         return json.dumps(l)
 
+
+from pithos.backends.util import PithosBackendPool
+POOL_SIZE = 5
+
+
+_pithos_backend_pool = PithosBackendPool(size=POOL_SIZE,
+                                         db_module=BACKEND_DB_MODULE,
+                                         db_connection=BACKEND_DB_CONNECTION,
+                                         block_module=BACKEND_BLOCK_MODULE,
+                                         block_path=BACKEND_BLOCK_PATH,
+                                         block_umask=BACKEND_BLOCK_UMASK,
+                                         queue_module=BACKEND_QUEUE_MODULE,
+                                         queue_connection=BACKEND_QUEUE_CONNECTION)
+
+
 def get_backend():
-    backend = connect_backend(db_module=BACKEND_DB_MODULE,
-                              db_connection=BACKEND_DB_CONNECTION,
-                              block_module=BACKEND_BLOCK_MODULE,
-                              block_path=BACKEND_BLOCK_PATH,
-                              block_umask=BACKEND_BLOCK_UMASK,
-                              queue_module=BACKEND_QUEUE_MODULE,
-                              queue_connection=BACKEND_QUEUE_CONNECTION)
+    backend = _pithos_backend_pool.pool_get()
     backend.default_policy['quota'] = BACKEND_QUOTA
     backend.default_policy['versioning'] = BACKEND_VERSIONING
+    backend.messages = []
     return backend
 
+
 def update_request_headers(request):
     # Handle URL-encoded keys and values.
     meta = dict([(k, v) for k, v in request.META.iteritems() if k.startswith('HTTP_')])
@@ -870,6 +881,7 @@ def request_serialization(request, format_allowed=False):
     
     return 'text'
 
+
 def api_method(http_method=None, format_allowed=False, user_required=True):
     """Decorator function for views that implement an API method."""
     
@@ -907,6 +919,8 @@ def api_method(http_method=None, format_allowed=False, user_required=True):
                 update_response_headers(request, response)
                 return response
             except Fault, fault:
+                if fault.code >= 500:
+                    logger.exception("API Fault")
                 return render_fault(request, fault)
             except BaseException, e:
                 logger.exception('Unexpected error: %s' % e)