)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b833172fe5dee19244b014a19b34c1a0ab0c16f3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"0a1b7086_3ab0e944","updated":"2022-08-01 11:20:21.000000000","message":"In principle I\u0027d prefer not to have an apparently invalid local diskfile cause the reconstructor to fire off a bunch of requests to try to rebuild a frag, but rather just ignore it. Then the auditor could clean it up if that\u0027s what we want.\n\nIn practice, the problem \u0027frags\u0027 are uncommon, so the wasted requests are insignificant, and this patch is relatively simple.","commit_id":"5ceae570f5eb50022a05938a0379c92337d59b30"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0cf9ae8db57a2788c36a98a8428d619819d4430c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"2d1d21a9_7ae2f780","updated":"2022-07-29 20:34:23.000000000","message":"Yeah, I think I\u0027m on board with this. I also wouldn\u0027t be opposed to adding a method like Diskfile.validate(), having the EC subclass spot-check this header (among others) and balk if it\u0027s missing, then having the auditor call it and quarantine from there.","commit_id":"5ceae570f5eb50022a05938a0379c92337d59b30"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5f65d5887eab6de017053225e7f9671fb62cfdf1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"2967b292_6402270c","updated":"2022-08-01 11:21:41.000000000","message":"fixed pep8 and commit msg typo","commit_id":"9177f2d53e9f3588ccff50ddaa57ddea7587be0d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"03250b6a24f4464a32b13d5d01874d25f663623c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"141dfabd_5eb2dff3","updated":"2022-08-16 14:18:32.000000000","message":"@Ashwin I think you are heading in the right direction, but perhaps consider backing out your changes from this patch and proposing a separate patch based on this one?","commit_id":"3a19e75fa8cc6c8612c769462c0d6ebe7bca1a24"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e8afcb140f08da08ca71dc8b3aa1e2c389cac2b6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"de48367b_dd6b70b3","updated":"2022-11-30 19:37:47.000000000","message":"Now that Ash\u0027s patch landed -- is it still worth pursuing this? Or should we abandon it?","commit_id":"3a19e75fa8cc6c8612c769462c0d6ebe7bca1a24"}],"swift/obj/diskfile.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"03250b6a24f4464a32b13d5d01874d25f663623c","unresolved":true,"context_lines":[{"line_number":2910,"context_line":"            raise DiskFileNotOpen()"},{"line_number":2911,"context_line":"        return self._datafile_metadata"},{"line_number":2912,"context_line":""},{"line_number":2913,"context_line":"    def validate_ec_metadata(self):"},{"line_number":2914,"context_line":"        if self._datafile_metadata[\u0027X-Object-Sysmeta-Ec-Frag-Index\u0027] or \\"},{"line_number":2915,"context_line":"                self._datafile_metadata[\u0027X-Object-Sysmeta-Ec-Etag\u0027] is None:"},{"line_number":2916,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":4,"id":"9adab520_70bf2357","line":2913,"range":{"start_line":2913,"start_character":8,"end_line":2913,"end_character":28},"updated":"2022-08-16 14:18:32.000000000","message":"this is an EC specific implementation so should be in the ECDiskFile subclass.\n\nIf it is only ever called when handling an ECDiskFile that that might be sufficient, but you could make it \u0027generic\u0027 by naming it validate_metadata() and then having a default implementation here that is overridden with this implementation in ECDiskFile i.e.:\n\nIn BaseDiskFile...\n\n  def validate_metadata(self):\n      return True\n\n\nIn ECDiskFile:\n\n  def validate_metadata(self):\n      if self._datafile_metadata[\u0027X-Object-Sysmeta-Ec-Frag-Index\u0027] or \\\n                self._datafile_metadata[\u0027X-Object-Sysmeta-Ec-Etag\u0027] is None:\n          return False\n      else:\n          return True","commit_id":"d71e1ce456da72da40e5b1fbe257954f5b53f66f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"03250b6a24f4464a32b13d5d01874d25f663623c","unresolved":false,"context_lines":[{"line_number":2913,"context_line":"    def validate_ec_metadata(self):"},{"line_number":2914,"context_line":"        if self._datafile_metadata[\u0027X-Object-Sysmeta-Ec-Frag-Index\u0027] or \\"},{"line_number":2915,"context_line":"                self._datafile_metadata[\u0027X-Object-Sysmeta-Ec-Etag\u0027] is None:"},{"line_number":2916,"context_line":"            return False"},{"line_number":2917,"context_line":""},{"line_number":2918,"context_line":"    def get_metadata(self):"},{"line_number":2919,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"331419cc_5b35e217","line":2916,"updated":"2022-08-16 14:18:32.000000000","message":"else\n    return True","commit_id":"d71e1ce456da72da40e5b1fbe257954f5b53f66f"}],"swift/obj/reconstructor.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b833172fe5dee19244b014a19b34c1a0ab0c16f3","unresolved":true,"context_lines":[{"line_number":435,"context_line":"            # The successful response should include valid X-Object-"},{"line_number":436,"context_line":"            # Sysmeta-Ec-Frag-Index but for safety, catching the case either"},{"line_number":437,"context_line":"            # missing X-Object-Sysmeta-Ec-Frag-Index or invalid frag index to"},{"line_number":438,"context_line":"            # reconstruct and dump warning log for that"},{"line_number":439,"context_line":"            self.logger.warning("},{"line_number":440,"context_line":"                \u0027Invalid resp from %s \u0027"},{"line_number":441,"context_line":"                \u0027(invalid X-Object-Sysmeta-Ec-Frag-Index: %r)\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"e840ca26_1902cef8","line":438,"updated":"2022-08-01 11:20:21.000000000","message":"so, the case we\u0027re addressing with this patch is a response that does have a frag index but does not have an etag?\n\nIf (and I realise it is not what we are expecting) the null-etag responses each had different frag indexes such that a \u0027useful bucket\u0027 worth of responses was collected, what would happen? I couldn\u0027t work out when/if things would blow up, or whether an empty frag would be reconstructed from the presumably empty responses. We don\u0027t seem to send the etag with the ssync PUT, so it\u0027s not checked...but should we check it?","commit_id":"5ceae570f5eb50022a05938a0379c92337d59b30"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0cf9ae8db57a2788c36a98a8428d619819d4430c","unresolved":true,"context_lines":[{"line_number":454,"context_line":"            return None"},{"line_number":455,"context_line":"        timestamp \u003d Timestamp(timestamp)"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"        etag \u003d resp.headers.get(\u0027X-Object-Sysmeta-Ec-Etag\u0027)"},{"line_number":458,"context_line":"        if not etag:"},{"line_number":459,"context_line":"            self.logger.warning("},{"line_number":460,"context_line":"                \u0027Invalid resp from %s, frag index %s (missing Etag)\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"369fe027_59c2f8d4","line":457,"updated":"2022-07-29 20:34:23.000000000","message":"Good -- we\u0027ve written this header ever since EC first landed: https://github.com/openstack/swift/blame/master/swift/proxy/controllers/obj.py#L1983","commit_id":"5ceae570f5eb50022a05938a0379c92337d59b30"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0cf9ae8db57a2788c36a98a8428d619819d4430c","unresolved":true,"context_lines":[{"line_number":463,"context_line":"        bucket \u003d buckets[timestamp]"},{"line_number":464,"context_line":"        bucket.num_responses +\u003d 1"},{"line_number":465,"context_line":"        if bucket.etag is None:"},{"line_number":466,"context_line":"            bucket.etag \u003d etag"},{"line_number":467,"context_line":"        elif bucket.etag !\u003d etag:"},{"line_number":468,"context_line":"            self.logger.error(\u0027Mixed Etag (%s, %s) for %s frag#%s\u0027,"},{"line_number":469,"context_line":"                              etag, bucket.etag,"}],"source_content_type":"text/x-python","patch_set":2,"id":"10401647_3fe59121","line":466,"updated":"2022-07-29 20:34:23.000000000","message":"So now we\u0027ll have a successful bucket with an etag of None...","commit_id":"5ceae570f5eb50022a05938a0379c92337d59b30"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0cf9ae8db57a2788c36a98a8428d619819d4430c","unresolved":true,"context_lines":[{"line_number":466,"context_line":"            bucket.etag \u003d etag"},{"line_number":467,"context_line":"        elif bucket.etag !\u003d etag:"},{"line_number":468,"context_line":"            self.logger.error(\u0027Mixed Etag (%s, %s) for %s frag#%s\u0027,"},{"line_number":469,"context_line":"                              etag, bucket.etag,"},{"line_number":470,"context_line":"                              _full_path(node, partition, path, policy),"},{"line_number":471,"context_line":"                              fi_to_rebuild)"},{"line_number":472,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":2,"id":"9c67c390_e601c01d","line":469,"updated":"2022-07-29 20:34:23.000000000","message":"And presumably we never get a second response to trip this None-return path.","commit_id":"5ceae570f5eb50022a05938a0379c92337d59b30"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0cf9ae8db57a2788c36a98a8428d619819d4430c","unresolved":true,"context_lines":[{"line_number":485,"context_line":"                fi_to_rebuild, resp.full_path,"},{"line_number":486,"context_line":"                _full_path(node, partition, path, policy))"},{"line_number":487,"context_line":"        elif resp_frag_index not in bucket.useful_responses:"},{"line_number":488,"context_line":"            bucket.useful_responses[resp_frag_index] \u003d resp"},{"line_number":489,"context_line":"        # else: duplicate frag_index isn\u0027t useful for rebuilding"},{"line_number":490,"context_line":""},{"line_number":491,"context_line":"        return bucket"}],"source_content_type":"text/x-python","patch_set":2,"id":"2b1b6180_6b3bea20","line":488,"updated":"2022-07-29 20:34:23.000000000","message":"...sure... \"useful\"....","commit_id":"5ceae570f5eb50022a05938a0379c92337d59b30"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"e0d54af700e56bb863f8543f9d721099ac11af04","unresolved":false,"context_lines":[{"line_number":485,"context_line":"                fi_to_rebuild, resp.full_path,"},{"line_number":486,"context_line":"                _full_path(node, partition, path, policy))"},{"line_number":487,"context_line":"        elif resp_frag_index not in bucket.useful_responses:"},{"line_number":488,"context_line":"            bucket.useful_responses[resp_frag_index] \u003d resp"},{"line_number":489,"context_line":"        # else: duplicate frag_index isn\u0027t useful for rebuilding"},{"line_number":490,"context_line":""},{"line_number":491,"context_line":"        return bucket"}],"source_content_type":"text/x-python","patch_set":2,"id":"44c95309_47cc05c3","line":488,"in_reply_to":"2b1b6180_6b3bea20","updated":"2023-08-17 16:16:50.000000000","message":"Ack","commit_id":"5ceae570f5eb50022a05938a0379c92337d59b30"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0cf9ae8db57a2788c36a98a8428d619819d4430c","unresolved":true,"context_lines":[{"line_number":494,"context_line":"        # This condition is deliberately strict because it determines if"},{"line_number":495,"context_line":"        # more requests will be issued and ultimately if the fragment"},{"line_number":496,"context_line":"        # will be quarantined."},{"line_number":497,"context_line":"        if list(error_responses.keys()) !\u003d [404]:"},{"line_number":498,"context_line":"            # only quarantine if all other responses are 404 so we are"},{"line_number":499,"context_line":"            # confident there are no other frags on queried nodes"},{"line_number":500,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":2,"id":"be0fc73b_69a21ad1","line":497,"updated":"2022-07-29 20:34:23.000000000","message":"And this is the trouble with dumping it the UNKNOWN_RESPONSE_STATUS bucket -- that prevents it from being considered a quarantine candidate.","commit_id":"5ceae570f5eb50022a05938a0379c92337d59b30"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"e0d54af700e56bb863f8543f9d721099ac11af04","unresolved":false,"context_lines":[{"line_number":494,"context_line":"        # This condition is deliberately strict because it determines if"},{"line_number":495,"context_line":"        # more requests will be issued and ultimately if the fragment"},{"line_number":496,"context_line":"        # will be quarantined."},{"line_number":497,"context_line":"        if list(error_responses.keys()) !\u003d [404]:"},{"line_number":498,"context_line":"            # only quarantine if all other responses are 404 so we are"},{"line_number":499,"context_line":"            # confident there are no other frags on queried nodes"},{"line_number":500,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":2,"id":"28810aa1_42861a1c","line":497,"in_reply_to":"be0fc73b_69a21ad1","updated":"2023-08-17 16:16:50.000000000","message":"Done","commit_id":"5ceae570f5eb50022a05938a0379c92337d59b30"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b833172fe5dee19244b014a19b34c1a0ab0c16f3","unresolved":true,"context_lines":[{"line_number":650,"context_line":"        # the fragment index we need to reconstruct is the position index"},{"line_number":651,"context_line":"        # of the node we\u0027re rebuilding to within the primary part list"},{"line_number":652,"context_line":"        fi_to_rebuild \u003d node[\u0027backend_index\u0027]"},{"line_number":653,"context_line":"        datafile_metadata \u003d df.get_datafile_metadata()"},{"line_number":654,"context_line":"        local_timestamp \u003d Timestamp(datafile_metadata[\u0027X-Timestamp\u0027])"},{"line_number":655,"context_line":"        path \u003d datafile_metadata[\u0027name\u0027]"},{"line_number":656,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"a0375dfa_2cdce7f1","line":653,"updated":"2022-08-01 11:20:21.000000000","message":"could we:\n\n  if not datafile_metadata.get(\u0027X-Object-Ec-Etag\u0027):\n      raise df._quarantine(\n          df._data_file, \"Invalid fragment #%s\" % df._frag_index)","commit_id":"5ceae570f5eb50022a05938a0379c92337d59b30"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"e0d54af700e56bb863f8543f9d721099ac11af04","unresolved":false,"context_lines":[{"line_number":650,"context_line":"        # the fragment index we need to reconstruct is the position index"},{"line_number":651,"context_line":"        # of the node we\u0027re rebuilding to within the primary part list"},{"line_number":652,"context_line":"        fi_to_rebuild \u003d node[\u0027backend_index\u0027]"},{"line_number":653,"context_line":"        datafile_metadata \u003d df.get_datafile_metadata()"},{"line_number":654,"context_line":"        local_timestamp \u003d Timestamp(datafile_metadata[\u0027X-Timestamp\u0027])"},{"line_number":655,"context_line":"        path \u003d datafile_metadata[\u0027name\u0027]"},{"line_number":656,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"93cb27a9_5e8ceabb","line":653,"in_reply_to":"a0375dfa_2cdce7f1","updated":"2023-08-17 16:16:50.000000000","message":"Done","commit_id":"5ceae570f5eb50022a05938a0379c92337d59b30"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"03250b6a24f4464a32b13d5d01874d25f663623c","unresolved":true,"context_lines":[{"line_number":650,"context_line":"        # the fragment index we need to reconstruct is the position index"},{"line_number":651,"context_line":"        # of the node we\u0027re rebuilding to within the primary part list"},{"line_number":652,"context_line":"        fi_to_rebuild \u003d node[\u0027backend_index\u0027]"},{"line_number":653,"context_line":"        if df.validate_ec_metadata() is False:"},{"line_number":654,"context_line":"            raise df._quarantine("},{"line_number":655,"context_line":"                df._data_file, \"Invalid fragment #%s\" % df._frag_index)"},{"line_number":656,"context_line":"        datafile_metadata \u003d df.get_datafile_metadata()"}],"source_content_type":"text/x-python","patch_set":4,"id":"7118998c_2dbbba02","line":653,"range":{"start_line":653,"start_character":37,"end_line":653,"end_character":45},"updated":"2022-08-16 14:18:32.000000000","message":"this is testing for object identity rather than truthiness - it would be more typical to test for truthiness, so\n\n  if not df.validate_ec_metadata():\n  \n  \nBut you also need validate_ec_metadata to return True when metadata is good.","commit_id":"d71e1ce456da72da40e5b1fbe257954f5b53f66f"}],"test/unit/obj/test_reconstructor.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b833172fe5dee19244b014a19b34c1a0ab0c16f3","unresolved":true,"context_lines":[{"line_number":5552,"context_line":"        for line in warning_lines:"},{"line_number":5553,"context_line":"            self.assertIn(\u0027Invalid response 507\u0027, line)"},{"line_number":5554,"context_line":""},{"line_number":5555,"context_line":"    def test_reconstruct_fa_quarantines(self):"},{"line_number":5556,"context_line":"        self._configure_reconstructor(quarantine_threshold\u003d1)"},{"line_number":5557,"context_line":"        ONE_WEEK_SECONDS \u003d 604800.0"},{"line_number":5558,"context_line":"        self.obj_timestamp \u003d Timestamp(time.time() - ONE_WEEK_SECONDS * 4)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dd59fc85_ad8a62f5","line":5555,"range":{"start_line":5555,"start_character":8,"end_line":5555,"end_character":39},"updated":"2022-08-01 11:20:21.000000000","message":"is this test covering a different scenario than test_reconstruct_fa_quarantine_threshold_one_rnc_two_replicas? The only difference I can see is using default reclaim age, but varying reclaim_age is covered by other tests. \n\nAlso, if this test adds coverage, might be worth locating adjacent to the existing quarantine tests.","commit_id":"5ceae570f5eb50022a05938a0379c92337d59b30"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0cf9ae8db57a2788c36a98a8428d619819d4430c","unresolved":true,"context_lines":[{"line_number":5570,"context_line":"        node \u003d part_nodes[1]"},{"line_number":5571,"context_line":"        node[\u0027backend_index\u0027] \u003d self.policy.get_backend_index(node[\u0027index\u0027])"},{"line_number":5572,"context_line":""},{"line_number":5573,"context_line":"        num_other_resps \u003d 2 * self.policy.object_ring.replicas - 2"},{"line_number":5574,"context_line":"        codes \u003d [200] + [404 for i in range(num_other_resps)]"},{"line_number":5575,"context_line":"        headers \u003d [frag_headers] + [{} for i in range(num_other_resps)]"},{"line_number":5576,"context_line":"        with mocked_http_conn(*codes, headers\u003dheaders):"}],"source_content_type":"text/x-python","patch_set":2,"id":"a9425ebe_e3082681","line":5573,"updated":"2022-07-29 20:34:23.000000000","message":"Why -2? I was expecting -1 since we\u0027re adding just one good response... *shrug* All the other tests are like this, too.","commit_id":"5ceae570f5eb50022a05938a0379c92337d59b30"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b833172fe5dee19244b014a19b34c1a0ab0c16f3","unresolved":true,"context_lines":[{"line_number":5570,"context_line":"        node \u003d part_nodes[1]"},{"line_number":5571,"context_line":"        node[\u0027backend_index\u0027] \u003d self.policy.get_backend_index(node[\u0027index\u0027])"},{"line_number":5572,"context_line":""},{"line_number":5573,"context_line":"        num_other_resps \u003d 2 * self.policy.object_ring.replicas - 2"},{"line_number":5574,"context_line":"        codes \u003d [200] + [404 for i in range(num_other_resps)]"},{"line_number":5575,"context_line":"        headers \u003d [frag_headers] + [{} for i in range(num_other_resps)]"},{"line_number":5576,"context_line":"        with mocked_http_conn(*codes, headers\u003dheaders):"}],"source_content_type":"text/x-python","patch_set":2,"id":"418b01bd_e27533d2","line":5573,"in_reply_to":"a9425ebe_e3082681","updated":"2022-08-01 11:20:21.000000000","message":"reconstruct_fa (in _make_fragment_requests) does not send a request to the node to which it is reconstructing, so that\u0027s -1 and the good response is also -1","commit_id":"5ceae570f5eb50022a05938a0379c92337d59b30"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0cf9ae8db57a2788c36a98a8428d619819d4430c","unresolved":true,"context_lines":[{"line_number":5578,"context_line":"                              job, node, self.df)"},{"line_number":5579,"context_line":"        error_lines \u003d self.logger.get_lines_for_level(\u0027error\u0027)"},{"line_number":5580,"context_line":"        for line in error_lines:"},{"line_number":5581,"context_line":"            self.assertIn(\u0027Unable to get enough responses\u0027, line)"},{"line_number":5582,"context_line":"        warning_lines \u003d self.logger.get_lines_for_level(\u0027warning\u0027)"},{"line_number":5583,"context_line":"        self.assertEqual(1, len(warning_lines), warning_lines)"},{"line_number":5584,"context_line":"        self.assertIn(\u0027Quarantined\u0027, warning_lines[0])"}],"source_content_type":"text/x-python","patch_set":2,"id":"e4e67e5a_26d42c0b","line":5581,"updated":"2022-07-29 20:34:23.000000000","message":"This doesn\u0027t check that we got any error lines at all -- how many are we expecting?","commit_id":"5ceae570f5eb50022a05938a0379c92337d59b30"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0cf9ae8db57a2788c36a98a8428d619819d4430c","unresolved":true,"context_lines":[{"line_number":6522,"context_line":"        node \u003d part_nodes[1]"},{"line_number":6523,"context_line":"        node[\u0027backend_index\u0027] \u003d self.policy.get_backend_index(node[\u0027index\u0027])"},{"line_number":6524,"context_line":""},{"line_number":6525,"context_line":"        # num_other_resps \u003d self.policy.object_ring.replicas - 2"},{"line_number":6526,"context_line":"        num_other_resps \u003d 2 * self.policy.object_ring.replicas - 2"},{"line_number":6527,"context_line":"        codes \u003d [200] + [404 for i in range(num_other_resps)]"},{"line_number":6528,"context_line":"        headers \u003d [frag_headers] + [{} for i in range(num_other_resps)]"}],"source_content_type":"text/x-python","patch_set":2,"id":"deddc2a7_32b45dd7","line":6525,"updated":"2022-07-29 20:34:23.000000000","message":"Should probably drop this, to avoid confusion.","commit_id":"5ceae570f5eb50022a05938a0379c92337d59b30"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0cf9ae8db57a2788c36a98a8428d619819d4430c","unresolved":true,"context_lines":[{"line_number":6531,"context_line":"                              job, node, self.df)"},{"line_number":6532,"context_line":"        error_lines \u003d self.logger.get_lines_for_level(\u0027error\u0027)"},{"line_number":6533,"context_line":"        for line in error_lines:"},{"line_number":6534,"context_line":"            self.assertIn(\u0027Unable to get enough responses\u0027, line)"},{"line_number":6535,"context_line":"        warning_lines \u003d self.logger.get_lines_for_level(\u0027warning\u0027)"},{"line_number":6536,"context_line":"        expected \u003d ("},{"line_number":6537,"context_line":"            \u0027Invalid resp\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"77ed12d3_e7765e1b","line":6534,"updated":"2022-07-29 20:34:23.000000000","message":"ditto","commit_id":"5ceae570f5eb50022a05938a0379c92337d59b30"}]}
