]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
os/bluestore: Fix enumeration when only single key in BitmapFreelistManager
authorEvgeniy Firsov <evgeniy.firsov@sandisk.com>
Mon, 13 Jun 2016 20:00:57 +0000 (13:00 -0700)
committerEvgeniy Firsov <evgeniy.firsov@sandisk.com>
Thu, 16 Jun 2016 00:18:27 +0000 (17:18 -0700)
Signed-off-by: Evgeniy Firsov <evgeniy.firsov@sandisk.com>
src/os/bluestore/BitmapFreelistManager.cc

index c51b702aa2cb813a7abd886b93fe2e906891fe25..1b98b32957bc010dcbd23ce2712e0c84c84c1ffb 100644 (file)
@@ -176,6 +176,7 @@ void BitmapFreelistManager::enumerate_reset()
 {
   std::lock_guard<std::mutex> l(lock);
   enumerate_offset = 0;
+  enumerate_bl_pos = 0;
   enumerate_bl.clear();
 }
 
@@ -214,7 +215,7 @@ bool BitmapFreelistManager::enumerate_next(uint64_t *offset, uint64_t *length)
   std::lock_guard<std::mutex> l(lock);
 
   // initial base case is a bit awkward
-  if (enumerate_offset == 0) {
+  if (enumerate_offset == 0 && enumerate_bl_pos == 0) {
     dout(10) << __func__ << " start" << dendl;
     enumerate_p = kvdb->get_iterator(bitmap_prefix);
     enumerate_p->lower_bound(string());
@@ -225,7 +226,6 @@ bool BitmapFreelistManager::enumerate_next(uint64_t *offset, uint64_t *length)
     const char *p = k.c_str();
     _key_decode_u64(p, &enumerate_offset);
     enumerate_bl = enumerate_p->value();
-    enumerate_bl_pos = 0;
     assert(enumerate_offset == 0);
     assert(get_next_set_bit(enumerate_bl, 0) == 0);
   }
@@ -308,6 +308,7 @@ bool BitmapFreelistManager::enumerate_next(uint64_t *offset, uint64_t *length)
     dout(10) << __func__ << std::hex << " 0x" << *offset << "~" << *length
             << std::dec << dendl;
     enumerate_offset = end;
+    enumerate_bl_pos = blocks_per_key;
     assert((*offset  + *length) <= size);
     return true;
   }