示例#1
0
/*
 * Read data firstly from local object cache(if enabled), if fail,
 * try read backends
 */
int read_object(uint64_t oid, char *data, unsigned int datalen,
		uint64_t offset)
{
	int ret;

	if (sys->enable_object_cache && object_is_cached(oid)) {
		ret = object_cache_read(oid, data, datalen, offset);
		if (ret != SD_RES_SUCCESS) {
			sd_eprintf("try forward read %"PRIx64" %s", oid,
				   sd_strerror(ret));
			goto forward_read;
		}
		return ret;
	}

forward_read:
	return read_backend_object(oid, data, datalen, offset);
}
示例#2
0
文件: store.c 项目: Taejun/sheepdog
int sd_remove_object(uint64_t oid)
{
	struct sd_req hdr;
	int ret;

	if (sys->enable_object_cache && object_is_cached(oid)) {
		ret = object_cache_remove(oid);
		if (ret != SD_RES_SUCCESS)
			return ret;
	}

	sd_init_req(&hdr, SD_OP_REMOVE_OBJ);
	hdr.obj.oid = oid;

	ret = exec_local_req(&hdr, NULL);
	if (ret != SD_RES_SUCCESS)
		sd_err("failed to remove object %" PRIx64 ", %s", oid,
		       sd_strerror(ret));

	return ret;
}
示例#3
0
/* Write data to both local object cache (if enabled) and backends */
int write_object(uint64_t oid, char *data, unsigned int datalen,
		 uint64_t offset, bool create)
{
	struct sd_req hdr;
	int ret;

	if (sys->enable_object_cache && object_is_cached(oid)) {
		ret = object_cache_write(oid, data, datalen, offset,
					 create);
		if (ret == SD_RES_NO_CACHE)
			goto forward_write;

		if (ret != 0) {
			sd_eprintf("write cache failed %"PRIx64" %"PRIx32, oid,
				   ret);
			return ret;
		}
	}

forward_write:
	if (create)
		sd_init_req(&hdr, SD_OP_CREATE_AND_WRITE_OBJ);
	else
		sd_init_req(&hdr, SD_OP_WRITE_OBJ);
	hdr.flags = SD_FLAG_CMD_WRITE;
	hdr.data_length = datalen;

	hdr.obj.oid = oid;
	hdr.obj.offset = offset;
	hdr.obj.copies = get_vdi_copy_number(oid_to_vid(oid));

	ret = exec_local_req(&hdr, data);
	if (ret != SD_RES_SUCCESS)
		sd_eprintf("failed to write object %" PRIx64 ", %s", oid,
			   sd_strerror(ret));

	return ret;
}