
                             d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 dd	l	mZ dd
l	mZ ddlmZ ddlmZ 	 	 	 ddZ	 	 	 	 ddZy)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                 h   d}g }| D ]  }|||_         d}	 |j                  |      }	 |j                  ||       |7|j                  |j                  |j                         |j                  kg }
|j                  D ]   }t        ||
||      \  }}
t        ||      }"  ||fS # t        $ rh}	|	}t        |t        j
                        sF|rDt        j                  t        |	             |j                  rd}Y d}	~	|j                  ||        d}	~	ww xY w# |j                  ||       w xY w)aq  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   !   s_   ( )(*%d$0dALL3DLEk ,.?@')001E1EF,,8%'"&1&K&K
"%(,"3"3	5 	E&(D 6	B	 'L= N 
7	77A  -v/@/@A		#a&  ) ,.?@ 	 ,.?@s0   B))	D2A
D<DDDDD1c                 Z   t        j                          t        j                  |       }t	        j
                  |j                                |rt        j                         rt        j                  |t        j                  j                  j                  j                         t        j                  j                  j                  j                         ||      j!                         }|S t#        j$                  ||      5  t'        |||      \  }}ddd       |S # 1 sw Y   S xY w)av  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  
 
	%	%&79N	O.
+--/li 
P
 
 
P
 
s   D  D*)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   