On Mon, Mar 16, 2015 at 7:42 PM, Liu Yuan <[email protected]> wrote:
> On Mon, Mar 16, 2015 at 03:57:40PM +0900, Hitoshi Mitake wrote:
>> This patch adds a new option -R to "dog cluster format". If user
>> specifies the option during cluster format, the cluster will enable
>> recycling VID (disabled in default).
>>
>> Signed-off-by: Hitoshi Mitake <[email protected]>
>> ---
>>  dog/cluster.c            | 9 ++++++++-
>>  include/internal_proto.h | 1 +
>>  sheep/ops.c              | 4 +++-
>>  sheep/vdi.c              | 2 +-
>>  4 files changed, 13 insertions(+), 3 deletions(-)
>>
>> diff --git a/dog/cluster.c b/dog/cluster.c
>> index e252316..bb61fcc 100644
>> --- a/dog/cluster.c
>> +++ b/dog/cluster.c
>> @@ -25,6 +25,7 @@ static struct sd_option cluster_options[] = {
>>       {'l', "lock", false, "Lock vdi to exclude multiple users"},
>>       {'m', "multithread", false,
>>        "use multi-thread for 'cluster snapshot save'"},
>> +     {'R', "recyclevid", false, "enable recycling of VID"},
>>       {'t', "strict", false,
>>        "do not serve write request if number of nodes is not sufficient"},
>>       {'z', "block_size_shift", true, "specify the shift num of default"
>> @@ -43,6 +44,7 @@ static struct cluster_cmd_data {
>>       char name[STORE_LEN];
>>       bool fixed_vnodes;
>>       bool use_lock;
>> +     bool recycle_vid;
>>  } cluster_cmd_data;
>>
>>  #define DEFAULT_STORE        "plain"
>> @@ -169,6 +171,8 @@ static int cluster_format(int argc, char **argv)
>>               hdr.cluster.flags |= SD_CLUSTER_FLAG_STRICT;
>>       if (cluster_cmd_data.use_lock)
>>               hdr.cluster.flags |= SD_CLUSTER_FLAG_USE_LOCK;
>> +     if (cluster_cmd_data.recycle_vid)
>> +             hdr.cluster.flags |= SD_CLUSTER_FLAG_RECYCLE_VID;
>>
>>  #ifdef HAVE_DISKVNODES
>>       hdr.cluster.flags |= SD_CLUSTER_FLAG_DISKMODE;
>> @@ -820,7 +824,7 @@ failure:
>>  static struct subcommand cluster_cmd[] = {
>>       {"info", NULL, "aprhvT", "show cluster information",
>>        NULL, CMD_NEED_NODELIST, cluster_info, cluster_options},
>> -     {"format", NULL, "bcltaphzTV", "create a Sheepdog store",
>> +     {"format", NULL, "bcltaphzTVR", "create a Sheepdog store",
>>        NULL, CMD_NEED_NODELIST, cluster_format, cluster_options},
>>       {"shutdown", NULL, "aphT", "stop Sheepdog",
>>        NULL, 0, cluster_shutdown, cluster_options},
>> @@ -890,6 +894,9 @@ static int cluster_parser(int ch, const char *opt)
>>       case 'V':
>>               cluster_cmd_data.fixed_vnodes = true;
>>               break;
>> +     case 'R':
>> +             cluster_cmd_data.recycle_vid = true;
>> +             break;
>>       }
>>
>>       return 0;
>> diff --git a/include/internal_proto.h b/include/internal_proto.h
>> index defbe6d..3a370b6 100644
>> --- a/include/internal_proto.h
>> +++ b/include/internal_proto.h
>> @@ -157,6 +157,7 @@
>>  #define SD_CLUSTER_FLAG_DISKMODE     0x0002 /* Disk mode for cluster */
>>  #define SD_CLUSTER_FLAG_AUTO_VNODES  0x0004 /* Cluster vnodes strategy */
>>  #define SD_CLUSTER_FLAG_USE_LOCK     0x0008 /* Lock/Unlock vdi */
>> +#define SD_CLUSTER_FLAG_RECYCLE_VID  0x0010 /* Enable recycling of VID */
>>
>>
>>  enum sd_status {
>> diff --git a/sheep/ops.c b/sheep/ops.c
>> index 0e5ac64..8c79a84 100644
>> --- a/sheep/ops.c
>> +++ b/sheep/ops.c
>> @@ -198,7 +198,9 @@ static int post_cluster_del_vdi(const struct sd_req 
>> *req, struct sd_rsp *rsp,
>>       if (ret == SD_RES_SUCCESS) {
>>               atomic_set_bit(vid, sys->vdi_deleted);
>>               vdi_mark_deleted(vid);
>> -             run_vid_gc(vid);
>> +
>> +             if (sys->cinfo.flags & SD_CLUSTER_FLAG_RECYCLE_VID)
>> +                     run_vid_gc(vid);
>>       }
>>
>>       if (!sys->enable_object_cache)
>> diff --git a/sheep/vdi.c b/sheep/vdi.c
>> index 8114fb5..eac0367 100644
>> --- a/sheep/vdi.c
>> +++ b/sheep/vdi.c
>> @@ -384,7 +384,7 @@ static int do_add_vdi_state(uint32_t vid, int nr_copies, 
>> bool snapshot,
>>               already_exists = true;
>>       }
>>
>> -     if (!already_exists)
>> +     if (sys->cinfo.flags & SD_CLUSTER_FLAG_RECYCLE_VID && !already_exists)
>>               update_vdi_family(parent_vid, entry, unordered);
>>
>>       sd_rw_unlock(&vdi_state_lock);
>> --
>> 1.9.1
>>
>> --
>> sheepdog mailing list
>> [email protected]
>> https://lists.wpkg.org/mailman/listinfo/sheepdog
>
> It seems that your patch 21549a1bd4981fabcc09d062a647162127fe0637
>
> Author: Hitoshi Mitake <[email protected]>
> Date:   Sun Jun 1 23:23:18 2014 +0900
>
>     sheep: don't recycle VDI ID
>
>     Recycling VDI IDs of deleted VDIs is a completely wrong idea. It
>     breaks relations between inode objects and data objects. For example,
>     it can cause a problem of corrupting cloned VDIs (see related
>     issue). This patch forbids the recycling.
>
>     Related issue:
>     https://bugs.launchpad.net/sheepdog-project/+bug/1317755
>
> conflict with your current vid recycling. I think it is not hard to allow
> vid recycle for snapshot create, I'd give it a try.
>

No, they don't conflict. The old policy of recycling has a possibility
of data corruption (the issue of launchpad describes). And new one
avoid the problem because it recycle VIDs with considering VDI family
relations.

Thanks,
Hitoshi
-- 
sheepdog mailing list
[email protected]
https://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to