LingerOp *info = iter->second;
info->session_item.remove_myself();
linger_ops.erase(iter);
- delete info;
+ info->put();
logger->set(l_osdc_linger_active, linger_ops.size());
}
}
}
objecter->unregister_linger(op->linger_id);
}
+ op->put();
}
void Objecter::op_check_for_latest_map(Op *op)
void Objecter::linger_check_for_latest_map(LingerOp *op)
{
+ op->get();
check_latest_map_lingers[op->linger_id] = op;
monc->is_latest_map("osdmap", osdmap->get_epoch(),
new C_Linger_Map_Latest(this, op->linger_id));
map<uint64_t, LingerOp*>::iterator iter =
check_latest_map_lingers.find(op->linger_id);
if (iter != check_latest_map_lingers.end()) {
+ LingerOp *op = iter->second;
+ op->put();
check_latest_map_lingers.erase(iter);
}
}
// -- lingering ops --
- struct LingerOp {
+ struct LingerOp : public RefCountedObject {
uint64_t linger_id;
object_t oid;
object_locator_t oloc;
// no copy!
const LingerOp &operator=(const LingerOp& r);
LingerOp(const LingerOp& o);
+ private:
+ ~LingerOp() {}
};
struct C_Linger_Ack : public Context {
Objecter *objecter;
LingerOp *info;
- C_Linger_Ack(Objecter *o, LingerOp *l) : objecter(o), info(l) {}
+ C_Linger_Ack(Objecter *o, LingerOp *l) : objecter(o), info(l) {
+ info->get();
+ }
+ ~C_Linger_Ack() {
+ info->put();
+ }
void finish(int r) {
objecter->_linger_ack(info, r);
}
struct C_Linger_Commit : public Context {
Objecter *objecter;
LingerOp *info;
- C_Linger_Commit(Objecter *o, LingerOp *l) : objecter(o), info(l) {}
+ C_Linger_Commit(Objecter *o, LingerOp *l) : objecter(o), info(l) {
+ info->get();
+ }
+ ~C_Linger_Commit() {
+ info->put();
+ }
void finish(int r) {
objecter->_linger_commit(info, r);
}