Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-backend / pithos / backends / util.py @ 329b8349

History | View | Annotate | Download (6.5 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 369a7b41 Sofia Papagiannaki
                 block_size=None, hash_algorithm=None,
47 b1dadd0e Sofia Papagiannaki
                 queue_module=None, queue_hosts=None,
48 7f1f0464 Georgios D. Tsoukalas
                 queue_exchange=None, free_versioning=True,
49 f759041f Ilias Tsitsimpis
                 astakos_auth_url=None, service_token=None,
50 16f2673e Sofia Papagiannaki
                 astakosclient_poolsize=None,
51 56f3c759 Sofia Papagiannaki
                 block_params=None,
52 4a105ce2 Sofia Papagiannaki
                 public_url_security=None,
53 19ddd41b Sofia Papagiannaki
                 public_url_alphabet=None,
54 19ddd41b Sofia Papagiannaki
                 account_quota_policy=None,
55 19ddd41b Sofia Papagiannaki
                 container_quota_policy=None,
56 876d7486 Sofia Papagiannaki
                 container_versioning_policy=None,
57 876d7486 Sofia Papagiannaki
                 archipelago_conf_file=None,
58 876d7486 Sofia Papagiannaki
                 xseg_pool_size=8,
59 876d7486 Sofia Papagiannaki
                 map_check_interval=None):
60 edb7875c Christos Stavrakakis
        super(PithosBackendPool, self).__init__(size=size)
61 edb7875c Christos Stavrakakis
        self.db_module = db_module
62 edb7875c Christos Stavrakakis
        self.db_connection = db_connection
63 edb7875c Christos Stavrakakis
        self.block_module = block_module
64 edb7875c Christos Stavrakakis
        self.block_path = block_path
65 edb7875c Christos Stavrakakis
        self.block_umask = block_umask
66 369a7b41 Sofia Papagiannaki
        self.block_size = block_size
67 369a7b41 Sofia Papagiannaki
        self.hash_algorithm = hash_algorithm
68 edb7875c Christos Stavrakakis
        self.queue_module = queue_module
69 47462eda Filippos Giannakos
        self.block_params = block_params
70 b1dadd0e Sofia Papagiannaki
        self.queue_hosts = queue_hosts
71 b1dadd0e Sofia Papagiannaki
        self.queue_exchange = queue_exchange
72 f759041f Ilias Tsitsimpis
        self.astakos_auth_url = astakos_auth_url
73 16f2673e Sofia Papagiannaki
        self.service_token = service_token
74 16f2673e Sofia Papagiannaki
        self.astakosclient_poolsize = astakosclient_poolsize
75 b1dadd0e Sofia Papagiannaki
        self.free_versioning = free_versioning
76 19ddd41b Sofia Papagiannaki
        self.public_url_security = public_url_security
77 19ddd41b Sofia Papagiannaki
        self.public_url_alphabet = public_url_alphabet
78 19ddd41b Sofia Papagiannaki
        self.account_quota_policy = account_quota_policy
79 19ddd41b Sofia Papagiannaki
        self.container_quota_policy = container_quota_policy
80 19ddd41b Sofia Papagiannaki
        self.container_versioning_policy = container_versioning_policy
81 876d7486 Sofia Papagiannaki
        self.archipelago_conf_file = archipelago_conf_file
82 876d7486 Sofia Papagiannaki
        self.xseg_pool_size = xseg_pool_size
83 876d7486 Sofia Papagiannaki
        self.map_check_interval = map_check_interval
84 edb7875c Christos Stavrakakis
85 edb7875c Christos Stavrakakis
    def _pool_create(self):
86 b336e6fa Georgios D. Tsoukalas
        backend = connect_backend(
87 36cae9f4 Georgios D. Tsoukalas
            db_module=self.db_module,
88 36cae9f4 Georgios D. Tsoukalas
            db_connection=self.db_connection,
89 36cae9f4 Georgios D. Tsoukalas
            block_module=self.block_module,
90 36cae9f4 Georgios D. Tsoukalas
            block_path=self.block_path,
91 36cae9f4 Georgios D. Tsoukalas
            block_umask=self.block_umask,
92 36cae9f4 Georgios D. Tsoukalas
            block_size=self.block_size,
93 36cae9f4 Georgios D. Tsoukalas
            hash_algorithm=self.hash_algorithm,
94 36cae9f4 Georgios D. Tsoukalas
            queue_module=self.queue_module,
95 36cae9f4 Georgios D. Tsoukalas
            block_params=self.block_params,
96 36cae9f4 Georgios D. Tsoukalas
            queue_hosts=self.queue_hosts,
97 36cae9f4 Georgios D. Tsoukalas
            queue_exchange=self.queue_exchange,
98 f759041f Ilias Tsitsimpis
            astakos_auth_url=self.astakos_auth_url,
99 36cae9f4 Georgios D. Tsoukalas
            service_token=self.service_token,
100 36cae9f4 Georgios D. Tsoukalas
            astakosclient_poolsize=self.astakosclient_poolsize,
101 36cae9f4 Georgios D. Tsoukalas
            free_versioning=self.free_versioning,
102 36cae9f4 Georgios D. Tsoukalas
            public_url_security=self.public_url_security,
103 36cae9f4 Georgios D. Tsoukalas
            public_url_alphabet=self.public_url_alphabet,
104 36cae9f4 Georgios D. Tsoukalas
            account_quota_policy=self.account_quota_policy,
105 36cae9f4 Georgios D. Tsoukalas
            container_quota_policy=self.container_quota_policy,
106 876d7486 Sofia Papagiannaki
            container_versioning_policy=self.container_versioning_policy,
107 876d7486 Sofia Papagiannaki
            archipelago_conf_file=self.archipelago_conf_file,
108 876d7486 Sofia Papagiannaki
            xseg_pool_size=self.xseg_pool_size,
109 876d7486 Sofia Papagiannaki
            map_check_interval=self.map_check_interval)
110 edb7875c Christos Stavrakakis
111 edb7875c Christos Stavrakakis
        backend._real_close = backend.close
112 edb7875c Christos Stavrakakis
        backend.close = instancemethod(_pooled_backend_close, backend,
113 edb7875c Christos Stavrakakis
                                       type(backend))
114 edb7875c Christos Stavrakakis
        backend._pool = self
115 edb7875c Christos Stavrakakis
        backend._use_count = USAGE_LIMIT
116 b0b87c56 Stratos Psomadakis
        backend.messages = []
117 edb7875c Christos Stavrakakis
        return backend
118 edb7875c Christos Stavrakakis
119 edb7875c Christos Stavrakakis
    def _pool_verify(self, backend):
120 edb7875c Christos Stavrakakis
        wrapper = backend.wrapper
121 edb7875c Christos Stavrakakis
        conn = wrapper.conn
122 edb7875c Christos Stavrakakis
        if conn.closed:
123 edb7875c Christos Stavrakakis
            return False
124 edb7875c Christos Stavrakakis
125 edb7875c Christos Stavrakakis
        if conn.in_transaction():
126 edb7875c Christos Stavrakakis
            conn.close()
127 edb7875c Christos Stavrakakis
            return False
128 edb7875c Christos Stavrakakis
129 edb7875c Christos Stavrakakis
        try:
130 edb7875c Christos Stavrakakis
            fd = conn.connection.connection.fileno()
131 aa00e32c Georgios D. Tsoukalas
        except AttributeError:
132 aa00e32c Georgios D. Tsoukalas
            # probably sqlite, assume success
133 aa00e32c Georgios D. Tsoukalas
            pass
134 aa00e32c Georgios D. Tsoukalas
        else:
135 aa00e32c Georgios D. Tsoukalas
            try:
136 aa00e32c Georgios D. Tsoukalas
                r, w, x = select([fd], (), (), 0)
137 aa00e32c Georgios D. Tsoukalas
                if r:
138 aa00e32c Georgios D. Tsoukalas
                    conn.close()
139 aa00e32c Georgios D. Tsoukalas
                    return False
140 aa00e32c Georgios D. Tsoukalas
            except:
141 aa00e32c Georgios D. Tsoukalas
                print_exc()
142 edb7875c Christos Stavrakakis
                return False
143 edb7875c Christos Stavrakakis
144 edb7875c Christos Stavrakakis
        return True
145 edb7875c Christos Stavrakakis
146 edb7875c Christos Stavrakakis
    def _pool_cleanup(self, backend):
147 edb7875c Christos Stavrakakis
        c = backend._use_count - 1
148 edb7875c Christos Stavrakakis
        if c < 0:
149 edb7875c Christos Stavrakakis
            backend._real_close()
150 edb7875c Christos Stavrakakis
            return True
151 edb7875c Christos Stavrakakis
152 edb7875c Christos Stavrakakis
        backend._use_count = c
153 edb7875c Christos Stavrakakis
        wrapper = backend.wrapper
154 edb7875c Christos Stavrakakis
        if wrapper.trans is not None:
155 edb7875c Christos Stavrakakis
            conn = wrapper.conn
156 edb7875c Christos Stavrakakis
            if conn.closed:
157 edb7875c Christos Stavrakakis
                wrapper.trans = None
158 edb7875c Christos Stavrakakis
            else:
159 edb7875c Christos Stavrakakis
                wrapper.rollback()
160 b0b87c56 Stratos Psomadakis
        backend.messages = []
161 edb7875c Christos Stavrakakis
        return False
162 edb7875c Christos Stavrakakis
163 de8fb87d Sofia Papagiannaki
    def shutdown(self):
164 de8fb87d Sofia Papagiannaki
        while True:
165 de8fb87d Sofia Papagiannaki
            backend = self.pool_get(create=False)
166 de8fb87d Sofia Papagiannaki
            if backend is None:
167 de8fb87d Sofia Papagiannaki
                break
168 de8fb87d Sofia Papagiannaki
            self.pool_put(None)
169 de8fb87d Sofia Papagiannaki
            backend._real_close()
170 de8fb87d Sofia Papagiannaki
171 edb7875c Christos Stavrakakis
172 edb7875c Christos Stavrakakis
def _pooled_backend_close(backend):
173 edb7875c Christos Stavrakakis
    backend._pool.pool_put(backend)