@@ -87,9 +87,11 @@ from ray.includes.common cimport (
8787 CRayStatus,
8888 CActorTableData,
8989 CErrorTableData,
90+ CFallbackOption,
9091 CGcsClientOptions,
9192 CGcsNodeInfo,
9293 CJobTableData,
94+ CLabelSelector,
9395 CLogBatch,
9496 CTaskArg,
9597 CTaskArgByReference,
@@ -835,12 +837,13 @@ cdef int prepare_labels(
835837
836838cdef int prepare_label_selector(
837839 dict label_selector_dict,
838- unordered_map[c_string, c_string] * label_selector) except - 1 :
840+ CLabelSelector * c_label_selector) except - 1 :
841+
842+ c_label_selector[0 ] = CLabelSelector()
839843
840844 if label_selector_dict is None :
841845 return 0
842846
843- label_selector[0 ].reserve(len (label_selector_dict))
844847 for key, value in label_selector_dict.items():
845848 if not isinstance (key, str ):
846849 raise ValueError (f" Label selector key type must be string, but got {type(key)}" )
@@ -853,10 +856,39 @@ cdef int prepare_label_selector(
853856 inner = value[value.index(" (" )+ 1 :- 1 ].strip()
854857 if not inner:
855858 raise ValueError (f" No values provided for Label Selector '{value[:value.index('(')]}' operator on key '{key}'." )
856- label_selector[0 ][key.encode(" utf-8" )] = value.encode(" utf-8" )
859+ # Add key-value constraint to the LabelSelector object.
860+ c_label_selector[0 ].AddConstraint(key.encode(" utf-8" ), value.encode(" utf-8" ))
857861
858862 return 0
859863
864+ cdef int prepare_fallback_strategy(
865+ list fallback_strategy,
866+ c_vector[CFallbackOption] * fallback_strategy_vector) except - 1 :
867+
868+ cdef dict label_selector_dict
869+ cdef CLabelSelector c_label_selector
870+
871+ if fallback_strategy is None :
872+ return 0
873+
874+ for strategy_dict in fallback_strategy:
875+ if not isinstance (strategy_dict, dict ):
876+ raise ValueError (
877+ " Fallback strategy must be a list of dicts, "
878+ f" but got list containing {type(strategy_dict)}" )
879+
880+ label_selector_dict = strategy_dict.get(" label_selector" )
881+
882+ if label_selector_dict is not None and not isinstance (label_selector_dict, dict ):
883+ raise ValueError (" Invalid fallback strategy element: invalid 'label_selector'." )
884+
885+ prepare_label_selector(label_selector_dict, & c_label_selector)
886+
887+ fallback_strategy_vector.push_back(
888+ CFallbackOption(c_label_selector)
889+ )
890+
891+ return 0
860892
861893cdef int prepare_resources(
862894 dict resource_dict,
@@ -3644,11 +3676,13 @@ cdef class CoreWorker:
36443676 int64_t generator_backpressure_num_objects ,
36453677 c_bool enable_task_events ,
36463678 labels ,
3647- label_selector ):
3679+ label_selector ,
3680+ fallback_strategy ):
36483681 cdef:
36493682 unordered_map[c_string, double ] c_resources
36503683 unordered_map[c_string, c_string] c_labels
3651- unordered_map[c_string, c_string] c_label_selector
3684+ CLabelSelector c_label_selector
3685+ c_vector[CFallbackOption] c_fallback_strategy
36523686 CRayFunction ray_function
36533687 CTaskOptions task_options
36543688 c_vector[unique_ptr[CTaskArg]] args_vector
@@ -3675,6 +3709,7 @@ cdef class CoreWorker:
36753709 prepare_resources(resources, & c_resources)
36763710 prepare_labels(labels, & c_labels)
36773711 prepare_label_selector(label_selector, & c_label_selector)
3712+ prepare_fallback_strategy(fallback_strategy, & c_fallback_strategy)
36783713 ray_function = CRayFunction(
36793714 language.lang, function_descriptor.descriptor)
36803715 prepare_args_and_increment_put_refs(
@@ -3691,7 +3726,8 @@ cdef class CoreWorker:
36913726 c_label_selector,
36923727 # `tensor_transport` is currently only supported in Ray Actor tasks.
36933728 # For Ray tasks, we always use `OBJECT_STORE`.
3694- TENSOR_TRANSPORT_OBJECT_STORE)
3729+ TENSOR_TRANSPORT_OBJECT_STORE,
3730+ c_fallback_strategy)
36953731
36963732 current_c_task_id = current_task.native()
36973733
@@ -3742,6 +3778,7 @@ cdef class CoreWorker:
37423778 label_selector ,
37433779 c_bool allow_out_of_order_execution ,
37443780 c_bool enable_tensor_transport ,
3781+ fallback_strategy ,
37453782 ):
37463783 cdef:
37473784 CRayFunction ray_function
@@ -3755,7 +3792,8 @@ cdef class CoreWorker:
37553792 c_vector[CObjectID] incremented_put_arg_ids
37563793 optional[c_bool] is_detached_optional = nullopt
37573794 unordered_map[c_string, c_string] c_labels
3758- unordered_map[c_string, c_string] c_label_selector
3795+ CLabelSelector c_label_selector
3796+ c_vector[CFallbackOption] c_fallback_strategy
37593797 c_string call_site
37603798
37613799 self .python_scheduling_strategy_to_c(
@@ -3770,6 +3808,7 @@ cdef class CoreWorker:
37703808 prepare_resources(placement_resources, & c_placement_resources)
37713809 prepare_labels(labels, & c_labels)
37723810 prepare_label_selector(label_selector, & c_label_selector)
3811+ prepare_fallback_strategy(fallback_strategy, & c_fallback_strategy)
37733812 ray_function = CRayFunction(
37743813 language.lang, function_descriptor.descriptor)
37753814 prepare_args_and_increment_put_refs(
@@ -3799,7 +3838,8 @@ cdef class CoreWorker:
37993838 enable_tensor_transport,
38003839 enable_task_events,
38013840 c_labels,
3802- c_label_selector),
3841+ c_label_selector,
3842+ c_fallback_strategy),
38033843 extension_data,
38043844 call_site,
38053845 & c_actor_id,
@@ -3914,9 +3954,10 @@ cdef class CoreWorker:
39143954 c_string serialized_retry_exception_allowlist
39153955 c_string serialized_runtime_env = b" {}"
39163956 unordered_map[c_string, c_string] c_labels
3917- unordered_map[c_string, c_string] c_label_selector
3957+ CLabelSelector c_label_selector
39183958 c_string call_site
39193959 CTensorTransport c_tensor_transport_val
3960+ c_vector[CFallbackOption] c_fallback_strategy
39203961
39213962 serialized_retry_exception_allowlist = serialize_retry_exception_allowlist(
39223963 retry_exception_allowlist,
@@ -3953,7 +3994,8 @@ cdef class CoreWorker:
39533994 enable_task_events,
39543995 c_labels,
39553996 c_label_selector,
3956- c_tensor_transport_val),
3997+ c_tensor_transport_val,
3998+ c_fallback_strategy),
39573999 max_retries,
39584000 retry_exceptions,
39594001 serialized_retry_exception_allowlist,
0 commit comments