Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (5.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 b1dadd0e Sofia Papagiannaki
                 queue_module=None, queue_hosts=None,
47 7f1f0464 Georgios D. Tsoukalas
                 queue_exchange=None, free_versioning=True,
48 16f2673e Sofia Papagiannaki
                 astakos_url=None, service_token=None,
49 16f2673e Sofia Papagiannaki
                 astakosclient_poolsize=None,
50 56f3c759 Sofia Papagiannaki
                 block_params=None,
51 4a105ce2 Sofia Papagiannaki
                 public_url_security=None,
52 19ddd41b Sofia Papagiannaki
                 public_url_alphabet=None,
53 19ddd41b Sofia Papagiannaki
                 account_quota_policy=None,
54 19ddd41b Sofia Papagiannaki
                 container_quota_policy=None,
55 19ddd41b Sofia Papagiannaki
                 container_versioning_policy=None
56 19ddd41b Sofia Papagiannaki
        ):
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 edb7875c Christos Stavrakakis
        self.queue_module = queue_module
64 47462eda Filippos Giannakos
        self.block_params = block_params
65 b1dadd0e Sofia Papagiannaki
        self.queue_hosts = queue_hosts
66 b1dadd0e Sofia Papagiannaki
        self.queue_exchange = queue_exchange
67 16f2673e Sofia Papagiannaki
        self.astakos_url = astakos_url
68 16f2673e Sofia Papagiannaki
        self.service_token = service_token
69 16f2673e Sofia Papagiannaki
        self.astakosclient_poolsize = astakosclient_poolsize
70 b1dadd0e Sofia Papagiannaki
        self.free_versioning = free_versioning
71 19ddd41b Sofia Papagiannaki
        self.public_url_security = public_url_security
72 19ddd41b Sofia Papagiannaki
        self.public_url_alphabet = public_url_alphabet
73 19ddd41b Sofia Papagiannaki
        self.account_quota_policy = account_quota_policy
74 19ddd41b Sofia Papagiannaki
        self.container_quota_policy = container_quota_policy
75 19ddd41b Sofia Papagiannaki
        self.container_versioning_policy = container_versioning_policy
76 edb7875c Christos Stavrakakis
77 edb7875c Christos Stavrakakis
    def _pool_create(self):
78 b336e6fa Georgios D. Tsoukalas
        backend = connect_backend(
79 b336e6fa Georgios D. Tsoukalas
                db_module=self.db_module,
80 b336e6fa Georgios D. Tsoukalas
                db_connection=self.db_connection,
81 b336e6fa Georgios D. Tsoukalas
                block_module=self.block_module,
82 b336e6fa Georgios D. Tsoukalas
                block_path=self.block_path,
83 b336e6fa Georgios D. Tsoukalas
                block_umask=self.block_umask,
84 b336e6fa Georgios D. Tsoukalas
                queue_module=self.queue_module,
85 b336e6fa Georgios D. Tsoukalas
                block_params=self.block_params,
86 b336e6fa Georgios D. Tsoukalas
                queue_hosts=self.queue_hosts,
87 b336e6fa Georgios D. Tsoukalas
                queue_exchange=self.queue_exchange,
88 16f2673e Sofia Papagiannaki
                astakos_url=self.astakos_url,
89 16f2673e Sofia Papagiannaki
                service_token=self.service_token,
90 16f2673e Sofia Papagiannaki
                astakosclient_poolsize=self.astakosclient_poolsize,
91 56f3c759 Sofia Papagiannaki
                free_versioning=self.free_versioning,
92 4a105ce2 Sofia Papagiannaki
                public_url_security=self.public_url_security,
93 19ddd41b Sofia Papagiannaki
                public_url_alphabet=self.public_url_alphabet,
94 19ddd41b Sofia Papagiannaki
                account_quota_policy=self.account_quota_policy,
95 19ddd41b Sofia Papagiannaki
                container_quota_policy=self.container_quota_policy,
96 19ddd41b Sofia Papagiannaki
                container_versioning_policy=self.container_versioning_policy)
97 edb7875c Christos Stavrakakis
98 edb7875c Christos Stavrakakis
        backend._real_close = backend.close
99 edb7875c Christos Stavrakakis
        backend.close = instancemethod(_pooled_backend_close, backend,
100 edb7875c Christos Stavrakakis
                                       type(backend))
101 edb7875c Christos Stavrakakis
        backend._pool = self
102 edb7875c Christos Stavrakakis
        backend._use_count = USAGE_LIMIT
103 b0b87c56 Stratos Psomadakis
        backend.messages = []
104 edb7875c Christos Stavrakakis
        return backend
105 edb7875c Christos Stavrakakis
106 edb7875c Christos Stavrakakis
    def _pool_verify(self, backend):
107 edb7875c Christos Stavrakakis
        wrapper = backend.wrapper
108 edb7875c Christos Stavrakakis
        conn = wrapper.conn
109 edb7875c Christos Stavrakakis
        if conn.closed:
110 edb7875c Christos Stavrakakis
            return False
111 edb7875c Christos Stavrakakis
112 edb7875c Christos Stavrakakis
        if conn.in_transaction():
113 edb7875c Christos Stavrakakis
            conn.close()
114 edb7875c Christos Stavrakakis
            return False
115 edb7875c Christos Stavrakakis
116 edb7875c Christos Stavrakakis
        try:
117 edb7875c Christos Stavrakakis
            fd = conn.connection.connection.fileno()
118 edb7875c Christos Stavrakakis
            r, w, x = select([fd], (), (), 0)
119 edb7875c Christos Stavrakakis
            if r:
120 edb7875c Christos Stavrakakis
                conn.close()
121 edb7875c Christos Stavrakakis
                return False
122 edb7875c Christos Stavrakakis
        except:
123 edb7875c Christos Stavrakakis
            print_exc()
124 edb7875c Christos Stavrakakis
            return False
125 edb7875c Christos Stavrakakis
126 edb7875c Christos Stavrakakis
        return True
127 edb7875c Christos Stavrakakis
128 edb7875c Christos Stavrakakis
    def _pool_cleanup(self, backend):
129 edb7875c Christos Stavrakakis
        c = backend._use_count - 1
130 edb7875c Christos Stavrakakis
        if c < 0:
131 edb7875c Christos Stavrakakis
            backend._real_close()
132 edb7875c Christos Stavrakakis
            return True
133 edb7875c Christos Stavrakakis
134 edb7875c Christos Stavrakakis
        backend._use_count = c
135 edb7875c Christos Stavrakakis
        wrapper = backend.wrapper
136 edb7875c Christos Stavrakakis
        if wrapper.trans is not None:
137 edb7875c Christos Stavrakakis
            conn = wrapper.conn
138 edb7875c Christos Stavrakakis
            if conn.closed:
139 edb7875c Christos Stavrakakis
                wrapper.trans = None
140 edb7875c Christos Stavrakakis
            else:
141 edb7875c Christos Stavrakakis
                wrapper.rollback()
142 b0b87c56 Stratos Psomadakis
        backend.messages = []
143 edb7875c Christos Stavrakakis
        return False
144 edb7875c Christos Stavrakakis
145 edb7875c Christos Stavrakakis
146 edb7875c Christos Stavrakakis
def _pooled_backend_close(backend):
147 edb7875c Christos Stavrakakis
    backend._pool.pool_put(backend)