All of lore.kernel.org
 help / color / mirror / Atom feed
From: Loic Dachary <loic@dachary.org>
To: Sage Weil <sweil@redhat.com>
Cc: Ceph Development <ceph-devel@vger.kernel.org>
Subject: Re: crush multiweight implementation details
Date: Mon, 10 Apr 2017 16:53:57 +0200	[thread overview]
Message-ID: <e0486aed-57d8-ec7c-8686-3c0775f69095@dachary.org> (raw)
In-Reply-To: <alpine.DEB.2.11.1704101442540.2999@piezo.novalocal>



On 04/10/2017 04:44 PM, Sage Weil wrote:
> On Mon, 10 Apr 2017, Loic Dachary wrote:
>> On 04/10/2017 04:11 PM, Sage Weil wrote:
>>> On Mon, 10 Apr 2017, Loic Dachary wrote:
>>>> Hi Sage,
>>>>
>>>> We could have:
>>>>
>>>> struct crush_choose_arg {
>>>>   __u32 bucket_id;
>>>>   __u32 num_items;
>>>>   __u32 *ids; // override the bucket items for placement
>>>>   __u32 num_positions;
>>>>   __u32 *weights; // size is num_positions*num_items
>>>> };
>>>>  
>>>> struct crush_choose_arg_map {
>>>>   struct crush_choose_arg *args;
>>>>   __u32 size;
>>>> };
>>>>
>>>> and
>>>>
>>>> void crush_init_workspace(const struct crush_map *m, struct crush_choose_arg_map *arg_map, void *v) {
>>>> ...
>>>> if (m->buckets[b]->id == arg_map[b]->bucket_id)
>>>>    w->work[b]->arg = arg_map[b];
>>>> ...
>>>> }
>>>>
>>>> with
>>>>
>>>> struct crush_work_bucket {
>>>>     __u32 perm_x; /* @x for which *perm is defined */
>>>>     __u32 perm_n; /* num elements of *perm that are permuted/defined */
>>>>     __u32 *perm;  /* Permutation of the bucket's items */
>>>>     struct crush_choose_arg *arg;
>>>> };
>>>>
>>>> There would be no need to change the code path since crush_bucket_choose 
>>>> already is given the crush_work_bucket. And crush_init_workspace already 
>>>> has logic that is algorithm dependent. And all the sanity checks could 
>>>> be done in crush_init_workspace so that the choose function only does 
>>>> what's absolutely necessary.
>>>
>>> Allowing overrides of the bucket items too makes me nervous (do we have a 
>>> use for that yet?), 
>>
>> Maybe I misunderstood what you were after with bucket_id in http://pad.ceph.com/p/crush-multiweight around here ?
>>
>> struct crush_bucket_weight_set {
>>   __u32 bucket_id;  /* used as input to hash in place of bucket id */
>>   __u32 num_positions, num_items;
>>   __u32 *data; // index like [item*num_items+pos]
>> };
> 
> It's just the bucket id that matters; the members of the bucket don't need 
> to change.  I'm not sure that the __u32 *ids above is needed for 
> anything... unless I'm misunderstanding something?

The code would look like this:

static int bucket_straw2_choose(const struct crush_bucket_straw2 *bucket,
				int x, int r, const struct crush_choose_arg_list *arg_map, int position)
{
        struct crush_choose_arg_at_position *arg = get_straw2_choose_arg(bucket, arg_map, position);
	unsigned int i, high = 0;
	unsigned int u;
	unsigned int w;
        unsigned int id;
	__s64 ln, draw, high_draw = 0;

	for (i = 0; i < bucket->h.size; i++) {
		w = arg->weights[i];
                id = arg->ids[i];
                dprintk("weight 0x%x item %d\n", w, id);
		if (w) {
			u = crush_hash32_3(bucket->h.hash, x, id, r);

I don't see how changing the bucket id alone would work otherwise since it's not used.

> 
> sage
> 
>  
>>> but otherwise this looks reasonable!
>>
>> Cool :-)
>>
>> -- 
>> Loïc Dachary, Artisan Logiciel Libre
>>

-- 
Loïc Dachary, Artisan Logiciel Libre

  reply	other threads:[~2017-04-10 14:54 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-10 14:04 crush multiweight implementation details Loic Dachary
2017-04-10 14:11 ` Sage Weil
2017-04-10 14:39   ` Loic Dachary
2017-04-10 14:44     ` Sage Weil
2017-04-10 14:53       ` Loic Dachary [this message]
2017-04-11  6:49         ` Loic Dachary
2017-04-11 13:31           ` Sage Weil

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e0486aed-57d8-ec7c-8686-3c0775f69095@dachary.org \
    --to=loic@dachary.org \
    --cc=ceph-devel@vger.kernel.org \
    --cc=sweil@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.