• Xiubo Li's avatar
    ceph: do not update snapshot context when there is no new snapshot · 2e586641
    Xiubo Li authored
    We will only track the uppest parent snapshot realm from which we
    need to rebuild the snapshot contexts _downward_ in hierarchy. For
    all the others having no new snapshot we will do nothing.
    
    This fix will avoid calling ceph_queue_cap_snap() on some inodes
    inappropriately. For example, with the code in mainline, suppose there
    are 2 directory hierarchies (with 6 directories total), like this:
    
    /dir_X1/dir_X2/dir_X3/
    /dir_Y1/dir_Y2/dir_Y3/
    
    Firstly, make a snapshot under /dir_X1/dir_X2/.snap/snap_X2, then make a
    root snapshot under /.snap/root_snap. Every time we make snapshots under
    /dir_Y1/..., the kclient will always try to rebuild the snap context for
    snap_X2 realm and finally will always try to queue cap snaps for dir_Y2
    and dir_Y3, which makes no sense.
    
    That's because the snap_X2's seq is 2 and root_snap's seq is 3. So when
    creating a new snapshot under /dir_Y1/... the new seq will be 4, and
    the mds will send the kclient a snapshot backtrace in _downward_
    order: seqs 4, 3.
    
    When ceph_update_snap_trace() is called, it will always rebuild the from
    the last realm, that's the root_snap. So later when rebuilding the snap
    context, the current logic will always cause it to rebuild the snap_X2
    realm and then try to queue cap snaps for all the inodes related in that
    realm, even though it's not necessary.
    
    This is accompanied by a lot of these sorts of dout messages:
    
        "ceph:  queue_cap_snap 00000000a42b796b nothing dirty|writing"
    
    Fix the logic to avoid this situation.
    
    Also, the 'invalidate' word is not precise here. In actuality, it will
    cause a rebuild of the existing snapshot contexts or just build
    non-existent ones. Rename it to 'rebuild_snapcs'.
    
    URL: https://tracker.ceph.com/issues/44100Signed-off-by: default avatarXiubo Li <xiubli@redhat.com>
    Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
    Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
    2e586641
snap.c 33.1 KB