#define dout_context cct
#define dout_subsys ceph_subsys_bluestore
+using bid_t = decltype(BlueStore::Blob::id);
+
// bluestore_cache_onode
MEMPOOL_DEFINE_OBJECT_FACTORY(BlueStore::Onode, bluestore_onode,
bluestore_cache_onode);
}
bExit = it == bi.last_lextent;
++it;
- } while(!bExit);
+ } while (!bExit);
}
expected_for_release += blob_expected_for_release;
expected_allocations += bi.expected_allocations;
}
}
+bid_t BlueStore::ExtentMap::allocate_spanning_blob_id()
+{
+ if (spanning_blob_map.empty())
+ return 0;
+ bid_t bid = spanning_blob_map.rbegin()->first + 1;
+ // bid is valid and available.
+ if (bid >= 0)
+ return bid;
+ // Find next unused bid;
+ bid = rand() % (numeric_limits<bid_t>::max() + 1);
+ const auto begin_bid = bid;
+ do {
+ if (!spanning_blob_map.count(bid))
+ return bid;
+ else {
+ bid++;
+ if (bid < 0) bid = 0;
+ }
+ } while (bid != begin_bid);
+ assert(0 == "no available blob id");
+}
+
void BlueStore::ExtentMap::reshard(
KeyValueDB *db,
KeyValueDB::Transaction t)
} else {
shard_end = sp->offset;
}
- int bid;
- if (spanning_blob_map.empty()) {
- bid = 0;
- } else {
- bid = spanning_blob_map.rbegin()->first + 1;
- }
Extent dummy(needs_reshard_begin);
for (auto e = extent_map.lower_bound(dummy); e != extent_map.end(); ++e) {
if (e->logical_offset >= needs_reshard_end) {
must_span = true;
}
if (must_span) {
- b->id = bid++;
+ auto bid = allocate_spanning_blob_id();
+ b->id = bid;
spanning_blob_map[b->id] = b;
dout(20) << __func__ << " adding spanning " << *b << dendl;
}