New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
bluestore: wrap blob id when it reaches maximum value of int16_t #15654
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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; | ||
|
@@ -2019,6 +2021,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"); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. i am not sure this compiles... it's supposed to return something. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I studied this from current codes. I think it makes assert understood easily. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @lixiaoy1 i am not questioning the |
||
} | ||
|
||
void BlueStore::ExtentMap::reshard( | ||
KeyValueDB *db, | ||
KeyValueDB::Transaction t) | ||
|
@@ -2208,12 +2232,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) { | ||
|
@@ -2267,7 +2285,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; | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit, make this method a
const
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The return variable is a right value, should we make it const? As with const it causes the warning "warning: type qualifiers ignored on function return type".
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I guess what does kefu mean is to make the method itself const, not the return value...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yeah, to be specific: