-
Notifications
You must be signed in to change notification settings - Fork 2.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
AsyncIO Race Condition Fix #2641
Conversation
Codecov ReportPatch coverage:
📣 This organization is not using Codecov’s GitHub App Integration. We recommend you install it so Codecov can continue to function properly for your repositories. Learn more Additional details and impacted files@@ Coverage Diff @@
## master #2641 +/- ##
===========================================
- Coverage 92.28% 78.22% -14.06%
===========================================
Files 115 115
Lines 29751 29787 +36
===========================================
- Hits 27455 23301 -4154
- Misses 2296 6486 +4190
... and 38 files with indirect coverage changes Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here. ☔ View full report in Codecov by Sentry. |
@chayim I think this only fixed the pipeline, while the race condition still exists in the redis-py/redis/asyncio/client.py Line 514 in 66a4d6b
I can still reproduce #2624 using the latest redis-py Keep in mind that you need slow enough Redis connection to reproduce this, otherwise the cancellation does not happen simply because the entire RESP exchange with Redis happens before there is a chance to cancel the task. Also, are you sure that shielding from cancellation is the right approach? For example, this means that there would be no way to cancel a blocking BLPOP. |
I found the same problem. Just install the Redis service locally and run the following code and it will definitely reproduce: import asyncio
from redis.asyncio import Redis
async def main():
async with Redis(single_connection_client=True) as r:
await r.set('foo', 'foo')
await r.set('bar', 'bar')
t = asyncio.create_task(r.get('foo'))
await asyncio.sleep(0) # <--- must 0
t.cancel()
try:
await t
print('try again, we did not cancel the task in time')
except asyncio.CancelledError as e:
print('managed to cancel the task, connection is left open with unread response')
print('bar:', await r.get('bar'))
print('ping:', await r.ping())
print('foo:', await r.get('foo'))
if __name__ == '__main__':
asyncio.run(main()) |
Co-authored-by: Viktor Ivanov <[email protected]> Co-authored-by: Sergey Prokazov <[email protected]> Co-authored-by: Anuragkillswitch <[email protected]> Co-authored-by: dvora-h <[email protected]> Co-authored-by: Alex Schmitz <[email protected]> Co-authored-by: Alex Schmitz <[email protected]> Co-authored-by: Chayim <[email protected]> Co-authored-by: Bar Shaul <[email protected]> Co-authored-by: CrimsonGlory <[email protected]> Co-authored-by: Raymond Yin <[email protected]> Co-authored-by: zach.lee <[email protected]> Co-authored-by: James R T <[email protected]> Co-authored-by: dvora-h <[email protected]> Co-authored-by: Marc Schöchlin <[email protected]> Co-authored-by: Nick Gerow <[email protected]> Co-authored-by: Igor Malinovskiy <[email protected]> Co-authored-by: Chayim I. Kirshen <[email protected]> Co-authored-by: Leibale Eidelman <[email protected]> Co-authored-by: Thiago Bellini Ribeiro <[email protected]> Co-authored-by: woutdenolf <[email protected]> Co-authored-by: shacharPash <[email protected]> Co-authored-by: Mirek Długosz <[email protected]> Co-authored-by: Oran Avraham <[email protected]> Co-authored-by: mzdehbashi-github <[email protected]> Co-authored-by: Tyler Hutcherson <[email protected]> Co-authored-by: Felipe Machado <[email protected]> Co-authored-by: AYMEN Mohammed <[email protected]> Co-authored-by: Marc Schöchlin <[email protected]> Co-authored-by: Avasam <[email protected]> Co-authored-by: Markus Gerstel <[email protected]> Co-authored-by: Kristján Valur Jónsson <[email protected]> Co-authored-by: Nick Gerow <[email protected]> Co-authored-by: Cristian Matache <[email protected]> Co-authored-by: Anurag Bandyopadhyay <[email protected]> Co-authored-by: Seongchuel Ahn <[email protected]> Co-authored-by: Alibi <[email protected]> Co-authored-by: Smit Parmar <[email protected]> Co-authored-by: Brad MacPhee <[email protected]> Co-authored-by: Shahar Lev <[email protected]> Co-authored-by: Vladimir Mihailenco <[email protected]> Co-authored-by: Kevin James <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: David Pacsuta <[email protected]> Co-authored-by: Rich Bowen <[email protected]> Co-authored-by: gmbnomis <[email protected]> Co-authored-by: Vivanov98 <[email protected]> Co-authored-by: Kosuke <[email protected]> Co-authored-by: Sergey Prokazov <[email protected]> Co-authored-by: jmcbailey <[email protected]> Co-authored-by: Galtozzy <[email protected]> Co-authored-by: Abhishek Kumar Sinha <[email protected]> Co-authored-by: Eom Taegyung "Iggy <[email protected]> Co-authored-by: Mehdi ABAAKOUK <[email protected]> Co-authored-by: Dongkeun Lee <[email protected]> Co-authored-by: woutdenolf <[email protected]> Co-authored-by: Kurt McKee <[email protected]> Co-authored-by: Juraj Páll <[email protected]> Co-authored-by: Joan Fontanals <[email protected]> Co-authored-by: Stanislav Zmiev <[email protected]> fix (#2566) Fix unlink in cluster pipeline (#2562) Fix issue 2540: Synchronise concurrent command calls to single-client mode. (#2568) Fix: tuple function cannot be passed more than one argument (#2573) Fix issue 2567: NoneType check before raising exception (#2569) Fix issue 2349: Let async HiredisParser finish parsing after a Connection.disconnect() (#2557) Fix issue with `pack_commands` returning an empty byte sequence (#2416) Fix #2581 UnixDomainSocketConnection' object has no attribute '_command_packer' (#2583) Fix #2581 UnixDomainSocketConnection' object has no attribute '_command_packer' . Fix for `lpop` and `rpop` return typing (#2590) Fixed CredentialsProvider examples (#2587) Fixed issue #2598 - make Document class subscriptable fix: replace async_timeout by asyncio.timeout (#2602) Fix behaviour of async PythonParser to match RedisParser as for issue #2349 (#2582) Fix (#2641) fix: do not use asyncio's timeout lib before 3.11.2 (#2659) Fix issue 2660: PytestUnraisableExceptionWarning from asycio client (#2669) Fixing cancelled async futures (#2666) Fix async (#2673) Fix memory leak caused by hiredis (#2693) (#2694) Fix incorrect usage of once flag in async Sentinel (#2718) Fix topk list example. (#2724) Fix `ClusterCommandProtocol` not itself being marked as a protocol (#2729) Fix potential race condition during disconnection (#2719) fix CI (#2748) fix parse_slowlog_get (#2732) fixes for issue #1128 fix create single_connection_client from url (#2752) Fix `xadd` allow non negative maxlen (#2739) Fix JSON.MERGE Summary (#2786) Fixed key error in parse_xinfo_stream (#2788) Fix dead weakref in sentinel connection causing ReferenceError (#2767) (#2771) Fix dead weakref in sentinel conn (#2767) fix redirects and some small cleanups (#2801) Fix type hint for retry_on_error in async cluster (#2804) Fix CI (#2809) Fix async client with resp3 (#2657) Fix `COMMAND` response in resp3 (redis 7+) (#2740) Fix protocol version checking (#2737) Fix parse resp3 dict response: don't use dict comprehension (#2757) Fixing asyncio import (#2759) fix (#2799) fix async tests (#2806) Fix socket garbage collection (#2859) Fixing doc builds (#2869) Fix a duplicate word in `CONTRIBUTING.md` (#2848) Fix timeout retrying on Redis pipeline execution (#2812) Fix type hints in SearchCommands (#2817)
closes #2624
closes #2579