Use set_immediate() in osd_flush to prevent stack overflows on repeated errors

This commit is contained in:
Vitaliy Filippov
2025-08-10 17:58:01 +03:00
parent 918ea34af2
commit 4793dbe9c3
+5 -2
View File
@@ -310,7 +310,9 @@ void osd_t::submit_recovery_op(osd_recovery_op_t *op)
op->osd_op->peer_fd = -1; op->osd_op->peer_fd = -1;
op->osd_op->callback = [this, op](osd_op_t *osd_op) op->osd_op->callback = [this, op](osd_op_t *osd_op)
{ {
if (osd_op->reply.hdr.retval < 0) ringloop->set_immediate([this, op]()
{
if (op->osd_op->reply.hdr.retval < 0)
{ {
// Error recovering object // Error recovering object
// EPIPE is totally harmless (peer is gone), others like EIO/EDOM may be not // EPIPE is totally harmless (peer is gone), others like EIO/EDOM may be not
@@ -318,7 +320,7 @@ void osd_t::submit_recovery_op(osd_recovery_op_t *op)
"[PG %u/%u] Recovery operation failed with object %jx:%jx: error %jd\n", "[PG %u/%u] Recovery operation failed with object %jx:%jx: error %jd\n",
INODE_POOL(op->oid.inode), INODE_POOL(op->oid.inode),
map_to_pg(op->oid, st_cli.pool_config.at(INODE_POOL(op->oid.inode)).pg_stripe_size), map_to_pg(op->oid, st_cli.pool_config.at(INODE_POOL(op->oid.inode)).pg_stripe_size),
op->oid.inode, op->oid.stripe, osd_op->reply.hdr.retval op->oid.inode, op->oid.stripe, op->osd_op->reply.hdr.retval
); );
} }
else if (log_level > 2) else if (log_level > 2)
@@ -326,6 +328,7 @@ void osd_t::submit_recovery_op(osd_recovery_op_t *op)
printf("Recovery operation done for %jx:%jx\n", op->oid.inode, op->oid.stripe); printf("Recovery operation done for %jx:%jx\n", op->oid.inode, op->oid.stripe);
} }
finish_recovery_op(op); finish_recovery_op(op);
});
}; };
exec_op(op->osd_op); exec_op(op->osd_op);
} }