ceph_tid_t new_journal_tid) {
typedef std::vector<std::pair<uint64_t,uint64_t> > Extents;
+ ldout(m_ictx->cct, 20) << __func__ << ": " << oid << " "
+ << off << "~" << len << " "
+ << "journal_tid=" << original_journal_tid << ", "
+ << "new_journal_tid=" << new_journal_tid << dendl;
+
assert(m_ictx->owner_lock.is_locked());
uint64_t object_no = oid_to_object_no(oid.name, m_ictx->object_prefix);
if (p == data.end()) {
if (final == NULL) {
final = new BufferHead(this);
+ replace_journal_tid(final, tid);
final->set_start( cur );
final->set_length( max );
oc->bh_add(this, final);
ldout(oc->cct, 10) << "map_write adding trailing bh " << *final << dendl;
} else {
- replace_journal_tid(final, tid);
oc->bh_stat_sub(final);
final->set_length(final->length() + max);
oc->bh_stat_add(final);
cur += max;
continue;
}
-
+
ldout(oc->cct, 10) << "cur is " << cur << ", p is " << *p->second << dendl;
//oc->verify_stats();
if (p->first <= cur) {
BufferHead *bh = p->second;
ldout(oc->cct, 10) << "map_write bh " << *bh << " intersected" << dendl;
-
+
if (p->first < cur) {
assert(final == 0);
if (cur + max >= bh->end()) {
// we want right bit (one splice)
final = split(bh, cur); // just split it, take right half.
+ replace_journal_tid(final, tid);
++p;
assert(p->second == final);
} else {
++p;
assert(p->second == final);
split(final, cur+max);
+ replace_journal_tid(final, tid);
}
} else {
assert(p->first == cur);
oc->mark_dirty(final);
--p; // move iterator back to final
assert(p->second == final);
- replace_journal_tid(bh, 0);
+ replace_journal_tid(bh, tid);
merge_left(final, bh);
} else {
final = bh;
+ replace_journal_tid(final, tid);
}
}
-
+
// keep going.
loff_t lenfromcur = final->end() - cur;
cur += lenfromcur;
left -= lenfromcur;
++p;
- continue;
+ continue;
} else {
// gap!
loff_t next = p->first;
loff_t glen = MIN(next - cur, max);
ldout(oc->cct, 10) << "map_write gap " << cur << "~" << glen << dendl;
if (final) {
- replace_journal_tid(final, tid);
oc->bh_stat_sub(final);
final->set_length(final->length() + glen);
oc->bh_stat_add(final);
} else {
final = new BufferHead(this);
+ replace_journal_tid(final, tid);
final->set_start( cur );
final->set_length( glen );
oc->bh_add(this, final);
}
-
+
cur += glen;
left -= glen;
continue; // more?
// set version
assert(final);
- replace_journal_tid(final, tid);
+ assert(final->get_journal_tid() == tid);
ldout(oc->cct, 10) << "map_write final is " << *final << dendl;
return final;