)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b09a7998c38167c29e6e39ad331828239b56a887","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"9d196458_daeb1a79","updated":"2025-11-25 14:19:48.000000000","message":"Thanks @Matt - took me a while to understand some of the changes, and I still think a few aren\u0027t needed (see 968322: sq: fixups for test_sharder.py | https://review.opendev.org/c/openstack/swift/+/968322)\n\nI made a change in the parent patch to hopefully eliminate the intermittent failures due to decode_timestamps - let\u0027s see what zuul thinks","commit_id":"24ee8994f5b769a1603ca86b776de926e2cc1a81"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b3748a08b82fabd4787be58ec0e2678c5e90064b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"5c83157d_dd681b58","updated":"2025-11-27 14:50:00.000000000","message":"@Matt could you break this into two:\n1. the sharder.py and test_sharder.py pieces could merge sooner\n2. the backend.py pieces I\u0027m not sure about","commit_id":"4864a09140b2f93cf67d7b32afec9829f9cf8656"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f1f784cb24c71b872180b89e8e8f8fc67e17bc70","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"38880663_c64e2e8c","updated":"2025-12-24 16:38:33.000000000","message":"I don\u0027t think this is needed given 968740: timestamps: add SimpleTimestamp for ShardRanges | https://review.opendev.org/c/openstack/swift/+/968740","commit_id":"c28fa5a19399f5414509adde008e67066e0b3754"}],"swift/common/db.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b09a7998c38167c29e6e39ad331828239b56a887","unresolved":true,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"class TombstoneReclaimer(object):"},{"line_number":232,"context_line":"    \"\"\"Encapsulates reclamation of deleted rows in a database.\"\"\""},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def __init__(self, broker, age_timestamp):"},{"line_number":235,"context_line":"        \"\"\""},{"line_number":236,"context_line":"        Encapsulates reclamation of deleted rows in a database."}],"source_content_type":"text/x-python","patch_set":3,"id":"850e82c0_d8780181","line":233,"updated":"2025-11-25 14:19:48.000000000","message":"unnecessary change","commit_id":"cd2cc13ae34d8670f230864747ec81050bd7fd99"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b09a7998c38167c29e6e39ad331828239b56a887","unresolved":true,"context_lines":[{"line_number":254,"context_line":"        \u0027\u0027\u0027 % self.broker.db_contains_type"},{"line_number":255,"context_line":"        self.clean_batch_query \u003d \u0027\u0027\u0027"},{"line_number":256,"context_line":"            DELETE FROM %s WHERE deleted \u003d 1"},{"line_number":257,"context_line":"            AND name \u003e\u003d ? AND %s \u003c \u0027%s\u0027"},{"line_number":258,"context_line":"        \u0027\u0027\u0027 % (self.broker.db_contains_type, self.broker.db_reclaim_timestamp,"},{"line_number":259,"context_line":"               self.age_timestamp)"},{"line_number":260,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"c3177101_2c2c2795","line":257,"updated":"2025-11-25 14:19:48.000000000","message":"I can see how this might be correct but I\u0027m not sure how it relates to the timestamp issue: test_db.py seems happy with or without this change.\n\nupdate: OIC, sharder blows up without this - can we get some coverage in test_db?","commit_id":"cd2cc13ae34d8670f230864747ec81050bd7fd99"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3f9c342f9118ca700821198164c6ee301ffb74d9","unresolved":true,"context_lines":[{"line_number":254,"context_line":"        \u0027\u0027\u0027 % self.broker.db_contains_type"},{"line_number":255,"context_line":"        self.clean_batch_query \u003d \u0027\u0027\u0027"},{"line_number":256,"context_line":"            DELETE FROM %s WHERE deleted \u003d 1"},{"line_number":257,"context_line":"            AND name \u003e\u003d ? AND %s \u003c \u0027%s\u0027"},{"line_number":258,"context_line":"        \u0027\u0027\u0027 % (self.broker.db_contains_type, self.broker.db_reclaim_timestamp,"},{"line_number":259,"context_line":"               self.age_timestamp)"},{"line_number":260,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"e631e39e_22176f6c","line":257,"in_reply_to":"c3177101_2c2c2795","updated":"2025-11-25 18:07:25.000000000","message":"I have separated this non-test change out to https://review.opendev.org/c/openstack/swift/+/968358","commit_id":"cd2cc13ae34d8670f230864747ec81050bd7fd99"}],"swift/common/utils/__init__.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b09a7998c38167c29e6e39ad331828239b56a887","unresolved":true,"context_lines":[{"line_number":5148,"context_line":"    if not filename:"},{"line_number":5149,"context_line":"        raise ValueError(\u0027Path to a file required.\u0027)"},{"line_number":5150,"context_line":"    name, ext \u003d os.path.splitext(filename)"},{"line_number":5151,"context_line":"    parts \u003d name.split(\u0027_\u0027, 1)"},{"line_number":5152,"context_line":"    hash_ \u003d parts.pop(0)"},{"line_number":5153,"context_line":"    epoch \u003d parts[0] if parts else None"},{"line_number":5154,"context_line":"    return hash_, epoch, ext"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba536416_9d1e8034","line":5151,"updated":"2025-11-25 14:19:48.000000000","message":"ok, this looks like a necessary change to deal with hash_float_hexpart.db file names? I don\u0027t see any corresponding test_utils change ;-)","commit_id":"cd2cc13ae34d8670f230864747ec81050bd7fd99"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3f9c342f9118ca700821198164c6ee301ffb74d9","unresolved":true,"context_lines":[{"line_number":5148,"context_line":"    if not filename:"},{"line_number":5149,"context_line":"        raise ValueError(\u0027Path to a file required.\u0027)"},{"line_number":5150,"context_line":"    name, ext \u003d os.path.splitext(filename)"},{"line_number":5151,"context_line":"    parts \u003d name.split(\u0027_\u0027, 1)"},{"line_number":5152,"context_line":"    hash_ \u003d parts.pop(0)"},{"line_number":5153,"context_line":"    epoch \u003d parts[0] if parts else None"},{"line_number":5154,"context_line":"    return hash_, epoch, ext"}],"source_content_type":"text/x-python","patch_set":3,"id":"8dd54e58_b48148ae","line":5151,"in_reply_to":"ba536416_9d1e8034","updated":"2025-11-25 18:07:25.000000000","message":"I have separated these non-test changes out to https://review.opendev.org/c/openstack/swift/+/968357","commit_id":"cd2cc13ae34d8670f230864747ec81050bd7fd99"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b09a7998c38167c29e6e39ad331828239b56a887","unresolved":true,"context_lines":[{"line_number":5166,"context_line":"    :param db_path: Path to a db file that does not necessarily exist."},{"line_number":5167,"context_line":"    :param epoch: A string (or ``None``) that will be used as the epoch"},{"line_number":5168,"context_line":"        in the new path\u0027s filename; non-``None`` values will be"},{"line_number":5169,"context_line":"        normalized to the normal string representation of a"},{"line_number":5170,"context_line":"        :class:`~swift.common.utils.Timestamp`."},{"line_number":5171,"context_line":"    :return: A modified path to a db file."},{"line_number":5172,"context_line":"    :raises ValueError: if the ``epoch`` is not valid for constructing a"}],"source_content_type":"text/x-python","patch_set":3,"id":"a27abce5_60cf3614","line":5169,"range":{"start_line":5169,"start_character":26,"end_line":5169,"end_character":39},"updated":"2025-11-25 14:19:48.000000000","message":"needs updating","commit_id":"cd2cc13ae34d8670f230864747ec81050bd7fd99"}],"swift/container/backend.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b3748a08b82fabd4787be58ec0e2678c5e90064b","unresolved":true,"context_lines":[{"line_number":444,"context_line":"            return UNSHARDED"},{"line_number":445,"context_line":"        # self.db_epoch grabs the epoch from the db_file path, which will"},{"line_number":446,"context_line":"        # never have an offset. So when we compare epoch\u0027s we need to compare"},{"line_number":447,"context_line":"        # one without an offset."},{"line_number":448,"context_line":"        osr \u003d self.get_own_shard_range()"},{"line_number":449,"context_line":"        osr_epoch \u003d osr.epoch.normal if osr.epoch else osr.epoch"},{"line_number":450,"context_line":"        if self.db_epoch !\u003d osr_epoch:"}],"source_content_type":"text/x-python","patch_set":11,"id":"22988408_733379e3","line":447,"updated":"2025-11-27 14:50:00.000000000","message":"this is only helpful on an upgraded node.\n\nWe need to prevent own_shard_range ever having an offset, so that a legacy node will not compare a v2 timestamp+offset epoch with a filename without offset. I think we should explicitly prohibit offsets in ShardRange timestamps.\n\nI made an attempt at being very explicit about Timestamps without hex parts here https://review.opendev.org/c/openstack/swift/+/968709 but it got to be a pretty big change. I\u0027m going to look for something more tactical.","commit_id":"4864a09140b2f93cf67d7b32afec9829f9cf8656"}],"swift/container/sharder.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b09a7998c38167c29e6e39ad331828239b56a887","unresolved":true,"context_lines":[{"line_number":1015,"context_line":"            contexts \u003d CleavingContext.load_all(broker)"},{"line_number":1016,"context_line":"            if not contexts:"},{"line_number":1017,"context_line":"                return"},{"line_number":1018,"context_line":"            context_ts \u003d max(Timestamp(ts) for c, ts in contexts)"},{"line_number":1019,"context_line":"            if float(context_ts) + self.recon_sharded_timeout \\"},{"line_number":1020,"context_line":"                    \u003c float(Timestamp.now()):"},{"line_number":1021,"context_line":"                # last context timestamp too old for the"}],"source_content_type":"text/x-python","patch_set":3,"id":"fedc0859_02626b04","line":1018,"updated":"2025-11-25 14:19:48.000000000","message":"+1, ts won\u0027t necessarily cast to a float","commit_id":"cd2cc13ae34d8670f230864747ec81050bd7fd99"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b09a7998c38167c29e6e39ad331828239b56a887","unresolved":true,"context_lines":[{"line_number":1194,"context_line":"        headers.update({\u0027X-Backend-Record-Type\u0027: RECORD_TYPE_SHARD,"},{"line_number":1195,"context_line":"                        USE_REPLICATION_NETWORK_HEADER: \u0027True\u0027,"},{"line_number":1196,"context_line":"                        \u0027User-Agent\u0027: \u0027container-sharder %s\u0027 % os.getpid(),"},{"line_number":1197,"context_line":"                        \u0027X-Timestamp\u0027: Timestamp.now().internal,"},{"line_number":1198,"context_line":"                        \u0027Content-Length\u0027: len(body),"},{"line_number":1199,"context_line":"                        \u0027Content-Type\u0027: \u0027application/json\u0027})"},{"line_number":1200,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"eea38366_6b85b2dd","line":1197,"updated":"2025-11-25 14:19:48.000000000","message":"+1","commit_id":"cd2cc13ae34d8670f230864747ec81050bd7fd99"}],"test/unit/container/test_sharder.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b09a7998c38167c29e6e39ad331828239b56a887","unresolved":true,"context_lines":[{"line_number":764,"context_line":"            self._assert_recon_stats(None, sharder, \u0027sharding_progress\u0027)"},{"line_number":765,"context_line":""},{"line_number":766,"context_line":"            # enable and progress container a/c1 by giving it shard ranges"},{"line_number":767,"context_line":"            now \u003d next(self.ts_iter).internal"},{"line_number":768,"context_line":"            brokers[0].merge_shard_ranges("},{"line_number":769,"context_line":"                [ShardRange(\u0027a/c0\u0027, now, \u0027\u0027, \u0027\u0027, state\u003dShardRange.SHARDING),"},{"line_number":770,"context_line":"                 ShardRange(\u0027.s_a/1\u0027, now, \u0027\u0027, \u0027b\u0027, state\u003dShardRange.ACTIVE),"}],"source_content_type":"text/x-python","patch_set":3,"id":"bfc33281_fe1cbdeb","line":767,"updated":"2025-11-25 14:19:48.000000000","message":"this change shouldn\u0027t be necessary: ShardRange constructors accept Timestamp instances","commit_id":"cd2cc13ae34d8670f230864747ec81050bd7fd99"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b3748a08b82fabd4787be58ec0e2678c5e90064b","unresolved":true,"context_lines":[{"line_number":764,"context_line":"            self._assert_recon_stats(None, sharder, \u0027sharding_progress\u0027)"},{"line_number":765,"context_line":""},{"line_number":766,"context_line":"            # enable and progress container a/c1 by giving it shard ranges"},{"line_number":767,"context_line":"            now \u003d next(self.ts_iter).internal"},{"line_number":768,"context_line":"            brokers[0].merge_shard_ranges("},{"line_number":769,"context_line":"                [ShardRange(\u0027a/c0\u0027, now, \u0027\u0027, \u0027\u0027, state\u003dShardRange.SHARDING),"},{"line_number":770,"context_line":"                 ShardRange(\u0027.s_a/1\u0027, now, \u0027\u0027, \u0027b\u0027, state\u003dShardRange.ACTIVE),"}],"source_content_type":"text/x-python","patch_set":3,"id":"68d92b0f_d923b778","line":767,"in_reply_to":"bfc33281_fe1cbdeb","updated":"2025-11-27 14:50:00.000000000","message":"bump","commit_id":"cd2cc13ae34d8670f230864747ec81050bd7fd99"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b09a7998c38167c29e6e39ad331828239b56a887","unresolved":true,"context_lines":[{"line_number":871,"context_line":"            self._assert_recon_stats(None, sharder, \u0027sharding_progress\u0027)"},{"line_number":872,"context_line":""},{"line_number":873,"context_line":"            # let\u0027s progress broker 1 (broker[0])"},{"line_number":874,"context_line":"            brokers[0].enable_sharding(next(self.ts_iter).internal)"},{"line_number":875,"context_line":"            brokers[0].set_sharding_state()"},{"line_number":876,"context_line":"            shard_ranges \u003d brokers[0].get_shard_ranges()"},{"line_number":877,"context_line":"            for sr in shard_ranges[:-1]:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ae9865c4_2efd6fbf","line":874,"updated":"2025-11-25 14:19:48.000000000","message":"this seems wrong/unnecessary - enable_sharding docstring says it expects a Timestamp, not a string (although it will tolerate a string)","commit_id":"cd2cc13ae34d8670f230864747ec81050bd7fd99"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b3748a08b82fabd4787be58ec0e2678c5e90064b","unresolved":true,"context_lines":[{"line_number":871,"context_line":"            self._assert_recon_stats(None, sharder, \u0027sharding_progress\u0027)"},{"line_number":872,"context_line":""},{"line_number":873,"context_line":"            # let\u0027s progress broker 1 (broker[0])"},{"line_number":874,"context_line":"            brokers[0].enable_sharding(next(self.ts_iter).internal)"},{"line_number":875,"context_line":"            brokers[0].set_sharding_state()"},{"line_number":876,"context_line":"            shard_ranges \u003d brokers[0].get_shard_ranges()"},{"line_number":877,"context_line":"            for sr in shard_ranges[:-1]:"}],"source_content_type":"text/x-python","patch_set":3,"id":"cc6c6e18_c656ec11","line":874,"in_reply_to":"ae9865c4_2efd6fbf","updated":"2025-11-27 14:50:00.000000000","message":"bump","commit_id":"cd2cc13ae34d8670f230864747ec81050bd7fd99"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b09a7998c38167c29e6e39ad331828239b56a887","unresolved":true,"context_lines":[{"line_number":73,"context_line":"        datadir \u003d os.path.join("},{"line_number":74,"context_line":"            self.tempdir, device, \u0027containers\u0027, str(part), hash_[-3:], hash_)"},{"line_number":75,"context_line":"        if epoch:"},{"line_number":76,"context_line":"            filename \u003d \u0027%s_%s.db\u0027 % (hash_, epoch.internal)"},{"line_number":77,"context_line":"        else:"},{"line_number":78,"context_line":"            filename \u003d hash_ + \u0027.db\u0027"},{"line_number":79,"context_line":"        db_file \u003d os.path.join(datadir, filename)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9089b82a_7f0b43da","line":76,"updated":"2025-11-25 14:19:48.000000000","message":"the one place that passes in an epoch is passing a string\n\nlet\u0027s make this method expect Timestamps for epoch and put_timestamp, for consistency, and then pass the right format string to initialize etc.","commit_id":"24ee8994f5b769a1603ca86b776de926e2cc1a81"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b3748a08b82fabd4787be58ec0e2678c5e90064b","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        datadir \u003d os.path.join("},{"line_number":74,"context_line":"            self.tempdir, device, \u0027containers\u0027, str(part), hash_[-3:], hash_)"},{"line_number":75,"context_line":"        if epoch:"},{"line_number":76,"context_line":"            filename \u003d \u0027%s_%s.db\u0027 % (hash_, epoch.internal)"},{"line_number":77,"context_line":"        else:"},{"line_number":78,"context_line":"            filename \u003d hash_ + \u0027.db\u0027"},{"line_number":79,"context_line":"        db_file \u003d os.path.join(datadir, filename)"}],"source_content_type":"text/x-python","patch_set":4,"id":"aa733b59_5b008adf","line":76,"in_reply_to":"9089b82a_7f0b43da","updated":"2025-11-27 14:50:00.000000000","message":"Done","commit_id":"24ee8994f5b769a1603ca86b776de926e2cc1a81"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b09a7998c38167c29e6e39ad331828239b56a887","unresolved":true,"context_lines":[{"line_number":4962,"context_line":"            timestamps[1], timestamps[3], timestamps[5])"},{"line_number":4963,"context_line":"        newer_object \u003d (\u0027b\u0027, ts_newer, 10, \u0027text/plain\u0027, \u0027etag_b\u0027, 0, 0)"},{"line_number":4964,"context_line":"        shard_broker.put_object(*newer_object)"},{"line_number":4965,"context_line":"        shard_broker.get_info()"},{"line_number":4966,"context_line":""},{"line_number":4967,"context_line":"        with self._mock_sharder() as sharder:"},{"line_number":4968,"context_line":"            sharder._move_misplaced_objects(broker)"}],"source_content_type":"text/x-python","patch_set":4,"id":"f8b8c679_b69cc237","line":4965,"updated":"2025-11-25 14:19:48.000000000","message":"I removed all these broker.get_info() and the test still passed? what caused you to add them?","commit_id":"24ee8994f5b769a1603ca86b776de926e2cc1a81"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b3748a08b82fabd4787be58ec0e2678c5e90064b","unresolved":false,"context_lines":[{"line_number":4962,"context_line":"            timestamps[1], timestamps[3], timestamps[5])"},{"line_number":4963,"context_line":"        newer_object \u003d (\u0027b\u0027, ts_newer, 10, \u0027text/plain\u0027, \u0027etag_b\u0027, 0, 0)"},{"line_number":4964,"context_line":"        shard_broker.put_object(*newer_object)"},{"line_number":4965,"context_line":"        shard_broker.get_info()"},{"line_number":4966,"context_line":""},{"line_number":4967,"context_line":"        with self._mock_sharder() as sharder:"},{"line_number":4968,"context_line":"            sharder._move_misplaced_objects(broker)"}],"source_content_type":"text/x-python","patch_set":4,"id":"36b20f63_69cfd843","line":4965,"in_reply_to":"f8b8c679_b69cc237","updated":"2025-11-27 14:50:00.000000000","message":"Done","commit_id":"24ee8994f5b769a1603ca86b776de926e2cc1a81"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b09a7998c38167c29e6e39ad331828239b56a887","unresolved":true,"context_lines":[{"line_number":4986,"context_line":"        # update source with a version of \u0027b\u0027 that has newer data"},{"line_number":4987,"context_line":"        # but older content-type and metadata relative to shard object"},{"line_number":4988,"context_line":"        ts_update \u003d encode_timestamps("},{"line_number":4989,"context_line":"            timestamps[2], timestamps[2], timestamps[4])"},{"line_number":4990,"context_line":"        update_object \u003d (\u0027b\u0027, ts_update, 20, \u0027text/ignored\u0027, \u0027etag_newer\u0027, 0,"},{"line_number":4991,"context_line":"                         0)"},{"line_number":4992,"context_line":"        broker.put_object(*update_object)"}],"source_content_type":"text/x-python","patch_set":4,"id":"36b5be6c_41819490","line":4989,"updated":"2025-11-25 14:19:48.000000000","message":"this doesn\u0027t seem to be related to the timestamp format changing? but I can see that perhaps the timestamp don\u0027t agree with the comment?\n\ncan we move any changes that are *not related* to the timestamp format into a separate patch\n\nupdate: I guess you saw the test failing (intermittently?) because the merges didn\u0027t seem to be working as expected - I think that is down to decode_timestamps doing the wrong thing - I\u0027m going to fix that in the timestamp patch\n- which I think means these changes could be reverted","commit_id":"24ee8994f5b769a1603ca86b776de926e2cc1a81"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b3748a08b82fabd4787be58ec0e2678c5e90064b","unresolved":false,"context_lines":[{"line_number":4986,"context_line":"        # update source with a version of \u0027b\u0027 that has newer data"},{"line_number":4987,"context_line":"        # but older content-type and metadata relative to shard object"},{"line_number":4988,"context_line":"        ts_update \u003d encode_timestamps("},{"line_number":4989,"context_line":"            timestamps[2], timestamps[2], timestamps[4])"},{"line_number":4990,"context_line":"        update_object \u003d (\u0027b\u0027, ts_update, 20, \u0027text/ignored\u0027, \u0027etag_newer\u0027, 0,"},{"line_number":4991,"context_line":"                         0)"},{"line_number":4992,"context_line":"        broker.put_object(*update_object)"}],"source_content_type":"text/x-python","patch_set":4,"id":"2c8f82b9_e9d57d03","line":4989,"in_reply_to":"36b5be6c_41819490","updated":"2025-11-27 14:50:00.000000000","message":"Done","commit_id":"24ee8994f5b769a1603ca86b776de926e2cc1a81"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b09a7998c38167c29e6e39ad331828239b56a887","unresolved":true,"context_lines":[{"line_number":5665,"context_line":""},{"line_number":5666,"context_line":"        final_own_sr \u003d broker.get_own_shard_range(no_default\u003dTrue)"},{"line_number":5667,"context_line":"        self.assertEqual(SHARDED, broker.get_db_state())"},{"line_number":5668,"context_line":"        self.assertEqual(epoch.internal, parse_db_filename(broker.db_file)[1])"},{"line_number":5669,"context_line":"        lines \u003d broker.logger.get_lines_for_level(\u0027info\u0027)"},{"line_number":5670,"context_line":"        self.assertIn(\u0027Completed creating 2 shard range containers, \u0027"},{"line_number":5671,"context_line":"                      \u0027path: a/c, db: %s\u0027 % broker.db_file, lines)"}],"source_content_type":"text/x-python","patch_set":4,"id":"18944648_dee97a73","line":5668,"updated":"2025-11-25 14:19:48.000000000","message":"ok, so this covers the change to parse_db_filename but it\u0027d be nice to have the function tested directly in its own unit test","commit_id":"24ee8994f5b769a1603ca86b776de926e2cc1a81"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b3748a08b82fabd4787be58ec0e2678c5e90064b","unresolved":false,"context_lines":[{"line_number":5665,"context_line":""},{"line_number":5666,"context_line":"        final_own_sr \u003d broker.get_own_shard_range(no_default\u003dTrue)"},{"line_number":5667,"context_line":"        self.assertEqual(SHARDED, broker.get_db_state())"},{"line_number":5668,"context_line":"        self.assertEqual(epoch.internal, parse_db_filename(broker.db_file)[1])"},{"line_number":5669,"context_line":"        lines \u003d broker.logger.get_lines_for_level(\u0027info\u0027)"},{"line_number":5670,"context_line":"        self.assertIn(\u0027Completed creating 2 shard range containers, \u0027"},{"line_number":5671,"context_line":"                      \u0027path: a/c, db: %s\u0027 % broker.db_file, lines)"}],"source_content_type":"text/x-python","patch_set":4,"id":"50146a9d_13bb8b74","line":5668,"in_reply_to":"18944648_dee97a73","updated":"2025-11-27 14:50:00.000000000","message":"Acknowledged","commit_id":"24ee8994f5b769a1603ca86b776de926e2cc1a81"}]}
