@@ -339,12 +339,34 @@ def insert_if_latest_is_unfinalized(latest_blob, live_generation):
339339 @classmethod
340340 def process_bidi_write_object_grpc (cls , db , request_iterator , context ):
341341 """Process a BidiWriteObject streaming RPC, and yield a stream of responses."""
342+
343+ def abort_with_redirect_error (routing_token , handle = None , generation = None ):
344+ err = storage_pb2 .BidiWriteObjectRedirectedError ()
345+ if handle is not None :
346+ err .write_handle .handle = handle
347+ if generation is not None :
348+ err .generation = generation
349+ err .routing_token = routing_token
350+ detail = any_pb2 .Any ()
351+ detail .Pack (err )
352+ status_proto = status_pb2 .Status (
353+ code = grpc .StatusCode .ABORTED .value [0 ],
354+ message = grpc .StatusCode .ABORTED .value [1 ],
355+ details = [detail ],
356+ )
357+ context .abort_with_status (rpc_status .to_status (status_proto ))
358+
342359 # Many tests use a list as the request_iterator
343360 request_iterator = iter (request_iterator )
344361 upload , object_checksums , is_resumable , is_appendable = None , None , False , False
345362 appendable_metadata_in_first_response = False
346363 try :
347364 first_msg = next (request_iterator )
365+ return_redirect_token = testbench .common .get_return_redirect_token (
366+ db , context
367+ )
368+ if return_redirect_token is not None :
369+ abort_with_redirect_error (return_redirect_token )
348370 except StopIteration :
349371 # At least one message is required. This function raises.
350372 testbench .error .invalid ("Missing BidiWriteObjectRequest" , context )
@@ -402,18 +424,11 @@ def process_bidi_write_object_grpc(cls, db, request_iterator, context):
402424 testbench .common .get_return_write_handle_and_redirect_token (db , context )
403425 )
404426 if return_redirect_token :
405- err = storage_pb2 .BidiWriteObjectRedirectedError ()
406- err .generation = upload .metadata .generation
407- err .write_handle .handle = bytes (upload .upload_id , "utf-8" )
408- err .routing_token = return_redirect_token
409- detail = any_pb2 .Any ()
410- detail .Pack (err )
411- status_proto = status_pb2 .Status (
412- code = grpc .StatusCode .ABORTED .value [0 ],
413- message = grpc .StatusCode .ABORTED .value [1 ],
414- details = [detail ],
427+ abort_with_redirect_error (
428+ return_redirect_token ,
429+ handle = bytes (upload .upload_id , "utf-8" ),
430+ generation = upload .metadata .generation ,
415431 )
416- context .abort_with_status (rpc_status .to_status (status_proto ))
417432
418433 # Treat the rest of the first message as a data request, then keep
419434 # pulling from request_iterator
0 commit comments