)]}'
{"/PATCHSET_LEVEL":[{"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":"65810092df298ca1483d6c7afcb7ec131397ff00","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"6a13f676_20520a6b","updated":"2025-06-25 12:18:32.000000000","message":"Context Dump:\nThis change is technically straightforward (the two executors share the same interface), but the operational impact of moving from cooperative green threads to real OS threads is significant and requires careful tuning and observation [1], which means we will not be in a hurry to merge this yet (likely a month+ [2]).\n\nI understand that some downstream folks are already testing this out, some part of that testing will also happen in CI, somehow.\n\nAs the feedbacks start coming in and we have concrete defaults, the admin tuning documentation [3] will need to be updated as part of this change or a follow-up to reflect new expectations and defaults.\n\n[1] https://etherpad.opendev.org/p/ironic-eventlet-removal#172\n[2] https://meetings.opendev.org/irclogs/%23openstack-ironic/%23openstack-ironic.2025-06-23.log.html#t2025-06-23T15:06:24\n[3] https://docs.openstack.org/ironic/latest/admin/tuning.html.","commit_id":"759e50455f671d673d046cc36ec764b90f37d00c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"fa4c151036267fc2cd3b52e2a8fff2deed52427b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"affe4f98_26b8e96e","in_reply_to":"6a13f676_20520a6b","updated":"2025-06-28 14:24:52.000000000","message":"I think if we can have any sort of basic performance benchmark, that might work. With this, we haven\u0027t actually removed eventlet\u0027s use. That needs to really be a separate patch at this point because we, at a minimum, need to retool signal handling and shutdown as a result.","commit_id":"759e50455f671d673d046cc36ec764b90f37d00c"},{"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":"be7008e780a00ad50073bc640c3e29eaf7a5cd22","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"6ed0a903_9658924c","in_reply_to":"affe4f98_26b8e96e","updated":"2025-07-01 09:20:38.000000000","message":"ack\u0027d","commit_id":"759e50455f671d673d046cc36ec764b90f37d00c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"99cefef580226447fe49a3eb454b1ac3542d31eb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"eeb0c916_896ffbf2","updated":"2025-07-01 10:13:02.000000000","message":"I think the commit message is misleading and is derailing the conversation. Aren\u0027t we still operating under monkey-patching? If yes, this PR alone is not migrating to native threads, it\u0027s still green threads under the hood. Could you clarify?","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":"16f554fe47cc214b77f5dc5f060717aa41bbf331","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"f1900cec_1352d25f","in_reply_to":"eeb0c916_896ffbf2","updated":"2025-07-01 13:37:12.000000000","message":"We\u0027re going to need to change to real threads in another patch. I\u0027ve got work in progress to handle the launch, fix signaling so we keep basic compatability and don\u0027t break the code base. In that, we\u0027ll move to a threaded model, or possibly make it toggable. The idea is sort of growing on me since we\u0027re also missing a dependency to make ironic smart enough to use both as a migration step. Seems to work.\n\nAt the end of the day, this change is more preparation of the workers, and even in the next patch we\u0027re likely going to have to have code touching the workers as well because it seems if we create a threadpool and then try to wait on it without ever using it... we seem to halt on it which I vaguely believe is actually expected behavior.","commit_id":"0f5aa35c8b381bd2a5a81e9cc901ce5dd70b6336"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"db52c25230d8fdbc78b722031a9ca45b0aac2198","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"53c4416c_91448594","updated":"2025-07-04 13:33:43.000000000","message":"A question inline.\n\nOtherwise, the patch looks good, but I\u0027d rather merge it shortly before https://review.opendev.org/c/openstack/ironic/+/953683 so will hold +2\u0027ing until that one is close to being ready.","commit_id":"a25a9eb206f24857dac6a0ee69a4c755e053d86f"},{"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":"f00f2798f7669c0f9596fffdf78500dbcbc2812e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"2e2f5dec_7dd0aa2b","updated":"2025-07-05 04:35:14.000000000","message":"recheck - tempest.lib.exceptions.TimeoutException: Request timed out","commit_id":"a5cdf31154a197ab36d400e4699e072af9f13d83"},{"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":"9e21a93483ad3cd5e0baa5011f3b8516cbb467c5","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":21,"id":"6dd392c2_f20e5c5f","updated":"2025-08-12 20:18:28.000000000","message":"Just a few comments; don\u0027t consider any of them blocking.","commit_id":"816695396134ab484a17ae2cb303a534af8b9a10"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"60998a3a026eb799a4567cb74dd75001c7f080dd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"5c6564fb_bf4e3c36","updated":"2025-08-12 22:37:59.000000000","message":"Just comments on comments. Looks good.","commit_id":"816695396134ab484a17ae2cb303a534af8b9a10"},{"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":"91e0d8eb6e20dd97e7037fac86059d313069af1f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"b89f52fd_aa36644c","updated":"2025-08-14 17:16:44.000000000","message":"Only voting +1 because of the 6 weeks of context I missed on eventlet discussion, but this lgtm","commit_id":"0a739d2f910c2b8594467c169f3b7209bf92708e"},{"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":"899c205ed3f28c1f1dd4695a348f730fe95d4109","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"9a3c6e26_4ca9c22d","updated":"2025-08-14 18:46:13.000000000","message":"Thanks for finishing this up TheJulia, o/.","commit_id":"0a739d2f910c2b8594467c169f3b7209bf92708e"}],"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":"5b9eb51670868f73ccfe6ca3d9a78afe81a9f66a","unresolved":true,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"eventlet.monkey_patch()"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from ironic.common import i18n  # noqa"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"i18n.install(\u0027ironic\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"c0a73d1a_d9ffb853","side":"PARENT","line":21,"range":{"start_line":19,"start_character":0,"end_line":21,"end_character":22},"updated":"2025-06-27 21:45:43.000000000","message":"I suspect we would want to keep this part, but drop the monkey patch.","commit_id":"5c4c32442372262e1b9a2409e1465b33356930e3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"db52c25230d8fdbc78b722031a9ca45b0aac2198","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":9,"id":"1ea81d19_930d3497","updated":"2025-07-04 13:33:43.000000000","message":"What has happened to this file? Gerrit shows it being completely rewritten, but I don\u0027t see any changes. Gitea shows slightly different size.","commit_id":"a25a9eb206f24857dac6a0ee69a4c755e053d86f"},{"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":"dce29b82068fd3ade94ec9250ab721ec4abc7e81","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":9,"id":"49048404_58f74ce9","in_reply_to":"1ea81d19_930d3497","updated":"2025-07-04 13:57:37.000000000","message":"I bet it\u0027s the size difference that makes gerrit think it is rewritten. For all I know, two contributors pushed the same fix (sync the file\u0027s state to master) twice.","commit_id":"a25a9eb206f24857dac6a0ee69a4c755e053d86f"},{"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":"2bcf3b477aff0607b6446e08c68f9c5288faf578","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":9,"id":"59baf191_16ed32b4","in_reply_to":"2b42bff4_48794fd2","updated":"2025-07-04 14:50:17.000000000","message":"Update:\nIt was Windows-style line endings (^M) vs. Unix-style line endings diff problem.","commit_id":"a25a9eb206f24857dac6a0ee69a4c755e053d86f"},{"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":"803bee53f9036ac6d4488a5bea9790357a9e0112","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":9,"id":"2b42bff4_48794fd2","in_reply_to":"49048404_58f74ce9","updated":"2025-07-04 14:11:17.000000000","message":"I perform a fresh checkout to master and push an update.","commit_id":"a25a9eb206f24857dac6a0ee69a4c755e053d86f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"486a9a0514ba60322bc2d963f7fbb6a5db0bd2c6","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":9,"id":"5a42a7de_60d39980","in_reply_to":"59baf191_16ed32b4","updated":"2025-07-07 18:54:56.000000000","message":"Yeah, I was super confused by suddenly becoming windows line endings, I don\u0027t know where that really got started at, or at least I didn\u0027t pay attention to it, and just tried to fix it where I was at in the last rebase/update I made.","commit_id":"a25a9eb206f24857dac6a0ee69a4c755e053d86f"}],"ironic/conductor/base_manager.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"627cc4e4b111f0165a61517a676942f336fa9e4d","unresolved":true,"context_lines":[{"line_number":106,"context_line":"        # NOTE(TheJulia): We need to create two separate rejection functions"},{"line_number":107,"context_line":"        # which are individually aware of their maximum sizes in order to"},{"line_number":108,"context_line":"        # appropriately know if work must be rejected, or not. Ironic\u0027s"},{"line_number":109,"context_line":"        # internal model prefers we *never* queue more work, but sometimes"},{"line_number":110,"context_line":"        # we won\u0027t have a choice with cross-thread activity. The custom"},{"line_number":111,"context_line":"        # check we invoke will result in work being rejected when the new"},{"line_number":112,"context_line":"        # work would exceed our overall capacity and thus return an API"}],"source_content_type":"text/x-python","patch_set":20,"id":"aa1be2cc_b45ae2d6","line":109,"updated":"2025-08-12 14:03:50.000000000","message":"Note: we used to prefer to never queue more work because it was pointless with green threads. We may very well start queuing work, but possibly after we get rid of any synchronous API calls that go beyond updating database.","commit_id":"ebd68021a13e85966ef0c2857139cd5996dd5e6b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"1b97c2623c2b0dd6a2ddf66e0700c93cb5bbcceb","unresolved":true,"context_lines":[{"line_number":106,"context_line":"        # NOTE(TheJulia): We need to create two separate rejection functions"},{"line_number":107,"context_line":"        # which are individually aware of their maximum sizes in order to"},{"line_number":108,"context_line":"        # appropriately know if work must be rejected, or not. Ironic\u0027s"},{"line_number":109,"context_line":"        # internal model prefers we *never* queue more work, but sometimes"},{"line_number":110,"context_line":"        # we won\u0027t have a choice with cross-thread activity. The custom"},{"line_number":111,"context_line":"        # check we invoke will result in work being rejected when the new"},{"line_number":112,"context_line":"        # work would exceed our overall capacity and thus return an API"}],"source_content_type":"text/x-python","patch_set":20,"id":"47a61025_c7f28344","line":109,"in_reply_to":"aa1be2cc_b45ae2d6","updated":"2025-08-12 18:44:29.000000000","message":"I\u0027ve revised this text.","commit_id":"ebd68021a13e85966ef0c2857139cd5996dd5e6b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"627cc4e4b111f0165a61517a676942f336fa9e4d","unresolved":true,"context_lines":[{"line_number":121,"context_line":"        # but realistically we have a number of periodics (16!) *and* 8 power"},{"line_number":122,"context_line":"        # sync threads under default configuration. What we don\u0027t want is"},{"line_number":123,"context_line":"        # to create a situation where we\u0027re constantly revisiting the"},{"line_number":124,"context_line":"        # thread workers."},{"line_number":125,"context_line":"        self._executor \u003d futurist.DynamicThreadPoolExecutor("},{"line_number":126,"context_line":"            min_workers\u003d26,"},{"line_number":127,"context_line":"            max_workers\u003dremaining,"}],"source_content_type":"text/x-python","patch_set":20,"id":"957f3a06_585b4c49","line":124,"updated":"2025-08-12 14:03:50.000000000","message":"nit: move to a top-level constant for visibility","commit_id":"ebd68021a13e85966ef0c2857139cd5996dd5e6b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"1b97c2623c2b0dd6a2ddf66e0700c93cb5bbcceb","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        # but realistically we have a number of periodics (16!) *and* 8 power"},{"line_number":122,"context_line":"        # sync threads under default configuration. What we don\u0027t want is"},{"line_number":123,"context_line":"        # to create a situation where we\u0027re constantly revisiting the"},{"line_number":124,"context_line":"        # thread workers."},{"line_number":125,"context_line":"        self._executor \u003d futurist.DynamicThreadPoolExecutor("},{"line_number":126,"context_line":"            min_workers\u003d26,"},{"line_number":127,"context_line":"            max_workers\u003dremaining,"}],"source_content_type":"text/x-python","patch_set":20,"id":"123795a8_37e282db","line":124,"in_reply_to":"957f3a06_585b4c49","updated":"2025-08-12 18:44:29.000000000","message":"Done, revised to make a bit more sense based upon comments.","commit_id":"ebd68021a13e85966ef0c2857139cd5996dd5e6b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"627cc4e4b111f0165a61517a676942f336fa9e4d","unresolved":true,"context_lines":[{"line_number":123,"context_line":"        # to create a situation where we\u0027re constantly revisiting the"},{"line_number":124,"context_line":"        # thread workers."},{"line_number":125,"context_line":"        self._executor \u003d futurist.DynamicThreadPoolExecutor("},{"line_number":126,"context_line":"            min_workers\u003d26,"},{"line_number":127,"context_line":"            max_workers\u003dremaining,"},{"line_number":128,"context_line":"            check_and_reject\u003drejection_func)"},{"line_number":129,"context_line":"        if reserved_workers:"}],"source_content_type":"text/x-python","patch_set":20,"id":"7854214d_66929939","line":126,"updated":"2025-08-12 14:03:50.000000000","message":"Should we update the configuration option to prevent the operators from setting a lower value?\n\nIn fact, if someone has 24 today, it may cause a crash of conductor because max_workers will end up less than min_workers. I suggest we handle this situation gracefully (maybe just bump the number to 26).","commit_id":"ebd68021a13e85966ef0c2857139cd5996dd5e6b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"1b97c2623c2b0dd6a2ddf66e0700c93cb5bbcceb","unresolved":true,"context_lines":[{"line_number":123,"context_line":"        # to create a situation where we\u0027re constantly revisiting the"},{"line_number":124,"context_line":"        # thread workers."},{"line_number":125,"context_line":"        self._executor \u003d futurist.DynamicThreadPoolExecutor("},{"line_number":126,"context_line":"            min_workers\u003d26,"},{"line_number":127,"context_line":"            max_workers\u003dremaining,"},{"line_number":128,"context_line":"            check_and_reject\u003drejection_func)"},{"line_number":129,"context_line":"        if reserved_workers:"}],"source_content_type":"text/x-python","patch_set":20,"id":"73a3e211_46ec7194","line":126,"in_reply_to":"7854214d_66929939","updated":"2025-08-12 18:44:29.000000000","message":"I\u0027m adding an exception and further test now. I don\u0027t think we should try and just adjust their configuration, I think it is best to provide that clarity and feedback.","commit_id":"ebd68021a13e85966ef0c2857139cd5996dd5e6b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"627cc4e4b111f0165a61517a676942f336fa9e4d","unresolved":true,"context_lines":[{"line_number":697,"context_line":"                                        params\u003dparams)"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":""},{"line_number":700,"context_line":"def reject_when_reached(max_backlog, pool_size):"},{"line_number":701,"context_line":"    \"\"\"Return a function to reject new work for Ironic."},{"line_number":702,"context_line":""},{"line_number":703,"context_line":"    :param max_backlog: The maximum number of items in the queue."}],"source_content_type":"text/x-python","patch_set":20,"id":"02c15170_42642a27","line":700,"updated":"2025-08-12 14:03:50.000000000","message":"nit: max_backlog is always 1 and does not need to be a parameter","commit_id":"ebd68021a13e85966ef0c2857139cd5996dd5e6b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"1b97c2623c2b0dd6a2ddf66e0700c93cb5bbcceb","unresolved":false,"context_lines":[{"line_number":697,"context_line":"                                        params\u003dparams)"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":""},{"line_number":700,"context_line":"def reject_when_reached(max_backlog, pool_size):"},{"line_number":701,"context_line":"    \"\"\"Return a function to reject new work for Ironic."},{"line_number":702,"context_line":""},{"line_number":703,"context_line":"    :param max_backlog: The maximum number of items in the queue."}],"source_content_type":"text/x-python","patch_set":20,"id":"bb2dbcdf_8f39e99f","line":700,"in_reply_to":"02c15170_42642a27","updated":"2025-08-12 18:44:29.000000000","message":"Done","commit_id":"ebd68021a13e85966ef0c2857139cd5996dd5e6b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"627cc4e4b111f0165a61517a676942f336fa9e4d","unresolved":true,"context_lines":[{"line_number":725,"context_line":"        # executor size. This does not consider *idle* threads, because"},{"line_number":726,"context_line":"        # that too requires the same lock which caused backlog to be a"},{"line_number":727,"context_line":"        # non-zero number in the first place."},{"line_number":728,"context_line":"        if backlog + max_backlog + current_size \u003e pool_size:"},{"line_number":729,"context_line":"            raise futurist.RejectedSubmission("},{"line_number":730,"context_line":"                \"Queued backlog count is %s, and the pool is presently \""},{"line_number":731,"context_line":"                \"at %s executors. Adding new work would \""}],"source_content_type":"text/x-python","patch_set":20,"id":"480d8111_342a368b","line":728,"updated":"2025-08-12 14:03:50.000000000","message":"btw, using max_backlog\u003d1 was also an artefact of the futurist\u0027s implementation. Maybe here we can drop max_backlog entirely (until we decide to allow queueing).","commit_id":"ebd68021a13e85966ef0c2857139cd5996dd5e6b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"1b97c2623c2b0dd6a2ddf66e0700c93cb5bbcceb","unresolved":false,"context_lines":[{"line_number":725,"context_line":"        # executor size. This does not consider *idle* threads, because"},{"line_number":726,"context_line":"        # that too requires the same lock which caused backlog to be a"},{"line_number":727,"context_line":"        # non-zero number in the first place."},{"line_number":728,"context_line":"        if backlog + max_backlog + current_size \u003e pool_size:"},{"line_number":729,"context_line":"            raise futurist.RejectedSubmission("},{"line_number":730,"context_line":"                \"Queued backlog count is %s, and the pool is presently \""},{"line_number":731,"context_line":"                \"at %s executors. Adding new work would \""}],"source_content_type":"text/x-python","patch_set":20,"id":"3d860dd5_a27b80f1","line":728,"in_reply_to":"480d8111_342a368b","updated":"2025-08-12 18:44:29.000000000","message":"Done","commit_id":"ebd68021a13e85966ef0c2857139cd5996dd5e6b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"627cc4e4b111f0165a61517a676942f336fa9e4d","unresolved":true,"context_lines":[{"line_number":727,"context_line":"        # non-zero number in the first place."},{"line_number":728,"context_line":"        if backlog + max_backlog + current_size \u003e pool_size:"},{"line_number":729,"context_line":"            raise futurist.RejectedSubmission("},{"line_number":730,"context_line":"                \"Queued backlog count is %s, and the pool is presently \""},{"line_number":731,"context_line":"                \"at %s executors. Adding new work would \""},{"line_number":732,"context_line":"                \"go beyond %s, the maximum thread pool size.\" %"},{"line_number":733,"context_line":"                (backlog, current_size, pool_size))"}],"source_content_type":"text/x-python","patch_set":20,"id":"974021ef_498b1598","line":730,"updated":"2025-08-12 14:03:50.000000000","message":"nit: use _() since this error is user-visible","commit_id":"ebd68021a13e85966ef0c2857139cd5996dd5e6b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"1b97c2623c2b0dd6a2ddf66e0700c93cb5bbcceb","unresolved":false,"context_lines":[{"line_number":727,"context_line":"        # non-zero number in the first place."},{"line_number":728,"context_line":"        if backlog + max_backlog + current_size \u003e pool_size:"},{"line_number":729,"context_line":"            raise futurist.RejectedSubmission("},{"line_number":730,"context_line":"                \"Queued backlog count is %s, and the pool is presently \""},{"line_number":731,"context_line":"                \"at %s executors. Adding new work would \""},{"line_number":732,"context_line":"                \"go beyond %s, the maximum thread pool size.\" %"},{"line_number":733,"context_line":"                (backlog, current_size, pool_size))"}],"source_content_type":"text/x-python","patch_set":20,"id":"c294a16a_223bbf2f","line":730,"in_reply_to":"974021ef_498b1598","updated":"2025-08-12 18:44:29.000000000","message":"Done","commit_id":"ebd68021a13e85966ef0c2857139cd5996dd5e6b"},{"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":"9e21a93483ad3cd5e0baa5011f3b8516cbb467c5","unresolved":true,"context_lines":[{"line_number":117,"context_line":"        # work would exceed our overall capacity and thus return an API"},{"line_number":118,"context_line":"        # caller with an HTTP 503 or reschedule a task later."},{"line_number":119,"context_line":"        rejection_func \u003d reject_when_reached(remaining)"},{"line_number":120,"context_line":"        reserved_rejection_func \u003d reject_when_reached(reserved_workers)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        # Calculate our minimum worker count."},{"line_number":123,"context_line":"        # This is imperfect because we presently have 8 power sync workers"}],"source_content_type":"text/x-python","patch_set":21,"id":"29401fbd_f4dca19c","line":120,"updated":"2025-08-12 20:18:28.000000000","message":"not blocking feedback, honestly not even sure we should worry about this at all; I\u0027m curious what would happen if an Ironic stayed saturated just enough to service API requests but not run periodics\n\nIt\u0027s extremely unlikely but seems like it could be possible if the perfect circumstances arrived","commit_id":"816695396134ab484a17ae2cb303a534af8b9a10"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"99ae6707449437f00f0a5e9f43bcfa6b27c2017a","unresolved":true,"context_lines":[{"line_number":117,"context_line":"        # work would exceed our overall capacity and thus return an API"},{"line_number":118,"context_line":"        # caller with an HTTP 503 or reschedule a task later."},{"line_number":119,"context_line":"        rejection_func \u003d reject_when_reached(remaining)"},{"line_number":120,"context_line":"        reserved_rejection_func \u003d reject_when_reached(reserved_workers)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        # Calculate our minimum worker count."},{"line_number":123,"context_line":"        # This is imperfect because we presently have 8 power sync workers"}],"source_content_type":"text/x-python","patch_set":21,"id":"687ddfa2_8d2e1104","line":120,"in_reply_to":"29401fbd_f4dca19c","updated":"2025-08-12 20:29:09.000000000","message":"Its first come first service, so in theory you\u0027d have to just constantly slam the API with requests.\n\nOne thing which WILL happen, is the periodics will start to spread out *and* power sync will get what it can and stop adding new workers. So you\u0027ll end up with \"oh, I can only give you 1-2 workers\" and power sync would slow way down.","commit_id":"816695396134ab484a17ae2cb303a534af8b9a10"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"82339c6dbad90ee1625be2b8eeaffce0f18716ac","unresolved":true,"context_lines":[{"line_number":117,"context_line":"        # work would exceed our overall capacity and thus return an API"},{"line_number":118,"context_line":"        # caller with an HTTP 503 or reschedule a task later."},{"line_number":119,"context_line":"        rejection_func \u003d reject_when_reached(remaining)"},{"line_number":120,"context_line":"        reserved_rejection_func \u003d reject_when_reached(reserved_workers)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        # Calculate our minimum worker count."},{"line_number":123,"context_line":"        # This is imperfect because we presently have 8 power sync workers"}],"source_content_type":"text/x-python","patch_set":21,"id":"c4bf090a_136acda5","line":120,"in_reply_to":"687ddfa2_8d2e1104","updated":"2025-08-16 14:38:40.000000000","message":"I wonder if we would ever want a situation where we would want users to be able to run a conductor for just the periodics and another one for just servicing API requests in the same conductor group?\n\nJust thinking about Kubernetes tools like KEDA which can scale pods based on different triggers (e.g. RabbitMQ queue depth is one I\u0027ve used in the past).","commit_id":"816695396134ab484a17ae2cb303a534af8b9a10"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"eccc6209e2ba094c339a0c04e7f83344d5e0d74b","unresolved":true,"context_lines":[{"line_number":117,"context_line":"        # work would exceed our overall capacity and thus return an API"},{"line_number":118,"context_line":"        # caller with an HTTP 503 or reschedule a task later."},{"line_number":119,"context_line":"        rejection_func \u003d reject_when_reached(remaining)"},{"line_number":120,"context_line":"        reserved_rejection_func \u003d reject_when_reached(reserved_workers)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        # Calculate our minimum worker count."},{"line_number":123,"context_line":"        # This is imperfect because we presently have 8 power sync workers"}],"source_content_type":"text/x-python","patch_set":21,"id":"c7af37cc_f279f5bc","line":120,"in_reply_to":"c4bf090a_136acda5","updated":"2025-08-18 13:21:21.000000000","message":"At one point, there was a discussion of doing so, but where things broke down was the locking because doing exactly that violates the locking model. I proposed reworking the locking model but didn\u0027t really get traction.","commit_id":"816695396134ab484a17ae2cb303a534af8b9a10"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"60998a3a026eb799a4567cb74dd75001c7f080dd","unresolved":true,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        # Calculate our minimum worker count."},{"line_number":123,"context_line":"        # This is imperfect because we presently have 8 power sync workers"},{"line_number":124,"context_line":"        # by default, along with 16 periodics, plus we"},{"line_number":125,"context_line":"        min_workers \u003d int("},{"line_number":126,"context_line":"            CONF.conductor.sync_power_state_workers"},{"line_number":127,"context_line":"            + (2 * CONF.conductor.periodic_max_workers) + 2)"}],"source_content_type":"text/x-python","patch_set":21,"id":"b1bb34fa_d74115ca","line":124,"updated":"2025-08-12 22:37:59.000000000","message":"plus we what? I\u0027m holding my breath!","commit_id":"816695396134ab484a17ae2cb303a534af8b9a10"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6b79ce7ddb02c329c83cadd5c4c61aee7b2376ea","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        # Calculate our minimum worker count."},{"line_number":123,"context_line":"        # This is imperfect because we presently have 8 power sync workers"},{"line_number":124,"context_line":"        # by default, along with 16 periodics, plus we"},{"line_number":125,"context_line":"        min_workers \u003d int("},{"line_number":126,"context_line":"            CONF.conductor.sync_power_state_workers"},{"line_number":127,"context_line":"            + (2 * CONF.conductor.periodic_max_workers) + 2)"}],"source_content_type":"text/x-python","patch_set":21,"id":"3f06dd43_b543f2cc","line":124,"in_reply_to":"3aa569da_a84d5ca1","updated":"2025-08-14 15:52:39.000000000","message":"Done","commit_id":"816695396134ab484a17ae2cb303a534af8b9a10"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f50feea00cf6f549ce0593e6c1331c9f3534b720","unresolved":true,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        # Calculate our minimum worker count."},{"line_number":123,"context_line":"        # This is imperfect because we presently have 8 power sync workers"},{"line_number":124,"context_line":"        # by default, along with 16 periodics, plus we"},{"line_number":125,"context_line":"        min_workers \u003d int("},{"line_number":126,"context_line":"            CONF.conductor.sync_power_state_workers"},{"line_number":127,"context_line":"            + (2 * CONF.conductor.periodic_max_workers) + 2)"}],"source_content_type":"text/x-python","patch_set":21,"id":"3aa569da_a84d5ca1","line":124,"in_reply_to":"b1bb34fa_d74115ca","updated":"2025-08-12 23:08:03.000000000","message":"doh!","commit_id":"816695396134ab484a17ae2cb303a534af8b9a10"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"60998a3a026eb799a4567cb74dd75001c7f080dd","unresolved":true,"context_lines":[{"line_number":734,"context_line":"        current_size \u003d int(executor.num_workers)"},{"line_number":735,"context_line":"        # Consult the backlog, which might have a couple entries from other"},{"line_number":736,"context_line":"        # threads firing up, add 1 to represent the request we\u0027re being"},{"line_number":737,"context_line":"        # in voked for, and utlimately if this will exceed the pool size"},{"line_number":738,"context_line":"        # when compared to the current executor size."},{"line_number":739,"context_line":"        # This does not consider *idle* threads, because"},{"line_number":740,"context_line":"        # that too requires the same lock which caused backlog to be a"}],"source_content_type":"text/x-python","patch_set":21,"id":"775eb535_8efc643f","line":737,"range":{"start_line":737,"start_character":10,"end_line":737,"end_character":18},"updated":"2025-08-12 22:37:59.000000000","message":"invoked","commit_id":"816695396134ab484a17ae2cb303a534af8b9a10"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"60998a3a026eb799a4567cb74dd75001c7f080dd","unresolved":true,"context_lines":[{"line_number":734,"context_line":"        current_size \u003d int(executor.num_workers)"},{"line_number":735,"context_line":"        # Consult the backlog, which might have a couple entries from other"},{"line_number":736,"context_line":"        # threads firing up, add 1 to represent the request we\u0027re being"},{"line_number":737,"context_line":"        # in voked for, and utlimately if this will exceed the pool size"},{"line_number":738,"context_line":"        # when compared to the current executor size."},{"line_number":739,"context_line":"        # This does not consider *idle* threads, because"},{"line_number":740,"context_line":"        # that too requires the same lock which caused backlog to be a"}],"source_content_type":"text/x-python","patch_set":21,"id":"dc0f692f_d0f5f139","line":737,"range":{"start_line":737,"start_character":28,"end_line":737,"end_character":38},"updated":"2025-08-12 22:37:59.000000000","message":"ultimately","commit_id":"816695396134ab484a17ae2cb303a534af8b9a10"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6b79ce7ddb02c329c83cadd5c4c61aee7b2376ea","unresolved":false,"context_lines":[{"line_number":734,"context_line":"        current_size \u003d int(executor.num_workers)"},{"line_number":735,"context_line":"        # Consult the backlog, which might have a couple entries from other"},{"line_number":736,"context_line":"        # threads firing up, add 1 to represent the request we\u0027re being"},{"line_number":737,"context_line":"        # in voked for, and utlimately if this will exceed the pool size"},{"line_number":738,"context_line":"        # when compared to the current executor size."},{"line_number":739,"context_line":"        # This does not consider *idle* threads, because"},{"line_number":740,"context_line":"        # that too requires the same lock which caused backlog to be a"}],"source_content_type":"text/x-python","patch_set":21,"id":"831d23e4_c0b1f3b5","line":737,"range":{"start_line":737,"start_character":10,"end_line":737,"end_character":18},"in_reply_to":"775eb535_8efc643f","updated":"2025-08-14 15:52:39.000000000","message":"Done","commit_id":"816695396134ab484a17ae2cb303a534af8b9a10"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6b79ce7ddb02c329c83cadd5c4c61aee7b2376ea","unresolved":false,"context_lines":[{"line_number":734,"context_line":"        current_size \u003d int(executor.num_workers)"},{"line_number":735,"context_line":"        # Consult the backlog, which might have a couple entries from other"},{"line_number":736,"context_line":"        # threads firing up, add 1 to represent the request we\u0027re being"},{"line_number":737,"context_line":"        # in voked for, and utlimately if this will exceed the pool size"},{"line_number":738,"context_line":"        # when compared to the current executor size."},{"line_number":739,"context_line":"        # This does not consider *idle* threads, because"},{"line_number":740,"context_line":"        # that too requires the same lock which caused backlog to be a"}],"source_content_type":"text/x-python","patch_set":21,"id":"b8845a60_a4ead959","line":737,"range":{"start_line":737,"start_character":28,"end_line":737,"end_character":38},"in_reply_to":"dc0f692f_d0f5f139","updated":"2025-08-14 15:52:39.000000000","message":"Done","commit_id":"816695396134ab484a17ae2cb303a534af8b9a10"},{"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":"899c205ed3f28c1f1dd4695a348f730fe95d4109","unresolved":true,"context_lines":[{"line_number":731,"context_line":"    # robustness where it is okay to queue items as long as we won\u0027t exceed"},{"line_number":732,"context_line":"    # the thresholds."},{"line_number":733,"context_line":"    def _rejector(executor, backlog):"},{"line_number":734,"context_line":"        # Get the current size once do we\u0027re not revisiting it again"},{"line_number":735,"context_line":"        # if we are rejecting inbound work."},{"line_number":736,"context_line":"        current_size \u003d int(executor.num_workers)"},{"line_number":737,"context_line":"        # Consult the backlog, which might have a couple entries from other"},{"line_number":738,"context_line":"        # threads firing up, add 1 to represent the request we\u0027re being"}],"source_content_type":"text/x-python","patch_set":22,"id":"5cec8c58_c94efdf8","line":735,"range":{"start_line":734,"start_character":0,"end_line":735,"end_character":43},"updated":"2025-08-14 18:46:13.000000000","message":"Something is missing here.","commit_id":"0a739d2f910c2b8594467c169f3b7209bf92708e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"2449a2949d884cf1539e70e306d0d950611f63ad","unresolved":true,"context_lines":[{"line_number":731,"context_line":"    # robustness where it is okay to queue items as long as we won\u0027t exceed"},{"line_number":732,"context_line":"    # the thresholds."},{"line_number":733,"context_line":"    def _rejector(executor, backlog):"},{"line_number":734,"context_line":"        # Get the current size once do we\u0027re not revisiting it again"},{"line_number":735,"context_line":"        # if we are rejecting inbound work."},{"line_number":736,"context_line":"        current_size \u003d int(executor.num_workers)"},{"line_number":737,"context_line":"        # Consult the backlog, which might have a couple entries from other"},{"line_number":738,"context_line":"        # threads firing up, add 1 to represent the request we\u0027re being"}],"source_content_type":"text/x-python","patch_set":22,"id":"fdad9bfb_59c35ed0","line":735,"range":{"start_line":734,"start_character":0,"end_line":735,"end_character":43},"in_reply_to":"5cec8c58_c94efdf8","updated":"2025-08-14 21:30:30.000000000","message":"hmm, yeah. Something is. I\u0027m not sure what which is a good or bad sign ;)","commit_id":"0a739d2f910c2b8594467c169f3b7209bf92708e"}],"ironic/tests/unit/conductor/test_base_manager.py":[{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"b67511d9d27e12598e629ebb689c82ab34160c59","unresolved":true,"context_lines":[{"line_number":376,"context_line":"                mock_is_set.side_effect \u003d [False, False, False, True]"},{"line_number":377,"context_line":"                self.service._conductor_service_record_keepalive()"},{"line_number":378,"context_line":"            self.assertEqual(3, mock_touch.call_count)"},{"line_number":379,"context_line":"        self.assertEqual(2, is_sqlite_mock.call_count)"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    @mock.patch.object(common_utils, \u0027is_ironic_using_sqlite\u0027, autospec\u003dTrue)"},{"line_number":382,"context_line":"    def test__conductor_service_record_keepalive_failed_error(self,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ddd48897_eebcd506","line":379,"updated":"2025-06-24 21:19:11.000000000","message":"What causes the extra call to `is_ironic_using_sqlite` as opposed to the old way? It\u0027s not clear to me why this would change. Based on the changes in base_manager.py I\u0027d expect the number of calls here to stay the same.","commit_id":"759e50455f671d673d046cc36ec764b90f37d00c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"2857137236a8a7baa86f9ddd85b56b966dfff6f5","unresolved":true,"context_lines":[{"line_number":376,"context_line":"                mock_is_set.side_effect \u003d [False, False, False, True]"},{"line_number":377,"context_line":"                self.service._conductor_service_record_keepalive()"},{"line_number":378,"context_line":"            self.assertEqual(3, mock_touch.call_count)"},{"line_number":379,"context_line":"        self.assertEqual(2, is_sqlite_mock.call_count)"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    @mock.patch.object(common_utils, \u0027is_ironic_using_sqlite\u0027, autospec\u003dTrue)"},{"line_number":382,"context_line":"    def test__conductor_service_record_keepalive_failed_error(self,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a59b177_f6eaa608","line":379,"in_reply_to":"4244b5d4_80cc58e9","updated":"2025-07-23 14:45:20.000000000","message":"I believe this is resolved at this point, and marking as such.","commit_id":"759e50455f671d673d046cc36ec764b90f37d00c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"5b9eb51670868f73ccfe6ca3d9a78afe81a9f66a","unresolved":true,"context_lines":[{"line_number":376,"context_line":"                mock_is_set.side_effect \u003d [False, False, False, True]"},{"line_number":377,"context_line":"                self.service._conductor_service_record_keepalive()"},{"line_number":378,"context_line":"            self.assertEqual(3, mock_touch.call_count)"},{"line_number":379,"context_line":"        self.assertEqual(2, is_sqlite_mock.call_count)"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    @mock.patch.object(common_utils, \u0027is_ironic_using_sqlite\u0027, autospec\u003dTrue)"},{"line_number":382,"context_line":"    def test__conductor_service_record_keepalive_failed_error(self,"}],"source_content_type":"text/x-python","patch_set":2,"id":"4244b5d4_80cc58e9","line":379,"in_reply_to":"588efcc8_6986250a","updated":"2025-06-27 21:45:43.000000000","message":"I think that additional action is actually sort of problematic here, beucase we\u0027re getting database locking issues, .I went ahead and did some additional manual testing locally and started getting errors around database interaction which is super worrisome.","commit_id":"759e50455f671d673d046cc36ec764b90f37d00c"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"ae824b820716da7e2dc865360bbba3644edc63eb","unresolved":false,"context_lines":[{"line_number":376,"context_line":"                mock_is_set.side_effect \u003d [False, False, False, True]"},{"line_number":377,"context_line":"                self.service._conductor_service_record_keepalive()"},{"line_number":378,"context_line":"            self.assertEqual(3, mock_touch.call_count)"},{"line_number":379,"context_line":"        self.assertEqual(2, is_sqlite_mock.call_count)"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    @mock.patch.object(common_utils, \u0027is_ironic_using_sqlite\u0027, autospec\u003dTrue)"},{"line_number":382,"context_line":"    def test__conductor_service_record_keepalive_failed_error(self,"}],"source_content_type":"text/x-python","patch_set":2,"id":"588efcc8_6986250a","line":379,"in_reply_to":"6217d4c3_e6592bb5","updated":"2025-06-25 15:38:07.000000000","message":"Thanks for the background, got it.","commit_id":"759e50455f671d673d046cc36ec764b90f37d00c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7dd6ff347b320b85e7b987178eb214f488a5a14a","unresolved":false,"context_lines":[{"line_number":376,"context_line":"                mock_is_set.side_effect \u003d [False, False, False, True]"},{"line_number":377,"context_line":"                self.service._conductor_service_record_keepalive()"},{"line_number":378,"context_line":"            self.assertEqual(3, mock_touch.call_count)"},{"line_number":379,"context_line":"        self.assertEqual(2, is_sqlite_mock.call_count)"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    @mock.patch.object(common_utils, \u0027is_ironic_using_sqlite\u0027, autospec\u003dTrue)"},{"line_number":382,"context_line":"    def test__conductor_service_record_keepalive_failed_error(self,"}],"source_content_type":"text/x-python","patch_set":2,"id":"c1744e36_16903a88","line":379,"in_reply_to":"7a59b177_f6eaa608","updated":"2025-07-28 16:46:06.000000000","message":"Done","commit_id":"759e50455f671d673d046cc36ec764b90f37d00c"},{"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":"65810092df298ca1483d6c7afcb7ec131397ff00","unresolved":true,"context_lines":[{"line_number":376,"context_line":"                mock_is_set.side_effect \u003d [False, False, False, True]"},{"line_number":377,"context_line":"                self.service._conductor_service_record_keepalive()"},{"line_number":378,"context_line":"            self.assertEqual(3, mock_touch.call_count)"},{"line_number":379,"context_line":"        self.assertEqual(2, is_sqlite_mock.call_count)"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    @mock.patch.object(common_utils, \u0027is_ironic_using_sqlite\u0027, autospec\u003dTrue)"},{"line_number":382,"context_line":"    def test__conductor_service_record_keepalive_failed_error(self,"}],"source_content_type":"text/x-python","patch_set":2,"id":"6217d4c3_e6592bb5","line":379,"in_reply_to":"ddd48897_eebcd506","updated":"2025-06-25 12:18:32.000000000","message":"In addition to the explicit call to `self.service._conductor_service_record_keepalive()` within the test body, `init_host()` also seems to spawn a background thread invoking _conductor_service_record_keepalive() via `self._spawn_worker(self._conductor_service_record_keepalive)`, under `GreenThreadPoolExecutor`, this was cooperative and deferred.\n\nUnder GreenThreadPoolExecutor:\nCaptured stdout:\n~~~~~~~~~~~~~~~~\n    \u003e\u003e\u003e [KEEPALIVE] running in MainThread\n\u003e\u003e\u003e [KEEPALIVE] running in MainThread\n      \nAnd Under ThreadPoolExecutor:\nCaptured stdout:\n~~~~~~~~~~~~~~~~\n    \u003e\u003e\u003e [KEEPALIVE] running in Thread-3\n\u003e\u003e\u003e [KEEPALIVE] running in MainThread\n\nMocking out \u0027_spawn_worker\u0027 retains the original call count.","commit_id":"759e50455f671d673d046cc36ec764b90f37d00c"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"b67511d9d27e12598e629ebb689c82ab34160c59","unresolved":true,"context_lines":[{"line_number":394,"context_line":"                mock_is_set.side_effect \u003d [False, False, False, True]"},{"line_number":395,"context_line":"                self.service._conductor_service_record_keepalive()"},{"line_number":396,"context_line":"            self.assertEqual(3, mock_touch.call_count)"},{"line_number":397,"context_line":"        self.assertEqual(2, is_sqlite_mock.call_count)"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"class ManagerSpawnWorkerTestCase(tests_base.TestCase):"}],"source_content_type":"text/x-python","patch_set":2,"id":"0d0a134b_6801636c","line":397,"updated":"2025-06-24 21:19:11.000000000","message":"Same question as above.","commit_id":"759e50455f671d673d046cc36ec764b90f37d00c"},{"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":"65810092df298ca1483d6c7afcb7ec131397ff00","unresolved":true,"context_lines":[{"line_number":394,"context_line":"                mock_is_set.side_effect \u003d [False, False, False, True]"},{"line_number":395,"context_line":"                self.service._conductor_service_record_keepalive()"},{"line_number":396,"context_line":"            self.assertEqual(3, mock_touch.call_count)"},{"line_number":397,"context_line":"        self.assertEqual(2, is_sqlite_mock.call_count)"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"class ManagerSpawnWorkerTestCase(tests_base.TestCase):"}],"source_content_type":"text/x-python","patch_set":2,"id":"a1ef7607_0526ea5d","line":397,"in_reply_to":"0d0a134b_6801636c","updated":"2025-06-25 12:18:32.000000000","message":"ditto","commit_id":"759e50455f671d673d046cc36ec764b90f37d00c"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"ae824b820716da7e2dc865360bbba3644edc63eb","unresolved":false,"context_lines":[{"line_number":394,"context_line":"                mock_is_set.side_effect \u003d [False, False, False, True]"},{"line_number":395,"context_line":"                self.service._conductor_service_record_keepalive()"},{"line_number":396,"context_line":"            self.assertEqual(3, mock_touch.call_count)"},{"line_number":397,"context_line":"        self.assertEqual(2, is_sqlite_mock.call_count)"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"class ManagerSpawnWorkerTestCase(tests_base.TestCase):"}],"source_content_type":"text/x-python","patch_set":2,"id":"444a422b_5795a363","line":397,"in_reply_to":"a1ef7607_0526ea5d","updated":"2025-06-25 15:38:07.000000000","message":"Done","commit_id":"759e50455f671d673d046cc36ec764b90f37d00c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"5b9eb51670868f73ccfe6ca3d9a78afe81a9f66a","unresolved":true,"context_lines":[{"line_number":376,"context_line":"                mock_is_set.side_effect \u003d [False, False, False, True]"},{"line_number":377,"context_line":"                self.service._conductor_service_record_keepalive()"},{"line_number":378,"context_line":"            self.assertEqual(3, mock_touch.call_count)"},{"line_number":379,"context_line":"        self.assertEqual(2, is_sqlite_mock.call_count)"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    @mock.patch.object(common_utils, \u0027is_ironic_using_sqlite\u0027, autospec\u003dTrue)"},{"line_number":382,"context_line":"    def test__conductor_service_record_keepalive_failed_error(self,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9e8ad90f_ec63bb15","line":379,"range":{"start_line":379,"start_character":53,"end_line":379,"end_character":54},"updated":"2025-06-27 21:45:43.000000000","message":"As a note, this is slightly concerning :\\","commit_id":"f9dcd418dc687fef377a44ca7badaa7cd181ce9f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7dd6ff347b320b85e7b987178eb214f488a5a14a","unresolved":false,"context_lines":[{"line_number":376,"context_line":"                mock_is_set.side_effect \u003d [False, False, False, True]"},{"line_number":377,"context_line":"                self.service._conductor_service_record_keepalive()"},{"line_number":378,"context_line":"            self.assertEqual(3, mock_touch.call_count)"},{"line_number":379,"context_line":"        self.assertEqual(2, is_sqlite_mock.call_count)"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    @mock.patch.object(common_utils, \u0027is_ironic_using_sqlite\u0027, autospec\u003dTrue)"},{"line_number":382,"context_line":"    def test__conductor_service_record_keepalive_failed_error(self,"}],"source_content_type":"text/x-python","patch_set":3,"id":"097ef3eb_b00f414d","line":379,"range":{"start_line":379,"start_character":53,"end_line":379,"end_character":54},"in_reply_to":"9e8ad90f_ec63bb15","updated":"2025-07-28 16:46:06.000000000","message":"Done","commit_id":"f9dcd418dc687fef377a44ca7badaa7cd181ce9f"}],"ironic/tests/unit/conductor/test_manager.py":[{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"b67511d9d27e12598e629ebb689c82ab34160c59","unresolved":true,"context_lines":[{"line_number":1653,"context_line":"                            \u0027async\u0027: False,"},{"line_number":1654,"context_line":"                            \u0027attach\u0027: False,"},{"line_number":1655,"context_line":"                            \u0027http_methods\u0027: [\u0027POST\u0027]}}"},{"line_number":1656,"context_line":"        self._start_service()"},{"line_number":1657,"context_line":"        # init_host() called _spawn_worker because of the heartbeat"},{"line_number":1658,"context_line":"        mock_spawn.reset_mock()"},{"line_number":1659,"context_line":"        # init_host() called get_interface during driver loading"}],"source_content_type":"text/x-python","patch_set":2,"id":"88ad9874_0a14d268","line":1656,"updated":"2025-06-24 21:19:11.000000000","message":"Is `_start_service()` more correct/appropriate for these tests than `_init_host`?","commit_id":"759e50455f671d673d046cc36ec764b90f37d00c"},{"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":"65810092df298ca1483d6c7afcb7ec131397ff00","unresolved":true,"context_lines":[{"line_number":1653,"context_line":"                            \u0027async\u0027: False,"},{"line_number":1654,"context_line":"                            \u0027attach\u0027: False,"},{"line_number":1655,"context_line":"                            \u0027http_methods\u0027: [\u0027POST\u0027]}}"},{"line_number":1656,"context_line":"        self._start_service()"},{"line_number":1657,"context_line":"        # init_host() called _spawn_worker because of the heartbeat"},{"line_number":1658,"context_line":"        mock_spawn.reset_mock()"},{"line_number":1659,"context_line":"        # init_host() called get_interface during driver loading"}],"source_content_type":"text/x-python","patch_set":2,"id":"c9495a1b_4dd6c24f","line":1656,"in_reply_to":"88ad9874_0a14d268","updated":"2025-06-25 12:18:32.000000000","message":"Yeah. `__start_service()` wraps `init_host` but augments it with controlled mocking and cleanup hooks because just like in above, with this change, init_host spawns a background thread that needs to be stopped.","commit_id":"759e50455f671d673d046cc36ec764b90f37d00c"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"ae824b820716da7e2dc865360bbba3644edc63eb","unresolved":false,"context_lines":[{"line_number":1653,"context_line":"                            \u0027async\u0027: False,"},{"line_number":1654,"context_line":"                            \u0027attach\u0027: False,"},{"line_number":1655,"context_line":"                            \u0027http_methods\u0027: [\u0027POST\u0027]}}"},{"line_number":1656,"context_line":"        self._start_service()"},{"line_number":1657,"context_line":"        # init_host() called _spawn_worker because of the heartbeat"},{"line_number":1658,"context_line":"        mock_spawn.reset_mock()"},{"line_number":1659,"context_line":"        # init_host() called get_interface during driver loading"}],"source_content_type":"text/x-python","patch_set":2,"id":"e3d11fc6_b105c94d","line":1656,"in_reply_to":"c9495a1b_4dd6c24f","updated":"2025-06-25 15:38:07.000000000","message":"Acknowledged","commit_id":"759e50455f671d673d046cc36ec764b90f37d00c"}],"releasenotes/notes/futurist-minimum-ec66ccfcc4271a5c.yaml":[{"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":"9e21a93483ad3cd5e0baa5011f3b8516cbb467c5","unresolved":true,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The minimum version of the ``futurist`` library is now ``3.2.0``."},{"line_number":5,"context_line":"    This change is being made to support the removal of the Eventlet"},{"line_number":6,"context_line":"    library from use in Ironic."}],"source_content_type":"text/x-yaml","patch_set":21,"id":"20dc8430_763f7c51","line":6,"updated":"2025-08-12 20:18:28.000000000","message":"I\u0027ll note I\u0027ve bumped requirements in requirements.txt a lot without a release note -- it\u0027s probably overkill?","commit_id":"816695396134ab484a17ae2cb303a534af8b9a10"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"99ae6707449437f00f0a5e9f43bcfa6b27c2017a","unresolved":true,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The minimum version of the ``futurist`` library is now ``3.2.0``."},{"line_number":5,"context_line":"    This change is being made to support the removal of the Eventlet"},{"line_number":6,"context_line":"    library from use in Ironic."}],"source_content_type":"text/x-yaml","patch_set":21,"id":"fe949e03_cdeec520","line":6,"in_reply_to":"20dc8430_763f7c51","updated":"2025-08-12 20:29:09.000000000","message":"I\u0027ve had people go each way. Given its such a brand new requirement, I figure it made sense to note.","commit_id":"816695396134ab484a17ae2cb303a534af8b9a10"}]}
