)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c0b2d65294fd21c88e75956a354c04b94da27831","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix stats calculation in object-reconstructor"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch fixes the object-reconstructor to calulate device_count"},{"line_number":10,"context_line":"as the total number of local devices in all policies. Previously"},{"line_number":11,"context_line":"Swift counts it for each policy but reconstruction_device_count"},{"line_number":12,"context_line":"which means the number of devices actually swift needs to reconstruct"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"9a629dbe_27d8861d","line":9,"updated":"2016-11-14 15:53:58.000000000","message":"s/calulate/calculate/","commit_id":"c2d96c1445d576af472d31a3bb80c6eb53423e1b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c0b2d65294fd21c88e75956a354c04b94da27831","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"With this patch, Swift will gather all local devices for all policies"},{"line_number":17,"context_line":"at first, and then, collect parts for each devices as well as current."},{"line_number":18,"context_line":"To do so, we can see the statues for remaining job/disks parcentage via"},{"line_number":19,"context_line":"stats_line output."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: Ic7a4c932b59158d21a5fb4de9ed3ed57f249d068"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"9a629dbe_0749c2d0","line":18,"updated":"2016-11-14 15:53:58.000000000","message":"nits: s/statues/statuses/   s/parcentage/percentage/","commit_id":"c2d96c1445d576af472d31a3bb80c6eb53423e1b"}],"swift/obj/reconstructor.py":[{"author":{"_account_id":18639,"name":"Marek Kaleta","email":"mk@m1k.cz","username":"mara"},"change_message_id":"56aece307128546db74c6aabb2114ca06e71f522","unresolved":false,"context_lines":[{"line_number":807,"context_line":"                policy.object_ring.devs))"},{"line_number":808,"context_line":""},{"line_number":809,"context_line":"            if override_devices:"},{"line_number":810,"context_line":"                self.device_count +\u003d len(override_devices)"},{"line_number":811,"context_line":"            else:"},{"line_number":812,"context_line":"                self.device_count +\u003d len(local_devices)"},{"line_number":813,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5aef4532_bbdb794e","line":810,"updated":"2016-03-10 07:49:22.000000000","message":"In case there are override_devices which are not local_devices for policy, this will give inaccurate results","commit_id":"5231ad2b98e15ec947790840f195ad3d2f6ae836"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"11ba906dd64b6b228f7e68806f95162a95407dd0","unresolved":false,"context_lines":[{"line_number":807,"context_line":"                policy.object_ring.devs))"},{"line_number":808,"context_line":""},{"line_number":809,"context_line":"            if override_devices:"},{"line_number":810,"context_line":"                self.device_count +\u003d len(override_devices)"},{"line_number":811,"context_line":"            else:"},{"line_number":812,"context_line":"                self.device_count +\u003d len(local_devices)"},{"line_number":813,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5aef4532_1d8066f4","line":810,"in_reply_to":"5aef4532_bbdb794e","updated":"2016-03-10 10:16:25.000000000","message":"Oh, really good catch!\n\nAnd while I was reading the older patches around those changes, I noticed current calculation algorithm is not effective for output lines because device_count will be increasing if we have multiple EC policies. I will make more changes around those for-loop.\n\nThanks for helping to notice that, awesome!","commit_id":"5231ad2b98e15ec947790840f195ad3d2f6ae836"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c0b2d65294fd21c88e75956a354c04b94da27831","unresolved":false,"context_lines":[{"line_number":819,"context_line":"                    local_devices)"},{"line_number":820,"context_line":""},{"line_number":821,"context_line":"            policy2devices[policy] \u003d local_devices"},{"line_number":822,"context_line":"            self.device_count +\u003d len(local_devices)"},{"line_number":823,"context_line":""},{"line_number":824,"context_line":"        for policy, local_devices in policy2devices.items():"},{"line_number":825,"context_line":"            df_mgr \u003d self._df_router[policy]"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a629dbe_e7692e27","line":822,"updated":"2016-11-14 15:53:58.000000000","message":"ok so now the number of device_count is sum of all devices in all policies, including any repeated devices.","commit_id":"c2d96c1445d576af472d31a3bb80c6eb53423e1b"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"1c6ed51acf80c426be17b1862548d33e0b1d26c1","unresolved":false,"context_lines":[{"line_number":801,"context_line":"        override_partitions \u003d override_partitions or []"},{"line_number":802,"context_line":"        ips \u003d whataremyips(self.bind_ip)"},{"line_number":803,"context_line":"        ec_policies \u003d ["},{"line_number":804,"context_line":"            policy for policy in POLICIES if policy.policy_type \u003d\u003d EC_POLICY]"},{"line_number":805,"context_line":""},{"line_number":806,"context_line":"        policy2devices \u003d {}"},{"line_number":807,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_ba52f3db","line":804,"updated":"2016-12-13 01:12:07.000000000","message":"So you\u0027ve in essence turned 1 loop into 3. We could unroll one by turning the list comprehension into generator:\n\n  ec_policies \u003d (policy for policy in POLICIES\n                 if policy.policy_type \u003d\u003d EC_POLICY)","commit_id":"32def9070dac89aec346e03236614661476e4564"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"ca17058aa621a03e75ff58a5f8a3f9f2da114bed","unresolved":false,"context_lines":[{"line_number":801,"context_line":"        override_partitions \u003d override_partitions or []"},{"line_number":802,"context_line":"        ips \u003d whataremyips(self.bind_ip)"},{"line_number":803,"context_line":"        ec_policies \u003d ["},{"line_number":804,"context_line":"            policy for policy in POLICIES if policy.policy_type \u003d\u003d EC_POLICY]"},{"line_number":805,"context_line":""},{"line_number":806,"context_line":"        policy2devices \u003d {}"},{"line_number":807,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_dd69648d","line":804,"in_reply_to":"1a6eadb0_ba52f3db","updated":"2016-12-13 05:27:27.000000000","message":"Done","commit_id":"32def9070dac89aec346e03236614661476e4564"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"1c6ed51acf80c426be17b1862548d33e0b1d26c1","unresolved":false,"context_lines":[{"line_number":814,"context_line":"                policy.object_ring.devs))"},{"line_number":815,"context_line":""},{"line_number":816,"context_line":"            if override_devices:"},{"line_number":817,"context_line":"                local_devices \u003d filter("},{"line_number":818,"context_line":"                    lambda dev_info: dev_info[\u0027device\u0027] in override_devices,"},{"line_number":819,"context_line":"                    local_devices)"},{"line_number":820,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_ba69138e","line":817,"range":{"start_line":817,"start_character":32,"end_line":817,"end_character":39},"updated":"2016-12-13 01:12:07.000000000","message":"Here your using a filter, but previously (on line 810) your using a six.moves.filter. We should probably be consistent.","commit_id":"32def9070dac89aec346e03236614661476e4564"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"ca17058aa621a03e75ff58a5f8a3f9f2da114bed","unresolved":false,"context_lines":[{"line_number":814,"context_line":"                policy.object_ring.devs))"},{"line_number":815,"context_line":""},{"line_number":816,"context_line":"            if override_devices:"},{"line_number":817,"context_line":"                local_devices \u003d filter("},{"line_number":818,"context_line":"                    lambda dev_info: dev_info[\u0027device\u0027] in override_devices,"},{"line_number":819,"context_line":"                    local_devices)"},{"line_number":820,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a6eadb0_bd5588c7","line":817,"range":{"start_line":817,"start_character":32,"end_line":817,"end_character":39},"in_reply_to":"1a6eadb0_ba69138e","updated":"2016-12-13 05:27:27.000000000","message":"Good call. Done.","commit_id":"32def9070dac89aec346e03236614661476e4564"}],"test/unit/obj/test_reconstructor.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"16ad3552351f769ee3f1905c505bcddb89a57f48","unresolved":false,"context_lines":[{"line_number":679,"context_line":"                         ec_ndata\u003d2, ec_nparity\u003d1)])"},{"line_number":680,"context_line":"    def test_run_once_accross_over_policies(self):"},{"line_number":681,"context_line":"        # TODO: this is a too tiny situation so it is needed to make more"},{"line_number":682,"context_line":"        # general test for accross policies"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"        # re-setup to apply patched policies"},{"line_number":685,"context_line":"        orig_testdir \u003d self.testdir"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5da102_78c58f3a","line":682,"updated":"2016-10-29 19:36:00.000000000","message":"I would rather not merge these tests with this TODO","commit_id":"e9cbe81d9f63b868e2f3f59996605c680203afaf"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"69ec4534436d235a84c5e8d49b10a1d70fd92313","unresolved":false,"context_lines":[{"line_number":679,"context_line":"                         ec_ndata\u003d2, ec_nparity\u003d1)])"},{"line_number":680,"context_line":"    def test_run_once_accross_over_policies(self):"},{"line_number":681,"context_line":"        # TODO: this is a too tiny situation so it is needed to make more"},{"line_number":682,"context_line":"        # general test for accross policies"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"        # re-setup to apply patched policies"},{"line_number":685,"context_line":"        orig_testdir \u003d self.testdir"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5da102_9907c21b","line":682,"in_reply_to":"ba5da102_78c58f3a","updated":"2016-10-31 05:56:27.000000000","message":"Done\n\nYour test looks very nice.","commit_id":"e9cbe81d9f63b868e2f3f59996605c680203afaf"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3610fa03d8c52b3584688438fd3b18be43d5851c","unresolved":false,"context_lines":[{"line_number":861,"context_line":"                self.suffixes \u003d suffixes"},{"line_number":862,"context_line":"                self.daemon \u003d daemon"},{"line_number":863,"context_line":"                self.job \u003d job"},{"line_number":864,"context_line":"                hash_gen \u003d self.daemon._df_router[job[\u0027policy\u0027]].yield_hashes("},{"line_number":865,"context_line":"                    self.job[\u0027device\u0027], self.job[\u0027partition\u0027],"},{"line_number":866,"context_line":"                    self.job[\u0027policy\u0027], self.suffixes,"},{"line_number":867,"context_line":"                    frag_index\u003dself.job.get(\u0027frag_index\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba5da102_2e55751c","line":864,"updated":"2016-10-31 21:32:15.000000000","message":"apparently the real ssync_sender makes the same assumption about this attribute, not sure how this is the only hint in tests about this requirement of the reconstructor daemon","commit_id":"ad8402abb1445cbe1c0003cd0edbb075166edbda"}],"test/unit/obj/test_replicator.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5d8d286bec9c8633db8ce430afa10e17a511b420","unresolved":false,"context_lines":[{"line_number":1625,"context_line":"            return 2, {\u0027abc\u0027: \u0027def\u0027}"},{"line_number":1626,"context_line":""},{"line_number":1627,"context_line":"        conf \u003d dict(swift_dir\u003dself.testdir, devices\u003dself.devices,"},{"line_number":1628,"context_line":"                    bind_ips\u003d_ips()[0],"},{"line_number":1629,"context_line":"                    mount_check\u003d\u0027false\u0027, timeout\u003d\u0027300\u0027, stats_interval\u003d\u00271\u0027)"},{"line_number":1630,"context_line":""},{"line_number":1631,"context_line":"        with mock.patch(\u0027swift.obj.diskfile.DiskFileManager._get_hashes\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a74a57a_dccec559","line":1628,"updated":"2016-11-23 16:00:41.000000000","message":"s/bind_ips/bind_ip/","commit_id":"03e121385fbf8273e9b2e34b7cd80c9f25f8e2d3"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"fa021f57c871f181d256b65b884628d1dd44d543","unresolved":false,"context_lines":[{"line_number":1625,"context_line":"            return 2, {\u0027abc\u0027: \u0027def\u0027}"},{"line_number":1626,"context_line":""},{"line_number":1627,"context_line":"        conf \u003d dict(swift_dir\u003dself.testdir, devices\u003dself.devices,"},{"line_number":1628,"context_line":"                    bind_ips\u003d_ips()[0],"},{"line_number":1629,"context_line":"                    mount_check\u003d\u0027false\u0027, timeout\u003d\u0027300\u0027, stats_interval\u003d\u00271\u0027)"},{"line_number":1630,"context_line":""},{"line_number":1631,"context_line":"        with mock.patch(\u0027swift.obj.diskfile.DiskFileManager._get_hashes\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_1f30c4e7","line":1628,"in_reply_to":"5a74a57a_dccec559","updated":"2016-12-05 08:52:04.000000000","message":"Done","commit_id":"03e121385fbf8273e9b2e34b7cd80c9f25f8e2d3"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"7213f4222a64565393c45ac805fabc73a418f417","unresolved":false,"context_lines":[{"line_number":1651,"context_line":"                    ohash \u003d hash_path(\u0027a\u0027, \u0027c\u0027, \u0027o\u0027)"},{"line_number":1652,"context_line":"                    data_dir \u003d ohash[-3:]"},{"line_number":1653,"context_line":"                    self.assertTrue(os.access(os.path.join("},{"line_number":1654,"context_line":"                        self.objects, \u00271\u0027, data_dir, ohash), os.F_OK))"},{"line_number":1655,"context_line":"                    with mock.patch.object("},{"line_number":1656,"context_line":"                            replicator, \u0027sync\u0027,"},{"line_number":1657,"context_line":"                            return_value\u003d(True, {})) as mock_sync:"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_3587c313","line":1654,"range":{"start_line":1654,"start_character":23,"end_line":1654,"end_character":58},"updated":"2016-11-22 02:35:49.000000000","message":"df._datadir???","commit_id":"03e121385fbf8273e9b2e34b7cd80c9f25f8e2d3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5d8d286bec9c8633db8ce430afa10e17a511b420","unresolved":false,"context_lines":[{"line_number":1651,"context_line":"                    ohash \u003d hash_path(\u0027a\u0027, \u0027c\u0027, \u0027o\u0027)"},{"line_number":1652,"context_line":"                    data_dir \u003d ohash[-3:]"},{"line_number":1653,"context_line":"                    self.assertTrue(os.access(os.path.join("},{"line_number":1654,"context_line":"                        self.objects, \u00271\u0027, data_dir, ohash), os.F_OK))"},{"line_number":1655,"context_line":"                    with mock.patch.object("},{"line_number":1656,"context_line":"                            replicator, \u0027sync\u0027,"},{"line_number":1657,"context_line":"                            return_value\u003d(True, {})) as mock_sync:"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a74a57a_4209f52b","line":1654,"range":{"start_line":1654,"start_character":23,"end_line":1654,"end_character":58},"in_reply_to":"7a77a97e_3587c313","updated":"2016-11-23 16:00:41.000000000","message":"Done","commit_id":"03e121385fbf8273e9b2e34b7cd80c9f25f8e2d3"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"7213f4222a64565393c45ac805fabc73a418f417","unresolved":false,"context_lines":[{"line_number":1652,"context_line":"                    data_dir \u003d ohash[-3:]"},{"line_number":1653,"context_line":"                    self.assertTrue(os.access(os.path.join("},{"line_number":1654,"context_line":"                        self.objects, \u00271\u0027, data_dir, ohash), os.F_OK))"},{"line_number":1655,"context_line":"                    with mock.patch.object("},{"line_number":1656,"context_line":"                            replicator, \u0027sync\u0027,"},{"line_number":1657,"context_line":"                            return_value\u003d(True, {})) as mock_sync:"},{"line_number":1658,"context_line":"                        replicator.run_once()"},{"line_number":1659,"context_line":""},{"line_number":1660,"context_line":"        log_lines \u003d replicator.logger.get_lines_for_level(\u0027error\u0027)"},{"line_number":1661,"context_line":"        self.assertIn(\"Error syncing with node:\", log_lines[0])"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_959df75b","line":1658,"range":{"start_line":1655,"start_character":20,"end_line":1658,"end_character":45},"updated":"2016-11-22 02:35:49.000000000","message":"It looks good improvement to reduce the testing time but I\u0027m not sure if we could be ok to do that. Looking at older code, it seems we lost the checks of the args for rsync which was doing via _mock_process and process_arg_checker.\n\nAnd if we can drop the process arg check, probably we can remove L1644-L1654 because the partitions for the jobs are there and the sync will be skipped with mock so no actual object needed here.","commit_id":"03e121385fbf8273e9b2e34b7cd80c9f25f8e2d3"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"fa021f57c871f181d256b65b884628d1dd44d543","unresolved":false,"context_lines":[{"line_number":1652,"context_line":"                    data_dir \u003d ohash[-3:]"},{"line_number":1653,"context_line":"                    self.assertTrue(os.access(os.path.join("},{"line_number":1654,"context_line":"                        self.objects, \u00271\u0027, data_dir, ohash), os.F_OK))"},{"line_number":1655,"context_line":"                    with mock.patch.object("},{"line_number":1656,"context_line":"                            replicator, \u0027sync\u0027,"},{"line_number":1657,"context_line":"                            return_value\u003d(True, {})) as mock_sync:"},{"line_number":1658,"context_line":"                        replicator.run_once()"},{"line_number":1659,"context_line":""},{"line_number":1660,"context_line":"        log_lines \u003d replicator.logger.get_lines_for_level(\u0027error\u0027)"},{"line_number":1661,"context_line":"        self.assertIn(\"Error syncing with node:\", log_lines[0])"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_9f23f4a6","line":1658,"range":{"start_line":1655,"start_character":20,"end_line":1658,"end_character":45},"in_reply_to":"5a74a57a_c276e53d","updated":"2016-12-05 08:52:04.000000000","message":"Done","commit_id":"03e121385fbf8273e9b2e34b7cd80c9f25f8e2d3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5d8d286bec9c8633db8ce430afa10e17a511b420","unresolved":false,"context_lines":[{"line_number":1652,"context_line":"                    data_dir \u003d ohash[-3:]"},{"line_number":1653,"context_line":"                    self.assertTrue(os.access(os.path.join("},{"line_number":1654,"context_line":"                        self.objects, \u00271\u0027, data_dir, ohash), os.F_OK))"},{"line_number":1655,"context_line":"                    with mock.patch.object("},{"line_number":1656,"context_line":"                            replicator, \u0027sync\u0027,"},{"line_number":1657,"context_line":"                            return_value\u003d(True, {})) as mock_sync:"},{"line_number":1658,"context_line":"                        replicator.run_once()"},{"line_number":1659,"context_line":""},{"line_number":1660,"context_line":"        log_lines \u003d replicator.logger.get_lines_for_level(\u0027error\u0027)"},{"line_number":1661,"context_line":"        self.assertIn(\"Error syncing with node:\", log_lines[0])"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a74a57a_c276e53d","line":1658,"range":{"start_line":1655,"start_character":20,"end_line":1658,"end_character":45},"in_reply_to":"7a77a97e_959df75b","updated":"2016-11-23 16:00:41.000000000","message":"_rsync, and therefore the MockProcess, was never being called because the suffix \"abc\" returned by fake_get_hashes does not exist and so the rsync method returns early [1]\n\nI *think* the goal of this test is to verify that the run_once/replicate functions continue to completion despite a timeout occurring for one of the jobs. AFAICT the rsync call_args are checked in test_run_once.\n\n[1] https://github.com/openstack/swift/blob/03e121385fbf8273e9b2e34b7cd80c9f25f8e2d3/swift/obj/replicator.py#L238-L244","commit_id":"03e121385fbf8273e9b2e34b7cd80c9f25f8e2d3"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"7213f4222a64565393c45ac805fabc73a418f417","unresolved":false,"context_lines":[{"line_number":1660,"context_line":"        log_lines \u003d replicator.logger.get_lines_for_level(\u0027error\u0027)"},{"line_number":1661,"context_line":"        self.assertIn(\"Error syncing with node:\", log_lines[0])"},{"line_number":1662,"context_line":"        self.assertFalse(log_lines[1:])"},{"line_number":1663,"context_line":"        # 2 policies * 3 partitions -\u003e 6 replicator.update calls"},{"line_number":1664,"context_line":"        # 2 nodes per update -\u003e normally 12 update sync tasks but one fails due"},{"line_number":1665,"context_line":"        # to fake_get_hashes exception so expect 11."},{"line_number":1666,"context_line":"        self.assertEqual(11, mock_sync.call_count)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a77a97e_55e19fcf","line":1663,"range":{"start_line":1663,"start_character":23,"end_line":1663,"end_character":35},"updated":"2016-11-22 02:35:49.000000000","message":"4 partitions???\n\nAh, ok.\n\nTo say correctly, in the setUp method, we prepared *4* partitions (0, 1, 2, 3) for each test via _write_disk_data method. However, we call *update* method only 3 times because the node _ips()[0] appears only in partition 0, 2, 3 so that partition 1 will be a job for update_delete.\n\nAnyway, I\u0027d add more docs like above to make developer easy to understand the situation.","commit_id":"03e121385fbf8273e9b2e34b7cd80c9f25f8e2d3"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"fa021f57c871f181d256b65b884628d1dd44d543","unresolved":false,"context_lines":[{"line_number":1660,"context_line":"        log_lines \u003d replicator.logger.get_lines_for_level(\u0027error\u0027)"},{"line_number":1661,"context_line":"        self.assertIn(\"Error syncing with node:\", log_lines[0])"},{"line_number":1662,"context_line":"        self.assertFalse(log_lines[1:])"},{"line_number":1663,"context_line":"        # 2 policies * 3 partitions -\u003e 6 replicator.update calls"},{"line_number":1664,"context_line":"        # 2 nodes per update -\u003e normally 12 update sync tasks but one fails due"},{"line_number":1665,"context_line":"        # to fake_get_hashes exception so expect 11."},{"line_number":1666,"context_line":"        self.assertEqual(11, mock_sync.call_count)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a71b18c_9f0cd43c","line":1663,"range":{"start_line":1663,"start_character":23,"end_line":1663,"end_character":35},"in_reply_to":"5a74a57a_d3e79010","updated":"2016-12-05 08:52:04.000000000","message":"The fix for this change looks great! Done.","commit_id":"03e121385fbf8273e9b2e34b7cd80c9f25f8e2d3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5d8d286bec9c8633db8ce430afa10e17a511b420","unresolved":false,"context_lines":[{"line_number":1660,"context_line":"        log_lines \u003d replicator.logger.get_lines_for_level(\u0027error\u0027)"},{"line_number":1661,"context_line":"        self.assertIn(\"Error syncing with node:\", log_lines[0])"},{"line_number":1662,"context_line":"        self.assertFalse(log_lines[1:])"},{"line_number":1663,"context_line":"        # 2 policies * 3 partitions -\u003e 6 replicator.update calls"},{"line_number":1664,"context_line":"        # 2 nodes per update -\u003e normally 12 update sync tasks but one fails due"},{"line_number":1665,"context_line":"        # to fake_get_hashes exception so expect 11."},{"line_number":1666,"context_line":"        self.assertEqual(11, mock_sync.call_count)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a74a57a_d3e79010","line":1663,"range":{"start_line":1663,"start_character":23,"end_line":1663,"end_character":35},"in_reply_to":"7a77a97e_55e19fcf","updated":"2016-11-23 16:00:41.000000000","message":"yes, but my debug shows partition 0,1, 3 are updated and 2 is deleted?? \n\nwhy is part 2 deleted?...see bug at line 1628! bind_ip is defaulting to 127.0.0.1 OMM! will fix that.","commit_id":"03e121385fbf8273e9b2e34b7cd80c9f25f8e2d3"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"52a43d167452e90c6d2ac4df8ee9cdcaee644dd4","unresolved":false,"context_lines":[{"line_number":1635,"context_line":"            if (timeouts and \u0027/objects/\u0027 in part_path and"},{"line_number":1636,"context_line":"                    part_path.endswith(\u00270\u0027) and \u0027recalculate\u0027 in kwargs):"},{"line_number":1637,"context_line":"                raise timeouts.pop(0)"},{"line_number":1638,"context_line":"            return 1, {\u0027abc\u0027: \u0027def\u0027}"},{"line_number":1639,"context_line":""},{"line_number":1640,"context_line":"        # map partition_path -\u003e [nodes]"},{"line_number":1641,"context_line":"        sync_paths \u003d collections.defaultdict(list)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a71b18c_bf227050","line":1638,"range":{"start_line":1638,"start_character":12,"end_line":1638,"end_character":36},"updated":"2016-12-05 09:01:39.000000000","message":"The original code\n\n return 2, {\u0027abc\u0027: \u0027def\u0027}\n\nis quit odd because the *count* of hashed suffixes should be less than whole suffix counts (i.e. hashed \u003c\u003d len(suffix_dict)) so that i changed the let item to 1 from 2 to fit actual behavior.","commit_id":"32def9070dac89aec346e03236614661476e4564"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"52a43d167452e90c6d2ac4df8ee9cdcaee644dd4","unresolved":false,"context_lines":[{"line_number":1692,"context_line":"        self.assertEqual(16, self.get_hash_count)"},{"line_number":1693,"context_line":""},{"line_number":1694,"context_line":"        # attempt to 16 times but succeeded only 15 times due to Timeout"},{"line_number":1695,"context_line":"        suffix_hashes \u003d sum("},{"line_number":1696,"context_line":"            count for (metric, count), _junk in"},{"line_number":1697,"context_line":"            replicator.logger.log_dict[\u0027update_stats\u0027]"},{"line_number":1698,"context_line":"            if metric \u003d\u003d \u0027suffix.hashes\u0027)"},{"line_number":1699,"context_line":"        self.assertEqual(15, suffix_hashes)"},{"line_number":1700,"context_line":""},{"line_number":1701,"context_line":"    def test_run(self):"},{"line_number":1702,"context_line":"        with _mock_process([(0, \u0027\u0027)] * 100):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a71b18c_5fa87c8d","line":1699,"range":{"start_line":1695,"start_character":0,"end_line":1699,"end_character":43},"updated":"2016-12-05 09:01:39.000000000","message":"Since the change at L1638, now we can assert the number of successful get_hashes counts via update_statas collections.","commit_id":"32def9070dac89aec346e03236614661476e4564"}]}
