)]}'
{"swift/obj/replicator.py":[{"author":{"_account_id":22059,"name":"zheng yin","email":"yin__zheng@163.com","username":"zy751713126"},"change_message_id":"dba41e3d3e5a7e3af94bb1a805c11655a3a4f5ba","unresolved":false,"context_lines":[{"line_number":620,"context_line":""},{"line_number":621,"context_line":"                if not partition.isdigit():"},{"line_number":622,"context_line":"                    self.stats[\u0027failure\u0027] +\u003d 1"},{"line_number":623,"context_line":"                    self.logger.warning(\u0027Unexpected file in obj_path: %r\u0027 %"},{"line_number":624,"context_line":"                                        partition)"},{"line_number":625,"context_line":"                    continue"},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"                part_nodes \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"9ad45d7e_65f13c01","line":624,"range":{"start_line":623,"start_character":20,"end_line":624,"end_character":50},"updated":"2016-08-11 02:37:07.000000000","message":"Cloud you  use self.logger.warning(_(\u0027Unexpected file in obj_path: %r\u0027),partition) instead ?","commit_id":"960df5b97d74e031c3a4a2477b4374c4288296fc"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"b37820dfe2d16c3c9b843bf6e882069f721891e2","unresolved":false,"context_lines":[{"line_number":356,"context_line":"                self.delete_partition(job[\u0027path\u0027])"},{"line_number":357,"context_line":"                handoff_partition_deleted \u003d True"},{"line_number":358,"context_line":"        except (Exception, Timeout):"},{"line_number":359,"context_line":"            self.logger.exception(_(\"Error syncing handoff partition timeout\"))"},{"line_number":360,"context_line":"            self._add_failure_stats(failure_devs_info)"},{"line_number":361,"context_line":"        finally:"},{"line_number":362,"context_line":"            target_devs_info \u003d set([(target_dev[\u0027replication_ip\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ac371cc_c64a1ec5","line":359,"range":{"start_line":359,"start_character":68,"end_line":359,"end_character":76},"updated":"2016-08-16 05:08:50.000000000","message":"I think, this state is not only for timeout but also for general Exceptions, right? If it\u0027s true the new mesage \"Error syncing handoff partition timeout\" seems odd for the general Exceptions.","commit_id":"ad24e70b432e80f627918913a98a35e355649b0b"},{"author":{"_account_id":12050,"name":"Charles Hsu","email":"charles0126@gmail.com","username":"charz"},"change_message_id":"e056bb2d00de3582264759d753c1ddfd44967f97","unresolved":false,"context_lines":[{"line_number":356,"context_line":"                self.delete_partition(job[\u0027path\u0027])"},{"line_number":357,"context_line":"                handoff_partition_deleted \u003d True"},{"line_number":358,"context_line":"        except (Exception, Timeout):"},{"line_number":359,"context_line":"            self.logger.exception(_(\"Error syncing handoff partition timeout\"))"},{"line_number":360,"context_line":"            self._add_failure_stats(failure_devs_info)"},{"line_number":361,"context_line":"        finally:"},{"line_number":362,"context_line":"            target_devs_info \u003d set([(target_dev[\u0027replication_ip\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ac371cc_c71cd5c3","line":359,"range":{"start_line":359,"start_character":68,"end_line":359,"end_character":76},"in_reply_to":"3ac371cc_c64a1ec5","updated":"2016-08-16 06:44:01.000000000","message":"Yes, you\u0027re correct. It includes both.","commit_id":"ad24e70b432e80f627918913a98a35e355649b0b"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"b37820dfe2d16c3c9b843bf6e882069f721891e2","unresolved":false,"context_lines":[{"line_number":492,"context_line":"        except (Exception, Timeout):"},{"line_number":493,"context_line":"            failure_devs_info.update(target_devs_info)"},{"line_number":494,"context_line":"            self._add_failure_stats(failure_devs_info)"},{"line_number":495,"context_line":"            self.logger.exception(_(\"Error syncing partition timeout\"))"},{"line_number":496,"context_line":"        finally:"},{"line_number":497,"context_line":"            self.stats[\u0027success\u0027] +\u003d len(target_devs_info - failure_devs_info)"},{"line_number":498,"context_line":"            self.partition_times.append(time.time() - begin)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ac371cc_66224a03","line":495,"range":{"start_line":495,"start_character":60,"end_line":495,"end_character":68},"updated":"2016-08-16 05:08:50.000000000","message":"Ditto","commit_id":"ad24e70b432e80f627918913a98a35e355649b0b"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"b37820dfe2d16c3c9b843bf6e882069f721891e2","unresolved":false,"context_lines":[{"line_number":619,"context_line":"                    continue"},{"line_number":620,"context_line":""},{"line_number":621,"context_line":"                if not partition.isdigit():"},{"line_number":622,"context_line":"                    self.stats[\u0027failure\u0027] +\u003d 1"},{"line_number":623,"context_line":"                    self.logger.warning(_(\u0027Unexpected file in obj_path: %r\u0027),"},{"line_number":624,"context_line":"                                        partition)"},{"line_number":625,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ac371cc_89a4b6a6","line":622,"updated":"2016-08-16 05:08:50.000000000","message":"I\u0027m not sure we can increment failure independently from _add_failure_stat. It looks safe but it might make an odd report (?) because we don\u0027t have no failure devs but we got failures in the report. Thought?","commit_id":"ad24e70b432e80f627918913a98a35e355649b0b"},{"author":{"_account_id":12050,"name":"Charles Hsu","email":"charles0126@gmail.com","username":"charz"},"change_message_id":"e056bb2d00de3582264759d753c1ddfd44967f97","unresolved":false,"context_lines":[{"line_number":619,"context_line":"                    continue"},{"line_number":620,"context_line":""},{"line_number":621,"context_line":"                if not partition.isdigit():"},{"line_number":622,"context_line":"                    self.stats[\u0027failure\u0027] +\u003d 1"},{"line_number":623,"context_line":"                    self.logger.warning(_(\u0027Unexpected file in obj_path: %r\u0027),"},{"line_number":624,"context_line":"                                        partition)"},{"line_number":625,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ac371cc_e7e631b3","line":622,"in_reply_to":"3ac371cc_89a4b6a6","updated":"2016-08-16 06:44:01.000000000","message":"This from clay\u0027s patch. I think he might want to add more protection on here. In my opinion, I prefer to remove this code block. It\u0027s a bit odd from my point of view.","commit_id":"ad24e70b432e80f627918913a98a35e355649b0b"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"b37820dfe2d16c3c9b843bf6e882069f721891e2","unresolved":false,"context_lines":[{"line_number":623,"context_line":"                    self.logger.warning(_(\u0027Unexpected file in obj_path: %r\u0027),"},{"line_number":624,"context_line":"                                        partition)"},{"line_number":625,"context_line":"                    continue"},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"                part_nodes \u003d None"},{"line_number":628,"context_line":"                try:"},{"line_number":629,"context_line":"                    job_path \u003d join(obj_path, partition)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ac371cc_e9a44aba","line":626,"updated":"2016-08-16 05:08:50.000000000","message":"I\u0027m not sure those handling is enough/reasonable for us. Looking at current code[1], if job is set a path for a file (not dir) which is integer name, replicator will remove the file in *replicate* method and it doesn\u0027t count it as failure.\n\nHowever, this change files no digit files/dirs as failures in *build_replication_jobs* method.\n\nIf we could change more, I\u0027m feeling I prefer to gather validation for \"what should be built as a job\" into one place (maybe, moves the isfile handling[1] to around here?) and build the jobs only for valid partition dirs.\n\nHow do you think of?\n\n1: https://github.com/openstack/swift/blob/master/swift/obj/replicator.py#L735-L745","commit_id":"ad24e70b432e80f627918913a98a35e355649b0b"},{"author":{"_account_id":12050,"name":"Charles Hsu","email":"charles0126@gmail.com","username":"charz"},"change_message_id":"e056bb2d00de3582264759d753c1ddfd44967f97","unresolved":false,"context_lines":[{"line_number":623,"context_line":"                    self.logger.warning(_(\u0027Unexpected file in obj_path: %r\u0027),"},{"line_number":624,"context_line":"                                        partition)"},{"line_number":625,"context_line":"                    continue"},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"                part_nodes \u003d None"},{"line_number":628,"context_line":"                try:"},{"line_number":629,"context_line":"                    job_path \u003d join(obj_path, partition)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ac371cc_27efa988","line":626,"in_reply_to":"3ac371cc_e9a44aba","updated":"2016-08-16 06:44:01.000000000","message":"Ditto","commit_id":"ad24e70b432e80f627918913a98a35e355649b0b"}],"test/unit/obj/test_replicator.py":[{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"b37820dfe2d16c3c9b843bf6e882069f721891e2","unresolved":false,"context_lines":[{"line_number":252,"context_line":"            os.mkdir(parts_1[part])"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"        if with_json:"},{"line_number":255,"context_line":"            for part in [\u0027auditor_status_ZBF.json\u0027,"},{"line_number":256,"context_line":"                         \u0027auditor_status_ALL.json\u0027]:"},{"line_number":257,"context_line":"                parts[part] \u003d os.path.join(objects, part)"},{"line_number":258,"context_line":"                os.mkdir(parts[part])"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ac371cc_96f97183","line":255,"range":{"start_line":255,"start_character":16,"end_line":255,"end_character":20},"updated":"2016-08-16 05:08:50.000000000","message":"actually, this is not a partition, just a file. auditor_stat_file seems better for the name?","commit_id":"ad24e70b432e80f627918913a98a35e355649b0b"},{"author":{"_account_id":12050,"name":"Charles Hsu","email":"charles0126@gmail.com","username":"charz"},"change_message_id":"e056bb2d00de3582264759d753c1ddfd44967f97","unresolved":false,"context_lines":[{"line_number":252,"context_line":"            os.mkdir(parts_1[part])"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"        if with_json:"},{"line_number":255,"context_line":"            for part in [\u0027auditor_status_ZBF.json\u0027,"},{"line_number":256,"context_line":"                         \u0027auditor_status_ALL.json\u0027]:"},{"line_number":257,"context_line":"                parts[part] \u003d os.path.join(objects, part)"},{"line_number":258,"context_line":"                os.mkdir(parts[part])"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ac371cc_47ebc5b0","line":255,"range":{"start_line":255,"start_character":16,"end_line":255,"end_character":20},"in_reply_to":"3ac371cc_96f97183","updated":"2016-08-16 06:44:01.000000000","message":"That\u0027s better. will fix.","commit_id":"ad24e70b432e80f627918913a98a35e355649b0b"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"b37820dfe2d16c3c9b843bf6e882069f721891e2","unresolved":false,"context_lines":[{"line_number":255,"context_line":"            for part in [\u0027auditor_status_ZBF.json\u0027,"},{"line_number":256,"context_line":"                         \u0027auditor_status_ALL.json\u0027]:"},{"line_number":257,"context_line":"                parts[part] \u003d os.path.join(objects, part)"},{"line_number":258,"context_line":"                os.mkdir(parts[part])"},{"line_number":259,"context_line":"                parts_1[part] \u003d os.path.join(objects_1, part)"},{"line_number":260,"context_line":"                os.mkdir(parts_1[part])"},{"line_number":261,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3ac371cc_1613c1b9","line":258,"updated":"2016-08-16 05:08:50.000000000","message":"oh, wait. the json should be a file, don\u0027t make the dir named auditor_status_***.json. Furthermore, it looks like the test_collect_jobs_failure_report_with_auditor_stats_json seems never to use the parts and parts_1 dict. Is it unnecessary assignment?\n\ni.e. this diff [1] worked well in my environment.\n\n1: http://paste.openstack.org/show/558044/","commit_id":"ad24e70b432e80f627918913a98a35e355649b0b"},{"author":{"_account_id":12050,"name":"Charles Hsu","email":"charles0126@gmail.com","username":"charz"},"change_message_id":"e056bb2d00de3582264759d753c1ddfd44967f97","unresolved":false,"context_lines":[{"line_number":255,"context_line":"            for part in [\u0027auditor_status_ZBF.json\u0027,"},{"line_number":256,"context_line":"                         \u0027auditor_status_ALL.json\u0027]:"},{"line_number":257,"context_line":"                parts[part] \u003d os.path.join(objects, part)"},{"line_number":258,"context_line":"                os.mkdir(parts[part])"},{"line_number":259,"context_line":"                parts_1[part] \u003d os.path.join(objects_1, part)"},{"line_number":260,"context_line":"                os.mkdir(parts_1[part])"},{"line_number":261,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3ac371cc_27b7a9d9","line":258,"in_reply_to":"3ac371cc_1613c1b9","updated":"2016-08-16 06:44:01.000000000","message":"yes, you\u0027re correct. It should be files not directory.","commit_id":"ad24e70b432e80f627918913a98a35e355649b0b"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"b37820dfe2d16c3c9b843bf6e882069f721891e2","unresolved":false,"context_lines":[{"line_number":441,"context_line":"             \u0027region\u0027: 1, \u0027ip\u0027: \u00271.1.1.1\u0027, \u0027port\u0027: 1111,"},{"line_number":442,"context_line":"             \u0027replication_ip\u0027: \u0027127.0.0.1\u0027, \u0027replication_port\u0027: 6200},"},{"line_number":443,"context_line":"        ]"},{"line_number":444,"context_line":"        objects_sdb, objects_1_sdb, _, _ \u003d self._write_disk_data(\u0027sdb\u0027, True)"},{"line_number":445,"context_line":"        objects_sdc, objects_1_sdc, _, _ \u003d self._write_disk_data(\u0027sdc\u0027, True)"},{"line_number":446,"context_line":"        objects_sdd, objects_1_sdd, _, _ \u003d self._write_disk_data(\u0027sdd\u0027, True)"},{"line_number":447,"context_line":"        _create_test_rings(self.testdir, devs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ac371cc_565b7987","line":444,"updated":"2016-08-16 05:08:50.000000000","message":"nits) To be obvious we are testing with json file, I prefer to set the args with keyword like \u0027with_json\u003dTrue\u0027","commit_id":"ad24e70b432e80f627918913a98a35e355649b0b"},{"author":{"_account_id":12050,"name":"Charles Hsu","email":"charles0126@gmail.com","username":"charz"},"change_message_id":"e056bb2d00de3582264759d753c1ddfd44967f97","unresolved":false,"context_lines":[{"line_number":441,"context_line":"             \u0027region\u0027: 1, \u0027ip\u0027: \u00271.1.1.1\u0027, \u0027port\u0027: 1111,"},{"line_number":442,"context_line":"             \u0027replication_ip\u0027: \u0027127.0.0.1\u0027, \u0027replication_port\u0027: 6200},"},{"line_number":443,"context_line":"        ]"},{"line_number":444,"context_line":"        objects_sdb, objects_1_sdb, _, _ \u003d self._write_disk_data(\u0027sdb\u0027, True)"},{"line_number":445,"context_line":"        objects_sdc, objects_1_sdc, _, _ \u003d self._write_disk_data(\u0027sdc\u0027, True)"},{"line_number":446,"context_line":"        objects_sdd, objects_1_sdd, _, _ \u003d self._write_disk_data(\u0027sdd\u0027, True)"},{"line_number":447,"context_line":"        _create_test_rings(self.testdir, devs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ac371cc_2705e979","line":444,"in_reply_to":"3ac371cc_565b7987","updated":"2016-08-16 06:44:01.000000000","message":"got it.","commit_id":"ad24e70b432e80f627918913a98a35e355649b0b"}]}
