)]}'
{"swift/obj/diskfile.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d58b72dd2977189ae064c3ca8cbcb1a4b09448e3","unresolved":false,"context_lines":[{"line_number":282,"context_line":"                        modified \u003d True"},{"line_number":283,"context_line":"        except (IOError, OSError) as e:"},{"line_number":284,"context_line":"            if e.errno !\u003d errno.ENOENT:"},{"line_number":285,"context_line":"                raise"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        if modified:"},{"line_number":288,"context_line":"            write_pickle(hashes, hashes_file, partition_dir, PICKLE_PROTOCOL)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba5201f7_ae9c145e","side":"PARENT","line":285,"updated":"2017-01-11 07:18:50.000000000","message":"hrm... as a side effect of this change we *also* don\u0027t create the invalidations_file when we ENOENT","commit_id":"6918c7940af47817b776686ead979d79ba583e80"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3974d31d4b93f498135430a3d5dc8a705e5aebf3","unresolved":false,"context_lines":[{"line_number":282,"context_line":"                        modified \u003d True"},{"line_number":283,"context_line":"        except (IOError, OSError) as e:"},{"line_number":284,"context_line":"            if e.errno !\u003d errno.ENOENT:"},{"line_number":285,"context_line":"                raise"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        if modified:"},{"line_number":288,"context_line":"            write_pickle(hashes, hashes_file, partition_dir, PICKLE_PROTOCOL)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a3c09a3_ff25405c","side":"PARENT","line":285,"in_reply_to":"7a3c09a3_f8d0fecb","updated":"2017-01-13 04:41:17.000000000","message":"yeah you\u0027re right - it\u0027s fine to not create it.","commit_id":"6918c7940af47817b776686ead979d79ba583e80"},{"author":{"_account_id":23449,"name":"Pavel Kvasnička","email":"pavel.kvasnicka@firma.seznam.cz","username":"PavelK"},"change_message_id":"262d18a1304dbabd95067b19bd847735183f6441","unresolved":false,"context_lines":[{"line_number":282,"context_line":"                        modified \u003d True"},{"line_number":283,"context_line":"        except (IOError, OSError) as e:"},{"line_number":284,"context_line":"            if e.errno !\u003d errno.ENOENT:"},{"line_number":285,"context_line":"                raise"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        if modified:"},{"line_number":288,"context_line":"            write_pickle(hashes, hashes_file, partition_dir, PICKLE_PROTOCOL)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a3c09a3_f8d0fecb","side":"PARENT","line":285,"in_reply_to":"ba5201f7_ae9c145e","updated":"2017-01-13 01:21:00.000000000","message":"Sure. But with patch #418690 there is no benefit - invalidations_file usually exists.","commit_id":"6918c7940af47817b776686ead979d79ba583e80"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c08fe2735960c852b94801cac76d5efec6f459da","unresolved":false,"context_lines":[{"line_number":297,"context_line":"                    pass"},{"line_number":298,"context_line":"            except OSError as e:"},{"line_number":299,"context_line":"                if e.errno !\u003d errno.ENOENT:"},{"line_number":300,"context_line":"                    raise"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"        return hashes"},{"line_number":303,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba5201f7_6e078c81","line":300,"updated":"2017-01-11 07:22:02.000000000","message":"interestingly open(file, \u0027wb\u0027) can *never* throw ENOENT ;)\n\nbut obviously could still raise OSError for permissions of if the directory had been reaped - should consider correct behavior there...","commit_id":"8f7060543e1bc96bb146c1cd6a5c5f1d7148de5f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3974d31d4b93f498135430a3d5dc8a705e5aebf3","unresolved":false,"context_lines":[{"line_number":297,"context_line":"                    pass"},{"line_number":298,"context_line":"            except OSError as e:"},{"line_number":299,"context_line":"                if e.errno !\u003d errno.ENOENT:"},{"line_number":300,"context_line":"                    raise"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"        return hashes"},{"line_number":303,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a3c09a3_dfe164d2","line":300,"in_reply_to":"7a3c09a3_f5d007cc","updated":"2017-01-13 04:41:17.000000000","message":"I agree - the obvious conclusion is to drop the error handling and add logging around the caller - which I can see is already in patch 402043 ;)\n\nAnd I find this all pretty funny.  Even for my fat head - things become so obvious when you pull them apart!","commit_id":"8f7060543e1bc96bb146c1cd6a5c5f1d7148de5f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3479a2d6dce28f82fc2492c53a8508355f2245bd","unresolved":false,"context_lines":[{"line_number":297,"context_line":"                    pass"},{"line_number":298,"context_line":"            except OSError as e:"},{"line_number":299,"context_line":"                if e.errno !\u003d errno.ENOENT:"},{"line_number":300,"context_line":"                    raise"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"        return hashes"},{"line_number":303,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba5201f7_b8550fc3","line":300,"in_reply_to":"ba5201f7_6e078c81","updated":"2017-01-11 19:31:10.000000000","message":"well, the dir could in theory ENOENT","commit_id":"8f7060543e1bc96bb146c1cd6a5c5f1d7148de5f"},{"author":{"_account_id":23449,"name":"Pavel Kvasnička","email":"pavel.kvasnicka@firma.seznam.cz","username":"PavelK"},"change_message_id":"262d18a1304dbabd95067b19bd847735183f6441","unresolved":false,"context_lines":[{"line_number":297,"context_line":"                    pass"},{"line_number":298,"context_line":"            except OSError as e:"},{"line_number":299,"context_line":"                if e.errno !\u003d errno.ENOENT:"},{"line_number":300,"context_line":"                    raise"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"        return hashes"},{"line_number":303,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a3c09a3_f5d007cc","line":300,"in_reply_to":"ba5201f7_b8550fc3","updated":"2017-01-13 01:21:00.000000000","message":"Really? You have locked path with directory where invalidations file exists. And if you can\u0027t write there, then is something very bad and let it known.","commit_id":"8f7060543e1bc96bb146c1cd6a5c5f1d7148de5f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3974d31d4b93f498135430a3d5dc8a705e5aebf3","unresolved":false,"context_lines":[{"line_number":1055,"context_line":""},{"line_number":1056,"context_line":"        try:"},{"line_number":1057,"context_line":"            hashes \u003d self.consolidate_hashes(partition_path)"},{"line_number":1058,"context_line":"        except Exception:"},{"line_number":1059,"context_line":"            do_listdir \u003d True"},{"line_number":1060,"context_line":"            force_rewrite \u003d True"},{"line_number":1061,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a3c09a3_bfa018a7","line":1058,"updated":"2017-01-13 04:41:17.000000000","message":"I think some logging here would be welcome\n\n#willfix","commit_id":"8f7060543e1bc96bb146c1cd6a5c5f1d7148de5f"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"8c10609c51ceffe17a67988d9fa175c6e419a202","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        try:"},{"line_number":277,"context_line":"            with open(invalidations_file, \u0027rb\u0027) as inv_fh:"},{"line_number":278,"context_line":"                for line in inv_fh:"},{"line_number":279,"context_line":"                    found_invalidation_entry \u003d True"},{"line_number":280,"context_line":"                    suffix \u003d line.strip()"},{"line_number":281,"context_line":"                    if hashes is not None and \\"},{"line_number":282,"context_line":"                            hashes.get(suffix, \u0027\u0027) is not None:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_d8472c75","line":279,"updated":"2017-01-17 11:16:06.000000000","message":"nice! I was going mention this part while I was going through \"get_hashes\" and \"consolidate_hashes\" code.","commit_id":"95c7c0109b97479ecadc9a74864a8b56c4f5e985"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0bda13f5cf5c32e4c597f29f182d7db9f5377401","unresolved":false,"context_lines":[{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        # Now that all the invalidations are reflected in hashes.pkl, it\u0027s"},{"line_number":293,"context_line":"        # safe to clear out the invalidations file."},{"line_number":294,"context_line":"        if found_invalidation_entry:"},{"line_number":295,"context_line":"            with open(invalidations_file, \u0027wb\u0027) as inv_fh:"},{"line_number":296,"context_line":"                pass"},{"line_number":297,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_be04ac14","line":294,"updated":"2017-01-18 18:40:15.000000000","message":"ok. we have lock_path, we must have opened the file to read if found_invalidation_entry is true, so it seems reasonable to assume it\u0027s dir still exists (which is the only condition that was previously suppressed), and even if this exception is now raised then worst case it triggers a do_listdir and rewrite.","commit_id":"95c7c0109b97479ecadc9a74864a8b56c4f5e985"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0bda13f5cf5c32e4c597f29f182d7db9f5377401","unresolved":false,"context_lines":[{"line_number":1052,"context_line":"        try:"},{"line_number":1053,"context_line":"            hashes \u003d self.consolidate_hashes(partition_path)"},{"line_number":1054,"context_line":"        except Exception:"},{"line_number":1055,"context_line":"            self.logger.warning(\u0027Unable to read %r\u0027, hashes_file,"},{"line_number":1056,"context_line":"                                exc_info\u003dTrue)"},{"line_number":1057,"context_line":"            do_listdir \u003d True"},{"line_number":1058,"context_line":"            force_rewrite \u003d True"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_bebf4cce","line":1055,"updated":"2017-01-18 18:40:15.000000000","message":"nit: strictly, the problem may not be with reading hashes.pkl. \"Unable to load hashes\" ??? IDK\n\nnit: we should probably mark the message for translation but diskfile.py is already inconsistent on that front. #easyfollowupforsomeone","commit_id":"95c7c0109b97479ecadc9a74864a8b56c4f5e985"}],"test/unit/obj/test_diskfile.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"237291e0830cedd3fb62433988f02a608f9c387b","unresolved":false,"context_lines":[{"line_number":6071,"context_line":"            df_mgr.get_hashes(\u0027sda1\u0027, \u00270\u0027, [], policy)"},{"line_number":6072,"context_line":"            # ... so no write iop - invalidation file not changed"},{"line_number":6073,"context_line":"            self.assertEqual(hash_mtime, os.path.getmtime(hash_file))"},{"line_number":6074,"context_line":"            self.assertEqual(inv_mtime, os.path.getmtime(inv_file))"},{"line_number":6075,"context_line":""},{"line_number":6076,"context_line":"    def test_invalidate_hash_consolidation(self):"},{"line_number":6077,"context_line":"        def assert_consolidation(suffixes):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba5201f7_62f766d3","line":6074,"updated":"2017-01-12 03:45:15.000000000","message":"Here is a less brittle test that doesn\u0027t require sleep(): http://paste.openstack.org/show/594650/\n\nIt counts open calls and then checks to make sure the invalidate file isn\u0027t called a second time.","commit_id":"8f7060543e1bc96bb146c1cd6a5c5f1d7148de5f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3974d31d4b93f498135430a3d5dc8a705e5aebf3","unresolved":false,"context_lines":[{"line_number":6071,"context_line":"            df_mgr.get_hashes(\u0027sda1\u0027, \u00270\u0027, [], policy)"},{"line_number":6072,"context_line":"            # ... so no write iop - invalidation file not changed"},{"line_number":6073,"context_line":"            self.assertEqual(hash_mtime, os.path.getmtime(hash_file))"},{"line_number":6074,"context_line":"            self.assertEqual(inv_mtime, os.path.getmtime(inv_file))"},{"line_number":6075,"context_line":""},{"line_number":6076,"context_line":"    def test_invalidate_hash_consolidation(self):"},{"line_number":6077,"context_line":"        def assert_consolidation(suffixes):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a3c09a3_df2fa4f4","line":6074,"in_reply_to":"ba5201f7_62f766d3","updated":"2017-01-13 04:41:17.000000000","message":"ZOMGBBQ!!11 py3 and *everything* - LOVE IT!\n\n#willfix","commit_id":"8f7060543e1bc96bb146c1cd6a5c5f1d7148de5f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0bda13f5cf5c32e4c597f29f182d7db9f5377401","unresolved":false,"context_lines":[{"line_number":6057,"context_line":"            hashes \u003d df_mgr.get_hashes(\u0027sda1\u0027, \u00270\u0027, [], policy)"},{"line_number":6058,"context_line":"            self.assertIn(suffix, hashes)  # sanity"},{"line_number":6059,"context_line":""},{"line_number":6060,"context_line":"    def test_invalidate_hash_file_not_truncated_when_empty(self):"},{"line_number":6061,"context_line":"        orig_open \u003d open"},{"line_number":6062,"context_line":""},{"line_number":6063,"context_line":"        def watch_open(*args, **kargs):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_34ab78d8","line":6060,"updated":"2017-01-18 18:40:15.000000000","message":"ok, this fails when run against diskfile.py on master\n\n  AssertionError: defaultdict(\u003ctype \u0027list\u0027\u003e, {\u0027hashes.invalid\u0027: [\u0027rb\u0027, \u0027wb\u0027], \u0027hashes.pkl\u0027: [\u0027rb\u0027]}) !\u003d {\u0027hashes.invalid\u0027: [\u0027rb\u0027], \u0027hashes.pkl\u0027: [\u0027rb\u0027]}\n\n... for policy ECStoragePolicy(0, [\u0027ec\u0027], is_default\u003dTrue, is_deprecated\u003dFalse, policy_type\u003d\u0027erasure_coding\u0027), EC config(ec_type\u003djerasure_rs_vand, ec_segment_size\u003d4096, ec_ndata\u003d10, ec_nparity\u003d4)","commit_id":"95c7c0109b97479ecadc9a74864a8b56c4f5e985"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0bda13f5cf5c32e4c597f29f182d7db9f5377401","unresolved":false,"context_lines":[{"line_number":6088,"context_line":"            open_log \u003d defaultdict(list)"},{"line_number":6089,"context_line":"            open_loc \u003d \u0027__builtin__.open\u0027 if six.PY2 else \u0027builtins.open\u0027"},{"line_number":6090,"context_line":"            with mock.patch(open_loc, watch_open):"},{"line_number":6091,"context_line":"                self.assertTrue(os.path.exists(inv_file))"},{"line_number":6092,"context_line":"                # no new suffixes get invalided... so no write iop"},{"line_number":6093,"context_line":"                df_mgr.get_hashes(\u0027sda1\u0027, \u00270\u0027, [], policy)"},{"line_number":6094,"context_line":"            # each file is opened once to read"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_71543221","line":6091,"updated":"2017-01-18 18:40:15.000000000","message":"nit: assert could be outside the scope of the mock","commit_id":"95c7c0109b97479ecadc9a74864a8b56c4f5e985"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0bda13f5cf5c32e4c597f29f182d7db9f5377401","unresolved":false,"context_lines":[{"line_number":6179,"context_line":"            # consolidate hashes"},{"line_number":6180,"context_line":"            assert_consolidation([suffix, suffix2])"},{"line_number":6181,"context_line":""},{"line_number":6182,"context_line":"    def test_consolidate_hashes_raises_exception(self):"},{"line_number":6183,"context_line":"        # verify that if consolidate_hashes raises an exception then suffixes"},{"line_number":6184,"context_line":"        # are rehashed and a hashes.pkl is written"},{"line_number":6185,"context_line":"        for policy in self.iter_policies():"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_745180d8","line":6182,"updated":"2017-01-18 18:40:15.000000000","message":"ok this fails with diskfile on master\n\n  AssertionError: Lists differ: [] !\u003d [\"Unable to read \u0027/tmp/tmpHDuF...\n\nSecond list contains 1 additional elements.\nFirst extra element 0:\nUnable to read \u0027/tmp/tmpHDuFlR/node/sda1/objects/0/hashes.pkl\u0027\n\n- []\n+ [\"Unable to read \u0027/tmp/tmpHDuFlR/node/sda1/objects/0/hashes.pkl\u0027\"]\n\n... for policy ECStoragePolicy(0, [\u0027ec\u0027], is_default\u003dTrue, is_deprecated\u003dFalse, policy_type\u003d\u0027erasure_coding\u0027), EC config(ec_type\u003djerasure_rs_vand, ec_segment_size\u003d4096, ec_ndata\u003d10, ec_nparity\u003d4)","commit_id":"95c7c0109b97479ecadc9a74864a8b56c4f5e985"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0bda13f5cf5c32e4c597f29f182d7db9f5377401","unresolved":false,"context_lines":[{"line_number":6224,"context_line":"                                     diskfile.get_data_dir(policy), \u00270\u0027)"},{"line_number":6225,"context_line":"            hashes_file \u003d os.path.join(part_path, diskfile.HASH_FILE)"},{"line_number":6226,"context_line":"            with open(hashes_file, \u0027rb\u0027) as f:"},{"line_number":6227,"context_line":"                self.assertEqual(hashes, pickle.load(f))"},{"line_number":6228,"context_line":""},{"line_number":6229,"context_line":"    # invalidate_hash tests - error handling"},{"line_number":6230,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_f4a2d04a","line":6227,"updated":"2017-01-18 18:40:15.000000000","message":"nit: for completeness repeat the logger assertion - see follow up patch","commit_id":"95c7c0109b97479ecadc9a74864a8b56c4f5e985"}]}
