From: Haomai Wang Date: Wed, 27 May 2015 08:30:57 +0000 (+0800) Subject: Event: assert failure when failed to add/del event X-Git-Tag: v9.0.2~23^2~9 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=aa7674bd5b9045a4412d156b8ce9ee038a627f92;p=ceph.git Event: assert failure when failed to add/del event Signed-off-by: Haomai Wang --- diff --git a/src/msg/async/Event.cc b/src/msg/async/Event.cc index 131d86924ed2..ec3db8774022 100644 --- a/src/msg/async/Event.cc +++ b/src/msg/async/Event.cc @@ -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(); diff --git a/src/msg/async/Event.h b/src/msg/async/Event.h index a526188b3bc7..dc85238dcb23 100644 --- a/src/msg/async/Event.h +++ b/src/msg/async/Event.h @@ -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 &fired_events, struct timeval *tp) = 0; virtual int resize_events(int newsize) = 0; }; diff --git a/src/msg/async/EventEpoll.cc b/src/msg/async/EventEpoll.cc index c33dd3d51f88..fe6e54dc235c 100644 --- a/src/msg/async/EventEpoll.cc +++ b/src/msg/async/EventEpoll.cc @@ -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) diff --git a/src/msg/async/EventEpoll.h b/src/msg/async/EventEpoll.h index 6ad32e420669..07255d45288a 100644 --- a/src/msg/async/EventEpoll.h +++ b/src/msg/async/EventEpoll.h @@ -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 &fired_events, struct timeval *tp); }; diff --git a/src/msg/async/EventKqueue.cc b/src/msg/async/EventKqueue.cc index d0056f1e51c0..c357a923634b 100644 --- a/src/msg/async/EventKqueue.cc +++ b/src/msg/async/EventKqueue.cc @@ -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) diff --git a/src/msg/async/EventKqueue.h b/src/msg/async/EventKqueue.h index 04169adea559..52d9c7290f20 100644 --- a/src/msg/async/EventKqueue.h +++ b/src/msg/async/EventKqueue.h @@ -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 &fired_events, struct timeval *tp); }; diff --git a/src/msg/async/EventSelect.cc b/src/msg/async/EventSelect.cc index 34bb3a87163a..7ee22e8d0ee1 100644 --- a/src/msg/async/EventSelect.cc +++ b/src/msg/async/EventSelect.cc @@ -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) diff --git a/src/msg/async/EventSelect.h b/src/msg/async/EventSelect.h index 39160b26f68d..154644785c91 100644 --- a/src/msg/async/EventSelect.h +++ b/src/msg/async/EventSelect.h @@ -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 &fired_events, struct timeval *tp); };