Revision edb7875c snf-pithos-app/pithos/api/util.py
b/snf-pithos-app/pithos/api/util.py | ||
---|---|---|
789 | 789 |
return json.dumps(l) |
790 | 790 |
|
791 | 791 |
|
792 |
def _get_backend(): |
|
793 |
backend = connect_backend(db_module=BACKEND_DB_MODULE, |
|
794 |
db_connection=BACKEND_DB_CONNECTION, |
|
795 |
block_module=BACKEND_BLOCK_MODULE, |
|
796 |
block_path=BACKEND_BLOCK_PATH, |
|
797 |
block_umask=BACKEND_BLOCK_UMASK, |
|
798 |
queue_module=BACKEND_QUEUE_MODULE, |
|
799 |
queue_connection=BACKEND_QUEUE_CONNECTION) |
|
800 |
backend.default_policy['quota'] = BACKEND_QUOTA |
|
801 |
backend.default_policy['versioning'] = BACKEND_VERSIONING |
|
802 |
return backend |
|
803 |
|
|
804 |
|
|
805 |
def _pooled_backend_close(backend): |
|
806 |
backend._pool.pool_put(backend) |
|
807 |
|
|
808 |
|
|
809 |
from synnefo.lib.pool import ObjectPool |
|
810 |
from new import instancemethod |
|
811 |
from select import select |
|
812 |
from traceback import print_exc |
|
813 |
|
|
814 |
USAGE_LIMIT = 500 |
|
792 |
from pithos.backends.util import PithosBackendPool |
|
815 | 793 |
POOL_SIZE = 5 |
816 | 794 |
|
817 |
class PithosBackendPool(ObjectPool): |
|
818 |
def _pool_create(self): |
|
819 |
backend = _get_backend() |
|
820 |
backend._real_close = backend.close |
|
821 |
backend.close = instancemethod(_pooled_backend_close, backend, |
|
822 |
type(backend)) |
|
823 |
backend._pool = self |
|
824 |
backend._use_count = USAGE_LIMIT |
|
825 |
return backend |
|
826 |
|
|
827 |
def _pool_verify(self, backend): |
|
828 |
wrapper = backend.wrapper |
|
829 |
conn = wrapper.conn |
|
830 |
if conn.closed: |
|
831 |
return False |
|
832 |
|
|
833 |
if conn.in_transaction(): |
|
834 |
conn.close() |
|
835 |
return False |
|
836 | 795 |
|
837 |
try: |
|
838 |
fd = conn.connection.connection.fileno() |
|
839 |
r, w, x = select([fd], (), (), 0) |
|
840 |
if r: |
|
841 |
conn.close() |
|
842 |
return False |
|
843 |
except: |
|
844 |
print_exc() |
|
845 |
return False |
|
846 |
|
|
847 |
return True |
|
848 |
|
|
849 |
def _pool_cleanup(self, backend): |
|
850 |
c = backend._use_count - 1 |
|
851 |
if c < 0: |
|
852 |
backend._real_close() |
|
853 |
return True |
|
854 |
|
|
855 |
backend._use_count = c |
|
856 |
wrapper = backend.wrapper |
|
857 |
if wrapper.trans is not None: |
|
858 |
conn = wrapper.conn |
|
859 |
if conn.closed: |
|
860 |
wrapper.trans = None |
|
861 |
else: |
|
862 |
wrapper.rollback() |
|
863 |
if backend.messages: |
|
864 |
backend.messages = [] |
|
865 |
return False |
|
866 |
|
|
867 |
_pithos_backend_pool = PithosBackendPool(size=POOL_SIZE) |
|
796 |
_pithos_backend_pool = PithosBackendPool(size=POOL_SIZE, |
|
797 |
db_module=BACKEND_DB_MODULE, |
|
798 |
db_connection=BACKEND_DB_CONNECTION, |
|
799 |
block_module=BACKEND_BLOCK_MODULE, |
|
800 |
block_path=BACKEND_BLOCK_PATH, |
|
801 |
block_umask=BACKEND_BLOCK_UMASK, |
|
802 |
queue_module=BACKEND_QUEUE_MODULE, |
|
803 |
queue_connection=BACKEND_QUEUE_CONNECTION) |
|
868 | 804 |
|
869 | 805 |
|
870 | 806 |
def get_backend(): |
871 |
return _pithos_backend_pool.pool_get() |
|
807 |
backend = _pithos_backend_pool.pool_get() |
|
808 |
backend.default_policy['quota'] = BACKEND_QUOTA |
|
809 |
backend.default_policy['versioning'] = BACKEND_VERSIONING |
|
810 |
return backend |
|
872 | 811 |
|
873 | 812 |
|
874 | 813 |
def update_request_headers(request): |
Also available in: Unified diff