]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd_types,PG: handle new hobject format in object_info,pg_log
authorSamuel Just <sam.just@inktank.com>
Thu, 31 May 2012 05:48:19 +0000 (22:48 -0700)
committerSamuel Just <sam.just@inktank.com>
Tue, 5 Jun 2012 23:09:50 +0000 (16:09 -0700)
There are also legacy hobject encodings in the pg log and in object_info
attributes on objects.

Signed-off-by: Samuel Just <sam.just@inktank.com>
src/osd/OSD.cc
src/osd/PG.cc
src/osd/osd_types.cc
src/osd/osd_types.h

index 01c63c4ec28e740c5a2fa7778aa68342efe85349..af9113eaed9a6cf8b5540bc20e52f1a89d039c2f 100644 (file)
@@ -131,6 +131,7 @@ static CompatSet get_osd_compat_set() {
   ceph_osd_feature_incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_OLOC);
   ceph_osd_feature_incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_LEC);
   ceph_osd_feature_incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_CATEGORIES);
+  ceph_osd_feature_incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_HOBJECTPOOL);
   return CompatSet(ceph_osd_feature_compat, ceph_osd_feature_ro_compat,
                   ceph_osd_feature_incompat);
 }
index 86ac993adf384408c38cbb60de976941c543906f..df72fdd323087f06cca6aba93f6eee67d130414f 100644 (file)
@@ -2169,6 +2169,10 @@ void PG::read_log(ObjectStore *store)
        }
       }
 
+      if (e.invalid_pool) {
+       e.soid.pool = info.pgid.pool();
+      }
+
       e.offset = pos;
       uint64_t endpos = ondisklog.tail + p.get_off();
       log.log.push_back(e);
index 4a17e1760a001964c915edc01373c82c2c26435b..ecb42ce33d77f2b60bef37ce506c756f061b52ec 100644 (file)
@@ -1461,7 +1461,7 @@ void pg_query_t::generate_test_instances(list<pg_query_t*>& o)
 
 void pg_log_entry_t::encode(bufferlist &bl) const
 {
-  ENCODE_START(4, 4, bl);
+  ENCODE_START(5, 4, bl);
   ::encode(op, bl);
   ::encode(soid, bl);
   ::encode(version, bl);
@@ -1475,7 +1475,7 @@ void pg_log_entry_t::encode(bufferlist &bl) const
 
 void pg_log_entry_t::decode(bufferlist::iterator &bl)
 {
-  DECODE_START_LEGACY_COMPAT_LEN(4, 4, 4, bl);
+  DECODE_START_LEGACY_COMPAT_LEN(5, 4, 4, bl);
   ::decode(op, bl);
   if (struct_v < 2) {
     sobject_t old_soid;
@@ -1494,6 +1494,8 @@ void pg_log_entry_t::decode(bufferlist::iterator &bl)
   ::decode(mtime, bl);
   if (op == CLONE)
     ::decode(snaps, bl);
+  if (struct_v < 5)
+    invalid_pool = true;
   DECODE_FINISH(bl);
 }
 
@@ -2093,7 +2095,7 @@ ps_t object_info_t::legacy_object_locator_to_ps(const object_t &oid,
 
 void object_info_t::encode(bufferlist& bl) const
 {
-  ENCODE_START(9, 8, bl);
+  ENCODE_START(10, 8, bl);
   ::encode(soid, bl);
   ::encode(oloc, bl);
   ::encode(category, bl);
@@ -2117,7 +2119,7 @@ void object_info_t::encode(bufferlist& bl) const
 
 void object_info_t::decode(bufferlist::iterator& bl)
 {
-  DECODE_START_LEGACY_COMPAT_LEN(9, 8, 8, bl);
+  DECODE_START_LEGACY_COMPAT_LEN(10, 8, 8, bl);
   if (struct_v >= 2 && struct_v <= 5) {
     sobject_t obj;
     ::decode(obj, bl);
@@ -2158,6 +2160,8 @@ void object_info_t::decode(bufferlist::iterator& bl)
     ::decode(uses_tmap, bl);
   else
     uses_tmap = true;
+  if (struct_v < 10)
+    soid.pool = oloc.pool;
   DECODE_FINISH(bl);
 }
 
index 87b23d23fde7caec0bb07cbfb786737be48cbd3f..ca0b295e40fc3e0b5ce60c1a4035d41d159540e9 100644 (file)
@@ -37,6 +37,7 @@
 #define CEPH_OSD_FEATURE_INCOMPAT_OLOC CompatSet::Feature(3, "object locator")
 #define CEPH_OSD_FEATURE_INCOMPAT_LEC  CompatSet::Feature(4, "last_epoch_clean")
 #define CEPH_OSD_FEATURE_INCOMPAT_CATEGORIES  CompatSet::Feature(5, "categories")
+#define CEPH_OSD_FEATURE_INCOMPAT_HOBJECTPOOL  CompatSet::Feature(6, "hobjectpool")
 
 
 typedef hobject_t collection_list_handle_t;
@@ -1196,6 +1197,7 @@ struct pg_log_entry_t {
   utime_t     mtime;  // this is the _user_ mtime, mind you
   bufferlist snaps;   // only for clone entries
   bool invalid_hash; // only when decoding sobject_t based entries
+  bool invalid_pool; // only when decoding pool-less hobject based entries
 
   uint64_t offset;   // [soft state] my offset on disk
       
@@ -1206,7 +1208,8 @@ struct pg_log_entry_t {
                 const osd_reqid_t& rid, const utime_t& mt)
     : op(_op), soid(_soid), version(v),
       prior_version(pv),
-      reqid(rid), mtime(mt), invalid_hash(false), offset(0) {}
+      reqid(rid), mtime(mt), invalid_hash(false), invalid_pool(false),
+      offset(0) {}
       
   bool is_clone() const { return op == CLONE; }
   bool is_modify() const { return op == MODIFY; }