diff options
author | Sage Weil <sage.weil@dreamhost.com> | 2012-04-21 21:01:49 -0700 |
---|---|---|
committer | Sage Weil <sage.weil@dreamhost.com> | 2012-04-21 21:01:49 -0700 |
commit | be438d6e4e1ced8365b772ff97976e053cbb29ac (patch) | |
tree | 70043326cb79afa5d0cb8e969f9619a05dc90da2 /src/os | |
parent | 97f507ffb7e2818c5355f5f275df5f16e1df250a (diff) | |
parent | fb9fdf45b08aac50928d311832fd23a86c9b5f89 (diff) | |
download | ceph-be438d6e4e1ced8365b772ff97976e053cbb29ac.tar.gz |
Merge branch 'master' into wip-discard
Diffstat (limited to 'src/os')
-rw-r--r-- | src/os/FileJournal.cc | 40 | ||||
-rw-r--r-- | src/os/FileStore.cc | 12 |
2 files changed, 30 insertions, 22 deletions
diff --git a/src/os/FileJournal.cc b/src/os/FileJournal.cc index 85f1c08ea69..c70b7cc7f9e 100644 --- a/src/os/FileJournal.cc +++ b/src/os/FileJournal.cc @@ -883,6 +883,7 @@ int FileJournal::prepare_single_write(bufferlist& bl, off64_t& queue_pos, uint64 if (next_write.tracked_op) next_write.tracked_op->mark_event("write_thread_in_journal_buffer"); + // pop from writeq pop_write(); journalq.push_back(pair<uint64_t,off64_t>(seq, queue_pos)); @@ -1023,35 +1024,36 @@ void FileJournal::do_write(bufferlist& bl) write_lock.Lock(); - { - Mutex::Locker locker(flush_lock); - writing = false; - write_empty_cond.Signal(); - } - // wrap if we hit the end of the journal if (pos == header.max_size) pos = get_top(); write_pos = pos; assert(write_pos % header.alignment == 0); - Mutex::Locker locker(queue_lock); - journaled_seq = writing_seq; + { + Mutex::Locker locker(queue_lock); + journaled_seq = writing_seq; - // kick finisher? - // only if we haven't filled up recently! - if (full_state != FULL_NOTFULL) { - dout(10) << "do_write NOT queueing finisher seq " << journaled_seq - << ", full_commit_seq|full_restart_seq" << dendl; - } else { - if (plug_journal_completions) { - dout(20) << "do_write NOT queueing finishers through seq " << journaled_seq - << " due to completion plug" << dendl; + // kick finisher? + // only if we haven't filled up recently! + if (full_state != FULL_NOTFULL) { + dout(10) << "do_write NOT queueing finisher seq " << journaled_seq + << ", full_commit_seq|full_restart_seq" << dendl; } else { - dout(20) << "do_write queueing finishers through seq " << journaled_seq << dendl; - queue_completions_thru(journaled_seq); + if (plug_journal_completions) { + dout(20) << "do_write NOT queueing finishers through seq " << journaled_seq + << " due to completion plug" << dendl; + } else { + dout(20) << "do_write queueing finishers through seq " << journaled_seq << dendl; + queue_completions_thru(journaled_seq); + } } } + { + Mutex::Locker locker(flush_lock); + writing = false; + write_empty_cond.Signal(); + } } void FileJournal::flush() diff --git a/src/os/FileStore.cc b/src/os/FileStore.cc index 9c922d8ce79..3611e5befaf 100644 --- a/src/os/FileStore.cc +++ b/src/os/FileStore.cc @@ -4586,15 +4586,21 @@ int FileStore::_collection_add(coll_t c, coll_t oldcid, const hobject_t& o, { dout(15) << "collection_add " << c << "/" << o << " from " << oldcid << "/" << o << dendl; - int cmp = _check_replay_guard(c, o, spos); - if (cmp < 0) + int dstcmp = _check_replay_guard(c, o, spos); + if (dstcmp < 0) + return 0; + + // check the src name too; it might have a newer guard, and we don't + // want to clobber it + int srccmp = _check_replay_guard(oldcid, o, spos); + if (srccmp < 0) return 0; // open guard on object so we don't any previous operations on the // new name that will modify the source inode. int fd = lfn_open(oldcid, o, 0); assert(fd >= 0); - if (cmp > 0) { + if (dstcmp > 0) { // if dstcmp == 0 the guard already says "in-progress" _set_replay_guard(fd, spos, true); } |