• zhaozhao.zz's avatar
    expires: refactoring judgment about whether a key is expired · e542132b
    zhaozhao.zz authored
    Calling lookupKey*() many times to search a key in one command
    may get different result.
    
    That's because lookupKey*() calls expireIfNeeded(), and delete
    the key when reach the expire time. So we can get an robj before
    the expire time, but a NULL after the expire time.
    
    The worst is that may lead to Redis crash, for example
    `RPOPLPUSH foo foo` the first time we get a list form `foo` and
    hold the pointer, but when we get `foo` again it's expired and
    deleted. Now we hold a freed memory, when execute rpoplpushHandlePush()
    redis crash.
    
    To fix it, we can refactor the judgment about whether a key is expired,
    using the same basetime `server.cmd_start_mstime` instead of calling
    mstime() everytime.
    e542132b
server.c 185 KB