)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5488da619a51bb648f02b649b74a17daf83fd231","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Tim Burke \u003ctim.burke@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2020-11-06 14:55:32 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Stop invalidating suffixes post-SSYNC"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I576901344f1f3abb33b52b36fde0b25b43e54c8a"},{"line_number":10,"context_line":"Closes-Bug: #1818709"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1f621f24_1e393aa3","line":7,"updated":"2020-11-09 18:14:29.000000000","message":"I would prefer this commit message to be expanded\n\nwe NEVER need to do any EC rehashing the reconstructor never uses rsync\n\nAnd for the replicator we only need to invalidate suffixes post RSYNC (hence the refactor to move suffix invalidation into the rsync helper)","commit_id":"be52b8b3383611c5dae545dff0318dae66bb1c32"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"59a9d90ae5f587b623edafbd469827e9570c29cb","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Tim Burke \u003ctim.burke@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2020-11-06 14:55:32 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Stop invalidating suffixes post-SSYNC"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I576901344f1f3abb33b52b36fde0b25b43e54c8a"},{"line_number":10,"context_line":"Closes-Bug: #1818709"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1f621f24_f43d7f8f","line":7,"in_reply_to":"1f621f24_1e393aa3","updated":"2020-11-09 20:38:42.000000000","message":"Done","commit_id":"be52b8b3383611c5dae545dff0318dae66bb1c32"}],"swift/obj/reconstructor.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5488da619a51bb648f02b649b74a17daf83fd231","unresolved":false,"context_lines":[{"line_number":703,"context_line":"            self.logger.exception("},{"line_number":704,"context_line":"                _(\"Trying to sync suffixes with %s\") % _full_path("},{"line_number":705,"context_line":"                    node, job[\u0027partition\u0027], \u0027\u0027, job[\u0027policy\u0027]))"},{"line_number":706,"context_line":""},{"line_number":707,"context_line":"    def _iter_nodes_for_frag(self, policy, partition, node):"},{"line_number":708,"context_line":"        \"\"\""},{"line_number":709,"context_line":"        Generate a priority list of nodes that can sync to the given node."}],"source_content_type":"text/x-python","patch_set":1,"id":"1f621f24_beb3e64c","side":"PARENT","line":706,"updated":"2020-11-09 18:14:29.000000000","message":"yeah this is a huge win in the re-constructor!","commit_id":"f6493c131d988e07e773906db2a86528900d63fb"}],"swift/obj/replicator.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5488da619a51bb648f02b649b74a17daf83fd231","unresolved":false,"context_lines":[{"line_number":527,"context_line":"                                node[\u0027replication_port\u0027],"},{"line_number":528,"context_line":"                                node[\u0027device\u0027], job[\u0027partition\u0027], \u0027REPLICATE\u0027,"},{"line_number":529,"context_line":"                                \u0027/\u0027 + \u0027-\u0027.join(suffixes), headers\u003dheaders)"},{"line_number":530,"context_line":"                            conn.getresponse().read()"},{"line_number":531,"context_line":"                        if node[\u0027region\u0027] !\u003d job[\u0027region\u0027]:"},{"line_number":532,"context_line":"                            synced_remote_regions[node[\u0027region\u0027]] \u003d viewkeys("},{"line_number":533,"context_line":"                                candidates)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f621f24_fed8be7b","side":"PARENT","line":530,"updated":"2020-11-09 18:14:29.000000000","message":"here too, still needs to happen for rsync - but it just got moved into the rsync handler (which is shared for update \u0026 delete)","commit_id":"f6493c131d988e07e773906db2a86528900d63fb"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5488da619a51bb648f02b649b74a17daf83fd231","unresolved":false,"context_lines":[{"line_number":704,"context_line":"                            node[\u0027device\u0027], job[\u0027partition\u0027], \u0027REPLICATE\u0027,"},{"line_number":705,"context_line":"                            \u0027/\u0027 + \u0027-\u0027.join(suffixes),"},{"line_number":706,"context_line":"                            headers\u003dheaders)"},{"line_number":707,"context_line":"                        conn.getresponse().read()"},{"line_number":708,"context_line":"                    if not success:"},{"line_number":709,"context_line":"                        failure_devs_info.add((node[\u0027replication_ip\u0027],"},{"line_number":710,"context_line":"                                               node[\u0027device\u0027]))"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f621f24_fe8a7e67","side":"PARENT","line":707,"updated":"2020-11-09 18:14:29.000000000","message":"it was NOT obvious to me we could rmove this after a sync - but it was just moved to rsync (since it\u0027s not needed after an ssync!)","commit_id":"f6493c131d988e07e773906db2a86528900d63fb"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5488da619a51bb648f02b649b74a17daf83fd231","unresolved":false,"context_lines":[{"line_number":469,"context_line":"        # TODO: Catch and swallow (or at least minimize) timeouts when doing"},{"line_number":470,"context_line":"        # an update job; if we don\u0027t manage to notify the remote, we should"},{"line_number":471,"context_line":"        # catch it on the next pass"},{"line_number":472,"context_line":"        if success or not job[\u0027delete\u0027]:"},{"line_number":473,"context_line":"            headers \u003d dict(self.default_headers)"},{"line_number":474,"context_line":"            headers[\u0027X-Backend-Storage-Policy-Index\u0027] \u003d int(job[\u0027policy\u0027])"},{"line_number":475,"context_line":"            with Timeout(self.http_timeout):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f621f24_7edb0e7b","line":472,"updated":"2020-11-09 18:14:29.000000000","message":"the phrasing on this if is hard for me to follow.\n\nANY success, but also an \"update failure\" would try to rehash?  apparently delete failure was already NOT doing a rehash because we\u0027ll have to try and rsync the handoff part again next pass...","commit_id":"be52b8b3383611c5dae545dff0318dae66bb1c32"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5488da619a51bb648f02b649b74a17daf83fd231","unresolved":false,"context_lines":[{"line_number":477,"context_line":"                    node[\u0027replication_ip\u0027], node[\u0027replication_port\u0027],"},{"line_number":478,"context_line":"                    node[\u0027device\u0027], job[\u0027partition\u0027], \u0027REPLICATE\u0027,"},{"line_number":479,"context_line":"                    \u0027/\u0027 + \u0027-\u0027.join(suffixes), headers\u003dheaders)"},{"line_number":480,"context_line":"                conn.getresponse().read()"},{"line_number":481,"context_line":"        return success, {}"},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"    def ssync(self, node, job, suffixes, remote_check_objs\u003dNone):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f621f24_3e81964b","line":480,"updated":"2020-11-09 18:14:29.000000000","message":"oh i see - we moved this into rsync!","commit_id":"be52b8b3383611c5dae545dff0318dae66bb1c32"}],"test/unit/obj/test_reconstructor.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5488da619a51bb648f02b649b74a17daf83fd231","unresolved":false,"context_lines":[{"line_number":1162,"context_line":"        ssync_calls \u003d []"},{"line_number":1163,"context_line":"        with mock.patch(\u0027swift.obj.reconstructor.ssync_sender\u0027,"},{"line_number":1164,"context_line":"                        self._make_fake_ssync(ssync_calls)), \\"},{"line_number":1165,"context_line":"                mocked_http_conn(*[200] * 6, body\u003dpickle.dumps({})), \\"},{"line_number":1166,"context_line":"                mock.patch.object("},{"line_number":1167,"context_line":"                    self.reconstructor, \u0027delete_reverted_objs\u0027) as mock_delete:"},{"line_number":1168,"context_line":"            self.reconstructor.reconstruct()"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f621f24_3e44f61a","line":1165,"updated":"2020-11-09 18:14:29.000000000","message":"this is really great to see - big efficiency improvement here!","commit_id":"be52b8b3383611c5dae545dff0318dae66bb1c32"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1671a9249760b56356ec13e8c6ef63bc766386d4","unresolved":false,"context_lines":[{"line_number":1253,"context_line":"        # same jobs"},{"line_number":1254,"context_line":"        self.assertEqual(len(captured_ssync), 2)"},{"line_number":1255,"context_line":"        # but this time we rehash at the end"},{"line_number":1256,"context_line":"        expected_suffix_calls \u003d []"},{"line_number":1257,"context_line":"        for context in captured_ssync:"},{"line_number":1258,"context_line":"            if not context[\u0027success\u0027]:"},{"line_number":1259,"context_line":"                # only successful jobs generate suffix rehash calls"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f621f24_ec5caaee","line":1256,"updated":"2020-11-06 23:55:17.000000000","message":"pep8: F841 local variable \u0027expected_suffix_calls\u0027 is assigned to but never used","commit_id":"be52b8b3383611c5dae545dff0318dae66bb1c32"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1671a9249760b56356ec13e8c6ef63bc766386d4","unresolved":false,"context_lines":[{"line_number":1258,"context_line":"            if not context[\u0027success\u0027]:"},{"line_number":1259,"context_line":"                # only successful jobs generate suffix rehash calls"},{"line_number":1260,"context_line":"                continue"},{"line_number":1261,"context_line":"            job \u003d context[\u0027job\u0027]"},{"line_number":1262,"context_line":"        self.assertFalse("},{"line_number":1263,"context_line":"            self.logger.get_lines_for_level(\u0027error\u0027))"},{"line_number":1264,"context_line":"        # handoffs are cleaned up"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f621f24_4c75de63","line":1261,"updated":"2020-11-06 23:55:17.000000000","message":"pep8: F841 local variable \u0027job\u0027 is assigned to but never used","commit_id":"be52b8b3383611c5dae545dff0318dae66bb1c32"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1671a9249760b56356ec13e8c6ef63bc766386d4","unresolved":false,"context_lines":[{"line_number":1341,"context_line":""},{"line_number":1342,"context_line":"        # N.B. the partition directory is removed next pass"},{"line_number":1343,"context_line":"        ssync_calls \u003d []"},{"line_number":1344,"context_line":"        with mocked_http_conn() as request_log:"},{"line_number":1345,"context_line":"            with mock.patch(\u0027swift.obj.reconstructor.ssync_sender\u0027,"},{"line_number":1346,"context_line":"                            self._make_fake_ssync(ssync_calls)):"},{"line_number":1347,"context_line":"                self.reconstructor.reconstruct(override_partitions\u003d[2])"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f621f24_2c72227c","line":1344,"updated":"2020-11-06 23:55:17.000000000","message":"pep8: F841 local variable \u0027request_log\u0027 is assigned to but never used","commit_id":"be52b8b3383611c5dae545dff0318dae66bb1c32"}],"test/unit/obj/test_replicator.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5488da619a51bb648f02b649b74a17daf83fd231","unresolved":false,"context_lines":[{"line_number":2015,"context_line":"                node[\u0027replication_ip\u0027],"},{"line_number":2016,"context_line":"                node[\u0027replication_port\u0027], node[\u0027device\u0027],"},{"line_number":2017,"context_line":"                repl_job[\u0027partition\u0027], \u0027REPLICATE\u0027,"},{"line_number":2018,"context_line":"                \u0027/a83\u0027, headers\u003dself.headers))"},{"line_number":2019,"context_line":"        mock_http.assert_has_calls(reqs, any_order\u003dTrue)"},{"line_number":2020,"context_line":""},{"line_number":2021,"context_line":"    @mock.patch(\u0027swift.obj.replicator.tpool.execute\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f621f24_9e96ea4b","side":"PARENT","line":2018,"updated":"2020-11-09 18:14:29.000000000","message":"is this no longer needed for ssync OR rsync?!\n\n\t(Pdb) l\n\t2006B\t        set_default(self)\n\t2007 \t        # with only one set of headers make sure we specify index 0 here\n\t2008 \t        # as otherwise it may be different from earlier tests\n\t2009 \t        self.headers[\u0027X-Backend-Storage-Policy-Index\u0027] \u003d 0\n\t2010 \t        self.replicator.update(repl_job)\n\t2011 -\u003e\t        reqs \u003d []\n\t2012 \t        for node in repl_job[\u0027nodes\u0027]:\n\t2013 \t            reqs.append(mock.call(node[\u0027replication_ip\u0027],\n\t2014 \t                                  node[\u0027replication_port\u0027], node[\u0027device\u0027],\n\t2015 \t                                  repl_job[\u0027partition\u0027], \u0027REPLICATE\u0027,\n\t2016 \t                                  \u0027\u0027, headers\u003dself.headers))\n\t(Pdb) self.replicator.sync_method\n\t\u003cbound method ObjectReplicator.rsync of \u003cswift.obj.replicator.ObjectReplicator object at 0x7fd9bbdb4e10\u003e\u003e","commit_id":"f6493c131d988e07e773906db2a86528900d63fb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"59a9d90ae5f587b623edafbd469827e9570c29cb","unresolved":false,"context_lines":[{"line_number":2015,"context_line":"                node[\u0027replication_ip\u0027],"},{"line_number":2016,"context_line":"                node[\u0027replication_port\u0027], node[\u0027device\u0027],"},{"line_number":2017,"context_line":"                repl_job[\u0027partition\u0027], \u0027REPLICATE\u0027,"},{"line_number":2018,"context_line":"                \u0027/a83\u0027, headers\u003dself.headers))"},{"line_number":2019,"context_line":"        mock_http.assert_has_calls(reqs, any_order\u003dTrue)"},{"line_number":2020,"context_line":""},{"line_number":2021,"context_line":"    @mock.patch(\u0027swift.obj.replicator.tpool.execute\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f621f24_3481b74b","side":"PARENT","line":2018,"in_reply_to":"1f621f24_9e96ea4b","updated":"2020-11-09 20:38:42.000000000","message":"Yeah, that\u0027s \u0027cause the rsync() function took on the responsibility...","commit_id":"f6493c131d988e07e773906db2a86528900d63fb"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5488da619a51bb648f02b649b74a17daf83fd231","unresolved":false,"context_lines":[{"line_number":1974,"context_line":"        # Efficient Replication Case"},{"line_number":1975,"context_line":"        set_default(self)"},{"line_number":1976,"context_line":"        self.replicator.sync \u003d fake_func \u003d \\"},{"line_number":1977,"context_line":"            mock.MagicMock(return_value\u003d(True, []))"},{"line_number":1978,"context_line":"        all_jobs \u003d self.replicator.collect_jobs()"},{"line_number":1979,"context_line":"        job \u003d None"},{"line_number":1980,"context_line":"        for tmp in all_jobs:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f621f24_deeea2eb","line":1977,"updated":"2020-11-09 18:14:29.000000000","message":"it sure *seems* like this test is working with ssync - but I cna\u0027t see where that\u0027s getting set?!","commit_id":"be52b8b3383611c5dae545dff0318dae66bb1c32"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1671a9249760b56356ec13e8c6ef63bc766386d4","unresolved":false,"context_lines":[{"line_number":2052,"context_line":"        _m_rsync \u003d mock.Mock(return_value\u003d0)"},{"line_number":2053,"context_line":"        _m_os_path_exists \u003d mock.Mock(return_value\u003dTrue)"},{"line_number":2054,"context_line":"        expected_reqs \u003d []"},{"line_number":2055,"context_line":"        self.maxDiff\u003d0"},{"line_number":2056,"context_line":"        with mock.patch.object(self.replicator, \u0027_rsync\u0027, _m_rsync), \\"},{"line_number":2057,"context_line":"                mock.patch(\u0027os.path.exists\u0027, _m_os_path_exists), \\"},{"line_number":2058,"context_line":"                mocked_http_conn("}],"source_content_type":"text/x-python","patch_set":1,"id":"1f621f24_8c6b7683","line":2055,"updated":"2020-11-06 23:55:17.000000000","message":"pep8: E225 missing whitespace around operator","commit_id":"be52b8b3383611c5dae545dff0318dae66bb1c32"}]}
