if (full_commit_seq || full_restart_seq)
return false;
+ retry:
+ off64_t room = (header.max_size - pos) + (header.start - get_top());
+
if (do_sync_cond) {
- __s64 approxroom = header.wrap ?
- header.wrap + *pos - header.start :
- header.max_size + header.start - *pos;
- if (approxroom < (header.max_size >> 1) &&
- approxroom + size > (header.max_size >> 1))
+ if (room < (header.max_size >> 1) &&
+ room + size > (header.max_size >> 1))
do_sync_cond->Signal(); // initiate a real commit so we can trim
}
- // does it fit?
- if (header.wrap) {
- // we're wrapped. don't overwrite ourselves.
-
- if (*pos + size < header.start)
- return true; // fits
-
- dout(1) << "JOURNAL FULL (and wrapped), " << *pos << "+" << size
- << " >= " << header.start
- << dendl;
- } else {
- // we haven't wrapped.
-
- if (*pos + size < header.max_size)
- return true; // fits
+ if (room >= size) {
+ dout(10) << "check_for_full at " << pos << " : " << size << " < " << room << dendl;
+
- if (!can_wrap)
- return false; // can't wrap just now..
++ // wait?
++ if (wait_on_full) {
++ dout(1) << "check_for_full waiting for a commit" << dendl;
++ commit_cond.Wait(write_lock);
++ goto retry;
++ }
+
- // is there room if we wrap?
- if (get_top() + size < header.start) {
- // yes!
- dout(10) << " wrapping from " << *pos << " to " << get_top() << dendl;
- header.wrap = *pos;
- *pos = get_top();
+ if (pos + size > header.max_size)
must_write_header = true;
- return true;
- }
-
- // no room.
- dout(1) << "submit_entry JOURNAL FULL (and can't wrap), " << *pos << "+" << size
- << " >= " << header.max_size
- << dendl;
+ return true;
}
- // wait?
- if (wait_on_full) {
- dout(1) << "submit_entry waiting for a commit" << dendl;
- commit_cond.Wait(write_lock);
- goto retry;
- }
-
+ // full
+ dout(1) << "check_for_full at " << pos << " : JOURNAL FULL "
+ << pos << " >= " << room
+ << " (max_size " << header.max_size << " start " << header.start << ")"
+ << dendl;
full_commit_seq = seq;
full_restart_seq = seq+1;
while (!writeq.empty()) {
}
bufferlist bl;
- if (directio)
- prepare_single_dio_write(bl);
- else
- prepare_multi_write(bl);
+ prepare_multi_write(bl);
do_write(bl);
}
-
+ write_empty_cond.Signal();
write_lock.Unlock();
dout(10) << "write_thread_entry finish" << dendl;
}