)]}'
{"swift/obj/server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7ee4eea23395da9cf84e5fe3c7fa3c98ee8bfa7d","unresolved":false,"context_lines":[{"line_number":581,"context_line":"            update_headers[\u0027X-Size\u0027] \u003d orig_metadata["},{"line_number":582,"context_line":"                \u0027X-Object-Sysmeta-Ec-Content-Length\u0027]"},{"line_number":583,"context_line":""},{"line_number":584,"context_line":"        self._check_container_override(update_headers, orig_metadata)"},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"        # object POST updates are PUT to the container server"},{"line_number":587,"context_line":"        self.container_update("}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_a901753a","line":584,"updated":"2016-05-26 21:25:05.000000000","message":"No overrides would ever be set in orig_metadata, though, right? Is this just in anticipation of the work on feature/crypto?","commit_id":"c1b1a5a0ee18776f035bee59e2faff58ec827b14"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"aee30fc7c8b6befb9eb6c67141e1ef8900711d22","unresolved":false,"context_lines":[{"line_number":581,"context_line":"            update_headers[\u0027X-Size\u0027] \u003d orig_metadata["},{"line_number":582,"context_line":"                \u0027X-Object-Sysmeta-Ec-Content-Length\u0027]"},{"line_number":583,"context_line":""},{"line_number":584,"context_line":"        self._check_container_override(update_headers, orig_metadata)"},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"        # object POST updates are PUT to the container server"},{"line_number":587,"context_line":"        self.container_update("}],"source_content_type":"text/x-python","patch_set":1,"id":"9abb7d3a_80094d34","line":584,"in_reply_to":"bab6814e_a901753a","updated":"2016-05-27 16:04:53.000000000","message":"Right. We already have this on feature/crypto [1] where there might be persisted update override headers, and to be honest I probably just copied it across. It could be deleted from this patch.\n\n[1] https://github.com/openstack/swift/blob/b896240e9b3fe0357b5371711103cb96823bd33e/swift/obj/server.py#L596-L596","commit_id":"c1b1a5a0ee18776f035bee59e2faff58ec827b14"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7ee4eea23395da9cf84e5fe3c7fa3c98ee8bfa7d","unresolved":false,"context_lines":[{"line_number":981,"context_line":"                disk_file.delete(req_timestamp)"},{"line_number":982,"context_line":"            except DiskFileNoSpace:"},{"line_number":983,"context_line":"                return HTTPInsufficientStorage(drive\u003ddevice, request\u003drequest)"},{"line_number":984,"context_line":"            self.container_update("},{"line_number":985,"context_line":"                \u0027DELETE\u0027, account, container, obj, request,"},{"line_number":986,"context_line":"                HeaderKeyDict({\u0027x-timestamp\u0027: req_timestamp.internal}),"},{"line_number":987,"context_line":"                device, policy)"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_e487e95e","line":984,"updated":"2016-05-26 21:25:05.000000000","message":"Off-topic: Should we also call _check_container_override before this, at least once the crypto stuff lands? I think for most of the things we send, it shouldn\u0027t really matter; we\u0027re deleting the object, so who cares if we sent the wrong etag? But an overridden size might lead to weird/bad things...","commit_id":"c1b1a5a0ee18776f035bee59e2faff58ec827b14"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"aee30fc7c8b6befb9eb6c67141e1ef8900711d22","unresolved":false,"context_lines":[{"line_number":981,"context_line":"                disk_file.delete(req_timestamp)"},{"line_number":982,"context_line":"            except DiskFileNoSpace:"},{"line_number":983,"context_line":"                return HTTPInsufficientStorage(drive\u003ddevice, request\u003drequest)"},{"line_number":984,"context_line":"            self.container_update("},{"line_number":985,"context_line":"                \u0027DELETE\u0027, account, container, obj, request,"},{"line_number":986,"context_line":"                HeaderKeyDict({\u0027x-timestamp\u0027: req_timestamp.internal}),"},{"line_number":987,"context_line":"                device, policy)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abb7d3a_99954442","line":984,"in_reply_to":"bab6814e_e487e95e","updated":"2016-05-27 16:04:53.000000000","message":"x-etag and x-size aren\u0027t sent at all in delete updates AFAICT, just the x-timestamp. The request headers are only used to figure out the container hosts and ports etc.","commit_id":"c1b1a5a0ee18776f035bee59e2faff58ec827b14"}],"test/probe/common.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7ee4eea23395da9cf84e5fe3c7fa3c98ee8bfa7d","unresolved":false,"context_lines":[{"line_number":448,"context_line":"            [app:proxy-server]"},{"line_number":449,"context_line":"            use \u003d egg:swift#proxy"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"            [filter:copy]"},{"line_number":452,"context_line":"            use \u003d egg:swift#copy"},{"line_number":453,"context_line":"            object_post_as_copy \u003d %s"},{"line_number":454,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_e97c1db7","line":451,"updated":"2016-05-26 21:25:05.000000000","message":"Was it strictly necessary to add the filter, or is this just to be explicit? Wouldn\u0027t it be auto-inserted?","commit_id":"c1b1a5a0ee18776f035bee59e2faff58ec827b14"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"fc9b7c1c405d3935954cc0f31adfa8ccf73d8029","unresolved":false,"context_lines":[{"line_number":448,"context_line":"            [app:proxy-server]"},{"line_number":449,"context_line":"            use \u003d egg:swift#proxy"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"            [filter:copy]"},{"line_number":452,"context_line":"            use \u003d egg:swift#copy"},{"line_number":453,"context_line":"            object_post_as_copy \u003d %s"},{"line_number":454,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9abb7d3a_d0349afc","line":451,"in_reply_to":"9abb7d3a_b94648bd","updated":"2016-05-30 11:46:42.000000000","message":"Ah, yeah, we don\u0027t want to add gate_keeper for internal use case, because it will probably break object-expirer probe again :/","commit_id":"c1b1a5a0ee18776f035bee59e2faff58ec827b14"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"aee30fc7c8b6befb9eb6c67141e1ef8900711d22","unresolved":false,"context_lines":[{"line_number":448,"context_line":"            [app:proxy-server]"},{"line_number":449,"context_line":"            use \u003d egg:swift#proxy"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"            [filter:copy]"},{"line_number":452,"context_line":"            use \u003d egg:swift#copy"},{"line_number":453,"context_line":"            object_post_as_copy \u003d %s"},{"line_number":454,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9abb7d3a_b94648bd","line":451,"in_reply_to":"bab6814e_020ad325","updated":"2016-05-27 16:04:53.000000000","message":"IIRC InternalClient deliberately defaults to not modifying the pipeline so that you know exactly what you get when using an IternalClient instance.\n\nIt\u0027s a good question as to whether allow_modify_pipeline could be set True here, but if we do we\u0027ll get more than just copy inserted...gatekeeper for example - do any probe tests want to inspect x-backend- or x-*-sysmeta headers?","commit_id":"c1b1a5a0ee18776f035bee59e2faff58ec827b14"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"43732e050a3e5c2058d1e46ee6f896dae450e4f8","unresolved":false,"context_lines":[{"line_number":448,"context_line":"            [app:proxy-server]"},{"line_number":449,"context_line":"            use \u003d egg:swift#proxy"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"            [filter:copy]"},{"line_number":452,"context_line":"            use \u003d egg:swift#copy"},{"line_number":453,"context_line":"            object_post_as_copy \u003d %s"},{"line_number":454,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_020ad325","line":451,"in_reply_to":"bab6814e_e97c1db7","updated":"2016-05-27 02:56:53.000000000","message":"Looks like, InternalClient doesn\u0027t allow the piplien modification in default[1], I don\u0027t know the reason though.\n\nAnd that looks to prevent to insert the copy and any other required filters into internal client pipeline[2][3]\n\nI\u0027m not sure why we cannot do just turn on allow_modify_pipeline because I didn\u0027t try it yet but if there is a reason we cannot make it, this way looks reasonable to me.\n\n\n1: https://github.com/openstack/swift/blob/master/swift/common/internal_client.py#L142\n\n2: https://github.com/openstack/swift/blob/master/swift/common/wsgi.py#L388-L390\n\n3: https://github.com/openstack/swift/blob/master/swift/proxy/server.py#L542-L548","commit_id":"c1b1a5a0ee18776f035bee59e2faff58ec827b14"}],"test/probe/test_object_async_update.py":[{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"fc9b7c1c405d3935954cc0f31adfa8ccf73d8029","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.assertTrue(obj in objs)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class TestUpdateOverrides(ReplProbeTest):"},{"line_number":65,"context_line":"    \"\"\""},{"line_number":66,"context_line":"    Use an internal client to PUT an object to proxy server,"},{"line_number":67,"context_line":"    bypassing gatekeeper so that X-Backend- headers can be included."}],"source_content_type":"text/x-python","patch_set":1,"id":"9abb7d3a_5650a25e","line":64,"updated":"2016-05-30 11:46:42.000000000","message":"This seems ECProbeTest because normal replication policy doesn\u0027t update anything via footer (probably except crypt work) right now.","commit_id":"c1b1a5a0ee18776f035bee59e2faff58ec827b14"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b87c34cd620483efc14e253b343cfef742ad97dc","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.assertTrue(obj in objs)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class TestUpdateOverrides(ReplProbeTest):"},{"line_number":65,"context_line":"    \"\"\""},{"line_number":66,"context_line":"    Use an internal client to PUT an object to proxy server,"},{"line_number":67,"context_line":"    bypassing gatekeeper so that X-Backend- headers can be included."}],"source_content_type":"text/x-python","patch_set":1,"id":"9abb7d3a_8a66d64e","line":64,"in_reply_to":"9abb7d3a_5650a25e","updated":"2016-06-01 13:30:36.000000000","message":"I think this test (and the override headers feature) was added in anticipation of EC, so the test is \"generic\" verification that override headers are passed to the container servers.","commit_id":"c1b1a5a0ee18776f035bee59e2faff58ec827b14"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7ee4eea23395da9cf84e5fe3c7fa3c98ee8bfa7d","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    \"\"\""},{"line_number":71,"context_line":"    def test_update_during_PUT(self):"},{"line_number":72,"context_line":"        # verify that update sent during a PUT has override values"},{"line_number":73,"context_line":"        int_client \u003d self.make_internal_client()"},{"line_number":74,"context_line":"        headers \u003d {"},{"line_number":75,"context_line":"            \u0027Content-Type\u0027: \u0027text/plain\u0027,"},{"line_number":76,"context_line":"            \u0027X-Backend-Container-Update-Override-Etag\u0027: \u0027override-etag\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_bf1deabf","line":73,"range":{"start_line":73,"start_character":26,"end_line":73,"end_character":46},"updated":"2016-05-26 21:25:05.000000000","message":"Did the old code pre-date make_internal_client or something?","commit_id":"c1b1a5a0ee18776f035bee59e2faff58ec827b14"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"aee30fc7c8b6befb9eb6c67141e1ef8900711d22","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    \"\"\""},{"line_number":71,"context_line":"    def test_update_during_PUT(self):"},{"line_number":72,"context_line":"        # verify that update sent during a PUT has override values"},{"line_number":73,"context_line":"        int_client \u003d self.make_internal_client()"},{"line_number":74,"context_line":"        headers \u003d {"},{"line_number":75,"context_line":"            \u0027Content-Type\u0027: \u0027text/plain\u0027,"},{"line_number":76,"context_line":"            \u0027X-Backend-Container-Update-Override-Etag\u0027: \u0027override-etag\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abb7d3a_79ad0031","line":73,"range":{"start_line":73,"start_character":26,"end_line":73,"end_character":46},"in_reply_to":"bab6814e_bf1deabf","updated":"2016-05-27 16:04:53.000000000","message":"I believe so. This test came in commit 12e9826dbd971c500c00958b16f707b639b4c31e\n\"Enable override of container update headers\"\n\nand I don\u0027t see make_internal_client in common.py there.","commit_id":"c1b1a5a0ee18776f035bee59e2faff58ec827b14"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"fc9b7c1c405d3935954cc0f31adfa8ccf73d8029","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        # put an object while one container server is stopped so that we force"},{"line_number":119,"context_line":"        # an async update to it"},{"line_number":120,"context_line":"        kill_server((cnodes[0][\u0027ip\u0027], cnodes[0][\u0027port\u0027]),"},{"line_number":121,"context_line":"                    self.ipport2server, self.pids)"},{"line_number":122,"context_line":"        content \u003d u\u0027stuff\u0027"},{"line_number":123,"context_line":"        client.put_object(self.url, self.token, \u0027c1\u0027, \u0027o1\u0027, contents\u003dcontent)"},{"line_number":124,"context_line":"        meta \u003d client.head_object(self.url, self.token, \u0027c1\u0027, \u0027o1\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abb7d3a_a1470a4a","line":121,"updated":"2016-05-30 11:46:42.000000000","message":"Looks like pids is not used anymore in the kill_server func. That might be ok in follow up though.","commit_id":"c1b1a5a0ee18776f035bee59e2faff58ec827b14"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b87c34cd620483efc14e253b343cfef742ad97dc","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        # put an object while one container server is stopped so that we force"},{"line_number":119,"context_line":"        # an async update to it"},{"line_number":120,"context_line":"        kill_server((cnodes[0][\u0027ip\u0027], cnodes[0][\u0027port\u0027]),"},{"line_number":121,"context_line":"                    self.ipport2server, self.pids)"},{"line_number":122,"context_line":"        content \u003d u\u0027stuff\u0027"},{"line_number":123,"context_line":"        client.put_object(self.url, self.token, \u0027c1\u0027, \u0027o1\u0027, contents\u003dcontent)"},{"line_number":124,"context_line":"        meta \u003d client.head_object(self.url, self.token, \u0027c1\u0027, \u0027o1\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abb7d3a_c5e9f1b8","line":121,"in_reply_to":"9abb7d3a_a1470a4a","updated":"2016-06-01 13:30:36.000000000","message":"Agree. It\u0027s not an optional arg so I have to pass a value here. Should be fixed in a follow up, it touches other unrelated code too.","commit_id":"c1b1a5a0ee18776f035bee59e2faff58ec827b14"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"fc9b7c1c405d3935954cc0f31adfa8ccf73d8029","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        obj \u003d direct_client.direct_get_container("},{"line_number":138,"context_line":"            cnodes[0], cpart, self.account, \u0027c1\u0027)[1][0]"},{"line_number":139,"context_line":"        self.assertEqual(meta[\u0027etag\u0027], obj[\u0027hash\u0027])"},{"line_number":140,"context_line":"        self.assertEqual(len(content), obj[\u0027bytes\u0027])"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def test_update_during_POST_only(self):"},{"line_number":143,"context_line":"        # verify correct update values when PUT update is missed but then a"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abb7d3a_619242a1","line":140,"updated":"2016-05-30 11:46:42.000000000","message":"Probably, this test is a sanity for both Repl and EC. And this doesn\u0027t fail without this patch\u0027s fix. IMO it\u0027s better to locate those tests and test_during_PUT to where it can be run-able for both REPL/EC policies to clarify when those situation happen. \n\nI wrote up the draft here[1]. How do you think of it?\n\n1: https://review.openstack.org/322773","commit_id":"c1b1a5a0ee18776f035bee59e2faff58ec827b14"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"d91dc181a4c26fbceb7acb49597fe1a70adb883b","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        obj \u003d direct_client.direct_get_container("},{"line_number":138,"context_line":"            cnodes[0], cpart, self.account, \u0027c1\u0027)[1][0]"},{"line_number":139,"context_line":"        self.assertEqual(meta[\u0027etag\u0027], obj[\u0027hash\u0027])"},{"line_number":140,"context_line":"        self.assertEqual(len(content), obj[\u0027bytes\u0027])"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def test_update_during_POST_only(self):"},{"line_number":143,"context_line":"        # verify correct update values when PUT update is missed but then a"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abb7d3a_50af617c","line":140,"in_reply_to":"9abb7d3a_297a5788","updated":"2016-06-01 21:07:07.000000000","message":"Yup, that\u0027s okay to be a follow-on.","commit_id":"c1b1a5a0ee18776f035bee59e2faff58ec827b14"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b87c34cd620483efc14e253b343cfef742ad97dc","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        obj \u003d direct_client.direct_get_container("},{"line_number":138,"context_line":"            cnodes[0], cpart, self.account, \u0027c1\u0027)[1][0]"},{"line_number":139,"context_line":"        self.assertEqual(meta[\u0027etag\u0027], obj[\u0027hash\u0027])"},{"line_number":140,"context_line":"        self.assertEqual(len(content), obj[\u0027bytes\u0027])"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def test_update_during_POST_only(self):"},{"line_number":143,"context_line":"        # verify correct update values when PUT update is missed but then a"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abb7d3a_297a5788","line":140,"in_reply_to":"9abb7d3a_619242a1","updated":"2016-06-01 13:30:36.000000000","message":"The existing test test_update_during_PUT tests that synchronous update during a PUT. Here I added some other test cases that were not already covered but not fixed by this bug. As you point out above, EC is the obvious case where override headers are set so using an EC policy is (a) realistic and (b) provides override header by default.\n\nWe could create a mixin with ALL the tests and run then with EC and Repl policies, with the Repl case using artificial override headers.\n\nWould you be happy for that to be a follow-on change?","commit_id":"c1b1a5a0ee18776f035bee59e2faff58ec827b14"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7ee4eea23395da9cf84e5fe3c7fa3c98ee8bfa7d","unresolved":false,"context_lines":[{"line_number":177,"context_line":"        self.assertEqual(meta[\u0027etag\u0027], obj[\u0027hash\u0027])"},{"line_number":178,"context_line":"        self.assertEqual(len(content), obj[\u0027bytes\u0027])"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        # Run the object-updaters to send the async pending from the PUT"},{"line_number":181,"context_line":"        Manager([\u0027object-updater\u0027]).once()"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        # check container listing metadata is still correct"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_9febc6db","line":180,"updated":"2016-05-26 21:25:05.000000000","message":"Does this give us anything that isn\u0027t already covered by test_async_updates_after_PUT_and_POST?","commit_id":"c1b1a5a0ee18776f035bee59e2faff58ec827b14"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"fc9b7c1c405d3935954cc0f31adfa8ccf73d8029","unresolved":false,"context_lines":[{"line_number":177,"context_line":"        self.assertEqual(meta[\u0027etag\u0027], obj[\u0027hash\u0027])"},{"line_number":178,"context_line":"        self.assertEqual(len(content), obj[\u0027bytes\u0027])"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        # Run the object-updaters to send the async pending from the PUT"},{"line_number":181,"context_line":"        Manager([\u0027object-updater\u0027]).once()"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        # check container listing metadata is still correct"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abb7d3a_c11b2e1a","line":180,"in_reply_to":"9abb7d3a_f451f70f","updated":"2016-05-30 11:46:42.000000000","message":"That looks fine to me.","commit_id":"c1b1a5a0ee18776f035bee59e2faff58ec827b14"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"aee30fc7c8b6befb9eb6c67141e1ef8900711d22","unresolved":false,"context_lines":[{"line_number":177,"context_line":"        self.assertEqual(meta[\u0027etag\u0027], obj[\u0027hash\u0027])"},{"line_number":178,"context_line":"        self.assertEqual(len(content), obj[\u0027bytes\u0027])"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        # Run the object-updaters to send the async pending from the PUT"},{"line_number":181,"context_line":"        Manager([\u0027object-updater\u0027]).once()"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        # check container listing metadata is still correct"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abb7d3a_f451f70f","line":180,"in_reply_to":"bab6814e_9febc6db","updated":"2016-05-27 16:04:53.000000000","message":"In this test the POST update happens synchronously, the async PUT update comes along after it. So we\u0027re checking that the out-of-order updates don\u0027t screw up the container row.\n\nIn test_async_updates_after_PUT_and_POST the updates from PUT and POST happen in the original order but are both async.\n\nThe reason for testing both sync and async updates is to verify that the stashing of an update to file then sending async is correct.","commit_id":"c1b1a5a0ee18776f035bee59e2faff58ec827b14"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7ee4eea23395da9cf84e5fe3c7fa3c98ee8bfa7d","unresolved":false,"context_lines":[{"line_number":516,"context_line":"            # EC fragments will typically have a different size to the body and"},{"line_number":517,"context_line":"            # for small bodies the fragments may be longer. For this test all"},{"line_number":518,"context_line":"            # that matters is that the fragment and body lengths differ."},{"line_number":519,"context_line":"            body \u003d body + \u0027ec_overhead\u0027"},{"line_number":520,"context_line":"            headers[\u0027X-Backend-Container-Update-Override-Etag\u0027] \u003d update_etag"},{"line_number":521,"context_line":"            headers[\u0027X-Backend-Container-Update-Override-Size\u0027] \u003d \u00274\u0027"},{"line_number":522,"context_line":"            headers[\u0027X-Object-Sysmeta-Ec-Etag\u0027] \u003d update_etag"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_09052113","line":519,"updated":"2016-05-26 21:25:05.000000000","message":"nit: could just use +\u003d","commit_id":"c1b1a5a0ee18776f035bee59e2faff58ec827b14"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"aee30fc7c8b6befb9eb6c67141e1ef8900711d22","unresolved":false,"context_lines":[{"line_number":516,"context_line":"            # EC fragments will typically have a different size to the body and"},{"line_number":517,"context_line":"            # for small bodies the fragments may be longer. For this test all"},{"line_number":518,"context_line":"            # that matters is that the fragment and body lengths differ."},{"line_number":519,"context_line":"            body \u003d body + \u0027ec_overhead\u0027"},{"line_number":520,"context_line":"            headers[\u0027X-Backend-Container-Update-Override-Etag\u0027] \u003d update_etag"},{"line_number":521,"context_line":"            headers[\u0027X-Backend-Container-Update-Override-Size\u0027] \u003d \u00274\u0027"},{"line_number":522,"context_line":"            headers[\u0027X-Object-Sysmeta-Ec-Etag\u0027] \u003d update_etag"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abb7d3a_746507e0","line":519,"in_reply_to":"bab6814e_09052113","updated":"2016-05-27 16:04:53.000000000","message":"duh! yes.","commit_id":"c1b1a5a0ee18776f035bee59e2faff58ec827b14"}]}
