)]}'
{"cinder/backup/chunkeddriver.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"4e524ba509430e034886b4e013f91dbef4404c81","unresolved":false,"context_lines":[{"line_number":330,"context_line":"        with self.get_object_writer("},{"line_number":331,"context_line":"                container, object_name, extra_metadata\u003dextra_metadata"},{"line_number":332,"context_line":"        ) as writer:"},{"line_number":333,"context_line":"            eventlet.tpool.execute(writer.write, output_data)"},{"line_number":334,"context_line":"        md5 \u003d hashlib.md5(data).hexdigest()"},{"line_number":335,"context_line":"        obj[object_name][\u0027md5\u0027] \u003d md5"},{"line_number":336,"context_line":"        LOG.debug(\u0027backup MD5 for %(object_name)s: %(md5)s\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f4b6375_ac0a7c86","line":333,"updated":"2017-11-07 14:31:56.000000000","message":"Why do we need native threads here and below?","commit_id":"b1bbbdbfca995d5348754f18a501ddad97d4ec97"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"5f7594e2ddac2785e33aa9310fd3dd0eccdc7556","unresolved":false,"context_lines":[{"line_number":330,"context_line":"        with self.get_object_writer("},{"line_number":331,"context_line":"                container, object_name, extra_metadata\u003dextra_metadata"},{"line_number":332,"context_line":"        ) as writer:"},{"line_number":333,"context_line":"            eventlet.tpool.execute(writer.write, output_data)"},{"line_number":334,"context_line":"        md5 \u003d hashlib.md5(data).hexdigest()"},{"line_number":335,"context_line":"        obj[object_name][\u0027md5\u0027] \u003d md5"},{"line_number":336,"context_line":"        LOG.debug(\u0027backup MD5 for %(object_name)s: %(md5)s\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f4b6375_67e6cc4d","line":333,"in_reply_to":"3f4b6375_ac0a7c86","updated":"2017-11-08 09:41:16.000000000","message":"Because many disk IO operations will block the greenthread, and this is probably one such cases.","commit_id":"b1bbbdbfca995d5348754f18a501ddad97d4ec97"},{"author":{"_account_id":25376,"name":"zhuangzejian","email":"zzj123389602@gmail.com","username":"smartu3"},"change_message_id":"4767422d6c35514a99ff528276bc2aaa9763c747","unresolved":false,"context_lines":[{"line_number":340,"context_line":"        object_meta[\u0027list\u0027] \u003d object_list"},{"line_number":341,"context_line":"        object_meta[\u0027id\u0027] \u003d object_id"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        LOG.debug(\u0027Calling eventlet.sleep(0)\u0027)"},{"line_number":344,"context_line":"        eventlet.sleep(0)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    def _prepare_output_data(self, data):"},{"line_number":347,"context_line":"        if self.compressor is None:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f91af0f_099ec353","line":344,"range":{"start_line":343,"start_character":0,"end_line":344,"end_character":25},"updated":"2018-01-04 06:36:53.000000000","message":"If we wrap the whole backup action to native therad, maybe we don\u0027t need this anymore?","commit_id":"03204b5b05acba5bad2508e68e3c8a17080ee6e9"},{"author":{"_account_id":14806,"name":"Chhavi Agarwal","email":"chhagarw@in.ibm.com","username":"chhagarw"},"change_message_id":"0de01adeb3889e79a9337e146bef4aabbc43a102","unresolved":false,"context_lines":[{"line_number":340,"context_line":"        object_meta[\u0027list\u0027] \u003d object_list"},{"line_number":341,"context_line":"        object_meta[\u0027id\u0027] \u003d object_id"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        LOG.debug(\u0027Calling eventlet.sleep(0)\u0027)"},{"line_number":344,"context_line":"        eventlet.sleep(0)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    def _prepare_output_data(self, data):"},{"line_number":347,"context_line":"        if self.compressor is None:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f91af0f_f26ca437","line":344,"range":{"start_line":343,"start_character":0,"end_line":344,"end_character":25},"in_reply_to":"9f91af0f_099ec353","updated":"2018-01-04 09:28:26.000000000","message":"This can be removed now.","commit_id":"03204b5b05acba5bad2508e68e3c8a17080ee6e9"},{"author":{"_account_id":14532,"name":"Gerald McBrearty","email":"gfm@us.ibm.com","username":"gfm"},"change_message_id":"f850f4dffaa1e4347701a126a2291af04ed789c3","unresolved":false,"context_lines":[{"line_number":340,"context_line":"        object_meta[\u0027list\u0027] \u003d object_list"},{"line_number":341,"context_line":"        object_meta[\u0027id\u0027] \u003d object_id"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        LOG.debug(\u0027Calling eventlet.sleep(0)\u0027)"},{"line_number":344,"context_line":"        eventlet.sleep(0)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    def _prepare_output_data(self, data):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f91af0f_145e8643","side":"PARENT","line":343,"updated":"2018-01-08 22:02:33.000000000","message":"There is a comment that this can be removed now. Did you determine that this release of the cpu is still needed?\n\nIf so lets add a comment that says release the cpu so we don\u0027t hog it or remove it is its not needed.","commit_id":"a867b12b761a1fe4874e086d5c2b34366c98fd08"},{"author":{"_account_id":14806,"name":"Chhavi Agarwal","email":"chhagarw@in.ibm.com","username":"chhagarw"},"change_message_id":"e132be34c9f53258eacf555781591763ca24e11c","unresolved":false,"context_lines":[{"line_number":340,"context_line":"        object_meta[\u0027list\u0027] \u003d object_list"},{"line_number":341,"context_line":"        object_meta[\u0027id\u0027] \u003d object_id"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        LOG.debug(\u0027Calling eventlet.sleep(0)\u0027)"},{"line_number":344,"context_line":"        eventlet.sleep(0)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    def _prepare_output_data(self, data):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f91af0f_03f725d5","side":"PARENT","line":343,"in_reply_to":"9f91af0f_145e8643","updated":"2018-01-10 14:44:34.000000000","message":"I had removed this eventlet sleep as we no longer need an additional eventlet sleep now, since now as the entire backup is running on a separate thread, which will not block the main thread for CPU hogging.","commit_id":"a867b12b761a1fe4874e086d5c2b34366c98fd08"},{"author":{"_account_id":14532,"name":"Gerald McBrearty","email":"gfm@us.ibm.com","username":"gfm"},"change_message_id":"f850f4dffaa1e4347701a126a2291af04ed789c3","unresolved":false,"context_lines":[{"line_number":528,"context_line":"                            # We\u0027ve reached the end of extent."},{"line_number":529,"context_line":"                            extent_end \u003d idx * self.sha_block_size_bytes"},{"line_number":530,"context_line":"                            segment \u003d data[extent_off:extent_end]"},{"line_number":531,"context_line":"                            # Run each backup_chunk on a separate native"},{"line_number":532,"context_line":"                            # thread, to avoid CPU starvation."},{"line_number":533,"context_line":"                            self._backup_chunk(backup,"},{"line_number":534,"context_line":"                                               container, segment,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f91af0f_f42522c3","line":531,"updated":"2018-01-08 22:02:33.000000000","message":"What is this comment referring to? That this method is called in a thread or are we missing some code here to put this call in a thread?","commit_id":"9c6c4226a12c954054c49e0b1a3c8ac85711ff2a"},{"author":{"_account_id":14806,"name":"Chhavi Agarwal","email":"chhagarw@in.ibm.com","username":"chhagarw"},"change_message_id":"e132be34c9f53258eacf555781591763ca24e11c","unresolved":false,"context_lines":[{"line_number":528,"context_line":"                            # We\u0027ve reached the end of extent."},{"line_number":529,"context_line":"                            extent_end \u003d idx * self.sha_block_size_bytes"},{"line_number":530,"context_line":"                            segment \u003d data[extent_off:extent_end]"},{"line_number":531,"context_line":"                            # Run each backup_chunk on a separate native"},{"line_number":532,"context_line":"                            # thread, to avoid CPU starvation."},{"line_number":533,"context_line":"                            self._backup_chunk(backup,"},{"line_number":534,"context_line":"                                               container, segment,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f91af0f_432a0d2c","line":531,"in_reply_to":"9f91af0f_f42522c3","updated":"2018-01-10 14:44:34.000000000","message":"I need to remove this comment now, its missed as a part of the old implementation where we were calling the backup_chunks on a thread.","commit_id":"9c6c4226a12c954054c49e0b1a3c8ac85711ff2a"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a3aaf3242641e327b5ed7a1b2ffe904da399c698","unresolved":false,"context_lines":[{"line_number":346,"context_line":"        data_size_bytes \u003d len(data)"},{"line_number":347,"context_line":"        # Execute compression in native thread so it doesn\u0027t prevent"},{"line_number":348,"context_line":"        # cooperative greenthread switching."},{"line_number":349,"context_line":"        compressed_data \u003d eventlet.tpool.execute(self.compressor.compress,"},{"line_number":350,"context_line":"                                                 data)"},{"line_number":351,"context_line":"        comp_size_bytes \u003d len(compressed_data)"},{"line_number":352,"context_line":"        algorithm \u003d CONF.backup_compression_algorithm.lower()"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f91af0f_d07d6fb2","line":349,"updated":"2018-01-09 18:18:12.000000000","message":"-1: It should no longer be necessary to call execute here","commit_id":"5ea61e025142bc0b9bf11ba9747caacf9f2cfcac"},{"author":{"_account_id":14806,"name":"Chhavi Agarwal","email":"chhagarw@in.ibm.com","username":"chhagarw"},"change_message_id":"e132be34c9f53258eacf555781591763ca24e11c","unresolved":false,"context_lines":[{"line_number":346,"context_line":"        data_size_bytes \u003d len(data)"},{"line_number":347,"context_line":"        # Execute compression in native thread so it doesn\u0027t prevent"},{"line_number":348,"context_line":"        # cooperative greenthread switching."},{"line_number":349,"context_line":"        compressed_data \u003d eventlet.tpool.execute(self.compressor.compress,"},{"line_number":350,"context_line":"                                                 data)"},{"line_number":351,"context_line":"        comp_size_bytes \u003d len(compressed_data)"},{"line_number":352,"context_line":"        algorithm \u003d CONF.backup_compression_algorithm.lower()"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f91af0f_f39d130a","line":349,"in_reply_to":"9f91af0f_d07d6fb2","updated":"2018-01-10 14:44:34.000000000","message":"i kept this intentionally considering compress is also a CPU intensive call to have it run on a separate thread.\nIsn\u0027t it better to have it or it should be removed.","commit_id":"5ea61e025142bc0b9bf11ba9747caacf9f2cfcac"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a3aaf3242641e327b5ed7a1b2ffe904da399c698","unresolved":false,"context_lines":[{"line_number":528,"context_line":"                            # We\u0027ve reached the end of extent."},{"line_number":529,"context_line":"                            extent_end \u003d idx * self.sha_block_size_bytes"},{"line_number":530,"context_line":"                            segment \u003d data[extent_off:extent_end]"},{"line_number":531,"context_line":"                            self._backup_chunk(backup,"},{"line_number":532,"context_line":"                                               container, segment,"},{"line_number":533,"context_line":"                                               data_offset + extent_off,"},{"line_number":534,"context_line":"                                               object_meta,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f91af0f_d0a80f21","line":531,"updated":"2018-01-09 18:18:12.000000000","message":"unrelated change","commit_id":"5ea61e025142bc0b9bf11ba9747caacf9f2cfcac"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a3aaf3242641e327b5ed7a1b2ffe904da399c698","unresolved":false,"context_lines":[{"line_number":540,"context_line":"                if extent_off !\u003d -1:"},{"line_number":541,"context_line":"                    extent_end \u003d datalen"},{"line_number":542,"context_line":"                    segment \u003d data[extent_off:extent_end]"},{"line_number":543,"context_line":"                    self._backup_chunk(backup,"},{"line_number":544,"context_line":"                                       container, segment,"},{"line_number":545,"context_line":"                                       data_offset + extent_off,"},{"line_number":546,"context_line":"                                       object_meta,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f91af0f_30b05b8a","line":543,"updated":"2018-01-09 18:18:12.000000000","message":"unrelated change","commit_id":"5ea61e025142bc0b9bf11ba9747caacf9f2cfcac"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a3aaf3242641e327b5ed7a1b2ffe904da399c698","unresolved":false,"context_lines":[{"line_number":629,"context_line":"            if decompressor is not None:"},{"line_number":630,"context_line":"                LOG.debug(\u0027decompressing data using %s algorithm\u0027,"},{"line_number":631,"context_line":"                          compression_algorithm)"},{"line_number":632,"context_line":"                decompressed \u003d eventlet.tpool.execute(decompressor.decompress,"},{"line_number":633,"context_line":"                                                      body)"},{"line_number":634,"context_line":"                volume_file.write(decompressed)"},{"line_number":635,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f91af0f_9064c723","line":632,"updated":"2018-01-09 18:18:12.000000000","message":"-1: This change is not necessary, you are already calling the restore process on a non greenthread thread.","commit_id":"5ea61e025142bc0b9bf11ba9747caacf9f2cfcac"},{"author":{"_account_id":14806,"name":"Chhavi Agarwal","email":"chhagarw@in.ibm.com","username":"chhagarw"},"change_message_id":"e132be34c9f53258eacf555781591763ca24e11c","unresolved":false,"context_lines":[{"line_number":629,"context_line":"            if decompressor is not None:"},{"line_number":630,"context_line":"                LOG.debug(\u0027decompressing data using %s algorithm\u0027,"},{"line_number":631,"context_line":"                          compression_algorithm)"},{"line_number":632,"context_line":"                decompressed \u003d eventlet.tpool.execute(decompressor.decompress,"},{"line_number":633,"context_line":"                                                      body)"},{"line_number":634,"context_line":"                volume_file.write(decompressed)"},{"line_number":635,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f91af0f_a64d0b3f","line":632,"in_reply_to":"9f91af0f_9064c723","updated":"2018-01-10 14:44:34.000000000","message":"ok, it makes sense to remove this now","commit_id":"5ea61e025142bc0b9bf11ba9747caacf9f2cfcac"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"adabac58f7bd409db331b96f2418633f9eabc67b","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        if six.PY3:"},{"line_number":224,"context_line":"            metadata_json \u003d metadata_json.encode(\u0027utf-8\u0027)"},{"line_number":225,"context_line":"        with self.get_object_writer(container, filename) as writer:"},{"line_number":226,"context_line":"            writer.write(metadata_json)"},{"line_number":227,"context_line":"        LOG.debug(\u0027_write_metadata finished. Metadata: %s.\u0027, metadata_json)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    def _write_sha256file(self, backup, volume_id, container, sha256_list):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7f96bb07_9656ab06","line":226,"updated":"2018-01-11 11:45:52.000000000","message":"-1: Missing it here","commit_id":"966ad2a0e4558daee0a61ce8250ebff35bf32050"},{"author":{"_account_id":14806,"name":"Chhavi Agarwal","email":"chhagarw@in.ibm.com","username":"chhagarw"},"change_message_id":"e8205e22404b292c7809747d30f4bd19b108d169","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        if six.PY3:"},{"line_number":224,"context_line":"            metadata_json \u003d metadata_json.encode(\u0027utf-8\u0027)"},{"line_number":225,"context_line":"        with self.get_object_writer(container, filename) as writer:"},{"line_number":226,"context_line":"            writer.write(metadata_json)"},{"line_number":227,"context_line":"        LOG.debug(\u0027_write_metadata finished. Metadata: %s.\u0027, metadata_json)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    def _write_sha256file(self, backup, volume_id, container, sha256_list):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7f96bb07_420296b6","line":226,"in_reply_to":"7f96bb07_9656ab06","updated":"2018-01-11 16:50:19.000000000","message":"metadata and sha file are short files do we really need to put everywhere.","commit_id":"966ad2a0e4558daee0a61ce8250ebff35bf32050"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"adabac58f7bd409db331b96f2418633f9eabc67b","unresolved":false,"context_lines":[{"line_number":244,"context_line":"        if six.PY3:"},{"line_number":245,"context_line":"            sha256file_json \u003d sha256file_json.encode(\u0027utf-8\u0027)"},{"line_number":246,"context_line":"        with self.get_object_writer(container, filename) as writer:"},{"line_number":247,"context_line":"            writer.write(sha256file_json)"},{"line_number":248,"context_line":"        LOG.debug(\u0027_write_sha256file finished.\u0027)"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def _read_metadata(self, backup):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7f96bb07_763d1fba","line":247,"updated":"2018-01-11 11:45:52.000000000","message":"-1: And here","commit_id":"966ad2a0e4558daee0a61ce8250ebff35bf32050"},{"author":{"_account_id":14806,"name":"Chhavi Agarwal","email":"chhagarw@in.ibm.com","username":"chhagarw"},"change_message_id":"e8205e22404b292c7809747d30f4bd19b108d169","unresolved":false,"context_lines":[{"line_number":244,"context_line":"        if six.PY3:"},{"line_number":245,"context_line":"            sha256file_json \u003d sha256file_json.encode(\u0027utf-8\u0027)"},{"line_number":246,"context_line":"        with self.get_object_writer(container, filename) as writer:"},{"line_number":247,"context_line":"            writer.write(sha256file_json)"},{"line_number":248,"context_line":"        LOG.debug(\u0027_write_sha256file finished.\u0027)"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def _read_metadata(self, backup):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7f96bb07_e22c0249","line":247,"in_reply_to":"7f96bb07_763d1fba","updated":"2018-01-11 16:50:19.000000000","message":"same","commit_id":"966ad2a0e4558daee0a61ce8250ebff35bf32050"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"adabac58f7bd409db331b96f2418633f9eabc67b","unresolved":false,"context_lines":[{"line_number":254,"context_line":"                  \u0027metadata filename: %(filename)s.\u0027,"},{"line_number":255,"context_line":"                  {\u0027container\u0027: container, \u0027filename\u0027: filename})"},{"line_number":256,"context_line":"        with self.get_object_reader(container, filename) as reader:"},{"line_number":257,"context_line":"            metadata_json \u003d reader.read()"},{"line_number":258,"context_line":"        if six.PY3:"},{"line_number":259,"context_line":"            metadata_json \u003d metadata_json.decode(\u0027utf-8\u0027)"},{"line_number":260,"context_line":"        metadata \u003d json.loads(metadata_json)"}],"source_content_type":"text/x-python","patch_set":13,"id":"7f96bb07_3647974e","line":257,"updated":"2018-01-11 11:45:52.000000000","message":"-1: And here","commit_id":"966ad2a0e4558daee0a61ce8250ebff35bf32050"},{"author":{"_account_id":14806,"name":"Chhavi Agarwal","email":"chhagarw@in.ibm.com","username":"chhagarw"},"change_message_id":"e8205e22404b292c7809747d30f4bd19b108d169","unresolved":false,"context_lines":[{"line_number":254,"context_line":"                  \u0027metadata filename: %(filename)s.\u0027,"},{"line_number":255,"context_line":"                  {\u0027container\u0027: container, \u0027filename\u0027: filename})"},{"line_number":256,"context_line":"        with self.get_object_reader(container, filename) as reader:"},{"line_number":257,"context_line":"            metadata_json \u003d reader.read()"},{"line_number":258,"context_line":"        if six.PY3:"},{"line_number":259,"context_line":"            metadata_json \u003d metadata_json.decode(\u0027utf-8\u0027)"},{"line_number":260,"context_line":"        metadata \u003d json.loads(metadata_json)"}],"source_content_type":"text/x-python","patch_set":13,"id":"7f96bb07_a21efa09","line":257,"in_reply_to":"7f96bb07_3647974e","updated":"2018-01-11 16:50:19.000000000","message":"same","commit_id":"966ad2a0e4558daee0a61ce8250ebff35bf32050"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"adabac58f7bd409db331b96f2418633f9eabc67b","unresolved":false,"context_lines":[{"line_number":268,"context_line":"                  \u0027sha256 filename: %(filename)s.\u0027,"},{"line_number":269,"context_line":"                  {\u0027container\u0027: container, \u0027filename\u0027: filename})"},{"line_number":270,"context_line":"        with self.get_object_reader(container, filename) as reader:"},{"line_number":271,"context_line":"            sha256file_json \u003d reader.read()"},{"line_number":272,"context_line":"        if six.PY3:"},{"line_number":273,"context_line":"            sha256file_json \u003d sha256file_json.decode(\u0027utf-8\u0027)"},{"line_number":274,"context_line":"        sha256file \u003d json.loads(sha256file_json)"}],"source_content_type":"text/x-python","patch_set":13,"id":"7f96bb07_f67a8f86","line":271,"updated":"2018-01-11 11:45:52.000000000","message":"-1: And here","commit_id":"966ad2a0e4558daee0a61ce8250ebff35bf32050"},{"author":{"_account_id":14806,"name":"Chhavi Agarwal","email":"chhagarw@in.ibm.com","username":"chhagarw"},"change_message_id":"e8205e22404b292c7809747d30f4bd19b108d169","unresolved":false,"context_lines":[{"line_number":268,"context_line":"                  \u0027sha256 filename: %(filename)s.\u0027,"},{"line_number":269,"context_line":"                  {\u0027container\u0027: container, \u0027filename\u0027: filename})"},{"line_number":270,"context_line":"        with self.get_object_reader(container, filename) as reader:"},{"line_number":271,"context_line":"            sha256file_json \u003d reader.read()"},{"line_number":272,"context_line":"        if six.PY3:"},{"line_number":273,"context_line":"            sha256file_json \u003d sha256file_json.decode(\u0027utf-8\u0027)"},{"line_number":274,"context_line":"        sha256file \u003d json.loads(sha256file_json)"}],"source_content_type":"text/x-python","patch_set":13,"id":"7f96bb07_6247924d","line":271,"in_reply_to":"7f96bb07_f67a8f86","updated":"2018-01-11 16:50:19.000000000","message":"I don\u0027t think we need here considering the SHA files will be small data files and not time taking operations.","commit_id":"966ad2a0e4558daee0a61ce8250ebff35bf32050"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"adabac58f7bd409db331b96f2418633f9eabc67b","unresolved":false,"context_lines":[{"line_number":497,"context_line":"                LOG.debug(\u0027Cancel the backup process of %s.\u0027, backup.id)"},{"line_number":498,"context_line":"                break"},{"line_number":499,"context_line":"            data_offset \u003d volume_file.tell()"},{"line_number":500,"context_line":"            data \u003d volume_file.read(self.chunk_size_bytes)"},{"line_number":501,"context_line":"            if data \u003d\u003d b\u0027\u0027:"},{"line_number":502,"context_line":"                break"},{"line_number":503,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"7f96bb07_d69af3c3","line":500,"updated":"2018-01-11 11:45:52.000000000","message":"-1: And here","commit_id":"966ad2a0e4558daee0a61ce8250ebff35bf32050"},{"author":{"_account_id":14806,"name":"Chhavi Agarwal","email":"chhagarw@in.ibm.com","username":"chhagarw"},"change_message_id":"e8205e22404b292c7809747d30f4bd19b108d169","unresolved":false,"context_lines":[{"line_number":497,"context_line":"                LOG.debug(\u0027Cancel the backup process of %s.\u0027, backup.id)"},{"line_number":498,"context_line":"                break"},{"line_number":499,"context_line":"            data_offset \u003d volume_file.tell()"},{"line_number":500,"context_line":"            data \u003d volume_file.read(self.chunk_size_bytes)"},{"line_number":501,"context_line":"            if data \u003d\u003d b\u0027\u0027:"},{"line_number":502,"context_line":"                break"},{"line_number":503,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"7f96bb07_a2e35a05","line":500,"in_reply_to":"7f96bb07_d69af3c3","updated":"2018-01-11 16:50:19.000000000","message":"accepted.","commit_id":"966ad2a0e4558daee0a61ce8250ebff35bf32050"}],"cinder/backup/driver.py":[{"author":{"_account_id":25376,"name":"zhuangzejian","email":"zzj123389602@gmail.com","username":"smartu3"},"change_message_id":"3d11389e72fe45a6cf8e9321b9a8d0843dc967fc","unresolved":false,"context_lines":[{"line_number":388,"context_line":"        \"\"\"Restore a saved backup."},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"        Some I/O operations may block greenthreads, so in order to prevent"},{"line_number":391,"context_line":"        starvation parameter volume_file will be a proxy that will execute all"},{"line_number":392,"context_line":"        methods in native threads, so the method implementation doesn\u0027t need to"},{"line_number":393,"context_line":"        worry about that.."},{"line_number":394,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_d8232055","line":391,"range":{"start_line":391,"start_character":46,"end_line":391,"end_character":56},"updated":"2018-01-19 03:00:03.000000000","message":"You mean that be in a proxy?","commit_id":"dd556fa755adca195e7df82477ae6400f693af14"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"9e6f377db20101f8cb3fc16eb19cfcc5a783badf","unresolved":false,"context_lines":[{"line_number":388,"context_line":"        \"\"\"Restore a saved backup."},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"        Some I/O operations may block greenthreads, so in order to prevent"},{"line_number":391,"context_line":"        starvation parameter volume_file will be a proxy that will execute all"},{"line_number":392,"context_line":"        methods in native threads, so the method implementation doesn\u0027t need to"},{"line_number":393,"context_line":"        worry about that.."},{"line_number":394,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_2d0c3993","line":391,"range":{"start_line":391,"start_character":46,"end_line":391,"end_character":56},"in_reply_to":"7f96bb07_d8232055","updated":"2018-01-19 11:10:51.000000000","message":"I mean that the parameter received here will be a proxy instance.","commit_id":"dd556fa755adca195e7df82477ae6400f693af14"},{"author":{"_account_id":25376,"name":"zhuangzejian","email":"zzj123389602@gmail.com","username":"smartu3"},"change_message_id":"3d11389e72fe45a6cf8e9321b9a8d0843dc967fc","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        Some I/O operations may block greenthreads, so in order to prevent"},{"line_number":391,"context_line":"        starvation parameter volume_file will be a proxy that will execute all"},{"line_number":392,"context_line":"        methods in native threads, so the method implementation doesn\u0027t need to"},{"line_number":393,"context_line":"        worry about that.."},{"line_number":394,"context_line":"        \"\"\""},{"line_number":395,"context_line":"        return"},{"line_number":396,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_f81e1c0a","line":393,"range":{"start_line":393,"start_character":25,"end_line":393,"end_character":26},"updated":"2018-01-19 03:00:03.000000000","message":"redundant .","commit_id":"dd556fa755adca195e7df82477ae6400f693af14"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"9e6f377db20101f8cb3fc16eb19cfcc5a783badf","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        Some I/O operations may block greenthreads, so in order to prevent"},{"line_number":391,"context_line":"        starvation parameter volume_file will be a proxy that will execute all"},{"line_number":392,"context_line":"        methods in native threads, so the method implementation doesn\u0027t need to"},{"line_number":393,"context_line":"        worry about that.."},{"line_number":394,"context_line":"        \"\"\""},{"line_number":395,"context_line":"        return"},{"line_number":396,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_ed25f10b","line":393,"range":{"start_line":393,"start_character":25,"end_line":393,"end_character":26},"in_reply_to":"7f96bb07_f81e1c0a","updated":"2018-01-19 11:10:51.000000000","message":"Thanks, I\u0027ll fix it here and in L382 if I have to submit another patch.","commit_id":"dd556fa755adca195e7df82477ae6400f693af14"}],"cinder/backup/manager.py":[{"author":{"_account_id":25376,"name":"zhuangzejian","email":"zzj123389602@gmail.com","username":"smartu3"},"change_message_id":"4767422d6c35514a99ff528276bc2aaa9763c747","unresolved":false,"context_lines":[{"line_number":535,"context_line":"                    not os.path.isdir(device_path)):"},{"line_number":536,"context_line":"                if secure_enabled:"},{"line_number":537,"context_line":"                    with open(device_path, \u0027wb\u0027) as device_file:"},{"line_number":538,"context_line":"                        backup_service.restore(backup, volume.id, device_file)"},{"line_number":539,"context_line":"                else:"},{"line_number":540,"context_line":"                    with utils.temporary_chown(device_path):"},{"line_number":541,"context_line":"                        with open(device_path, \u0027wb\u0027) as device_file:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f91af0f_c999bb79","line":538,"range":{"start_line":538,"start_character":24,"end_line":538,"end_character":78},"updated":"2018-01-04 06:36:53.000000000","message":"And here.","commit_id":"03204b5b05acba5bad2508e68e3c8a17080ee6e9"},{"author":{"_account_id":25376,"name":"zhuangzejian","email":"zzj123389602@gmail.com","username":"smartu3"},"change_message_id":"4767422d6c35514a99ff528276bc2aaa9763c747","unresolved":false,"context_lines":[{"line_number":539,"context_line":"                else:"},{"line_number":540,"context_line":"                    with utils.temporary_chown(device_path):"},{"line_number":541,"context_line":"                        with open(device_path, \u0027wb\u0027) as device_file:"},{"line_number":542,"context_line":"                            backup_service.restore(backup, volume.id,"},{"line_number":543,"context_line":"                                                   device_file)"},{"line_number":544,"context_line":"            # device_path is already file-like so no need to open it"},{"line_number":545,"context_line":"            else:"},{"line_number":546,"context_line":"                eventlet.tpool.execute(backup_service.restore, backup,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f91af0f_0990034e","line":543,"range":{"start_line":542,"start_character":27,"end_line":543,"end_character":63},"updated":"2018-01-04 06:36:53.000000000","message":"Why not add tpool.execute() here?","commit_id":"03204b5b05acba5bad2508e68e3c8a17080ee6e9"},{"author":{"_account_id":14806,"name":"Chhavi Agarwal","email":"chhagarw@in.ibm.com","username":"chhagarw"},"change_message_id":"0de01adeb3889e79a9337e146bef4aabbc43a102","unresolved":false,"context_lines":[{"line_number":539,"context_line":"                else:"},{"line_number":540,"context_line":"                    with utils.temporary_chown(device_path):"},{"line_number":541,"context_line":"                        with open(device_path, \u0027wb\u0027) as device_file:"},{"line_number":542,"context_line":"                            backup_service.restore(backup, volume.id,"},{"line_number":543,"context_line":"                                                   device_file)"},{"line_number":544,"context_line":"            # device_path is already file-like so no need to open it"},{"line_number":545,"context_line":"            else:"},{"line_number":546,"context_line":"                eventlet.tpool.execute(backup_service.restore, backup,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f91af0f_123a6833","line":543,"range":{"start_line":542,"start_character":27,"end_line":543,"end_character":63},"in_reply_to":"9f91af0f_0990034e","updated":"2018-01-04 09:28:26.000000000","message":"yeah, we need to have the tpool in these conditional path as well.","commit_id":"03204b5b05acba5bad2508e68e3c8a17080ee6e9"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a3aaf3242641e327b5ed7a1b2ffe904da399c698","unresolved":false,"context_lines":[{"line_number":423,"context_line":"                        not os.path.isdir(device_path)):"},{"line_number":424,"context_line":"                    if backup_device.secure_enabled:"},{"line_number":425,"context_line":"                        with open(device_path) as device_file:"},{"line_number":426,"context_line":"                            updates \u003d eventlet.tpool.execute("},{"line_number":427,"context_line":"                                backup_service.backup, backup, device_file)"},{"line_number":428,"context_line":"                    else:"},{"line_number":429,"context_line":"                        with utils.temporary_chown(device_path):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f91af0f_d02b2f92","line":426,"updated":"2018-01-09 18:18:12.000000000","message":"Given the number of issues we have with the backups I think it is a good idea to create the thread here like you are doing, instead of doing it at the chuncked driver level, so other drivers may also benefit from unknowingly having this same issue.","commit_id":"5ea61e025142bc0b9bf11ba9747caacf9f2cfcac"},{"author":{"_account_id":14806,"name":"Chhavi Agarwal","email":"chhagarw@in.ibm.com","username":"chhagarw"},"change_message_id":"e132be34c9f53258eacf555781591763ca24e11c","unresolved":false,"context_lines":[{"line_number":423,"context_line":"                        not os.path.isdir(device_path)):"},{"line_number":424,"context_line":"                    if backup_device.secure_enabled:"},{"line_number":425,"context_line":"                        with open(device_path) as device_file:"},{"line_number":426,"context_line":"                            updates \u003d eventlet.tpool.execute("},{"line_number":427,"context_line":"                                backup_service.backup, backup, device_file)"},{"line_number":428,"context_line":"                    else:"},{"line_number":429,"context_line":"                        with utils.temporary_chown(device_path):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f91af0f_e6feb369","line":426,"in_reply_to":"9f91af0f_d02b2f92","updated":"2018-01-10 14:44:34.000000000","message":"yeah, its good to have the complete backup and restore run on a separate thread.","commit_id":"5ea61e025142bc0b9bf11ba9747caacf9f2cfcac"}],"cinder/tests/unit/backup/test_backup.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a3aaf3242641e327b5ed7a1b2ffe904da399c698","unresolved":false,"context_lines":[{"line_number":754,"context_line":"    def test_run_backup_on_native_thread(self, mock_isdir,"},{"line_number":755,"context_line":"                                         mock_backup_device,"},{"line_number":756,"context_line":"                                         mock_brick):"},{"line_number":757,"context_line":"        # Test to check if run_backup is called on native"},{"line_number":758,"context_line":"        # thread."},{"line_number":759,"context_line":"        backup_service \u003d lambda: None"},{"line_number":760,"context_line":"        backup_service.backup \u003d mock.Mock("},{"line_number":761,"context_line":"            return_value\u003dmock.sentinel.backup_update)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f91af0f_100f5737","line":758,"range":{"start_line":757,"start_character":0,"end_line":758,"end_character":17},"updated":"2018-01-09 18:18:12.000000000","message":"This should be the docstring","commit_id":"5ea61e025142bc0b9bf11ba9747caacf9f2cfcac"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a3aaf3242641e327b5ed7a1b2ffe904da399c698","unresolved":false,"context_lines":[{"line_number":756,"context_line":"                                         mock_brick):"},{"line_number":757,"context_line":"        # Test to check if run_backup is called on native"},{"line_number":758,"context_line":"        # thread."},{"line_number":759,"context_line":"        backup_service \u003d lambda: None"},{"line_number":760,"context_line":"        backup_service.backup \u003d mock.Mock("},{"line_number":761,"context_line":"            return_value\u003dmock.sentinel.backup_update)"},{"line_number":762,"context_line":"        self.backup_mgr.get_backup_driver \u003d lambda x: backup_service"},{"line_number":763,"context_line":"        thread_dict \u003d {}"},{"line_number":764,"context_line":"        original_backup \u003d backup_service.backup"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f91af0f_eb444649","line":761,"range":{"start_line":759,"start_character":0,"end_line":761,"end_character":53},"updated":"2018-01-09 18:18:12.000000000","message":"-1: We should just be using a Mock\n\n backup_service \u003d mock.Mock()","commit_id":"5ea61e025142bc0b9bf11ba9747caacf9f2cfcac"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a3aaf3242641e327b5ed7a1b2ffe904da399c698","unresolved":false,"context_lines":[{"line_number":759,"context_line":"        backup_service \u003d lambda: None"},{"line_number":760,"context_line":"        backup_service.backup \u003d mock.Mock("},{"line_number":761,"context_line":"            return_value\u003dmock.sentinel.backup_update)"},{"line_number":762,"context_line":"        self.backup_mgr.get_backup_driver \u003d lambda x: backup_service"},{"line_number":763,"context_line":"        thread_dict \u003d {}"},{"line_number":764,"context_line":"        original_backup \u003d backup_service.backup"},{"line_number":765,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9f91af0f_4b3e928b","line":762,"updated":"2018-01-09 18:18:12.000000000","message":"-1: We should not be modifying methods directly, we should use self.mock_object instead","commit_id":"5ea61e025142bc0b9bf11ba9747caacf9f2cfcac"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a3aaf3242641e327b5ed7a1b2ffe904da399c698","unresolved":false,"context_lines":[{"line_number":774,"context_line":"        # device_path is represented by a directory"},{"line_number":775,"context_line":"        device_path \u003d \u0027/fake/disk/path/\u0027"},{"line_number":776,"context_line":"        attach_info \u003d {\u0027device\u0027: {\u0027path\u0027: device_path}}"},{"line_number":777,"context_line":"        self.backup_mgr._attach_device \u003d mock.Mock("},{"line_number":778,"context_line":"            return_value\u003dattach_info)"},{"line_number":779,"context_line":"        self.backup_mgr._detach_device \u003d mock.Mock()"},{"line_number":780,"context_line":""},{"line_number":781,"context_line":"        with mock.patch.object(backup_service, \u0027backup\u0027,"},{"line_number":782,"context_line":"                               side_effect\u003dmy_backup):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f91af0f_2b49ce2f","line":779,"range":{"start_line":777,"start_character":0,"end_line":779,"end_character":52},"updated":"2018-01-09 18:18:12.000000000","message":"-1: We should be using self.mock_object instead","commit_id":"5ea61e025142bc0b9bf11ba9747caacf9f2cfcac"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a3aaf3242641e327b5ed7a1b2ffe904da399c698","unresolved":false,"context_lines":[{"line_number":811,"context_line":"        self.backup_mgr._attach_device \u003d mock.Mock("},{"line_number":812,"context_line":"            return_value\u003dattach_info)"},{"line_number":813,"context_line":"        self.backup_mgr._detach_device \u003d mock.Mock()"},{"line_number":814,"context_line":""},{"line_number":815,"context_line":"        output \u003d self.backup_mgr._run_backup(self.ctxt, backup,"},{"line_number":816,"context_line":"                                             volume)"},{"line_number":817,"context_line":"        mock_chown.assert_not_called()"},{"line_number":818,"context_line":"        mock_open.assert_not_called()"},{"line_number":819,"context_line":"        backup_service.backup.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":9,"id":"9f91af0f_eb168649","line":816,"range":{"start_line":814,"start_character":0,"end_line":816,"end_character":52},"updated":"2018-01-09 18:18:12.000000000","message":"unnecessary changes","commit_id":"5ea61e025142bc0b9bf11ba9747caacf9f2cfcac"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a3aaf3242641e327b5ed7a1b2ffe904da399c698","unresolved":false,"context_lines":[{"line_number":1110,"context_line":"    @mock.patch.object(os.path, \u0027isdir\u0027, return_value\u003dTrue)"},{"line_number":1111,"context_line":"    def test_run_restore_on_native_thread(self, mock_isdir,"},{"line_number":1112,"context_line":"                                          mock_brick):"},{"line_number":1113,"context_line":"        # Test to check if restore is called on native"},{"line_number":1114,"context_line":"        # thread."},{"line_number":1115,"context_line":"        backup_service \u003d lambda: None"},{"line_number":1116,"context_line":"        backup_service.restore \u003d mock.Mock("},{"line_number":1117,"context_line":"            return_value\u003dmock.sentinel.backup_update)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f91af0f_d0048f1a","line":1114,"range":{"start_line":1113,"start_character":0,"end_line":1114,"end_character":17},"updated":"2018-01-09 18:18:12.000000000","message":"This should be the docstring","commit_id":"5ea61e025142bc0b9bf11ba9747caacf9f2cfcac"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a3aaf3242641e327b5ed7a1b2ffe904da399c698","unresolved":false,"context_lines":[{"line_number":1112,"context_line":"                                          mock_brick):"},{"line_number":1113,"context_line":"        # Test to check if restore is called on native"},{"line_number":1114,"context_line":"        # thread."},{"line_number":1115,"context_line":"        backup_service \u003d lambda: None"},{"line_number":1116,"context_line":"        backup_service.restore \u003d mock.Mock("},{"line_number":1117,"context_line":"            return_value\u003dmock.sentinel.backup_update)"},{"line_number":1118,"context_line":"        self.backup_mgr.get_backup_driver \u003d lambda x: backup_service"},{"line_number":1119,"context_line":"        vol_id \u003d self._create_volume_db_entry()"},{"line_number":1120,"context_line":"        backup \u003d self._create_backup_db_entry(volume_id\u003dvol_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f91af0f_6b803647","line":1117,"range":{"start_line":1115,"start_character":0,"end_line":1117,"end_character":53},"updated":"2018-01-09 18:18:12.000000000","message":"-1: Same as above","commit_id":"5ea61e025142bc0b9bf11ba9747caacf9f2cfcac"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a3aaf3242641e327b5ed7a1b2ffe904da399c698","unresolved":false,"context_lines":[{"line_number":1115,"context_line":"        backup_service \u003d lambda: None"},{"line_number":1116,"context_line":"        backup_service.restore \u003d mock.Mock("},{"line_number":1117,"context_line":"            return_value\u003dmock.sentinel.backup_update)"},{"line_number":1118,"context_line":"        self.backup_mgr.get_backup_driver \u003d lambda x: backup_service"},{"line_number":1119,"context_line":"        vol_id \u003d self._create_volume_db_entry()"},{"line_number":1120,"context_line":"        backup \u003d self._create_backup_db_entry(volume_id\u003dvol_id)"},{"line_number":1121,"context_line":"        volume \u003d objects.Volume.get_by_id(self.ctxt, vol_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f91af0f_8b61faab","line":1118,"updated":"2018-01-09 18:18:12.000000000","message":"-1: Same as above","commit_id":"5ea61e025142bc0b9bf11ba9747caacf9f2cfcac"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a3aaf3242641e327b5ed7a1b2ffe904da399c698","unresolved":false,"context_lines":[{"line_number":1133,"context_line":"        # device_path is represented by a directory"},{"line_number":1134,"context_line":"        device_path \u003d \u0027/fake/disk/path/\u0027"},{"line_number":1135,"context_line":"        attach_info \u003d {\u0027device\u0027: {\u0027path\u0027: device_path}}"},{"line_number":1136,"context_line":"        self.backup_mgr._attach_device \u003d mock.Mock("},{"line_number":1137,"context_line":"            return_value\u003dattach_info)"},{"line_number":1138,"context_line":"        self.backup_mgr._detach_device \u003d mock.Mock()"},{"line_number":1139,"context_line":""},{"line_number":1140,"context_line":"        with mock.patch.object(backup_service, \u0027restore\u0027,"},{"line_number":1141,"context_line":"                               side_effect\u003dmy_restore):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f91af0f_eb4e8636","line":1138,"range":{"start_line":1136,"start_character":0,"end_line":1138,"end_character":52},"updated":"2018-01-09 18:18:12.000000000","message":"-1: Same as above","commit_id":"5ea61e025142bc0b9bf11ba9747caacf9f2cfcac"},{"author":{"_account_id":13157,"name":"Zhao Chao","email":"zhaochao1984@gmail.com","username":"zhaochao"},"change_message_id":"1b0a580bf919ddcb3ed03683e677b276baede3ff","unresolved":false,"context_lines":[{"line_number":814,"context_line":"        self.backup_mgr._attach_device \u003d mock.Mock("},{"line_number":815,"context_line":"            return_value\u003dattach_info)"},{"line_number":816,"context_line":"        self.backup_mgr._detach_device \u003d mock.Mock()"},{"line_number":817,"context_line":""},{"line_number":818,"context_line":"        output \u003d self.backup_mgr._run_backup(self.ctxt, backup, volume)"},{"line_number":819,"context_line":"        mock_chown.assert_not_called()"},{"line_number":820,"context_line":"        mock_open.assert_not_called()"}],"source_content_type":"text/x-python","patch_set":10,"id":"9f91af0f_d99d89bc","line":817,"updated":"2018-01-10 11:03:52.000000000","message":"unrelated chnage.","commit_id":"70094a4c8ad5759666bf6bb7fa94700541580fa3"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"6033512d31289d81eabc7135dc7dbad94952b154","unresolved":false,"context_lines":[{"line_number":814,"context_line":"        self.backup_mgr._attach_device \u003d mock.Mock("},{"line_number":815,"context_line":"            return_value\u003dattach_info)"},{"line_number":816,"context_line":"        self.backup_mgr._detach_device \u003d mock.Mock()"},{"line_number":817,"context_line":""},{"line_number":818,"context_line":"        output \u003d self.backup_mgr._run_backup(self.ctxt, backup, volume)"},{"line_number":819,"context_line":"        mock_chown.assert_not_called()"},{"line_number":820,"context_line":"        mock_open.assert_not_called()"}],"source_content_type":"text/x-python","patch_set":10,"id":"9f91af0f_ff306d58","line":817,"in_reply_to":"9f91af0f_d99d89bc","updated":"2018-01-10 12:58:37.000000000","message":"I agree, we should not be making this change.","commit_id":"70094a4c8ad5759666bf6bb7fa94700541580fa3"},{"author":{"_account_id":14806,"name":"Chhavi Agarwal","email":"chhagarw@in.ibm.com","username":"chhagarw"},"change_message_id":"e132be34c9f53258eacf555781591763ca24e11c","unresolved":false,"context_lines":[{"line_number":814,"context_line":"        self.backup_mgr._attach_device \u003d mock.Mock("},{"line_number":815,"context_line":"            return_value\u003dattach_info)"},{"line_number":816,"context_line":"        self.backup_mgr._detach_device \u003d mock.Mock()"},{"line_number":817,"context_line":""},{"line_number":818,"context_line":"        output \u003d self.backup_mgr._run_backup(self.ctxt, backup, volume)"},{"line_number":819,"context_line":"        mock_chown.assert_not_called()"},{"line_number":820,"context_line":"        mock_open.assert_not_called()"}],"source_content_type":"text/x-python","patch_set":10,"id":"9f91af0f_ada07f43","line":817,"in_reply_to":"9f91af0f_d99d89bc","updated":"2018-01-10 14:44:34.000000000","message":"yeah i am fixing it","commit_id":"70094a4c8ad5759666bf6bb7fa94700541580fa3"}]}
