Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-backend / pithos / backends / util.py @ 1a736ca8

History | View | Annotate | Download (5.2 kB)

1 edb7875c Christos Stavrakakis
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 edb7875c Christos Stavrakakis
#
3 edb7875c Christos Stavrakakis
# Redistribution and use in source and binary forms, with or
4 edb7875c Christos Stavrakakis
# without modification, are permitted provided that the following
5 edb7875c Christos Stavrakakis
# conditions are met:
6 edb7875c Christos Stavrakakis
#
7 edb7875c Christos Stavrakakis
#   1. Redistributions of source code must retain the above
8 edb7875c Christos Stavrakakis
#      copyright notice, this list of conditions and the following
9 edb7875c Christos Stavrakakis
#      disclaimer.
10 edb7875c Christos Stavrakakis
#
11 edb7875c Christos Stavrakakis
#   2. Redistributions in binary form must reproduce the above
12 edb7875c Christos Stavrakakis
#      copyright notice, this list of conditions and the following
13 edb7875c Christos Stavrakakis
#      disclaimer in the documentation and/or other materials
14 edb7875c Christos Stavrakakis
#      provided with the distribution.
15 edb7875c Christos Stavrakakis
#
16 edb7875c Christos Stavrakakis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 edb7875c Christos Stavrakakis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 edb7875c Christos Stavrakakis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 edb7875c Christos Stavrakakis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 edb7875c Christos Stavrakakis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 edb7875c Christos Stavrakakis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 edb7875c Christos Stavrakakis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 edb7875c Christos Stavrakakis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 edb7875c Christos Stavrakakis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 edb7875c Christos Stavrakakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 edb7875c Christos Stavrakakis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 edb7875c Christos Stavrakakis
# POSSIBILITY OF SUCH DAMAGE.
28 edb7875c Christos Stavrakakis
#
29 edb7875c Christos Stavrakakis
# The views and conclusions contained in the software and
30 edb7875c Christos Stavrakakis
# documentation are those of the authors and should not be
31 edb7875c Christos Stavrakakis
# interpreted as representing official policies, either expressed
32 edb7875c Christos Stavrakakis
# or implied, of GRNET S.A.
33 edb7875c Christos Stavrakakis
34 1a736ca8 Christos Stavrakakis
from objpool import ObjectPool
35 edb7875c Christos Stavrakakis
from new import instancemethod
36 edb7875c Christos Stavrakakis
from select import select
37 edb7875c Christos Stavrakakis
from traceback import print_exc
38 edb7875c Christos Stavrakakis
from pithos.backends import connect_backend
39 edb7875c Christos Stavrakakis
40 edb7875c Christos Stavrakakis
USAGE_LIMIT = 500
41 edb7875c Christos Stavrakakis
42 edb7875c Christos Stavrakakis
43 edb7875c Christos Stavrakakis
class PithosBackendPool(ObjectPool):
44 edb7875c Christos Stavrakakis
    def __init__(self, size=None, db_module=None, db_connection=None,
45 edb7875c Christos Stavrakakis
                 block_module=None, block_path=None, block_umask=None,
46 b1dadd0e Sofia Papagiannaki
                 queue_module=None, queue_hosts=None,
47 7f1f0464 Georgios D. Tsoukalas
                 queue_exchange=None, free_versioning=True,
48 1f3f907f Sofia Papagiannaki
                 quotaholder_enabled=True,
49 3173699c Sofia Papagiannaki
                 quotaholder_url=None, quotaholder_token=None,
50 b336e6fa Georgios D. Tsoukalas
                 quotaholder_client_poolsize=None,
51 56f3c759 Sofia Papagiannaki
                 block_params=None,
52 4a105ce2 Sofia Papagiannaki
                 public_url_security=None,
53 56f3c759 Sofia Papagiannaki
                 public_url_alphabet=None):
54 edb7875c Christos Stavrakakis
        super(PithosBackendPool, self).__init__(size=size)
55 edb7875c Christos Stavrakakis
        self.db_module = db_module
56 edb7875c Christos Stavrakakis
        self.db_connection = db_connection
57 edb7875c Christos Stavrakakis
        self.block_module = block_module
58 edb7875c Christos Stavrakakis
        self.block_path = block_path
59 edb7875c Christos Stavrakakis
        self.block_umask = block_umask
60 edb7875c Christos Stavrakakis
        self.queue_module = queue_module
61 47462eda Filippos Giannakos
        self.block_params = block_params
62 b1dadd0e Sofia Papagiannaki
        self.queue_hosts = queue_hosts
63 b1dadd0e Sofia Papagiannaki
        self.queue_exchange = queue_exchange
64 1f3f907f Sofia Papagiannaki
        self.quotaholder_enabled = quotaholder_enabled
65 3173699c Sofia Papagiannaki
        self.quotaholder_url = quotaholder_url
66 3173699c Sofia Papagiannaki
        self.quotaholder_token = quotaholder_token
67 b336e6fa Georgios D. Tsoukalas
        self.quotaholder_client_poolsize = quotaholder_client_poolsize
68 b1dadd0e Sofia Papagiannaki
        self.free_versioning = free_versioning
69 4a105ce2 Sofia Papagiannaki
        self.public_url_security=public_url_security
70 56f3c759 Sofia Papagiannaki
        self.public_url_alphabet=public_url_alphabet
71 edb7875c Christos Stavrakakis
72 edb7875c Christos Stavrakakis
    def _pool_create(self):
73 b336e6fa Georgios D. Tsoukalas
        backend = connect_backend(
74 b336e6fa Georgios D. Tsoukalas
                db_module=self.db_module,
75 b336e6fa Georgios D. Tsoukalas
                db_connection=self.db_connection,
76 b336e6fa Georgios D. Tsoukalas
                block_module=self.block_module,
77 b336e6fa Georgios D. Tsoukalas
                block_path=self.block_path,
78 b336e6fa Georgios D. Tsoukalas
                block_umask=self.block_umask,
79 b336e6fa Georgios D. Tsoukalas
                queue_module=self.queue_module,
80 b336e6fa Georgios D. Tsoukalas
                block_params=self.block_params,
81 b336e6fa Georgios D. Tsoukalas
                queue_hosts=self.queue_hosts,
82 b336e6fa Georgios D. Tsoukalas
                queue_exchange=self.queue_exchange,
83 b336e6fa Georgios D. Tsoukalas
                quotaholder_enabled=self.quotaholder_enabled,
84 b336e6fa Georgios D. Tsoukalas
                quotaholder_url=self.quotaholder_url,
85 b336e6fa Georgios D. Tsoukalas
                quotaholder_token=self.quotaholder_token,
86 b336e6fa Georgios D. Tsoukalas
                quotaholder_client_poolsize=self.quotaholder_client_poolsize,
87 56f3c759 Sofia Papagiannaki
                free_versioning=self.free_versioning,
88 4a105ce2 Sofia Papagiannaki
                public_url_security=self.public_url_security,
89 56f3c759 Sofia Papagiannaki
                public_url_alphabet=self.public_url_alphabet)
90 edb7875c Christos Stavrakakis
91 edb7875c Christos Stavrakakis
        backend._real_close = backend.close
92 edb7875c Christos Stavrakakis
        backend.close = instancemethod(_pooled_backend_close, backend,
93 edb7875c Christos Stavrakakis
                                       type(backend))
94 edb7875c Christos Stavrakakis
        backend._pool = self
95 edb7875c Christos Stavrakakis
        backend._use_count = USAGE_LIMIT
96 b0b87c56 Stratos Psomadakis
        backend.messages = []
97 edb7875c Christos Stavrakakis
        return backend
98 edb7875c Christos Stavrakakis
99 edb7875c Christos Stavrakakis
    def _pool_verify(self, backend):
100 edb7875c Christos Stavrakakis
        wrapper = backend.wrapper
101 edb7875c Christos Stavrakakis
        conn = wrapper.conn
102 edb7875c Christos Stavrakakis
        if conn.closed:
103 edb7875c Christos Stavrakakis
            return False
104 edb7875c Christos Stavrakakis
105 edb7875c Christos Stavrakakis
        if conn.in_transaction():
106 edb7875c Christos Stavrakakis
            conn.close()
107 edb7875c Christos Stavrakakis
            return False
108 edb7875c Christos Stavrakakis
109 edb7875c Christos Stavrakakis
        try:
110 edb7875c Christos Stavrakakis
            fd = conn.connection.connection.fileno()
111 edb7875c Christos Stavrakakis
            r, w, x = select([fd], (), (), 0)
112 edb7875c Christos Stavrakakis
            if r:
113 edb7875c Christos Stavrakakis
                conn.close()
114 edb7875c Christos Stavrakakis
                return False
115 edb7875c Christos Stavrakakis
        except:
116 edb7875c Christos Stavrakakis
            print_exc()
117 edb7875c Christos Stavrakakis
            return False
118 edb7875c Christos Stavrakakis
119 edb7875c Christos Stavrakakis
        return True
120 edb7875c Christos Stavrakakis
121 edb7875c Christos Stavrakakis
    def _pool_cleanup(self, backend):
122 edb7875c Christos Stavrakakis
        c = backend._use_count - 1
123 edb7875c Christos Stavrakakis
        if c < 0:
124 edb7875c Christos Stavrakakis
            backend._real_close()
125 edb7875c Christos Stavrakakis
            return True
126 edb7875c Christos Stavrakakis
127 edb7875c Christos Stavrakakis
        backend._use_count = c
128 edb7875c Christos Stavrakakis
        wrapper = backend.wrapper
129 edb7875c Christos Stavrakakis
        if wrapper.trans is not None:
130 edb7875c Christos Stavrakakis
            conn = wrapper.conn
131 edb7875c Christos Stavrakakis
            if conn.closed:
132 edb7875c Christos Stavrakakis
                wrapper.trans = None
133 edb7875c Christos Stavrakakis
            else:
134 edb7875c Christos Stavrakakis
                wrapper.rollback()
135 b0b87c56 Stratos Psomadakis
        backend.messages = []
136 edb7875c Christos Stavrakakis
        return False
137 edb7875c Christos Stavrakakis
138 edb7875c Christos Stavrakakis
139 edb7875c Christos Stavrakakis
def _pooled_backend_close(backend):
140 edb7875c Christos Stavrakakis
    backend._pool.pool_put(backend)