)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"72c618cc96e81237a705c9de0928a460a318e57e","unresolved":true,"context_lines":[{"line_number":15,"context_line":"Shrinking however isn\u0027t like that, it should _always_ be initiated from"},{"line_number":16,"context_line":"the root container."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"So listing root containers that have shards to shrink I think would be"},{"line_number":19,"context_line":"more useful. Further, obj count is important, but I wonder if the number"},{"line_number":20,"context_line":"of shards that can be shrunk in a root container is a better metric to"},{"line_number":21,"context_line":"sort by? That way we get more bang for buck out of the tool."},{"line_number":22,"context_line":"This will be my next approach."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"42592709_cf5b3862","line":19,"range":{"start_line":18,"start_character":0,"end_line":19,"end_character":12},"updated":"2021-01-27 12:57:33.000000000","message":"+1 perhaps we should have it so that containers reported here would be consistent with running \u0027swift-manage-shard-ranges compact\u0027 with sensible defaults on those containers and finding shards to shrink?","commit_id":"a6fcfaa87eaa8828c15aa2ec113df6f1820e0fef"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"72c618cc96e81237a705c9de0928a460a318e57e","unresolved":true,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"So listing root containers that have shards to shrink I think would be"},{"line_number":19,"context_line":"more useful. Further, obj count is important, but I wonder if the number"},{"line_number":20,"context_line":"of shards that can be shrunk in a root container is a better metric to"},{"line_number":21,"context_line":"sort by? That way we get more bang for buck out of the tool."},{"line_number":22,"context_line":"This will be my next approach."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Change-Id: I63fc9ae39e164c2ce82865d055527b52c86b5b2a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"82f3c576_95e74fe0","line":21,"range":{"start_line":20,"start_character":3,"end_line":21,"end_character":7},"updated":"2021-01-27 12:57:33.000000000","message":"agree. with sharding we want to be alerted to containers with large object count, with shrinking we want to be alerted to large numbers of low-occupancy shards","commit_id":"a6fcfaa87eaa8828c15aa2ec113df6f1820e0fef"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c7dda7c621e62edac15a843c3ceea5d329791d6d","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add shrink candidates to recon dump"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This is a new version of the shrinking recon dump. This time the"},{"line_number":10,"context_line":"shrinking_candidates will always be SHARDED root containers. And"},{"line_number":11,"context_line":"get added to the candidate list if they have any ranges that are"},{"line_number":12,"context_line":"compactible, that is to say they have ranges that can be compacted into"},{"line_number":13,"context_line":"an upper neighbour."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"6ccd926a_5bc4a280","line":10,"range":{"start_line":9,"start_character":0,"end_line":10,"end_character":60},"updated":"2021-02-11 12:08:07.000000000","message":"nit: this isn\u0027t so meaningful in the context of git history - there\u0027s no older version on master","commit_id":"23c100db8323fc966e95d2a88b8891be26a71c48"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"3e6ab0e7cf7724c65564857ef0546f7884ee608a","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add shrink candidates to recon dump"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This is a new version of the shrinking recon dump. This time the"},{"line_number":10,"context_line":"shrinking_candidates will always be SHARDED root containers. And"},{"line_number":11,"context_line":"get added to the candidate list if they have any ranges that are"},{"line_number":12,"context_line":"compactible, that is to say they have ranges that can be compacted into"},{"line_number":13,"context_line":"an upper neighbour."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"45feb20e_9b901e0c","line":10,"range":{"start_line":9,"start_character":0,"end_line":10,"end_character":60},"in_reply_to":"6ccd926a_5bc4a280","updated":"2021-02-12 03:39:42.000000000","message":"Done","commit_id":"23c100db8323fc966e95d2a88b8891be26a71c48"}],"swift/container/sharder.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"451e350d8398cf567bf8175edbbc5a6da7636aab","unresolved":true,"context_lines":[{"line_number":496,"context_line":"            conf.get(\u0027cleave_row_batch_size\u0027, 10000))"},{"line_number":497,"context_line":"        self.auto_shard \u003d config_true_value(conf.get(\u0027auto_shard\u0027, False))"},{"line_number":498,"context_line":"        self.sharding_candidates \u003d []"},{"line_number":499,"context_line":"        self.shrinking_candidates \u003d []"},{"line_number":500,"context_line":"        self.recon_candidates_limit \u003d int("},{"line_number":501,"context_line":"            conf.get(\u0027recon_candidates_limit\u0027, 5))"},{"line_number":502,"context_line":"        self.broker_timeout \u003d config_positive_int_value("}],"source_content_type":"text/x-python","patch_set":5,"id":"08d1e16f_548ae1f0","line":499,"updated":"2021-02-08 13:41:44.000000000","message":"need to reset this in _zero_stats()","commit_id":"b9337030f2734005fbdbe8daa260b71b973dbc9c"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7b3b2791e287ae400b629c8ce07eb35a1e0fd3c5","unresolved":false,"context_lines":[{"line_number":496,"context_line":"            conf.get(\u0027cleave_row_batch_size\u0027, 10000))"},{"line_number":497,"context_line":"        self.auto_shard \u003d config_true_value(conf.get(\u0027auto_shard\u0027, False))"},{"line_number":498,"context_line":"        self.sharding_candidates \u003d []"},{"line_number":499,"context_line":"        self.shrinking_candidates \u003d []"},{"line_number":500,"context_line":"        self.recon_candidates_limit \u003d int("},{"line_number":501,"context_line":"            conf.get(\u0027recon_candidates_limit\u0027, 5))"},{"line_number":502,"context_line":"        self.broker_timeout \u003d config_positive_int_value("}],"source_content_type":"text/x-python","patch_set":5,"id":"d44eebcb_b2aa7dd5","line":499,"in_reply_to":"08d1e16f_548ae1f0","updated":"2021-02-09 05:46:35.000000000","message":"Done","commit_id":"b9337030f2734005fbdbe8daa260b71b973dbc9c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"451e350d8398cf567bf8175edbbc5a6da7636aab","unresolved":true,"context_lines":[{"line_number":602,"context_line":"        num_shrinkable \u003d sum("},{"line_number":603,"context_line":"            [1 for sr in broker.get_shard_ranges("},{"line_number":604,"context_line":"                states\u003d(ShardRange.ACTIVE))"},{"line_number":605,"context_line":"             if sr.object_count \u003c self.shrink_size])"},{"line_number":606,"context_line":"        sequences \u003d find_compactable_shard_sequences("},{"line_number":607,"context_line":"            broker, self.shrink_size, self.merge_size, -1, -1)"},{"line_number":608,"context_line":"        _, shrinking \u003d process_compactable_shard_sequences("}],"source_content_type":"text/x-python","patch_set":5,"id":"c05739dd_943681ff","line":605,"updated":"2021-02-08 13:41:44.000000000","message":"I\u0027m not sure about the usefulness of this number because it doesn\u0027t always relate to what can be achieved using the e.g. when a shard is small enough to shrink but acceptor is too large to accept.\n\nI\u0027d suggest sticking to the results of find_compactable_shard_sequences() because that represents what can be achieved with s-m-s-r or auto-shrink\n\nUPDATE; now I have played with the test I realise that this stops us reporting containers with shrinking in progress; however, I\u0027d still prefer to use the two numbers below and filter the result of find_compactable_shard_sequences with some filter to remove ranges already set to shrink. In fact, I wonder if that should be the default behaviour of find_compactable_shard_sequences.","commit_id":"b9337030f2734005fbdbe8daa260b71b973dbc9c"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7b3b2791e287ae400b629c8ce07eb35a1e0fd3c5","unresolved":true,"context_lines":[{"line_number":602,"context_line":"        num_shrinkable \u003d sum("},{"line_number":603,"context_line":"            [1 for sr in broker.get_shard_ranges("},{"line_number":604,"context_line":"                states\u003d(ShardRange.ACTIVE))"},{"line_number":605,"context_line":"             if sr.object_count \u003c self.shrink_size])"},{"line_number":606,"context_line":"        sequences \u003d find_compactable_shard_sequences("},{"line_number":607,"context_line":"            broker, self.shrink_size, self.merge_size, -1, -1)"},{"line_number":608,"context_line":"        _, shrinking \u003d process_compactable_shard_sequences("}],"source_content_type":"text/x-python","patch_set":5,"id":"cf8941de_f9324c3f","line":605,"in_reply_to":"c05739dd_943681ff","updated":"2021-02-09 05:46:35.000000000","message":"Cool, I see your working on this in another WIP patch, so will ignore it at least until after my next patchset, you\u0027ve given me enough to work on :P","commit_id":"b9337030f2734005fbdbe8daa260b71b973dbc9c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"451e350d8398cf567bf8175edbbc5a6da7636aab","unresolved":true,"context_lines":[{"line_number":606,"context_line":"        sequences \u003d find_compactable_shard_sequences("},{"line_number":607,"context_line":"            broker, self.shrink_size, self.merge_size, -1, -1)"},{"line_number":608,"context_line":"        _, shrinking \u003d process_compactable_shard_sequences("},{"line_number":609,"context_line":"            sequences, Timestamp.now())"},{"line_number":610,"context_line":"        shrinkable_donors \u003d find_shrinking_candidates("},{"line_number":611,"context_line":"            broker, self.shrink_size, self.merge_size)"},{"line_number":612,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"6e81b5a3_a6cb001c","line":609,"updated":"2021-02-08 13:41:44.000000000","message":"I prefer this re-use of the exact same method that swift-manage-shard-ranges would use\n\nThis assumes unlimited donors per acceptor, so represents \u0027the best shrink-count that could be achieved\u0027, but not what auto-shrinking would do and not necessarily what swift-manage-shard-ranges will be asked to do by whatever enacts the shrinking.","commit_id":"b9337030f2734005fbdbe8daa260b71b973dbc9c"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7b3b2791e287ae400b629c8ce07eb35a1e0fd3c5","unresolved":false,"context_lines":[{"line_number":606,"context_line":"        sequences \u003d find_compactable_shard_sequences("},{"line_number":607,"context_line":"            broker, self.shrink_size, self.merge_size, -1, -1)"},{"line_number":608,"context_line":"        _, shrinking \u003d process_compactable_shard_sequences("},{"line_number":609,"context_line":"            sequences, Timestamp.now())"},{"line_number":610,"context_line":"        shrinkable_donors \u003d find_shrinking_candidates("},{"line_number":611,"context_line":"            broker, self.shrink_size, self.merge_size)"},{"line_number":612,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"c121aaf8_bb68bab5","line":609,"in_reply_to":"6e81b5a3_a6cb001c","updated":"2021-02-09 05:46:35.000000000","message":"Ack","commit_id":"b9337030f2734005fbdbe8daa260b71b973dbc9c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"451e350d8398cf567bf8175edbbc5a6da7636aab","unresolved":true,"context_lines":[{"line_number":608,"context_line":"        _, shrinking \u003d process_compactable_shard_sequences("},{"line_number":609,"context_line":"            sequences, Timestamp.now())"},{"line_number":610,"context_line":"        shrinkable_donors \u003d find_shrinking_candidates("},{"line_number":611,"context_line":"            broker, self.shrink_size, self.merge_size)"},{"line_number":612,"context_line":""},{"line_number":613,"context_line":"        if num_shrinkable:"},{"line_number":614,"context_line":"            own_shard_range \u003d broker.get_own_shard_range()"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3da125_549a73f0","line":611,"updated":"2021-02-08 13:41:44.000000000","message":"1. can we re-use find_compactable_shard_sequences() with max_shrinking\u003d1, max_expanding\u003d-1 args for consistency? I only left find_shrinking_candidates() in because it was \u0027public\u0027 but ideally I would deprecate it.\n\n2. this assumes max donors per acceptor is 1, i.e. the \u0027auto-shrinking\u0027 behaviour, but not necessarily what swift-manage-shard-ranges will be asked to do by whatever/whoever enacts the shrinking.\n\nNone of the numbers necessarily reflects how many ranges will actually be shrunk  when swift-manage-shard-ranges is run. I\u0027m thinking that we should make max_shrinking and max_expanding configurable in the sharder, with defaults of (1, -1) i.e. current auto-shrink parameters. That means that if an op wants to run \u0027s-m-s-r compact\u0027 with different max_shrinking/max_expanding then they can configure the sharder to report the matching stats (or, if one day auto-shrinking is enabled, we can tune the parameters).\n\nWe could therefore report:\n\n  max_shrinkable_ranges i.e. number if you had max_shrinking\u003dmax_expanding\u003d-1\n  actionable_shrinkable_ranges i.e. number with configured max_shrinking and max_expanding","commit_id":"b9337030f2734005fbdbe8daa260b71b973dbc9c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"619cb6d22b89106f4da02cc413fe1b2aa2f56290","unresolved":true,"context_lines":[{"line_number":608,"context_line":"        _, shrinking \u003d process_compactable_shard_sequences("},{"line_number":609,"context_line":"            sequences, Timestamp.now())"},{"line_number":610,"context_line":"        shrinkable_donors \u003d find_shrinking_candidates("},{"line_number":611,"context_line":"            broker, self.shrink_size, self.merge_size)"},{"line_number":612,"context_line":""},{"line_number":613,"context_line":"        if num_shrinkable:"},{"line_number":614,"context_line":"            own_shard_range \u003d broker.get_own_shard_range()"}],"source_content_type":"text/x-python","patch_set":5,"id":"d16ba2ab_74a734d6","line":611,"in_reply_to":"383ccc5b_9c4ed331","updated":"2021-02-09 11:07:57.000000000","message":"good point, the stats are already under \u0027shrinking_candidates\u0027","commit_id":"b9337030f2734005fbdbe8daa260b71b973dbc9c"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7b3b2791e287ae400b629c8ce07eb35a1e0fd3c5","unresolved":true,"context_lines":[{"line_number":608,"context_line":"        _, shrinking \u003d process_compactable_shard_sequences("},{"line_number":609,"context_line":"            sequences, Timestamp.now())"},{"line_number":610,"context_line":"        shrinkable_donors \u003d find_shrinking_candidates("},{"line_number":611,"context_line":"            broker, self.shrink_size, self.merge_size)"},{"line_number":612,"context_line":""},{"line_number":613,"context_line":"        if num_shrinkable:"},{"line_number":614,"context_line":"            own_shard_range \u003d broker.get_own_shard_range()"}],"source_content_type":"text/x-python","patch_set":5,"id":"383ccc5b_9c4ed331","line":611,"in_reply_to":"df3da125_549a73f0","updated":"2021-02-09 05:46:35.000000000","message":"Thanks for the better naming and great suggestions. I\u0027ve pushed a patch up to make use of a config file, which includes piping the max_{shrinking,expanding} options to the sharder config.\n\nAlso I\u0027ve dropped thr first metric and changed the names to mostly what you suggest. I like actionable but think that \u0027actionable_shrinkable_ranges\u0027 might be a bit long. So going to see what it looks like as simple actionable_ranges, which seeing as it\u0027s under shrinking_candidates hopefully already shows it\u0027s shrinking without having to say so... or maybe could use \u0027actionable_donors\u0027 as donors is a shrinking concept?","commit_id":"b9337030f2734005fbdbe8daa260b71b973dbc9c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"451e350d8398cf567bf8175edbbc5a6da7636aab","unresolved":true,"context_lines":[{"line_number":624,"context_line":"            shrink_candidate[\u0027shrinkable_donors\u0027] \u003d len(shrinkable_donors)"},{"line_number":625,"context_line":"            self.shrinking_candidates.append(shrink_candidate)"},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"    def _transform_candiate_stats(self, category, candidates, sort_keys):"},{"line_number":628,"context_line":"        category[\u0027found\u0027] \u003d len(candidates)"},{"line_number":629,"context_line":"        candidates.sort(key\u003ditemgetter(*sort_keys), reverse\u003dTrue)"},{"line_number":630,"context_line":"        if self.recon_candidates_limit \u003e\u003d 0:"}],"source_content_type":"text/x-python","patch_set":5,"id":"75920f62_0493a7a8","line":627,"updated":"2021-02-08 13:41:44.000000000","message":"s/candiate/candidate/\n\nnice refactor","commit_id":"b9337030f2734005fbdbe8daa260b71b973dbc9c"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7b3b2791e287ae400b629c8ce07eb35a1e0fd3c5","unresolved":false,"context_lines":[{"line_number":624,"context_line":"            shrink_candidate[\u0027shrinkable_donors\u0027] \u003d len(shrinkable_donors)"},{"line_number":625,"context_line":"            self.shrinking_candidates.append(shrink_candidate)"},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"    def _transform_candiate_stats(self, category, candidates, sort_keys):"},{"line_number":628,"context_line":"        category[\u0027found\u0027] \u003d len(candidates)"},{"line_number":629,"context_line":"        candidates.sort(key\u003ditemgetter(*sort_keys), reverse\u003dTrue)"},{"line_number":630,"context_line":"        if self.recon_candidates_limit \u003e\u003d 0:"}],"source_content_type":"text/x-python","patch_set":5,"id":"a2d598fc_0dca317f","line":627,"in_reply_to":"75920f62_0493a7a8","updated":"2021-02-09 05:46:35.000000000","message":"Done","commit_id":"b9337030f2734005fbdbe8daa260b71b973dbc9c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"451e350d8398cf567bf8175edbbc5a6da7636aab","unresolved":true,"context_lines":[{"line_number":632,"context_line":"        else:"},{"line_number":633,"context_line":"            category[\u0027top\u0027] \u003d candidates"},{"line_number":634,"context_line":""},{"line_number":635,"context_line":"    def _transform_sharding_candidate_stats(self):"},{"line_number":636,"context_line":"        # first sharding"},{"line_number":637,"context_line":"        category \u003d self.stats[\u0027sharding\u0027][\u0027sharding_candidates\u0027]"},{"line_number":638,"context_line":"        self._transform_candiate_stats(category, self.sharding_candidates,"}],"source_content_type":"text/x-python","patch_set":5,"id":"92ce5368_6ba69c5d","line":635,"updated":"2021-02-08 13:41:44.000000000","message":"the method name is a bit weird now it also handles shrinking candidates - with _transform_candiate_stats now broken out we could maybe ditch this method and inline the next few lines in _report_stats?","commit_id":"b9337030f2734005fbdbe8daa260b71b973dbc9c"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7b3b2791e287ae400b629c8ce07eb35a1e0fd3c5","unresolved":false,"context_lines":[{"line_number":632,"context_line":"        else:"},{"line_number":633,"context_line":"            category[\u0027top\u0027] \u003d candidates"},{"line_number":634,"context_line":""},{"line_number":635,"context_line":"    def _transform_sharding_candidate_stats(self):"},{"line_number":636,"context_line":"        # first sharding"},{"line_number":637,"context_line":"        category \u003d self.stats[\u0027sharding\u0027][\u0027sharding_candidates\u0027]"},{"line_number":638,"context_line":"        self._transform_candiate_stats(category, self.sharding_candidates,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f35f71c_1f344b00","line":635,"in_reply_to":"92ce5368_6ba69c5d","updated":"2021-02-09 05:46:35.000000000","message":"Done","commit_id":"b9337030f2734005fbdbe8daa260b71b973dbc9c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"451e350d8398cf567bf8175edbbc5a6da7636aab","unresolved":true,"context_lines":[{"line_number":1785,"context_line":""},{"line_number":1786,"context_line":"        if state \u003d\u003d SHARDED and broker.is_root_container():"},{"line_number":1787,"context_line":"            # look for shrink stats"},{"line_number":1788,"context_line":"            self._identify_shrinking_candidate(broker, node)"},{"line_number":1789,"context_line":"            if is_leader:"},{"line_number":1790,"context_line":"                self._find_and_enable_shrinking_candidates(broker)"},{"line_number":1791,"context_line":"                self._find_and_enable_sharding_candidates(broker)"}],"source_content_type":"text/x-python","patch_set":5,"id":"56828338_cee375dc","line":1788,"updated":"2021-02-08 13:41:44.000000000","message":"+1 only root and only when sharded","commit_id":"b9337030f2734005fbdbe8daa260b71b973dbc9c"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7b3b2791e287ae400b629c8ce07eb35a1e0fd3c5","unresolved":false,"context_lines":[{"line_number":1785,"context_line":""},{"line_number":1786,"context_line":"        if state \u003d\u003d SHARDED and broker.is_root_container():"},{"line_number":1787,"context_line":"            # look for shrink stats"},{"line_number":1788,"context_line":"            self._identify_shrinking_candidate(broker, node)"},{"line_number":1789,"context_line":"            if is_leader:"},{"line_number":1790,"context_line":"                self._find_and_enable_shrinking_candidates(broker)"},{"line_number":1791,"context_line":"                self._find_and_enable_sharding_candidates(broker)"}],"source_content_type":"text/x-python","patch_set":5,"id":"568b054f_93c95771","line":1788,"in_reply_to":"56828338_cee375dc","updated":"2021-02-09 05:46:35.000000000","message":"Ack","commit_id":"b9337030f2734005fbdbe8daa260b71b973dbc9c"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a80bec5f9cb320b60024b71b6b2e4ffed458af24","unresolved":true,"context_lines":[{"line_number":681,"context_line":"        category \u003d self.stats[\u0027sharding\u0027][\u0027shrinking_candidates\u0027]"},{"line_number":682,"context_line":"        self._transform_candidate_stats(category, self.shrinking_candidates,"},{"line_number":683,"context_line":"                                        sort_keys\u003d(\u0027actionable_ranges\u0027,"},{"line_number":684,"context_line":"                                                   \u0027total_shrinkable_ranges\u0027))"},{"line_number":685,"context_line":""},{"line_number":686,"context_line":"        dump_recon_cache("},{"line_number":687,"context_line":"            {\u0027sharding_stats\u0027: self.stats,"}],"source_content_type":"text/x-python","patch_set":6,"id":"06af70d3_6fdbac30","line":684,"updated":"2021-02-09 05:57:07.000000000","message":"Now that we\u0027ve changed the items, I now wonder if this is the order we want them in. Currently its sorted by how many we can improve in one command and then sorted by total shrinkable shards. Or would we rather know the shards with the most shrinkable rows and then order by how many we can do in a single go.\n\nI guess the question is how will the tool be used. used on a container until it\u0027s dealt with, or keep shrinking containers where we can make most progress and then come back to finish things off later.\n\nIf the tool becomes somewhat automated, I\u0027m guessing the latter.. which is currently how it is sorted.","commit_id":"34c7af26a0aba55e6e4c561b725319dd97673e4e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c77191c96861b8bf8a597cf1d019ef5e8e9f3a23","unresolved":true,"context_lines":[{"line_number":598,"context_line":""},{"line_number":599,"context_line":"    def _identify_shrinking_candidate(self, broker, node):"},{"line_number":600,"context_line":"        sequences \u003d find_compactable_shard_sequences("},{"line_number":601,"context_line":"            broker, self.shrink_size, self.merge_size, -1, -1)"},{"line_number":602,"context_line":"        _, max_shrinkable \u003d process_compactable_shard_sequences("},{"line_number":603,"context_line":"            sequences, Timestamp.now())"},{"line_number":604,"context_line":"        sequences \u003d find_compactable_shard_sequences("}],"source_content_type":"text/x-python","patch_set":7,"id":"dd1f989f_210e6d7f","line":601,"updated":"2021-02-09 15:46:52.000000000","message":"this may still \u0027under-report\u0027, depending on what the goal is:\n\n- it still limits shrink_size and merge_size so won\u0027t report lots of tiny/empty shards adjacent to big shards\n- it won\u0027t report a final small shard\n- I don\u0027t think it will report small shards preceding an already shrinking sequence, because the longer sequence will be considered already shrinking.\n\nThe final one is tricky. If we want to report the number of shrinkable shards where shrinkable \u003d\u003d small enough, old enough and in the right state to shrink, then we may need to dig below find_compactable_shard_sequences (something like you had before, sorry!).\n\nI\u0027ve added an is_shrinking_candidate function in https://review.opendev.org/c/openstack/swift/+/774560 which may be useful and would keep us using common code, albeit at a lower level. But it comes down to what we want to report.","commit_id":"12d2dae890d2b9e9265e84e93004ed2b6f1d60ef"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f89b72be5c206e4a2d4a4df1048e3d4a5c88e2cd","unresolved":true,"context_lines":[{"line_number":598,"context_line":""},{"line_number":599,"context_line":"    def _identify_shrinking_candidate(self, broker, node):"},{"line_number":600,"context_line":"        sequences \u003d find_compactable_shard_sequences("},{"line_number":601,"context_line":"            broker, self.shrink_size, self.merge_size, -1, -1)"},{"line_number":602,"context_line":"        _, max_shrinkable \u003d process_compactable_shard_sequences("},{"line_number":603,"context_line":"            sequences, Timestamp.now())"},{"line_number":604,"context_line":"        sequences \u003d find_compactable_shard_sequences("}],"source_content_type":"text/x-python","patch_set":7,"id":"ea1e0a0d_498d9369","line":601,"in_reply_to":"2d8a2c46_4ead4a2a","updated":"2021-02-10 11:17:31.000000000","message":"yes, I realise my opinion has ping-ponged a bit 😊\n\nok, let\u0027s focus on getting this infrastructure ready to merge and await other opinion on the exact stats. The most important aspect is the actionable candidates.","commit_id":"12d2dae890d2b9e9265e84e93004ed2b6f1d60ef"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"4132d05ce645c888ed36b7ae6204f30e810ef8d0","unresolved":true,"context_lines":[{"line_number":598,"context_line":""},{"line_number":599,"context_line":"    def _identify_shrinking_candidate(self, broker, node):"},{"line_number":600,"context_line":"        sequences \u003d find_compactable_shard_sequences("},{"line_number":601,"context_line":"            broker, self.shrink_size, self.merge_size, -1, -1)"},{"line_number":602,"context_line":"        _, max_shrinkable \u003d process_compactable_shard_sequences("},{"line_number":603,"context_line":"            sequences, Timestamp.now())"},{"line_number":604,"context_line":"        sequences \u003d find_compactable_shard_sequences("}],"source_content_type":"text/x-python","patch_set":7,"id":"2d8a2c46_4ead4a2a","line":601,"in_reply_to":"dd1f989f_210e6d7f","updated":"2021-02-09 23:57:09.000000000","message":"Lol, seems we\u0027ve now swapped positions. I think I\u0027ve come to terms with we can\u0027t or even shouldn\u0027t report \"all\" shrinkable shards here. Only report the shards that _can_ be shrunk and what will be shrunk in the next run of the command.\n\nMy new arguement is that this is suppose to show shrinking_candidates which are shards that _can_ be shrunk. If it can\u0027t be shrunk it then by definition isn\u0027t a candidate.\n\nThis (-1,-1) does just that, it should indicate, as it currently stands this number of shards should be able to be shrunk total.\n\nI\u0027m not saying we shouldn\u0027t find a way to report stuck shards that could be shrunk because I still beleave that is important informantion.. but now don\u0027t believe this is where it should be displayed. Maybe we could do such a check in the audit or maybe analyse would be a better place. We could warn about shards that are shrinked size but have no acceptors (ie just a number) and then analyse could be used to display them?","commit_id":"12d2dae890d2b9e9265e84e93004ed2b6f1d60ef"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"619cb6d22b89106f4da02cc413fe1b2aa2f56290","unresolved":true,"context_lines":[{"line_number":607,"context_line":"        _, actionable_donors \u003d process_compactable_shard_sequences("},{"line_number":608,"context_line":"            sequences, Timestamp.now())"},{"line_number":609,"context_line":""},{"line_number":610,"context_line":"        if actionable_donors:"},{"line_number":611,"context_line":"            own_shard_range \u003d broker.get_own_shard_range()"},{"line_number":612,"context_line":"            shrink_candidate \u003d self._make_stats_info("},{"line_number":613,"context_line":"                broker, node, own_shard_range)"}],"source_content_type":"text/x-python","patch_set":7,"id":"8da2ed32_a347b388","line":610,"updated":"2021-02-09 11:07:57.000000000","message":"so if there are no actionable donors then the total shrinkable won\u0027t get reported - don\u0027t we want to report when there\u0027s shrinkables that can\u0027t be actioned?\n\nat the same time we don\u0027t want non-actionable containers to fill the stats....ah, but that\u0027s taken care of by the sort order 👍","commit_id":"12d2dae890d2b9e9265e84e93004ed2b6f1d60ef"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f89b72be5c206e4a2d4a4df1048e3d4a5c88e2cd","unresolved":true,"context_lines":[{"line_number":607,"context_line":"        _, actionable_donors \u003d process_compactable_shard_sequences("},{"line_number":608,"context_line":"            sequences, Timestamp.now())"},{"line_number":609,"context_line":""},{"line_number":610,"context_line":"        if actionable_donors:"},{"line_number":611,"context_line":"            own_shard_range \u003d broker.get_own_shard_range()"},{"line_number":612,"context_line":"            shrink_candidate \u003d self._make_stats_info("},{"line_number":613,"context_line":"                broker, node, own_shard_range)"}],"source_content_type":"text/x-python","patch_set":7,"id":"250f4521_1bf87336","line":610,"in_reply_to":"31442611_41f57eec","updated":"2021-02-10 11:17:31.000000000","message":"no we don\u0027t want containers with non-actionable at the top of the list, but maybe in the list?\n\nseems like if the total number is of interest then its going to be when we\u0027ve dealt with all the actionable and there\u0027s *still* containers in the list\n\nbut, like you I\u0027m not sure I can see a situation where we\u0027d have a total without any actionable the way total is now defined - the other ranges either become unshrinkable because their potential acceptor is in fact shrinking, or they become actionable","commit_id":"12d2dae890d2b9e9265e84e93004ed2b6f1d60ef"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"4132d05ce645c888ed36b7ae6204f30e810ef8d0","unresolved":true,"context_lines":[{"line_number":607,"context_line":"        _, actionable_donors \u003d process_compactable_shard_sequences("},{"line_number":608,"context_line":"            sequences, Timestamp.now())"},{"line_number":609,"context_line":""},{"line_number":610,"context_line":"        if actionable_donors:"},{"line_number":611,"context_line":"            own_shard_range \u003d broker.get_own_shard_range()"},{"line_number":612,"context_line":"            shrink_candidate \u003d self._make_stats_info("},{"line_number":613,"context_line":"                broker, node, own_shard_range)"}],"source_content_type":"text/x-python","patch_set":7,"id":"31442611_41f57eec","line":610,"in_reply_to":"8da2ed32_a347b388","updated":"2021-02-09 23:57:09.000000000","message":"Yeah, because I removed the Total shrinkable sized ranges and now only have the number of shards the _can_ be shrunk (because there should be acceptors small enough) I wonder how likely we\u0027d get max_shrinkable without actional_donors.\n\nBesides, if we can\u0027t action on them we don\u0027t want them on the top of the list anyway 😊","commit_id":"12d2dae890d2b9e9265e84e93004ed2b6f1d60ef"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"fcaa31a9c90feb24b3489ce20f78bf7a6f040b3f","unresolved":true,"context_lines":[{"line_number":681,"context_line":"        category \u003d self.stats[\u0027sharding\u0027][\u0027shrinking_candidates\u0027]"},{"line_number":682,"context_line":"        self._transform_candidate_stats(category, self.shrinking_candidates,"},{"line_number":683,"context_line":"                                        sort_keys\u003d(\u0027actionable_ranges\u0027,"},{"line_number":684,"context_line":"                                                   \u0027total_shrinkable_ranges\u0027))"},{"line_number":685,"context_line":""},{"line_number":686,"context_line":"        dump_recon_cache("},{"line_number":687,"context_line":"            {\u0027sharding_stats\u0027: self.stats,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1817a408_5c7a1344","line":684,"updated":"2021-02-09 05:59:16.000000000","message":"Now that we\u0027ve changed the items, I now wonder if this is the order we want them in. Currently its sorted by how many we can improve in one command and then sorted by total shrinkable shards. Or would we rather know the shards with the most shrinkable rows and then order by how many we can do in a single go.\n\nI guess the question is how will the tool be used. used on a container until it\u0027s dealt with, or keep shrinking containers where we can make most progress and then come back to finish things off later.\n\nIf the tool becomes somewhat automated, I\u0027m guessing the latter.. which is currently how it is sorted. \n\n(this time I\u0027ll place this comment on the latest patchset 😞","commit_id":"12d2dae890d2b9e9265e84e93004ed2b6f1d60ef"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"4132d05ce645c888ed36b7ae6204f30e810ef8d0","unresolved":true,"context_lines":[{"line_number":681,"context_line":"        category \u003d self.stats[\u0027sharding\u0027][\u0027shrinking_candidates\u0027]"},{"line_number":682,"context_line":"        self._transform_candidate_stats(category, self.shrinking_candidates,"},{"line_number":683,"context_line":"                                        sort_keys\u003d(\u0027actionable_ranges\u0027,"},{"line_number":684,"context_line":"                                                   \u0027total_shrinkable_ranges\u0027))"},{"line_number":685,"context_line":""},{"line_number":686,"context_line":"        dump_recon_cache("},{"line_number":687,"context_line":"            {\u0027sharding_stats\u0027: self.stats,"}],"source_content_type":"text/x-python","patch_set":7,"id":"29cc00b7_263d0df3","line":684,"in_reply_to":"1717d3a5_eb896c55","updated":"2021-02-09 23:57:09.000000000","message":"In the current code, I\u0027d assume they are all actionable now. (-1, -1) will compact only because the acceptor has enough space for them. So hopefully even if we do it (1, -1) it\u0027ll still work out the same... though I guess after a round of (1, -1) an shard could now be slightly over the shrink threshold. So then wont continue to shrink upwards.. so maybe the metric isn\u0027t quite correct.","commit_id":"12d2dae890d2b9e9265e84e93004ed2b6f1d60ef"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"619cb6d22b89106f4da02cc413fe1b2aa2f56290","unresolved":true,"context_lines":[{"line_number":681,"context_line":"        category \u003d self.stats[\u0027sharding\u0027][\u0027shrinking_candidates\u0027]"},{"line_number":682,"context_line":"        self._transform_candidate_stats(category, self.shrinking_candidates,"},{"line_number":683,"context_line":"                                        sort_keys\u003d(\u0027actionable_ranges\u0027,"},{"line_number":684,"context_line":"                                                   \u0027total_shrinkable_ranges\u0027))"},{"line_number":685,"context_line":""},{"line_number":686,"context_line":"        dump_recon_cache("},{"line_number":687,"context_line":"            {\u0027sharding_stats\u0027: self.stats,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1717d3a5_eb896c55","line":684,"in_reply_to":"1817a408_5c7a1344","updated":"2021-02-09 11:07:57.000000000","message":"We\u0027ll probably need to sort by actionable first because self.recon_candidates_limit can limit the number of candidates actually reported. We don\u0027t want actionable candidates to be pushed out of the top N by non-actionable.","commit_id":"12d2dae890d2b9e9265e84e93004ed2b6f1d60ef"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c7dda7c621e62edac15a843c3ceea5d329791d6d","unresolved":true,"context_lines":[{"line_number":622,"context_line":"        sequences \u003d find_compactable_shard_sequences("},{"line_number":623,"context_line":"            broker, self.shrink_size, self.merge_size,"},{"line_number":624,"context_line":"            1, -1)"},{"line_number":625,"context_line":"        _, compactible_ranges \u003d process_compactable_shard_sequences("},{"line_number":626,"context_line":"            sequences, Timestamp.now())"},{"line_number":627,"context_line":""},{"line_number":628,"context_line":"        if compactible_ranges:"}],"source_content_type":"text/x-python","patch_set":10,"id":"26b67d71_5fa72d8a","line":625,"range":{"start_line":625,"start_character":32,"end_line":625,"end_character":67},"updated":"2021-02-11 12:08:07.000000000","message":"headsup - this interface may change https://review.opendev.org/c/openstack/swift/+/774848 but the function does more than you need\n\n  compactible_ranges \u003d sum(len(seq) - 1 for seq in sequences)\n\nwould do it","commit_id":"23c100db8323fc966e95d2a88b8891be26a71c48"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c7dda7c621e62edac15a843c3ceea5d329791d6d","unresolved":true,"context_lines":[{"line_number":622,"context_line":"        sequences \u003d find_compactable_shard_sequences("},{"line_number":623,"context_line":"            broker, self.shrink_size, self.merge_size,"},{"line_number":624,"context_line":"            1, -1)"},{"line_number":625,"context_line":"        _, compactible_ranges \u003d process_compactable_shard_sequences("},{"line_number":626,"context_line":"            sequences, Timestamp.now())"},{"line_number":627,"context_line":""},{"line_number":628,"context_line":"        if compactible_ranges:"}],"source_content_type":"text/x-python","patch_set":10,"id":"ee738149_304a839c","line":625,"updated":"2021-02-11 12:08:07.000000000","message":"we\u0027ve spelt it \u0027compactable\u0027 everywhere else, but maybe that is a misspelling [1] :(\n\nwe can correct compactable-\u003ecompactible if we do it now, or else we stick with consistent misspelling.\n\n[1] https://www.collinsdictionary.com/dictionary/english/compactible","commit_id":"23c100db8323fc966e95d2a88b8891be26a71c48"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"3e6ab0e7cf7724c65564857ef0546f7884ee608a","unresolved":true,"context_lines":[{"line_number":622,"context_line":"        sequences \u003d find_compactable_shard_sequences("},{"line_number":623,"context_line":"            broker, self.shrink_size, self.merge_size,"},{"line_number":624,"context_line":"            1, -1)"},{"line_number":625,"context_line":"        _, compactible_ranges \u003d process_compactable_shard_sequences("},{"line_number":626,"context_line":"            sequences, Timestamp.now())"},{"line_number":627,"context_line":""},{"line_number":628,"context_line":"        if compactible_ranges:"}],"source_content_type":"text/x-python","patch_set":10,"id":"2cf4477e_8a6b2a57","line":625,"range":{"start_line":625,"start_character":32,"end_line":625,"end_character":67},"in_reply_to":"26b67d71_5fa72d8a","updated":"2021-02-12 03:39:42.000000000","message":"Cheers that\u0027s for the heads up, should be change it now in anticipating, I guess it depends on what lands first. I\u0027ll leave it as it is for the moment so it doesn\u0027t screw up the rename patch above","commit_id":"23c100db8323fc966e95d2a88b8891be26a71c48"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a22061810a9168751832790e93aec4a33ab35b2a","unresolved":true,"context_lines":[{"line_number":622,"context_line":"        sequences \u003d find_compactable_shard_sequences("},{"line_number":623,"context_line":"            broker, self.shrink_size, self.merge_size,"},{"line_number":624,"context_line":"            1, -1)"},{"line_number":625,"context_line":"        _, compactible_ranges \u003d process_compactable_shard_sequences("},{"line_number":626,"context_line":"            sequences, Timestamp.now())"},{"line_number":627,"context_line":""},{"line_number":628,"context_line":"        if compactible_ranges:"}],"source_content_type":"text/x-python","patch_set":10,"id":"805f9401_0267e2de","line":625,"range":{"start_line":625,"start_character":32,"end_line":625,"end_character":67},"in_reply_to":"2cf4477e_8a6b2a57","updated":"2021-02-12 09:33:44.000000000","message":"+1 leave as is, and we\u0027ll deal with it whichever lands first","commit_id":"23c100db8323fc966e95d2a88b8891be26a71c48"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"3e6ab0e7cf7724c65564857ef0546f7884ee608a","unresolved":false,"context_lines":[{"line_number":622,"context_line":"        sequences \u003d find_compactable_shard_sequences("},{"line_number":623,"context_line":"            broker, self.shrink_size, self.merge_size,"},{"line_number":624,"context_line":"            1, -1)"},{"line_number":625,"context_line":"        _, compactible_ranges \u003d process_compactable_shard_sequences("},{"line_number":626,"context_line":"            sequences, Timestamp.now())"},{"line_number":627,"context_line":""},{"line_number":628,"context_line":"        if compactible_ranges:"}],"source_content_type":"text/x-python","patch_set":10,"id":"1f3a5392_a5649c2c","line":625,"in_reply_to":"ee738149_304a839c","updated":"2021-02-12 03:39:42.000000000","message":"Ack","commit_id":"23c100db8323fc966e95d2a88b8891be26a71c48"}],"test/unit/container/test_sharder.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"451e350d8398cf567bf8175edbbc5a6da7636aab","unresolved":true,"context_lines":[{"line_number":5460,"context_line":"            brokers[1].set_sharded_state()"},{"line_number":5461,"context_line":""},{"line_number":5462,"context_line":"            # we want c1 to have the same, but one can\u0027t be shrunk"},{"line_number":5463,"context_line":"            shard_ranges[2].object_count \u003d \\"},{"line_number":5464,"context_line":"                DEFAULT_SHARD_CONTAINER_THRESHOLD - 1"},{"line_number":5465,"context_line":"            brokers[0].merge_shard_ranges(shard_ranges)"},{"line_number":5466,"context_line":"            brokers[0].set_sharding_state()"}],"source_content_type":"text/x-python","patch_set":5,"id":"b70a220a_a9fbc2d7","line":5463,"updated":"2021-02-08 13:41:44.000000000","message":"took me a moment to realise you\u0027re using the same shard ranges for each broker but they are different containers. I\u0027m sure it\u0027s fine but might be worth taking a copy of shard ranges for each broker to make it clear.","commit_id":"b9337030f2734005fbdbe8daa260b71b973dbc9c"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7b3b2791e287ae400b629c8ce07eb35a1e0fd3c5","unresolved":false,"context_lines":[{"line_number":5460,"context_line":"            brokers[1].set_sharded_state()"},{"line_number":5461,"context_line":""},{"line_number":5462,"context_line":"            # we want c1 to have the same, but one can\u0027t be shrunk"},{"line_number":5463,"context_line":"            shard_ranges[2].object_count \u003d \\"},{"line_number":5464,"context_line":"                DEFAULT_SHARD_CONTAINER_THRESHOLD - 1"},{"line_number":5465,"context_line":"            brokers[0].merge_shard_ranges(shard_ranges)"},{"line_number":5466,"context_line":"            brokers[0].set_sharding_state()"}],"source_content_type":"text/x-python","patch_set":5,"id":"5998e72d_5ccc8338","line":5463,"in_reply_to":"b70a220a_a9fbc2d7","updated":"2021-02-09 05:46:35.000000000","message":"Done","commit_id":"b9337030f2734005fbdbe8daa260b71b973dbc9c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"451e350d8398cf567bf8175edbbc5a6da7636aab","unresolved":true,"context_lines":[{"line_number":5481,"context_line":"            for broker in brokers:"},{"line_number":5482,"context_line":"                sharder._identify_shrinking_candidate(broker, node)"},{"line_number":5483,"context_line":""},{"line_number":5484,"context_line":"            sharder._transform_sharding_candidate_stats()"},{"line_number":5485,"context_line":"            expected_shrinking_candidates_data \u003d {"},{"line_number":5486,"context_line":"                \u0027found\u0027: 3,"},{"line_number":5487,"context_line":"                \u0027top\u0027: ["}],"source_content_type":"text/x-python","patch_set":5,"id":"64fd185e_40628052","line":5484,"updated":"2021-02-08 13:41:44.000000000","message":"could call _report_stats and then also check the dump_recon_cache includes shrinking","commit_id":"b9337030f2734005fbdbe8daa260b71b973dbc9c"}]}
