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
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
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
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