)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"61477bc3b240546622cadd0ea09c588952f9ae8f","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"* Adding a config flag to register incremental runners"},{"line_number":10,"context_line":"* moved swift load logic into restore runner to allow"},{"line_number":11,"context_line":"  loadming multiple streams"},{"line_number":12,"context_line":"* Adding InnoBackupExIncremental runner and restore strategy."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Implements: blueprint incremental-backups"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAAT3%2F%2FuQY%3D","line":11,"updated":"2014-01-02 21:56:34.000000000","message":"\"loading\"","commit_id":"337316cd6b6db87322ac474ae64b0dd629bacf9b"}],"trove/guestagent/backup/backupagent.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"cb34afeee001022a6c521eabd28421ed6decffba","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        parent_metadata \u003d {}"},{"line_number":70,"context_line":"        if backup_info.get(\u0027parent\u0027):"},{"line_number":71,"context_line":"            runner \u003d INCREMENTAL_RUNNER"},{"line_number":72,"context_line":"            LOG.info(\"Using incremental runner: %s\", runner.__name__)"},{"line_number":73,"context_line":"            parent \u003d backup_info[\u0027parent\u0027]"},{"line_number":74,"context_line":"            parent_metadata \u003d storage.load_metadata(parent[\u0027location\u0027],"},{"line_number":75,"context_line":"                                                    parent[\u0027checksum\u0027])"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2Fea0%3D","line":72,"updated":"2014-01-13 14:30:30.000000000","message":"_()","commit_id":"72744ad40a9a1d5923a2c64c382aedf2a515341f"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d3b7a4ee7ec2164ba50bc9055b7ffe1acc79c882","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                    storage.save_metadata(location, bkup.metadata())"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"                except Exception:"},{"line_number":122,"context_line":"                    LOG.exception(\"Error saving %s Backup\", backup_id)"},{"line_number":123,"context_line":"                    backup.update({\u0027state\u0027: BackupState.FAILED})"},{"line_number":124,"context_line":"                    conductor.update_backup(CONF.guest_id, **backup)"},{"line_number":125,"context_line":"                    raise"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2Fcdg%3D","line":122,"updated":"2014-01-13 20:27:16.000000000","message":"could you also fix this one ? _()","commit_id":"72744ad40a9a1d5923a2c64c382aedf2a515341f"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d3b7a4ee7ec2164ba50bc9055b7ffe1acc79c882","unresolved":false,"context_lines":[{"line_number":125,"context_line":"                    raise"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        except Exception:"},{"line_number":128,"context_line":"            LOG.exception(\"Error running backup: %s\", backup_id)"},{"line_number":129,"context_line":"            backup.update({\u0027state\u0027: BackupState.FAILED})"},{"line_number":130,"context_line":"            conductor.update_backup(CONF.guest_id, **backup)"},{"line_number":131,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2Fcdc%3D","line":128,"updated":"2014-01-13 20:27:16.000000000","message":"could you also fix this one ? _()","commit_id":"72744ad40a9a1d5923a2c64c382aedf2a515341f"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d3b7a4ee7ec2164ba50bc9055b7ffe1acc79c882","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                LOG.debug(\"Restoring instance from backup %s to %s\","},{"line_number":153,"context_line":"                          backup_info[\u0027id\u0027], restore_location)"},{"line_number":154,"context_line":"                content_size \u003d runner.restore()"},{"line_number":155,"context_line":"                LOG.info(\"Restore from backup %s completed successfully to %s\","},{"line_number":156,"context_line":"                         backup_info[\u0027id\u0027], restore_location)"},{"line_number":157,"context_line":"                LOG.info(\"Restore size: %s\", content_size)"},{"line_number":158,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2FcdY%3D","line":155,"updated":"2014-01-13 20:27:16.000000000","message":"could you also fix this one ? _()","commit_id":"72744ad40a9a1d5923a2c64c382aedf2a515341f"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d3b7a4ee7ec2164ba50bc9055b7ffe1acc79c882","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                content_size \u003d runner.restore()"},{"line_number":155,"context_line":"                LOG.info(\"Restore from backup %s completed successfully to %s\","},{"line_number":156,"context_line":"                         backup_info[\u0027id\u0027], restore_location)"},{"line_number":157,"context_line":"                LOG.info(\"Restore size: %s\", content_size)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        except Exception as e:"},{"line_number":160,"context_line":"            LOG.error(e)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2FcdU%3D","line":157,"updated":"2014-01-13 20:27:16.000000000","message":"could you also fix this one ? _()","commit_id":"72744ad40a9a1d5923a2c64c382aedf2a515341f"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d3b7a4ee7ec2164ba50bc9055b7ffe1acc79c882","unresolved":false,"context_lines":[{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        except Exception as e:"},{"line_number":160,"context_line":"            LOG.error(e)"},{"line_number":161,"context_line":"            LOG.error(\"Error restoring backup %s\", backup_info[\u0027id\u0027])"},{"line_number":162,"context_line":"            raise"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2FcdQ%3D","line":161,"updated":"2014-01-13 20:27:16.000000000","message":"could you also fix this one ? _()","commit_id":"72744ad40a9a1d5923a2c64c382aedf2a515341f"}],"trove/guestagent/strategies/backup/mysql_impl.py":[{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"9cc24888c3d7420967a6252ff73d18952322583b","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def metadata(self):"},{"line_number":71,"context_line":"        LOG.debug(\u0027Getting metadata from backup\u0027)"},{"line_number":72,"context_line":"        import re"},{"line_number":73,"context_line":"        meta \u003d {}"},{"line_number":74,"context_line":"        lsn \u003d re.compile(\"The latest check point \\(for incremental\\): \u0027(\\d+)\u0027\")"},{"line_number":75,"context_line":"        with open(\u0027/tmp/innobackupex.log\u0027, \u0027r\u0027) as backup_log:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2BCyM%3D","line":72,"updated":"2014-01-30 18:13:25.000000000","message":"how come this is here? do we need to wait to import it until metadata() is called?","commit_id":"bcb5b7082d60076e174f4e6aeb552b2777afb82f"},{"author":{"_account_id":6268,"name":"Robert Myers","email":"myer0052@gmail.com","username":"rmyers"},"change_message_id":"2cc33c853cc683d2c4c3979a0b5cc2fdea251d17","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def metadata(self):"},{"line_number":71,"context_line":"        LOG.debug(\u0027Getting metadata from backup\u0027)"},{"line_number":72,"context_line":"        import re"},{"line_number":73,"context_line":"        meta \u003d {}"},{"line_number":74,"context_line":"        lsn \u003d re.compile(\"The latest check point \\(for incremental\\): \u0027(\\d+)\u0027\")"},{"line_number":75,"context_line":"        with open(\u0027/tmp/innobackupex.log\u0027, \u0027r\u0027) as backup_log:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2BBSo%3D","line":72,"in_reply_to":"AAAAUH%2F%2BCyM%3D","updated":"2014-01-30 22:37:04.000000000","message":"Good catch this should be a global import. Not sure why I did that.","commit_id":"bcb5b7082d60076e174f4e6aeb552b2777afb82f"}],"trove/guestagent/strategies/restore/mysql_impl.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"cb34afeee001022a6c521eabd28421ed6decffba","unresolved":false,"context_lines":[{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    def _incremental_prepare(self, incremental_dir):"},{"line_number":183,"context_line":"        prepare_cmd \u003d self._incremental_prepare_cmd(incremental_dir)"},{"line_number":184,"context_line":"        LOG.info(\"Running innobackupex prepare: %s\", prepare_cmd)"},{"line_number":185,"context_line":"        utils.execute(prepare_cmd, shell\u003dTrue)"},{"line_number":186,"context_line":"        LOG.info(\"Innobackupex prepare finished successfully\")"},{"line_number":187,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2Feao%3D","line":184,"updated":"2014-01-13 14:30:30.000000000","message":"_()","commit_id":"72744ad40a9a1d5923a2c64c382aedf2a515341f"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"cb34afeee001022a6c521eabd28421ed6decffba","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        prepare_cmd \u003d self._incremental_prepare_cmd(incremental_dir)"},{"line_number":184,"context_line":"        LOG.info(\"Running innobackupex prepare: %s\", prepare_cmd)"},{"line_number":185,"context_line":"        utils.execute(prepare_cmd, shell\u003dTrue)"},{"line_number":186,"context_line":"        LOG.info(\"Innobackupex prepare finished successfully\")"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    def _incremental_restore(self, location, checksum):"},{"line_number":189,"context_line":"        \"\"\"Recursively apply backups from all parents."}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2Feak%3D","line":186,"updated":"2014-01-13 14:30:30.000000000","message":"_()","commit_id":"72744ad40a9a1d5923a2c64c382aedf2a515341f"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"d3b7a4ee7ec2164ba50bc9055b7ffe1acc79c882","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        utils.execute(prepare_cmd, shell\u003dTrue)"},{"line_number":186,"context_line":"        LOG.info(\"Innobackupex prepare finished successfully\")"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    def _incremental_restore(self, location, checksum):"},{"line_number":189,"context_line":"        \"\"\"Recursively apply backups from all parents."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        If we are the parent then we restore to the restore_location and"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2FccI%3D","line":188,"updated":"2014-01-13 20:27:16.000000000","message":"Also, seems like incr. restore and simple(full restore) methods contains common code, which is could be externalized into it\u0027s own method - its logic is simple download chuncked stream with validation.\nIs it possible to avoid duplicating ?","commit_id":"72744ad40a9a1d5923a2c64c382aedf2a515341f"},{"author":{"_account_id":6268,"name":"Robert Myers","email":"myer0052@gmail.com","username":"rmyers"},"change_message_id":"4b35b02879d7d034ecf765c72c75e4975cd4eff7","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        utils.execute(prepare_cmd, shell\u003dTrue)"},{"line_number":186,"context_line":"        LOG.info(\"Innobackupex prepare finished successfully\")"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    def _incremental_restore(self, location, checksum):"},{"line_number":189,"context_line":"        \"\"\"Recursively apply backups from all parents."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        If we are the parent then we restore to the restore_location and"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2FWgY%3D","line":188,"in_reply_to":"AAAAUH%2F%2FccI%3D","updated":"2014-01-14 18:39:42.000000000","message":"Yeah, it probably could be made to re-use some logic. The only difference here is the command that is run. So that would just need to be an argument passed to the function. Good catch!","commit_id":"72744ad40a9a1d5923a2c64c382aedf2a515341f"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"cb34afeee001022a6c521eabd28421ed6decffba","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        metadata \u003d self.storage.load_metadata(location, checksum)"},{"line_number":199,"context_line":"        incremental_dir \u003d None"},{"line_number":200,"context_line":"        if \u0027parent_location\u0027 in metadata:"},{"line_number":201,"context_line":"            LOG.info(\"Restoring parent: %(parent_location)s\""},{"line_number":202,"context_line":"                     \" checksum: %(parent_checksum)s\", metadata)"},{"line_number":203,"context_line":"            parent_location \u003d metadata[\u0027parent_location\u0027]"},{"line_number":204,"context_line":"            parent_checksum \u003d metadata[\u0027parent_checksum\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2FeaU%3D","line":201,"updated":"2014-01-13 14:30:30.000000000","message":"_()","commit_id":"72744ad40a9a1d5923a2c64c382aedf2a515341f"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"cb34afeee001022a6c521eabd28421ed6decffba","unresolved":false,"context_lines":[{"line_number":226,"context_line":"            self.process.stdin.write(chunk)"},{"line_number":227,"context_line":"            content_length +\u003d len(chunk)"},{"line_number":228,"context_line":"        self.process.stdin.close()"},{"line_number":229,"context_line":"        LOG.info(\"Restored %s bytes from stream.\" % content_length)"},{"line_number":230,"context_line":"        self.content_length +\u003d content_length"},{"line_number":231,"context_line":"        self._incremental_prepare(incremental_dir)"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2FeaM%3D","line":229,"updated":"2014-01-13 14:30:30.000000000","message":"_()","commit_id":"72744ad40a9a1d5923a2c64c382aedf2a515341f"},{"author":{"_account_id":739,"name":"Michael Basnight","email":"mbasnight@gmail.com","username":"hubcap"},"change_message_id":"9cc24888c3d7420967a6252ff73d18952322583b","unresolved":false,"context_lines":[{"line_number":208,"context_line":"            # just use the checksum for the incremental path as it is"},{"line_number":209,"context_line":"            # sufficently unique /var/lib/mysql/\u003cchecksum\u003e"},{"line_number":210,"context_line":"            incremental_dir \u003d os.path.join(self.restore_location, checksum)"},{"line_number":211,"context_line":"            utils.execute(\"sudo mkdir -p %s\" % incremental_dir, shell\u003dTrue)"},{"line_number":212,"context_line":"            command \u003d self._incremental_restore_cmd(incremental_dir)"},{"line_number":213,"context_line":"        else:"},{"line_number":214,"context_line":"            # The parent (full backup) use the same command from InnobackupEx"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2BCwQ%3D","line":211,"updated":"2014-01-30 18:13:25.000000000","message":", root_helper\u003d\u0027sudo\u0027, shell\u003dTrue, run_as_root\u003dTrue)","commit_id":"bcb5b7082d60076e174f4e6aeb552b2777afb82f"},{"author":{"_account_id":6268,"name":"Robert Myers","email":"myer0052@gmail.com","username":"rmyers"},"change_message_id":"2cc33c853cc683d2c4c3979a0b5cc2fdea251d17","unresolved":false,"context_lines":[{"line_number":208,"context_line":"            # just use the checksum for the incremental path as it is"},{"line_number":209,"context_line":"            # sufficently unique /var/lib/mysql/\u003cchecksum\u003e"},{"line_number":210,"context_line":"            incremental_dir \u003d os.path.join(self.restore_location, checksum)"},{"line_number":211,"context_line":"            utils.execute(\"sudo mkdir -p %s\" % incremental_dir, shell\u003dTrue)"},{"line_number":212,"context_line":"            command \u003d self._incremental_restore_cmd(incremental_dir)"},{"line_number":213,"context_line":"        else:"},{"line_number":214,"context_line":"            # The parent (full backup) use the same command from InnobackupEx"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2BBSI%3D","line":211,"in_reply_to":"AAAAUH%2F%2BCwQ%3D","updated":"2014-01-30 22:37:04.000000000","message":"will fix this up","commit_id":"bcb5b7082d60076e174f4e6aeb552b2777afb82f"}],"trove/guestagent/strategies/storage/swift.py":[{"author":{"_account_id":4240,"name":"Craig Vyvial","email":"cp16net@gmail.com","username":"cp16net"},"change_message_id":"61477bc3b240546622cadd0ea09c588952f9ae8f","unresolved":false,"context_lines":[{"line_number":216,"context_line":""},{"line_number":217,"context_line":"        _meta \u003d {}"},{"line_number":218,"context_line":"        for key, value in headers.iteritems():"},{"line_number":219,"context_line":"            if key.startswith(\u0027x-object-meta\u0027):"},{"line_number":220,"context_line":"                _meta[self._get_attr(key)] \u003d value"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        return _meta"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAT3%2F%2FuO8%3D","line":219,"updated":"2014-01-02 21:56:34.000000000","message":"will this always be lower case? Usually i see headers with \"X-STUFF\" is all caps or camel cased.","commit_id":"337316cd6b6db87322ac474ae64b0dd629bacf9b"},{"author":{"_account_id":6268,"name":"Robert Myers","email":"myer0052@gmail.com","username":"rmyers"},"change_message_id":"84e4d2867d2604fc839f016c4b71dd866723b875","unresolved":false,"context_lines":[{"line_number":216,"context_line":""},{"line_number":217,"context_line":"        _meta \u003d {}"},{"line_number":218,"context_line":"        for key, value in headers.iteritems():"},{"line_number":219,"context_line":"            if key.startswith(\u0027x-object-meta\u0027):"},{"line_number":220,"context_line":"                _meta[self._get_attr(key)] \u003d value"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        return _meta"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAT3%2F%2FrSE%3D","line":219,"in_reply_to":"AAAAT3%2F%2FuO8%3D","updated":"2014-01-03 17:01:33.000000000","message":"Yes, normal HTTP headers are all in caps, however the swiftclient converts them all to lower case so you don\u0027t have to YELL :)","commit_id":"337316cd6b6db87322ac474ae64b0dd629bacf9b"},{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"cb34afeee001022a6c521eabd28421ed6decffba","unresolved":false,"context_lines":[{"line_number":231,"context_line":"        for key, value in metadata.iteritems():"},{"line_number":232,"context_line":"            headers[self._set_attr(key)] \u003d value"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        LOG.info(\"Writing metadata: %s\", str(headers))"},{"line_number":235,"context_line":"        self.connection.post_object(container, filename, headers\u003dheaders)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2FeZ0%3D","line":234,"updated":"2014-01-13 14:30:30.000000000","message":"_()","commit_id":"72744ad40a9a1d5923a2c64c382aedf2a515341f"}],"trove/tests/fakes/swift.py":[{"author":{"_account_id":8415,"name":"Denis M.","email":"lildee1991@gmail.com","username":"dmakogon"},"change_message_id":"cb34afeee001022a6c521eabd28421ed6decffba","unresolved":false,"context_lines":[{"line_number":189,"context_line":"        return object_checksum.hexdigest()"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    def post_object(self, container, name, headers\u003d{}):"},{"line_number":192,"context_line":"        LOG.debug(\"fake post_object(%s, %s, %s)\","},{"line_number":193,"context_line":"                  container, name, str(headers))"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    def delete_object(self, container, name):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2FeZo%3D","line":192,"updated":"2014-01-13 14:30:30.000000000","message":"_()","commit_id":"72744ad40a9a1d5923a2c64c382aedf2a515341f"}]}
