/* * 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); }
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; }
/* 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; }