)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"52363ea6292ffa4b76bd8ae46d022ef0f5de2d53","unresolved":true,"context_lines":[{"line_number":24,"context_line":"what operators expect based on the multiple bugs opened against Nova"},{"line_number":25,"context_line":"for this issue."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Fixes-Bug: #2104040"},{"line_number":28,"context_line":"Change-Id: If7264d3ce679b6f9b604a3bcd2a417cc175e3793"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"7a14cdfd_eb2b3bbb","line":27,"updated":"2025-03-25 15:28:45.000000000","message":"Sorry, muscle memory from another project. Will correct on the next push","commit_id":"24fa7840a2089b842edd28772383a0d0da23dd80"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d90ab2544b63f41335fe0393ce5b33b199e8f649","unresolved":false,"context_lines":[{"line_number":24,"context_line":"what operators expect based on the multiple bugs opened against Nova"},{"line_number":25,"context_line":"for this issue."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Fixes-Bug: #2104040"},{"line_number":28,"context_line":"Change-Id: If7264d3ce679b6f9b604a3bcd2a417cc175e3793"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"af1357ba_9f34d413","line":27,"in_reply_to":"7a14cdfd_eb2b3bbb","updated":"2025-03-31 17:23:43.000000000","message":"Done","commit_id":"24fa7840a2089b842edd28772383a0d0da23dd80"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"780f60fd1674c1bc0b4afbbeadc2b19af41cde6b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"c18f4593_9511a306","updated":"2025-03-31 17:55:58.000000000","message":"Note for reviewers: I have manually confirmed that this fixes the placement bug noted in the commit message, and the three nova bugs it references. I did this by changing the inventory of a compute node with an instance running such that it was over-capacity. A migrate operation would fail immediately when nova tried to swap the instance\u0027s allocation for the migration uuid on the source host. Changing placement to this commit and retrying the same operation now succeeds (i.e. the instance can be migrated away from the over-capacity compute node).\n\nI didn\u0027t reference the nova bugs in this commit initially since they are nova bugs and this is placement. However, I can add them here as `Closes-Bug:` if people want.","commit_id":"d69f06fa470719173b84be8ec70f5adbb0908e0b"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"a6a30986fe72d3cd63559177218b8a0f1183a4dc","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"59fe09c5_f73175ff","updated":"2025-05-15 09:26:33.000000000","message":"Hi Dan, just a soft -1 to point out a few small nits.\nThe change is clear and easy to read — it looks good to me. 👍\n\nI saw your comment about testing. I\u0027d suggest adding a Closes-Bug tag in the commit message, referencing the relevant Nova bugs that this patch addresses.","commit_id":"0fa5ef2b64b61c3909e8fd8da5e3ce61a5a2e2f4"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"26f55405b52ef74a08e2b092abc23f2856f67361","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"29fcbcd6_50e75f0c","in_reply_to":"1188baf9_825eda63","updated":"2025-05-16 13:25:01.000000000","message":"Ok, so if I understand correctly, maybe we can mark the one that’s effectively resolved by this patch with a Closes-Bug, and the other one as Related-Bug, as you suggested.\nThat way, we accurately reflect the current status while keeping the context for Nova.","commit_id":"0fa5ef2b64b61c3909e8fd8da5e3ce61a5a2e2f4"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"844ffce155eca53ce9d360ec66c5b8d37325aa97","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"af21425d_272f8d3b","in_reply_to":"29fcbcd6_50e75f0c","updated":"2025-05-16 17:09:00.000000000","message":"No, it\u0027s not \"one of the[m bugs]\" but \"one of the scenarios under which this can happen\". It should be the same behavior and thus apply to those, but I haven\u0027t confirmed yet because it\u0027s harder to set up that scenario.\n\nIf it\u0027s okay I will related-bug all of those here. Then when this merges I\u0027ll go back and close the nova bugs as \"we think this is resolved by the placement fix in bug 2104040, please reopen if not\". For things that aren\u0027t multi-project bugs I think that\u0027s a pretty common pattern.","commit_id":"0fa5ef2b64b61c3909e8fd8da5e3ce61a5a2e2f4"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8d27dc41946200860807dc25e70bd1989cd72c11","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"1188baf9_825eda63","in_reply_to":"59fe09c5_f73175ff","updated":"2025-05-15 18:43:24.000000000","message":"I didn\u0027t closes-bug those because this doesn\u0027t necessarily resolve those entirely, it just closes the gap in what we\u0027re stumbling over with those. I did manually reproduce the situation with those and test that one of them is resolved with just this and nothing else, but not the other. That\u0027s why I filed a specific bug for placement to reference here.\n\nMaybe Related-Bug the nova ones?","commit_id":"0fa5ef2b64b61c3909e8fd8da5e3ce61a5a2e2f4"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"e8e8b4ae726a442d0df59a1365a47eb9d821a1d9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"82d760de_3eae0391","in_reply_to":"af21425d_272f8d3b","updated":"2025-05-16 19:59:40.000000000","message":"Perfect.","commit_id":"0fa5ef2b64b61c3909e8fd8da5e3ce61a5a2e2f4"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"e8e8b4ae726a442d0df59a1365a47eb9d821a1d9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"a7fe6c54_4c43f7a9","updated":"2025-05-16 19:59:40.000000000","message":"All good for me. Thx Dan.","commit_id":"5ac4c70b8ad63a0fd7cea9f66e925569eaf0612c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"82427d35e10bcba9a50719b7da0475adf774a1b0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"2b2ac5c0_6401c361","updated":"2025-08-27 14:42:20.000000000","message":"Looks good to me.","commit_id":"5ac4c70b8ad63a0fd7cea9f66e925569eaf0612c"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"83f20fdc7f79a26eb325abc4b24a9d4e5bfc026a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"94aeb691_3ace4e08","updated":"2025-08-27 11:49:02.000000000","message":"tested manually, seems to work. Thanks.","commit_id":"5ac4c70b8ad63a0fd7cea9f66e925569eaf0612c"}],"placement/objects/allocation.py":[{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"a6a30986fe72d3cd63559177218b8a0f1183a4dc","unresolved":true,"context_lines":[{"line_number":116,"context_line":"    by any one of the allocations."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    If no inventories would be exceeded or violated by the allocations, the"},{"line_number":119,"context_line":"    function returns a list of `ResourceProvider` objects that contain the"},{"line_number":120,"context_line":"    generation at the time of the check."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    :param ctx: `placement.context.RequestContext` that has an oslo_db"}],"source_content_type":"text/x-python","patch_set":4,"id":"c32417f5_9ddbca17","line":119,"range":{"start_line":119,"start_character":23,"end_line":119,"end_character":27},"updated":"2025-05-15 09:26:33.000000000","message":"I think this is incorrect, it is returning a dict not a list.\nAlthough not part of your change.","commit_id":"0fa5ef2b64b61c3909e8fd8da5e3ce61a5a2e2f4"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8d27dc41946200860807dc25e70bd1989cd72c11","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    by any one of the allocations."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    If no inventories would be exceeded or violated by the allocations, the"},{"line_number":119,"context_line":"    function returns a list of `ResourceProvider` objects that contain the"},{"line_number":120,"context_line":"    generation at the time of the check."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    :param ctx: `placement.context.RequestContext` that has an oslo_db"}],"source_content_type":"text/x-python","patch_set":4,"id":"2a3cab4c_8097832e","line":119,"range":{"start_line":119,"start_character":23,"end_line":119,"end_character":27},"in_reply_to":"c32417f5_9ddbca17","updated":"2025-05-15 18:43:24.000000000","message":"Acknowledged","commit_id":"0fa5ef2b64b61c3909e8fd8da5e3ce61a5a2e2f4"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"a6a30986fe72d3cd63559177218b8a0f1183a4dc","unresolved":false,"context_lines":[{"line_number":251,"context_line":"        # usage.used can be returned as None"},{"line_number":252,"context_line":"        used \u003d usage.used or 0"},{"line_number":253,"context_line":"        capacity \u003d (usage.total - usage.reserved) * allocation_ratio"},{"line_number":254,"context_line":"        amount_needed_all \u003d rp_resource_class_sum[rp_uuid][rc_id]"},{"line_number":255,"context_line":"        if (capacity \u003c (used + amount_needed) or"},{"line_number":256,"context_line":"                capacity \u003c (used + amount_needed_all)):"},{"line_number":257,"context_line":"            # If we get here, this RP is over capacity. That\u0027s a problem,"}],"source_content_type":"text/x-python","patch_set":4,"id":"06a3fce8_8f1edb90","line":254,"range":{"start_line":254,"start_character":8,"end_line":254,"end_character":25},"updated":"2025-05-15 09:26:33.000000000","message":"++ this clarify what is rp_resource_class_sum[rp_uuid][rc_id]","commit_id":"0fa5ef2b64b61c3909e8fd8da5e3ce61a5a2e2f4"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"a6a30986fe72d3cd63559177218b8a0f1183a4dc","unresolved":true,"context_lines":[{"line_number":284,"context_line":"                    params)"},{"line_number":285,"context_line":"            else:"},{"line_number":286,"context_line":"                # The situation is worse than it was, so refuse."},{"line_number":287,"context_line":"                LOG.warning("},{"line_number":288,"context_line":"                    \"Over capacity for %(rc)s on resource provider %(rp)s. \""},{"line_number":289,"context_line":"                    \"Needed: %(needed)s, Used: %(used)s, Capacity: %(cap)s\","},{"line_number":290,"context_line":"                    params)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3d7b1621_96910117","line":287,"range":{"start_line":287,"start_character":20,"end_line":287,"end_character":27},"updated":"2025-05-15 09:26:33.000000000","message":"Maybe this should be changed to an error ?","commit_id":"0fa5ef2b64b61c3909e8fd8da5e3ce61a5a2e2f4"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8d27dc41946200860807dc25e70bd1989cd72c11","unresolved":true,"context_lines":[{"line_number":284,"context_line":"                    params)"},{"line_number":285,"context_line":"            else:"},{"line_number":286,"context_line":"                # The situation is worse than it was, so refuse."},{"line_number":287,"context_line":"                LOG.warning("},{"line_number":288,"context_line":"                    \"Over capacity for %(rc)s on resource provider %(rp)s. \""},{"line_number":289,"context_line":"                    \"Needed: %(needed)s, Used: %(used)s, Capacity: %(cap)s\","},{"line_number":290,"context_line":"                    params)"}],"source_content_type":"text/x-python","patch_set":4,"id":"e2f4de5e_37c2bcc9","line":287,"range":{"start_line":287,"start_character":20,"end_line":287,"end_character":27},"in_reply_to":"3d7b1621_96910117","updated":"2025-05-15 18:43:24.000000000","message":"I don\u0027t think this is an ERROR because it doesn\u0027t imply that something is wrong that the operator needs to address (it\u0027s just adding context to the logs about why it is rejecting the request). It\u0027s noting a situation with a client request which may or may not even be a problem. It\u0027s also a little more than INFO (documenting a measurable unit of work), especially because in this case it\u0027s an allocation management thing, which is likely/usually going to be a compute node doing a thing. So WARNING seems most appropriate to me based on the logging guidelines, even though it may be a little too strong:\n\nhttps://docs.openstack.org/oslo.log/victoria/user/guidelines.html#log-levels-from-an-operator-perspective\n\nAlso, this log statement is not really mine, and is existing on old L229, I just split one case out of it for the above. You could argue we need to lower the severity of that one I guess, but it seems appropriate to keep it matched to this one. The same situation still exists (we\u0027re over capacity) we\u0027re just allowing it to get a little better, so the message is tweaked slightly.","commit_id":"0fa5ef2b64b61c3909e8fd8da5e3ce61a5a2e2f4"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"26f55405b52ef74a08e2b092abc23f2856f67361","unresolved":false,"context_lines":[{"line_number":284,"context_line":"                    params)"},{"line_number":285,"context_line":"            else:"},{"line_number":286,"context_line":"                # The situation is worse than it was, so refuse."},{"line_number":287,"context_line":"                LOG.warning("},{"line_number":288,"context_line":"                    \"Over capacity for %(rc)s on resource provider %(rp)s. \""},{"line_number":289,"context_line":"                    \"Needed: %(needed)s, Used: %(used)s, Capacity: %(cap)s\","},{"line_number":290,"context_line":"                    params)"}],"source_content_type":"text/x-python","patch_set":4,"id":"8d39e5ab_78ed7e84","line":287,"range":{"start_line":287,"start_character":20,"end_line":287,"end_character":27},"in_reply_to":"e2f4de5e_37c2bcc9","updated":"2025-05-16 13:25:01.000000000","message":"It was an open question because, to be honest, I wasn\u0027t entirely sure which level we should set, and I was interested in hearing your thoughts on it.\nWhat you explained makes perfect sense — I agree with your reasoning.\nAlso, thanks a lot for the documentation link! I\u0027ll definitely keep it as a reference for when I need to define log levels in the future.","commit_id":"0fa5ef2b64b61c3909e8fd8da5e3ce61a5a2e2f4"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"63bab1aeb4a8b0d90668f2330f9574c60cae748f","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    for record in records:"},{"line_number":103,"context_line":"        rp_summary \u003d summary[record.resource_provider_id]"},{"line_number":104,"context_line":"        rp_summary[record.resource_class_id] \u003d record.used"},{"line_number":105,"context_line":"    return summary"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"def _check_capacity_exceeded(ctx, allocs, prev_usage):"}],"source_content_type":"text/x-python","patch_set":5,"id":"af299e95_7ee43895","line":105,"updated":"2025-08-27 19:09:50.000000000","message":"ah you seperated the query generation from the execution and formating into python objects.\n\nya that a nice seperation of concerns without beign to \"clean code\" purist.","commit_id":"5ac4c70b8ad63a0fd7cea9f66e925569eaf0612c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"63bab1aeb4a8b0d90668f2330f9574c60cae748f","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                  for a in allocs])"},{"line_number":157,"context_line":"    provider_uuids \u003d set([a.resource_provider.uuid for a in allocs])"},{"line_number":158,"context_line":"    provider_ids \u003d set([a.resource_provider.id for a in allocs])"},{"line_number":159,"context_line":"    usage \u003d _provider_usage_query(provider_ids, rc_ids).subquery(name\u003d\u0027usage\u0027)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    inv_join \u003d sql.join("},{"line_number":162,"context_line":"        _RP_TBL, _INV_TBL,"}],"source_content_type":"text/x-python","patch_set":5,"id":"c6e5b625_735091d1","line":159,"updated":"2025-08-27 19:09:50.000000000","message":"that allows the resue here and in _provider_usage_summary without over engineering this. +1","commit_id":"5ac4c70b8ad63a0fd7cea9f66e925569eaf0612c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"63bab1aeb4a8b0d90668f2330f9574c60cae748f","unresolved":false,"context_lines":[{"line_number":259,"context_line":"            # making the situation better (i.e. resulting in less or the same"},{"line_number":260,"context_line":"            # amount of over-capacity)."},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"            try:"},{"line_number":263,"context_line":"                prev_used \u003d prev_usage[alloc.resource_provider.id][rc_id]"},{"line_number":264,"context_line":"            except KeyError:"},{"line_number":265,"context_line":"                prev_used \u003d None"},{"line_number":266,"context_line":"            params \u003d {"},{"line_number":267,"context_line":"                \u0027rc\u0027: alloc.resource_class,"},{"line_number":268,"context_line":"                \u0027rp\u0027: rp_uuid,"}],"source_content_type":"text/x-python","patch_set":5,"id":"8fc0e3a0_1e5d648c","line":265,"range":{"start_line":262,"start_character":11,"end_line":265,"end_character":32},"updated":"2025-08-27 19:09:50.000000000","message":"nit: i would have done this with get but this is also fine.\n\n```suggestion\n            prev_used \u003d prev_usage.get(alloc.resource_provider.id,{}).get(rc_id)\n```","commit_id":"5ac4c70b8ad63a0fd7cea9f66e925569eaf0612c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"82427d35e10bcba9a50719b7da0475adf774a1b0","unresolved":false,"context_lines":[{"line_number":274,"context_line":"            }"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"            if prev_used is not None and ("},{"line_number":277,"context_line":"                    used + amount_needed_all \u003c\u003d prev_used):"},{"line_number":278,"context_line":"                # The situation is no worse than it was, so no reason to"},{"line_number":279,"context_line":"                # refuse the change."},{"line_number":280,"context_line":"                LOG.warning("},{"line_number":281,"context_line":"                    \"Over capacity for %(rc)s on resource provider \""},{"line_number":282,"context_line":"                    \"%(rp)s but allocation of %(needed)s reduces \""},{"line_number":283,"context_line":"                    \"existing overage from %(prev_used)s to %(needed_all)s\","},{"line_number":284,"context_line":"                    params)"},{"line_number":285,"context_line":"            else:"},{"line_number":286,"context_line":"                # The situation is worse than it was, so refuse."}],"source_content_type":"text/x-python","patch_set":5,"id":"b1e034dd_f7b0b442","line":283,"range":{"start_line":277,"start_character":0,"end_line":283,"end_character":76},"updated":"2025-08-27 14:42:20.000000000","message":"nit: there is a bit of contradiction about the condition and the log. It the action might not strictly reducing the existing overcommit.","commit_id":"5ac4c70b8ad63a0fd7cea9f66e925569eaf0612c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"63bab1aeb4a8b0d90668f2330f9574c60cae748f","unresolved":true,"context_lines":[{"line_number":274,"context_line":"            }"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"            if prev_used is not None and ("},{"line_number":277,"context_line":"                    used + amount_needed_all \u003c\u003d prev_used):"},{"line_number":278,"context_line":"                # The situation is no worse than it was, so no reason to"},{"line_number":279,"context_line":"                # refuse the change."},{"line_number":280,"context_line":"                LOG.warning("},{"line_number":281,"context_line":"                    \"Over capacity for %(rc)s on resource provider \""},{"line_number":282,"context_line":"                    \"%(rp)s but allocation of %(needed)s reduces \""},{"line_number":283,"context_line":"                    \"existing overage from %(prev_used)s to %(needed_all)s\","},{"line_number":284,"context_line":"                    params)"},{"line_number":285,"context_line":"            else:"},{"line_number":286,"context_line":"                # The situation is worse than it was, so refuse."}],"source_content_type":"text/x-python","patch_set":5,"id":"e66f5567_6a1c1af9","line":283,"range":{"start_line":277,"start_character":0,"end_line":283,"end_character":76},"in_reply_to":"b1e034dd_f7b0b442","updated":"2025-08-27 19:09:50.000000000","message":"you are correc it equal or less so we may want to say\n\n\n```suggestion\n                    used + amount_needed_all \u003c\u003d prev_used):\n                # The situation is no worse than it was, so no reason to\n                # refuse the change.\n                LOG.warning(\n                    \"Over capacity for %(rc)s on resource provider \"\n                    \"%(rp)s but allocation of %(needed)s does not increase \"\n                    \"existing overage from %(prev_used)s, new value %(needed_all)s\",\n```\n\nim ok with this beeing a follow up or jsut merging it as is.","commit_id":"5ac4c70b8ad63a0fd7cea9f66e925569eaf0612c"}],"placement/tests/functional/db/test_allocation.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a1c2bb00938c669b884a816360a46f340127599e","unresolved":true,"context_lines":[{"line_number":660,"context_line":""},{"line_number":661,"context_line":"        # Make sure we can update inventory with any improvement (but no"},{"line_number":662,"context_line":"        # further worsening either)."},{"line_number":663,"context_line":"        alloc_obj.replace_all(self.ctx, allocs_post)"},{"line_number":664,"context_line":""},{"line_number":665,"context_line":"        # Make sure we can swap inventory to another consumer without any"},{"line_number":666,"context_line":"        # improvement (but no further worsening either)."}],"source_content_type":"text/x-python","patch_set":2,"id":"7a1042b4_0f553e06","line":663,"updated":"2025-03-25 15:40:09.000000000","message":"Oops, bad rebase merge here","commit_id":"24fa7840a2089b842edd28772383a0d0da23dd80"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"455481a44d47c7dd9daadf8dcd000a4ac4aaf101","unresolved":false,"context_lines":[{"line_number":660,"context_line":""},{"line_number":661,"context_line":"        # Make sure we can update inventory with any improvement (but no"},{"line_number":662,"context_line":"        # further worsening either)."},{"line_number":663,"context_line":"        alloc_obj.replace_all(self.ctx, allocs_post)"},{"line_number":664,"context_line":""},{"line_number":665,"context_line":"        # Make sure we can swap inventory to another consumer without any"},{"line_number":666,"context_line":"        # improvement (but no further worsening either)."}],"source_content_type":"text/x-python","patch_set":2,"id":"5dd425ec_18cbd008","line":663,"in_reply_to":"7a1042b4_0f553e06","updated":"2025-03-25 16:15:53.000000000","message":"Done","commit_id":"24fa7840a2089b842edd28772383a0d0da23dd80"}]}
