)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"081f34469f176b1ff344895d3fac10e027e735d5","unresolved":true,"context_lines":[{"line_number":11,"context_line":"taking too long to coalesce and users are unhappy right now."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Related: rhbz#1838242, rhbz#1965348"},{"line_number":14,"context_line":"Change-Id: I3f7bfc2877355b7cb433af77c4e2dfdfa94ff14d"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"bb3dabed_8aec11d3","line":14,"updated":"2021-08-13 17:04:14.000000000","message":"Now that we\u0027ve got the quarantining, I think we can claim to close https://bugs.launchpad.net/swift/+bug/1300850 and https://bugs.launchpad.net/swift/+bug/1514528 -- WDYT?","commit_id":"bcff1282b579f48efdc9bfcdde5b666b9ab23d3a"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"0a749c1cfaf71e3bdb4f2d06ed7a269ac7f8308f","unresolved":true,"context_lines":[{"line_number":11,"context_line":"taking too long to coalesce and users are unhappy right now."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Related: rhbz#1838242, rhbz#1965348"},{"line_number":14,"context_line":"Change-Id: I3f7bfc2877355b7cb433af77c4e2dfdfa94ff14d"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"5ab2d5ff_1185ab38","line":14,"in_reply_to":"bb3dabed_8aec11d3","updated":"2021-08-23 18:15:41.000000000","message":"This patch will quarantine containers that are unable to update because their accounts are gone (and only for that reason!), so miraclously the symptom gets canceled, but I don\u0027t know if I should claim that the problem is resolved. We still have the original issue. It\u0027s probably better to update the bugs, to let operators know (in case they care 5 years later).","commit_id":"bcff1282b579f48efdc9bfcdde5b666b9ab23d3a"}],"swift/account/server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"58c9aabe8faf6b9b883cf8652210411278aac69c","unresolved":true,"context_lines":[{"line_number":185,"context_line":"                    broker.initialize(timestamp.internal)"},{"line_number":186,"context_line":"                except DatabaseAlreadyExists:"},{"line_number":187,"context_line":"                    pass"},{"line_number":188,"context_line":"            if (req.headers.get(\u0027x-account-override-deleted\u0027, \u0027no\u0027).lower() !\u003d"},{"line_number":189,"context_line":"                    \u0027yes\u0027 and broker.is_deleted()) \\"},{"line_number":190,"context_line":"                    or not os.path.exists(broker.db_file):"},{"line_number":191,"context_line":"                return HTTPNotFound(request\u003dreq)"}],"source_content_type":"text/x-python","patch_set":7,"id":"4e7076b0_5e28bee6","line":188,"updated":"2021-07-12 18:53:32.000000000","message":"OK, the container-updater sets this, so we never check broker.is_deleted() (which would return True).","commit_id":"57ecab98ac7d27053e5679e5e2ad413bb0686c37"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"f551cdc8dbced5fe63dfcffa6a23a48460b5b77a","unresolved":false,"context_lines":[{"line_number":185,"context_line":"                    broker.initialize(timestamp.internal)"},{"line_number":186,"context_line":"                except DatabaseAlreadyExists:"},{"line_number":187,"context_line":"                    pass"},{"line_number":188,"context_line":"            if (req.headers.get(\u0027x-account-override-deleted\u0027, \u0027no\u0027).lower() !\u003d"},{"line_number":189,"context_line":"                    \u0027yes\u0027 and broker.is_deleted()) \\"},{"line_number":190,"context_line":"                    or not os.path.exists(broker.db_file):"},{"line_number":191,"context_line":"                return HTTPNotFound(request\u003dreq)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3dcf7621_d29023a7","line":188,"in_reply_to":"4e7076b0_5e28bee6","updated":"2021-07-15 03:21:11.000000000","message":"Ack","commit_id":"57ecab98ac7d27053e5679e5e2ad413bb0686c37"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"58c9aabe8faf6b9b883cf8652210411278aac69c","unresolved":true,"context_lines":[{"line_number":187,"context_line":"                    pass"},{"line_number":188,"context_line":"            if (req.headers.get(\u0027x-account-override-deleted\u0027, \u0027no\u0027).lower() !\u003d"},{"line_number":189,"context_line":"                    \u0027yes\u0027 and broker.is_deleted()) \\"},{"line_number":190,"context_line":"                    or not os.path.exists(broker.db_file):"},{"line_number":191,"context_line":"                return HTTPNotFound(request\u003dreq)"},{"line_number":192,"context_line":"            broker.put_container(container, req.headers[\u0027x-put-timestamp\u0027],"},{"line_number":193,"context_line":"                                 req.headers[\u0027x-delete-timestamp\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"e6796121_dd988f92","line":190,"updated":"2021-07-12 18:53:32.000000000","message":"Right -- if the thing doesn\u0027t exist, it\u0027s *gotta* be a 404.","commit_id":"57ecab98ac7d27053e5679e5e2ad413bb0686c37"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"f551cdc8dbced5fe63dfcffa6a23a48460b5b77a","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                    pass"},{"line_number":188,"context_line":"            if (req.headers.get(\u0027x-account-override-deleted\u0027, \u0027no\u0027).lower() !\u003d"},{"line_number":189,"context_line":"                    \u0027yes\u0027 and broker.is_deleted()) \\"},{"line_number":190,"context_line":"                    or not os.path.exists(broker.db_file):"},{"line_number":191,"context_line":"                return HTTPNotFound(request\u003dreq)"},{"line_number":192,"context_line":"            broker.put_container(container, req.headers[\u0027x-put-timestamp\u0027],"},{"line_number":193,"context_line":"                                 req.headers[\u0027x-delete-timestamp\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"1762aaa2_1ea2fa00","line":190,"in_reply_to":"e6796121_dd988f92","updated":"2021-07-15 03:21:11.000000000","message":"Ack","commit_id":"57ecab98ac7d27053e5679e5e2ad413bb0686c37"}],"swift/container/updater.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"58c9aabe8faf6b9b883cf8652210411278aac69c","unresolved":true,"context_lines":[{"line_number":286,"context_line":"                broker.reported(info[\u0027put_timestamp\u0027],"},{"line_number":287,"context_line":"                                info[\u0027delete_timestamp\u0027], info[\u0027object_count\u0027],"},{"line_number":288,"context_line":"                                info[\u0027bytes_used\u0027])"},{"line_number":289,"context_line":"            elif stub404s \u003d\u003d len(events):"},{"line_number":290,"context_line":"                self.logger.increment(\u0027failures\u0027)"},{"line_number":291,"context_line":"                self.failures +\u003d 1"},{"line_number":292,"context_line":"                self.logger.debug("}],"source_content_type":"text/x-python","patch_set":7,"id":"b8ca52b8_71d04cc7","line":289,"updated":"2021-07-12 18:53:32.000000000","message":"Is the expectation here that object_count should always be zero, and the container is marked deleted? I think I\u0027m on board with that idea -- but if this container is supposed to exist (and especially if it\u0027s supposed to have data in it!) it makes me nervous that we\u0027d lose what little signal we\u0027ve got that the system is in this inconsistent state.\n\nEven the dark data watcher won\u0027t help -- since it\u0027s using direct_client, it never checks for account existence :-/","commit_id":"57ecab98ac7d27053e5679e5e2ad413bb0686c37"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"f551cdc8dbced5fe63dfcffa6a23a48460b5b77a","unresolved":true,"context_lines":[{"line_number":286,"context_line":"                broker.reported(info[\u0027put_timestamp\u0027],"},{"line_number":287,"context_line":"                                info[\u0027delete_timestamp\u0027], info[\u0027object_count\u0027],"},{"line_number":288,"context_line":"                                info[\u0027bytes_used\u0027])"},{"line_number":289,"context_line":"            elif stub404s \u003d\u003d len(events):"},{"line_number":290,"context_line":"                self.logger.increment(\u0027failures\u0027)"},{"line_number":291,"context_line":"                self.failures +\u003d 1"},{"line_number":292,"context_line":"                self.logger.debug("}],"source_content_type":"text/x-python","patch_set":7,"id":"1e25f3ae_67c0a662","line":289,"in_reply_to":"b8ca52b8_71d04cc7","updated":"2021-07-15 03:21:11.000000000","message":"Unfortunately it\u0027s not a little signal for me. People are losing their marbles in RH Bugzilla.\n\nIf you want, I can leave the updater flopping around as it hits 404 again and again. It just made no sense to me.\n\nIf it\u0027s a normal cluster, this is not happening. If it\u0027s a deployment orchestration unrolling Swift over dirty volumes (as usually the case that triggers the bug), then nobody reads the logs. They only get alerted to the account server tracebacking. So the result is, you still have exact same dark data already: it\u0027s not anchored at the account, so it\u0027s dark. So stubbing the updater like my patch does does not actually make it any worse, surprisingly enough.","commit_id":"57ecab98ac7d27053e5679e5e2ad413bb0686c37"}],"test/probe/test_orphan_container.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"77631862456e4e279a28ef84ad2dff30f5bf9708","unresolved":false,"context_lines":[{"line_number":34,"context_line":"# The common way users do this is to use TripleO to deploy an overcloud"},{"line_number":35,"context_line":"# and add Gnocchi. Gnocchi is hammering Swift, its container has updates"},{"line_number":36,"context_line":"# all the time. Then, users crash the overcloud and re-deploy it,"},{"line_number":37,"context_line":"# using the new suffix in swift.conf. Thereafter, container service"},{"line_number":38,"context_line":"# inherits old container with outstanding updates, container updater"},{"line_number":39,"context_line":"# tries to send updates to the account server, while the account cannot"},{"line_number":40,"context_line":"# be found anymore. In this situation, in Swift 2.25.0, account server"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f560f44_cbed908c","line":37,"range":{"start_line":37,"start_character":12,"end_line":37,"end_character":36},"updated":"2020-07-29 17:19:16.000000000","message":"Eep! Is there *any* expectation of being able to read old data? Would it be better to just recommend reformatting all drives?","commit_id":"b3132cc3ba42a8399c05bba21f0c4106c03bd3ca"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"da0e514688130edbee086ff175496d7a30949adf","unresolved":false,"context_lines":[{"line_number":34,"context_line":"# The common way users do this is to use TripleO to deploy an overcloud"},{"line_number":35,"context_line":"# and add Gnocchi. Gnocchi is hammering Swift, its container has updates"},{"line_number":36,"context_line":"# all the time. Then, users crash the overcloud and re-deploy it,"},{"line_number":37,"context_line":"# using the new suffix in swift.conf. Thereafter, container service"},{"line_number":38,"context_line":"# inherits old container with outstanding updates, container updater"},{"line_number":39,"context_line":"# tries to send updates to the account server, while the account cannot"},{"line_number":40,"context_line":"# be found anymore. In this situation, in Swift 2.25.0, account server"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f560f44_77cffeaf","line":37,"range":{"start_line":37,"start_character":12,"end_line":37,"end_character":36},"in_reply_to":"9f560f44_cbed908c","updated":"2020-07-30 06:05:21.000000000","message":"I agree that re-initializing volumes is better. But it must be manual and I don\u0027t know how to accomplish it. It cannot be made automated because TripleO is trying to be as idempotent as possible. This way when it crashes, it is not re-running all the steps. I\u0027m trying to figure it all out right now.","commit_id":"b3132cc3ba42a8399c05bba21f0c4106c03bd3ca"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"58c9aabe8faf6b9b883cf8652210411278aac69c","unresolved":true,"context_lines":[{"line_number":79,"context_line":"        cpart, cnodes \u003d self.container_ring.get_nodes(self.account, container)"},{"line_number":80,"context_line":"        client.put_container(self.url, self.token, container)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        # Stop a quorum of account servers"},{"line_number":83,"context_line":"        # This allows the put to continue later."},{"line_number":84,"context_line":"        kill_nonprimary_server(cnodes, self.ipport2server)"},{"line_number":85,"context_line":"        kill_server((cnodes[0][\u0027ip\u0027], cnodes[0][\u0027port\u0027]), self.ipport2server)"}],"source_content_type":"text/x-python","patch_set":7,"id":"59ebe6d4_0b833ad5","line":82,"range":{"start_line":82,"start_character":27,"end_line":82,"end_character":34},"updated":"2021-07-12 18:53:32.000000000","message":"Account, or container?","commit_id":"57ecab98ac7d27053e5679e5e2ad413bb0686c37"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"f551cdc8dbced5fe63dfcffa6a23a48460b5b77a","unresolved":true,"context_lines":[{"line_number":79,"context_line":"        cpart, cnodes \u003d self.container_ring.get_nodes(self.account, container)"},{"line_number":80,"context_line":"        client.put_container(self.url, self.token, container)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        # Stop a quorum of account servers"},{"line_number":83,"context_line":"        # This allows the put to continue later."},{"line_number":84,"context_line":"        kill_nonprimary_server(cnodes, self.ipport2server)"},{"line_number":85,"context_line":"        kill_server((cnodes[0][\u0027ip\u0027], cnodes[0][\u0027port\u0027]), self.ipport2server)"}],"source_content_type":"text/x-python","patch_set":7,"id":"d1e63c25_12fd41ba","line":82,"range":{"start_line":82,"start_character":27,"end_line":82,"end_character":34},"in_reply_to":"59ebe6d4_0b833ad5","updated":"2021-07-15 03:21:11.000000000","message":"Account, of course. I want container server work normally, fail to create the stopped account server, and form a pending update.","commit_id":"57ecab98ac7d27053e5679e5e2ad413bb0686c37"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"0dca99b50ff9362f6af2342eef02e19b000d1a52","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        cpart, cnodes \u003d self.container_ring.get_nodes(self.account, container)"},{"line_number":80,"context_line":"        client.put_container(self.url, self.token, container)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        # Stop a quorum of account servers"},{"line_number":83,"context_line":"        # This allows the put to continue later."},{"line_number":84,"context_line":"        kill_nonprimary_server(cnodes, self.ipport2server)"},{"line_number":85,"context_line":"        kill_server((cnodes[0][\u0027ip\u0027], cnodes[0][\u0027port\u0027]), self.ipport2server)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ca3b508_ea7a017d","line":82,"range":{"start_line":82,"start_character":27,"end_line":82,"end_character":34},"in_reply_to":"7990f526_984c1677","updated":"2021-08-12 21:27:28.000000000","message":"Ouch\n\nI fixed it and ran the test with the main patch canceled to make sure it actually trips.","commit_id":"57ecab98ac7d27053e5679e5e2ad413bb0686c37"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f383d5f30f35d451bc410873edc91d612b44b72f","unresolved":true,"context_lines":[{"line_number":79,"context_line":"        cpart, cnodes \u003d self.container_ring.get_nodes(self.account, container)"},{"line_number":80,"context_line":"        client.put_container(self.url, self.token, container)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        # Stop a quorum of account servers"},{"line_number":83,"context_line":"        # This allows the put to continue later."},{"line_number":84,"context_line":"        kill_nonprimary_server(cnodes, self.ipport2server)"},{"line_number":85,"context_line":"        kill_server((cnodes[0][\u0027ip\u0027], cnodes[0][\u0027port\u0027]), self.ipport2server)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7990f526_984c1677","line":82,"range":{"start_line":82,"start_character":27,"end_line":82,"end_character":34},"in_reply_to":"d1e63c25_12fd41ba","updated":"2021-08-04 22:18:08.000000000","message":"But we\u0027re using cnodes below -- doesn\u0027t that stop the container servers instead? If I drop in\n\n import subprocess\n self.fail(subprocess.check_output([\u0027swift-init\u0027, \u0027status\u0027, \u0027main\u0027]))\n\nhere, I see all four account servers running, but only two container servers.","commit_id":"57ecab98ac7d27053e5679e5e2ad413bb0686c37"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"58c9aabe8faf6b9b883cf8652210411278aac69c","unresolved":true,"context_lines":[{"line_number":107,"context_line":"        self.assertGreater(len(outstanding_files), 0)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        # At this point the users shut everything down and screw up the"},{"line_number":110,"context_line":"        # hash in swift.conf. But we destroy the account DB instead."},{"line_number":111,"context_line":"        files \u003d self.get_account_db_files(self.account)"},{"line_number":112,"context_line":"        for afile in files:"},{"line_number":113,"context_line":"            os.unlink(afile)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1098313e_e8ab0e43","line":110,"range":{"start_line":110,"start_character":10,"end_line":110,"end_character":28},"updated":"2021-07-12 18:53:32.000000000","message":"Do any auditors notice that the hashdir doesn\u0027t match what\u0027s expected with the new hash prefix/suffix? I\u0027m still worried about the on-disk data and whether it\u0027ll ever get cleaned up.","commit_id":"57ecab98ac7d27053e5679e5e2ad413bb0686c37"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"f551cdc8dbced5fe63dfcffa6a23a48460b5b77a","unresolved":true,"context_lines":[{"line_number":107,"context_line":"        self.assertGreater(len(outstanding_files), 0)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        # At this point the users shut everything down and screw up the"},{"line_number":110,"context_line":"        # hash in swift.conf. But we destroy the account DB instead."},{"line_number":111,"context_line":"        files \u003d self.get_account_db_files(self.account)"},{"line_number":112,"context_line":"        for afile in files:"},{"line_number":113,"context_line":"            os.unlink(afile)"}],"source_content_type":"text/x-python","patch_set":7,"id":"626877ac_5261eff2","line":110,"range":{"start_line":110,"start_character":10,"end_line":110,"end_character":28},"in_reply_to":"1098313e_e8ab0e43","updated":"2021-07-15 03:21:11.000000000","message":"There is no need to worry: I guarantee it will never be cleaned up, unless Matt\u0027s account/container patch gets developed and merged.\n\nI suppose auditor could re-hash the account/container path and see that it differs from the hash in container metadata (or the filename for that matter). What should it do then?","commit_id":"57ecab98ac7d27053e5679e5e2ad413bb0686c37"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f383d5f30f35d451bc410873edc91d612b44b72f","unresolved":true,"context_lines":[{"line_number":107,"context_line":"        self.assertGreater(len(outstanding_files), 0)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        # At this point the users shut everything down and screw up the"},{"line_number":110,"context_line":"        # hash in swift.conf. But we destroy the account DB instead."},{"line_number":111,"context_line":"        files \u003d self.get_account_db_files(self.account)"},{"line_number":112,"context_line":"        for afile in files:"},{"line_number":113,"context_line":"            os.unlink(afile)"}],"source_content_type":"text/x-python","patch_set":7,"id":"84e023a7_0c783921","line":110,"range":{"start_line":110,"start_character":10,"end_line":110,"end_character":28},"in_reply_to":"626877ac_5261eff2","updated":"2021-08-04 22:18:08.000000000","message":"The *not* getting clean up is what I worry about 😉\n\n\u003e What should it do then?\n\nI was thinking quarantine.","commit_id":"57ecab98ac7d27053e5679e5e2ad413bb0686c37"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"0dca99b50ff9362f6af2342eef02e19b000d1a52","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        self.assertGreater(len(outstanding_files), 0)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        # At this point the users shut everything down and screw up the"},{"line_number":110,"context_line":"        # hash in swift.conf. But we destroy the account DB instead."},{"line_number":111,"context_line":"        files \u003d self.get_account_db_files(self.account)"},{"line_number":112,"context_line":"        for afile in files:"},{"line_number":113,"context_line":"            os.unlink(afile)"}],"source_content_type":"text/x-python","patch_set":7,"id":"a84d0dfe_727ac601","line":110,"range":{"start_line":110,"start_character":10,"end_line":110,"end_character":28},"in_reply_to":"84e023a7_0c783921","updated":"2021-08-12 21:27:28.000000000","message":"Done","commit_id":"57ecab98ac7d27053e5679e5e2ad413bb0686c37"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f383d5f30f35d451bc410873edc91d612b44b72f","unresolved":true,"context_lines":[{"line_number":129,"context_line":"            if info[\u0027put_timestamp\u0027] \u003e info[\u0027reported_put_timestamp\u0027]:"},{"line_number":130,"context_line":"                outstanding_files_new.append(cfile)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        self.assertGreater(len(outstanding_files), len(outstanding_files_new))"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        self.get_to_final_state()"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"637ab629_befc226c","line":132,"updated":"2021-08-04 22:18:08.000000000","message":"Stronger as\n\n self.assertLengthEqual(outstanding_files_new, 0)\n\nThat\u0027s the real goal, right?","commit_id":"57ecab98ac7d27053e5679e5e2ad413bb0686c37"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"0dca99b50ff9362f6af2342eef02e19b000d1a52","unresolved":false,"context_lines":[{"line_number":129,"context_line":"            if info[\u0027put_timestamp\u0027] \u003e info[\u0027reported_put_timestamp\u0027]:"},{"line_number":130,"context_line":"                outstanding_files_new.append(cfile)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        self.assertGreater(len(outstanding_files), len(outstanding_files_new))"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        self.get_to_final_state()"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"44424a33_e8e0e3a8","line":132,"in_reply_to":"637ab629_befc226c","updated":"2021-08-12 21:27:28.000000000","message":"Done","commit_id":"57ecab98ac7d27053e5679e5e2ad413bb0686c37"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"081f34469f176b1ff344895d3fac10e027e735d5","unresolved":true,"context_lines":[{"line_number":141,"context_line":"            # Correct even if reported_put_timestamp is zero."},{"line_number":142,"context_line":"            if info[\u0027put_timestamp\u0027] \u003e info[\u0027reported_put_timestamp\u0027]:"},{"line_number":143,"context_line":"                outstanding_files_new.append(cfile)"},{"line_number":144,"context_line":"        self.assertLengthEqual(outstanding_files_new, 0)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        self.get_to_final_state()"},{"line_number":147,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"4fbc11af_ee130422","line":144,"updated":"2021-08-13 17:04:14.000000000","message":"I think at this point, we could simplify this to\n\n self.assertLengthEqual([\n     cfile for cfile in cont_db_files\n     if os.path.exists(cfile)], 0)\n\nand drop the loop above.","commit_id":"bcff1282b579f48efdc9bfcdde5b666b9ab23d3a"}]}
