mon: fix leak of pool op reply data

We pass a pointer because it is an optional argument, but we shouldn't
put the bufferlist on the heap or else we have to manage it's life
cycle, and that's fragile (and previously broken).

Signed-off-by: Sage Weil <sage@inktank.com>
This commit is contained in:
Sage Weil 2012-12-08 21:44:54 -08:00
parent 25ea06969f
commit 333b3f43b5
2 changed files with 11 additions and 8 deletions

View File

@ -2979,7 +2979,6 @@ bool OSDMonitor::prepare_pool_op(MPoolOp *m)
return prepare_pool_op_auid(m);
}
bufferlist *blp = NULL;
int ret = 0;
bool changed = false;
@ -2990,6 +2989,8 @@ bool OSDMonitor::prepare_pool_op(MPoolOp *m)
else
pp = *osdmap.get_pg_pool(m->pool);
bufferlist reply_data;
// pool snaps vs unmanaged snaps are mutually exclusive
switch (m->op) {
case POOL_OP_CREATE_SNAP:
@ -3029,10 +3030,9 @@ bool OSDMonitor::prepare_pool_op(MPoolOp *m)
case POOL_OP_CREATE_UNMANAGED_SNAP:
{
blp = new bufferlist();
uint64_t snapid;
pp.add_unmanaged_snap(snapid);
::encode(snapid, *blp);
::encode(snapid, reply_data);
changed = true;
}
break;
@ -3055,7 +3055,7 @@ bool OSDMonitor::prepare_pool_op(MPoolOp *m)
}
out:
paxos->wait_for_commit(new OSDMonitor::C_PoolOp(this, m, ret, pending_inc.epoch, blp));
paxos->wait_for_commit(new OSDMonitor::C_PoolOp(this, m, ret, pending_inc.epoch, &reply_data));
propose_pending();
return false;
}

View File

@ -240,16 +240,19 @@ private:
MPoolOp *m;
int replyCode;
int epoch;
bufferlist *reply_data;
C_PoolOp(OSDMonitor * osd, MPoolOp *m_, int rc, int e, bufferlist *rd=NULL) :
osdmon(osd), m(m_), replyCode(rc), epoch(e), reply_data(rd) {}
bufferlist reply_data;
C_PoolOp(OSDMonitor * osd, MPoolOp *m_, int rc, int e, bufferlist *rd=NULL) :
osdmon(osd), m(m_), replyCode(rc), epoch(e) {
if (rd)
reply_data = *rd;
}
void finish(int r) {
if (r == -ECANCELED) {
if (m)
m->put();
return;
}
osdmon->_pool_op_reply(m, replyCode, epoch, reply_data);
osdmon->_pool_op_reply(m, replyCode, epoch, &reply_data);
}
};