Skip to content

Commit 2455a71

Browse files
committed
librados: linger callbacks hold a reference to LingerOp
preserve a reference to LingerOp in case their invocation races with another linger_cancel() Signed-off-by: Casey Bodley <[email protected]>
1 parent 344159e commit 2455a71

File tree

1 file changed

+14
-10
lines changed

1 file changed

+14
-10
lines changed

src/librados/IoCtxImpl.cc

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -88,25 +88,28 @@ struct CB_notify_Finish {
8888

8989
struct CB_aio_linger_cancel {
9090
Objecter *objecter;
91-
Objecter::LingerOp *linger_op;
91+
boost::intrusive_ptr<Objecter::LingerOp> linger_op;
9292

93-
CB_aio_linger_cancel(Objecter *_objecter, Objecter::LingerOp *_linger_op)
94-
: objecter(_objecter), linger_op(_linger_op)
93+
CB_aio_linger_cancel(Objecter *_objecter,
94+
boost::intrusive_ptr<Objecter::LingerOp> op)
95+
: objecter(_objecter), linger_op(std::move(op))
9596
{
9697
}
9798

9899
void operator()() {
99-
objecter->linger_cancel(linger_op);
100+
objecter->linger_cancel(linger_op.get());
100101
}
101102
};
102103

103104
struct C_aio_linger_Complete : public Context {
104105
AioCompletionImpl *c;
105-
Objecter::LingerOp *linger_op;
106+
boost::intrusive_ptr<Objecter::LingerOp> linger_op;
106107
bool cancel;
107108

108-
C_aio_linger_Complete(AioCompletionImpl *_c, Objecter::LingerOp *_linger_op, bool _cancel)
109-
: c(_c), linger_op(_linger_op), cancel(_cancel)
109+
C_aio_linger_Complete(AioCompletionImpl *_c,
110+
boost::intrusive_ptr<Objecter::LingerOp> op,
111+
bool _cancel)
112+
: c(_c), linger_op(std::move(op)), cancel(_cancel)
110113
{
111114
c->get();
112115
}
@@ -115,7 +118,7 @@ struct C_aio_linger_Complete : public Context {
115118
if (cancel || r < 0)
116119
boost::asio::defer(c->io->client->finish_strand,
117120
CB_aio_linger_cancel(c->io->objecter,
118-
linger_op));
121+
std::move(linger_op)));
119122

120123
c->lock.lock();
121124
c->rval = r;
@@ -136,8 +139,9 @@ struct C_aio_notify_Complete : public C_aio_linger_Complete {
136139
bool finished = false;
137140
int ret_val = 0;
138141

139-
C_aio_notify_Complete(AioCompletionImpl *_c, Objecter::LingerOp *_linger_op)
140-
: C_aio_linger_Complete(_c, _linger_op, false) {
142+
C_aio_notify_Complete(AioCompletionImpl *_c,
143+
boost::intrusive_ptr<Objecter::LingerOp> op)
144+
: C_aio_linger_Complete(_c, std::move(op), false) {
141145
}
142146

143147
void handle_ack(int r) {

0 commit comments

Comments
 (0)