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; }
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; }
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; }
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; }