)]}'
{"nova/compute/instance_list.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f45c272329d3867989aead37a2e27aec40303ef8","unresolved":false,"context_lines":[{"line_number":22,"context_line":"        self._sort_dirs \u003d sort_dirs"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def compare_instances(self, inst1, inst2):"},{"line_number":25,"context_line":"        \"\"\"Implements cmp(inst1, inst2) for the first key that is different"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"        Adjusts for the requested sort direction by inverting the result"},{"line_number":28,"context_line":"        as needed."}],"source_content_type":"text/x-python","patch_set":4,"id":"bf57530f_046a477f","line":25,"updated":"2017-09-21 22:57:37.000000000","message":"Forgot a period at the end of this sentence.","commit_id":"9748b63a7c1c04768e0396e9127a794ad86d8b5d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"126165dcbee32da7c6a739231cd027aadb073dad","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        \"\"\""},{"line_number":30,"context_line":"        for skey, sdir in zip(self._sort_keys, self._sort_dirs):"},{"line_number":31,"context_line":"            resultflag \u003d 1 if sdir \u003d\u003d \u0027desc\u0027 else -1"},{"line_number":32,"context_line":"            if inst1[skey] \u003c inst2[skey]:"},{"line_number":33,"context_line":"                return resultflag"},{"line_number":34,"context_line":"            elif inst1[skey] \u003e inst2[skey]:"},{"line_number":35,"context_line":"                return resultflag * -1"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf57530f_398e9778","line":32,"range":{"start_line":32,"start_character":27,"end_line":32,"end_character":28},"updated":"2017-09-20 20:59:52.000000000","message":"Does the simple \u003c and \u003e work for all possible instance field sort keys?\n\nhttps://github.com/openstack/nova/blob/ddac72f9c57513ec39d54b80ddfec3162a821ee0/nova/api/openstack/compute/schemas/servers.py#L296","commit_id":"9748b63a7c1c04768e0396e9127a794ad86d8b5d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"80e91b12831ecd7c1cf198a68db2b4a784957d19","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        \"\"\""},{"line_number":30,"context_line":"        for skey, sdir in zip(self._sort_keys, self._sort_dirs):"},{"line_number":31,"context_line":"            resultflag \u003d 1 if sdir \u003d\u003d \u0027desc\u0027 else -1"},{"line_number":32,"context_line":"            if inst1[skey] \u003c inst2[skey]:"},{"line_number":33,"context_line":"                return resultflag"},{"line_number":34,"context_line":"            elif inst1[skey] \u003e inst2[skey]:"},{"line_number":35,"context_line":"                return resultflag * -1"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf57530f_0b1edab9","line":32,"range":{"start_line":32,"start_character":27,"end_line":32,"end_character":28},"in_reply_to":"bf57530f_398e9778","updated":"2017-09-20 21:55:36.000000000","message":"Yup. Just strings, ints and datetimes, which are included in the tests.","commit_id":"9748b63a7c1c04768e0396e9127a794ad86d8b5d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"126165dcbee32da7c6a739231cd027aadb073dad","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        self._sort_ctx \u003d sort_ctx"},{"line_number":42,"context_line":"        self._db_instance \u003d db_instance"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def __lt__(self, other):"},{"line_number":45,"context_line":"        r \u003d self._sort_ctx.compare_instances(self._db_instance,"},{"line_number":46,"context_line":"                                             other._db_instance)"},{"line_number":47,"context_line":"        # cmp(x, y) returns -1 if x \u003c y"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf57530f_5e0251b6","line":44,"range":{"start_line":44,"start_character":8,"end_line":44,"end_character":14},"updated":"2017-09-20 20:59:52.000000000","message":"Why no __gt__?\n\n\u003clater\u003e\n\nOK after reading below, I guess heapq only cares about \u003c comparisons? Might be a good comment to have here.","commit_id":"9748b63a7c1c04768e0396e9127a794ad86d8b5d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"80e91b12831ecd7c1cf198a68db2b4a784957d19","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        self._sort_ctx \u003d sort_ctx"},{"line_number":42,"context_line":"        self._db_instance \u003d db_instance"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def __lt__(self, other):"},{"line_number":45,"context_line":"        r \u003d self._sort_ctx.compare_instances(self._db_instance,"},{"line_number":46,"context_line":"                                             other._db_instance)"},{"line_number":47,"context_line":"        # cmp(x, y) returns -1 if x \u003c y"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf57530f_cb7d62e8","line":44,"range":{"start_line":44,"start_character":8,"end_line":44,"end_character":14},"in_reply_to":"bf57530f_5e0251b6","updated":"2017-09-20 21:55:36.000000000","message":"Done","commit_id":"9748b63a7c1c04768e0396e9127a794ad86d8b5d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"126165dcbee32da7c6a739231cd027aadb073dad","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def get_instances_sorted(ctx, filters, limit, marker, columns_to_join,"},{"line_number":52,"context_line":"                         sort_keys, sort_dirs):"},{"line_number":53,"context_line":"    \"\"\"Get a cross-cell list of instances matching filters."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    This iterates cells in parallel generating a unified and sorted list of"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf57530f_79388fd2","line":52,"range":{"start_line":52,"start_character":25,"end_line":52,"end_character":45},"updated":"2017-09-20 20:59:52.000000000","message":"Is it OK if these are None? Looking at the instance object that calls instance_get_all_by_filters_sort it will pass through None and I think the process_sort_params method in the DB API is what defaults to default_keys\u003d[\u0027created_at\u0027, \u0027id\u0027],.\n\nAnd the sort order is desc by default when listing instances in the DB API.","commit_id":"9748b63a7c1c04768e0396e9127a794ad86d8b5d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"80e91b12831ecd7c1cf198a68db2b4a784957d19","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def get_instances_sorted(ctx, filters, limit, marker, columns_to_join,"},{"line_number":52,"context_line":"                         sort_keys, sort_dirs):"},{"line_number":53,"context_line":"    \"\"\"Get a cross-cell list of instances matching filters."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    This iterates cells in parallel generating a unified and sorted list of"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf57530f_2b763e08","line":52,"range":{"start_line":52,"start_character":25,"end_line":52,"end_character":45},"in_reply_to":"bf57530f_79388fd2","updated":"2017-09-20 21:55:36.000000000","message":"I\u0027ll default them for parity. The API never passes us None here, but I\u0027ll copy that here just for consistency","commit_id":"9748b63a7c1c04768e0396e9127a794ad86d8b5d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"126165dcbee32da7c6a739231cd027aadb073dad","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    This iterates cells in parallel generating a unified and sorted list of"},{"line_number":56,"context_line":"    instances as efficiently as possible. It takes care to iterate the list"},{"line_number":57,"context_line":"    as infrequently as possible. Because of the way scatter_gather_all_cells()"},{"line_number":58,"context_line":"    works, we have collapse the DB result set into a single list before"},{"line_number":59,"context_line":"    returning from the thread, so we take that opportunity to wrap the results"},{"line_number":60,"context_line":"    in InstanceWrapper objects so that they are sortable by heapq.merge(),"},{"line_number":61,"context_line":"    which requires that the \u0027\u003c\u0027 operator just works. We encapsulate our"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf57530f_bee14d01","line":58,"range":{"start_line":58,"start_character":11,"end_line":58,"end_character":27},"updated":"2017-09-20 20:59:52.000000000","message":"I can haz typo?","commit_id":"9748b63a7c1c04768e0396e9127a794ad86d8b5d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"126165dcbee32da7c6a739231cd027aadb073dad","unresolved":false,"context_lines":[{"line_number":83,"context_line":"            db.instance_get_all_by_filters_sort("},{"line_number":84,"context_line":"                ctx, filters,"},{"line_number":85,"context_line":"                limit\u003dlimit, marker\u003dmarker,"},{"line_number":86,"context_line":"                columns_to_join\u003dcolumns_to_join,"},{"line_number":87,"context_line":"                sort_keys\u003dsort_keys,"},{"line_number":88,"context_line":"                sort_dirs\u003dsort_dirs))"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bf57530f_d96f7bc3","line":86,"range":{"start_line":86,"start_character":16,"end_line":86,"end_character":47},"updated":"2017-09-20 20:59:52.000000000","message":"The instance object does this massaging:\n\ncolumns_to_join\u003d_expected_cols(expected_attrs)\n\nDon\u0027t know if we expect the caller to handle that already?","commit_id":"9748b63a7c1c04768e0396e9127a794ad86d8b5d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"80e91b12831ecd7c1cf198a68db2b4a784957d19","unresolved":false,"context_lines":[{"line_number":83,"context_line":"            db.instance_get_all_by_filters_sort("},{"line_number":84,"context_line":"                ctx, filters,"},{"line_number":85,"context_line":"                limit\u003dlimit, marker\u003dmarker,"},{"line_number":86,"context_line":"                columns_to_join\u003dcolumns_to_join,"},{"line_number":87,"context_line":"                sort_keys\u003dsort_keys,"},{"line_number":88,"context_line":"                sort_dirs\u003dsort_dirs))"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bf57530f_6b555650","line":86,"range":{"start_line":86,"start_character":16,"end_line":86,"end_character":47},"in_reply_to":"bf57530f_d96f7bc3","updated":"2017-09-20 21:55:36.000000000","message":"The later patch that adds the object wrapper around this does it yep.","commit_id":"9748b63a7c1c04768e0396e9127a794ad86d8b5d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"126165dcbee32da7c6a739231cd027aadb073dad","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    # instance instead of the wrapper. This is basically free"},{"line_number":98,"context_line":"    # as it works as our caller iterates the results."},{"line_number":99,"context_line":"    for i in heapq.merge(*results.values()):"},{"line_number":100,"context_line":"        yield i._db_instance"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf57530f_d90e5be4","line":100,"range":{"start_line":100,"start_character":8,"end_line":100,"end_character":28},"updated":"2017-09-20 20:59:52.000000000","message":"We should document something in the docstring :returns: that this is returning an iterator.","commit_id":"9748b63a7c1c04768e0396e9127a794ad86d8b5d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"80e91b12831ecd7c1cf198a68db2b4a784957d19","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    # instance instead of the wrapper. This is basically free"},{"line_number":98,"context_line":"    # as it works as our caller iterates the results."},{"line_number":99,"context_line":"    for i in heapq.merge(*results.values()):"},{"line_number":100,"context_line":"        yield i._db_instance"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf57530f_cbcb221c","line":100,"range":{"start_line":100,"start_character":8,"end_line":100,"end_character":28},"in_reply_to":"bf57530f_d90e5be4","updated":"2017-09-20 21:55:36.000000000","message":"It\u0027s not returning an iterator, it\u0027s a generator function. But yeah I\u0027ll call it out.","commit_id":"9748b63a7c1c04768e0396e9127a794ad86d8b5d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3e0fd5a021f97cb1cc9dc4b37d531e224f1a67cf","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"def get_instances_sorted(ctx, filters, limit, marker, columns_to_join,"},{"line_number":62,"context_line":"                         sort_keys, sort_dirs):"},{"line_number":63,"context_line":"    \"\"\"Get a cross-cell list of instances matching filters."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    This iterates cells in parallel generating a unified and sorted list of"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f5c4f37_8539a742","line":62,"range":{"start_line":62,"start_character":25,"end_line":62,"end_character":45},"updated":"2017-09-21 14:45:52.000000000","message":"You said you were going to default these to None for parity in PS4. Did you intentionally omit that?\n\n\u003clater\u003e\n\nOh I guess you check below. Plus, as pointed out, the get_sort_params method in the API code defaults to created_at and desc, so we shouldn\u0027t actually get None here.","commit_id":"687c2e1f88454cc077c123911a6c7a2613769423"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"220cb8d42142e9503b5a54c8b061fe8664b09b95","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    This iterates cells in parallel generating a unified and sorted list of"},{"line_number":66,"context_line":"    instances as efficiently as possible. It takes care to iterate the list"},{"line_number":67,"context_line":"    as infrequently as possible. Because of the way scatter_gather_all_cells()"},{"line_number":68,"context_line":"    works, we have collapsed the DB result set into a single list before"},{"line_number":69,"context_line":"    returning from the thread, so we take that opportunity to wrap the results"},{"line_number":70,"context_line":"    in InstanceWrapper objects so that they are sortable by heapq.merge(),"},{"line_number":71,"context_line":"    which requires that the \u0027\u003c\u0027 operator just works. We encapsulate our"},{"line_number":72,"context_line":"    sorting requirements into an InstanceSortContext which we pass to"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f5c4f37_2e3e5d29","line":69,"range":{"start_line":67,"start_character":33,"end_line":69,"end_character":29},"updated":"2017-09-21 13:39:20.000000000","message":"Here is the comment about having to make it a list and not a generator.\n\nI would like to see if I can make scatter_gather_all_cells() more robust so we _could_ return an iterator, but that\u0027s work for later.","commit_id":"687c2e1f88454cc077c123911a6c7a2613769423"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3e0fd5a021f97cb1cc9dc4b37d531e224f1a67cf","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        # play if the user didn\u0027t ask for a specific ordering, but we"},{"line_number":86,"context_line":"        # use the same scheme for consistency."},{"line_number":87,"context_line":"        sort_keys \u003d [\u0027created_at\u0027, \u0027id\u0027]"},{"line_number":88,"context_line":"        sort_dirs \u003d [\u0027asc\u0027, \u0027asc\u0027]"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    sort_ctx \u003d InstanceSortContext(sort_keys, sort_dirs)"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9f5c4f37_2521dbfc","line":88,"range":{"start_line":88,"start_character":8,"end_line":88,"end_character":17},"updated":"2017-09-21 14:45:52.000000000","message":"I don\u0027t know if it\u0027s possible to send sort_dirs without sort_keys, but if so, we\u0027d be overwriting it here.","commit_id":"687c2e1f88454cc077c123911a6c7a2613769423"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3e0fd5a021f97cb1cc9dc4b37d531e224f1a67cf","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        # play if the user didn\u0027t ask for a specific ordering, but we"},{"line_number":86,"context_line":"        # use the same scheme for consistency."},{"line_number":87,"context_line":"        sort_keys \u003d [\u0027created_at\u0027, \u0027id\u0027]"},{"line_number":88,"context_line":"        sort_dirs \u003d [\u0027asc\u0027, \u0027asc\u0027]"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    sort_ctx \u003d InstanceSortContext(sort_keys, sort_dirs)"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9f5c4f37_380fbe2f","line":88,"range":{"start_line":88,"start_character":20,"end_line":88,"end_character":34},"updated":"2017-09-21 14:45:52.000000000","message":"Technically instance_get_all_by_filters_sort overrides the default_dir and passes desc to process_sort_params. idk, maybe you\u0027re right and we\u0027re better off just not attempting to deal with sort_keys/dirs not being passed in and trying to do defaults, as it muddies up this code.","commit_id":"687c2e1f88454cc077c123911a6c7a2613769423"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"55a13fa4e436e3ad05630edf1adffce64e47fde4","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        routine."},{"line_number":100,"context_line":"        \"\"\""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        return list("},{"line_number":103,"context_line":"            InstanceWrapper(sort_ctx, inst) for inst in"},{"line_number":104,"context_line":"            db.instance_get_all_by_filters_sort("},{"line_number":105,"context_line":"                ctx, filters,"},{"line_number":106,"context_line":"                limit\u003dlimit, marker\u003dmarker,"},{"line_number":107,"context_line":"                columns_to_join\u003dcolumns_to_join,"},{"line_number":108,"context_line":"                sort_keys\u003dsort_keys,"},{"line_number":109,"context_line":"                sort_dirs\u003dsort_dirs))"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    # FIXME(danms): If we raise or timeout on a cell we need to handle"},{"line_number":112,"context_line":"    # that here gracefully. The below routine will provide sentinels"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f5c4f37_82aac282","line":109,"range":{"start_line":102,"start_character":8,"end_line":109,"end_character":37},"updated":"2017-09-21 12:11:54.000000000","message":"would it make sense to make this lazy by returning a generator instead of a list?","commit_id":"687c2e1f88454cc077c123911a6c7a2613769423"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"220cb8d42142e9503b5a54c8b061fe8664b09b95","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        routine."},{"line_number":100,"context_line":"        \"\"\""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        return list("},{"line_number":103,"context_line":"            InstanceWrapper(sort_ctx, inst) for inst in"},{"line_number":104,"context_line":"            db.instance_get_all_by_filters_sort("},{"line_number":105,"context_line":"                ctx, filters,"},{"line_number":106,"context_line":"                limit\u003dlimit, marker\u003dmarker,"},{"line_number":107,"context_line":"                columns_to_join\u003dcolumns_to_join,"},{"line_number":108,"context_line":"                sort_keys\u003dsort_keys,"},{"line_number":109,"context_line":"                sort_dirs\u003dsort_dirs))"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    # FIXME(danms): If we raise or timeout on a cell we need to handle"},{"line_number":112,"context_line":"    # that here gracefully. The below routine will provide sentinels"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f5c4f37_4e04f17b","line":109,"range":{"start_line":102,"start_character":8,"end_line":109,"end_character":37},"in_reply_to":"9f5c4f37_0d9f2351","updated":"2017-09-21 13:39:20.000000000","message":"No, the reason is because we\u0027re running this inside a thread spawned by the scatter_gather routines, and it requires a fixed result be returned from each thread. See L67.","commit_id":"687c2e1f88454cc077c123911a6c7a2613769423"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3d20f18c2daedd7fdf7ea4ad8b14a92309c003d5","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        routine."},{"line_number":100,"context_line":"        \"\"\""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        return list("},{"line_number":103,"context_line":"            InstanceWrapper(sort_ctx, inst) for inst in"},{"line_number":104,"context_line":"            db.instance_get_all_by_filters_sort("},{"line_number":105,"context_line":"                ctx, filters,"},{"line_number":106,"context_line":"                limit\u003dlimit, marker\u003dmarker,"},{"line_number":107,"context_line":"                columns_to_join\u003dcolumns_to_join,"},{"line_number":108,"context_line":"                sort_keys\u003dsort_keys,"},{"line_number":109,"context_line":"                sort_dirs\u003dsort_dirs))"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    # FIXME(danms): If we raise or timeout on a cell we need to handle"},{"line_number":112,"context_line":"    # that here gracefully. The below routine will provide sentinels"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f5c4f37_0d9f2351","line":109,"range":{"start_line":102,"start_character":8,"end_line":109,"end_character":37},"in_reply_to":"9f5c4f37_82aac282","updated":"2017-09-21 12:31:25.000000000","message":"Most probably not as we anyhow need to evaluate all the element to mergesort them and we cannot limit the mergesort even if we have a global limit later.","commit_id":"687c2e1f88454cc077c123911a6c7a2613769423"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"672604dd9a77126f2ecf9e08713d894ef6fb02d8","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    This iterates cells in parallel generating a unified and sorted list of"},{"line_number":66,"context_line":"    instances as efficiently as possible. It takes care to iterate the list"},{"line_number":67,"context_line":"    as infrequently as possible. Because of the way scatter_gather_all_cells()"},{"line_number":68,"context_line":"    works, we have collapsed the DB result set into a single list before"},{"line_number":69,"context_line":"    returning from the thread, so we take that opportunity to wrap the results"},{"line_number":70,"context_line":"    in InstanceWrapper objects so that they are sortable by heapq.merge(),"},{"line_number":71,"context_line":"    which requires that the \u0027\u003c\u0027 operator just works. We encapsulate our"},{"line_number":72,"context_line":"    sorting requirements into an InstanceSortContext which we pass to"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f5c4f37_f873664c","line":69,"range":{"start_line":68,"start_character":11,"end_line":69,"end_character":29},"updated":"2017-09-21 14:54:53.000000000","message":"It is not true any more.","commit_id":"648f78759548e6bacdaef0fdfef4d2ce0f82b430"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"672604dd9a77126f2ecf9e08713d894ef6fb02d8","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    sort_ctx \u003d InstanceSortContext(sort_keys, sort_dirs)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def do_query(ctx):"},{"line_number":93,"context_line":"        \"\"\"Return a list of InstanceWrapper(Instance) objects from a cell."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        We do this inside the thread (created by"},{"line_number":96,"context_line":"        scatter_gather_all_cells()) so that we return wrappers and"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f5c4f37_d88e6226","line":93,"range":{"start_line":93,"start_character":20,"end_line":93,"end_character":24},"updated":"2017-09-21 14:54:53.000000000","message":"ditto","commit_id":"648f78759548e6bacdaef0fdfef4d2ce0f82b430"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"6d3bfd314352078ab6fe329315c328a209c51aed","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        # play if the user didn\u0027t ask for a specific ordering, but we"},{"line_number":85,"context_line":"        # use the same scheme for consistency."},{"line_number":86,"context_line":"        sort_keys \u003d [\u0027created_at\u0027, \u0027id\u0027]"},{"line_number":87,"context_line":"        sort_dirs \u003d [\u0027asc\u0027, \u0027asc\u0027]"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    sort_ctx \u003d InstanceSortContext(sort_keys, sort_dirs)"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"7f515b1d_c1e20130","line":87,"range":{"start_line":87,"start_character":20,"end_line":87,"end_character":34},"updated":"2017-09-22 03:15:24.000000000","message":"The confusing thing is we passed another default dir to the \u0027process_sort_params\u0027 https://github.com/openstack/nova/blob/master/nova/db/sqlalchemy/api.py#L2139","commit_id":"bac8f5b046283fbc641d418443e5b899f2989fdf"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f45c272329d3867989aead37a2e27aec40303ef8","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                    limit\u003dlimit, marker\u003dmarker,"},{"line_number":105,"context_line":"                    columns_to_join\u003dcolumns_to_join,"},{"line_number":106,"context_line":"                    sort_keys\u003dsort_keys,"},{"line_number":107,"context_line":"                sort_dirs\u003dsort_dirs))"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    # FIXME(danms): If we raise or timeout on a cell we need to handle"},{"line_number":110,"context_line":"    # that here gracefully. The below routine will provide sentinels"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f515b1d_1b264fb9","line":107,"updated":"2017-09-21 22:57:37.000000000","message":"Wonky indention here.","commit_id":"bac8f5b046283fbc641d418443e5b899f2989fdf"}],"nova/tests/functional/compute/test_instance_list.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"126165dcbee32da7c6a739231cd027aadb073dad","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        cells \u003d objects.CellMappingList.get_all(self.context)"},{"line_number":35,"context_line":"        # Create three instances in each of the real cells. Leave cell0"},{"line_number":36,"context_line":"        # empty to make sure we don\u0027t break with an empty cell"},{"line_number":37,"context_line":"        for cell in cells[1:]:"},{"line_number":38,"context_line":"            for i in range(0, self.num_instances):"},{"line_number":39,"context_line":"                with context.target_cell(self.context, cell) as cctx:"},{"line_number":40,"context_line":"                    inst \u003d objects.Instance("}],"source_content_type":"text/x-python","patch_set":4,"id":"bf57530f_d9b53bf0","line":37,"range":{"start_line":37,"start_character":20,"end_line":37,"end_character":29},"updated":"2017-09-20 20:59:52.000000000","message":"Are we sure that CellMapping.get_all is going to return cell0 in the 0 index?","commit_id":"9748b63a7c1c04768e0396e9127a794ad86d8b5d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"126165dcbee32da7c6a739231cd027aadb073dad","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                dt +\u003d spread"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def test_get_sorted(self):"},{"line_number":58,"context_line":"        insts \u003d instance_list.get_instances_sorted(self.context, {},"},{"line_number":59,"context_line":"                                                   None, None,"},{"line_number":60,"context_line":"                                                   [], [\u0027uuid\u0027], [\u0027asc\u0027])"},{"line_number":61,"context_line":"        uuids \u003d [inst[\u0027uuid\u0027] for inst in insts]"},{"line_number":62,"context_line":"        self.assertEqual(sorted(uuids), uuids)"},{"line_number":63,"context_line":"        self.assertEqual(len(self.instances), len(uuids))"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf57530f_b9af2793","line":60,"range":{"start_line":58,"start_character":65,"end_line":60,"end_character":72},"updated":"2017-09-20 20:59:52.000000000","message":"nit: can we use kwargs? This is hard to follow unless you have two windows open.","commit_id":"9748b63a7c1c04768e0396e9127a794ad86d8b5d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"80e91b12831ecd7c1cf198a68db2b4a784957d19","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                dt +\u003d spread"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def test_get_sorted(self):"},{"line_number":58,"context_line":"        insts \u003d instance_list.get_instances_sorted(self.context, {},"},{"line_number":59,"context_line":"                                                   None, None,"},{"line_number":60,"context_line":"                                                   [], [\u0027uuid\u0027], [\u0027asc\u0027])"},{"line_number":61,"context_line":"        uuids \u003d [inst[\u0027uuid\u0027] for inst in insts]"},{"line_number":62,"context_line":"        self.assertEqual(sorted(uuids), uuids)"},{"line_number":63,"context_line":"        self.assertEqual(len(self.instances), len(uuids))"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf57530f_6b7676db","line":60,"range":{"start_line":58,"start_character":65,"end_line":60,"end_character":72},"in_reply_to":"bf57530f_b9af2793","updated":"2017-09-20 21:55:36.000000000","message":"They\u0027re not kwargs on the method specifically because I hate the \"a hundred optional kwargs\" pattern from those methods. I can call these out specifically somehow if you prefer.","commit_id":"9748b63a7c1c04768e0396e9127a794ad86d8b5d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5b554c3fbf1d64fbade18d36d06da51c2ed55870","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                                                   limit, marker, columns,"},{"line_number":67,"context_line":"                                                   sort_keys, sort_dirs)"},{"line_number":68,"context_line":"        uuids \u003d [inst[\u0027uuid\u0027] for inst in insts]"},{"line_number":69,"context_line":"        self.assertEqual(sorted(uuids), uuids)"},{"line_number":70,"context_line":"        self.assertEqual(len(self.instances), len(uuids))"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def test_get_sorted_descending(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f515b1d_497d25e6","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":46},"updated":"2017-09-21 20:18:46.000000000","message":"As noted in the change on top of this one, shouldn\u0027t this be comparing against self.instances? Since uuids is built from insts which is already sorted.","commit_id":"bac8f5b046283fbc641d418443e5b899f2989fdf"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f45c272329d3867989aead37a2e27aec40303ef8","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                                                   limit, marker, columns,"},{"line_number":67,"context_line":"                                                   sort_keys, sort_dirs)"},{"line_number":68,"context_line":"        uuids \u003d [inst[\u0027uuid\u0027] for inst in insts]"},{"line_number":69,"context_line":"        self.assertEqual(sorted(uuids), uuids)"},{"line_number":70,"context_line":"        self.assertEqual(len(self.instances), len(uuids))"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def test_get_sorted_descending(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f515b1d_5bede723","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":46},"in_reply_to":"7f515b1d_497d25e6","updated":"2017-09-21 22:57:37.000000000","message":"I don\u0027t think it matters because sorted() is being called on the list.","commit_id":"bac8f5b046283fbc641d418443e5b899f2989fdf"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"64197453f8e69e7745f3fb59ec53150e3497f376","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                                                   limit, marker, columns,"},{"line_number":67,"context_line":"                                                   sort_keys, sort_dirs)"},{"line_number":68,"context_line":"        uuids \u003d [inst[\u0027uuid\u0027] for inst in insts]"},{"line_number":69,"context_line":"        self.assertEqual(sorted(uuids), uuids)"},{"line_number":70,"context_line":"        self.assertEqual(len(self.instances), len(uuids))"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def test_get_sorted_descending(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f515b1d_9b735f4e","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":46},"in_reply_to":"7f515b1d_5bc04751","updated":"2017-09-21 23:07:48.000000000","message":"Yeah, I was trying to say, sorted(uuids) \u003d\u003d sorted(self.instances) so I don\u0027t think it matters.","commit_id":"bac8f5b046283fbc641d418443e5b899f2989fdf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6ad0565024dcfa99314eab847c2449d3d89ba045","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                                                   limit, marker, columns,"},{"line_number":67,"context_line":"                                                   sort_keys, sort_dirs)"},{"line_number":68,"context_line":"        uuids \u003d [inst[\u0027uuid\u0027] for inst in insts]"},{"line_number":69,"context_line":"        self.assertEqual(sorted(uuids), uuids)"},{"line_number":70,"context_line":"        self.assertEqual(len(self.instances), len(uuids))"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def test_get_sorted_descending(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f515b1d_5bc04751","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":46},"in_reply_to":"7f515b1d_5bede723","updated":"2017-09-21 23:02:23.000000000","message":"The point here is to make sure the list as returned is equal to the list as sorted. So this is correct.","commit_id":"bac8f5b046283fbc641d418443e5b899f2989fdf"}],"nova/tests/unit/compute/test_instance_list.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"126165dcbee32da7c6a739231cd027aadb073dad","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        insts_by_cell \u003d self.insts.values()"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        mock_inst.side_effect \u003d insts_by_cell"},{"line_number":134,"context_line":"        insts \u003d instance_list.get_instances_sorted(self.context, {},"},{"line_number":135,"context_line":"                                                   None, None,"},{"line_number":136,"context_line":"                                                   [], [\u0027hostname\u0027], [\u0027asc\u0027])"},{"line_number":137,"context_line":"        insts_one \u003d [inst[\u0027hostname\u0027] for inst in insts]"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        # Reverse the order that we get things from the cells so we can"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf57530f_79f64f92","line":136,"range":{"start_line":134,"start_character":51,"end_line":136,"end_character":75},"updated":"2017-09-20 20:59:52.000000000","message":"nit: kwargs would be nice","commit_id":"9748b63a7c1c04768e0396e9127a794ad86d8b5d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f45c272329d3867989aead37a2e27aec40303ef8","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import datetime"},{"line_number":14,"context_line":"import mock"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from nova.compute import instance_list"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f515b1d_fbdb737a","line":13,"updated":"2017-09-21 22:57:37.000000000","message":"There should be a blank line between the builtin and the third-party imports. Tsk tsk!","commit_id":"bac8f5b046283fbc641d418443e5b899f2989fdf"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"64197453f8e69e7745f3fb59ec53150e3497f376","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import datetime"},{"line_number":14,"context_line":"import mock"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from nova.compute import instance_list"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f515b1d_1b9d2f59","line":13,"in_reply_to":"7f515b1d_fbced381","updated":"2017-09-21 23:07:48.000000000","message":"You\u0027re half okay.","commit_id":"bac8f5b046283fbc641d418443e5b899f2989fdf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6ad0565024dcfa99314eab847c2449d3d89ba045","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import datetime"},{"line_number":14,"context_line":"import mock"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from nova.compute import instance_list"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f515b1d_fbced381","line":13,"in_reply_to":"7f515b1d_fbdb737a","updated":"2017-09-21 23:02:23.000000000","message":"Mock is a standard library in py3 land, so I think I\u0027m okay here.","commit_id":"bac8f5b046283fbc641d418443e5b899f2989fdf"}]}
