SMTP-Client: make shure everything is finished before we terminate one client.
authorWilfried Goesgens <dothebart@citadel.org>
Fri, 6 Apr 2012 21:19:59 +0000 (23:19 +0200)
committerWilfried Goesgens <dothebart@citadel.org>
Fri, 6 Apr 2012 21:19:59 +0000 (23:19 +0200)
citadel/modules/smtp/serv_smtpeventclient.c
citadel/modules/smtp/serv_smtpqueue.c
citadel/modules/smtp/smtpqueue.h

index e5c1cee00931f84c887addfcbdb51002b8eab444..c8da5590e63b62841f30a3cfccf81331957679bc 100644 (file)
@@ -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)
index 2292df1c46eb7582808528d7919dc8da929875e3..92bc9d625d0826398c0dab5636f7395f3cfa37d8 100644 (file)
@@ -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: 
index 6c6dc5311f718153220e0af88ae1ffbed96bf9ab..c6cd97f5810c25a0914f9023a2d231b732a9b126 100644 (file)
@@ -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);