bufferlist bl, hdrbl;
int r;
__u64 pos = 0;
+
+ uint32_t fadvise_flags = CEPH_OSD_OP_FLAG_FADVISE_SEQUENTIAL | CEPH_OSD_OP_FLAG_FADVISE_DONTNEED;
+
while ( (r = store->read(
- coll,
- ghobject_t(
- poid, ghobject_t::NO_GEN, get_parent()->whoami_shard().shard),
- pos,
- cct->_conf->osd_deep_scrub_stride, bl,
- true)) > 0) {
+ coll,
+ ghobject_t(
+ poid, ghobject_t::NO_GEN, get_parent()->whoami_shard().shard),
+ pos,
+ cct->_conf->osd_deep_scrub_stride, bl,
+ fadvise_flags, true)) > 0) {
handle.reset_tp_timeout();
h << bl;
pos += bl.length();
pi.head_ctx = headctx;
pi.recovery_info = op.recovery_info;
pi.recovery_progress = op.recovery_progress;
+ pi.cache_dont_need = h->cache_dont_need;
}
/*
*/
void ReplicatedBackend::prep_push_to_replica(
ObjectContextRef obc, const hobject_t& soid, pg_shard_t peer,
- PushOp *pop)
+ PushOp *pop, bool cache_dont_need)
{
const object_info_t& oi = obc->obs.oi;
uint64_t size = obc->obs.oi.size;
data_subset, clone_subsets);
}
- prep_push(obc, soid, peer, oi.version, data_subset, clone_subsets, pop);
+ prep_push(obc, soid, peer, oi.version, data_subset, clone_subsets, pop, cache_dont_need);
}
void ReplicatedBackend::prep_push(ObjectContextRef obc,
eversion_t version,
interval_set<uint64_t> &data_subset,
map<hobject_t, interval_set<uint64_t> >& clone_subsets,
- PushOp *pop)
+ PushOp *pop, bool cache_dont_need)
{
get_parent()->begin_peer_recover(peer, soid);
// take note.
pi.recovery_progress,
&new_progress,
pop,
- &(pi.stat));
+ &(pi.stat), cache_dont_need);
assert(r == 0);
pi.recovery_progress = new_progress;
}
ObjectRecoveryInfo &recovery_info,
bool first,
bool complete,
+ bool cache_dont_need,
const interval_set<uint64_t> &intervals_included,
bufferlist data_included,
bufferlist omap_header,
t->omap_setheader(coll, ghobject_t(target_oid), omap_header);
}
uint64_t off = 0;
+ uint32_t fadvise_flags = CEPH_OSD_OP_FLAG_FADVISE_SEQUENTIAL;
+ if (cache_dont_need)
+ fadvise_flags |= CEPH_OSD_OP_FLAG_FADVISE_DONTNEED;
for (interval_set<uint64_t>::const_iterator p = intervals_included.begin();
p != intervals_included.end();
++p) {
bufferlist bit;
bit.substr_of(data_included, off, p.get_len());
t->write(coll, ghobject_t(target_oid),
- p.get_start(), p.get_len(), bit);
+ p.get_start(), p.get_len(), bit, fadvise_flags);
off += p.get_len();
}
bool complete = pi.is_complete();
submit_push_data(pi.recovery_info, first,
- complete,
+ complete, pi.cache_dont_need,
data_included, data,
pop.omap_header,
pop.attrset,
submit_push_data(pop.recovery_info,
first,
complete,
+ true, // must be replicate
pop.data_included,
data,
pop.omap_header,
const ObjectRecoveryProgress &progress,
ObjectRecoveryProgress *out_progress,
PushOp *out_op,
- object_stat_sum_t *stat)
+ object_stat_sum_t *stat,
+ bool cache_dont_need)
{
ObjectRecoveryProgress _new_progress;
if (!out_progress)
++p) {
bufferlist bit;
store->read(coll, ghobject_t(recovery_info.soid),
- p.get_start(), p.get_len(), bit);
+ p.get_start(), p.get_len(), bit,
+ cache_dont_need ? CEPH_OSD_OP_FLAG_FADVISE_DONTNEED: 0);
if (p.get_len() != bit.length()) {
dout(10) << " extent " << p.get_start() << "~" << p.get_len()
<< " is actually " << p.get_start() << "~" << bit.length()
++pushes;
h->pushes[peer].push_back(PushOp());
prep_push_to_replica(obc, soid, peer,
- &(h->pushes[peer].back())
- );
+ &(h->pushes[peer].back()), h->cache_dont_need);
}
}
return pushes;
ObjectContextRef head_ctx;
ObjectContextRef obc;
object_stat_sum_t stat;
+ bool cache_dont_need;
void dump(Formatter *f) const {
{
const ObjectRecoveryProgress &progress,
ObjectRecoveryProgress *out_progress,
PushOp *out_op,
- object_stat_sum_t *stat = 0);
+ object_stat_sum_t *stat = 0,
+ bool cache_dont_need = true);
void submit_push_data(ObjectRecoveryInfo &recovery_info,
bool first,
bool complete,
+ bool cache_dont_need,
const interval_set<uint64_t> &intervals_included,
bufferlist data_included,
bufferlist omap_header,
RPGHandle *h);
void prep_push_to_replica(
ObjectContextRef obc, const hobject_t& soid, pg_shard_t peer,
- PushOp *pop);
+ PushOp *pop, bool cache_dont_need = true);
void prep_push(ObjectContextRef obc,
const hobject_t& oid, pg_shard_t dest,
PushOp *op);
eversion_t version,
interval_set<uint64_t> &data_subset,
map<hobject_t, interval_set<uint64_t> >& clone_subsets,
- PushOp *op);
+ PushOp *op,
+ bool cache = false);
void calc_head_subsets(ObjectContextRef obc, SnapSet& snapset, const hobject_t& head,
const pg_missing_t& missing,
const hobject_t &last_backfill,