)]}'
{"acouchbase/logic/cluster_impl.py":[{"author":{"_account_id":1000201,"name":"Sergey Avseyev","email":"sergey.avseyev@gmail.com","username":"avsej","avatars":[{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"69c656620157027ce2543d99c8c84d635eb73514","unresolved":false,"context_lines":[{"line_number":186,"context_line":""},{"line_number":187,"context_line":"        # With PYCBC-1798 the GIL is released across TransactionsLogic.close(), so it blocks this thread only,"},{"line_number":188,"context_line":"        # not the whole interpreter."},{"line_number":189,"context_line":"        if self._transactions is not None:"},{"line_number":190,"context_line":"            self._transactions.close()"},{"line_number":191,"context_line":"            self._transactions \u003d None"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ea68316e_afc9240c","line":189,"updated":"2026-08-21 15:42:57.000000000","message":"For lock symmetry against concurrent first-access initialization (`self.transactions`), consider wrapping the check and teardown inside `with self._transactions_lock:`.\n\n```suggestion\n        with self._transactions_lock:\n            if self._transactions is not None:\n                self._transactions.close()\n                self._transactions \u003d None\n```","commit_id":"0203cb47a3ce6836dc6f2c1f752a23c4b6cdde5d"},{"author":{"_account_id":1000201,"name":"Sergey Avseyev","email":"sergey.avseyev@gmail.com","username":"avsej","avatars":[{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f2f5ce002a9fff4488a36ad40f85b0f8eecc8511","unresolved":true,"context_lines":[{"line_number":186,"context_line":""},{"line_number":187,"context_line":"        # With PYCBC-1798 the GIL is released across TransactionsLogic.close(), so it blocks this thread only,"},{"line_number":188,"context_line":"        # not the whole interpreter."},{"line_number":189,"context_line":"        if self._transactions is not None:"},{"line_number":190,"context_line":"            self._transactions.close()"},{"line_number":191,"context_line":"            self._transactions \u003d None"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bee16563_a887f4a4","line":189,"updated":"2026-08-20 15:53:19.000000000","message":"To prevent races if `close_connection()` is called concurrently with initial access to the `transactions` property across OS threads, wrap the close and cleanup in `self._transactions_lock`:\n\n```suggestion\n        with self._transactions_lock:\n            if self._transactions is not None:\n                self._transactions.close()\n                self._transactions \u003d None\n```","commit_id":"0203cb47a3ce6836dc6f2c1f752a23c4b6cdde5d"},{"author":{"_account_id":1004568,"name":"Jared Casey","email":"jared.casey@couchbase.com","username":"thejcfactor","avatars":[{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"a282d097d762f3cd358099c97b099cf571c8e053","unresolved":false,"context_lines":[{"line_number":186,"context_line":""},{"line_number":187,"context_line":"        # With PYCBC-1798 the GIL is released across TransactionsLogic.close(), so it blocks this thread only,"},{"line_number":188,"context_line":"        # not the whole interpreter."},{"line_number":189,"context_line":"        if self._transactions is not None:"},{"line_number":190,"context_line":"            self._transactions.close()"},{"line_number":191,"context_line":"            self._transactions \u003d None"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5289516a_3d934bae","line":189,"in_reply_to":"bee16563_a887f4a4","updated":"2026-08-20 16:58:46.000000000","message":"Done","commit_id":"0203cb47a3ce6836dc6f2c1f752a23c4b6cdde5d"}],"couchbase/logic/cluster_impl.py":[{"author":{"_account_id":1000201,"name":"Sergey Avseyev","email":"sergey.avseyev@gmail.com","username":"avsej","avatars":[{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"69c656620157027ce2543d99c8c84d635eb73514","unresolved":false,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    def close_connection(self) -\u003e None:"},{"line_number":172,"context_line":"        \"\"\"**INTERNAL**\"\"\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        # TransactionsLogic.close() is synchronous and there is no async override, so this does"},{"line_number":175,"context_line":"        # block the loop thread for the duration (same behavior in \u003c 4.6.0).  With PYCBC-1798 the"},{"line_number":176,"context_line":"        # GIL is released across it, so it blocks this thread only, not the whole interpreter."}],"source_content_type":"text/x-python","patch_set":1,"id":"1008e645_37551afe","line":173,"updated":"2026-08-21 15:42:57.000000000","message":"Minor comment discrepancy: `ClusterImpl` is the synchronous API (not `acouchbase`), so there is no \"loop thread\" here. The comment was copy-pasted from `acouchbase/logic/cluster_impl.py`.\n\n```suggestion\n        # TransactionsLogic.close() is synchronous, so this blocks the calling thread for\n        # the duration (same behavior in \u003c 4.6.0). With PYCBC-1798 the GIL is released\n        # across it, so it blocks this thread only, not the whole interpreter.\n```","commit_id":"0203cb47a3ce6836dc6f2c1f752a23c4b6cdde5d"},{"author":{"_account_id":1005035,"name":"Dimitris Christodoulou","email":"dimitris.christodoulou@couchbase.com","username":"DemetrisChr","avatars":[{"url":"https://www.gravatar.com/avatar/4291f7baa025a5558b77019a9c264ab2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/4291f7baa025a5558b77019a9c264ab2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/4291f7baa025a5558b77019a9c264ab2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/4291f7baa025a5558b77019a9c264ab2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ebe7a9d20cd1f9d111ae124d4fc32fd3c3740567","unresolved":true,"context_lines":[{"line_number":171,"context_line":"    def close_connection(self) -\u003e None:"},{"line_number":172,"context_line":"        \"\"\"**INTERNAL**\"\"\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        # TransactionsLogic.close() is synchronous and there is no async override, so this does"},{"line_number":175,"context_line":"        # block the loop thread for the duration (same behavior in \u003c 4.6.0).  With PYCBC-1798 the"},{"line_number":176,"context_line":"        # GIL is released across it, so it blocks this thread only, not the whole interpreter."},{"line_number":177,"context_line":"        if self._transactions is not None:"},{"line_number":178,"context_line":"            self._transactions.close()"},{"line_number":179,"context_line":"            self._transactions \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"3e1406a9_0b3ee42f","line":176,"range":{"start_line":174,"start_character":0,"end_line":176,"end_character":92},"updated":"2026-08-20 15:57:45.000000000","message":"I think this comment is about the acouchbase variant of close_connection one, and vice versa.","commit_id":"0203cb47a3ce6836dc6f2c1f752a23c4b6cdde5d"},{"author":{"_account_id":1000201,"name":"Sergey Avseyev","email":"sergey.avseyev@gmail.com","username":"avsej","avatars":[{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"dc46c0774513dcd5dee3acbb2005a15055c0858e","unresolved":true,"context_lines":[{"line_number":171,"context_line":"    def close_connection(self) -\u003e None:"},{"line_number":172,"context_line":"        \"\"\"**INTERNAL**\"\"\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        # TransactionsLogic.close() is synchronous and there is no async override, so this does"},{"line_number":175,"context_line":"        # block the loop thread for the duration (same behavior in \u003c 4.6.0).  With PYCBC-1798 the"},{"line_number":176,"context_line":"        # GIL is released across it, so it blocks this thread only, not the whole interpreter."},{"line_number":177,"context_line":"        if self._transactions is not None:"},{"line_number":178,"context_line":"            self._transactions.close()"},{"line_number":179,"context_line":"            self._transactions \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"2ad566df_2efc0178","line":176,"range":{"start_line":174,"start_character":0,"end_line":176,"end_character":94},"updated":"2026-08-20 16:03:31.000000000","message":"Minor comment discrepancy: `ClusterImpl` is the synchronous API (not `acouchbase`), so there is no \"loop thread\" here. The comment was copy-pasted from `acouchbase/logic/cluster_impl.py`.\n\n```suggestion\n        # TransactionsLogic.close() is synchronous, so this blocks the calling thread for\n        # the duration (same behavior in \u003c 4.6.0). With PYCBC-1798 the GIL is released\n        # across it, so it blocks this thread only, not the whole interpreter.\n```","commit_id":"0203cb47a3ce6836dc6f2c1f752a23c4b6cdde5d"},{"author":{"_account_id":1004568,"name":"Jared Casey","email":"jared.casey@couchbase.com","username":"thejcfactor","avatars":[{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"a282d097d762f3cd358099c97b099cf571c8e053","unresolved":false,"context_lines":[{"line_number":171,"context_line":"    def close_connection(self) -\u003e None:"},{"line_number":172,"context_line":"        \"\"\"**INTERNAL**\"\"\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        # TransactionsLogic.close() is synchronous and there is no async override, so this does"},{"line_number":175,"context_line":"        # block the loop thread for the duration (same behavior in \u003c 4.6.0).  With PYCBC-1798 the"},{"line_number":176,"context_line":"        # GIL is released across it, so it blocks this thread only, not the whole interpreter."},{"line_number":177,"context_line":"        if self._transactions is not None:"},{"line_number":178,"context_line":"            self._transactions.close()"},{"line_number":179,"context_line":"            self._transactions \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"402d56c8_9c976b9e","line":176,"range":{"start_line":174,"start_character":0,"end_line":176,"end_character":94},"in_reply_to":"2ad566df_2efc0178","updated":"2026-08-20 16:58:46.000000000","message":"Done","commit_id":"0203cb47a3ce6836dc6f2c1f752a23c4b6cdde5d"},{"author":{"_account_id":1004568,"name":"Jared Casey","email":"jared.casey@couchbase.com","username":"thejcfactor","avatars":[{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"a282d097d762f3cd358099c97b099cf571c8e053","unresolved":false,"context_lines":[{"line_number":171,"context_line":"    def close_connection(self) -\u003e None:"},{"line_number":172,"context_line":"        \"\"\"**INTERNAL**\"\"\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        # TransactionsLogic.close() is synchronous and there is no async override, so this does"},{"line_number":175,"context_line":"        # block the loop thread for the duration (same behavior in \u003c 4.6.0).  With PYCBC-1798 the"},{"line_number":176,"context_line":"        # GIL is released across it, so it blocks this thread only, not the whole interpreter."},{"line_number":177,"context_line":"        if self._transactions is not None:"},{"line_number":178,"context_line":"            self._transactions.close()"},{"line_number":179,"context_line":"            self._transactions \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"bd008c66_72c8592c","line":176,"range":{"start_line":174,"start_character":0,"end_line":176,"end_character":92},"in_reply_to":"3e1406a9_0b3ee42f","updated":"2026-08-20 16:58:46.000000000","message":"Done","commit_id":"0203cb47a3ce6836dc6f2c1f752a23c4b6cdde5d"},{"author":{"_account_id":1000201,"name":"Sergey Avseyev","email":"sergey.avseyev@gmail.com","username":"avsej","avatars":[{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"69c656620157027ce2543d99c8c84d635eb73514","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        # TransactionsLogic.close() is synchronous and there is no async override, so this does"},{"line_number":175,"context_line":"        # block the loop thread for the duration (same behavior in \u003c 4.6.0).  With PYCBC-1798 the"},{"line_number":176,"context_line":"        # GIL is released across it, so it blocks this thread only, not the whole interpreter."},{"line_number":177,"context_line":"        if self._transactions is not None:"},{"line_number":178,"context_line":"            self._transactions.close()"},{"line_number":179,"context_line":"            self._transactions \u003d None"},{"line_number":180,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"4839549e_5745c17f","line":177,"updated":"2026-08-21 15:42:57.000000000","message":"For lock symmetry against concurrent first-access initialization (`self.transactions`), consider wrapping the check and teardown inside `with self._transactions_lock:`.\n\n```suggestion\n        with self._transactions_lock:\n            if self._transactions is not None:\n                self._transactions.close()\n                self._transactions \u003d None\n```","commit_id":"0203cb47a3ce6836dc6f2c1f752a23c4b6cdde5d"},{"author":{"_account_id":1005035,"name":"Dimitris Christodoulou","email":"dimitris.christodoulou@couchbase.com","username":"DemetrisChr","avatars":[{"url":"https://www.gravatar.com/avatar/4291f7baa025a5558b77019a9c264ab2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/4291f7baa025a5558b77019a9c264ab2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/4291f7baa025a5558b77019a9c264ab2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/4291f7baa025a5558b77019a9c264ab2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"983bd38f0a8dce146fed7c6106420260d6824216","unresolved":true,"context_lines":[{"line_number":174,"context_line":"        # TransactionsLogic.close() is synchronous and there is no async override, so this does"},{"line_number":175,"context_line":"        # block the loop thread for the duration (same behavior in \u003c 4.6.0).  With PYCBC-1798 the"},{"line_number":176,"context_line":"        # GIL is released across it, so it blocks this thread only, not the whole interpreter."},{"line_number":177,"context_line":"        if self._transactions is not None:"},{"line_number":178,"context_line":"            self._transactions.close()"},{"line_number":179,"context_line":"            self._transactions \u003d None"},{"line_number":180,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"796c8fcd_2aaf99f6","line":177,"updated":"2026-08-20 15:40:47.000000000","message":"Is it guaranteed that `close_connection` is called after any operations that might lazy-init transactions? If that\u0027s not the case, then I think this also needs to be protected by the lock.","commit_id":"0203cb47a3ce6836dc6f2c1f752a23c4b6cdde5d"},{"author":{"_account_id":1000201,"name":"Sergey Avseyev","email":"sergey.avseyev@gmail.com","username":"avsej","avatars":[{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/dd70f9d8cc5f9ee488d68e7a787ba526.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f2f5ce002a9fff4488a36ad40f85b0f8eecc8511","unresolved":true,"context_lines":[{"line_number":174,"context_line":"        # TransactionsLogic.close() is synchronous and there is no async override, so this does"},{"line_number":175,"context_line":"        # block the loop thread for the duration (same behavior in \u003c 4.6.0).  With PYCBC-1798 the"},{"line_number":176,"context_line":"        # GIL is released across it, so it blocks this thread only, not the whole interpreter."},{"line_number":177,"context_line":"        if self._transactions is not None:"},{"line_number":178,"context_line":"            self._transactions.close()"},{"line_number":179,"context_line":"            self._transactions \u003d None"},{"line_number":180,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"c0123f99_5fde914c","line":177,"updated":"2026-08-20 15:53:19.000000000","message":"To ensure full thread safety when `close_connection()` runs concurrently with first-time `transactions` property access, consider acquiring `self._transactions_lock` during transaction shutdown and reset:\n\n```suggestion\n        with self._transactions_lock:\n            if self._transactions is not None:\n                self._transactions.close()\n                self._transactions \u003d None\n```","commit_id":"0203cb47a3ce6836dc6f2c1f752a23c4b6cdde5d"},{"author":{"_account_id":1004568,"name":"Jared Casey","email":"jared.casey@couchbase.com","username":"thejcfactor","avatars":[{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"a282d097d762f3cd358099c97b099cf571c8e053","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        # TransactionsLogic.close() is synchronous and there is no async override, so this does"},{"line_number":175,"context_line":"        # block the loop thread for the duration (same behavior in \u003c 4.6.0).  With PYCBC-1798 the"},{"line_number":176,"context_line":"        # GIL is released across it, so it blocks this thread only, not the whole interpreter."},{"line_number":177,"context_line":"        if self._transactions is not None:"},{"line_number":178,"context_line":"            self._transactions.close()"},{"line_number":179,"context_line":"            self._transactions \u003d None"},{"line_number":180,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"49e17f5c_4b937493","line":177,"in_reply_to":"796c8fcd_2aaf99f6","updated":"2026-08-20 16:58:46.000000000","message":"Done","commit_id":"0203cb47a3ce6836dc6f2c1f752a23c4b6cdde5d"},{"author":{"_account_id":1004568,"name":"Jared Casey","email":"jared.casey@couchbase.com","username":"thejcfactor","avatars":[{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"a282d097d762f3cd358099c97b099cf571c8e053","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        # TransactionsLogic.close() is synchronous and there is no async override, so this does"},{"line_number":175,"context_line":"        # block the loop thread for the duration (same behavior in \u003c 4.6.0).  With PYCBC-1798 the"},{"line_number":176,"context_line":"        # GIL is released across it, so it blocks this thread only, not the whole interpreter."},{"line_number":177,"context_line":"        if self._transactions is not None:"},{"line_number":178,"context_line":"            self._transactions.close()"},{"line_number":179,"context_line":"            self._transactions \u003d None"},{"line_number":180,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"75b1c413_906329a0","line":177,"in_reply_to":"c0123f99_5fde914c","updated":"2026-08-20 16:58:46.000000000","message":"Done","commit_id":"0203cb47a3ce6836dc6f2c1f752a23c4b6cdde5d"},{"author":{"_account_id":1005035,"name":"Dimitris Christodoulou","email":"dimitris.christodoulou@couchbase.com","username":"DemetrisChr","avatars":[{"url":"https://www.gravatar.com/avatar/4291f7baa025a5558b77019a9c264ab2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/4291f7baa025a5558b77019a9c264ab2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/4291f7baa025a5558b77019a9c264ab2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/4291f7baa025a5558b77019a9c264ab2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ebe7a9d20cd1f9d111ae124d4fc32fd3c3740567","unresolved":true,"context_lines":[{"line_number":175,"context_line":"        # block the loop thread for the duration (same behavior in \u003c 4.6.0).  With PYCBC-1798 the"},{"line_number":176,"context_line":"        # GIL is released across it, so it blocks this thread only, not the whole interpreter."},{"line_number":177,"context_line":"        if self._transactions is not None:"},{"line_number":178,"context_line":"            self._transactions.close()"},{"line_number":179,"context_line":"            self._transactions \u003d None"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"4f6f862f_28856fdb","line":178,"updated":"2026-08-20 15:57:45.000000000","message":"\u003e `# Don\u0027t raise exceptions during shutdown`\n\nShould this also go inside the try-except block, similar to the below, or does it never raise?","commit_id":"0203cb47a3ce6836dc6f2c1f752a23c4b6cdde5d"},{"author":{"_account_id":1004568,"name":"Jared Casey","email":"jared.casey@couchbase.com","username":"thejcfactor","avatars":[{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/20ac69da8a1fb4cc11bdd1c880389132.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"a282d097d762f3cd358099c97b099cf571c8e053","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        # block the loop thread for the duration (same behavior in \u003c 4.6.0).  With PYCBC-1798 the"},{"line_number":176,"context_line":"        # GIL is released across it, so it blocks this thread only, not the whole interpreter."},{"line_number":177,"context_line":"        if self._transactions is not None:"},{"line_number":178,"context_line":"            self._transactions.close()"},{"line_number":179,"context_line":"            self._transactions \u003d None"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"886b4034_e43d5fcf","line":178,"in_reply_to":"4f6f862f_28856fdb","updated":"2026-08-20 16:58:46.000000000","message":"Done","commit_id":"0203cb47a3ce6836dc6f2c1f752a23c4b6cdde5d"}]}
