]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix assert(omap_num_objs <= MAX_OBJECTS) of OpenFileTable 32757/head
authorYan, Zheng <zyan@redhat.com>
Thu, 5 Dec 2019 02:16:27 +0000 (10:16 +0800)
committerPatrick Donnelly <pdonnell@redhat.com>
Tue, 21 Jan 2020 17:10:27 +0000 (09:10 -0800)
Current behavior of the loop that commits dirty items is:

- If the last object is not full, it will be chosen for new item.
- If the last object becomes full, a new object is allocated, which
  becomes the new last object.

Above logical can make object count increase even there is free object.

Fixes: https://tracker.ceph.com/issues/36094
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
(cherry picked from commit 21b1069eab43fdc2c91915d22f45802d017702fc)

src/mds/OpenFileTable.cc

index c0f72d581d23729cd4939b39ad8563464b43634f..a9b12cd3e549d74778d589f0d85c3307d260e465 100644 (file)
@@ -465,8 +465,10 @@ void OpenFileTable::commit(MDSInternalContextBase *c, uint64_t log_seq, int op_p
        assert(it.second == DIRTY_NEW);
        // find omap object to store the key
        for (unsigned i = first_free_idx; i < omap_num_objs; i++) {
-         if (omap_num_items[i] < MAX_ITEMS_PER_OBJ)
+         if (omap_num_items[i] < MAX_ITEMS_PER_OBJ) {
            omap_idx = i;
+           break;
+         }
        }
        if (omap_idx < 0) {
          ++omap_num_objs;