From d389d3f4c4e6a4ee04f074daaff273592f4c56ee Mon Sep 17 00:00:00 2001 From: Mikhail Pershin Date: Fri, 12 Nov 2021 19:00:22 +0300 Subject: [PATCH] LU-15219 lfs: migration to DoM layout fix Migration to DoM layout from OST-striped file can skip data sync beyond DoM component if it is not initialized. Patch forces data copy prior layout merge, so new layout is initialized and contains needed data Tests 272e/272f in sanity.sh were modified to migrate data for both MDT and OST parts Lustre-change: https://review.whamcloud.com/45549 Lustre-commit: cf872dcce3b33d309d31dc5cce8794729f14a924 Fixes: 44a721b8c1 ("LU-11421 dom: manual OST-to-DOM migration via mirroring") Signed-off-by: Mikhail Pershin Change-Id: I206358e762780ab7cfaa7587888174a31bc7b196 Reviewed-by: Andreas Dilger Reviewed-on: https://review.whamcloud.com/46012 Tested-by: jenkins Reviewed-by: John L. Hammond --- lustre/tests/sanity.sh | 19 +++++++++++-------- lustre/utils/lfs.c | 22 ++++++++++++---------- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 043bc6e..0459ec6 100755 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -21857,10 +21857,10 @@ test_272e() { mkdir -p $DIR/$tdir $LFS setstripe -c 2 $dom - dd if=/dev/urandom of=$dom bs=512K count=1 oflag=direct || + dd if=/dev/urandom of=$dom bs=2M count=1 oflag=direct || error "failed to write data into $dom" local old_md5=$(md5sum $dom) - cancel_lru_locks mdc + cancel_lru_locks $LFS mirror extend -N -E 1M -L mdt -E eof -c2 $dom || error "failed mirroring to the DOM layout" @@ -21869,10 +21869,10 @@ test_272e() { $LFS mirror split --mirror-id 1 -d $dom || error "failed mirror split" - [ $($LFS getstripe -L $dom) != 'mdt' ] || - error "MDT stripe was not removed" + [[ $($LFS getstripe -L --component-start=0 $dom) == 'mdt' ]] || + error "MDT stripe wasn't set" - cancel_lru_locks mdc + cancel_lru_locks local new_md5=$(md5sum $dom) [ "$old_md5" == "$new_md5" ] || error "$old_md5 != $new_md5" @@ -21889,15 +21889,18 @@ test_272f() { mkdir -p $DIR/$tdir $LFS setstripe -c 2 $dom - dd if=/dev/urandom of=$dom bs=512K count=1 oflag=direct || + dd if=/dev/urandom of=$dom bs=2M count=1 oflag=direct || error "failed to write data into $dom" local old_md5=$(md5sum $dom) - cancel_lru_locks mdc + cancel_lru_locks $LFS migrate -E 1M -L mdt -E eof -c2 -v $dom || error "failed migrating to the DOM file" - cancel_lru_locks mdc + [[ $($LFS getstripe -L --component-start=0 $dom) == 'mdt' ]] || + error "MDT stripe wasn't set" + + cancel_lru_locks local new_md5=$(md5sum $dom) [ "$old_md5" != "$new_md5" ] && error "$old_md5 != $new_md5" diff --git a/lustre/utils/lfs.c b/lustre/utils/lfs.c index 8e9994d..c620bd6 100644 --- a/lustre/utils/lfs.c +++ b/lustre/utils/lfs.c @@ -135,9 +135,7 @@ static int lfs_pcc_delete(int argc, char **argv); static int lfs_pcc(int argc, char **argv); static int lfs_pcc_list_commands(int argc, char **argv); static int lfs_migrate_to_dom(int fd, int fdv, char *name, - __u64 migration_flags, - struct llapi_stripe_param *param, - struct llapi_layout *layout); + __u64 migration_flags); struct pool_to_id_cbdata { const char *pool; @@ -1356,8 +1354,7 @@ static int lfs_migrate(char *name, __u64 migration_flags, * if new layout used bigger DOM size, then mirroring is used */ if (dom_new > dom_cur) { - rc = lfs_migrate_to_dom(fd, fdv, name, migration_flags, param, - layout); + rc = lfs_migrate_to_dom(fd, fdv, name, migration_flags); if (rc) error_loc = "cannot migrate to DOM layout"; goto out_closed; @@ -1940,6 +1937,7 @@ static int mirror_extend_layout(char *name, struct llapi_layout *m_layout, goto out; } } + llapi_layout_comp_flags_set(m_layout, flags); rc = migrate_open_files(name, MIGRATION_NONDIRECT, NULL, m_layout, &fd, &fdv); @@ -2428,9 +2426,7 @@ int lfs_mirror_resync_file(const char *fname, struct ll_ioc_lease *ioc, __u16 *mirror_ids, int ids_nr); static int lfs_migrate_to_dom(int fd, int fdv, char *name, - __u64 migration_flags, - struct llapi_stripe_param *param, - struct llapi_layout *layout) + __u64 migration_flags) { struct ll_ioc_lease *data = NULL; int rc; @@ -2441,11 +2437,15 @@ static int lfs_migrate_to_dom(int fd, int fdv, char *name, goto out_close; } + rc = migrate_nonblock(fd, fdv); + if (rc < 0) + goto out_release; + /* Atomically put lease, merge layouts, resync and close. */ - data = calloc(1, offsetof(typeof(*data), lil_ids[1024])); + data = calloc(1, offsetof(typeof(*data), lil_ids[1])); if (!data) { error_loc = "memory allocation"; - goto out_close; + goto out_release; } data->lil_mode = LL_LEASE_UNLCK; data->lil_flags = LL_LEASE_LAYOUT_MERGE; @@ -2475,6 +2475,8 @@ static int lfs_migrate_to_dom(int fd, int fdv, char *name, error_loc = "cannot delete old layout"; goto out; +out_release: + llapi_lease_release(fd); out_close: close(fd); close(fdv); -- 1.8.3.1