On Fri, Dec 06, 2013 at 05:04:19PM +0800, Robin Dong wrote: > From: Robin Dong <sanbai at taobao.com> > > Using hyper volume and extent structure of onode to store large number of > objects size of which exceed SD_DATA_OBJ_SIZE. > > Signed-off-by: Robin Dong <sanbai at taobao.com> > --- > sheep/http/kv.c | 422 ++++++++++++++++++++++++++++++++++++++++------------- > sheep/http/kv.h | 15 +- > sheep/http/s3.c | 8 +- > sheep/http/swift.c | 30 +--- > 4 files changed, 335 insertions(+), 140 deletions(-) > > diff --git a/sheep/http/kv.c b/sheep/http/kv.c > index 55a7e24..68f0759 100644 > --- a/sheep/http/kv.c > +++ b/sheep/http/kv.c > @@ -21,6 +21,7 @@ struct bucket_inode { > uint64_t obj_count; > uint64_t bytes_used; > uint32_t vdi_id; /* kv_onode stores in this vdi */ > + uint32_t data_vid; /* data of objects store in this vdi */ > uint32_t pad; > uint64_t reserved[SD_MAX_BUCKET_NAME/sizeof(uint64_t) - 3]; > }; > @@ -172,13 +173,13 @@ int kv_create_account(const char *account) > return kv_create_hyper_volume(account, &vdi_id); > } > > -typedef void (*list_cb)(struct http_request *req, const char *bucket, > +typedef void (*list_bucket_cb)(struct http_request *req, const char *bucket, > void *opaque); > > struct list_buckets_arg { > struct http_request *req; > const char *account; > - list_cb cb; > + list_bucket_cb cb; > uint32_t bucket_counter; > }; > > @@ -360,7 +361,16 @@ static int delete_bucket(struct sd_inode *account_inode, uint64_t idx, > bnode->vdi_id = 0; > snprintf(vdi_name, SD_MAX_VDI_LEN, "%s/%s", > account_inode->name, bucket); > - > + /* delete vdi which store kv_onode */ > + ret = kv_delete_vdi(vdi_name); > + if (ret != SD_RES_SUCCESS) { > + sd_err("Failed to delete vdi %s", vdi_name); > + ret = -1; > + goto out; > + } > + /* delete vdi which store object data */ > + snprintf(vdi_name, SD_MAX_VDI_LEN, "%s/%s/allocator", > + account_inode->name, bucket); > ret = kv_delete_vdi(vdi_name); > if (ret != SD_RES_SUCCESS) { > sd_err("Failed to delete vdi %s", vdi_name); > @@ -462,12 +472,29 @@ static int add_bucket(struct sd_inode *account_inode, uint64_t idx, > bnode->bytes_used = 0; > snprintf(vdi_name, SD_MAX_VDI_LEN, "%s/%s", > account_inode->name, bucket); > + /* create vdi to store kv_onode */ > ret = kv_create_hyper_volume(vdi_name, &(bnode->vdi_id)); > &bnode->vdi_id is fine because -> is has priority over & operator. Thanks Yuan |