All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alex Lyakas <alex.bolshoy.btrfs@gmail.com>
To: Alexander Block <ablock84@googlemail.com>
Cc: linux-btrfs@vger.kernel.org
Subject: Re: [RFC PATCH 5/7] Btrfs: add btrfs_compare_trees function
Date: Thu, 5 Jul 2012 15:19:21 +0300	[thread overview]
Message-ID: <CAHf9xvbH_ukL75H2+g9SscbRfqD3WSLd5xjadYxjGQ1YgjMi6g@mail.gmail.com> (raw)
In-Reply-To: <CAB9VWqCLC-2Kj-N5U-ZRrVjgrrTpRJze2fUBiNzaZQxyFCdvfg@mail.gmail.com>

Alexander,

>>> +               if (advance_left && !left_end_reached) {
>>> +                       ret = tree_advance(left_root, left_path, &left_level,
>>> +                                       left_root_level,
>>> +                                       advance_left != ADVANCE_ONLY_NEXT,
>>> +                                       &left_key);
>>> +                       if (ret < 0)
>>> +                               left_end_reached = ADVANCE;
>>> +                       advance_left = 0;
>>> +               }
>>> +               if (advance_right && !right_end_reached) {
>>> +                       ret = tree_advance(right_root, right_path, &right_level,
>>> +                                       right_root_level,
>>> +                                       advance_right != ADVANCE_ONLY_NEXT,
>>> +                                       &right_key);
>>> +                       if (ret < 0)
>>> +                               right_end_reached = ADVANCE;
>>> +                       advance_right = 0;
>>> +               }
>> Do you think it's worth it to put a check/warning/smth before that,
>> that either advance_right or advance_left is non-zero, or we have
>> reached ends in both trees?
>>
>>
> Having the left or right end reached before the other sides end is
> reached is something that is completely normal and expected.
What I meant was that when we start the loop, either advance_left!=0
or advance_right!=0. So I thought it would be good to notice that.
However, on the very first loop iteration, both of them are zero, so I
was wrong.


>>> +               } else if (left_level == right_level) {
>> ...
>>> +               } else if (left_level < right_level) {
>>> +                       advance_right = ADVANCE;
>>> +               } else {
>>> +                       advance_left = ADVANCE;
>>> +               }
>> Can you pls explain why it is correct?
>> Why if we are on lower level in the "newer" tree than we are in the
>> "older" tree, we need to advance the "older" tree? I.e., why this
>> implies that we are on the lower key in the "older" tree? (And
>> vice-versa). I.e., how difference in levels indicates relation between
>> keys?
> Difference in levels has no relation to the keys. These advances
> basically try to keep the two trees positions "in-sync". The compare
> always tries to get both trees to a point where they are at the same
> level, as only then we can compare keys. Also, the two trees may have
> different root levels, this code also handles that case.

Can you pls tell me if I understand your algorithm correctly:
Basically, we need to get to the leaf levels and compare the items in
the leafs. Only when we are on the leaf level, we can safely signal
deletions and additions of items, not on upper levels.
There is only one optimization: we want to find nodes that are shared,
and such nodes can be only on the same level. To make this
optimization happen, we try to always match the levels of the tree.
This is the purpose of:
		} else if (left_level < right_level) {
			advance_right = ADVANCE;
		} else {
			advance_left = ADVANCE;
		}

Note: I think that instead of comparing levels, we could always
compare keys and ADVANCE the lower key. (Because on ADVANCing we never
loose information, we just get closer to leafs, so we don't skip
anything.) But then there is less chance of optimization. Does this
make sense? So what you said that we can compare keys only on the same
level...we can always compare them, correct?

I will now study the rest of your patchset.

Thanks!
Alex.

  parent reply	other threads:[~2012-07-05 12:19 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-04 13:38 [RFC PATCH 0/7] Experimental btrfs send/receive (kernel side) Alexander Block
2012-07-04 13:38 ` [RFC PATCH 1/7] Btrfs: use _IOR for BTRFS_IOC_SUBVOL_GETFLAGS Alexander Block
2012-07-04 13:38 ` [RFC PATCH 2/7] Btrfs: add helper for tree enumeration Alexander Block
2012-07-04 13:38 ` [RFC PATCH 3/7] Btrfs: make iref_to_path non static Alexander Block
2012-07-04 13:38 ` [RFC PATCH 4/7] Btrfs: introduce subvol uuids and times Alexander Block
2012-07-05 11:51   ` Alexander Block
2012-07-05 17:08   ` Zach Brown
2012-07-05 17:14     ` Alexander Block
2012-07-05 17:20       ` Zach Brown
2012-07-05 18:33         ` Ilya Dryomov
2012-07-05 18:37           ` Zach Brown
2012-07-05 18:59             ` Ilya Dryomov
2012-07-05 19:01               ` Zach Brown
2012-07-05 19:18                 ` Alexander Block
2012-07-05 19:24                   ` Ilya Dryomov
2012-07-05 19:43                     ` Alexander Block
2012-07-16 14:56   ` Arne Jansen
2012-07-23 19:41     ` Alexander Block
2012-07-24  5:55       ` Arne Jansen
2012-07-25 10:51         ` Alexander Block
2012-07-04 13:38 ` [RFC PATCH 5/7] Btrfs: add btrfs_compare_trees function Alexander Block
2012-07-04 18:27   ` Alex Lyakas
2012-07-04 19:49     ` Alexander Block
2012-07-04 19:13   ` Alex Lyakas
2012-07-04 20:18     ` Alexander Block
2012-07-04 23:31       ` David Sterba
2012-07-05 12:19       ` Alex Lyakas [this message]
2012-07-05 12:47         ` Alexander Block
2012-07-05 13:04           ` Alex Lyakas
2012-07-04 13:38 ` [RFC PATCH 6/7] Btrfs: introduce BTRFS_IOC_SEND for btrfs send/receive (part 1) Alexander Block
2012-07-18  6:59   ` Arne Jansen
2012-07-25 17:33     ` Alexander Block
2012-07-21 10:53   ` Arne Jansen
2012-07-04 13:38 ` [RFC PATCH 7/7] Btrfs: introduce BTRFS_IOC_SEND for btrfs send/receive (part 2) Alexander Block
2012-07-10 15:26   ` Alex Lyakas
2012-07-25 13:37     ` Alexander Block
2012-07-25 17:20       ` Alex Lyakas
2012-07-25 17:41         ` Alexander Block
2012-07-23 11:16   ` Arne Jansen
2012-07-23 15:28     ` Alex Lyakas
2012-07-28 13:49     ` Alexander Block
2012-07-23 15:17   ` Alex Lyakas
2012-08-01 12:54     ` Alexander Block

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=CAHf9xvbH_ukL75H2+g9SscbRfqD3WSLd5xjadYxjGQ1YgjMi6g@mail.gmail.com \
    --to=alex.bolshoy.btrfs@gmail.com \
    --cc=ablock84@googlemail.com \
    --cc=linux-btrfs@vger.kernel.org \
    /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.