diff options
author | Samuel Just <rexludorum@gmail.com> | 2012-04-26 21:29:45 -0700 |
---|---|---|
committer | Samuel Just <samuel.just@dreamhost.com> | 2012-04-27 13:58:58 -0700 |
commit | 92becb696bde7f0aa9687b2fe7505ed1ac9f493b (patch) | |
tree | 282939a886abe32375e0d12562858828956e419e | |
parent | 155700d67e8a90314770f7a57597ba922483b645 (diff) | |
download | ceph-92becb696bde7f0aa9687b2fe7505ed1ac9f493b.tar.gz |
FileJournal: simply flush by waiting for completions to empty
Signed-off-by: Samuel Just <samuel.just@dreamhost.com>
m--------- | ceph-object-corpus | 0 | ||||
-rw-r--r-- | src/os/FileJournal.cc | 41 | ||||
-rw-r--r-- | src/os/FileJournal.h | 11 |
3 files changed, 6 insertions, 46 deletions
diff --git a/ceph-object-corpus b/ceph-object-corpus -Subproject 17d4afca1c84f5471c2824876099fef456a3209 +Subproject 0b8475d5cbd442b6c2660a9ec45add80a23e26a diff --git a/src/os/FileJournal.cc b/src/os/FileJournal.cc index c70b7cc7f9e..f6b4ec1d8ff 100644 --- a/src/os/FileJournal.cc +++ b/src/os/FileJournal.cc @@ -825,6 +825,7 @@ void FileJournal::queue_completions_thru(uint64_t seq) completions.front().tracked_op->mark_event("journaled_completion_queued"); completions.pop_front(); } + queue_cond.Signal(); } int FileJournal::prepare_single_write(bufferlist& bl, off64_t& queue_pos, uint64_t& orig_ops, uint64_t& orig_bytes) @@ -1049,22 +1050,15 @@ void FileJournal::do_write(bufferlist& bl) } } } - { - Mutex::Locker locker(flush_lock); - writing = false; - write_empty_cond.Signal(); - } } void FileJournal::flush() { - flush_queue(); + dout(5) << "waiting for completions to empty" << dendl; { - Mutex::Locker locker(flush_lock); - while (writing) { - dout(5) << "flush waiting for writeq to empty and writes to complete" << dendl; - write_empty_cond.Wait(flush_lock); - } + Mutex::Locker l(queue_lock); + while (!completions.empty()) + queue_cond.Wait(queue_lock); } dout(5) << "flush waiting for finisher" << dendl; finisher->wait_for_empty(); @@ -1115,11 +1109,6 @@ void FileJournal::write_thread_entry() } #endif - { - Mutex::Locker locker(flush_lock); - writing = true; - } - Mutex::Locker locker(write_lock); uint64_t orig_ops = 0; uint64_t orig_bytes = 0; @@ -1145,8 +1134,6 @@ void FileJournal::write_thread_entry() put_throttle(orig_ops, orig_bytes); } - Mutex::Locker locker(flush_lock); - write_empty_cond.Signal(); dout(10) << "write_thread_entry finish" << dendl; } @@ -1367,15 +1354,6 @@ void FileJournal::check_aio_completion() // maybe write queue was waiting for aio count to drop? aio_cond.Signal(); - - // wake up flush? - if (aio_queue.empty()) { - Mutex::Locker locker(flush_lock); - writing = false; - write_empty_cond.Signal(); - assert(aio_num == 0); - assert(aio_bytes == 0); - } } } #endif @@ -1438,15 +1416,6 @@ void FileJournal::pop_write() assert(write_lock.is_locked()); Mutex::Locker locker(queue_lock); writeq.pop_front(); - if (writeq.empty()) - queue_cond.Signal(); -} - -void FileJournal::flush_queue() -{ - Mutex::Locker locker(queue_lock); - while (!writeq.empty()) - queue_cond.Wait(queue_lock); } void FileJournal::commit_start() diff --git a/src/os/FileJournal.h b/src/os/FileJournal.h index 509d879a497..10f380d20b5 100644 --- a/src/os/FileJournal.h +++ b/src/os/FileJournal.h @@ -32,7 +32,7 @@ using std::deque; /** * Implements journaling on top of block device or file. * - * Lock ordering is write_lock > aio_lock > queue_lock > flush_lock + * Lock ordering is write_lock > aio_lock > queue_lock */ class FileJournal : public Journal { public: @@ -67,7 +67,6 @@ public: bool writeq_empty(); write_item &peek_write(); void pop_write(); - void flush_queue(); void submit_entry(uint64_t seq, bufferlist& bl, int alignment, Context *oncommit, TrackedOpRef osd_op = TrackedOpRef()); @@ -164,12 +163,6 @@ public: private: string fn; - /// Protected by flush_lock - Mutex flush_lock; - Cond write_empty_cond; - bool writing; - /// End protected by flush_lock - char *zero_buf; off64_t max_size; @@ -302,8 +295,6 @@ private: journaled_seq(0), plug_journal_completions(false), fn(f), - flush_lock("FileJournal::flush_lock"), - writing(false), zero_buf(NULL), max_size(0), block_size(0), is_bdev(false), directio(dio), aio(ai), |