1. 25 Feb, 2014 5 commits
    • antirez's avatar
      Sentinel: IDONTKNOW error removed. · d83ab8f9
      antirez authored
      This error was conceived for the older version of Sentinel that worked
      via master redirection and that was not able to get configuration
      updates from other Sentinels via the Pub/Sub channel of masters or
      slaves.
      
      This reply does not make sense today, every Sentinel should reply with
      the best information it has currently. The error will make even more
      sense in the future since the plan is to allow Sentinels to update the
      configuration of other Sentinels via gossip with a direct chat without
      the prerequisite that they have at least a monitored instance in common.
      d83ab8f9
    • antirez's avatar
      Sentinel test: framework improved and conf-update unit added. · 1dfab3d1
      antirez authored
      It is now possible to kill and restart sentinel or redis instances for
      more real-world testing.
      
      The 01 unit tests the capability of Sentinel to update the configuration
      of Sentinels rejoining the cluster, however the test is pretty trivial
      and more tests should be added.
      1dfab3d1
    • antirez's avatar
      Sentinel test: move init tests as includes. · aee165e0
      antirez authored
      Most units will start with these two basic tests to create an
      environment where the real tests are ran.
      aee165e0
    • antirez's avatar
      73b290cc
    • Matt Stancliff's avatar
      Auto-enter slaveMode when SYNC from redis-cli · 3ced78dc
      Matt Stancliff authored
      If someone asks for SYNC or PSYNC from redis-cli,
      automatically enter slaveMode (as if they ran
      redis-cli --slave) and continue printing the replication
      stream until either they Ctrl-C or the master gets disconnected.
      3ced78dc
  2. 20 Feb, 2014 10 commits
  3. 18 Feb, 2014 2 commits
    • antirez's avatar
      Sentinel: SENTINEL_SLAVE_RECONF_RETRY_PERIOD -> RECONF_TIMEOUT · 905c55d5
      antirez authored
      Rename define to match the new meaning.
      905c55d5
    • antirez's avatar
      Sentinel: fix slave promotion timeout. · 1b345ec3
      antirez authored
      If we can't reconfigure a slave in time during failover, go forward as
      anyway the slave will be fixed by Sentinels in the future, once they
      detect it is misconfigured.
      
      Otherwise a failover in progress may never terminate if for some reason
      the slave is uncapable to sync with the master while at the same time
      it is not disconnected.
      1b345ec3
  4. 17 Feb, 2014 5 commits
    • antirez's avatar
      Sentinel: initial testing framework. · 351e7900
      antirez authored
      Nothing tested at all so far... Just the infrastructure spawning N
      Sentinels and N Redis instances that the test will use again and again.
      351e7900
    • antirez's avatar
      Test: colorstr moved to util.tcl. · f71c7de8
      antirez authored
      f71c7de8
    • antirez's avatar
      Test: code to test server availability refactored. · 0886c98f
      antirez authored
      Some inline test moved into server_is_up procedure.
      Also find_available_port was moved into util since it is going
      to be used for the Sentinel test as well.
      0886c98f
    • antirez's avatar
      Get absoulte config file path before processig 'dir'. · 4237f14a
      antirez authored
      The code tried to obtain the configuration file absolute path after
      processing the configuration file. However if config file was a relative
      path and a "dir" statement was processed reading the config, the absolute
      path obtained was wrong.
      
      With this fix the absolute path is obtained before processing the
      configuration while the server is still in the original directory where
      it was executed.
      4237f14a
    • antirez's avatar
      Sentinel: better specify startup errors due to config file. · 5efee4f0
      antirez authored
      Now it logs the file name if it is not accessible. Also there is a
      different error for the missing config file case, and for the non
      writable file case.
      5efee4f0
  5. 13 Feb, 2014 5 commits
    • antirez's avatar
      Redis 2.8.6. · 1d4d9e7b
      antirez authored
      1d4d9e7b
    • antirez's avatar
      Update cached time in rdbLoad() callback. · 85492dcf
      antirez authored
      server.unixtime and server.mstime are cached less precise timestamps
      that we use every time we don't need an accurate time representation and
      a syscall would be too slow for the number of calls we require.
      
      Such an example is the initialization and update process of the last
      interaction time with the client, that is used for timeouts.
      
      However rdbLoad() can take some time to load the DB, but at the same
      time it did not updated the time during DB loading. This resulted in the
      bug described in issue #1535, where in the replication process the slave
      loads the DB, creates the redisClient representation of its master, but
      the timestamp is so old that the master, under certain conditions, is
      sensed as already "timed out".
      
      Thanks to @yoav-steinberg and Redis Labs Inc for the bug report and
      analysis.
      85492dcf
    • 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
  6. 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
  7. 07 Feb, 2014 2 commits
  8. 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
  9. 04 Feb, 2014 1 commit
  10. 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
  11. 31 Jan, 2014 2 commits
    • antirez's avatar
      Test: fixed osx msg passing issue in testing framework. · 66304fb1
      antirez authored
      The Redis test uses a server-clients model in order to parallelize the
      execution of different tests. However in recent versions of osx not
      setting the channel to a binary encoding caused issues even if AFAIK no
      binary data is really sent via this channel. However now the channels
      are deliberately set to a binary encoding and this solves the issue.
      
      The exact issue was the test not terminating and giving the impression
      of running forever, since test clients or servers were unable to
      exchange the messages to continue.
      66304fb1
    • antirez's avatar
      1406112e