@@ -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