From: Dmitry Volyntsev Date: Wed, 20 Mar 2024 04:05:51 +0000 (-0700) Subject: Modules: fixed clear() method of a shared dictionary without timeout. X-Git-Tag: 0.8.4~12 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=06bfcbf1a10750cd8af71c2bc6df484512a84ea2;p=njs.git Modules: fixed clear() method of a shared dictionary without timeout. Previously, the code did not unlock the rwlock when a dict was empty. The issue was introduced in 4a15613f4e8b (0.8.3). This closes issue #699 on Github. --- diff --git a/nginx/ngx_js_shared_dict.c b/nginx/ngx_js_shared_dict.c index 66227428..3c94bd58 100644 --- a/nginx/ngx_js_shared_dict.c +++ b/nginx/ngx_js_shared_dict.c @@ -479,7 +479,7 @@ njs_js_ext_shared_dict_clear(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, rbtree = &dict->sh->rbtree; if (rbtree->root == rbtree->sentinel) { - return NJS_OK; + goto done; } for (rn = ngx_rbtree_min(rbtree->root, rbtree->sentinel); @@ -494,6 +494,8 @@ njs_js_ext_shared_dict_clear(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, } } +done: + ngx_rwlock_unlock(&dict->sh->rwlock); njs_value_undefined_set(retval); diff --git a/nginx/t/js_shared_dict.t b/nginx/t/js_shared_dict.t index bfa45c60..20ab87a3 100644 --- a/nginx/t/js_shared_dict.t +++ b/nginx/t/js_shared_dict.t @@ -266,6 +266,7 @@ $t->write_file('test.js', <<'EOF'); function set_clear(r) { var dict = ngx.shared.no_timeout; + dict.clear(); dict.set("test", "test value"); dict.set("test1", "test1 value"); dict.clear();