Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-backend / pithos / backends / lib / hashfiler / archipelagomapper.py @ 32293ec0

History | View | Annotate | Download (5.8 kB)

1 32293ec0 Chrysostomos Nanakos
# Copyright 2013 GRNET S.A. All rights reserved.
2 32293ec0 Chrysostomos Nanakos
#
3 32293ec0 Chrysostomos Nanakos
# Redistribution and use in source and binary forms, with or
4 32293ec0 Chrysostomos Nanakos
# without modification, are permitted provided that the following
5 32293ec0 Chrysostomos Nanakos
# conditions are met:
6 32293ec0 Chrysostomos Nanakos
#
7 32293ec0 Chrysostomos Nanakos
#   1. Redistributions of source code must retain the above
8 32293ec0 Chrysostomos Nanakos
#      copyright notice, this list of conditions and the following
9 32293ec0 Chrysostomos Nanakos
#      disclaimer.
10 32293ec0 Chrysostomos Nanakos
#
11 32293ec0 Chrysostomos Nanakos
#   2. Redistributions in binary form must reproduce the above
12 32293ec0 Chrysostomos Nanakos
#      copyright notice, this list of conditions and the following
13 32293ec0 Chrysostomos Nanakos
#      disclaimer in the documentation and/or other materials
14 32293ec0 Chrysostomos Nanakos
#      provided with the distribution.
15 32293ec0 Chrysostomos Nanakos
#
16 32293ec0 Chrysostomos Nanakos
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 32293ec0 Chrysostomos Nanakos
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 32293ec0 Chrysostomos Nanakos
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 32293ec0 Chrysostomos Nanakos
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 32293ec0 Chrysostomos Nanakos
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 32293ec0 Chrysostomos Nanakos
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 32293ec0 Chrysostomos Nanakos
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 32293ec0 Chrysostomos Nanakos
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 32293ec0 Chrysostomos Nanakos
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 32293ec0 Chrysostomos Nanakos
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 32293ec0 Chrysostomos Nanakos
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 32293ec0 Chrysostomos Nanakos
# POSSIBILITY OF SUCH DAMAGE.
28 32293ec0 Chrysostomos Nanakos
#
29 32293ec0 Chrysostomos Nanakos
# The views and conclusions contained in the software and
30 32293ec0 Chrysostomos Nanakos
# documentation are those of the authors and should not be
31 32293ec0 Chrysostomos Nanakos
# interpreted as representing official policies, either expressed
32 32293ec0 Chrysostomos Nanakos
# or implied, of GRNET S.A.
33 32293ec0 Chrysostomos Nanakos
34 32293ec0 Chrysostomos Nanakos
from binascii import hexlify
35 32293ec0 Chrysostomos Nanakos
import os, re
36 32293ec0 Chrysostomos Nanakos
import ctypes
37 32293ec0 Chrysostomos Nanakos
38 32293ec0 Chrysostomos Nanakos
from context_archipelago import ArchipelagoObject
39 32293ec0 Chrysostomos Nanakos
from archipelago.common import (
40 32293ec0 Chrysostomos Nanakos
    Request,
41 32293ec0 Chrysostomos Nanakos
    xseg_reply_info,
42 32293ec0 Chrysostomos Nanakos
    xseg_reply_map,
43 32293ec0 Chrysostomos Nanakos
    xseg_reply_map_scatterlist,
44 32293ec0 Chrysostomos Nanakos
    string_at,
45 32293ec0 Chrysostomos Nanakos
    )
46 32293ec0 Chrysostomos Nanakos
47 32293ec0 Chrysostomos Nanakos
from pithos.workers import (
48 32293ec0 Chrysostomos Nanakos
    glue,
49 32293ec0 Chrysostomos Nanakos
    monkey,
50 32293ec0 Chrysostomos Nanakos
    )
51 32293ec0 Chrysostomos Nanakos
52 32293ec0 Chrysostomos Nanakos
monkey.patch_Request()
53 32293ec0 Chrysostomos Nanakos
54 32293ec0 Chrysostomos Nanakos
from pithos.api.settings import BACKEND_ARCHIPELAGO_CONF
55 32293ec0 Chrysostomos Nanakos
56 32293ec0 Chrysostomos Nanakos
57 32293ec0 Chrysostomos Nanakos
class ArchipelagoMapper(object):
58 32293ec0 Chrysostomos Nanakos
    """Mapper.
59 32293ec0 Chrysostomos Nanakos
       Required constructor parameters: namelen.
60 32293ec0 Chrysostomos Nanakos
    """
61 32293ec0 Chrysostomos Nanakos
62 32293ec0 Chrysostomos Nanakos
    namelen = None
63 32293ec0 Chrysostomos Nanakos
64 32293ec0 Chrysostomos Nanakos
    def __init__(self, **params):
65 32293ec0 Chrysostomos Nanakos
        self.params = params
66 32293ec0 Chrysostomos Nanakos
        self.namelen = params['namelen']
67 32293ec0 Chrysostomos Nanakos
        ioctx_pool = glue.WorkerGlue().ioctx_pool
68 32293ec0 Chrysostomos Nanakos
        cfg = {}
69 32293ec0 Chrysostomos Nanakos
        bcfg = open(BACKEND_ARCHIPELAGO_CONF).read()
70 32293ec0 Chrysostomos Nanakos
        cfg['blockerm'] = re.search('\'blockerm_port\'\s*:\s*\d+',
71 32293ec0 Chrysostomos Nanakos
                                        bcfg).group(0).split(':')[1]
72 32293ec0 Chrysostomos Nanakos
        cfg['mapperd'] = re.search('\'mapper_port\'\s*:\s*\d+',
73 32293ec0 Chrysostomos Nanakos
                                        bcfg).group(0).split(':')[1]
74 32293ec0 Chrysostomos Nanakos
        self.ioctx_pool = ioctx_pool
75 32293ec0 Chrysostomos Nanakos
        self.dst_port = int(cfg['blockerm'])
76 32293ec0 Chrysostomos Nanakos
        self.mapperd_port = int(cfg['mapperd'])
77 32293ec0 Chrysostomos Nanakos
78 32293ec0 Chrysostomos Nanakos
    def _get_rear_map(self, maphash, create=0):
79 32293ec0 Chrysostomos Nanakos
        name = hexlify(maphash)
80 32293ec0 Chrysostomos Nanakos
        return ArchipelagoObject(name, self.ioctx_pool, self.dst_port, create)
81 32293ec0 Chrysostomos Nanakos
82 32293ec0 Chrysostomos Nanakos
    def _check_rear_map(self, maphash):
83 32293ec0 Chrysostomos Nanakos
        name = hexlify(maphash)
84 32293ec0 Chrysostomos Nanakos
        ioctx = self.ioctx_pool.pool_get()
85 32293ec0 Chrysostomos Nanakos
        req = Request.get_info_request(ioctx, self.dst_port, name)
86 32293ec0 Chrysostomos Nanakos
        req.submit()
87 32293ec0 Chrysostomos Nanakos
        req.wait()
88 32293ec0 Chrysostomos Nanakos
        ret = req.success()
89 32293ec0 Chrysostomos Nanakos
        req.put()
90 32293ec0 Chrysostomos Nanakos
        self.ioctx_pool.pool_put(ioctx)
91 32293ec0 Chrysostomos Nanakos
        if ret:
92 32293ec0 Chrysostomos Nanakos
            return True
93 32293ec0 Chrysostomos Nanakos
        else:
94 32293ec0 Chrysostomos Nanakos
            return False
95 32293ec0 Chrysostomos Nanakos
96 32293ec0 Chrysostomos Nanakos
    def map_retr(self, maphash, blkoff=0, nr=100000000000000):
97 32293ec0 Chrysostomos Nanakos
        """Return as a list, part of the hashes map of an object
98 32293ec0 Chrysostomos Nanakos
           at the given block offset.
99 32293ec0 Chrysostomos Nanakos
           By default, return the whole hashes map.
100 32293ec0 Chrysostomos Nanakos
        """
101 32293ec0 Chrysostomos Nanakos
        namelen = self.namelen
102 32293ec0 Chrysostomos Nanakos
        hashes = ()
103 32293ec0 Chrysostomos Nanakos
        ioctx = self.ioctx_pool.pool_get()
104 32293ec0 Chrysostomos Nanakos
        req = Request.get_info_request(ioctx, self.dst_port,
105 32293ec0 Chrysostomos Nanakos
                                       hexlify(maphash))
106 32293ec0 Chrysostomos Nanakos
        req.submit()
107 32293ec0 Chrysostomos Nanakos
        req.wait()
108 32293ec0 Chrysostomos Nanakos
        ret = req.success()
109 32293ec0 Chrysostomos Nanakos
        if ret:
110 32293ec0 Chrysostomos Nanakos
            info = req.get_data(_type=xseg_reply_info)
111 32293ec0 Chrysostomos Nanakos
            size = int(info.contents.size)
112 32293ec0 Chrysostomos Nanakos
            req.put()
113 32293ec0 Chrysostomos Nanakos
        else:
114 32293ec0 Chrysostomos Nanakos
            req.put()
115 32293ec0 Chrysostomos Nanakos
            self.ioctx_pool.pool_put(ioctx)
116 32293ec0 Chrysostomos Nanakos
            raise RuntimeError("Hashmap '%s' doesn't exists" % hexlify(maphash))
117 32293ec0 Chrysostomos Nanakos
        req = Request.get_read_request(ioctx, self.dst_port,
118 32293ec0 Chrysostomos Nanakos
                                       hexlify(maphash), size = size)
119 32293ec0 Chrysostomos Nanakos
        req.submit()
120 32293ec0 Chrysostomos Nanakos
        req.wait()
121 32293ec0 Chrysostomos Nanakos
        ret = req.success()
122 32293ec0 Chrysostomos Nanakos
        if ret:
123 32293ec0 Chrysostomos Nanakos
            data = string_at(req.get_data(),size)
124 32293ec0 Chrysostomos Nanakos
            req.put()
125 32293ec0 Chrysostomos Nanakos
            self.ioctx_pool.pool_put(ioctx)
126 32293ec0 Chrysostomos Nanakos
            for idx in xrange(0,len(data),namelen):
127 32293ec0 Chrysostomos Nanakos
                hashes = hashes + (data[idx:idx+namelen],)
128 32293ec0 Chrysostomos Nanakos
            hashes = list(hashes)
129 32293ec0 Chrysostomos Nanakos
        else:
130 32293ec0 Chrysostomos Nanakos
            req.put()
131 32293ec0 Chrysostomos Nanakos
            self.ioctx_pool.pool_put(ioctx)
132 32293ec0 Chrysostomos Nanakos
            raise RuntimeError("Hashmap '%s' doesn't exists" % hexlify(maphash))
133 32293ec0 Chrysostomos Nanakos
        return hashes
134 32293ec0 Chrysostomos Nanakos
135 32293ec0 Chrysostomos Nanakos
    def map_retr_archipelago(self, maphash, size):
136 32293ec0 Chrysostomos Nanakos
        """Retrieve Archipelago mapfile"""
137 32293ec0 Chrysostomos Nanakos
        ioctx = self.ioctx_pool.pool_get()
138 32293ec0 Chrysostomos Nanakos
        maphash = maphash.split("archip:")[1]
139 32293ec0 Chrysostomos Nanakos
        req = Request.get_mapr_request(ioctx, self.mapperd_port, maphash,
140 32293ec0 Chrysostomos Nanakos
                                       offset=0, size=size)
141 32293ec0 Chrysostomos Nanakos
        req.submit()
142 32293ec0 Chrysostomos Nanakos
        req.wait()
143 32293ec0 Chrysostomos Nanakos
        ret = req.success()
144 32293ec0 Chrysostomos Nanakos
        if ret:
145 32293ec0 Chrysostomos Nanakos
            data = req.get_data(xseg_reply_map)
146 32293ec0 Chrysostomos Nanakos
            Segsarray = xseg_reply_map_scatterlist * data.contents.cnt
147 32293ec0 Chrysostomos Nanakos
            segs = Segsarray.from_address(ctypes.addressof(data.contents.segs))
148 32293ec0 Chrysostomos Nanakos
            req.put()
149 32293ec0 Chrysostomos Nanakos
        else:
150 32293ec0 Chrysostomos Nanakos
            req.put()
151 32293ec0 Chrysostomos Nanakos
            self.ioctx_pool.pool_put(ioctx)
152 32293ec0 Chrysostomos Nanakos
            raise Exception("Could not retrieve Archipelago mapfile.")
153 32293ec0 Chrysostomos Nanakos
        self.ioctx_pool.pool_put(ioctx)
154 32293ec0 Chrysostomos Nanakos
        return [string_at(segs[idx].target, segs[idx].targetlen) for idx in xrange(len(segs))]
155 32293ec0 Chrysostomos Nanakos
156 32293ec0 Chrysostomos Nanakos
    def map_stor(self, maphash, hashes=(), blkoff=0, create=1):
157 32293ec0 Chrysostomos Nanakos
        """Store hashes in the given hashes map."""
158 32293ec0 Chrysostomos Nanakos
        namelen = self.namelen
159 32293ec0 Chrysostomos Nanakos
        if self._check_rear_map(maphash):
160 32293ec0 Chrysostomos Nanakos
            return
161 32293ec0 Chrysostomos Nanakos
        with self._get_rear_map(maphash, 1) as rmap:
162 32293ec0 Chrysostomos Nanakos
            rmap.sync_write_chunks(namelen, blkoff, hashes, None)