1. 05 Sep, 2018 8 commits
    • antirez's avatar
      1d1bf7f0
    • antirez's avatar
      cfd969c7
    • antirez's avatar
      Use commands (effects) replication by default in scripts. · 3e1fb5ff
      antirez authored
      See issue #5250 and issue #5292 for more info.
      3e1fb5ff
    • antirez's avatar
      Safer script stop condition on OOM. · c6c71abe
      antirez authored
      Here the idea is that we do not want freeMemoryIfNeeded() to propagate a
      DEL command before the script and change what happens in the script
      execution once it reaches the slave. For example see this potential
      issue (in the words of @soloestoy):
      
      On master, we run the following script:
      
          if redis.call('get','key')
          then
              redis.call('set','xxx','yyy')
          end
          redis.call('set','c','d')
      
      Then when redis attempts to execute redis.call('set','xxx','yyy'), we call freeMemoryIfNeeded(), and the key may get deleted, and because redis.call('set','xxx','yyy') has already been executed on master, this script will be replicated to slave.
      
      But the slave received "DEL key" before the script, and will ignore maxmemory, so after that master has xxx and c, slave has only one key c.
      
      Note that this patch (and other related work) was authored collaboratively in
      issue #5250 with the help of @soloestoy and @oranagra.
      
      Related to issue #5250.
      c6c71abe
    • antirez's avatar
      Propagate read-only scripts as SCRIPT LOAD. · dfbce91a
      antirez authored
      See issue #5250 and the new comments added to the code in this commit
      for details.
      dfbce91a
    • antirez's avatar
      Don't perform eviction when re-entering the event loop. · 1705e42e
      antirez authored
      Related to #5250.
      1705e42e
    • antirez's avatar
      Clarify why remaining may be zero in readQueryFromClient(). · a0dd6f82
      antirez authored
      See #5304.
      a0dd6f82
    • zhaozhao.zz's avatar
      networking: fix unexpected negative or zero readlen · 2eed31a5
      zhaozhao.zz authored
      To avoid copying buffers to create a large Redis Object which
      exceeding PROTO_IOBUF_LEN 32KB, we just read the remaining data
      we need, which may less than PROTO_IOBUF_LEN. But the remaining
      len may be zero, if the bulklen+2 equals sdslen(c->querybuf),
      in client pause context.
      
      For example:
      
      Time1:
      
      python
      >>> import os, socket
      >>> server="127.0.0.1"
      >>> port=6379
      >>> data1="*3\r\n$3\r\nset\r\n$1\r\na\r\n$33000\r\n"
      >>> data2="".join("x" for _ in range(33000)) + "\r\n"
      >>> data3="\n\n"
      >>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      >>> s.settimeout(10)
      >>> s.connect((server, port))
      >>> s.send(data1)
      28
      
      Time2:
      
      redis-cli client pause 10000
      
      Time3:
      
      >>> s.send(data2)
      33002
      >>> s.send(data3)
      2
      >>> s.send(data3)
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      socket.error: [Errno 104] Connection reset by peer
      
      To fix that, we should check if remaining is greater than zero.
      2eed31a5
  2. 04 Sep, 2018 14 commits
  3. 31 Aug, 2018 1 commit
  4. 29 Aug, 2018 17 commits