예제 #1
0
파일: kv.c 프로젝트: HiroshiKozuka/sheepdog
static int bucket_delete(const char *account, uint32_t avid, const char *bucket)
{
	struct kv_bnode bnode;
	char onode_name[SD_MAX_VDI_LEN];
	char alloc_name[SD_MAX_VDI_LEN];
	char name[SD_MAX_BUCKET_NAME] = {};
	int ret;

	snprintf(onode_name, SD_MAX_VDI_LEN, "%s/%s", account, bucket);
	snprintf(alloc_name, SD_MAX_VDI_LEN, "%s/%s/allocator", account,
		 bucket);

	ret = bnode_lookup(&bnode, avid, bucket);
	if (ret != SD_RES_SUCCESS)
		return ret;

	if (bnode.object_count > 0)
		return SD_RES_VDI_NOT_EMPTY;

	/*
	 * We can't discard bnode because bnode_lookup() need it to find
	 * if some bucket exists or not by checking adjacent bnodes.
	 * So we just zero bnode.name to indicate a deleted bucket.
	 */
	ret = sd_write_object(bnode.oid, name, sizeof(name), 0, false);
	if (ret != SD_RES_SUCCESS) {
		sd_err("failed to zero bnode for %s", bucket);
		return ret;
	}
	sd_delete_vdi(onode_name);
	sd_delete_vdi(alloc_name);

	return SD_RES_SUCCESS;
}
예제 #2
0
파일: kv.c 프로젝트: skuanr/sheepdog
static int bucket_delete(const char *account, uint32_t avid, const char *bucket)
{
	struct kv_bnode bnode;
	char onode_name[SD_MAX_VDI_LEN];
	char alloc_name[SD_MAX_VDI_LEN];
	int ret;

	snprintf(onode_name, SD_MAX_VDI_LEN, "%s/%s", account, bucket);
	snprintf(alloc_name, SD_MAX_VDI_LEN, "%s/%s/allocator", account,
		 bucket);

	ret = bnode_lookup(&bnode, avid, bucket);
	if (ret != SD_RES_SUCCESS)
		return ret;

	if (bnode.object_count > 0)
		return SD_RES_VDI_NOT_EMPTY;

	ret = sd_discard_object(bnode.oid);
	if (ret != SD_RES_SUCCESS) {
		sd_err("failed to discard bnode for %s", bucket);
		return ret;
	}
	sd_delete_vdi(onode_name);
	sd_delete_vdi(alloc_name);

	return SD_RES_SUCCESS;
}
예제 #3
0
파일: kv.c 프로젝트: HiroshiKozuka/sheepdog
static int bucket_create(const char *account, uint32_t account_vid,
			 const char *bucket)
{
	char onode_name[SD_MAX_VDI_LEN];
	char alloc_name[SD_MAX_VDI_LEN];
	struct kv_bnode bnode;
	uint32_t vid;
	int ret;

	snprintf(onode_name, SD_MAX_VDI_LEN, "%s/%s", account, bucket);
	ret = sd_create_hyper_volume(onode_name, &vid);
	if (ret != SD_RES_SUCCESS) {
		sd_err("Failed to create bucket %s onode vid", bucket);
		return ret;
	}
	snprintf(alloc_name, SD_MAX_VDI_LEN, "%s/%s/allocator", account,
		 bucket);
	ret = sd_create_hyper_volume(alloc_name, &vid);
	if (ret != SD_RES_SUCCESS) {
		sd_err("Failed to create bucket %s data vid", bucket);
		sd_delete_vdi(onode_name);
		return ret;
	}
	ret = oalloc_init(vid);
	if (ret != SD_RES_SUCCESS) {
		sd_err("Failed to init allocator for bucket %s", bucket);
		goto err;
	}

	pstrcpy(bnode.name, sizeof(bnode.name), bucket);
	bnode.bytes_used = 0;
	bnode.object_count = 0;
	ret = bnode_create(&bnode, account_vid);
	if (ret != SD_RES_SUCCESS)
		goto err;

	return SD_RES_SUCCESS;
err:
	sd_delete_vdi(onode_name);
	sd_delete_vdi(alloc_name);
	return ret;
}
예제 #4
0
파일: kv.c 프로젝트: HiroshiKozuka/sheepdog
int kv_delete_account(struct http_request *req, const char *account)
{
	uint64_t bcount, ocount, used;
	int ret;

	ret = read_account_meta(account, &bcount, &ocount, &used);
	if (ret != SD_RES_SUCCESS)
		return ret;

	if (bcount)
		return SD_RES_VDI_NOT_EMPTY;

	ret = sd_delete_vdi(account);
	if (ret != SD_RES_SUCCESS)
		sd_err("Failed to delete vdi %s", account);
	return ret;
}