[dm-devel] [PATCH] persistent-data: fix bug about btree of updating internal node's minima key in btree_split_beneath.
monty
monty_pavel at sina.com
Tue Dec 19 13:48:23 UTC 2017
Look forward to your test result. The scene I found with problem as follows:
note:
1. key size: 8;
2. value size: 8;
3. max_entries=252;
4. one level btree's root is A.
operations:
1. A's info:
nr_entries=252
keys:127-378
2. insert 379 to btree
A'(127,253)
|
-------- ---------
| |
B(127-252) C(253-379)
3. insert 1-126 to btree
A'(127,253)
|
-------- ----------
| |
B(1-252) C(253-379)
3. insert 0 to btree
A'(127,127,253)
|
-------- -----------------
| | |
B(0-126) B'(127-252) C(253-379)
4.lookup(key=127), we can not find 127 in btree.
On Mon, Dec 18, 2017 at 05:34:09PM +0000, Joe Thornber wrote:
>
> On Mon, Dec 18, 2017 at 05:13:08PM +0000, Joe Thornber wrote:
> > Hi Monty,
> >
> > On Mon, Dec 18, 2017 at 04:27:58PM -0500, monty wrote:
> > > Subject: [PATCH] persistent-data: fix bug about btree of updating internal node's minima
> > > key in btree_split_beneath.
> > >
> > > fix bug about btree_split_beneath func, this bug may cause a key had
> > > been inserted to btree, but dm_btree_lookup can not find the key in
> > > btree later.
> >
> > I think you've spotted a real issue, but I don't like where you've
> > fixed up the btree_split_beneath() function. I'll post a patch in a
> > bit.
>
> Patch below. This is completely untested. I'll test tomorrow and update.
>
> Instead of fiddling with the spine we unlock both the new children and
> let the current spine entry (which now has just two entries) continue.
> That way the bounds on the lowest key is adjusted within the main loop
> of btree_insert_raw().
>
> - Joe
>
>
>
> diff --git a/drivers/md/persistent-data/dm-btree.c b/drivers/md/persistent-data/dm-btree.c
> index 416060c2570..ee2c01685f5 100644
> --- a/drivers/md/persistent-data/dm-btree.c
> +++ b/drivers/md/persistent-data/dm-btree.c
> @@ -572,23 +572,8 @@ static int btree_split_beneath(struct shadow_spine *s, uint64_t key)
> pn->keys[1] = rn->keys[0];
> memcpy_disk(value_ptr(pn, 1), &val, sizeof(__le64));
>
> - /*
> - * rejig the spine. This is ugly, since it knows too
> - * much about the spine
> - */
> - if (s->nodes[0] != new_parent) {
> - unlock_block(s->info, s->nodes[0]);
> - s->nodes[0] = new_parent;
> - }
> - if (key < le64_to_cpu(rn->keys[0])) {
> - unlock_block(s->info, right);
> - s->nodes[1] = left;
> - } else {
> - unlock_block(s->info, left);
> - s->nodes[1] = right;
> - }
> - s->count = 2;
> -
> + unlock_block(s->info, left);
> + unlock_block(s->info, right);
> return 0;
> }
>
>
>
>
More information about the dm-devel
mailing list