list<OpRequestRef> waiting_for_cache_not_full;
list<OpRequestRef> waiting_for_all_missing;
- map<hobject_t, list<OpRequestRef> > waiting_for_unreadable_object,
+ map<hobject_t, list<OpRequestRef>, hobject_t::BitwiseComparator> waiting_for_unreadable_object,
waiting_for_degraded_object,
waiting_for_blocked_object;
- map<hobject_t, snapid_t> objects_blocked_on_degraded_snap;
- map<hobject_t, ObjectContextRef> objects_blocked_on_snap_promotion;
+
++ map<
++ hobject_t,
++ snapid_t,
++ hobject_t::BitwiseComparator> objects_blocked_on_degraded_snap;
++ map<
++ hobject_t,
++ ObjectContextRef,
++ hobject_t::BitwiseComparator> objects_blocked_on_snap_promotion;
+
// Callbacks should assume pg (and nothing else) is locked
- map<hobject_t, list<Context*> > callbacks_for_degraded_object;
+ map<hobject_t, list<Context*>, hobject_t::BitwiseComparator> callbacks_for_degraded_object;
map<eversion_t,
list<pair<OpRequestRef, version_t> > > waiting_for_ack, waiting_for_ondisk;
return pg_log.get_missing().missing.count(soid);
}
- void ReplicatedPG::wait_for_unreadable_object(
- const hobject_t& soid, OpRequestRef op)
+ void ReplicatedPG::maybe_kick_recovery(
+ const hobject_t &soid)
{
- assert(is_unreadable_object(soid));
-
eversion_t v;
- bool needs_recovery = missing_loc.needs_recovery(soid, &v);
- assert(needs_recovery);
+ if (!missing_loc.needs_recovery(soid, &v))
+ return;
- map<hobject_t, ObjectContextRef>::const_iterator p = recovering.find(soid);
+ map<hobject_t, ObjectContextRef, hobject_t::BitwiseComparator>::const_iterator p = recovering.find(soid);
if (p != recovering.end()) {
- dout(7) << "missing " << soid << " v " << v << ", already recovering." << dendl;
+ dout(7) << "object " << soid << " v " << v << ", already recovering." << dendl;
} else if (missing_loc.is_unfound(soid)) {
- dout(7) << "missing " << soid << " v " << v << ", is unfound." << dendl;
+ dout(7) << "object " << soid << " v " << v << ", is unfound." << dendl;
} else {
- dout(7) << "missing " << soid << " v " << v << ", recovering." << dendl;
+ dout(7) << "object " << soid << " v " << v << ", recovering." << dendl;
PGBackend::RecoveryHandle *h = pgbackend->open_recovery_op();
if (is_missing_object(soid)) {
recover_missing(soid, v, cct->_conf->osd_client_op_priority, h);
}
proxyread_ops.erase(tid);
- map<hobject_t, list<OpRequestRef>, hobject_t::BitwiseComparator>::iterator q = in_progress_proxy_reads.find(oid);
- if (q == in_progress_proxy_reads.end()) {
- dout(10) << __func__ << " no in_progress_proxy_reads found" << dendl;
- map<hobject_t, list<OpRequestRef> >::iterator q = in_progress_proxy_ops.find(oid);
++ map<hobject_t, list<OpRequestRef>, hobject_t::BitwiseComparator>::iterator q = in_progress_proxy_ops.find(oid);
+ if (q == in_progress_proxy_ops.end()) {
+ dout(10) << __func__ << " no in_progress_proxy_ops found" << dendl;
return;
}
assert(q->second.size());
complete_read_ctx(r, ctx);
}
- void ReplicatedPG::kick_proxy_read_blocked(hobject_t& soid)
+ void ReplicatedPG::kick_proxy_ops_blocked(hobject_t& soid)
{
- map<hobject_t, list<OpRequestRef>, hobject_t::BitwiseComparator>::iterator p = in_progress_proxy_reads.find(soid);
- if (p == in_progress_proxy_reads.end())
- map<hobject_t, list<OpRequestRef> >::iterator p = in_progress_proxy_ops.find(soid);
++ map<hobject_t, list<OpRequestRef>, hobject_t::BitwiseComparator>::iterator p = in_progress_proxy_ops.find(soid);
+ if (p == in_progress_proxy_ops.end())
return;
list<OpRequestRef>& ls = p->second;
cancel_proxy_read((p++)->second);
}
+ // cancel proxy writes
+ map<ceph_tid_t, ProxyWriteOpRef>::iterator q = proxywrite_ops.begin();
+ while (q != proxywrite_ops.end()) {
+ cancel_proxy_write((q++)->second);
+ }
+
if (requeue) {
- map<hobject_t, list<OpRequestRef> >::iterator p =
+ map<hobject_t, list<OpRequestRef>, hobject_t::BitwiseComparator>::iterator p =
- in_progress_proxy_reads.begin();
- while (p != in_progress_proxy_reads.end()) {
+ in_progress_proxy_ops.begin();
+ while (p != in_progress_proxy_ops.end()) {
list<OpRequestRef>& ls = p->second;
dout(10) << __func__ << " " << p->first << " requeuing " << ls.size()
<< " requests" << dendl;
* for this case we don't use DONTNEED.
*/
unsigned src_fadvise_flags = LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL;
- map<hobject_t, list<OpRequestRef>, hobject_t::BitwiseComparator>::iterator q = in_progress_proxy_reads.find(obc->obs.oi.soid);
- if (q == in_progress_proxy_reads.end()) {
- map<hobject_t, list<OpRequestRef> >::iterator q = in_progress_proxy_ops.find(obc->obs.oi.soid);
++ map<hobject_t, list<OpRequestRef>, hobject_t::BitwiseComparator>::iterator q = in_progress_proxy_ops.find(obc->obs.oi.soid);
+ if (q == in_progress_proxy_ops.end()) {
src_fadvise_flags |= LIBRADOS_OP_FLAG_FADVISE_DONTNEED;
}
bool pgls_filter(PGLSFilter *filter, hobject_t& sobj, bufferlist& outdata);
int get_pgls_filter(bufferlist::iterator& iter, PGLSFilter **pfilter);
- map<hobject_t, list<OpRequestRef> > in_progress_proxy_ops;
++ map<hobject_t, list<OpRequestRef>, hobject_t::BitwiseComparator> in_progress_proxy_ops;
+ void kick_proxy_ops_blocked(hobject_t& soid);
+ void cancel_proxy_ops(bool requeue);
+
// -- proxyread --
map<ceph_tid_t, ProxyReadOpRef> proxyread_ops;
- map<hobject_t, list<OpRequestRef>, hobject_t::BitwiseComparator> in_progress_proxy_reads;
void do_proxy_read(OpRequestRef op);
void finish_proxy_read(hobject_t oid, ceph_tid_t tid, int r);