)]}'
{"swift/container/replicator.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7c44f647ad22285be69f155ec290342adb2b8eaf","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            node, response, info, broker, http, different_region)"},{"line_number":86,"context_line":"        return rv"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def _initialize_broker(self, device, part, account, container, **kwargs):"},{"line_number":89,"context_line":"        hsh \u003d hash_path(account, container)"},{"line_number":90,"context_line":"        db_dir \u003d storage_directory(DATADIR, part, hsh)"},{"line_number":91,"context_line":"        db_path \u003d os.path.join(self.root, device, db_dir, hsh + \u0027.db\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_6f16ec57","line":88,"range":{"start_line":88,"start_character":41,"end_line":88,"end_character":45},"updated":"2017-09-28 17:56:10.000000000","message":"It feels a little silly to pass in the part when we\u0027re computing the hash anyway... but I suppose we don\u0027t have the ring\u0027s part power :-(\n\nThis kinda feels like it should be a static method on ContainerBroker...","commit_id":"7c18f9e131f81666febfa0ee4c97dd129a9c85aa"}],"swift/container/sharder.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7c44f647ad22285be69f155ec290342adb2b8eaf","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        node \u003d self.find_local_handoff_for_part(part)"},{"line_number":212,"context_line":"        if not node:"},{"line_number":213,"context_line":"            # TODO: and when *do* we cleave? maybe we should just be picking"},{"line_number":214,"context_line":"            # one of the local devs"},{"line_number":215,"context_line":"            raise DeviceUnavailable("},{"line_number":216,"context_line":"                \u0027No mounted devices found suitable to Handoff sharded \u0027"},{"line_number":217,"context_line":"                \u0027container %s in partition %s\u0027 % (container, part))"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_f26763b6","line":214,"updated":"2017-09-28 17:56:10.000000000","message":"So we get here if none of the local devices have partitions assigned... Are we sure that we\u0027ll still replicate if we just pick one? I suppose db_replicator uses the same sort of loop that we used to get here, so it should be safe...","commit_id":"7c18f9e131f81666febfa0ee4c97dd129a9c85aa"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7c44f647ad22285be69f155ec290342adb2b8eaf","unresolved":false,"context_lines":[{"line_number":1224,"context_line":"        state \u003d broker.get_db_state()"},{"line_number":1225,"context_line":"        if state \u003d\u003d DB_STATE_SHARDED:"},{"line_number":1226,"context_line":"            self.logger.info(\u0027Passing over already sharded container %s/%s\u0027,"},{"line_number":1227,"context_line":"                             broker.account, broker.container)"},{"line_number":1228,"context_line":"            return"},{"line_number":1229,"context_line":""},{"line_number":1230,"context_line":"        if state \u003d\u003d DB_STATE_UNSHARDED:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_f2eac3d5","line":1227,"updated":"2017-09-28 17:56:10.000000000","message":"Yeah, that seems like a good sanity check... definitely wouldn\u0027t want to try to split misplaced objects...","commit_id":"7c18f9e131f81666febfa0ee4c97dd129a9c85aa"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3816165f7e82ac7fb0b44cc5c11cecfef1c048b7","unresolved":false,"context_lines":[{"line_number":1224,"context_line":"        state \u003d broker.get_db_state()"},{"line_number":1225,"context_line":"        if state \u003d\u003d DB_STATE_SHARDED:"},{"line_number":1226,"context_line":"            self.logger.info(\u0027Passing over already sharded container %s/%s\u0027,"},{"line_number":1227,"context_line":"                             broker.account, broker.container)"},{"line_number":1228,"context_line":"            return"},{"line_number":1229,"context_line":""},{"line_number":1230,"context_line":"        if state \u003d\u003d DB_STATE_UNSHARDED:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_70c32bee","line":1227,"in_reply_to":"7f515b1d_f2eac3d5","updated":"2017-10-03 08:38:59.000000000","message":"I discovered from the test that previously once all ranges had been cleaved, this cleave method would start from the beginning again because the last pivot (\u0027\u0027) matches the first range - hence adding this state based early return","commit_id":"7c18f9e131f81666febfa0ee4c97dd129a9c85aa"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7c44f647ad22285be69f155ec290342adb2b8eaf","unresolved":false,"context_lines":[{"line_number":1237,"context_line":"        if last_pivot:"},{"line_number":1238,"context_line":"            last_range \u003d find_shard_range(last_pivot, shard_ranges)"},{"line_number":1239,"context_line":"            last_piv_exists \u003d last_range and last_range.upper \u003d\u003d last_pivot"},{"line_number":1240,"context_line":"            self.logger.info(\u0027Continuing to shard %s/%s\u0027,"},{"line_number":1241,"context_line":"                             broker.account, broker.container)"},{"line_number":1242,"context_line":"        else:"},{"line_number":1243,"context_line":"            self.logger.info(\u0027Starting to shard %s/%s\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_12755f32","line":1240,"updated":"2017-09-28 17:56:10.000000000","message":"\"... starting from \u003clast_pivot\u003e\"?\n\nIDK, maybe the\n\n Sharding \u003cacct\u003e/\u003ccont\u003e: \u003cshard range\u003e\n\nbelow is enough.","commit_id":"7c18f9e131f81666febfa0ee4c97dd129a9c85aa"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3816165f7e82ac7fb0b44cc5c11cecfef1c048b7","unresolved":false,"context_lines":[{"line_number":1237,"context_line":"        if last_pivot:"},{"line_number":1238,"context_line":"            last_range \u003d find_shard_range(last_pivot, shard_ranges)"},{"line_number":1239,"context_line":"            last_piv_exists \u003d last_range and last_range.upper \u003d\u003d last_pivot"},{"line_number":1240,"context_line":"            self.logger.info(\u0027Continuing to shard %s/%s\u0027,"},{"line_number":1241,"context_line":"                             broker.account, broker.container)"},{"line_number":1242,"context_line":"        else:"},{"line_number":1243,"context_line":"            self.logger.info(\u0027Starting to shard %s/%s\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_506b8fef","line":1240,"in_reply_to":"7f515b1d_12755f32","updated":"2017-10-03 08:38:59.000000000","message":"yeah, I assume we will clear out some of the chatty logging (at least shift to debug level). for time being it is useful to aid understanding what is happening.","commit_id":"7c18f9e131f81666febfa0ee4c97dd129a9c85aa"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7c44f647ad22285be69f155ec290342adb2b8eaf","unresolved":false,"context_lines":[{"line_number":1243,"context_line":"            self.logger.info(\u0027Starting to shard %s/%s\u0027,"},{"line_number":1244,"context_line":"                             broker.account, broker.container)"},{"line_number":1245,"context_line":""},{"line_number":1246,"context_line":"        # TODO: use get_shard_ranges with marker?"},{"line_number":1247,"context_line":"        ranges_todo \u003d ["},{"line_number":1248,"context_line":"            srange for srange in shard_ranges"},{"line_number":1249,"context_line":"            if srange.upper \u003e last_pivot or srange.lower \u003e\u003d last_pivot]"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_72adb399","line":1246,"updated":"2017-09-28 17:56:10.000000000","message":"+1, surely there\u0027s a reasonable way to do that...","commit_id":"7c18f9e131f81666febfa0ee4c97dd129a9c85aa"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7c44f647ad22285be69f155ec290342adb2b8eaf","unresolved":false,"context_lines":[{"line_number":1248,"context_line":"            srange for srange in shard_ranges"},{"line_number":1249,"context_line":"            if srange.upper \u003e last_pivot or srange.lower \u003e\u003d last_pivot]"},{"line_number":1250,"context_line":"        if not ranges_todo and scan_complete and not last_piv_exists:"},{"line_number":1251,"context_line":"            # TODO (acoles): I need to understand this better."},{"line_number":1252,"context_line":"            # 1. The last recorded pivot does not line up with a range upper,"},{"line_number":1253,"context_line":"            # so we slide that range\u0027s lower up to the pivot...to avoid copying"},{"line_number":1254,"context_line":"            # rows again? but if the range has changed then don\u0027t we need to"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_b2be8bb1","line":1251,"updated":"2017-09-28 17:56:10.000000000","message":"Yeah, this whole\n\n dont_save \u003d True\n\nbusiness makes me really suspicious -- it weirds me out.","commit_id":"7c18f9e131f81666febfa0ee4c97dd129a9c85aa"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7c44f647ad22285be69f155ec290342adb2b8eaf","unresolved":false,"context_lines":[{"line_number":1279,"context_line":""},{"line_number":1280,"context_line":"        ranges_done \u003d []"},{"line_number":1281,"context_line":"        policy_index \u003d broker.storage_policy_index"},{"line_number":1282,"context_line":"        for shard_range in ranges_todo[:self.shard_batch_size]:"},{"line_number":1283,"context_line":"            self.logger.info("},{"line_number":1284,"context_line":"                \"Sharding \u0027%s/%s\u0027: %r\","},{"line_number":1285,"context_line":"                broker.account, broker.container, shard_range)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_f2d403eb","line":1282,"updated":"2017-09-28 17:56:10.000000000","message":"+1","commit_id":"7c18f9e131f81666febfa0ee4c97dd129a9c85aa"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7c44f647ad22285be69f155ec290342adb2b8eaf","unresolved":false,"context_lines":[{"line_number":1291,"context_line":"                self.logger.warning(str(duex))"},{"line_number":1292,"context_line":"                self.logger.increment(\u0027failure\u0027)"},{"line_number":1293,"context_line":"                self.stats[\u0027containers_failed\u0027] +\u003d 1"},{"line_number":1294,"context_line":"                return"},{"line_number":1295,"context_line":""},{"line_number":1296,"context_line":"            self._add_shard_metadata(new_broker, root_account,"},{"line_number":1297,"context_line":"                                     root_container, shard_range)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_32f85b79","line":1294,"updated":"2017-09-28 17:56:10.000000000","message":"Right, and we want to stick with the return because if we continued, we\u0027d surely just hit this again.","commit_id":"7c18f9e131f81666febfa0ee4c97dd129a9c85aa"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3816165f7e82ac7fb0b44cc5c11cecfef1c048b7","unresolved":false,"context_lines":[{"line_number":1291,"context_line":"                self.logger.warning(str(duex))"},{"line_number":1292,"context_line":"                self.logger.increment(\u0027failure\u0027)"},{"line_number":1293,"context_line":"                self.stats[\u0027containers_failed\u0027] +\u003d 1"},{"line_number":1294,"context_line":"                return"},{"line_number":1295,"context_line":""},{"line_number":1296,"context_line":"            self._add_shard_metadata(new_broker, root_account,"},{"line_number":1297,"context_line":"                                     root_container, shard_range)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_7051eb35","line":1294,"in_reply_to":"7f515b1d_32f85b79","updated":"2017-10-03 08:38:59.000000000","message":"plus, we have to return because we don\u0027t track per-shard cleave state, we only track progress, so we can\u0027t ignore this shard range for now and move on to the next.","commit_id":"7c18f9e131f81666febfa0ee4c97dd129a9c85aa"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7c44f647ad22285be69f155ec290342adb2b8eaf","unresolved":false,"context_lines":[{"line_number":1332,"context_line":"        else:"},{"line_number":1333,"context_line":"            self.logger.warning(\u0027No progress made in _cleave()!\u0027)"},{"line_number":1334,"context_line":""},{"line_number":1335,"context_line":"        any(self.cpool)"},{"line_number":1336,"context_line":""},{"line_number":1337,"context_line":"        if scan_complete and len(ranges_done) \u003d\u003d len(ranges_todo):"},{"line_number":1338,"context_line":"            # we\u0027ve finished sharding this container."}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_f2f76358","line":1335,"updated":"2017-09-28 17:56:10.000000000","message":"At some point I really need to invest in understanding this... I know there\u0027s some other point where we\u0027re using all() instead, and I\u0027m not sure when we\u0027d want which :-/","commit_id":"7c18f9e131f81666febfa0ee4c97dd129a9c85aa"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3816165f7e82ac7fb0b44cc5c11cecfef1c048b7","unresolved":false,"context_lines":[{"line_number":1332,"context_line":"        else:"},{"line_number":1333,"context_line":"            self.logger.warning(\u0027No progress made in _cleave()!\u0027)"},{"line_number":1334,"context_line":""},{"line_number":1335,"context_line":"        any(self.cpool)"},{"line_number":1336,"context_line":""},{"line_number":1337,"context_line":"        if scan_complete and len(ranges_done) \u003d\u003d len(ranges_todo):"},{"line_number":1338,"context_line":"            # we\u0027ve finished sharding this container."}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_cb1a306d","line":1335,"in_reply_to":"7f515b1d_f2f76358","updated":"2017-10-03 08:38:59.000000000","message":"me too! which suggests a comment is needed.\n\nI reasoned that _replicate_object returns None, so any() will need to wait for all return values before evaulating a False result.","commit_id":"7c18f9e131f81666febfa0ee4c97dd129a9c85aa"}],"test/unit/container/test_sharder.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7c44f647ad22285be69f155ec290342adb2b8eaf","unresolved":false,"context_lines":[{"line_number":512,"context_line":"        for shard_range in initial_shard_ranges:"},{"line_number":513,"context_line":"            db_hash \u003d hash_path(\u0027.sharded_a\u0027, shard_range.name)"},{"line_number":514,"context_line":"            expected_shard_dbs.append("},{"line_number":515,"context_line":"                os.path.join(self.tempdir, \u0027sda\u0027, \u0027containers\u0027, \u00270\u0027,"},{"line_number":516,"context_line":"                             db_hash[-3:], db_hash, db_hash + \u0027.db\u0027))"},{"line_number":517,"context_line":""},{"line_number":518,"context_line":"        # run cleave - no shard ranges, nothing happens"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_f2a52348","line":515,"range":{"start_line":515,"start_character":65,"end_line":515,"end_character":66},"updated":"2017-09-28 17:56:10.000000000","message":"Where do we force the part? Was that just dumb luck?","commit_id":"7c18f9e131f81666febfa0ee4c97dd129a9c85aa"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3816165f7e82ac7fb0b44cc5c11cecfef1c048b7","unresolved":false,"context_lines":[{"line_number":512,"context_line":"        for shard_range in initial_shard_ranges:"},{"line_number":513,"context_line":"            db_hash \u003d hash_path(\u0027.sharded_a\u0027, shard_range.name)"},{"line_number":514,"context_line":"            expected_shard_dbs.append("},{"line_number":515,"context_line":"                os.path.join(self.tempdir, \u0027sda\u0027, \u0027containers\u0027, \u00270\u0027,"},{"line_number":516,"context_line":"                             db_hash[-3:], db_hash, db_hash + \u0027.db\u0027))"},{"line_number":517,"context_line":""},{"line_number":518,"context_line":"        # run cleave - no shard ranges, nothing happens"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_4ba3e000","line":515,"range":{"start_line":515,"start_character":65,"end_line":515,"end_character":66},"in_reply_to":"7f515b1d_f2a52348","updated":"2017-10-03 08:38:59.000000000","message":"hmmm, maybe I did get lucky :/","commit_id":"7c18f9e131f81666febfa0ee4c97dd129a9c85aa"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7c44f647ad22285be69f155ec290342adb2b8eaf","unresolved":false,"context_lines":[{"line_number":523,"context_line":"        sharder._replicate_object.assert_not_called()"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"        broker.merge_items("},{"line_number":526,"context_line":"            [dict(shard_range, deleted\u003d0, storage_policy_index\u003d0,"},{"line_number":527,"context_line":"                  record_type\u003dRECORD_TYPE_SHARD_NODE)"},{"line_number":528,"context_line":"             for shard_range in initial_shard_ranges[:3]])"},{"line_number":529,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_25db737c","line":526,"range":{"start_line":526,"start_character":42,"end_line":526,"end_character":65},"updated":"2017-09-28 17:56:10.000000000","message":"Do we actually use that?","commit_id":"7c18f9e131f81666febfa0ee4c97dd129a9c85aa"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3816165f7e82ac7fb0b44cc5c11cecfef1c048b7","unresolved":false,"context_lines":[{"line_number":523,"context_line":"        sharder._replicate_object.assert_not_called()"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"        broker.merge_items("},{"line_number":526,"context_line":"            [dict(shard_range, deleted\u003d0, storage_policy_index\u003d0,"},{"line_number":527,"context_line":"                  record_type\u003dRECORD_TYPE_SHARD_NODE)"},{"line_number":528,"context_line":"             for shard_range in initial_shard_ranges[:3]])"},{"line_number":529,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_6b7b3c8b","line":526,"range":{"start_line":526,"start_character":42,"end_line":526,"end_character":65},"in_reply_to":"7f515b1d_25db737c","updated":"2017-10-03 08:38:59.000000000","message":"perhaps not, or at least perhaps we should not need it. I think there is some clean up needed in the merge items path, I see storage policy index being added into shard range dicts and I\u0027m not sure why.","commit_id":"7c18f9e131f81666febfa0ee4c97dd129a9c85aa"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7c44f647ad22285be69f155ec290342adb2b8eaf","unresolved":false,"context_lines":[{"line_number":545,"context_line":""},{"line_number":546,"context_line":"        # first 2 shard ranges should have updated object count, bytes used and"},{"line_number":547,"context_line":"        # meta_timestamp"},{"line_number":548,"context_line":"        initial_shard_ranges[0].bytes_used \u003d 20"},{"line_number":549,"context_line":"        initial_shard_ranges[0].object_count \u003d 2"},{"line_number":550,"context_line":"        initial_shard_ranges[1].bytes_used \u003d 6"},{"line_number":551,"context_line":"        initial_shard_ranges[1].object_count \u003d 3"},{"line_number":552,"context_line":""},{"line_number":553,"context_line":"        def check_shard_range(expected, actual):"},{"line_number":554,"context_line":"            expected_dict \u003d dict(expected)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_e5679bb6","line":551,"range":{"start_line":548,"start_character":8,"end_line":551,"end_character":48},"updated":"2017-09-28 17:56:10.000000000","message":"nit: maybe move these down to be a bit tighter with where we\u0027re doing the checking. I rather like the flow around L585-590","commit_id":"7c18f9e131f81666febfa0ee4c97dd129a9c85aa"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3816165f7e82ac7fb0b44cc5c11cecfef1c048b7","unresolved":false,"context_lines":[{"line_number":545,"context_line":""},{"line_number":546,"context_line":"        # first 2 shard ranges should have updated object count, bytes used and"},{"line_number":547,"context_line":"        # meta_timestamp"},{"line_number":548,"context_line":"        initial_shard_ranges[0].bytes_used \u003d 20"},{"line_number":549,"context_line":"        initial_shard_ranges[0].object_count \u003d 2"},{"line_number":550,"context_line":"        initial_shard_ranges[1].bytes_used \u003d 6"},{"line_number":551,"context_line":"        initial_shard_ranges[1].object_count \u003d 3"},{"line_number":552,"context_line":""},{"line_number":553,"context_line":"        def check_shard_range(expected, actual):"},{"line_number":554,"context_line":"            expected_dict \u003d dict(expected)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_abdff463","line":551,"range":{"start_line":548,"start_character":8,"end_line":551,"end_character":48},"in_reply_to":"7f515b1d_e5679bb6","updated":"2017-10-03 08:38:59.000000000","message":"Done","commit_id":"7c18f9e131f81666febfa0ee4c97dd129a9c85aa"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7c44f647ad22285be69f155ec290342adb2b8eaf","unresolved":false,"context_lines":[{"line_number":624,"context_line":"        # fourth shard range should now have update object count, bytes used"},{"line_number":625,"context_line":"        initial_shard_ranges[3].bytes_used \u003d 1000"},{"line_number":626,"context_line":"        initial_shard_ranges[3].object_count \u003d 1"},{"line_number":627,"context_line":"        check_shard_objects(objects[7:], expected_shard_dbs[3])"},{"line_number":628,"context_line":""},{"line_number":629,"context_line":"        # run cleave - should be a no-op"},{"line_number":630,"context_line":"        with self._mock_sharder() as sharder:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_45754f63","line":627,"updated":"2017-09-28 17:56:10.000000000","message":"Add a check_shard_range call?","commit_id":"7c18f9e131f81666febfa0ee4c97dd129a9c85aa"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3816165f7e82ac7fb0b44cc5c11cecfef1c048b7","unresolved":false,"context_lines":[{"line_number":624,"context_line":"        # fourth shard range should now have update object count, bytes used"},{"line_number":625,"context_line":"        initial_shard_ranges[3].bytes_used \u003d 1000"},{"line_number":626,"context_line":"        initial_shard_ranges[3].object_count \u003d 1"},{"line_number":627,"context_line":"        check_shard_objects(objects[7:], expected_shard_dbs[3])"},{"line_number":628,"context_line":""},{"line_number":629,"context_line":"        # run cleave - should be a no-op"},{"line_number":630,"context_line":"        with self._mock_sharder() as sharder:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_ebd96c82","line":627,"in_reply_to":"7f515b1d_45754f63","updated":"2017-10-03 08:38:59.000000000","message":"Done","commit_id":"7c18f9e131f81666febfa0ee4c97dd129a9c85aa"}]}
