1. 13 Jul, 2016 1 commit
    • antirez's avatar
      LRU: Make cross-database choices for eviction. · e423f76e
      antirez authored
      The LRU eviction code used to make local choices: for each DB visited it
      selected the best key to evict. This was repeated for each DB. However
      this means that there could be DBs with very frequently accessed keys
      that are targeted by the LRU algorithm while there were other DBs with
      many better candidates to expire.
      
      This commit attempts to fix this problem for the LRU policy. However the
      TTL policy is still not fixed by this commit. The TTL policy will be
      fixed in a successive commit.
      
      This is an initial (partial because of TTL policy) fix for issue #2647.
      e423f76e
  2. 12 Jul, 2016 5 commits
  3. 11 Jul, 2016 1 commit
    • antirez's avatar
      Remove useless memmove() from freeMemoryIfNeeded(). · 382991f8
      antirez authored
      We start from the end of the pool to the initial item, zero-ing
      every entry we use or every ghost entry, there is nothing to memmove
      since to the right everything should be already set to NULL.
      382991f8
  4. 06 Jul, 2016 12 commits
  5. 05 Jul, 2016 1 commit
    • antirez's avatar
      redis-cli: check SELECT reply type just in state updated. · ef6a4df2
      antirez authored
      In issues #3361 / #3365 a problem was reported / fixed with redis-cli
      not updating correctly the current DB on error after SELECT.
      
      In theory this bug was fixed in 0042fb0e, but actually the commit only
      fixed the prompt updating, not the fact the state was set in a wrong
      way.
      
      This commit removes the check in the prompt update, now that hopefully
      it is the state that is correct, there is no longer need for this check.
      ef6a4df2
  6. 04 Jul, 2016 3 commits
    • antirez's avatar
      Sentinel: fix cross-master Sentinel address update. · c383be3b
      antirez authored
      This commit both fixes the crash reported with issue #3364 and
      also properly closes the old links after the Sentinel address for the
      other masters gets updated.
      
      The two problems where:
      
      1. The Sentinel that switched address may not monitor all the masters,
         it is possible that there is no match, and the 'match' variable is
         NULL. Now we check for no match and 'continue' to the next master.
      
      2. By ispecting the code because of issue "1" I noticed that there was a
         problem in the code that disconnects the link of the Sentinel that
         needs the address update. Basically link->disconnected is non-zero
         even if just *a single link* (cc -- command link or pc -- pubsub
         link) are disconnected, so to check with if (link->disconnected)
         in order to close the links risks to leave one link connected.
      
      I was able to manually reproduce the crash at "1" and verify that the
      commit resolves the issue.
      
      Close #3364.
      c383be3b
    • antirez's avatar
      CONFIG GET is now no longer case sensitive. · b2cc8bcc
      antirez authored
      Like CONFIG SET always was. Close #3369.
      b2cc8bcc
    • antirez's avatar
      Make tcp-keepalive default to 300 in internal conf. · b99ad1bd
      antirez authored
      We already changed the default in the redis.conf template, but I forgot
      to change the internal config as well.
      b99ad1bd
  7. 01 Jul, 2016 6 commits
  8. 30 Jun, 2016 1 commit
    • antirez's avatar
      In Redis RDB check: initial POC. · e97fadb0
      antirez authored
      So far we used an external program (later executed within Redis) and
      parser in order to check RDB files for correctness. This forces, at each
      RDB format update, to have two copies of the same format implementation
      that are hard to keep in sync. Morover the former RDB checker only
      checked the very high-level format of the file, without actually trying
      to load things in memory. Certain corruptions can only be handled by
      really loading key-value pairs.
      
      This first commit attempts to unify the Redis RDB loadig code with the
      task of checking the RDB file for correctness. More work is needed but
      it looks like a sounding direction so far.
      e97fadb0
  9. 27 Jun, 2016 1 commit
    • antirez's avatar
      Fix quicklistReplaceAtIndex() by updating the quicklist ziplist size. · 5e176e1a
      antirez authored
      The quicklist takes a cached version of the ziplist representation size
      in bytes. The implementation must update this length every time the
      underlying ziplist changes. However quicklistReplaceAtIndex() failed to
      fix the length.
      
      During LSET calls, the size of the ziplist blob and the cached size
      inside the quicklist diverged. Later, when this size is used in an
      authoritative way, for example during nodes splitting in order to copy
      the nodes, we end with a duplicated node that may contain random
      garbage.
      
      This commit should fix issue #3343, however several problems were found
      reviewing the quicklist.c code in search of this bug that should be
      addressed soon or later.
      
      For example:
      
      1. To take a cached ziplist length is fragile since failing to update it
      leads to this kind of issues.
      
      2. The node splitting code needs auditing. For example it works just for
      a side effect of ziplistDeleteRange() to be able to cope with a wrong
      count of elements to remove. The code inside quicklist.c assumes that
      -1 means "delete till the end" while actually it's just a count of how
      many elements to delete, and is an unsigned count. So -1 gets converted
      into the maximum integer, and just by chance the ziplist code stops
      deleting elements after there are no more to delete.
      
      3. Node splitting is extremely inefficient, it copies the node and
      removes elements from both nodes even when actually there is to move a
      single entry from one node to the other, or when the new resulting node
      is empty at all so there is nothing to copy but just to create a new
      node.
      
      However at least for Redis 3.2 to introduce fresh code inside
      quicklist.c may be even more risky, so instead I'm writing a better
      fuzzy tester to stress the internals a bit more in order to anticipate
      other possible bugs.
      
      This bug was found using a fuzzy tester written after having some clue
      about where the bug could be. The tester eventually created a ~2000
      commands sequence able to always crash Redis. I wrote a better version
      of the tester that searched for the smallest sequence that could crash
      Redis automatically. Later this smaller sequence was minimized by
      removing random commands till it still crashed the server. This resulted
      into a sequence of 7 commands. With this small sequence it was just a
      matter of filling the code with enough printf() to understand enough
      state to fix the bug.
      5e176e1a
  10. 23 Jun, 2016 9 commits