1. 03 Mar, 2014 2 commits
    • antirez's avatar
      Document why we update peak memory in INFO. · 12a88d57
      antirez authored
      12a88d57
    • antirez's avatar
      Fix configEpoch assignment when a cluster slot gets "closed". · 8dea2029
      antirez authored
      This is still code to rework in order to use agreement to obtain a new
      configEpoch when a slot is migrated, however this commit handles the
      special case that happens when the nodes are just started and everybody
      has a configEpoch of 0. In this special condition to have the maximum
      configEpoch is not enough as the special epoch 0 is not unique (all the
      others are).
      
      This does not fixes the intrinsic race condition of a failover happening
      while we are resharding, that will be addressed later.
      8dea2029
  2. 28 Feb, 2014 2 commits
    • Matt Stancliff's avatar
      Force INFO used_memory_peak to match peak memory · f1c9a203
      Matt Stancliff authored
      used_memory_peak only updates in serverCron every server.hz,
      but Redis can use more memory and a user can request memory
      INFO before used_memory_peak gets updated in the next
      cron run.
      
      This patch updates used_memory_peak to the current
      memory usage if the current memory usage is higher
      than the recorded used_memory_peak value.
      
      (And it only calls zmalloc_used_memory() once instead of
      twice as it was doing before.)
      f1c9a203
    • antirez's avatar
      Sentinel test: Makefile target added. · a89c8bb8
      antirez authored
      a89c8bb8
  3. 27 Feb, 2014 4 commits
    • antirez's avatar
      warnigns -> warnings in redisBitpos(). · 76a6e82d
      antirez authored
      76a6e82d
    • antirez's avatar
      More consistent BITPOS behavior with bit=0 and ranges. · 0e31eaa2
      antirez authored
      With the new behavior it is possible to specify just the start in the
      range (the end will be assumed to be the first byte), or it is possible
      to specify both start and end.
      
      This is useful to change the behavior of the command when looking for
      zeros inside a string.
      
      1) If the user specifies both start and end, and no 0 is found inside
         the range, the command returns -1.
      
      2) If instead no range is specified, or just the start is given, even
         if in the actual string no 0 bit is found, the command returns the
         first bit on the right after the end of the string.
      
      So for example if the string stored at key foo is "\xff\xff":
      
          BITPOS foo (returns 16)
          BITPOS foo 0 -1 (returns -1)
          BITPOS foo 0 (returns 16)
      
      The idea is that when no end is given the user is just looking for the
      first bit that is zero and can be set to 1 with SETBIT, as it is
      "available". Instead when a specific range is given, we just look for a
      zero within the boundaries of the range.
      0e31eaa2
    • antirez's avatar
      Initial implementation of BITPOS. · 38c620b3
      antirez authored
      It appears to work but more stress testing, and both unit tests and
      fuzzy testing, is needed in order to ensure the implementation is sane.
      38c620b3
    • antirez's avatar
      Fix misaligned word access in redisPopcount(). · 746ce35f
      antirez authored
      746ce35f
  4. 25 Feb, 2014 7 commits
  5. 24 Feb, 2014 4 commits
  6. 22 Feb, 2014 1 commit
    • antirez's avatar
      Sentinel: IDONTKNOW error removed. · b1c13863
      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.
      b1c13863
  7. 21 Feb, 2014 1 commit
    • Matt Stancliff's avatar
      Add cluster or sentinel to proc title · 2c273e35
      Matt Stancliff authored
      If you launch redis with `redis-server --sentinel` then
      in a ps, your output only says "redis-server IP:Port" — this
      patch changes the proc title to include [sentinel] or
      [cluster] depending on the current server mode:
      e.g.  "redis-server IP:Port [sentinel]"
            "redis-server IP:Port [cluster]"
      2c273e35
  8. 20 Feb, 2014 1 commit
  9. 18 Feb, 2014 2 commits
    • antirez's avatar
      Sentinel: SENTINEL_SLAVE_RECONF_RETRY_PERIOD -> RECONF_TIMEOUT · 7cec9e48
      antirez authored
      Rename define to match the new meaning.
      7cec9e48
    • antirez's avatar
      Sentinel: fix slave promotion timeout. · 18b8bad5
      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.
      18b8bad5
  10. 17 Feb, 2014 2 commits
    • antirez's avatar
      Get absoulte config file path before processig 'dir'. · ede33fb9
      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.
      ede33fb9
    • antirez's avatar
      Sentinel: better specify startup errors due to config file. · e1b77b61
      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.
      e1b77b61
  11. 13 Feb, 2014 3 commits
    • antirez's avatar
      Update cached time in rdbLoad() callback. · 51bd9da1
      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.
      51bd9da1
    • antirez's avatar
      Log when CONFIG REWRITE goes bad. · 7e8abcf6
      antirez authored
      7e8abcf6
    • antirez's avatar
      Fix script cache bug in the scripting engine. · 21e6b0fb
      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.
      21e6b0fb
  12. 12 Feb, 2014 2 commits
    • antirez's avatar
      AOF write error: retry with a frequency of 1 hz. · fc08c859
      antirez authored
      fc08c859
    • antirez's avatar
      AOF: don't abort on write errors unless fsync is 'always'. · fe835254
      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.
      fe835254
  13. 11 Feb, 2014 6 commits
  14. 10 Feb, 2014 3 commits
    • antirez's avatar
      Cluster: on resharding upgrade version of receiving node. · a1349728
      antirez authored
      The node receiving the hash slot needs to have a version that wins over
      the other versions in order to force the ownership of the slot.
      
      However the current code is far from perfect since a failover can happen
      during the manual resharding. The fix is a work in progress but the
      bottom line is that the new version must either be voted as usually,
      set by redis-trib manually after it makes sure can't be used by other
      nodes, or reserved configEpochs could be used for manual operations (for
      example odd versions could be never used by slaves and are always used
      by CLUSTER SETSLOT NODE).
      a1349728
    • antirez's avatar
      Cluster: fsync at every SETSLOT command puts too pressure on disks. · 6dc26795
      antirez authored
      During slots migration redis-trib can send a number of SETSLOT commands.
      Fsyncing every time is a bit too much in production as verified
      empirically.
      
      To make sure configs are fsynced on all nodes after a resharding
      redis-trib may send something like CLUSTER CONFSYNC.
      
      In this case fsyncs were not providing too much value since anyway
      processes can crash in the middle of the resharding of an hash slot, and
      redis-trib should be able to recover from this condition anyway.
      6dc26795
    • antirez's avatar
      Cluster: conditions to clear "migrating" on slot for SETSLOT ... NODE changed. · 218358bb
      antirez authored
      If the slot is manually assigned to another node, clear the migrating
      status regardless of the fact it was previously assigned to us or not,
      as long as we no longer have keys for this slot.
      
      This avoid a race during slots migration that may leave the slot in
      migrating status in the source node, since it received an update message
      from the destination node that is already claiming the slot.
      
      This way we are sure that redis-trib at the end of the slot migration is
      always able to close the slot correctly.
      218358bb