diff --git a/nginx/ngx_js_shared_dict.c b/nginx/ngx_js_shared_dict.c index d9a1fc7c4..2ea254d1d 100644 --- a/nginx/ngx_js_shared_dict.c +++ b/nginx/ngx_js_shared_dict.c @@ -1618,6 +1618,7 @@ ngx_js_dict_delete(njs_vm_t *vm, ngx_js_dict_t *dict, ngx_str_t *key, ngx_int_t rc; ngx_msec_t now; ngx_time_t *tp; + ngx_rbtree_key_t expire; ngx_js_dict_node_t *node; ngx_rwlock_wlock(&dict->sh->rwlock); @@ -1629,7 +1630,11 @@ ngx_js_dict_delete(njs_vm_t *vm, ngx_js_dict_t *dict, ngx_str_t *key, return NGX_DECLINED; } + expire = 0; + if (dict->timeout) { + expire = node->expire.key; + ngx_rbtree_delete(&dict->sh->rbtree_expire, &node->expire); } @@ -1639,7 +1644,7 @@ ngx_js_dict_delete(njs_vm_t *vm, ngx_js_dict_t *dict, ngx_str_t *key, tp = ngx_timeofday(); now = tp->sec * 1000 + tp->msec; - if (!dict->timeout || now < node->expire.key) { + if (!dict->timeout || now < expire) { rc = ngx_js_dict_copy_value_locked(vm, dict, node, retval); } else { @@ -4041,6 +4046,7 @@ ngx_qjs_dict_delete(JSContext *cx, ngx_js_dict_t *dict, ngx_str_t *key, JSValue ret; ngx_msec_t now; ngx_time_t *tp; + ngx_rbtree_key_t expire; ngx_js_dict_node_t *node; ngx_rwlock_wlock(&dict->sh->rwlock); @@ -4052,7 +4058,11 @@ ngx_qjs_dict_delete(JSContext *cx, ngx_js_dict_t *dict, ngx_str_t *key, return JS_UNDEFINED; } + expire = 0; + if (dict->timeout) { + expire = node->expire.key; + ngx_rbtree_delete(&dict->sh->rbtree_expire, &node->expire); } @@ -4062,7 +4072,7 @@ ngx_qjs_dict_delete(JSContext *cx, ngx_js_dict_t *dict, ngx_str_t *key, tp = ngx_timeofday(); now = tp->sec * 1000 + tp->msec; - if (!dict->timeout || now < node->expire.key) { + if (!dict->timeout || now < expire) { ret = ngx_qjs_dict_copy_value_locked(cx, dict, node); } else { diff --git a/nginx/t/js_shared_dict.t b/nginx/t/js_shared_dict.t index b30e2865b..0fb05db4e 100644 --- a/nginx/t/js_shared_dict.t +++ b/nginx/t/js_shared_dict.t @@ -356,7 +356,7 @@ EOF $t->try_run('no js_shared_dict_zone'); -$t->plan(59); +$t->plan(61); ############################################################################### @@ -482,6 +482,11 @@ ok($ttl_incr_def >= 900000 && $ttl_incr_def <= 1000000, like(http_get('/pop?dict=bar&key=FOO'), qr/zzz/, 'pop bar.FOO'); like(http_get('/pop?dict=bar&key=FOO'), qr/undefined/, 'pop deleted bar.FOO'); + +http_get('/set?dict=foo&key=POP&value=alive'); +like(http_get('/pop?dict=foo&key=POP'), qr/alive/, 'pop unexpired foo.POP'); +like(http_get('/pop?dict=foo&key=POP'), qr/undefined/, 'pop deleted foo.POP'); + http_get('/set?dict=foo&key=BAR&value=xxx'); like(http_get('/clear?dict=foo'), qr/undefined/, 'clear foo');