1. 31 Jul, 2012 2 commits
    • Michael Parker's avatar
      Use correct variable name for value to convert. · f1d187bb
      Michael Parker authored
      Note by @antirez: this code was never compiled because utils.c lacked the
      float.h include, so we never noticed this variable was mispelled in the
      past.
      
      This should provide a noticeable speed boost when saving certain types
      of databases with many sorted sets inside.
      f1d187bb
    • antirez's avatar
      Sentinel: abort failover when in wait-start if master is back. · 75084e05
      antirez authored
      When we are a Leader Sentinel in wait-start state, starting with this
      commit the failover is aborted if the master returns online.
      
      This improves the way we handle a notable case of net split, that is the
      split between Sentinels and Redis servers, that will be a very common
      case of split becase Sentinels will often be installed in the client's
      network and servers can be in a differnt arm of the network.
      
      When Sentinels and Redis servers are isolated the master is in ODOWN
      condition since the Sentinels can agree about this state, however the
      failover does not start since there are no good slaves to promote (in
      this specific case all the slaves are unreachable).
      
      However when the split is resolved, Sentinels may sense the slave back
      a moment before they sense the master is back, so the failover may start
      without a good reason (since the master is actually working too).
      
      Now this condition is reversible, so the failover will be aborted
      immediately after if the master is detected to be working again, that
      is, not in SDOWN nor in ODOWN condition.
      75084e05
  2. 28 Jul, 2012 2 commits
    • antirez's avatar
      Sentinel: scripts execution engine improved. · 3f194a9d
      antirez authored
      We no longer use a vanilla fork+execve but take a queue of jobs of
      scripts to execute, with retry on error, timeouts, and so forth.
      
      Currently this is used only for notifications but soon the ability to
      also call clients reconfiguration scripts will be added.
      3f194a9d
    • Jan-Erik Rediger's avatar
      Include sys/wait.h to avoid compiler warning · c6c19c83
      Jan-Erik Rediger authored
      gcc warned about an implicit declaration of function 'wait3'. 
      Including this header fixes this.
      c6c19c83
  3. 26 Jul, 2012 1 commit
  4. 25 Jul, 2012 3 commits
  5. 24 Jul, 2012 6 commits
    • antirez's avatar
      9e5bef38
    • antirez's avatar
      Prevent a spurious +sdown event on switch. · a23a5b6c
      antirez authored
      When we reset the master we should start with clean timestamps for ping
      replies otherwise we'll detect a spurious +sdown event, because on
      +master-switch event the previous master instance was probably in +sdown
      condition. Since we updated the address we should count time from
      scratch again.
      
      Also this commit makes sure to explicitly reset the count of pending
      commands, now we can do this because of the new way the hiredis link
      is closed.
      a23a5b6c
    • antirez's avatar
      Sentinel: debugging message removed. · d918e6f1
      antirez authored
      d918e6f1
    • antirez's avatar
      Sentinel: changes to connection handling and redirection. · 75fb6e5b
      antirez authored
      We disconnect the Redis instances hiredis link in a more robust way now.
      Also we change the way we perform the redirection for the +switch-master
      event, that is not just an instance reset with an address change.
      
      Using the same system we now implement the +redirect-to-master event
      that is triggered by an instance that is configured to be master but
      found to be a slave at the first INFO reply. In that case we monitor the
      master instead, logging the incident as an event.
      75fb6e5b
    • antirez's avatar
      Sentinel: check that instance still exists in reply callbacks. · 2179c269
      antirez authored
      We can't be sure the instance object still exists when the reply
      callback is called.
      2179c269
    • antirez's avatar
      Sentinel: more robust failover detection as observer. · d876d6fe
      antirez authored
      Sentinel observers detect failover checking if a slave attached to the
      monitored master turns into its replication state from slave to master.
      However while this change may in theory only happen after a SLAVEOF NO
      ONE command, in practie it is very easy to reboot a slave instance with
      a wrong configuration that turns it into a master, especially if it was
      a past master before a successfull failover.
      
      This commit changes the detection policy so that if an instance goes
      from slave to master, but at the same time the runid has changed, we
      sense a reboot, and in that case we don't detect a failover at all.
      
      This commit also introduces the "reboot" sentinel event, that is logged
      at "warning" level (so this will trigger an admin notification).
      
      The commit also fixes a problem in the disconnect handler that assumed
      that the instance object always existed, that is not the case. Now we
      no longer assume that redisAsyncFree() will call the disconnection
      handler before returning.
      d876d6fe
  6. 23 Jul, 2012 1 commit
  7. 22 Jul, 2012 1 commit
    • antirez's avatar
      Allow Pub/Sub in contexts where other commands are blocked. · 5d73073f
      antirez authored
      Redis loading data from disk, and a Redis slave disconnected from its
      master with serve-stale-data disabled, are two conditions where
      commands are normally refused by Redis, returning an error.
      
      However there is no reason to disable Pub/Sub commands as well, given
      that this layer does not interact with the dataset. To allow Pub/Sub in
      as many contexts as possible is especially interesting now that Redis
      Sentinel uses Pub/Sub of a Redis master as a communication channel
      between Sentinels.
      
      This commit allows Pub/Sub to be used in the above two contexts where
      it was previously denied.
      5d73073f
  8. 18 Jul, 2012 2 commits
    • antirez's avatar
      Don't assume that "char" is signed. · b62bdf1c
      antirez authored
      For the C standard char can be either signed or unsigned, it's up to the
      compiler, but Redis assumed that it was signed in a few places.
      
      The practical effect of this patch is that now Redis 2.6 will run
      correctly in every system where char is unsigned, notably the RaspBerry
      PI and other ARM systems with GCC.
      
      Thanks to Georgi Marinov (@eesn on twitter) that reported the problem
      and allowed me to use his RaspBerry via SSH to trace and fix the issue!
      b62bdf1c
    • Saj Goonatilleke's avatar
      Truncate short write from the AOF · 55302e9e
      Saj Goonatilleke authored
      If Redis only manages to write out a partial buffer, the AOF file won't
      load back into Redis the next time it starts up.  It is better to
      discard the short write than waste time running redis-check-aof.
      55302e9e
  9. 17 Jul, 2012 1 commit
    • Saj Goonatilleke's avatar
      New in INFO: aof_last_bgrewrite_status · 48553a29
      Saj Goonatilleke authored
      Behaves like rdb_last_bgsave_status -- even down to reporting 'ok' when
      no rewrite has been done yet.  (You might want to check that
      aof_last_rewrite_time_sec is not -1.)
      48553a29
  10. 15 Jul, 2012 1 commit
  11. 29 Jun, 2012 1 commit
  12. 27 Jun, 2012 2 commits
    • antirez's avatar
      Typo in comment. · 36def8fd
      antirez authored
      36def8fd
    • antirez's avatar
      REPLCONF internal command introduced. · 3a328978
      antirez authored
      The REPLCONF command is an internal command (not designed to be directly
      used by normal clients) that allows a slave to set some replication
      related state in the master before issuing SYNC to start the
      replication.
      
      The initial motivation for this command, and the only reason currently
      it is used by the implementation, is to let the slave instance
      communicate its listening port to the slave, so that the master can
      show all the slaves with their listening ports in the "replication"
      section of the INFO output.
      
      This allows clients to auto discover and query all the slaves attached
      into a master.
      
      Currently only a single option of the REPLCONF command is supported, and
      it is called "listening-port", so the slave now starts the replication
      process with something like the following chat:
      
          REPLCONF listening-prot 6380
          SYNC
      
      Note that this works even if the master is an older version of Redis and
      does not understand REPLCONF, because the slave ignores the REPLCONF
      error.
      
      In the future REPLCONF can be used for partial replication and other
      replication related features where there is the need to exchange
      information between master and slave.
      
      NOTE: This commit also fixes a bug: the INFO outout already carried
      information about slaves, but the port was broken, and was obtained
      with getpeername(2), so it was actually just the ephemeral port used
      by the slave to connect to the master as a client.
      3a328978
  13. 21 Jun, 2012 2 commits
    • antirez's avatar
      5410168c
    • antirez's avatar
      Fixed a timing attack on AUTH (Issue #560). · 31a1439b
      antirez authored
      The way we compared the authentication password using strcmp() allowed
      an attacker to gain information about the password using a well known
      class of attacks called "timing attacks".
      
      The bug appears to be practically not exploitable in most modern systems
      running Redis since even using multiple bytes of differences in the
      input at a time instead of one the difference in running time in in the
      order of 10 nanoseconds, making it hard to exploit even on LAN. However
      attacks always get better so we are providing a fix ASAP.
      
      The new implementation uses two fixed length buffers and a constant time
      comparison function, with the goal of:
      
      1) Completely avoid leaking information about the content of the
      password, since the comparison is always performed between 512
      characters and without conditionals.
      2) Partially avoid leaking information about the length of the
      password.
      
      About "2" we still have a stage in the code where the real password and
      the user provided password are copied in the static buffers, we also run
      two strlen() operations against the two inputs, so the running time
      of the comparison is a fixed amount plus a time proportional to
      LENGTH(A)+LENGTH(B). This means that the absolute time of the operation
      performed is still related to the length of the password in some way,
      but there is no way to change the input in order to get a difference in
      the execution time in the comparison that is not just proportional to
      the string provided by the user (because the password length is fixed).
      
      Thus in practical terms the user should try to discover LENGTH(PASSWORD)
      looking at the whole execution time of the AUTH command and trying to
      guess a proportionality between the whole execution time and the
      password length: this appears to be mostly unfeasible in the real world.
      
      Also protecting from this attack is not very useful in the case of Redis
      as a brute force attack is anyway feasible if the password is too short,
      while with a long password makes it not an issue that the attacker knows
      the length.
      31a1439b
  14. 15 Jun, 2012 1 commit
    • antirez's avatar
      Fix c->reply_bytes computation in setDeferredMultiBulkLength() · 5b63ccce
      antirez authored
      In order to implement reply buffer limits introduced in 2.6 and useful
      to close the connection under user-selected circumastances of big output
      buffers (for instance slow consumers in pub/sub, a blocked slave, and so
      forth) Redis takes a counter with the amount of used memory in objects
      inside the output list stored into c->reply.
      
      The computation was broken in the function setDeferredMultiBulkLength(),
      in the case the object was glued with the next one. This caused the
      c->reply_bytes field to go out of sync, be subtracted more than needed,
      and wrap back near to ULONG_MAX values.
      
      This commit fixes this bug and adds an assertion that is able to trap
      this class of problems.
      
      This problem was discovered looking at the INFO output of an unrelated
      issue (issue #547).
      5b63ccce
  15. 14 Jun, 2012 1 commit
    • antirez's avatar
      ziplistFind(): don't assume that entries are comparable by encoding. · ba779119
      antirez authored
      Because Redis 2.6 introduced new integer encodings it is no longer true
      that if two entries have a different encoding they are not equal.
      
      An old ziplist can be loaded from an RDB file generated with Redis 2.4,
      in this case for instance a small unsigned integers is encoded with a
      16 bit encoding, while in Redis 2.6 a more specific 8 bit encoding
      format is used.
      
      Because of this bug hashes ended with duplicated values or fields lookup
      failed, causing many bad behaviors.
      This in turn caused a crash while converting the ziplist encoded hash into
      a real hash table because an assertion was raised on duplicated elements.
      
      This commit fixes issue #547.
      
      Many thanks to Pinterest's Marty Weiner and colleagues for discovering
      the problem and helping us in the debugging process.
      ba779119
  16. 13 Jun, 2012 1 commit
    • Ted Nyman's avatar
      Standardize punctuation in redis-cli help. · d665dd08
      Ted Nyman authored
      Right there is a mix of help entries ending with periods or
      without periods. This standardizes the end of command as without
      periods, which seems to be the general custom in most unix tools,
      at least.
      d665dd08
  17. 11 Jun, 2012 1 commit
    • antirez's avatar
      Dump ziplist hex value on failed assertion. · ee789e15
      antirez authored
      The ziplist -> hashtable conversion code is triggered every time an hash
      value must be promoted to a full hash table because the number or size of
      elements reached the threshold.
      
      If a problem in the ziplist causes the same field to be present
      multiple times, the assertion of successful addition of the element
      inside the hash table will fail, crashing server with a failed
      assertion, but providing little information about the problem.
      
      This code adds a new logging function to perform the hex dump of binary
      data, and makes sure that the ziplist -> hashtable conversion code uses
      this new logging facility to dump the content of the ziplist when the
      assertion fails.
      
      This change was originally made in order to investigate issue #547.
      ee789e15
  18. 02 Jun, 2012 2 commits
    • Alex Mitrofanov's avatar
      Fixed RESTORE hash failure (Issue #532) · 51857c7e
      Alex Mitrofanov authored
      (additional commit notes by antirez@gmail.com):
      
      The rdbIsObjectType() macro was not updated when the new RDB object type
      of ziplist encoded hashes was added.
      
      As a result RESTORE, that uses rdbLoadObjectType(), failed when a
      ziplist encoded hash was loaded.
      This does not affected normal RDB loading because in that case we use
      the lower-level function rdbLoadType().
      
      The commit also adds a regression test.
      51857c7e
    • antirez's avatar
      RDB type loading functions clarified in comments. · c7a25200
      antirez authored
      Improved comments to make clear that rdbLoadType() just loads a
      general TYPE in the context of RDB that can be an object type or an
      expire type, end-of-file, and so forth.
      
      While rdbLoadObjectType() enforces that the type is a valid Object Type
      otherwise it returns -1.
      c7a25200
  19. 31 May, 2012 1 commit
    • antirez's avatar
      BITOP bug when called against non existing keys fixed. · 1419406e
      antirez authored
      In the issue #529 an user reported a bug that can be triggered with the
      following code:
      
      flushdb
      set a
      "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
      bitop or x a b
      
      The bug was introduced with the speed optimization in commit 8bbc0768
      that specializes every BITOP operation loop up to the minimum length of
      the input strings.
      
      However the computation of the minimum length contained an error when a
      non existing key was present in the input, after a key that was non zero
      length.
      
      This commit fixes the bug and adds a regression test for it.
      1419406e
  20. 25 May, 2012 1 commit
    • antirez's avatar
      Four new persistence fields in INFO. A few renamed. · 33e1db36
      antirez authored
      The 'persistence' section of INFO output now contains additional four
      fields related to RDB and AOF persistence:
      
       rdb_last_bgsave_time_sec       Duration of latest BGSAVE in sec.
       rdb_current_bgsave_time_sec    Duration of current BGSAVE in sec.
       aof_last_rewrite_time_sec      Duration of latest AOF rewrite in sec.
       aof_current_rewrite_time_sec   Duration of current AOF rewrite in sec.
      
      The 'current' fields are set to -1 if a BGSAVE / AOF rewrite is not in
      progress. The 'last' fileds are set to -1 if no previous BGSAVE / AOF
      rewrites were performed.
      
      Additionally a few fields in the persistence section were renamed for
      consistency:
      
       changes_since_last_save -> rdb_changes_since_last_save
       bgsave_in_progress -> rdb_bgsave_in_progress
       last_save_time -> rdb_last_save_time
       last_bgsave_status -> rdb_last_bgsave_status
       bgrewriteaof_in_progress -> aof_rewrite_in_progress
       bgrewriteaof_scheduled -> aof_rewrite_scheduled
      
      After the renaming, fields in the persistence section start with rdb_ or
      aof_ prefix depending on the persistence method they describe.
      The field 'loading' and related fields are not prefixed because they are
      unique for both the persistence methods.
      33e1db36
  21. 24 May, 2012 7 commits
    • antirez's avatar
      BITOP command 10x speed improvement. · d8668038
      antirez authored
      This commit adds a fast-path to the BITOP that can be used for all the
      bytes from 0 to the minimal length of the string, and if there are
      at max 16 input keys.
      
      Often the intersected bitmaps are roughly the same size, so this
      optimization can provide a 10x speed boost to most real world usages
      of the command.
      
      Bytes are processed four full words at a time, in loops specialized
      for the specific BITOP sub-command, without the need to check for
      length issues with the inputs (since we run this algorithm only as far
      as there is data from all the keys at the same time).
      
      The remaining part of the string is intersected in the usual way using
      the slow but generic algorith.
      
      It is possible to do better than this with inputs that are not roughly
      the same size, sorting the input keys by length, by initializing the
      result string in a smarter way, and noticing that the final part of the
      output string composed of only data from the longest string does not
      need any proecessing since AND, OR and XOR against an empty string does
      not alter the output (zero in the first case, and the original string in
      the other two cases).
      
      More implementations will be implemented later likely, but this should
      be enough to release Redis 2.6-RC4 with bitops merged in.
      
      Note: this commit also adds better testing for BITOP NOT command, that
      is currently the faster and hard to optimize further since it just
      flips the bits of a single input string.
      d8668038
    • antirez's avatar
      BITOP: handle integer encoded objects correctly. · fa4a5d59
      antirez authored
      A bug in the implementation caused BITOP to crash the server if at least
      one one of the source objects was integer encoded.
      
      The new implementation takes an additional array of Redis objects
      pointers and calls getDecodedObject() to get a reference to a string
      encoded object, and then uses decrRefCount() to release the object.
      
      Tests modified to cover the regression and improve coverage.
      fa4a5d59
    • antirez's avatar
      BITCOUNT performance improved. · 7c34643f
      antirez authored
      At Redis's default optimization level the command is now much faster,
      always using a constant-time bit manipualtion technique to count bits
      instead of GCC builtin popcount, and unrolling the loop.
      
      The current implementation performance is 1.5GB/s in a MBA 11" (1.8 Ghz
      i7) compiled with both GCC and clang.
      
      The algorithm used is described here:
      
      http://graphics.stanford.edu/~seander/bithacks.html
      7c34643f
    • antirez's avatar
      bitop.c renamed bitops.c · 80f8028e
      antirez authored
      bitop.c contains the "Bit related string operations" so it seems more
      logical to call it bitops instead of bitop.
      This also makes it matching the name of the test (unit/bitops.tcl).
      80f8028e
    • antirez's avatar
      popcount() optimization for speed. · 343d3bd2
      antirez authored
      We run the array by 32 bit words instead of processing it byte per byte.
      If the code is compiled using GCC __builtin_popcount() builtin function
      is used instead.
      343d3bd2
    • antirez's avatar
      BITCOUNT refactoring. · dbbbe49e
      antirez authored
      The low level popualtion counting function is now separated from the
      BITCOUNT command implementation, so that the low level function can be
      further optimized and eventually used in other contexts if needed.
      dbbbe49e
    • antirez's avatar
      Bit-related string operations moved to bitop.c · 760e7765
      antirez authored
      All the general string operations are implemented in t_string.c, however
      the bit operations, while targeting the string type, are better served
      in a specific file where we have the implementations of the following
      four commands and helper functions:
      
          GETBIT
          SETBIT
          BITOP
          BITCOUNT
      
      In the future this file will probably contain more code related to
      making the BITOP and BITCOUNT operations faster.
      760e7765