summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Just <rexludorum@gmail.com>2012-04-26 21:29:45 -0700
committerSamuel Just <samuel.just@dreamhost.com>2012-04-27 13:58:58 -0700
commit92becb696bde7f0aa9687b2fe7505ed1ac9f493b (patch)
tree282939a886abe32375e0d12562858828956e419e
parent155700d67e8a90314770f7a57597ba922483b645 (diff)
downloadceph-92becb696bde7f0aa9687b2fe7505ed1ac9f493b.tar.gz
FileJournal: simply flush by waiting for completions to empty
Signed-off-by: Samuel Just <samuel.just@dreamhost.com>
m---------ceph-object-corpus0
-rw-r--r--src/os/FileJournal.cc41
-rw-r--r--src/os/FileJournal.h11
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),