)]}'
{"swift/proxy/controllers/base.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d4fa29699ca0c9fa3264f4c7a36ec27af1bc40f8","unresolved":false,"context_lines":[{"line_number":2058,"context_line":"            or None if there was a problem fetching the shard ranges"},{"line_number":2059,"context_line":"        \"\"\""},{"line_number":2060,"context_line":"        params \u003d req.params.copy()"},{"line_number":2061,"context_line":"        params.pop(\u0027limit\u0027, None)"},{"line_number":2062,"context_line":"        params[\u0027format\u0027] \u003d \u0027json\u0027"},{"line_number":2063,"context_line":"        if includes:"},{"line_number":2064,"context_line":"            params[\u0027includes\u0027] \u003d includes"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_d5ff9da8","line":2061,"updated":"2018-03-14 17:10:06.000000000","message":"Not to worry, it wasn\u0027t getting respected anyway! :P","commit_id":"97cb6fb1eb32eaba45a8bc3633d9a78a151b953d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2029befbba06f0e5c01d94b5303f74edf73ce216","unresolved":false,"context_lines":[{"line_number":2058,"context_line":"            or None if there was a problem fetching the shard ranges"},{"line_number":2059,"context_line":"        \"\"\""},{"line_number":2060,"context_line":"        params \u003d req.params.copy()"},{"line_number":2061,"context_line":"        params.pop(\u0027limit\u0027, None)"},{"line_number":2062,"context_line":"        params[\u0027format\u0027] \u003d \u0027json\u0027"},{"line_number":2063,"context_line":"        if includes:"},{"line_number":2064,"context_line":"            params[\u0027includes\u0027] \u003d includes"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_8d3ed6b5","line":2061,"in_reply_to":"df7087c5_d5ff9da8","updated":"2018-03-15 20:34:18.000000000","message":"right! oh well, I saved a future bug, maybe","commit_id":"97cb6fb1eb32eaba45a8bc3633d9a78a151b953d"}],"swift/proxy/controllers/container.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d4fa29699ca0c9fa3264f4c7a36ec27af1bc40f8","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            # to those already in the listing are not fetched"},{"line_number":172,"context_line":"            if objects:"},{"line_number":173,"context_line":"                params[\u0027marker\u0027] \u003d objects[-1][\u0027name\u0027]"},{"line_number":174,"context_line":"            elif marker and marker \u003c\u003d shard_range.upper:"},{"line_number":175,"context_line":"                params[\u0027marker\u0027] \u003d marker"},{"line_number":176,"context_line":"            else:"},{"line_number":177,"context_line":"                params[\u0027marker\u0027] \u003d str(shard_range.upper) if reverse \\"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_7511f103","line":174,"updated":"2018-03-14 17:10:06.000000000","message":"Don\u0027t we need to worry about `reverse`?","commit_id":"97cb6fb1eb32eaba45a8bc3633d9a78a151b953d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2029befbba06f0e5c01d94b5303f74edf73ce216","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            # to those already in the listing are not fetched"},{"line_number":172,"context_line":"            if objects:"},{"line_number":173,"context_line":"                params[\u0027marker\u0027] \u003d objects[-1][\u0027name\u0027]"},{"line_number":174,"context_line":"            elif marker and marker \u003c\u003d shard_range.upper:"},{"line_number":175,"context_line":"                params[\u0027marker\u0027] \u003d marker"},{"line_number":176,"context_line":"            else:"},{"line_number":177,"context_line":"                params[\u0027marker\u0027] \u003d str(shard_range.upper) if reverse \\"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_b3c9bc26","line":174,"in_reply_to":"df7087c5_7511f103","updated":"2018-03-15 20:34:18.000000000","message":"yep! well, not worry, nothing is broken, but there should be a symmetric allowance for reverse listings.","commit_id":"97cb6fb1eb32eaba45a8bc3633d9a78a151b953d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d4fa29699ca0c9fa3264f4c7a36ec27af1bc40f8","unresolved":false,"context_lines":[{"line_number":181,"context_line":""},{"line_number":182,"context_line":"            # Always set end_marker to ensure that misplaced objects beyond"},{"line_number":183,"context_line":"            # the expected shard range are not fetched"},{"line_number":184,"context_line":"            if end_marker and end_marker in shard_range:"},{"line_number":185,"context_line":"                params[\u0027end_marker\u0027] \u003d end_marker"},{"line_number":186,"context_line":"            else:"},{"line_number":187,"context_line":"                params[\u0027end_marker\u0027] \u003d str(shard_range.lower) if reverse \\"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_950605ce","line":184,"range":{"start_line":184,"start_character":41,"end_line":184,"end_character":55},"updated":"2018-03-14 17:10:06.000000000","message":"Why do we leave this one but change how we handle marker?","commit_id":"97cb6fb1eb32eaba45a8bc3633d9a78a151b953d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d0ec3f68ccbd989e18887f24370fd5614b33649f","unresolved":false,"context_lines":[{"line_number":181,"context_line":""},{"line_number":182,"context_line":"            # Always set end_marker to ensure that misplaced objects beyond"},{"line_number":183,"context_line":"            # the expected shard range are not fetched"},{"line_number":184,"context_line":"            if end_marker and end_marker in shard_range:"},{"line_number":185,"context_line":"                params[\u0027end_marker\u0027] \u003d end_marker"},{"line_number":186,"context_line":"            else:"},{"line_number":187,"context_line":"                params[\u0027end_marker\u0027] \u003d str(shard_range.lower) if reverse \\"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_f60082ad","line":184,"range":{"start_line":184,"start_character":41,"end_line":184,"end_character":55},"in_reply_to":"df7087c5_2def8ae9","updated":"2018-03-15 21:46:35.000000000","message":"OK... and since we\u0027ve got the marker set, we know that any bonus objects would be between the last object that the previous shard range knows about and its upper.","commit_id":"97cb6fb1eb32eaba45a8bc3633d9a78a151b953d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2029befbba06f0e5c01d94b5303f74edf73ce216","unresolved":false,"context_lines":[{"line_number":181,"context_line":""},{"line_number":182,"context_line":"            # Always set end_marker to ensure that misplaced objects beyond"},{"line_number":183,"context_line":"            # the expected shard range are not fetched"},{"line_number":184,"context_line":"            if end_marker and end_marker in shard_range:"},{"line_number":185,"context_line":"                params[\u0027end_marker\u0027] \u003d end_marker"},{"line_number":186,"context_line":"            else:"},{"line_number":187,"context_line":"                params[\u0027end_marker\u0027] \u003d str(shard_range.lower) if reverse \\"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_2def8ae9","line":184,"range":{"start_line":184,"start_character":41,"end_line":184,"end_character":55},"in_reply_to":"df7087c5_950605ce","updated":"2018-03-15 20:34:18.000000000","message":"My thinking is (in terms of a forwards listing):\n\n- if there\u0027s a misplaced object(s) less than the shard range lower then it\u0027s a bonus to include them in the listing - we still get whatever is in the shard range namespace\n\n- if there is a misplaced object beyond the range upper then including it could exclude objects in the next shard range, because we\u0027d have to move our marker to the last (misplaced) object name. I\u0027d prefer to keep the marker below the next shard range to avoid excluding correctly placed objects.","commit_id":"97cb6fb1eb32eaba45a8bc3633d9a78a151b953d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f34e97f88b20a1da34b401245ad40eadf89e6012","unresolved":false,"context_lines":[{"line_number":181,"context_line":""},{"line_number":182,"context_line":"            # Always set end_marker to ensure that misplaced objects beyond"},{"line_number":183,"context_line":"            # the expected shard range are not fetched"},{"line_number":184,"context_line":"            if end_marker and end_marker in shard_range:"},{"line_number":185,"context_line":"                params[\u0027end_marker\u0027] \u003d end_marker"},{"line_number":186,"context_line":"            else:"},{"line_number":187,"context_line":"                params[\u0027end_marker\u0027] \u003d str(shard_range.lower) if reverse \\"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_9e94af38","line":184,"range":{"start_line":184,"start_character":41,"end_line":184,"end_character":55},"in_reply_to":"df7087c5_f60082ad","updated":"2018-03-16 09:46:39.000000000","message":"correct","commit_id":"97cb6fb1eb32eaba45a8bc3633d9a78a151b953d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d4fa29699ca0c9fa3264f4c7a36ec27af1bc40f8","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            # container is shrinking or in tests; typically a sharded container"},{"line_number":225,"context_line":"            # will have more than CONTAINER_LISTING_LIMIT objects so any"},{"line_number":226,"context_line":"            # unconstrained listing will be capped by the limit and total"},{"line_number":227,"context_line":"            # object stats cannot therefore be inferred from the listing."},{"line_number":228,"context_line":"            resp.headers[\u0027X-Container-Object-Count\u0027] \u003d len(objects)"},{"line_number":229,"context_line":"            resp.headers[\u0027X-Container-Bytes-Used\u0027] \u003d sum("},{"line_number":230,"context_line":"                [o[\u0027bytes\u0027] for o in objects])"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_d56a3d7f","line":227,"updated":"2018-03-14 17:10:06.000000000","message":"Off-topic: I wonder how much we really need to worry about this case... I suppose it\u0027s nice to make the tests more sane, but it doesn\u0027t seem very reflective of reality.","commit_id":"97cb6fb1eb32eaba45a8bc3633d9a78a151b953d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2029befbba06f0e5c01d94b5303f74edf73ce216","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            # container is shrinking or in tests; typically a sharded container"},{"line_number":225,"context_line":"            # will have more than CONTAINER_LISTING_LIMIT objects so any"},{"line_number":226,"context_line":"            # unconstrained listing will be capped by the limit and total"},{"line_number":227,"context_line":"            # object stats cannot therefore be inferred from the listing."},{"line_number":228,"context_line":"            resp.headers[\u0027X-Container-Object-Count\u0027] \u003d len(objects)"},{"line_number":229,"context_line":"            resp.headers[\u0027X-Container-Bytes-Used\u0027] \u003d sum("},{"line_number":230,"context_line":"                [o[\u0027bytes\u0027] for o in objects])"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_ed919248","line":227,"in_reply_to":"df7087c5_d56a3d7f","updated":"2018-03-15 20:34:18.000000000","message":"yes, it\u0027s not the common case, but a shrinking container is still a reality, and we don\u0027t yet know what the lag will be before we shrink back a final shard range to a single db.","commit_id":"97cb6fb1eb32eaba45a8bc3633d9a78a151b953d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d0ec3f68ccbd989e18887f24370fd5614b33649f","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            elif marker and marker \u003c\u003d shard_range.upper:"},{"line_number":177,"context_line":"                params[\u0027marker\u0027] \u003d marker"},{"line_number":178,"context_line":"            else:"},{"line_number":179,"context_line":"                params[\u0027marker\u0027] \u003d str(shard_range.upper) if reverse \\"},{"line_number":180,"context_line":"                    else shard_range.lower"},{"line_number":181,"context_line":"                if params[\u0027marker\u0027] and reverse:"},{"line_number":182,"context_line":"                    params[\u0027marker\u0027] +\u003d \u0027\\x00\u0027"},{"line_number":183,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_41d2c629","line":180,"range":{"start_line":179,"start_character":35,"end_line":180,"end_character":42},"updated":"2018-03-15 21:46:35.000000000","message":"Off-topic: why do we only str() one of these? Makes me nervous...\n\nWe do a similar thing below with end_marker.","commit_id":"f5629087dabeeba3277abd5e7350f1b09cc81bd6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f34e97f88b20a1da34b401245ad40eadf89e6012","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            elif marker and marker \u003c\u003d shard_range.upper:"},{"line_number":177,"context_line":"                params[\u0027marker\u0027] \u003d marker"},{"line_number":178,"context_line":"            else:"},{"line_number":179,"context_line":"                params[\u0027marker\u0027] \u003d str(shard_range.upper) if reverse \\"},{"line_number":180,"context_line":"                    else shard_range.lower"},{"line_number":181,"context_line":"                if params[\u0027marker\u0027] and reverse:"},{"line_number":182,"context_line":"                    params[\u0027marker\u0027] +\u003d \u0027\\x00\u0027"},{"line_number":183,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_9ec10f57","line":180,"range":{"start_line":179,"start_character":35,"end_line":180,"end_character":42},"in_reply_to":"df7087c5_41d2c629","updated":"2018-03-16 09:46:39.000000000","message":"Done","commit_id":"f5629087dabeeba3277abd5e7350f1b09cc81bd6"}],"test/unit/proxy/controllers/test_container.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d0ec3f68ccbd989e18887f24370fd5614b33649f","unresolved":false,"context_lines":[{"line_number":440,"context_line":"        # expected_requests is a list of tuples (path, hdrs dict, params dict)"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"        # sanity check that expected objects is name ordered with no repeats"},{"line_number":443,"context_line":"        for (prev, next) in zip(expected_objects, expected_objects[1:]):"},{"line_number":444,"context_line":"            if reverse:"},{"line_number":445,"context_line":"                self.assertGreater(prev[\u0027name\u0027], next[\u0027name\u0027])"},{"line_number":446,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_e1043a17","line":443,"range":{"start_line":443,"start_character":19,"end_line":443,"end_character":23},"updated":"2018-03-15 21:46:35.000000000","message":"nit: shadows the built-in next()","commit_id":"f5629087dabeeba3277abd5e7350f1b09cc81bd6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f34e97f88b20a1da34b401245ad40eadf89e6012","unresolved":false,"context_lines":[{"line_number":440,"context_line":"        # expected_requests is a list of tuples (path, hdrs dict, params dict)"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"        # sanity check that expected objects is name ordered with no repeats"},{"line_number":443,"context_line":"        for (prev, next) in zip(expected_objects, expected_objects[1:]):"},{"line_number":444,"context_line":"            if reverse:"},{"line_number":445,"context_line":"                self.assertGreater(prev[\u0027name\u0027], next[\u0027name\u0027])"},{"line_number":446,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"df7087c5_be75f333","line":443,"range":{"start_line":443,"start_character":19,"end_line":443,"end_character":23},"in_reply_to":"df7087c5_e1043a17","updated":"2018-03-16 09:46:39.000000000","message":"Done","commit_id":"f5629087dabeeba3277abd5e7350f1b09cc81bd6"}]}
