def ctl_remove_hypervisor(self, image_name, hypervisor): metadata = None if image_name in self._metadata_dict: # the image is in use on this node. metadata = self._metadata_dict[image_name] else: # XXX need to check if no one is using this image. metadata_raw = self._get_metadata(image_name) if metadata_raw is None: return errno.ENOENT metadata = UKAIMetadata(image_name, self._config, metadata_raw) metadata.remove_hypervisor(hypervisor) return 0
def ctl_remove_location(self, image_name, location, start_index=0, end_index=-1): metadata = None if image_name in self._metadata_dict: # the image is in use on this node. metadata = self._metadata_dict[image_name] else: # XXX need to check if no one is using this image. metadata_raw = self._get_metadata(image_name) if metadata_raw is None: return errno.ENOENT metadata = UKAIMetadata(image_name, self._config, metadata_raw) metadata.remove_location(location, start_index, end_index) ukai_data_location_destroy(image_name, location, self._config) return 0
def ctl_add_location(self, image_name, location, start_index=0, end_index=-1, sync_status=UKAI_OUT_OF_SYNC): metadata = None if image_name in self._metadata_dict: # the image is in use on this node. metadata = self._metadata_dict[image_name] else: # XXX need to check if no one is using this image. metadata_raw = self._get_metadata(image_name) if metadata_raw is None: return errno.ENOENT metadata = UKAIMetadata(image_name, self._config, metadata_raw) metadata.add_location(location, start_index, end_index, sync_status) return 0
def ctl_add_image(self, image_name): if image_name in self._metadata_dict: return errno.EEXIST metadata = UKAIMetadata(image_name, self._config) self._metadata_dict[image_name] = metadata data = UKAIData(metadata=metadata, node_error_state_set=self._node_error_state_set, config=self._config) self._data_dict[image_name] = data UKAIStatistics[image_name] = UKAIImageStatistics() return 0
def proxy_update_metadata(self, image_name, encoded_metadata): metadata_raw = json.loads(zlib.decompress(self._rpc_trans.decode( encoded_metadata))) if image_name in self._metadata_dict: self._metadata_dict[image_name].metadata = metadata_raw else: metadata = UKAIMetadata(image_name, self._config, metadata_raw) self._metadata_dict[image_name] = metadata self._data_dict[image_name] = UKAIData(metadata, self._node_error_state_set, self._config) UKAIStatistics[image_name] = UKAIImageStatistics() return 0
def ctl_synchronize(self, image_name, start_index=0, end_index=-1, verbose=False): metadata = None if image_name in self._metadata_dict: # the image is in use on this node. metadata = self._metadata_dict[image_name] data = self._data_dict[image_name] else: # XXX need to check if no one is using this image. metadata_raw = self._get_metadata(image_name) if metadata_raw is None: return errno.ENOENT metadata = UKAIMetadata(image_name, self._config, metadata_raw) data = UKAIData(metadata, self._node_error_state_set, self._config) if end_index == -1: end_index = (metadata.size / metadata.block_size) - 1 for block_index in range(start_index, end_index + 1): if verbose is True: print 'Syncing block %d (from %d to %d)' % (block_index, start_index, end_index) if data.synchronize_block(block_index) is True: metadata.flush() return 0
fh.close() else: remote = xmlrpclib.ServerProxy( 'http://%s:%d/' % (node, self._config.get('core_port'))) remote.proxy_allocate_dataspace(self._metadata.name, self._metadata.block_size, blk_idx) if __name__ == '__main__': from ukai_node_error_state import UKAINodeErrorStateSet ukai_config.set('data_root', './test/local/data') ukai_config.set('metadata_root', './test/local/metadata') ness = UKAINodeErrorStateSet() meta = UKAIMetadata('./test/local/metadata/test') fh = UKAIData(meta, ness) data = 'Hello World!' offset = 0 print 'offset %d' % offset fh.write(data, offset) ver = fh.read(len(data), offset) if ver != data: print 'error at offset %d' % offset offset = meta.block_size - (len(data) / 2) print 'offset %d' % offset fh.write(data, offset) ver = fh.read(len(data), offset) if ver != data: print ver