Whamcloud - gitweb
LU-14729 osd-ldiskfs: declare should consider concurrency 16/44316/13
authorWang Shilong <wshilong@ddn.com>
Thu, 15 Jul 2021 08:15:37 +0000 (16:15 +0800)
committerOleg Drokin <green@whamcloud.com>
Fri, 17 Sep 2021 14:06:36 +0000 (14:06 +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.

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

index 40ae417..2f3c0ff 100644 (file)
@@ -1479,7 +1479,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;
@@ -1496,7 +1501,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);
 
@@ -1517,7 +1521,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;
@@ -1956,7 +1960,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