]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/ReplicatedPG: add the proxy write feature bit support
authorZhiqiang Wang <zhiqiang.wang@intel.com>
Fri, 24 Apr 2015 08:44:12 +0000 (16:44 +0800)
committerSamuel Just <sjust@redhat.com>
Tue, 18 Aug 2015 18:25:22 +0000 (11:25 -0700)
For older versions which doesn't support proxy write, doing promote.
Otherwise, we can proxy the write.

Signed-off-by: Zhiqiang Wang <zhiqiang.wang@intel.com>
src/include/ceph_features.h
src/osd/ReplicatedPG.cc

index b00fd5600d4275572ba4e92e552794fa9d3b4fb4..3003cfd1b3cbd85a677d3754f9c8ac26e76baed7 100644 (file)
@@ -64,6 +64,7 @@
 // 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_RESERVED2 (1ULL<<61)  /* slow down, we are almost out... */
 #define CEPH_FEATURE_RESERVED  (1ULL<<62)  /* DO NOT USE THIS ... last bit! */
@@ -150,6 +151,7 @@ static inline unsigned long long ceph_sanitize_features(unsigned long long f) {
          CEPH_FEATURE_CRUSH_V4 |            \
          CEPH_FEATURE_OSD_MIN_SIZE_RECOVERY |           \
         CEPH_FEATURE_MON_METADATA |                     \
+        CEPH_FEATURE_OSD_PROXY_WRITE_FEATURES |         \
         0ULL)
 
 #define CEPH_FEATURES_SUPPORTED_DEFAULT  CEPH_FEATURES_ALL
index a0cb8fa14eda705ba1f746f01a9100fe7c092817..4627a100af30d5bb792ca1efc3441bbebbec01fc 100644 (file)
@@ -1827,6 +1827,8 @@ bool ReplicatedPG::maybe_handle_cache(OpRequestRef op,
   // older versions do not proxy the feature bits.
   bool can_proxy_read = get_osdmap()->get_up_osd_features() &
     CEPH_FEATURE_OSD_PROXY_FEATURES;
+  bool can_proxy_write = get_osdmap()->get_up_osd_features() &
+    CEPH_FEATURE_OSD_PROXY_WRITE_FEATURES;
   OpRequestRef promote_op;
 
   switch (pool.info.cache_mode) {
@@ -1852,7 +1854,13 @@ bool ReplicatedPG::maybe_handle_cache(OpRequestRef op,
       promote_object(obc, missing_oid, oloc, op);
       return true;
     } else if (op->may_write() || op->may_cache()) {
-      do_proxy_write(op, missing_oid);
+      if (can_proxy_write) {
+        do_proxy_write(op, missing_oid);
+      } else {
+       // promote if can't proxy the write
+       promote_object(obc, missing_oid, oloc, op);
+       return true;
+      }
 
       // Promote too?
       maybe_promote(obc, missing_oid, oloc, in_hit_set,