ceph_tid_tObjecter::op_submit(Op*op,int*ctx_budget){RWLock::RLockerrl(rwlock);RWLock::Contextlc(rwlock,RWLock::Context::TakenForRead);return_op_submit_with_budget(op,lc,ctx_budget);}// 简单的throttle处理，以免发送太快
ceph_tid_tObjecter::_op_submit_with_budget(Op*op,RWLock::Context&lc,int*ctx_budget){assert(initialized.read());assert(op->ops.size()==op->out_bl.size());assert(op->ops.size()==op->out_rval.size());assert(op->ops.size()==op->out_handler.size());// throttle. before we look at any state, because
// take_op_budget() may drop our lock while it blocks.
if(!op->ctx_budgeted||(ctx_budget&&(*ctx_budget==-1))){intop_budget=_take_op_budget(op);// take and pass out the budget for the first OP
// in the context session
if(ctx_budget&&(*ctx_budget==-1)){*ctx_budget=op_budget;}}C_CancelOp*cb=NULL;if(osd_timeout>0){cb=newC_CancelOp(this);op->ontimeout=cb;}ceph_tid_ttid=_op_submit(op,lc);// 真正处理发送请求的地方
if(cb){cb->set_tid(tid);Mutex::Lockerl(timer_lock);timer.add_event_after(osd_timeout,op->ontimeout);}returntid;}