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