示例#1
0
 def map_retr(self, maphash, size):
     """Return as a list, part of the hashes map of an object
        at the given block offset.
        By default, return the whole hashes map.
     """
     hashes = ()
     ioctx = self.ioctx_pool.pool_get()
     req = Request.get_mapr_request(ioctx,
                                    self.mapperd_port,
                                    maphash,
                                    offset=0,
                                    size=size)
     flags = req.get_flags()
     flags |= XF_ASSUMEV0
     req.set_flags(flags)
     req.set_v0_size(size)
     req.submit()
     req.wait()
     ret = req.success()
     if ret:
         data = req.get_data(xseg_reply_map)
         Segsarray = xseg_reply_map_scatterlist * data.contents.cnt
         segs = Segsarray.from_address(ctypes.addressof(data.contents.segs))
         hashes = [
             string_at(segs[idx].target, segs[idx].targetlen)
             for idx in xrange(len(segs))
         ]
         req.put()
     else:
         req.put()
         self.ioctx_pool.pool_put(ioctx)
         raise Exception("Could not retrieve Archipelago mapfile.")
     req = Request.get_close_request(ioctx, self.mapperd_port, maphash)
     req.submit()
     req.wait()
     ret = req.success()
     if ret is False:
         logger.warning("Could not close map %s" % maphash)
         pass
     req.put()
     self.ioctx_pool.pool_put(ioctx)
     return hashes
示例#2
0
    def block_retr_archipelago(self, hashes):
        """Retrieve blocks from storage by their hashes"""
        blocks = []
        append = blocks.append

        ioctx = self.ioctx_pool.pool_get()
        archip_emptyhash = hexlify(self.emptyhash)

        for h in hashes:
            if h == archip_emptyhash:
                append(self._pad(''))
                continue
            req = Request.get_info_request(ioctx, self.dst_port, h)
            req.submit()
            req.wait()
            ret = req.success()
            if ret:
                info = req.get_data(_type=xseg_reply_info)
                size = info.contents.size
                req.put()
                req_data = Request.get_read_request(ioctx,
                                                    self.dst_port,
                                                    h,
                                                    size=size)
                req_data.submit()
                req_data.wait()
                ret_data = req_data.success()
                if ret_data:
                    append(self._pad(string_at(req_data.get_data(), size)))
                    req_data.put()
                else:
                    req_data.put()
                    self.ioctx_pool.pool_put(ioctx)
                    raise Exception("Cannot retrieve Archipelago data.")
            else:
                req.put()
                self.ioctx_pool.pool_put(ioctx)
                raise Exception("Bad block file.")
        self.ioctx_pool.pool_put(ioctx)
        return blocks
示例#3
0
 def _check_rear_block(self, blkhash):
     filename = hexlify(blkhash)
     ioctx = self.ioctx_pool.pool_get()
     req = Request.get_info_request(ioctx, self.dst_port, filename)
     req.submit()
     req.wait()
     ret = req.success()
     req.put()
     self.ioctx_pool.pool_put(ioctx)
     if ret:
         return True
     else:
         return False
示例#4
0
 def _check_rear_block(self, blkhash):
     filename = hexlify(blkhash)
     ioctx = self.ioctx_pool.pool_get()
     req = Request.get_info_request(ioctx, self.dst_port, filename)
     req.submit()
     req.wait()
     ret = req.success()
     req.put()
     self.ioctx_pool.pool_put(ioctx)
     if ret:
         return True
     else:
         return False
示例#5
0
    def block_retr_archipelago(self, hashes):
        """Retrieve blocks from storage by their hashes"""
        blocks = []
        append = blocks.append

        ioctx = self.ioctx_pool.pool_get()
        archip_emptyhash = hexlify(self.emptyhash)

        for h in hashes:
            if h == archip_emptyhash:
                append(self._pad(''))
                continue
            req = Request.get_info_request(ioctx, self.dst_port, h)
            req.submit()
            req.wait()
            ret = req.success()
            if ret:
                info = req.get_data(_type=xseg_reply_info)
                size = info.contents.size
                req.put()
                req_data = Request.get_read_request(ioctx, self.dst_port, h,
                                                    size=size)
                req_data.submit()
                req_data.wait()
                ret_data = req_data.success()
                if ret_data:
                    append(self._pad(string_at(req_data.get_data(), size)))
                    req_data.put()
                else:
                    req_data.put()
                    self.ioctx_pool.pool_put(ioctx)
                    raise Exception("Cannot retrieve Archipelago data.")
            else:
                req.put()
                self.ioctx_pool.pool_put(ioctx)
                raise Exception("Bad block file.")
        self.ioctx_pool.pool_put(ioctx)
        return blocks
示例#6
0
 def map_retr(self, maphash, size):
     """Return as a list, part of the hashes map of an object
        at the given block offset.
        By default, return the whole hashes map.
     """
     hashes = ()
     ioctx = self.ioctx_pool.pool_get()
     req = Request.get_mapr_request(ioctx, self.mapperd_port,
                                    maphash, offset=0, size=size)
     flags = req.get_flags()
     flags |= XF_ASSUMEV0
     req.set_flags(flags)
     req.set_v0_size(size)
     req.submit()
     req.wait()
     ret = req.success()
     if ret:
         data = req.get_data(xseg_reply_map)
         Segsarray = xseg_reply_map_scatterlist * data.contents.cnt
         segs = Segsarray.from_address(ctypes.addressof(data.contents.segs))
         hashes = [string_at(segs[idx].target, segs[idx].targetlen)
                   for idx in xrange(len(segs))]
         req.put()
     else:
         req.put()
         self.ioctx_pool.pool_put(ioctx)
         raise Exception("Could not retrieve Archipelago mapfile.")
     req = Request.get_close_request(ioctx, self.mapperd_port,
                                     maphash)
     req.submit()
     req.wait()
     ret = req.success()
     if ret is False:
         logger.warning("Could not close map %s" % maphash)
         pass
     req.put()
     self.ioctx_pool.pool_put(ioctx)
     return hashes
示例#7
0
 def sync_write(self, data):
     ioctx = self.ioctx_pool.pool_get()
     req = Request.get_write_request(ioctx, self.dst_port, self.name,
                                     data=data, offset=self.offset,
                                     datalen=len(data))
     req.submit()
     req.wait()
     ret = req.success()
     req.put()
     self.ioctx_pool.pool_put(ioctx)
     if ret:
         self.offset += len(data)
     else:
         raise IOError("archipelago: Write request error")
示例#8
0
 def sync_write(self, data):
     ioctx = self.ioctx_pool.pool_get()
     req = Request.get_write_request(ioctx,
                                     self.dst_port,
                                     self.name,
                                     data=data,
                                     offset=self.offset,
                                     datalen=len(data))
     req.submit()
     req.wait()
     ret = req.success()
     req.put()
     self.ioctx_pool.pool_put(ioctx)
     if ret:
         self.offset += len(data)
     else:
         raise IOError("archipelago: Write request error")
示例#9
0
 def map_stor(self, maphash, hashes, size, block_size):
     """Store hashes in the given hashes map."""
     objects = list()
     for h in hashes:
         objects.append({'name': h, 'flags': XF_MAPFLAG_READONLY})
     ioctx = self.ioctx_pool.pool_get()
     req = Request.get_create_request(ioctx, self.mapperd_port,
                                      maphash,
                                      mapflags=XF_MAPFLAG_READONLY,
                                      objects=objects, blocksize=block_size,
                                      size=size)
     req.submit()
     req.wait()
     ret = req.success()
     if ret is False:
         req.put()
         self.ioctx_pool.pool_put(ioctx)
         raise IOError("Could not write map %s" % maphash)
     req.put()
     self.ioctx_pool.pool_put(ioctx)
示例#10
0
 def map_stor(self, maphash, hashes, size, block_size):
     """Store hashes in the given hashes map."""
     objects = list()
     for h in hashes:
         objects.append({'name': h, 'flags': XF_MAPFLAG_READONLY})
     ioctx = self.ioctx_pool.pool_get()
     req = Request.get_create_request(ioctx,
                                      self.mapperd_port,
                                      maphash,
                                      mapflags=XF_MAPFLAG_READONLY,
                                      objects=objects,
                                      blocksize=block_size,
                                      size=size)
     req.submit()
     req.wait()
     ret = req.success()
     if ret is False:
         req.put()
         self.ioctx_pool.pool_put(ioctx)
         raise IOError("Could not write map %s" % maphash)
     req.put()
     self.ioctx_pool.pool_put(ioctx)