Merge pull request #15654 from lixiaoy1/lisa_bid

bluestore: wrap blob id when it reaches maximum value of int16_t

Reviewed-by: Kefu Chai <kchai@redhat.com>
Reviewed-by: xie xingguo <xie.xingguo@zte.com.cn>
Reviewed-by: Sage Weil <sage@redhat.com>
This commit is contained in:
Sage Weil 2017-06-15 16:35:26 -05:00 committed by GitHub
commit 9f574bc826
2 changed files with 28 additions and 8 deletions

View File

@ -36,6 +36,8 @@
#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);
@ -661,7 +663,7 @@ void BlueStore::GarbageCollector::process_protrusive_extents(
}
bExit = it == bi.last_lextent;
++it;
} while(!bExit);
} while (!bExit);
}
expected_for_release += blob_expected_for_release;
expected_allocations += bi.expected_allocations;
@ -2012,6 +2014,28 @@ void BlueStore::ExtentMap::update(KeyValueDB::Transaction t,
}
}
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)
@ -2201,12 +2225,6 @@ void BlueStore::ExtentMap::reshard(
} 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) {
@ -2260,7 +2278,8 @@ void BlueStore::ExtentMap::reshard(
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;
}

View File

@ -776,6 +776,7 @@ public:
}
void update(KeyValueDB::Transaction t, bool force);
decltype(BlueStore::Blob::id) allocate_spanning_blob_id();
void reshard(
KeyValueDB *db,
KeyValueDB::Transaction t);