)]}'
{"swift/common/utils.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e0dfe9450503d5f8f2ad6b580d44450d163f4efd","unresolved":false,"context_lines":[{"line_number":5696,"context_line":"        with the format of etiher header"},{"line_number":5697,"context_line":"    \"\"\""},{"line_number":5698,"context_line":"    headers \u003d HeaderKeyDict(response.getheaders())"},{"line_number":5699,"context_line":"    if \u0027Quoted-Location\u0027 in headers:"},{"line_number":5700,"context_line":"        location \u003d unquote(urlparse(headers[\u0027Quoted-Location\u0027]).path)"},{"line_number":5701,"context_line":"    elif \u0027Location\u0027 in headers:"},{"line_number":5702,"context_line":"        location \u003d urlparse(headers[\u0027Location\u0027]).path"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_eaf0d8fe","line":5699,"updated":"2019-12-30 17:56:55.000000000","message":"used by object-server and object-updater\n\nmaybe a test:\n\ndiff --git a/test/unit/common/test_utils.py b/test/unit/common/test_utils.py\nindex 9d4657cca..7930771f8 100644\n--- a/test/unit/common/test_utils.py\n+++ b/test/unit/common/test_utils.py\n@@ -4267,6 +4267,14 @@ cluster_dfw1 \u003d http://dfw1.host/v1/\n         self.assertEqual(\u0027a/c\u0027, path)\n         self.assertEqual(ts_now, ts)\n \n+        headers \u003d {\u0027Quoted-Location\u0027: \u0027/a/c\u0027,\n+                   \u0027Location\u0027: \u0027/a/foo\u0027,\n+                   \u0027X-Backend-Redirect-Timestamp\u0027: ts_now.internal}\n+        response \u003d FakeResponse(200, headers, b\u0027\u0027)\n+        path, ts \u003d utils.get_redirect_data(response)\n+        self.assertEqual(\u0027a/c\u0027, path)\n+        self.assertEqual(ts_now, ts)\n+\n         def do_test(headers):\n             response \u003d FakeResponse(200, headers, b\u0027\u0027)\n             with self.assertRaises(ValueError) as cm:","commit_id":"72b96846acdf92a01141aecd84b8657796f3d293"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5a5cf836f9c81f464163818377b165b4885a2516","unresolved":false,"context_lines":[{"line_number":5701,"context_line":"    location \u003d urlparse(headers[\u0027Location\u0027]).path"},{"line_number":5702,"context_line":"    if config_true_value(headers.get(\u0027X-Backend-Location-Is-Quoted\u0027,"},{"line_number":5703,"context_line":"                                     \u0027false\u0027)):"},{"line_number":5704,"context_line":"        location \u003d unquote(location)"},{"line_number":5705,"context_line":"    account, container, _junk \u003d split_path(location, 2, 3, True)"},{"line_number":5706,"context_line":"    timestamp_val \u003d headers.get(\u0027X-Backend-Redirect-Timestamp\u0027)"},{"line_number":5707,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_7fbd6cd5","line":5704,"updated":"2020-01-05 18:52:31.000000000","message":"so our clients only unquote when they *know* they\u0027re talking to an updated server, essentially retaining the old behavior\n\nit\u0027s a little unfortunate we can\u0027t assume server\u0027s are doing the right thing with this standard header \n\nI also don\u0027t love the implication that this could ever be \u0027false\u0027 on the wire","commit_id":"3f8890701259e24ef81c93947faf2d4ccf223c5f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6187f32cf31ba845454183c5466459884c173e92","unresolved":false,"context_lines":[{"line_number":5701,"context_line":"    location \u003d urlparse(headers[\u0027Location\u0027]).path"},{"line_number":5702,"context_line":"    if config_true_value(headers.get(\u0027X-Backend-Location-Is-Quoted\u0027,"},{"line_number":5703,"context_line":"                                     \u0027false\u0027)):"},{"line_number":5704,"context_line":"        location \u003d unquote(location)"},{"line_number":5705,"context_line":"    account, container, _junk \u003d split_path(location, 2, 3, True)"},{"line_number":5706,"context_line":"    timestamp_val \u003d headers.get(\u0027X-Backend-Redirect-Timestamp\u0027)"},{"line_number":5707,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_f1bd01b2","line":5704,"in_reply_to":"3fa7e38b_7fbd6cd5","updated":"2020-01-07 01:41:24.000000000","message":"Meh, the same\u0027s true of x-backend-accept-quoted-location or x-backend-accept-redirect -- we should only ever be saying \"yes, this *is* a thing\" and its the absence that makes it false.","commit_id":"3f8890701259e24ef81c93947faf2d4ccf223c5f"}],"swift/container/backend.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"709ba9a775dba9b435434719559291a73f97837f","unresolved":false,"context_lines":[{"line_number":2040,"context_line":"        ``container`` attributes respectively."},{"line_number":2041,"context_line":""},{"line_number":2042,"context_line":"        \"\"\""},{"line_number":2043,"context_line":"        path \u003d self.get_sharding_sysmeta(\u0027Root\u0027)"},{"line_number":2044,"context_line":"        if not path:"},{"line_number":2045,"context_line":"            # Ensure account/container get populated"},{"line_number":2046,"context_line":"            self._populate_instance_cache()"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_a429f09c","side":"PARENT","line":2043,"updated":"2019-12-19 19:06:37.000000000","message":"oh we *do* use the sysmeta\n\nthis returns None if the key isn\u0027t found","commit_id":"1f7b97ec0f49b26b8a33d67cf924f5ab8345a614"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"709ba9a775dba9b435434719559291a73f97837f","unresolved":false,"context_lines":[{"line_number":2049,"context_line":"            path \u003d self.get_sharding_sysmeta(\u0027Root\u0027)"},{"line_number":2050,"context_line":"            hdr \u003d \u0027X-Container-Sysmeta-Shard-Root\u0027"},{"line_number":2051,"context_line":""},{"line_number":2052,"context_line":"        if not path:"},{"line_number":2053,"context_line":"            # Ensure account/container get populated"},{"line_number":2054,"context_line":"            self._populate_instance_cache()"},{"line_number":2055,"context_line":"            self._root_account \u003d self.account"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_67321ac3","line":2052,"updated":"2019-12-19 19:06:37.000000000","message":"so old code would \"handle\" the not path case by... updating itself?  does this code make sense?","commit_id":"73b0d47c70bb524bc8cbbacd5701a36ff0fa9212"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d2f849bbeda22cb7f91ba645657a57edbe5b545b","unresolved":false,"context_lines":[{"line_number":2049,"context_line":"            path \u003d self.get_sharding_sysmeta(\u0027Root\u0027)"},{"line_number":2050,"context_line":"            hdr \u003d \u0027X-Container-Sysmeta-Shard-Root\u0027"},{"line_number":2051,"context_line":""},{"line_number":2052,"context_line":"        if not path:"},{"line_number":2053,"context_line":"            # Ensure account/container get populated"},{"line_number":2054,"context_line":"            self._populate_instance_cache()"},{"line_number":2055,"context_line":"            self._root_account \u003d self.account"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_4d005fb2","line":2052,"in_reply_to":"3fa7e38b_67321ac3","updated":"2019-12-19 19:22:53.000000000","message":"If we don\u0027t have sysmeta telling us \"hey, your root is over *here*\", we kinda have to assume that we *are* a root container.\n\nThis is why I got nervous about *not* continuing to set the old sysmeta :-/","commit_id":"73b0d47c70bb524bc8cbbacd5701a36ff0fa9212"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e0dfe9450503d5f8f2ad6b580d44450d163f4efd","unresolved":false,"context_lines":[{"line_number":2047,"context_line":"            path \u003d unquote(path)"},{"line_number":2048,"context_line":"        else:"},{"line_number":2049,"context_line":"            path \u003d self.get_sharding_sysmeta(\u0027Root\u0027)"},{"line_number":2050,"context_line":"            hdr \u003d \u0027X-Container-Sysmeta-Shard-Root\u0027"},{"line_number":2051,"context_line":""},{"line_number":2052,"context_line":"        if not path:"},{"line_number":2053,"context_line":"            # Ensure account/container get populated"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_8aab64d5","line":2050,"updated":"2019-12-30 17:56:55.000000000","message":"so this name is really just used in error reporting below, this is just a read from existing metadata, we should definitely fall back on read.","commit_id":"72b96846acdf92a01141aecd84b8657796f3d293"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5a5cf836f9c81f464163818377b165b4885a2516","unresolved":false,"context_lines":[{"line_number":2047,"context_line":"            path \u003d unquote(path)"},{"line_number":2048,"context_line":"        else:"},{"line_number":2049,"context_line":"            path \u003d self.get_sharding_sysmeta(\u0027Root\u0027)"},{"line_number":2050,"context_line":"            hdr \u003d \u0027X-Container-Sysmeta-Shard-Root\u0027"},{"line_number":2051,"context_line":""},{"line_number":2052,"context_line":"        if not path:"},{"line_number":2053,"context_line":"            # Ensure account/container get populated"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_bfbe84cb","line":2050,"updated":"2020-01-05 18:52:31.000000000","message":"this seems fine, it\u0027s a little unfortunate to have to spell out the header name twice just to log an exception","commit_id":"3f8890701259e24ef81c93947faf2d4ccf223c5f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5a5cf836f9c81f464163818377b165b4885a2516","unresolved":false,"context_lines":[{"line_number":2061,"context_line":"                \u0027/\u0027 + path, 2, 2)"},{"line_number":2062,"context_line":"        except ValueError:"},{"line_number":2063,"context_line":"            raise ValueError(\"Expected %s to be of the form \""},{"line_number":2064,"context_line":"                             \"\u0027account/container\u0027, got %r\" % (hdr, path))"},{"line_number":2065,"context_line":""},{"line_number":2066,"context_line":"    @property"},{"line_number":2067,"context_line":"    def root_account(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_7fa24caf","line":2064,"updated":"2020-01-05 18:52:31.000000000","message":"I think it\u0027d be sufficient to say \"Expected shard root to be of the form...\" the details of what header/sysmeta is more of an implementation detail whatever the problem here it\u0027s something with the *value* not the key","commit_id":"3f8890701259e24ef81c93947faf2d4ccf223c5f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6187f32cf31ba845454183c5466459884c173e92","unresolved":false,"context_lines":[{"line_number":2061,"context_line":"                \u0027/\u0027 + path, 2, 2)"},{"line_number":2062,"context_line":"        except ValueError:"},{"line_number":2063,"context_line":"            raise ValueError(\"Expected %s to be of the form \""},{"line_number":2064,"context_line":"                             \"\u0027account/container\u0027, got %r\" % (hdr, path))"},{"line_number":2065,"context_line":""},{"line_number":2066,"context_line":"    @property"},{"line_number":2067,"context_line":"    def root_account(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_f1a421a6","line":2064,"in_reply_to":"3fa7e38b_7fa24caf","updated":"2020-01-07 01:41:24.000000000","message":"*shrug* IDK -- I figure the more (and more precise) context I can give for this sort of situation, the better.","commit_id":"3f8890701259e24ef81c93947faf2d4ccf223c5f"}],"swift/container/server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e0dfe9450503d5f8f2ad6b580d44450d163f4efd","unresolved":false,"context_lines":[{"line_number":329,"context_line":"                   \u0027X-Backend-Redirect-Timestamp\u0027:"},{"line_number":330,"context_line":"                       containing_range.timestamp.internal}"},{"line_number":331,"context_line":"        if location \u003d\u003d quote(location):"},{"line_number":332,"context_line":"            headers[\u0027Location\u0027] \u003d location"},{"line_number":333,"context_line":"        else:"},{"line_number":334,"context_line":"            # Make sure any old code (that doesn\u0027t know about Quoted-Location)"},{"line_number":335,"context_line":"            # blows up good"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_0ae6944b","line":332,"updated":"2019-12-30 17:56:55.000000000","message":"so but this is a standard location for redirects, and it probably should have always been quoted","commit_id":"72b96846acdf92a01141aecd84b8657796f3d293"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e0dfe9450503d5f8f2ad6b580d44450d163f4efd","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        else:"},{"line_number":334,"context_line":"            # Make sure any old code (that doesn\u0027t know about Quoted-Location)"},{"line_number":335,"context_line":"            # blows up good"},{"line_number":336,"context_line":"            headers[\u0027Location\u0027] \u003d \u0027see-bug-1856894\u0027"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"        # we do not want the host added to the location"},{"line_number":339,"context_line":"        req.environ[\u0027swift.leave_relative_location\u0027] \u003d True"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_caeb9c0e","line":336,"updated":"2019-12-30 17:56:55.000000000","message":"yuk, this seems unconventional, it might be \"fine\" since it\u0027s a backend only API... but it still could be quite surprising to a sysadmin trying to put together a quick and dirty direct client script","commit_id":"72b96846acdf92a01141aecd84b8657796f3d293"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5a5cf836f9c81f464163818377b165b4885a2516","unresolved":false,"context_lines":[{"line_number":338,"context_line":"            return None"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        headers \u003d {\u0027Location\u0027: quote(location),"},{"line_number":341,"context_line":"                   \u0027X-Backend-Location-Is-Quoted\u0027: \u0027true\u0027,"},{"line_number":342,"context_line":"                   \u0027X-Backend-Redirect-Timestamp\u0027:"},{"line_number":343,"context_line":"                       containing_range.timestamp.internal}"},{"line_number":344,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_3fa85489","line":341,"updated":"2020-01-05 18:52:31.000000000","message":"I really like that new code will never send an unquoted location!!!","commit_id":"3f8890701259e24ef81c93947faf2d4ccf223c5f"}],"swift/container/sharder.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"6a08e0daa31fb51cdaed183b87997c46732cdb63","unresolved":false,"context_lines":[{"line_number":657,"context_line":"        shard_broker.get_info()"},{"line_number":658,"context_line":"        shard_broker.merge_shard_ranges(shard_range)"},{"line_number":659,"context_line":"        shard_broker.set_sharding_sysmeta(\u0027Quoted-Root\u0027, quote(root_path))"},{"line_number":660,"context_line":"        if root_path \u003d\u003d quote(root_path):"},{"line_number":661,"context_line":"            # *If* it seems safe, set the old style meta, too"},{"line_number":662,"context_line":"            shard_broker.set_sharding_sysmeta(\u0027Root\u0027, root_path)"},{"line_number":663,"context_line":"        shard_broker.update_metadata({"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_28994e6a","line":660,"updated":"2019-12-20 01:54:22.000000000","message":"I probably haven\u0027t thought about this enough, but currently root_path isn\u0027t quoted, or rather any existing sysmeta-shard-root\u0027s. So would unquote be harmless to existing root_paths in a cluster. \n\nI guess what I wonder is if we could just start quoting root_paths in \u0027Root\u0027. And just always unquote it when we want to use it, couldn\u0027t we just keep using \u0027Root\u0027 and save metadata item?\nI mean, if pre null namespace containers where all valid and didn\u0027t need quoting, the unquoting will leave them untouched, then surely all we need to do is start quoting things in Root. Any meta data (old roots) will hopefully be harmless, as they shouldn\u0027t have needed to be quoted, so unquote I hope is harmless to them.\n\nOr is the problem, there are now already clusters out there that may need some cleaning up?","commit_id":"73b0d47c70bb524bc8cbbacd5701a36ff0fa9212"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6f17f9b38f297e372a3ce58955f63a9fae240e86","unresolved":false,"context_lines":[{"line_number":657,"context_line":"        shard_broker.get_info()"},{"line_number":658,"context_line":"        shard_broker.merge_shard_ranges(shard_range)"},{"line_number":659,"context_line":"        shard_broker.set_sharding_sysmeta(\u0027Quoted-Root\u0027, quote(root_path))"},{"line_number":660,"context_line":"        if root_path \u003d\u003d quote(root_path):"},{"line_number":661,"context_line":"            # *If* it seems safe, set the old style meta, too"},{"line_number":662,"context_line":"            shard_broker.set_sharding_sysmeta(\u0027Root\u0027, root_path)"},{"line_number":663,"context_line":"        shard_broker.update_metadata({"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_fb78de2c","line":660,"in_reply_to":"3fa7e38b_28994e6a","updated":"2019-12-20 04:33:18.000000000","message":"The concern would be containers where\n\n unquote(name) !\u003d name\n\nlike \"100%Beef\" -- old code would send exactly that while new code would send \"100%25Beef\". On the *receiving* side, old code should be fine with the old value, but the new one would get misdirected. Conversely, new code would most likely hit an error trying to work with b\"100\\xbeef\" -- but there are even more pathological examples where unquote(name) is actually valid UTF-8, and then you\u0027re in similar trouble.\n\nI have *no idea* whether there are actually sharded containers out there in the wild where this would be a problem -- I did it this way to be defensive *just in case* there are.","commit_id":"73b0d47c70bb524bc8cbbacd5701a36ff0fa9212"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"709ba9a775dba9b435434719559291a73f97837f","unresolved":false,"context_lines":[{"line_number":659,"context_line":"        shard_broker.set_sharding_sysmeta(\u0027Quoted-Root\u0027, quote(root_path))"},{"line_number":660,"context_line":"        if root_path \u003d\u003d quote(root_path):"},{"line_number":661,"context_line":"            # *If* it seems safe, set the old style meta, too"},{"line_number":662,"context_line":"            shard_broker.set_sharding_sysmeta(\u0027Root\u0027, root_path)"},{"line_number":663,"context_line":"        shard_broker.update_metadata({"},{"line_number":664,"context_line":"            \u0027X-Container-Sysmeta-Sharding\u0027:"},{"line_number":665,"context_line":"                (\u0027True\u0027, Timestamp.now().internal)})"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_24418064","line":662,"updated":"2019-12-19 19:06:37.000000000","message":"I\u0027m a little skeptical of including this going forward for always ... only but just \"some of the time\"\n\nfor more transient transmission based stuff it might help with rolling upgrades, but a failure/exception until upgrade might be better... dunno","commit_id":"73b0d47c70bb524bc8cbbacd5701a36ff0fa9212"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d2f849bbeda22cb7f91ba645657a57edbe5b545b","unresolved":false,"context_lines":[{"line_number":659,"context_line":"        shard_broker.set_sharding_sysmeta(\u0027Quoted-Root\u0027, quote(root_path))"},{"line_number":660,"context_line":"        if root_path \u003d\u003d quote(root_path):"},{"line_number":661,"context_line":"            # *If* it seems safe, set the old style meta, too"},{"line_number":662,"context_line":"            shard_broker.set_sharding_sysmeta(\u0027Root\u0027, root_path)"},{"line_number":663,"context_line":"        shard_broker.update_metadata({"},{"line_number":664,"context_line":"            \u0027X-Container-Sysmeta-Sharding\u0027:"},{"line_number":665,"context_line":"                (\u0027True\u0027, Timestamp.now().internal)})"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_eddcab44","line":662,"in_reply_to":"3fa7e38b_24418064","updated":"2019-12-19 19:22:53.000000000","message":"FWIW, I originally *didn\u0027t* write this down... then as I was about to submit, I got to thinking some more about the rolling upgrade situation, and it seemed like making sure old code knows that shards are shards surely must be a good idea.\n\n*Maybe* we could set this more often than we do? Something like\n\n if not any(c in (\u0027\\n\u0027, \u0027\\0\u0027) for c in root_path) and\n         not root_path.endswith(\u0027\\\\\u0027):\n     shard_broker.set_sharding_sysmeta(\u0027Root\u0027, root_path)\n\nIDK *for sure* that there are any other problematic characters...","commit_id":"73b0d47c70bb524bc8cbbacd5701a36ff0fa9212"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"709ba9a775dba9b435434719559291a73f97837f","unresolved":false,"context_lines":[{"line_number":1135,"context_line":"                \u0027X-Container-Sysmeta-Sharding\u0027: True}"},{"line_number":1136,"context_line":"            if broker.root_path \u003d\u003d quote(broker.root_path):"},{"line_number":1137,"context_line":"                # *If* it seems safe, set the old-style meta, too"},{"line_number":1138,"context_line":"                headers[\u0027X-Container-Sysmeta-Shard-Root\u0027] \u003d broker.root_path"},{"line_number":1139,"context_line":"            success \u003d self._send_shard_ranges("},{"line_number":1140,"context_line":"                shard_range.account, shard_range.container,"},{"line_number":1141,"context_line":"                [shard_range], headers\u003dheaders)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_e45a884f","line":1138,"updated":"2019-12-19 19:06:37.000000000","message":"this makes senes - could be helpful during rolling upgrade if you\u0027re not already effected by the problem :cross_fingers:","commit_id":"73b0d47c70bb524bc8cbbacd5701a36ff0fa9212"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d2f849bbeda22cb7f91ba645657a57edbe5b545b","unresolved":false,"context_lines":[{"line_number":1135,"context_line":"                \u0027X-Container-Sysmeta-Sharding\u0027: True}"},{"line_number":1136,"context_line":"            if broker.root_path \u003d\u003d quote(broker.root_path):"},{"line_number":1137,"context_line":"                # *If* it seems safe, set the old-style meta, too"},{"line_number":1138,"context_line":"                headers[\u0027X-Container-Sysmeta-Shard-Root\u0027] \u003d broker.root_path"},{"line_number":1139,"context_line":"            success \u003d self._send_shard_ranges("},{"line_number":1140,"context_line":"                shard_range.account, shard_range.container,"},{"line_number":1141,"context_line":"                [shard_range], headers\u003dheaders)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_8dc41762","line":1138,"in_reply_to":"3fa7e38b_e45a884f","updated":"2019-12-19 19:22:53.000000000","message":"So wait -- do we like the idea, or are we skeptical of it?","commit_id":"73b0d47c70bb524bc8cbbacd5701a36ff0fa9212"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e0dfe9450503d5f8f2ad6b580d44450d163f4efd","unresolved":false,"context_lines":[{"line_number":663,"context_line":"        else:"},{"line_number":664,"context_line":"            # Make sure any old code (that doesn\u0027t know about Quoted-Root)"},{"line_number":665,"context_line":"            # blows up good"},{"line_number":666,"context_line":"            shard_broker.set_sharding_sysmeta(\u0027Root\u0027, \u0027see-bug-1856894\u0027)"},{"line_number":667,"context_line":"        shard_broker.update_metadata({"},{"line_number":668,"context_line":"            \u0027X-Container-Sysmeta-Sharding\u0027:"},{"line_number":669,"context_line":"                (\u0027True\u0027, Timestamp.now().internal)})"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_4ab1ec44","line":666,"updated":"2019-12-30 17:56:55.000000000","message":"so this is the only place we write the old metadata - it will only be \"usable\" when it\u0027s equivalent to the quoted value, but we\u0027ll always write down *something*","commit_id":"72b96846acdf92a01141aecd84b8657796f3d293"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5a5cf836f9c81f464163818377b165b4885a2516","unresolved":false,"context_lines":[{"line_number":1145,"context_line":"            # (or possibly some other characters). We consciously *don\u0027t* make"},{"line_number":1146,"context_line":"            # any attempt to set the old meta; during an upgrade, some shards"},{"line_number":1147,"context_line":"            # may think they are in fact roots, but it cleans up well enough"},{"line_number":1148,"context_line":"            # once everyone\u0027s upgraded."},{"line_number":1149,"context_line":"            success \u003d self._send_shard_ranges("},{"line_number":1150,"context_line":"                shard_range.account, shard_range.container,"},{"line_number":1151,"context_line":"                [shard_range], headers\u003dheaders)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_df902052","line":1148,"updated":"2020-01-05 18:52:31.000000000","message":"I don\u0027t like having the same detailed comment duplicated in two places.\n\nAll comments are a maintenance burden when your refactor - we should try to limit ourselves to minimal necessity","commit_id":"3f8890701259e24ef81c93947faf2d4ccf223c5f"}],"swift/obj/server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5a5cf836f9c81f464163818377b165b4885a2516","unresolved":false,"context_lines":[{"line_number":383,"context_line":"        if contpath:"},{"line_number":384,"context_line":"            contpath \u003d unquote(contpath)"},{"line_number":385,"context_line":"        else:"},{"line_number":386,"context_line":"            contpath \u003d headers_in.get(\u0027X-Backend-Container-Path\u0027)"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"        if contpath:"},{"line_number":389,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_9f96284a","line":386,"updated":"2020-01-05 18:52:31.000000000","message":"given this is the receiving end it makes sense to check the old backend header.... \"liberal in what you accept\" :+1:","commit_id":"3f8890701259e24ef81c93947faf2d4ccf223c5f"}],"swift/obj/updater.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5a5cf836f9c81f464163818377b165b4885a2516","unresolved":false,"context_lines":[{"line_number":358,"context_line":"            headers_out.setdefault(\u0027X-Backend-Storage-Policy-Index\u0027,"},{"line_number":359,"context_line":"                                   str(int(policy)))"},{"line_number":360,"context_line":"            headers_out.setdefault(\u0027X-Backend-Accept-Redirect\u0027, \u0027true\u0027)"},{"line_number":361,"context_line":"            headers_out.setdefault(\u0027X-Backend-Accept-Quoted-Location\u0027, \u0027true\u0027)"},{"line_number":362,"context_line":"            container_path \u003d update.get(\u0027container_path\u0027)"},{"line_number":363,"context_line":"            if container_path:"},{"line_number":364,"context_line":"                acct, cont \u003d split_path(\u0027/\u0027 + container_path, minsegs\u003d2)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_bf93e458","line":361,"updated":"2020-01-05 18:52:31.000000000","message":"did we have to add this to the object-server too?  no shared code path?\n\noic, the inline update doesn\u0027t accept redirects *in general*","commit_id":"3f8890701259e24ef81c93947faf2d4ccf223c5f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6187f32cf31ba845454183c5466459884c173e92","unresolved":false,"context_lines":[{"line_number":358,"context_line":"            headers_out.setdefault(\u0027X-Backend-Storage-Policy-Index\u0027,"},{"line_number":359,"context_line":"                                   str(int(policy)))"},{"line_number":360,"context_line":"            headers_out.setdefault(\u0027X-Backend-Accept-Redirect\u0027, \u0027true\u0027)"},{"line_number":361,"context_line":"            headers_out.setdefault(\u0027X-Backend-Accept-Quoted-Location\u0027, \u0027true\u0027)"},{"line_number":362,"context_line":"            container_path \u003d update.get(\u0027container_path\u0027)"},{"line_number":363,"context_line":"            if container_path:"},{"line_number":364,"context_line":"                acct, cont \u003d split_path(\u0027/\u0027 + container_path, minsegs\u003d2)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_f1ebc1a1","line":361,"in_reply_to":"3fa7e38b_bf93e458","updated":"2020-01-07 01:41:24.000000000","message":"Yeah, I\u0027d forgotten that part for a while, too -- apparently we figure it should be a pretty brief, transient state where the proxy doesn\u0027t know the container is sharding. Makes me a little nervous about upgrade windows, particularly for large clusters... but I don\u0027t really any better ideas at this point.","commit_id":"3f8890701259e24ef81c93947faf2d4ccf223c5f"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"709ba9a775dba9b435434719559291a73f97837f","unresolved":false,"context_lines":[{"line_number":347,"context_line":"                    container_path)"},{"line_number":348,"context_line":"                if container_path \u003d\u003d quote(container_path):"},{"line_number":349,"context_line":"                    # *If* it seems safe, send the old-style header, too"},{"line_number":350,"context_line":"                    headers[index][\u0027X-Backend-Container-Path\u0027] \u003d container_path"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":"        def set_delete_at_headers(index, delete_at_node):"},{"line_number":353,"context_line":"            headers[index][\u0027X-Delete-At-Container\u0027] \u003d delete_at_container"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_cdd76f50","line":350,"updated":"2019-12-19 19:06:37.000000000","message":"yeah this matches what the object server is doing/expecting for the update headers","commit_id":"73b0d47c70bb524bc8cbbacd5701a36ff0fa9212"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d2f849bbeda22cb7f91ba645657a57edbe5b545b","unresolved":false,"context_lines":[{"line_number":347,"context_line":"                    container_path)"},{"line_number":348,"context_line":"                if container_path \u003d\u003d quote(container_path):"},{"line_number":349,"context_line":"                    # *If* it seems safe, send the old-style header, too"},{"line_number":350,"context_line":"                    headers[index][\u0027X-Backend-Container-Path\u0027] \u003d container_path"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":"        def set_delete_at_headers(index, delete_at_node):"},{"line_number":353,"context_line":"            headers[index][\u0027X-Delete-At-Container\u0027] \u003d delete_at_container"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_cd78cf2d","line":350,"in_reply_to":"3fa7e38b_cdd76f50","updated":"2019-12-19 19:22:53.000000000","message":"Arguably, this one *really* doesn\u0027t need the old header to be sent -- old code would just go try to update the root and get redirected to the right place.","commit_id":"73b0d47c70bb524bc8cbbacd5701a36ff0fa9212"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e0dfe9450503d5f8f2ad6b580d44450d163f4efd","unresolved":false,"context_lines":[{"line_number":347,"context_line":"                    container_path)"},{"line_number":348,"context_line":"                if container_path \u003d\u003d quote(container_path):"},{"line_number":349,"context_line":"                    # *If* it seems safe, send the old-style header, too"},{"line_number":350,"context_line":"                    headers[index][\u0027X-Backend-Container-Path\u0027] \u003d container_path"},{"line_number":351,"context_line":"                # Else, no biggie -- let the root tell us where it should go"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"        def set_delete_at_headers(index, delete_at_node):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_4a8a4c65","line":350,"updated":"2019-12-30 17:56:55.000000000","message":"so this is just a transmission header, not a sysmeta header, it doesn\u0027t get saved\n\nBut so have un-sharded container updates always had this problem?","commit_id":"72b96846acdf92a01141aecd84b8657796f3d293"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5a5cf836f9c81f464163818377b165b4885a2516","unresolved":false,"context_lines":[{"line_number":351,"context_line":"                # newlines (or possibly some other characters). We consciously"},{"line_number":352,"context_line":"                # *don\u0027t* make any attempt to set the old meta; during an"},{"line_number":353,"context_line":"                # upgrade, old object-servers will talk to the root which"},{"line_number":354,"context_line":"                # will eat the update and move it as a misplaced object."},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"        def set_delete_at_headers(index, delete_at_node):"},{"line_number":357,"context_line":"            headers[index][\u0027X-Delete-At-Container\u0027] \u003d delete_at_container"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_1f7c7820","line":354,"updated":"2020-01-05 18:52:31.000000000","message":"oh neat, *three* places we have this comment\n\nI\u0027m still quite happy we never send the unquoted path anymore!!!","commit_id":"3f8890701259e24ef81c93947faf2d4ccf223c5f"}],"test/probe/test_sharder.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"709ba9a775dba9b435434719559291a73f97837f","unresolved":false,"context_lines":[{"line_number":556,"context_line":"        return [\u0027obj\\n%04d%%Ff\u0027 % x for x in range(number)]"},{"line_number":557,"context_line":""},{"line_number":558,"context_line":"    def _setup_container_name(self):"},{"line_number":559,"context_line":"        self.container_name \u003d \u0027container\\n%%Ff\\n%s\u0027 % uuid.uuid4()"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":""},{"line_number":562,"context_line":"class TestContainerShardingUTF8(TestContainerShardingNonUTF8):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_8de1772e","line":559,"updated":"2019-12-19 19:06:37.000000000","message":"BAM - that\u0027s a pretty strong testwise :+1:","commit_id":"73b0d47c70bb524bc8cbbacd5701a36ff0fa9212"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d2f849bbeda22cb7f91ba645657a57edbe5b545b","unresolved":false,"context_lines":[{"line_number":556,"context_line":"        return [\u0027obj\\n%04d%%Ff\u0027 % x for x in range(number)]"},{"line_number":557,"context_line":""},{"line_number":558,"context_line":"    def _setup_container_name(self):"},{"line_number":559,"context_line":"        self.container_name \u003d \u0027container\\n%%Ff\\n%s\u0027 % uuid.uuid4()"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":""},{"line_number":562,"context_line":"class TestContainerShardingUTF8(TestContainerShardingNonUTF8):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_6d8d1b28","line":559,"in_reply_to":"3fa7e38b_8de1772e","updated":"2019-12-19 19:22:53.000000000","message":"I love using %ff (or some variation) when dealing with quote()ing problems :-D","commit_id":"73b0d47c70bb524bc8cbbacd5701a36ff0fa9212"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e0dfe9450503d5f8f2ad6b580d44450d163f4efd","unresolved":false,"context_lines":[{"line_number":550,"context_line":""},{"line_number":551,"context_line":""},{"line_number":552,"context_line":"class TestContainerShardingFunkyNames(TestContainerShardingNonUTF8):"},{"line_number":553,"context_line":"    DELIM \u003d \u0027\\n\u0027"},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"    def _make_object_names(self, number):"},{"line_number":556,"context_line":"        return [\u0027obj\\n%04d%%Ff\u0027 % x for x in range(number)]"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_aa91809c","line":553,"updated":"2019-12-30 17:56:55.000000000","message":"Oh that\u0027s good, this is only adding a repeat of the one test\n\nTestContainerShardingNonUTF8.test_sharding_listing","commit_id":"72b96846acdf92a01141aecd84b8657796f3d293"}],"test/unit/container/test_replicator.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5a5cf836f9c81f464163818377b165b4885a2516","unresolved":false,"context_lines":[{"line_number":1081,"context_line":"        self.assertEqual(len(objects), 2)"},{"line_number":1082,"context_line":"        # NB: reconciler work is for the *root* container!"},{"line_number":1083,"context_line":"        expected \u003d (\u0027%s:/a/c/o\u0027 % remote_policy.idx, obj_put_timestamp, 0,"},{"line_number":1084,"context_line":"                    \u0027application/x-put\u0027, obj_put_timestamp)"},{"line_number":1085,"context_line":"        self.assertEqual(objects[0], expected)"},{"line_number":1086,"context_line":"        # the second object\u0027s listing has ts_meta as its last modified time"},{"line_number":1087,"context_line":"        # but its full composite timestamp is in the hash field."}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_5f8bd015","line":1084,"updated":"2020-01-05 18:52:31.000000000","message":"does this means misplaced objects that enqueue when shard thinks it\u0027s a root have the wrong path?","commit_id":"3f8890701259e24ef81c93947faf2d4ccf223c5f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6187f32cf31ba845454183c5466459884c173e92","unresolved":false,"context_lines":[{"line_number":1081,"context_line":"        self.assertEqual(len(objects), 2)"},{"line_number":1082,"context_line":"        # NB: reconciler work is for the *root* container!"},{"line_number":1083,"context_line":"        expected \u003d (\u0027%s:/a/c/o\u0027 % remote_policy.idx, obj_put_timestamp, 0,"},{"line_number":1084,"context_line":"                    \u0027application/x-put\u0027, obj_put_timestamp)"},{"line_number":1085,"context_line":"        self.assertEqual(objects[0], expected)"},{"line_number":1086,"context_line":"        # the second object\u0027s listing has ts_meta as its last modified time"},{"line_number":1087,"context_line":"        # but its full composite timestamp is in the hash field."}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_7106f176","line":1084,"in_reply_to":"3fa7e38b_5f8bd015","updated":"2020-01-07 01:41:24.000000000","message":"Well shoot.\n\nYep. Yes it does.","commit_id":"3f8890701259e24ef81c93947faf2d4ccf223c5f"}],"test/unit/container/test_sharder.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5a5cf836f9c81f464163818377b165b4885a2516","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                                        shard_bounds\u003d((\u0027\u0027, \u0027middle\u0027),"},{"line_number":83,"context_line":"                                                      (\u0027middle\u0027, \u0027\u0027))):"},{"line_number":84,"context_line":"        broker \u003d self._make_broker(account\u003daccount, container\u003dcontainer)"},{"line_number":85,"context_line":"        broker.set_sharding_sysmeta(\u0027Root\u0027, \u0027a/c\u0027)"},{"line_number":86,"context_line":"        old_db_id \u003d broker.get_info()[\u0027id\u0027]"},{"line_number":87,"context_line":"        broker.enable_sharding(next(self.ts_iter))"},{"line_number":88,"context_line":"        shard_ranges \u003d self._make_shard_ranges("}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_ff763c3f","line":85,"updated":"2020-01-05 18:52:31.000000000","message":"That\u0027s handy!","commit_id":"3f8890701259e24ef81c93947faf2d4ccf223c5f"}],"test/unit/container/test_updater.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5a5cf836f9c81f464163818377b165b4885a2516","unresolved":false,"context_lines":[{"line_number":465,"context_line":"        cb.put_object(\u0027o\u0027, normalize_timestamp(2), 3, \u0027text/plain\u0027,"},{"line_number":466,"context_line":"                      \u002768b329da9893e34099c7d8ad5cb9c940\u0027)"},{"line_number":467,"context_line":"        # Fake us having already reported *bad* stats under swift 2.18.0"},{"line_number":468,"context_line":"        cb.reported(\u00270\u0027, \u00270\u0027, 1, 3)"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"        # Should fail with a bunch of connection-refused"},{"line_number":471,"context_line":"        cu.run_once()"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_9f6f0860","line":468,"updated":"2020-01-05 18:52:31.000000000","message":"whoa, ok","commit_id":"3f8890701259e24ef81c93947faf2d4ccf223c5f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6187f32cf31ba845454183c5466459884c173e92","unresolved":false,"context_lines":[{"line_number":465,"context_line":"        cb.put_object(\u0027o\u0027, normalize_timestamp(2), 3, \u0027text/plain\u0027,"},{"line_number":466,"context_line":"                      \u002768b329da9893e34099c7d8ad5cb9c940\u0027)"},{"line_number":467,"context_line":"        # Fake us having already reported *bad* stats under swift 2.18.0"},{"line_number":468,"context_line":"        cb.reported(\u00270\u0027, \u00270\u0027, 1, 3)"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"        # Should fail with a bunch of connection-refused"},{"line_number":471,"context_line":"        cu.run_once()"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_116c5d31","line":468,"in_reply_to":"3fa7e38b_9f6f0860","updated":"2020-01-07 01:41:24.000000000","message":"Cribbed from the test above.\n\nThough come to think of it, I should maybe have updated the comment to reflect the fact that we could\u0027ve reported bad states *because of the rolling upgrade issue*.","commit_id":"3f8890701259e24ef81c93947faf2d4ccf223c5f"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5a5cf836f9c81f464163818377b165b4885a2516","unresolved":false,"context_lines":[{"line_number":1052,"context_line":"                mock.patch(\u0027swift.obj.updater.dump_recon_cache\u0027):"},{"line_number":1053,"context_line":"            object_updater \u003d updater.ObjectUpdater("},{"line_number":1054,"context_line":"                {\u0027devices\u0027: self.testdir,"},{"line_number":1055,"context_line":"                 \u0027mount_check\u0027: \u0027false\u0027}, logger\u003ddebug_logger())"},{"line_number":1056,"context_line":"            node \u003d {\u0027id\u0027: 1}"},{"line_number":1057,"context_line":"            mock_ring \u003d mock.MagicMock()"},{"line_number":1058,"context_line":"            mock_ring.get_nodes.return_value \u003d (99, [node])"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_9fa4e8a5","line":1055,"updated":"2020-01-05 18:52:31.000000000","message":"this test really follows the thread to the end doesn\u0027t it","commit_id":"3f8890701259e24ef81c93947faf2d4ccf223c5f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5a5cf836f9c81f464163818377b165b4885a2516","unresolved":false,"context_lines":[{"line_number":5559,"context_line":"        do_test(\u0027\u0027, \u0027a/c\u0027, None)"},{"line_number":5560,"context_line":"        do_test(None, \u0027a/c\u0027, None)"},{"line_number":5561,"context_line":"        # TODO: should these cases trigger a 400 response rather than"},{"line_number":5562,"context_line":"        # defaulting to root path?"},{"line_number":5563,"context_line":"        do_test(\u0027garbage\u0027, \u0027a/c\u0027, None)"},{"line_number":5564,"context_line":"        do_test(\u0027/\u0027, \u0027a/c\u0027, None)"},{"line_number":5565,"context_line":"        do_test(\u0027/no-acct\u0027, \u0027a/c\u0027, None)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fa7e38b_bfa1a494","line":5562,"updated":"2020-01-05 18:52:31.000000000","message":"I guess this is just the case of \"header is missing\" - same TODO is in the old_style test","commit_id":"3f8890701259e24ef81c93947faf2d4ccf223c5f"}]}
