)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"12214025f5f43aea6a61b1a4ded90b1ff3f59823","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"eda8fd17_e519184f","updated":"2023-08-30 08:12:47.000000000","message":"Interesting approach, I think it would also fix/help with the driver-agent https://bugs.launchpad.net/octavia/+bug/2033280","commit_id":"7c5d6aa1d997b7e2e2f703acbc0fb1fc1d12f515"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"088ed5348455753858a9fc54a06f962049b9c387","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"747a6646_051d16e7","updated":"2023-05-13 06:16:33.000000000","message":"recheck","commit_id":"7c5d6aa1d997b7e2e2f703acbc0fb1fc1d12f515"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"12366ad3d855fde1d461186a049ca6cb1d02b4ff","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"8b3450ea_0fb3c6bf","updated":"2023-07-27 11:48:47.000000000","message":"recheck getting new logs","commit_id":"7c5d6aa1d997b7e2e2f703acbc0fb1fc1d12f515"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"94551e3a810b9c4523c635144cda3ef5b9ba2498","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"0363524a_b263ddcd","updated":"2023-05-15 06:39:53.000000000","message":"recheck node timeouts","commit_id":"7c5d6aa1d997b7e2e2f703acbc0fb1fc1d12f515"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"bbbb9bc5c0bd9c85d5aae5bda0e03764eacc66ce","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"4bc13ee5_0c2895c7","updated":"2023-08-30 08:15:50.000000000","message":"rebased after merge conflict","commit_id":"b68c91dbe423f675b3e8aa6f2b143c1b45c97b09"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"94de68a562ff50ce23836796a24e4dddc7ae4f61","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"1ab1614e_c4ce8e9c","updated":"2023-09-03 11:17:18.000000000","message":"Rebased and added tests","commit_id":"77d806b2aed2413ef6b73a8396055abbf3e4d6d4"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"2cb770c385a3058ff49cb15dcbf89574707bb61d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"d26b2a9d_8968e086","updated":"2023-09-04 04:29:03.000000000","message":"recheck grenade","commit_id":"6cb45449a35342181d8be7a4af367d528dc5c93e"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"0493ca27f9e716595d2a5bc9be6ce04b3d7c784e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"d8df52f3_018627fe","updated":"2023-09-05 09:29:28.000000000","message":"recheck grenade","commit_id":"6cb45449a35342181d8be7a4af367d528dc5c93e"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"94f00bdf6afda782129f6d106cf4c08ea25bb3c9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"f24af1d3_27951964","updated":"2023-09-04 07:28:49.000000000","message":"recheck grenade","commit_id":"6cb45449a35342181d8be7a4af367d528dc5c93e"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"f6d0409a4ab8cd0761e0ce5e326ef8aa55cfc9ab","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"d875ac67_5417608b","updated":"2023-09-20 13:12:27.000000000","message":"recheck","commit_id":"837df636d020c78732f5b92a3f79cc296c5e7fd9"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"a7920c357a5934592dd7a6d8e2eb996e23521903","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"e65597fa_2fbb2280","updated":"2023-09-19 07:31:52.000000000","message":"recheck","commit_id":"837df636d020c78732f5b92a3f79cc296c5e7fd9"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"b64088dd9f8c26a25c633e9fb725738b3d4a99bd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"eaec8d2b_51a3388d","updated":"2023-09-26 08:48:25.000000000","message":"I just eyeballed it. In general it looks okay. It would be nice to add typing information to new function arguments.","commit_id":"d9c6c84b5c66414ff7a40483133139b5c1bcfc6f"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"05760ca3fff1ecb7f01030cc4910cbf2b55a1949","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"d05628f5_dd36c6f3","updated":"2023-09-26 18:31:58.000000000","message":"Thank you for review","commit_id":"d9c6c84b5c66414ff7a40483133139b5c1bcfc6f"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"e3922d1f4afe31a0cadc2cd863aa311fdb4dd8dd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"dcb135e7_781f658d","updated":"2023-09-27 09:45:59.000000000","message":"+1 because I think we need to discuss the change in member.py as it seems to change current behavior.","commit_id":"8a5ad0ae05be0fe0f55655b44c2ebd3ac8ab84a0"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"2990568251c6f39f132097c9836a01cdf325d36e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"6e811754_1fa5553a","updated":"2023-09-27 16:36:26.000000000","message":"I was wrong. It should be okay.","commit_id":"8a5ad0ae05be0fe0f55655b44c2ebd3ac8ab84a0"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"761a3ff518008dd3c0169cf9a1e176b65d21d5d3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"31e61af6_5848a0a7","updated":"2023-09-27 09:39:26.000000000","message":"Thanks for the update.","commit_id":"8a5ad0ae05be0fe0f55655b44c2ebd3ac8ab84a0"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"f8e17167c478109e02a2359ef2a052abf2878229","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"c0eaacd1_fe7950eb","updated":"2023-10-16 16:34:07.000000000","message":"recheck","commit_id":"aeddd319067d2c64c1a0b943f777aed1231622da"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"eb1017377645e1b453ed55522b96fbc649d00c76","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"fbcee8f1_acee7da9","updated":"2024-02-14 11:35:02.000000000","message":"Please stop the rechecks for now. The non-traffic-ops failures are a known issue and caused by the haproxy process getting killed. We are trying to fix this in https://review.opendev.org/c/openstack/octavia-tempest-plugin/+/861743.","commit_id":"e176c02b85e157deee9d19c0328a645c1e8f972f"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"af4de76710e838d837944828cdc4d20aa26d5c39","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"2771afcc_3ff74d96","updated":"2024-02-14 06:31:02.000000000","message":"recheck","commit_id":"e176c02b85e157deee9d19c0328a645c1e8f972f"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"3952b282b0a6d0d6f87732ac12ee0c384ea547a6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"55de4711_095f7714","updated":"2024-02-14 11:14:13.000000000","message":"recheck","commit_id":"e176c02b85e157deee9d19c0328a645c1e8f972f"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"bf4773b7eba5d2bc3b8f7b168d8d5d90ee345c35","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"22596a16_bfd52170","in_reply_to":"fbcee8f1_acee7da9","updated":"2024-02-14 13:23:41.000000000","message":"ok. I will wait the fix. thank you.","commit_id":"e176c02b85e157deee9d19c0328a645c1e8f972f"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"fa20f9ca13f2ae10d6247d79b134c2b063088cff","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"52d1db97_f44a6850","updated":"2024-10-25 04:37:03.000000000","message":"@gthiemon@redhat.com Please let me know if some action be required.\nMy test results are mentioned in open comment thread for current review.","commit_id":"cb5dca9bd9c04275141c038661efa716ba1dd3a5"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"50df9cd2c5a4895bda0143dfd14f163c7e300c1c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"e42aa948_24f35bca","updated":"2024-08-27 08:37:30.000000000","message":"@johnsomor@gmail.com I am ok to abandon change, but could you please provide more information about alternative solution?\n\nAny links on discussion or proposal?\nDo you need any help with this implementation?","commit_id":"cb5dca9bd9c04275141c038661efa716ba1dd3a5"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"85c3f87bc013c1c7e85c54b0862a6d5eb1e0e7a0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"605b48f0_e55be860","updated":"2024-10-23 17:36:41.000000000","message":"After talking about this at the PTG, we are ok moving forward with this as an interim patch. Ideally we would move to removing recursion from the data models altogether.","commit_id":"cb5dca9bd9c04275141c038661efa716ba1dd3a5"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"5066154addbd2d19cd97b7fbbf701a37aabdd4ba","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"e2b99021_007c2df5","updated":"2024-08-27 02:56:49.000000000","message":"I thought the PTG plan was to not do this, but redesign the data models to be flat.","commit_id":"cb5dca9bd9c04275141c038661efa716ba1dd3a5"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"2978dd7d0dd1e52f93202b3b3e9f04cca164bd03","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"a17c6eec_0717193a","updated":"2024-10-23 17:38:27.000000000","message":"adding W-1, I\u0027d like to do manual tests of the patch","commit_id":"cb5dca9bd9c04275141c038661efa716ba1dd3a5"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"55caee182630702f1752ee63cab71a212aa63062","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"33ac685d_523ef308","updated":"2024-11-08 13:58:00.000000000","message":"t","commit_id":"cb5dca9bd9c04275141c038661efa716ba1dd3a5"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"446632b19dcf4b12325d14751dcc7ed21dcfb0af","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"3c973550_48f63f0c","in_reply_to":"52d1db97_f44a6850","updated":"2024-10-25 06:35:01.000000000","message":"Nothing from you @sergejyit@gmail.com , I just want to check that we have enough coverage to test the corner cases there, I\u0027ll do manual tests on my side","commit_id":"cb5dca9bd9c04275141c038661efa716ba1dd3a5"}],"octavia/api/v2/controllers/member.py":[{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"104efa04ca3c4f8657f72397dd77ae37bcdc25dd","unresolved":true,"context_lines":[{"line_number":71,"context_line":"        context \u003d pcontext.get(\u0027octavia_context\u0027)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        with context.session.begin():"},{"line_number":74,"context_line":"            pool \u003d self._get_db_pool(context.session, self.pool_id,"},{"line_number":75,"context_line":"                                     show_deleted\u003dFalse)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"            self._auth_validate_action(context, pool.project_id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"1451720f_fa04ea8b","line":74,"range":{"start_line":74,"start_character":24,"end_line":74,"end_character":36},"updated":"2023-09-28 06:57:28.000000000","message":"I ran some test in my environment (40 listeners and each listener has 1 pool + 1 hm + 13 members), and it seems that the real bottleneck is this _get_db_pool call.\nwe only need the pool to get the project id, but this single call does ~490 SQL requests.\n\nadding limited_graph to get_all_API_list slightly improves the function, but I think we need to do a similar non-recursive call for _get_db_pool\n\n\nsome numbers:\n\nwithout limited_graph\n_get_db_pool takes 764ms\nget_all_API_list takes 543ms\n\nwith limited_graph\n_get_db_pool takes 776ms\nget_all_API_list takes 8ms\n\nwe\u0027re still around 1sec while we could do better","commit_id":"8a5ad0ae05be0fe0f55655b44c2ebd3ac8ab84a0"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"d6cfe914515226b46379aaec996820a897121a98","unresolved":true,"context_lines":[{"line_number":71,"context_line":"        context \u003d pcontext.get(\u0027octavia_context\u0027)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        with context.session.begin():"},{"line_number":74,"context_line":"            pool \u003d self._get_db_pool(context.session, self.pool_id,"},{"line_number":75,"context_line":"                                     show_deleted\u003dFalse)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"            self._auth_validate_action(context, pool.project_id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"ea1d9a6a_e370cb60","line":74,"range":{"start_line":74,"start_character":24,"end_line":74,"end_character":36},"in_reply_to":"1451720f_fa04ea8b","updated":"2023-09-30 11:19:14.000000000","message":"I could do it by patching `get` method.\nHowever, I think, that the same logic as for get_all will not be enough effective here. By the logic, I mean default recursion depth equal to 1.\n\nAs I discovered in unittests, pool has a lot of neighbor nodes, like: members and l7 policies. With recursion depth equal 1 we will convert all of them.\nSo in your topology, where HM and 13 members connected to the same pool we will iterate through all of them.\n\nInstead of it I added logic where recursion will not be run at all on get request (default depth is 0). For this particular case it should be ok, because we use only project_id attribute after getting object from DB. So we could skip first level resources as well.\nYou could try and compare performance with current 0 and later change it to 1 (I did not check it, but think, that 0 will be better in this particular case).\nDefault (1) also gives some improvement if you have other listeners and pools in the graph, but as I mentioned above for your topology it should not show high improvement.\n\nFor `get_all`, I still prefer to use default equal to 1, because we could have a cases, when we display data from related nodes (if I am wrong here - let\u0027s disable recursion as well).","commit_id":"8a5ad0ae05be0fe0f55655b44c2ebd3ac8ab84a0"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"66038df033c065a867ab670713af62fdbc47a501","unresolved":true,"context_lines":[{"line_number":71,"context_line":"        context \u003d pcontext.get(\u0027octavia_context\u0027)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        with context.session.begin():"},{"line_number":74,"context_line":"            pool \u003d self._get_db_pool(context.session, self.pool_id,"},{"line_number":75,"context_line":"                                     show_deleted\u003dFalse)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"            self._auth_validate_action(context, pool.project_id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"2fc2d598_e5673344","line":74,"range":{"start_line":74,"start_character":24,"end_line":74,"end_character":36},"in_reply_to":"ea1d9a6a_e370cb60","updated":"2024-02-14 06:29:57.000000000","message":"Gregory Thiemonge, hi. \nI created the similar setup with 40 listeners and 13 members.\nLater I call list of members in the one pool and got the following results:\n\nwithout limited_graph: \n\u003cfunction BaseController._get_db_pool\u003e TIME:  65 ms\n\u003cfunction MemberRepository.get_all_API_list\u003e TIME:  875 ms\n\nwith limited_graph: \n\u003cfunction BaseController._get_db_pool\u003e TIME: 5 ms\n\u003cfunction MemberRepository.get_all_API_list\u003e TIME:  13 ms\n\nnote, that I use yoga release.","commit_id":"8a5ad0ae05be0fe0f55655b44c2ebd3ac8ab84a0"}],"octavia/db/base_models.py":[{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"b64088dd9f8c26a25c633e9fb725738b3d4a99bd","unresolved":true,"context_lines":[{"line_number":56,"context_line":"                    obj.load_balancer_id + obj.subnet_id)"},{"line_number":57,"context_line":"        raise NotImplementedError"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def to_data_model(self, _graph_nodes\u003dNone, _recursion_depth\u003dNone):"},{"line_number":60,"context_line":"        \"\"\"Converts to a data model graph."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        In order to make the resulting data model graph usable no matter how"}],"source_content_type":"text/x-python","patch_set":8,"id":"0126d3c6_70f25270","line":59,"range":{"start_line":59,"start_character":47,"end_line":59,"end_character":68},"updated":"2023-09-26 08:48:25.000000000","message":"Please add typing information: `_recursion_depth: Optional[int] \u003d None`","commit_id":"d9c6c84b5c66414ff7a40483133139b5c1bcfc6f"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"05760ca3fff1ecb7f01030cc4910cbf2b55a1949","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                    obj.load_balancer_id + obj.subnet_id)"},{"line_number":57,"context_line":"        raise NotImplementedError"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def to_data_model(self, _graph_nodes\u003dNone, _recursion_depth\u003dNone):"},{"line_number":60,"context_line":"        \"\"\"Converts to a data model graph."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        In order to make the resulting data model graph usable no matter how"}],"source_content_type":"text/x-python","patch_set":8,"id":"eebbfafd_f4a10dbc","line":59,"range":{"start_line":59,"start_character":47,"end_line":59,"end_character":68},"in_reply_to":"0126d3c6_70f25270","updated":"2023-09-26 18:31:58.000000000","message":"Done","commit_id":"d9c6c84b5c66414ff7a40483133139b5c1bcfc6f"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"b64088dd9f8c26a25c633e9fb725738b3d4a99bd","unresolved":true,"context_lines":[{"line_number":92,"context_line":"        dm_key \u003d self._get_unique_key(dm_self)"},{"line_number":93,"context_line":"        _graph_nodes.update({dm_key: dm_self})"},{"line_number":94,"context_line":"        new_depth \u003d _recursion_depth"},{"line_number":95,"context_line":"        need_recursion \u003d _recursion_depth is None or _recursion_depth"},{"line_number":96,"context_line":"        # decrease depth of recursion on new recursion call"},{"line_number":97,"context_line":"        if new_depth:"},{"line_number":98,"context_line":"            new_depth -\u003d 1"}],"source_content_type":"text/x-python","patch_set":8,"id":"9e047f6c_711aa832","line":95,"range":{"start_line":95,"start_character":8,"end_line":95,"end_character":69},"updated":"2023-09-26 08:48:25.000000000","message":"The name suggests that this should be a boolean, but currently it could be either True (_recursion_depth is None) or an int (_recursion_depth). I\u0027d suggest to change this to `need_recursion \u003d _recursion_depth is None or _recursion_depth \u003e 0`","commit_id":"d9c6c84b5c66414ff7a40483133139b5c1bcfc6f"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"05760ca3fff1ecb7f01030cc4910cbf2b55a1949","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        dm_key \u003d self._get_unique_key(dm_self)"},{"line_number":93,"context_line":"        _graph_nodes.update({dm_key: dm_self})"},{"line_number":94,"context_line":"        new_depth \u003d _recursion_depth"},{"line_number":95,"context_line":"        need_recursion \u003d _recursion_depth is None or _recursion_depth"},{"line_number":96,"context_line":"        # decrease depth of recursion on new recursion call"},{"line_number":97,"context_line":"        if new_depth:"},{"line_number":98,"context_line":"            new_depth -\u003d 1"}],"source_content_type":"text/x-python","patch_set":8,"id":"2515d9dd_d1add805","line":95,"range":{"start_line":95,"start_character":8,"end_line":95,"end_character":69},"in_reply_to":"9e047f6c_711aa832","updated":"2023-09-26 18:31:58.000000000","message":"Done","commit_id":"d9c6c84b5c66414ff7a40483133139b5c1bcfc6f"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"104efa04ca3c4f8657f72397dd77ae37bcdc25dd","unresolved":true,"context_lines":[{"line_number":58,"context_line":"        raise NotImplementedError"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def to_data_model("},{"line_number":61,"context_line":"            self, _graph_nodes\u003dNone, _recursion_depth: Optional[int] \u003d None):"},{"line_number":62,"context_line":"        \"\"\"Converts to a data model graph."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        In order to make the resulting data model graph usable no matter how"}],"source_content_type":"text/x-python","patch_set":9,"id":"d8641e91_a6de4811","line":61,"range":{"start_line":61,"start_character":37,"end_line":61,"end_character":53},"updated":"2023-09-28 06:57:28.000000000","message":"I\u0027m wondering about this leading underscore, to me it indicates that the parameter should only be used internally (by this recursive function), but it is used by other callers in repositories.py","commit_id":"8a5ad0ae05be0fe0f55655b44c2ebd3ac8ab84a0"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"36b96c54302c53bd46ebdb593555d38ab7eb0852","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        raise NotImplementedError"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def to_data_model("},{"line_number":61,"context_line":"            self, _graph_nodes\u003dNone, _recursion_depth: Optional[int] \u003d None):"},{"line_number":62,"context_line":"        \"\"\"Converts to a data model graph."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        In order to make the resulting data model graph usable no matter how"}],"source_content_type":"text/x-python","patch_set":9,"id":"34187533_de7665b9","line":61,"range":{"start_line":61,"start_character":37,"end_line":61,"end_character":53},"in_reply_to":"4111e399_5d6f9da5","updated":"2023-09-30 11:19:25.000000000","message":"Done","commit_id":"8a5ad0ae05be0fe0f55655b44c2ebd3ac8ab84a0"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"d6cfe914515226b46379aaec996820a897121a98","unresolved":true,"context_lines":[{"line_number":58,"context_line":"        raise NotImplementedError"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def to_data_model("},{"line_number":61,"context_line":"            self, _graph_nodes\u003dNone, _recursion_depth: Optional[int] \u003d None):"},{"line_number":62,"context_line":"        \"\"\"Converts to a data model graph."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        In order to make the resulting data model graph usable no matter how"}],"source_content_type":"text/x-python","patch_set":9,"id":"4111e399_5d6f9da5","line":61,"range":{"start_line":61,"start_character":37,"end_line":61,"end_character":53},"in_reply_to":"d8641e91_a6de4811","updated":"2023-09-30 11:19:14.000000000","message":"no problem, I will remove it.\nI agree, that it is confusing, I initially did it in the same way as `_graph_nodes`, but as you said, now it\u0027s called outside of the recursive function.","commit_id":"8a5ad0ae05be0fe0f55655b44c2ebd3ac8ab84a0"}],"octavia/db/repositories.py":[{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"b64088dd9f8c26a25c633e9fb725738b3d4a99bd","unresolved":true,"context_lines":[{"line_number":146,"context_line":"        :param session: A Sql Alchemy database session."},{"line_number":147,"context_line":"        :param pagination_helper: Helper to apply pagination and sorting."},{"line_number":148,"context_line":"        :param query_options: Optional query options to apply."},{"line_number":149,"context_line":"        :param limited_graph: Option to avoid recursion iteration through all"},{"line_number":150,"context_line":"                              nodes in the graph via to_data_model"},{"line_number":151,"context_line":"        :param filters: Filters to decide which entities should be retrieved."},{"line_number":152,"context_line":"        :returns: [octavia.common.data_model]"},{"line_number":153,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"0e1da0cd_44dde1cd","line":150,"range":{"start_line":149,"start_character":8,"end_line":150,"end_character":66},"updated":"2023-09-26 08:48:25.000000000","message":"I think the description should be clearer. It should explain that recursion will stop at the first child node.","commit_id":"d9c6c84b5c66414ff7a40483133139b5c1bcfc6f"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"05760ca3fff1ecb7f01030cc4910cbf2b55a1949","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        :param session: A Sql Alchemy database session."},{"line_number":147,"context_line":"        :param pagination_helper: Helper to apply pagination and sorting."},{"line_number":148,"context_line":"        :param query_options: Optional query options to apply."},{"line_number":149,"context_line":"        :param limited_graph: Option to avoid recursion iteration through all"},{"line_number":150,"context_line":"                              nodes in the graph via to_data_model"},{"line_number":151,"context_line":"        :param filters: Filters to decide which entities should be retrieved."},{"line_number":152,"context_line":"        :returns: [octavia.common.data_model]"},{"line_number":153,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"ad5d842e_40f3c013","line":150,"range":{"start_line":149,"start_character":8,"end_line":150,"end_character":66},"in_reply_to":"0e1da0cd_44dde1cd","updated":"2023-09-26 18:31:58.000000000","message":"Done","commit_id":"d9c6c84b5c66414ff7a40483133139b5c1bcfc6f"}],"octavia/tests/functional/db/test_models.py":[{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"b64088dd9f8c26a25c633e9fb725738b3d4a99bd","unresolved":true,"context_lines":[{"line_number":1108,"context_line":"        self.assertNotEqual(1, lb_graph_count)"},{"line_number":1109,"context_line":"        self.assertNotEqual(1, p_graph_count)"},{"line_number":1110,"context_line":"        self.assertNotEqual(1, mem_graph_count)"},{"line_number":1111,"context_line":"        # the nodes count is different due to different number of related nodes"},{"line_number":1112,"context_line":"        self.assertNotEqual(lb_graph_count, p_graph_count)"},{"line_number":1113,"context_line":"        self.assertNotEqual(lb_graph_count, mem_graph_count)"},{"line_number":1114,"context_line":"        self.assertNotEqual(p_graph_count, mem_graph_count)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7036d9ee_b999a5d1","line":1111,"range":{"start_line":1111,"start_character":10,"end_line":1111,"end_character":79},"updated":"2023-09-26 08:48:25.000000000","message":"In other words the nodes count can vary? Is that the reason that there is no `self.assertEqual()` in this test case? I think it would be very helpful though in order to verify the algorithm works and to catch regressions.","commit_id":"d9c6c84b5c66414ff7a40483133139b5c1bcfc6f"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"05760ca3fff1ecb7f01030cc4910cbf2b55a1949","unresolved":false,"context_lines":[{"line_number":1108,"context_line":"        self.assertNotEqual(1, lb_graph_count)"},{"line_number":1109,"context_line":"        self.assertNotEqual(1, p_graph_count)"},{"line_number":1110,"context_line":"        self.assertNotEqual(1, mem_graph_count)"},{"line_number":1111,"context_line":"        # the nodes count is different due to different number of related nodes"},{"line_number":1112,"context_line":"        self.assertNotEqual(lb_graph_count, p_graph_count)"},{"line_number":1113,"context_line":"        self.assertNotEqual(lb_graph_count, mem_graph_count)"},{"line_number":1114,"context_line":"        self.assertNotEqual(p_graph_count, mem_graph_count)"}],"source_content_type":"text/x-python","patch_set":8,"id":"aeea29b4_da642ed4","line":1111,"range":{"start_line":1111,"start_character":10,"end_line":1111,"end_character":79},"in_reply_to":"7036d9ee_b999a5d1","updated":"2023-09-26 18:31:58.000000000","message":"Nope. The number is predicted and fixed.\nIn this comment, I meant different node count for different initial node type.\nFor example, \"member\" node has only one direct relationship - with \"pool\" node.\nIn the same time, \"pool\" node has direct relationships with - \"lb\", \"member\", \"listener\", etc. nodes. \nThe best demonstration for such \"difference\" is: \"test_data_model_graph_traversal_with_recursion_depth_zero\" test.\n\nI used `self.assertNotEqual` only because wanted to make test logic less strict.\nI will use constant values to avoid any regressions.","commit_id":"d9c6c84b5c66414ff7a40483133139b5c1bcfc6f"}]}
