]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: Create JournalPointer in MDLog::create
authorJohn Spray <john.spray@inktank.com>
Mon, 19 May 2014 15:42:53 +0000 (16:42 +0100)
committerJohn Spray <john.spray@inktank.com>
Tue, 20 May 2014 13:07:52 +0000 (14:07 +0100)
Otherwise it is created at next startup when
we see that it is missing: this is cleaner.

Signed-off-by: John Spray <john.spray@inktank.com>
src/mds/JournalPointer.cc
src/mds/JournalPointer.h
src/mds/MDLog.cc
src/mds/MDLog.h

index 60b09c78db4922ee6046523cc1f0065d13cef27d..6eb82575f2be3ee25362bc7a89003d358dbc6443 100644 (file)
 #undef dout_prefix
 #define dout_prefix *_dout << objecter->messenger->get_myname() << ".journalpointer"
 
+
+std::string JournalPointer::get_object_id() const
+{
+  inodeno_t const pointer_ino = MDS_INO_LOG_POINTER_OFFSET + node_id;
+  char buf[32];
+  snprintf(buf, sizeof(buf), "%llx.%08llx", (long long unsigned)pointer_ino, (long long unsigned)0);
+
+  return std::string(buf);
+}
+
+
 /**
  * Blocking read of JournalPointer for this MDS
  */
@@ -35,16 +46,13 @@ int JournalPointer::load(Objecter *objecter, Mutex *lock)
   assert(objecter != NULL);
   assert(!lock->is_locked_by_me());
 
-  inodeno_t const pointer_ino = MDS_INO_LOG_POINTER_OFFSET + node_id;
-  char buf[32];
-  snprintf(buf, sizeof(buf), "%llx.%08llx", (long long unsigned)pointer_ino, (long long unsigned)0);
-
   // Blocking read of data
-  dout(4) << "Reading journal pointer '" << buf << "'" << dendl;
+  std::string const object_id = get_object_id();
+  dout(4) << "Reading journal pointer '" << object_id << "'" << dendl;
   bufferlist data;
   C_SaferCond waiter;
   lock->Lock();
-  objecter->read_full(object_t(buf), object_locator_t(pool_id),
+  objecter->read_full(object_t(object_id), object_locator_t(pool_id),
       CEPH_NOSNAP, &data, 0, &waiter);
   lock->Unlock();
   int r = waiter.wait();
@@ -54,7 +62,7 @@ int JournalPointer::load(Objecter *objecter, Mutex *lock)
     bufferlist::iterator q = data.begin();
     decode(q);
   } else {
-    dout(1) << "Journal pointer '" << buf << "' read failed: " << cpp_strerror(r) << dendl;
+    dout(1) << "Journal pointer '" << object_id << "' read failed: " << cpp_strerror(r) << dendl;
   }
   return r;
 }
@@ -73,27 +81,40 @@ int JournalPointer::save(Objecter *objecter, Mutex *lock) const
   // It is not valid to persist a null pointer
   assert(!is_null());
 
-  // Calculate object ID
-  inodeno_t const pointer_ino = MDS_INO_LOG_POINTER_OFFSET + node_id;
-  char buf[32];
-  snprintf(buf, sizeof(buf), "%llx.%08llx", (long long unsigned)pointer_ino, (long long unsigned)0);
-  dout(4) << "Writing pointer object '" << buf << "': 0x"
-    << std::hex << front << ":0x" << back << std::dec << dendl;
-
   // Serialize JournalPointer object
   bufferlist data;
   encode(data);
 
   // Write to RADOS and wait for durability
+  std::string const object_id = get_object_id();
+  dout(4) << "Writing pointer object '" << object_id << "': 0x"
+    << std::hex << front << ":0x" << back << std::dec << dendl;
+
   C_SaferCond waiter;
   lock->Lock();
-  objecter->write_full(object_t(buf), object_locator_t(pool_id),
+  objecter->write_full(object_t(object_id), object_locator_t(pool_id),
       SnapContext(), data, ceph_clock_now(g_ceph_context), 0, NULL, &waiter);
   lock->Unlock();
   int write_result = waiter.wait();
   if (write_result < 0) {
-    derr << "Error writing pointer object '" << buf << "': " << cpp_strerror(write_result) << dendl;
+    derr << "Error writing pointer object '" << object_id << "': " << cpp_strerror(write_result) << dendl;
   }
   return write_result;
 }
 
+
+/**
+ * Non-blocking variant of save() that assumes objecter lock already held by
+ * caller
+ */
+void JournalPointer::save(Objecter *objecter, Context *completion) const
+{
+  assert(objecter != NULL);
+
+  bufferlist data;
+  encode(data);
+
+  objecter->write_full(object_t(get_object_id()), object_locator_t(pool_id),
+      SnapContext(), data, ceph_clock_now(g_ceph_context), 0, NULL, completion);
+}
+
index 5ff7ec32eb9fc49b5b1c1101a20a122c3a4a7696..7724de35ef3c2fc21dee23df8d001291ecc3cccc 100644 (file)
@@ -30,6 +30,8 @@ class JournalPointer {
   // Metadata pool ID
   int64_t pool_id;
 
+  std::string get_object_id() const;
+
   public:
   // The currently active journal
   inodeno_t front;
@@ -57,6 +59,7 @@ class JournalPointer {
 
   int load(Objecter *objecter, Mutex *lock);
   int save(Objecter *objecter, Mutex *lock) const;
+  void save(Objecter *objecter, Context *completion) const;
 
   bool is_null() const {
     return front == 0 && back == 0;
index 8a7a05b2b0d8bb978cf6d903c28d6f1956b2ee35..cad511014fe293a717eefa82703ba7842906f9b4 100644 (file)
@@ -75,20 +75,6 @@ void MDLog::create_logger()
   g_ceph_context->get_perfcounters_collection()->add(logger);
 }
 
-void MDLog::init_journaler()
-{
-  // inode
-  ino = MDS_INO_LOG_OFFSET + mds->get_nodeid();
-  
-  // log streamer
-  if (journaler) delete journaler;
-  journaler = new Journaler(ino, mds->mdsmap->get_metadata_pool(), CEPH_FS_ONDISK_MAGIC, mds->objecter,
-                           logger, l_mdl_jlat,
-                           &mds->timer);
-  assert(journaler->is_readonly());
-  journaler->set_write_error_handler(new C_MDL_WriteError(this));
-}
-
 void MDLog::handle_journaler_write_error(int r)
 {
   if (r == -EBLACKLISTED) {
@@ -125,10 +111,31 @@ uint64_t MDLog::get_safe_pos()
 void MDLog::create(Context *c)
 {
   dout(5) << "create empty log" << dendl;
-  init_journaler();
+
+  C_GatherBuilder gather(g_ceph_context);
+  gather.set_finisher(c);
+
+  // The inode of the default Journaler we will create
+  ino = MDS_INO_LOG_OFFSET + mds->get_nodeid();
+
+  // Instantiate Journaler and start async write to RADOS
+  assert(journaler == NULL);
+  journaler = new Journaler(ino, mds->mdsmap->get_metadata_pool(), CEPH_FS_ONDISK_MAGIC, mds->objecter,
+                           logger, l_mdl_jlat,
+                           &mds->timer);
+  assert(journaler->is_readonly());
+  journaler->set_write_error_handler(new C_MDL_WriteError(this));
   journaler->set_writeable();
   journaler->create(&mds->mdcache->default_log_layout, g_conf->mds_journal_format);
-  journaler->write_head(c);
+  journaler->write_head(gather.new_sub());
+
+  // Async write JournalPointer to RADOS
+  JournalPointer jp(mds->get_nodeid(), mds->mdsmap->get_metadata_pool());
+  jp.front = ino;
+  jp.back = 0;
+  jp.save(mds->objecter, gather.new_sub());
+
+  gather.activate();
 
   logger->set(l_mdl_expos, journaler->get_expire_pos());
   logger->set(l_mdl_wrpos, journaler->get_write_pos());
index 50629f8ced85a862c2c439ee51a489c88f333474..eb2a503c88716e87494eb717cbbb17e059abb434 100644 (file)
@@ -141,8 +141,6 @@ public:
 
 
 private:
-  void init_journaler();
-
   struct C_MDL_WriteError : public Context {
     MDLog *mdlog;
     C_MDL_WriteError(MDLog *m) : mdlog(m) {}