
/*
 * Copyright (C) Igor Sysoev
 */


#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_event.h>


/*
 * open file cache caches
 *    open file handles with stat() info;
 *    directories stat() info;
 *    files and directories errors: not found, access denied, etc.
 */


static void ngx_open_file_cache_cleanup(void *data);
static void ngx_open_file_cleanup(void *data);
static void ngx_close_cached_file(ngx_open_file_cache_t *cache,
    ngx_cached_open_file_t *file, ngx_log_t *log);
static ngx_int_t ngx_open_and_stat_file(u_char *name, ngx_open_file_info_t *of,
    ngx_log_t *log);
static void ngx_expire_old_cached_files(ngx_open_file_cache_t *cache,
    ngx_uint_t n, ngx_log_t *log);
static void ngx_open_file_cache_rbtree_insert_value(ngx_rbtree_node_t *temp,
    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
static void ngx_open_file_cache_remove(ngx_event_t *ev);


ngx_open_file_cache_t *
ngx_open_file_cache_init(ngx_pool_t *pool, ngx_uint_t max, time_t inactive)
{
    ngx_rbtree_node_t      *sentinel;
    ngx_pool_cleanup_t     *cln;
    ngx_open_file_cache_t  *cache;

    cache = ngx_palloc(pool, sizeof(ngx_open_file_cache_t));
    if (cache == NULL) {
        return NULL;
    }

    cache->list_head.prev = NULL;
    cache->list_head.next = &cache->list_tail;

    cache->list_tail.prev = &cache->list_head;
    cache->list_tail.next = NULL;

    sentinel = ngx_palloc(pool, sizeof(ngx_rbtree_node_t));
    if (sentinel == NULL) {
        return NULL;
    }

    ngx_rbtree_sentinel_init(sentinel);

    cache->rbtree.root = sentinel;
    cache->rbtree.sentinel = sentinel;
    cache->rbtree.insert = ngx_open_file_cache_rbtree_insert_value;

    cache->current = 0;
    cache->max = max;
    cache->inactive = inactive;

    cln = ngx_pool_cleanup_add(pool, 0);
    if (cln == NULL) {
        return NULL;
    }

    cln->handler = ngx_open_file_cache_cleanup;
    cln->data = cache;

    return cache;
}


static void
ngx_open_file_cache_cleanup(void *data)
{
    ngx_open_file_cache_t  *cache = data;

    ngx_cached_open_file_t  *file;

    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,
                   "open file cache cleanup");

    for ( ;; ) {

        file = cache->list_tail.prev;

        if (file == &cache->list_head) {
            break;
        }

        file->next->prev = file->prev;
        file->prev->next = file->next;

        ngx_rbtree_delete(&cache->rbtree, &file->node);

        cache->current--;

        ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,
                       "delete cached open file: %s", file->name);

        if (!file->err && !file->is_dir) {
            file->close = 1;
            file->count = 0;
            ngx_close_cached_file(cache, file, ngx_cycle->log);

        } else {
            ngx_free(file->name);
            ngx_free(file);
        }
    }

    if (cache->current) {
        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,
                      "%d items still leave in open file cache",
                      cache->current);
    }

    if (cache->rbtree.root != cache->rbtree.sentinel) {
        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,
                      "rbtree still is not empty in open file cache");

    }
}


ngx_int_t
ngx_open_cached_file(ngx_open_file_cache_t *cache, ngx_str_t *name,
    ngx_open_file_info_t *of, ngx_pool_t *pool)
{
    time_t                          now;
    uint32_t                        hash;
    ngx_int_t                       rc;
    ngx_rbtree_node_t              *node, *sentinel;
    ngx_pool_cleanup_t             *cln;
    ngx_cached_open_file_t         *file;
    ngx_pool_cleanup_file_t        *clnf;
    ngx_open_file_cache_event_t    *fev;
    ngx_open_file_cache_cleanup_t  *ofcln;

    of->err = 0;

    if (cache == NULL) {

        cln = ngx_pool_cleanup_add(pool, sizeof(ngx_pool_cleanup_file_t));
        if (cln == NULL) {
            return NGX_ERROR;
        }

        rc = ngx_open_and_stat_file(name->data, of, pool->log);

        if (rc == NGX_OK && !of->is_dir) {
            cln->handler = ngx_pool_cleanup_file;
            clnf = cln->data;

            clnf->fd = of->fd;
            clnf->name = name->data;
            clnf->log = pool->log;
        }

        return rc;
    }

    cln = ngx_pool_cleanup_add(pool, sizeof(ngx_open_file_cache_cleanup_t));
    if (cln == NULL) {
        return NGX_ERROR;
    }

    hash = ngx_crc32_long(name->data, name->len);

    node = cache->rbtree.root;
    sentinel = cache->rbtree.sentinel;

    now = ngx_time();

    while (node != sentinel) {

        if (hash < node->key) {
            node = node->left;
            continue;
        }

        if (hash > node->key) {
            node = node->right;
            continue;
        }

        /* hash == node->key */

        do {
            file = (ngx_cached_open_file_t *) node;

            rc = ngx_strcmp(name->data, file->name);

            if (rc == 0) {

                file->next->prev = file->prev;
                file->prev->next = file->next;

                if (file->event || now - file->created < of->retest) {
                    if (file->err == 0) {
                        of->fd = file->fd;
                        of->uniq = file->uniq;
                        of->mtime = file->mtime;
                        of->size = file->size;

                        of->is_dir = file->is_dir;
                        of->is_file = file->is_file;
                        of->is_link = file->is_link;
                        of->is_exec = file->is_exec;

                        if (!file->is_dir) {
                            file->count++;
                        }

                    } else {
                        of->err = file->err;
                    }

                    goto found;
                }

                ngx_log_debug4(NGX_LOG_DEBUG_CORE, pool->log, 0,
                               "retest open file: %s, fd:%d, c:%d, e:%d",
                               file->name, file->fd, file->count, file->err);

                if (file->is_dir) {

                    /*
                     * chances that directory became file are very small
                     * so test_dir flag allows to use a single ngx_file_info()
                     * syscall instead of three syscalls
                     */

                    of->test_dir = 1;
                }

                rc = ngx_open_and_stat_file(name->data, of, pool->log);

                if (rc != NGX_OK && (of->err == 0 || !of->errors)) {
                    goto failed;
                }

                if (of->is_dir) {
                    if (file->is_dir || file->err) {
                        goto update;
                    }

                    /* file became directory */

                } else if (of->err == 0) {  /* file */

                    if (file->is_dir || file->err) {
                        goto update;
                    }

                    if (of->uniq == file->uniq
                        && of->mtime == file->mtime
                        && of->size == file->size)
                    {
                        if (ngx_close_file(of->fd) == NGX_FILE_ERROR) {
                            ngx_log_error(NGX_LOG_ALERT, pool->log, ngx_errno,
                                          ngx_close_file_n " \"%s\" failed",
                                          name->data);
                        }

                        of->fd = file->fd;
                        file->count++;

                        goto renew;
                    }

                    /* file was changed */

                } else { /* error to cache */

                    if (file->err || file->is_dir) {
                        goto update;
                    }

                    /* file was removed, etc. */
                }

                if (file->count == 0) {
                    if (ngx_close_file(file->fd) == NGX_FILE_ERROR) {
                        ngx_log_error(NGX_LOG_ALERT, pool->log, ngx_errno,
                                      ngx_close_file_n " \"%s\" failed",
                                      name->data);
                    }

                    goto update;
                }

                ngx_rbtree_delete(&cache->rbtree, &file->node);

                cache->current--;

                file->close = 1;

                goto create;
            }

            node = (rc < 0) ? node->left : node->right;

        } while (node != sentinel && hash == node->key);

        break;
    }

    /* not found */

    file = NULL;

    rc = ngx_open_and_stat_file(name->data, of, pool->log);

    if (rc != NGX_OK && (of->err == 0 || !of->errors)) {
        goto failed;
    }

create:

    if (cache->current >= cache->max) {
        ngx_expire_old_cached_files(cache, 0, pool->log);
    }

    file = ngx_alloc(sizeof(ngx_cached_open_file_t), pool->log);

    if (file == NULL) {
        goto failed;
    }

    file->name = ngx_alloc(name->len + 1, pool->log);

    if (file->name == NULL) {
        ngx_free(file);
        file = NULL;
        goto failed;
    }

    ngx_cpystrn(file->name, name->data, name->len + 1);

    file->node.key = hash;

    ngx_rbtree_insert(&cache->rbtree, &file->node);

    cache->current++;

    file->count = 0;

update:

    if (of->events
        && (ngx_event_flags & NGX_USE_VNODE_EVENT)
        && of->fd != NGX_INVALID_FILE)
    {
        file->event = ngx_calloc(sizeof(ngx_event_t), pool->log);
        if (file->event== NULL) {
            goto failed;
        }

        fev = ngx_alloc(sizeof(ngx_open_file_cache_event_t), pool->log);
        if (fev == NULL) {
            goto failed;
        }

        fev->fd = of->fd;
        fev->file = file;
        fev->cache = cache;

        file->event->handler = ngx_open_file_cache_remove;
        file->event->data = fev;

        /*
         * although vnode event may be called while ngx_cycle->poll
         * destruction; however, cleanup procedures are run before any
         * memory freeing and events will be canceled.
         */

        file->event->log = ngx_cycle->log;

        if (ngx_add_event(file->event, NGX_VNODE_EVENT, NGX_ONESHOT_EVENT)
            != NGX_OK)
        {
            ngx_free(file->event->data);
            ngx_free(file->event);
            goto failed;
        }

    } else {
        file->event = NULL;
    }

    file->fd = of->fd;
    file->err = of->err;

    if (of->err == 0) {
        file->uniq = of->uniq;
        file->mtime = of->mtime;
        file->size = of->size;

        file->close = 0;

        file->is_dir = of->is_dir;
        file->is_file = of->is_file;
        file->is_link = of->is_link;
        file->is_exec = of->is_exec;

        if (!of->is_dir) {
            file->count++;
        }
    }

renew:

    file->created = now;

found:

    file->accessed = now;

    /* add to the inactive list head */

    file->next = cache->list_head.next;
    file->next->prev = file;
    file->prev = &cache->list_head;
    cache->list_head.next = file;

    ngx_log_debug4(NGX_LOG_DEBUG_CORE, pool->log, 0,
                   "cached open file: %s, fd:%d, c:%d, e:%d",
                   file->name, file->fd, file->count, file->err);

    if (of->err == 0) {

        if (!of->is_dir) {
            cln->handler = ngx_open_file_cleanup;
            ofcln = cln->data;

            ofcln->cache = cache;
            ofcln->file = file;
            ofcln->log = pool->log;
        }

        return NGX_OK;
    }

    return NGX_ERROR;

failed:

    if (file && file->count == 0) {
        ngx_rbtree_delete(&cache->rbtree, &file->node);

        cache->current--;

        if (ngx_close_file(file->fd) == NGX_FILE_ERROR) {
            ngx_log_error(NGX_LOG_ALERT, pool->log, ngx_errno,
                          ngx_close_file_n " \"%s\" failed", file->name);
        }

        ngx_free(file->name);
        ngx_free(file);
    }

    if (of->fd != NGX_INVALID_FILE) {
        if (ngx_close_file(of->fd) == NGX_FILE_ERROR) {
            ngx_log_error(NGX_LOG_ALERT, pool->log, ngx_errno,
                          ngx_close_file_n " \"%s\" failed", name->data);
        }
    }

    return NGX_ERROR;
}


static ngx_int_t
ngx_open_and_stat_file(u_char *name, ngx_open_file_info_t *of, ngx_log_t *log)
{
    ngx_fd_t         fd;
    ngx_file_info_t  fi;

    of->fd = NGX_INVALID_FILE;

    if (of->test_dir) {

        if (ngx_file_info(name, &fi) == -1) {
            of->err = ngx_errno;

            return NGX_ERROR;
        }

        of->uniq = ngx_file_uniq(&fi);
        of->mtime = ngx_file_mtime(&fi);
        of->size = ngx_file_size(&fi);
        of->is_dir = ngx_is_dir(&fi);
        of->is_file = ngx_is_file(&fi);
        of->is_link = ngx_is_link(&fi);
        of->is_exec = ngx_is_exec(&fi);

        if (of->is_dir) {
            return NGX_OK;
        }
    }

    fd = ngx_open_file(name, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0);

    if (fd == NGX_INVALID_FILE) {
        of->err = ngx_errno;
        return NGX_ERROR;
    }

    if (ngx_fd_info(fd, &fi) == NGX_FILE_ERROR) {
        ngx_log_error(NGX_LOG_CRIT, log, ngx_errno,
                      ngx_fd_info_n " \"%s\" failed", name);

        if (ngx_close_file(fd) == NGX_FILE_ERROR) {
            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
                          ngx_close_file_n " \"%s\" failed", name);
        }

        return NGX_ERROR;
    }

    if (ngx_is_dir(&fi)) {
        if (ngx_close_file(fd) == NGX_FILE_ERROR) {
            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
                          ngx_close_file_n " \"%s\" failed", name);
        }

        fd = NGX_INVALID_FILE;
    }

    of->fd = fd;
    of->uniq = ngx_file_uniq(&fi);
    of->mtime = ngx_file_mtime(&fi);
    of->size = ngx_file_size(&fi);
    of->is_dir = ngx_is_dir(&fi);
    of->is_file = ngx_is_file(&fi);
    of->is_link = ngx_is_link(&fi);
    of->is_exec = ngx_is_exec(&fi);

    return NGX_OK;
}


static void
ngx_open_file_cleanup(void *data)
{
    ngx_open_file_cache_cleanup_t  *c = data;

    c->file->count--;

    ngx_close_cached_file(c->cache, c->file, c->log);

    /* drop one or two expired open files */
    ngx_expire_old_cached_files(c->cache, 1, c->log);
}


static void
ngx_close_cached_file(ngx_open_file_cache_t *cache,
    ngx_cached_open_file_t *file, ngx_log_t *log)
{
    ngx_log_debug4(NGX_LOG_DEBUG_CORE, log, 0,
                   "close cached open file: %s, fd:%d, c:%d, %d",
                   file->name, file->fd, file->count, file->close);

    if (!file->close) {

        file->accessed = ngx_time();

        if (cache->list_head.next != file) {

            /* delete from inactive list */

            file->next->prev = file->prev;
            file->prev->next = file->next;

            /* add to the inactive list head */

            file->next = cache->list_head.next;
            file->next->prev = file;
            file->prev = &cache->list_head;
            cache->list_head.next = file;
        }

        return;
    }

    if (file->event) {
        (void) ngx_del_event(file->event, NGX_VNODE_EVENT,
                             file->count ? NGX_FLUSH_EVENT : NGX_CLOSE_EVENT);

        ngx_free(file->event->data);
        ngx_free(file->event);
        file->event = NULL;
    }

    if (file->count) {
        return;
    }

    if (ngx_close_file(file->fd) == NGX_FILE_ERROR) {
        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
                      ngx_close_file_n " \"%s\" failed", file->name);
    }

    ngx_free(file->name);
    ngx_free(file);
}


static void
ngx_expire_old_cached_files(ngx_open_file_cache_t *cache, ngx_uint_t n,
    ngx_log_t *log)
{
    time_t                   now;
    ngx_cached_open_file_t  *file;

    now = ngx_time();

    /*
     * n == 1 deletes one or two inactive files
     * n == 0 deletes least recently used file by force
     *        and one or two inactive files
     */

    while (n < 3) {

        file = cache->list_tail.prev;

        if (file == &cache->list_head) {
            return;
        }

        if (n++ != 0 && now - file->accessed <= cache->inactive) {
            return;
        }

        file->next->prev = file->prev;
        file->prev->next = file->next;

        ngx_rbtree_delete(&cache->rbtree, &file->node);

        cache->current--;

        ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,
                       "expire cached open file: %s", file->name);

        if (!file->err && !file->is_dir) {
            file->close = 1;
            ngx_close_cached_file(cache, file, log);

        } else {
            ngx_free(file->name);
            ngx_free(file);
        }
    }
}


static void
ngx_open_file_cache_rbtree_insert_value(ngx_rbtree_node_t *temp,
    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
{
    ngx_rbtree_node_t       **p;
    ngx_cached_open_file_t    *file, *file_temp;

    for ( ;; ) {

        if (node->key < temp->key) {

            p = &temp->left;

        } else if (node->key > temp->key) {

            p = &temp->right;

        } else { /* node->key == temp->key */

            file = (ngx_cached_open_file_t *) node;
            file_temp = (ngx_cached_open_file_t *) temp;

            p = (ngx_strcmp(file->name, file_temp->name) < 0)
                    ? &temp->left : &temp->right;
        }

        if (*p == sentinel) {
            break;
        }

        temp = *p;
    }

    *p = node;
    node->parent = temp;
    node->left = sentinel;
    node->right = sentinel;
    ngx_rbt_red(node);
}


static void
ngx_open_file_cache_remove(ngx_event_t *ev)
{
    ngx_cached_open_file_t       *file;
    ngx_open_file_cache_event_t  *fev;

    fev = ev->data;
    file = fev->file;

    file->next->prev = file->prev;
    file->prev->next = file->next;

    ngx_rbtree_delete(&fev->cache->rbtree, &file->node);

    fev->cache->current--;

    /* NGX_ONESHOT_EVENT was already deleted */
    file->event = NULL;

    file->close = 1;

    ngx_close_cached_file(fev->cache, file, ev->log);

    /* free memory only when fev->cache and fev->file are already not needed */

    ngx_free(ev->data);
    ngx_free(ev);
}
