)]}'
{"swift/obj/diskfile.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"27cac89b286f2323ce53a838e21a34f909a74d6a","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        # introduction of metadata checksums."},{"line_number":170,"context_line":"        if add_missing_checksum:"},{"line_number":171,"context_line":"            new_checksum \u003d hashlib.md5(metadata).hexdigest()"},{"line_number":172,"context_line":"            xattr.setxattr(fd, METADATA_CHECKSUM_KEY, new_checksum)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    if metadata_checksum:"},{"line_number":175,"context_line":"        computed_checksum \u003d hashlib.md5(metadata).hexdigest()"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f4b6375_3e288f32","line":172,"updated":"2017-10-20 16:29:05.000000000","message":"What happens if the file (or whole *filesystem*) is read-only, or we otherwise don\u0027t have permission to do this?","commit_id":"a665f82a445a5862c2ab1210b7a318a4c5e12c79"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"0f37cf95122dd43aa8d81659a6f1df57ab3ce498","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        # introduction of metadata checksums."},{"line_number":170,"context_line":"        if add_missing_checksum:"},{"line_number":171,"context_line":"            new_checksum \u003d hashlib.md5(metadata).hexdigest()"},{"line_number":172,"context_line":"            xattr.setxattr(fd, METADATA_CHECKSUM_KEY, new_checksum)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    if metadata_checksum:"},{"line_number":175,"context_line":"        computed_checksum \u003d hashlib.md5(metadata).hexdigest()"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f4b6375_477ede6b","line":172,"in_reply_to":"3f4b6375_3e288f32","updated":"2017-10-20 18:27:19.000000000","message":"In this case, the error handling in failsafe_object_audit catches it. It\u0027s the same thing that happens if you go to quarantine an object on a read-only filesystem or with limited permissions: we log the stack trace and move on.\n\nIf you\u0027re running your auditors on a non-writable filesystem, you\u0027re screwed anyway because they can\u0027t do anything. In that case, maybe the auditor logs will get big enough for someone to notice and take action. :p","commit_id":"a665f82a445a5862c2ab1210b7a318a4c5e12c79"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"27cac89b286f2323ce53a838e21a34f909a74d6a","unresolved":false,"context_lines":[{"line_number":2166,"context_line":"        return cls(mgr, device_path, None, partition, _datadir\u003dhash_dir_path,"},{"line_number":2167,"context_line":"                   policy\u003dpolicy)"},{"line_number":2168,"context_line":""},{"line_number":2169,"context_line":"    def open(self, modernize\u003dFalse):"},{"line_number":2170,"context_line":"        \"\"\""},{"line_number":2171,"context_line":"        Open the object."},{"line_number":2172,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f4b6375_be4a3f52","line":2169,"updated":"2017-10-20 16:29:05.000000000","message":"We\u0027re fine with requiring that \"Other implementations wishing to provide an alternative backend for the object server\" update their call signatures, yeah?\n\nWe should probably go update the example alternate implementation over in mem_diskfile.py... even though it makes no sense to try to run the auditor with mem_diskfile.","commit_id":"a665f82a445a5862c2ab1210b7a318a4c5e12c79"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"0f37cf95122dd43aa8d81659a6f1df57ab3ce498","unresolved":false,"context_lines":[{"line_number":2166,"context_line":"        return cls(mgr, device_path, None, partition, _datadir\u003dhash_dir_path,"},{"line_number":2167,"context_line":"                   policy\u003dpolicy)"},{"line_number":2168,"context_line":""},{"line_number":2169,"context_line":"    def open(self, modernize\u003dFalse):"},{"line_number":2170,"context_line":"        \"\"\""},{"line_number":2171,"context_line":"        Open the object."},{"line_number":2172,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f4b6375_a78c727f","line":2169,"in_reply_to":"3f4b6375_be4a3f52","updated":"2017-10-20 18:27:19.000000000","message":"Oh, right, mem_diskfile. I never remember that it exists unless there\u0027s test failures. I\u0027ll update the method signature over there.","commit_id":"a665f82a445a5862c2ab1210b7a318a4c5e12c79"}],"test/unit/obj/test_auditor.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6751ad85ce69c1d4441105fad39d25541ffe24a7","unresolved":false,"context_lines":[{"line_number":244,"context_line":"        for file_path in file_paths:"},{"line_number":245,"context_line":"            metadata \u003d xattr.getxattr(file_path, \"user.swift.metadata\")"},{"line_number":246,"context_line":"            i \u003d 1"},{"line_number":247,"context_line":"            while True:"},{"line_number":248,"context_line":"                try:"},{"line_number":249,"context_line":"                    metadata +\u003d xattr.getxattr("},{"line_number":250,"context_line":"                        file_path, \"user.swift.metadata%d\" % i)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f485f77_b5897e27","line":247,"range":{"start_line":247,"start_character":18,"end_line":247,"end_character":22},"updated":"2017-11-10 01:06:30.000000000","message":"Test still passes (at least, OMM) with this False.\n\nProbably better to keep it reflective of what\u0027s in diskfile.py though.","commit_id":"ba2fcbfd32fd6723dc6e2058de6a504a5e826b62"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"41df3cfea8ca5b8f4da49f7188580bc3bd02bcc8","unresolved":false,"context_lines":[{"line_number":247,"context_line":"            while True:"},{"line_number":248,"context_line":"                try:"},{"line_number":249,"context_line":"                    metadata +\u003d xattr.getxattr("},{"line_number":250,"context_line":"                        file_path, \"user.swift.metadata%d\" % i)"},{"line_number":251,"context_line":"                except (IOError, OSError):"},{"line_number":252,"context_line":"                    break"},{"line_number":253,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1f485f77_35cb4e54","line":250,"range":{"start_line":250,"start_character":61,"end_line":250,"end_character":62},"updated":"2017-11-10 01:13:18.000000000","message":"Oh, except we never increment i! It\u0027s a good thing we *don\u0027t* write enough metadata to need this, or we\u0027d have an infinite loop!","commit_id":"ba2fcbfd32fd6723dc6e2058de6a504a5e826b62"}]}
