)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":12712,"name":"Gleb Stepanov","email":"gstepanov@mirantis.com","username":"stgleb"},"change_message_id":"8018fabececc63ae516562e73eee46544c3c19c1","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Dmitry Stepanenko \u003cdstepanenko@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-12-22 14:06:20 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Backup/restore cinder/nova to ssh"},{"line_number":8,"context_line":"This patch implements ability to backup/restore"},{"line_number":9,"context_line":"to remote ssh host"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"da4df55a_963fa924","line":7,"updated":"2016-12-22 14:47:22.000000000","message":"Blank line should go here","commit_id":"b91ddfe43f9c829ce209a58443aabe7f2e50d9ae"}],"freezer/openstack/restore.py":[{"author":{"_account_id":12712,"name":"Gleb Stepanov","email":"gstepanov@mirantis.com","username":"stgleb"},"change_message_id":"8018fabececc63ae516562e73eee46544c3c19c1","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            path \u003d \"{0}/{1}\".format(self.container, path)"},{"line_number":55,"context_line":"            backups \u003d self.storage.listdir(path)"},{"line_number":56,"context_line":"        else:"},{"line_number":57,"context_line":"            # TODO(dstepanenko): handle ssh storage type here"},{"line_number":58,"context_line":"            msg \u003d (\"{} storage type is not supported at the moment.\""},{"line_number":59,"context_line":"                   \" Try local, swift or ssh\".format(self.storage.type))"},{"line_number":60,"context_line":"            print(msg)"}],"source_content_type":"text/x-python","patch_set":4,"id":"da4df55a_563b81eb","line":57,"updated":"2016-12-22 14:47:22.000000000","message":"I guess this TODO should be removed","commit_id":"b91ddfe43f9c829ce209a58443aabe7f2e50d9ae"}],"freezer/storage/local.py":[{"author":{"_account_id":16768,"name":"Ruslan Aliev","email":"raliev@mirantis.com","username":"raliev"},"change_message_id":"7982c3c1ece114ffa4bd4c022133cc277585f856","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class LocalStorage(fslike.FsLikeStorage):"},{"line_number":27,"context_line":"    type \u003d \u0027local\u0027"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def get_file(self, from_path, to_path):"},{"line_number":30,"context_line":"        shutil.copyfile(from_path, to_path)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a6eadb0_fbb5087e","line":27,"updated":"2016-12-20 13:11:30.000000000","message":"It\u0027s better not to use \u0027type\u0027 as the name of variable (it shadows built-in \u0027type\u0027 function. Better to use property.","commit_id":"5d781457fc2ae63f60100c1a95d2faacfe1d88da"},{"author":{"_account_id":6508,"name":"Dmitry Stepanenko","email":"dstepanenko@mirantis.com","username":"dstepanenko"},"change_message_id":"e052526be0df63d5c928dee6d0f0e990b8fa5d44","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class LocalStorage(fslike.FsLikeStorage):"},{"line_number":27,"context_line":"    type \u003d \u0027local\u0027"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def get_file(self, from_path, to_path):"},{"line_number":30,"context_line":"        shutil.copyfile(from_path, to_path)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a6eadb0_0ea43fa4","line":27,"in_reply_to":"1a6eadb0_fbb5087e","updated":"2016-12-20 14:55:07.000000000","message":"Done","commit_id":"5d781457fc2ae63f60100c1a95d2faacfe1d88da"}],"freezer/storage/ssh.py":[{"author":{"_account_id":11151,"name":"Fausto Marzi","email":"fausto.marzi@ericsson.com","username":"fausto.marzi"},"change_message_id":"df345eca06a42a2840777a638119b6e26bc0de76","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        received_size \u003d 0"},{"line_number":125,"context_line":"        with self.open(path, \u0027r\u0027) as reader:"},{"line_number":126,"context_line":"            reader.prefetch(file_size)"},{"line_number":127,"context_line":"            while True:"},{"line_number":128,"context_line":"                chunk \u003d reader.read(CHUNK_SIZE)"},{"line_number":129,"context_line":"                if len(chunk) \u003d\u003d 0:"},{"line_number":130,"context_line":"                    break"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a6eadb0_8a904497","line":127,"range":{"start_line":127,"start_character":0,"end_line":127,"end_character":23},"updated":"2016-12-20 11:57:50.000000000","message":"here I\u0027d do:\nchunk \u003d reader.read(CHUNK_SIZE)\nwhile chunk:\n    received_size +\u003d len(chunk)\n    data +\u003d chunk\n    chunk \u003d reader.read(CHUNK_SIZE)","commit_id":"5d781457fc2ae63f60100c1a95d2faacfe1d88da"},{"author":{"_account_id":6508,"name":"Dmitry Stepanenko","email":"dstepanenko@mirantis.com","username":"dstepanenko"},"change_message_id":"e052526be0df63d5c928dee6d0f0e990b8fa5d44","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        received_size \u003d 0"},{"line_number":125,"context_line":"        with self.open(path, \u0027r\u0027) as reader:"},{"line_number":126,"context_line":"            reader.prefetch(file_size)"},{"line_number":127,"context_line":"            while True:"},{"line_number":128,"context_line":"                chunk \u003d reader.read(CHUNK_SIZE)"},{"line_number":129,"context_line":"                if len(chunk) \u003d\u003d 0:"},{"line_number":130,"context_line":"                    break"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a6eadb0_ee9c635f","line":127,"range":{"start_line":127,"start_character":0,"end_line":127,"end_character":23},"in_reply_to":"1a6eadb0_8a904497","updated":"2016-12-20 14:55:07.000000000","message":"Done","commit_id":"5d781457fc2ae63f60100c1a95d2faacfe1d88da"},{"author":{"_account_id":13940,"name":"Saad Zaher","email":"eng.szaher@gmail.com","username":"szaher"},"change_message_id":"a4fe0913829b75565c8fe29d88d7f75457e36fdd","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            chunk \u003d reader.read(CHUNK_SIZE)"},{"line_number":128,"context_line":"            while chunk:"},{"line_number":129,"context_line":"                received_size +\u003d len(chunk)"},{"line_number":130,"context_line":"                data +\u003d chunk"},{"line_number":131,"context_line":"                chunk \u003d reader.read(CHUNK_SIZE)"},{"line_number":132,"context_line":"        if file_size !\u003d received_size:"},{"line_number":133,"context_line":"            raise IOError(\u0027Size mismatch: expected {} received {}\u0027.format("}],"source_content_type":"text/x-python","patch_set":3,"id":"da4df55a_d203070e","line":130,"updated":"2016-12-22 11:36:01.000000000","message":"you are trying to load the whole file into memory. I am not sure what will it look like when we try to backup a 50 G file or 100 GB file on server with 16GB of memory. \n\nSaving such a big file in memory will cause lots of problems and probably the backup will fail.","commit_id":"caacfcebf2d12bc120d03d43163dc17456e104e1"},{"author":{"_account_id":6508,"name":"Dmitry Stepanenko","email":"dstepanenko@mirantis.com","username":"dstepanenko"},"change_message_id":"dc3f714218f717d1fbe9ddf3ff1f4dd4947e21a9","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            chunk \u003d reader.read(CHUNK_SIZE)"},{"line_number":128,"context_line":"            while chunk:"},{"line_number":129,"context_line":"                received_size +\u003d len(chunk)"},{"line_number":130,"context_line":"                data +\u003d chunk"},{"line_number":131,"context_line":"                chunk \u003d reader.read(CHUNK_SIZE)"},{"line_number":132,"context_line":"        if file_size !\u003d received_size:"},{"line_number":133,"context_line":"            raise IOError(\u0027Size mismatch: expected {} received {}\u0027.format("}],"source_content_type":"text/x-python","patch_set":3,"id":"da4df55a_c7db3eec","line":130,"in_reply_to":"da4df55a_d203070e","updated":"2016-12-22 14:08:02.000000000","message":"This method is used for loading metadata file only. I don\u0027t know use cases where it can be too large. I renamed it into read_metadata_file for clarification purpose","commit_id":"caacfcebf2d12bc120d03d43163dc17456e104e1"}]}
