Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-backend / pithos / backends / util.py @ cf53943b

History | View | Annotate | Download (5.8 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 19ddd41b Sofia Papagiannaki
                 public_url_alphabet=None,
54 19ddd41b Sofia Papagiannaki
                 account_quota_policy=None,
55 19ddd41b Sofia Papagiannaki
                 container_quota_policy=None,
56 19ddd41b Sofia Papagiannaki
                 container_versioning_policy=None
57 19ddd41b Sofia Papagiannaki
        ):
58 edb7875c Christos Stavrakakis
        super(PithosBackendPool, self).__init__(size=size)
59 edb7875c Christos Stavrakakis
        self.db_module = db_module
60 edb7875c Christos Stavrakakis
        self.db_connection = db_connection
61 edb7875c Christos Stavrakakis
        self.block_module = block_module
62 edb7875c Christos Stavrakakis
        self.block_path = block_path
63 edb7875c Christos Stavrakakis
        self.block_umask = block_umask
64 edb7875c Christos Stavrakakis
        self.queue_module = queue_module
65 47462eda Filippos Giannakos
        self.block_params = block_params
66 b1dadd0e Sofia Papagiannaki
        self.queue_hosts = queue_hosts
67 b1dadd0e Sofia Papagiannaki
        self.queue_exchange = queue_exchange
68 1f3f907f Sofia Papagiannaki
        self.quotaholder_enabled = quotaholder_enabled
69 3173699c Sofia Papagiannaki
        self.quotaholder_url = quotaholder_url
70 3173699c Sofia Papagiannaki
        self.quotaholder_token = quotaholder_token
71 b336e6fa Georgios D. Tsoukalas
        self.quotaholder_client_poolsize = quotaholder_client_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 b336e6fa Georgios D. Tsoukalas
                db_module=self.db_module,
82 b336e6fa Georgios D. Tsoukalas
                db_connection=self.db_connection,
83 b336e6fa Georgios D. Tsoukalas
                block_module=self.block_module,
84 b336e6fa Georgios D. Tsoukalas
                block_path=self.block_path,
85 b336e6fa Georgios D. Tsoukalas
                block_umask=self.block_umask,
86 b336e6fa Georgios D. Tsoukalas
                queue_module=self.queue_module,
87 b336e6fa Georgios D. Tsoukalas
                block_params=self.block_params,
88 b336e6fa Georgios D. Tsoukalas
                queue_hosts=self.queue_hosts,
89 b336e6fa Georgios D. Tsoukalas
                queue_exchange=self.queue_exchange,
90 b336e6fa Georgios D. Tsoukalas
                quotaholder_enabled=self.quotaholder_enabled,
91 b336e6fa Georgios D. Tsoukalas
                quotaholder_url=self.quotaholder_url,
92 b336e6fa Georgios D. Tsoukalas
                quotaholder_token=self.quotaholder_token,
93 b336e6fa Georgios D. Tsoukalas
                quotaholder_client_poolsize=self.quotaholder_client_poolsize,
94 56f3c759 Sofia Papagiannaki
                free_versioning=self.free_versioning,
95 4a105ce2 Sofia Papagiannaki
                public_url_security=self.public_url_security,
96 19ddd41b Sofia Papagiannaki
                public_url_alphabet=self.public_url_alphabet,
97 19ddd41b Sofia Papagiannaki
                account_quota_policy=self.account_quota_policy,
98 19ddd41b Sofia Papagiannaki
                container_quota_policy=self.container_quota_policy,
99 19ddd41b Sofia Papagiannaki
                container_versioning_policy=self.container_versioning_policy)
100 edb7875c Christos Stavrakakis
101 edb7875c Christos Stavrakakis
        backend._real_close = backend.close
102 edb7875c Christos Stavrakakis
        backend.close = instancemethod(_pooled_backend_close, backend,
103 edb7875c Christos Stavrakakis
                                       type(backend))
104 edb7875c Christos Stavrakakis
        backend._pool = self
105 edb7875c Christos Stavrakakis
        backend._use_count = USAGE_LIMIT
106 b0b87c56 Stratos Psomadakis
        backend.messages = []
107 edb7875c Christos Stavrakakis
        return backend
108 edb7875c Christos Stavrakakis
109 edb7875c Christos Stavrakakis
    def _pool_verify(self, backend):
110 edb7875c Christos Stavrakakis
        wrapper = backend.wrapper
111 edb7875c Christos Stavrakakis
        conn = wrapper.conn
112 edb7875c Christos Stavrakakis
        if conn.closed:
113 edb7875c Christos Stavrakakis
            return False
114 edb7875c Christos Stavrakakis
115 edb7875c Christos Stavrakakis
        if conn.in_transaction():
116 edb7875c Christos Stavrakakis
            conn.close()
117 edb7875c Christos Stavrakakis
            return False
118 edb7875c Christos Stavrakakis
119 edb7875c Christos Stavrakakis
        try:
120 edb7875c Christos Stavrakakis
            fd = conn.connection.connection.fileno()
121 edb7875c Christos Stavrakakis
            r, w, x = select([fd], (), (), 0)
122 edb7875c Christos Stavrakakis
            if r:
123 edb7875c Christos Stavrakakis
                conn.close()
124 edb7875c Christos Stavrakakis
                return False
125 edb7875c Christos Stavrakakis
        except:
126 edb7875c Christos Stavrakakis
            print_exc()
127 edb7875c Christos Stavrakakis
            return False
128 edb7875c Christos Stavrakakis
129 edb7875c Christos Stavrakakis
        return True
130 edb7875c Christos Stavrakakis
131 edb7875c Christos Stavrakakis
    def _pool_cleanup(self, backend):
132 edb7875c Christos Stavrakakis
        c = backend._use_count - 1
133 edb7875c Christos Stavrakakis
        if c < 0:
134 edb7875c Christos Stavrakakis
            backend._real_close()
135 edb7875c Christos Stavrakakis
            return True
136 edb7875c Christos Stavrakakis
137 edb7875c Christos Stavrakakis
        backend._use_count = c
138 edb7875c Christos Stavrakakis
        wrapper = backend.wrapper
139 edb7875c Christos Stavrakakis
        if wrapper.trans is not None:
140 edb7875c Christos Stavrakakis
            conn = wrapper.conn
141 edb7875c Christos Stavrakakis
            if conn.closed:
142 edb7875c Christos Stavrakakis
                wrapper.trans = None
143 edb7875c Christos Stavrakakis
            else:
144 edb7875c Christos Stavrakakis
                wrapper.rollback()
145 b0b87c56 Stratos Psomadakis
        backend.messages = []
146 edb7875c Christos Stavrakakis
        return False
147 edb7875c Christos Stavrakakis
148 edb7875c Christos Stavrakakis
149 edb7875c Christos Stavrakakis
def _pooled_backend_close(backend):
150 edb7875c Christos Stavrakakis
    backend._pool.pool_put(backend)