)]}'
{"nova/virt/libvirt/imagecache.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ad0623cf1cca628d9621792acb7340402b2ad359","unresolved":false,"context_lines":[{"line_number":327,"context_line":""},{"line_number":328,"context_line":"        # NOTE(mdbooth): This is always True, because we\u0027re currently in a"},{"line_number":329,"context_line":"        # loop in _age_and_verify_cached_images over images in used_images,"},{"line_number":330,"context_line":"        # one of which was passed to this function."},{"line_number":331,"context_line":"        if img_id in self.used_images:"},{"line_number":332,"context_line":"            local, remote, instances \u003d self.used_images[img_id]"},{"line_number":333,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_b7887f72","line":330,"updated":"2016-07-06 15:55:41.000000000","message":"What if another thread has removed the image from self.used_images in between the time _age_and_verify_cached_images() was called and this line here? I believe that is why this check is here...","commit_id":"6b071848898730457ddcd49f58e18164b3d64df5"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"9bc2bbfcb16d5df1291c9cad4bdfff636696b707","unresolved":false,"context_lines":[{"line_number":327,"context_line":""},{"line_number":328,"context_line":"        # NOTE(mdbooth): This is always True, because we\u0027re currently in a"},{"line_number":329,"context_line":"        # loop in _age_and_verify_cached_images over images in used_images,"},{"line_number":330,"context_line":"        # one of which was passed to this function."},{"line_number":331,"context_line":"        if img_id in self.used_images:"},{"line_number":332,"context_line":"            local, remote, instances \u003d self.used_images[img_id]"},{"line_number":333,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_3306e120","line":330,"in_reply_to":"1aa78d24_b7887f72","updated":"2016-08-03 10:39:36.000000000","message":"It does seem possible that a delete happened in between these two points.","commit_id":"6b071848898730457ddcd49f58e18164b3d64df5"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"d28eadc875c1ef1a5bb75af049bacb4a328e97d0","unresolved":false,"context_lines":[{"line_number":327,"context_line":""},{"line_number":328,"context_line":"        # NOTE(mdbooth): This is always True, because we\u0027re currently in a"},{"line_number":329,"context_line":"        # loop in _age_and_verify_cached_images over images in used_images,"},{"line_number":330,"context_line":"        # one of which was passed to this function."},{"line_number":331,"context_line":"        if img_id in self.used_images:"},{"line_number":332,"context_line":"            local, remote, instances \u003d self.used_images[img_id]"},{"line_number":333,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_82b495d1","line":330,"in_reply_to":"bacf61ea_3306e120","updated":"2016-08-03 12:08:38.000000000","message":"Sorry, I originally put this comment in the wrong place:\n\nI was going to write that manage_image_cache() can never be called simultaneously by 2 threads because it\u0027s guarded by a lock... but it\u0027s not. That\u0027s a separate bug :) However, as the check interval is 40 minutes (that\u0027s a weird interval), it\u0027s clearly never intended that 2 should run simultaneously on the same host, and absent something performing extremely poortly it\u0027s not likely in practise that it ever would. But there should still be a lock. Not related to this patch, though. That\u0027s broken either way.\n\nThe global state in ImageCacheManager is also a bug, btw: it should all be on the stack. That\u0027s a job for another day.","commit_id":"6b071848898730457ddcd49f58e18164b3d64df5"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ad0623cf1cca628d9621792acb7340402b2ad359","unresolved":false,"context_lines":[{"line_number":352,"context_line":"                # NOTE(mdbooth): This is never True, as _find_base_file does"},{"line_number":353,"context_line":"                # not return empty base_files. An exists check doesn\u0027t work"},{"line_number":354,"context_line":"                # here, either, because if it didn\u0027t exist it wouldn\u0027t have"},{"line_number":355,"context_line":"                # been returned by _find_base_file."},{"line_number":356,"context_line":"                if not base_file:"},{"line_number":357,"context_line":"                    LOG.warning(_LW(\u0027image %(id)s at (%(base_file)s): warning \u0027"},{"line_number":358,"context_line":"                                 \u0027-- an absent base file is in use! \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_177a3377","line":355,"updated":"2016-07-06 15:55:41.000000000","message":"Furthermore, if base_file was actually None, we just added a None element to the self.active_base_files list on line 340... :(","commit_id":"6b071848898730457ddcd49f58e18164b3d64df5"}]}
