Description
I have some code sending emails and for legitimate reasons the email is rejected by the remote server. I want to log the exception but instead I see the ValueError('TPC in progress')
a couple times in the output, squashing the error.
It's actually causing the transaction manager to be in such a broken state that the next transaction.manager.begin() after the failed abort, causes another exception. Below is the crap fix to prove the diagnosis, but I'm not positive it's the correct fix. I downgraded to 4.1 and things work as expected.
From what I can tell this behavior appeared in 06ad882 when the manager was rewritten.
On a related side note, aborting in the second phase of a two-phase commit is a Really Bad Thing(tm). Since sending email isn't transactional it almost makes more sense to either send the email in an earlier phase or even as an afterCommitHook
.
diff --git a/repoze/sendmail/delivery.py b/repoze/sendmail/delivery.py
index 59115d7..6b56add 100644
--- a/repoze/sendmail/delivery.py
+++ b/repoze/sendmail/delivery.py
@@ -115,8 +115,8 @@ class MailDataManager(object):
raise ValueError("Not in a transaction")
if self.transaction is not trans:
raise ValueError("In a different transaction")
- if self.tpc_phase != 0:
- raise ValueError("TPC in progress")
+ #if self.tpc_phase != 0:
+ # raise ValueError("TPC in progress")
if self.onAbort:
self.onAbort()