)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"0ad85fd0562b9b9fce15ca6044ddce81e93ddf64","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"0d02103a_4c055f99","updated":"2025-08-12 20:38:05.000000000","message":"again, nonblocking feedback","commit_id":"ff7a4804e944fa6de5e6d6131935f77127d17517"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"fb9ec9dcd2c2445a8b043d9c05429f67a1a37e91","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"67534aa5_5cb0cbaf","updated":"2025-08-12 22:50:49.000000000","message":"Looks good. Generally improves signal handling too IMO","commit_id":"7b0ae803ddabc5685f2a8f2a86631ee5c5804ad4"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"a64a29a3a053f67c7cf3b4ba9e240392cbcf060a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"08923543_940d2d5a","updated":"2025-08-14 21:16:00.000000000","message":"My first review pass. Looks good!","commit_id":"81cb3ba61f4ce9bfc811b0a35be2f2c0224e2db8"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"35fc165c3e82d4dbc550ebd0466faf71afcda986","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"dbb17082_79d070da","updated":"2025-08-14 17:17:30.000000000","message":"Only voting +1 because of the 6 weeks of context I missed on eventlet discussion, but this lgtm","commit_id":"81cb3ba61f4ce9bfc811b0a35be2f2c0224e2db8"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"7e4b2520a7d92f26fc6766b0d0202a2d9fc464dc","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":26,"id":"163aa272_f62a9976","updated":"2025-08-16 14:51:19.000000000","message":"The wording fix is the only tweak.","commit_id":"81cb3ba61f4ce9bfc811b0a35be2f2c0224e2db8"}],"ironic/command/__init__.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"2d928dc56886c6499cf13a59bd2705210fe3dcf6","unresolved":true,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"def my_default_backend():"},{"line_number":22,"context_line":"    return backend.BackendType.THREADING"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"# Register a default backend as threading, much like eventlet"}],"source_content_type":"text/x-python","patch_set":3,"id":"503cf05b_e68ba7ae","line":22,"updated":"2025-07-01 13:42:15.000000000","message":"I think what we could do here is if coytledon is installed, we can return threading automagically, since obviously some jobs don\u0027t get the version or inheratance at present.","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6f5ebf59f947510a5874ccd3a4f69c3a0fd7e7da","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"def my_default_backend():"},{"line_number":22,"context_line":"    return backend.BackendType.THREADING"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"# Register a default backend as threading, much like eventlet"}],"source_content_type":"text/x-python","patch_set":3,"id":"2c702195_d4fd4fd1","line":22,"in_reply_to":"143bd0fe_4641d2a0","updated":"2025-07-07 22:36:43.000000000","message":"Done","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"d7d8f45f3149945d2649d4ac6cd4bdf33b713c2d","unresolved":true,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"def my_default_backend():"},{"line_number":22,"context_line":"    return backend.BackendType.THREADING"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"# Register a default backend as threading, much like eventlet"}],"source_content_type":"text/x-python","patch_set":3,"id":"143bd0fe_4641d2a0","line":22,"in_reply_to":"503cf05b_e68ba7ae","updated":"2025-07-01 20:17:40.000000000","message":"Discussed with Dmitry, we\u0027re just going to force forward the treading model moving forward.","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"fb6db5f93bce253f1c6686316a0f2849d152ede0","unresolved":true,"context_lines":[{"line_number":24,"context_line":"# following thread invocations. Ultimately, while the python minimum is"},{"line_number":25,"context_line":"# any positive number with a minimum of 32760 Bytes, in 4096 Byte"},{"line_number":26,"context_line":"# increments, this appears to work well in basic benchmarking."},{"line_number":27,"context_line":"threading.stack_size(65536)"},{"line_number":28,"context_line":"i18n.install(\u0027ironic\u0027)"}],"source_content_type":"text/x-python","patch_set":22,"id":"cb912b84_1f426848","line":27,"updated":"2025-08-12 14:19:46.000000000","message":"nit: maybe allow tweaking this via an environment variable as the last resort of debugging potential issues?","commit_id":"5dc449d812c19677e6d3468a356c1d1d9cf9abf6"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"598e4225c5e51d8677ebc34de6c89b7deb634e00","unresolved":false,"context_lines":[{"line_number":24,"context_line":"# following thread invocations. Ultimately, while the python minimum is"},{"line_number":25,"context_line":"# any positive number with a minimum of 32760 Bytes, in 4096 Byte"},{"line_number":26,"context_line":"# increments, this appears to work well in basic benchmarking."},{"line_number":27,"context_line":"threading.stack_size(65536)"},{"line_number":28,"context_line":"i18n.install(\u0027ironic\u0027)"}],"source_content_type":"text/x-python","patch_set":22,"id":"ceecd5b8_e4301802","line":27,"in_reply_to":"cb912b84_1f426848","updated":"2025-08-12 21:23:39.000000000","message":"Done","commit_id":"5dc449d812c19677e6d3468a356c1d1d9cf9abf6"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"a64a29a3a053f67c7cf3b4ba9e240392cbcf060a","unresolved":true,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from ironic.common import i18n  # noqa"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"# NOTE(TheJulia): We are setting a default thread stack size to for all"},{"line_number":25,"context_line":"# following thread invocations. Ultimately, while the python minimum is"},{"line_number":26,"context_line":"# any positive number with a minimum of 32760 Bytes, in 4096 Byte"},{"line_number":27,"context_line":"# increments, this appears to work well in basic benchmarking."}],"source_content_type":"text/x-python","patch_set":26,"id":"4e9310da_adec5d61","line":24,"range":{"start_line":24,"start_character":61,"end_line":24,"end_character":68},"updated":"2025-08-14 21:16:00.000000000","message":"s/to for all/for all the/","commit_id":"81cb3ba61f4ce9bfc811b0a35be2f2c0224e2db8"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"7e4b2520a7d92f26fc6766b0d0202a2d9fc464dc","unresolved":true,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from ironic.common import i18n  # noqa"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"# NOTE(TheJulia): We are setting a default thread stack size to for all"},{"line_number":25,"context_line":"# following thread invocations. Ultimately, while the python minimum is"},{"line_number":26,"context_line":"# any positive number with a minimum of 32760 Bytes, in 4096 Byte"},{"line_number":27,"context_line":"# increments, this appears to work well in basic benchmarking."}],"source_content_type":"text/x-python","patch_set":26,"id":"b1b08142_52d7f12c","line":24,"range":{"start_line":24,"start_character":61,"end_line":24,"end_character":68},"in_reply_to":"4e9310da_adec5d61","updated":"2025-08-16 14:51:19.000000000","message":"```suggestion\n# NOTE(TheJulia): We are setting a default thread stack size for all the\n```","commit_id":"81cb3ba61f4ce9bfc811b0a35be2f2c0224e2db8"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"bfcfc4f0857ec01ab2d8246be5472c2dc4a6653c","unresolved":true,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from ironic.common import i18n  # noqa"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"# NOTE(TheJulia): We are setting a default thread stack size to for all"},{"line_number":25,"context_line":"# following thread invocations. Ultimately, while the python minimum is"},{"line_number":26,"context_line":"# any positive number with a minimum of 32760 Bytes, in 4096 Byte"},{"line_number":27,"context_line":"# increments, this appears to work well in basic benchmarking."}],"source_content_type":"text/x-python","patch_set":26,"id":"b78b0b74_75eaed66","line":24,"range":{"start_line":24,"start_character":61,"end_line":24,"end_character":68},"in_reply_to":"b1b08142_52d7f12c","updated":"2025-08-16 14:56:57.000000000","message":"putting this in I0409da2ad45df06f2dbd1c5cd3c2afd83ec10c32","commit_id":"81cb3ba61f4ce9bfc811b0a35be2f2c0224e2db8"}],"ironic/command/conductor.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"d7d8f45f3149945d2649d4ac6cd4bdf33b713c2d","unresolved":false,"context_lines":[{"line_number":90,"context_line":"             {\u0027host\u0027: CONF.host})"},{"line_number":91,"context_line":"    rpc_service.DEREGISTER.clear()"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"def handle_drain(signo, frame):"},{"line_number":94,"context_line":"    LOG.info(\u0027Got signal SIGUSR2. Initiating a workload drain on \u0027"},{"line_number":95,"context_line":"             \u0027on host %(host)s.\u0027,"},{"line_number":96,"context_line":"             {\u0027host\u0027: CONF.host})"}],"source_content_type":"text/x-python","patch_set":3,"id":"0b7155db_8ecfcd1f","line":93,"in_reply_to":"157c27fd_03676a9d","updated":"2025-07-01 20:17:40.000000000","message":"\u003e pep8: E302 expected 2 blank lines, found 1\n\nPlease fix.","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"2d928dc56886c6499cf13a59bd2705210fe3dcf6","unresolved":true,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"def handle_drain(signo, frame):"},{"line_number":94,"context_line":"    LOG.info(\u0027Got signal SIGUSR2. Initiating a workload drain on \u0027"},{"line_number":95,"context_line":"             \u0027on host %(host)s.\u0027,"},{"line_number":96,"context_line":"             {\u0027host\u0027: CONF.host})"},{"line_number":97,"context_line":"    rpc_server.DRAIN.set()"},{"line_number":98,"context_line":"    global launcher"}],"source_content_type":"text/x-python","patch_set":3,"id":"6b0a3053_dcce9d87","line":95,"updated":"2025-07-01 13:42:15.000000000","message":"nit: drain and shutdown","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"d7d8f45f3149945d2649d4ac6cd4bdf33b713c2d","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"def handle_drain(signo, frame):"},{"line_number":94,"context_line":"    LOG.info(\u0027Got signal SIGUSR2. Initiating a workload drain on \u0027"},{"line_number":95,"context_line":"             \u0027on host %(host)s.\u0027,"},{"line_number":96,"context_line":"             {\u0027host\u0027: CONF.host})"},{"line_number":97,"context_line":"    rpc_server.DRAIN.set()"},{"line_number":98,"context_line":"    global launcher"}],"source_content_type":"text/x-python","patch_set":3,"id":"d2f440ba_9dbf1770","line":95,"in_reply_to":"6b0a3053_dcce9d87","updated":"2025-07-01 20:17:40.000000000","message":"Done","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"d7d8f45f3149945d2649d4ac6cd4bdf33b713c2d","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    LOG.info(\u0027Got signal SIGUSR2. Initiating a workload drain on \u0027"},{"line_number":95,"context_line":"             \u0027on host %(host)s.\u0027,"},{"line_number":96,"context_line":"             {\u0027host\u0027: CONF.host})"},{"line_number":97,"context_line":"    rpc_server.DRAIN.set()"},{"line_number":98,"context_line":"    global launcher"},{"line_number":99,"context_line":"    # NOTE(TheJulia): This is sort of aggressive, but it works."},{"line_number":100,"context_line":"    # issue in part is we need to trigger the child process to execute,"}],"source_content_type":"text/x-python","patch_set":3,"id":"bb2010e2_016d7d08","line":97,"in_reply_to":"0fe8f56e_d3129ca7","updated":"2025-07-01 20:17:40.000000000","message":"\u003e pep8: F821 Undefined name `rpc_server`\n\nPlease fix.","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"d7d8f45f3149945d2649d4ac6cd4bdf33b713c2d","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    LOG.info(\u0027Got signal SIGUSR2. Initiating a workload drain on \u0027"},{"line_number":95,"context_line":"             \u0027on host %(host)s.\u0027,"},{"line_number":96,"context_line":"             {\u0027host\u0027: CONF.host})"},{"line_number":97,"context_line":"    rpc_server.DRAIN.set()"},{"line_number":98,"context_line":"    global launcher"},{"line_number":99,"context_line":"    # NOTE(TheJulia): This is sort of aggressive, but it works."},{"line_number":100,"context_line":"    # issue in part is we need to trigger the child process to execute,"}],"source_content_type":"text/x-python","patch_set":3,"id":"d1dbcb12_81ab8437","line":97,"in_reply_to":"3547bffc_a5fe2537","updated":"2025-07-01 20:17:40.000000000","message":"\u003e pep8: F821 undefined name \u0027rpc_server\u0027\n\nPlease fix.","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"d7d8f45f3149945d2649d4ac6cd4bdf33b713c2d","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    # parent process."},{"line_number":103,"context_line":"    launcher._manager._shutdown()"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"def handle_signal():"},{"line_number":106,"context_line":"    \"\"\"Add a signal handler for SIGUSR1, SIGUSR2."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    The SIGUSR1 handler ensures that the manager is not deregistered when"}],"source_content_type":"text/x-python","patch_set":3,"id":"4017f393_efeac11a","line":105,"in_reply_to":"6a075033_f858bb53","updated":"2025-07-01 20:17:40.000000000","message":"\u003e pep8: E302 expected 2 blank lines, found 1\n\nPlease fix.","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"2d928dc56886c6499cf13a59bd2705210fe3dcf6","unresolved":true,"context_lines":[{"line_number":139,"context_line":"    # Ultimately this returns a ServiceLauncher class which has a _manager"},{"line_number":140,"context_line":"    # object (cotyledon), and where launch_service has been invoked which"},{"line_number":141,"context_line":"    # adds an instance of the service to the _manager object."},{"line_number":142,"context_line":"    launcher \u003d service.launch(CONF, mgr, restart_method\u003d\u0027mutate\u0027)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    # The approach above also is for a single application where we then start a"},{"line_number":145,"context_line":"    # worker process."}],"source_content_type":"text/x-python","patch_set":3,"id":"ca6b3e3b_9f031d71","line":142,"updated":"2025-07-01 13:42:15.000000000","message":"For the combined proceses, we\u0027ll want to add a service to the launcher and fire it up all together.","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6d08ab6b04c6a2c3547976ebd7f209bebb63753a","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    # Ultimately this returns a ServiceLauncher class which has a _manager"},{"line_number":140,"context_line":"    # object (cotyledon), and where launch_service has been invoked which"},{"line_number":141,"context_line":"    # adds an instance of the service to the _manager object."},{"line_number":142,"context_line":"    launcher \u003d service.launch(CONF, mgr, restart_method\u003d\u0027mutate\u0027)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    # The approach above also is for a single application where we then start a"},{"line_number":145,"context_line":"    # worker process."}],"source_content_type":"text/x-python","patch_set":3,"id":"0a27eb5d_4ac628fd","line":142,"in_reply_to":"ca6b3e3b_9f031d71","updated":"2025-08-07 00:12:20.000000000","message":"Done","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"6718aeb105fa1eeae7fbfd185aa5500575949dee","unresolved":true,"context_lines":[{"line_number":155,"context_line":"    # which then will wait forever and never return."},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    # Set override signals."},{"line_number":158,"context_line":"    handle_signal()"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    # FIXME:"},{"line_number":161,"context_line":"    # Graceful timeout - \u003e need to overwrite"}],"source_content_type":"text/x-python","patch_set":3,"id":"c1408516_d5bed99a","line":158,"updated":"2025-07-01 10:10:51.000000000","message":"This logic should also be copied to the all-in-one command, right?","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6d08ab6b04c6a2c3547976ebd7f209bebb63753a","unresolved":false,"context_lines":[{"line_number":155,"context_line":"    # which then will wait forever and never return."},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    # Set override signals."},{"line_number":158,"context_line":"    handle_signal()"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    # FIXME:"},{"line_number":161,"context_line":"    # Graceful timeout - \u003e need to overwrite"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa8e888e_44499233","line":158,"in_reply_to":"662123f5_3c052dc8","updated":"2025-08-07 00:12:20.000000000","message":"Done","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"2d928dc56886c6499cf13a59bd2705210fe3dcf6","unresolved":true,"context_lines":[{"line_number":155,"context_line":"    # which then will wait forever and never return."},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    # Set override signals."},{"line_number":158,"context_line":"    handle_signal()"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    # FIXME:"},{"line_number":161,"context_line":"    # Graceful timeout - \u003e need to overwrite"}],"source_content_type":"text/x-python","patch_set":3,"id":"662123f5_3c052dc8","line":158,"in_reply_to":"c1408516_d5bed99a","updated":"2025-07-01 13:42:15.000000000","message":"Yeah, similar, nowhere near that yet.","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"053ce4baa94d182a238d50d660c2b3412842f0af","unresolved":true,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    # Set override signals."},{"line_number":163,"context_line":"    handle_signal()"},{"line_number":164,"context_line":"    # This is the only way to tell cotyledon what the setting is so it knows"},{"line_number":165,"context_line":"    # how long to wait before it forces workers to be shutdown."},{"line_number":166,"context_line":"    launcher._manager._graceful_shutdown_timeout \u003d \\"},{"line_number":167,"context_line":"        CONF.conductor.graceful_shutdown_timeout"},{"line_number":168,"context_line":"    sys.exit(launcher.wait())"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"92173414_a17d2c8f","line":167,"range":{"start_line":164,"start_character":0,"end_line":167,"end_character":48},"updated":"2025-07-02 20:44:12.000000000","message":"Would this \"just work\" with the \"oslo glue\" going on here: https://opendev.org/openstack/oslo.service/src/branch/master/oslo_service/backend/threading/service.py#L124 if we reverted https://review.opendev.org/c/openstack/ironic/+/953335?","commit_id":"20e06ca42851b80e67e7322e0e516fb7aac508ca"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"af3353dcdf65df7c09a86674babf0aacf812c633","unresolved":true,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    # Set override signals."},{"line_number":163,"context_line":"    handle_signal()"},{"line_number":164,"context_line":"    # This is the only way to tell cotyledon what the setting is so it knows"},{"line_number":165,"context_line":"    # how long to wait before it forces workers to be shutdown."},{"line_number":166,"context_line":"    launcher._manager._graceful_shutdown_timeout \u003d \\"},{"line_number":167,"context_line":"        CONF.conductor.graceful_shutdown_timeout"},{"line_number":168,"context_line":"    sys.exit(launcher.wait())"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5095633d_bd4a8a82","line":167,"range":{"start_line":164,"start_character":0,"end_line":167,"end_character":48},"in_reply_to":"4d03d7ce_d4317197","updated":"2025-08-12 19:13:01.000000000","message":"I guess we\u0027re sort of in indecision island because I\u0027ve gotten the impression the oslo option is on the way out.","commit_id":"20e06ca42851b80e67e7322e0e516fb7aac508ca"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7b9dfca538bc18417aed2f82cef8a80d43071c2c","unresolved":true,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    # Set override signals."},{"line_number":163,"context_line":"    handle_signal()"},{"line_number":164,"context_line":"    # This is the only way to tell cotyledon what the setting is so it knows"},{"line_number":165,"context_line":"    # how long to wait before it forces workers to be shutdown."},{"line_number":166,"context_line":"    launcher._manager._graceful_shutdown_timeout \u003d \\"},{"line_number":167,"context_line":"        CONF.conductor.graceful_shutdown_timeout"},{"line_number":168,"context_line":"    sys.exit(launcher.wait())"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"7c547de0_d8e80bba","line":167,"range":{"start_line":164,"start_character":0,"end_line":167,"end_character":48},"in_reply_to":"5095633d_bd4a8a82","updated":"2025-08-12 21:45:05.000000000","message":"I nuked it. We can revert the other change at this point if we want.","commit_id":"20e06ca42851b80e67e7322e0e516fb7aac508ca"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6f5ebf59f947510a5874ccd3a4f69c3a0fd7e7da","unresolved":true,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    # Set override signals."},{"line_number":163,"context_line":"    handle_signal()"},{"line_number":164,"context_line":"    # This is the only way to tell cotyledon what the setting is so it knows"},{"line_number":165,"context_line":"    # how long to wait before it forces workers to be shutdown."},{"line_number":166,"context_line":"    launcher._manager._graceful_shutdown_timeout \u003d \\"},{"line_number":167,"context_line":"        CONF.conductor.graceful_shutdown_timeout"},{"line_number":168,"context_line":"    sys.exit(launcher.wait())"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"fcb3851c_59ebf2b1","line":167,"range":{"start_line":164,"start_character":0,"end_line":167,"end_character":48},"in_reply_to":"92173414_a17d2c8f","updated":"2025-07-07 22:36:43.000000000","message":"Based upon my reading of the invoked code, it would not. We would always need to explicitly set it. But that being said, I might just be missing something in the stack.","commit_id":"20e06ca42851b80e67e7322e0e516fb7aac508ca"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"fb6db5f93bce253f1c6686316a0f2849d152ede0","unresolved":true,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    # Set override signals."},{"line_number":163,"context_line":"    handle_signal()"},{"line_number":164,"context_line":"    # This is the only way to tell cotyledon what the setting is so it knows"},{"line_number":165,"context_line":"    # how long to wait before it forces workers to be shutdown."},{"line_number":166,"context_line":"    launcher._manager._graceful_shutdown_timeout \u003d \\"},{"line_number":167,"context_line":"        CONF.conductor.graceful_shutdown_timeout"},{"line_number":168,"context_line":"    sys.exit(launcher.wait())"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"4d03d7ce_d4317197","line":167,"range":{"start_line":164,"start_character":0,"end_line":167,"end_character":48},"in_reply_to":"fcb3851c_59ebf2b1","updated":"2025-08-12 14:19:46.000000000","message":"It seems to do literally this, although, interestingly, the name is without underscore: https://github.com/sileht/cotyledon/blob/main/cotyledon/oslo_config_glue.py#L49-L50","commit_id":"20e06ca42851b80e67e7322e0e516fb7aac508ca"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"fb6db5f93bce253f1c6686316a0f2849d152ede0","unresolved":true,"context_lines":[{"line_number":146,"context_line":"    # the manager shutdown method is for parent process calls, in other words"},{"line_number":147,"context_line":"    # the application triggering a self shutdown. Utlimately this triggers the"},{"line_number":148,"context_line":"    # application stop() method to be called."},{"line_number":149,"context_line":"    launcher._manager._shutdown()"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"def handle_signal():"}],"source_content_type":"text/x-python","patch_set":22,"id":"57c02fe8_ce2a8a4e","line":149,"updated":"2025-08-12 14:19:46.000000000","message":"We need to expose this as a public API to protect us against oslo.service changes","commit_id":"5dc449d812c19677e6d3468a356c1d1d9cf9abf6"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"af3353dcdf65df7c09a86674babf0aacf812c633","unresolved":true,"context_lines":[{"line_number":146,"context_line":"    # the manager shutdown method is for parent process calls, in other words"},{"line_number":147,"context_line":"    # the application triggering a self shutdown. Utlimately this triggers the"},{"line_number":148,"context_line":"    # application stop() method to be called."},{"line_number":149,"context_line":"    launcher._manager._shutdown()"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"def handle_signal():"}],"source_content_type":"text/x-python","patch_set":22,"id":"badd8d0c_9f3e89d0","line":149,"in_reply_to":"57c02fe8_ce2a8a4e","updated":"2025-08-12 19:13:01.000000000","message":"issue under the hood is cotyledon already has a shutdown method, and _manager is oslo\u0027s preference to hide it. That being said, none of that is great. Let me see if I can get this to work with launcher.stop(), but I don\u0027t think it acutally does. :\\","commit_id":"5dc449d812c19677e6d3468a356c1d1d9cf9abf6"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7b9dfca538bc18417aed2f82cef8a80d43071c2c","unresolved":false,"context_lines":[{"line_number":146,"context_line":"    # the manager shutdown method is for parent process calls, in other words"},{"line_number":147,"context_line":"    # the application triggering a self shutdown. Utlimately this triggers the"},{"line_number":148,"context_line":"    # application stop() method to be called."},{"line_number":149,"context_line":"    launcher._manager._shutdown()"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"def handle_signal():"}],"source_content_type":"text/x-python","patch_set":22,"id":"bed27be8_7a436bee","line":149,"in_reply_to":"badd8d0c_9f3e89d0","updated":"2025-08-12 21:45:05.000000000","message":"Done","commit_id":"5dc449d812c19677e6d3468a356c1d1d9cf9abf6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"fb6db5f93bce253f1c6686316a0f2849d152ede0","unresolved":true,"context_lines":[{"line_number":207,"context_line":"    handle_signal()"},{"line_number":208,"context_line":"    # This is the only way to tell cotyledon what the setting is so it knows"},{"line_number":209,"context_line":"    # how long to wait before it forces workers to be shutdown."},{"line_number":210,"context_line":"    launcher._manager._graceful_shutdown_timeout \u003d \\"},{"line_number":211,"context_line":"        CONF.conductor.graceful_shutdown_timeout"},{"line_number":212,"context_line":"    sys.exit(launcher.wait())"},{"line_number":213,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"858635eb_5ab40c21","line":210,"updated":"2025-08-12 14:19:46.000000000","message":"Same, we really should not rely on private API, especially in this case where we won\u0027t notice if the variable is ever renamed.","commit_id":"5dc449d812c19677e6d3468a356c1d1d9cf9abf6"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7b9dfca538bc18417aed2f82cef8a80d43071c2c","unresolved":false,"context_lines":[{"line_number":207,"context_line":"    handle_signal()"},{"line_number":208,"context_line":"    # This is the only way to tell cotyledon what the setting is so it knows"},{"line_number":209,"context_line":"    # how long to wait before it forces workers to be shutdown."},{"line_number":210,"context_line":"    launcher._manager._graceful_shutdown_timeout \u003d \\"},{"line_number":211,"context_line":"        CONF.conductor.graceful_shutdown_timeout"},{"line_number":212,"context_line":"    sys.exit(launcher.wait())"},{"line_number":213,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"a87c0d8a_f1eaaf76","line":210,"in_reply_to":"858635eb_5ab40c21","updated":"2025-08-12 21:45:05.000000000","message":"Done","commit_id":"5dc449d812c19677e6d3468a356c1d1d9cf9abf6"}],"ironic/command/singleprocess.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"fb6db5f93bce253f1c6686316a0f2849d152ede0","unresolved":true,"context_lines":[{"line_number":29,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def handle_no_deregister(signo, frame):"},{"line_number":33,"context_line":"    LOG.info(\u0027Got signal SIGUSR1. Not deregistering on next shutdown \u0027"},{"line_number":34,"context_line":"             \u0027on host %(host)s.\u0027,"},{"line_number":35,"context_line":"             {\u0027host\u0027: CONF.host})"}],"source_content_type":"text/x-python","patch_set":22,"id":"718a53b0_89c907f8","line":32,"updated":"2025-08-12 14:19:46.000000000","message":"Could you move these 3 functions to a common place (probably a wrapper around launcher) to avoid duplication?","commit_id":"5dc449d812c19677e6d3468a356c1d1d9cf9abf6"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"af3353dcdf65df7c09a86674babf0aacf812c633","unresolved":true,"context_lines":[{"line_number":29,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def handle_no_deregister(signo, frame):"},{"line_number":33,"context_line":"    LOG.info(\u0027Got signal SIGUSR1. Not deregistering on next shutdown \u0027"},{"line_number":34,"context_line":"             \u0027on host %(host)s.\u0027,"},{"line_number":35,"context_line":"             {\u0027host\u0027: CONF.host})"}],"source_content_type":"text/x-python","patch_set":22,"id":"e6b5e4fa_f5f3f038","line":32,"in_reply_to":"718a53b0_89c907f8","updated":"2025-08-12 19:13:01.000000000","message":"Launcher needs to be able to be referenced as a global variable to be able to trigger the shutdown, and we can\u0027t set arguments on the mapping which needs to occur close to the launch so... If you have any ideas, by all means.\n\nKeep in mind, this is all parent process/parent thread code.","commit_id":"5dc449d812c19677e6d3468a356c1d1d9cf9abf6"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7b9dfca538bc18417aed2f82cef8a80d43071c2c","unresolved":false,"context_lines":[{"line_number":29,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def handle_no_deregister(signo, frame):"},{"line_number":33,"context_line":"    LOG.info(\u0027Got signal SIGUSR1. Not deregistering on next shutdown \u0027"},{"line_number":34,"context_line":"             \u0027on host %(host)s.\u0027,"},{"line_number":35,"context_line":"             {\u0027host\u0027: CONF.host})"}],"source_content_type":"text/x-python","patch_set":22,"id":"83e99151_77d6f51e","line":32,"in_reply_to":"e6b5e4fa_f5f3f038","updated":"2025-08-12 21:45:05.000000000","message":"Done","commit_id":"5dc449d812c19677e6d3468a356c1d1d9cf9abf6"}],"ironic/common/rpc_service.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"2d928dc56886c6499cf13a59bd2705210fe3dcf6","unresolved":true,"context_lines":[{"line_number":48,"context_line":"    def wait_for_start(self):"},{"line_number":49,"context_line":"        while not self._started and not self._failure:"},{"line_number":50,"context_line":"            time.sleep(0.1)"},{"line_number":51,"context_line":"        if self._failure:"},{"line_number":52,"context_line":"            LOG.critical(self._failure)"},{"line_number":53,"context_line":"            sys.exit(self._failure)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def start(self):"},{"line_number":56,"context_line":"        self._failure \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"904ee96f_2361bfcc","side":"PARENT","line":53,"range":{"start_line":51,"start_character":0,"end_line":53,"end_character":35},"updated":"2025-07-01 13:42:15.000000000","message":"The basic idea here is sort of actually useful. We might want to, as part of startup, if we detect any failure, to go ahead and sigterm the process after logging everything.","commit_id":"0f5aa35c8b381bd2a5a81e9cc901ce5dd70b6336"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6d08ab6b04c6a2c3547976ebd7f209bebb63753a","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    def wait_for_start(self):"},{"line_number":49,"context_line":"        while not self._started and not self._failure:"},{"line_number":50,"context_line":"            time.sleep(0.1)"},{"line_number":51,"context_line":"        if self._failure:"},{"line_number":52,"context_line":"            LOG.critical(self._failure)"},{"line_number":53,"context_line":"            sys.exit(self._failure)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def start(self):"},{"line_number":56,"context_line":"        self._failure \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"8ef5ce2a_68e83b41","side":"PARENT","line":53,"range":{"start_line":51,"start_character":0,"end_line":53,"end_character":35},"in_reply_to":"904ee96f_2361bfcc","updated":"2025-08-07 00:12:20.000000000","message":"FWIW, there is not a \"good\" way to do this, and it heavily relies upon everything being within the same process.","commit_id":"0f5aa35c8b381bd2a5a81e9cc901ce5dd70b6336"}],"ironic/conductor/base_manager.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"6718aeb105fa1eeae7fbfd185aa5500575949dee","unresolved":true,"context_lines":[{"line_number":374,"context_line":"        self._periodic_tasks.stop()"},{"line_number":375,"context_line":"        self._periodic_tasks.wait()"},{"line_number":376,"context_line":"        if (self._reserved_executor is not None"},{"line_number":377,"context_line":"            and len(self._reserved_executor._work_queue.queue) \u003e 0):"},{"line_number":378,"context_line":"            self._reserved_executor.shutdown(wait\u003dTrue)"},{"line_number":379,"context_line":"        else:"},{"line_number":380,"context_line":"            # FIXME(TheJulia): For some reason the executor shutdown"}],"source_content_type":"text/x-python","patch_set":3,"id":"980b9e45_d31cebe7","line":377,"updated":"2025-07-01 10:10:51.000000000","message":"This is racy. The queue may both grow and shrink between this and the next call.","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"2d928dc56886c6499cf13a59bd2705210fe3dcf6","unresolved":true,"context_lines":[{"line_number":374,"context_line":"        self._periodic_tasks.stop()"},{"line_number":375,"context_line":"        self._periodic_tasks.wait()"},{"line_number":376,"context_line":"        if (self._reserved_executor is not None"},{"line_number":377,"context_line":"            and len(self._reserved_executor._work_queue.queue) \u003e 0):"},{"line_number":378,"context_line":"            self._reserved_executor.shutdown(wait\u003dTrue)"},{"line_number":379,"context_line":"        else:"},{"line_number":380,"context_line":"            # FIXME(TheJulia): For some reason the executor shutdown"}],"source_content_type":"text/x-python","patch_set":3,"id":"b2194d58_80d5ab4b","line":377,"in_reply_to":"980b9e45_d31cebe7","updated":"2025-07-01 13:42:15.000000000","message":"Yeah, I was thinking of issuing shutdown and then as a next step checking. This is just largely to get us to a point (hence the fix me note below) so the service actually shuts down.","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6d08ab6b04c6a2c3547976ebd7f209bebb63753a","unresolved":false,"context_lines":[{"line_number":374,"context_line":"        self._periodic_tasks.stop()"},{"line_number":375,"context_line":"        self._periodic_tasks.wait()"},{"line_number":376,"context_line":"        if (self._reserved_executor is not None"},{"line_number":377,"context_line":"            and len(self._reserved_executor._work_queue.queue) \u003e 0):"},{"line_number":378,"context_line":"            self._reserved_executor.shutdown(wait\u003dTrue)"},{"line_number":379,"context_line":"        else:"},{"line_number":380,"context_line":"            # FIXME(TheJulia): For some reason the executor shutdown"}],"source_content_type":"text/x-python","patch_set":3,"id":"b7e80f64_c26471c4","line":377,"in_reply_to":"b2194d58_80d5ab4b","updated":"2025-08-07 00:12:20.000000000","message":"Done","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"6718aeb105fa1eeae7fbfd185aa5500575949dee","unresolved":true,"context_lines":[{"line_number":380,"context_line":"            # FIXME(TheJulia): For some reason the executor shutdown"},{"line_number":381,"context_line":"            # with wait\u003dTrue can lock with no work in the queue. This"},{"line_number":382,"context_line":"            # may just be a quark of trying to call wait() on a unused"},{"line_number":383,"context_line":"            # threadpool."},{"line_number":384,"context_line":"            self._reserved_executor.shutdown(wait\u003dFalse)"},{"line_number":385,"context_line":"        self._executor.shutdown(wait\u003dTrue)"},{"line_number":386,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1c418476_44460b2c","line":383,"updated":"2025-07-01 10:10:51.000000000","message":"I\u0027m happy to help with my (currently limited but hopefully still useful) brain power to fix this. I don\u0027t think we should rely on the workaround above.","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"2d928dc56886c6499cf13a59bd2705210fe3dcf6","unresolved":true,"context_lines":[{"line_number":380,"context_line":"            # FIXME(TheJulia): For some reason the executor shutdown"},{"line_number":381,"context_line":"            # with wait\u003dTrue can lock with no work in the queue. This"},{"line_number":382,"context_line":"            # may just be a quark of trying to call wait() on a unused"},{"line_number":383,"context_line":"            # threadpool."},{"line_number":384,"context_line":"            self._reserved_executor.shutdown(wait\u003dFalse)"},{"line_number":385,"context_line":"        self._executor.shutdown(wait\u003dTrue)"},{"line_number":386,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"f184438f_30775f68","line":383,"in_reply_to":"1c418476_44460b2c","updated":"2025-07-01 13:42:15.000000000","message":"I need to check, but I think we\u0027re hitting expected threadpool behavior for an unused thread pool.","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6d08ab6b04c6a2c3547976ebd7f209bebb63753a","unresolved":false,"context_lines":[{"line_number":380,"context_line":"            # FIXME(TheJulia): For some reason the executor shutdown"},{"line_number":381,"context_line":"            # with wait\u003dTrue can lock with no work in the queue. This"},{"line_number":382,"context_line":"            # may just be a quark of trying to call wait() on a unused"},{"line_number":383,"context_line":"            # threadpool."},{"line_number":384,"context_line":"            self._reserved_executor.shutdown(wait\u003dFalse)"},{"line_number":385,"context_line":"        self._executor.shutdown(wait\u003dTrue)"},{"line_number":386,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"f11f4cc5_73c48b0d","line":383,"in_reply_to":"f184438f_30775f68","updated":"2025-08-07 00:12:20.000000000","message":"Done","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"6718aeb105fa1eeae7fbfd185aa5500575949dee","unresolved":true,"context_lines":[{"line_number":382,"context_line":"            # may just be a quark of trying to call wait() on a unused"},{"line_number":383,"context_line":"            # threadpool."},{"line_number":384,"context_line":"            self._reserved_executor.shutdown(wait\u003dFalse)"},{"line_number":385,"context_line":"        self._executor.shutdown(wait\u003dTrue)"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        if self._zeroconf is not None:"},{"line_number":388,"context_line":"            self._zeroconf.close()"}],"source_content_type":"text/x-python","patch_set":3,"id":"d998c460_64c8a4e3","line":385,"updated":"2025-07-01 10:10:51.000000000","message":"Doesn\u0027t this shutdown suffer from the same problem?","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6d08ab6b04c6a2c3547976ebd7f209bebb63753a","unresolved":false,"context_lines":[{"line_number":382,"context_line":"            # may just be a quark of trying to call wait() on a unused"},{"line_number":383,"context_line":"            # threadpool."},{"line_number":384,"context_line":"            self._reserved_executor.shutdown(wait\u003dFalse)"},{"line_number":385,"context_line":"        self._executor.shutdown(wait\u003dTrue)"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        if self._zeroconf is not None:"},{"line_number":388,"context_line":"            self._zeroconf.close()"}],"source_content_type":"text/x-python","patch_set":3,"id":"7bcf8be3_9fe89d0e","line":385,"in_reply_to":"af270c93_de06db66","updated":"2025-08-07 00:12:20.000000000","message":"Comment based on older patchset.","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"2d928dc56886c6499cf13a59bd2705210fe3dcf6","unresolved":true,"context_lines":[{"line_number":382,"context_line":"            # may just be a quark of trying to call wait() on a unused"},{"line_number":383,"context_line":"            # threadpool."},{"line_number":384,"context_line":"            self._reserved_executor.shutdown(wait\u003dFalse)"},{"line_number":385,"context_line":"        self._executor.shutdown(wait\u003dTrue)"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        if self._zeroconf is not None:"},{"line_number":388,"context_line":"            self._zeroconf.close()"}],"source_content_type":"text/x-python","patch_set":3,"id":"af270c93_de06db66","line":385,"in_reply_to":"d998c460_64c8a4e3","updated":"2025-07-01 13:42:15.000000000","message":"No, it gets used. The code only ever used reserved if the main executor is full.","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"}],"ironic/conductor/rpc_service.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"6718aeb105fa1eeae7fbfd185aa5500575949dee","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"# Always set a flag for deregistering, we can unset it from the primary"},{"line_number":29,"context_line":"# procss and thread."},{"line_number":30,"context_line":"DEREGISTER \u003d multiprocessing.Event()"},{"line_number":31,"context_line":"DEREGISTER.set()"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# Flag which can be set to indicate if we need to drain the conductor"}],"source_content_type":"text/x-python","patch_set":3,"id":"7712be3d_85d7798f","line":30,"updated":"2025-07-01 10:10:51.000000000","message":"The usage of multiprocessing is confusing: we don\u0027t have several processes. The docs claim it\u0027s the same thing as threading.Event, so maybe use the latter.","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6d08ab6b04c6a2c3547976ebd7f209bebb63753a","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"# Always set a flag for deregistering, we can unset it from the primary"},{"line_number":29,"context_line":"# procss and thread."},{"line_number":30,"context_line":"DEREGISTER \u003d multiprocessing.Event()"},{"line_number":31,"context_line":"DEREGISTER.set()"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# Flag which can be set to indicate if we need to drain the conductor"}],"source_content_type":"text/x-python","patch_set":3,"id":"6d6f31c2_13d18a29","line":30,"in_reply_to":"75f77a25_bd9f91fa","updated":"2025-08-07 00:12:20.000000000","message":"I\u0027m going to revise the text to be a bit more verbose as to address any questions here. If there are any, we can revisit.","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"2d928dc56886c6499cf13a59bd2705210fe3dcf6","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"# Always set a flag for deregistering, we can unset it from the primary"},{"line_number":29,"context_line":"# procss and thread."},{"line_number":30,"context_line":"DEREGISTER \u003d multiprocessing.Event()"},{"line_number":31,"context_line":"DEREGISTER.set()"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# Flag which can be set to indicate if we need to drain the conductor"}],"source_content_type":"text/x-python","patch_set":3,"id":"75f77a25_bd9f91fa","line":30,"in_reply_to":"7712be3d_85d7798f","updated":"2025-07-01 13:42:15.000000000","message":"You\u0027ll need to check my notes on the etherpad on the process launch model. The runner library *always* launches a subprocss and then threads inside of that.\n\nI actually started with threading.Event and lost my mind and then realized the mutliprocssing invocation and magically this worked like a champ.","commit_id":"147a1449bdd16f880e4b6b4e5bf7b2ef7fc35b58"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"fb6db5f93bce253f1c6686316a0f2849d152ede0","unresolved":true,"context_lines":[{"line_number":47,"context_line":"        super().__init__(host, manager_module, manager_class)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @property"},{"line_number":50,"context_line":"    def deregister(self):"},{"line_number":51,"context_line":"        return DEREGISTER.is_set()"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def is_draining(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"cf889aa8_d70998e4","line":50,"updated":"2025-08-12 14:19:46.000000000","message":"nit: This name sounds like it will trigger the deregister.. in fact, it took me a while to understand what this property exposes since DEREGISTER is set when we\u0027re NOT deregistering.. maybe call it should_deregister or deregister_on_shutdown and add a docstring?","commit_id":"5dc449d812c19677e6d3468a356c1d1d9cf9abf6"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"af3353dcdf65df7c09a86674babf0aacf812c633","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        super().__init__(host, manager_module, manager_class)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @property"},{"line_number":50,"context_line":"    def deregister(self):"},{"line_number":51,"context_line":"        return DEREGISTER.is_set()"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def is_draining(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"4f2318be_3d59b1e4","line":50,"in_reply_to":"cf889aa8_d70998e4","updated":"2025-08-12 19:13:01.000000000","message":"Done","commit_id":"5dc449d812c19677e6d3468a356c1d1d9cf9abf6"}],"ironic/conf/conductor.py":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"0ad85fd0562b9b9fce15ca6044ddce81e93ddf64","unresolved":true,"context_lines":[{"line_number":28,"context_line":"opts \u003d ["},{"line_number":29,"context_line":"    cfg.IntOpt(\u0027workers_pool_size\u0027,"},{"line_number":30,"context_line":"               default\u003d300, min\u003d3,"},{"line_number":31,"context_line":"               help\u003d_(\u0027The size of the workers thread pool. \u0027"},{"line_number":32,"context_line":"                      \u0027Note that 2 threads will be reserved by the conductor \u0027"},{"line_number":33,"context_line":"                      \u0027itself for handling heart beats and periodic tasks. \u0027"},{"line_number":34,"context_line":"                      \u0027On top of that, `sync_power_state_workers` will take \u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"ca4c0ac6_d2072710","line":31,"updated":"2025-08-12 20:38:05.000000000","message":"Will the value that workers_pool_size is set to in most environments make sense in this model (generally)? I\u0027d assume yes given the default is the same?","commit_id":"ff7a4804e944fa6de5e6d6131935f77127d17517"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"1e90992a5d3e2bf76f9652435c0dc2207087af6e","unresolved":true,"context_lines":[{"line_number":28,"context_line":"opts \u003d ["},{"line_number":29,"context_line":"    cfg.IntOpt(\u0027workers_pool_size\u0027,"},{"line_number":30,"context_line":"               default\u003d300, min\u003d3,"},{"line_number":31,"context_line":"               help\u003d_(\u0027The size of the workers thread pool. \u0027"},{"line_number":32,"context_line":"                      \u0027Note that 2 threads will be reserved by the conductor \u0027"},{"line_number":33,"context_line":"                      \u0027itself for handling heart beats and periodic tasks. \u0027"},{"line_number":34,"context_line":"                      \u0027On top of that, `sync_power_state_workers` will take \u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"ccd55247_9bc4451c","line":31,"in_reply_to":"6a2b82ba_0e5363ab","updated":"2025-08-13 13:46:28.000000000","message":"TBH, if our pool was *smaller* by default, I would have advocated increasing it. 300 is reasonable and actually still kind of small in the grand scheme of the universe. When I compare to my slack client instance with like 136 threads.","commit_id":"ff7a4804e944fa6de5e6d6131935f77127d17517"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"598e4225c5e51d8677ebc34de6c89b7deb634e00","unresolved":true,"context_lines":[{"line_number":28,"context_line":"opts \u003d ["},{"line_number":29,"context_line":"    cfg.IntOpt(\u0027workers_pool_size\u0027,"},{"line_number":30,"context_line":"               default\u003d300, min\u003d3,"},{"line_number":31,"context_line":"               help\u003d_(\u0027The size of the workers thread pool. \u0027"},{"line_number":32,"context_line":"                      \u0027Note that 2 threads will be reserved by the conductor \u0027"},{"line_number":33,"context_line":"                      \u0027itself for handling heart beats and periodic tasks. \u0027"},{"line_number":34,"context_line":"                      \u0027On top of that, `sync_power_state_workers` will take \u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"6a2b82ba_0e5363ab","line":31,"in_reply_to":"ca4c0ac6_d2072710","updated":"2025-08-12 21:23:39.000000000","message":"Yes, basic testing yielded we didn\u0027t really need to change the pool size, but we do rely upon the futurist dynamic thread pool size which dynamically scales the pool so ideally you don\u0027t reach the upper end of the threadpool.","commit_id":"ff7a4804e944fa6de5e6d6131935f77127d17517"}],"ironic/tests/unit/__init__.py":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"0ad85fd0562b9b9fce15ca6044ddce81e93ddf64","unresolved":true,"context_lines":[{"line_number":22,"context_line":"   :platform: Unix"},{"line_number":23,"context_line":"\"\"\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"# NOTE(TheJulia): This is to force oslo_sevice from trying to use eventlet."},{"line_number":26,"context_line":"from oslo_service import backend"},{"line_number":27,"context_line":"backend.init_backend(backend.BackendType.THREADING)"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"b4fbb665_55c10a2f","line":25,"updated":"2025-08-12 20:38:05.000000000","message":"nit: service","commit_id":"ff7a4804e944fa6de5e6d6131935f77127d17517"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7b9dfca538bc18417aed2f82cef8a80d43071c2c","unresolved":false,"context_lines":[{"line_number":22,"context_line":"   :platform: Unix"},{"line_number":23,"context_line":"\"\"\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"# NOTE(TheJulia): This is to force oslo_sevice from trying to use eventlet."},{"line_number":26,"context_line":"from oslo_service import backend"},{"line_number":27,"context_line":"backend.init_backend(backend.BackendType.THREADING)"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"fe94666d_5b2b209f","line":25,"in_reply_to":"b4fbb665_55c10a2f","updated":"2025-08-12 21:45:05.000000000","message":"Done","commit_id":"ff7a4804e944fa6de5e6d6131935f77127d17517"}],"releasenotes/notes/threading-ironic-9873564daefcc1c2.yaml":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e9d14f75404dd2111f3f0e6a616666bdafcfecb5","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    performance should be an appropriate trade-off."},{"line_number":31,"context_line":"fixes:"},{"line_number":32,"context_line":"  - |"},{"line_number":33,"context_line":"    The ``eventlet`` library is no longer used by Ironic."}],"source_content_type":"text/x-yaml","patch_set":21,"id":"06572df4_538e6ba7","line":33,"updated":"2025-08-10 14:22:35.000000000","message":"I\u0027m going to slightly revise this text because we still have it in requirements, there is a final cleanup patch which addresses the lingering details.","commit_id":"d9c28176013bdd34439f11d8230385aa76ddf12e"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"fb6db5f93bce253f1c6686316a0f2849d152ede0","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Ironic now utilizes native python threads for all periodic and background"},{"line_number":5,"context_line":"    activities. This change is not configurable, and should any issues be"},{"line_number":6,"context_line":"    observed with Ironic\u0027s operation, please do not hesitate to report them"},{"line_number":7,"context_line":"    to the developer community."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"69306157_d6d98391","line":4,"updated":"2025-08-12 14:19:46.000000000","message":"nit: Python (or better OS since these are not really Python threads)","commit_id":"5dc449d812c19677e6d3468a356c1d1d9cf9abf6"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"af3353dcdf65df7c09a86674babf0aacf812c633","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Ironic now utilizes native python threads for all periodic and background"},{"line_number":5,"context_line":"    activities. This change is not configurable, and should any issues be"},{"line_number":6,"context_line":"    observed with Ironic\u0027s operation, please do not hesitate to report them"},{"line_number":7,"context_line":"    to the developer community."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"63e3fa13_583db51a","line":4,"in_reply_to":"69306157_d6d98391","updated":"2025-08-12 19:13:01.000000000","message":"True!","commit_id":"5dc449d812c19677e6d3468a356c1d1d9cf9abf6"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"0ad85fd0562b9b9fce15ca6044ddce81e93ddf64","unresolved":true,"context_lines":[{"line_number":26,"context_line":"    track with the current number of active threads being executed upon."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    The Ironic project is aware this may require some tuning of settings"},{"line_number":29,"context_line":"    and even memory allocations. However, the improved concurrency and"},{"line_number":30,"context_line":"    performance should be an appropriate trade-off."},{"line_number":31,"context_line":"fixes:"},{"line_number":32,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":23,"id":"de7949d6_b13dfc88","line":29,"updated":"2025-08-12 20:38:05.000000000","message":"What settings? I understand if we don\u0027t know yet, but this release note could be improved by enumerating config variables which operators may want to audit.","commit_id":"ff7a4804e944fa6de5e6d6131935f77127d17517"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7b9dfca538bc18417aed2f82cef8a80d43071c2c","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    track with the current number of active threads being executed upon."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    The Ironic project is aware this may require some tuning of settings"},{"line_number":29,"context_line":"    and even memory allocations. However, the improved concurrency and"},{"line_number":30,"context_line":"    performance should be an appropriate trade-off."},{"line_number":31,"context_line":"fixes:"},{"line_number":32,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":23,"id":"72e4ce14_69620521","line":29,"in_reply_to":"bc2f8a5d_87f0981b","updated":"2025-08-12 21:45:05.000000000","message":"Done","commit_id":"ff7a4804e944fa6de5e6d6131935f77127d17517"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"598e4225c5e51d8677ebc34de6c89b7deb634e00","unresolved":true,"context_lines":[{"line_number":26,"context_line":"    track with the current number of active threads being executed upon."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    The Ironic project is aware this may require some tuning of settings"},{"line_number":29,"context_line":"    and even memory allocations. However, the improved concurrency and"},{"line_number":30,"context_line":"    performance should be an appropriate trade-off."},{"line_number":31,"context_line":"fixes:"},{"line_number":32,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":23,"id":"bc2f8a5d_87f0981b","line":29,"in_reply_to":"de7949d6_b13dfc88","updated":"2025-08-12 21:23:39.000000000","message":"This was meaning \"you may need to tune your resource limits applied to your Ironic services.","commit_id":"ff7a4804e944fa6de5e6d6131935f77127d17517"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"fb9ec9dcd2c2445a8b043d9c05429f67a1a37e91","unresolved":true,"context_lines":[{"line_number":30,"context_line":"    concurrency and performance should be an appropriate trade-off."},{"line_number":31,"context_line":"fixes:"},{"line_number":32,"context_line":"  - |"},{"line_number":33,"context_line":"    The ``eventlet`` library is no invoked by Ironic for the management"},{"line_number":34,"context_line":"    of threads."}],"source_content_type":"text/x-yaml","patch_set":24,"id":"7c881aea_b8ab2fb4","line":33,"range":{"start_line":33,"start_character":32,"end_line":33,"end_character":34},"updated":"2025-08-12 22:50:49.000000000","message":"now","commit_id":"7b0ae803ddabc5685f2a8f2a86631ee5c5804ad4"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"1e90992a5d3e2bf76f9652435c0dc2207087af6e","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    concurrency and performance should be an appropriate trade-off."},{"line_number":31,"context_line":"fixes:"},{"line_number":32,"context_line":"  - |"},{"line_number":33,"context_line":"    The ``eventlet`` library is no invoked by Ironic for the management"},{"line_number":34,"context_line":"    of threads."}],"source_content_type":"text/x-yaml","patch_set":24,"id":"cb9ebfbc_83d39053","line":33,"range":{"start_line":33,"start_character":32,"end_line":33,"end_character":34},"in_reply_to":"7c881aea_b8ab2fb4","updated":"2025-08-13 13:46:28.000000000","message":"this should be no longer, I guess I missed typing an entire word! woot!","commit_id":"7b0ae803ddabc5685f2a8f2a86631ee5c5804ad4"}]}
