rgw: RGWCoroutine::set_sleeping() checks for null stack

users of the RGWOmapAppend coroutine don't manage the lifetime of its
underlying coroutine stack, so end up making calls on RGWOmapAppend
after its stack goes away. this null check is a band-aid, and there are
still several other calls in RGWCoroutine that don't check for null
stack

Fixes: https://tracker.ceph.com/issues/49302

Signed-off-by: Or Friedmann <ofriedma@redhat.com>
Signed-off-by: Casey Bodley <cbodley@redhat.com>
This commit is contained in:
Or Friedmann 2022-04-19 12:00:28 +00:00 committed by Casey Bodley
parent 5720cca2f8
commit 3f0f831d66

View File

@ -143,15 +143,20 @@ RGWCoroutine::~RGWCoroutine() {
void RGWCoroutine::init_new_io(RGWIOProvider *io_provider)
{
ceph_assert(stack); // if there's no stack, io_provider won't be uninitialized
stack->init_new_io(io_provider);
}
void RGWCoroutine::set_io_blocked(bool flag) {
stack->set_io_blocked(flag);
if (stack) {
stack->set_io_blocked(flag);
}
}
void RGWCoroutine::set_sleeping(bool flag) {
stack->set_sleeping(flag);
if (stack) {
stack->set_sleeping(flag);
}
}
int RGWCoroutine::io_block(int ret, int64_t io_id) {
@ -159,6 +164,9 @@ int RGWCoroutine::io_block(int ret, int64_t io_id) {
}
int RGWCoroutine::io_block(int ret, const rgw_io_id& io_id) {
if (!stack) {
return 0;
}
if (stack->consume_io_finish(io_id)) {
return 0;
}
@ -168,7 +176,9 @@ int RGWCoroutine::io_block(int ret, const rgw_io_id& io_id) {
}
void RGWCoroutine::io_complete(const rgw_io_id& io_id) {
stack->io_complete(io_id);
if (stack) {
stack->io_complete(io_id);
}
}
void RGWCoroutine::StatusItem::dump(Formatter *f) const {