objecter
objectcacher
+- ocacher flushing
- ocacher caps transitions vs locks
-- ocacher flushing, pin Objects* while locks held
- test read locks
if (!replay_queue.empty()) {
eversion_t c = info.last_update;
list<Message*> replay;
- list<Message*> after;
for (map<eversion_t,MOSDOp*>::iterator p = replay_queue.begin();
p != replay_queue.end();
p++) {
if (p->first <= info.last_update) {
dout(10) << "activate will WRNOOP " << p->first << " " << *p->second << endl;
- after.push_back(p->second);
+ replay.push_back(p->second);
continue;
}
if (p->first.version != c.version+1) {
}
replay_queue.clear();
osd->take_waiters(replay);
- osd->take_waiters(after);
}
// waiters
ob->last_ack_tid = tid;
finish_contexts(ls);
+
+ if (ob->can_close())
+ close_object(ob);
} else {
dout(10) << "lock_ack " << *ob
<< " tid " << tid << " obsolete" << endl;
bh_remove(ob, bh);
delete bh;
- if (ob->is_empty()) {
+ if (ob->can_close()) {
dout(10) << "trim trimming " << *ob << endl;
close_object(ob);
}
object_t get_oid() { return oid; }
inodeno_t get_ino() { return ino; }
+ bool can_close() {
+ return data.empty() && lock_state == LOCK_NONE;
+ }
// bh
void add_bh(BufferHead *bh) {
return o;
}
void close_object(Object *ob) {
+ assert(ob->can_close());
+
+ // ok!
objects.erase(ob->get_oid());
objects_by_ino[ob->get_ino()].erase(ob);
if (objects_by_ino[ob->get_ino()].empty())