]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: encode/decode PG::Info in pg xattr
authorSage Weil <sage@newdream.net>
Wed, 6 Aug 2008 17:35:14 +0000 (10:35 -0700)
committerSage Weil <sage@newdream.net>
Wed, 6 Aug 2008 17:36:46 +0000 (10:36 -0700)
src/osd/OSD.cc
src/osd/PG.cc
src/osd/ReplicatedPG.cc

index ca0bc98dcfb6fbe6052371beba2628c859ddc85d..5d7ddc9167c683c10182212fa4746940c79500be 100644 (file)
@@ -557,9 +557,9 @@ PG * OSD::_create_lock_new_pg(pg_t pgid, vector<int>& acting, ObjectStore::Trans
   pg->set_role(0);
   pg->acting.swap(acting);
   pg->info.history.epoch_created = 
-    pg->info.history.last_epoch_started = 
-    pg->info.history.same_since = 
-    pg->info.history.same_primary_since = 
+    pg->info.history.last_epoch_started =
+    pg->info.history.same_since =
+    pg->info.history.same_primary_since =
     pg->info.history.same_acker_since = osdmap->get_epoch();
   pg->write_log(t);
   
@@ -634,7 +634,10 @@ void OSD::load_pgs()
     PG *pg = _open_lock_pg(pgid);
 
     // read pg info
-    store->collection_getattr(pgid, "info", &pg->info, sizeof(pg->info));
+    bufferlist bl;
+    store->collection_getattr(pgid, "info", bl);
+    bufferlist::iterator p = bl.begin();
+    ::decode(pg->info, p);
     
     // read pg log
     pg->read_log(store);
@@ -1604,7 +1607,9 @@ void OSD::handle_osd_map(MOSDMap *m)
        i++) {
     pg_t pgid = i->first;
     PG *pg = i->second;
-    t.collection_setattr( pgid, "info", &pg->info, sizeof(pg->info));
+    bufferlist bl;
+    ::encode(pg->info, bl);
+    t.collection_setattr( pgid, "info", bl );
   }
 
   // superblock and commit
@@ -2058,7 +2063,9 @@ void OSD::kick_pg_split_queue()
       PG *pg = q->second;
       // fix up pg metadata
       pg->info.last_complete = pg->info.last_update;
-      t.collection_setattr(pg->info.pgid, "info", (char*)&pg->info, sizeof(pg->info));
+      bufferlist bl;
+      ::encode(pg->info, bl);
+      t.collection_setattr(pg->info.pgid, "info", bl);
       pg->write_log(t);
 
       wake_pg_waiters(pg->info.pgid);
index e3ca5ffdc28af7338bb21b0cd8c6b8a203ef0213..c6072dcfeb91c9ec6ee85ce60001dff14a9cc448 100644 (file)
@@ -935,7 +935,9 @@ void PG::activate(ObjectStore::Transaction& t,
   assert(info.last_complete >= log.bottom || log.backlog);
 
   // write pg info
-  t.collection_setattr(info.pgid, "info", (char*)&info, sizeof(info));
+  bufferlist bl;
+  ::encode(info, bl);
+  t.collection_setattr(info.pgid, "info", bl);
   
   // write log
   write_log(t);
@@ -1092,7 +1094,9 @@ void PG::finish_recovery()
   assert(info.last_complete == info.last_update);
 
   ObjectStore::Transaction t;
-  t.collection_setattr(info.pgid, "info", &info, sizeof(info));
+  bufferlist bl;
+  ::encode(info, bl);
+  t.collection_setattr(info.pgid, "info", bl);
   osd->store->apply_transaction(t);
   osd->store->sync();
 
@@ -1180,7 +1184,9 @@ void PG::write_log(ObjectStore::Transaction& t)
   t.collection_setattr(info.pgid, "ondisklog_bottom", &ondisklog.bottom, sizeof(ondisklog.bottom));
   t.collection_setattr(info.pgid, "ondisklog_top", &ondisklog.top, sizeof(ondisklog.top));
   
-  t.collection_setattr(info.pgid, "info", &info, sizeof(info)); 
+  bufferlist infobl;
+  ::encode(info, infobl);
+  t.collection_setattr(info.pgid, "info", infobl);
 
   dout(10) << "write_log to [" << ondisklog.bottom << "," << ondisklog.top << ")" << dendl;
 }
index 6fa6d0349df1e71f2bd814f5613b9dd0d688f612..dba5807fcd275dd0c922ceca1282ed599a99a645 100644 (file)
@@ -663,7 +663,9 @@ void ReplicatedPG::prepare_op_transaction(ObjectStore::Transaction& t, const osd
   info.last_update = version;
   
   // write pg info
-  t.collection_setattr(pgid, "info", &info, sizeof(info));
+  bufferlist infobl;
+  ::encode(info, infobl);
+  t.collection_setattr(pgid, "info", infobl);
 
   // clone?
   if (crev && rev && rev > crev) {
@@ -1560,7 +1562,9 @@ void ReplicatedPG::sub_op_push(MOSDSubOp *op)
   
   
   // apply to disk!
-  t.collection_setattr(info.pgid, "info", &info, sizeof(info));
+  bufferlist bl;
+  ::encode(info, bl);
+  t.collection_setattr(info.pgid, "info", bl);
   unsigned r = osd->store->apply_transaction(t);
   assert(r == 0);