dout(10) << "merge_left result " << *left << endl;
}
+void ObjectCacher::Object::try_merge_bh(BufferHead *bh)
+{
+ dout(10) << "try_merge_bh " << *bh << endl;
+
+ // to the left?
+ map<off_t,BufferHead*>::iterator p = data.find(bh->start());
+ assert(p->second == bh);
+ if (p != data.begin()) {
+ p--;
+ if (p->second->end() == bh->start() &&
+ p->second->get_state() == bh->get_state()) {
+ merge_left(p->second, bh);
+ bh = p->second;
+ } else
+ p++;
+ }
+ // to the right?
+ assert(p->second == bh);
+ p++;
+ if (p != data.end() &&
+ p->second->start() == bh->end() &&
+ p->second->get_state() == bh->get_state())
+ merge_left(bh, p->second);
+}
/*
}
+
+
+
/*** ObjectCacher ***/
#undef dout
opos = bh->end();
p++;
-
+
// finishers?
// called with lock held.
list<Context*> ls;
ls.splice(ls.end(), p->second);
bh->waitfor_read.clear();
finish_contexts(ls);
+
+ // clean up?
+ ob->try_merge_bh(bh);
}
}
//lock.Unlock();
opos += f_it->second;
}
- // it's dirty.
+ // ok, now bh is dirty.
mark_dirty(bh);
touch_bh(bh);
bh->last_write = now;
- // combine with left?
- map<off_t,BufferHead*>::iterator p = o->data.find(bh->start());
- assert(p->second == bh);
- if (p != o->data.begin()) {
- p--;
- if (p->second->is_dirty() &&
- p->second->end() == bh->start()) {
- o->merge_left(p->second, bh);
- bh = p->second;
- } else
- p++;
- }
- // combine to the right?
- assert(p->second == bh);
- p++;
- if (p != o->data.end() &&
- !p->second->is_dirty() &&
- p->second->start() > bh->end())
- o->merge_left(bh, p->second);
+ o->try_merge_bh(bh);
}
delete wr;
// mid-level
BufferHead *split(BufferHead *bh, off_t off);
void merge_left(BufferHead *left, BufferHead *right);
- void merge_right(BufferHead *left, BufferHead *right);
+ void try_merge_bh(BufferHead *bh);
int map_read(Objecter::OSDRead *rd,
map<off_t, BufferHead*>& hits,
map<off_t, BufferHead*>& rx);
BufferHead *map_write(Objecter::OSDWrite *wr);
- void truncate(off_t s);
+ void truncate(off_t s);
+
};
// ******* ObjectCacher *********