Changeset 6e89d69 in code for icbd.c


Ignore:
Timestamp:
Mar 6, 2014, 11:34:15 AM (11 years ago)
Author:
Florian Obser <florian@…>
Branches:
master
Children:
709c3bc
Parents:
9a2a703
git-author:
Sebastian Benoit <benoit-lists@…> (03/05/14 23:12:47)
git-committer:
Florian Obser <florian@…> (03/06/14 11:34:15)
Message:

accept throttling on EM/ENFILE, add checks for other errnos

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icbd.c

    r9a2a703 r6e89d69  
    5656void getpeerinfo(struct icb_session *);
    5757void icbd_accept(int, short, void *);
     58void icbd_paused(int, short, void *);
    5859void icbd_drop(struct icb_session *, char *);
    5960void icbd_ioerr(struct bufferevent *, short, void *);
     
    7172RB_GENERATE(icbd_sessions, icb_session, node, icbd_session_cmp);
    7273
     74struct icbd_listener {
     75        struct event ev, pause;
     76};
     77
    7378int
    7479main(int argc, char *argv[])
     
    146151        for (ch = 0; ch < argc; ch++) {
    147152                struct addrinfo hints, *res, *res0;
    148                 struct event *ev;
     153                struct icbd_listener *l;
    149154                char *addr, *port;
    150155                int error, s, on = 1;
     
    196201                        (void)listen(s, TCP_BACKLOG);
    197202
    198                         if ((ev = calloc(1, sizeof *ev)) == NULL)
     203                        if ((l = calloc(1, sizeof *l)) == NULL)
    199204                                err(EX_UNAVAILABLE, NULL);
    200                         event_set(ev, s, EV_READ | EV_PERSIST, icbd_accept, ev);
    201                         if (event_add(ev, NULL) < 0) {
     205                        event_set(&l->ev, s, EV_READ | EV_PERSIST, icbd_accept, l);
     206                        if (event_add(&l->ev, NULL) < 0) {
    202207                                syslog(LOG_ERR, "event_add: %m");
    203208                                return (EX_UNAVAILABLE);
    204209                        }
     210                        evtimer_set(&l->pause, icbd_paused, l);
    205211
    206212                        nsocks++;
     
    255261void
    256262icbd_accept(int fd, short event __attribute__((__unused__)),
    257     void *arg __attribute__((__unused__)))
    258 {
     263    void *arg)
     264{
     265        struct icbd_listener *l = arg;
    259266        struct sockaddr_storage ss;
     267        struct timeval p = { 1, 0 };
    260268        struct icb_session *is;
    261269        socklen_t ss_len = sizeof ss;
     
    263271
    264272        ss.ss_len = ss_len;
    265         if ((s = accept(fd, (struct sockaddr *)&ss, &ss_len)) < 0) {
    266                 syslog(LOG_ERR, "accept: %m");
    267                 return;
    268         }
     273        s = accept(fd, (struct sockaddr *)&ss, &ss_len);
     274        if (s == -1) {
     275                switch (errno) {
     276                case EINTR:
     277                case EWOULDBLOCK:
     278                case ECONNABORTED:
     279                        return;
     280                case EMFILE:
     281                case ENFILE:
     282                        event_del(&l->ev);
     283                        evtimer_add(&l->pause, &p);
     284                        return;
     285                default:
     286                        syslog(LOG_ERR, "accept: %m");
     287                        return;
     288                }
     289        }
     290
    269291        if (ss.ss_family == AF_INET)
    270292                if (setsockopt(s, IPPROTO_IP, IP_TOS, &tos, sizeof tos) < 0)
     
    300322        /* start icb conversation */
    301323        icb_start(is);
     324}
     325
     326void
     327icbd_paused(int fd __attribute__((__unused__)),
     328        short events __attribute__((__unused__)), void *arg)
     329{
     330        struct icbd_listener *l = arg;
     331        event_add(&l->ev, NULL);
    302332}
    303333
Note: See TracChangeset for help on using the changeset viewer.