Exemplo n.º 1
0
 def sync_read(self, size):
     read = Request.get_read_request
     data = ''
     datalen = 0
     dsize = size
     while 1:
         ioctx = self.ioctx_pool.pool_get()
         req = read(ioctx,
                    self.dst_port,
                    self.name,
                    size=dsize - datalen,
                    offset=self.offset)
         req.submit()
         req.wait()
         ret = req.success()
         if ret:
             s = string_at(req.get_data(), dsize - datalen)
         else:
             s = None
         req.put()
         self.ioctx_pool.pool_put(ioctx)
         if not s:
             break
         data += s
         datalen += len(s)
         self.offset += len(s)
         if datalen >= size:
             break
     return data
Exemplo n.º 2
0
 def sync_read(self, size):
     read = Request.get_read_request
     data = ''
     datalen = 0
     dsize = size
     while 1:
         ioctx = self.ioctx_pool.pool_get()
         req = read(ioctx, self.dst_port,
                    self.name, size=dsize - datalen, offset=self.offset)
         req.submit()
         req.wait()
         ret = req.success()
         if ret:
             s = string_at(req.get_data(), dsize - datalen)
         else:
             s = None
         req.put()
         self.ioctx_pool.pool_put(ioctx)
         if not s:
             break
         data += s
         datalen += len(s)
         self.offset += len(s)
         if datalen >= size:
             break
     return data
Exemplo n.º 3
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
Exemplo n.º 4
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
Exemplo n.º 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
Exemplo n.º 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