map<pg_shard_t, vector<PushOp> > pushes;
map<pg_shard_t, vector<PushReplyOp> > push_replies;
ObjectStore::Transaction *t;
- RecoveryMessages() : t(new ObjectStore::Transaction) {}
+ RecoveryMessages() : t(NULL) {}
~RecoveryMessages() { assert(!t); }
};
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) {
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(
case MSG_OSD_PG_PUSH: {
MOSDPGPush *op = static_cast<MOSDPGPush *>(_op->get_req());
RecoveryMessages rm;
+ rm.t = new ObjectStore::Transaction;
+ assert(rm.t);
for (vector<PushOp>::iterator i = op->pushes.begin();
i != op->pushes.end();
++i) {