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>
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);
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;