hiredis icon indicating copy to clipboard operation
hiredis copied to clipboard

Incompatible EPOLLET mode

Open hixiaosan opened this issue 6 years ago • 1 comments

/*  If epoll is in EPOLLET mode, all contents of the Socket cache should be read at one time.   */
int redisBufferRead(redisContext *c) {
    char buf[1024*16];
    int nread;
    if (c->err)
        return REDIS_ERR;

    nread = read(c->fd,buf,sizeof(buf));
    if (nread == -1) {   
       
        if ((errno == EAGAIN && !(c->flags & REDIS_BLOCK)) || (errno == EINTR)) {
            /* Try again later */
        } else {
            __redisSetError(c,REDIS_ERR_IO,NULL);
            return REDIS_ERR;
        }
    } else if (nread == 0) {
        __redisSetError(c,REDIS_ERR_EOF,"Server closed the connection");
        return REDIS_ERR;
    } else {
        if (redisReaderFeed(c->reader,buf,nread) != REDIS_OK) {
            __redisSetError(c,c->reader->err,c->reader->errstr);
            return REDIS_ERR;
        }
    }
    return REDIS_OK;
}

 /* fixed */
int redisBufferRead(redisContext *c) {
    char buf[1024*16];
    int nread;

   
    if (c->err)
        return REDIS_ERR;

    while (1) {
        nread = read(c->fd,buf,sizeof(buf));

        if (nread == -1) {
            if (errno == EAGAIN && !(c->flags & REDIS_BLOCK)) {
                break;
            } else if (errno == EINTR) {
                continue;
            } else {
                return REDIS_ERR;
            }

        } else if (nread == 0) { 
            __redisSetError(c,REDIS_ERR_EOF,"Server closed the connection");
            return REDIS_ERR;
        } else {
            if (redisReaderFeed(c->reader,buf,nread) != REDIS_OK) {
                __redisSetError(c,c->reader->err,c->reader->errstr);
                return REDIS_ERR;
            }
        }
    }

    return REDIS_OK;
}

hixiaosan avatar Sep 30 '18 04:09 hixiaosan

Thank you, let me see if my connfix branch addresses this.. I recall seeing something like this before. However, we would need to be aware of whether we are in ET mode or not. Otherwise we risk starving other I/O (and CPU time) if there is a lot of data on the socket.

mnunberg avatar Oct 02 '18 01:10 mnunberg