mirror of
https://github.com/wassname/ray.git
synced 2026-06-28 00:29:38 +08:00
Increase the number of unique bits for actors to avoid handle collisions (#12894)
This commit is contained in:
@@ -142,7 +142,8 @@ class WorkerCrashedError(RayError):
|
||||
"""Indicates that the worker died unexpectedly while executing a task."""
|
||||
|
||||
def __str__(self):
|
||||
return "The worker died unexpectedly while executing this task."
|
||||
return ("The worker died unexpectedly while executing this task. "
|
||||
"Check python-core-worker-*.log files for more information.")
|
||||
|
||||
|
||||
class RayActorError(RayError):
|
||||
@@ -153,7 +154,8 @@ class RayActorError(RayError):
|
||||
"""
|
||||
|
||||
def __str__(self):
|
||||
return "The actor died unexpectedly before finishing this task."
|
||||
return ("The actor died unexpectedly before finishing this task. "
|
||||
"Check python-core-worker-*.log files for more information.")
|
||||
|
||||
|
||||
class RaySystemError(RayError):
|
||||
|
||||
@@ -12,6 +12,7 @@ import hashlib
|
||||
import cython
|
||||
import inspect
|
||||
import uuid
|
||||
import ray.ray_constants as ray_constants
|
||||
|
||||
|
||||
ctypedef object (*FunctionDescriptor_from_cpp)(const CFunctionDescriptor &)
|
||||
@@ -188,7 +189,8 @@ cdef class PythonFunctionDescriptor(FunctionDescriptor):
|
||||
function_name = function.__name__
|
||||
class_name = ""
|
||||
|
||||
pickled_function_hash = hashlib.sha1(pickled_function).hexdigest()
|
||||
pickled_function_hash = hashlib.shake_128(pickled_function).hexdigest(
|
||||
ray_constants.ID_SIZE)
|
||||
|
||||
return cls(module_name, function_name, class_name,
|
||||
pickled_function_hash)
|
||||
@@ -208,7 +210,10 @@ cdef class PythonFunctionDescriptor(FunctionDescriptor):
|
||||
module_name = target_class.__module__
|
||||
class_name = target_class.__name__
|
||||
# Use a random uuid as function hash to solve actor name conflict.
|
||||
return cls(module_name, "__init__", class_name, str(uuid.uuid4()))
|
||||
return cls(
|
||||
module_name, "__init__", class_name,
|
||||
hashlib.shake_128(
|
||||
uuid.uuid4().bytes).hexdigest(ray_constants.ID_SIZE))
|
||||
|
||||
@property
|
||||
def module_name(self):
|
||||
@@ -268,14 +273,14 @@ cdef class PythonFunctionDescriptor(FunctionDescriptor):
|
||||
Returns:
|
||||
ray.ObjectRef to represent the function descriptor.
|
||||
"""
|
||||
function_id_hash = hashlib.sha1()
|
||||
function_id_hash = hashlib.shake_128()
|
||||
# Include the function module and name in the hash.
|
||||
function_id_hash.update(self.typed_descriptor.ModuleName())
|
||||
function_id_hash.update(self.typed_descriptor.FunctionName())
|
||||
function_id_hash.update(self.typed_descriptor.ClassName())
|
||||
function_id_hash.update(self.typed_descriptor.FunctionHash())
|
||||
# Compute the function ID.
|
||||
function_id = function_id_hash.digest()
|
||||
function_id = function_id_hash.digest(ray_constants.ID_SIZE)
|
||||
return ray.FunctionID(function_id)
|
||||
|
||||
def is_actor_method(self):
|
||||
|
||||
@@ -31,7 +31,7 @@ def check_id(b, size=kUniqueIDSize):
|
||||
raise TypeError("Unsupported type: " + str(type(b)))
|
||||
if len(b) != size:
|
||||
raise ValueError("ID string needs to have length " +
|
||||
str(size))
|
||||
str(size) + ", got " + str(len(b)))
|
||||
|
||||
|
||||
cdef extern from "ray/common/constants.h" nogil:
|
||||
|
||||
@@ -22,7 +22,7 @@ from ray.ray_logging import setup_component_logger
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# The groups are worker id, job id, and pid.
|
||||
JOB_LOG_PATTERN = re.compile(".*worker-([0-9a-f]{40})-(\d+)-(\d+)")
|
||||
JOB_LOG_PATTERN = re.compile(".*worker-([0-9a-f]+)-(\d+)-(\d+)")
|
||||
|
||||
|
||||
class LogFileInfo:
|
||||
|
||||
@@ -19,7 +19,7 @@ def env_bool(key, default):
|
||||
return default
|
||||
|
||||
|
||||
ID_SIZE = 20
|
||||
ID_SIZE = 28
|
||||
|
||||
# The default maximum number of bytes to allocate to the object store unless
|
||||
# overridden by the user.
|
||||
|
||||
@@ -74,7 +74,8 @@ def _try_to_compute_deterministic_class_id(cls, depth=5):
|
||||
new_class_id = pickle.dumps(pickle.loads(class_id))
|
||||
if new_class_id == class_id:
|
||||
# We appear to have reached a fix point, so use this as the ID.
|
||||
return hashlib.sha1(new_class_id).digest()
|
||||
return hashlib.shake_128(new_class_id).digest(
|
||||
ray_constants.ID_SIZE)
|
||||
class_id = new_class_id
|
||||
|
||||
# We have not reached a fixed point, so we may end up with a different
|
||||
@@ -82,7 +83,7 @@ def _try_to_compute_deterministic_class_id(cls, depth=5):
|
||||
# same class definition being exported many many times.
|
||||
logger.warning(
|
||||
f"WARNING: Could not produce a deterministic class ID for class {cls}")
|
||||
return hashlib.sha1(new_class_id).digest()
|
||||
return hashlib.shake_128(new_class_id).digest(ray_constants.ID_SIZE)
|
||||
|
||||
|
||||
def object_ref_deserializer(reduced_obj_ref, owner_address):
|
||||
|
||||
@@ -284,14 +284,14 @@ def test_workers(shutdown_only):
|
||||
|
||||
|
||||
def test_object_ref_properties():
|
||||
id_bytes = b"00112233445566778899"
|
||||
id_bytes = b"0011223344556677889900001111"
|
||||
object_ref = ray.ObjectRef(id_bytes)
|
||||
assert object_ref.binary() == id_bytes
|
||||
object_ref = ray.ObjectRef.nil()
|
||||
assert object_ref.is_nil()
|
||||
with pytest.raises(ValueError, match=r".*needs to have length 20.*"):
|
||||
with pytest.raises(ValueError, match=r".*needs to have length.*"):
|
||||
ray.ObjectRef(id_bytes + b"1234")
|
||||
with pytest.raises(ValueError, match=r".*needs to have length 20.*"):
|
||||
with pytest.raises(ValueError, match=r".*needs to have length.*"):
|
||||
ray.ObjectRef(b"0123456789")
|
||||
object_ref = ray.ObjectRef.from_random()
|
||||
assert not object_ref.is_nil()
|
||||
|
||||
@@ -741,10 +741,10 @@ ray.get(main_wait.release.remote())
|
||||
driver1_out_split = driver1_out.split("\n")
|
||||
driver2_out_split = driver2_out.split("\n")
|
||||
|
||||
assert driver1_out_split[0][-1] == "1"
|
||||
assert driver1_out_split[1][-1] == "2"
|
||||
assert driver2_out_split[0][-1] == "3"
|
||||
assert driver2_out_split[1][-1] == "4"
|
||||
assert driver1_out_split[0][-1] == "1", driver1_out_split
|
||||
assert driver1_out_split[1][-1] == "2", driver1_out_split
|
||||
assert driver2_out_split[0][-1] == "3", driver2_out_split
|
||||
assert driver2_out_split[1][-1] == "4", driver2_out_split
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
+2
-2
@@ -50,9 +50,9 @@ def get_ray_temp_dir():
|
||||
|
||||
|
||||
def _random_string():
|
||||
id_hash = hashlib.sha1()
|
||||
id_hash = hashlib.shake_128()
|
||||
id_hash.update(uuid.uuid4().bytes)
|
||||
id_bytes = id_hash.digest()
|
||||
id_bytes = id_hash.digest(ray_constants.ID_SIZE)
|
||||
assert len(id_bytes) == ray_constants.ID_SIZE
|
||||
return id_bytes
|
||||
|
||||
|
||||
@@ -345,7 +345,8 @@ class Worker:
|
||||
# actually run the function locally.
|
||||
pickled_function = pickle.dumps(function)
|
||||
|
||||
function_to_run_id = hashlib.sha1(pickled_function).digest()
|
||||
function_to_run_id = hashlib.shake_128(pickled_function).digest(
|
||||
ray_constants.ID_SIZE)
|
||||
key = b"FunctionsToRun:" + function_to_run_id
|
||||
# First run the function on the driver.
|
||||
# We always run the task locally.
|
||||
|
||||
Reference in New Issue
Block a user