Welcome! Log In Create A New Profile

Advanced

[PATCH 04 of 15] Cache: tf_node for tracking opened tempfile

Jiří Setnička via nginx-devel
January 28, 2022 11:44AM
# HG changeset patch
# User Jiří Setnička <jiri.setnicka@cdn77.com>
# Date 1643385660 -3600
# Fri Jan 28 17:01:00 2022 +0100
# Node ID 2488cf77a1cc6c7f48696816f085c71e49355b72
# Parent 535e503156cf141bf9471895468423e82f68c8bb
Cache: tf_node for tracking opened tempfile
Lookup and cleanup.

diff --git a/src/http/ngx_http_cache.h b/src/http/ngx_http_cache.h
--- a/src/http/ngx_http_cache.h
+++ b/src/http/ngx_http_cache.h
@@ -61,6 +61,14 @@ typedef struct {
ngx_msec_t lock_time;
} ngx_http_file_cache_node_t;

+typedef struct {
+ ngx_rbtree_node_t node;
+ off_t length;
+ unsigned count:20;
+ unsigned updated:1;
+ unsigned done:1;
+} ngx_http_file_cache_tf_node_t;
+

struct ngx_http_cache_s {
ngx_file_t file;
@@ -91,6 +99,8 @@ struct ngx_http_cache_s {
ngx_uint_t valid_msec;
ngx_uint_t vary_tag;

+ ngx_http_file_cache_tf_node_t *tf_node;
+
ngx_buf_t *buf;

ngx_http_file_cache_t *file_cache;
diff --git a/src/http/ngx_http_file_cache.c b/src/http/ngx_http_file_cache.c
--- a/src/http/ngx_http_file_cache.c
+++ b/src/http/ngx_http_file_cache.c
@@ -34,6 +34,10 @@ static ngx_int_t ngx_http_file_cache_nam
ngx_path_t *path);
static ngx_http_file_cache_node_t *
ngx_http_file_cache_lookup(ngx_http_file_cache_t *cache, u_char *key);
+static ngx_http_file_cache_tf_node_t * ngx_http_file_cache_tf_lookup(
+ ngx_http_file_cache_t *cache, uint32_t tf_number);
+static void ngx_http_file_cache_tf_delete(ngx_http_cache_t *c,
+ ngx_http_file_cache_t *cache);
static void ngx_http_file_cache_rbtree_insert_value(ngx_rbtree_node_t *temp,
ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
static void ngx_http_file_cache_vary(ngx_http_request_t *r, u_char *vary,
@@ -1066,6 +1070,53 @@ ngx_http_file_cache_lookup(ngx_http_file
}


+static ngx_http_file_cache_tf_node_t *
+ngx_http_file_cache_tf_lookup(ngx_http_file_cache_t *cache, uint32_t tf_number)
+{
+ ngx_rbtree_key_t node_key;
+ ngx_rbtree_node_t *node, *sentinel;
+
+ node_key = tf_number;
+
+ node = cache->tf_sh->rbtree.root;
+ sentinel = cache->tf_sh->rbtree.sentinel;
+
+ while (node != sentinel) {
+
+ if (node_key < node->key) {
+ node = node->left;
+ continue;
+ }
+
+ if (node_key > node->key) {
+ node = node->right;
+ continue;
+ }
+
+ return (ngx_http_file_cache_tf_node_t *) node;
+ }
+
+ /* not found */
+
+ return NULL;
+}
+
+
+static void
+ngx_http_file_cache_tf_delete(ngx_http_cache_t *c, ngx_http_file_cache_t *cache)
+{
+ c->tf_node->count--;
+
+ if (c->tf_node->count == 0) {
+ ngx_rbtree_delete(&cache->tf_sh->rbtree, &c->tf_node->node);
+ ngx_slab_free_locked(cache->tf_shpool, c->tf_node);
+ cache->tf_sh->count--;
+ }
+
+ c->tf_node = NULL;
+}
+
+
static void
ngx_http_file_cache_rbtree_insert_value(ngx_rbtree_node_t *temp,
ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
@@ -1283,6 +1334,10 @@ ngx_http_file_cache_reopen(ngx_http_requ
c->node->count--;
c->node = NULL;

+ if (c->tf_node != NULL) {
+ ngx_http_file_cache_tf_delete(c, cache);
+ }
+
ngx_shmtx_unlock(&cache->shpool->mutex);

c->secondary = 1;
@@ -1391,6 +1446,11 @@ ngx_http_file_cache_update_variant(ngx_h
c->node->updating = 0;
c->node = NULL;

+ if (c->tf_node != NULL) {
+ c->tf_node->done = 1;
+ ngx_http_file_cache_tf_delete(c, cache);
+ }
+
ngx_shmtx_unlock(&cache->shpool->mutex);

c->file.name.len = 0;
@@ -1479,6 +1539,13 @@ ngx_http_file_cache_update(ngx_http_requ
c->node->exists = 1;
}

+ if (c->tf_node != NULL) {
+ c->tf_node->updated = 1;
+ c->tf_node->done = 1;
+
+ ngx_http_file_cache_tf_delete(c, cache);
+ }
+
c->node->updating = 0;

ngx_shmtx_unlock(&cache->shpool->mutex);
@@ -1694,6 +1761,13 @@ ngx_http_file_cache_free(ngx_http_cache_
fcn->updating = 0;
}

+ if (c->tf_node != NULL) {
+ if (c->updating) {
+ c->tf_node->done = 1;
+ }
+ ngx_http_file_cache_tf_delete(c, cache);
+ }
+
if (c->error) {
fcn->error = c->error;

_______________________________________________
nginx-devel mailing list -- nginx-devel@nginx.org
To unsubscribe send an email to nginx-devel-leave@nginx.org
Subject Author Views Posted

[PATCH 00 of 15] Serve all requests from single tempfile

Jiří Setnička via nginx-devel 463 January 28, 2022 11:36AM

[PATCH 01 of 15] ngx core - obtain number appended to the temp file name

Jiří Setnička via nginx-devel 132 January 28, 2022 11:38AM

[PATCH 02 of 15] ngx core - ensure that tempfile number never be 0

Jiří Setnička via nginx-devel 139 January 28, 2022 11:40AM

[PATCH 03 of 15] Cache: Shared memory for tempfile nodes

Jiří Setnička via nginx-devel 278 January 28, 2022 11:42AM

[PATCH 04 of 15] Cache: tf_node for tracking opened tempfile

Jiří Setnička via nginx-devel 129 January 28, 2022 11:44AM

[PATCH 05 of 15] http upstream & file_cache: store temp file number and length in tf_node

Jiří Setnička via nginx-devel 139 January 28, 2022 11:46AM

[PATCH 07 of 15] Tempfiles: Wait handlers

Jiří Setnička via nginx-devel 122 January 28, 2022 11:48AM

[PATCH 06 of 15] Configuration for tempfiles serving

Jiří Setnička via nginx-devel 159 January 28, 2022 11:50AM

[PATCH 09 of 15] Tempfiles: Sending data from tempfile

Jiří Setnička via nginx-devel 127 January 28, 2022 11:52AM

[PATCH 08 of 15] Tempfiles: Mechanism of opening tempfiles used for serving paralell requests

Jiří Setnička via nginx-devel 130 January 28, 2022 11:54AM

[PATCH 10 of 15] Tempfiles: Setup event handlers in ngx_http_upstream.c

Jiří Setnička via nginx-devel 143 January 28, 2022 11:56AM

[PATCH 11 of 15] Tempfiles: reset c->body_start when updating a tempfile

Jiří Setnička via nginx-devel 149 January 28, 2022 11:58AM

[PATCH 12 of 15] Tempfiles: Expired tempfiles

Jiří Setnička via nginx-devel 152 January 28, 2022 12:00PM

[PATCH 13 of 15] Tempfiles: Skip cached file if there is already newer tempfile

Jiří Setnička via nginx-devel 246 January 28, 2022 12:02PM

Re: [PATCH 13 of 15] Tempfiles: Skip cached file if there is already newer tempfile

Vadim Fedorenko 150 January 30, 2022 07:38PM

Re: [PATCH 13 of 15] Tempfiles: Skip cached file if there is already newer tempfile

Jiří Setnička via nginx-devel 142 February 07, 2022 06:22AM

[PATCH 14 of 15] Tempfiles: Set send_timeout inside ngx_http_cache_send

Jiří Setnička via nginx-devel 157 January 28, 2022 12:04PM

[PATCH 15 of 15] Use cache status UPDATING when serving from tempfile

Jiří Setnička via nginx-devel 130 January 28, 2022 12:06PM

Re: [PATCH 00 of 15] Serve all requests from single tempfile

Jiří Setnička via nginx-devel 126 February 07, 2022 06:18AM

Re: [PATCH 00 of 15] Serve all requests from single tempfile

Roman Arutyunyan 142 February 07, 2022 06:32AM

Re: [PATCH 00 of 15] Serve all requests from single tempfile

Jiří Setnička via nginx-devel 164 February 07, 2022 07:30AM

Re: [PATCH 00 of 15] Serve all requests from single tempfile

Roman Arutyunyan 179 February 08, 2022 06:20AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 142
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready