From: Jianpeng Ma Date: Thu, 11 Jun 2015 05:46:36 +0000 (+0800) Subject: ECBackend:Only there are push, it queue transaction. X-Git-Tag: v9.0.3~56^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2fb380e9020333a20a7e5e8a9d55e6e48bf9d357;p=ceph.git ECBackend:Only there are push, it queue transaction. For normal ec read, it don't need transaction. In fact it only for MSG_OSD_PG_PUSH. Signed-off-by: Jianpeng Ma --- diff --git a/src/osd/ECBackend.cc b/src/osd/ECBackend.cc index b04776c15c38..b97361e79c7d 100644 --- a/src/osd/ECBackend.cc +++ b/src/osd/ECBackend.cc @@ -235,7 +235,7 @@ struct RecoveryMessages { map > pushes; map > push_replies; ObjectStore::Transaction *t; - RecoveryMessages() : t(new ObjectStore::Transaction) {} + RecoveryMessages() : t(NULL) {} ~RecoveryMessages() { assert(!t); } }; @@ -243,6 +243,8 @@ void ECBackend::handle_recovery_push( PushOp &op, RecoveryMessages *m) { + assert(m->t); + bool oneshot = op.before_progress.first && op.after_progress.data_complete; coll_t tcoll = oneshot ? coll : get_temp_coll(m->t); if (op.before_progress.first) { @@ -442,16 +444,22 @@ void ECBackend::dispatch_recovery_messages(RecoveryMessages &m, int priority) msg->compute_cost(cct); replies.insert(make_pair(i->first.osd, msg)); } - m.t->register_on_complete( - get_parent()->bless_context( - new SendPushReplies( - get_parent(), - get_parent()->get_epoch(), - replies))); - m.t->register_on_applied( - new ObjectStore::C_DeleteTransaction(m.t)); - get_parent()->queue_transaction(m.t); - m.t = NULL; + + if (!replies.empty()) { + m.t->register_on_complete( + get_parent()->bless_context( + new SendPushReplies( + get_parent(), + get_parent()->get_epoch(), + replies))); + m.t->register_on_applied( + new ObjectStore::C_DeleteTransaction(m.t)); + get_parent()->queue_transaction(m.t); + m.t = NULL; + } else { + assert(!m.t); + } + if (m.reads.empty()) return; start_read_op( @@ -687,6 +695,8 @@ bool ECBackend::handle_message( case MSG_OSD_PG_PUSH: { MOSDPGPush *op = static_cast(_op->get_req()); RecoveryMessages rm; + rm.t = new ObjectStore::Transaction; + assert(rm.t); for (vector::iterator i = op->pushes.begin(); i != op->pushes.end(); ++i) {