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