]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: properly respect min_length when analysing partially free
authorIgor Fedotov <ifedotov@suse.com>
Thu, 31 May 2018 10:53:37 +0000 (13:53 +0300)
committerIgor Fedotov <ifedotov@suse.com>
Tue, 12 Jun 2018 11:48:45 +0000 (14:48 +0300)
slots in bitmap allocator.

Signed-off-by: Igor Fedotov <ifedotov@suse.com>
src/os/bluestore/fastbmap_allocator_impl.cc

index 08ab2b69dfac91acc7582973c697e431c99f75cb..aace813f30a5f4e8c34a137a59a0a239dd575d7d 100755 (executable)
@@ -70,7 +70,9 @@ void AllocatorLevel01Loose::_analyze_partials(uint64_t pos_start,
             ctx->affordable_l0_pos_start = p0;
           }
         }
-        if (l > ctx->min_affordable_len) {
+        if (l >= min_length &&
+           (ctx->min_affordable_len == 0 ||
+             (l < ctx->min_affordable_len))) {
           ctx->min_affordable_len = l;
           ctx->min_affordable_l0_pos_start = p0;
         }
@@ -237,7 +239,8 @@ interval_t AllocatorLevel01Loose::_allocate_l1(uint64_t length,
       res = interval_t(ctx.affordable_l0_pos_start * l0_granularity, length);
       return res;
     }
-    if (ctx.min_affordable_len >= min_length) {
+    if (ctx.min_affordable_len) {
+      assert(ctx.min_affordable_len >= min_length);
       assert((ctx.min_affordable_len % l0_granularity) == 0);
       auto pos_end = ctx.min_affordable_l0_pos_start +
        ctx.min_affordable_len / l0_granularity;
@@ -271,7 +274,8 @@ interval_t AllocatorLevel01Loose::_allocate_l1(uint64_t length,
       res = interval_t(ctx.free_l1_pos * l1_granularity, l);
       return res;
     }
-    if (ctx.min_affordable_len >= min_length) {
+    if (ctx.min_affordable_len) {
+      assert(ctx.min_affordable_len >= min_length);
       assert((ctx.min_affordable_len % l0_granularity) == 0);
       auto pos_end = ctx.min_affordable_l0_pos_start +
        ctx.min_affordable_len / l0_granularity;