]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Merge remote-tracking branch 'origin/wip-sam-proxy-write'
authorSamuel Just <sjust@redhat.com>
Wed, 19 Aug 2015 22:49:40 +0000 (15:49 -0700)
committerSamuel Just <sjust@redhat.com>
Wed, 19 Aug 2015 23:07:30 +0000 (16:07 -0700)
Reviewed-by: Samuel Just <sjust@redhat.com>
Reviewed-by: Sage Weil <sage@redhat.com>
Conflicts:
src/include/ceph_features.h
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

15 files changed:
1  2 
qa/workunits/cephtool/test.sh
src/common/config_opts.h
src/include/ceph_features.h
src/include/rados.h
src/mon/MonCommands.h
src/mon/OSDMonitor.cc
src/osd/OSD.cc
src/osd/OSD.h
src/osd/PG.h
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h
src/osd/osd_types.cc
src/osd/osd_types.h
src/osdc/Objecter.cc
src/osdc/Objecter.h

Simple merge
Simple merge
index 2a4d4993c1fc6bc262749a6d7bb5d77fcacdfeae,96a2f33be682a6f2a9444a110e55a3a5574ae336..8ac0f4d598c3ecfe0300c14b9666dcab85f9d230
@@@ -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
Simple merge
Simple merge
Simple merge
diff --cc src/osd/OSD.cc
Simple merge
diff --cc src/osd/OSD.h
Simple merge
diff --cc src/osd/PG.h
index fbfa6db424b9b27605759db4648e039254d0ca35,b96bcd13e9c125386007671823bc8f68c189c56c..7cace9ca69f597f5c7d6dee676e5768ff3e202c7
@@@ -761,11 -744,15 +761,21 @@@ protected
  
    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;
index 72c3e390d506f17c462a11f5f4f5df49d92bdcd8,738e42074b1eb9fbe25f953829788f3eef78eaff..fba7494ae0d387d03d39a3515c051fb45b3aee6e
@@@ -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<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);
@@@ -2103,9 -2170,9 +2192,9 @@@ void ReplicatedPG::finish_proxy_read(ho
    }
    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;
@@@ -2163,10 -2232,16 +2254,16 @@@ void ReplicatedPG::cancel_proxy_ops(boo
      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;
@@@ -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, 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;
    }
  
index 02ea5265232e78d2a64280bd063e1efed6f291ee,f22b8c565b132f2f2d0abde60a013851e4862884..1fe4055285b7621f3502823b411c81f3b9710263
@@@ -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<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);
Simple merge
Simple merge
Simple merge
Simple merge