[Bugs] [Bug 1473140] Fix on demand file migration from client

bugzilla at redhat.com bugzilla at redhat.com
Fri Aug 11 19:37:17 UTC 2017


https://bugzilla.redhat.com/show_bug.cgi?id=1473140



--- Comment #4 from Worker Ant <bugzilla-bot at gluster.org> ---
COMMIT: https://review.gluster.org/17837 committed in release-3.10 by
Shyamsundar Ranganathan (srangana at redhat.com) 
------
commit aab730a0cb573820bde61f337997b027fb9ccfdf
Author: Susant Palai <spalai at redhat.com>
Date:   Tue Apr 25 18:32:45 2017 +0530

    cluster/dht: fix on demand migration files from client

        On demand migration of files i.e. migration done by clients
        triggered by a setfattr was broken.

        Dependency on defrag led to crash when migration was triggered from
        client.

        Note: This functionality is not available for tiered volumes. Migration
        from tier served client will fail with ENOTSUP.

        usage (But refer to the steps mentioned below to avoid any issues) :
        setfattr -n "trusted.distribute.migrate-data" -v "1" <filename>

        The purpose of fixing the on-demand client migration was to give a
        workaround where the user has lots of empty directories compared to
        files and want to do a remove-brick process.

        Here are the steps to trigger file migration for remove-brick process
from
        client. (This is highly recommended to follow below steps as is)

        Let's say it is a replica volume and user want to remove a replica pair
        named brick1 and brick2. (Make sure healing is completed before you run
        these steps)

        Step-1: Start remove-brick process
         - gluster v remove-brick <volname> brick1 brick2 start
        Step-2: Kill the rebalance daemon
         - ps aux | grep glusterfs | grep rebalance\/ | awk '{print $2}' |
xargs kill
        Step-3: Do a fresh mount as mentioned here
         -  glusterfs -s ${localhostname} --volfile-id rebalance/$volume-name
/tmp/mount/point
        Step-4: Go to one of the bricks (among brick1 and brick2)
         - cd <brick1 path>
        Step-5: Run the following command.
         - find . -not \( -path ./.glusterfs -prune \) -type f -not -perm 01000
-exec bash -c 'setfattr -n "distribute.fix.layout" -v "1"
${mountpoint}/$(dirname '{}')' \; -exec  setfattr -n
"trusted.distribute.migrate-data" -v "1" ${mountpoint}/'{}' \;

        This command will ignore the linkto files and empty directories. Do a
fix-layout of
        the parent directory. And trigger a migration operation on the files.

        Step-6: Once this process is completed do "remove-brick force"
         - gluster v remove-brick <volname> brick1 brick2 force

        Note: Use the above script only when there are large number of empty
directories.
        Since the script does a crawl on the brick side directly and avoids
directories those
        are empty, the time spent on fixing layout on those directories are
eliminated(even if the script
        does not do fix-layout on empty directories, post remove-brick a fresh
layout will be built
        for the directory, hence not affecting application continuity).

        Detailing the expectation for hardlink migartion with this patch:
            Hardlink is migrated only for remove-brick process. It is highly
essential
        to have a new mount(step-3) for the hardlink migration to happen. Why?:
        setfattr operation is an inode based operation. Since, we are doing
setfattr from
        fuse mount here, inode_path will try to build path from the linked
dentries to the inode.
        For a file without hardlinks the path construction will be correct. But
for hardlinks,
        the inode will have multiple dentries linked.

                Without fresh mount, inode_path will always get the most
recently linked dentry.
        e.g. if there are three hardlinks named dir1/link1, dir2/link2,
dir3/link3, on a client
        where these hardlinks are looked up, inode_path will always return the
path dir3/link3
        if dir3/link3 was looked up most recently. Hence, we won't be able to
create linkto
        files for all other hardlinks on destination (read
gf_defrag_handle_hardlink for more details
        on hardlink migration).

                With a fresh mount, the lookup and setfattr become serialized.
e.g. link2 won't be
        looked up until link1 is looked up and migrated. Hence, inode_path will
always have the correct
        path, in this case link1 dentry is picked up(as this is the most
recently looked up inode) and
        the path is built right.

        Note: If you run the above script on an existing mount(all entries
looked up), hard links may
        not be migrated, but there should not be any other issue. Please raise
a bug, if you find any
        issue.

        Tests: Manual

    > Change-Id: I9854cdd4955d9e24494f348fb29ba856ea7ac50a
    > BUG: 1450975
    > Signed-off-by: Susant Palai <spalai at redhat.com>
    > Reviewed-on: https://review.gluster.org/17115
    > NetBSD-regression: NetBSD Build System <jenkins at build.gluster.org>
    > CentOS-regression: Gluster Build System <jenkins at build.gluster.org>
    > Smoke: Gluster Build System <jenkins at build.gluster.org>
    > Reviewed-by: Raghavendra G <rgowdapp at redhat.com>
    > Signed-off-by: Susant Palai <spalai at redhat.com>

    Change-Id: I9854cdd4955d9e24494f348fb29ba856ea7ac50a
    BUG: 1473140
    Signed-off-by: Susant Palai <spalai at redhat.com>
    Reviewed-on: https://review.gluster.org/17837
    CentOS-regression: Gluster Build System <jenkins at build.gluster.org>
    Smoke: Gluster Build System <jenkins at build.gluster.org>
    Reviewed-by: Shyamsundar Ranganathan <srangana at redhat.com>

-- 
You are receiving this mail because:
You are on the CC list for the bug.
Unsubscribe from this bug https://bugzilla.redhat.com/token.cgi?t=EQpZ1jYOZc&a=cc_unsubscribe


More information about the Bugs mailing list