Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-backend / pithos / backends / util.py @ 809b482a

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