]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: account for snapshot items when deciding to split or merge a directory
authorVenky Shankar <vshankar@redhat.com>
Wed, 16 Nov 2022 10:03:08 +0000 (05:03 -0500)
committerVenky Shankar <vshankar@redhat.com>
Wed, 25 Jan 2023 11:08:57 +0000 (16:38 +0530)
Its easy to "overload" a directory object with large number of omap entries by
doing the following (one shot or over and over again):

      - touch dir/file{0..11000} ; create 11000 files (> mds_bal_split_size)
      - mkdir dir/.snap/snap_a
      - rm -f dir/file{0..11000}

End result - the directory object would have 11000 omap entries since the MDS
does not fragment directory snapshots. If the number of such entries exceed
`osd_deep_scrub_large_omap_object_key_threshold` (default: 200000), a cluster
health warning is generated:

       Large Omap objects found in pool...

CDir::should_merge() does not take into account COW'd inodes and the frags
get merged.

Fixes: http://tracker.ceph.com/issues/55215
Signed-off-by: Venky Shankar <vshankar@redhat.com>
(cherry picked from commit 47cdb3eff519b9ea69c51a2fbc86c20da155f439)

src/mds/CDir.cc
src/mds/CDir.h

index e9b9c38d2558cfd9b47d49c4b76eb17fc80925a7..857153a4b2900fbed3d2d3fa39ed8e234b12e662 100644 (file)
@@ -3669,7 +3669,7 @@ bool CDir::should_merge() const
       return false;
   }
 
-  return (int)get_frag_size() < g_conf()->mds_bal_merge_size;
+  return ((int)get_frag_size() + (int)get_num_snap_items()) < g_conf()->mds_bal_merge_size;
 }
 
 MEMPOOL_DEFINE_OBJECT_FACTORY(CDir, co_dir, mds_co);
index 4e189e27385980d7a4a1d34d96720886798e344e..5449a5df0bda64327da53dc14a6b7b4be7858bda 100644 (file)
@@ -398,7 +398,7 @@ public:
 
   bool should_split() const {
     return g_conf()->mds_bal_split_size > 0 &&
-           (int)get_frag_size() > g_conf()->mds_bal_split_size;
+      ((int)get_frag_size() + (int)get_num_snap_items()) > g_conf()->mds_bal_split_size;
   }
   bool should_split_fast() const;
   bool should_merge() const;