summaryrefslogtreecommitdiff
path: root/src/os
diff options
context:
space:
mode:
authorSage Weil <sage.weil@dreamhost.com>2012-04-21 21:01:49 -0700
committerSage Weil <sage.weil@dreamhost.com>2012-04-21 21:01:49 -0700
commitbe438d6e4e1ced8365b772ff97976e053cbb29ac (patch)
tree70043326cb79afa5d0cb8e969f9619a05dc90da2 /src/os
parent97f507ffb7e2818c5355f5f275df5f16e1df250a (diff)
parentfb9fdf45b08aac50928d311832fd23a86c9b5f89 (diff)
downloadceph-be438d6e4e1ced8365b772ff97976e053cbb29ac.tar.gz
Merge branch 'master' into wip-discard
Diffstat (limited to 'src/os')
-rw-r--r--src/os/FileJournal.cc40
-rw-r--r--src/os/FileStore.cc12
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);
}