Libev Migration; fix aborting on connection establishing problems
authorWilfried Goesgens <dothebart@citadel.org>
Sat, 15 Jan 2011 15:18:10 +0000 (16:18 +0100)
committerWilfried Goesgens <dothebart@citadel.org>
Sat, 15 Jan 2011 15:18:10 +0000 (16:18 +0100)
  - libev doesn't care whether a watcher is already registered or not, we don't need to remember which to stop and which not.
  - cast to the right structure while aborting
  - put timeout callback in
  - register timeout callback
  - close our socket in the right place.

citadel/event_client.c
citadel/event_client.h
citadel/modules/smtp/serv_smtpeventclient.c

index b9f90d00c848ec6ba0f63d7cdd808d582f45b49d..0d9c7b998a16b446ca987e02f6eec65cefc11751 100644 (file)
@@ -72,8 +72,6 @@ extern citthread_mutex_t EventQueueMutex;
 extern HashList *InboundEventQueue;
 extern struct ev_loop *event_base;
 
-#define SEND_EVENT 1
-#define RECV_EVENT 2
        
 int QueueEventContext(void *Ctx, AsyncIO *IO, EventContextAttach CB)
 {
@@ -147,19 +145,17 @@ void FreeAsyncIOContents(AsyncIO *IO)
 void ShutDownCLient(AsyncIO *IO)
 {
        CtdlLogPrintf(CTDL_DEBUG, "EVENT x %d\n", IO->sock);
-       switch (IO->active_event) {
-       case SEND_EVENT:
+
+       if (IO->sock != 0)
+       {
                ev_io_stop(event_base, &IO->send_event);
-               break;
-       case RECV_EVENT:
                ev_io_stop(event_base, &IO->recv_event);
-               break;
-       case 0:
-               // no event active here; just bail out.
-               break;
+               close(IO->sock);
+               IO->sock = 0;
+               IO->SendBuf.fd = 0;
+               IO->RecvBuf.fd = 0;
        }
 
-       IO->active_event = 0;
        IO->Terminate(IO->Data);
        
 }
@@ -195,7 +191,6 @@ eReadState HandleInbound(AsyncIO *IO)
                        
                if (Finished != eMustReadMore) {
                        ev_io_stop(event_base, &IO->recv_event);
-                       IO->active_event = 0;
                        IO->NextState = IO->ReadDone(IO->Data);
                        Finished = StrBufCheckBuffer(&IO->RecvBuf);
                }
@@ -207,9 +202,6 @@ eReadState HandleInbound(AsyncIO *IO)
        {
                IO->NextState = IO->SendDone(IO->Data);
                ev_io_start(event_base, &IO->send_event);
-
-               IO->active_event = SEND_EVENT;
-                       
        }
        else if ((IO->NextState == eTerminateConnection) ||
                 (IO->NextState == eAbort) )
@@ -263,7 +255,6 @@ IO_send_callback(struct ev_loop *loop, ev_io *watcher, int revents)
                }
 #endif
                ev_io_stop(event_base, &IO->send_event);
-               IO->active_event = 0;
                switch (IO->NextState) {
                case eSendReply:
                        break;
@@ -275,8 +266,6 @@ IO_send_callback(struct ev_loop *loop, ev_io *watcher, int revents)
                                ShutDownCLient(IO);
                        else {
                                ev_io_start(event_base, &IO->send_event);
-
-                               IO->active_event = SEND_EVENT;
                        }
                        break;
                case eReadMessage:
@@ -285,8 +274,6 @@ IO_send_callback(struct ev_loop *loop, ev_io *watcher, int revents)
                        }
                        else {
                                ev_io_start(event_base, &IO->recv_event);
-
-                               IO->active_event = RECV_EVENT;
                        }
 
                        break;
@@ -356,7 +343,6 @@ set_start_callback(struct ev_loop *loop, AsyncIO *IO, int revents, int first_rw_
        switch(IO->NextState) {
        case eReadMessage:
                ev_io_start(event_base, &IO->recv_event);
-               IO->active_event = RECV_EVENT;
                break;
        case eSendReply:
        case eSendMore:
@@ -438,6 +424,7 @@ IO->curr_ai->ai_family,
                              IO_connfail_callback, 
                              conn_timeout, 0);
                IO->conn_fail.data = IO;
+               ev_timer_start(event_base, &IO->conn_fail);
                
                return 0;
        }
@@ -470,6 +457,7 @@ void InitEventIO(AsyncIO *IO,
        IO->ReadDone = ReadDone;
        IO->Terminate = Terminate;
        IO->LineReader = LineReader;
+       IO->ConnFail = ConnFail;
        
        if (ReadFirst) {
                IO->NextState = eReadMessage;
index 35ce4246e214eb7d8b6f22b563928f4851507295..e6b41f3bd97401ccbc041b538874dd772ca082f6 100644 (file)
@@ -34,7 +34,6 @@ struct AsyncIO {
        struct hostent *HEnt;
        int sock;
        unsigned short dport;
-       int active_event;
                eNextState NextState;
 
        ev_timer conn_fail, 
@@ -98,3 +97,5 @@ void InitEventIO(AsyncIO *IO,
                 int ReadFirst);
 
 int QueueQuery(ns_type Type, char *name, AsyncIO *IO, IO_CallBack PostDNS);
+
+void StopClient(AsyncIO *IO);
index 676c1812f4dd220f61e47598e34ece87df2cc0ac..d13f5238e1a74183d73a11742ba94012dde5e092 100644 (file)
@@ -108,7 +108,7 @@ typedef enum _eSMTP_C_States {
        eMaxSMTPC
 } eSMTP_C_States;
 
-const long SMTP_C_ConnTimeout = 300; /* wail 5 minutes for connections... */
+const long SMTP_C_ConnTimeout = 60; /* wail 1 minute for connections... */
 const long SMTP_C_ReadTimeouts[eMaxSMTPC] = {
        90, /* Greeting... */
        30, /* EHLO */
@@ -242,8 +242,6 @@ void FinalizeMessageSend(SmtpOutMsg *Msg)
 
                RemoveQItem(Msg->MyQItem);
        }
-       
-       close(Msg->IO.sock);
        DeleteSmtpOutMsg(Msg);
 }
 
@@ -251,9 +249,9 @@ void FinalizeMessageSend(SmtpOutMsg *Msg)
 
 
 void get_one_mx_host_ip_done(void *Ctx, 
-                              int status,
-                              int timeouts,
-                              struct hostent *hostent)
+                            int status,
+                            int timeouts,
+                            struct hostent *hostent)
 {
        AsyncIO *IO = Ctx;
        SmtpOutMsg *SendMsg = IO->Data;
@@ -784,19 +782,22 @@ eNextState SMTP_C_DispatchWriteDone(void *Data)
 /*****************************************************************************/
 eNextState SMTP_C_Terminate(void *Data)
 {
-       SmtpOutMsg *pMsg = Data;
+       AsyncIO *IO = Data;
+       SmtpOutMsg *pMsg = IO->Data;
        FinalizeMessageSend(pMsg);
        return 0;
 }
 eNextState SMTP_C_Timeout(void *Data)
 {
-       SmtpOutMsg *pMsg = Data;
+       AsyncIO *IO = Data;
+       SmtpOutMsg *pMsg = IO->Data;
        FinalizeMessageSend(pMsg);
        return 0;
 }
 eNextState SMTP_C_ConnFail(void *Data)
 {
-       SmtpOutMsg *pMsg = Data;
+       AsyncIO *IO = Data;
+       SmtpOutMsg *pMsg = IO->Data;
        FinalizeMessageSend(pMsg);
        return 0;
 }