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)
}
}
}
- {
- 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();
}
#endif
- {
- Mutex::Locker locker(flush_lock);
- writing = true;
- }
-
Mutex::Locker locker(write_lock);
uint64_t orig_ops = 0;
uint64_t orig_bytes = 0;
put_throttle(orig_ops, orig_bytes);
}
- Mutex::Locker locker(flush_lock);
- write_empty_cond.Signal();
dout(10) << "write_thread_entry finish" << dendl;
}
// 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
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()
/**
* 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:
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());
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;
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),