)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4182685519c960572116a45c79f72c2650ffcb09","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Remove per-device reconstruction stats"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Now that we\u0027re shuffling parts before going through them, those stats no"},{"line_number":10,"context_line":"longer make sense."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Also, punt all of the cleanup to delete_partition, rather than just the"},{"line_number":13,"context_line":"non-directory cleanup."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a461143_ae33acf4","line":10,"updated":"2017-01-31 23:34:40.000000000","message":"Love love love it!","commit_id":"ff9ca17b985f59935346a7cf3cd39d7cf41afce6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4182685519c960572116a45c79f72c2650ffcb09","unresolved":false,"context_lines":[{"line_number":10,"context_line":"longer make sense."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Also, punt all of the cleanup to delete_partition, rather than just the"},{"line_number":13,"context_line":"non-directory cleanup."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: Ie06bb16c130d46ccf887c8fcb252b8d018072d68"},{"line_number":16,"context_line":"Related-Change: I69e4c4baee64fd2192cbf5836b0803db1cc71705"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a461143_8e38b0d4","line":13,"updated":"2017-01-31 23:34:40.000000000","message":"always a tough thing when a drive-by ends up being the contentious bit!\n\n\"and also wrap a little more IO in delete_partition in the tpool\"\n\n^ like that part too!","commit_id":"ff9ca17b985f59935346a7cf3cd39d7cf41afce6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"445ad17edb48cf189eba153d5a219331dcf96ed4","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Remove per-device reconstruction stats"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Now that we\u0027re shuffling parts before going through them, those stats no"},{"line_number":10,"context_line":"longer make sense."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Also, always use delete_partition for cleanup, so we have one place to"},{"line_number":13,"context_line":"make improvements."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3a461143_8dda7315","line":10,"updated":"2017-02-01 02:38:21.000000000","message":"+2","commit_id":"8277ee3a35885914797f647c42521082ddeab081"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"445ad17edb48cf189eba153d5a219331dcf96ed4","unresolved":false,"context_lines":[{"line_number":10,"context_line":"longer make sense."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Also, always use delete_partition for cleanup, so we have one place to"},{"line_number":13,"context_line":"make improvements."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Also also, put more I/O in the tpool in delete_partition."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3a461143_cd063b85","line":13,"updated":"2017-02-01 02:38:21.000000000","message":"+2","commit_id":"8277ee3a35885914797f647c42521082ddeab081"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"445ad17edb48cf189eba153d5a219331dcf96ed4","unresolved":false,"context_lines":[{"line_number":12,"context_line":"Also, always use delete_partition for cleanup, so we have one place to"},{"line_number":13,"context_line":"make improvements."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Also also, put more I/O in the tpool in delete_partition."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: Ie06bb16c130d46ccf887c8fcb252b8d018072d68"},{"line_number":18,"context_line":"Related-Change: I69e4c4baee64fd2192cbf5836b0803db1cc71705"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3a461143_ed093796","line":15,"updated":"2017-02-01 02:38:21.000000000","message":"+2","commit_id":"8277ee3a35885914797f647c42521082ddeab081"}],"swift/obj/reconstructor.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4182685519c960572116a45c79f72c2650ffcb09","unresolved":false,"context_lines":[{"line_number":355,"context_line":"            rate \u003d self.reconstruction_part_count / elapsed"},{"line_number":356,"context_line":"            self.logger.info("},{"line_number":357,"context_line":"                _(\"%(reconstructed)d/%(total)d (%(percentage).2f%%)\""},{"line_number":358,"context_line":"                  \" partitions reconstructed in %(time).2fs \""},{"line_number":359,"context_line":"                  \"(%(rate).2f/sec, %(remaining)s remaining)\"),"},{"line_number":360,"context_line":"                {\u0027reconstructed\u0027: self.reconstruction_part_count,"},{"line_number":361,"context_line":"                 \u0027total\u0027: self.part_count,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a461143_93f7f7d1","line":358,"updated":"2017-01-31 23:34:40.000000000","message":"before:\n\nobject-6040: 14/14 (100.00%) partitions of 2/2 (100.00%) devices reconstructed in 0.14s (99.43/sec, 0s remaining)\n\n\nafter:\n\nobject-6040: 8/14 (57.14%) partitions reconstructed in 0.08s (95.12/sec, 0s remaining)\n\n\nI *like* it!\n\nreplicator:\n\nobject-6020: 30/477 (6.29%) partitions replicated in 1.00s (29.88/sec, 14s remaining)","commit_id":"ff9ca17b985f59935346a7cf3cd39d7cf41afce6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4182685519c960572116a45c79f72c2650ffcb09","unresolved":false,"context_lines":[{"line_number":690,"context_line":"        if partition is None:"},{"line_number":691,"context_line":"            self.logger.warning("},{"line_number":692,"context_line":"                \u0027Unexpected entity in data dir: %r\u0027 % part_path)"},{"line_number":693,"context_line":"            remove_file(part_path)"},{"line_number":694,"context_line":"            return []"},{"line_number":695,"context_line":""},{"line_number":696,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a461143_95051f15","line":693,"updated":"2017-01-31 23:34:40.000000000","message":"in testing it seems the behavior is the same with this remove_file line or without it:\n\n\tobject-6040: Unexpected entity in data dir: u\u0027/srv/node4/sdb8/objects-1/monkies\u0027\n\tobject-6040: Removing partition: /srv/node4/sdb8/objects-1/monkies\n\nbasically kill_it is going to eat partition_path if we return [] no matter what.\n\nHowever, I think I liked the handling for this where it was?  The original reasoning was that it\u0027s better to do the type validation of the partition variable early rather than risk a subtle bug?  I\u0027m a little nervous plumbing this \"partition\" with type [integer|None] all the way down here and beyond - could bite us later.\n\nAs an experiment, I played around with some bugs I might introduce.  If the None slips through _get_hashes (surprisingly?) handles the part_path correctly but later _get_part_jobs becomes rather unhappy:\n\n\tobject-6040: Exception in top-levelreconstruction loop: \n\tTraceback (most recent call last):\n\t  File \"/vagrant/swift/swift/obj/reconstructor.py\", line 924, in reconstruct\n\t\tjobs \u003d self.build_reconstruction_jobs(part_info)\n\t  File \"/vagrant/swift/swift/obj/reconstructor.py\", line 879, in build_reconstruction_jobs\n\t\tjobs \u003d self._get_part_jobs(**part_info)\n\t  File \"/vagrant/swift/swift/obj/reconstructor.py\", line 737, in _get_part_jobs\n\t\tpart_nodes \u003d policy.object_ring.get_part_nodes(partition)\n\t  File \"/vagrant/swift/swift/common/ring/ring.py\", line 330, in get_part_nodes\n\t\treturn self._get_part_nodes(part)\n\t  File \"/vagrant/swift/swift/common/ring/ring.py\", line 295, in _get_part_nodes\n\t\tdev_id \u003d r2p2d[part]\n\tTypeError: array indices must be integers\n\nIf instead of None partition takes the form of a sting, get_part_nodes returns an empty list and a job with no sync_nodes is created (which may get reaped if there\u0027s no suffixes in there)\n\nWhat\u0027s the motivation to move it into this method?  Checking the type of the variable seems different enough from the handling of the type of the entity on the filesystem that maybe it\u0027s ok to do error handling in different places?  Or not...","commit_id":"ff9ca17b985f59935346a7cf3cd39d7cf41afce6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"48aab799277ce4234c7f3c9b6d9a81e1d51174de","unresolved":false,"context_lines":[{"line_number":690,"context_line":"        if partition is None:"},{"line_number":691,"context_line":"            self.logger.warning("},{"line_number":692,"context_line":"                \u0027Unexpected entity in data dir: %r\u0027 % part_path)"},{"line_number":693,"context_line":"            remove_file(part_path)"},{"line_number":694,"context_line":"            return []"},{"line_number":695,"context_line":""},{"line_number":696,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a461143_ee65b41d","line":693,"in_reply_to":"3a461143_95051f15","updated":"2017-02-01 00:06:53.000000000","message":"Yeah, that remove_file was just copy/paste; I meant to remove it.\n\nMotivation was two-fold:\n\n* Seems like we should have all of the junk get cleaned up in the same way.\n* *You* didn\u0027t want any extra IO in that collect_parts loop -- that unlink may well bog us down.","commit_id":"ff9ca17b985f59935346a7cf3cd39d7cf41afce6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4182685519c960572116a45c79f72c2650ffcb09","unresolved":false,"context_lines":[{"line_number":862,"context_line":"                        continue"},{"line_number":863,"context_line":"                    try:"},{"line_number":864,"context_line":"                        partition \u003d int(partition)"},{"line_number":865,"context_line":"                    except ValueError:"},{"line_number":866,"context_line":"                        partition \u003d None"},{"line_number":867,"context_line":"                    if override_partitions and (partition not in"},{"line_number":868,"context_line":"                                                override_partitions):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a461143_33b3a30b","line":865,"updated":"2017-01-31 23:34:40.000000000","message":"I think this would be easier to reason about and maintain:\n\n    diff --git a/swift/obj/reconstructor.py b/swift/obj/reconstructor.py\n    index e45c285..57ef2de 100644\n    --- a/swift/obj/reconstructor.py\n    +++ b/swift/obj/reconstructor.py\n    @@ -687,12 +687,6 @@ class ObjectReconstructor(Daemon):\n     \n             :returns: a list of dicts of job info\n             \"\"\"\n    -        if partition is None:\n    -            self.logger.warning(\n    -                \u0027Unexpected entity in data dir: %r\u0027 % part_path)\n    -            remove_file(part_path)\n    -            return []\n    -\n             try:\n                 hashes \u003d self._get_hashes(policy, part_path, do_listdir\u003dTrue)\n             except OSError as e:\n    @@ -863,7 +857,12 @@ class ObjectReconstructor(Daemon):\n                         try:\n                             partition \u003d int(partition)\n                         except ValueError:\n    -                        partition \u003d None\n    +                        self.logger.warning(\n    +                            \u0027Removing unexpected entity in data dir: %r\u0027 %\n    +                            part_path)\n    +                        shutil.rmtree(part_path, ignore_errors\u003dTrue)\n    +                        remove_file(part_path)\n    +                        continue\n                         if override_partitions and (partition not in\n                                                     override_partitions):\n                             continue\n\n\nmainly because it maintain the invariant that that the type of partition in part_info is integer - always","commit_id":"ff9ca17b985f59935346a7cf3cd39d7cf41afce6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4182685519c960572116a45c79f72c2650ffcb09","unresolved":false,"context_lines":[{"line_number":908,"context_line":"            remove_file(path)"},{"line_number":909,"context_line":""},{"line_number":910,"context_line":"        self.logger.info(_(\"Removing partition: %s\"), path)"},{"line_number":911,"context_line":"        tpool.execute(kill_it, path)"},{"line_number":912,"context_line":""},{"line_number":913,"context_line":"    def reconstruct(self, **kwargs):"},{"line_number":914,"context_line":"        \"\"\"Run a reconstruction pass\"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a461143_3343a36d","line":911,"updated":"2017-01-31 23:34:40.000000000","message":"yeah!","commit_id":"ff9ca17b985f59935346a7cf3cd39d7cf41afce6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"445ad17edb48cf189eba153d5a219331dcf96ed4","unresolved":false,"context_lines":[{"line_number":696,"context_line":"                \u0027Unexpected entity %r is not a directory\u0027 % part_path)"},{"line_number":697,"context_line":"            return []"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"        # find all the fi\u0027s in the part, and which suffixes have them"},{"line_number":700,"context_line":"        non_data_fragment_suffixes \u003d []"},{"line_number":701,"context_line":"        data_fi_to_suffixes \u003d defaultdict(list)"},{"line_number":702,"context_line":"        for suffix, fi_hash in hashes.items():"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a461143_2db6dff8","line":699,"updated":"2017-02-01 02:38:21.000000000","message":"I think this move was unintentional - it is in fact the call to _get_hashes that \"finds all the fragment indexs in the part\".\n\nThe code below here is sorting those fragment indexes (and tombstone/None) as tracked by the hashes.pkl into jobs.\n\nMaybe the comment just doesn\u0027t need to be there...","commit_id":"8277ee3a35885914797f647c42521082ddeab081"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ec9979dbc575f30b8958820555cc94cc7f195e88","unresolved":false,"context_lines":[{"line_number":696,"context_line":"                \u0027Unexpected entity %r is not a directory\u0027 % part_path)"},{"line_number":697,"context_line":"            return []"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"        # find all the fi\u0027s in the part, and which suffixes have them"},{"line_number":700,"context_line":"        non_data_fragment_suffixes \u003d []"},{"line_number":701,"context_line":"        data_fi_to_suffixes \u003d defaultdict(list)"},{"line_number":702,"context_line":"        for suffix, fi_hash in hashes.items():"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a430d35_e8f4135c","line":699,"in_reply_to":"3a461143_2db6dff8","updated":"2017-02-07 19:01:20.000000000","message":"Yeah, the move was unintentional, or misinformed.","commit_id":"8277ee3a35885914797f647c42521082ddeab081"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"445ad17edb48cf189eba153d5a219331dcf96ed4","unresolved":false,"context_lines":[{"line_number":859,"context_line":"                    except ValueError:"},{"line_number":860,"context_line":"                        self.logger.warning("},{"line_number":861,"context_line":"                            \u0027Unexpected entity in data dir: %r\u0027 % part_path)"},{"line_number":862,"context_line":"                        self.delete_partition(part_path)"},{"line_number":863,"context_line":"                        continue"},{"line_number":864,"context_line":"                    if override_partitions and (partition not in"},{"line_number":865,"context_line":"                                                override_partitions):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a461143_0daa0385","line":862,"updated":"2017-02-01 02:38:21.000000000","message":"Yeah new test proves with a non-empty directory existing code was wrong!","commit_id":"8277ee3a35885914797f647c42521082ddeab081"}],"test/unit/obj/test_reconstructor.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4182685519c960572116a45c79f72c2650ffcb09","unresolved":false,"context_lines":[{"line_number":629,"context_line":"            \u00275/8 (62.50%) partitions\u0027,"},{"line_number":630,"context_line":"            \u00278/8 (100.00%) partitions\u0027,"},{"line_number":631,"context_line":"        ])"},{"line_number":632,"context_line":"        matched \u003d stats_lines \u0026 acceptable"},{"line_number":633,"context_line":"        self.assertEqual(matched, acceptable,"},{"line_number":634,"context_line":"                         \u0027missing some expected acceptable:\\n%s\u0027 % ("},{"line_number":635,"context_line":"                             \u0027\\n\u0027.join(sorted(acceptable - matched))))"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a461143_f8a01af6","line":632,"updated":"2017-01-31 23:34:40.000000000","message":"what about the assertions on `stats_lines - acceptable` - I wasn\u0027t able to follow what you meant by \"unacceptable stats_lines\"?","commit_id":"ff9ca17b985f59935346a7cf3cd39d7cf41afce6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"48aab799277ce4234c7f3c9b6d9a81e1d51174de","unresolved":false,"context_lines":[{"line_number":629,"context_line":"            \u00275/8 (62.50%) partitions\u0027,"},{"line_number":630,"context_line":"            \u00278/8 (100.00%) partitions\u0027,"},{"line_number":631,"context_line":"        ])"},{"line_number":632,"context_line":"        matched \u003d stats_lines \u0026 acceptable"},{"line_number":633,"context_line":"        self.assertEqual(matched, acceptable,"},{"line_number":634,"context_line":"                         \u0027missing some expected acceptable:\\n%s\u0027 % ("},{"line_number":635,"context_line":"                             \u0027\\n\u0027.join(sorted(acceptable - matched))))"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a461143_ce52b834","line":632,"in_reply_to":"3a461143_f8a01af6","updated":"2017-02-01 00:06:53.000000000","message":"The variable name \"acceptable\" -- to me -- implies that those are the *only things that are acceptable*. So I\u0027m not sure I get why we only assert based on the intersection; it seems like the difference is also important. But then I\u0027m not sure whether it was intentional or just crappy naming, so I\u0027m leaving it out.","commit_id":"ff9ca17b985f59935346a7cf3cd39d7cf41afce6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4182685519c960572116a45c79f72c2650ffcb09","unresolved":false,"context_lines":[{"line_number":1488,"context_line":"        self.assertTrue(\u0027Unable to list partitions\u0027 in line)"},{"line_number":1489,"context_line":"        self.assertTrue(datadir_path in line)"},{"line_number":1490,"context_line":""},{"line_number":1491,"context_line":"    def test_collect_parts_preserves_non_partition_files(self):"},{"line_number":1492,"context_line":"        # create some junk next to partitions"},{"line_number":1493,"context_line":"        datadir_path \u003d os.path.join(self.devices, self.local_dev[\u0027device\u0027],"},{"line_number":1494,"context_line":"                                    diskfile.get_data_dir(self.policy))"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a461143_b3fb1346","line":1491,"updated":"2017-01-31 23:34:40.000000000","message":"I don\u0027t think this implementation detail is important enough to enshrine in a test (this method doesn\u0027t do this thing we want to happen).  The important part is probably they get cleaned up in a run_once or reconstruct cycle - maybe doesn\u0027t matter so much where?\n\nUnless there is a strong reason to avoid cleanup of the edge/error case in collect_parts.","commit_id":"ff9ca17b985f59935346a7cf3cd39d7cf41afce6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"48aab799277ce4234c7f3c9b6d9a81e1d51174de","unresolved":false,"context_lines":[{"line_number":1488,"context_line":"        self.assertTrue(\u0027Unable to list partitions\u0027 in line)"},{"line_number":1489,"context_line":"        self.assertTrue(datadir_path in line)"},{"line_number":1490,"context_line":""},{"line_number":1491,"context_line":"    def test_collect_parts_preserves_non_partition_files(self):"},{"line_number":1492,"context_line":"        # create some junk next to partitions"},{"line_number":1493,"context_line":"        datadir_path \u003d os.path.join(self.devices, self.local_dev[\u0027device\u0027],"},{"line_number":1494,"context_line":"                                    diskfile.get_data_dir(self.policy))"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a461143_a933a6f4","line":1491,"in_reply_to":"3a461143_b3fb1346","updated":"2017-02-01 00:06:53.000000000","message":"Sure; I\u0027m content to drop it.","commit_id":"ff9ca17b985f59935346a7cf3cd39d7cf41afce6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"445ad17edb48cf189eba153d5a219331dcf96ed4","unresolved":false,"context_lines":[{"line_number":1497,"context_line":"            utils.mkdirs(os.path.join(datadir_path, str(part)))"},{"line_number":1498,"context_line":""},{"line_number":1499,"context_line":"        # Add some clearly non-partition dentries"},{"line_number":1500,"context_line":"        utils.mkdirs(os.path.join(datadir_path, \u0027not/a/partition\u0027))"},{"line_number":1501,"context_line":"        for junk_name in (\u0027junk\u0027, \u00271234\u0027):"},{"line_number":1502,"context_line":"            junk_file \u003d os.path.join(datadir_path, junk_name)"},{"line_number":1503,"context_line":"            with open(junk_file, \u0027w\u0027) as f:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a461143_ad700f41","line":1500,"updated":"2017-02-01 02:38:21.000000000","message":"this case is a great addition!","commit_id":"8277ee3a35885914797f647c42521082ddeab081"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"445ad17edb48cf189eba153d5a219331dcf96ed4","unresolved":false,"context_lines":[{"line_number":1512,"context_line":"        # all the bad gets cleaned up"},{"line_number":1513,"context_line":"        for junk_name in (\u0027junk\u0027, \u00271234\u0027, \u0027not\u0027):"},{"line_number":1514,"context_line":"            junk_file \u003d os.path.join(datadir_path, junk_name)"},{"line_number":1515,"context_line":"            self.assertFalse(os.path.exists(junk_file))"},{"line_number":1516,"context_line":""},{"line_number":1517,"context_line":"    def test_collect_parts_overrides(self):"},{"line_number":1518,"context_line":"        # setup multiple devices, with multiple parts"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a461143_2db25fe5","line":1515,"updated":"2017-02-01 02:38:21.000000000","message":"oh, how I long for subunit!\n\n\tdiff --git a/test/unit/obj/test_reconstructor.py b/test/unit/obj/test_reconstructor.py\n\tindex 8820532..c053c33 100644\n\t--- a/test/unit/obj/test_reconstructor.py\n\t+++ b/test/unit/obj/test_reconstructor.py\n\t@@ -1510,9 +1510,12 @@ class TestObjectReconstructor(unittest.TestCase):\n\t\t\t\t self.reconstructor.reconstruct()\n\t \n\t\t\t # all the bad gets cleaned up\n\t+        errs \u003d []\n\t\t\t for junk_name in (\u0027junk\u0027, \u00271234\u0027, \u0027not\u0027):\n\t\t\t\t junk_file \u003d os.path.join(datadir_path, junk_name)\n\t-            self.assertFalse(os.path.exists(junk_file))\n\t+            if os.path.exists(junk_file):\n\t+                errs.append(\u0027%s still exists!\u0027 % junk_file)\n\t+        self.assertFalse(errs)\n\t \n\t\t def test_collect_parts_overrides(self):\n\t\t\t # setup multiple devices, with multiple parts\n\nAnd with the change reverted the failure on master is:\n\n\t\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\tFAIL: test_reconstruct_removes_non_partition_files (test.unit.obj.test_reconstructor.TestObjectReconstructor)\n\t----------------------------------------------------------------------\n\tTraceback (most recent call last):\n\t  File \"/home/ubuntu/swift/test/unit/obj/test_reconstructor.py\", line 1518, in test_reconstruct_removes_non_partition_files\n\t\tself.assertFalse(errs)\n\tAssertionError: [u\u0027/tmp/tmpzkah8C/devices/sda/objects/not still exists!\u0027] is not false\n\t-------------------- \u003e\u003e begin captured stdout \u003c\u003c ---------------------","commit_id":"8277ee3a35885914797f647c42521082ddeab081"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ec9979dbc575f30b8958820555cc94cc7f195e88","unresolved":false,"context_lines":[{"line_number":1512,"context_line":"        # all the bad gets cleaned up"},{"line_number":1513,"context_line":"        for junk_name in (\u0027junk\u0027, \u00271234\u0027, \u0027not\u0027):"},{"line_number":1514,"context_line":"            junk_file \u003d os.path.join(datadir_path, junk_name)"},{"line_number":1515,"context_line":"            self.assertFalse(os.path.exists(junk_file))"},{"line_number":1516,"context_line":""},{"line_number":1517,"context_line":"    def test_collect_parts_overrides(self):"},{"line_number":1518,"context_line":"        # setup multiple devices, with multiple parts"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a430d35_685d8346","line":1515,"in_reply_to":"3a461143_2db25fe5","updated":"2017-02-07 19:01:20.000000000","message":"Done","commit_id":"8277ee3a35885914797f647c42521082ddeab081"}]}
