Revision d50ed8d4 snf-pithos-backend/pithos/backends/lib/hashfiler/store.py
b/snf-pithos-backend/pithos/backends/lib/hashfiler/store.py | ||
---|---|---|
1 | 1 |
# Copyright 2011-2012 GRNET S.A. All rights reserved. |
2 |
#
|
|
2 |
# |
|
3 | 3 |
# Redistribution and use in source and binary forms, with or |
4 | 4 |
# without modification, are permitted provided that the following |
5 | 5 |
# conditions are met: |
6 |
#
|
|
6 |
# |
|
7 | 7 |
# 1. Redistributions of source code must retain the above |
8 | 8 |
# copyright notice, this list of conditions and the following |
9 | 9 |
# disclaimer. |
10 |
#
|
|
10 |
# |
|
11 | 11 |
# 2. Redistributions in binary form must reproduce the above |
12 | 12 |
# copyright notice, this list of conditions and the following |
13 | 13 |
# disclaimer in the documentation and/or other materials |
14 | 14 |
# provided with the distribution. |
15 |
#
|
|
15 |
# |
|
16 | 16 |
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS |
17 | 17 |
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | 18 |
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
... | ... | |
25 | 25 |
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
26 | 26 |
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
27 | 27 |
# POSSIBILITY OF SUCH DAMAGE. |
28 |
#
|
|
28 |
# |
|
29 | 29 |
# The views and conclusions contained in the software and |
30 | 30 |
# documentation are those of the authors and should not be |
31 | 31 |
# interpreted as representing official policies, either expressed |
... | ... | |
36 | 36 |
from blocker import Blocker |
37 | 37 |
from mapper import Mapper |
38 | 38 |
|
39 |
|
|
39 | 40 |
class Store(object): |
40 | 41 |
"""Store. |
41 | 42 |
Required constructor parameters: path, block_size, hash_algorithm, umask. |
42 | 43 |
""" |
43 |
|
|
44 |
|
|
44 | 45 |
def __init__(self, **params): |
45 | 46 |
umask = params['umask'] |
46 | 47 |
if umask is not None: |
47 | 48 |
os.umask(umask) |
48 |
|
|
49 |
|
|
49 | 50 |
path = params['path'] |
50 | 51 |
if path and not os.path.exists(path): |
51 | 52 |
os.makedirs(path) |
52 | 53 |
if not os.path.isdir(path): |
53 | 54 |
raise RuntimeError("Cannot open path '%s'" % (path,)) |
54 |
|
|
55 |
|
|
55 | 56 |
p = {'blocksize': params['block_size'], |
56 | 57 |
'blockpath': os.path.join(path + '/blocks'), |
57 | 58 |
'hashtype': params['hash_algorithm']} |
... | ... | |
59 | 60 |
p = {'mappath': os.path.join(path + '/maps'), |
60 | 61 |
'namelen': self.blocker.hashlen} |
61 | 62 |
self.mapper = Mapper(**p) |
62 |
|
|
63 |
|
|
63 | 64 |
def map_get(self, name): |
64 | 65 |
return self.mapper.map_retr(name) |
65 |
|
|
66 |
|
|
66 | 67 |
def map_put(self, name, map): |
67 | 68 |
self.mapper.map_stor(name, map) |
68 |
|
|
69 |
|
|
69 | 70 |
def map_delete(self, name): |
70 | 71 |
pass |
71 |
|
|
72 |
|
|
72 | 73 |
def block_get(self, hash): |
73 | 74 |
blocks = self.blocker.block_retr((hash,)) |
74 | 75 |
if not blocks: |
75 | 76 |
return None |
76 | 77 |
return blocks[0] |
77 |
|
|
78 |
|
|
78 | 79 |
def block_put(self, data): |
79 | 80 |
hashes, absent = self.blocker.block_stor((data,)) |
80 | 81 |
return hashes[0] |
81 |
|
|
82 |
|
|
82 | 83 |
def block_update(self, hash, offset, data): |
83 | 84 |
h, e = self.blocker.block_delta(hash, offset, data) |
84 | 85 |
return h |
85 |
|
|
86 |
|
|
86 | 87 |
def block_search(self, map): |
87 | 88 |
return self.blocker.block_ping(map) |
88 |
|
Also available in: Unified diff