Skip to content

Commit 91b0207

Browse files
committed
os/bluestore: improve ExtentMap::reshard readabilty
rename: * p -> shard * sp -> current_shard * esp -> end_shard * si_begin -> shard_index_begin * si_end -> shard_index_end * e -> extent * bs -> blob_start * be -> blob_end * sv -> extent_map_shards ... Signed-off-by: Pere Diaz Bou <[email protected]>
1 parent 859f920 commit 91b0207

File tree

1 file changed

+105
-106
lines changed

1 file changed

+105
-106
lines changed

src/os/bluestore/BlueStore.cc

Lines changed: 105 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -3573,23 +3573,23 @@ void BlueStore::ExtentMap::reshard(
35733573
<< dendl;
35743574
}
35753575
// determine shard index range
3576-
unsigned si_begin = 0, si_end = 0;
3576+
unsigned shard_index_begin = 0, shard_index_end = 0;
35773577
if (!shards.empty()) {
3578-
while (si_begin + 1 < shards.size() &&
3579-
shards[si_begin + 1].shard_info->offset <= needs_reshard_begin) {
3580-
++si_begin;
3581-
}
3582-
needs_reshard_begin = shards[si_begin].shard_info->offset;
3583-
for (si_end = si_begin; si_end < shards.size(); ++si_end) {
3584-
if (shards[si_end].shard_info->offset >= needs_reshard_end) {
3585-
needs_reshard_end = shards[si_end].shard_info->offset;
3578+
while (shard_index_begin + 1 < shards.size() &&
3579+
shards[shard_index_begin + 1].shard_info->offset <= needs_reshard_begin) {
3580+
++shard_index_begin;
3581+
}
3582+
needs_reshard_begin = shards[shard_index_begin].shard_info->offset;
3583+
for (shard_index_end = shard_index_begin; shard_index_end < shards.size(); ++shard_index_end) {
3584+
if (shards[shard_index_end].shard_info->offset >= needs_reshard_end) {
3585+
needs_reshard_end = shards[shard_index_end].shard_info->offset;
35863586
break;
35873587
}
35883588
}
3589-
if (si_end == shards.size()) {
3589+
if (shard_index_end == shards.size()) {
35903590
needs_reshard_end = OBJECT_MAX_SIZE;
35913591
}
3592-
dout(20) << __func__ << " shards [" << si_begin << "," << si_end << ")"
3592+
dout(20) << __func__ << " shards [" << shard_index_begin << "," << shard_index_end << ")"
35933593
<< " over 0x[" << std::hex << needs_reshard_begin << ","
35943594
<< needs_reshard_end << ")" << std::dec << dendl;
35953595
} else {
@@ -3610,7 +3610,7 @@ void BlueStore::ExtentMap::reshard(
36103610

36113611
// remove old keys
36123612
string key;
3613-
for (unsigned i = si_begin; i < si_end; ++i) {
3613+
for (unsigned i = shard_index_begin; i < shard_index_end; ++i) {
36143614
generate_extent_shard_key_and_apply(
36153615
onode->key, shards[i].shard_info->offset, &key,
36163616
[&](const string& final_key) {
@@ -3626,7 +3626,7 @@ void BlueStore::ExtentMap::reshard(
36263626
bytes = inline_bl.length();
36273627
extents = extent_map.size();
36283628
} else {
3629-
for (unsigned i = si_begin; i < si_end; ++i) {
3629+
for (unsigned i = shard_index_begin; i < shard_index_end; ++i) {
36303630
bytes += shards[i].shard_info->bytes;
36313631
extents += shards[i].extents;
36323632
}
@@ -3644,16 +3644,16 @@ void BlueStore::ExtentMap::reshard(
36443644
vector<bluestore_onode_t::shard_info> new_shard_info;
36453645
unsigned max_blob_end = 0;
36463646
Extent dummy(needs_reshard_begin);
3647-
for (auto e = extent_map.lower_bound(dummy);
3648-
e != extent_map.end();
3649-
++e) {
3650-
if (e->logical_offset >= needs_reshard_end) {
3647+
for (auto extent = extent_map.lower_bound(dummy);
3648+
extent != extent_map.end();
3649+
++extent) {
3650+
if (extent->logical_offset >= needs_reshard_end) {
36513651
break;
36523652
}
3653-
dout(30) << " extent " << *e << dendl;
3653+
dout(30) << " extent " << *extent << dendl;
36543654

36553655
// disfavor shard boundaries that span a blob
3656-
bool would_span = (e->logical_offset < max_blob_end) || e->blob_offset;
3656+
bool would_span = (extent->logical_offset < max_blob_end) || extent->blob_offset;
36573657
if (estimate &&
36583658
estimate + extent_avg > target + (would_span ? slop : 0)) {
36593659
// new shard
@@ -3663,28 +3663,28 @@ void BlueStore::ExtentMap::reshard(
36633663
dout(20) << __func__ << " new shard 0x" << std::hex << offset
36643664
<< std::dec << dendl;
36653665
}
3666-
offset = e->logical_offset;
3666+
offset = extent->logical_offset;
36673667
new_shard_info.emplace_back(bluestore_onode_t::shard_info());
36683668
new_shard_info.back().offset = offset;
36693669
dout(20) << __func__ << " new shard 0x" << std::hex << offset
36703670
<< std::dec << dendl;
36713671
estimate = 0;
36723672
}
36733673
estimate += extent_avg;
3674-
unsigned bs = e->blob_start();
3675-
if (bs < spanning_scan_begin) {
3676-
spanning_scan_begin = bs;
3674+
unsigned blob_start = extent->blob_start();
3675+
if (blob_start < spanning_scan_begin) {
3676+
spanning_scan_begin = blob_start;
36773677
}
3678-
uint32_t be = e->blob_end();
3679-
if (be > max_blob_end) {
3680-
max_blob_end = be;
3678+
uint32_t blob_end = extent->blob_end();
3679+
if (blob_end > max_blob_end) {
3680+
max_blob_end = blob_end;
36813681
}
3682-
if (be > spanning_scan_end) {
3683-
spanning_scan_end = be;
3682+
if (blob_end > spanning_scan_end) {
3683+
spanning_scan_end = blob_end;
36843684
}
36853685
}
3686-
if (new_shard_info.empty() && (si_begin > 0 ||
3687-
si_end < shards.size())) {
3686+
if (new_shard_info.empty() && (shard_index_begin > 0 ||
3687+
shard_index_end < shards.size())) {
36883688
// we resharded a partial range; we must produce at least one output
36893689
// shard
36903690
new_shard_info.emplace_back(bluestore_onode_t::shard_info());
@@ -3693,48 +3693,48 @@ void BlueStore::ExtentMap::reshard(
36933693
<< std::dec << " (singleton degenerate case)" << dendl;
36943694
}
36953695

3696-
auto& sv = onode->onode.extent_map_shards;
3696+
auto& extent_map_shards = onode->onode.extent_map_shards;
36973697
dout(20) << __func__ << " new " << new_shard_info << dendl;
3698-
dout(20) << __func__ << " old " << sv << dendl;
3699-
if (sv.empty()) {
3698+
dout(20) << __func__ << " old " << extent_map_shards << dendl;
3699+
if (extent_map_shards.empty()) {
37003700
// no old shards to keep
3701-
sv.swap(new_shard_info);
3701+
extent_map_shards.swap(new_shard_info);
37023702
init_shards(true, true);
37033703
} else {
37043704
// splice in new shards
3705-
sv.erase(sv.begin() + si_begin, sv.begin() + si_end);
3706-
shards.erase(shards.begin() + si_begin, shards.begin() + si_end);
3707-
sv.insert(
3708-
sv.begin() + si_begin,
3705+
extent_map_shards.erase(extent_map_shards.begin() + shard_index_begin, extent_map_shards.begin() + shard_index_end);
3706+
shards.erase(shards.begin() + shard_index_begin, shards.begin() + shard_index_end);
3707+
extent_map_shards.insert(
3708+
extent_map_shards.begin() + shard_index_begin,
37093709
new_shard_info.begin(),
37103710
new_shard_info.end());
3711-
shards.insert(shards.begin() + si_begin, new_shard_info.size(), Shard());
3712-
si_end = si_begin + new_shard_info.size();
3711+
shards.insert(shards.begin() + shard_index_begin, new_shard_info.size(), Shard());
3712+
shard_index_end = shard_index_begin + new_shard_info.size();
37133713

3714-
ceph_assert(sv.size() == shards.size());
3714+
ceph_assert(extent_map_shards.size() == shards.size());
37153715

37163716
// note that we need to update every shard_info of shards here,
3717-
// as sv might have been totally re-allocated above
3717+
// as extent_map_shards might have been totally re-allocated above
37183718
for (unsigned i = 0; i < shards.size(); i++) {
3719-
shards[i].shard_info = &sv[i];
3719+
shards[i].shard_info = &extent_map_shards[i];
37203720
}
37213721

37223722
// mark newly added shards as dirty
3723-
for (unsigned i = si_begin; i < si_end; ++i) {
3723+
for (unsigned i = shard_index_begin; i < shard_index_end; ++i) {
37243724
shards[i].loaded = true;
37253725
shards[i].dirty = true;
37263726
}
37273727
}
3728-
dout(20) << __func__ << " fin " << sv << dendl;
3728+
dout(20) << __func__ << " fin " << extent_map_shards << dendl;
37293729
inline_bl.clear();
37303730

3731-
if (sv.empty()) {
3731+
if (extent_map_shards.empty()) {
37323732
// no more shards; unspan all previously spanning blobs
3733-
auto p = spanning_blob_map.begin();
3734-
while (p != spanning_blob_map.end()) {
3735-
p->second->id = -1;
3736-
dout(30) << __func__ << " un-spanning " << *p->second << dendl;
3737-
p = spanning_blob_map.erase(p);
3733+
auto spanning_blob_it = spanning_blob_map.begin();
3734+
while (spanning_blob_it != spanning_blob_map.end()) {
3735+
spanning_blob_it->second->id = -1;
3736+
dout(30) << __func__ << " un-spanning " << *spanning_blob_it->second << dendl;
3737+
spanning_blob_it = spanning_blob_map.erase(spanning_blob_it);
37383738
}
37393739
} else {
37403740
// identify new spanning blobs
@@ -3748,78 +3748,77 @@ void BlueStore::ExtentMap::reshard(
37483748
fault_range(db, needs_reshard_end,
37493749
spanning_scan_end - needs_reshard_end);
37503750
}
3751-
auto sp = sv.begin() + si_begin;
3752-
auto esp = sv.end();
3753-
unsigned shard_start = sp->offset;
3751+
auto current_shard = extent_map_shards.begin() + shard_index_begin;
3752+
auto end_shard = extent_map_shards.end();
3753+
unsigned shard_start = current_shard->offset;
37543754
unsigned shard_end;
3755-
++sp;
3756-
if (sp == esp) {
3755+
++current_shard;
3756+
if (current_shard == end_shard) {
37573757
shard_end = OBJECT_MAX_SIZE;
37583758
} else {
3759-
shard_end = sp->offset;
3759+
shard_end = current_shard->offset;
37603760
}
3761-
Extent dummy(needs_reshard_begin);
3762-
3761+
37633762
bool was_too_many_blobs_check = false;
37643763
auto too_many_blobs_threshold =
37653764
g_conf()->bluestore_debug_too_many_blobs_threshold;
37663765
auto& dumped_onodes = onode->c->onode_space.cache->dumped_onodes;
37673766
decltype(onode->c->onode_space.cache->dumped_onodes)::value_type* oid_slot = nullptr;
37683767
decltype(onode->c->onode_space.cache->dumped_onodes)::value_type* oldest_slot = nullptr;
37693768

3770-
for (auto e = extent_map.lower_bound(dummy); e != extent_map.end(); ++e) {
3771-
if (e->logical_offset >= needs_reshard_end) {
3769+
for (auto extent = extent_map.lower_bound(Extent(needs_reshard_begin)); extent != extent_map.end(); ++extent) {
3770+
if (extent->logical_offset >= needs_reshard_end) {
37723771
break;
37733772
}
3774-
dout(30) << " extent " << *e << dendl;
3775-
while (e->logical_offset >= shard_end) {
3773+
dout(30) << " extent " << *extent << dendl;
3774+
while (extent->logical_offset >= shard_end) {
37763775
shard_start = shard_end;
3777-
ceph_assert(sp != esp);
3778-
++sp;
3779-
if (sp == esp) {
3776+
ceph_assert(current_shard != end_shard);
3777+
++current_shard;
3778+
if (current_shard == end_shard) {
37803779
shard_end = OBJECT_MAX_SIZE;
37813780
} else {
3782-
shard_end = sp->offset;
3781+
shard_end = current_shard->offset;
37833782
}
37843783
dout(30) << __func__ << " shard 0x" << std::hex << shard_start
37853784
<< " to 0x" << shard_end << std::dec << dendl;
37863785
}
37873786

3788-
if (e->blob_escapes_range(shard_start, shard_end - shard_start)) {
3789-
if (!e->blob->is_spanning()) {
3790-
// We have two options: (1) split the blob into pieces at the
3791-
// shard boundaries (and adjust extents accordingly), or (2)
3792-
// mark it spanning. We prefer to cut the blob if we can. Note that
3793-
// we may have to split it multiple times--potentially at every
3794-
// shard boundary.
3795-
bool must_span = false;
3796-
BlobRef b = e->blob;
3797-
if (b->can_split()) {
3798-
uint32_t bstart = e->blob_start();
3799-
uint32_t bend = e->blob_end();
3800-
for (const auto& sh : shards) {
3801-
if (bstart < sh.shard_info->offset &&
3802-
bend > sh.shard_info->offset) {
3803-
uint32_t blob_offset = sh.shard_info->offset - bstart;
3804-
if (b->can_split_at(blob_offset)) {
3805-
dout(20) << __func__ << " splitting blob, bstart 0x"
3806-
<< std::hex << bstart << " blob_offset 0x"
3807-
<< blob_offset << std::dec << " " << *b << dendl;
3808-
b = split_blob(b, blob_offset, sh.shard_info->offset);
3809-
// switch b to the new right-hand side, in case it
3810-
// *also* has to get split.
3811-
bstart += blob_offset;
3812-
onode->c->store->logger->inc(l_bluestore_blob_split);
3813-
} else {
3814-
must_span = true;
3815-
break;
3816-
}
3817-
}
3818-
}
3819-
} else {
3820-
must_span = true;
3821-
}
3822-
if (must_span) {
3787+
if (extent->blob_escapes_range(shard_start, shard_end - shard_start)) {
3788+
if (!extent->blob->is_spanning()) {
3789+
// We have two options: (1) split the blob into pieces at the
3790+
// shard boundaries (and adjust extents accordingly), or (2)
3791+
// mark it spanning. We prefer to cut the blob if we can. Note that
3792+
// we may have to split it multiple times--potentially at every
3793+
// shard boundary.
3794+
bool must_span = false;
3795+
BlobRef b = extent->blob;
3796+
if (b->can_split()) {
3797+
uint32_t bstart = extent->blob_start();
3798+
uint32_t bend = extent->blob_end();
3799+
for (const auto& sh : shards) {
3800+
if (bstart < sh.shard_info->offset &&
3801+
bend > sh.shard_info->offset) {
3802+
uint32_t blob_offset = sh.shard_info->offset - bstart;
3803+
if (b->can_split_at(blob_offset)) {
3804+
dout(20) << __func__ << " splitting blob, bstart 0x"
3805+
<< std::hex << bstart << " blob_offset 0x"
3806+
<< blob_offset << std::dec << " " << *b << dendl;
3807+
b = split_blob(b, blob_offset, sh.shard_info->offset);
3808+
// switch b to the new right-hand side, in case it
3809+
// *also* has to get split.
3810+
bstart += blob_offset;
3811+
onode->c->store->logger->inc(l_bluestore_blob_split);
3812+
} else {
3813+
must_span = true;
3814+
break;
3815+
}
3816+
}
3817+
}
3818+
} else {
3819+
must_span = true;
3820+
}
3821+
if (must_span) {
38233822
auto bid = allocate_spanning_blob_id();
38243823
b->id = bid;
38253824
spanning_blob_map[b->id] = b;
@@ -3843,10 +3842,10 @@ void BlueStore::ExtentMap::reshard(
38433842
}
38443843
}
38453844
} else {
3846-
if (e->blob->is_spanning()) {
3847-
spanning_blob_map.erase(e->blob->id);
3848-
e->blob->id = -1;
3849-
dout(30) << __func__ << " un-spanning " << *e->blob << dendl;
3845+
if (extent->blob->is_spanning()) {
3846+
spanning_blob_map.erase(extent->blob->id);
3847+
extent->blob->id = -1;
3848+
dout(30) << __func__ << " un-spanning " << *extent->blob << dendl;
38503849
}
38513850
}
38523851
}

0 commit comments

Comments
 (0)