Skip to content

Commit

Permalink
Core: show file contents only once while dumping configuration.
Browse files Browse the repository at this point in the history
Files are considered the same if the path used by nginx during parsing matches.
  • Loading branch information
vlhomutov committed Oct 18, 2016
1 parent 8417379 commit 33f9405
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 24 deletions.
83 changes: 59 additions & 24 deletions src/core/ngx_conf_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

#define NGX_CONF_BUFFER 4096

static ngx_int_t ngx_conf_add_dump(ngx_conf_t *cf, ngx_str_t *filename);
static ngx_int_t ngx_conf_handler(ngx_conf_t *cf, ngx_int_t last);
static ngx_int_t ngx_conf_read_token(ngx_conf_t *cf);
static void ngx_conf_flush_files(ngx_cycle_t *cycle);
Expand Down Expand Up @@ -97,17 +98,70 @@ ngx_conf_param(ngx_conf_t *cf)
}


static ngx_int_t
ngx_conf_add_dump(ngx_conf_t *cf, ngx_str_t *filename)
{
off_t size;
u_char *p;
uint32_t hash;
ngx_buf_t *buf;
ngx_str_node_t *sn;
ngx_conf_dump_t *cd;

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

sn = ngx_str_rbtree_lookup(&cf->cycle->config_dump_rbtree, filename, hash);

if (sn) {
cf->conf_file->dump = NULL;
return NGX_OK;
}

p = ngx_pstrdup(cf->cycle->pool, filename);
if (p == NULL) {
return NGX_ERROR;
}

cd = ngx_array_push(&cf->cycle->config_dump);
if (cd == NULL) {
return NGX_ERROR;
}

size = ngx_file_size(&cf->conf_file->file.info);

buf = ngx_create_temp_buf(cf->cycle->pool, (size_t) size);
if (buf == NULL) {
return NGX_ERROR;
}

cd->name.data = p;
cd->name.len = filename->len;
cd->buffer = buf;

cf->conf_file->dump = buf;

sn = ngx_palloc(cf->temp_pool, sizeof(ngx_str_node_t));
if (sn == NULL) {
return NGX_ERROR;
}

sn->node.key = hash;
sn->str = cd->name;

ngx_rbtree_insert(&cf->cycle->config_dump_rbtree, &sn->node);

return NGX_OK;
}


char *
ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename)
{
char *rv;
u_char *p;
off_t size;
ngx_fd_t fd;
ngx_int_t rc;
ngx_buf_t buf, *tbuf;
ngx_buf_t buf;
ngx_conf_file_t *prev, conf_file;
ngx_conf_dump_t *cd;
enum {
parse_file = 0,
parse_block,
Expand Down Expand Up @@ -167,29 +221,10 @@ ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename)
#endif
)
{
p = ngx_pstrdup(cf->cycle->pool, filename);
if (p == NULL) {
goto failed;
}

size = ngx_file_size(&cf->conf_file->file.info);

tbuf = ngx_create_temp_buf(cf->cycle->pool, (size_t) size);
if (tbuf == NULL) {
if (ngx_conf_add_dump(cf, filename) != NGX_OK) {
goto failed;
}

cd = ngx_array_push(&cf->cycle->config_dump);
if (cd == NULL) {
goto failed;
}

cd->name.len = filename->len;
cd->name.data = p;
cd->buffer = tbuf;

cf->conf_file->dump = tbuf;

} else {
cf->conf_file->dump = NULL;
}
Expand Down
3 changes: 3 additions & 0 deletions src/core/ngx_cycle.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,9 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
return NULL;
}

ngx_rbtree_init(&cycle->config_dump_rbtree, &cycle->config_dump_sentinel,
ngx_str_rbtree_insert_value);

if (old_cycle->open_files.part.nelts) {
n = old_cycle->open_files.part.nelts;
for (part = old_cycle->open_files.part.next; part; part = part->next) {
Expand Down
4 changes: 4 additions & 0 deletions src/core/ngx_cycle.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,11 @@ struct ngx_cycle_s {

ngx_array_t listening;
ngx_array_t paths;

ngx_array_t config_dump;
ngx_rbtree_t config_dump_rbtree;
ngx_rbtree_node_t config_dump_sentinel;

ngx_list_t open_files;
ngx_list_t shared_memory;

Expand Down

0 comments on commit 33f9405

Please sign in to comment.