)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cc8d66a6016a0a9a2170c9e7438deee62b8cf23c","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2018-12-13 10:35:28 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Exclude build request instance with marker from listing"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Closes-Bug: #1808286"},{"line_number":10,"context_line":"Change-Id: I5165b69f956fbf1904112a742698b2739f747e72"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3f79a3b5_359f46b3","line":8,"updated":"2018-12-17 14:32:30.000000000","message":"Can you provide more details here? What is the bug and how does this fix it?","commit_id":"9fc025d5383b0904e31cc69cbe8650c90295867a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fe5ca14c445f1b93cb71273f3dd79083582a1822","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Exclude build request instance with marker from listing"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When listing \"real\" (already in cell) instances e.g. from"},{"line_number":10,"context_line":"nova_cell1.instances table, a marker option means \"start after the"},{"line_number":11,"context_line":"instance with marker\"."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"For VMs:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3f79a3b5_c2913a53","line":10,"updated":"2018-12-19 21:14:54.000000000","message":"Correct, the marker is the last seen item in the last page:\n\nhttps://developer.openstack.org/api-guide/compute/paginated_collections.html","commit_id":"7a08c7714d90cd4766ffb27fab1a8ac3f431399c"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"57f42eca81eb6ec2de0a0cd1047aaa6e66db106b","unresolved":false,"context_lines":[{"line_number":29,"context_line":"\"openstack server list --marker 1\" returns both vm1 and vm2."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"This patch excludes instance with marker from listing for"},{"line_number":32,"context_line":"instances from build_requests table."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Closes-Bug: #1808286"},{"line_number":35,"context_line":"Change-Id: I5165b69f956fbf1904112a742698b2739f747e72"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3f79a3b5_5c6a0319","line":32,"updated":"2018-12-19 04:26:17.000000000","message":"Excellent commit message, explains the problem well. Thank you.","commit_id":"7a08c7714d90cd4766ffb27fab1a8ac3f431399c"}],"nova/objects/build_request.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"27446a71785c71366727f3fafe82f2170053effa","unresolved":false,"context_lines":[{"line_number":445,"context_line":"        if marker:"},{"line_number":446,"context_line":"            for i, build_req in enumerate(sorted_build_reqs):"},{"line_number":447,"context_line":"                if build_req.instance.uuid \u003d\u003d marker:"},{"line_number":448,"context_line":"                    marker_index \u003d i + 1"},{"line_number":449,"context_line":"                    break"},{"line_number":450,"context_line":"            else:"},{"line_number":451,"context_line":"                raise exception.MarkerNotFound(marker\u003dmarker)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_a210beab","line":448,"updated":"2018-12-19 21:18:16.000000000","message":"A comment here would be good. I\u0027ll add that.","commit_id":"7a08c7714d90cd4766ffb27fab1a8ac3f431399c"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"57f42eca81eb6ec2de0a0cd1047aaa6e66db106b","unresolved":false,"context_lines":[{"line_number":457,"context_line":"                limit_index \u003d len_build_reqs"},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"        return cls(context,"},{"line_number":460,"context_line":"                   objects\u003dsorted_build_reqs[marker_index:limit_index])"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"@db.api_context_manager.reader"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_1c5a4b84","line":460,"range":{"start_line":460,"start_character":45,"end_line":460,"end_character":69},"updated":"2018-12-19 04:26:17.000000000","message":"Indeed, we need to return the next item after the marker as the first item, so adding one to the marker_index does that.\n\nHere\u0027s how we get instances when providing a marker, calling utils.paginate_query in oslo.db:\n\nhttps://github.com/openstack/nova/blob/93597864a36e69bdf5d8c83e49783ca081017e32/nova/db/sqlalchemy/api.py#L2236-L2240\n\nand paginate_query returns the next item found after the marker (linked to docstring, you can also look at code):\n\nhttps://github.com/openstack/oslo.db/blob/f1be3e74a6c8b28c7ef77ce6ee8808364b02b2a7/oslo_db/sqlalchemy/utils.py#L170-L171","commit_id":"7a08c7714d90cd4766ffb27fab1a8ac3f431399c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fe5ca14c445f1b93cb71273f3dd79083582a1822","unresolved":false,"context_lines":[{"line_number":457,"context_line":"                limit_index \u003d len_build_reqs"},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"        return cls(context,"},{"line_number":460,"context_line":"                   objects\u003dsorted_build_reqs[marker_index:limit_index])"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"@db.api_context_manager.reader"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_42a52a9b","line":460,"range":{"start_line":460,"start_character":45,"end_line":460,"end_character":69},"in_reply_to":"3f79a3b5_1c5a4b84","updated":"2018-12-19 21:14:54.000000000","message":"And we\u0027re sure we can\u0027t get an IndexError here somehow?\n\nWhat if len(sorted_build_reqs) is 1 and the single entry is the marker? In that case, limit_index would start at 1 on L453. Let\u0027s say the limit is 1000 (the default). Then:\n\nlimit_index \u003d marker_index + limit\n\nMakes limit_index \u003d 1 + 1000 \u003d 1001\n\nAnd then:\n\n            if limit_index \u003e len_build_reqs:  # 1001 \u003e 1\n                limit_index \u003d len_build_reqs\n\nSo we are left with limit_index \u003d 1.\n\nThen we do: sorted_build_reqs[marker_index:limit_index]\n\nSo sorted_build_reqs[1:1] right? Which leaves us with [], so yeah I guess that\u0027s correct.","commit_id":"7a08c7714d90cd4766ffb27fab1a8ac3f431399c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8f0d9fdbd1739fba7e18efa3573ae30d56d12804","unresolved":false,"context_lines":[{"line_number":433,"context_line":""},{"line_number":434,"context_line":"            filtered_build_reqs.append(build_req)"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"        if (((len(filtered_build_reqs) \u003c 2) or (not sort_keys))"},{"line_number":437,"context_line":"                and not marker):"},{"line_number":438,"context_line":"            # No need to sort"},{"line_number":439,"context_line":"            return cls(context, objects\u003dfiltered_build_reqs)"},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"        sorted_build_reqs \u003d cls._sort_build_requests(filtered_build_reqs,"},{"line_number":442,"context_line":"                                                     sort_keys, sort_dirs)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_b214ceea","line":439,"range":{"start_line":436,"start_character":8,"end_line":439,"end_character":60},"updated":"2019-10-23 14:30:47.000000000","message":"Is there some reason we don\u0027t check for a marker here? Did we miss this?","commit_id":"2ef704cba619a149336692311c2614742aa32909"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e33fe9682a3a0929ed9711a9eeaeeba137f8f68","unresolved":false,"context_lines":[{"line_number":433,"context_line":""},{"line_number":434,"context_line":"            filtered_build_reqs.append(build_req)"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"        if (((len(filtered_build_reqs) \u003c 2) or (not sort_keys))"},{"line_number":437,"context_line":"                and not marker):"},{"line_number":438,"context_line":"            # No need to sort"},{"line_number":439,"context_line":"            return cls(context, objects\u003dfiltered_build_reqs)"},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"        sorted_build_reqs \u003d cls._sort_build_requests(filtered_build_reqs,"},{"line_number":442,"context_line":"                                                     sort_keys, sort_dirs)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_32b77ef8","line":439,"range":{"start_line":436,"start_character":8,"end_line":439,"end_character":60},"in_reply_to":"3fa7e38b_b214ceea","updated":"2019-10-23 14:32:04.000000000","message":"Oh nevermind I missed the \"and not marker\" condition.","commit_id":"2ef704cba619a149336692311c2614742aa32909"}],"nova/tests/functional/db/test_build_request.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fe5ca14c445f1b93cb71273f3dd79083582a1822","unresolved":false,"context_lines":[{"line_number":506,"context_line":"        self.assertEqual(req_third.instance_uuid, req_list[2].instance_uuid)"},{"line_number":507,"context_line":"        objects.base.obj_equal_prims(req_third.instance, req_list[2].instance)"},{"line_number":508,"context_line":""},{"line_number":509,"context_line":"    def test_get_by_filters_marker(self):"},{"line_number":510,"context_line":"        instance \u003d fake_instance.fake_instance_obj("},{"line_number":511,"context_line":"            self.context, objects.Instance, uuid\u003duuidutils.generate_uuid(),"},{"line_number":512,"context_line":"            host\u003dNone)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_62df060a","line":509,"updated":"2018-12-19 21:14:54.000000000","message":"Could have also been nice to add a simple test to ServersPreSchedulingTestCase which hits the actual full stack with only build requests in the DB so we could test marker logic there as well. But maybe this is good enough.","commit_id":"7a08c7714d90cd4766ffb27fab1a8ac3f431399c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fe5ca14c445f1b93cb71273f3dd79083582a1822","unresolved":false,"context_lines":[{"line_number":511,"context_line":"            self.context, objects.Instance, uuid\u003duuidutils.generate_uuid(),"},{"line_number":512,"context_line":"            host\u003dNone)"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"        reqs \u003d [self._create_req(),"},{"line_number":515,"context_line":"                self._create_req(instance\u003dinstance),"},{"line_number":516,"context_line":"                self._create_req()]"},{"line_number":517,"context_line":""},{"line_number":518,"context_line":"        req_list \u003d build_request.BuildRequestList.get_by_filters("},{"line_number":519,"context_line":"            self.context, {}, marker\u003dinstance.uuid, sort_keys\u003d[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_02c8924b","line":516,"range":{"start_line":514,"start_character":8,"end_line":516,"end_character":35},"updated":"2018-12-19 21:14:54.000000000","message":"So this test creates 3 build requests and the marker is the 2nd in the list, so we should only get the 3rd and final build request back, which is what gets asserted. ✔","commit_id":"7a08c7714d90cd4766ffb27fab1a8ac3f431399c"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"aa15f13778ecc627e871cc198f9ff2f6c2d34ca1","unresolved":false,"context_lines":[{"line_number":521,"context_line":""},{"line_number":522,"context_line":"        self.assertIsInstance(req_list, objects.BuildRequestList)"},{"line_number":523,"context_line":"        self.assertEqual(1, len(req_list))"},{"line_number":524,"context_line":"        for i, req in enumerate(reqs[2:]):"},{"line_number":525,"context_line":"            self.assertEqual(req.instance_uuid, req_list[i].instance_uuid)"},{"line_number":526,"context_line":"            objects.base.obj_equal_prims(req.instance,"},{"line_number":527,"context_line":"                                         req_list[i].instance)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_cc3f3a82","line":524,"range":{"start_line":524,"start_character":8,"end_line":524,"end_character":41},"updated":"2018-12-19 14:45:41.000000000","message":"do we still need this for loop when len \u003d\u003d 1","commit_id":"7a08c7714d90cd4766ffb27fab1a8ac3f431399c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fe5ca14c445f1b93cb71273f3dd79083582a1822","unresolved":false,"context_lines":[{"line_number":521,"context_line":""},{"line_number":522,"context_line":"        self.assertIsInstance(req_list, objects.BuildRequestList)"},{"line_number":523,"context_line":"        self.assertEqual(1, len(req_list))"},{"line_number":524,"context_line":"        for i, req in enumerate(reqs[2:]):"},{"line_number":525,"context_line":"            self.assertEqual(req.instance_uuid, req_list[i].instance_uuid)"},{"line_number":526,"context_line":"            objects.base.obj_equal_prims(req.instance,"},{"line_number":527,"context_line":"                                         req_list[i].instance)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_62aaa66c","line":524,"range":{"start_line":524,"start_character":8,"end_line":524,"end_character":41},"in_reply_to":"3f79a3b5_cc3f3a82","updated":"2018-12-19 21:14:54.000000000","message":"Not really no.","commit_id":"7a08c7714d90cd4766ffb27fab1a8ac3f431399c"}]}
