)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0165cb1b848e031604e788e58ad6f3834c65dc7e","unresolved":false,"context_lines":[{"line_number":11,"context_line":"  tree providing the same type of resources"},{"line_number":12,"context_line":"* A GET allocation_candidates request that asks for 10+ request groups"},{"line_number":13,"context_line":"  of such resources"},{"line_number":14,"context_line":"* But the tree has less available resources left than the number of"},{"line_number":15,"context_line":"  requested groups by a small amount. I.e. the request almost fits but"},{"line_number":16,"context_line":"  does not."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"In this case even the wide tree optimized allocation candidate"},{"line_number":19,"context_line":"generation algorithm produces a lot of partially valid candidates before"},{"line_number":20,"context_line":"it finds that the last (couple of) group in the request cannot be"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"89d6658a_b3cb9924","line":17,"range":{"start_line":14,"start_character":0,"end_line":17,"end_character":1},"updated":"2026-07-17 17:19:52.000000000","message":"i think this is actully mor eimpact full then that if you asked for \n\n64 gourps of 1 and hade only 16 rps its worse then asking for 17 but it not just the close misses that were patalogical\n\nonce you have more hten 10 or so resouce groups each asking for the same resouce class and you hade a wide enouch tree it would be problematic.","commit_id":"98695d8b26d86d94d269b243a7939f224f622b14"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0165cb1b848e031604e788e58ad6f3834c65dc7e","unresolved":false,"context_lines":[{"line_number":33,"context_line":"is already eliminated when that group individually failed to be"},{"line_number":34,"context_line":"fulfilled. As an extension if the request has no resource class"},{"line_number":35,"context_line":"used in multiple groups, or only have a single group, then the pre-check"},{"line_number":36,"context_line":"is a no-op."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"Closes-Bug: #2160721"},{"line_number":39,"context_line":"Signed-off-by: Balazs Gibizer \u003cgibi@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"5e1f10d3_2d98d4ab","line":36,"updated":"2026-07-17 17:19:52.000000000","message":"+1","commit_id":"98695d8b26d86d94d269b243a7939f224f622b14"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0165cb1b848e031604e788e58ad6f3834c65dc7e","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"018f011f_265a65d8","updated":"2026-07-17 17:19:52.000000000","message":"this proably shoudl have a release note as the perframce improvement when it matter really matter for oeprators\n\nthis is effectivly moving a 500 in placemment which manifest as a no valid host error in nova to a succsfuly booting vm so operators likely woudl care.","commit_id":"98695d8b26d86d94d269b243a7939f224f622b14"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e5ef5b21a8ae1e74a9468750c5b907c88638f1e4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"1cbc2e4b_0eecccb8","in_reply_to":"018f011f_265a65d8","updated":"2026-07-21 08:51:47.000000000","message":"added a reno","commit_id":"98695d8b26d86d94d269b243a7939f224f622b14"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"2cfe18a0800309fb6c52f75b5cc5636b5437a049","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"af360041_270f2450","updated":"2026-07-22 22:14:44.000000000","message":"Just noticed some typos, other than that this looks good to me.","commit_id":"dfb9fc8d5fe069676b137e219f1c7097f4b0d4d3"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c2c7652a056be0e65fd7f62cb24a7de7c1ca4422","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"f2312cd9_cf371f6b","updated":"2026-07-21 09:52:32.000000000","message":"thanks gibi this looks good","commit_id":"dfb9fc8d5fe069676b137e219f1c7097f4b0d4d3"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f5709562d037d9cb2eaf5079ffa9a2a15b58b4d3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"f453d113_4c533179","updated":"2026-07-24 23:01:51.000000000","message":"Both Sean and my comments have been addressed, Sean was previously +2 so going ahead and approving, thanks","commit_id":"3457ecd69aa966c9f278c8bf7b2a90a5d9f96a3a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1718fb388423ffb78adb6aff8c877686d98b77d6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"b0d762a7_f0408b03","updated":"2026-07-27 11:01:55.000000000","message":"yep still looks good to me.\nthat also reminds me we should add codespell to placement","commit_id":"3457ecd69aa966c9f278c8bf7b2a90a5d9f96a3a"}],"placement/objects/allocation_candidate.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0165cb1b848e031604e788e58ad6f3834c65dc7e","unresolved":true,"context_lines":[{"line_number":748,"context_line":"    \"\"\"Returns a generator for each anchor provider that generates viable"},{"line_number":749,"context_line":"    candidates (areq_lists) for the given anchor"},{"line_number":750,"context_line":"    \"\"\""},{"line_number":751,"context_line":"    return ["},{"line_number":752,"context_line":"        # We\u0027re using itertools.product to go from this if optimization"},{"line_number":753,"context_line":"        # is not enabled:"},{"line_number":754,"context_line":"        # areq_lists_by_suffix \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"cc40e537_bbeab6b0","line":751,"range":{"start_line":751,"start_character":11,"end_line":751,"end_character":12},"updated":"2026-07-17 17:19:52.000000000","message":"nit: this kind of exxceed my personaly prefence of list comprehentiosn not exceeding 3-5 lines just a tad, but  its mainly just hte comment which could be before it so if you need to respoin woudl bou mind putting the commnet before the return.","commit_id":"a33d0716298c524dd15554e172d1af4b5c8c2924"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e5ef5b21a8ae1e74a9468750c5b907c88638f1e4","unresolved":false,"context_lines":[{"line_number":748,"context_line":"    \"\"\"Returns a generator for each anchor provider that generates viable"},{"line_number":749,"context_line":"    candidates (areq_lists) for the given anchor"},{"line_number":750,"context_line":"    \"\"\""},{"line_number":751,"context_line":"    return ["},{"line_number":752,"context_line":"        # We\u0027re using itertools.product to go from this if optimization"},{"line_number":753,"context_line":"        # is not enabled:"},{"line_number":754,"context_line":"        # areq_lists_by_suffix \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"a76cc0d5_ef1c777a","line":751,"range":{"start_line":751,"start_character":11,"end_line":751,"end_character":12},"in_reply_to":"cc40e537_bbeab6b0","updated":"2026-07-21 08:51:47.000000000","message":"it is unrelated to this patch but I moved it and then went one step further and pulled out the filters to a variable to make the return expression even more readable.","commit_id":"a33d0716298c524dd15554e172d1af4b5c8c2924"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0165cb1b848e031604e788e58ad6f3834c65dc7e","unresolved":false,"context_lines":[{"line_number":782,"context_line":"            # an optimization for wide provider trees and big requests where"},{"line_number":783,"context_line":"            # the request does not fit with a small margin."},{"line_number":784,"context_line":"            # See https://bugs.launchpad.net/placement/+bug/2160721"},{"line_number":785,"context_line":"            _pre_check_overall_capacity(rw_ctx, root, areq_lists_by_suffix)"},{"line_number":786,"context_line":"        )"},{"line_number":787,"context_line":"    ]"},{"line_number":788,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"2bd76a54_ef86c9c8","line":785,"range":{"start_line":785,"start_character":12,"end_line":785,"end_character":75},"updated":"2026-07-17 17:19:52.000000000","message":"ack so the generaotr remains laze but the precheck is greedy and prunes the roots that cant fit before we construct it","commit_id":"a33d0716298c524dd15554e172d1af4b5c8c2924"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0165cb1b848e031604e788e58ad6f3834c65dc7e","unresolved":true,"context_lines":[{"line_number":783,"context_line":"            # the request does not fit with a small margin."},{"line_number":784,"context_line":"            # See https://bugs.launchpad.net/placement/+bug/2160721"},{"line_number":785,"context_line":"            _pre_check_overall_capacity(rw_ctx, root, areq_lists_by_suffix)"},{"line_number":786,"context_line":"        )"},{"line_number":787,"context_line":"    ]"},{"line_number":788,"context_line":""},{"line_number":789,"context_line":""},{"line_number":790,"context_line":"def _pre_check_overall_capacity(rw_ctx, root, areq_lists_by_suffix):"},{"line_number":791,"context_line":"    \"\"\"Does simple pre-calculations to filter out trees that cannot fulfill"}],"source_content_type":"text/x-python","patch_set":1,"id":"40f25df0_53547fc8","line":788,"range":{"start_line":786,"start_character":1,"end_line":788,"end_character":1},"updated":"2026-07-17 17:19:52.000000000","message":"nit: in its current form this just looks boke since by default gerrit curts it of","commit_id":"a33d0716298c524dd15554e172d1af4b5c8c2924"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e5ef5b21a8ae1e74a9468750c5b907c88638f1e4","unresolved":false,"context_lines":[{"line_number":783,"context_line":"            # the request does not fit with a small margin."},{"line_number":784,"context_line":"            # See https://bugs.launchpad.net/placement/+bug/2160721"},{"line_number":785,"context_line":"            _pre_check_overall_capacity(rw_ctx, root, areq_lists_by_suffix)"},{"line_number":786,"context_line":"        )"},{"line_number":787,"context_line":"    ]"},{"line_number":788,"context_line":""},{"line_number":789,"context_line":""},{"line_number":790,"context_line":"def _pre_check_overall_capacity(rw_ctx, root, areq_lists_by_suffix):"},{"line_number":791,"context_line":"    \"\"\"Does simple pre-calculations to filter out trees that cannot fulfill"}],"source_content_type":"text/x-python","patch_set":1,"id":"3306ab68_444fcda5","line":788,"range":{"start_line":786,"start_character":1,"end_line":788,"end_character":1},"in_reply_to":"40f25df0_53547fc8","updated":"2026-07-21 08:51:47.000000000","message":"Done","commit_id":"a33d0716298c524dd15554e172d1af4b5c8c2924"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0165cb1b848e031604e788e58ad6f3834c65dc7e","unresolved":false,"context_lines":[{"line_number":798,"context_line":"        # appears only in a single group already fulfilled (or the tree"},{"line_number":799,"context_line":"        # already elminated) when that single group is fulfilled before we"},{"line_number":800,"context_line":"        # reach this check."},{"line_number":801,"context_line":"        return True"},{"line_number":802,"context_line":""},{"line_number":803,"context_line":"    # Collect the rps that has resources available. These are the ones that"},{"line_number":804,"context_line":"    # matches a request group independently."}],"source_content_type":"text/x-python","patch_set":1,"id":"f5a602a7_3f351657","line":801,"updated":"2026-07-17 17:19:52.000000000","message":"ack os this is the eairly out we dicussed to make this only take effect if we are in an edgecase wehre the genreation could be expensive","commit_id":"a33d0716298c524dd15554e172d1af4b5c8c2924"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0165cb1b848e031604e788e58ad6f3834c65dc7e","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"                rw_ctx.rcs_amounts[rc] +\u003d rg_ctx.resources["},{"line_number":155,"context_line":"                    context.rc_cache.id_from_string(rc)]"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"            alloc_reqs \u003d cls._get_by_one_request(rg_ctx, rw_ctx)"},{"line_number":158,"context_line":"            LOG.debug(\"%s (suffix \u0027%s\u0027) returned %d matches\","},{"line_number":159,"context_line":"                      str(group), str(suffix), len(alloc_reqs))"}],"source_content_type":"text/x-python","patch_set":2,"id":"53a9a0d8_90ab1f5a","line":156,"updated":"2026-07-17 17:19:52.000000000","message":"note to self this is where wer are flatting the reqsouce requests","commit_id":"98695d8b26d86d94d269b243a7939f224f622b14"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0165cb1b848e031604e788e58ad6f3834c65dc7e","unresolved":false,"context_lines":[{"line_number":807,"context_line":"        for areq in areq_list:"},{"line_number":808,"context_line":"            for arr in areq.resource_requests:"},{"line_number":809,"context_line":"                available_rp_ids.add(arr.resource_provider.id)"},{"line_number":810,"context_line":""},{"line_number":811,"context_line":"    # Sum up resources from all available RPs"},{"line_number":812,"context_line":"    available_res_by_rc \u003d collections.defaultdict(int)"},{"line_number":813,"context_line":"    # We only care about RCs that are showing up in more than one request"},{"line_number":814,"context_line":"    # group as if a single group is not fulfillable individually that is"},{"line_number":815,"context_line":"    # already filtered out before we reach this call."},{"line_number":816,"context_line":"    for rc in rw_ctx.multi_group_rcs:"},{"line_number":817,"context_line":"        for rp_id in available_rp_ids:"},{"line_number":818,"context_line":"            key \u003d (rp_id, rc)"},{"line_number":819,"context_line":"            if key in rw_ctx.psum_res_by_rp_rc:"},{"line_number":820,"context_line":"                available_res_by_rc[rc] +\u003d rw_ctx.psum_res_by_rp_rc["},{"line_number":821,"context_line":"                    key].capacity"},{"line_number":822,"context_line":""},{"line_number":823,"context_line":"    # Check if any requested resources are impossible to fulfill from the"},{"line_number":824,"context_line":"    # overall pool of resources in this tree. If not return early so that"}],"source_content_type":"text/x-python","patch_set":2,"id":"6ca2d73f_713b0c60","line":821,"range":{"start_line":810,"start_character":1,"end_line":821,"end_character":33},"updated":"2026-07-17 17:19:52.000000000","message":"here we are flattenign the tree","commit_id":"98695d8b26d86d94d269b243a7939f224f622b14"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0165cb1b848e031604e788e58ad6f3834c65dc7e","unresolved":false,"context_lines":[{"line_number":824,"context_line":"    # overall pool of resources in this tree. If not return early so that"},{"line_number":825,"context_line":"    # this tree is eliminated from further processing."},{"line_number":826,"context_line":"    # The rcs_amounts are already a summary of requested resources per RC"},{"line_number":827,"context_line":"    for rc, request in rw_ctx.rcs_amounts.items():"},{"line_number":828,"context_line":"        # not fulfillable RCs that are only appear in a single group are"},{"line_number":829,"context_line":"        # already handled when groups matches are generated."},{"line_number":830,"context_line":"        if rc in rw_ctx.multi_group_rcs:"}],"source_content_type":"text/x-python","patch_set":2,"id":"b0ba1104_82e57537","line":827,"range":{"start_line":827,"start_character":22,"end_line":827,"end_character":50},"updated":"2026-07-17 17:19:52.000000000","message":"and here we are checking the resource requeste we flatened eariler in _get_by_requests","commit_id":"98695d8b26d86d94d269b243a7939f224f622b14"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"2cfe18a0800309fb6c52f75b5cc5636b5437a049","unresolved":true,"context_lines":[{"line_number":776,"context_line":"        # *all* suffixes (i.e. all RequestGroups)"},{"line_number":777,"context_line":"        lambda _, areq_lists_by_suffix:"},{"line_number":778,"context_line":"            set(areq_lists_by_suffix) \u003d\u003d all_suffixes,"},{"line_number":779,"context_line":"        # Filter out roots where the flattened and symplified resource"},{"line_number":780,"context_line":"        # inventory cannot fulfill the flattened request. This is"},{"line_number":781,"context_line":"        # an optimization for wide provider trees and big requests where"},{"line_number":782,"context_line":"        # the request does not fit with a small margin."}],"source_content_type":"text/x-python","patch_set":3,"id":"d1a723ba_719def17","line":779,"range":{"start_line":779,"start_character":51,"end_line":779,"end_character":61},"updated":"2026-07-22 22:14:44.000000000","message":"simplified","commit_id":"dfb9fc8d5fe069676b137e219f1c7097f4b0d4d3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1a3ff812829dc0e08b12a34a06f50ad1bf87c47e","unresolved":false,"context_lines":[{"line_number":776,"context_line":"        # *all* suffixes (i.e. all RequestGroups)"},{"line_number":777,"context_line":"        lambda _, areq_lists_by_suffix:"},{"line_number":778,"context_line":"            set(areq_lists_by_suffix) \u003d\u003d all_suffixes,"},{"line_number":779,"context_line":"        # Filter out roots where the flattened and symplified resource"},{"line_number":780,"context_line":"        # inventory cannot fulfill the flattened request. This is"},{"line_number":781,"context_line":"        # an optimization for wide provider trees and big requests where"},{"line_number":782,"context_line":"        # the request does not fit with a small margin."}],"source_content_type":"text/x-python","patch_set":3,"id":"b3a874be_1b470bad","line":779,"range":{"start_line":779,"start_character":51,"end_line":779,"end_character":61},"in_reply_to":"d1a723ba_719def17","updated":"2026-07-24 18:34:07.000000000","message":"Done","commit_id":"dfb9fc8d5fe069676b137e219f1c7097f4b0d4d3"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"2cfe18a0800309fb6c52f75b5cc5636b5437a049","unresolved":true,"context_lines":[{"line_number":797,"context_line":"    the candidates for the root."},{"line_number":798,"context_line":"    \"\"\""},{"line_number":799,"context_line":"    if not rw_ctx.multi_group_rcs:"},{"line_number":800,"context_line":"        # We can avoid the cost of this check if no resouce classes are"},{"line_number":801,"context_line":"        # appearing in multiple request groups. Every resouce class that"},{"line_number":802,"context_line":"        # appears only in a single group already fulfilled (or the tree"},{"line_number":803,"context_line":"        # already elminated) when that single group is fulfilled before we"}],"source_content_type":"text/x-python","patch_set":3,"id":"6e213c10_e49c530a","line":800,"range":{"start_line":800,"start_character":52,"end_line":800,"end_character":59},"updated":"2026-07-22 22:14:44.000000000","message":"resource","commit_id":"dfb9fc8d5fe069676b137e219f1c7097f4b0d4d3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1a3ff812829dc0e08b12a34a06f50ad1bf87c47e","unresolved":false,"context_lines":[{"line_number":797,"context_line":"    the candidates for the root."},{"line_number":798,"context_line":"    \"\"\""},{"line_number":799,"context_line":"    if not rw_ctx.multi_group_rcs:"},{"line_number":800,"context_line":"        # We can avoid the cost of this check if no resouce classes are"},{"line_number":801,"context_line":"        # appearing in multiple request groups. Every resouce class that"},{"line_number":802,"context_line":"        # appears only in a single group already fulfilled (or the tree"},{"line_number":803,"context_line":"        # already elminated) when that single group is fulfilled before we"}],"source_content_type":"text/x-python","patch_set":3,"id":"0f075b07_8d88b62a","line":800,"range":{"start_line":800,"start_character":52,"end_line":800,"end_character":59},"in_reply_to":"6e213c10_e49c530a","updated":"2026-07-24 18:34:07.000000000","message":"Done","commit_id":"dfb9fc8d5fe069676b137e219f1c7097f4b0d4d3"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"2cfe18a0800309fb6c52f75b5cc5636b5437a049","unresolved":true,"context_lines":[{"line_number":798,"context_line":"    \"\"\""},{"line_number":799,"context_line":"    if not rw_ctx.multi_group_rcs:"},{"line_number":800,"context_line":"        # We can avoid the cost of this check if no resouce classes are"},{"line_number":801,"context_line":"        # appearing in multiple request groups. Every resouce class that"},{"line_number":802,"context_line":"        # appears only in a single group already fulfilled (or the tree"},{"line_number":803,"context_line":"        # already elminated) when that single group is fulfilled before we"},{"line_number":804,"context_line":"        # reach this check."}],"source_content_type":"text/x-python","patch_set":3,"id":"f89c27fd_093b7175","line":801,"range":{"start_line":801,"start_character":54,"end_line":801,"end_character":61},"updated":"2026-07-22 22:14:44.000000000","message":"resource","commit_id":"dfb9fc8d5fe069676b137e219f1c7097f4b0d4d3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1a3ff812829dc0e08b12a34a06f50ad1bf87c47e","unresolved":false,"context_lines":[{"line_number":798,"context_line":"    \"\"\""},{"line_number":799,"context_line":"    if not rw_ctx.multi_group_rcs:"},{"line_number":800,"context_line":"        # We can avoid the cost of this check if no resouce classes are"},{"line_number":801,"context_line":"        # appearing in multiple request groups. Every resouce class that"},{"line_number":802,"context_line":"        # appears only in a single group already fulfilled (or the tree"},{"line_number":803,"context_line":"        # already elminated) when that single group is fulfilled before we"},{"line_number":804,"context_line":"        # reach this check."}],"source_content_type":"text/x-python","patch_set":3,"id":"62ee50ff_717e25e9","line":801,"range":{"start_line":801,"start_character":54,"end_line":801,"end_character":61},"in_reply_to":"f89c27fd_093b7175","updated":"2026-07-24 18:34:07.000000000","message":"I see a pattern here :) Done.","commit_id":"dfb9fc8d5fe069676b137e219f1c7097f4b0d4d3"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"2cfe18a0800309fb6c52f75b5cc5636b5437a049","unresolved":true,"context_lines":[{"line_number":800,"context_line":"        # We can avoid the cost of this check if no resouce classes are"},{"line_number":801,"context_line":"        # appearing in multiple request groups. Every resouce class that"},{"line_number":802,"context_line":"        # appears only in a single group already fulfilled (or the tree"},{"line_number":803,"context_line":"        # already elminated) when that single group is fulfilled before we"},{"line_number":804,"context_line":"        # reach this check."},{"line_number":805,"context_line":"        return True"},{"line_number":806,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"378827f4_5c70f7e0","line":803,"range":{"start_line":803,"start_character":18,"end_line":803,"end_character":27},"updated":"2026-07-22 22:14:44.000000000","message":"eliminated","commit_id":"dfb9fc8d5fe069676b137e219f1c7097f4b0d4d3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1a3ff812829dc0e08b12a34a06f50ad1bf87c47e","unresolved":false,"context_lines":[{"line_number":800,"context_line":"        # We can avoid the cost of this check if no resouce classes are"},{"line_number":801,"context_line":"        # appearing in multiple request groups. Every resouce class that"},{"line_number":802,"context_line":"        # appears only in a single group already fulfilled (or the tree"},{"line_number":803,"context_line":"        # already elminated) when that single group is fulfilled before we"},{"line_number":804,"context_line":"        # reach this check."},{"line_number":805,"context_line":"        return True"},{"line_number":806,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"db534786_16447309","line":803,"range":{"start_line":803,"start_character":18,"end_line":803,"end_character":27},"in_reply_to":"378827f4_5c70f7e0","updated":"2026-07-24 18:34:07.000000000","message":"I promise I had a spellcheck enabled in my IDE, it seems some update broke it. :/","commit_id":"dfb9fc8d5fe069676b137e219f1c7097f4b0d4d3"}],"placement/objects/research_context.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0165cb1b848e031604e788e58ad6f3834c65dc7e","unresolved":true,"context_lines":[{"line_number":211,"context_line":"        self.multi_group_rcs \u003d set()"},{"line_number":212,"context_line":"        # A dict of resource classes, the value is the total amount requested"},{"line_number":213,"context_line":"        # from that resource class across all the groups."},{"line_number":214,"context_line":"        self.rcs_amounts \u003d collections.Counter()"},{"line_number":215,"context_line":"        # A mapping of resource provider uuid to parent provider uuid, used"},{"line_number":216,"context_line":"        # when merging allocation candidates."},{"line_number":217,"context_line":"        self.parent_uuid_by_rp_uuid \u003d {}"}],"source_content_type":"text/x-python","patch_set":2,"id":"6e1111d0_dfd4aaab","line":214,"updated":"2026-07-17 17:19:52.000000000","message":"ack yes we want this to be a counter","commit_id":"98695d8b26d86d94d269b243a7939f224f622b14"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f3d5775719694377a7685011b8b274e375972c64","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        self.multi_group_rcs \u003d set()"},{"line_number":212,"context_line":"        # A dict of resource classes, the value is the total amount requested"},{"line_number":213,"context_line":"        # from that resource class across all the groups."},{"line_number":214,"context_line":"        self.rcs_amounts \u003d collections.Counter()"},{"line_number":215,"context_line":"        # A mapping of resource provider uuid to parent provider uuid, used"},{"line_number":216,"context_line":"        # when merging allocation candidates."},{"line_number":217,"context_line":"        self.parent_uuid_by_rp_uuid \u003d {}"}],"source_content_type":"text/x-python","patch_set":2,"id":"88976106_bf54bd7a","line":214,"in_reply_to":"6e1111d0_dfd4aaab","updated":"2026-07-21 08:51:58.000000000","message":"Acknowledged","commit_id":"98695d8b26d86d94d269b243a7939f224f622b14"}],"placement/tests/functional/test_allocation_candidates.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b69b123ab51ce08bf546429f01906213c9c5a5ca","unresolved":true,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def create_tree(self, num_roots, num_child, num_res_per_child):"},{"line_number":40,"context_line":"        self.roots \u003d {}"},{"line_number":41,"context_line":"        self.children \u003d {}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        for i in range(num_roots):"},{"line_number":44,"context_line":"            compute \u003d tb.create_provider("}],"source_content_type":"text/x-python","patch_set":1,"id":"e6bf81fb_2e78aefb","line":41,"updated":"2026-07-16 16:42:06.000000000","message":"I can drop this, it is unused","commit_id":"a33d0716298c524dd15554e172d1af4b5c8c2924"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e5ef5b21a8ae1e74a9468750c5b907c88638f1e4","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def create_tree(self, num_roots, num_child, num_res_per_child):"},{"line_number":40,"context_line":"        self.roots \u003d {}"},{"line_number":41,"context_line":"        self.children \u003d {}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        for i in range(num_roots):"},{"line_number":44,"context_line":"            compute \u003d tb.create_provider("}],"source_content_type":"text/x-python","patch_set":1,"id":"5fa7bb29_cb232b62","line":41,"in_reply_to":"e6bf81fb_2e78aefb","updated":"2026-07-21 08:51:47.000000000","message":"Done","commit_id":"a33d0716298c524dd15554e172d1af4b5c8c2924"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0165cb1b848e031604e788e58ad6f3834c65dc7e","unresolved":true,"context_lines":[{"line_number":51,"context_line":"            for j in range(num_child):"},{"line_number":52,"context_line":"                child \u003d tb.create_provider("},{"line_number":53,"context_line":"                    self.context, f\u0027compute{i}:PF{j}\u0027, parent\u003dcompute.uuid)"},{"line_number":54,"context_line":"                self.children[child.uuid] \u003d child"},{"line_number":55,"context_line":"                tb.add_inventory(child, \u0027CUSTOM_VF\u0027, num_res_per_child)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"bb2ab979_d0b7d016","line":54,"updated":"2026-07-17 17:19:52.000000000","message":"ok so your populateing it here but not actully depending on it later?","commit_id":"98695d8b26d86d94d269b243a7939f224f622b14"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e5ef5b21a8ae1e74a9468750c5b907c88638f1e4","unresolved":false,"context_lines":[{"line_number":51,"context_line":"            for j in range(num_child):"},{"line_number":52,"context_line":"                child \u003d tb.create_provider("},{"line_number":53,"context_line":"                    self.context, f\u0027compute{i}:PF{j}\u0027, parent\u003dcompute.uuid)"},{"line_number":54,"context_line":"                self.children[child.uuid] \u003d child"},{"line_number":55,"context_line":"                tb.add_inventory(child, \u0027CUSTOM_VF\u0027, num_res_per_child)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"a9fa7411_313d1346","line":54,"in_reply_to":"bb2ab979_d0b7d016","updated":"2026-07-21 08:51:47.000000000","message":"yeah at some point in the development I used it but at the end it wasn\u0027t needed.","commit_id":"98695d8b26d86d94d269b243a7939f224f622b14"}],"placement/tests/unit/objects/test_allocation_candidate.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c2c7652a056be0e65fd7f62cb24a7de7c1ca4422","unresolved":true,"context_lines":[{"line_number":411,"context_line":"    def setUp(self):"},{"line_number":412,"context_line":"        super().setUp()"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"        patcher \u003d mock.patch("},{"line_number":415,"context_line":"            \u0027placement.objects.research_context._has_provider_trees\u0027,"},{"line_number":416,"context_line":"            new\u003dmock.Mock(return_value\u003dTrue))"},{"line_number":417,"context_line":"        self.addCleanup(patcher.stop)"},{"line_number":418,"context_line":"        patcher.start()"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"        self.rw_ctx \u003d res_ctx.RequestWideSearchContext("},{"line_number":421,"context_line":"            self.context, placement_lib.RequestWideParams(), True)"}],"source_content_type":"text/x-python","patch_set":3,"id":"6bb49022_e085bead","line":418,"range":{"start_line":414,"start_character":0,"end_line":418,"end_character":23},"updated":"2026-07-21 09:52:32.000000000","message":"nit: \n```suggestion\n        self.useFixture(\n            fixtures.MockPatch(\n                \u0027placement.objects.research_context._has_provider_trees\u0027,\n                return_value\u003dTrue))\n```","commit_id":"dfb9fc8d5fe069676b137e219f1c7097f4b0d4d3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1a3ff812829dc0e08b12a34a06f50ad1bf87c47e","unresolved":false,"context_lines":[{"line_number":411,"context_line":"    def setUp(self):"},{"line_number":412,"context_line":"        super().setUp()"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"        patcher \u003d mock.patch("},{"line_number":415,"context_line":"            \u0027placement.objects.research_context._has_provider_trees\u0027,"},{"line_number":416,"context_line":"            new\u003dmock.Mock(return_value\u003dTrue))"},{"line_number":417,"context_line":"        self.addCleanup(patcher.stop)"},{"line_number":418,"context_line":"        patcher.start()"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"        self.rw_ctx \u003d res_ctx.RequestWideSearchContext("},{"line_number":421,"context_line":"            self.context, placement_lib.RequestWideParams(), True)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bbe80520_a44d53a6","line":418,"range":{"start_line":414,"start_character":0,"end_line":418,"end_character":23},"in_reply_to":"6bb49022_e085bead","updated":"2026-07-24 18:34:07.000000000","message":"good point.","commit_id":"dfb9fc8d5fe069676b137e219f1c7097f4b0d4d3"}]}
