)]}'
{"openstack/_adapter.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4fe78e5c648f3caf782b74367e8f4fe259d8e518","unresolved":false,"context_lines":[{"line_number":119,"context_line":"    def __init__("},{"line_number":120,"context_line":"            self, session\u003dNone,"},{"line_number":121,"context_line":"            task_manager\u003dNone,"},{"line_number":122,"context_line":"            rate_limit\u003dNone, concurrency\u003dNone,"},{"line_number":123,"context_line":"            *args, **kwargs):"},{"line_number":124,"context_line":"        super(OpenStackSDKAdapter, self).__init__("},{"line_number":125,"context_line":"            session\u003dsession, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_67730350","side":"PARENT","line":122,"range":{"start_line":122,"start_character":45,"end_line":122,"end_character":46},"updated":"2018-09-25 20:44:20.000000000","message":"Still need that comma.","commit_id":"49065eba33b7468ecf62dfd82ef4fd411ad5a7e7"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"5675b23b2e971011750ceff0c3e1e6aa25986267","unresolved":false,"context_lines":[{"line_number":119,"context_line":"    def __init__("},{"line_number":120,"context_line":"            self, session\u003dNone,"},{"line_number":121,"context_line":"            task_manager\u003dNone,"},{"line_number":122,"context_line":"            rate_limit\u003dNone, concurrency\u003dNone,"},{"line_number":123,"context_line":"            *args, **kwargs):"},{"line_number":124,"context_line":"        super(OpenStackSDKAdapter, self).__init__("},{"line_number":125,"context_line":"            session\u003dsession, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_176ee4fd","side":"PARENT","line":122,"range":{"start_line":122,"start_character":45,"end_line":122,"end_character":46},"in_reply_to":"3f79a3b5_67730350","updated":"2018-09-26 18:51:28.000000000","message":"Doh.","commit_id":"49065eba33b7468ecf62dfd82ef4fd411ad5a7e7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4fe78e5c648f3caf782b74367e8f4fe259d8e518","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                # We need to wait for a ticket before we can execute"},{"line_number":138,"context_line":"                ticket \u003d threading.Event()"},{"line_number":139,"context_line":"                self._queue.put(ticket)"},{"line_number":140,"context_line":"                ticket.wait()"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def __exit__(self, exc_type, exc_value, traceback):"},{"line_number":143,"context_line":"        # If concurrent is None, everyone is free to immediately execute"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_547793a0","line":140,"updated":"2018-09-25 20:44:20.000000000","message":"I think this is going to cause a deadlock. Thread A takes the lock, realizes it can\u0027t execute yet, and waits on the ticket *while still holding the lock*. But when thread B comes along and calls __exit__, it needs to grab the lock before it can go looking for tickets. For example:\n\n \u003e\u003e\u003e from openstack._adapter import FairSemaphore\n \u003e\u003e\u003e import threading\n \u003e\u003e\u003e import time\n \u003e\u003e\u003e s \u003d FairSemaphore(1)\n \u003e\u003e\u003e def target():\n ...     with s:\n ...         print(\u0027Did work\u0027)\n ...         time.sleep(0.1)\n ...\n \u003e\u003e\u003e threads \u003d [threading.Thread(target\u003dtarget) for _ in range(3)]\n \u003e\u003e\u003e for t in threads: t.start()\n ...\n Did work\n Did work\n \u003e\u003e\u003e\n\nand I never get the third thread to fire. We can dig in a bit more, to verify our state:\n\n \u003e\u003e\u003e import sys, traceback\n \u003e\u003e\u003e for stack in sys._current_frames().values():\n ...     print(\u0027\u0027)\n ...     traceback.print_stack(stack)\n ...\n\n   File \".../python2.7/threading.py\", line 783, in __bootstrap\n     self.__bootstrap_inner()\n   File \".../python2.7/threading.py\", line 810, in __bootstrap_inner\n     self.run()\n   File \".../python2.7/threading.py\", line 763, in run\n     self.__target(*self.__args, **self.__kwargs)\n   File \"\u003cstdin\u003e\", line 2, in target\n   File \"openstack/_adapter.py\", line 140, in __enter__\n     ticket.wait()\n   File \".../python2.7/threading.py\", line 621, in wait\n     self.__cond.wait(timeout)\n   File \".../python2.7/threading.py\", line 340, in wait\n     waiter.acquire()\n\n   File \".../python2.7/threading.py\", line 783, in __bootstrap\n     self.__bootstrap_inner()\n   File \".../python2.7/threading.py\", line 810, in __bootstrap_inner\n     self.run()\n   File \".../python2.7/threading.py\", line 763, in run\n     self.__target(*self.__args, **self.__kwargs)\n   File \"\u003cstdin\u003e\", line 4, in target\n   File \"openstack/_adapter.py\", line 146, in __exit__\n     with self._lock:\n\n   File \"\u003cstdin\u003e\", line 3, in \u003cmodule\u003e\n\n   File \".../python2.7/threading.py\", line 783, in __bootstrap\n     self.__bootstrap_inner()\n   File \".../python2.7/threading.py\", line 810, in __bootstrap_inner\n     self.run()\n   File \".../python2.7/threading.py\", line 763, in run\n     self.__target(*self.__args, **self.__kwargs)\n   File \"\u003cstdin\u003e\", line 4, in target\n   File \"openstack/_adapter.py\", line 146, in __exit__\n     with self._lock:\n\n...which is strange. Not only are we deadlocked, but we *also* managed to have a race? I thought the two outputs were just the result of one thread completing quickly enough that another could successfully grab the one slot, but apparently it\u0027s something worse:\n\n \u003e\u003e\u003e s._concurrent\n 1\n \u003e\u003e\u003e s._count\n 2\n\nIt\u0027s probably gonna take some careful unit testing to ensure this works the way we expect...","commit_id":"8070ae8bb8a3a10d5b638a40e026849cf74f44b1"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"5675b23b2e971011750ceff0c3e1e6aa25986267","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                # We need to wait for a ticket before we can execute"},{"line_number":138,"context_line":"                ticket \u003d threading.Event()"},{"line_number":139,"context_line":"                self._queue.put(ticket)"},{"line_number":140,"context_line":"                ticket.wait()"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def __exit__(self, exc_type, exc_value, traceback):"},{"line_number":143,"context_line":"        # If concurrent is None, everyone is free to immediately execute"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_1757c429","line":140,"in_reply_to":"3f79a3b5_547793a0","updated":"2018-09-26 18:51:28.000000000","message":"You are TOTALLY right - putting the event in the queue should totally happen once the lock is released. If we push the Event into the queue with the lock, then release it and wait on the event, we should preseve the ordering.\n\nAlso - ZOMG yes - next on the list is writing some ludicrously comprehensive tests. Of course, testing for deadlocks and races is super fun.","commit_id":"8070ae8bb8a3a10d5b638a40e026849cf74f44b1"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"426e82c84519f1fa8d868a77514a67043c337f1b","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    We cannot use a normal Semaphore because it doesn\u0027t give any ordering,"},{"line_number":117,"context_line":"    which could lead to a request starving. Instead, handle them in the"},{"line_number":118,"context_line":"    order we receive them."},{"line_number":119,"context_line":"    \"\"\""},{"line_number":120,"context_line":"    def __init__(self, concurrent\u003dNone):"},{"line_number":121,"context_line":"        self._concurrent \u003d concurrent"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_2a182bcb","line":118,"updated":"2018-09-28 13:01:55.000000000","message":"very nit: I\u0027d like this class to go to futurist, but I understand thay you may not need a new dependency.","commit_id":"6465879437ef1e5f1a733c3daf23dc54a1731e4b"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"73c05cd5300a021f0c1ed8debe05fe2d86c78423","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    We cannot use a normal Semaphore because it doesn\u0027t give any ordering,"},{"line_number":117,"context_line":"    which could lead to a request starving. Instead, handle them in the"},{"line_number":118,"context_line":"    order we receive them."},{"line_number":119,"context_line":"    \"\"\""},{"line_number":120,"context_line":"    def __init__(self, concurrent\u003dNone):"},{"line_number":121,"context_line":"        self._concurrent \u003d concurrent"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_6db77923","line":118,"in_reply_to":"3f79a3b5_2a182bcb","updated":"2018-10-06 14:01:12.000000000","message":"Yes - I think that\u0027s a good idea. It might be good anyway to use futurist for the swift segment uploaders anyway.","commit_id":"6465879437ef1e5f1a733c3daf23dc54a1731e4b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"426e82c84519f1fa8d868a77514a67043c337f1b","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    which could lead to a request starving. Instead, handle them in the"},{"line_number":118,"context_line":"    order we receive them."},{"line_number":119,"context_line":"    \"\"\""},{"line_number":120,"context_line":"    def __init__(self, concurrent\u003dNone):"},{"line_number":121,"context_line":"        self._concurrent \u003d concurrent"},{"line_number":122,"context_line":"        if concurrent:"},{"line_number":123,"context_line":"            self._count \u003d 0"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_ca76570d","line":120,"updated":"2018-09-28 13:01:55.000000000","message":"s/concurrent/concurrency/ ? the dual role of this parameter is somewhat confusing, a docstring could help.","commit_id":"6465879437ef1e5f1a733c3daf23dc54a1731e4b"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"73c05cd5300a021f0c1ed8debe05fe2d86c78423","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    which could lead to a request starving. Instead, handle them in the"},{"line_number":118,"context_line":"    order we receive them."},{"line_number":119,"context_line":"    \"\"\""},{"line_number":120,"context_line":"    def __init__(self, concurrent\u003dNone):"},{"line_number":121,"context_line":"        self._concurrent \u003d concurrent"},{"line_number":122,"context_line":"        if concurrent:"},{"line_number":123,"context_line":"            self._count \u003d 0"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_2d3741b2","line":120,"in_reply_to":"3f79a3b5_ca76570d","updated":"2018-10-06 14:01:12.000000000","message":"Done","commit_id":"6465879437ef1e5f1a733c3daf23dc54a1731e4b"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"fbf16617d2fe73c85217152a54fb3b7d7c752c98","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    def __init__(self, concurrent\u003dNone):"},{"line_number":121,"context_line":"        self._concurrent \u003d concurrent"},{"line_number":122,"context_line":"        if concurrent:"},{"line_number":123,"context_line":"            self._count \u003d 0"},{"line_number":124,"context_line":"            self._lock \u003d threading.Lock()"},{"line_number":125,"context_line":"            self._queue \u003d queue.Queue()"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_5b9b10c7","line":123,"updated":"2018-09-27 15:59:18.000000000","message":"Suggested comment for count: The number of threads currently running.","commit_id":"6465879437ef1e5f1a733c3daf23dc54a1731e4b"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"73c05cd5300a021f0c1ed8debe05fe2d86c78423","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    def __init__(self, concurrent\u003dNone):"},{"line_number":121,"context_line":"        self._concurrent \u003d concurrent"},{"line_number":122,"context_line":"        if concurrent:"},{"line_number":123,"context_line":"            self._count \u003d 0"},{"line_number":124,"context_line":"            self._lock \u003d threading.Lock()"},{"line_number":125,"context_line":"            self._queue \u003d queue.Queue()"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_cd3b2d99","line":123,"in_reply_to":"3f79a3b5_5b9b10c7","updated":"2018-10-06 14:01:12.000000000","message":"Done","commit_id":"6465879437ef1e5f1a733c3daf23dc54a1731e4b"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"fbf16617d2fe73c85217152a54fb3b7d7c752c98","unresolved":false,"context_lines":[{"line_number":135,"context_line":"                return"},{"line_number":136,"context_line":"            else:"},{"line_number":137,"context_line":"                # We need to wait for a ticket before we can execute"},{"line_number":138,"context_line":"                ticket \u003d threading.Event()"},{"line_number":139,"context_line":"                self._queue.put(ticket)"},{"line_number":140,"context_line":"        # Wait on our ticket ourside of the lock, otherwise deadlocks abound"},{"line_number":141,"context_line":"        ticket.wait()"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_fba1bcf8","line":138,"updated":"2018-09-27 15:59:18.000000000","message":"It\u0027s mildly confusing that you call this a ticket, but you also call decrementing the counter taking a ticket.","commit_id":"6465879437ef1e5f1a733c3daf23dc54a1731e4b"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"73c05cd5300a021f0c1ed8debe05fe2d86c78423","unresolved":false,"context_lines":[{"line_number":135,"context_line":"                return"},{"line_number":136,"context_line":"            else:"},{"line_number":137,"context_line":"                # We need to wait for a ticket before we can execute"},{"line_number":138,"context_line":"                ticket \u003d threading.Event()"},{"line_number":139,"context_line":"                self._queue.put(ticket)"},{"line_number":140,"context_line":"        # Wait on our ticket ourside of the lock, otherwise deadlocks abound"},{"line_number":141,"context_line":"        ticket.wait()"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_8d453519","line":138,"in_reply_to":"3f79a3b5_fba1bcf8","updated":"2018-10-06 14:01:12.000000000","message":"Yeah - I couldn\u0027t come up with a better way to describe it ...","commit_id":"6465879437ef1e5f1a733c3daf23dc54a1731e4b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"426e82c84519f1fa8d868a77514a67043c337f1b","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        if rate_limit:"},{"line_number":171,"context_line":"            # 1 / rate converts from requests per second to delay"},{"line_number":172,"context_line":"            # between requests needed to achieve that rate."},{"line_number":173,"context_line":"            self._rate \u003d 1 / rate_limit"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def request("},{"line_number":176,"context_line":"            self, url, method, run_async\u003dFalse, error_message\u003dNone,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_ea7b13f1","line":173,"updated":"2018-09-28 13:01:55.000000000","message":"nit: float(rate_limit) to avoid people putting integers on python 2","commit_id":"6465879437ef1e5f1a733c3daf23dc54a1731e4b"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"73c05cd5300a021f0c1ed8debe05fe2d86c78423","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        if rate_limit:"},{"line_number":171,"context_line":"            # 1 / rate converts from requests per second to delay"},{"line_number":172,"context_line":"            # between requests needed to achieve that rate."},{"line_number":173,"context_line":"            self._rate \u003d 1 / rate_limit"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def request("},{"line_number":176,"context_line":"            self, url, method, run_async\u003dFalse, error_message\u003dNone,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_ad42710c","line":173,"in_reply_to":"3f79a3b5_ea7b13f1","updated":"2018-10-06 14:01:12.000000000","message":"Done","commit_id":"6465879437ef1e5f1a733c3daf23dc54a1731e4b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"426e82c84519f1fa8d868a77514a67043c337f1b","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        return response"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def pre_request(self, name):"},{"line_number":203,"context_line":"        return name"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def post_request(self, name, response):"},{"line_number":206,"context_line":"        return name"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_8a7cdfea","line":203,"updated":"2018-09-28 13:01:55.000000000","message":"the return value is never used","commit_id":"6465879437ef1e5f1a733c3daf23dc54a1731e4b"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"73c05cd5300a021f0c1ed8debe05fe2d86c78423","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        return response"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def pre_request(self, name):"},{"line_number":203,"context_line":"        return name"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def post_request(self, name, response):"},{"line_number":206,"context_line":"        return name"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_6d4c593f","line":203,"in_reply_to":"3f79a3b5_8a7cdfea","updated":"2018-10-06 14:01:12.000000000","message":"Done","commit_id":"6465879437ef1e5f1a733c3daf23dc54a1731e4b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"426e82c84519f1fa8d868a77514a67043c337f1b","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        return name"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def post_request(self, name, response):"},{"line_number":206,"context_line":"        return name"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def _block_until_ready(self):"},{"line_number":209,"context_line":"        with self._rate_lock:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_aa819bc4","line":206,"updated":"2018-09-28 13:01:55.000000000","message":"ditto","commit_id":"6465879437ef1e5f1a733c3daf23dc54a1731e4b"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"73c05cd5300a021f0c1ed8debe05fe2d86c78423","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        return name"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def post_request(self, name, response):"},{"line_number":206,"context_line":"        return name"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def _block_until_ready(self):"},{"line_number":209,"context_line":"        with self._rate_lock:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_0d5b65f9","line":206,"in_reply_to":"3f79a3b5_aa819bc4","updated":"2018-10-06 14:01:12.000000000","message":"Done","commit_id":"6465879437ef1e5f1a733c3daf23dc54a1731e4b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d73bb2f660958251479c93996d89e35209adbbb0","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            self, session\u003dNone,"},{"line_number":114,"context_line":"            *args, **kwargs):"},{"line_number":115,"context_line":"        super(OpenStackSDKAdapter, self).__init__("},{"line_number":116,"context_line":"            session\u003dsession, *args, **kwargs)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def request("},{"line_number":119,"context_line":"            self, url, method, error_message\u003dNone,"}],"source_content_type":"text/x-python","patch_set":30,"id":"9fdfeff1_b194ea8d","line":116,"updated":"2019-03-05 11:41:51.000000000","message":"nit: This method is no longer needed","commit_id":"c9b60f2b8634c7f8c4254e158cc921202538db04"}],"openstack/cloud/openstackcloud.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"426e82c84519f1fa8d868a77514a67043c337f1b","unresolved":false,"context_lines":[{"line_number":7735,"context_line":"    @property"},{"line_number":7736,"context_line":"    def _pool_executor(self):"},{"line_number":7737,"context_line":"        if not self.__pool_executor:"},{"line_number":7738,"context_line":"            # TODO(mordred) Make this configurable"},{"line_number":7739,"context_line":"            self.__pool_executor \u003d concurrent.futures.ThreadPoolExecutor("},{"line_number":7740,"context_line":"                max_workers\u003d5)"},{"line_number":7741,"context_line":"        return self.__pool_executor"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_0a1befca","line":7738,"updated":"2018-09-28 13:01:55.000000000","message":"++++ we need to configure both the class (for cases when threading is not desired) and max_workers (when it is)","commit_id":"6465879437ef1e5f1a733c3daf23dc54a1731e4b"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"73c05cd5300a021f0c1ed8debe05fe2d86c78423","unresolved":false,"context_lines":[{"line_number":7735,"context_line":"    @property"},{"line_number":7736,"context_line":"    def _pool_executor(self):"},{"line_number":7737,"context_line":"        if not self.__pool_executor:"},{"line_number":7738,"context_line":"            # TODO(mordred) Make this configurable"},{"line_number":7739,"context_line":"            self.__pool_executor \u003d concurrent.futures.ThreadPoolExecutor("},{"line_number":7740,"context_line":"                max_workers\u003d5)"},{"line_number":7741,"context_line":"        return self.__pool_executor"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_4dbabd0b","line":7738,"in_reply_to":"3f79a3b5_0a1befca","updated":"2018-10-06 14:01:12.000000000","message":"++","commit_id":"6465879437ef1e5f1a733c3daf23dc54a1731e4b"}]}
