)]}'
{"swift/common/middleware/account_quotas.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3524cdadb3037781d297ce87f066962b6f5bfb30","unresolved":false,"context_lines":[{"line_number":134,"context_line":"                content_length \u003d 0"},{"line_number":135,"context_line":"            else:"},{"line_number":136,"context_line":"                content_length \u003d int(object_info[\u0027length\u0027])"},{"line_number":137,"context_line":"        else:"},{"line_number":138,"context_line":"            path \u003d \u0027/\u0027 + ver + \u0027/\u0027 + account + \u0027/\u0027 + container + \u0027/\u0027 + obj"},{"line_number":139,"context_line":"            object_info \u003d get_object_info(request.environ, self.app, path)"},{"line_number":140,"context_line":"            if object_info and object_info[\u0027length\u0027]:"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_abdf9c67","line":137,"range":{"start_line":137,"start_character":8,"end_line":137,"end_character":12},"updated":"2016-01-05 23:18:04.000000000","message":"Are we sure we want this as an `else`? If we\u0027re copying one object over another, we\u0027re still interested in the delta between old and new sizes, yeah?\n\nDitto in container_quotas.py","commit_id":"061fe151a86658c47775491c123b603a5524bc7a"},{"author":{"_account_id":8037,"name":"renminmin","email":"rmm0811@gmail.com","username":"renminmin"},"change_message_id":"3b1391ed38df06880e275f021d73c1a99d488549","unresolved":false,"context_lines":[{"line_number":134,"context_line":"                content_length \u003d 0"},{"line_number":135,"context_line":"            else:"},{"line_number":136,"context_line":"                content_length \u003d int(object_info[\u0027length\u0027])"},{"line_number":137,"context_line":"        else:"},{"line_number":138,"context_line":"            path \u003d \u0027/\u0027 + ver + \u0027/\u0027 + account + \u0027/\u0027 + container + \u0027/\u0027 + obj"},{"line_number":139,"context_line":"            object_info \u003d get_object_info(request.environ, self.app, path)"},{"line_number":140,"context_line":"            if object_info and object_info[\u0027length\u0027]:"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa69d971_a404a949","line":137,"range":{"start_line":137,"start_character":8,"end_line":137,"end_character":12},"in_reply_to":"fa69d971_abdf9c67","updated":"2016-01-06 01:03:23.000000000","message":"Thanks for review. I will change it in new patch set.","commit_id":"061fe151a86658c47775491c123b603a5524bc7a"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"2343ebac3452d32221462b5432fcf57a476865fc","unresolved":false,"context_lines":[{"line_number":117,"context_line":"                copy_from \u003d None"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        content_length \u003d (request.content_length or 0)"},{"line_number":120,"context_line":"        account_info \u003d get_account_info(request.environ, self.app)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        dest_acc \u003d account"},{"line_number":123,"context_line":"        dest_cont \u003d container"}],"source_content_type":"text/x-python","patch_set":5,"id":"bae84128_714cad42","line":120,"range":{"start_line":120,"start_character":8,"end_line":120,"end_character":66},"updated":"2016-02-22 02:54:59.000000000","message":"This get_account_info seems redundant when the following if-block works.","commit_id":"78e1f7b28c81a24d264ae61f50f3199208b36d73"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"2343ebac3452d32221462b5432fcf57a476865fc","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                dest_acc \u003d request.headers.get(\u0027Destination-Account\u0027)"},{"line_number":129,"context_line":"                dest_acc \u003d check_account_format(request, dest_acc)"},{"line_number":130,"context_line":"                if dest_acc !\u003d account:"},{"line_number":131,"context_line":"                    path_info \u003d request.environ.get(\u0027PATH_INFO\u0027)"},{"line_number":132,"context_line":"                    request.environ[\u0027PATH_INFO\u0027] \u003d \u0027/\u0027 + ver + \u0027/\u0027 + \\"},{"line_number":133,"context_line":"                                                   dest_acc"},{"line_number":134,"context_line":"                    account_info \u003d get_account_info(request.environ, self.app)"},{"line_number":135,"context_line":"                    request.environ[\u0027PATH_INFO\u0027] \u003d path_info"},{"line_number":136,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"bae84128_f1d0bd55","line":133,"range":{"start_line":131,"start_character":20,"end_line":133,"end_character":59},"updated":"2016-02-22 02:54:59.000000000","message":"I prefer creating new copied instance of environ.","commit_id":"78e1f7b28c81a24d264ae61f50f3199208b36d73"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"209f6d4f58bf93871c0c79de976129299caeaeb7","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                    path_info \u003d request.environ.get(\u0027PATH_INFO\u0027)"},{"line_number":132,"context_line":"                    request.environ[\u0027PATH_INFO\u0027] \u003d \u0027/\u0027 + ver + \u0027/\u0027 + \\"},{"line_number":133,"context_line":"                                                   dest_acc"},{"line_number":134,"context_line":"                    account_info \u003d get_account_info(request.environ, self.app)"},{"line_number":135,"context_line":"                    request.environ[\u0027PATH_INFO\u0027] \u003d path_info"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        if not account_info or not account_info[\u0027bytes\u0027]:"}],"source_content_type":"text/x-python","patch_set":5,"id":"bae84128_200acd21","line":134,"updated":"2016-02-22 07:32:48.000000000","message":"Wait... are we currently using the *source* account\u0027s quota-bytes? Thanks for fixing that!","commit_id":"78e1f7b28c81a24d264ae61f50f3199208b36d73"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"2343ebac3452d32221462b5432fcf57a476865fc","unresolved":false,"context_lines":[{"line_number":158,"context_line":"                    + dest_obj"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        dest_obj_info \u003d get_object_info(request.environ, self.app, dest_path)"},{"line_number":161,"context_line":"        if dest_obj_info and dest_obj_info[\u0027length\u0027]:"},{"line_number":162,"context_line":"            orig_size \u003d int(dest_obj_info[\u0027length\u0027])"},{"line_number":163,"context_line":"        else:"},{"line_number":164,"context_line":"            orig_size \u003d 0"}],"source_content_type":"text/x-python","patch_set":5,"id":"bae84128_11f721f6","line":161,"range":{"start_line":161,"start_character":29,"end_line":161,"end_character":52},"updated":"2016-02-22 02:54:59.000000000","message":"Why we should check this?","commit_id":"78e1f7b28c81a24d264ae61f50f3199208b36d73"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"209f6d4f58bf93871c0c79de976129299caeaeb7","unresolved":false,"context_lines":[{"line_number":158,"context_line":"                    + dest_obj"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        dest_obj_info \u003d get_object_info(request.environ, self.app, dest_path)"},{"line_number":161,"context_line":"        if dest_obj_info and dest_obj_info[\u0027length\u0027]:"},{"line_number":162,"context_line":"            orig_size \u003d int(dest_obj_info[\u0027length\u0027])"},{"line_number":163,"context_line":"        else:"},{"line_number":164,"context_line":"            orig_size \u003d 0"}],"source_content_type":"text/x-python","patch_set":5,"id":"bae84128_c07cc1ed","line":161,"range":{"start_line":161,"start_character":29,"end_line":161,"end_character":52},"in_reply_to":"bae84128_11f721f6","updated":"2016-02-22 07:32:48.000000000","message":"\u0027length\u0027 could be None, resulting in a TypeError. I might have gone with\n\n int(dest_obj_info[\u0027length\u0027] or 0)\n\n...but that\u0027s me. I\u0027m more curious about why we test dest_obj_info; from [1], either we got something truthy out of _get_object_info, or we return headers_to_object_info({}, 0) (which is always a dict with a \u0027length\u0027 key).\n\n[1] https://github.com/openstack/swift/blob/2.6.0/swift/proxy/controllers/base.py#L284-L287","commit_id":"78e1f7b28c81a24d264ae61f50f3199208b36d73"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d569af3414137ac8c5735af149db45de5c04c8d6","unresolved":false,"context_lines":[{"line_number":117,"context_line":"                copy_from \u003d None"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        content_length \u003d (request.content_length or 0)"},{"line_number":120,"context_line":"        account_info \u003d get_account_info(request.environ, self.app)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        dest_acc \u003d account"},{"line_number":123,"context_line":"        dest_cont \u003d container"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba0121b8_e0fd8f3b","line":120,"updated":"2017-08-15 04:18:11.000000000","message":"Takashi\u0027s point here still stands. If we\u0027re copying and we have a destination account, we currently call get_account_info twice, despite only using one result.\n\nI guess it shouldn\u0027t really matter though, on account of caching inside the WSGI environment...","commit_id":"d1db83523dc0abc60083f5202b646bab03938478"}],"swift/common/middleware/container_quotas.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"209f6d4f58bf93871c0c79de976129299caeaeb7","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                container_info \u003d get_container_info("},{"line_number":101,"context_line":"                    req.environ, self.app, swift_source\u003d\u0027CQ\u0027)"},{"line_number":102,"context_line":"            if req.method \u003d\u003d \u0027COPY\u0027 and \u0027Destination\u0027 in req.headers:"},{"line_number":103,"context_line":"                dest_account \u003d account"},{"line_number":104,"context_line":"                if \u0027Destination-Account\u0027 in req.headers:"},{"line_number":105,"context_line":"                    dest_account \u003d req.headers.get(\u0027Destination-Account\u0027)"},{"line_number":106,"context_line":"                    dest_account \u003d check_account_format(req, dest_account)"}],"source_content_type":"text/x-python","patch_set":5,"id":"bae84128_c034c1fc","line":103,"updated":"2016-02-22 07:32:48.000000000","message":"This line can be deleted now; you already set dest_account earlier.","commit_id":"78e1f7b28c81a24d264ae61f50f3199208b36d73"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"209f6d4f58bf93871c0c79de976129299caeaeb7","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                    container_info \u003d get_container_info("},{"line_number":113,"context_line":"                        req.environ, self.app, swift_source\u003d\u0027CQ\u0027)"},{"line_number":114,"context_line":"                finally:"},{"line_number":115,"context_line":"                    req.environ[\u0027PATH_INFO\u0027] \u003d path_info"},{"line_number":116,"context_line":"            if not container_info or not is_success(container_info[\u0027status\u0027]):"},{"line_number":117,"context_line":"                # this will hopefully 404 later"},{"line_number":118,"context_line":"                return self.app"}],"source_content_type":"text/x-python","patch_set":5,"id":"bae84128_8002b909","line":115,"updated":"2016-02-22 07:32:48.000000000","message":"An excellent example of why Takashi was right to want a copied environment! We forgot the try...finally in account_quotas; as a result, if the call to get_account_info fails, logging will have the wrong path for the request.","commit_id":"78e1f7b28c81a24d264ae61f50f3199208b36d73"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"209f6d4f58bf93871c0c79de976129299caeaeb7","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                                              dest_object)"},{"line_number":156,"context_line":"                dest_obj_info \u003d get_object_info(req.environ, self.app,"},{"line_number":157,"context_line":"                                                dest_path)"},{"line_number":158,"context_line":"                if not dest_obj_info or dest_obj_info[\u0027status\u0027] \u003d\u003d 404:"},{"line_number":159,"context_line":"                    new_count \u003d int(container_info[\u0027object_count\u0027]) + 1"},{"line_number":160,"context_line":"                    if int(container_info[\u0027meta\u0027][\u0027quota-count\u0027]) \u003c new_count:"},{"line_number":161,"context_line":"                        return self.bad_response(req, container_info)"}],"source_content_type":"text/x-python","patch_set":5,"id":"bae84128_dbd31237","line":158,"range":{"start_line":158,"start_character":40,"end_line":158,"end_character":63},"updated":"2016-02-22 07:32:48.000000000","message":"Maybe\n\n dest_obj_info[\u0027status\u0027] in (404, 0)\n\n? That `if not info:` clause in get_object_info makes me nervous...\n\nMight be worth waiting for someone else to second the idea, though.","commit_id":"78e1f7b28c81a24d264ae61f50f3199208b36d73"}],"test/unit/common/middleware/test_account_quotas.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"209f6d4f58bf93871c0c79de976129299caeaeb7","unresolved":false,"context_lines":[{"line_number":394,"context_line":"        res \u003d req.get_response(app)"},{"line_number":395,"context_line":"        self.assertEqual(res.status_int, 200)"},{"line_number":396,"context_line":""},{"line_number":397,"context_line":"    def test_not_exceed_bytes_quota_exist_obj(self):"},{"line_number":398,"context_line":"        headers \u003d [(\u0027x-account-bytes-used\u0027, \u00271000\u0027),"},{"line_number":399,"context_line":"                   (\u0027x-account-meta-quota-bytes\u0027, \u00271000\u0027)]"},{"line_number":400,"context_line":"        app \u003d account_quotas.AccountQuotaMiddleware(FakeApp(headers))"}],"source_content_type":"text/x-python","patch_set":5,"id":"bae84128_bb156e9c","line":397,"updated":"2016-02-22 07:32:48.000000000","message":"This test still passes without your change.","commit_id":"78e1f7b28c81a24d264ae61f50f3199208b36d73"}],"test/unit/common/middleware/test_quotas.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"209f6d4f58bf93871c0c79de976129299caeaeb7","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        if env[\u0027REQUEST_METHOD\u0027] \u003d\u003d \"HEAD\" and \\"},{"line_number":47,"context_line":"                env[\u0027PATH_INFO\u0027] \u003d\u003d \u0027/v1/a/c2/o4\u0027:"},{"line_number":48,"context_line":"            env_key \u003d get_object_env_key(\u0027a\u0027, \u0027c2\u0027, \u0027o4\u0027)"},{"line_number":49,"context_line":"            env[env_key] \u003d headers_to_object_info([], 404)"},{"line_number":50,"context_line":"            start_response(\u0027404 Not Found\u0027, [])"},{"line_number":51,"context_line":"        else:"},{"line_number":52,"context_line":"            start_response(\u0027200 OK\u0027, [])"}],"source_content_type":"text/x-python","patch_set":5,"id":"bae84128_3b5afe50","line":49,"updated":"2016-02-22 07:32:48.000000000","message":"I\u0027m not sure I like this style of mocking; I feel like either:\n\n* the tests should be responsible for declaring what will 404 and what will 200 or\n* at the very least, the 404ing should be dependent on something less opaque. Maybe /v1/a/c2/does-not-exist or something?\n\nAlso, we\u0027re never returning a content-length for any responses, which means we don\u0027t have full coverage on the byte-quota changes.\n\nMaybe this should be using test.unit.common.middleware.helpers.FakeSwift instead of it\u0027s own FakeApp? I\u0027m not sure how much scope-creep that adds to this change, though.","commit_id":"78e1f7b28c81a24d264ae61f50f3199208b36d73"},{"author":{"_account_id":8037,"name":"renminmin","email":"rmm0811@gmail.com","username":"renminmin"},"change_message_id":"848f8b2451d8136078cebc5b762a4e16dd392fd7","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        if env[\u0027REQUEST_METHOD\u0027] \u003d\u003d \"HEAD\" and \\"},{"line_number":47,"context_line":"                env[\u0027PATH_INFO\u0027] \u003d\u003d \u0027/v1/a/c2/o4\u0027:"},{"line_number":48,"context_line":"            env_key \u003d get_object_env_key(\u0027a\u0027, \u0027c2\u0027, \u0027o4\u0027)"},{"line_number":49,"context_line":"            env[env_key] \u003d headers_to_object_info([], 404)"},{"line_number":50,"context_line":"            start_response(\u0027404 Not Found\u0027, [])"},{"line_number":51,"context_line":"        else:"},{"line_number":52,"context_line":"            start_response(\u0027200 OK\u0027, [])"}],"source_content_type":"text/x-python","patch_set":5,"id":"bae84128_6e367fe7","line":49,"in_reply_to":"bae84128_3b5afe50","updated":"2016-02-22 10:59:33.000000000","message":"It looks like environ variable with content-length is used for bytes quota test cases.","commit_id":"78e1f7b28c81a24d264ae61f50f3199208b36d73"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d569af3414137ac8c5735af149db45de5c04c8d6","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                env_key \u003d get_object_env_key(env[\u0027PATH_INFO\u0027].split(\"/\")[-3],"},{"line_number":55,"context_line":"                                             env[\u0027PATH_INFO\u0027].split(\"/\")[-2],"},{"line_number":56,"context_line":"                                             \u0027exist\u0027)"},{"line_number":57,"context_line":"                env[env_key] \u003d headers_to_object_info([], 200)"},{"line_number":58,"context_line":"                start_response(\u0027200 OK\u0027, [])"},{"line_number":59,"context_line":"            else:"},{"line_number":60,"context_line":"                start_response(\u0027200 OK\u0027, [])"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba0121b8_bb5f4840","line":57,"updated":"2017-08-15 04:18:11.000000000","message":"Do we need to set this? Can\u0027t the tests populate the cache themselves?","commit_id":"d1db83523dc0abc60083f5202b646bab03938478"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d569af3414137ac8c5735af149db45de5c04c8d6","unresolved":false,"context_lines":[{"line_number":324,"context_line":"        app \u003d container_quotas.ContainerQuotaMiddleware(FakeApp(), {})"},{"line_number":325,"context_line":"        a_c_cache \u003d {\u0027storage_policy\u0027: \u00270\u0027, \u0027meta\u0027: {\u0027quota-count\u0027: \u00271\u0027},"},{"line_number":326,"context_line":"                     \u0027status\u0027: 200, \u0027object_count\u0027: 1}"},{"line_number":327,"context_line":"        a2_c_cache \u003d {\u0027storage_policy\u0027: \u00270\u0027, \u0027meta\u0027: {\u0027quota-count\u0027: \u00272\u0027},"},{"line_number":328,"context_line":"                      \u0027status\u0027: 200, \u0027object_count\u0027: 1}"},{"line_number":329,"context_line":"        req \u003d Request.blank(\u0027/v1/a2/c/exist\u0027,"},{"line_number":330,"context_line":"                            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba0121b8_9b3b6438","line":327,"updated":"2017-08-15 04:18:11.000000000","message":"We swapped quotas here. As a result, the test passes even without your change.\n\n(The quotas were swapped in the test above, too, but then we also switched the roles of a and a2.)","commit_id":"d1db83523dc0abc60083f5202b646bab03938478"}]}
