mirror of
https://github.com/wassname/ray.git
synced 2026-06-27 22:53:20 +08:00
62 lines
2.0 KiB
Python
62 lines
2.0 KiB
Python
import errno
|
|
import io
|
|
import platform
|
|
import socket
|
|
import sys
|
|
|
|
|
|
def patch_redis_empty_recv():
|
|
"""On Windows, socket disconnect result in errors rather than empty reads.
|
|
redis-py does not handle these errors correctly.
|
|
This patch translates connection resets to empty reads as in POSIX.
|
|
"""
|
|
assert sys.platform == "win32"
|
|
import redis
|
|
|
|
def redis_recv(sock, *args, **kwargs):
|
|
result = b""
|
|
try:
|
|
result = redis._compat.recv(sock, *args, **kwargs)
|
|
except socket.error as ex:
|
|
if ex.errno not in [errno.ECONNRESET, errno.ECONNREFUSED]:
|
|
raise
|
|
return result
|
|
|
|
redis.connection.recv = redis_recv
|
|
|
|
|
|
def patch_psutil():
|
|
"""WSL's /proc/meminfo has an inconsistency where it
|
|
nondeterministically omits a space after colons (after "SwapFree:"
|
|
in my case).
|
|
psutil then splits on spaces and then parses the wrong field,
|
|
crashing on the 'int(fields[1])' expression in
|
|
psutil._pslinux.virtual_memory().
|
|
Workaround: We ensure there is a space following each colon.
|
|
"""
|
|
assert (platform.system() == "Linux"
|
|
and "Microsoft".lower() in platform.release().lower())
|
|
|
|
try:
|
|
import psutil._pslinux
|
|
except ImportError:
|
|
psutil = None
|
|
psutil_open_binary = None
|
|
if psutil:
|
|
try:
|
|
psutil_open_binary = psutil._pslinux.open_binary
|
|
except AttributeError:
|
|
pass
|
|
# Only patch it if it doesn't seem to have been patched already
|
|
if psutil_open_binary and psutil_open_binary.__name__ == "open_binary":
|
|
|
|
def psutil_open_binary_patched(fname, *args, **kwargs):
|
|
f = psutil_open_binary(fname, *args, **kwargs)
|
|
if fname == "/proc/meminfo":
|
|
with f:
|
|
# Make sure there's a space after colons
|
|
return io.BytesIO(f.read().replace(b":", b": "))
|
|
return f
|
|
|
|
psutil._pslinux.open_binary = psutil_open_binary_patched
|