| 265 | } |
| 266 | |
| 267 | void MDLog::create(MDSContext *c) |
| 268 | { |
| 269 | ceph_assert(ceph_mutex_is_locked_by_me(mds->mds_lock)); |
| 270 | |
| 271 | dout(5) << "create empty log" << dendl; |
| 272 | |
| 273 | C_GatherBuilder gather(g_ceph_context); |
| 274 | // This requires an OnFinisher wrapper because Journaler will call back the completion for write_head inside its own lock |
| 275 | // XXX but should maybe that be handled inside Journaler? |
| 276 | gather.set_finisher(new C_IO_Wrapper(mds, c)); |
| 277 | |
| 278 | // The inode of the default Journaler we will create |
| 279 | ino = MDS_INO_LOG_OFFSET + mds->get_nodeid(); |
| 280 | |
| 281 | // Instantiate Journaler and start async write to RADOS |
| 282 | ceph_assert(journaler == NULL); |
| 283 | journaler = new Journaler("mdlog", ino, mds->get_metadata_pool(), |
| 284 | CEPH_FS_ONDISK_MAGIC, mds->objecter, logger, |
| 285 | l_mdl_jlat, mds->finisher); |
| 286 | ceph_assert(journaler->is_readonly()); |
| 287 | journaler->set_write_error_handler(new C_MDL_WriteError(this)); |
| 288 | journaler->set_writeable(); |
| 289 | journaler->create(&mds->mdcache->default_log_layout, g_conf()->mds_journal_format); |
| 290 | journaler->write_head(gather.new_sub()); |
| 291 | |
| 292 | // Async write JournalPointer to RADOS |
| 293 | JournalPointer jp(mds->get_nodeid(), mds->get_metadata_pool()); |
| 294 | jp.front = ino; |
| 295 | jp.back = 0; |
| 296 | jp.save(mds->objecter, gather.new_sub()); |
| 297 | |
| 298 | gather.activate(); |
| 299 | |
| 300 | logger->set(l_mdl_expos, journaler->get_expire_pos()); |
| 301 | logger->set(l_mdl_wrpos, journaler->get_write_pos()); |
| 302 | |
| 303 | submit_thread.create("mds-log-submit"); |
| 304 | } |
| 305 | |
| 306 | void MDLog::open(MDSContext *c) |
| 307 | { |
no test coverage detected