U g=@sfddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl m Z ddlmZmZmZmZmZmZmZmZddlmZddlmZmZdZeekstdZeekstdZe edoe ed Z!d d Z"d d Z#ddZ$ddZ%GdddZ&e'ddZ(Gddde)Z*Gdddej+Z,ddZ-GdddZ.ddZ/dS) N)support)runtest INTERRUPTED CHILD_ERRORPROGRESS_MIN_TIMEformat_test_result TestResult is_failedTIMEOUT) setup_tests)format_duration print_warningg>@gr@setsidkillpgcCs&|jtkrdS|jr"t||r"dSdS)NTF)resultrZfailfastr )rnsr1/usr/lib/python3.8/test/libregrtest/runtest_mp.py must_stop&s  rcCs"t|\}}tjf|}||fSN)jsonloadstypesSimpleNamespace) worker_argsns_dict test_namerrrrparse_worker_args.s rcCspt|}||f}t|}tjftdddd|f}i}trFd|d<tj |ftj tj dt j dktj d|S) Nz-uz-mz test.regrtestz --worker-argsTZstart_new_sessionnt)stdoutstderrZuniversal_newlinesZ close_fdscwd)varsrdumpssys executablerZargs_from_interpreter_flagsUSE_PROCESS_GROUP subprocessPopenPIPEosnameZSAVEDCWD)Ztestnamerrrcmdkwrrrrun_test_in_subprocess4s,  r.cCs<t|t||}tttt|ddtddS)NTflushr)r rprintrr#listr$exit)rrrrrrrun_tests_workerMs  r4c@s0eZdZdZddZddZddZdd Zd S) MultiprocessIteratorz8A thread-safe iterator over tests for multiprocess mode.cCst|_||_dSr) threadingZLocklock tests_iter)selfr8rrr__init__^s zMultiprocessIterator.__init__cCs|Srrr9rrr__iter__bszMultiprocessIterator.__iter__c Cs6|j&|jdkrtt|jW5QRSQRXdSr)r7r8 StopIterationnextr;rrr__next__es zMultiprocessIterator.__next__c Cs|j d|_W5QRXdSr)r7r8r;rrrstopkszMultiprocessIterator.stopN)__name__ __module__ __qualname____doc__r:r<r?r@rrrrr5Zs r5MultiprocessResultzresult stdout stderr error_msgc@s eZdZdS) ExitThreadN)rArBrCrrrrrFssrFcsfeZdZfddZddZddZddZdd d Zd dZddZ ddZ ddZ ddZ Z S)TestWorkerProcesscsZt||_|j|_|j|_|j|_|j|_|j|_d|_ d|_ d|_ d|_ d|_ dS)NF)superr: worker_idpendingoutputrworker_timeouttimeoutregrtestcurrent_test_name start_time_popen_killed_stopped)r9rIZrunner __class__rrr:xs zTestWorkerProcess.__init__cCsd|jg}|r"|dn |d|j}|rF|d||j}|dk rt|j}|d|jj dt |fdd |S) NzTestWorkerProcess #runningZstoppedztest=zpid=ztime=z<%s> ) rIis_aliveappendrOrQtime monotonicrPextendpidr join)r9infotestpopendtrrr__repr__s   zTestWorkerProcess.__repr__c Cs|j}|dkrdS|jrdSd|_tr2|d}n|}td|tjddz"trft|jt j n| WnHt k rYn6t k r}ztd|d|W5d}~XYnXdS)NTz process groupzKill filer0zFailed to kill z: )rQrRr&r1r$r r*rr]signalSIGKILLkillProcessLookupErrorOSErrorr )r9raZwhatexcrrr_kills$  zTestWorkerProcess._killcCsd|_|dS)NT)rSrlr;rrrr@szTestWorkerProcess.stopNcCs*t|j}t|||d}t||||Sr)rZr[rPrrE)r9rZ error_typerr err_msg test_timerrrrmp_result_errorsz!TestWorkerProcess.mp_result_errorcCs(t|_||_zt||j}d|_||_Wnd|_YnXzz|j rX| t z(|j |j d\}}|j}|dk s~tWnRtjk r|j rt | d}d}}Yn0tk r|j rt YnX|}|}|||fWWS| YnXW5|d|_d|_XdS)NFrMrm)rZr[rPrOr.rrRrQ_wait_completedrSrlrFZ communicaterM returncodeAssertionErrorr'TimeoutExpiredrjstriprstrip)r9rrarr retcoderrr _run_processsH     zTestWorkerProcess._run_processc Cs||\}}}|dkr(||t||Sd}|dkr>d|}nd|d\}}}|}|s`d}nBzt|}t|}Wn*tk r}z d|}W5d}~XYnX|dk r||t |||St ||||S)Nrz Exit code %s zFailed to parse worker stdoutzFailed to parse worker JSON: %s) ryrpr rpartitionrwrrr ExceptionrrE) r9rrxrr rn_rrkrrr_runtests,   zTestWorkerProcess._runtestcCs|jszZzt|j}Wntk r0YWqYnX||}|jd|ft|j|j r^WqWqt k rxYqYqt k r|jdt fYqYqXqdS)NFT)rSr>rJr=r~rKZputrrrrF BaseException traceback format_exc)r9r mp_resultrrrruns  zTestWorkerProcess.runc Cst|j}|j|jz|tWnFtjtfk rn}z"t d|dt td|W5d}~XYnXdS)NzFailed to wait for z completion (timeout=z): ) rQrcloser wait JOIN_TIMEOUTr'rurjr r )r9rarkrrrrr's  z!TestWorkerProcess._wait_completedcCsd|d|sq`t|}|jd|dt||tkrtd|dt|q`qdS)Ng?z Waiting for z thread for zFailed to join z in ) r^rXrZr[rNlogr rr )r9rPrbrrr wait_stopped6s  zTestWorkerProcess.wait_stopped)rmrmN)rArBrCr:rcrlr@rpryr~rrrr __classcell__rrrTrrGws  ;rGcCsNg}|D]@}|j}|sqt|j}|tkrd|t|f}||q|S)Nz%s (%s))rOrZr[rPrr rY)workersrVworkerrOrbtextrrr get_runningNs rc@sDeZdZddZddZddZddZd d Zd d Zd dZ dS)MultiprocessTestRunnercCsj||_|jj|_|j|_t|_t|jj|_|jj dk rZt |jj d|jj d|_ nd|_ d|_ dS)Ng?i,) rNrrqueueZQueuerKr5ZtestsrJrMminrLr)r9rNrrrr:\s     zMultiprocessTestRunner.__init__cs|fddtdjjdD_dtjd}jjrZ|dtjjtjf7}|jD] }| qjdS)Ncsg|]}t|qSr)rG).0indexr;rr msz8MultiprocessTestRunner.start_workers..zRun tests in parallel using z child processesz" (timeout: %s, worker timeout: %s)) rangerZuse_mprlenrMr rLrstart)r9msgrrr;r start_workersls    z$MultiprocessTestRunner.start_workerscCs6t}|jD] }|q|jD]}||q"dSr)rZr[rr@r)r9rPrrrr stop_workersxs    z#MultiprocessTestRunner.stop_workerscCstdd|jDs>z|jjddWStjk r<YdSX|jjdk }t}|r`t j t ddz|jj|dWStjk rYnXt |j}|rN|jj sN|dd|qNdS) Ncss|]}|VqdSr)rX)rrrrr sz5MultiprocessTestRunner._get_result..rrqT)r3z running: %s, )anyrrKgetrZEmptyrrMPROGRESS_UPDATE faulthandlerZdump_traceback_laterMAIN_PROCESS_TIMEOUTrpgorr^)r9Zuse_faulthandlerrMrVrrr _get_results$   z"MultiprocessTestRunner._get_resultcCs|j}t|}|jdk r(|d|j7}n$|jtkrL|jjsL|dt|j7}t|j }|rt|jjst|dd |7}|j |j |dS)Nz (%s)z -- running: %sr)rrZ error_msgrorrrr rrr^rNZdisplay_progress test_index)r9rrrrVrrrdisplay_results   z%MultiprocessTestRunner.display_resultcCs|dr"|d}td|dS|jd7_|d}|j|j|||jrdt|jdd|jr|j j st|jt jddt |j|j rdSdS)Nrrzregrtest worker thread failed: Tr/rdF) r rrNZaccumulate_resultrrrr1r rrr$r)r9itemrrrrr_process_results z&MultiprocessTestRunner._process_resultcCs|d|_zPz(| }|dkr$q6| |}|rq6qWn"t k rZt d|j _YnXW5|jjdk rtt|j|XdS)NrT)rrrrMrZcancel_dump_traceback_laterrJr@rrrKeyboardInterruptr1rNZ interrupted)r9rr@rrr run_testss    z MultiprocessTestRunner.run_testsN) rArBrCr:rrrrrrrrrrr[s rcCst|dSr)rr)rNrrrrun_tests_multiprocesssr)0 collectionsrrr*rrfr'r$r6rZrrr`rZtest.libregrtest.runtestrrrrrrr r Ztest.libregrtest.setupr Ztest.libregrtest.utilsr r rrtrrhasattrr&rrr.r4r5 namedtuplerEr|rFZThreadrGrrrrrrrsF (    X |