git: sbin/hammer: Don't always print BC error on nodes with 0 count

Tomohiro Kusumi tkusumi at crater.dragonflybsd.org
Tue Mar 29 06:23:28 PDT 2016


commit 8260ce22ad9c50711878c233095f7f3fb4a82ac2
Author: Tomohiro Kusumi <kusumi.tomohiro at gmail.com>
Date:   Tue Mar 29 03:43:29 2016 +0900

    sbin/hammer: Don't always print BC error on nodes with 0 count
    
    B-Tree nodes having 0 count ("BC") isn't necessarily an error.
    This is rare case, but hammer prune (or other operations that
    delete nodes) could happen to leave B-Tree nodes with 0 count.
    
    In the following hammer show result, there is repetition of
    L14298648..14298661 pattern (which includes "BC") for another
    25 times after below three. This structure tells nodes with
    "BC" aren't generated by node split, because node split always
    results in having at least two nodes (original and new node)
    at the same level under the parent node of the original node.
    It was probably generated by something happened after split.
    
    The following path [B] seems to be the case that could genearate
    this structure. As shown in [A] it usually recursively calls
    node remove path against its parent node until it first hits
    a parent with >1 count. However, as shown in [B] if it fails
    to get a lock while in the recursive path, the path ends there
    before it hits >1 count node. This results in losing a chance
    to erase a node element within the first >1 count node that
    has a pointer to all the children so far including the 0 count
    node prune ioctl was originally trying to delete, and leaves
    the 0 count node along with (1 or more) parent 1 count node(s).
    
    hammer show should recognize this and not mark it as an error
    since this is intended behavior.
    
    [A]
    hammer_ioc_prune()
    -> hammer_delete_at_cursor(HAMMER_DELETE_DESTROY)
       -> hammer_btree_delete()  /* --ondisk->count == 0 */
          -> btree_remove()  /* parent->ondisk->count == 1 */
             -> hammer_cursor_up_locked() /* success */
                -> btree_remove() /* parent->ondisk->count == 1 */
                   -> hammer_cursor_up_locked() /* success */
                      -> btree_remove()  /* parent->ondisk->count == 1 */
                         -> hammer_cursor_up_locked() /* success */
                            -> btree_remove() /* parent->ondisk->count > 1 */
                               -> bcopy(&elm[1], &elm[0], newsize);
                                  ondisk->count--;
                               ...
                            ...
                         ...
                      ...
    [B]
    hammer_ioc_prune()
    -> hammer_delete_at_cursor(HAMMER_DELETE_DESTROY)
       -> hammer_btree_delete()  /* --ondisk->count == 0 */
          -> btree_remove()  /* parent->ondisk->count == 1 */
             -> hammer_cursor_up_locked() /* failed */
                /* recursive call ends here without erasing elm in parent */
    
    ---
      ...
      14298558              NODE 8000003e99042000 cnt=43 p=8000003e8d7f7000 type=I depth=1 mirror=00000005127ef970 fill=z8:v0:0:32050:270336=70% {
      14298559         G------ ELM  0 I lo=00040002 obj=0000000460f4fda4 rt=10 key=000000000000a000 tid=0000000460f8f990
      14298560                          del=0000000000000000 ot=00 suboff=8000003e99041000 mirror=0000000466e4b890
      14298561         G------ ELM  1 I lo=00040002 obj=00000004627d568b rt=10 key=00000000000005d0 tid=00000004627f52d0
      14298562                          del=0000000000000000 ot=00 suboff=8000003e99044000 mirror=000000046b5c6600
      14298563         G------ ELM  2 I lo=00040002 obj=0000000463ed92b1 rt=10 key=00000000000b2000 tid=0000000463f691c0
      14298564                          del=0000000000000000 ot=00 suboff=8000003e99046000 mirror=000000046b5ce630
      <snip>
      ...
      14298639         G------ ELM 40 I lo=00040002 obj=000000050c1bac40 rt=10 key=0000000000056000 tid=000000050d52dad0
      14298640                          del=0000000000000000 ot=00 suboff=8000003e997f5000 mirror=00000005127ef970
      14298641         G------ ELM 41 I lo=00040002 obj=00000005107f5a71 rt=10 key=0000000000004000 tid=000000051083d600
      14298642                          del=0000000000000000 ot=00 suboff=8000003e99b0e000 mirror=00000005127ef910
      14298643         G------ ELM 42 I lo=00040002 obj=000000051158802f rt=10 key=000000000000e000 tid=00000005115c01a0
      14298644                          del=0000000000000000 ot=00 suboff=8000003e9ac72000 mirror=00000005127ef970
      14298645         G------ RBN 43 * lo=ffffffff obj=7fffffffffffffff rt=ffff key=7fffffffffffffff tid=ffffffffffffffff
      14298646                        < del=0000000000000000 ot=00 suboff=0000000000000000 mirror=0000000000000000
      14298647              }
      14298648                      NODE 8000003e99041000 cnt=01 p=8000003e99042000 type=I depth=2 mirror=0000000466e4b890 fill=z8:v0:0:32050:266240=70% {
      14298649                 G------ ELM  0 I lo=00040002 obj=00000004623f3e4f rt=10 key=0000000000006000 tid=00000004627cd020
      14298650                                  del=0000000000000000 ot=00 suboff=8000003e99040000 mirror=0000000466e4b890
      14298651                 G------ RBN  1 * lo=00040002 obj=00000004627d568b rt=10 key=00000000000005d0 tid=00000004627f52d0
      14298652                                  del=0000000000000000 ot=00 suboff=0000000000000000 mirror=0000000463507320
      14298653                      }
      14298654                              NODE 8000003e99040000 cnt=01 p=8000003e99041000 type=I depth=3 mirror=000000046347eff0 fill=z8:v0:0:32050:262144=70% {
      14298655                         G------ ELM  0 L lo=00040002 obj=00000004626043ca rt=10 key=0000000000006000 tid=00000004627d5070
      14298656                                          del=0000000000000000 ot=00 suboff=800000395b96a000 mirror=000000046347eff0
      14298657                         G------ RBN  1 * lo=00040002 obj=00000004627d568b rt=10 key=00000000000005d0 tid=00000004627f52d0
      14298658                                          del=0000000000000000 ot=00 suboff=0000000000000000 mirror=0000000000000000
      14298659                              }
    * 14298660                                 BC   NODE 800000395b96a000 cnt=00 p=8000003e99040000 type=L depth=4 mirror=000000046347eff0 fill=z8:v0:0:29367:1482752=1% {
      14298661                                      }
      14298662                      NODE 8000003e99044000 cnt=01 p=8000003e99042000 type=I depth=2 mirror=000000046b5c6600 fill=z8:v0:0:32050:278528=70% {
      14298663                 G------ ELM  0 I lo=00040002 obj=0000000463b8866f rt=10 key=000000000000e000 tid=0000000463bc0550
      14298664                                  del=0000000000000000 ot=00 suboff=8000003e99043000 mirror=000000046b5c65e0
      14298665                 G------ RBN  1 * lo=00040002 obj=0000000463ed92b1 rt=10 key=00000000000b2000 tid=0000000463f691c0
      14298666                                  del=0000000000000000 ot=00 suboff=0000000000000000 mirror=0000000464009780
      14298667                      }
      14298668                              NODE 8000003e99043000 cnt=01 p=8000003e99044000 type=I depth=3 mirror=000000046b5b6540 fill=z8:v0:0:32050:274432=70% {
      14298669                         G------ ELM  0 L lo=00040002 obj=0000000463ba883a rt=10 key=0000000000052000 tid=0000000463bc0570
      14298670                                          del=0000000000000000 ot=00 suboff=800000395c948000 mirror=0000000467587c20
      14298671                         G------ RBN  1 * lo=00040002 obj=0000000463ed92b1 rt=10 key=00000000000b2000 tid=0000000463f691c0
      14298672                                          del=0000000000000000 ot=00 suboff=0000000000000000 mirror=0000000000000000
      14298673                              }
    * 14298674                                 BC   NODE 800000395c948000 cnt=00 p=8000003e99043000 type=L depth=4 mirror=0000000467587c20 fill=z8:v0:0:29369:1343488=1% {
      14298675                                      }
      14298676                      NODE 8000003e99046000 cnt=01 p=8000003e99042000 type=I depth=2 mirror=000000046b5ce630 fill=z8:v0:0:32050:286720=70% {
      14298677                 G------ ELM  0 I lo=00040002 obj=0000000463f5167f rt=10 key=0000000000d28000 tid=0000000463f69160
      14298678                                  del=0000000000000000 ot=00 suboff=8000003e99045000 mirror=000000046b5c6600
      14298679                 G------ RBN  1 * lo=00040002 obj=0000000464a2c0bb rt=10 key=0000000000000f60 tid=0000000464a9c460
      14298680                                  del=0000000000000000 ot=00 suboff=0000000000000000 mirror=0000000466a39890
      14298681                      }
      14298682                              NODE 8000003e99045000 cnt=01 p=8000003e99046000 type=I depth=3 mirror=0000000467587fc0 fill=z8:v0:0:32050:282624=70% {
      14298683                         G------ ELM  0 L lo=00040002 obj=0000000463f5944f rt=10 key=0000000000b18000 tid=0000000463f691c0
      14298684                                          del=0000000000000000 ot=00 suboff=800000395cb74000 mirror=0000000467587dc0
      14298685                         G------ RBN  1 * lo=00040002 obj=0000000464a2c0bb rt=10 key=0000000000000f60 tid=0000000464a9c460
      14298686                                          del=0000000000000000 ot=00 suboff=0000000000000000 mirror=0000000000000000
      14298687                              }
    * 14298688                                 BC   NODE 800000395cb74000 cnt=00 p=8000003e99045000 type=L depth=4 mirror=0000000467587dc0 fill=z8:v0:0:29369:3620864=1% {
      14298689                                      }
      ...

Summary of changes:
 sbin/hammer/cmd_show.c        | 38 +++++++++++++++++++++++++++++++-------
 sys/vfs/hammer/hammer_btree.c |  8 ++++++--
 2 files changed, 37 insertions(+), 9 deletions(-)

http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/8260ce22ad9c50711878c233095f7f3fb4a82ac2


-- 
DragonFly BSD source repository


More information about the Commits mailing list