1. 13 Feb, 2014 3 commits
    • antirez's avatar
      Log when CONFIG REWRITE goes bad. · eb10bb31
      antirez authored
      eb10bb31
    • antirez's avatar
      Test: regression for issue #1549. · ebdb37ce
      antirez authored
      It was verified that reverting the commit that fixes the bug, the test
      no longer passes.
      ebdb37ce
    • antirez's avatar
      Fix script cache bug in the scripting engine. · 9b73a274
      antirez authored
      This commit fixes a serious Lua scripting replication issue, described
      by Github issue #1549. The root cause of the problem is that scripts
      were put inside the script cache, assuming that slaves and AOF already
      contained it, even if the scripts sometimes produced no changes in the
      data set, and were not actaully propagated to AOF/slaves.
      
      Example:
      
          eval "if tonumber(KEYS[1]) > 0 then redis.call('incr', 'x') end" 1 0
      
      Then:
      
          evalsha <sha1 step 1 script> 1 0
      
      At this step sha1 of the script is added to the replication script cache
      (the script is marked as known to the slaves) and EVALSHA command is
      transformed to EVAL. However it is not dirty (there is no changes to db),
      so it is not propagated to the slaves. Then the script is called again:
      
          evalsha <sha1 step 1 script> 1 1
      
      At this step master checks that the script already exists in the
      replication script cache and doesn't transform it to EVAL command. It is
      dirty and propagated to the slaves, but they fail to evaluate the script
      as they don't have it in the script cache.
      
      The fix is trivial and just uses the new API to force the propagation of
      the executed command regardless of the dirty state of the data set.
      
      Thank you to @minus-infinity on Github for finding the issue,
      understanding the root cause, and fixing it.
      9b73a274
  2. 12 Feb, 2014 2 commits
    • antirez's avatar
      AOF write error: retry with a frequency of 1 hz. · 96973a7c
      antirez authored
      96973a7c
    • antirez's avatar
      AOF: don't abort on write errors unless fsync is 'always'. · fadbbdd3
      antirez authored
      A system similar to the RDB write error handling is used, in which when
      we can't write to the AOF file, writes are no longer accepted until we
      are able to write again.
      
      For fsync == always we still abort on errors since there is currently no
      easy way to avoid replying with success to the user otherwise, and this
      would violate the contract with the user of only acknowledging data
      already secured on disk.
      fadbbdd3
  3. 07 Feb, 2014 2 commits
  4. 05 Feb, 2014 1 commit
    • antirez's avatar
      Check for EAGAIN in sendBulkToSlave(). · 301a0cfc
      antirez authored
      Sometime an osx master with a Linux server over a slow link caused
      a strange error where osx called the writable function for
      the socket but actually apparently there was no room in the socket
      buffer to accept the write: write(2) call returned an EAGAIN error,
      that was not checked, so we considered write(2) == 0 always as a connection
      reset, which was unfortunate since the bulk transfer has to start again.
      
      Also more errors are logged with the WARNING level in the same code path
      now.
      301a0cfc
  5. 04 Feb, 2014 1 commit
  6. 03 Feb, 2014 5 commits
    • antirez's avatar
      Move mstime_t define outside sentinel.c. · ddcf1603
      antirez authored
      The define is now used in other parts of Redis 2.8 tree instead of long
      long.
      
      A nice side effect is that now 2.8 and unstable sentinel.c files are
      identical as it should be.
      ddcf1603
    • antirez's avatar
      Scripting: expire keys in scripts only at first access. · c5bc5926
      antirez authored
      Keys expiring in the middle of the execution of Lua scripts are to
      create inconsistencies in masters and / or AOF files. See the following
      example:
      
          if redis.call("exists",KEYS[1]) == 1
          then
              redis.call("incr","mycounter")
          end
      
          if redis.call("exists",KEYS[1]) == 1
          then
              return redis.call("incr","mycounter")
          end
      
      The script executes two times the same *if key exists then incrementcounter*
      logic. However the two executions will work differently in the master and
      the slaves, provided some unlucky timing happens.
      
      In the master the first time the key may still exist, while the second time
      the key may no longer exist. This will result in the key incremented just one
      time. However as a side effect the master will generate a synthetic
      `DEL` command in the replication channel in order to force the slaves to
      expire the key (given that key expiration is master-driven).
      
      When the same script will run in the slave, the key will no longer be
      there, so the script will not increment the key.
      
      The key idea used to implement the expire-at-first-lookup semantics was
      provided by Marc Gravell.
      c5bc5926
    • antirez's avatar
      5201ca0c
    • antirez's avatar
      Scripting: use mstime() and mstime_t for lua_time_start. · 3da5cbe5
      antirez authored
      server.lua_time_start is expressed in milliseconds. Use mstime_t instead
      of long long, and populate it with mstime() instead of ustime()/1000.
      
      Functionally identical but more natural.
      3da5cbe5
    • PatrickJS's avatar
      update copyright year · 0be31e2d
      PatrickJS authored
      0be31e2d
  7. 31 Jan, 2014 5 commits
  8. 28 Jan, 2014 2 commits
  9. 25 Jan, 2014 1 commit
  10. 22 Jan, 2014 3 commits
  11. 14 Jan, 2014 2 commits
  12. 13 Jan, 2014 13 commits