From f41e8208d850de7f98ca5928c774b409ce3294fb Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Mon, 29 Jun 2026 22:48:28 +0530 Subject: [PATCH] fix(crm): savepoint Email Campaign send loop (Postgres) send_mail (called per campaign schedule in a loop) inserts a Communication via make(); on failure the except calls frappe.log_error with no rollback, raising InFailedSqlTransaction on Postgres and poisoning subsequent sends. Savepoint before make() + rollback(save_point=) before log_error. No-op on MariaDB. --- erpnext/crm/doctype/email_campaign/email_campaign.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/erpnext/crm/doctype/email_campaign/email_campaign.py b/erpnext/crm/doctype/email_campaign/email_campaign.py index 4454ede5310..bf0379b8e32 100644 --- a/erpnext/crm/doctype/email_campaign/email_campaign.py +++ b/erpnext/crm/doctype/email_campaign/email_campaign.py @@ -174,6 +174,7 @@ def send_mail(entry, email_campaign): subject = frappe.render_template(email_template.get("subject"), context) content = frappe.render_template(email_template.response_, context) + frappe.db.savepoint("email_campaign_send") try: comm = make( doctype="Email Campaign", @@ -197,6 +198,7 @@ def send_mail(entry, email_campaign): queue_separately=True, ) except Exception: + frappe.db.rollback(save_point="email_campaign_send") frappe.log_error(title="Email Campaign Failed.") return comm