)]}'
{"heat/engine/service.py":[{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"8eb6622c5643c87d97c284b3da2b2fc3ac573ec0","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        return self.stg[stack_id].add_thread(func, *args, **kwargs)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _start_thread_with_lock(self, cnxt, stack, func, *args):"},{"line_number":87,"context_line":"        lock \u003d stack_lock.StackLock(cnxt, stack)"},{"line_number":88,"context_line":"        lock.acquire()"},{"line_number":89,"context_line":"        th \u003d self._start_in_thread(stack.id, func, *args)"},{"line_number":90,"context_line":"        th.link(lock._gt_callback_release)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FMlY%3D","line":87,"updated":"2013-11-13 03:15:12.000000000","message":"Doesn\u0027t this mean that for generate_uuid, a new uuid will be generated for every lock? I think the UUID should be stable for the life of the engine process, so maybe the engine_id should be set in EngineService __init__ and passed to the StackLock in the constructor.","commit_id":"326c9a36ca5f9333ba44657895bdf5a46f43b8c8"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"a54dd2a235c80570550d5374b38ae7f4592b271b","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        return self.stg[stack_id].add_thread(func, *args, **kwargs)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _start_thread_with_lock(self, cnxt, stack, func, *args):"},{"line_number":87,"context_line":"        lock \u003d stack_lock.StackLock(cnxt, stack)"},{"line_number":88,"context_line":"        lock.acquire()"},{"line_number":89,"context_line":"        th \u003d self._start_in_thread(stack.id, func, *args)"},{"line_number":90,"context_line":"        th.link(lock._gt_callback_release)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FJt8%3D","line":87,"in_reply_to":"AAAATn%2F%2FMlY%3D","updated":"2013-11-13 17:56:40.000000000","message":"BTW, the fix will be in the other review.","commit_id":"326c9a36ca5f9333ba44657895bdf5a46f43b8c8"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"2d39c6f6a54bc215664c7e74dc73b91a675ceb32","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        return self.stg[stack_id].add_thread(func, *args, **kwargs)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _start_thread_with_lock(self, cnxt, stack, func, *args):"},{"line_number":87,"context_line":"        lock \u003d stack_lock.StackLock(cnxt, stack)"},{"line_number":88,"context_line":"        lock.acquire()"},{"line_number":89,"context_line":"        th \u003d self._start_in_thread(stack.id, func, *args)"},{"line_number":90,"context_line":"        th.link(lock._gt_callback_release)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FJvM%3D","line":87,"in_reply_to":"AAAATn%2F%2FMlY%3D","updated":"2013-11-13 17:47:24.000000000","message":"Yes, sorry, this was a silly mistake.  I\u0027ll fix this.","commit_id":"326c9a36ca5f9333ba44657895bdf5a46f43b8c8"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"211b8683b00dc75c9c1cefd6af5ddefb0c9fb7ce","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def _start_thread_with_lock(self, cnxt, stack, func, *args):"},{"line_number":105,"context_line":"        lock \u003d stack_lock.StackLock(cnxt, stack)"},{"line_number":106,"context_line":"        lock.acquire()"},{"line_number":107,"context_line":"        th \u003d self._start_in_thread(stack.id, func, *args)"},{"line_number":108,"context_line":"        th.link(lock._gt_callback_release)"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BPA4%3D","line":106,"updated":"2013-11-28 14:48:49.000000000","message":"There\u0027s actually a bunch of places where exceptions could occur that would result in the lock not being released. Maybe we need to do something like:\n\n  lock \u003d stack_lock.StackLock(cnxt, stack)\n\n  def release():\n      gt.wait()\n      lock.release()\n\n  lock.acquire()\n  try:\n      th \u003d self._start_in_thread(stack.id, func, *args)\n      th.link(release)\n  except:\n      with excutils.save_and_reraise_exception():\n          lock.release()","commit_id":"576658a765930db5b2ee452dcce3dde3eabcd9d3"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"fc30889d0d8c3bef1abdf34059b2ddfbde83e7d6","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def _start_thread_with_lock(self, cnxt, stack, func, *args):"},{"line_number":105,"context_line":"        lock \u003d stack_lock.StackLock(cnxt, stack)"},{"line_number":106,"context_line":"        lock.acquire()"},{"line_number":107,"context_line":"        th \u003d self._start_in_thread(stack.id, func, *args)"},{"line_number":108,"context_line":"        th.link(lock._gt_callback_release)"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F9%2B6w%3D","line":106,"in_reply_to":"AAAATn%2F%2BPA4%3D","updated":"2013-12-03 20:55:38.000000000","message":"Done","commit_id":"576658a765930db5b2ee452dcce3dde3eabcd9d3"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"211b8683b00dc75c9c1cefd6af5ddefb0c9fb7ce","unresolved":false,"context_lines":[{"line_number":319,"context_line":"        stack.store()"},{"line_number":320,"context_line":"        stack_identity \u003d stack.identifier()"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        self._start_thread_with_lock(cnxt, stack, _stack_create, stack)"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"        return dict(stack_identity)"},{"line_number":325,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BO6A%3D","line":322,"updated":"2013-11-28 14:48:49.000000000","message":"Here we\u0027re passing a parser.Stack object, and elsewhere we are parsing a DB record. We need to clarify which one is correct (I vote for parser.Stack), document it and be consistent. (Unit tests to verify it wouldn\u0027t hurt either.)","commit_id":"576658a765930db5b2ee452dcce3dde3eabcd9d3"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"fc30889d0d8c3bef1abdf34059b2ddfbde83e7d6","unresolved":false,"context_lines":[{"line_number":319,"context_line":"        stack.store()"},{"line_number":320,"context_line":"        stack_identity \u003d stack.identifier()"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        self._start_thread_with_lock(cnxt, stack, _stack_create, stack)"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"        return dict(stack_identity)"},{"line_number":325,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F9%2BlY%3D","line":322,"in_reply_to":"AAAATn%2F%2BO6A%3D","updated":"2013-12-03 20:55:38.000000000","message":"Done","commit_id":"576658a765930db5b2ee452dcce3dde3eabcd9d3"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"211b8683b00dc75c9c1cefd6af5ddefb0c9fb7ce","unresolved":false,"context_lines":[{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        self._start_thread_with_lock(cnxt, stack, _stack_create, stack)"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"        return dict(stack_identity)"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    @request_context"},{"line_number":327,"context_line":"    def update_stack(self, cnxt, stack_identity, template, params,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BO7E%3D","line":324,"updated":"2013-11-28 14:48:49.000000000","message":"This change appears gratuitous?","commit_id":"576658a765930db5b2ee452dcce3dde3eabcd9d3"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"fc30889d0d8c3bef1abdf34059b2ddfbde83e7d6","unresolved":false,"context_lines":[{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        self._start_thread_with_lock(cnxt, stack, _stack_create, stack)"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"        return dict(stack_identity)"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    @request_context"},{"line_number":327,"context_line":"    def update_stack(self, cnxt, stack_identity, template, params,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F9%2B8Y%3D","line":324,"in_reply_to":"AAAATn%2F%2BO7E%3D","updated":"2013-12-03 20:55:38.000000000","message":"Yep, left overs from a previous change. Done","commit_id":"576658a765930db5b2ee452dcce3dde3eabcd9d3"}]}
