)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c264fdd165b0594a84db078330dc43b27dae6d05","unresolved":true,"context_lines":[{"line_number":9,"context_line":"By having some small portion of calls skip"},{"line_number":10,"context_line":"cache and go straight to disk, we can ensure the cache is always kept"},{"line_number":11,"context_line":"fresh and never expires (at least, for active containers). Previously,"},{"line_number":12,"context_line":"when whard ranges fell out of cache there would frequently be a"},{"line_number":13,"context_line":"thundering herd that could overwhelm the container server, leading to"},{"line_number":14,"context_line":"503s served to clients or an increase in async pendings."},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"99c06549_b7e25ee6","line":12,"range":{"start_line":12,"start_character":5,"end_line":12,"end_character":10},"updated":"2021-12-16 16:54:56.000000000","message":"s/whard/shard/","commit_id":"dc1fa754f86029ba66b0d491eee28affd7c09a63"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d3dc9caf615ac22d5693ed75b1ebd01b53f4093e","unresolved":false,"context_lines":[{"line_number":9,"context_line":"By having some small portion of calls skip"},{"line_number":10,"context_line":"cache and go straight to disk, we can ensure the cache is always kept"},{"line_number":11,"context_line":"fresh and never expires (at least, for active containers). Previously,"},{"line_number":12,"context_line":"when whard ranges fell out of cache there would frequently be a"},{"line_number":13,"context_line":"thundering herd that could overwhelm the container server, leading to"},{"line_number":14,"context_line":"503s served to clients or an increase in async pendings."},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"05c29fb0_c69c10b2","line":12,"range":{"start_line":12,"start_character":5,"end_line":12,"end_character":10},"in_reply_to":"99c06549_b7e25ee6","updated":"2021-12-18 01:38:55.000000000","message":"Done","commit_id":"dc1fa754f86029ba66b0d491eee28affd7c09a63"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8e852666344d0f35b0bdf9c90da2417277cf50bd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"96da4bbb_419aed08","updated":"2021-12-15 18:24:05.000000000","message":"I think I\u0027ll break this up as two separate changes -- the shard ranges shouldn\u0027t actually need the pipeline_getter, and I think there might be a better way to get the proxy-server app plumbed through...","commit_id":"924c1813fa22f12a793b3484c85c92a32b968de8"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ada1d3cc546a854423d25cd3178a7d23e036dd1d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"831e6e38_6ead0915","updated":"2021-12-16 17:13:57.000000000","message":"follow up with some extra test coverage https://review.opendev.org/c/openstack/swift/+/822005","commit_id":"dc1fa754f86029ba66b0d491eee28affd7c09a63"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"5b3367b8dd1f96177d975ff29a55b8dc15931a26","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"0a33ef8f_2e40836d","updated":"2021-12-17 03:46:39.000000000","message":"recheck","commit_id":"dc1fa754f86029ba66b0d491eee28affd7c09a63"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c264fdd165b0594a84db078330dc43b27dae6d05","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"6a29a71f_14ef42af","updated":"2021-12-16 16:54:56.000000000","message":"this looks like a good targeted first step\n\nthe \u0027updating\u0027 case could do with some more test coverage","commit_id":"dc1fa754f86029ba66b0d491eee28affd7c09a63"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"420c05427e36d44b1536693c11e44d915fa5dbb7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"de35a2be_7ecadaa2","updated":"2022-01-04 19:31:35.000000000","message":"I think we should consider the change to the test.unit.FakeMemcache more carefully - sticking kwargs into the existing tuple slots won\u0027t scale if we add new kwargs to the other methods that are already using those slots for example.\n\nbut we can probably ship this if we need to, the new tunable and mecache interface makes sense and seems low risk","commit_id":"2be4eeb5c0406cc2b6609064e09ae5a8ddb72e50"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a9c27d05d48d2a2309bdee706cfbc38e424e9aa9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"b51434d1_387bd638","updated":"2022-01-14 00:12:36.000000000","message":"I don\u0027t think I seriously thought about the new stats since https://review.opendev.org/c/openstack/swift/+/822104 landed; I\u0027m not sure memcache should really be the one emitting skips anymore. A bit unfortunate to lose the error counter (it gets rolled into misses) but I don\u0027t think errors talking to memcache were terribly frequent to begin with...","commit_id":"379c29477665a33da4e227401c387067d0efc84b"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"fcb140b81b972eed3a5b2c2c53fe0398fe0affa7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"9f3d23d4_ed41d98f","updated":"2022-01-13 05:07:27.000000000","message":"Yup, really awesome work. Able to be turned off.\n\nI know we\u0027re about to test this patch in staging and maybe even prod. So will hold off on a +A for the moment. just. in. case. ","commit_id":"379c29477665a33da4e227401c387067d0efc84b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9202ed2bff1c4e84577a10f9e9b93f41bcfd0c2d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"48b569f3_57a8c889","updated":"2022-01-13 11:02:46.000000000","message":"the percent value is being normalized twice meaning that the applied percent is 1/100 the configured percent","commit_id":"379c29477665a33da4e227401c387067d0efc84b"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"c01ffba13507ca6995c5b331a45d1aaca10ec3c9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"ebe01129_1599ac1e","updated":"2022-01-20 01:26:01.000000000","message":"Looking really good. And I can live with the replication of code in only 2 places. but if we grow this skip anywhere else we should really look at creating some kind of helper method.\n\nSome comments in the tests otherwise I\u0027m happy with it.","commit_id":"bbf21dd9150845f46b56275cdb63bede53e26766"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"9bc0750382776c08813ee361588cabae1ee5a91b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"a6eb3399_fae17143","updated":"2022-01-20 02:41:35.000000000","message":"Do not use git review -F.. sorry about the noise, patchset 13 is the same as patchset 11. Sorry Tim.\n\nSo PS 11 comments relate here.","commit_id":"afc4525d75abf446dd1ce4b90275e883c11c258b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"26434693e7609894df85c5bc5d3f4d6ff3c07c88","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"a35bfdf0_24c0a6af","updated":"2022-01-25 09:35:56.000000000","message":"still good, minor comments in tests","commit_id":"d6afbcf4b26d88d67cefa7e40ca13b026de12484"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d077316c7e9c94e3c84e7b1f6ba88694ef4e4a62","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"31772b38_4d8f94ea","updated":"2022-01-27 17:02:04.000000000","message":"recheck","commit_id":"8c6ccb5fd41864155a043856ff9240e84999e4bf"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"480e30bb10411781e0695757718d4856e0988143","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"cd8b0922_71d27f5b","updated":"2022-01-27 13:32:26.000000000","message":"recheck","commit_id":"8c6ccb5fd41864155a043856ff9240e84999e4bf"}],"etc/proxy-server.conf-sample":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c264fdd165b0594a84db078330dc43b27dae6d05","unresolved":true,"context_lines":[{"line_number":144,"context_line":"# so this value should be set less than recheck_updating_shard_ranges."},{"line_number":145,"context_line":"# recheck_listing_shard_ranges \u003d 600"},{"line_number":146,"context_line":"#"},{"line_number":147,"context_line":"# Sometimes you want a chance of skipping the cache to ensure it stays alive."},{"line_number":148,"context_line":"# container_updating_shard_ranges_skip_cache_pct \u003d 0.0"},{"line_number":149,"context_line":"# container_listing_shard_ranges_skip_cache_pct \u003d 0.0"},{"line_number":150,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"37cdfac1_f4f1b194","line":147,"updated":"2021-12-16 16:54:56.000000000","message":"in time we\u0027ll probably want to add some guidance as to how to choose an appropriate number, but we may need some experience before we can write that","commit_id":"dc1fa754f86029ba66b0d491eee28affd7c09a63"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d3dc9caf615ac22d5693ed75b1ebd01b53f4093e","unresolved":true,"context_lines":[{"line_number":144,"context_line":"# so this value should be set less than recheck_updating_shard_ranges."},{"line_number":145,"context_line":"# recheck_listing_shard_ranges \u003d 600"},{"line_number":146,"context_line":"#"},{"line_number":147,"context_line":"# Sometimes you want a chance of skipping the cache to ensure it stays alive."},{"line_number":148,"context_line":"# container_updating_shard_ranges_skip_cache_pct \u003d 0.0"},{"line_number":149,"context_line":"# container_listing_shard_ranges_skip_cache_pct \u003d 0.0"},{"line_number":150,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"52722db6_284ce44f","line":147,"in_reply_to":"37cdfac1_f4f1b194","updated":"2021-12-18 01:38:55.000000000","message":"My gut says something in the [0, 0.1] range is probably about right -- or at least, not so wrong as to cause things to fall over. The main things informing tuning seem to be:\n\n* How long is the recheck interval? Longer interval should mean you can turn down the skip_pct, since you\u0027re more likely to catch it at some point in the interval.\n* What\u0027s your client load? Too high and you may still overwhelm your container servers; too low and you\u0027ll never actually refresh cache.\n* What client load can your container servers keep up with? There must be some point where it\u0027s acceptable to have things fall out of cache.","commit_id":"dc1fa754f86029ba66b0d491eee28affd7c09a63"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e9fcf89ff48ce5c9b822241499204d2f8dd352c0","unresolved":true,"context_lines":[{"line_number":144,"context_line":"# so this value should be set less than recheck_updating_shard_ranges."},{"line_number":145,"context_line":"# recheck_listing_shard_ranges \u003d 600"},{"line_number":146,"context_line":"#"},{"line_number":147,"context_line":"# Sometimes you want a chance of skipping the cache to ensure it stays alive."},{"line_number":148,"context_line":"# container_updating_shard_ranges_skip_cache_pct \u003d 0.0"},{"line_number":149,"context_line":"# container_listing_shard_ranges_skip_cache_pct \u003d 0.0"},{"line_number":150,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":11,"id":"8f4a9c9f_223f31c7","line":147,"updated":"2022-01-17 11:37:24.000000000","message":"nit: \"skipping the cache to ensure it stays alive\" makes it sound like this is preventing some kind of DOS attack on the cache :) \n\nAlso, I think it would be kind to add some wording that warns against setting this to 100% !","commit_id":"bbf21dd9150845f46b56275cdb63bede53e26766"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bef3ba9a64879b58472dd95afca0d120d864aaf2","unresolved":false,"context_lines":[{"line_number":144,"context_line":"# so this value should be set less than recheck_updating_shard_ranges."},{"line_number":145,"context_line":"# recheck_listing_shard_ranges \u003d 600"},{"line_number":146,"context_line":"#"},{"line_number":147,"context_line":"# Sometimes you want a chance of skipping the cache to ensure it stays alive."},{"line_number":148,"context_line":"# container_updating_shard_ranges_skip_cache_pct \u003d 0.0"},{"line_number":149,"context_line":"# container_listing_shard_ranges_skip_cache_pct \u003d 0.0"},{"line_number":150,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":11,"id":"8d3495a0_95dd2a0f","line":147,"in_reply_to":"8f4a9c9f_223f31c7","updated":"2022-01-24 22:54:46.000000000","message":"Done","commit_id":"bbf21dd9150845f46b56275cdb63bede53e26766"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"26434693e7609894df85c5bc5d3f4d6ff3c07c88","unresolved":true,"context_lines":[{"line_number":149,"context_line":"# have to go to disk. By (rarely) going direct to disk regardless of whether"},{"line_number":150,"context_line":"# data is present in memcache, we can periodically refresh the data in memcache"},{"line_number":151,"context_line":"# without causing a thundering herd. Values around 0.0 - 0.1 (i.e., one in"},{"line_number":152,"context_line":"# every thousand requests skips cache, or fewer) are recommended."},{"line_number":153,"context_line":"# container_updating_shard_ranges_skip_cache_pct \u003d 0.0"},{"line_number":154,"context_line":"# container_listing_shard_ranges_skip_cache_pct \u003d 0.0"},{"line_number":155,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":14,"id":"e95da79b_8bfd8772","line":152,"updated":"2022-01-25 09:35:56.000000000","message":"+1","commit_id":"d6afbcf4b26d88d67cefa7e40ca13b026de12484"}],"swift/common/memcached.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b7c5deecfba8ad2d3a9dea277fac9a7fe47273d7","unresolved":false,"context_lines":[{"line_number":314,"context_line":"        if self.read_skip_cache_pct \u003e 0 and \\"},{"line_number":315,"context_line":"                random.random() * 100 \u003c self.read_skip_cache_pct:"},{"line_number":316,"context_line":"            self.logger.increment(\u0027memcache.get.skip\u0027)"},{"line_number":317,"context_line":"            return None"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"        key \u003d md5hash(key)"},{"line_number":320,"context_line":"        value \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"bf51134e_7f9347a4","line":317,"updated":"2020-06-18 18:53:57.000000000","message":"this seems super heavy handed given the described bug\n\nwhat about auth tokens?","commit_id":"0f00fed195ab8d6e2131a787f46b542474ed8ac5"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f3c4f73c53fdc3bd0d5115e8f67026a2c096dd9","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        if read_skip_cache_pct \u003e 1:"},{"line_number":188,"context_line":"            self.logger.warning(\u0027read_skip_cache_pct greater than 1% \u0027"},{"line_number":189,"context_line":"                                \u0027is not recommended\u0027)"},{"line_number":190,"context_line":"        self.read_skip_cache_pct \u003d read_skip_cache_pct"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def _exception_occurred(self, server, e, action\u003d\u0027talking\u0027,"},{"line_number":193,"context_line":"                            sock\u003dNone, fp\u003dNone, got_connection\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_bd606cd1","line":190,"updated":"2020-09-16 20:01:35.000000000","message":"I think this interface is wrong, this number isn\u0027t going to apply homogeneously to all keys and the penalty for getting it wrong is different depending on the context","commit_id":"9d9f1692a2acf7a9f58567dfe639b7a2d3d021e7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f3c4f73c53fdc3bd0d5115e8f67026a2c096dd9","unresolved":false,"context_lines":[{"line_number":302,"context_line":"            except (Exception, Timeout) as e:"},{"line_number":303,"context_line":"                self._exception_occurred(server, e, sock\u003dsock, fp\u003dfp)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    def get(self, key, allow_skip_cache\u003dFalse):"},{"line_number":306,"context_line":"        \"\"\""},{"line_number":307,"context_line":"        Gets the object specified by key.  It will also unserialize the object"},{"line_number":308,"context_line":"        before returning if it is serialized in memcache with JSON, or if it"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_fd72e4af","line":305,"updated":"2020-09-16 20:01:35.000000000","message":"rather than T/F we should just pass in the read_skip_cache_pct - the optimal tuning is so dependent on the access and carnality it\u0027s almost inevitable it\u0027s going to need to be configured per use-case","commit_id":"9d9f1692a2acf7a9f58567dfe639b7a2d3d021e7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"16c711268e6b2d141c25364d48d957ae37e618b8","unresolved":false,"context_lines":[{"line_number":302,"context_line":"            except (Exception, Timeout) as e:"},{"line_number":303,"context_line":"                self._exception_occurred(server, e, sock\u003dsock, fp\u003dfp)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    def get(self, key, allow_skip_cache\u003dFalse):"},{"line_number":306,"context_line":"        \"\"\""},{"line_number":307,"context_line":"        Gets the object specified by key.  It will also unserialize the object"},{"line_number":308,"context_line":"        before returning if it is serialized in memcache with JSON, or if it"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_38062a1e","line":305,"in_reply_to":"9f560f44_fd72e4af","updated":"2020-09-16 20:55:59.000000000","message":"Yeah, that\u0027s probably a good call.","commit_id":"9d9f1692a2acf7a9f58567dfe639b7a2d3d021e7"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"5b3367b8dd1f96177d975ff29a55b8dc15931a26","unresolved":true,"context_lines":[{"line_number":323,"context_line":"            except (Exception, Timeout) as e:"},{"line_number":324,"context_line":"                self._exception_occurred(server, e, sock\u003dsock, fp\u003dfp)"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    def get(self, key, skip_cache_pct\u003d0.0):"},{"line_number":327,"context_line":"        \"\"\""},{"line_number":328,"context_line":"        Gets the object specified by key.  It will also unserialize the object"},{"line_number":329,"context_line":"        before returning if it is serialized in memcache with JSON, or if it"}],"source_content_type":"text/x-python","patch_set":4,"id":"edca6287_032e32aa","line":326,"updated":"2021-12-17 03:46:39.000000000","message":"If we\u0027re going to implement this in get, we should probably implement it in get_multi too. Not sure we use it much, but would be good to know it also has the feature.","commit_id":"dc1fa754f86029ba66b0d491eee28affd7c09a63"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d3dc9caf615ac22d5693ed75b1ebd01b53f4093e","unresolved":true,"context_lines":[{"line_number":323,"context_line":"            except (Exception, Timeout) as e:"},{"line_number":324,"context_line":"                self._exception_occurred(server, e, sock\u003dsock, fp\u003dfp)"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    def get(self, key, skip_cache_pct\u003d0.0):"},{"line_number":327,"context_line":"        \"\"\""},{"line_number":328,"context_line":"        Gets the object specified by key.  It will also unserialize the object"},{"line_number":329,"context_line":"        before returning if it is serialized in memcache with JSON, or if it"}],"source_content_type":"text/x-python","patch_set":4,"id":"6a84cbaf_0be0a95c","line":326,"in_reply_to":"edca6287_032e32aa","updated":"2021-12-18 01:38:55.000000000","message":"We actually *never* use it in-tree. I\u0027m inclined to skip it until someone comes up with a good reason to add it -- in no small part because it\u0027s not obvious whether we should apply the skip_pct to the set of keys as a whole, or each key individually.","commit_id":"dc1fa754f86029ba66b0d491eee28affd7c09a63"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c264fdd165b0594a84db078330dc43b27dae6d05","unresolved":true,"context_lines":[{"line_number":329,"context_line":"        before returning if it is serialized in memcache with JSON, or if it"},{"line_number":330,"context_line":"        is pickled and unpickling is allowed."},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        :param key: key"},{"line_number":333,"context_line":"        :returns: value of the key in memcache"},{"line_number":334,"context_line":"        \"\"\""},{"line_number":335,"context_line":"        if skip_cache_pct \u003e 0 and random.random() * 100 \u003c skip_cache_pct:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1ca83843_8d9ed611","line":332,"updated":"2021-12-16 16:54:56.000000000","message":"nit: missing param","commit_id":"dc1fa754f86029ba66b0d491eee28affd7c09a63"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d3dc9caf615ac22d5693ed75b1ebd01b53f4093e","unresolved":false,"context_lines":[{"line_number":329,"context_line":"        before returning if it is serialized in memcache with JSON, or if it"},{"line_number":330,"context_line":"        is pickled and unpickling is allowed."},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        :param key: key"},{"line_number":333,"context_line":"        :returns: value of the key in memcache"},{"line_number":334,"context_line":"        \"\"\""},{"line_number":335,"context_line":"        if skip_cache_pct \u003e 0 and random.random() * 100 \u003c skip_cache_pct:"}],"source_content_type":"text/x-python","patch_set":4,"id":"2ae14b62_890b19d0","line":332,"in_reply_to":"1ca83843_8d9ed611","updated":"2021-12-18 01:38:55.000000000","message":"Done","commit_id":"dc1fa754f86029ba66b0d491eee28affd7c09a63"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"420c05427e36d44b1536693c11e44d915fa5dbb7","unresolved":true,"context_lines":[{"line_number":370,"context_line":"                        self.logger.increment(\u0027memcache.get.hit\u0027)"},{"line_number":371,"context_line":"                    return value"},{"line_number":372,"context_line":"            except (Exception, Timeout) as e:"},{"line_number":373,"context_line":"                self.logger.increment(\u0027memcache.get.error\u0027)"},{"line_number":374,"context_line":"                self._exception_occurred(server, e, sock\u003dsock, fp\u003dfp)"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"    def incr(self, key, delta\u003d1, time\u003d0):"}],"source_content_type":"text/x-python","patch_set":6,"id":"549caad1_0ab4d78f","line":373,"updated":"2022-01-04 19:31:35.000000000","message":"skip, miss, hit, error - I dig it","commit_id":"2be4eeb5c0406cc2b6609064e09ae5a8ddb72e50"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"96ebd9bf51e34cfae111148fc8ed6b8186e69684","unresolved":false,"context_lines":[{"line_number":370,"context_line":"                        self.logger.increment(\u0027memcache.get.hit\u0027)"},{"line_number":371,"context_line":"                    return value"},{"line_number":372,"context_line":"            except (Exception, Timeout) as e:"},{"line_number":373,"context_line":"                self.logger.increment(\u0027memcache.get.error\u0027)"},{"line_number":374,"context_line":"                self._exception_occurred(server, e, sock\u003dsock, fp\u003dfp)"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"    def incr(self, key, delta\u003d1, time\u003d0):"}],"source_content_type":"text/x-python","patch_set":6,"id":"b607a5f4_bc452d6e","line":373,"in_reply_to":"549caad1_0ab4d78f","updated":"2022-01-06 19:06:41.000000000","message":"Ack","commit_id":"2be4eeb5c0406cc2b6609064e09ae5a8ddb72e50"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9202ed2bff1c4e84577a10f9e9b93f41bcfd0c2d","unresolved":true,"context_lines":[{"line_number":340,"context_line":"        :param key: key"},{"line_number":341,"context_line":"        :param skip_cache_pct: probability of skipping talking to memcache and"},{"line_number":342,"context_line":"                               returning None, as though it were a cache miss."},{"line_number":343,"context_line":"                               Should be in the range [0.0, 100.0]"},{"line_number":344,"context_line":"        :returns: value of the key in memcache"},{"line_number":345,"context_line":"        \"\"\""},{"line_number":346,"context_line":"        if skip_cache_pct \u003e 0 and random.random() * 100 \u003c skip_cache_pct:"}],"source_content_type":"text/x-python","patch_set":9,"id":"659f331b_bca7b29f","line":343,"range":{"start_line":343,"start_character":31,"end_line":343,"end_character":66},"updated":"2022-01-13 11:02:46.000000000","message":"here we assume the value is not normalized so 0\u003c\u003d value \u003c\u003d 100","commit_id":"379c29477665a33da4e227401c387067d0efc84b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a9c27d05d48d2a2309bdee706cfbc38e424e9aa9","unresolved":false,"context_lines":[{"line_number":340,"context_line":"        :param key: key"},{"line_number":341,"context_line":"        :param skip_cache_pct: probability of skipping talking to memcache and"},{"line_number":342,"context_line":"                               returning None, as though it were a cache miss."},{"line_number":343,"context_line":"                               Should be in the range [0.0, 100.0]"},{"line_number":344,"context_line":"        :returns: value of the key in memcache"},{"line_number":345,"context_line":"        \"\"\""},{"line_number":346,"context_line":"        if skip_cache_pct \u003e 0 and random.random() * 100 \u003c skip_cache_pct:"}],"source_content_type":"text/x-python","patch_set":9,"id":"0998130a_fe345264","line":343,"range":{"start_line":343,"start_character":31,"end_line":343,"end_character":66},"in_reply_to":"659f331b_bca7b29f","updated":"2022-01-14 00:12:36.000000000","message":"Done","commit_id":"379c29477665a33da4e227401c387067d0efc84b"}],"swift/common/wsgi.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8e852666344d0f35b0bdf9c90da2417277cf50bd","unresolved":true,"context_lines":[{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    x \u003d app"},{"line_number":261,"context_line":"    while True:"},{"line_number":262,"context_line":"        x \u003d getattr(x, \u0027app\u0027, None)"},{"line_number":263,"context_line":"        if not x:"},{"line_number":264,"context_line":"            break"},{"line_number":265,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"e33207fc_14d8430f","line":262,"updated":"2021-12-15 18:24:05.000000000","message":"Whomp whomp https://github.com/openstack/keystonemiddleware/blob/master/keystonemiddleware/auth_token/__init__.py#L328","commit_id":"924c1813fa22f12a793b3484c85c92a32b968de8"}],"swift/proxy/controllers/base.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f3c4f73c53fdc3bd0d5115e8f67026a2c096dd9","unresolved":false,"context_lines":[{"line_number":647,"context_line":"    cache_key \u003d get_cache_key(account, container)"},{"line_number":648,"context_line":"    memcache \u003d cache_from_env(env, True)"},{"line_number":649,"context_line":"    if memcache:"},{"line_number":650,"context_line":"        info \u003d memcache.get(cache_key, allow_skip_cache\u003dTrue)"},{"line_number":651,"context_line":"        if info and six.PY2:"},{"line_number":652,"context_line":"            # Get back to native strings"},{"line_number":653,"context_line":"            new_info \u003d {}"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_1da7d80d","line":650,"updated":"2020-09-16 20:01:35.000000000","message":"maybe app.container_existence_cache_skip_pct","commit_id":"9d9f1692a2acf7a9f58567dfe639b7a2d3d021e7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f3c4f73c53fdc3bd0d5115e8f67026a2c096dd9","unresolved":false,"context_lines":[{"line_number":2277,"context_line":""},{"line_number":2278,"context_line":"        cached_ranges \u003d infocache.get(cache_key)"},{"line_number":2279,"context_line":"        if cached_ranges is None and memcache:"},{"line_number":2280,"context_line":"            cached_ranges \u003d memcache.get(cache_key, allow_skip_cache\u003dTrue)"},{"line_number":2281,"context_line":""},{"line_number":2282,"context_line":"        if cached_ranges:"},{"line_number":2283,"context_line":"            shard_ranges \u003d ["}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_bdb50c35","line":2280,"updated":"2020-09-16 20:01:35.000000000","message":"maybe maybe app.shards_updating_cache_skip_pct","commit_id":"9d9f1692a2acf7a9f58567dfe639b7a2d3d021e7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a9c27d05d48d2a2309bdee706cfbc38e424e9aa9","unresolved":true,"context_lines":[{"line_number":2388,"context_line":"                self.app.container_updating_shard_ranges_skip_cache_pct"},{"line_number":2389,"context_line":"            cached_ranges \u003d memcache.get(cache_key, skip_cache_pct\u003dskip_pct)"},{"line_number":2390,"context_line":"            self.app.logger.increment(\u0027shard_updating.cache.%s\u0027"},{"line_number":2391,"context_line":"                                      % (\u0027hit\u0027 if cached_ranges else \u0027miss\u0027))"},{"line_number":2392,"context_line":""},{"line_number":2393,"context_line":"        if cached_ranges:"},{"line_number":2394,"context_line":"            shard_ranges \u003d ["}],"source_content_type":"text/x-python","patch_set":9,"id":"40e6f00e_abed3057","line":2391,"updated":"2022-01-14 00:12:36.000000000","message":"Hmm... maybe I should pass back some falsey-but-not-None sentinel so this stat can distinguish miss from skip?\n\nOr maybe the skipping shouldn\u0027t go in memcache at all, but stay out here...","commit_id":"379c29477665a33da4e227401c387067d0efc84b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e9fcf89ff48ce5c9b822241499204d2f8dd352c0","unresolved":true,"context_lines":[{"line_number":2388,"context_line":"            skip_chance \u003d \\"},{"line_number":2389,"context_line":"                self.app.container_updating_shard_ranges_skip_cache"},{"line_number":2390,"context_line":"            if skip_chance and random.random() \u003c skip_chance:"},{"line_number":2391,"context_line":"                self.app.logger.increment(\u0027shard_updating.cache.skip\u0027)"},{"line_number":2392,"context_line":"            else:"},{"line_number":2393,"context_line":"                cached_ranges \u003d memcache.get(cache_key)"},{"line_number":2394,"context_line":"                if cached_ranges:"}],"source_content_type":"text/x-python","patch_set":11,"id":"a82a77b5_8b086b54","line":2391,"updated":"2022-01-17 11:37:24.000000000","message":"on balance I think I prefer this approach.\n\nThinking ahead to other users of skip_pct, it was useful that memcache encapsulated the math for skipping, but the stats weren\u0027t so useful (i.e. not specific) when emitted from memcache because skips would be aggregated.","commit_id":"bbf21dd9150845f46b56275cdb63bede53e26766"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bef3ba9a64879b58472dd95afca0d120d864aaf2","unresolved":false,"context_lines":[{"line_number":2388,"context_line":"            skip_chance \u003d \\"},{"line_number":2389,"context_line":"                self.app.container_updating_shard_ranges_skip_cache"},{"line_number":2390,"context_line":"            if skip_chance and random.random() \u003c skip_chance:"},{"line_number":2391,"context_line":"                self.app.logger.increment(\u0027shard_updating.cache.skip\u0027)"},{"line_number":2392,"context_line":"            else:"},{"line_number":2393,"context_line":"                cached_ranges \u003d memcache.get(cache_key)"},{"line_number":2394,"context_line":"                if cached_ranges:"}],"source_content_type":"text/x-python","patch_set":11,"id":"6dd85f7e_0aba6c7f","line":2391,"in_reply_to":"a82a77b5_8b086b54","updated":"2022-01-24 22:54:46.000000000","message":"Ack","commit_id":"bbf21dd9150845f46b56275cdb63bede53e26766"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e9fcf89ff48ce5c9b822241499204d2f8dd352c0","unresolved":true,"context_lines":[{"line_number":2391,"context_line":"                self.app.logger.increment(\u0027shard_updating.cache.skip\u0027)"},{"line_number":2392,"context_line":"            else:"},{"line_number":2393,"context_line":"                cached_ranges \u003d memcache.get(cache_key)"},{"line_number":2394,"context_line":"                if cached_ranges:"},{"line_number":2395,"context_line":"                    self.app.logger.increment(\u0027shard_updating.cache.hit\u0027)"},{"line_number":2396,"context_line":"                else:"},{"line_number":2397,"context_line":"                    self.app.logger.increment(\u0027shard_updating.cache.miss\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"2b4c75da_e95691b5","line":2394,"updated":"2022-01-17 11:37:24.000000000","message":"nit: you ditched the \n\n  % (\u0027hit\u0027 if cached_ranges else \u0027miss\u0027)\n\nstyle here but then used in in container.py :)","commit_id":"bbf21dd9150845f46b56275cdb63bede53e26766"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"c01ffba13507ca6995c5b331a45d1aaca10ec3c9","unresolved":true,"context_lines":[{"line_number":2391,"context_line":"                self.app.logger.increment(\u0027shard_updating.cache.skip\u0027)"},{"line_number":2392,"context_line":"            else:"},{"line_number":2393,"context_line":"                cached_ranges \u003d memcache.get(cache_key)"},{"line_number":2394,"context_line":"                if cached_ranges:"},{"line_number":2395,"context_line":"                    self.app.logger.increment(\u0027shard_updating.cache.hit\u0027)"},{"line_number":2396,"context_line":"                else:"},{"line_number":2397,"context_line":"                    self.app.logger.increment(\u0027shard_updating.cache.miss\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"fd047f05_86135e02","line":2394,"in_reply_to":"2b4c75da_e95691b5","updated":"2022-01-20 01:26:01.000000000","message":"+1, if we\u0027re going to have 2 places we do this, it\u0027ll be nice to have them the same.\n\nif there were more then 2 places we did this, I\u0027d argue a utils helper method would be better:\n\n  get_or_skip_from_memcache(memcache, key, skip_chance, stats_prefix)\n\nBut it\u0027s only 2 places so meh :)","commit_id":"bbf21dd9150845f46b56275cdb63bede53e26766"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bef3ba9a64879b58472dd95afca0d120d864aaf2","unresolved":false,"context_lines":[{"line_number":2391,"context_line":"                self.app.logger.increment(\u0027shard_updating.cache.skip\u0027)"},{"line_number":2392,"context_line":"            else:"},{"line_number":2393,"context_line":"                cached_ranges \u003d memcache.get(cache_key)"},{"line_number":2394,"context_line":"                if cached_ranges:"},{"line_number":2395,"context_line":"                    self.app.logger.increment(\u0027shard_updating.cache.hit\u0027)"},{"line_number":2396,"context_line":"                else:"},{"line_number":2397,"context_line":"                    self.app.logger.increment(\u0027shard_updating.cache.miss\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5abea647_c50870ef","line":2394,"in_reply_to":"fd047f05_86135e02","updated":"2022-01-24 22:54:46.000000000","message":"Made them consistent at least. I think I\u0027ll punt on the helper for now, though I agree we may want that clean-up by the end of the chain.","commit_id":"bbf21dd9150845f46b56275cdb63bede53e26766"}],"swift/proxy/controllers/container.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"420c05427e36d44b1536693c11e44d915fa5dbb7","unresolved":true,"context_lines":[{"line_number":154,"context_line":"                        self.app.container_listing_shard_ranges_skip_cache_pct"},{"line_number":155,"context_line":"                    cached_ranges \u003d memcache.get(cache_key,"},{"line_number":156,"context_line":"                                                 skip_cache_pct\u003dskip_pct)"},{"line_number":157,"context_line":"                if cached_ranges is not None:"},{"line_number":158,"context_line":"                    infocache[cache_key] \u003d tuple(cached_ranges)"},{"line_number":159,"context_line":"                    # shard ranges can be returned from cache"},{"line_number":160,"context_line":"                    self.app.logger.debug(\u0027Found %d shards in cache for %s\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5895e39c_f9366841","line":157,"updated":"2022-01-04 19:31:35.000000000","message":"and the cool thing is our calling code already knows how to deal with a skip - because it looks the same as a miss!  brilliant!","commit_id":"2be4eeb5c0406cc2b6609064e09ae5a8ddb72e50"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"96ebd9bf51e34cfae111148fc8ed6b8186e69684","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                        self.app.container_listing_shard_ranges_skip_cache_pct"},{"line_number":155,"context_line":"                    cached_ranges \u003d memcache.get(cache_key,"},{"line_number":156,"context_line":"                                                 skip_cache_pct\u003dskip_pct)"},{"line_number":157,"context_line":"                if cached_ranges is not None:"},{"line_number":158,"context_line":"                    infocache[cache_key] \u003d tuple(cached_ranges)"},{"line_number":159,"context_line":"                    # shard ranges can be returned from cache"},{"line_number":160,"context_line":"                    self.app.logger.debug(\u0027Found %d shards in cache for %s\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"b938dcc0_6eb61373","line":157,"in_reply_to":"5895e39c_f9366841","updated":"2022-01-06 19:06:41.000000000","message":"Ack","commit_id":"2be4eeb5c0406cc2b6609064e09ae5a8ddb72e50"}],"swift/proxy/server.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"5b3367b8dd1f96177d975ff29a55b8dc15931a26","unresolved":true,"context_lines":[{"line_number":232,"context_line":"                \u0027container_updating_shard_ranges_skip_cache_pct\u0027, 0))"},{"line_number":233,"context_line":"        self.container_listing_shard_ranges_skip_cache_pct \u003d \\"},{"line_number":234,"context_line":"            config_percent_value(conf.get("},{"line_number":235,"context_line":"                \u0027container_listing_shard_ranges_skip_cache_pct\u0027, 0))"},{"line_number":236,"context_line":"        self.allow_account_management \u003d \\"},{"line_number":237,"context_line":"            config_true_value(conf.get(\u0027allow_account_management\u0027, \u0027no\u0027))"},{"line_number":238,"context_line":"        self.container_ring \u003d container_ring or Ring(swift_dir,"}],"source_content_type":"text/x-python","patch_set":4,"id":"13031edd_5b14d755","line":235,"updated":"2021-12-17 03:46:39.000000000","message":"Wow, that\u0027s quite a mountful. Can\u0027t really think of anything better though :(\n\nmaybe shard_ranges in the option is enough to assume it\u0027s a container thing, and so we might be able to drop the `container_` :shrug:\n\nI guess it\u0027s fine.","commit_id":"dc1fa754f86029ba66b0d491eee28affd7c09a63"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d3dc9caf615ac22d5693ed75b1ebd01b53f4093e","unresolved":true,"context_lines":[{"line_number":232,"context_line":"                \u0027container_updating_shard_ranges_skip_cache_pct\u0027, 0))"},{"line_number":233,"context_line":"        self.container_listing_shard_ranges_skip_cache_pct \u003d \\"},{"line_number":234,"context_line":"            config_percent_value(conf.get("},{"line_number":235,"context_line":"                \u0027container_listing_shard_ranges_skip_cache_pct\u0027, 0))"},{"line_number":236,"context_line":"        self.allow_account_management \u003d \\"},{"line_number":237,"context_line":"            config_true_value(conf.get(\u0027allow_account_management\u0027, \u0027no\u0027))"},{"line_number":238,"context_line":"        self.container_ring \u003d container_ring or Ring(swift_dir,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7aa5b3c3_e537063c","line":235,"in_reply_to":"13031edd_5b14d755","updated":"2021-12-18 01:38:55.000000000","message":"Yeah, I agree -- it\u0027s uncomfortably long. I just couldn\u0027t come up with anything better.","commit_id":"dc1fa754f86029ba66b0d491eee28affd7c09a63"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9202ed2bff1c4e84577a10f9e9b93f41bcfd0c2d","unresolved":true,"context_lines":[{"line_number":228,"context_line":"            int(conf.get(\u0027recheck_account_existence\u0027,"},{"line_number":229,"context_line":"                         DEFAULT_RECHECK_ACCOUNT_EXISTENCE))"},{"line_number":230,"context_line":"        self.container_updating_shard_ranges_skip_cache_pct \u003d \\"},{"line_number":231,"context_line":"            config_percent_value(conf.get("},{"line_number":232,"context_line":"                \u0027container_updating_shard_ranges_skip_cache_pct\u0027, 0))"},{"line_number":233,"context_line":"        self.container_listing_shard_ranges_skip_cache_pct \u003d \\"},{"line_number":234,"context_line":"            config_percent_value(conf.get("}],"source_content_type":"text/x-python","patch_set":9,"id":"4d63375e_dc9682b4","line":231,"range":{"start_line":231,"start_character":12,"end_line":231,"end_character":32},"updated":"2022-01-13 11:02:46.000000000","message":"here we divide by 100 to normalize to 0\u003c\u003d value \u003c\u003d 1.0","commit_id":"379c29477665a33da4e227401c387067d0efc84b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a9c27d05d48d2a2309bdee706cfbc38e424e9aa9","unresolved":false,"context_lines":[{"line_number":228,"context_line":"            int(conf.get(\u0027recheck_account_existence\u0027,"},{"line_number":229,"context_line":"                         DEFAULT_RECHECK_ACCOUNT_EXISTENCE))"},{"line_number":230,"context_line":"        self.container_updating_shard_ranges_skip_cache_pct \u003d \\"},{"line_number":231,"context_line":"            config_percent_value(conf.get("},{"line_number":232,"context_line":"                \u0027container_updating_shard_ranges_skip_cache_pct\u0027, 0))"},{"line_number":233,"context_line":"        self.container_listing_shard_ranges_skip_cache_pct \u003d \\"},{"line_number":234,"context_line":"            config_percent_value(conf.get("}],"source_content_type":"text/x-python","patch_set":9,"id":"572c4780_3de6881b","line":231,"range":{"start_line":231,"start_character":12,"end_line":231,"end_character":32},"in_reply_to":"4d63375e_dc9682b4","updated":"2022-01-14 00:12:36.000000000","message":"Ack","commit_id":"379c29477665a33da4e227401c387067d0efc84b"}],"test/unit/__init__.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"420c05427e36d44b1536693c11e44d915fa5dbb7","unresolved":true,"context_lines":[{"line_number":410,"context_line":"        del self.calls[:]"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    def _called(self, method, key\u003dNone, value\u003dNone, time\u003dNone):"},{"line_number":413,"context_line":"        self.calls.append((method, key, value, time))"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    def get(self, key, skip_cache_pct\u003d0.0):"},{"line_number":416,"context_line":"        self._called(\u0027get\u0027, key, skip_cache_pct)"}],"source_content_type":"text/x-python","patch_set":6,"id":"f4fb910c_83b7bacf","line":413,"updated":"2022-01-04 19:31:35.000000000","message":"putting skip_cache_pct in value slot in the call log is sort of weird/dumb - but maybe this whole fake interface needs an overhaul","commit_id":"2be4eeb5c0406cc2b6609064e09ae5a8ddb72e50"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"96ebd9bf51e34cfae111148fc8ed6b8186e69684","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        del self.calls[:]"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    def _called(self, method, key\u003dNone, value\u003dNone, time\u003dNone):"},{"line_number":413,"context_line":"        self.calls.append((method, key, value, time))"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    def get(self, key, skip_cache_pct\u003d0.0):"},{"line_number":416,"context_line":"        self._called(\u0027get\u0027, key, skip_cache_pct)"}],"source_content_type":"text/x-python","patch_set":6,"id":"a0ae5522_148524ba","line":413,"in_reply_to":"f4fb910c_83b7bacf","updated":"2022-01-06 19:06:41.000000000","message":"Yeah, gonna overhaul all of this.","commit_id":"2be4eeb5c0406cc2b6609064e09ae5a8ddb72e50"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"420c05427e36d44b1536693c11e44d915fa5dbb7","unresolved":true,"context_lines":[{"line_number":413,"context_line":"        self.calls.append((method, key, value, time))"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    def get(self, key, skip_cache_pct\u003d0.0):"},{"line_number":416,"context_line":"        self._called(\u0027get\u0027, key, skip_cache_pct)"},{"line_number":417,"context_line":"        return self.store.get(key)"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"    def keys(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"6836833a_3543299b","line":416,"updated":"2022-01-04 19:31:35.000000000","message":"maybe just let the signature accept **kwargs and let skip_cache_pct be dropped on the floor?\n\nI guess in the proxy tests you seem to want to:\n\n1) test using this fake\n2) check the value of skip_cache_pct\n\nmaybe we could leave self.calls alone (with no skip_cache_pct) for legacy compat; then then keep a new self.mock_calls that has all the args and kwargs or something","commit_id":"2be4eeb5c0406cc2b6609064e09ae5a8ddb72e50"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"96ebd9bf51e34cfae111148fc8ed6b8186e69684","unresolved":false,"context_lines":[{"line_number":413,"context_line":"        self.calls.append((method, key, value, time))"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    def get(self, key, skip_cache_pct\u003d0.0):"},{"line_number":416,"context_line":"        self._called(\u0027get\u0027, key, skip_cache_pct)"},{"line_number":417,"context_line":"        return self.store.get(key)"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"    def keys(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"d068bf90_69c93241","line":416,"in_reply_to":"6836833a_3543299b","updated":"2022-01-06 19:06:41.000000000","message":"Reworking self.calls wasn\u0027t too bad -- a bit of churn, but not near as much as I feared.","commit_id":"2be4eeb5c0406cc2b6609064e09ae5a8ddb72e50"}],"test/unit/common/middleware/test_ratelimit.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f3c4f73c53fdc3bd0d5115e8f67026a2c096dd9","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        self.init_incr_return_neg \u003d False"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def get(self, key, allow_skip_cache\u003dFalse):"},{"line_number":41,"context_line":"        assert allow_skip_cache is True"},{"line_number":42,"context_line":"        return self.store.get(key)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def set(self, key, value, serialize\u003dFalse, time\u003d0):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_9d8be866","line":41,"updated":"2020-09-16 20:01:35.000000000","message":"but we didn\u0027t explicitly update memcache call sites in the ratelimit middleware - i wonder what\u0027s the implication there?","commit_id":"9d9f1692a2acf7a9f58567dfe639b7a2d3d021e7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"16c711268e6b2d141c25364d48d957ae37e618b8","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        self.init_incr_return_neg \u003d False"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def get(self, key, allow_skip_cache\u003dFalse):"},{"line_number":41,"context_line":"        assert allow_skip_cache is True"},{"line_number":42,"context_line":"        return self.store.get(key)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def set(self, key, value, serialize\u003dFalse, time\u003d0):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_f8fb1212","line":41,"in_reply_to":"9f560f44_9d8be866","updated":"2020-09-16 20:55:59.000000000","message":"They\u0027re all calls to get_account_info/get_container_info.\n\nratelimit uses memcache in its own right, but only ever with incr/decr.","commit_id":"9d9f1692a2acf7a9f58567dfe639b7a2d3d021e7"}],"test/unit/common/middleware/test_tempauth.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0f3c4f73c53fdc3bd0d5115e8f67026a2c096dd9","unresolved":false,"context_lines":[{"line_number":1816,"context_line":"        self.assertEqual(self.memcache.get_log, ["},{"line_number":1817,"context_line":"            (\u0027AUTH_/token/AUTH_t\u0027, False),"},{"line_number":1818,"context_line":"            (\u0027account/PRE2_acct\u0027, True),"},{"line_number":1819,"context_line":"        ])"},{"line_number":1820,"context_line":""},{"line_number":1821,"context_line":"    def test_invalid_tokens(self):"},{"line_number":1822,"context_line":"        conf \u003d {\u0027reseller_prefix\u0027: \u0027AUTH, PRE2\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_1df518ee","line":1819,"updated":"2020-09-16 20:01:35.000000000","message":"yeah, this is good","commit_id":"9d9f1692a2acf7a9f58567dfe639b7a2d3d021e7"}],"test/unit/common/test_memcached.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"420c05427e36d44b1536693c11e44d915fa5dbb7","unresolved":true,"context_lines":[{"line_number":437,"context_line":"                \u0027memcache.get.hit\u0027,"},{"line_number":438,"context_line":"                \u0027memcache.get.skip\u0027,"},{"line_number":439,"context_line":"                \u0027memcache.get.miss\u0027,"},{"line_number":440,"context_line":"            ])"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"    def test_get_failed_connection_mid_request(self):"},{"line_number":443,"context_line":"        memcache_client \u003d memcached.MemcacheRing([\u00271.2.3.4:11211\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"775f32ec_ce938885","line":440,"updated":"2022-01-04 19:31:35.000000000","message":"this is a pretty good test and demonsrates the interface nicely - KUDOS","commit_id":"2be4eeb5c0406cc2b6609064e09ae5a8ddb72e50"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"96ebd9bf51e34cfae111148fc8ed6b8186e69684","unresolved":false,"context_lines":[{"line_number":437,"context_line":"                \u0027memcache.get.hit\u0027,"},{"line_number":438,"context_line":"                \u0027memcache.get.skip\u0027,"},{"line_number":439,"context_line":"                \u0027memcache.get.miss\u0027,"},{"line_number":440,"context_line":"            ])"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"    def test_get_failed_connection_mid_request(self):"},{"line_number":443,"context_line":"        memcache_client \u003d memcached.MemcacheRing([\u00271.2.3.4:11211\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"62d899ee_81be6d8e","line":440,"in_reply_to":"775f32ec_ce938885","updated":"2022-01-06 19:06:41.000000000","message":"Ack","commit_id":"2be4eeb5c0406cc2b6609064e09ae5a8ddb72e50"}],"test/unit/proxy/controllers/test_container.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"420c05427e36d44b1536693c11e44d915fa5dbb7","unresolved":true,"context_lines":[{"line_number":2110,"context_line":"            \u0027X-Backend-Record-Type\u0027: \u0027shard\u0027,"},{"line_number":2111,"context_line":"            \u0027X-Backend-Sharding-State\u0027: sharding_state})"},{"line_number":2112,"context_line":"        self.assertEqual("},{"line_number":2113,"context_line":"            [(\u0027get\u0027, \u0027container/a/c\u0027, None, None),"},{"line_number":2114,"context_line":"             (\u0027set\u0027, \u0027shard-listing/a/c\u0027, self.sr_dicts,"},{"line_number":2115,"context_line":"              exp_recheck_listing),"},{"line_number":2116,"context_line":"             (\u0027set\u0027, \u0027container/a/c\u0027, mock.ANY, 60)],"}],"source_content_type":"text/x-python","patch_set":6,"id":"a35533be_53058125","side":"PARENT","line":2113,"updated":"2022-01-04 19:31:35.000000000","message":"this smells, right?  What was the 3rd slot in this \"signature\" representing before?","commit_id":"40e0f577a9d5fea6f9cee30092ac05f98fdb1687"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"96ebd9bf51e34cfae111148fc8ed6b8186e69684","unresolved":false,"context_lines":[{"line_number":2110,"context_line":"            \u0027X-Backend-Record-Type\u0027: \u0027shard\u0027,"},{"line_number":2111,"context_line":"            \u0027X-Backend-Sharding-State\u0027: sharding_state})"},{"line_number":2112,"context_line":"        self.assertEqual("},{"line_number":2113,"context_line":"            [(\u0027get\u0027, \u0027container/a/c\u0027, None, None),"},{"line_number":2114,"context_line":"             (\u0027set\u0027, \u0027shard-listing/a/c\u0027, self.sr_dicts,"},{"line_number":2115,"context_line":"              exp_recheck_listing),"},{"line_number":2116,"context_line":"             (\u0027set\u0027, \u0027container/a/c\u0027, mock.ANY, 60)],"}],"source_content_type":"text/x-python","patch_set":6,"id":"b822f18f_f31813e9","side":"PARENT","line":2113,"in_reply_to":"a35533be_53058125","updated":"2022-01-06 19:06:41.000000000","message":"Totally smells -- as did the three separate FakeMemcaches that needed signature updates. Next chain should be so much better :-)","commit_id":"40e0f577a9d5fea6f9cee30092ac05f98fdb1687"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"c01ffba13507ca6995c5b331a45d1aaca10ec3c9","unresolved":true,"context_lines":[{"line_number":2227,"context_line":"        self.logger.logger.log_dict[\u0027increment\u0027][:] \u003d []"},{"line_number":2228,"context_line":"        req \u003d self._build_request({\u0027X-Backend-Record-Type\u0027: record_type},"},{"line_number":2229,"context_line":"                                  {\u0027states\u0027: \u0027listing\u0027}, {})"},{"line_number":2230,"context_line":"        with mock.patch(\u0027random.random\u0027, return_value\u003d0.005):"},{"line_number":2231,"context_line":"            resp \u003d req.get_response(self.app)"},{"line_number":2232,"context_line":"        self._check_response(resp, self.sr_dicts, {"},{"line_number":2233,"context_line":"            \u0027X-Backend-Cached-Results\u0027: \u0027true\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"b9a4770d_6165f4b4","line":2230,"updated":"2022-01-20 01:26:01.000000000","message":"NIT: The different between the skip and hit is 0.0005 vs 0.005, which makes sense... but easy it miss the extra 0. I wonder if using something like 0.0011 could be more interesting and also obvious that it\u0027s bigger then the percent value (as well as boundry checking or maybe 0.001?).","commit_id":"bbf21dd9150845f46b56275cdb63bede53e26766"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bef3ba9a64879b58472dd95afca0d120d864aaf2","unresolved":false,"context_lines":[{"line_number":2227,"context_line":"        self.logger.logger.log_dict[\u0027increment\u0027][:] \u003d []"},{"line_number":2228,"context_line":"        req \u003d self._build_request({\u0027X-Backend-Record-Type\u0027: record_type},"},{"line_number":2229,"context_line":"                                  {\u0027states\u0027: \u0027listing\u0027}, {})"},{"line_number":2230,"context_line":"        with mock.patch(\u0027random.random\u0027, return_value\u003d0.005):"},{"line_number":2231,"context_line":"            resp \u003d req.get_response(self.app)"},{"line_number":2232,"context_line":"        self._check_response(resp, self.sr_dicts, {"},{"line_number":2233,"context_line":"            \u0027X-Backend-Cached-Results\u0027: \u0027true\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"b3315a7d_68a29726","line":2230,"in_reply_to":"b9a4770d_6165f4b4","updated":"2022-01-24 22:54:46.000000000","message":"Done","commit_id":"bbf21dd9150845f46b56275cdb63bede53e26766"}],"test/unit/proxy/test_server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"420c05427e36d44b1536693c11e44d915fa5dbb7","unresolved":true,"context_lines":[{"line_number":4138,"context_line":"                utils.ShardRange("},{"line_number":4139,"context_line":"                    \u0027.shards_a/c_nope\u0027, utils.Timestamp.now(), \u0027u\u0027, \u0027\u0027),"},{"line_number":4140,"context_line":"            ]"},{"line_number":4141,"context_line":"            cache \u003d FakeMemcache()"},{"line_number":4142,"context_line":"            cache.set(\u0027shard-updating/a/c\u0027, tuple("},{"line_number":4143,"context_line":"                dict(shard_range) for shard_range in shard_ranges))"},{"line_number":4144,"context_line":"            req \u003d Request.blank(\u0027/v1/a/c/o\u0027, {\u0027swift.cache\u0027: cache},"}],"source_content_type":"text/x-python","patch_set":6,"id":"8ebf5ac5_a3476a00","line":4141,"updated":"2022-01-04 19:31:35.000000000","message":"just to be clear - this Fake won\u0027t actually every *do* the skip (or cache eviction) - it\u0027s just tracking callers and \"get\" always returns whatever was \"set\"","commit_id":"2be4eeb5c0406cc2b6609064e09ae5a8ddb72e50"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"96ebd9bf51e34cfae111148fc8ed6b8186e69684","unresolved":false,"context_lines":[{"line_number":4138,"context_line":"                utils.ShardRange("},{"line_number":4139,"context_line":"                    \u0027.shards_a/c_nope\u0027, utils.Timestamp.now(), \u0027u\u0027, \u0027\u0027),"},{"line_number":4140,"context_line":"            ]"},{"line_number":4141,"context_line":"            cache \u003d FakeMemcache()"},{"line_number":4142,"context_line":"            cache.set(\u0027shard-updating/a/c\u0027, tuple("},{"line_number":4143,"context_line":"                dict(shard_range) for shard_range in shard_ranges))"},{"line_number":4144,"context_line":"            req \u003d Request.blank(\u0027/v1/a/c/o\u0027, {\u0027swift.cache\u0027: cache},"}],"source_content_type":"text/x-python","patch_set":6,"id":"f36514b6_4796f3d7","line":4141,"in_reply_to":"8ebf5ac5_a3476a00","updated":"2022-01-06 19:06:41.000000000","message":"Yep. Caller should verify the skip pct came through appropriately.","commit_id":"2be4eeb5c0406cc2b6609064e09ae5a8ddb72e50"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"420c05427e36d44b1536693c11e44d915fa5dbb7","unresolved":true,"context_lines":[{"line_number":4163,"context_line":"            actual_memcache_skip_pct \u003d ["},{"line_number":4164,"context_line":"                call[2] for call in cache.calls"},{"line_number":4165,"context_line":"                if (call[:2] \u003d\u003d (\u0027get\u0027, \u0027shard-updating/a/c\u0027))]"},{"line_number":4166,"context_line":"            self.assertEqual([1.0], actual_memcache_skip_pct, cache.calls)"},{"line_number":4167,"context_line":"            backend_requests \u003d fake_conn.requests"},{"line_number":4168,"context_line":"            account_request \u003d backend_requests[0]"},{"line_number":4169,"context_line":"            self._check_request("}],"source_content_type":"text/x-python","patch_set":6,"id":"6b8d6c6c_b6e4361e","line":4166,"updated":"2022-01-04 19:31:35.000000000","message":"oic, these cache.calls are NOT mock.call() entries","commit_id":"2be4eeb5c0406cc2b6609064e09ae5a8ddb72e50"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"96ebd9bf51e34cfae111148fc8ed6b8186e69684","unresolved":false,"context_lines":[{"line_number":4163,"context_line":"            actual_memcache_skip_pct \u003d ["},{"line_number":4164,"context_line":"                call[2] for call in cache.calls"},{"line_number":4165,"context_line":"                if (call[:2] \u003d\u003d (\u0027get\u0027, \u0027shard-updating/a/c\u0027))]"},{"line_number":4166,"context_line":"            self.assertEqual([1.0], actual_memcache_skip_pct, cache.calls)"},{"line_number":4167,"context_line":"            backend_requests \u003d fake_conn.requests"},{"line_number":4168,"context_line":"            account_request \u003d backend_requests[0]"},{"line_number":4169,"context_line":"            self._check_request("}],"source_content_type":"text/x-python","patch_set":6,"id":"9f1adcdf_8ec79a3d","line":4166,"in_reply_to":"6b8d6c6c_b6e4361e","updated":"2022-01-06 19:06:41.000000000","message":"But they will be!","commit_id":"2be4eeb5c0406cc2b6609064e09ae5a8ddb72e50"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"c01ffba13507ca6995c5b331a45d1aaca10ec3c9","unresolved":true,"context_lines":[{"line_number":4238,"context_line":"                dict(shard_range) for shard_range in cached_shard_ranges))"},{"line_number":4239,"context_line":"            req \u003d Request.blank("},{"line_number":4240,"context_line":"                \u0027/v1/a/c/o\u0027, {\u0027swift.cache\u0027: cache},"},{"line_number":4241,"context_line":"                method\u003dmethod, body\u003d\u0027\u0027, headers\u003d{\u0027Content-Type\u0027: \u0027text/plain\u0027})"},{"line_number":4242,"context_line":""},{"line_number":4243,"context_line":"            # we want the container_info response to say policy index of 1 and"},{"line_number":4244,"context_line":"            # sharding state"}],"source_content_type":"text/x-python","patch_set":11,"id":"8fba77b8_c017962d","line":4241,"updated":"2022-01-20 01:26:01.000000000","message":"I wonder if we should do test hit first and show that the cached_shard_ranges come from the cache, and when show skip. Bit like a sanity check but also showing the occasional skip behaviour?","commit_id":"bbf21dd9150845f46b56275cdb63bede53e26766"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bef3ba9a64879b58472dd95afca0d120d864aaf2","unresolved":false,"context_lines":[{"line_number":4238,"context_line":"                dict(shard_range) for shard_range in cached_shard_ranges))"},{"line_number":4239,"context_line":"            req \u003d Request.blank("},{"line_number":4240,"context_line":"                \u0027/v1/a/c/o\u0027, {\u0027swift.cache\u0027: cache},"},{"line_number":4241,"context_line":"                method\u003dmethod, body\u003d\u0027\u0027, headers\u003d{\u0027Content-Type\u0027: \u0027text/plain\u0027})"},{"line_number":4242,"context_line":""},{"line_number":4243,"context_line":"            # we want the container_info response to say policy index of 1 and"},{"line_number":4244,"context_line":"            # sharding state"}],"source_content_type":"text/x-python","patch_set":11,"id":"22e8499e_f0fe171c","line":4241,"in_reply_to":"8fba77b8_c017962d","updated":"2022-01-24 22:54:46.000000000","message":"I can try it -- IDK, though, this test already feels a little long for what all I actually want to demonstrate...","commit_id":"bbf21dd9150845f46b56275cdb63bede53e26766"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"26434693e7609894df85c5bc5d3f4d6ff3c07c88","unresolved":true,"context_lines":[{"line_number":4256,"context_line":"            ]"},{"line_number":4257,"context_line":"            body \u003d json.dumps(["},{"line_number":4258,"context_line":"                dict(shard_range)"},{"line_number":4259,"context_line":"                for shard_range in shard_ranges]).encode(\u0027ascii\u0027)"},{"line_number":4260,"context_line":"            with mock.patch(\u0027random.random\u0027, return_value\u003d1), \\"},{"line_number":4261,"context_line":"                 mocked_http_conn(*status_codes, headers\u003dresp_headers,"},{"line_number":4262,"context_line":"                                  body\u003dbody) as fake_conn:"}],"source_content_type":"text/x-python","patch_set":14,"id":"0f597de3_1276f5f6","line":4259,"updated":"2022-01-25 09:35:56.000000000","message":"we shouldn\u0027t need a body in this scenario if the shards are coming from cache","commit_id":"d6afbcf4b26d88d67cefa7e40ca13b026de12484"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ef85b9fdbf51e17c781a7ebcdcbea1911d6876d6","unresolved":false,"context_lines":[{"line_number":4256,"context_line":"            ]"},{"line_number":4257,"context_line":"            body \u003d json.dumps(["},{"line_number":4258,"context_line":"                dict(shard_range)"},{"line_number":4259,"context_line":"                for shard_range in shard_ranges]).encode(\u0027ascii\u0027)"},{"line_number":4260,"context_line":"            with mock.patch(\u0027random.random\u0027, return_value\u003d1), \\"},{"line_number":4261,"context_line":"                 mocked_http_conn(*status_codes, headers\u003dresp_headers,"},{"line_number":4262,"context_line":"                                  body\u003dbody) as fake_conn:"}],"source_content_type":"text/x-python","patch_set":14,"id":"73aebc2f_d8282341","line":4259,"in_reply_to":"0f597de3_1276f5f6","updated":"2022-01-26 18:15:55.000000000","message":"Done","commit_id":"d6afbcf4b26d88d67cefa7e40ca13b026de12484"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"26434693e7609894df85c5bc5d3f4d6ff3c07c88","unresolved":true,"context_lines":[{"line_number":4280,"context_line":"                \u0027/v1/a/c/o\u0027, {\u0027swift.cache\u0027: cache},"},{"line_number":4281,"context_line":"                method\u003dmethod, body\u003d\u0027\u0027, headers\u003d{\u0027Content-Type\u0027: \u0027text/plain\u0027})"},{"line_number":4282,"context_line":"            # we want the container_info response to say policy index of 1 and"},{"line_number":4283,"context_line":"            # sharding state"},{"line_number":4284,"context_line":"            # cont shard GET, obj POSTs"},{"line_number":4285,"context_line":"            status_codes \u003d (200, 202, 202, 202)"},{"line_number":4286,"context_line":"            resp_headers \u003d {\u0027X-Backend-Storage-Policy-Index\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":14,"id":"d8c3b42d_1822d598","line":4283,"updated":"2022-01-25 09:35:56.000000000","message":"this comment probably belongs up at line 4246 where we expect a HEAD to container","commit_id":"d6afbcf4b26d88d67cefa7e40ca13b026de12484"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ef85b9fdbf51e17c781a7ebcdcbea1911d6876d6","unresolved":false,"context_lines":[{"line_number":4280,"context_line":"                \u0027/v1/a/c/o\u0027, {\u0027swift.cache\u0027: cache},"},{"line_number":4281,"context_line":"                method\u003dmethod, body\u003d\u0027\u0027, headers\u003d{\u0027Content-Type\u0027: \u0027text/plain\u0027})"},{"line_number":4282,"context_line":"            # we want the container_info response to say policy index of 1 and"},{"line_number":4283,"context_line":"            # sharding state"},{"line_number":4284,"context_line":"            # cont shard GET, obj POSTs"},{"line_number":4285,"context_line":"            status_codes \u003d (200, 202, 202, 202)"},{"line_number":4286,"context_line":"            resp_headers \u003d {\u0027X-Backend-Storage-Policy-Index\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":14,"id":"8beb8981_1c8e6b9a","line":4283,"in_reply_to":"d8c3b42d_1822d598","updated":"2022-01-26 18:15:55.000000000","message":"Done","commit_id":"d6afbcf4b26d88d67cefa7e40ca13b026de12484"}]}
