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 _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
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 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")
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)