From 5d913e2b1cc13ec3e1d0e4c45d78785493317085 Mon Sep 17 00:00:00 2001 From: John Spray Date: Mon, 19 May 2014 16:42:53 +0100 Subject: [PATCH] mds: Create JournalPointer in MDLog::create Otherwise it is created at next startup when we see that it is missing: this is cleaner. Signed-off-by: John Spray --- src/mds/JournalPointer.cc | 53 +++++++++++++++++++++++++++------------ src/mds/JournalPointer.h | 3 +++ src/mds/MDLog.cc | 39 ++++++++++++++++------------ src/mds/MDLog.h | 2 -- 4 files changed, 63 insertions(+), 34 deletions(-) diff --git a/src/mds/JournalPointer.cc b/src/mds/JournalPointer.cc index 60b09c78db492..6eb82575f2be3 100644 --- a/src/mds/JournalPointer.cc +++ b/src/mds/JournalPointer.cc @@ -26,6 +26,17 @@ #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); +} + diff --git a/src/mds/JournalPointer.h b/src/mds/JournalPointer.h index 5ff7ec32eb9fc..7724de35ef3c2 100644 --- a/src/mds/JournalPointer.h +++ b/src/mds/JournalPointer.h @@ -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; diff --git a/src/mds/MDLog.cc b/src/mds/MDLog.cc index 8a7a05b2b0d8b..cad511014fe29 100644 --- a/src/mds/MDLog.cc +++ b/src/mds/MDLog.cc @@ -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()); diff --git a/src/mds/MDLog.h b/src/mds/MDLog.h index 50629f8ced85a..eb2a503c88716 100644 --- a/src/mds/MDLog.h +++ b/src/mds/MDLog.h @@ -141,8 +141,6 @@ public: private: - void init_journaler(); - struct C_MDL_WriteError : public Context { MDLog *mdlog; C_MDL_WriteError(MDLog *m) : mdlog(m) {} -- 2.39.5