diff options
author | Greg Farnum <greg@inktank.com> | 2013-05-01 14:10:31 -0700 |
---|---|---|
committer | Greg Farnum <greg@inktank.com> | 2013-05-01 14:10:31 -0700 |
commit | dfacd1bd805ebb730b5206c9830b28f47cc7f9cf (patch) | |
tree | 15f6d6a8591022a7f5f8439963f9cb5d056488b2 | |
parent | a21ea0186d9a7ef136ccadf96c02ba683bc5e533 (diff) | |
download | ceph-dfacd1bd805ebb730b5206c9830b28f47cc7f9cf.tar.gz |
dumper: fix Objecter locking
Locking expectations changed at some point, and the Dumper wasn't
updated to comply:
1) We need to take the lock for Objecter, as it
doesn't do so on its own any more.
2) We need to drop the lock in several places so that Objecter
can take delivery of messages
Signed-off-by: Greg Farnum <greg@inktank.com>
Reviewed-by: Sage Weil <sage@inktank.com>
-rw-r--r-- | src/mds/Dumper.cc | 25 | ||||
-rw-r--r-- | src/mds/Dumper.h | 1 |
2 files changed, 18 insertions, 8 deletions
diff --git a/src/mds/Dumper.cc b/src/mds/Dumper.cc index 917403ee208..9b83b4d9b00 100644 --- a/src/mds/Dumper.cc +++ b/src/mds/Dumper.cc @@ -25,6 +25,8 @@ #include "mon/MonClient.h" #include "osdc/Journaler.h" +#define dout_subsys ceph_subsys_mds + Dumper::~Dumper() { } @@ -69,9 +71,9 @@ void Dumper::init(int rank) objecter->init_unlocked(); lock.Lock(); objecter->init_locked(); + lock.Unlock(); objecter->wait_for_osd_map(); timer.init(); - lock.Unlock(); } void Dumper::shutdown() @@ -91,11 +93,14 @@ void Dumper::dump(const char *dump_file) int rank = strtol(g_conf->name.get_id().c_str(), 0, 0); inodeno_t ino = MDS_INO_LOG_OFFSET + rank; + Mutex localLock("dump:lock"); lock.Lock(); - journaler->recover(new C_SafeCond(&lock, &cond, &done, &r)); - while (!done) - cond.Wait(lock); + journaler->recover(new C_SafeCond(&localLock, &cond, &done, &r)); lock.Unlock(); + localLock.Lock(); + while (!done) + cond.Wait(localLock); + localLock.Unlock(); if (r < 0) { // Error derr << "error on recovery: " << cpp_strerror(r) << dendl; @@ -103,6 +108,8 @@ void Dumper::dump(const char *dump_file) // wait for messenger to finish messenger->wait(); shutdown(); + } else { + dout(10) << "completed journal recovery" << dendl; } uint64_t start = journaler->get_read_pos(); @@ -112,12 +119,14 @@ void Dumper::dump(const char *dump_file) Filer filer(objecter); bufferlist bl; - filer.read(ino, &journaler->get_layout(), CEPH_NOSNAP, - start, len, &bl, 0, new C_SafeCond(&lock, &cond, &done)); lock.Lock(); - while (!done) - cond.Wait(lock); + filer.read(ino, &journaler->get_layout(), CEPH_NOSNAP, + start, len, &bl, 0, new C_SafeCond(&localLock, &cond, &done)); lock.Unlock(); + localLock.Lock(); + while (!done) + cond.Wait(localLock); + localLock.Unlock(); cout << "read " << bl.length() << " bytes at offset " << start << std::endl; diff --git a/src/mds/Dumper.h b/src/mds/Dumper.h index 066ba5ccb1d..794ae0c8aa7 100644 --- a/src/mds/Dumper.h +++ b/src/mds/Dumper.h @@ -62,6 +62,7 @@ public: virtual ~Dumper(); bool ms_dispatch(Message *m) { + Mutex::Locker locker(lock); switch (m->get_type()) { case CEPH_MSG_OSD_OPREPLY: objecter->handle_osd_op_reply((MOSDOpReply *)m); |