Skip to content

Implement redisAtomic to replace _Atomic C11 builtin#7707

Merged
oranagra merged 9 commits intoredis:unstablefrom
ShooterIT:redis-atomic
Sep 17, 2020
Merged

Implement redisAtomic to replace _Atomic C11 builtin#7707
oranagra merged 9 commits intoredis:unstablefrom
ShooterIT:redis-atomic

Conversation

@ShooterIT
Copy link
Member

Try to solve #7509

Firstly, I try to explain how _Atomic can guarantee our program execute safely. The default behavior of _Atomic operations provides for sequentially consistent ordering. For threaded IO in redis, we use inter-thread synchronization of io_threads_pending[i], so other IO threads could see the updated values of io_threads_list instead of history values when io_threads_pending[i] is fired.

Currently we implement atomic that only supports memory_order_relaxed for redis in atomicvar.h, so I implement operations with sequentially-consistent ordering, just like the default behavior of _Atomic.

More details for memory_order, we can see https://en.cppreference.com/w/c/atomic/memory_order

Currently, atomic variables we used in Redis are as follow

server.unixtime
server.lruclock
server.next_client_id
server.stat_total_writes_processed
server.stat_total_reads_processed
server.stat_net_output_bytes
server.stat_net_input_bytes
server.client_max_querybuf_len

For server.unixtime, server.lruclock, server.next_client_id, Salvatore started using atomic variable from commits
ece6587 1f598fc
I just restored these operations back

For stat_total_writes_processed, stat_total_reads_processed, stat_net_output_bytes,stat_net_input_bytes, we still
use redis atomic implemented before,that means we use memory_order_relaxed access operations for them, it is ok because there is no happen-before relationship.

For client_max_querybuf_len, I don't find we write and read it simultaneously in redis, there is no data race, so i think it is safe to read in IO threads.

Other work i did is that we can test Redis with Helgrind, Now there still are 3 errors in helgrind report when we run redis with a module, as flow. I think there is no risk. For 1, it means redis still holds 4 locks(io_threads_mutex) when redis exits. For 2, 3, that is because we may acquire two mutex moduleGIL and io_threads_mutex but they are unrelated actully.

1 Thread #1: Exiting thread still holds 4 locks

2 Thread #1: lock order "0x77DB48 before 0x767D00" violated
Address 0x767d00 is 0 bytes inside data symbol "moduleGIL"

3 Thread #1: lock order "0x767D00 before 0x77DB48" violated
Address 0x77db48 is 40 bytes inside data symbol "io_threads_mutex"

@ShooterIT
Copy link
Member Author

If users want to use c11 _Atomic, they could modify Makefile

STD=-std=c11 -pedantic -DREDIS_STATIC=''

@ShooterIT
Copy link
Member Author

Would you mind having a look if you have time @JohnSully I notice that you use many atomic variables in your KeyDB.

@oranagra oranagra added the state:major-decision Requires core team consensus label Aug 25, 2020
@oranagra oranagra added this to the Redis 6.2 milestone Aug 25, 2020
@oranagra oranagra linked an issue Aug 25, 2020 that may be closed by this pull request
@oranagra
Copy link
Member

Thanks @ShooterIT !

For server.unixtime, server.lruclock, server.next_client_id, Salvatore started using atomic variable from commits
ece6587 1f598fc
I just restored these operations back

i would rather you find the commit that removed them and logically revert it, since there's a risk that these changed after they were first introduced (so we're reinstating their old version).
can you please look into that, maybe they're already good, but better be sure.

Maybe we want to suppress these helgrind warnings and add it to run in the daily CI github action?

Would C11 _Atomic provide any efficiency improvement here? if so, maybe we want to change the Makefile to automatically use it when supported?
If not, maybe we want to add a make target for it, and/or mention it in the the README?

Can you please test that it builds on Centos7 and possibly 6 too.
7 would be easy by modifying the the daily CI yaml trigger and pushing to a branch on your forked repo.

@yossigo please take a look.

@ShooterIT
Copy link
Member Author

you find the commit that removed them and logically revert it,

this is the commit dd5b105, I think i did revert logically. Please help me review it.

I test with Helgrind just because i want to find errors early.

I don't find C11 _Atomic has efficiency improvement, i provide it because some people would like to use new features of language and more importantly we ever supported it. I have no idea to change the Makefile to automatically use _Atomic when supported, maybe target is a good idea.

I'm sorry i don't have Centos, my company machine kernel is as follow, and two gcc versions of 4.8(not support _Atomic) and 8.2((supports _Atomic)) are installed on it. All redis tests are passed both of two versions.
Linux version 3.10.0_3-0-0-24 (gcc version 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) )

@JohnSully
Copy link
Contributor

Hi @ShooterIT

I'm not sure I understand the need for introducing these in all the places you've chosen, e.g. in createClient. Is this based upon the output of a tool? Note that your changes are not free, and will introduce performance regressions especially on ARM. That said for the atomics you've changed from relaxed to higher consistency will generally only repro on ARM if they were bugs anyways.

KeyDB of course uses atomics a lot but our threading model is also very different so its not a guide for what should be Atomic in Redis.

@ShooterIT
Copy link
Member Author

ShooterIT commented Aug 27, 2020

Thanks @JohnSully

For server.unixtime, server.lruclock, server.next_client_id, Salvatore started using atomic variable from commits
ece6587 1f598fc
I just restored these operations back

Salvatore did add comment on his commits. Yes, for these variable, I also think it is safe without being defined as atomic variable.

Modules TSC: use atomic var for server.unixtime.

This avoids Helgrind complaining, but we are actually not using
atomicGet() to get the unixtime value for now: too many places where it
is used and given tha time_t is word-sized it should be safe in all the
archs we support as it is.

On the other hand, Helgrind, when Redis is compiled with "make helgrind"
in order to force the __sync macros, will detect the write in
updateCachedTime() as a read (because atomic functions are used) and
will not complain about races.

This commit also includes minor refactoring of mutex initializations and
a "helgrind" target in the Makefile.

The default behavior of C11 _Atomic operations provides for sequentially consistent ordering, so now it should not have performance regressions than before.
On my opinion, memory_order_acquire for reading variables,memory_order_release for writing variables. that will be enough. On strongly-ordered systems, maybe memory_order_relaxed is enough for our needs. But on weakly-ordered systems, there may be many errors that are difficult to debug. BTW, servers based on ARM are more popular now.

On strongly-ordered systems — x86, SPARC TSO, IBM mainframe, etc. — release-acquire ordering is automatic for the majority of operations. No additional CPU instructions are issued for this synchronization mode; only certain compiler optimizations are affected (e.g., the compiler is prohibited from moving non-atomic stores past the atomic store-release or performing non-atomic loads earlier than the atomic load-acquire). On weakly-ordered systems (ARM, Itanium, PowerPC), special CPU load or memory fence instructions are used.

Even so, I still use ’sequentially consistent‘ semantic just the same as before, it need not require much complicated derivation and analysis for correctness. Redis can run on many different archs, we should guarantee correctness theoretically. And more and more people take part in developing redis, that also is very import to make it easy to understand and make modification less error-prone. What's more, actually I don't find there are no obvious performance difference on x86 arch between 'acquire/release' and 'sequentially consistent'.

For ARM, there are some changes, the CPU instructions of different atomic variable operations become the same gradually https://www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.html. Maybe CPU and compiler designers want to make it easy to use because it is too hard actually. I borrow one ARM server(as follow) from my colleague, both 'relaxed' and 'consistent' memory order of atomic variables can run correctly and without much performance difference.
Linux 4.14.0_1-1-0-20 #1 SMP Fri May 29 10:17:03 CST 2020 aarch64 aarch64 aarch64 GNU/Linux

I know KeyDB has different threading model, but i think you have much experience with atomic variable. Thank you very much for reviewing my PR.

@ShooterIT
Copy link
Member Author

@oranagra For using C11 _Atomic, how about this

diff --git a/src/Makefile b/src/Makefile
index 6bbf9e175..82f292eb6 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -20,7 +20,7 @@ DEPENDENCY_TARGETS=hiredis linenoise lua
 NODEPS:=clean distclean
 
 # Default settings
-STD=-std=c99 -pedantic -DREDIS_STATIC=''
+STD=-pedantic -DREDIS_STATIC=''
 ifneq (,$(findstring clang,$(CC)))
 ifneq (,$(findstring FreeBSD,$(uname_S)))
   STD+=-Wno-c11-extensions
@@ -34,6 +34,13 @@ INSTALL_BIN=$(PREFIX)/bin
 INSTALL=install
 PKG_CONFIG?=pkg-config
 
+# Use c99 by default, but we can specify to use c11
+ifeq ($(C11),yes)
+STD+=-std=c11
+else
+STD+=-std=c99
+endif
+
 # Default allocator defaults to Jemalloc if it's not an ARM
 MALLOC=libc
 ifneq ($(uname_M),armv6l)

@oranagra
Copy link
Member

@ShooterIT if there are no downsides of using the other atomic types (gcc and sync builtins) then i prefer to stick to c99 even if c11 is supported. the benefit is that if there are any other differences we always build and test with c99 (and not just rarely do so), and it'll present any use of a c11 feature to creep in and be detected only in a daily CI.

If there are any performance advantages with _Atomic, then your suggested patch above makes sense.

@oranagra
Copy link
Member

Another thought on that subject, all the pthread_mutex_t variables are usually dead code, we ca detect that at build time and don't bother to create and initialize them.
This possibly saves some resources.
On the other hand, i'm not at all sure that we have any coverage for this in our CI tests? i.e. can can simply delete used_memory_mutex and everything will build successfully and all CI will pass.

maybe we don't need to support the mutex fallback at all? or maybe we should add a daily CI cycle that covers that configuration (at least to see that it builds and runs).

@ShooterIT
Copy link
Member Author

hi @oranagra AFAIK, operations of c11 _Atomic is the same as atomic builtins for gcc implementation. this is part of the code in <stdatomic.h> of gcc 8.2 on my linux server. So i think there is no much difference between c11 _Atomic and gcc atomic builtins.

#define atomic_store_explicit(PTR, VAL, MO)				\
  __extension__								\
  ({									\
    __auto_type __atomic_store_ptr = (PTR);				\
    __typeof__ (*__atomic_store_ptr) __atomic_store_tmp = (VAL);	\
    __atomic_store (__atomic_store_ptr, &__atomic_store_tmp, (MO));	\
  })

#define atomic_store(PTR, VAL)				\
  atomic_store_explicit (PTR, VAL, __ATOMIC_SEQ_CST)


#define atomic_load_explicit(PTR, MO)					\
  __extension__								\
  ({									\
    __auto_type __atomic_load_ptr = (PTR);				\
    __typeof__ (*__atomic_load_ptr) __atomic_load_tmp;			\
    __atomic_load (__atomic_load_ptr, &__atomic_load_tmp, (MO));	\
    __atomic_load_tmp;							\
  })

#define atomic_load(PTR)  atomic_load_explicit (PTR, __ATOMIC_SEQ_CST)

For pthread_mutex_t dead code, actually i am also feel entangled. we can clearly know whether we should use pthread_mutex or not at build time, we must use some micros if we do that make it less readable. There will be some dead code if not. Maybe salvatore also didn't make it less readable as before, but actually there are more and more atomic variable now, i think we can reconstruct it. As you said, we don't need to support the mutex fallback at all, i agree with this point, it is already 2020 :), using pthread_mutex to support atomic variable is a relatively rare case.

@oranagra
Copy link
Member

@ShooterIT i'm not certain if we want to remove the code for that fallback or not. after all, the whole point of this PR is to make redis more portable than it is in 6.0. (maybe some old or embedded system may still depend on them?)
I do think that we don't need to consider their implication on performance (considering that they're only used if all modern options aren't available).

So i'm not certain, i wanna trim this code. @yossigo what do you think?

What I am certain, is that i don't like dead code be completely uncovered by the test (like if we remove used_memory_mutex today, we won't notice that the code doesn't compile in this mode). so if we keep the current approach, i think we need to add another daily CI cycle that covers these.

@ShooterIT
Copy link
Member Author

@oranagra Copy that, i wait for your final conclusion.

To test dead code pthread_mutex, but I don't what environment need use pthread_mutex fallback, maybe a very old compiler or OS

@ShooterIT
Copy link
Member Author

Let's see what we're going to do, @oranagra

  • Support C11 _Atomic or not
  • Use pthread_mutex fallback and add CI to cover it, or don't use pthread_mutex fallback

@oranagra
Copy link
Member

oranagra commented Sep 6, 2020

Following a discussion with @yossigo we feel that we should keep supporting _Atomic (since this is the only one that's standard, maybe some day a compiler will support that and not the others), and also because it doesn't add a lot of mess (local to atomicvar.h).

Regarding the pthread_mutex, we concluded that we should drop them.
unlike the above it does mess up the code a lot (outside of atomicvar.h), there is a risk that this code will accidentally get active somehow resulting in low performance (in that case if the accident is solvable, we rather fail the build), and we concluded that any realistic platform for Redis is likely to have support for the other atomic builtins.

@redis/core-team any objections?
@ShooterIT if that approved, i'll ask that you clean all the mutex variables, and replace the fallback with #error.

@ShooterIT
Copy link
Member Author

Yes, C11 _Atomic is standard, It offers exact definition of atomic variable operations semantic, and i think we will _Atomic gradually. This is standard!

I also agree that we drop pthread_mutex fallback, Redis is an in-memory database, we should keep its performance, what worse, it is error-prone, we may forget to define a pthread_mutex variable, and we need add CI for it. I hope you can reach an agreement.

ShooterIT referenced this pull request Sep 7, 2020
…7600)

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.
@madolson
Copy link
Contributor

@oranagra I'm okay with that proposal.

@ShooterIT
Copy link
Member Author

@oranagra I remove pthread_mutex fallback for atomic variable.

How to support C11 _Atomic, how about #7707 (comment)

@oranagra
Copy link
Member

@ShooterIT the commit that removes the mutexes looks fine.

my problem with the makefile change you suggested in #7707 (comment) is that it'll normally use _Atomic and we're unlikely to know notice that the alternative is broken, or if we violated redis by using some C11 feature elsewhere. i suppose we'll detect that in the daily CI when testing CentOS7 (after we remove the SCL portions).

please add a commit that removes the scl portions from

yum -y install centos-release-scl
and maybe (at least temporarily) copy that whole CentOS job into CI.yml so we can it in the PR checks).

come to think of it, the above argument goes the other way around too, i.e. if we always use atomic_builtins, how do we know that the _Atomic is not broken?
Maybe we can figure out a way to make sure that all the variables declared with redisAtomic are always accessed with our atomic accessor macros and vice versa? i can't think of any way.

so maybe indeed the best thing would be to use C11 by default and then at least we have the CentOS7 CI job cover one of the alternatives. what do you think?

@ShooterIT
Copy link
Member Author

For C11 _Atomic, my operation system is macOS and complier is clang, it will report errors if i didn't declare the variables with redisAtomic but i accessed them with our atomic macros, i think that can help us check declarations of atomic variables. I can't have a idea to guarantee we access them with our atomic macros.

It will be more safe if we use C11 _Atomic by default, it also is safe if we forget to access them with our atomic macros. Our initial motivation is to make redis more compatible and keep it run correctly. I agree with using C11 by default, but we need cover both atomic builtin and sync builtin, make sure it can be compiled at least.

For some old version compliers, they will report errors or warnings,
if we redefine function type.
CI jobs build redis on CentOS6 and CentOS7 and Daily jobs run the tests on these.
We install gcc on these 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.
@ShooterIT
Copy link
Member Author

ShooterIT commented Sep 15, 2020

@oranagra Let's me summarize all works for this PR.

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 redefine function type.

@oranagra
Copy link
Member

@redis/core-team this PR is ready for review. please have a look at the previous post for a summary (and squash commit comment).

@oranagra oranagra added the release-notes indication that this issue needs to be mentioned in the release notes label Sep 17, 2020
@oranagra oranagra merged commit 445a4b6 into redis:unstable Sep 17, 2020
@oranagra
Copy link
Member

@ShooterIT thanks a lot for handling this.
i hope it'll make the life of many people easier. (and prevent some issues and questions being opened here and in stack overflow!)

@oranagra oranagra removed this from the Next minor backlog milestone Oct 19, 2020
JackieXie168 pushed a commit to JackieXie168/redis that referenced this pull request Nov 4, 2020
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.
@ShooterIT ShooterIT deleted the redis-atomic branch December 14, 2020 17:57
@oranagra oranagra mentioned this pull request Jan 13, 2021
@guybe7
Copy link
Collaborator

guybe7 commented Sep 29, 2022

@ShooterIT i noticed that server.unixtime is set via atomicSet but is read like a normal variable (not via atomicGet)
is that on purpose or was it overlooked?

@ShooterIT
Copy link
Member Author

hi, @guybe7 i just kept old method before 6.0, https://github.com/redis/redis/blob/5.0/src/server.c#L1077
i think it is not necessary to set server.unixtime to atomic variable.

@ShooterIT ShooterIT mentioned this pull request Dec 11, 2024
alonre24 added a commit to alonre24/redis that referenced this pull request Jan 26, 2026
**Bug Fixes:**

* [redis#7385](RediSearch/RediSearch#7385) Fix high temporary memory consumption when loading multiple search indexes from RDB
* [redis#7430](RediSearch/RediSearch#7430) Fix a potential deadlock in `FT.HYBRID` in cluster mode during updates.
* [redis#7454](RediSearch/RediSearch#7454) Fix a garbage collection performence regression
* [redis#7460](RediSearch/RediSearch#7460) Fix potential double-free in Fork GC error paths
* [redis#7455](RediSearch/RediSearch#7455) Fix internal cursors not being deleted promptly in cluster mode
* [redis#7667](RediSearch/RediSearch#7667) Fix a cursor logical leak upon dropping the index
* [redis#7796](RediSearch/RediSearch#7796) Fix a potential use-after-free when removing connections
* [redis#7792](RediSearch/RediSearch#7792) Fix string comparison for binary data with embedded NULLs in TOLIST reducer in FT.AGGREGATE
* [redis#7823](RediSearch/RediSearch#7823) Update `FT.HYBRID` to accept vector blobs only via parameters
* [redis#7903](RediSearch/RediSearch#7903) Fix a memory leak in Hybrid ASM
* [redis#8052](RediSearch/RediSearch#8052) Fix `FT.HYBRID` behavior when used with `LOAD *`
* [redis#8082](RediSearch/RediSearch#8082) Fix incorrect FULLTEXT field metric counts
* [redis#8089](RediSearch/RediSearch#8089) Fix an edge case in `CLUSTERSET` handling
* [redis#8152](RediSearch/RediSearch#8152) Fix configuration registration issues

**Improvements:**

* [redis#7427](RediSearch/RediSearch#7427) Enhance `FT.PROFILE` with vector search execution details
* [redis#7431](RediSearch/RediSearch#7431) Ensure full `FT.PROFILE` output is returned on timeout with RETURN policy
* [redis#7507](RediSearch/RediSearch#7507) Track timeout warnings and errors in INFO
* [redis#7576](RediSearch/RediSearch#7576) Track OOM warnings and errors in INFO
* [redis#7612](RediSearch/RediSearch#7612) Track `maxprefixexpansions` warnings and errors in INFO
* [redis#7960](RediSearch/RediSearch#7960) Persist query warnings across cursor reads
* [redis#7551](RediSearch/RediSearch#7551), [redis#7616](RediSearch/RediSearch#7616), [redis#7622](RediSearch/RediSearch#7622), [redis#7625](RediSearch/RediSearch#7625) Add runtime thread and pending-jobs metrics
* [redis#7589](RediSearch/RediSearch#7589) Support multiple slot ranges in `search.CLUSTERSET`
* [redis#7707](RediSearch/RediSearch#7707) Add `WITHCOUNT` support to `FT.AGGREGATE`
* [redis#7862](RediSearch/RediSearch#7862) Add support for subquery `COUNT` in `FT.HYBRID`
* [redis#8087](RediSearch/RediSearch#8087) Add warnings when cursor results may be affected by ASM and expose ASM warnings in `FT.PROFILE`
* [redis#8049](RediSearch/RediSearch#8049) Add logging for index-related commands
* [redis#8150](RediSearch/RediSearch#8150) Fix shard total profile time reporting in `FT.PROFILE`
YaacovHazan pushed a commit that referenced this pull request Jan 26, 2026
**Bug Fixes:**

* [#7385](RediSearch/RediSearch#7385) Fix high
temporary memory consumption when loading multiple search indexes from
RDB
* [#7430](RediSearch/RediSearch#7430) Fix a
potential deadlock in `FT.HYBRID` in cluster mode during updates.
* [#7454](RediSearch/RediSearch#7454) Fix a
garbage collection performence regression
* [#7460](RediSearch/RediSearch#7460) Fix
potential double-free in Fork GC error paths
* [#7455](RediSearch/RediSearch#7455) Fix
internal cursors not being deleted promptly in cluster mode
* [#7667](RediSearch/RediSearch#7667) Fix a
cursor logical leak upon dropping the index
* [#7796](RediSearch/RediSearch#7796) Fix a
potential use-after-free when removing connections
* [#7792](RediSearch/RediSearch#7792) Fix string
comparison for binary data with embedded NULLs in TOLIST reducer in
FT.AGGREGATE
* [#7704](RediSearch/RediSearch#7704) Use
asynchronous jobs for GC in SVS to accelerate execution
* [#7823](RediSearch/RediSearch#7823) Update
`FT.HYBRID` to accept vector blobs only via parameters
* [#7903](RediSearch/RediSearch#7903) Fix a
memory leak in Hybrid ASM
* [#8052](RediSearch/RediSearch#8052) Fix
`FT.HYBRID` behavior when used with `LOAD *`
* [#8082](RediSearch/RediSearch#8082) Fix
incorrect FULLTEXT field metric counts
* [#8089](RediSearch/RediSearch#8089) Fix an
edge case in `CLUSTERSET` handling
* [#8152](RediSearch/RediSearch#8152) Fix
configuration registration issues

**Improvements:**

* [#7427](RediSearch/RediSearch#7427) Enhance
`FT.PROFILE` with vector search execution details
* [#7431](RediSearch/RediSearch#7431) Ensure
full `FT.PROFILE` output is returned on timeout with RETURN policy
* [#7507](RediSearch/RediSearch#7507) Track
timeout warnings and errors in INFO
* [#7576](RediSearch/RediSearch#7576) Track OOM
warnings and errors in INFO
* [#7612](RediSearch/RediSearch#7612) Track
`maxprefixexpansions` warnings and errors in INFO
* [#7960](RediSearch/RediSearch#7960) Persist
query warnings across cursor reads
* [#7551](RediSearch/RediSearch#7551),
[#7616](RediSearch/RediSearch#7616),
[#7622](RediSearch/RediSearch#7622),
[#7625](RediSearch/RediSearch#7625) Add runtime
thread and pending-jobs metrics
* [#7589](RediSearch/RediSearch#7589) Support
multiple slot ranges in `search.CLUSTERSET`
* [#7707](RediSearch/RediSearch#7707) Add
`WITHCOUNT` support to `FT.AGGREGATE`
* [#7862](RediSearch/RediSearch#7862) Add
support for subquery `COUNT` in `FT.HYBRID`
* [#8087](RediSearch/RediSearch#8087) Add
warnings when cursor results may be affected by ASM and expose ASM
warnings in `FT.PROFILE`
* [#8049](RediSearch/RediSearch#8049) Add
logging for index-related commands
* [#8150](RediSearch/RediSearch#8150) Fix shard
total profile time reporting in `FT.PROFILE`
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

release-notes indication that this issue needs to be mentioned in the release notes state:major-decision Requires core team consensus

Projects

None yet

Development

Successfully merging this pull request may close these issues.

GCC 4.8 vs C11 _Atomic and threaded IO

8 participants