
                             S r SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSK	J
r
  SS	K	Jr  SS
K	Jr  SSKJr  SSKJr     SS jr    SS jrg)z?Function for executing the tasks contained in a Task Iterator.
    )absolute_import)division)unicode_literals)errors)optimize_parameters_util)plurality_checkable_iterator)task_graph_executor)task_status)	task_util)log)
propertiesNc           	         Sn/ nU  H  nUb  Xl         Sn UR                  US9n UR                  Xr5        Uc  M5  UR                  b  UR                  UR                  5        UR                  c  Ml  / n
UR                   H  n[        UU
UUS9u  p[        X5      nM     M     XE4$ ! [         ax  n	U	n[        U[        R
                  5      (       dQ  U(       aJ  [        R                  " [        U	5      5        UR                  (       a  Sn Sn	A	UR                  Xr5        GM  e Sn	A	ff = f! UR                  Xr5        f = f)aW  Executes task objects sequentially.

Args:
  task_iterator (Iterable[task.Task]): An iterator for task objects.
  received_messages (Iterable[task.Message]): Messages sent to each
    task in task_iterator.
  task_status_queue (multiprocessing.Queue|None): Used by task to report it
    progress to a central location.
  continue_on_error (bool): If True, execution will continue even if
    errors occur.

Returns:
  Tuple[int, Iterable[task.Message]]: The first element in the tuple
    is the exit code and the second element is an iterable of messages
    emitted by the tasks in task_iterator.
r   N)task_status_queue   r   continue_on_error)received_messagesexecute	Exception
isinstancer   
FatalErrorr   errorstrchange_exit_codeexit_handlermessagesextendadditional_task_iterators_execute_tasks_sequentialmax)task_iteratorr   r   r   	exit_code#messages_from_current_task_iteratortasktask_execution_errortask_outputemessages_for_dependent_tasksadditional_task_iteratorexit_code_from_dependent_taskss                =lib/googlecloudsdk/command_lib/storage/tasks/task_executor.pyr   r   !   sO   ( )(*%d$0ALL3DLEk ,@')001E1EF,,8%'"&1&K&K
"%(,"3"3	5 	E& 6B	 'L= N 
	77A  -v/@/@AA		#a&  ) ,@ 	 ,@s0   B((
D*2AD%D-$D%%D**D--E c                 n   [         R                  " 5         [        R                  " U 5      n[        R
                  " UR                  5       S9  U(       a  [         R                  " 5       (       a  [        R                  " U[        R                  R                  R                  R                  5       [        R                  R                  R                  R                  5       UUS9R!                  5       nU$ ["        R$                  " X#5         ['        UUUS9u  pgSSS5        U$ ! , (       d  f       W$ = f)a\  Call appropriate executor.

Args:
  task_iterator: An iterator for task objects.
  parallelizable (boolean): Should tasks be executed in parallel.
  task_status_queue (multiprocessing.Queue|None): Used by task to report its
    progress to a central location.
  progress_manager_args (task_status.ProgressManagerArgs|None):
    Determines what type of progress indicator to display.
  continue_on_error (bool): Only applicable for sequential mode. If True,
    execution will continue even if errors occur.

Returns:
  An integer indicating the exit_code. Zero indicates no fatal errors were
    raised.
) is_estimated_multi_file_workload)max_process_countthread_countr   progress_manager_argsr   N)r   require_python_3_5r   PluralityCheckableIteratorr   detect_and_set_best_config	is_pluralshould_use_parallelismr	   TaskGraphExecutorr   VALUESstorageprocess_countGetIntr/   runr
   progress_managerr   )r!   parallelizabler   r0   r   !plurality_checkable_task_iteratorr"   _s           r+   execute_tasksr@   a   s    *  "==mL $55
+
5
5
7: 	88::#55)$++33AAHHJ&&..;;BBD+35
 69SU  
 
	%	%&7	O.
+--/li 
P
 
 
P	O
 
s   D%%
D4)NNF)FNNF)__doc__
__future__r   r   r   "googlecloudsdk.command_lib.storager   r   r   (googlecloudsdk.command_lib.storage.tasksr	   r
   r   googlecloudsdk.corer   r   r   r@        r+   <module>rH      sQ     '  ' 5 G K H @ > # * 150405=8B "'$((,$)	,rG   