)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":32919,"name":"kiran pawar","display_name":"Kiran Pawar","email":"kinpaa@gmail.com","username":"kpdev"},"change_message_id":"42e9ba131b27369c040b705e6fbbb7171ab4ae32","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"bb55ec46_4d636767","updated":"2026-04-08 08:28:40.000000000","message":"Adding Maurice since has similar suggestions for our downstream issue.","commit_id":"83b5adc00a2f02431f024ff8b14dfffa418c695c"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"36c1b972df9e3a9ef442e049ef79dfa42295ebd4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"e10f0429_10cb40d5","updated":"2026-04-06 21:27:50.000000000","message":"Thanks for tackling this. Was any AI assistance used in writing this change? If yes, please see the OpenInfra AI policy: https://openinfra.org/legal/ai-policy/","commit_id":"83b5adc00a2f02431f024ff8b14dfffa418c695c"},{"author":{"_account_id":32919,"name":"kiran pawar","display_name":"Kiran Pawar","email":"kinpaa@gmail.com","username":"kpdev"},"change_message_id":"187b5662b43979730d8ef2d9bb7bd32281269308","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"ace8745a_5bed98f3","updated":"2026-04-08 13:22:54.000000000","message":"looks good now. minor suggestions. \nAlso please add releasenotes","commit_id":"9841a2a93f59f7ecaaf14facc21b9aea7d3434ba"},{"author":{"_account_id":32919,"name":"kiran pawar","display_name":"Kiran Pawar","email":"kinpaa@gmail.com","username":"kpdev"},"change_message_id":"45dcfb51ec07963d5601c1664bbab3d9b8f960f2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"d88da7f1_9f81cca2","updated":"2026-04-08 14:51:03.000000000","message":"Looks good. Please mention bug in releasenotes in next iteration of review. Otherwise +2 from me.","commit_id":"a30707cf6296668801676fdfd394da334bcdb745"},{"author":{"_account_id":18816,"name":"Maurice Escher","display_name":"carthaca","email":"maurice.escher@sap.com","username":"mapocace"},"change_message_id":"c6112be45b39a7a36971c54b60c7e21eb230a96b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"631d5a76_bc842590","updated":"2026-04-17 07:51:29.000000000","message":"lgtm, it achieves getting per-table transactions.\n\nMaybe you can add in the commit message, that now also the behavior changes on errors: previously, in theory, a fatal error could roll back everything, now it only rolls back partially (per-table).","commit_id":"a30707cf6296668801676fdfd394da334bcdb745"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"3baf84ef075a8741cc69aee46525ee01e00f0d10","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"8818f092_dcf82a60","updated":"2026-04-21 11:34:25.000000000","message":"Please check the comments once.","commit_id":"6fc88854b1acd0fa92328ba7d87c397b2574407e"}],"manila/db/sqlalchemy/api.py":[{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"2faf72811c9f6e69afedd101a11c0f648418eca5","unresolved":true,"context_lines":[{"line_number":6632,"context_line":""},{"line_number":6633,"context_line":""},{"line_number":6634,"context_line":"@require_admin_context"},{"line_number":6635,"context_line":"@context_manager.writer"},{"line_number":6636,"context_line":"def _purge_table_records(context, table, deleted_age):"},{"line_number":6637,"context_line":"    mds \u003d ["},{"line_number":6638,"context_line":"        m for m in models.__dict__.values()"}],"source_content_type":"text/x-python","patch_set":1,"id":"37b6b7a9_3fa08bab","line":6635,"updated":"2026-03-31 21:37:57.000000000","message":"@context_manager.writer does not create an independent transaction\nwhen called from within an existing @context_manager.writer scope.\noslo.db\u0027s enginefacade reuses the current transaction context. Use\n@context_manager.writer.independent instead. There are many examples\nalready in this file.","commit_id":"2c8e3f875296b0f4e64939f9ac7c2e9e206ba33a"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"36c1b972df9e3a9ef442e049ef79dfa42295ebd4","unresolved":false,"context_lines":[{"line_number":6632,"context_line":""},{"line_number":6633,"context_line":""},{"line_number":6634,"context_line":"@require_admin_context"},{"line_number":6635,"context_line":"@context_manager.writer"},{"line_number":6636,"context_line":"def _purge_table_records(context, table, deleted_age):"},{"line_number":6637,"context_line":"    mds \u003d ["},{"line_number":6638,"context_line":"        m for m in models.__dict__.values()"}],"source_content_type":"text/x-python","patch_set":1,"id":"91b78a2d_72c9d91f","line":6635,"in_reply_to":"37b6b7a9_3fa08bab","updated":"2026-04-06 21:27:50.000000000","message":"Done","commit_id":"2c8e3f875296b0f4e64939f9ac7c2e9e206ba33a"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"2faf72811c9f6e69afedd101a11c0f648418eca5","unresolved":true,"context_lines":[{"line_number":6633,"context_line":""},{"line_number":6634,"context_line":"@require_admin_context"},{"line_number":6635,"context_line":"@context_manager.writer"},{"line_number":6636,"context_line":"def _purge_table_records(context, table, deleted_age):"},{"line_number":6637,"context_line":"    mds \u003d ["},{"line_number":6638,"context_line":"        m for m in models.__dict__.values()"},{"line_number":6639,"context_line":"        if hasattr(m, \u0027__tablename__\u0027) and m.__tablename__ \u003d\u003d str(table)"}],"source_content_type":"text/x-python","patch_set":1,"id":"b3e075bb_1454c133","line":6636,"updated":"2026-03-31 21:37:57.000000000","message":"The model-lookup list comprehension iterates over all values in\nmodels.__dict__ for every table. Consider building a lookup dict\nonce in the caller and passing the model directly","commit_id":"2c8e3f875296b0f4e64939f9ac7c2e9e206ba33a"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"36c1b972df9e3a9ef442e049ef79dfa42295ebd4","unresolved":false,"context_lines":[{"line_number":6633,"context_line":""},{"line_number":6634,"context_line":"@require_admin_context"},{"line_number":6635,"context_line":"@context_manager.writer"},{"line_number":6636,"context_line":"def _purge_table_records(context, table, deleted_age):"},{"line_number":6637,"context_line":"    mds \u003d ["},{"line_number":6638,"context_line":"        m for m in models.__dict__.values()"},{"line_number":6639,"context_line":"        if hasattr(m, \u0027__tablename__\u0027) and m.__tablename__ \u003d\u003d str(table)"}],"source_content_type":"text/x-python","patch_set":1,"id":"a014252c_e7522baa","line":6636,"in_reply_to":"b3e075bb_1454c133","updated":"2026-04-06 21:27:50.000000000","message":"Done","commit_id":"2c8e3f875296b0f4e64939f9ac7c2e9e206ba33a"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"2faf72811c9f6e69afedd101a11c0f648418eca5","unresolved":true,"context_lines":[{"line_number":6671,"context_line":""},{"line_number":6672,"context_line":"@require_admin_context"},{"line_number":6673,"context_line":"@context_manager.writer"},{"line_number":6674,"context_line":"def purge_deleted_records(context, age_in_days):"},{"line_number":6675,"context_line":"    \"\"\"Purge soft-deleted records older than(and equal) age from tables.\"\"\""},{"line_number":6676,"context_line":""},{"line_number":6677,"context_line":"    if age_in_days \u003c 0:"}],"source_content_type":"text/x-python","patch_set":1,"id":"d84d95ae_1fdee84c","line":6674,"updated":"2026-03-31 21:37:57.000000000","message":"The commit message says \"Create a new transaction for processing\neach table\" but does not explain why. Add context from bug 2081827:\nsingle-transaction approach holds locks across all tables during purge.","commit_id":"2c8e3f875296b0f4e64939f9ac7c2e9e206ba33a"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"36c1b972df9e3a9ef442e049ef79dfa42295ebd4","unresolved":false,"context_lines":[{"line_number":6671,"context_line":""},{"line_number":6672,"context_line":"@require_admin_context"},{"line_number":6673,"context_line":"@context_manager.writer"},{"line_number":6674,"context_line":"def purge_deleted_records(context, age_in_days):"},{"line_number":6675,"context_line":"    \"\"\"Purge soft-deleted records older than(and equal) age from tables.\"\"\""},{"line_number":6676,"context_line":""},{"line_number":6677,"context_line":"    if age_in_days \u003c 0:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3539acf7_f6b5a3be","line":6674,"in_reply_to":"d84d95ae_1fdee84c","updated":"2026-04-06 21:27:50.000000000","message":"Done","commit_id":"2c8e3f875296b0f4e64939f9ac7c2e9e206ba33a"},{"author":{"_account_id":32919,"name":"kiran pawar","display_name":"Kiran Pawar","email":"kinpaa@gmail.com","username":"kpdev"},"change_message_id":"42e9ba131b27369c040b705e6fbbb7171ab4ae32","unresolved":true,"context_lines":[{"line_number":6662,"context_line":""},{"line_number":6663,"context_line":"@require_admin_context"},{"line_number":6664,"context_line":"@context_manager.writer"},{"line_number":6665,"context_line":"def purge_deleted_records(context, age_in_days):"},{"line_number":6666,"context_line":"    \"\"\"Purge soft-deleted records older than(and equal) age from tables.\"\"\""},{"line_number":6667,"context_line":""},{"line_number":6668,"context_line":"    if age_in_days \u003c 0:"}],"source_content_type":"text/x-python","patch_set":2,"id":"0faf489d_8693bec0","line":6665,"updated":"2026-04-08 08:28:40.000000000","message":"If you fix code as mentioned in next comment for security service association, You can remove @context_manager.writer from the outer function. It now just orchestrates; it does NOT open a transaction itself.","commit_id":"83b5adc00a2f02431f024ff8b14dfffa418c695c"},{"author":{"_account_id":32919,"name":"kiran pawar","display_name":"Kiran Pawar","email":"kinpaa@gmail.com","username":"kpdev"},"change_message_id":"45dcfb51ec07963d5601c1664bbab3d9b8f960f2","unresolved":false,"context_lines":[{"line_number":6662,"context_line":""},{"line_number":6663,"context_line":"@require_admin_context"},{"line_number":6664,"context_line":"@context_manager.writer"},{"line_number":6665,"context_line":"def purge_deleted_records(context, age_in_days):"},{"line_number":6666,"context_line":"    \"\"\"Purge soft-deleted records older than(and equal) age from tables.\"\"\""},{"line_number":6667,"context_line":""},{"line_number":6668,"context_line":"    if age_in_days \u003c 0:"}],"source_content_type":"text/x-python","patch_set":2,"id":"043f4309_1f93011a","line":6665,"in_reply_to":"0faf489d_8693bec0","updated":"2026-04-08 14:51:03.000000000","message":"Done","commit_id":"83b5adc00a2f02431f024ff8b14dfffa418c695c"},{"author":{"_account_id":32919,"name":"kiran pawar","display_name":"Kiran Pawar","email":"kinpaa@gmail.com","username":"kpdev"},"change_message_id":"42e9ba131b27369c040b705e6fbbb7171ab4ae32","unresolved":true,"context_lines":[{"line_number":6685,"context_line":"                      if hasattr(m, \u0027__tablename__\u0027)}"},{"line_number":6686,"context_line":""},{"line_number":6687,"context_line":"    # Deleting rows in share_network_security_service_association"},{"line_number":6688,"context_line":"    # related to deleted network or security service"},{"line_number":6689,"context_line":"    sec_assoc_to_delete \u003d context.session.query("},{"line_number":6690,"context_line":"        models.ShareNetworkSecurityServiceAssociation).join("},{"line_number":6691,"context_line":"        models.ShareNetwork).join(models.SecurityService).filter("}],"source_content_type":"text/x-python","patch_set":2,"id":"321f42e8_b2f3a19c","line":6688,"updated":"2026-04-08 08:28:40.000000000","message":"can you move this to separate function as below ?\n\n```\n@context_manager.writer.independent\ndef _purge_sec_service_associations(context, deleted_age):\n    \"\"\"Own transaction: delete stale share-network/security-service assocs.\"\"\"\n    assoc \u003d models.ShareNetworkSecurityServiceAssociation\n    deleted \u003d (\n        context.session.query(assoc)\n        .join(models.ShareNetwork)\n        .join(models.SecurityService)\n        .filter(or_(\n            models.ShareNetwork.deleted_at \u003c\u003d deleted_age,\n            models.SecurityService.deleted_at \u003c\u003d deleted_age,\n        ))\n        .delete(synchronize_session\u003dFalse)\n    )\n    if deleted:\n        LOG.info(\"Deleted %(count)s records in table %(table)s.\",\n                 {\"count\": deleted, \"table\": assoc.__tablename__})\n```","commit_id":"83b5adc00a2f02431f024ff8b14dfffa418c695c"},{"author":{"_account_id":32919,"name":"kiran pawar","display_name":"Kiran Pawar","email":"kinpaa@gmail.com","username":"kpdev"},"change_message_id":"45dcfb51ec07963d5601c1664bbab3d9b8f960f2","unresolved":false,"context_lines":[{"line_number":6685,"context_line":"                      if hasattr(m, \u0027__tablename__\u0027)}"},{"line_number":6686,"context_line":""},{"line_number":6687,"context_line":"    # Deleting rows in share_network_security_service_association"},{"line_number":6688,"context_line":"    # related to deleted network or security service"},{"line_number":6689,"context_line":"    sec_assoc_to_delete \u003d context.session.query("},{"line_number":6690,"context_line":"        models.ShareNetworkSecurityServiceAssociation).join("},{"line_number":6691,"context_line":"        models.ShareNetwork).join(models.SecurityService).filter("}],"source_content_type":"text/x-python","patch_set":2,"id":"063fcca9_53d5f6fc","line":6688,"in_reply_to":"321f42e8_b2f3a19c","updated":"2026-04-08 14:51:03.000000000","message":"Done","commit_id":"83b5adc00a2f02431f024ff8b14dfffa418c695c"},{"author":{"_account_id":32919,"name":"kiran pawar","display_name":"Kiran Pawar","email":"kinpaa@gmail.com","username":"kpdev"},"change_message_id":"187b5662b43979730d8ef2d9bb7bd32281269308","unresolved":true,"context_lines":[{"line_number":6713,"context_line":"                      for m in models.__dict__.values()"},{"line_number":6714,"context_line":"                      if hasattr(m, \u0027__tablename__\u0027)}"},{"line_number":6715,"context_line":""},{"line_number":6716,"context_line":"    _purge_sec_service_associations(context, deleted_age)"},{"line_number":6717,"context_line":""},{"line_number":6718,"context_line":"    for table in reversed(tables):"},{"line_number":6719,"context_line":"        if \u0027deleted\u0027 not in table.columns.keys():"}],"source_content_type":"text/x-python","patch_set":3,"id":"14725f81_967cc1a8","line":6716,"updated":"2026-04-08 13:22:54.000000000","message":"move this call above i.e. before generating table.","commit_id":"9841a2a93f59f7ecaaf14facc21b9aea7d3434ba"},{"author":{"_account_id":32919,"name":"kiran pawar","display_name":"Kiran Pawar","email":"kinpaa@gmail.com","username":"kpdev"},"change_message_id":"45dcfb51ec07963d5601c1664bbab3d9b8f960f2","unresolved":false,"context_lines":[{"line_number":6713,"context_line":"                      for m in models.__dict__.values()"},{"line_number":6714,"context_line":"                      if hasattr(m, \u0027__tablename__\u0027)}"},{"line_number":6715,"context_line":""},{"line_number":6716,"context_line":"    _purge_sec_service_associations(context, deleted_age)"},{"line_number":6717,"context_line":""},{"line_number":6718,"context_line":"    for table in reversed(tables):"},{"line_number":6719,"context_line":"        if \u0027deleted\u0027 not in table.columns.keys():"}],"source_content_type":"text/x-python","patch_set":3,"id":"68108cb8_6bf6d8a1","line":6716,"in_reply_to":"14725f81_967cc1a8","updated":"2026-04-08 14:51:03.000000000","message":"Done","commit_id":"9841a2a93f59f7ecaaf14facc21b9aea7d3434ba"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"3baf84ef075a8741cc69aee46525ee01e00f0d10","unresolved":true,"context_lines":[{"line_number":6647,"context_line":"                context.session.delete(record)"},{"line_number":6648,"context_line":"                deleted_count +\u003d 1"},{"line_number":6649,"context_line":"        except db_exc.DBError:"},{"line_number":6650,"context_line":"            LOG.warning("},{"line_number":6651,"context_line":"                \"Deleting soft-deleted resource %s failed, skipping.\","},{"line_number":6652,"context_line":"                record"},{"line_number":6653,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":5,"id":"eab7e233_13814a41","line":6650,"updated":"2026-04-21 11:34:25.000000000","message":"Shouldnt this be error log?","commit_id":"6fc88854b1acd0fa92328ba7d87c397b2574407e"},{"author":{"_account_id":32919,"name":"kiran pawar","display_name":"Kiran Pawar","email":"kinpaa@gmail.com","username":"kpdev"},"change_message_id":"6cabe9295d37a605838f89a0ef14c8dbcd3c7d1a","unresolved":false,"context_lines":[{"line_number":6647,"context_line":"                context.session.delete(record)"},{"line_number":6648,"context_line":"                deleted_count +\u003d 1"},{"line_number":6649,"context_line":"        except db_exc.DBError:"},{"line_number":6650,"context_line":"            LOG.warning("},{"line_number":6651,"context_line":"                \"Deleting soft-deleted resource %s failed, skipping.\","},{"line_number":6652,"context_line":"                record"},{"line_number":6653,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":5,"id":"0be2e54f_3878c6ab","line":6650,"in_reply_to":"eab7e233_13814a41","updated":"2026-04-24 11:02:51.000000000","message":"this is not runtime operation and more of operator/admin activity of cleanup. Also, the log kind is used as it is from previous code.","commit_id":"6fc88854b1acd0fa92328ba7d87c397b2574407e"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"3baf84ef075a8741cc69aee46525ee01e00f0d10","unresolved":true,"context_lines":[{"line_number":6682,"context_line":"            with context.session.begin_nested():"},{"line_number":6683,"context_line":"                context.session.delete(assoc)"},{"line_number":6684,"context_line":"        except db_exc.DBError:"},{"line_number":6685,"context_line":"            LOG.warning("},{"line_number":6686,"context_line":"                \"Deleting association %s failed, skipping.\","},{"line_number":6687,"context_line":"                assoc"},{"line_number":6688,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":5,"id":"b21367ba_64c706db","line":6685,"updated":"2026-04-21 11:34:25.000000000","message":"Shouldnt this be error log?","commit_id":"6fc88854b1acd0fa92328ba7d87c397b2574407e"},{"author":{"_account_id":32919,"name":"kiran pawar","display_name":"Kiran Pawar","email":"kinpaa@gmail.com","username":"kpdev"},"change_message_id":"6cabe9295d37a605838f89a0ef14c8dbcd3c7d1a","unresolved":false,"context_lines":[{"line_number":6682,"context_line":"            with context.session.begin_nested():"},{"line_number":6683,"context_line":"                context.session.delete(assoc)"},{"line_number":6684,"context_line":"        except db_exc.DBError:"},{"line_number":6685,"context_line":"            LOG.warning("},{"line_number":6686,"context_line":"                \"Deleting association %s failed, skipping.\","},{"line_number":6687,"context_line":"                assoc"},{"line_number":6688,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":5,"id":"c3f79a98_f70c53bc","line":6685,"in_reply_to":"b21367ba_64c706db","updated":"2026-04-24 11:02:51.000000000","message":"same as above.","commit_id":"6fc88854b1acd0fa92328ba7d87c397b2574407e"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"3baf84ef075a8741cc69aee46525ee01e00f0d10","unresolved":true,"context_lines":[{"line_number":6725,"context_line":"                _purge_table_records(context, model_by_table[table_name],"},{"line_number":6726,"context_line":"                                     table_name, deleted_age)"},{"line_number":6727,"context_line":"            except db_exc.DBError:"},{"line_number":6728,"context_line":"                LOG.warning(\"Querying table %s\u0027s soft-deleted records \""},{"line_number":6729,"context_line":"                            \"failed, skipping.\", table_name)"},{"line_number":6730,"context_line":""},{"line_number":6731,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"e29d3c3c_750bd478","line":6728,"updated":"2026-04-21 11:34:25.000000000","message":"Same comment as above. This should be error log?","commit_id":"6fc88854b1acd0fa92328ba7d87c397b2574407e"},{"author":{"_account_id":32919,"name":"kiran pawar","display_name":"Kiran Pawar","email":"kinpaa@gmail.com","username":"kpdev"},"change_message_id":"6cabe9295d37a605838f89a0ef14c8dbcd3c7d1a","unresolved":false,"context_lines":[{"line_number":6725,"context_line":"                _purge_table_records(context, model_by_table[table_name],"},{"line_number":6726,"context_line":"                                     table_name, deleted_age)"},{"line_number":6727,"context_line":"            except db_exc.DBError:"},{"line_number":6728,"context_line":"                LOG.warning(\"Querying table %s\u0027s soft-deleted records \""},{"line_number":6729,"context_line":"                            \"failed, skipping.\", table_name)"},{"line_number":6730,"context_line":""},{"line_number":6731,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"e8403b13_c915d30a","line":6728,"in_reply_to":"e29d3c3c_750bd478","updated":"2026-04-24 11:02:51.000000000","message":"same as above.","commit_id":"6fc88854b1acd0fa92328ba7d87c397b2574407e"}]}
