Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-backend / pithos / backends / lib / hashfiler / filemapper.py @ c30635bf

History | View | Annotate | Download (3.5 kB)

1 c30635bf Filippos Giannakos
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 c30635bf Filippos Giannakos
# 
3 c30635bf Filippos Giannakos
# Redistribution and use in source and binary forms, with or
4 c30635bf Filippos Giannakos
# without modification, are permitted provided that the following
5 c30635bf Filippos Giannakos
# conditions are met:
6 c30635bf Filippos Giannakos
# 
7 c30635bf Filippos Giannakos
#   1. Redistributions of source code must retain the above
8 c30635bf Filippos Giannakos
#      copyright notice, this list of conditions and the following
9 c30635bf Filippos Giannakos
#      disclaimer.
10 c30635bf Filippos Giannakos
# 
11 c30635bf Filippos Giannakos
#   2. Redistributions in binary form must reproduce the above
12 c30635bf Filippos Giannakos
#      copyright notice, this list of conditions and the following
13 c30635bf Filippos Giannakos
#      disclaimer in the documentation and/or other materials
14 c30635bf Filippos Giannakos
#      provided with the distribution.
15 c30635bf Filippos Giannakos
# 
16 c30635bf Filippos Giannakos
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 c30635bf Filippos Giannakos
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 c30635bf Filippos Giannakos
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 c30635bf Filippos Giannakos
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 c30635bf Filippos Giannakos
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 c30635bf Filippos Giannakos
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 c30635bf Filippos Giannakos
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 c30635bf Filippos Giannakos
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 c30635bf Filippos Giannakos
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 c30635bf Filippos Giannakos
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 c30635bf Filippos Giannakos
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 c30635bf Filippos Giannakos
# POSSIBILITY OF SUCH DAMAGE.
28 c30635bf Filippos Giannakos
# 
29 c30635bf Filippos Giannakos
# The views and conclusions contained in the software and
30 c30635bf Filippos Giannakos
# documentation are those of the authors and should not be
31 c30635bf Filippos Giannakos
# interpreted as representing official policies, either expressed
32 c30635bf Filippos Giannakos
# or implied, of GRNET S.A.
33 c30635bf Filippos Giannakos
34 c30635bf Filippos Giannakos
from os import makedirs, unlink
35 c30635bf Filippos Giannakos
from os.path import isdir, realpath, exists, join
36 c30635bf Filippos Giannakos
from binascii import hexlify
37 c30635bf Filippos Giannakos
38 c30635bf Filippos Giannakos
from context_file import ContextFile
39 c30635bf Filippos Giannakos
40 c30635bf Filippos Giannakos
41 c30635bf Filippos Giannakos
class FileMapper(object):
42 c30635bf Filippos Giannakos
    """Mapper.
43 c30635bf Filippos Giannakos
       Required constructor parameters: mappath, namelen.
44 c30635bf Filippos Giannakos
    """
45 c30635bf Filippos Giannakos
    
46 c30635bf Filippos Giannakos
    mappath = None
47 c30635bf Filippos Giannakos
    namelen = None
48 c30635bf Filippos Giannakos
49 c30635bf Filippos Giannakos
    def __init__(self, **params):
50 c30635bf Filippos Giannakos
        self.params = params
51 c30635bf Filippos Giannakos
        self.namelen = params['namelen']
52 c30635bf Filippos Giannakos
        mappath = realpath(params['mappath'])
53 c30635bf Filippos Giannakos
        if not isdir(mappath):
54 c30635bf Filippos Giannakos
            if not exists(mappath):
55 c30635bf Filippos Giannakos
                makedirs(mappath)
56 c30635bf Filippos Giannakos
            else:
57 c30635bf Filippos Giannakos
                raise ValueError("Variable mappath '%s' is not a directory" % (mappath,))
58 c30635bf Filippos Giannakos
        self.mappath = mappath
59 c30635bf Filippos Giannakos
60 c30635bf Filippos Giannakos
    def _get_rear_map(self, maphash, create=0):
61 c30635bf Filippos Giannakos
        filename = hexlify(maphash)
62 c30635bf Filippos Giannakos
        dir = join(self.mappath, filename[0:2], filename[2:4], filename[4:6])
63 c30635bf Filippos Giannakos
        if not exists(dir):
64 c30635bf Filippos Giannakos
            makedirs(dir)
65 c30635bf Filippos Giannakos
        name = join(dir, filename)
66 c30635bf Filippos Giannakos
        return ContextFile(name, create)
67 c30635bf Filippos Giannakos
68 c30635bf Filippos Giannakos
    def _check_rear_map(self, maphash):
69 c30635bf Filippos Giannakos
        filename = hexlify(maphash)
70 c30635bf Filippos Giannakos
        dir = join(self.mappath, filename[0:2], filename[2:4], filename[4:6])
71 c30635bf Filippos Giannakos
        name = join(dir, filename)
72 c30635bf Filippos Giannakos
        return exists(name)
73 c30635bf Filippos Giannakos
74 c30635bf Filippos Giannakos
    def map_retr(self, maphash, blkoff=0, nr=100000000000000):
75 c30635bf Filippos Giannakos
        """Return as a list, part of the hashes map of an object
76 c30635bf Filippos Giannakos
           at the given block offset.
77 c30635bf Filippos Giannakos
           By default, return the whole hashes map.
78 c30635bf Filippos Giannakos
        """
79 c30635bf Filippos Giannakos
        namelen = self.namelen
80 c30635bf Filippos Giannakos
        hashes = ()
81 c30635bf Filippos Giannakos
82 c30635bf Filippos Giannakos
        with self._get_rear_map(maphash, 0) as rmap:
83 c30635bf Filippos Giannakos
            if rmap:
84 c30635bf Filippos Giannakos
                hashes = list(rmap.sync_read_chunks(namelen, nr, blkoff))
85 c30635bf Filippos Giannakos
        return hashes
86 c30635bf Filippos Giannakos
87 c30635bf Filippos Giannakos
    def map_stor(self, maphash, hashes=(), blkoff=0, create=1):
88 c30635bf Filippos Giannakos
        """Store hashes in the given hashes map."""
89 c30635bf Filippos Giannakos
        namelen = self.namelen
90 c30635bf Filippos Giannakos
        if self._check_rear_map(maphash):
91 c30635bf Filippos Giannakos
            return
92 c30635bf Filippos Giannakos
        with self._get_rear_map(maphash, 1) as rmap:
93 c30635bf Filippos Giannakos
            rmap.sync_write_chunks(namelen, blkoff, hashes, None)