if (ngx_delete_file(c->file.name.data) == NGX_FILE_ERROR) {
/* entry in error log is enough, don't notice client */
ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,
ngx_delete_file_n " \"%s\" failed", c->file.name.data);
}
以上代码片出自https://github.com/FRiCKLE/ngx_cache_purge/blob/master/ngx_cache_purge_module.c(1492-1496), 我们知道ngx_cache_purge是用于清除缓存的插件, 内部其实就是删除文件的操作, 现在的疑问是, 为何这里只有一次的delete操作, 若是刚好该文件还在被引用呢,那不会存在删除失败的问题咩? 为何不像cahce-manager里面那样尝试个20次?如下图代码(ngx_http_file_cahce.c)。
wait = 10;
tries = 20;
ngx_shmtx_lock(&cache->shpool->mutex);
for (q = ngx_queue_last(&cache->sh->queue);
q != ngx_queue_sentinel(&cache->sh->queue);
q = ngx_queue_prev(q))
{
fcn = ngx_queue_data(q, ngx_http_file_cache_node_t, queue);
ngx_log_debug6(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
"http file cache forced expire: #%d %d %02xd%02xd%02xd%02xd",
fcn->count, fcn->exists,
fcn->key[0], fcn->key[1], fcn->key[2], fcn->key[3]);
if (fcn->count == 0) {
ngx_http_file_cache_delete(cache, q, name);
wait = 0;
} else {
if (--tries) {
continue;
}
wait = 1;
}
break;
}
还望各位高手解答疑惑,不甚感激!