)]}'
{"placement/objects/allocation_candidate.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a00d79fdcf4df9cc240d8f2472a7d54e8b1d7b3c","unresolved":false,"context_lines":[{"line_number":391,"context_line":""},{"line_number":392,"context_line":"    # Extend rw_ctx.summaries_by_id dict, keyed by resource provider internal"},{"line_number":393,"context_line":"    # ID, of ProviderSummary objects for all providers"},{"line_number":394,"context_line":"    _build_provider_summaries(rg_ctx.context, rw_ctx, prov_traits)"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"    # Next, build up a list of allocation requests. These allocation requests"},{"line_number":397,"context_line":"    # are AllocationRequest objects, containing resource provider UUIDs,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_e88e4b2c","line":394,"range":{"start_line":394,"start_character":4,"end_line":394,"end_character":29},"updated":"2019-08-05 19:52:21.000000000","message":"makes me realize we should probably move this to RequestWideContext too","commit_id":"38ed8864b33c46d825f681b591b3f0d537c406a8"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d79960aece2f5c6c85e9fd25eb2d6e1c184c8660","unresolved":false,"context_lines":[{"line_number":391,"context_line":""},{"line_number":392,"context_line":"    # Extend rw_ctx.summaries_by_id dict, keyed by resource provider internal"},{"line_number":393,"context_line":"    # ID, of ProviderSummary objects for all providers"},{"line_number":394,"context_line":"    _build_provider_summaries(rg_ctx.context, rw_ctx, prov_traits)"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"    # Next, build up a list of allocation requests. These allocation requests"},{"line_number":397,"context_line":"    # are AllocationRequest objects, containing resource provider UUIDs,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_e8996b1e","line":394,"range":{"start_line":394,"start_character":4,"end_line":394,"end_character":29},"in_reply_to":"7faddb67_e88e4b2c","updated":"2019-08-05 20:18:14.000000000","message":"Ugh. Getting rid of circular imports turns out to be a nontrivial task. Which probably means we could be better organized.\n\n/me punts for now.","commit_id":"38ed8864b33c46d825f681b591b3f0d537c406a8"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0055e6db876b0d88478d0db8336e70ec305a209f","unresolved":false,"context_lines":[{"line_number":467,"context_line":""},{"line_number":468,"context_line":"    :param context: placement.context.RequestContext object"},{"line_number":469,"context_line":"    :param rw_ctx: placement.research_context.RequestWideSearchContext"},{"line_number":470,"context_line":"    :param usages: A list of dicts with the following format:"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"        {"},{"line_number":473,"context_line":"            \u0027resource_provider_id\u0027: \u003cinternal resource provider ID\u003e,"},{"line_number":474,"context_line":"            \u0027resource_provider_uuid\u0027: \u003cUUID\u003e,"},{"line_number":475,"context_line":"            \u0027resource_class_id\u0027: \u003cinternal resource class ID\u003e,"},{"line_number":476,"context_line":"            \u0027total\u0027: integer,"},{"line_number":477,"context_line":"            \u0027reserved\u0027: integer,"},{"line_number":478,"context_line":"            \u0027allocation_ratio\u0027: float,"},{"line_number":479,"context_line":"        }"},{"line_number":480,"context_line":"    :param prov_traits: A dict, keyed by internal resource provider ID, of"},{"line_number":481,"context_line":"                        string trait names associated with that provider"},{"line_number":482,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_48cd1f64","line":479,"range":{"start_line":470,"start_character":0,"end_line":479,"end_character":9},"updated":"2019-08-05 19:57:33.000000000","message":"nix","commit_id":"38ed8864b33c46d825f681b591b3f0d537c406a8"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9bdd5f54e63f26a8736ab78ce0ec648e3a037df5","unresolved":false,"context_lines":[{"line_number":467,"context_line":""},{"line_number":468,"context_line":"    :param context: placement.context.RequestContext object"},{"line_number":469,"context_line":"    :param rw_ctx: placement.research_context.RequestWideSearchContext"},{"line_number":470,"context_line":"    :param usages: A list of dicts with the following format:"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"        {"},{"line_number":473,"context_line":"            \u0027resource_provider_id\u0027: \u003cinternal resource provider ID\u003e,"},{"line_number":474,"context_line":"            \u0027resource_provider_uuid\u0027: \u003cUUID\u003e,"},{"line_number":475,"context_line":"            \u0027resource_class_id\u0027: \u003cinternal resource class ID\u003e,"},{"line_number":476,"context_line":"            \u0027total\u0027: integer,"},{"line_number":477,"context_line":"            \u0027reserved\u0027: integer,"},{"line_number":478,"context_line":"            \u0027allocation_ratio\u0027: float,"},{"line_number":479,"context_line":"        }"},{"line_number":480,"context_line":"    :param prov_traits: A dict, keyed by internal resource provider ID, of"},{"line_number":481,"context_line":"                        string trait names associated with that provider"},{"line_number":482,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_a8b85374","line":479,"range":{"start_line":470,"start_character":0,"end_line":479,"end_character":9},"in_reply_to":"7faddb67_48cd1f64","updated":"2019-08-05 20:23:21.000000000","message":"actually could stand to be moved to the comment describing RequestWideSearchContext.usages","commit_id":"38ed8864b33c46d825f681b591b3f0d537c406a8"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"161133f9ebbb5c73984b2edc6d7382abcdacb31c","unresolved":false,"context_lines":[{"line_number":470,"context_line":"    :param prov_traits: A dict, keyed by internal resource provider ID, of"},{"line_number":471,"context_line":"                        string trait names associated with that provider"},{"line_number":472,"context_line":"    \"\"\""},{"line_number":473,"context_line":"    # Create a pared-down list of usages we care about -- only those for which"},{"line_number":474,"context_line":"    # we haven\u0027t already created summaries"},{"line_number":475,"context_line":"    pared_usages \u003d []"},{"line_number":476,"context_line":"    rp_ids \u003d set()"},{"line_number":477,"context_line":"    for usage in rw_ctx.usages:"},{"line_number":478,"context_line":"        rp_id \u003d usage[\u0027resource_provider_id\u0027]"},{"line_number":479,"context_line":"        if rp_id not in rw_ctx.summaries_by_id:"},{"line_number":480,"context_line":"            pared_usages.append(usage)"},{"line_number":481,"context_line":"            rp_ids.add(rp_id)"},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"    if not rp_ids:"},{"line_number":484,"context_line":"        return"},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"    # Before we go creating provider summary objects, first grab all the"},{"line_number":487,"context_line":"    # provider information (including root, parent and UUID information) for"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_4f03c577","line":484,"range":{"start_line":473,"start_character":1,"end_line":484,"end_character":14},"updated":"2019-08-07 09:19:07.000000000","message":"(continue from the next file comment)...then we can remove this part again, I guess, though some optimization will remain like:\n\nif not usages:\n    return\n\nI haven\u0027t tried yet though. I\u0027ll have a deeper look for this next time.","commit_id":"5dd9a2904d71a30158504d94c3b15e7a5258ec40"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"376b66a17fe9701020272e20ebf31bb4463da43e","unresolved":false,"context_lines":[{"line_number":470,"context_line":"    :param prov_traits: A dict, keyed by internal resource provider ID, of"},{"line_number":471,"context_line":"                        string trait names associated with that provider"},{"line_number":472,"context_line":"    \"\"\""},{"line_number":473,"context_line":"    # Create a pared-down list of usages we care about -- only those for which"},{"line_number":474,"context_line":"    # we haven\u0027t already created summaries"},{"line_number":475,"context_line":"    pared_usages \u003d []"},{"line_number":476,"context_line":"    rp_ids \u003d set()"},{"line_number":477,"context_line":"    for usage in rw_ctx.usages:"},{"line_number":478,"context_line":"        rp_id \u003d usage[\u0027resource_provider_id\u0027]"},{"line_number":479,"context_line":"        if rp_id not in rw_ctx.summaries_by_id:"},{"line_number":480,"context_line":"            pared_usages.append(usage)"},{"line_number":481,"context_line":"            rp_ids.add(rp_id)"},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"    if not rp_ids:"},{"line_number":484,"context_line":"        return"},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"    # Before we go creating provider summary objects, first grab all the"},{"line_number":487,"context_line":"    # provider information (including root, parent and UUID information) for"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_8f7d3db4","line":484,"range":{"start_line":473,"start_character":1,"end_line":484,"end_character":14},"in_reply_to":"7faddb67_4f03c577","updated":"2019-08-07 09:29:06.000000000","message":"I think there will continue to be many things we can find and clean up, but I\u0027m hoping that doing the changes in relatively small chunks can help make sure we\u0027ve got some confidence in the changes we\u0027re making. It\u0027s definitely the case that we\u0027re going to continue to find things.\n\nOne of the things I like about using a profiling driven approach is that it makes it relatively straightforward to focus on one small piece. However, that does lead to situations where the big picture gets confused, so we definitely need to have breaks where we tune up the big picture after tweaking all the details.","commit_id":"5dd9a2904d71a30158504d94c3b15e7a5258ec40"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"dba5fbb1b815ba65dd4072548bb915bbc537d9cf","unresolved":false,"context_lines":[{"line_number":470,"context_line":"    :param prov_traits: A dict, keyed by internal resource provider ID, of"},{"line_number":471,"context_line":"                        string trait names associated with that provider"},{"line_number":472,"context_line":"    \"\"\""},{"line_number":473,"context_line":"    # Create a pared-down list of usages we care about -- only those for which"},{"line_number":474,"context_line":"    # we haven\u0027t already created summaries"},{"line_number":475,"context_line":"    pared_usages \u003d []"},{"line_number":476,"context_line":"    rp_ids \u003d set()"},{"line_number":477,"context_line":"    for usage in rw_ctx.usages:"},{"line_number":478,"context_line":"        rp_id \u003d usage[\u0027resource_provider_id\u0027]"},{"line_number":479,"context_line":"        if rp_id not in rw_ctx.summaries_by_id:"},{"line_number":480,"context_line":"            pared_usages.append(usage)"},{"line_number":481,"context_line":"            rp_ids.add(rp_id)"},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"    if not rp_ids:"},{"line_number":484,"context_line":"        return"},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"    # Before we go creating provider summary objects, first grab all the"},{"line_number":487,"context_line":"    # provider information (including root, parent and UUID information) for"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_145759cc","line":484,"range":{"start_line":473,"start_character":1,"end_line":484,"end_character":14},"in_reply_to":"7faddb67_8f7d3db4","updated":"2019-08-20 06:16:05.000000000","message":"\u003e I\u0027m hoping that doing the changes in relatively small\n\u003e chunks can help make sure we\u0027ve got some confidence in the changes\n\u003e we\u0027re making. It\u0027s definitely the case that we\u0027re going to continue\n\u003e to find things.\n\nFair enough. I have looked into this in another patch, https://review.opendev.org/#/c/677120/.","commit_id":"5dd9a2904d71a30158504d94c3b15e7a5258ec40"}],"placement/objects/research_context.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a00d79fdcf4df9cc240d8f2472a7d54e8b1d7b3c","unresolved":false,"context_lines":[{"line_number":307,"context_line":""},{"line_number":308,"context_line":"        return alloc_request_objs, summary_objs"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    def extend_usages_by_provider_tree(self, root_ids):"},{"line_number":311,"context_line":"        \"\"\"Returns a row iterator of usage records grouped by provider ID"},{"line_number":312,"context_line":"        for all resource providers in all trees indicated in the ``root_ids``."},{"line_number":313,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_e8a5ebb5","line":310,"updated":"2019-08-05 19:52:21.000000000","message":"nts: no reader context - we must already be in one from any given calling path","commit_id":"38ed8864b33c46d825f681b591b3f0d537c406a8"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a00d79fdcf4df9cc240d8f2472a7d54e8b1d7b3c","unresolved":false,"context_lines":[{"line_number":338,"context_line":"        #   AND inv.resource_class_id \u003d usage.resource_class_id"},{"line_number":339,"context_line":"        # WHERE rp.root_provider_id IN ($root_ids)"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        # filter root_ids by those we haven\u0027t seen yet"},{"line_number":342,"context_line":"        root_ids \u003d set(root_ids) - self.usage_roots"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        # Do nothing if we have nothing to look at"},{"line_number":345,"context_line":"        if not root_ids:"},{"line_number":346,"context_line":"            return"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"        rpt \u003d sa.alias(_RP_TBL, name\u003d\"rp\")"},{"line_number":349,"context_line":"        inv \u003d sa.alias(_INV_TBL, name\u003d\"inv\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_28e9c3e1","line":346,"range":{"start_line":341,"start_character":0,"end_line":346,"end_character":18},"updated":"2019-08-05 19:52:21.000000000","message":"nts: added","commit_id":"38ed8864b33c46d825f681b591b3f0d537c406a8"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a00d79fdcf4df9cc240d8f2472a7d54e8b1d7b3c","unresolved":false,"context_lines":[{"line_number":389,"context_line":"            rpt.c.root_provider_id.in_(root_ids)"},{"line_number":390,"context_line":"        )"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"        self.usage_roots.update(root_ids)"},{"line_number":393,"context_line":"        self.usages.extend(self._ctx.session.execute(query).fetchall())"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_48d19f22","line":392,"range":{"start_line":392,"start_character":0,"end_line":392,"end_character":41},"updated":"2019-08-05 19:52:21.000000000","message":"nts: added","commit_id":"38ed8864b33c46d825f681b591b3f0d537c406a8"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a00d79fdcf4df9cc240d8f2472a7d54e8b1d7b3c","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        )"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"        self.usage_roots.update(root_ids)"},{"line_number":393,"context_line":"        self.usages.extend(self._ctx.session.execute(query).fetchall())"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"def provider_ids_from_rp_ids(context, rp_ids):"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_28c22354","line":393,"range":{"start_line":393,"start_character":8,"end_line":393,"end_character":26},"updated":"2019-08-05 19:52:21.000000000","message":"nts: extend rather than return","commit_id":"38ed8864b33c46d825f681b591b3f0d537c406a8"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"70c67e0b161cfe24fe8705427398642bb61cea7a","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        #        \u0027resource_class_id\u0027: \u003cinternal resource class ID\u003e,"},{"line_number":197,"context_line":"        #        \u0027total\u0027: integer,"},{"line_number":198,"context_line":"        #        \u0027reserved\u0027: integer,"},{"line_number":199,"context_line":"        #        \u0027allocation_ratio\u0027: float,"},{"line_number":200,"context_line":"        #    }"},{"line_number":201,"context_line":"        self.usages \u003d []"},{"line_number":202,"context_line":"        # A set of root provider ids for which usage summaries have already"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_e9f3919e","line":199,"updated":"2019-08-07 08:01:38.000000000","message":"This is not a fault of this patch, but items of \u0027used\u0027 and \u0027max_unit\u0027 are missed here.","commit_id":"5dd9a2904d71a30158504d94c3b15e7a5258ec40"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"161133f9ebbb5c73984b2edc6d7382abcdacb31c","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        #        \u0027reserved\u0027: integer,"},{"line_number":199,"context_line":"        #        \u0027allocation_ratio\u0027: float,"},{"line_number":200,"context_line":"        #    }"},{"line_number":201,"context_line":"        self.usages \u003d []"},{"line_number":202,"context_line":"        # A set of root provider ids for which usage summaries have already"},{"line_number":203,"context_line":"        # been calculated during this request."},{"line_number":204,"context_line":"        self.usage_roots \u003d set()"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_6fdfa10c","line":201,"updated":"2019-08-07 09:19:07.000000000","message":"Well, having a second thought, I don\u0027t understand why we need to cache this usages value?","commit_id":"5dd9a2904d71a30158504d94c3b15e7a5258ec40"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"161133f9ebbb5c73984b2edc6d7382abcdacb31c","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        self.usages \u003d []"},{"line_number":202,"context_line":"        # A set of root provider ids for which usage summaries have already"},{"line_number":203,"context_line":"        # been calculated during this request."},{"line_number":204,"context_line":"        self.usage_roots \u003d set()"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def _process_anchor_traits(self, rqparams):"},{"line_number":207,"context_line":"        \"\"\"Set or filter self.anchor_root_ids according to anchor"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_efcab144","line":204,"updated":"2019-08-07 09:19:07.000000000","message":"It is enough to cache this usage_roots, no? Then we would explicitly return usage again...(continue to the previous file)","commit_id":"5dd9a2904d71a30158504d94c3b15e7a5258ec40"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"70c67e0b161cfe24fe8705427398642bb61cea7a","unresolved":false,"context_lines":[{"line_number":317,"context_line":"        return alloc_request_objs, summary_objs"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    def extend_usages_by_provider_tree(self, root_ids):"},{"line_number":320,"context_line":"        \"\"\"Returns a row iterator of usage records grouped by provider ID"},{"line_number":321,"context_line":"        for all resource providers in all trees indicated in the ``root_ids``."},{"line_number":322,"context_line":"        \"\"\""},{"line_number":323,"context_line":"        # We build up a SQL expression that looks like this:"},{"line_number":324,"context_line":"        # SELECT"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_29168957","line":321,"range":{"start_line":320,"start_character":11,"end_line":321,"end_character":78},"updated":"2019-08-07 08:01:38.000000000","message":"This method returns nothing. At least it needs updating. \nPersonally I would preserve the original SQL part as a function (while I would rename it) and have the other caching part in a different new function.","commit_id":"5dd9a2904d71a30158504d94c3b15e7a5258ec40"}]}
