]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
Event: assert failure when failed to add/del event
authorHaomai Wang <haomaiwang@gmail.com>
Wed, 27 May 2015 08:30:57 +0000 (16:30 +0800)
committerHaomai Wang <haomaiwang@gmail.com>
Sat, 30 May 2015 14:29:55 +0000 (22:29 +0800)
Signed-off-by: Haomai Wang <haomaiwang@gmail.com>
src/msg/async/Event.cc
src/msg/async/Event.h
src/msg/async/EventEpoll.cc
src/msg/async/EventEpoll.h
src/msg/async/EventKqueue.cc
src/msg/async/EventKqueue.h
src/msg/async/EventSelect.cc
src/msg/async/EventSelect.h

index 131d86924ed249efd2f224444825e06b62397f64..ec3db87740223320f320e4701db4ef880ad5bd57 100644 (file)
@@ -148,8 +148,13 @@ int EventCenter::create_file_event(int fd, int mask, EventCallbackRef ctxt)
     return 0;
 
   r = driver->add_event(fd, event->mask, mask);
-  if (r < 0)
+  if (r < 0) {
+    // Actually we don't allow any failed error code, caller doesn't prepare to
+    // handle error status. So now we need to assert failure here. In practice,
+    // add_event shouldn't report error, otherwise it must be a innermost bug!
+    assert(0 == "BUG!");
     return r;
+  }
 
   event->mask |= mask;
   if (mask & EVENT_READABLE) {
@@ -178,7 +183,11 @@ void EventCenter::delete_file_event(int fd, int mask)
   if (!event->mask)
     return ;
 
-  driver->del_event(fd, event->mask, mask);
+  int r = driver->del_event(fd, event->mask, mask);
+  if (r < 0) {
+    // see create_file_event
+    assert(0 == "BUG!");
+  }
 
   if (mask & EVENT_READABLE && event->read_cb) {
     event->read_cb.reset();
index a526188b3bc7db9fd3addbca5d8ea79d9b6e62b1..dc85238dcb239de780146893593ed4ae84732484 100644 (file)
@@ -75,7 +75,7 @@ class EventDriver {
   virtual ~EventDriver() {}       // we want a virtual destructor!!!
   virtual int init(int nevent) = 0;
   virtual int add_event(int fd, int cur_mask, int mask) = 0;
-  virtual void del_event(int fd, int cur_mask, int del_mask) = 0;
+  virtual int del_event(int fd, int cur_mask, int del_mask) = 0;
   virtual int event_wait(vector<FiredFileEvent> &fired_events, struct timeval *tp) = 0;
   virtual int resize_events(int newsize) = 0;
 };
index c33dd3d51f886d83704c8e663a9dddb9dab7f829..fe6e54dc235c08a2a96afb508bc1d7903e53f7f5 100644 (file)
@@ -71,12 +71,13 @@ int EpollDriver::add_event(int fd, int cur_mask, int add_mask)
   return 0;
 }
 
-void EpollDriver::del_event(int fd, int cur_mask, int delmask)
+int EpollDriver::del_event(int fd, int cur_mask, int delmask)
 {
   ldout(cct, 20) << __func__ << " del event fd=" << fd << " cur_mask=" << cur_mask
                  << " delmask=" << delmask << " to " << epfd << dendl;
   struct epoll_event ee;
   int mask = cur_mask & (~delmask);
+  int r = 0;
 
   ee.events = 0;
   if (mask & EVENT_READABLE) ee.events |= EPOLLIN;
@@ -84,18 +85,21 @@ void EpollDriver::del_event(int fd, int cur_mask, int delmask)
   ee.data.u64 = 0; /* avoid valgrind warning */
   ee.data.fd = fd;
   if (mask != EVENT_NONE) {
-    if (epoll_ctl(epfd, EPOLL_CTL_MOD, fd, &ee) < 0) {
+    if ((r = epoll_ctl(epfd, EPOLL_CTL_MOD, fd, &ee)) < 0) {
       lderr(cct) << __func__ << " epoll_ctl: modify fd=" << fd << " mask=" << mask
                  << " failed." << cpp_strerror(errno) << dendl;
+      return r;
     }
   } else {
     /* Note, Kernel < 2.6.9 requires a non null event pointer even for
      * EPOLL_CTL_DEL. */
-    if (epoll_ctl(epfd, EPOLL_CTL_DEL, fd, &ee) < 0) {
+    if ((r = epoll_ctl(epfd, EPOLL_CTL_DEL, fd, &ee)) < 0) {
       lderr(cct) << __func__ << " epoll_ctl: delete fd=" << fd
                  << " failed." << cpp_strerror(errno) << dendl;
+      return r;
     }
   }
+  return 0;
 }
 
 int EpollDriver::resize_events(int newsize)
index 6ad32e4206693d96df591d7dedf3d8f920b4ba71..07255d45288abb0398e184da9f6bca75950fc60e 100644 (file)
@@ -40,7 +40,7 @@ class EpollDriver : public EventDriver {
 
   int init(int nevent);
   int add_event(int fd, int cur_mask, int add_mask);
-  void del_event(int fd, int cur_mask, int del_mask);
+  int del_event(int fd, int cur_mask, int del_mask);
   int resize_events(int newsize);
   int event_wait(vector<FiredFileEvent> &fired_events, struct timeval *tp);
 };
index d0056f1e51c0931fefe7299ae89e730fdf8c2a6c..c357a923634b46aaf215f1d87cc2701b803032a4 100644 (file)
@@ -65,23 +65,26 @@ int KqueueDriver::add_event(int fd, int cur_mask, int add_mask)
   return 0;
 }
 
-void KqueueDriver::del_event(int fd, int cur_mask, int delmask)
+int KqueueDriver::del_event(int fd, int cur_mask, int delmask)
 {
   ldout(cct, 20) << __func__ << " del event fd=" << fd << " cur mask=" << cur_mask
                  << " delmask=" << delmask << dendl;
   struct kevent ee;
   struct kevent ke;
   int filter = 0;
+  int r = 0;
   filter |= (delmask & EVENT_READABLE) ? EVFILT_READ : 0;
   filter |= (delmask & EVENT_WRITABLE) ? EVFILT_WRITE : 0;
 
   if (filter) {
     EV_SET(&ke, fd, filter, EV_DELETE, 0, 0, NULL);
-    if (kevent(kqfd, &ke, 1, NULL, 0, NULL) < 0) {
+    if ((r = kevent(kqfd, &ke, 1, NULL, 0, NULL)) < 0) {
       lderr(cct) << __func__ << " kevent: delete fd=" << fd << " mask=" << filter
                  << " failed." << cpp_strerror(errno) << dendl;
+      return r;
     }
   }
+  return 0;
 }
 
 int KqueueDriver::resize_events(int newsize)
index 04169adea5596c67ab5c50b011c0a25ceb0ee53a..52d9c7290f20987c1ad13b26b826db08603a26b9 100644 (file)
@@ -40,7 +40,7 @@ class KqueueDriver : public EventDriver {
 
   int init(int nevent);
   int add_event(int fd, int cur_mask, int add_mask);
-  void del_event(int fd, int cur_mask, int del_mask);
+  int del_event(int fd, int cur_mask, int del_mask);
   int resize_events(int newsize);
   int event_wait(vector<FiredFileEvent> &fired_events, struct timeval *tp);
 };
index 34bb3a87163a6f3807e90b7265a63165fc2a7bf6..7ee22e8d0ee15185859abec762d2b855cb2cc402 100644 (file)
@@ -48,7 +48,7 @@ int SelectDriver::add_event(int fd, int cur_mask, int add_mask)
   return 0;
 }
 
-void SelectDriver::del_event(int fd, int cur_mask, int delmask)
+int SelectDriver::del_event(int fd, int cur_mask, int delmask)
 {
   ldout(cct, 10) << __func__ << " del event fd=" << fd << " cur mask=" << cur_mask
                  << dendl;
@@ -57,6 +57,7 @@ void SelectDriver::del_event(int fd, int cur_mask, int delmask)
     FD_CLR(fd, &rfds);
   if (delmask & EVENT_WRITABLE)
     FD_CLR(fd, &wfds);
+  return 0;
 }
 
 int SelectDriver::resize_events(int newsize)
index 39160b26f68da264806efc4226ac99daffba313d..154644785c91bfdcc03670a56db1490cb9995b7d 100644 (file)
@@ -36,7 +36,7 @@ class SelectDriver : public EventDriver {
 
   int init(int nevent);
   int add_event(int fd, int cur_mask, int add_mask);
-  void del_event(int fd, int cur_mask, int del_mask);
+  int del_event(int fd, int cur_mask, int del_mask);
   int resize_events(int newsize);
   int event_wait(vector<FiredFileEvent> &fired_events, struct timeval *tp);
 };