Skip to content

Commit 74be30c

Browse files
committed
osd/ReplicatedBackend: use readv to build push_op
Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
1 parent cbf36a0 commit 74be30c

File tree

1 file changed

+18
-33
lines changed

1 file changed

+18
-33
lines changed

src/osd/ReplicatedBackend.cc

Lines changed: 18 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2085,41 +2085,26 @@ int ReplicatedBackend::build_push_op(const ObjectRecoveryInfo &recovery_info,
20852085
out_op->data_included.clear();
20862086
}
20872087

2088-
for (interval_set<uint64_t>::iterator p = out_op->data_included.begin();
2089-
p != out_op->data_included.end();
2090-
++p) {
2091-
bufferlist bit;
2092-
int r = store->read(ch, ghobject_t(recovery_info.soid),
2093-
p.get_start(), p.get_len(), bit,
2094-
cache_dont_need ? CEPH_OSD_OP_FLAG_FADVISE_DONTNEED: 0);
2095-
if (cct->_conf->osd_debug_random_push_read_error &&
2088+
auto origin_size = out_op->data_included.size();
2089+
bufferlist bit;
2090+
int r = store->readv(ch, ghobject_t(recovery_info.soid),
2091+
out_op->data_included, bit,
2092+
cache_dont_need ? CEPH_OSD_OP_FLAG_FADVISE_DONTNEED: 0);
2093+
if (cct->_conf->osd_debug_random_push_read_error &&
20962094
(rand() % (int)(cct->_conf->osd_debug_random_push_read_error * 100.0)) == 0) {
2097-
dout(0) << __func__ << ": inject EIO " << recovery_info.soid << dendl;
2098-
r = -EIO;
2099-
}
2100-
if (r < 0) {
2101-
return r;
2102-
}
2103-
if (p.get_len() != bit.length()) {
2104-
dout(10) << " extent " << p.get_start() << "~" << p.get_len()
2105-
<< " is actually " << p.get_start() << "~" << bit.length()
2106-
<< dendl;
2107-
interval_set<uint64_t>::iterator save = p++;
2108-
if (bit.length() == 0)
2109-
out_op->data_included.erase(save); //Remove this empty interval
2110-
else
2111-
save.set_len(bit.length());
2112-
// Remove any other intervals present
2113-
while (p != out_op->data_included.end()) {
2114-
interval_set<uint64_t>::iterator save = p++;
2115-
out_op->data_included.erase(save);
2116-
}
2117-
new_progress.data_complete = true;
2118-
out_op->data.claim_append(bit);
2119-
break;
2120-
}
2121-
out_op->data.claim_append(bit);
2095+
dout(0) << __func__ << ": inject EIO " << recovery_info.soid << dendl;
2096+
r = -EIO;
2097+
}
2098+
if (r < 0) {
2099+
return r;
2100+
}
2101+
if (out_op->data_included.size() != origin_size) {
2102+
dout(10) << __func__ << " some extents get pruned "
2103+
<< out_op->data_included.size() << "/" << origin_size
2104+
<< dendl;
2105+
new_progress.data_complete = true;
21222106
}
2107+
out_op->data.claim_append(bit);
21232108
if (progress.first && !out_op->data_included.empty() &&
21242109
out_op->data_included.begin().get_start() == 0 &&
21252110
out_op->data.length() == oi.size && oi.is_data_digest()) {

0 commit comments

Comments
 (0)