1. 17 Sep, 2020 1 commit
    • Wang Yuan's avatar
      Implement redisAtomic to replace _Atomic C11 builtin (#7707) · 445a4b66
      Wang Yuan authored
      Redis 6.0 introduces I/O threads, it is so cool and efficient, we use C11
      _Atomic to establish inter-thread synchronization without mutex. But the
      compiler that must supports C11 _Atomic can compile redis code, that brings a
      lot of inconvenience since some common platforms can't support by default such
      as CentOS7, so we want to implement redis atomic type to make it more portable.
      
      We have implemented our atomic variable for redis that only has 'relaxed'
      operations in src/atomicvar.h, so we implement some operations with
      'sequentially-consistent', just like the default behavior of C11 _Atomic that
      can establish inter-thread synchronization. And we replace all uses of C11
      _Atomic with redis atomic variable.
      
      Our implementation of redis atomic variable uses C11 _Atomic, __atomic or
      __sync macros if available, it supports most common platforms, and we will
      detect automatically which feature we use. In Makefile we use a dummy file to
      detect if the compiler supports C11 _Atomic. Now for gcc, we can compile redis
      code theoretically if your gcc version is not less than 4.1.2(starts to support
      __sync_xxx operations). Otherwise, we remove use mutex fallback to implement
      redis atomic variable for performance and test. You will get compiling errors
      if your compiler doesn't support all features of above.
      
      For cover redis atomic variable tests, we add other CI jobs that build redis on
      CentOS6 and CentOS7 and workflow daily jobs that run the tests on them.
      For them, we just install gcc by default in order to cover different compiler
      versions, gcc is 4.4.7 by default installation on CentOS6 and 4.8.5 on CentOS7.
      
      We restore the feature that we can test redis with Helgrind to find data race
      errors. But you need install Valgrind in the default path configuration firstly
      before running your tests, since we use macros in helgrind.h to tell Helgrind
      inter-thread happens-before relationship explicitly for avoiding false positives.
      Please open an issue on github if you find data race errors relate to this commit.
      
      Unrelated:
      - Fix redefinition of typedef 'RedisModuleUserChangedFunc'
        For some old version compilers, they will report errors or warnings, if we
        re-define function type.
      445a4b66
  2. 16 Sep, 2020 4 commits
    • Oran Agra's avatar
      Add printf attribute and fix warnings and a minor bug (#7803) · 092cfca5
      Oran Agra authored
      The fix in error handling of rdbGenericLoadStringObject is an actual bugfix
      092cfca5
    • WuYunlong's avatar
      f8660233
    • WuYunlong's avatar
      bio: fix doFastMemoryTest. · 8b70cb0e
      WuYunlong authored
      If one thread got SIGSEGV, function sigsegvHandler() would be triggered,
      it would call bioKillThreads(). But call pthread_cancel() to cancel itself
      would make it block. Also note that if SIGSEGV is caught by bio thread, it
      should kill the main thread in order to give a positive report.
      8b70cb0e
    • Jim Brunner's avatar
      Incremental eviction processing (#7653) · 810e28a3
      Jim Brunner authored
      Rather than blindly evicting until maxmemory limit is achieved, this
      update adds a time limit to eviction.  While over the maxmemory limit,
      eviction will process before each command AND as a timeProc when no
      commands are running.
      
      This will reduce the latency impact on many cases, especially pathological
      cases like massive used memory increase during dict rehashing.
      
      There is a risk that some other edge cases (like massive pipelined use
      of MGET) could cause Redis memory usage to keep growing despite the
      eviction attempts, so a new maxmemory-eviction-tenacity config is
      introduced to let users mitigate that.
      810e28a3
  3. 15 Sep, 2020 1 commit
  4. 10 Sep, 2020 3 commits
    • Wang Yuan's avatar
      86511bbb
    • Oran Agra's avatar
      Squash merging 125 typo/grammar/comment/doc PRs (#7773) · 1c710385
      Oran Agra authored
      List of squashed commits or PRs
      ===============================
      
      commit 66801ea
      Author: hwware <wen.hui.ware@gmail.com>
      Date:   Mon Jan 13 00:54:31 2020 -0500
      
          typo fix in acl.c
      
      commit 46f55db
      Author: Itamar Haber <itamar@redislabs.com>
      Date:   Sun Sep 6 18:24:11 2020 +0300
      
          Updates a couple of comments
      
          Specifically:
      
          * RM_AutoMemory completed instead of pointing to docs
          * Updated link to custom type doc
      
      commit 61a2aa0
      Author: xindoo <xindoo@qq.com>
      Date:   Tue Sep 1 19:24:59 2020 +0800
      
          Correct errors in code comments
      
      commit a5871d1
      Author: yz1509 <pro-756@qq.com>
      Date:   Tue Sep 1 18:36:06 2020 +0800
      
          fix typos in module.c
      
      commit 41eede7
      Author: bookug <bookug@qq.com>
      Date:   Sat Aug 15 01:11:33 2020 +0800
      
          docs: fix typos in comments
      
      commit c303c84
      Author: lazy-snail <ws.niu@outlook.com>
      Date:   Fri Aug 7 11:15:44 2020 +0800
      
          fix spelling in redis.conf
      
      commit 1e...
      1c710385
    • Oran Agra's avatar
  5. 09 Sep, 2020 8 commits
  6. 08 Sep, 2020 1 commit
  7. 06 Sep, 2020 1 commit
    • Oran Agra's avatar
      if diskless repl child is killed, make sure to reap the pid (#7742) · 573246f7
      Oran Agra authored
      Starting redis 6.0 and the changes we made to the diskless master to be
      suitable for TLS, I made the master avoid reaping (wait3) the pid of the
      child until we know all replicas are done reading their rdb.
      
      I did that in order to avoid a state where the rdb_child_pid is -1 but
      we don't yet want to start another fork (still busy serving that data to
      replicas).
      
      It turns out that the solution used so far was problematic in case the
      fork child was being killed (e.g. by the kernel OOM killer), in that
      case there's a chance that we currently disabled the read event on the
      rdb pipe, since we're waiting for a replica to become writable again.
      and in that scenario the master would have never realized the child
      exited, and the replica will remain hung too.
      Note that there's no mechanism to detect a hung replica while it's in
      rdb transfer state.
      
      The solution here is to add another pipe which is used by the parent to
      tell the child it is safe to exit. this mean that when the child exits,
      for whatever reason, it is safe to reap it.
      
      Besides that, i'm re-introducing an adjustment to REPLCONF ACK which was
      part of #6271 (Accelerate diskless master connections) but was dropped
      when that PR was rebased after the TLS fork/pipe changes (5a477946).
      Now that RdbPipeCleanup no longer calls checkChildrenDone, and the ACK
      has chance to detect that the child exited, it should be the one to call
      it so that we don't have to wait for cron (server.hz) to do that.
      573246f7
  8. 03 Sep, 2020 2 commits
    • Yossi Gottlieb's avatar
      redis-cli: fix writeConn() buffer handling. (#7749) · 58e5feb3
      Yossi Gottlieb authored
      Fix issues with writeConn() which resulted with corruption of the stream by leaving an extra byte in the buffer. The trigger for this is partial writes or write errors which were not experienced on Linux but reported on macOS.
      58e5feb3
    • Oran Agra's avatar
      Run active defrag while blocked / loading (#7726) · 9ef8d2f6
      Oran Agra authored
      During long running scripts or loading RDB/AOF, we may need to do some
      defragging. Since processEventsWhileBlocked is called periodically at
      unknown intervals, and many cron jobs either depend on run_with_period
      (including active defrag), or rely on being called at server.hz rate
      (i.e. active defrag knows ho much time to run by looking at server.hz),
      the whileBlockedCron may have to run a loop triggering the cron jobs in it
      (currently only active defrag) several times.
      
      Other changes:
      - Adding a test for defrag during aof loading.
      - Changing key-load-delay config to take negative values for fractions
        of a microsecond sleep
      9ef8d2f6
  9. 02 Sep, 2020 3 commits
  10. 01 Sep, 2020 1 commit
  11. 28 Aug, 2020 2 commits
    • maohuazhu's avatar
      Optimize __ziplistCascadeUpdate algorithm (#6886) · ee4a15aa
      maohuazhu authored
      
      
      The previous algorithm is of O(n^2) time complexity.
      It would have run through the ziplist entries one by one, each time doing a `realloc` and a
      `memmove` (moving the entire tail of the ziplist).
      
      The new algorithm is O(n), it runs over all the records once, computing the size of the `realloc`
      needed, then does one `realloc`, and run thought the records again doing many smaller `memmove`s,
      each time moving just one record.
      
      So this change reduces many reallocs, and moves each record just once.
      Co-authored-by: default avatarzhumaohua <zhumaohua@megvii.com>
      Co-authored-by: default avatarOran Agra <oran@redislabs.com>
      ee4a15aa
    • Jim Brunner's avatar
      Use H/W Monotonic clock and updates to AE (#7644) · c01e94a4
      Jim Brunner authored
      Update adds a general source for retrieving a monotonic time.
      In addition, AE has been updated to utilize the new monotonic
      clock for timer processing.
      
      This performance improvement is **not** enabled in a default build due to various H/W compatibility
      concerns, see README.md for details. It does however change the default use of gettimeofday with
      clock_gettime and somewhat improves performance.
      
      This update provides the following
      1. An interface for retrieving a monotonic clock. getMonotonicUs returns a uint64_t (aka monotime)
         with the number of micro-seconds from an arbitrary point. No more messing with tv_sec/tv_usec.
         Simple routines are provided for measuring elapsed milli-seconds or elapsed micro-seconds (the
         most common use case for a monotonic timer). No worries about time moving backwards.
      2. High-speed assembler implementation for x86 and ARM. The standard method for retrieving the
         monotonic clock is POSIX.1b (1993): clock_gettime(CLOCK_MONOTONIC, timespec*). However, most
         modern processors provide a constant speed instruction clock which can be retrieved in a fraction
         of the time that it takes to call clock_gettime. For x86, this is provided by the RDTSC
         instruction. For ARM, this is provided by the CNTVCT_EL0 instruction. As a compile-time option,
         these high-speed timers can be chosen. (Default is POSIX clock_gettime.)
      3. Refactor of event loop timers. The timer processing in ae.c has been refactored to use the new
         monotonic clock interface. This results in simpler/cleaner logic and improved performance.
      c01e94a4
  12. 27 Aug, 2020 3 commits
    • Oran Agra's avatar
      Fix rejectCommand trims newline in shared error objects, hung clients (#7714) · 9fcd9e19
      Oran Agra authored
      65a3307b
      
       (released in 6.0.6) has a side effect, when processCommand
      rejects a command with pre-made shared object error string, it trims the
      newlines from the end of the string. if that string is later used with
      addReply, the newline will be missing, breaking the protocol, and
      leaving the client hung.
      
      It seems that the only scenario which this happens is when replying with
      -LOADING to some command, and later using that reply from the CONFIG
      SET command (still during loading). this will result in hung client.
      
      Refactoring the code in order to avoid trimming these newlines from
      shared string objects, and do the newline trimming only in other cases
      where it's needed.
      Co-authored-by: default avatarGuy Benoish <guy.benoish@redislabs.com>
      9fcd9e19
    • Oran Agra's avatar
      Update memory metrics for INFO during loading (#7690) · 8bdcbbb0
      Oran Agra authored
      During a long AOF or RDB loading, the memory stats were not updated, and
      INFO would return stale data, specifically about fragmentation and RSS.
      In the past some of these were sampled directly inside the INFO command,
      but were moved to cron as an optimization.
      
      This commit introduces a concept of loadingCron which should take
      some of the responsibilities of serverCron.
      It attempts to limit it's rate to approximately the server Hz, but may
      not be very accurate.
      
      In order to avoid too many system call, we use the cached ustime, and
      also make sure to update it in both AOF loading and RDB loading inside
      processEventsWhileBlocked (it seems AOF loading was missing it).
      8bdcbbb0
    • valentinogeron's avatar
      EXEC with only read commands should not be rejected when OOM (#7696) · b7289e91
      valentinogeron authored
      If the server gets MULTI command followed by only read
      commands, and right before it gets the EXEC it reaches OOM,
      the client will get OOM response.
      
      So, from now on, it will get OOM response only if there was
      at least one command that was tagged with `use-memory` flag
      b7289e91
  13. 25 Aug, 2020 2 commits
    • filipe oliveira's avatar
      Extended redis-benchmark instant metrics and overall latency report (#7600) · 21784def
      filipe oliveira authored
      A first step to enable a consistent full percentile analysis on query latency so that we can fully understand the performance and stability characteristics of the redis-server system we are measuring. It also improves the instantaneous reported metrics, and the csv output format.
      21784def
    • Itamar Haber's avatar
      Expands lazyfree's effort estimate to include Streams (#5794) · 5b0a06af
      Itamar Haber authored
      Otherwise, it is treated as a single allocation and freed synchronously. The following logic is used for estimating the effort in constant-ish time complexity:
      
      1. Check the number of nodes.
      1. Add an allocation for each consumer group registered inside the stream.
      1. Check the number of PELs in the first CG, and then add this count times the number of CGs.
      1. Check the number of consumers in the first CG, and then add this count times the number of CGs.
      5b0a06af
  14. 24 Aug, 2020 2 commits
  15. 23 Aug, 2020 2 commits
  16. 21 Aug, 2020 1 commit
  17. 20 Aug, 2020 3 commits