)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ee4d1b3a7067608e1b82ee3672f322584afa1450","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Alistair Coles \u003calistairncoles@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-03-20 10:04:19 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Store epoch and root container in shard ranges table"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Storing the epoch of a container in its shard range makes it available"},{"line_number":10,"context_line":"when creating brokers to replicate to that container. This means that"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"df7087c5_af37a04d","line":7,"range":{"start_line":7,"start_character":16,"end_line":7,"end_character":20},"updated":"2018-03-20 22:37:43.000000000","message":"I\u0027m a little hesitant to add root as a column, since *every* row in the entire table should *always* have the same value...\n\nAre we sure we can\u0027t get away with using some phony state to push parents as an extra *row* instead?\n\nI\u0027m just not seeing much of a way for us to have a wide range of \"parents\" recorded in a single shard-ranges table, even in some future where we have more than the two levels of root and shard....","commit_id":"a6953a8b16387a2aecb47f74f70860be8a93d444"}],"swift/cli/shard-info.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9bb5873211bf4c61a52109d75f907ba1f9abaae5","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    print(\u0027%s(%s) %23s, objs: %3s, bytes: %3s, timestamp: %s (%s), \u0027"},{"line_number":90,"context_line":"          \u0027modified: %s (%s), %7s: %s (%s), deleted: %s epoch: %s\u0027 %"},{"line_number":91,"context_line":"          (indent, node[1][0], range, sr.object_count, sr.bytes_used,"},{"line_number":92,"context_line":"           Timestamp(sr.timestamp).isoformat, sr.timestamp.internal,"},{"line_number":93,"context_line":"           Timestamp(sr.meta_timestamp).isoformat, sr.meta_timestamp.internal,"},{"line_number":94,"context_line":"           sr.state_text, sr.state_timestamp.isoformat,"},{"line_number":95,"context_line":"           sr.state_timestamp.internal, sr.deleted,"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_17a1c7f8","line":92,"range":{"start_line":92,"start_character":11,"end_line":92,"end_character":20},"updated":"2018-03-22 21:07:03.000000000","message":"Do we really need to create a new Timestamp here? I thought sr.timestamp is *already* a Timestamp...","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8251d653fb291f00e6baf03a81357d0fc8816ad4","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    print(\u0027%s(%s) %23s, objs: %3s, bytes: %3s, timestamp: %s (%s), \u0027"},{"line_number":90,"context_line":"          \u0027modified: %s (%s), %7s: %s (%s), deleted: %s epoch: %s\u0027 %"},{"line_number":91,"context_line":"          (indent, node[1][0], range, sr.object_count, sr.bytes_used,"},{"line_number":92,"context_line":"           Timestamp(sr.timestamp).isoformat, sr.timestamp.internal,"},{"line_number":93,"context_line":"           Timestamp(sr.meta_timestamp).isoformat, sr.meta_timestamp.internal,"},{"line_number":94,"context_line":"           sr.state_text, sr.state_timestamp.isoformat,"},{"line_number":95,"context_line":"           sr.state_timestamp.internal, sr.deleted,"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_571bbfc8","line":92,"range":{"start_line":92,"start_character":11,"end_line":92,"end_character":20},"in_reply_to":"df7087c5_17a1c7f8","updated":"2018-03-22 21:25:41.000000000","message":"ugh, nope, not necessary here and for meta and in the function below that I copied","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"04b2261c376f23bebf65644578fddf9b43639e89","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    print(\u0027%s(%s) %23s, objs: %3s, bytes: %3s, timestamp: %s (%s), \u0027"},{"line_number":90,"context_line":"          \u0027modified: %s (%s), %7s: %s (%s), deleted: %s epoch: %s\u0027 %"},{"line_number":91,"context_line":"          (indent, node[1][0], range, sr.object_count, sr.bytes_used,"},{"line_number":92,"context_line":"           Timestamp(sr.timestamp).isoformat, sr.timestamp.internal,"},{"line_number":93,"context_line":"           Timestamp(sr.meta_timestamp).isoformat, sr.meta_timestamp.internal,"},{"line_number":94,"context_line":"           sr.state_text, sr.state_timestamp.isoformat,"},{"line_number":95,"context_line":"           sr.state_timestamp.internal, sr.deleted,"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_97c6369a","line":92,"range":{"start_line":92,"start_character":11,"end_line":92,"end_character":20},"in_reply_to":"df7087c5_571bbfc8","updated":"2018-03-22 21:46:36.000000000","message":"Done in https://review.openstack.org/555467","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"}],"swift/common/utils.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b54e913fd4c57935314ff333c971517231485593","unresolved":false,"context_lines":[{"line_number":4391,"context_line":"        self._upper \u003d ShardRange.MAX"},{"line_number":4392,"context_line":"        self.lower \u003d lower"},{"line_number":4393,"context_line":"        self.upper \u003d upper"},{"line_number":4394,"context_line":"        self.timestamp \u003d created_at"},{"line_number":4395,"context_line":"        self._meta_timestamp \u003d self._state_timestamp \u003d self._epoch \u003d None"},{"line_number":4396,"context_line":"        self.meta_timestamp \u003d meta_timestamp"},{"line_number":4397,"context_line":"        self.object_count \u003d object_count"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_dcb7f4f4","line":4394,"updated":"2018-03-23 00:55:49.000000000","message":"i thought *this* was the epoch!","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"}],"swift/container/backend.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9bb5873211bf4c61a52109d75f907ba1f9abaae5","unresolved":false,"context_lines":[{"line_number":340,"context_line":"        if self.db_epoch is None:"},{"line_number":341,"context_line":"            # never been sharded"},{"line_number":342,"context_line":"            return UNSHARDED"},{"line_number":343,"context_line":"        if self.db_epoch !\u003d self._own_shard_range().epoch:"},{"line_number":344,"context_line":"            return UNSHARDED"},{"line_number":345,"context_line":"        if not self.get_shard_ranges():"},{"line_number":346,"context_line":"            return COLLAPSED"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_77dda36e","line":343,"updated":"2018-03-22 21:07:03.000000000","message":"OK, using the private version to avoid the get_info() call...","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8251d653fb291f00e6baf03a81357d0fc8816ad4","unresolved":false,"context_lines":[{"line_number":340,"context_line":"        if self.db_epoch is None:"},{"line_number":341,"context_line":"            # never been sharded"},{"line_number":342,"context_line":"            return UNSHARDED"},{"line_number":343,"context_line":"        if self.db_epoch !\u003d self._own_shard_range().epoch:"},{"line_number":344,"context_line":"            return UNSHARDED"},{"line_number":345,"context_line":"        if not self.get_shard_ranges():"},{"line_number":346,"context_line":"            return COLLAPSED"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_d784afd5","line":343,"in_reply_to":"df7087c5_77dda36e","updated":"2018-03-22 21:25:41.000000000","message":"yep or we go round and round in circles :)","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b54e913fd4c57935314ff333c971517231485593","unresolved":false,"context_lines":[{"line_number":1667,"context_line":"                state\u003dShardRange.ACTIVE)"},{"line_number":1668,"context_line":"        return own_shard_range"},{"line_number":1669,"context_line":""},{"line_number":1670,"context_line":"    def get_own_shard_range(self, no_default\u003dFalse):"},{"line_number":1671,"context_line":"        \"\"\""},{"line_number":1672,"context_line":"        Returns a shard range representing this broker\u0027s own shard range. If no"},{"line_number":1673,"context_line":"        such range has been persisted in the broker\u0027s shard ranges table then a"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_7a2fc787","line":1670,"updated":"2018-03-23 00:55:49.000000000","message":"so by default we have a default, and we know this because no_default is False, which means True","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9bb5873211bf4c61a52109d75f907ba1f9abaae5","unresolved":false,"context_lines":[{"line_number":1686,"context_line":"        if own_shard_range:"},{"line_number":1687,"context_line":"            info \u003d self.get_info()"},{"line_number":1688,"context_line":"            own_shard_range.update_meta("},{"line_number":1689,"context_line":"                info.get(\u0027object_count\u0027, 0), info.get(\u0027bytes_used\u0027, 0))"},{"line_number":1690,"context_line":"        return own_shard_range"},{"line_number":1691,"context_line":""},{"line_number":1692,"context_line":"    # TODO: add unit test"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_17d8e778","line":1689,"updated":"2018-03-22 21:07:03.000000000","message":"Hmm... so now, even when we return a default shard range, timestamp and meta_timestamp will differ.","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8251d653fb291f00e6baf03a81357d0fc8816ad4","unresolved":false,"context_lines":[{"line_number":1686,"context_line":"        if own_shard_range:"},{"line_number":1687,"context_line":"            info \u003d self.get_info()"},{"line_number":1688,"context_line":"            own_shard_range.update_meta("},{"line_number":1689,"context_line":"                info.get(\u0027object_count\u0027, 0), info.get(\u0027bytes_used\u0027, 0))"},{"line_number":1690,"context_line":"        return own_shard_range"},{"line_number":1691,"context_line":""},{"line_number":1692,"context_line":"    # TODO: add unit test"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_57709f08","line":1689,"in_reply_to":"df7087c5_17d8e778","updated":"2018-03-22 21:25:41.000000000","message":"yes, unavoidable unless we pass some flag back from _own_shard_range","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b54e913fd4c57935314ff333c971517231485593","unresolved":false,"context_lines":[{"line_number":1720,"context_line":"        return os.path.exists(lockpath)"},{"line_number":1721,"context_line":""},{"line_number":1722,"context_line":"    def set_sharding_state(self, epoch\u003dNone):"},{"line_number":1723,"context_line":"        epoch \u003d epoch or self.get_own_shard_range().epoch"},{"line_number":1724,"context_line":"        if not epoch:"},{"line_number":1725,"context_line":"            self.logger.warning(\"Container \u0027%s\u0027 cannot be set to sharding \""},{"line_number":1726,"context_line":"                                \"state: missing epoch\", self.path)"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_ba86bfb8","line":1723,"updated":"2018-03-23 00:55:49.000000000","message":"this is good","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"}],"swift/container/sharder.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8d3c61f09498a0e54313bb1ef7a8225316b703c3","unresolved":false,"context_lines":[{"line_number":659,"context_line":"                            broker, shard_ranges\u003d[own_shard_range]):"},{"line_number":660,"context_line":"                        own_shard_range \u003d broker.get_own_shard_range()"},{"line_number":661,"context_line":""},{"line_number":662,"context_line":"                if broker.get_shard_ranges():"},{"line_number":663,"context_line":"                    # container may have been given shard ranges rather than"},{"line_number":664,"context_line":"                    # found them e.g. via replication or a shrink event"},{"line_number":665,"context_line":"                    if own_shard_range.state in (ShardRange.SHARDING,"},{"line_number":666,"context_line":"                                                 ShardRange.SHRINKING,"},{"line_number":667,"context_line":"                                                 ShardRange.SHARDED):"},{"line_number":668,"context_line":"                        if broker.set_sharding_state():"},{"line_number":669,"context_line":"                            state \u003d SHARDING"},{"line_number":670,"context_line":"                    else:"},{"line_number":671,"context_line":"                        self.logger.debug("},{"line_number":672,"context_line":"                            \u0027Shard ranges found but own shard range is %r: %s\u0027"},{"line_number":673,"context_line":"                            % (own_shard_range.state_text, broker.path))"},{"line_number":674,"context_line":"                elif own_shard_range.state in (ShardRange.SHARDING,"},{"line_number":675,"context_line":"                                               ShardRange.SHRINKING):"},{"line_number":676,"context_line":"                    broker.update_sharding_info({\u0027Scan-Done\u0027: \u0027False\u0027})"},{"line_number":677,"context_line":"                    if broker.set_sharding_state():"},{"line_number":678,"context_line":"                        state \u003d SHARDING"},{"line_number":679,"context_line":""},{"line_number":680,"context_line":"            if state \u003d\u003d SHARDING:"},{"line_number":681,"context_line":"                num_found \u003d num_created \u003d 0"}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_4bbb38c3","line":678,"range":{"start_line":662,"start_character":16,"end_line":678,"end_character":40},"updated":"2018-03-21 21:47:14.000000000","message":"there may be a more compact way to write this, but it\u0027s late, I\u0027m tired, and I want this off my laptop","commit_id":"850a53deca20c98d5317ae769f3dba252b21f3b2"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"13e3e454e973f2375572d0bfd8da780a088a3ab8","unresolved":false,"context_lines":[{"line_number":659,"context_line":"                            broker, shard_ranges\u003d[own_shard_range]):"},{"line_number":660,"context_line":"                        own_shard_range \u003d broker.get_own_shard_range()"},{"line_number":661,"context_line":""},{"line_number":662,"context_line":"                if broker.get_shard_ranges():"},{"line_number":663,"context_line":"                    # container may have been given shard ranges rather than"},{"line_number":664,"context_line":"                    # found them e.g. via replication or a shrink event"},{"line_number":665,"context_line":"                    if own_shard_range.state in (ShardRange.SHARDING,"},{"line_number":666,"context_line":"                                                 ShardRange.SHRINKING,"},{"line_number":667,"context_line":"                                                 ShardRange.SHARDED):"},{"line_number":668,"context_line":"                        if broker.set_sharding_state():"},{"line_number":669,"context_line":"                            state \u003d SHARDING"},{"line_number":670,"context_line":"                    else:"},{"line_number":671,"context_line":"                        self.logger.debug("},{"line_number":672,"context_line":"                            \u0027Shard ranges found but own shard range is %r: %s\u0027"},{"line_number":673,"context_line":"                            % (own_shard_range.state_text, broker.path))"},{"line_number":674,"context_line":"                elif own_shard_range.state in (ShardRange.SHARDING,"},{"line_number":675,"context_line":"                                               ShardRange.SHRINKING):"},{"line_number":676,"context_line":"                    broker.update_sharding_info({\u0027Scan-Done\u0027: \u0027False\u0027})"},{"line_number":677,"context_line":"                    if broker.set_sharding_state():"},{"line_number":678,"context_line":"                        state \u003d SHARDING"},{"line_number":679,"context_line":""},{"line_number":680,"context_line":"            if state \u003d\u003d SHARDING:"},{"line_number":681,"context_line":"                num_found \u003d num_created \u003d 0"}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_3192f64c","line":678,"range":{"start_line":662,"start_character":16,"end_line":678,"end_character":40},"in_reply_to":"df7087c5_4bbb38c3","updated":"2018-03-22 00:28:51.000000000","message":"Maybe, I\u0027ve had a play, and in other ways I write it the no shard_ranges and SHARDED state makes things get a little messy with some extra conditionals anyway. And if you roll the SHARDING and SHRINKING together, you still need another \u0027set_sharding_state\u0027 for the no shard_ranges and SHARDED state. So not sure it\u0027s really that much cleaner. At least this is easier to read. So happy with this for the moment.","commit_id":"850a53deca20c98d5317ae769f3dba252b21f3b2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9bb5873211bf4c61a52109d75f907ba1f9abaae5","unresolved":false,"context_lines":[{"line_number":669,"context_line":"                    # found them e.g. via replication or a shrink event"},{"line_number":670,"context_line":"                    if own_shard_range.state in (ShardRange.SHARDING,"},{"line_number":671,"context_line":"                                                 ShardRange.SHRINKING,"},{"line_number":672,"context_line":"                                                 ShardRange.SHARDED):"},{"line_number":673,"context_line":"                        if broker.set_sharding_state():"},{"line_number":674,"context_line":"                            state \u003d SHARDING"},{"line_number":675,"context_line":"                    else:"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_f7d3f336","line":672,"range":{"start_line":672,"start_character":49,"end_line":672,"end_character":67},"updated":"2018-03-22 21:07:03.000000000","message":"Off-topic: do we really expect that a db with db state UNSHARDED or COLLAPSED could have an own_shard_range state of SHARDED? That seems weird to me...","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"04b2261c376f23bebf65644578fddf9b43639e89","unresolved":false,"context_lines":[{"line_number":669,"context_line":"                    # found them e.g. via replication or a shrink event"},{"line_number":670,"context_line":"                    if own_shard_range.state in (ShardRange.SHARDING,"},{"line_number":671,"context_line":"                                                 ShardRange.SHRINKING,"},{"line_number":672,"context_line":"                                                 ShardRange.SHARDED):"},{"line_number":673,"context_line":"                        if broker.set_sharding_state():"},{"line_number":674,"context_line":"                            state \u003d SHARDING"},{"line_number":675,"context_line":"                    else:"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_17d30662","line":672,"range":{"start_line":672,"start_character":49,"end_line":672,"end_character":67},"in_reply_to":"df7087c5_57497fb4","updated":"2018-03-22 21:46:36.000000000","message":"No no -- the more I thought about it, the more it made sense.","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8251d653fb291f00e6baf03a81357d0fc8816ad4","unresolved":false,"context_lines":[{"line_number":669,"context_line":"                    # found them e.g. via replication or a shrink event"},{"line_number":670,"context_line":"                    if own_shard_range.state in (ShardRange.SHARDING,"},{"line_number":671,"context_line":"                                                 ShardRange.SHRINKING,"},{"line_number":672,"context_line":"                                                 ShardRange.SHARDED):"},{"line_number":673,"context_line":"                        if broker.set_sharding_state():"},{"line_number":674,"context_line":"                            state \u003d SHARDING"},{"line_number":675,"context_line":"                    else:"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_57497fb4","line":672,"range":{"start_line":672,"start_character":49,"end_line":672,"end_character":67},"in_reply_to":"df7087c5_f7d3f336","updated":"2018-03-22 21:25:41.000000000","message":"Absolutely. Shard range state is replicated from other replicas that may have sharded. Remove SHARDED and you\u0027ll probably see probe tests fail.\n\nMaybe once we have per db shard range records this will change but I\u0027m not sure yet how that will work out.\n\nMaybe I should add a comment?","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9bb5873211bf4c61a52109d75f907ba1f9abaae5","unresolved":false,"context_lines":[{"line_number":670,"context_line":"                    if own_shard_range.state in (ShardRange.SHARDING,"},{"line_number":671,"context_line":"                                                 ShardRange.SHRINKING,"},{"line_number":672,"context_line":"                                                 ShardRange.SHARDED):"},{"line_number":673,"context_line":"                        if broker.set_sharding_state():"},{"line_number":674,"context_line":"                            state \u003d SHARDING"},{"line_number":675,"context_line":"                    else:"},{"line_number":676,"context_line":"                        self.logger.debug("}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_b7249b61","line":673,"updated":"2018-03-22 21:07:03.000000000","message":"This can fail (and thus we won\u0027t update state) when\n\n- we don\u0027t have an epoch or\n- db state is not UNSHARDED.\n\nSeems more or less fair... but what about COLLAPSED dbs?","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8251d653fb291f00e6baf03a81357d0fc8816ad4","unresolved":false,"context_lines":[{"line_number":670,"context_line":"                    if own_shard_range.state in (ShardRange.SHARDING,"},{"line_number":671,"context_line":"                                                 ShardRange.SHRINKING,"},{"line_number":672,"context_line":"                                                 ShardRange.SHARDED):"},{"line_number":673,"context_line":"                        if broker.set_sharding_state():"},{"line_number":674,"context_line":"                            state \u003d SHARDING"},{"line_number":675,"context_line":"                    else:"},{"line_number":676,"context_line":"                        self.logger.debug("}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_97d877ef","line":673,"in_reply_to":"df7087c5_b7249b61","updated":"2018-03-22 21:25:41.000000000","message":"Hmmm, need to check.","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b54e913fd4c57935314ff333c971517231485593","unresolved":false,"context_lines":[{"line_number":1028,"context_line":"            if shard_range.object_count \u003c self.shard_container_size:"},{"line_number":1029,"context_line":"                continue"},{"line_number":1030,"context_line":"            if shard_range.update_state(ShardRange.SHARDING):"},{"line_number":1031,"context_line":"                shard_range.epoch \u003d shard_range.state_timestamp"},{"line_number":1032,"context_line":"            candidates.append(shard_range)"},{"line_number":1033,"context_line":"        broker.merge_shard_ranges(candidates)"},{"line_number":1034,"context_line":"        return len(candidates)"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_bd5d5948","line":1031,"updated":"2018-03-23 00:55:49.000000000","message":"grrr, no tests fail if I revert this :\u0027(","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b54e913fd4c57935314ff333c971517231485593","unresolved":false,"context_lines":[{"line_number":1096,"context_line":"                # Set donor state to shrinking so that next cycle won\u0027t use it"},{"line_number":1097,"context_line":"                # as an acceptor; state_timestamp defines new epoch for donor"},{"line_number":1098,"context_line":"                # and new timestamp for the expanded acceptor below."},{"line_number":1099,"context_line":"                donor.epoch \u003d donor.state_timestamp"},{"line_number":1100,"context_line":"                modified_shard_ranges.append(donor)"},{"line_number":1101,"context_line":"            broker.merge_shard_ranges(modified_shard_ranges)"},{"line_number":1102,"context_line":"            if acceptor is not own_shard_range:"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_3d7ce981","line":1099,"updated":"2018-03-23 00:55:49.000000000","message":"why can\u0027t we do this in update_state? assuming we can enumerate the states when epoch \u003d\u003d state_timestamp should be an invariant...","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"}],"test/unit/container/test_backend.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b54e913fd4c57935314ff333c971517231485593","unresolved":false,"context_lines":[{"line_number":953,"context_line":"        own_shard_range.epoch \u003d Timestamp.now()"},{"line_number":954,"context_line":"        fresh_broker.merge_shard_ranges([own_shard_range])"},{"line_number":955,"context_line":"        self.assertEqual(fresh_broker.get_db_state(), UNSHARDED)"},{"line_number":956,"context_line":"        self.assertEqual(fresh_broker.get_db_state_text(), \u0027unsharded\u0027)"},{"line_number":957,"context_line":""},{"line_number":958,"context_line":"    @with_tempdir"},{"line_number":959,"context_line":"    def test_db_file(self, tempdir):"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_e06c86d1","line":956,"updated":"2018-03-23 00:55:49.000000000","message":"ok, this is the self.db_epoch !\u003d self._own_shard_range().epoch block","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b54e913fd4c57935314ff333c971517231485593","unresolved":false,"context_lines":[{"line_number":2678,"context_line":"        # only container_shard.db exists - sharded"},{"line_number":2679,"context_line":"        os.unlink(db_path)"},{"line_number":2680,"context_line":"        do_test(db_path, fresh_db_path)"},{"line_number":2681,"context_line":"        do_test(fresh_db_path, fresh_db_path)"},{"line_number":2682,"context_line":""},{"line_number":2683,"context_line":"    @with_tempdir"},{"line_number":2684,"context_line":"    def test_get_shard_root_account_container(self, tempdir):"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_a0af6ee1","line":2681,"updated":"2018-03-23 00:55:49.000000000","message":"thanks for renaming all these!","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b54e913fd4c57935314ff333c971517231485593","unresolved":false,"context_lines":[{"line_number":3150,"context_line":"        own_shard_range.update_state(ShardRange.SHARDING)"},{"line_number":3151,"context_line":"        own_shard_range.epoch \u003d ts_epoch"},{"line_number":3152,"context_line":"        broker.merge_shard_ranges([own_shard_range])"},{"line_number":3153,"context_line":"        self.assertTrue(broker.set_sharding_state())"},{"line_number":3154,"context_line":"        check_broker_properties(broker)"},{"line_number":3155,"context_line":"        check_broker_info(broker.get_info())"},{"line_number":3156,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_e0efa61a","line":3153,"updated":"2018-03-23 00:55:49.000000000","message":"noice!\n\n    epoch \u003d epoch or self.get_own_shard_range().epoch\n\n!!!","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b54e913fd4c57935314ff333c971517231485593","unresolved":false,"context_lines":[{"line_number":3433,"context_line":"                                     state\u003dShardRange.SHARDING,"},{"line_number":3434,"context_line":"                                     epoch\u003dnext(ts_iter))"},{"line_number":3435,"context_line":"        broker.merge_shard_ranges([own_shard_range])"},{"line_number":3436,"context_line":"        broker.set_sharding_state()"},{"line_number":3437,"context_line":"        sr_1 \u003d ShardRange("},{"line_number":3438,"context_line":"            \u0027%s/%s1\u0027 % (root_a, root_c), Timestamp.now(), lower\u003d\u0027\u0027, upper\u003d\u0027m\u0027,"},{"line_number":3439,"context_line":"            object_count\u003d99, bytes_used\u003d999, state\u003dShardRange.ACTIVE)"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_2006fecf","line":3436,"updated":"2018-03-23 00:55:49.000000000","message":"just curious if set_sharding_state... when given an epoch... has enough context to just create the own_shard_range if it doesn\u0027t already exist?\n\n    diff --git a/swift/container/backend.py b/swift/container/backend.py\n    index bc5e987..349da94 100644\n    --- a/swift/container/backend.py\n    +++ b/swift/container/backend.py\n    @@ -1763,7 +1763,15 @@ class ContainerBroker(DatabaseBroker):\n             # who are still in the UNSHARDED state.\n             # TODO: should we include deleted shard ranges here...just in case it\n             # ever happened and mattered?\n    -        sub_broker.merge_shard_ranges(self.get_shard_ranges(include_own\u003dTrue))\n    +        shard_ranges \u003d self.get_shard_ranges(include_own\u003dTrue)\n    +        if shard_ranges:\n    +            own_shard_range \u003d shard_ranges[0]\n    +        else:\n    +            own_shard_range \u003d ShardRange(\n    +                self.path, epoch, ShardRange.MIN, ShardRange.MAX,\n    +                state\u003dShardRange.ACTIVE, epoch\u003depoch)\n    +            shard_ranges.insert(0, own_shard_range)\n    +        sub_broker.merge_shard_ranges(shard_ranges)\n\n???","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"}],"test/unit/container/test_replicator.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b54e913fd4c57935314ff333c971517231485593","unresolved":false,"context_lines":[{"line_number":1422,"context_line":"        own_sr \u003d broker.get_own_shard_range()"},{"line_number":1423,"context_line":"        own_sr.update_state(ShardRange.SHARDING)"},{"line_number":1424,"context_line":"        own_sr.epoch \u003d epoch"},{"line_number":1425,"context_line":"        broker.merge_shard_ranges([own_sr])"},{"line_number":1426,"context_line":""},{"line_number":1427,"context_line":"    def _goto_sharded_state(self, broker):"},{"line_number":1428,"context_line":"        broker.dump_cleave_context("}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_40c2125b","line":1425,"updated":"2018-03-23 00:55:49.000000000","message":"yeah, I think this should roughly be what happens in set_sharding_state if there isn\u0027t already an own_shard_range?","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b54e913fd4c57935314ff333c971517231485593","unresolved":false,"context_lines":[{"line_number":2219,"context_line":"        self.assertEqual(local_id, repl_calls[1][1][1])"},{"line_number":2220,"context_line":"        # merge_items for shard ranges"},{"line_number":2221,"context_line":"        self.assert_synced_shard_ranges("},{"line_number":2222,"context_line":"            [local_broker._own_shard_range()] +"},{"line_number":2223,"context_line":"            local_context[\u0027shard_ranges\u0027][:1],"},{"line_number":2224,"context_line":"            repl_calls[2][1][0])"},{"line_number":2225,"context_line":"        self.assertEqual(local_id, repl_calls[2][1][1])"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_e0e326d7","line":2222,"updated":"2018-03-23 00:55:49.000000000","message":"This just because we have a shard range row to sync now in this test database where before the test setup did not?  I don\u0027t see an easier way to handle this in _setup_replication_test ...","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"}],"test/unit/container/test_sharder.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b54e913fd4c57935314ff333c971517231485593","unresolved":false,"context_lines":[{"line_number":639,"context_line":""},{"line_number":640,"context_line":"        # run cleave - all shard ranges in found state, nothing happens"},{"line_number":641,"context_line":"        broker.merge_shard_ranges(shard_ranges[:4])"},{"line_number":642,"context_line":"        broker.set_sharding_state(epoch\u003dTimestamp.now())"},{"line_number":643,"context_line":""},{"line_number":644,"context_line":"        with self._mock_sharder() as sharder:"},{"line_number":645,"context_line":"            self.assertTrue(sharder._cleave(broker))"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_60fab643","side":"PARENT","line":642,"updated":"2018-03-23 00:55:49.000000000","message":"meh?\n\n    diff --git a/test/unit/container/test_sharder.py b/test/unit/container/test_sharder.py\n    index c5800f2..a34b392 100644\n    --- a/test/unit/container/test_sharder.py\n    +++ b/test/unit/container/test_sharder.py\n    @@ -611,7 +611,7 @@ class TestSharder(unittest.TestCase):\n             own_shard_range \u003d broker.get_own_shard_range()\n             own_shard_range.update_state(ShardRange.SHARDING)\n             own_shard_range.epoch \u003d Timestamp.now()\n    -        broker.merge_shard_ranges([own_shard_range])\n    +        # broker.merge_shard_ranges([own_shard_range])\n             cleaving_ref \u003d \u0027None-\u0027 + initial_root_info[\u0027hash\u0027]\n     \n             shard_bounds \u003d ((\u0027\u0027, \u0027here\u0027), (\u0027here\u0027, \u0027there\u0027),\n    @@ -642,7 +642,7 @@ class TestSharder(unittest.TestCase):\n                     self.assertFalse(os.path.exists(db))\n     \n             # run cleave - all shard ranges in found state, nothing happens\n    -        broker.merge_shard_ranges(shard_ranges[:4])\n    +        broker.merge_shard_ranges([own_shard_range] + shard_ranges[:4])\n             self.assertTrue(broker.set_sharding_state())\n     \n             with self._mock_sharder() as sharder:","commit_id":"54de111296e8b80f4e3ed54dde88fdc31621dd67"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b54e913fd4c57935314ff333c971517231485593","unresolved":false,"context_lines":[{"line_number":608,"context_line":"        for obj in objects:"},{"line_number":609,"context_line":"            broker.put_object(*obj)"},{"line_number":610,"context_line":"        initial_root_info \u003d broker.get_info()"},{"line_number":611,"context_line":"        own_shard_range \u003d broker.get_own_shard_range()"},{"line_number":612,"context_line":"        own_shard_range.update_state(ShardRange.SHARDING)"},{"line_number":613,"context_line":"        own_shard_range.epoch \u003d Timestamp.now()"},{"line_number":614,"context_line":"        broker.merge_shard_ranges([own_shard_range])"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_00d3bad6","line":611,"updated":"2018-03-23 00:55:49.000000000","message":"I think it it would be more readable in tests if there was better named \"_create_default_shard_range(epoch)\" method on a broker or something?","commit_id":"a347c090c64cf2c366cebc828fb55c5dd03f61ca"}]}
