Skip to content

Commit b3fadde

Browse files
authored
bugfix: should reset the value_len to 0 when reuse the expired list type key in shared dict. (#263)
1 parent 19db56b commit b3fadde

File tree

2 files changed

+75
-1
lines changed

2 files changed

+75
-1
lines changed

src/ngx_stream_lua_shdict.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,7 @@ ngx_stream_lua_shdict_push_helper(lua_State *L, int flags)
734734
"type matched, reusing it");
735735

736736
sd->expires = 0;
737-
737+
sd->value_len = 0;
738738
/* free list nodes */
739739

740740
queue = ngx_stream_lua_shdict_get_list_head(sd, key.len);

t/043-shdict.t

+74
Original file line numberDiff line numberDiff line change
@@ -1962,3 +1962,77 @@ nil
19621962
nil
19631963
--- no_error_log
19641964
[error]
1965+
1966+
1967+
1968+
=== TEST 88: push to an expired list
1969+
--- stream_config
1970+
lua_shared_dict dogs 1m;
1971+
--- stream_server_config
1972+
content_by_lua_block {
1973+
local dogs = ngx.shared.dogs
1974+
local len, err = dogs:lpush("cc", "1") --add another list to avoid key"aa" be cleaned (run ngx_http_lua_shdict_expire(ctx, 1) may clean key ,ensure key'aa' not clean ,just expired))
1975+
if not len then
1976+
ngx.say("push cc err: ", err)
1977+
end
1978+
local len, err = dogs:lpush("aa", "1")
1979+
if not len then
1980+
ngx.say("push1 err: ", err)
1981+
end
1982+
local succ, err = dogs:expire("aa", 0.2)
1983+
if not succ then
1984+
ngx.say("expire err: ",err)
1985+
end
1986+
ngx.sleep(0.3) -- list aa expired
1987+
local len, err = dogs:lpush("aa", "2") --push to an expired list may set as a new list
1988+
if not len then
1989+
ngx.say("push2 err: ", err)
1990+
end
1991+
local len, err = dogs:llen("aa") -- new list len is 1
1992+
if not len then
1993+
ngx.say("llen err: ", err)
1994+
else
1995+
ngx.say("aa:len :", dogs:llen("aa"))
1996+
end
1997+
}
1998+
--- stream_response
1999+
aa:len :1
2000+
--- no_error_log
2001+
[error]
2002+
2003+
2004+
2005+
=== TEST 89: push to an expired list then pop many time (more then list len )
2006+
--- stream_config
2007+
lua_shared_dict dogs 1m;
2008+
--- stream_server_config
2009+
content_by_lua_block {
2010+
local dogs = ngx.shared.dogs
2011+
local len, err = dogs:lpush("cc", "1") --add another list to avoid key"aa" be cleaned (run ngx_http_lua_shdict_expire(ctx, 1) may clean key ,ensure key'aa' not clean ,just expired))
2012+
if not len then
2013+
ngx.say("push cc err: ", err)
2014+
end
2015+
local len, err = dogs:lpush("aa", "1")
2016+
if not len then
2017+
ngx.say("push1 err: ", err)
2018+
end
2019+
local succ, err = dogs:expire("aa", 0.2)
2020+
if not succ then
2021+
ngx.say("expire err: ",err)
2022+
end
2023+
ngx.sleep(0.3) -- list aa expired
2024+
local len, err = dogs:lpush("aa", "2") --push to an expired list may set as a new list
2025+
if not len then
2026+
ngx.say("push2 err: ", err)
2027+
end
2028+
local val, err = dogs:lpop("aa")
2029+
if not val then
2030+
ngx.say("llen err: ", err)
2031+
end
2032+
local val, err = dogs:lpop("aa") -- val == nil
2033+
ngx.say("aa list value: ", val)
2034+
}
2035+
--- stream_response
2036+
aa list value: nil
2037+
--- no_error_log
2038+
[error]

0 commit comments

Comments
 (0)