)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"d09fcca69300e12771bf4e333ad733310ca318aa","unresolved":true,"context_lines":[{"line_number":14,"context_line":"This commit necssitates changes to `neutron`[1] due to the"},{"line_number":15,"context_line":"interface change within."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"[1]https://review.opendev.org/c/openstack/neutron/+/817462"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Signed-off-by: Tyler Stachecki \u003ctstachecki@bloomberg.net\u003e"},{"line_number":20,"context_line":"Change-Id: Ia117189294c06dfc859e6a23cd9d20aca4d7c95f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"e30e4c74_d2f9b977","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":58},"updated":"2021-11-30 10:02:22.000000000","message":"does this change depend\u0027s on 817462?\nIf yes you can force (more-or-less) zuul to pull that with adding \"Depends-On: https://review.opendev.org/c/openstack/neutron/+/817462\" to the commit msg.\nThe other way I think it is not working, zuul can\u0027t fetch n-lib patches, so first this one needs to be released and consumed by neutron","commit_id":"117c76af8925655e1c831625651c45fadbcdd540"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"118874da141db024e46c742dde1694e44c07427b","unresolved":false,"context_lines":[{"line_number":14,"context_line":"This commit necssitates changes to `neutron`[1] due to the"},{"line_number":15,"context_line":"interface change within."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"[1]https://review.opendev.org/c/openstack/neutron/+/817462"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Signed-off-by: Tyler Stachecki \u003ctstachecki@bloomberg.net\u003e"},{"line_number":20,"context_line":"Change-Id: Ia117189294c06dfc859e6a23cd9d20aca4d7c95f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3b1d269e_09ce4327","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":58},"in_reply_to":"e30e4c74_d2f9b977","updated":"2022-06-13 03:25:22.000000000","message":"Yes, the \u0027Depends-On\u0027 was largely the problem here... far fewer Ci test cases are failing now, and these are likely actual issues.","commit_id":"117c76af8925655e1c831625651c45fadbcdd540"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"8bfaa60c4e0105d9f7eea1cbe3dc6dc83ad8beef","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"fef9963e_a92912d9","updated":"2021-11-12 14:02:42.000000000","message":"Having a hard time groking the failed test cases for root cause... but I expect that any use of external_net will be badly broken until [1] is applied to the system when this PR goes through CI.  Most uses of external_net will fail.\n\n[1] https://review.opendev.org/c/openstack/neutron/+/817462","commit_id":"117c76af8925655e1c831625651c45fadbcdd540"},{"author":{"_account_id":30772,"name":"Ihtisham ul Haq","display_name":"Ihtisham ul Haq","email":"ihtisham.ul_haq@mail.schwarz","username":"ihtisham","status":"STACKIT (Schwarz IT)"},"change_message_id":"c8469db936ffd644a2550b9dc40ee9bcd54a8f52","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":5,"id":"4ad92e69_3532ab4c","updated":"2022-02-04 12:20:48.000000000","message":"Hi Tyler,\n\nAny update here? We are facing the same issue and would be interested in pushing this patch.","commit_id":"117c76af8925655e1c831625651c45fadbcdd540"},{"author":{"_account_id":31357,"name":"LEDUC Florian","display_name":"Florian LEDUC","email":"florian.leduc@socgen.com","username":"leducflorian","status":"Société Générale"},"change_message_id":"59f81840d21f6cb241c0ee357bad9e3b0a943a89","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"c2a94c5b_2ecfb68c","updated":"2022-02-15 10:14:27.000000000","message":"RECHECK","commit_id":"117c76af8925655e1c831625651c45fadbcdd540"},{"author":{"_account_id":31357,"name":"LEDUC Florian","display_name":"Florian LEDUC","email":"florian.leduc@socgen.com","username":"leducflorian","status":"Société Générale"},"change_message_id":"59f81840d21f6cb241c0ee357bad9e3b0a943a89","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":5,"id":"df82fdad_e2380212","in_reply_to":"4ad92e69_3532ab4c","updated":"2022-02-15 10:14:27.000000000","message":"Totally agree, the patch seems interesting and worth to try it. I\u0027m a bit late on the review of this one. Tempest tests are failing and I can\u0027t fetch the result. I\u0027ll recheck it.","commit_id":"117c76af8925655e1c831625651c45fadbcdd540"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"c15fd32408a947e41b5e895ab51aded6828bec99","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"59b458da_a578a78c","in_reply_to":"d747be07_cdb10fd9","updated":"2022-07-05 19:03:26.000000000","message":"Made a lot of progress, just need to finish tidying this patch up -- please let me know if you have any further comments.","commit_id":"117c76af8925655e1c831625651c45fadbcdd540"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"3d353f4f97ae53d7b20541ee3333b735a98c7e41","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":5,"id":"d747be07_cdb10fd9","in_reply_to":"df82fdad_e2380212","updated":"2022-02-17 18:19:13.000000000","message":"We deployed this change to several large production clouds, and it\u0027s solved all database load issues formerly observed with no adverse effects... so at best I would hope there are just some edge cases.\n\nI\u0027m happy to help drive this PR to completion, though might need a few pointers regarding my earlier comments on how to handle the dependencies across two projects, etc. that I mentioned above. I\u0027ll add the \u0027Depends-On\u0027 tag that Lajos mentioned for starters.","commit_id":"117c76af8925655e1c831625651c45fadbcdd540"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"f0242e3aa1dddda5a37b820903491961d2d5e552","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"288a4e49_13a285b9","updated":"2022-06-12 02:38:52.000000000","message":"recheck","commit_id":"99db97ff1973fb30215337a99d03f576950aa2b7"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"28c0ee505d34bb5debf70dda6b3fce4e30355c14","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"52aafdbf_b93367e4","updated":"2022-06-12 02:04:43.000000000","message":"recheck","commit_id":"99db97ff1973fb30215337a99d03f576950aa2b7"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"f0242e3aa1dddda5a37b820903491961d2d5e552","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"107b334b_cc89672e","in_reply_to":"52aafdbf_b93367e4","updated":"2022-06-12 02:38:52.000000000","message":"recheck","commit_id":"99db97ff1973fb30215337a99d03f576950aa2b7"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"118874da141db024e46c742dde1694e44c07427b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"d217e97e_85c331dc","updated":"2022-06-13 03:25:22.000000000","message":"CI tests are mostly passing now after understanding/adding the \u0027Depends-On\u0027 tag for Zuul -- there\u0027s only a few legitimate errors now that make sense now. I\u0027ll address these sometime this week, along with Oleg\u0027s previous comments.","commit_id":"35b53a6fd54e95c71e431816cb1ab47731df9120"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"9ac1847b7dcd65a65c516781529025469c39862a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"e633c050_0fadcc16","updated":"2022-06-13 01:52:31.000000000","message":"Sorry for all the noise - the test results are littered with HTTP 500 type-errors, which leads me to believe I\u0027m botching up the \u0027Depends-On\u0027 tag.\n\nRegardless, I\u0027ll pull up a devstack this week so I can see what I\u0027m doing wrong.","commit_id":"35b53a6fd54e95c71e431816cb1ab47731df9120"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"ab2ff0b28762cd57057258546602071a8b90d9bd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"2b6efe58_7d92f9c4","updated":"2022-06-13 01:49:40.000000000","message":"recheck","commit_id":"35b53a6fd54e95c71e431816cb1ab47731df9120"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"e53b6c9c7a29db573ff4baed38bf2331d32bb773","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"cea0da34_a59b297d","updated":"2022-07-04 07:43:32.000000000","message":"Please check my comments on PS5","commit_id":"9c1d1298794e53a3b58c996470f115ee0e7f5664"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"c15fd32408a947e41b5e895ab51aded6828bec99","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"6cf8b4cf_2897e888","in_reply_to":"729d301d_b14f6a39","updated":"2022-07-05 19:03:26.000000000","message":"Pushed a new PS","commit_id":"9c1d1298794e53a3b58c996470f115ee0e7f5664"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"c6e5f4be898fdb09eaca6a8fcd9120b27a053483","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":8,"id":"729d301d_b14f6a39","in_reply_to":"cea0da34_a59b297d","updated":"2022-07-04 12:26:55.000000000","message":"Hello, thank you for your review. I did see it and am working on it - taking me a bit to think about it and refactor as there are 3 variables which need to go into and returned by the function broken out.","commit_id":"9c1d1298794e53a3b58c996470f115ee0e7f5664"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"c15fd32408a947e41b5e895ab51aded6828bec99","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"f8ca8f91_3a981a1e","updated":"2022-07-05 19:03:26.000000000","message":"Some aspects of this change still don\u0027t resonate well with me, but pushing what I have that at least partially addresses open comments.","commit_id":"da7483c5c98baa927ccf377e6147dbd157c68087"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"4f01ff5d91d1f89ee6e0c0eaad640d74419f730f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"81bf3efd_d9d3ce13","updated":"2022-07-06 09:08:30.000000000","message":"Thanks for fixing comments! Quite a complex logic, really hard work. I\u0027ll need to take one more fresh look at it.","commit_id":"da7483c5c98baa927ccf377e6147dbd157c68087"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"e282307d8a00e3ad7df62742cd4d5f145d4e5469","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"dc0395fb_97ec50f6","updated":"2022-07-05 20:23:15.000000000","message":"recheck","commit_id":"da7483c5c98baa927ccf377e6147dbd157c68087"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"a2bc0bc84024826845a812244c75ea1c5b722235","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":9,"id":"5235cce9_c74f2575","in_reply_to":"81bf3efd_d9d3ce13","updated":"2022-07-06 13:12:38.000000000","message":"Thank you, and thank you for your patience with this PS.\n\nBTW, I am sure you noticed, but this PR must merge with the other one ref\u0027d in the commit.\n\n** If either patch merges in isolation, it will break Neutron (the patches are co-dependent). **\n\nI think I specified Zuul tags correctly, but the other PS is still failing checks because it is not being tested with this PS yet still...","commit_id":"da7483c5c98baa927ccf377e6147dbd157c68087"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"3bbf1063189d0118c14b075dc64eefa5d74d2f56","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"3386c832_8ef3af47","updated":"2022-07-11 02:25:12.000000000","message":"Addressed some of Oleg\u0027s review comments.","commit_id":"f1b53ce4d47551250bb1968df053021128f2aee3"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"a513f54929640f4705ee5ac50724f84a4d0eace2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"78bf6d39_5295406d","updated":"2022-07-20 14:12:56.000000000","message":"Included steps as to how to reproduce the performance issue in a devstack","commit_id":"f1b53ce4d47551250bb1968df053021128f2aee3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"0f104b135525beacc8d4904bac0ca61e63ba5e78","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"ef019a5d_f0c63c90","updated":"2022-07-12 13:44:48.000000000","message":"What basically you are doing is creating a nested query with the RBAC filters [1]. That means the DB needs to execute two queries instead of one.\n\nSince [2], included in Yoga, we now include \"target_project\" (\"target_tenant\" before) and \"action\" as indexes of any RBAC table (not only \"networkrbacs\"). That means the query will filter by indexes (in both queries, with and without optimization).\n\nI\u0027ve created an environment with 500 networks created by a project and another 500 shared to it. These are the execution times with and without the optimization [3].\n\nMy -1 for this patch is because:\n1) This optimization does not improves the performance.\n2) Introduces an unneeded complexity in a code that is already difficult to understand.\n3) The new query result of this optimization needs two nested queries instead of one. Unless it is proven that in a particular case this is better, I choose the single query code that also returns a more understandable and shorter SQL query.\n\n[1]https://paste.opendev.org/show/bmN4cUhe0c8iT1CZzaPp/\n[2]https://review.opendev.org/c/openstack/neutron/+/810072\n[3]https://paste.opendev.org/show/brUC9JvrTOsy3suu5roQ/\n","commit_id":"f1b53ce4d47551250bb1968df053021128f2aee3"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"8c2d9ae9fbe3f84e5aafa0744a4694438dd589d7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"9313da92_b16b7666","updated":"2022-07-11 13:48:15.000000000","message":"recheck","commit_id":"f1b53ce4d47551250bb1968df053021128f2aee3"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"a513f54929640f4705ee5ac50724f84a4d0eace2","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":10,"id":"feff4cbc_97a44ffa","in_reply_to":"1ca8c1cc_7b5276e2","updated":"2022-07-20 14:12:56.000000000","message":"Rodolfo, sorry for the delay.\n\nI\u0027ve been able to reproduce the issue on a Zed devstack built just a few weeks ago:\nhttps://paste.opendev.org/show/bDlR7t4KIZsIEZA7hC5x/\n\nMy patch drastically improved the performance with only 1,000 projects and RBACs created in the devstack. Although the example uses 1,000... you can keep adding more and see that the API call wall time with my patch is unchanged regardless of how many RBACs there are, whereas the runtime without the patch gets exponentially worse as more and more RBACs are added.","commit_id":"f1b53ce4d47551250bb1968df053021128f2aee3"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"41a3b1e0f0530b31c5eb24558446c435d47387fd","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":10,"id":"714999c1_2fced607","in_reply_to":"2a35d8a4_7166cdf2","updated":"2022-10-25 00:09:20.000000000","message":"Hello - I\u0027d like to pull this PR out of abandoned status and drag it over the finish line. Are you requesting more documentation on the combinations of SQL expressions that can now be generated?","commit_id":"f1b53ce4d47551250bb1968df053021128f2aee3"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"0ebe677418c329237425d73381901a8f85103b3e","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":10,"id":"2a35d8a4_7166cdf2","in_reply_to":"52762de6_f0e7ba68","updated":"2022-08-08 14:29:08.000000000","message":"I believe that the performance issue *is* directly related to the SQL query. Looking at your paste, is it possible that you may have not noticed this because of the values chosen for all the variables? Note that the performance of the query is sensitive to the values used... if the anonymous inner query result set is small, then even the query without the patch will run quickly.\n\nIn order to demonstrate this, please look at my notes here where I leverage the slow query log to extract the exact slow query with all registers expanded to values:\nhttps://paste.opendev.org/show/bzoeMpfkpZLvrXcHmAxW/\n\nYou can also just fork a ton of \u0027openstack network list\u0027 commands in the background without the patch applied and watch top -- you\u0027ll notice that the only process with any CPU time used is mysql.","commit_id":"f1b53ce4d47551250bb1968df053021128f2aee3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"6d5932a89dff4679e06cc1e635e67d33efad0a8f","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":10,"id":"1ca8c1cc_7b5276e2","in_reply_to":"a49c2639_d7e6cb0d","updated":"2022-07-13 10:54:36.000000000","message":"Please, give me a reproducer to check that locally. For example, create a certain amount of networks, ports, etc and how many of them shared and how.","commit_id":"f1b53ce4d47551250bb1968df053021128f2aee3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"497efb28bd1c8cd0cab41ac0fe2392ef25f801bf","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":10,"id":"52762de6_f0e7ba68","in_reply_to":"e76135b0_48bf2cfe","updated":"2022-08-08 11:32:02.000000000","message":"I\u0027ve reproduced the environment described. Using the non-admin user, I was able to achieve the performance differences reported.\n\nHowever this performance issue is not in the SQL query. Both queries [1] perform the same. The time consuming operation is the SQLalchemy construction of the Network DB objects, specifically when retrieving the RBAC registers. But this is not related to the queries themselves but to how SQLAlchemy caches the queries on a transaction. In your code, the RBAC entries are retrieved in a separate query and used later during the models_v2.Network DB object. That is what is speeding the CLI command.\n\nI we agree to implement this, I would add an extensive documentation explaining:\n- How the queries are build, including SQL examples.\n- What is the rationale of this change, explaining what I\u0027ve said before. Please, don\u0027t justify this patch saying that the new SQL query performs better. This is not true. Both queries, in my env, take around 5ms when executed via direct SQL call (using the mysql shell).\n\n[1]https://paste.opendev.org/show/bmN4cUhe0c8iT1CZzaPp/","commit_id":"f1b53ce4d47551250bb1968df053021128f2aee3"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"123852a9f23140ebc6a4c596c83b84aef80d783c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"a49c2639_d7e6cb0d","in_reply_to":"ef019a5d_f0c63c90","updated":"2022-07-12 16:30:11.000000000","message":"Rodolfo, thank you for your candid feedback.\n\nI did test your proposed changes earlier with a copy of our databases in-house that exhibit the performance problem, and I could not observe any improvement (see comment #31 on https://bugs.launchpad.net/neutron/+bug/1918145). But perhaps I messed up, or there have been more changes since; I\u0027ll give it another go and report back.\n\nAll the same -- I completely sympathize with the complexity of this PR. I dislike it. It\u0027s very messy and reduces the generality of the filters.\n\nThat all being said: if you also look at comment #32 in the same LP link that I pasted above, the difference this patch makes in our production clusters is simply jaw-dropping. We had queries taking tens of seconds to minutes in production that now take way 100s of ms at most. This PS unquestionably improves the performance of a specific case (where there are thousands of RBAC rules).","commit_id":"f1b53ce4d47551250bb1968df053021128f2aee3"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"94ac1a05e76a8c59d508eeb90ac7ab1115b4224c","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":10,"id":"e76135b0_48bf2cfe","in_reply_to":"feff4cbc_97a44ffa","updated":"2022-07-20 14:18:30.000000000","message":"And sorry - my notes in the paste use the OS_USERNAME/etc. of admin, but you should run the `openstack network list` and equivalent commands *as the demo user* (provided via openrc) to perform a/b/a testing and observe the performance benefits.","commit_id":"f1b53ce4d47551250bb1968df053021128f2aee3"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"c119b86b7a330a081f852066c8bd1bbcf2f7b8b6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"b379495b_52933dfc","updated":"2023-02-06 12:41:03.000000000","message":"recheck\nHmm, seems like zuul jobs are not started after rebase","commit_id":"71640b424cbf46301306298eda7fd33c0ca2bc42"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"f27b305245332eebd2a939996f0f8f01c3c42a08","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":12,"id":"6f8aa7df_4b6be7f0","in_reply_to":"b379495b_52933dfc","updated":"2023-02-06 16:59:40.000000000","message":"Yeah, this was due to me incorrectly trying to specify that the Neutron PS and this n-lib patch go hand-in-hand and cannot merge separately. I will break the dependency cycle and it should take off again.\n\nSorry for the delay in revisiting this PS, I have built a devstack based on origin/main today and should be able to pick it up again.","commit_id":"71640b424cbf46301306298eda7fd33c0ca2bc42"}],"neutron_lib/db/model_query.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"ab98c7f45d63c42dc4cca9d855cc67a9a75e71fe","unresolved":true,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"def register_hook(model, name, query_hook, filter_hook,"},{"line_number":70,"context_line":"                  result_filters\u003dNone, rbac_filter_hook\u003dNone):"},{"line_number":71,"context_line":"    \"\"\"Register a hook to be invoked when a query is executed."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    Adds the hook components to the _model_query_hooks dict. Models are the"}],"source_content_type":"text/x-python","patch_set":5,"id":"a2088f2d_640afa72","line":70,"range":{"start_line":70,"start_character":39,"end_line":70,"end_character":55},"updated":"2022-02-18 07:40:03.000000000","message":"please add param description to the docstring below","commit_id":"117c76af8925655e1c831625651c45fadbcdd540"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"c15fd32408a947e41b5e895ab51aded6828bec99","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"def register_hook(model, name, query_hook, filter_hook,"},{"line_number":70,"context_line":"                  result_filters\u003dNone, rbac_filter_hook\u003dNone):"},{"line_number":71,"context_line":"    \"\"\"Register a hook to be invoked when a query is executed."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    Adds the hook components to the _model_query_hooks dict. Models are the"}],"source_content_type":"text/x-python","patch_set":5,"id":"9cc0492b_69777b7d","line":70,"range":{"start_line":70,"start_character":39,"end_line":70,"end_character":55},"in_reply_to":"a2088f2d_640afa72","updated":"2022-07-05 19:03:26.000000000","message":"added","commit_id":"117c76af8925655e1c831625651c45fadbcdd540"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"ab98c7f45d63c42dc4cca9d855cc67a9a75e71fe","unresolved":true,"context_lines":[{"line_number":112,"context_line":"    :param context: The context to use for the DB session."},{"line_number":113,"context_line":"    :param model: The model to query."},{"line_number":114,"context_line":"    :param field: The column."},{"line_number":115,"context_line":"    :param lazy_fields: list of fields for lazy loading"},{"line_number":116,"context_line":"    :returns: The query with hooks applied to it."},{"line_number":117,"context_line":"    \"\"\""},{"line_number":118,"context_line":"    if field:"}],"source_content_type":"text/x-python","patch_set":5,"id":"add68e03_0891c2e8","line":115,"range":{"start_line":115,"start_character":4,"end_line":115,"end_character":55},"updated":"2022-02-18 07:40:03.000000000","message":"wrong placement, please move to query_with_hooks","commit_id":"117c76af8925655e1c831625651c45fadbcdd540"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"c15fd32408a947e41b5e895ab51aded6828bec99","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    :param context: The context to use for the DB session."},{"line_number":113,"context_line":"    :param model: The model to query."},{"line_number":114,"context_line":"    :param field: The column."},{"line_number":115,"context_line":"    :param lazy_fields: list of fields for lazy loading"},{"line_number":116,"context_line":"    :returns: The query with hooks applied to it."},{"line_number":117,"context_line":"    \"\"\""},{"line_number":118,"context_line":"    if field:"}],"source_content_type":"text/x-python","patch_set":5,"id":"00b9d9a4_d6c17b7a","line":115,"range":{"start_line":115,"start_character":4,"end_line":115,"end_character":55},"in_reply_to":"add68e03_0891c2e8","updated":"2022-07-05 19:03:26.000000000","message":"moved","commit_id":"117c76af8925655e1c831625651c45fadbcdd540"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"ab98c7f45d63c42dc4cca9d855cc67a9a75e71fe","unresolved":true,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"def query_with_hooks(context, model, field\u003dNone, lazy_fields\u003dNone,"},{"line_number":129,"context_line":"                     hoisted_filters\u003dNone):"},{"line_number":130,"context_line":"    \"\"\"Query with hooks using the said context and model."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    :param context: The context to use for the DB session."}],"source_content_type":"text/x-python","patch_set":5,"id":"d625ba22_f291d915","line":129,"range":{"start_line":129,"start_character":21,"end_line":129,"end_character":36},"updated":"2022-02-18 07:40:03.000000000","message":"please add param description to the docstring below","commit_id":"117c76af8925655e1c831625651c45fadbcdd540"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"c15fd32408a947e41b5e895ab51aded6828bec99","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"def query_with_hooks(context, model, field\u003dNone, lazy_fields\u003dNone,"},{"line_number":129,"context_line":"                     hoisted_filters\u003dNone):"},{"line_number":130,"context_line":"    \"\"\"Query with hooks using the said context and model."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    :param context: The context to use for the DB session."}],"source_content_type":"text/x-python","patch_set":5,"id":"d29b31a4_2384869f","line":129,"range":{"start_line":129,"start_character":21,"end_line":129,"end_character":36},"in_reply_to":"d625ba22_f291d915","updated":"2022-07-05 19:03:26.000000000","message":"added, also updated :returns","commit_id":"117c76af8925655e1c831625651c45fadbcdd540"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"ab98c7f45d63c42dc4cca9d855cc67a9a75e71fe","unresolved":true,"context_lines":[{"line_number":169,"context_line":"        if filter_hook:"},{"line_number":170,"context_line":"            rbac_query_filter \u003d filter_hook(context, model, rbac_query_filter)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    # NOTE(tjstachecki): this code used to live in apply_filters(...), but"},{"line_number":173,"context_line":"    # we have to evaluate it here before we union off the RBAC columns."},{"line_number":174,"context_line":"    if hoisted_filters:"},{"line_number":175,"context_line":"        for key, value in hoisted_filters.items():"}],"source_content_type":"text/x-python","patch_set":5,"id":"cf24c8f2_117cd64b","line":172,"range":{"start_line":172,"start_character":3,"end_line":172,"end_character":64},"updated":"2022-02-18 07:40:03.000000000","message":"Please make a separate function: _apply_filters_\u003csmth\u003e() as query_with_hooks now becomes really long.","commit_id":"117c76af8925655e1c831625651c45fadbcdd540"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"c15fd32408a947e41b5e895ab51aded6828bec99","unresolved":true,"context_lines":[{"line_number":169,"context_line":"        if filter_hook:"},{"line_number":170,"context_line":"            rbac_query_filter \u003d filter_hook(context, model, rbac_query_filter)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    # NOTE(tjstachecki): this code used to live in apply_filters(...), but"},{"line_number":173,"context_line":"    # we have to evaluate it here before we union off the RBAC columns."},{"line_number":174,"context_line":"    if hoisted_filters:"},{"line_number":175,"context_line":"        for key, value in hoisted_filters.items():"}],"source_content_type":"text/x-python","patch_set":5,"id":"30a0cb22_13c12a64","line":172,"range":{"start_line":172,"start_character":3,"end_line":172,"end_character":64},"in_reply_to":"cf24c8f2_117cd64b","updated":"2022-07-05 19:03:26.000000000","message":"Broke it out. As I mentioned in my last reply, I kind of find this function terribly ugly wrt the number of args it takes and returns, what it does, etc... but I am struggling as to how to make it more elegant with where it needs to be and what its purpose is. I at least wanted to get something up for consideration for now, though.","commit_id":"117c76af8925655e1c831625651c45fadbcdd540"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"93af9ca688deb067ad5a626a9f9933d0d042ed05","unresolved":true,"context_lines":[{"line_number":78,"context_line":"    :param name: A name for the hook."},{"line_number":79,"context_line":"    :param query_hook: The method to be called to augment the query."},{"line_number":80,"context_line":"    :param filter_hook: A method to be called to augment the query filter for"},{"line_number":81,"context_line":"                        models which either doo\u0027t have or join to RBAC entries."},{"line_number":82,"context_line":"    :param rbac_filter_hook: A method to be called to augment the query filter"},{"line_number":83,"context_line":"                             for models which contain and join to RBAC entries."},{"line_number":84,"context_line":"    :param result_filters: A Method to be called to filter the query result."}],"source_content_type":"text/x-python","patch_set":9,"id":"205d1e85_2c0c14e8","line":81,"range":{"start_line":81,"start_character":44,"end_line":81,"end_character":63},"updated":"2022-07-08 08:21:42.000000000","message":"just to clarify: is this for models that not relate to RBAC in any way?","commit_id":"da7483c5c98baa927ccf377e6147dbd157c68087"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"93af9ca688deb067ad5a626a9f9933d0d042ed05","unresolved":true,"context_lines":[{"line_number":78,"context_line":"    :param name: A name for the hook."},{"line_number":79,"context_line":"    :param query_hook: The method to be called to augment the query."},{"line_number":80,"context_line":"    :param filter_hook: A method to be called to augment the query filter for"},{"line_number":81,"context_line":"                        models which either doo\u0027t have or join to RBAC entries."},{"line_number":82,"context_line":"    :param rbac_filter_hook: A method to be called to augment the query filter"},{"line_number":83,"context_line":"                             for models which contain and join to RBAC entries."},{"line_number":84,"context_line":"    :param result_filters: A Method to be called to filter the query result."}],"source_content_type":"text/x-python","patch_set":9,"id":"71ebd88d_d43d91b4","line":81,"range":{"start_line":81,"start_character":44,"end_line":81,"end_character":49},"updated":"2022-07-08 08:21:42.000000000","message":"nit: don\u0027t","commit_id":"da7483c5c98baa927ccf377e6147dbd157c68087"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"3bbf1063189d0118c14b075dc64eefa5d74d2f56","unresolved":true,"context_lines":[{"line_number":78,"context_line":"    :param name: A name for the hook."},{"line_number":79,"context_line":"    :param query_hook: The method to be called to augment the query."},{"line_number":80,"context_line":"    :param filter_hook: A method to be called to augment the query filter for"},{"line_number":81,"context_line":"                        models which either doo\u0027t have or join to RBAC entries."},{"line_number":82,"context_line":"    :param rbac_filter_hook: A method to be called to augment the query filter"},{"line_number":83,"context_line":"                             for models which contain and join to RBAC entries."},{"line_number":84,"context_line":"    :param result_filters: A Method to be called to filter the query result."}],"source_content_type":"text/x-python","patch_set":9,"id":"73fb113c_d5bec487","line":81,"range":{"start_line":81,"start_character":44,"end_line":81,"end_character":63},"in_reply_to":"205d1e85_2c0c14e8","updated":"2022-07-11 02:25:12.000000000","message":"Not necessarily - let\u0027s take an external network as an example. Of course, an external network has RBAC entries so that Neutron can delegate access to them. But, if we want to filter on some property of the external network, like segmentation_id, we would do so using a filter_hook and not a rbac_filter_hook, because we want to filter on the property of the model.\n\nGiven this - I see how this could be worded better. Reworded the text here.","commit_id":"da7483c5c98baa927ccf377e6147dbd157c68087"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"3bbf1063189d0118c14b075dc64eefa5d74d2f56","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    :param name: A name for the hook."},{"line_number":79,"context_line":"    :param query_hook: The method to be called to augment the query."},{"line_number":80,"context_line":"    :param filter_hook: A method to be called to augment the query filter for"},{"line_number":81,"context_line":"                        models which either doo\u0027t have or join to RBAC entries."},{"line_number":82,"context_line":"    :param rbac_filter_hook: A method to be called to augment the query filter"},{"line_number":83,"context_line":"                             for models which contain and join to RBAC entries."},{"line_number":84,"context_line":"    :param result_filters: A Method to be called to filter the query result."}],"source_content_type":"text/x-python","patch_set":9,"id":"9380e1cc_07c1e81d","line":81,"range":{"start_line":81,"start_character":44,"end_line":81,"end_character":49},"in_reply_to":"71ebd88d_d43d91b4","updated":"2022-07-11 02:25:12.000000000","message":"fixed","commit_id":"da7483c5c98baa927ccf377e6147dbd157c68087"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"93af9ca688deb067ad5a626a9f9933d0d042ed05","unresolved":true,"context_lines":[{"line_number":79,"context_line":"    :param query_hook: The method to be called to augment the query."},{"line_number":80,"context_line":"    :param filter_hook: A method to be called to augment the query filter for"},{"line_number":81,"context_line":"                        models which either doo\u0027t have or join to RBAC entries."},{"line_number":82,"context_line":"    :param rbac_filter_hook: A method to be called to augment the query filter"},{"line_number":83,"context_line":"                             for models which contain and join to RBAC entries."},{"line_number":84,"context_line":"    :param result_filters: A Method to be called to filter the query result."},{"line_number":85,"context_line":"    :returns: None."}],"source_content_type":"text/x-python","patch_set":9,"id":"265cac11_ab230894","line":82,"range":{"start_line":82,"start_character":11,"end_line":82,"end_character":27},"updated":"2022-07-08 08:21:42.000000000","message":"is this mutual exclusive with \u0027filter_hook\u0027?","commit_id":"da7483c5c98baa927ccf377e6147dbd157c68087"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"3bbf1063189d0118c14b075dc64eefa5d74d2f56","unresolved":true,"context_lines":[{"line_number":79,"context_line":"    :param query_hook: The method to be called to augment the query."},{"line_number":80,"context_line":"    :param filter_hook: A method to be called to augment the query filter for"},{"line_number":81,"context_line":"                        models which either doo\u0027t have or join to RBAC entries."},{"line_number":82,"context_line":"    :param rbac_filter_hook: A method to be called to augment the query filter"},{"line_number":83,"context_line":"                             for models which contain and join to RBAC entries."},{"line_number":84,"context_line":"    :param result_filters: A Method to be called to filter the query result."},{"line_number":85,"context_line":"    :returns: None."}],"source_content_type":"text/x-python","patch_set":9,"id":"a4432b4d_90dd2fca","line":82,"range":{"start_line":82,"start_character":11,"end_line":82,"end_character":27},"in_reply_to":"265cac11_ab230894","updated":"2022-07-11 02:25:12.000000000","message":"Yes, filter_hook is for the model part of the query only, after the RBACs have been evaluated. rbac_filter_hook cannot use any of fields from the model part of the query because we do not evaluate it against the \"outer\" part of the query (anything that would not inner join with an RBAC).\n\nHere\u0027s an example of something that remains a filter_hook:\nhttps://opendev.org/openstack/neutron/src/commit/2a44898119ad6e9de63c242440549ff40c5feeb0/neutron/db/db_base_plugin_v2.py#L113\n\nAnd here\u0027s an example of something that was formerly a filter_hook, but now needs to become an rbac_filter_hook:\nhttps://opendev.org/openstack/neutron/src/commit/2a44898119ad6e9de63c242440549ff40c5feeb0/neutron/db/external_net_db.py#L40\n\nThey have to be kept separate, because they have to be applied against different parts of the result set at different times as it is in flight.","commit_id":"da7483c5c98baa927ccf377e6147dbd157c68087"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"93af9ca688deb067ad5a626a9f9933d0d042ed05","unresolved":true,"context_lines":[{"line_number":109,"context_line":"    return _model_query_hooks.get(model, {}).values()"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"def _prep_query_with_hooks(context, model, field\u003dNone):"},{"line_number":113,"context_line":"    \"\"\"Query with hooks using the said context and model."},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    :param context: The context to use for the DB session."}],"source_content_type":"text/x-python","patch_set":9,"id":"ac7abfc1_a5fda5e3","line":112,"range":{"start_line":112,"start_character":16,"end_line":112,"end_character":26},"updated":"2022-07-08 08:21:42.000000000","message":"can be just \u0027_prep_query\u0027 as it\u0027s unrelated to any hooks","commit_id":"da7483c5c98baa927ccf377e6147dbd157c68087"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"3bbf1063189d0118c14b075dc64eefa5d74d2f56","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    return _model_query_hooks.get(model, {}).values()"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"def _prep_query_with_hooks(context, model, field\u003dNone):"},{"line_number":113,"context_line":"    \"\"\"Query with hooks using the said context and model."},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    :param context: The context to use for the DB session."}],"source_content_type":"text/x-python","patch_set":9,"id":"8643f972_3a6f68b4","line":112,"range":{"start_line":112,"start_character":16,"end_line":112,"end_character":26},"in_reply_to":"ac7abfc1_a5fda5e3","updated":"2022-07-11 02:25:12.000000000","message":"fixed","commit_id":"da7483c5c98baa927ccf377e6147dbd157c68087"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"93af9ca688deb067ad5a626a9f9933d0d042ed05","unresolved":true,"context_lines":[{"line_number":148,"context_line":"            query \u003d query.join(model.rbac_entries)"},{"line_number":149,"context_line":"            query_to_union \u003d _prep_query_with_hooks(context, model, field)"},{"line_number":150,"context_line":"            rbac_model \u003d model.rbac_entries.property.mapper.class_"},{"line_number":151,"context_line":"            model_query_filter \u003d (model.tenant_id \u003d\u003d context.tenant_id)"},{"line_number":152,"context_line":"            rbac_query_filter \u003d ("},{"line_number":153,"context_line":"                (rbac_model.action.in_("},{"line_number":154,"context_line":"                    [constants.ACCESS_SHARED, constants.ACCESS_READONLY]) \u0026"}],"source_content_type":"text/x-python","patch_set":9,"id":"749a017b_9900cf84","line":151,"range":{"start_line":151,"start_character":40,"end_line":151,"end_character":71},"updated":"2022-07-08 08:21:42.000000000","message":"please use project_id as tenant_id is deprecated","commit_id":"da7483c5c98baa927ccf377e6147dbd157c68087"},{"author":{"_account_id":33910,"name":"Tyler Stachecki","display_name":"Tyler Stachecki","email":"tstachecki@bloomberg.net","username":"tjstachecki"},"change_message_id":"3bbf1063189d0118c14b075dc64eefa5d74d2f56","unresolved":false,"context_lines":[{"line_number":148,"context_line":"            query \u003d query.join(model.rbac_entries)"},{"line_number":149,"context_line":"            query_to_union \u003d _prep_query_with_hooks(context, model, field)"},{"line_number":150,"context_line":"            rbac_model \u003d model.rbac_entries.property.mapper.class_"},{"line_number":151,"context_line":"            model_query_filter \u003d (model.tenant_id \u003d\u003d context.tenant_id)"},{"line_number":152,"context_line":"            rbac_query_filter \u003d ("},{"line_number":153,"context_line":"                (rbac_model.action.in_("},{"line_number":154,"context_line":"                    [constants.ACCESS_SHARED, constants.ACCESS_READONLY]) \u0026"}],"source_content_type":"text/x-python","patch_set":9,"id":"591d7c5f_27ab458e","line":151,"range":{"start_line":151,"start_character":40,"end_line":151,"end_character":71},"in_reply_to":"749a017b_9900cf84","updated":"2022-07-11 02:25:12.000000000","message":"fixed","commit_id":"da7483c5c98baa927ccf377e6147dbd157c68087"}]}
