diff --git a/ngx_http_uploadprogress_module.c b/ngx_http_uploadprogress_module.c index 0dba197..bd44da9 100644 --- a/ngx_http_uploadprogress_module.c +++ b/ngx_http_uploadprogress_module.c @@ -34,6 +34,7 @@ struct ngx_http_uploadprogress_node_s { time_t timeout; struct ngx_http_uploadprogress_node_s *prev; struct ngx_http_uploadprogress_node_s *next; + ngx_log_t *log; u_char len; u_char data[1]; }; @@ -347,6 +348,40 @@ get_tracking_id(ngx_http_request_t * r) return NULL; } + +static void log_node(ngx_rbtree_node_t *node, ngx_log_t * log) +{ + ngx_http_uploadprogress_node_t *up; + up = (ngx_http_uploadprogress_node_t *) node; + + ngx_log_debug4(NGX_LOG_DEBUG_HTTP, log, 0, "upload-progress: find_node %s [%uO/%uO,%d,%d]",up->data, up->rest, up->length, up->err_status, up->timeout ); +} + +static void log_rbtree(ngx_http_uploadprogress_ctx_t * ctx, ngx_log_t * log) +{ + ngx_http_uploadprogress_node_t *up; + ngx_rbtree_node_t *node; + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, + "upload-progress: logging the whole rbtree"); + + node = (ngx_rbtree_node_t *) ctx->list_tail.prev; + for (;;) { + if (node == &ctx->list_head.node) { + break; + } + + up = (ngx_http_uploadprogress_node_t *) node; + + log_node(node, log); + + node = (ngx_rbtree_node_t *)up->prev; + } + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, + "upload-progress: end logging the whole rbtree"); +} + static ngx_http_uploadprogress_node_t * find_node(ngx_str_t * id, ngx_http_uploadprogress_ctx_t * ctx, ngx_log_t * log) { @@ -358,23 +393,30 @@ find_node(ngx_str_t * id, ngx_http_uploadprogress_ctx_t * ctx, ngx_log_t * log) ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, "upload-progress: find_node %V", id); hash = ngx_crc32_short(id->data, id->len); + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, "upload-progress: find_node hash %08XD", hash); node = ctx->rbtree->root; sentinel = ctx->rbtree->sentinel; while (node != sentinel) { + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, "upload-progress: find_node testing hash %08XD", node->key); + log_node(node, log); + if (hash < node->key) { + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "upload-progress: find_node going left"); node = node->left; continue; } if (hash > node->key) { + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "upload-progress: find_node going right"); node = node->right; continue; } /* hash == node->key */ + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "upload-progress: find_node hash matching"); do { up = (ngx_http_uploadprogress_node_t *) node; @@ -392,6 +434,7 @@ find_node(ngx_str_t * id, ngx_http_uploadprogress_ctx_t * ctx, ngx_log_t * log) } while (node != sentinel && hash == node->key); /* found a key with unmatching hash (and value), let's keep comparing hashes then */ + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "upload-progress: find_node hash not matching anymore"); } ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "upload-progress: can't find node"); return NULL; @@ -594,6 +637,7 @@ ngx_http_reportuploads_handler(ngx_http_request_t * r) } else { ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "reportuploads not found: %V", id); + log_rbtree(ctx,r->connection->log); } ngx_shmtx_unlock(&shpool->mutex); ngx_free(id); @@ -827,6 +871,7 @@ ngx_http_uploadprogress_handler(ngx_http_request_t * r) up->rest = 0; up->length = 0; up->timeout = 0; + up->log = NULL; up->next = ctx->list_head.next; up->next->prev = up; @@ -874,13 +919,36 @@ ngx_http_uploadprogress_rbtree_insert_value(ngx_rbtree_node_t * temp, ngx_rbtree_node_t * node, ngx_rbtree_node_t * sentinel) { - ngx_http_uploadprogress_node_t *upn, *upnt; + ngx_http_uploadprogress_node_t *upn, *upnt; + ngx_log_t *log = NULL; - for (;;) { + log = ((ngx_http_uploadprogress_node_t *)node)->log; + + if (log != NULL) { + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, + "upload-progree: rbtree insert %08XD to be inserted", node->key); + log_node(node, log); + } - if (node->key < temp->key) { + for (;;) { + + if (log != NULL) { + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, log, 0, + "upload-progree: rbtree insert %08XD compared to %08XD", node->key, temp->key); + log_node(temp, log); + } + if (node->key < temp->key) { + + if (log != NULL) { + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, + "upload-progree: rbtree insert going left"); + } if (temp->left == sentinel) { + if (log != NULL) { + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, + "upload-progree: rbtree insert left end of tree"); + } temp->left = node; break; } @@ -889,7 +957,16 @@ ngx_http_uploadprogress_rbtree_insert_value(ngx_rbtree_node_t * temp, } else if (node->key > temp->key) { + if (log != NULL) { + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, + "upload-progree: rbtree insert going right"); + } + if (temp->right == sentinel) { + if (log != NULL) { + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, + "upload-progree: rbtree insert right end of tree"); + } temp->right = node; break; } @@ -898,12 +975,25 @@ ngx_http_uploadprogress_rbtree_insert_value(ngx_rbtree_node_t * temp, } else { /* node->key == temp->key */ + if (log != NULL) { + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, + "upload-progree: equal hashes"); + } upn = (ngx_http_uploadprogress_node_t *) node; upnt = (ngx_http_uploadprogress_node_t *) temp; if (ngx_memn2cmp(upn->data, upnt->data, upn->len, upnt->len) < 0) { + if (log != NULL) { + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, + "upload-progree: rbtree insert eq h node < temp, going left"); + } + if (temp->left == sentinel) { + if (log != NULL) { + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, + "upload-progree: rbtree insert end of left"); + } temp->left = node; break; } @@ -912,7 +1002,15 @@ ngx_http_uploadprogress_rbtree_insert_value(ngx_rbtree_node_t * temp, } else { + if (log != NULL) { + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, + "upload-progree: rbtree insert eq h node > temp, going right"); + } if (temp->right == sentinel) { + if (log != NULL) { + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, + "upload-progree: rbtree insert end of right"); + } temp->right = node; break; } @@ -922,6 +1020,11 @@ ngx_http_uploadprogress_rbtree_insert_value(ngx_rbtree_node_t * temp, } } + if (log != NULL) { + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, + "upload-progree: rbtree insert insert below %08XD", temp->key); + } + node->parent = temp; node->left = sentinel; node->right = sentinel; @@ -1165,6 +1268,11 @@ ngx_http_uploadprogress_errortracker(ngx_http_request_t * r) node->key = hash; up->len = (u_char) id->len; up->err_status = r->err_status; + up->done = 0; + up->rest = 0; + up->length = 0; + up->timeout = 0; + up->log = r->connection->log; ngx_memcpy(up->data, id->data, id->len); up->next = ctx->list_head.next; @@ -1173,6 +1281,17 @@ ngx_http_uploadprogress_errortracker(ngx_http_request_t * r) ctx->list_head.next = up; ngx_rbtree_insert(ctx->rbtree, node); + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "trackuploads error-tracking: %08XD inserted in rbtree", hash); + + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "trackuploads error-tracking: checking if %08XD is correctly inserted in rbtree", hash); + + if (find_node(id, ctx, r->connection->log) == NULL) { + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, + "trackuploads error-tracking: %08XD hasn't been correctly added, this suggests an rbtree issue", hash); + } /* start the timer if needed */ if (!upcf->cleanup.timer_set) { @@ -1182,6 +1301,8 @@ ngx_http_uploadprogress_errortracker(ngx_http_request_t * r) ngx_add_timer(&upcf->cleanup, TIMER_FREQUENCY); } + log_rbtree(ctx,r->connection->log); + ngx_shmtx_unlock(&shpool->mutex); cln->handler = ngx_http_uploadprogress_cleanup;