Whamcloud - gitweb
LU-14729 osd-ldiskfs: declare should consider concurrency
authorWang Shilong <wshilong@ddn.com>
Thu, 15 Jul 2021 08:15:37 +0000 (16:15 +0800)
committerAndreas Dilger <adilger@whamcloud.com>
Fri, 1 Oct 2021 00:12:33 +0000 (00:12 +0000)
Write in Lustre OSD is different than Ext4 since write
is serialized in local filesystem, however in OSD side,

many concurrent threads may grow tree before transaction starts.

Also fix to use @dirty_groups rather than @extents, remove
unnecessary @depth assignment.

Lustre-change: https://review.whamcloud.com/44316
Lustre-commit: 934758366dbde211743d53b8c048c57819603cb3

Fixes: 9810341a8 ("LU-14729 osd-ldiskfs: fix to declare write commits")
Signed-off-by: Wang Shilong <wshilong@ddn.com>
Change-Id: I1e0fc9069a579736a74b0ba2607056fe980574c3
Reviewed-by: Li Dongyang <dongyangli@ddn.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/45077
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Andreas Dilger <adilger@whamcloud.com>
lustre/osd-ldiskfs/osd_io.c

index 5e1e635..0c17451 100644 (file)
@@ -1480,7 +1480,12 @@ static int osd_declare_write_commit(const struct lu_env *env,
         * split more than once, but this is really rare.
         */
        if (LDISKFS_I(inode)->i_flags & LDISKFS_EXTENTS_FL) {
+               /*
+                * many concurrent threads may grow tree by the time
+                * our transaction starts. so, consider 2 is a min depth.
+                */
                depth = ext_depth(inode);
+               depth = min(max(depth, 1) + 1, LDISKFS_MAX_EXTENT_DEPTH);
                if (extents <= 1) {
                        credits += depth * 2 * extents;
                        new_meta = depth;
@@ -1497,7 +1502,6 @@ static int osd_declare_write_commit(const struct lu_env *env,
                new_meta = DIV_ROUND_UP(new_blocks,
                                LDISKFS_ADDR_PER_BLOCK(inode->i_sb)) + 4;
                credits += new_meta;
-               depth = 3;
        }
        dirty_groups += (extents + new_meta);
 
@@ -1518,7 +1522,7 @@ static int osd_declare_write_commit(const struct lu_env *env,
                credits += dirty_groups;
 
        /* we can't dirty more gd blocks than exist */
-       if (extents > LDISKFS_SB(osd_sb(osd))->s_gdb_count)
+       if (dirty_groups > LDISKFS_SB(osd_sb(osd))->s_gdb_count)
                credits += LDISKFS_SB(osd_sb(osd))->s_gdb_count;
        else
                credits += dirty_groups;
@@ -1957,7 +1961,7 @@ static ssize_t osd_declare_write(const struct lu_env *env, struct dt_object *dt,
                 * level.
                 */
                depth = inode != NULL ? ext_depth(inode) : 0;
-               depth = max(depth, 1) + 1;
+               depth = min(max(depth, 1) + 1, LDISKFS_MAX_EXTENT_DEPTH);
                credits = depth;
                /* if not append, then split may need to modify
                 * existing blocks moving entries into the new ones