From: Samuel Just Date: Wed, 19 Aug 2015 22:49:40 +0000 (-0700) Subject: Merge remote-tracking branch 'origin/wip-sam-proxy-write' X-Git-Tag: v9.1.0~345 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=afb4db73cceea1adb72c3d434c7da4042de2301f;p=ceph.git Merge remote-tracking branch 'origin/wip-sam-proxy-write' Reviewed-by: Samuel Just Reviewed-by: Sage Weil Conflicts: src/include/ceph_features.h src/osd/ReplicatedPG.cc src/osd/ReplicatedPG.h --- afb4db73cceea1adb72c3d434c7da4042de2301f diff --cc src/include/ceph_features.h index 2a4d4993c1fc,96a2f33be682..8ac0f4d598c3 --- a/src/include/ceph_features.h +++ b/src/include/ceph_features.h @@@ -64,7 -64,7 +64,8 @@@ // duplicated since it was introduced at the same time as MIN_SIZE_RECOVERY #define CEPH_FEATURE_OSD_PROXY_FEATURES (1ULL<<49) /* overlap w/ above */ #define CEPH_FEATURE_MON_METADATA (1ULL<<50) -#define CEPH_FEATURE_OSD_PROXY_WRITE_FEATURES (1ULL<<51) +#define CEPH_FEATURE_OSD_BITWISE_HOBJ_SORT (1ULL<<51) /* can sort objs bitwise */ ++#define CEPH_FEATURE_OSD_PROXY_WRITE_FEATURES (1ULL<<52) #define CEPH_FEATURE_RESERVED2 (1ULL<<61) /* slow down, we are almost out... */ #define CEPH_FEATURE_RESERVED (1ULL<<62) /* DO NOT USE THIS ... last bit! */ @@@ -151,7 -151,7 +152,8 @@@ static inline unsigned long long ceph_s CEPH_FEATURE_CRUSH_V4 | \ CEPH_FEATURE_OSD_MIN_SIZE_RECOVERY | \ CEPH_FEATURE_MON_METADATA | \ + CEPH_FEATURE_OSD_BITWISE_HOBJ_SORT | \ + CEPH_FEATURE_OSD_PROXY_WRITE_FEATURES | \ 0ULL) #define CEPH_FEATURES_SUPPORTED_DEFAULT CEPH_FEATURES_ALL diff --cc src/osd/PG.h index fbfa6db424b9,b96bcd13e9c1..7cace9ca69f5 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@@ -761,11 -744,15 +761,21 @@@ protected list waiting_for_cache_not_full; list waiting_for_all_missing; - map > waiting_for_unreadable_object, + map, hobject_t::BitwiseComparator> waiting_for_unreadable_object, waiting_for_degraded_object, waiting_for_blocked_object; + - map objects_blocked_on_degraded_snap; - map 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 > callbacks_for_degraded_object; + map, hobject_t::BitwiseComparator> callbacks_for_degraded_object; map > > waiting_for_ack, waiting_for_ondisk; diff --cc src/osd/ReplicatedPG.cc index 72c3e390d506,738e42074b1e..fba7494ae0d3 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@@ -371,22 -371,20 +371,20 @@@ bool ReplicatedPG::is_missing_object(co 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::const_iterator p = recovering.find(soid); + map::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); @@@ -2103,9 -2170,9 +2192,9 @@@ void ReplicatedPG::finish_proxy_read(ho } proxyread_ops.erase(tid); - map, 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 >::iterator q = in_progress_proxy_ops.find(oid); ++ map, 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()); @@@ -2130,10 -2197,10 +2219,10 @@@ 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::BitwiseComparator>::iterator p = in_progress_proxy_reads.find(soid); - if (p == in_progress_proxy_reads.end()) - map >::iterator p = in_progress_proxy_ops.find(soid); ++ map, hobject_t::BitwiseComparator>::iterator p = in_progress_proxy_ops.find(soid); + if (p == in_progress_proxy_ops.end()) return; list& ls = p->second; @@@ -2163,10 -2232,16 +2254,16 @@@ void ReplicatedPG::cancel_proxy_ops(boo cancel_proxy_read((p++)->second); } + // cancel proxy writes + map::iterator q = proxywrite_ops.begin(); + while (q != proxywrite_ops.end()) { + cancel_proxy_write((q++)->second); + } + if (requeue) { - map >::iterator p = + map, 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& ls = p->second; dout(10) << __func__ << " " << p->first << " requeuing " << ls.size() << " requests" << dendl; @@@ -2226,8 -2451,8 +2473,8 @@@ void ReplicatedPG::promote_object(Objec * for this case we don't use DONTNEED. */ unsigned src_fadvise_flags = LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL; - map, hobject_t::BitwiseComparator>::iterator q = in_progress_proxy_reads.find(obc->obs.oi.soid); - if (q == in_progress_proxy_reads.end()) { - map >::iterator q = in_progress_proxy_ops.find(obc->obs.oi.soid); ++ map, 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; } diff --cc src/osd/ReplicatedPG.h index 02ea5265232e,f22b8c565b13..1fe4055285b7 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@@ -1405,9 -1432,12 +1438,12 @@@ protected bool pgls_filter(PGLSFilter *filter, hobject_t& sobj, bufferlist& outdata); int get_pgls_filter(bufferlist::iterator& iter, PGLSFilter **pfilter); - map > in_progress_proxy_ops; ++ map, hobject_t::BitwiseComparator> in_progress_proxy_ops; + void kick_proxy_ops_blocked(hobject_t& soid); + void cancel_proxy_ops(bool requeue); + // -- proxyread -- map proxyread_ops; - map, 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);