)]}'
{"swift/cli/manage_shard_ranges.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"99c0d800b56a492971a752a5bdb25e2e8c7795f8","unresolved":true,"context_lines":[{"line_number":303,"context_line":"    correct_tail \u003d False"},{"line_number":304,"context_line":"    rows_per_shard \u003d args.rows_per_shard"},{"line_number":305,"context_line":"    if rows_per_shard \u003d\u003d \u0027auto\u0027:"},{"line_number":306,"context_line":"        rows_per_shard \u003d args.shard_container_threshold // 2"},{"line_number":307,"context_line":"        correct_tail \u003d True"},{"line_number":308,"context_line":"    shard_data, last_found \u003d broker.find_shard_ranges("},{"line_number":309,"context_line":"        rows_per_shard, limit\u003dlimit, correct_tail\u003dcorrect_tail)"}],"source_content_type":"text/x-python","patch_set":4,"id":"e5159a35_768e2581","line":306,"updated":"2021-05-25 14:40:42.000000000","message":"hmmm, so there is no way to choose auto but also specify the \u0027target\u0027 number of rows per shard. That seems a bit of a backwards step if you have previously been using something other than shard_container_threshold // 2 but want to benefit from the new \u0027avoid tiny tail shard\u0027 feature :( (Also complicates testing)\n\nI tried to find a workaround, but it\u0027ll end up needing to pass shard_container_threshold to find_ranges, which feels wrong, so I ended up thinking that maybe we need \u0027--minimum-shard-size\u0027 instead of \u0027auto\u0027. That kills 2 birds with one stone:\n\n- can still specify rows_per_shard\n- avoids needing to hard code in the size at which the final shard is considered too small","commit_id":"787fc75d9d7075bbaa2fc70ec3157a253d7f594d"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"292fe0efee1cc6f9dfd45061cb04d0cb75ae5fa7","unresolved":true,"context_lines":[{"line_number":303,"context_line":"    correct_tail \u003d False"},{"line_number":304,"context_line":"    rows_per_shard \u003d args.rows_per_shard"},{"line_number":305,"context_line":"    if rows_per_shard \u003d\u003d \u0027auto\u0027:"},{"line_number":306,"context_line":"        rows_per_shard \u003d args.shard_container_threshold // 2"},{"line_number":307,"context_line":"        correct_tail \u003d True"},{"line_number":308,"context_line":"    shard_data, last_found \u003d broker.find_shard_ranges("},{"line_number":309,"context_line":"        rows_per_shard, limit\u003dlimit, correct_tail\u003dcorrect_tail)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5eb88abb_ecdaa9f1","line":306,"in_reply_to":"e5159a35_768e2581","updated":"2021-05-26 06:32:19.000000000","message":"It\u0027s kinda why the initial version of the in broker fix small ends wasn\u0027t triggered and just had it turned on permanately. Just always fix the bug even if it diddles with the last 2 shard counts, when we have a tiny one at the end we do anyway, it oviously isn\u0027t the shard_size and just permanately fixed the problem.\n\nBut then that changed the behaviour of what current people may expect so tied it into auto.","commit_id":"787fc75d9d7075bbaa2fc70ec3157a253d7f594d"}],"swift/container/backend.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"22668b576055fa329da9279add06ce80130288f7","unresolved":true,"context_lines":[{"line_number":2263,"context_line":"            return first_upper"},{"line_number":2264,"context_line":""},{"line_number":2265,"context_line":"        # attempt to get a second upper"},{"line_number":2266,"context_line":"        second_upper \u003d next_upper(first_upper, shard_size)"},{"line_number":2267,"context_line":"        if second_upper:"},{"line_number":2268,"context_line":"            # there is a next upper so we can return the last."},{"line_number":2269,"context_line":"            return first_upper"}],"source_content_type":"text/x-python","patch_set":1,"id":"ae04f22a_eb8d2b2a","line":2266,"updated":"2021-05-18 04:48:07.000000000","message":"We could just as easily grab the number of objs_left here and calculate, but was trying to avoid a count(name) on every _get_next_shard_range_upper and only leave it when we\u0027re at the end of the scanning.\n\nBut maybe finding the next upper, as it also hits the index, is just as expensive as the count.","commit_id":"0c6188fb179f14e74e83ebf398da0e1d4c9252ce"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"98ad5eee416994214dc18a904d68f05b0092f219","unresolved":true,"context_lines":[{"line_number":2270,"context_line":""},{"line_number":2271,"context_line":"        # If we get here we don\u0027t have a second upper. So we need to know"},{"line_number":2272,"context_line":"        # how many objects are left"},{"line_number":2273,"context_line":"        rows_left \u003d self.get_number_objects_after(first_upper)"},{"line_number":2274,"context_line":"        # Just picking some random point at where is should either be squashed"},{"line_number":2275,"context_line":"        # in or change the shard_size."},{"line_number":2276,"context_line":"        if rows_left \u003c shard_size * 0.5:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3bcc3614_2a4c290e","line":2273,"updated":"2021-05-18 14:31:32.000000000","message":"or (see comment in first patch in chain) just find out if there are more than some threshold of objects left, without needing the exact count.","commit_id":"0c6188fb179f14e74e83ebf398da0e1d4c9252ce"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a4f5f22ea0c8241e4e9e44d77650ea23eeb36c74","unresolved":true,"context_lines":[{"line_number":2270,"context_line":""},{"line_number":2271,"context_line":"        # If we get here we don\u0027t have a second upper. So we need to know"},{"line_number":2272,"context_line":"        # how many objects are left"},{"line_number":2273,"context_line":"        rows_left \u003d self.get_number_objects_after(first_upper)"},{"line_number":2274,"context_line":"        # Just picking some random point at where is should either be squashed"},{"line_number":2275,"context_line":"        # in or change the shard_size."},{"line_number":2276,"context_line":"        if rows_left \u003c shard_size * 0.5:"}],"source_content_type":"text/x-python","patch_set":1,"id":"d2e153f6_8c75efc2","line":2273,"in_reply_to":"3bcc3614_2a4c290e","updated":"2021-05-19 06:29:48.000000000","message":"True, but we\u0027re only getting rows_left if there if we\u0027ve hit then with second_upper so we know the max number of rows is 2 x shard_size - 1. So hoping the index here will help. So it\u0027s not like we\u0027re attempting to get a large list. Further I assume the index is some kind of efficient tree like structure. firing next uppers to determine how much is left might would be the same or extra db work on the index I suspect.\n\nI wonder if we could instead do something like:\n\n  select count(name) as obj_count, max(name) as upper from (select name from object where name \u003e \u003clast_upper\u003e order by name LIMIT \u003cshard_size\u003e);\n\nWhich will return the obj_count and the next upper. We will be returning all the rows too in the sub query, but might assume sqlite is smart about what it actually loads there. A sample on one of my SAIOs:\n\n sqlite\u003e select count(name) as obj_count, max(name) as upper from (select name from object where name \u003e \u0027beta029\u0027 order by name LIMIT 5);\n5|beta034\n\nWhere the records in the question are:\n\nsqlite\u003e select name from object where name \u003e \u0027beta029\u0027 order by name LIMIT 5;\nbeta030\nbeta031\nbeta032\nbeta033\nbeta034\n\nAnd the query plan is:\n\nsqlite\u003e  explain query plan select count(name) as obj_count, max(name) as upper from (select name from object where name \u003e \u0027beta029\u0027 order by name LIMIT 5);\nQUERY PLAN\n|--CO-ROUTINE 1\n|  |--SCAN TABLE object USING COVERING INDEX ix_object_deleted_name\n|  `--USE TEMP B-TREE FOR ORDER BY\n`--SCAN SUBQUERY 1\n\n\nIf I do the same at the end of the list I get:\n\n`--SCAN SUBQUERY 1\nsqlite\u003e select name from object where name \u003e \u0027beta047\u0027 order by name LIMIT 5;\nbeta048\nbeta049\nsqlite\u003e select count(name) as obj_count, max(name) as upper from (select name from object where name \u003e \u0027beta047\u0027 order by name LIMIT 5);\n2|beta049\n\nSo would have to be careful about how we end, it wont be a None anymore. So if we happen to have the perfect amount of rows for the last shardrange we need to make sure we do look ahead. But that should be covered right always looking 2 ahead.","commit_id":"0c6188fb179f14e74e83ebf398da0e1d4c9252ce"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"98ad5eee416994214dc18a904d68f05b0092f219","unresolved":true,"context_lines":[{"line_number":2278,"context_line":"            return None"},{"line_number":2279,"context_line":"        else:"},{"line_number":2280,"context_line":"            # logically break it in 2"},{"line_number":2281,"context_line":"            return next_upper(last_upper, (shard_size + rows_left) // 2)"},{"line_number":2282,"context_line":""},{"line_number":2283,"context_line":"    def find_shard_ranges(self, shard_size, limit\u003d-1, existing_ranges\u003dNone):"},{"line_number":2284,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"0238d7b2_74b5c1bd","line":2281,"updated":"2021-05-18 14:31:32.000000000","message":"we\u0027re throwing away the work that was done to find second_upper when it is not None...\n\nI\u0027m imagining we could have a method something like:\n\n  def _get_next_two_uppers(last_upper, shard_size):\n      # returns a tuple of tuple of next two (uppers, counts):\n      #   ((name1, shard_size), (name2, shard_size)) -\u003e found two uppers and there\u0027s more to come\n      #   ((name1, shard_size), (None, count\u003cshard_size)) - found penultimate and final shards: caller can decide what to do\n      #   ((None, count\u003cshard_size), (None, None)) - found final shard: caller can decide what to do\n\nor maybe it would be better as a generator that yields (shard upper, count) for the caller to build a list?\n\n  def yield_uppers(last_upper, shard_size, limit):\n      # yield (upper, count) starting after last_upper until limit\n      # or until upper\u003dNone","commit_id":"0c6188fb179f14e74e83ebf398da0e1d4c9252ce"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a4f5f22ea0c8241e4e9e44d77650ea23eeb36c74","unresolved":true,"context_lines":[{"line_number":2278,"context_line":"            return None"},{"line_number":2279,"context_line":"        else:"},{"line_number":2280,"context_line":"            # logically break it in 2"},{"line_number":2281,"context_line":"            return next_upper(last_upper, (shard_size + rows_left) // 2)"},{"line_number":2282,"context_line":""},{"line_number":2283,"context_line":"    def find_shard_ranges(self, shard_size, limit\u003d-1, existing_ranges\u003dNone):"},{"line_number":2284,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"4a9b777e_a84d7fef","line":2281,"in_reply_to":"0238d7b2_74b5c1bd","updated":"2021-05-19 06:29:48.000000000","message":"maybe I should\u0027ve put the above comment SQL statement stuff here, opps","commit_id":"0c6188fb179f14e74e83ebf398da0e1d4c9252ce"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"867c5e5e0dea5dabed4d51d5e1e6d4b2f415f16a","unresolved":true,"context_lines":[{"line_number":2217,"context_line":"        last_upper."},{"line_number":2218,"context_line":""},{"line_number":2219,"context_line":"        The info object_count is kept up to date by a trigger, so this is"},{"line_number":2220,"context_line":"        less efficient, but it does only hit the name/delete index."},{"line_number":2221,"context_line":""},{"line_number":2222,"context_line":"        :param last_upper: the upper bound of the last found shard range."},{"line_number":2223,"context_line":"        :return: an object count of object after last_upper or total object"}],"source_content_type":"text/x-python","patch_set":4,"id":"707e8643_6c19db65","line":2220,"updated":"2021-05-25 07:23:40.000000000","message":"Haven\u0027t looked into just storing the object_count value and then checking again to see how much it\u0027s changed yet.","commit_id":"787fc75d9d7075bbaa2fc70ec3157a253d7f594d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"99c0d800b56a492971a752a5bdb25e2e8c7795f8","unresolved":true,"context_lines":[{"line_number":2270,"context_line":"        second_upper \u003d next_upper(first_upper, shard_size)"},{"line_number":2271,"context_line":"        if second_upper:"},{"line_number":2272,"context_line":"            # there is a next upper so we can return the last."},{"line_number":2273,"context_line":"            return first_upper"},{"line_number":2274,"context_line":""},{"line_number":2275,"context_line":"        # If we get here we don\u0027t have a second upper. So we need to know"},{"line_number":2276,"context_line":"        # how many objects are left"}],"source_content_type":"text/x-python","patch_set":4,"id":"957f0144_fca65787","line":2273,"updated":"2021-05-25 14:40:42.000000000","message":"often (all but penultimate range) we make a query to find second_upper but then don\u0027t use it, so the same query will be repeated on the next call","commit_id":"787fc75d9d7075bbaa2fc70ec3157a253d7f594d"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"292fe0efee1cc6f9dfd45061cb04d0cb75ae5fa7","unresolved":true,"context_lines":[{"line_number":2270,"context_line":"        second_upper \u003d next_upper(first_upper, shard_size)"},{"line_number":2271,"context_line":"        if second_upper:"},{"line_number":2272,"context_line":"            # there is a next upper so we can return the last."},{"line_number":2273,"context_line":"            return first_upper"},{"line_number":2274,"context_line":""},{"line_number":2275,"context_line":"        # If we get here we don\u0027t have a second upper. So we need to know"},{"line_number":2276,"context_line":"        # how many objects are left"}],"source_content_type":"text/x-python","patch_set":4,"id":"4381c5e3_1cba34b0","line":2273,"in_reply_to":"957f0144_fca65787","updated":"2021-05-26 06:32:19.000000000","message":"yeah, that is a downside to this approach 😞","commit_id":"787fc75d9d7075bbaa2fc70ec3157a253d7f594d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"99c0d800b56a492971a752a5bdb25e2e8c7795f8","unresolved":true,"context_lines":[{"line_number":2275,"context_line":"        # If we get here we don\u0027t have a second upper. So we need to know"},{"line_number":2276,"context_line":"        # how many objects are left"},{"line_number":2277,"context_line":"        rows_left \u003d self.get_number_objects_after(first_upper)"},{"line_number":2278,"context_line":"        # Just picking some random point at where is should either be squashed"},{"line_number":2279,"context_line":"        # in or change the shard_size."},{"line_number":2280,"context_line":"        if rows_left \u003c shard_size * 0.5:"},{"line_number":2281,"context_line":"            # group it all into the next shard."},{"line_number":2282,"context_line":"            return None"},{"line_number":2283,"context_line":"        else:"},{"line_number":2284,"context_line":"            # logically break it in 2"}],"source_content_type":"text/x-python","patch_set":4,"id":"0b4a86a3_6df3f445","line":2281,"range":{"start_line":2278,"start_character":8,"end_line":2281,"end_character":47},"updated":"2021-05-25 14:40:42.000000000","message":"if we want to make this configurable there will be a lot of plumbing to do - I wonder if we can have this function return the raw data (upper, object count) and tidy up the tail further up the call chain","commit_id":"787fc75d9d7075bbaa2fc70ec3157a253d7f594d"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"292fe0efee1cc6f9dfd45061cb04d0cb75ae5fa7","unresolved":true,"context_lines":[{"line_number":2275,"context_line":"        # If we get here we don\u0027t have a second upper. So we need to know"},{"line_number":2276,"context_line":"        # how many objects are left"},{"line_number":2277,"context_line":"        rows_left \u003d self.get_number_objects_after(first_upper)"},{"line_number":2278,"context_line":"        # Just picking some random point at where is should either be squashed"},{"line_number":2279,"context_line":"        # in or change the shard_size."},{"line_number":2280,"context_line":"        if rows_left \u003c shard_size * 0.5:"},{"line_number":2281,"context_line":"            # group it all into the next shard."},{"line_number":2282,"context_line":"            return None"},{"line_number":2283,"context_line":"        else:"},{"line_number":2284,"context_line":"            # logically break it in 2"}],"source_content_type":"text/x-python","patch_set":4,"id":"c8cb8fd7_6ad705c1","line":2281,"range":{"start_line":2278,"start_character":8,"end_line":2281,"end_character":47},"in_reply_to":"0b4a86a3_6df3f445","updated":"2021-05-26 06:32:19.000000000","message":"Yeah, I guess we could do this all up the call chain and just leave some simpler helper methods. Like this origianly was.","commit_id":"787fc75d9d7075bbaa2fc70ec3157a253d7f594d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"99c0d800b56a492971a752a5bdb25e2e8c7795f8","unresolved":true,"context_lines":[{"line_number":2345,"context_line":"        found_ranges \u003d []"},{"line_number":2346,"context_line":"        sub_broker \u003d self.get_brokers()[0]"},{"line_number":2347,"context_line":"        index \u003d len(existing_ranges)"},{"line_number":2348,"context_line":"        while limit is None or limit \u003c 0 or len(found_ranges) \u003c limit:"},{"line_number":2349,"context_line":"            if progress + shard_size \u003e\u003d object_count:"},{"line_number":2350,"context_line":"                # next shard point is at or beyond final object name so don\u0027t"},{"line_number":2351,"context_line":"                # bother with db query"}],"source_content_type":"text/x-python","patch_set":4,"id":"2f67777d_09821382","line":2348,"range":{"start_line":2348,"start_character":8,"end_line":2348,"end_character":70},"updated":"2021-05-25 14:40:42.000000000","message":"I tried to work out how to avoid doing the extra work in _get_next_shard_range_upper (i.e. always doing the second_upper query). Ideally we would only do extra work when we find the last shard range, and then maybe merge it into the penultimate. But that is difficult given the way limit is used, meaning that the current call to find_shard_ranges may only find the last shard range and it\u0027s too late to merge into the penultimate.\n\nSo..I ended up moving the \u0027merge last into penultimate\u0027 to the callers of this function and leaving this function to just find uppers and object counts. Then we can do less work here and make decision about the last shard range in a place where we have all the shard ranges.","commit_id":"787fc75d9d7075bbaa2fc70ec3157a253d7f594d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"99c0d800b56a492971a752a5bdb25e2e8c7795f8","unresolved":true,"context_lines":[{"line_number":2347,"context_line":"        index \u003d len(existing_ranges)"},{"line_number":2348,"context_line":"        while limit is None or limit \u003c 0 or len(found_ranges) \u003c limit:"},{"line_number":2349,"context_line":"            if progress + shard_size \u003e\u003d object_count:"},{"line_number":2350,"context_line":"                # next shard point is at or beyond final object name so don\u0027t"},{"line_number":2351,"context_line":"                # bother with db query"},{"line_number":2352,"context_line":"                next_shard_upper \u003d None"},{"line_number":2353,"context_line":"            else:"},{"line_number":2354,"context_line":"                try:"},{"line_number":2355,"context_line":"                    next_shard_upper \u003d sub_broker._get_next_shard_range_upper("}],"source_content_type":"text/x-python","patch_set":4,"id":"7d0e5779_f4381ea2","line":2352,"range":{"start_line":2350,"start_character":16,"end_line":2352,"end_character":39},"updated":"2021-05-25 14:40:42.000000000","message":"how does this interact with correct_tail?","commit_id":"787fc75d9d7075bbaa2fc70ec3157a253d7f594d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"99c0d800b56a492971a752a5bdb25e2e8c7795f8","unresolved":true,"context_lines":[{"line_number":2370,"context_line":"                    # shard size may not be accurate until cleaved, but at"},{"line_number":2371,"context_line":"                    # least the sum of shard sizes will equal the unsharded"},{"line_number":2372,"context_line":"                    # object_count"},{"line_number":2373,"context_line":"                    shard_size \u003d object_count - progress"},{"line_number":2374,"context_line":""},{"line_number":2375,"context_line":"            # NB shard ranges are created with a non-zero object count so that"},{"line_number":2376,"context_line":"            # the apparent container object count remains constant, and the"}],"source_content_type":"text/x-python","patch_set":4,"id":"62f93595_74f62a19","line":2373,"range":{"start_line":2373,"start_character":20,"end_line":2373,"end_character":56},"updated":"2021-05-25 14:40:42.000000000","message":"oh, we\u0027re already making a guesstimate of the final shard object count! Could we already have been avoiding small shards using this value??","commit_id":"787fc75d9d7075bbaa2fc70ec3157a253d7f594d"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"292fe0efee1cc6f9dfd45061cb04d0cb75ae5fa7","unresolved":true,"context_lines":[{"line_number":2370,"context_line":"                    # shard size may not be accurate until cleaved, but at"},{"line_number":2371,"context_line":"                    # least the sum of shard sizes will equal the unsharded"},{"line_number":2372,"context_line":"                    # object_count"},{"line_number":2373,"context_line":"                    shard_size \u003d object_count - progress"},{"line_number":2374,"context_line":""},{"line_number":2375,"context_line":"            # NB shard ranges are created with a non-zero object count so that"},{"line_number":2376,"context_line":"            # the apparent container object count remains constant, and the"}],"source_content_type":"text/x-python","patch_set":4,"id":"011d3a6e_89c0fb9e","line":2373,"range":{"start_line":2373,"start_character":20,"end_line":2373,"end_character":56},"in_reply_to":"62f93595_74f62a19","updated":"2021-05-26 06:32:19.000000000","message":"yeah maybe we could! Maybe past us wasn\u0027t so silly we just didn\u0027t complete the thought process.\n\nIf this is small enough we should just update the last to range to be upper \u003d \u0027\u0027. However, as you mentioned the limit becomes a PITA.","commit_id":"787fc75d9d7075bbaa2fc70ec3157a253d7f594d"}],"swift/container/sharder.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"99c0d800b56a492971a752a5bdb25e2e8c7795f8","unresolved":true,"context_lines":[{"line_number":633,"context_line":"        return int(config_percent_value(val) * self.shard_container_threshold)"},{"line_number":634,"context_line":""},{"line_number":635,"context_line":"    def auto_int_value(self, val):"},{"line_number":636,"context_line":"        return config_auto_int_value(val, \u0027auto\u0027)"},{"line_number":637,"context_line":""},{"line_number":638,"context_line":""},{"line_number":639,"context_line":"DEFAULT_SHARDER_CONF \u003d vars(ContainerSharderConf())"}],"source_content_type":"text/x-python","patch_set":4,"id":"db33e0db_16dd278e","line":636,"updated":"2021-05-25 14:40:42.000000000","message":"could be worth having in utils - won\u0027t we need the same in manage_shard_ranges?","commit_id":"787fc75d9d7075bbaa2fc70ec3157a253d7f594d"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"292fe0efee1cc6f9dfd45061cb04d0cb75ae5fa7","unresolved":true,"context_lines":[{"line_number":633,"context_line":"        return int(config_percent_value(val) * self.shard_container_threshold)"},{"line_number":634,"context_line":""},{"line_number":635,"context_line":"    def auto_int_value(self, val):"},{"line_number":636,"context_line":"        return config_auto_int_value(val, \u0027auto\u0027)"},{"line_number":637,"context_line":""},{"line_number":638,"context_line":""},{"line_number":639,"context_line":"DEFAULT_SHARDER_CONF \u003d vars(ContainerSharderConf())"}],"source_content_type":"text/x-python","patch_set":4,"id":"fe36f431_fac0a6e7","line":636,"in_reply_to":"db33e0db_16dd278e","updated":"2021-05-26 06:32:19.000000000","message":"Yes we do! And I thought I\u0027d done that in s-m-s-r but it isn\u0027t there, maybe lost it in the rebase/rework. OR it\u0027s still living in the next patch which I forgot to move. Anycase yes that is what we need to do.","commit_id":"787fc75d9d7075bbaa2fc70ec3157a253d7f594d"}]}
