)]}'
{"tooz/drivers/etcd.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"a32e7b33bb1c6d09fb3fd31a8542f9f6a5f6761e","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    return wrapper"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"def lock_decorator(func):"},{"line_number":53,"context_line":"    @six.wraps(func)"},{"line_number":54,"context_line":"    def inner(self, *args, **kwargs):"},{"line_number":55,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_909be717","line":52,"range":{"start_line":52,"start_character":4,"end_line":52,"end_character":18},"updated":"2016-07-26 12:11:09.000000000","message":"lock_for_heartbeat?","commit_id":"954e56b340dcbedbad18ed7221d17a24b0f27674"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"64d6cd687c3b3c172f47481991266429c10a07bf","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    return wrapper"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"def lock_decorator(func):"},{"line_number":53,"context_line":"    @six.wraps(func)"},{"line_number":54,"context_line":"    def inner(self, *args, **kwargs):"},{"line_number":55,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_930bf1d5","line":52,"range":{"start_line":52,"start_character":4,"end_line":52,"end_character":18},"in_reply_to":"dada55a8_13dc2172","updated":"2016-07-26 12:17:38.000000000","message":"Right. Comment is good. I don\u0027t like the name because it\u0027s generic but since it\u0027s very scoped, I could live with it. :)","commit_id":"954e56b340dcbedbad18ed7221d17a24b0f27674"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"18d59f180cd70ee2a14f1e6ea5e7470f67a7881f","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    return wrapper"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"def lock_decorator(func):"},{"line_number":53,"context_line":"    @six.wraps(func)"},{"line_number":54,"context_line":"    def inner(self, *args, **kwargs):"},{"line_number":55,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_13dc2172","line":52,"range":{"start_line":52,"start_character":4,"end_line":52,"end_character":18},"in_reply_to":"dada55a8_909be717","updated":"2016-07-26 12:15:49.000000000","message":"I\u0027m reluctant to rename it like so since it technically also locks concurrent release() and acquire(), for example.\n\nI\u0027m game with adding an explicit comment on why this is needed, though.","commit_id":"954e56b340dcbedbad18ed7221d17a24b0f27674"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"a32e7b33bb1c6d09fb3fd31a8542f9f6a5f6761e","unresolved":false,"context_lines":[{"line_number":52,"context_line":"def lock_decorator(func):"},{"line_number":53,"context_line":"    @six.wraps(func)"},{"line_number":54,"context_line":"    def inner(self, *args, **kwargs):"},{"line_number":55,"context_line":"        try:"},{"line_number":56,"context_line":"            self._lock.acquire(blocking\u003dTrue)"},{"line_number":57,"context_line":"            return func(self, *args, **kwargs)"},{"line_number":58,"context_line":"        finally:"},{"line_number":59,"context_line":"            self._lock.release()"},{"line_number":60,"context_line":"    return inner"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_70e3d3a4","line":59,"range":{"start_line":55,"start_character":8,"end_line":59,"end_character":32},"updated":"2016-07-26 12:11:09.000000000","message":"with self._lock:\n  return func(self, *args, **kwargs)\n\n\n#protip","commit_id":"954e56b340dcbedbad18ed7221d17a24b0f27674"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"18d59f180cd70ee2a14f1e6ea5e7470f67a7881f","unresolved":false,"context_lines":[{"line_number":52,"context_line":"def lock_decorator(func):"},{"line_number":53,"context_line":"    @six.wraps(func)"},{"line_number":54,"context_line":"    def inner(self, *args, **kwargs):"},{"line_number":55,"context_line":"        try:"},{"line_number":56,"context_line":"            self._lock.acquire(blocking\u003dTrue)"},{"line_number":57,"context_line":"            return func(self, *args, **kwargs)"},{"line_number":58,"context_line":"        finally:"},{"line_number":59,"context_line":"            self._lock.release()"},{"line_number":60,"context_line":"    return inner"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_136701ea","line":59,"range":{"start_line":55,"start_character":8,"end_line":59,"end_character":32},"in_reply_to":"dada55a8_70e3d3a4","updated":"2016-07-26 12:15:49.000000000","message":"#protipforlife","commit_id":"954e56b340dcbedbad18ed7221d17a24b0f27674"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"a32e7b33bb1c6d09fb3fd31a8542f9f6a5f6761e","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        self.ttl \u003d ttl"},{"line_number":106,"context_line":"        self._lock_url \u003d lock_url"},{"line_number":107,"context_line":"        self._node \u003d None"},{"line_number":108,"context_line":"        self._lock \u003d threading.Lock()"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    @_translate_failures"},{"line_number":111,"context_line":"    @lock_decorator"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_1001b738","line":108,"updated":"2016-07-26 12:11:09.000000000","message":"Since this is for heartbeat, can we call it heartbeat_lock?","commit_id":"954e56b340dcbedbad18ed7221d17a24b0f27674"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"18d59f180cd70ee2a14f1e6ea5e7470f67a7881f","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        self.ttl \u003d ttl"},{"line_number":106,"context_line":"        self._lock_url \u003d lock_url"},{"line_number":107,"context_line":"        self._node \u003d None"},{"line_number":108,"context_line":"        self._lock \u003d threading.Lock()"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    @_translate_failures"},{"line_number":111,"context_line":"    @lock_decorator"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_73e59d36","line":108,"in_reply_to":"dada55a8_1001b738","updated":"2016-07-26 12:15:49.000000000","message":"Again same as line 52","commit_id":"954e56b340dcbedbad18ed7221d17a24b0f27674"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"18d59f180cd70ee2a14f1e6ea5e7470f67a7881f","unresolved":false,"context_lines":[{"line_number":148,"context_line":"            try:"},{"line_number":149,"context_line":"                reply \u003d self.client.get("},{"line_number":150,"context_line":"                    self._lock_url +"},{"line_number":151,"context_line":"                    \"?wait\u003dtrue\u0026waitIndex\u003d%d\" % (reply[\u0027index\u0027] + 1),"},{"line_number":152,"context_line":"                    make_url\u003dFalse,"},{"line_number":153,"context_line":"                    timeout\u003dwatch.leftover() if watch else None)"},{"line_number":154,"context_line":"            except requests.exceptions.RequestException:"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_b3ea750d","line":151,"range":{"start_line":151,"start_character":48,"end_line":151,"end_character":68},"updated":"2016-07-26 12:15:49.000000000","message":"This is unrelated :O","commit_id":"954e56b340dcbedbad18ed7221d17a24b0f27674"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"64d6cd687c3b3c172f47481991266429c10a07bf","unresolved":false,"context_lines":[{"line_number":148,"context_line":"            try:"},{"line_number":149,"context_line":"                reply \u003d self.client.get("},{"line_number":150,"context_line":"                    self._lock_url +"},{"line_number":151,"context_line":"                    \"?wait\u003dtrue\u0026waitIndex\u003d%d\" % (reply[\u0027index\u0027] + 1),"},{"line_number":152,"context_line":"                    make_url\u003dFalse,"},{"line_number":153,"context_line":"                    timeout\u003dwatch.leftover() if watch else None)"},{"line_number":154,"context_line":"            except requests.exceptions.RequestException:"}],"source_content_type":"text/x-python","patch_set":2,"id":"dada55a8_73011daf","line":151,"range":{"start_line":151,"start_character":48,"end_line":151,"end_character":68},"in_reply_to":"dada55a8_b3ea750d","updated":"2016-07-26 12:17:38.000000000","message":"good catch… on your own patch lol","commit_id":"954e56b340dcbedbad18ed7221d17a24b0f27674"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"0aa53a71c1b3039dc113890ac6d4532b86249dd6","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    return wrapper"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"def lock_decorator(func):"},{"line_number":53,"context_line":"    # NOTE(jschwarz): this locking decorator is mainly used to prevent"},{"line_number":54,"context_line":"    # concurrent runs of hearthbeat() with another function. See"},{"line_number":55,"context_line":"    # https://bugs.launchpad.net/python-tooz/+bug/1603005 for more details."}],"source_content_type":"text/x-python","patch_set":3,"id":"dada55a8_8afd63b3","line":52,"updated":"2016-07-26 15:54:08.000000000","message":"Extra protip,\n\nI already have this decorator in a package that can be used here ;)\n\nhttps://github.com/harlowja/fasteners/blob/master/fasteners/lock.py#L270\n\nhttp://fasteners.readthedocs.io/en/latest/api/lock.html#decorators\n\nMight as well just import fasteners and use it.\n\n    \u003e\u003e\u003e import fasteners\n    \u003e\u003e\u003e import threading\n    \u003e\u003e\u003e class A(object):\n    ...   def __init__(self):\n    ...     self._lock \u003d threading.Lock()\n    ...   @fasteners.locked\n    ...   def b(self):\n    ...     pass\n    ...\n    \u003e\u003e\u003e a \u003d A()\n    \u003e\u003e\u003e a.b()\n    \u003e\u003e\u003e","commit_id":"8820374bc9fdc672af476e3264ccfeb3012c90fa"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"34b7edb9a11ee3f13dec396161507a81bcc7f528","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    return wrapper"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"def lock_decorator(func):"},{"line_number":53,"context_line":"    # NOTE(jschwarz): this locking decorator is mainly used to prevent"},{"line_number":54,"context_line":"    # concurrent runs of hearthbeat() with another function. See"},{"line_number":55,"context_line":"    # https://bugs.launchpad.net/python-tooz/+bug/1603005 for more details."}],"source_content_type":"text/x-python","patch_set":3,"id":"dada55a8_6d6108d3","line":52,"in_reply_to":"dada55a8_8afd63b3","updated":"2016-07-27 08:15:07.000000000","message":"Done","commit_id":"8820374bc9fdc672af476e3264ccfeb3012c90fa"}]}
