You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2010/02/22 18:52:04 UTC

svn commit: r914987 - in /incubator/trafficserver/traffic/trunk: iocore/eventsystem/ iocore/net/ libinktomi++/

Author: zwoop
Date: Mon Feb 22 17:52:04 2010
New Revision: 914987

URL: http://svn.apache.org/viewvc?rev=914987&view=rev
Log:
TS-164: using pipe fd as signal between netthreads (and less timeout)
	Author: Vijaya Bhaskar Mamidi
	Bug fix on patch submission: George P.
	Review: Leif

Modified:
    incubator/trafficserver/traffic/trunk/iocore/eventsystem/I_EThread.h
    incubator/trafficserver/traffic/trunk/iocore/eventsystem/I_ProtectedQueue.h
    incubator/trafficserver/traffic/trunk/iocore/eventsystem/P_ProtectedQueue.h
    incubator/trafficserver/traffic/trunk/iocore/eventsystem/P_UnixEThread.h
    incubator/trafficserver/traffic/trunk/iocore/net/P_UnixNet.h
    incubator/trafficserver/traffic/trunk/iocore/net/P_UnixNetProcessor.h
    incubator/trafficserver/traffic/trunk/iocore/net/UnixNet.cc
    incubator/trafficserver/traffic/trunk/libinktomi++/ink_thread.h

Modified: incubator/trafficserver/traffic/trunk/iocore/eventsystem/I_EThread.h
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/trunk/iocore/eventsystem/I_EThread.h?rev=914987&r1=914986&r2=914987&view=diff
==============================================================================
--- incubator/trafficserver/traffic/trunk/iocore/eventsystem/I_EThread.h (original)
+++ incubator/trafficserver/traffic/trunk/iocore/eventsystem/I_EThread.h Mon Feb 22 17:52:04 2010
@@ -325,7 +325,7 @@
   unsigned int event_types;
   bool is_event_type(EventType et);
   void set_event_type(EventType et);
-
+  int getEventFd();
   // Private Interface
 
   void execute();

Modified: incubator/trafficserver/traffic/trunk/iocore/eventsystem/I_ProtectedQueue.h
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/trunk/iocore/eventsystem/I_ProtectedQueue.h?rev=914987&r1=914986&r2=914987&view=diff
==============================================================================
--- incubator/trafficserver/traffic/trunk/iocore/eventsystem/I_ProtectedQueue.h (original)
+++ incubator/trafficserver/traffic/trunk/iocore/eventsystem/I_ProtectedQueue.h Mon Feb 22 17:52:04 2010
@@ -48,11 +48,18 @@
   Event *dequeue_local();
   void dequeue_timed(ink_hrtime cur_time, ink_hrtime timeout, bool sleep);
 
+  void setWriteFd(int );
+  void setReadFd(int );
+  int getReadFd();
+
   InkAtomicList al;
   ink_mutex lock;
   ink_cond might_have_data;
   Que(Event, link) localQueue;
 
+  int write_pipe_fd;
+  int read_pipe_fd;
+
   ProtectedQueue();
 };
 

Modified: incubator/trafficserver/traffic/trunk/iocore/eventsystem/P_ProtectedQueue.h
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/trunk/iocore/eventsystem/P_ProtectedQueue.h?rev=914987&r1=914986&r2=914987&view=diff
==============================================================================
--- incubator/trafficserver/traffic/trunk/iocore/eventsystem/P_ProtectedQueue.h (original)
+++ incubator/trafficserver/traffic/trunk/iocore/eventsystem/P_ProtectedQueue.h Mon Feb 22 17:52:04 2010
@@ -34,7 +34,7 @@
 
 
 INK_INLINE
-ProtectedQueue::ProtectedQueue()
+ProtectedQueue::ProtectedQueue():write_pipe_fd(-1),read_pipe_fd(-1)
 {
   Event e;
   ink_mutex_init(&lock, "ProtectedQueue");
@@ -46,21 +46,39 @@
 ProtectedQueue::signal()
 {
   // Need to get the lock before you can signal the thread
-  ink_mutex_acquire(&lock);
-  ink_cond_signal(&might_have_data);
-  ink_mutex_release(&lock);
+  if(write_pipe_fd!=-1) {
+    int retVal = socketManager.write(write_pipe_fd,(void*)"W",1);
+    if(retVal <= 0) {
+      int fd = write_pipe_fd;
+      socketManager.close(fd);
+    }
+  } else {
+    ink_mutex_acquire(&lock);
+    ink_cond_signal(&might_have_data);
+    ink_mutex_release(&lock);
+  }
 }
 
 INK_INLINE int
 ProtectedQueue::try_signal()
 {
   // Need to get the lock before you can signal the thread
-  if (ink_mutex_try_acquire(&lock)) {
-    ink_cond_signal(&might_have_data);
-    ink_mutex_release(&lock);
+  if(write_pipe_fd!=-1) {
+    int retVal = socketManager.write(write_pipe_fd,(void*)"W",1);
+    if(retVal <= 0) {
+      int fd = write_pipe_fd;
+      write_pipe_fd = read_pipe_fd = -1;
+      socketManager.close(fd);
+    }
     return 1;
   } else {
-    return 0;
+    if (ink_mutex_try_acquire(&lock)) {
+      ink_cond_signal(&might_have_data);
+      ink_mutex_release(&lock);
+      return 1;
+    } else {
+      return 0;
+    }
   }
 }
 
@@ -93,4 +111,26 @@
   return e;
 }
 
+INK_INLINE void 
+ProtectedQueue::setReadFd(int fd)
+{
+  read_pipe_fd = fd;
+}
+
+INK_INLINE void 
+ProtectedQueue::setWriteFd(int fd)
+{
+  write_pipe_fd = fd;
+}
+
+INK_INLINE int 
+ProtectedQueue::getReadFd()
+{
+  int pfd[2] = {-1,-1};
+  ink_create_pipe(pfd);
+  setReadFd(pfd[0]);
+  setWriteFd(pfd[1]);
+  return pfd[0];
+}
+
 #endif

Modified: incubator/trafficserver/traffic/trunk/iocore/eventsystem/P_UnixEThread.h
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/trunk/iocore/eventsystem/P_UnixEThread.h?rev=914987&r1=914986&r2=914987&view=diff
==============================================================================
--- incubator/trafficserver/traffic/trunk/iocore/eventsystem/P_UnixEThread.h (original)
+++ incubator/trafficserver/traffic/trunk/iocore/eventsystem/P_UnixEThread.h Mon Feb 22 17:52:04 2010
@@ -168,5 +168,10 @@
   EVENT_FREE(e, eventAllocator, this);
 }
 
+INK_INLINE int 
+EThread::getEventFd()
+{
+  return EventQueueExternal.getReadFd();
+}
 
 #endif /*_EThread_h_*/

Modified: incubator/trafficserver/traffic/trunk/iocore/net/P_UnixNet.h
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/trunk/iocore/net/P_UnixNet.h?rev=914987&r1=914986&r2=914987&view=diff
==============================================================================
--- incubator/trafficserver/traffic/trunk/iocore/net/P_UnixNet.h (original)
+++ incubator/trafficserver/traffic/trunk/iocore/net/P_UnixNet.h Mon Feb 22 17:52:04 2010
@@ -40,6 +40,7 @@
     DNSConnection *dnscon;
     NetAccept *na;
     UnixUDPConnection *uc;
+    int fd;
   } data;
 };
 
@@ -52,6 +53,7 @@
 #define EPOLL_READWRITE_VC		2
 #define EPOLL_DNS_CONNECTION		3
 #define EPOLL_UDP_CONNECTION		4
+#define EVENTFD			5
 
 struct UnixNetVConnection;
 struct NetHandler;
@@ -104,7 +106,7 @@
 #define MAX_EPOLL_ARRAY_SIZE                      (1024*16)
 #define MAX_EPOLL_TIMEOUT                         50    /* mseconds */
 #define DEFAULT_EPOLL_TIMEOUT                     10    /* mseconds */
-#define REAL_DEFAULT_EPOLL_TIMEOUT                3     /* the define above is old code [ebalsa] -- this directly effects latency of the connections. */
+#define REAL_DEFAULT_EPOLL_TIMEOUT                1     /* the define above is old code [ebalsa] -- this directly effects latency of the connections. */
 
 #define NET_THROTTLE_DELAY                        50    /* mseconds */
 #define INK_MIN_PRIORITY                          0

Modified: incubator/trafficserver/traffic/trunk/iocore/net/P_UnixNetProcessor.h
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/trunk/iocore/net/P_UnixNetProcessor.h?rev=914987&r1=914986&r2=914987&view=diff
==============================================================================
--- incubator/trafficserver/traffic/trunk/iocore/net/P_UnixNetProcessor.h (original)
+++ incubator/trafficserver/traffic/trunk/iocore/net/P_UnixNetProcessor.h Mon Feb 22 17:52:04 2010
@@ -110,6 +110,7 @@
 // accept such events by the EventProcesor.
 //
 extern void initialize_thread_for_net(EThread * thread, int thread_index);
+extern void initialize_eventfd(EThread * thread);
 
 //#include "UnixNet.h"
 #endif

Modified: incubator/trafficserver/traffic/trunk/iocore/net/UnixNet.cc
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/trunk/iocore/net/UnixNet.cc?rev=914987&r1=914986&r2=914987&view=diff
==============================================================================
--- incubator/trafficserver/traffic/trunk/iocore/net/UnixNet.cc (original)
+++ incubator/trafficserver/traffic/trunk/iocore/net/UnixNet.cc Mon Feb 22 17:52:04 2010
@@ -119,6 +119,7 @@
   new((ink_dummy_for_new *) get_NetHandler(thread)) NetHandler();
   new((ink_dummy_for_new *) get_PollCont(thread)) PollCont(thread->mutex, get_NetHandler(thread));
   get_NetHandler(thread)->mutex = new_ProxyMutex();
+  initialize_eventfd(thread);
   thread->schedule_imm(get_NetHandler(thread));
 
 #ifndef INACTIVITY_TIMEOUT
@@ -127,6 +128,26 @@
 #endif
 }
 
+void initialize_eventfd(EThread *thread) {
+
+  int fd = thread->getEventFd();
+  PollDescriptor *pd = get_PollDescriptor(thread);
+  struct epoll_data_ptr *eptr;
+  eptr = (struct epoll_data_ptr *) xmalloc(sizeof(struct epoll_data_ptr));
+  eptr->type = EVENTFD;
+  eptr->data.fd = fd;
+
+
+  struct epoll_event ev;
+  memset(&ev, 0, sizeof(struct epoll_event));
+
+  ev.events = EPOLLIN | EPOLLET;
+  ev.data.ptr = eptr;
+  if (epoll_ctl(pd->epoll_fd, EPOLL_CTL_ADD, fd, &ev) < 0) {
+    Debug("iocore_net", "acceptEvent : Failed to add event add to list epoll list\n");
+  }
+}
+
 // NetHandler method definitions
 
 NetHandler::NetHandler():Continuation(NULL), trigger_event(0)
@@ -246,6 +267,16 @@
     } else if (epd->type == EPOLL_DNS_CONNECTION) {
       if (epd->data.dnscon != NULL)
         dnsqueue.enqueue(epd->data.dnscon);
+    } else if (epd->type == EVENTFD) {
+      char buf[1024];
+      int retVal=-1;
+      do {
+        retVal = socketManager.read(epd->data.fd,&buf,1024);
+      } while(retVal == 1024);
+      if (retVal <=0) {
+        socketManager.close(epd->data.fd);
+        initialize_eventfd(e->ethread);
+      }
     }
   }
 

Modified: incubator/trafficserver/traffic/trunk/libinktomi++/ink_thread.h
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/trunk/libinktomi%2B%2B/ink_thread.h?rev=914987&r1=914986&r2=914987&view=diff
==============================================================================
--- incubator/trafficserver/traffic/trunk/libinktomi++/ink_thread.h (original)
+++ incubator/trafficserver/traffic/trunk/libinktomi++/ink_thread.h Mon Feb 22 17:52:04 2010
@@ -279,6 +279,12 @@
   pthread_exit(status);
 }
 
+static inline void
+ink_create_pipe( int pfd[2])
+{
+  ink_assert(pipe(pfd)==0);
+}
+
 #endif /* #if defined(POSIX_THREAD) */
 
 #endif /*_INK_THREAD_H*/