)]}'
{"swift/cli/relinker.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"83dc950a9060eb689000da11a335fdc5502bb02a","unresolved":true,"context_lines":[{"line_number":438,"context_line":""},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"def relink(conf, logger, device):"},{"line_number":441,"context_line":"    return Relink(conf, logger, device).run()"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"def cleanup(conf, logger, device):"}],"source_content_type":"text/x-python","patch_set":1,"id":"b69ff9dc_524b02d3","line":441,"updated":"2021-03-09 23:20:44.000000000","message":"Nice, I wonder if we could have a:\n\n def check\n\nWhich might just be a Relink with a dry_run option? or if it\u0027s just checking existance of the links then a new child clas.","commit_id":"32a4996704a336e0941c3a6e5723ef9a10219a11"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0acbc89d9bb33445e6251c29d347bd3e905e2943","unresolved":true,"context_lines":[{"line_number":438,"context_line":""},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"def relink(conf, logger, device):"},{"line_number":441,"context_line":"    return Relink(conf, logger, device).run()"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"def cleanup(conf, logger, device):"}],"source_content_type":"text/x-python","patch_set":1,"id":"832a58d1_16228e97","line":441,"in_reply_to":"b69ff9dc_524b02d3","updated":"2021-03-10 11:24:24.000000000","message":"yes, maybe.\n\nWhere I ended up on this patch chain is a single chunk of code that finds what files exist in old dir *and which need to be linked*. Currently we try to link to anything that exists, and it\u0027s currently hard to be sure when all *necessary* links exist. \n\nIn the new world my thinking is that a \u0027check\u0027 step could simply be a relink step that found no links needed.\n\nThen I realised that when cleaning up, if we found files that need relinking, why not relink them right there? So a cleanup step becomes a relink step that removes files if all is looking good.\n\nSo, the process becomes (after everything on this patch chain):\n1. relink - reports how many links were created\n2, repeat relink until no links created\n3. move ring to next part power\n4. relink with cleanup\u003dTrue - report if any links were created (unexpected)\n5. maybe repeat 4 until no links created just to be sure","commit_id":"32a4996704a336e0941c3a6e5723ef9a10219a11"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"eca57bb22955e0fa912d1a9b7458da62130363ad","unresolved":true,"context_lines":[{"line_number":258,"context_line":"        policy.load_ring(conf[\u0027swift_dir\u0027])"},{"line_number":259,"context_line":"        part_power \u003d policy.object_ring.part_power"},{"line_number":260,"context_line":"        next_part_power \u003d policy.object_ring.next_part_power"},{"line_number":261,"context_line":"        if not next_part_power or next_part_power \u003d\u003d part_power:"},{"line_number":262,"context_line":"            continue"},{"line_number":263,"context_line":"        logger.info(\u0027Relinking files for policy %s under %s\u0027,"},{"line_number":264,"context_line":"                    policy.name, conf[\u0027devices\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"50fae9bc_c6b4c81d","side":"PARENT","line":261,"range":{"start_line":261,"start_character":31,"end_line":261,"end_character":63},"updated":"2021-03-15 23:18:17.000000000","message":"Oh yeah, and we lost this part -- but it\u0027s probably for the best?","commit_id":"59239af2b2c9b5d6896f3b2a8f80b569d2a5ac62"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d355170197bf3147c1d9a41c4ee60489cfe776e8","unresolved":true,"context_lines":[{"line_number":258,"context_line":"        policy.load_ring(conf[\u0027swift_dir\u0027])"},{"line_number":259,"context_line":"        part_power \u003d policy.object_ring.part_power"},{"line_number":260,"context_line":"        next_part_power \u003d policy.object_ring.next_part_power"},{"line_number":261,"context_line":"        if not next_part_power or next_part_power \u003d\u003d part_power:"},{"line_number":262,"context_line":"            continue"},{"line_number":263,"context_line":"        logger.info(\u0027Relinking files for policy %s under %s\u0027,"},{"line_number":264,"context_line":"                    policy.name, conf[\u0027devices\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba50e0b0_96845c06","side":"PARENT","line":261,"range":{"start_line":261,"start_character":31,"end_line":261,"end_character":63},"in_reply_to":"285766af_ce76389e","updated":"2021-03-18 14:18:10.000000000","message":"I think we may need to change some things in partitions_filter and hook_post_partition if we want relink to run on a increased ring","commit_id":"59239af2b2c9b5d6896f3b2a8f80b569d2a5ac62"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bb7c840d0f77e5afcd6dce730e7539b2444267c9","unresolved":true,"context_lines":[{"line_number":258,"context_line":"        policy.load_ring(conf[\u0027swift_dir\u0027])"},{"line_number":259,"context_line":"        part_power \u003d policy.object_ring.part_power"},{"line_number":260,"context_line":"        next_part_power \u003d policy.object_ring.next_part_power"},{"line_number":261,"context_line":"        if not next_part_power or next_part_power \u003d\u003d part_power:"},{"line_number":262,"context_line":"            continue"},{"line_number":263,"context_line":"        logger.info(\u0027Relinking files for policy %s under %s\u0027,"},{"line_number":264,"context_line":"                    policy.name, conf[\u0027devices\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"285766af_ce76389e","side":"PARENT","line":261,"range":{"start_line":261,"start_character":31,"end_line":261,"end_character":63},"in_reply_to":"399c56e5_5d93cb1c","updated":"2021-03-18 12:19:13.000000000","message":"agree it would be useful to be able to relink after increase, but before if we had multiple policies, some in prepared state and some in increased state then relink would only select those in prepared state - that still seems like a useful feature, so you could be relinking one policy and cleaning up another without the relinking straying into the clean-up policy.\n\nHow about we have the --policy override the part power checks so that the tool *can* relink a policy whose part power has been increased, but by default wouldn\u0027t?","commit_id":"59239af2b2c9b5d6896f3b2a8f80b569d2a5ac62"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"07bc42dcc5171fad15074be08afa41fb95f1c6f0","unresolved":true,"context_lines":[{"line_number":258,"context_line":"        policy.load_ring(conf[\u0027swift_dir\u0027])"},{"line_number":259,"context_line":"        part_power \u003d policy.object_ring.part_power"},{"line_number":260,"context_line":"        next_part_power \u003d policy.object_ring.next_part_power"},{"line_number":261,"context_line":"        if not next_part_power or next_part_power \u003d\u003d part_power:"},{"line_number":262,"context_line":"            continue"},{"line_number":263,"context_line":"        logger.info(\u0027Relinking files for policy %s under %s\u0027,"},{"line_number":264,"context_line":"                    policy.name, conf[\u0027devices\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"b7b08d81_78dc3b31","side":"PARENT","line":261,"range":{"start_line":261,"start_character":31,"end_line":261,"end_character":63},"in_reply_to":"50fae9bc_c6b4c81d","updated":"2021-03-17 18:39:45.000000000","message":"hmmm, I want to check that","commit_id":"59239af2b2c9b5d6896f3b2a8f80b569d2a5ac62"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1e3ca61728010257ed9523254a0c988a55720ab1","unresolved":true,"context_lines":[{"line_number":258,"context_line":"        policy.load_ring(conf[\u0027swift_dir\u0027])"},{"line_number":259,"context_line":"        part_power \u003d policy.object_ring.part_power"},{"line_number":260,"context_line":"        next_part_power \u003d policy.object_ring.next_part_power"},{"line_number":261,"context_line":"        if not next_part_power or next_part_power \u003d\u003d part_power:"},{"line_number":262,"context_line":"            continue"},{"line_number":263,"context_line":"        logger.info(\u0027Relinking files for policy %s under %s\u0027,"},{"line_number":264,"context_line":"                    policy.name, conf[\u0027devices\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"399c56e5_5d93cb1c","side":"PARENT","line":261,"range":{"start_line":261,"start_character":31,"end_line":261,"end_character":63},"in_reply_to":"b7b08d81_78dc3b31","updated":"2021-03-17 18:55:03.000000000","message":"fwiw, we had to actively work around this last time, setting up a separate tmpdir with the old ring, so we could relink again before cleaning up. With the new cleanup checks, I don\u0027t think that will be so necessary, but I could see someone wanting some warm \u0026 fuzzies by doing a process like\n\n1. prepare increase\n2. relink\n3. increase\n4. relink again\n5. clean up\n6. finish increase","commit_id":"59239af2b2c9b5d6896f3b2a8f80b569d2a5ac62"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2af910e02738c1e731034f078b7e31011e08506f","unresolved":true,"context_lines":[{"line_number":258,"context_line":"        policy.load_ring(conf[\u0027swift_dir\u0027])"},{"line_number":259,"context_line":"        part_power \u003d policy.object_ring.part_power"},{"line_number":260,"context_line":"        next_part_power \u003d policy.object_ring.next_part_power"},{"line_number":261,"context_line":"        if not next_part_power or next_part_power \u003d\u003d part_power:"},{"line_number":262,"context_line":"            continue"},{"line_number":263,"context_line":"        logger.info(\u0027Relinking files for policy %s under %s\u0027,"},{"line_number":264,"context_line":"                    policy.name, conf[\u0027devices\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"e245ef82_c1c1a7ac","side":"PARENT","line":261,"range":{"start_line":261,"start_character":31,"end_line":261,"end_character":63},"in_reply_to":"ba50e0b0_96845c06","updated":"2021-03-18 19:00:53.000000000","message":"Thanks for fixing this -- yeah, I can see how running relink on a next_part_power\u003d\u003dpart_power ring is going to be a little fraught and definitely out of scope for this change.\n\nThe --policy override idea is interesting, though I wonder if we\u0027d actually want it to be a separate, explicit flag. I\u0027m also realizing we may want a --clear-state flag or something to nuke the state file(s) at the start of a run. Currently, I think a running relink a second time will trivially succeed without actually looking at any partitions.","commit_id":"59239af2b2c9b5d6896f3b2a8f80b569d2a5ac62"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"877814775acebd2bdcf7d98a4d54532ff8cd245e","unresolved":true,"context_lines":[{"line_number":317,"context_line":"                    self.logger.debug("},{"line_number":318,"context_line":"                        \"Relinking (cleanup) created link: %s to %s\","},{"line_number":319,"context_line":"                        old_file, new_file)"},{"line_number":320,"context_line":"                    created_links +\u003d 1"},{"line_number":321,"context_line":"            except OSError as exc:"},{"line_number":322,"context_line":"                self.logger.warning("},{"line_number":323,"context_line":"                    \"Error relinking (cleanup): failed to relink %s to \""}],"source_content_type":"text/x-python","patch_set":4,"id":"5996b2f2_214b6dad","line":320,"range":{"start_line":320,"start_character":20,"end_line":320,"end_character":38},"updated":"2021-03-15 23:07:19.000000000","message":"We\u0027re not putting this in self.stats?","commit_id":"56c6858b8f012b461e6b7c7ea766c56c65d2c27b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"877814775acebd2bdcf7d98a4d54532ff8cd245e","unresolved":true,"context_lines":[{"line_number":357,"context_line":"    def process_policy(self, policy):"},{"line_number":358,"context_line":"        self.logger.info("},{"line_number":359,"context_line":"            \u0027Processing files for policy %s under %s (cleanup\u003d%s)\u0027,"},{"line_number":360,"context_line":"            policy.name, self.root, self.do_cleanup)"},{"line_number":361,"context_line":"        self.policy \u003d policy"},{"line_number":362,"context_line":"        self.stats[\u0027policies\u0027] +\u003d 1"},{"line_number":363,"context_line":"        self.part_power \u003d self.policy.object_ring.part_power"}],"source_content_type":"text/x-python","patch_set":4,"id":"4e5f9ee8_9da40fe1","line":360,"range":{"start_line":360,"start_character":25,"end_line":360,"end_character":34},"updated":"2021-03-15 23:07:19.000000000","message":"So when we\u0027re running against a single device, this will include the device in the path. Different, but good.","commit_id":"56c6858b8f012b461e6b7c7ea766c56c65d2c27b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"877814775acebd2bdcf7d98a4d54532ff8cd245e","unresolved":true,"context_lines":[{"line_number":358,"context_line":"        self.logger.info("},{"line_number":359,"context_line":"            \u0027Processing files for policy %s under %s (cleanup\u003d%s)\u0027,"},{"line_number":360,"context_line":"            policy.name, self.root, self.do_cleanup)"},{"line_number":361,"context_line":"        self.policy \u003d policy"},{"line_number":362,"context_line":"        self.stats[\u0027policies\u0027] +\u003d 1"},{"line_number":363,"context_line":"        self.part_power \u003d self.policy.object_ring.part_power"},{"line_number":364,"context_line":"        self.next_part_power \u003d self.policy.object_ring.next_part_power"}],"source_content_type":"text/x-python","patch_set":4,"id":"797598ca_09f87e2b","line":361,"updated":"2021-03-15 23:07:19.000000000","message":"Does this actually need to be a property? Seems like we only use it here. Or is that going to change with the next patch?\n\nIt just seems weird that we\u0027ll mutate this as we\u0027re processing...","commit_id":"56c6858b8f012b461e6b7c7ea766c56c65d2c27b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bb7c840d0f77e5afcd6dce730e7539b2444267c9","unresolved":true,"context_lines":[{"line_number":358,"context_line":"        self.logger.info("},{"line_number":359,"context_line":"            \u0027Processing files for policy %s under %s (cleanup\u003d%s)\u0027,"},{"line_number":360,"context_line":"            policy.name, self.root, self.do_cleanup)"},{"line_number":361,"context_line":"        self.policy \u003d policy"},{"line_number":362,"context_line":"        self.stats[\u0027policies\u0027] +\u003d 1"},{"line_number":363,"context_line":"        self.part_power \u003d self.policy.object_ring.part_power"},{"line_number":364,"context_line":"        self.next_part_power \u003d self.policy.object_ring.next_part_power"}],"source_content_type":"text/x-python","patch_set":4,"id":"74b0bd96_9aaa8169","line":361,"in_reply_to":"797598ca_09f87e2b","updated":"2021-03-18 12:19:13.000000000","message":"no it is not necessary, will fix\n\nIf we were to get rid of the partial callbacks and make them all methods of this class then self.policy would be used.","commit_id":"56c6858b8f012b461e6b7c7ea766c56c65d2c27b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"877814775acebd2bdcf7d98a4d54532ff8cd245e","unresolved":true,"context_lines":[{"line_number":359,"context_line":"            \u0027Processing files for policy %s under %s (cleanup\u003d%s)\u0027,"},{"line_number":360,"context_line":"            policy.name, self.root, self.do_cleanup)"},{"line_number":361,"context_line":"        self.policy \u003d policy"},{"line_number":362,"context_line":"        self.stats[\u0027policies\u0027] +\u003d 1"},{"line_number":363,"context_line":"        self.part_power \u003d self.policy.object_ring.part_power"},{"line_number":364,"context_line":"        self.next_part_power \u003d self.policy.object_ring.next_part_power"},{"line_number":365,"context_line":"        self.diskfile_mgr \u003d self.diskfile_router[policy]"}],"source_content_type":"text/x-python","patch_set":4,"id":"21c0193b_91bc8ff9","line":362,"updated":"2021-03-15 23:07:19.000000000","message":"So this is a bit of a change -- we use this to determine whether to log about not finding a policy, but\n\n* previously we wanted to make sure we actually *found data* in at least one policy, where\n* now we\u0027ll just make sure *there exists a policy* in the appropriate state.\n\nI think I like this better, though.","commit_id":"56c6858b8f012b461e6b7c7ea766c56c65d2c27b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bb7c840d0f77e5afcd6dce730e7539b2444267c9","unresolved":true,"context_lines":[{"line_number":359,"context_line":"            \u0027Processing files for policy %s under %s (cleanup\u003d%s)\u0027,"},{"line_number":360,"context_line":"            policy.name, self.root, self.do_cleanup)"},{"line_number":361,"context_line":"        self.policy \u003d policy"},{"line_number":362,"context_line":"        self.stats[\u0027policies\u0027] +\u003d 1"},{"line_number":363,"context_line":"        self.part_power \u003d self.policy.object_ring.part_power"},{"line_number":364,"context_line":"        self.next_part_power \u003d self.policy.object_ring.next_part_power"},{"line_number":365,"context_line":"        self.diskfile_mgr \u003d self.diskfile_router[policy]"}],"source_content_type":"text/x-python","patch_set":4,"id":"3e802e32_f53b7fa3","line":362,"in_reply_to":"21c0193b_91bc8ff9","updated":"2021-03-18 12:19:13.000000000","message":"I\u0027m not sure there is a change - see line 265 in Base - we set found_policy\u003dTrue before visiting any data dirs.","commit_id":"56c6858b8f012b461e6b7c7ea766c56c65d2c27b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2af910e02738c1e731034f078b7e31011e08506f","unresolved":true,"context_lines":[{"line_number":359,"context_line":"            \u0027Processing files for policy %s under %s (cleanup\u003d%s)\u0027,"},{"line_number":360,"context_line":"            policy.name, self.root, self.do_cleanup)"},{"line_number":361,"context_line":"        self.policy \u003d policy"},{"line_number":362,"context_line":"        self.stats[\u0027policies\u0027] +\u003d 1"},{"line_number":363,"context_line":"        self.part_power \u003d self.policy.object_ring.part_power"},{"line_number":364,"context_line":"        self.next_part_power \u003d self.policy.object_ring.next_part_power"},{"line_number":365,"context_line":"        self.diskfile_mgr \u003d self.diskfile_router[policy]"}],"source_content_type":"text/x-python","patch_set":4,"id":"6cd097e4_42bd78b8","line":362,"in_reply_to":"3e802e32_f53b7fa3","updated":"2021-03-18 19:00:53.000000000","message":"You\u0027re right, my bad -- I was thinking of the relinked counter.","commit_id":"56c6858b8f012b461e6b7c7ea766c56c65d2c27b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"877814775acebd2bdcf7d98a4d54532ff8cd245e","unresolved":true,"context_lines":[{"line_number":394,"context_line":"            hashes_filter\u003drun_hashes_filter,"},{"line_number":395,"context_line":"            logger\u003dself.logger,"},{"line_number":396,"context_line":"            error_counter\u003dself.stats,"},{"line_number":397,"context_line":"            yield_hash_dirs\u003dself.do_cleanup"},{"line_number":398,"context_line":"        )"},{"line_number":399,"context_line":"        if self.conf[\u0027files_per_second\u0027] \u003e 0:"},{"line_number":400,"context_line":"            locations \u003d RateLimitedIterator("}],"source_content_type":"text/x-python","patch_set":4,"id":"da0e2870_674ebb5d","line":397,"range":{"start_line":397,"start_character":12,"end_line":397,"end_character":43},"updated":"2021-03-15 23:07:19.000000000","message":"Oh, interesting... so --files-per-second means different things for relink vs cleanup...\n\nMaybe I should have named it --hashes-per-second.","commit_id":"56c6858b8f012b461e6b7c7ea766c56c65d2c27b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bb7c840d0f77e5afcd6dce730e7539b2444267c9","unresolved":true,"context_lines":[{"line_number":394,"context_line":"            hashes_filter\u003drun_hashes_filter,"},{"line_number":395,"context_line":"            logger\u003dself.logger,"},{"line_number":396,"context_line":"            error_counter\u003dself.stats,"},{"line_number":397,"context_line":"            yield_hash_dirs\u003dself.do_cleanup"},{"line_number":398,"context_line":"        )"},{"line_number":399,"context_line":"        if self.conf[\u0027files_per_second\u0027] \u003e 0:"},{"line_number":400,"context_line":"            locations \u003d RateLimitedIterator("}],"source_content_type":"text/x-python","patch_set":4,"id":"cb8e0d10_dfd597b8","line":397,"range":{"start_line":397,"start_character":12,"end_line":397,"end_character":43},"in_reply_to":"da0e2870_674ebb5d","updated":"2021-03-18 12:19:13.000000000","message":"we could think of it as diskfiles-per-second","commit_id":"56c6858b8f012b461e6b7c7ea766c56c65d2c27b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"877814775acebd2bdcf7d98a4d54532ff8cd245e","unresolved":true,"context_lines":[{"line_number":408,"context_line":"    def run(self):"},{"line_number":409,"context_line":"        self._zero_stats()"},{"line_number":410,"context_line":"        for policy in POLICIES:"},{"line_number":411,"context_line":"            policy.object_ring \u003d None  # Ensure it will be reloaded"},{"line_number":412,"context_line":"            policy.load_ring(self.conf[\u0027swift_dir\u0027])"},{"line_number":413,"context_line":"            ring \u003d policy.object_ring"},{"line_number":414,"context_line":"            if not ring.next_part_power:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3c2af3de_9214b3b6","line":411,"updated":"2021-03-15 23:07:19.000000000","message":"I know this is pre-existing, but I feel like we should\u0027ve done this in test setup instead...","commit_id":"56c6858b8f012b461e6b7c7ea766c56c65d2c27b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"877814775acebd2bdcf7d98a4d54532ff8cd245e","unresolved":true,"context_lines":[{"line_number":428,"context_line":"        action_errors \u003d self.stats.pop(\u0027errors\u0027)"},{"line_number":429,"context_line":"        unmounted \u003d self.stats.pop(\u0027unmounted\u0027, 0)"},{"line_number":430,"context_line":"        if unmounted:"},{"line_number":431,"context_line":"            self.logger.warning(\u0027%d disks were unmounted\u0027, unmounted)"},{"line_number":432,"context_line":"        listdir_errors \u003d self.stats.pop(\u0027unlistable_partitions\u0027, 0)"},{"line_number":433,"context_line":"        if listdir_errors:"},{"line_number":434,"context_line":"            self.logger.warning("}],"source_content_type":"text/x-python","patch_set":4,"id":"16b64950_82d5395d","line":431,"updated":"2021-03-15 23:07:19.000000000","message":"Oh yeah... when we\u0027re processing multiple policies, this can double-count disks...","commit_id":"56c6858b8f012b461e6b7c7ea766c56c65d2c27b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2af910e02738c1e731034f078b7e31011e08506f","unresolved":true,"context_lines":[{"line_number":413,"context_line":"            ring \u003d policy.object_ring"},{"line_number":414,"context_line":"            if not ring.next_part_power:"},{"line_number":415,"context_line":"                continue"},{"line_number":416,"context_line":"            part_power_increased \u003d ring.next_part_power \u003d\u003d ring.part_power"},{"line_number":417,"context_line":"            if self.do_cleanup !\u003d part_power_increased:"},{"line_number":418,"context_line":"                continue"},{"line_number":419,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"79eb758d_2d4e290a","line":416,"range":{"start_line":416,"start_character":23,"end_line":416,"end_character":32},"updated":"2021-03-18 19:00:53.000000000","message":"nit: This doesn\u0027t actually indicate that we increased part power. If we prep an increase then cancel, next_part_power is set to (the older, lower) part_power. Maybe should be named can_cleanup? ready_for_cleanup?","commit_id":"0b129509c93f9190aeb375ef503ac24c8852000d"}]}
