From 91a9b8806b53105a54a4bc83bb40d68b5d6f0b6d Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Fri, 6 Apr 2012 23:19:59 +0200 Subject: [PATCH] SMTP-Client: make shure everything is finished before we terminate one client. --- citadel/modules/smtp/serv_smtpeventclient.c | 19 ++++++++++++++++++- citadel/modules/smtp/serv_smtpqueue.c | 17 +++++++++++++++++ citadel/modules/smtp/smtpqueue.h | 3 +++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/citadel/modules/smtp/serv_smtpeventclient.c b/citadel/modules/smtp/serv_smtpeventclient.c index e5c1cee00..c8da5590e 100644 --- a/citadel/modules/smtp/serv_smtpeventclient.c +++ b/citadel/modules/smtp/serv_smtpeventclient.c @@ -126,6 +126,7 @@ eNextState FinalizeMessageSendDB(AsyncIO *IO); eNextState FinalizeMessageSend_DB1(AsyncIO *IO); eNextState FinalizeMessageSend_DB2(AsyncIO *IO); eNextState FinalizeMessageSend_DB3(AsyncIO *IO); +eNextState FinalizeMessageSend_DB4(AsyncIO *IO); /****************************************************************************** * So, we're finished with sending (regardless of success or failure) * @@ -217,11 +218,27 @@ inline void FinalizeMessageSend_DB_3(AsyncIO *IO) ""); FreeStrBuf(&Msg->QMsgData); } + DecreaseShutdownDeliveries(Msg->MyQItem); } eNextState FinalizeMessageSend_DB3(AsyncIO *IO) { + SmtpOutMsg *Msg = IO->Data; FinalizeMessageSend_DB_3(IO); - return eAbort; + if (!Msg->IDestructQueItem) + return eAbort; + return NextDBOperation(IO, FinalizeMessageSend_DB4); +} + +eNextState FinalizeMessageSend_DB4(AsyncIO *IO) +{ + int n; + SmtpOutMsg *Msg = IO->Data; + + n = GetShutdownDeliveries(Msg->MyQItem); + if (n > 0) + return NextDBOperation(IO, FinalizeMessageSend_DB4); + else + return eAbort; } eNextState FinalizeMessageSend_DB(AsyncIO *IO) diff --git a/citadel/modules/smtp/serv_smtpqueue.c b/citadel/modules/smtp/serv_smtpqueue.c index 2292df1c4..92bc9d625 100644 --- a/citadel/modules/smtp/serv_smtpqueue.c +++ b/citadel/modules/smtp/serv_smtpqueue.c @@ -141,6 +141,22 @@ int DecreaseQReference(OneQueItem *MyQItem) return IDestructQueItem; } +void DecreaseShutdownDeliveries(OneQueItem *MyQItem) +{ + pthread_mutex_lock(&ActiveQItemsLock); + MyQItem->NotYetShutdownDeliveries--; + pthread_mutex_unlock(&ActiveQItemsLock); +} + +int GetShutdownDeliveries(OneQueItem *MyQItem) +{ + int DestructNow; + + pthread_mutex_lock(&ActiveQItemsLock); + DestructNow = MyQItem->ActiveDeliveries == 0; + pthread_mutex_unlock(&ActiveQItemsLock); + return DestructNow; +} void RemoveQItem(OneQueItem *MyQItem) { long len; @@ -856,6 +872,7 @@ void smtp_do_procmsg(long msgnum, void *userdata) { } DeleteHashPos(&It); + MyQItem->NotYetShutdownDeliveries = MyQItem->ActiveDeliveries = CountActiveQueueEntries(MyQItem); /* failsafe against overload: diff --git a/citadel/modules/smtp/smtpqueue.h b/citadel/modules/smtp/smtpqueue.h index 6c6dc5311..c6cd97f58 100644 --- a/citadel/modules/smtp/smtpqueue.h +++ b/citadel/modules/smtp/smtpqueue.h @@ -56,6 +56,7 @@ typedef struct queueitem { time_t Retry; long ActiveDeliveries; + long NotYetShutdownDeliveries; StrBuf *EnvelopeFrom; StrBuf *BounceTo; StrBuf *SenderRoom; @@ -70,6 +71,8 @@ typedef struct __QItemHandlerStruct { QItemHandler H; } QItemHandlerStruct; int DecreaseQReference(OneQueItem *MyQItem); +void DecreaseShutdownDeliveries(OneQueItem *MyQItem); +int GetShutdownDeliveries(OneQueItem *MyQItem); void RemoveQItem(OneQueItem *MyQItem); int CountActiveQueueEntries(OneQueItem *MyQItem); StrBuf *SerializeQueueItem(OneQueItem *MyQItem); -- 2.30.2