)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8da51095f5121a7e362f82e7107eaf7d241a1123","unresolved":false,"context_lines":[{"line_number":12,"context_line":"Later in ssync_receiver we\u0027d bump into the ValueError converting \u0027None\u0027"},{"line_number":13,"context_line":"to an int (again)."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"In ssyc_sender we now handle literal None\u0027s correctly and should"},{"line_number":16,"context_line":"hopefully no longer put this invalid headers on the wire - but for belts"},{"line_number":17,"context_line":"and braces we\u0027ll also update ssync_receiver to raise a 400 series error"},{"line_number":18,"context_line":"and ssync_sender to better log the error messages."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"da20952f_e0718245","line":15,"updated":"2015-09-03 15:29:53.000000000","message":"typo: ssync_sender","commit_id":"000a4707f78ae8d752a64556d463565f2db9c6c2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd4132d97ca83624ae272d2ab2058ba6af61e385","unresolved":false,"context_lines":[{"line_number":12,"context_line":"Later in ssync_receiver we\u0027d bump into the ValueError converting \u0027None\u0027"},{"line_number":13,"context_line":"to an int (again)."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"In ssyc_sender we now handle literal None\u0027s correctly and should"},{"line_number":16,"context_line":"hopefully no longer put this invalid headers on the wire - but for belts"},{"line_number":17,"context_line":"and braces we\u0027ll also update ssync_receiver to raise a 400 series error"},{"line_number":18,"context_line":"and ssync_sender to better log the error messages."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"da20952f_75610c11","line":15,"in_reply_to":"da20952f_e0718245","updated":"2015-09-08 21:42:51.000000000","message":"Done","commit_id":"000a4707f78ae8d752a64556d463565f2db9c6c2"}],"swift/obj/ssync_receiver.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"323fd8f6d26583d52df92803045f6caf8fca6203","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        self.device, self.partition, self.policy \u003d \\"},{"line_number":158,"context_line":"            request_helpers.get_name_and_placement(self.request, 2, 2, False)"},{"line_number":159,"context_line":"        self.frag_index \u003d self.node_index \u003d None"},{"line_number":160,"context_line":"        if self.request.headers.get(\u0027X-Backend-Ssync-Frag-Index\u0027) !\u003d \u0027None\u0027:"},{"line_number":161,"context_line":"            self.frag_index \u003d int("},{"line_number":162,"context_line":"                self.request.headers[\u0027X-Backend-Ssync-Frag-Index\u0027])"},{"line_number":163,"context_line":"        if self.request.headers.get(\u0027X-Backend-Ssync-Node-Index\u0027) !\u003d \u0027None\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da20952f_ea642ee6","line":160,"updated":"2015-08-27 18:25:18.000000000","message":"This can\u0027t be correct - what about when the header is the empty string?","commit_id":"6d311d58d0e2cf8a5e001efe4af9d6d4f9a81170"}],"swift/obj/ssync_sender.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"06b9cf1865c7c801040869a6b85364e73660ebac","unresolved":false,"context_lines":[{"line_number":134,"context_line":"            # will be rebuilding them"},{"line_number":135,"context_line":"            frag_index \u003d self.node.get(\u0027index\u0027, self.job.get(\u0027frag_index\u0027))"},{"line_number":136,"context_line":"            if frag_index is None:"},{"line_number":137,"context_line":"                # replication jobs will not have a frag_index key; revert jobs"},{"line_number":138,"context_line":"                # with only tombstones will a frag_index key explicitly set to"},{"line_number":139,"context_line":"                # the value of None - in both cases on the wire we write the"},{"line_number":140,"context_line":"                # empty string which ssync_reciever will translate to None"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_1ce8b0e1","line":137,"updated":"2015-09-03 15:29:06.000000000","message":"do you mean revert jobs or reconstructor jobs? can we have a sync job with only tombstones?","commit_id":"000a4707f78ae8d752a64556d463565f2db9c6c2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd4132d97ca83624ae272d2ab2058ba6af61e385","unresolved":false,"context_lines":[{"line_number":134,"context_line":"            # will be rebuilding them"},{"line_number":135,"context_line":"            frag_index \u003d self.node.get(\u0027index\u0027, self.job.get(\u0027frag_index\u0027))"},{"line_number":136,"context_line":"            if frag_index is None:"},{"line_number":137,"context_line":"                # replication jobs will not have a frag_index key; revert jobs"},{"line_number":138,"context_line":"                # with only tombstones will a frag_index key explicitly set to"},{"line_number":139,"context_line":"                # the value of None - in both cases on the wire we write the"},{"line_number":140,"context_line":"                # empty string which ssync_reciever will translate to None"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_557088dc","line":137,"in_reply_to":"da20952f_1ce8b0e1","updated":"2015-09-08 21:42:51.000000000","message":"Done","commit_id":"000a4707f78ae8d752a64556d463565f2db9c6c2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"06b9cf1865c7c801040869a6b85364e73660ebac","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            frag_index \u003d self.node.get(\u0027index\u0027, self.job.get(\u0027frag_index\u0027))"},{"line_number":136,"context_line":"            if frag_index is None:"},{"line_number":137,"context_line":"                # replication jobs will not have a frag_index key; revert jobs"},{"line_number":138,"context_line":"                # with only tombstones will a frag_index key explicitly set to"},{"line_number":139,"context_line":"                # the value of None - in both cases on the wire we write the"},{"line_number":140,"context_line":"                # empty string which ssync_reciever will translate to None"},{"line_number":141,"context_line":"                frag_index \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_7cf68cfa","line":138,"updated":"2015-09-03 15:29:06.000000000","message":"nit s/will a/will have a/","commit_id":"000a4707f78ae8d752a64556d463565f2db9c6c2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd4132d97ca83624ae272d2ab2058ba6af61e385","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            frag_index \u003d self.node.get(\u0027index\u0027, self.job.get(\u0027frag_index\u0027))"},{"line_number":136,"context_line":"            if frag_index is None:"},{"line_number":137,"context_line":"                # replication jobs will not have a frag_index key; revert jobs"},{"line_number":138,"context_line":"                # with only tombstones will a frag_index key explicitly set to"},{"line_number":139,"context_line":"                # the value of None - in both cases on the wire we write the"},{"line_number":140,"context_line":"                # empty string which ssync_reciever will translate to None"},{"line_number":141,"context_line":"                frag_index \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_b57fa4aa","line":138,"in_reply_to":"da20952f_7cf68cfa","updated":"2015-09-08 21:42:51.000000000","message":"Done","commit_id":"000a4707f78ae8d752a64556d463565f2db9c6c2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"06b9cf1865c7c801040869a6b85364e73660ebac","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                # replication jobs will not have a frag_index key; revert jobs"},{"line_number":138,"context_line":"                # with only tombstones will a frag_index key explicitly set to"},{"line_number":139,"context_line":"                # the value of None - in both cases on the wire we write the"},{"line_number":140,"context_line":"                # empty string which ssync_reciever will translate to None"},{"line_number":141,"context_line":"                frag_index \u003d \u0027\u0027"},{"line_number":142,"context_line":"            self.connection.putheader(\u0027X-Backend-Ssync-Frag-Index\u0027,"},{"line_number":143,"context_line":"                                      frag_index)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_bc2f443d","line":140,"updated":"2015-09-03 15:29:06.000000000","message":"s/ssync_reciever/ssync_receiver/","commit_id":"000a4707f78ae8d752a64556d463565f2db9c6c2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd4132d97ca83624ae272d2ab2058ba6af61e385","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                # replication jobs will not have a frag_index key; revert jobs"},{"line_number":138,"context_line":"                # with only tombstones will a frag_index key explicitly set to"},{"line_number":139,"context_line":"                # the value of None - in both cases on the wire we write the"},{"line_number":140,"context_line":"                # empty string which ssync_reciever will translate to None"},{"line_number":141,"context_line":"                frag_index \u003d \u0027\u0027"},{"line_number":142,"context_line":"            self.connection.putheader(\u0027X-Backend-Ssync-Frag-Index\u0027,"},{"line_number":143,"context_line":"                                      frag_index)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_d57c98b7","line":140,"in_reply_to":"da20952f_bc2f443d","updated":"2015-09-08 21:42:51.000000000","message":"Done","commit_id":"000a4707f78ae8d752a64556d463565f2db9c6c2"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"323fd8f6d26583d52df92803045f6caf8fca6203","unresolved":false,"context_lines":[{"line_number":4672,"context_line":"        req \u003d Request.blank(\u0027/sda1/0\u0027,"},{"line_number":4673,"context_line":"                            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027SSYNC\u0027,"},{"line_number":4674,"context_line":"                                     \u0027HTTP_X_BACKEND_SSYNC_NODE_INDEX\u0027: \u0027None\u0027,"},{"line_number":4675,"context_line":"                                     \u0027HTTP_X_BACKEND_SSYNC_FRAG_INDEX\u0027: \u0027None\u0027,"},{"line_number":4676,"context_line":"                                     },"},{"line_number":4677,"context_line":"                            headers\u003d{})"},{"line_number":4678,"context_line":"        resp \u003d req.get_response(self.object_controller)"}],"source_content_type":"text/x-python","patch_set":1,"id":"da20952f_cade0a6d","line":4675,"updated":"2015-08-27 18:25:18.000000000","message":"we should never put this on the wire.  It seems reasonable to make ssync_receiver robust to getting this invalid request, and we could even have a test_ssync_receiver_will_reject_totally_bogus_header_values - but if there\u0027s a bug it\u0027s letting \u0027None\u0027 onto the wire, and having to update a bunch of tests to simulate this bad request under normal operations is pointing at doing it wrong.","commit_id":"6d311d58d0e2cf8a5e001efe4af9d6d4f9a81170"}],"test/unit/obj/test_ssync_receiver.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"323fd8f6d26583d52df92803045f6caf8fca6203","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        self.assertEqual(rcvr.node_index, 7)"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"    @unit.patch_policies()"},{"line_number":271,"context_line":"    def test_Receiver_with_no_indexes(self):"},{"line_number":272,"context_line":"        # update router post policy patch"},{"line_number":273,"context_line":"        self.controller._diskfile_router \u003d diskfile.DiskFileRouter("},{"line_number":274,"context_line":"            self.conf, self.controller.logger)"}],"source_content_type":"text/x-python","patch_set":1,"id":"da20952f_2a454616","line":271,"updated":"2015-08-27 18:25:18.000000000","message":"There\u0027s some tests in ssync_sender that validate the calls to putheader when indexes are missing are being sent as \u0027\u0027 as they should be - not \u0027None\u0027.  This test should should be for \"invalid\" indexes - no indexes shouldn\u0027t be sent as \u0027None\u0027.","commit_id":"6d311d58d0e2cf8a5e001efe4af9d6d4f9a81170"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"323fd8f6d26583d52df92803045f6caf8fca6203","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        self.assertEqual("},{"line_number":287,"context_line":"            body_lines,"},{"line_number":288,"context_line":"            [\u0027:MISSING_CHECK: START\u0027, \u0027:MISSING_CHECK: END\u0027,"},{"line_number":289,"context_line":"             \u0027:UPDATES: START\u0027, \u0027:UPDATES: END\u0027])"},{"line_number":290,"context_line":"        self.assertEqual(rcvr.policy, POLICIES[1])"},{"line_number":291,"context_line":"        self.assertEqual(rcvr.frag_index, None)"},{"line_number":292,"context_line":"        self.assertEqual(rcvr.node_index, None)"}],"source_content_type":"text/x-python","patch_set":1,"id":"da20952f_2a13060f","line":289,"updated":"2015-08-27 18:25:18.000000000","message":"This assert is wrong, if we receive and invalid header we should return a bad request.  Valid values for X-Backend-Ssync-Node-Index are either the empty string or a string that .isdigit().","commit_id":"6d311d58d0e2cf8a5e001efe4af9d6d4f9a81170"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"06b9cf1865c7c801040869a6b85364e73660ebac","unresolved":false,"context_lines":[{"line_number":1726,"context_line":"        self.daemon \u003d ObjectReconstructor(self.conf, self.tx_logger)"},{"line_number":1727,"context_line":"        self.daemon._diskfile_mgr \u003d self.daemon._df_router[self.policy]"},{"line_number":1728,"context_line":""},{"line_number":1729,"context_line":"        self.nodes \u003d ["},{"line_number":1730,"context_line":"            {"},{"line_number":1731,"context_line":"                \u0027device\u0027: \u0027sda1\u0027,"},{"line_number":1732,"context_line":"                \u0027ip\u0027: \u0027127.0.0.1\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_7f0c3e3b","line":1729,"updated":"2015-09-03 15:29:06.000000000","message":"this test setup is starting to do similar to unit.obj.test_ssync_sender.TestBaseSsync#setUp\n\ni.e. setup rx port, then node dicts, so that tests can call Sender()\n\nThe new tests added here and the existing under test_ssync_sender.TestBaseSsync are testing end-to-end sender and receiver behavior - i think it would be great to collect then together in a new test_ssync.py module, rather than fragmenting between test_ssync_sender and test_ssync_receiver","commit_id":"000a4707f78ae8d752a64556d463565f2db9c6c2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd4132d97ca83624ae272d2ab2058ba6af61e385","unresolved":false,"context_lines":[{"line_number":1726,"context_line":"        self.daemon \u003d ObjectReconstructor(self.conf, self.tx_logger)"},{"line_number":1727,"context_line":"        self.daemon._diskfile_mgr \u003d self.daemon._df_router[self.policy]"},{"line_number":1728,"context_line":""},{"line_number":1729,"context_line":"        self.nodes \u003d ["},{"line_number":1730,"context_line":"            {"},{"line_number":1731,"context_line":"                \u0027device\u0027: \u0027sda1\u0027,"},{"line_number":1732,"context_line":"                \u0027ip\u0027: \u0027127.0.0.1\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_954dc09b","line":1729,"in_reply_to":"da20952f_7f0c3e3b","updated":"2015-09-08 21:42:51.000000000","message":"good call for followup","commit_id":"000a4707f78ae8d752a64556d463565f2db9c6c2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"06b9cf1865c7c801040869a6b85364e73660ebac","unresolved":false,"context_lines":[{"line_number":1785,"context_line":"        # sanity check that the receiver did not proceed to missing_check"},{"line_number":1786,"context_line":"        self.assertFalse(mock_missing_check.called)"},{"line_number":1787,"context_line":""},{"line_number":1788,"context_line":"    def test_sender_job_missing_frag_node_indexes(self):"},{"line_number":1789,"context_line":"        # replication jobs don\u0027t send frag_index, so we\u0027ll use a REPL_POLICY"},{"line_number":1790,"context_line":"        repl_policy \u003d POLICIES[1]"},{"line_number":1791,"context_line":"        self.assertEqual(repl_policy.policy_type, REPL_POLICY)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_3436e4e7","line":1788,"updated":"2015-09-03 15:29:06.000000000","message":"I think this is *almost* covered by test.unit.obj.test_ssync.TestSsyncReplication#test_sync except here you do not set a node index - is that because a replication job may be to a handoff which would therefore not have a node index?\n\nI think we could just remove node index from the other test to achieve same.","commit_id":"000a4707f78ae8d752a64556d463565f2db9c6c2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd4132d97ca83624ae272d2ab2058ba6af61e385","unresolved":false,"context_lines":[{"line_number":1785,"context_line":"        # sanity check that the receiver did not proceed to missing_check"},{"line_number":1786,"context_line":"        self.assertFalse(mock_missing_check.called)"},{"line_number":1787,"context_line":""},{"line_number":1788,"context_line":"    def test_sender_job_missing_frag_node_indexes(self):"},{"line_number":1789,"context_line":"        # replication jobs don\u0027t send frag_index, so we\u0027ll use a REPL_POLICY"},{"line_number":1790,"context_line":"        repl_policy \u003d POLICIES[1]"},{"line_number":1791,"context_line":"        self.assertEqual(repl_policy.policy_type, REPL_POLICY)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_f8ad11eb","line":1788,"in_reply_to":"da20952f_3436e4e7","updated":"2015-09-08 21:42:51.000000000","message":"followup","commit_id":"000a4707f78ae8d752a64556d463565f2db9c6c2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"06b9cf1865c7c801040869a6b85364e73660ebac","unresolved":false,"context_lines":[{"line_number":1824,"context_line":"        self.assertTrue(remote_df._datadir.startswith(self.rx_devices))"},{"line_number":1825,"context_line":"        self.assertEqual(remote_df.read_metadata(), metadata)"},{"line_number":1826,"context_line":""},{"line_number":1827,"context_line":"    def test_send_send_frag_index_none(self):"},{"line_number":1828,"context_line":"        # create an ec fragment on the remote node"},{"line_number":1829,"context_line":"        device \u003d self.nodes[1][\u0027device\u0027]"},{"line_number":1830,"context_line":"        remote_df \u003d self.rx_app._diskfile_router[self.policy].get_diskfile("}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_df6781b5","line":1827,"updated":"2015-09-03 15:29:06.000000000","message":"could move to a common ssync test module (see comment above)","commit_id":"000a4707f78ae8d752a64556d463565f2db9c6c2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd4132d97ca83624ae272d2ab2058ba6af61e385","unresolved":false,"context_lines":[{"line_number":1824,"context_line":"        self.assertTrue(remote_df._datadir.startswith(self.rx_devices))"},{"line_number":1825,"context_line":"        self.assertEqual(remote_df.read_metadata(), metadata)"},{"line_number":1826,"context_line":""},{"line_number":1827,"context_line":"    def test_send_send_frag_index_none(self):"},{"line_number":1828,"context_line":"        # create an ec fragment on the remote node"},{"line_number":1829,"context_line":"        device \u003d self.nodes[1][\u0027device\u0027]"},{"line_number":1830,"context_line":"        remote_df \u003d self.rx_app._diskfile_router[self.policy].get_diskfile("}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_d8b4cd36","line":1827,"in_reply_to":"da20952f_df6781b5","updated":"2015-09-08 21:42:51.000000000","message":"followup","commit_id":"000a4707f78ae8d752a64556d463565f2db9c6c2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"06b9cf1865c7c801040869a6b85364e73660ebac","unresolved":false,"context_lines":[{"line_number":1860,"context_line":"        success, _ \u003d sender()"},{"line_number":1861,"context_line":"        self.assertTrue(success)"},{"line_number":1862,"context_line":"        # sanity tombstone is synced to receiver"},{"line_number":1863,"context_line":"        self.assertTrue(remote_df._datadir.startswith(self.rx_devices))"},{"line_number":1864,"context_line":"        try:"},{"line_number":1865,"context_line":"            remote_df.read_metadata()"},{"line_number":1866,"context_line":"        except exceptions.DiskFileDeleted as e:"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_3f579d03","line":1863,"updated":"2015-09-03 15:29:06.000000000","message":"I don\u0027t understand this comment/assertion","commit_id":"000a4707f78ae8d752a64556d463565f2db9c6c2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd4132d97ca83624ae272d2ab2058ba6af61e385","unresolved":false,"context_lines":[{"line_number":1860,"context_line":"        success, _ \u003d sender()"},{"line_number":1861,"context_line":"        self.assertTrue(success)"},{"line_number":1862,"context_line":"        # sanity tombstone is synced to receiver"},{"line_number":1863,"context_line":"        self.assertTrue(remote_df._datadir.startswith(self.rx_devices))"},{"line_number":1864,"context_line":"        try:"},{"line_number":1865,"context_line":"            remote_df.read_metadata()"},{"line_number":1866,"context_line":"        except exceptions.DiskFileDeleted as e:"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_7880214a","line":1863,"in_reply_to":"da20952f_3f579d03","updated":"2015-09-08 21:42:51.000000000","message":"Done","commit_id":"000a4707f78ae8d752a64556d463565f2db9c6c2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"06b9cf1865c7c801040869a6b85364e73660ebac","unresolved":false,"context_lines":[{"line_number":1868,"context_line":"        else:"},{"line_number":1869,"context_line":"            self.fail(\u0027Successfully opened remote DiskFile\u0027)"},{"line_number":1870,"context_line":""},{"line_number":1871,"context_line":"    def test_send_invalid_frag_node_indexes(self):"},{"line_number":1872,"context_line":"        job \u003d {"},{"line_number":1873,"context_line":"            \u0027frag_index\u0027: \u0027None\u0027,"},{"line_number":1874,"context_line":"            \u0027partition\u0027: 0,"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_d1c8da76","line":1871,"updated":"2015-09-03 15:29:06.000000000","message":"so this is actually testing only invalid frag index, because the node index doesn\u0027t get set.\n\nprobably needs two tests - one for a non-number string frag-index, another for node index being None","commit_id":"000a4707f78ae8d752a64556d463565f2db9c6c2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd4132d97ca83624ae272d2ab2058ba6af61e385","unresolved":false,"context_lines":[{"line_number":1868,"context_line":"        else:"},{"line_number":1869,"context_line":"            self.fail(\u0027Successfully opened remote DiskFile\u0027)"},{"line_number":1870,"context_line":""},{"line_number":1871,"context_line":"    def test_send_invalid_frag_node_indexes(self):"},{"line_number":1872,"context_line":"        job \u003d {"},{"line_number":1873,"context_line":"            \u0027frag_index\u0027: \u0027None\u0027,"},{"line_number":1874,"context_line":"            \u0027partition\u0027: 0,"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_d8e28d2f","line":1871,"in_reply_to":"da20952f_d1c8da76","updated":"2015-09-08 21:42:51.000000000","message":"yeah this test is bs, a node\u0027s index should never be None","commit_id":"000a4707f78ae8d752a64556d463565f2db9c6c2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"06b9cf1865c7c801040869a6b85364e73660ebac","unresolved":false,"context_lines":[{"line_number":1876,"context_line":"            \u0027device\u0027: self.nodes[0][\u0027device\u0027],"},{"line_number":1877,"context_line":"        }"},{"line_number":1878,"context_line":"        node \u003d dict(self.nodes[0])"},{"line_number":1879,"context_line":"        node[\u0027index\u0027] \u003d None"},{"line_number":1880,"context_line":"        sender \u003d ssync_sender.Sender("},{"line_number":1881,"context_line":"            self.daemon, self.nodes[0], job, [\u0027abc\u0027])"},{"line_number":1882,"context_line":"        success, _ \u003d sender()"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_8eeebd89","line":1879,"updated":"2015-09-03 15:29:06.000000000","message":"node doesn\u0027t get used, still passing self.nodes[0] to sender","commit_id":"000a4707f78ae8d752a64556d463565f2db9c6c2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd4132d97ca83624ae272d2ab2058ba6af61e385","unresolved":false,"context_lines":[{"line_number":1876,"context_line":"            \u0027device\u0027: self.nodes[0][\u0027device\u0027],"},{"line_number":1877,"context_line":"        }"},{"line_number":1878,"context_line":"        node \u003d dict(self.nodes[0])"},{"line_number":1879,"context_line":"        node[\u0027index\u0027] \u003d None"},{"line_number":1880,"context_line":"        sender \u003d ssync_sender.Sender("},{"line_number":1881,"context_line":"            self.daemon, self.nodes[0], job, [\u0027abc\u0027])"},{"line_number":1882,"context_line":"        success, _ \u003d sender()"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_78cee1b8","line":1879,"in_reply_to":"da20952f_8eeebd89","updated":"2015-09-08 21:42:51.000000000","message":"you\u0027re right!  so what was causing the 400!?  oh - the \u0027frag_index\u0027 being a literal string \u0027None\u0027 - that\u0027s kinda janky.  Probably do need two tests.\n\nOne should check that the wire protocol responds with the 400, and another test should mock the receiver and validate the sender spews a log-line when it gets the non-200 response.\n\nI think i was just being lazy.\n\n#willfix","commit_id":"000a4707f78ae8d752a64556d463565f2db9c6c2"}]}
