)]}'
{"swift/common/middleware/versioned_writes.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0296ee62abbfdf7ec54715e35f54427766526bc7","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            raise HTTPServerError(request\u003dreq)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def _in_proxy_reverse_listing(self, account_name, lcontainer, lprefix,"},{"line_number":159,"context_line":"                                  env, failed_marker, failed_listing):"},{"line_number":160,"context_line":"        complete_listing \u003d []"},{"line_number":161,"context_line":"        if not failed_marker:"},{"line_number":162,"context_line":"            # We\u0027ve never gotten a reversed listing. So save a request and"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba0121b8_7789f574","line":159,"updated":"2016-03-31 01:15:35.000000000","message":"A doc string here would be super helpful.\n\nSomething about the failed_marker param, or when and why it\u0027s suitable to use failed_listing.\n\nbut mostly describing the return value","commit_id":"e88a83cbb4869478c36e51fd26a242e00e46c46d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a124b31406ddaab44272800f0bb7c0cb6bcc1f67","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            raise HTTPServerError(request\u003dreq)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def _in_proxy_reverse_listing(self, account_name, lcontainer, lprefix,"},{"line_number":159,"context_line":"                                  env, failed_marker, failed_listing):"},{"line_number":160,"context_line":"        complete_listing \u003d []"},{"line_number":161,"context_line":"        if not failed_marker:"},{"line_number":162,"context_line":"            # We\u0027ve never gotten a reversed listing. So save a request and"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba0121b8_2bc4385d","line":159,"in_reply_to":"ba0121b8_7789f574","updated":"2016-03-31 05:11:55.000000000","message":"Done","commit_id":"e88a83cbb4869478c36e51fd26a242e00e46c46d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0296ee62abbfdf7ec54715e35f54427766526bc7","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        # Now that we\u0027ve got everything, yield it out in reverse"},{"line_number":181,"context_line":"        while complete_listing:"},{"line_number":182,"context_line":"            # may as well destroy the list as we go..."},{"line_number":183,"context_line":"            yield complete_listing.pop()"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def _listing_pages_iter(self, account_name, lcontainer, lprefix,"},{"line_number":186,"context_line":"                            env, marker\u003d\u0027\u0027, end_marker\u003d\u0027\u0027, reverse\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba0121b8_d75561fa","line":183,"updated":"2016-03-31 01:15:35.000000000","message":"I think I might have been less confused - since we already have it in memory - if this just went `return reverse(complete_listing)`\n\nI\u0027m honestly not sure all the list manipulation/re-sizing of the list doesn\u0027t make this worse than the naive (and more readable) approach:\n\n    diff --git a/swift/common/middleware/versioned_writes.py b/swift/common/middleware/versioned_writes.py\n    index 8735e5d..0b844e7 100644\n    --- a/swift/common/middleware/versioned_writes.py\n    +++ b/swift/common/middleware/versioned_writes.py\n    @@ -177,10 +177,9 @@ class VersionedWritesContext(WSGIContext):\n             except ListingIterNotFound:\n                 pass\n     \n    -        # Now that we\u0027ve got everything, yield it out in reverse\n    -        while complete_listing:\n    -            # may as well destroy the list as we go...\n    -            yield complete_listing.pop()\n    +        # Now that we\u0027ve got everything, return the whole listing as one giant\n    +        # reversed page\n    +        return reversed(complete_listing)\n\n\n.... or maybe something form itertools if you really want to get fancy?","commit_id":"e88a83cbb4869478c36e51fd26a242e00e46c46d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a124b31406ddaab44272800f0bb7c0cb6bcc1f67","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        # Now that we\u0027ve got everything, yield it out in reverse"},{"line_number":181,"context_line":"        while complete_listing:"},{"line_number":182,"context_line":"            # may as well destroy the list as we go..."},{"line_number":183,"context_line":"            yield complete_listing.pop()"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def _listing_pages_iter(self, account_name, lcontainer, lprefix,"},{"line_number":186,"context_line":"                            env, marker\u003d\u0027\u0027, end_marker\u003d\u0027\u0027, reverse\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba0121b8_8ba3c4b1","line":183,"in_reply_to":"ba0121b8_d75561fa","updated":"2016-03-31 05:11:55.000000000","message":"Done","commit_id":"e88a83cbb4869478c36e51fd26a242e00e46c46d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0296ee62abbfdf7ec54715e35f54427766526bc7","unresolved":false,"context_lines":[{"line_number":195,"context_line":"                lreq.environ[\u0027QUERY_STRING\u0027] +\u003d \u0027\u0026end_marker\u003d%s\u0027 % ("},{"line_number":196,"context_line":"                    quote(end_marker))"},{"line_number":197,"context_line":"            if reverse:"},{"line_number":198,"context_line":"                lreq.environ[\u0027QUERY_STRING\u0027] +\u003d \u0027\u0026reverse\u003don\u0027"},{"line_number":199,"context_line":"            lresp \u003d lreq.get_response(self.app)"},{"line_number":200,"context_line":"            if not is_success(lresp.status_int):"},{"line_number":201,"context_line":"                if lresp.status_int \u003d\u003d HTTP_NOT_FOUND:"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba0121b8_44eec1b4","line":198,"updated":"2016-03-31 01:15:35.000000000","message":"it was useful to me to realize that the callers of this code here *either* send in an end_marker (so non-reversed pages can go up to the end of the reversed page) *or* reverse where we\u0027ll just keep digging to to the top - but never *both*","commit_id":"e88a83cbb4869478c36e51fd26a242e00e46c46d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a124b31406ddaab44272800f0bb7c0cb6bcc1f67","unresolved":false,"context_lines":[{"line_number":195,"context_line":"                lreq.environ[\u0027QUERY_STRING\u0027] +\u003d \u0027\u0026end_marker\u003d%s\u0027 % ("},{"line_number":196,"context_line":"                    quote(end_marker))"},{"line_number":197,"context_line":"            if reverse:"},{"line_number":198,"context_line":"                lreq.environ[\u0027QUERY_STRING\u0027] +\u003d \u0027\u0026reverse\u003don\u0027"},{"line_number":199,"context_line":"            lresp \u003d lreq.get_response(self.app)"},{"line_number":200,"context_line":"            if not is_success(lresp.status_int):"},{"line_number":201,"context_line":"                if lresp.status_int \u003d\u003d HTTP_NOT_FOUND:"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba0121b8_86d2995a","line":198,"in_reply_to":"ba0121b8_44eec1b4","updated":"2016-03-31 05:11:55.000000000","message":"Done","commit_id":"e88a83cbb4869478c36e51fd26a242e00e46c46d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0296ee62abbfdf7ec54715e35f54427766526bc7","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                yield self._in_proxy_reverse_listing("},{"line_number":220,"context_line":"                    account_name, lcontainer, lprefix,"},{"line_number":221,"context_line":"                    env, marker, sublisting)"},{"line_number":222,"context_line":"                return"},{"line_number":223,"context_line":"            marker \u003d last_item"},{"line_number":224,"context_line":"            yield sublisting"},{"line_number":225,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba0121b8_d76c41d2","line":222,"updated":"2016-03-31 01:15:35.000000000","message":"oic, _in_proxy_reverse_listing yeilds out this \"super page\" \n\ninstead of yielding out the next \"sublisting\"/page (an iterable of objects) - we\u0027re yielding out the last iterable of objects you\u0027ll ever need (as indicated by the return here) - an iterable of all the pages concat together - which just so happens to spit things out in reverse order from the failed_marker on up to the top of the container.\n\ngot it","commit_id":"e88a83cbb4869478c36e51fd26a242e00e46c46d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8ab9e60771451c15f21b2ab43364c9408625321b","unresolved":false,"context_lines":[{"line_number":244,"context_line":"            first_item \u003d sublisting[0][\u0027name\u0027].encode(\u0027utf-8\u0027)"},{"line_number":245,"context_line":"            last_item \u003d sublisting[-1][\u0027name\u0027].encode(\u0027utf-8\u0027)"},{"line_number":246,"context_line":"            page_is_after_marker \u003d marker and first_item \u003e marker"},{"line_number":247,"context_line":"            if reverse and (first_item \u003c last_item or page_is_after_marker):"},{"line_number":248,"context_line":"                # Apparently there\u0027s at least one pre-2.6.0 container server"},{"line_number":249,"context_line":"                yield self._in_proxy_reverse_listing("},{"line_number":250,"context_line":"                    account_name, lcontainer, lprefix,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba0121b8_e2ea410e","line":247,"updated":"2016-03-31 16:06:56.000000000","message":"I found that all tests still passed if I introduced a bug here:\n\n  if reverse and (first_item \u003c\u003d last_item or page_is_after_marker):\n\nExtra unit test to cover this here:\nhttps://gist.github.com/alistairncoles/8c7ed4ef1220f06b0591709c767a6346","commit_id":"9cfe9e12d240c48659c3af14dda9f6cd93273333"}],"test/unit/common/middleware/test_versioned_writes.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0296ee62abbfdf7ec54715e35f54427766526bc7","unresolved":false,"context_lines":[{"line_number":756,"context_line":"            (\u0027GET\u0027, prefix_listing_prefix + \u0027marker\u003d001o/2\u0027),"},{"line_number":757,"context_line":"        ])"},{"line_number":758,"context_line":""},{"line_number":759,"context_line":"    def test_partially_upgraded_cluster(self):"},{"line_number":760,"context_line":"        old_versions \u003d ["},{"line_number":761,"context_line":"            {\u0027hash\u0027: \u0027etag%d\u0027 % x,"},{"line_number":762,"context_line":"             \u0027last_modified\u0027:  \"2014-11-21T14:14:%02d.409100\" % x,"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba0121b8_44a9a17a","line":759,"updated":"2016-03-31 01:15:35.000000000","message":"this is not a bad place to start trying to understand what\u0027s going on in this change","commit_id":"e88a83cbb4869478c36e51fd26a242e00e46c46d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0296ee62abbfdf7ec54715e35f54427766526bc7","unresolved":false,"context_lines":[{"line_number":784,"context_line":"        # second container server can\u0027t reverse"},{"line_number":785,"context_line":"        self.app.register("},{"line_number":786,"context_line":"            \u0027GET\u0027, \u0027/v1/a/ver_cont?format\u003djson\u0026prefix\u003d001o/\u0026\u0027"},{"line_number":787,"context_line":"            \u0027marker\u003d001o/2\u0026reverse\u003don\u0027,"},{"line_number":788,"context_line":"            swob.HTTPOk, {}, json.dumps(old_versions[3:]))"},{"line_number":789,"context_line":""},{"line_number":790,"context_line":"        # subsequent requests shouldn\u0027t reverse"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba0121b8_e4e555dc","line":787,"updated":"2016-03-31 01:15:35.000000000","message":"note the marker is the reversed([0, 1, 2, 3, 4, 5][2:])[-1] (last item in the last page of the reversed listing)","commit_id":"e88a83cbb4869478c36e51fd26a242e00e46c46d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0296ee62abbfdf7ec54715e35f54427766526bc7","unresolved":false,"context_lines":[{"line_number":785,"context_line":"        self.app.register("},{"line_number":786,"context_line":"            \u0027GET\u0027, \u0027/v1/a/ver_cont?format\u003djson\u0026prefix\u003d001o/\u0026\u0027"},{"line_number":787,"context_line":"            \u0027marker\u003d001o/2\u0026reverse\u003don\u0027,"},{"line_number":788,"context_line":"            swob.HTTPOk, {}, json.dumps(old_versions[3:]))"},{"line_number":789,"context_line":""},{"line_number":790,"context_line":"        # subsequent requests shouldn\u0027t reverse"},{"line_number":791,"context_line":"        self.app.register("}],"source_content_type":"text/x-python","patch_set":1,"id":"ba0121b8_04d169fa","line":788,"updated":"2016-03-31 01:15:35.000000000","message":"so this response is a lot of the same objects from the first page - but *not* reversed","commit_id":"e88a83cbb4869478c36e51fd26a242e00e46c46d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8ab9e60771451c15f21b2ab43364c9408625321b","unresolved":false,"context_lines":[{"line_number":854,"context_line":"        self.app.register("},{"line_number":855,"context_line":"            \u0027GET\u0027, \u0027/v1/a/ver_cont?format\u003djson\u0026prefix\u003d001o/\u0026\u0027"},{"line_number":856,"context_line":"            \u0027marker\u003d001o/3\u0026reverse\u003don\u0027,"},{"line_number":857,"context_line":"            swob.HTTPOk, {}, json.dumps(old_versions[4:]))"},{"line_number":858,"context_line":""},{"line_number":859,"context_line":"        # subsequent requests shouldn\u0027t reverse"},{"line_number":860,"context_line":"        self.app.register("}],"source_content_type":"text/x-python","patch_set":2,"id":"ba0121b8_4c252607","line":857,"updated":"2016-03-31 16:06:56.000000000","message":"OIC, this is the second page referred to in the test method name - we\u0027re checking that even when first item \u003d\u003d last item we still detect a non-reversed listing.","commit_id":"9cfe9e12d240c48659c3af14dda9f6cd93273333"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8ab9e60771451c15f21b2ab43364c9408625321b","unresolved":false,"context_lines":[{"line_number":864,"context_line":"        self.app.register("},{"line_number":865,"context_line":"            \u0027GET\u0027, \u0027/v1/a/ver_cont?format\u003djson\u0026prefix\u003d001o/\u0026\u0027"},{"line_number":866,"context_line":"            \u0027marker\u003d001o/1\u0026end_marker\u003d001o/3\u0027,"},{"line_number":867,"context_line":"            swob.HTTPOk, {}, json.dumps(old_versions[2:3]))"},{"line_number":868,"context_line":"        self.app.register("},{"line_number":869,"context_line":"            \u0027GET\u0027, \u0027/v1/a/ver_cont?format\u003djson\u0026prefix\u003d001o/\u0026\u0027"},{"line_number":870,"context_line":"            \u0027marker\u003d001o/2\u0026end_marker\u003d001o/3\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba0121b8_cc9bf616","line":867,"updated":"2016-03-31 16:06:56.000000000","message":"whereas this \u0027second page\u0027 of non-reversed listings having a single item is insignificant.","commit_id":"9cfe9e12d240c48659c3af14dda9f6cd93273333"}]}
