)]}'
{"etc/object-server.conf-sample":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"6c9de73d8cb988985e7bb46d493d4e458544cce2","unresolved":true,"context_lines":[{"line_number":502,"context_line":"# action\u003dlog"},{"line_number":503,"context_line":"#"},{"line_number":504,"context_line":"# [object-auditor:watcher:swift#ppi_detritus]"},{"line_number":505,"context_line":"# reload_time \u003d 10.0"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"[object-expirer]"},{"line_number":508,"context_line":"# If this true, this expirer will execute tasks from legacy expirer task queue,"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"695a1461_b2600167","line":505,"updated":"2021-04-01 21:17:28.000000000","message":"Actually 15.0.","commit_id":"b7d319a36092bd8a6458282fef7012aa1bdd9671"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"7ea1f2295634cb60fbfc88be9e9d6c7c23fca743","unresolved":true,"context_lines":[{"line_number":502,"context_line":"# action\u003dlog"},{"line_number":503,"context_line":"#"},{"line_number":504,"context_line":"# [object-auditor:watcher:swift#ppi_detritus]"},{"line_number":505,"context_line":"# reload_time \u003d 10.0"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"[object-expirer]"},{"line_number":508,"context_line":"# If this true, this expirer will execute tasks from legacy expirer task queue,"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"89fb4ea4_f644ce2b","line":505,"updated":"2021-06-30 16:39:13.000000000","message":"Alistair made me document these options too.\nhttps://review.opendev.org/c/openstack/swift/+/788398/5/etc/object-server.conf-sample","commit_id":"0a073f79a7181329820aa07b159bfa6291913fab"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7cd6b8dd78f2211ccc8e583b3a7dbc3ad36b8e48","unresolved":false,"context_lines":[{"line_number":502,"context_line":"# action\u003dlog"},{"line_number":503,"context_line":"#"},{"line_number":504,"context_line":"# [object-auditor:watcher:swift#ppi_detritus]"},{"line_number":505,"context_line":"# reload_time \u003d 10.0"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"[object-expirer]"},{"line_number":508,"context_line":"# If this true, this expirer will execute tasks from legacy expirer task queue,"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"83b8ecbb_cb649205","line":505,"in_reply_to":"89fb4ea4_f644ce2b","updated":"2021-07-01 22:52:57.000000000","message":"Done","commit_id":"0a073f79a7181329820aa07b159bfa6291913fab"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1d1c7eaf8015d744752fe8dcf07956ea68ebb21f","unresolved":true,"context_lines":[{"line_number":536,"context_line":"#"},{"line_number":537,"context_line":"# [object-auditor:watcher:swift#ppi_detritus]"},{"line_number":538,"context_line":"# Check for ring changes no more often than once every this many seconds."},{"line_number":539,"context_line":"# reload_time \u003d 10.0"},{"line_number":540,"context_line":""},{"line_number":541,"context_line":"[object-expirer]"},{"line_number":542,"context_line":"# If this true, this expirer will execute tasks from legacy expirer task queue,"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"8371bcff_763da0d1","line":539,"updated":"2021-07-02 16:10:19.000000000","message":"Note that this may want to grow an action option similar to the dark-data watcher -- I\u0027m thinking log (current behavior) or relink (move it to the correct partition).","commit_id":"f0ea9d2d6255f0e471fd8670efdf8433dd247411"}],"swift/obj/watchers/ppi_detritus.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"6c9de73d8cb988985e7bb46d493d4e458544cce2","unresolved":true,"context_lines":[{"line_number":71,"context_line":"            self.stats[\u0027ok\u0027] +\u003d 1"},{"line_number":72,"context_line":"            return"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        for delta in range(1, part_power + 1):"},{"line_number":75,"context_line":"            part_tried \u003d get_partition_for_hash(obj_hash, part_power - delta)"},{"line_number":76,"context_line":"            if part_tried \u003d\u003d part:"},{"line_number":77,"context_line":"                if ring.next_part_power:"}],"source_content_type":"text/x-python","patch_set":1,"id":"e52c5f27_d19ba77c","line":74,"range":{"start_line":74,"start_character":0,"end_line":74,"end_character":1},"updated":"2021-04-01 21:17:28.000000000","message":"This chunk looks strangely pointless. I can see the merit in checking if the ring is in the middle of an increase, but what is the rest supposed to do?","commit_id":"b7d319a36092bd8a6458282fef7012aa1bdd9671"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e18373aa97ce9928c73ea283102b9f0b81512803","unresolved":true,"context_lines":[{"line_number":71,"context_line":"            self.stats[\u0027ok\u0027] +\u003d 1"},{"line_number":72,"context_line":"            return"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        for delta in range(1, part_power + 1):"},{"line_number":75,"context_line":"            part_tried \u003d get_partition_for_hash(obj_hash, part_power - delta)"},{"line_number":76,"context_line":"            if part_tried \u003d\u003d part:"},{"line_number":77,"context_line":"                if ring.next_part_power:"}],"source_content_type":"text/x-python","patch_set":1,"id":"660907cf_5dc4c3ce","line":74,"range":{"start_line":74,"start_character":0,"end_line":74,"end_character":1},"in_reply_to":"e52c5f27_d19ba77c","updated":"2021-04-01 21:47:29.000000000","message":"It\u0027s to figure out which stale part power the diskfile was from.\n\nFor example, suppose you\u0027ve got a policy that started out with part power 16 and you\u0027ve increased it to 17 then 18. But you\u0027re worried that you may have missed relinking/cleaning up some old partitions (during either or both of those part power increases) -- this can let you know not only whether there are stale partitions, but also whether they were from part power 16 or 17.","commit_id":"b7d319a36092bd8a6458282fef7012aa1bdd9671"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e18373aa97ce9928c73ea283102b9f0b81512803","unresolved":true,"context_lines":[{"line_number":81,"context_line":"                        \u0027be in partition %d\u0027,"},{"line_number":82,"context_line":"                        part_power - delta, ring.next_part_power,"},{"line_number":83,"context_line":"                        data_file_path, exp_part)"},{"line_number":84,"context_line":"                    self.stats[\u0027mid_increase\u0027] +\u003d 1"},{"line_number":85,"context_line":"                else:"},{"line_number":86,"context_line":"                    self.logger.warning("},{"line_number":87,"context_line":"                        \u0027Found file in stale partition from part power %d: \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"f0712680_e5dccd21","line":84,"updated":"2021-04-01 21:47:29.000000000","message":"This is maybe a little loosey-goosey -- if you\u0027re mid-increase going from 17-\u003e18, it seems reasonable to still record ones from 16 as \"stale\" instead of \"mid_increase\".","commit_id":"b7d319a36092bd8a6458282fef7012aa1bdd9671"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a7cd2a12baa43434c17f9e7d6fac1b71c3fd5ba2","unresolved":true,"context_lines":[{"line_number":22,"context_line":"from swift.common.utils import get_partition_for_hash"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class PPIDetritusWatcher(object):"},{"line_number":26,"context_line":"    def __init__(self, conf, logger):"},{"line_number":27,"context_line":"        self.swift_dir \u003d conf.get(\u0027swift_dir\u0027, \u0027/etc/swift\u0027)"},{"line_number":28,"context_line":"        self.reload_time \u003d float(conf.get(\u0027reload_time\u0027, DEFAULT_RELOAD_TIME))"}],"source_content_type":"text/x-python","patch_set":2,"id":"639d3f04_97f7f185","line":25,"updated":"2021-07-01 05:36:29.000000000","message":"Lol, what a name, had to look that up 😊","commit_id":"0a073f79a7181329820aa07b159bfa6291913fab"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a7cd2a12baa43434c17f9e7d6fac1b71c3fd5ba2","unresolved":true,"context_lines":[{"line_number":87,"context_line":"                        \u0027Found file in stale partition from part power %d: \u0027"},{"line_number":88,"context_line":"                        \u0027expected %r to be in partition %d\u0027,"},{"line_number":89,"context_line":"                        part_power - delta, data_file_path, exp_part)"},{"line_number":90,"context_line":"                    self.stats[\u0027stale:%d\u0027 % delta] +\u003d 1"},{"line_number":91,"context_line":"                return"},{"line_number":92,"context_line":"            if part_tried \u003c part:"},{"line_number":93,"context_line":"                break"}],"source_content_type":"text/x-python","patch_set":2,"id":"045ce7d4_d6f01267","line":90,"updated":"2021-07-01 05:36:29.000000000","message":"Cool, it tells you from when it should\u0027ve been relinked but became stale. Nice!\n\nAlthough not sure about ising the delta as the number here. 1 that means you need to know the current PP to grok where it went wrong. and 2, it isn\u0027t obvious in the output. Maybe make this the PP that was tried?\n\n  self.stats[\u0027state:%d\u0027 % part-power - delta] +\u003d 1","commit_id":"0a073f79a7181329820aa07b159bfa6291913fab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7878541693cb2ba72cb7544ef61b458395de583d","unresolved":true,"context_lines":[{"line_number":76,"context_line":"            if part_tried \u003d\u003d part:"},{"line_number":77,"context_line":"                if ring.next_part_power:"},{"line_number":78,"context_line":"                    self.logger.info("},{"line_number":79,"context_line":"                        \u0027Found file in stale partition from part power %d, \u0027"},{"line_number":80,"context_line":"                        \u0027but the ring is mid-increase to %d: expected %r to \u0027"},{"line_number":81,"context_line":"                        \u0027be in partition %d\u0027,"},{"line_number":82,"context_line":"                        old_part_power, ring.next_part_power,"}],"source_content_type":"text/x-python","patch_set":3,"id":"a09f83be_00072340","line":79,"range":{"start_line":79,"start_character":39,"end_line":79,"end_character":44},"updated":"2021-07-02 13:33:21.000000000","message":"during PPI relink the old part power isn\u0027t really \u0027stale\u0027 - that\u0027s where client requests are directed - so might be best to avoid giving the impression that the file is somehow state and no longer needed","commit_id":"f0ea9d2d6255f0e471fd8670efdf8433dd247411"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1d1c7eaf8015d744752fe8dcf07956ea68ebb21f","unresolved":true,"context_lines":[{"line_number":76,"context_line":"            if part_tried \u003d\u003d part:"},{"line_number":77,"context_line":"                if ring.next_part_power:"},{"line_number":78,"context_line":"                    self.logger.info("},{"line_number":79,"context_line":"                        \u0027Found file in stale partition from part power %d, \u0027"},{"line_number":80,"context_line":"                        \u0027but the ring is mid-increase to %d: expected %r to \u0027"},{"line_number":81,"context_line":"                        \u0027be in partition %d\u0027,"},{"line_number":82,"context_line":"                        old_part_power, ring.next_part_power,"}],"source_content_type":"text/x-python","patch_set":3,"id":"54f41867_dbaef383","line":79,"range":{"start_line":79,"start_character":39,"end_line":79,"end_character":44},"in_reply_to":"a09f83be_00072340","updated":"2021-07-02 16:10:19.000000000","message":"This catches both files from the current increase and any prior increase (which *does* seem to deserve getting called \"stale\"). I\u0027ll drop it for now since that isn\u0027t the expected or common case, but I\u0027ll keep thinking about how to disambiguate the cases.","commit_id":"f0ea9d2d6255f0e471fd8670efdf8433dd247411"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7878541693cb2ba72cb7544ef61b458395de583d","unresolved":true,"context_lines":[{"line_number":89,"context_line":"                        old_part_power, data_file_path, exp_part)"},{"line_number":90,"context_line":"                    self.stats[\u0027stale:%d\u0027 % old_part_power] +\u003d 1"},{"line_number":91,"context_line":"                return"},{"line_number":92,"context_line":"            if part_tried \u003c part:"},{"line_number":93,"context_line":"                break"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        self.logger.warning("}],"source_content_type":"text/x-python","patch_set":3,"id":"5c0116b2_5178a11b","line":92,"updated":"2021-07-02 13:33:21.000000000","message":"nit: maybe move to line 76 i.e. have the break condition earlier","commit_id":"f0ea9d2d6255f0e471fd8670efdf8433dd247411"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1d1c7eaf8015d744752fe8dcf07956ea68ebb21f","unresolved":true,"context_lines":[{"line_number":89,"context_line":"                        old_part_power, data_file_path, exp_part)"},{"line_number":90,"context_line":"                    self.stats[\u0027stale:%d\u0027 % old_part_power] +\u003d 1"},{"line_number":91,"context_line":"                return"},{"line_number":92,"context_line":"            if part_tried \u003c part:"},{"line_number":93,"context_line":"                break"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        self.logger.warning("}],"source_content_type":"text/x-python","patch_set":3,"id":"58a6eb6d_d35cd750","line":92,"in_reply_to":"5c0116b2_5178a11b","updated":"2021-07-02 16:10:19.000000000","message":"Yeah, probably improves readability a bit. Will fix.","commit_id":"f0ea9d2d6255f0e471fd8670efdf8433dd247411"}],"test/unit/obj/watchers/test_ppi_detritus.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a7cd2a12baa43434c17f9e7d6fac1b71c3fd5ba2","unresolved":true,"context_lines":[{"line_number":58,"context_line":"            \u0027bad\u0027: 1,"},{"line_number":59,"context_line":"            \u0027stale:1\u0027: 1,"},{"line_number":60,"context_line":"            \u0027stale:3\u0027: 1,"},{"line_number":61,"context_line":"            \u0027stale:10\u0027: 1,"},{"line_number":62,"context_line":"        })"},{"line_number":63,"context_line":"        w.end()"},{"line_number":64,"context_line":"        self.assertEqual(w.logger.get_lines_for_level(\u0027warning\u0027), ["}],"source_content_type":"text/x-python","patch_set":2,"id":"d7c41271_7c72e0c3","line":61,"updated":"2021-07-01 05:36:29.000000000","message":"OK, So the number on the end if how many part power\u0027s it had to go back? That seems hard to grok to me. Can we just make it the partpower it was from. Like \u0027stale:9\u0027 would be stale from partpower 9? rather then \u0027state:1\u0027 to mean stale from partpower 9.. because we\u0027d need to know the current PP to have any idea that it means.","commit_id":"0a073f79a7181329820aa07b159bfa6291913fab"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7cd6b8dd78f2211ccc8e583b3a7dbc3ad36b8e48","unresolved":false,"context_lines":[{"line_number":58,"context_line":"            \u0027bad\u0027: 1,"},{"line_number":59,"context_line":"            \u0027stale:1\u0027: 1,"},{"line_number":60,"context_line":"            \u0027stale:3\u0027: 1,"},{"line_number":61,"context_line":"            \u0027stale:10\u0027: 1,"},{"line_number":62,"context_line":"        })"},{"line_number":63,"context_line":"        w.end()"},{"line_number":64,"context_line":"        self.assertEqual(w.logger.get_lines_for_level(\u0027warning\u0027), ["}],"source_content_type":"text/x-python","patch_set":2,"id":"45b7c996_3e7eb1fe","line":61,"in_reply_to":"d7c41271_7c72e0c3","updated":"2021-07-01 22:52:57.000000000","message":"Sure, I can get behind that idea. Part of why I\u0027d done it this way was to have the stats mean roughly the same thing regardless of what part power you\u0027re currently on. But having the actual old part power seems like it could be useful, too. I suppose if I were graphing it, I\u0027d probably lump them all together as something like\n\n- ok\n- mid_increase\n- stale:*\n- bad","commit_id":"0a073f79a7181329820aa07b159bfa6291913fab"}]}
