$Fi$"dZddlZddlZddlZddlZddlZddlmZmZmZddl m Z m Z m Z ddl mZmZddlmZmZddlmZdd lmZdd lmZdd lmZdd lmZd dlmZmZm Z m!Z!m"Z"m#Z#d dl$m%Z%d dl&m'Z'm(Z(m)Z)e'GddeZ*dS)z- This module contains RequestProcessor class N)datetime timedeltatimezone)ThreadRLockcurrent_thread)CallableAny)QueueEmpty)OperationalError) AutoTracer)Common) DecisionMaker)StatisticsSender) session_scopesetup_database RequestResultcleanup_old_datarestore_databaseis_malformed_database)SSAError) singleton url_splitswitch_schedstatsceZdZdZdZdZdfd ZedZde fdZ dd Z dd Z dd Z d ed efdZddefdZdZdZeded efdZdZdZdZde d dfdZdZdZxZS) RequestProcessorz^ SSA Request processor implementation. Only one instance is allowed to be created dNcttjd|_|jdt td|r|n t|_ t|_ t|j |_ t|_t!|j |_t%|_g|_||t/jt.j|jt/jt.j|jdS)N req_processorzProcessor enabled: %sTenabled)engine)super__init__logging getLoggerloggerinfo __package__rrr&r_lockrdecision_makerrsenderr auto_tracerr _queue_bufferstart_background_routinestart_flush_workersignalSIGTERMshutdown_handlerSIGINT)selfr& __class__s L/opt/cloudlinux/venv/lib64/python3.11/site-packages/ssa/modules/processor.pyr(zRequestProcessor.__init__-s '88  0+>>>$'''' &>,T[999(A(A$+(N(NOOO ((n*,,14999K$$L&((-t555OOD$@AAAK$$G&((-t555OOD$4555K$$J&((-t555"__T-@AAFK$$D&((-t555%T[111OODOV<<<&d3333""2&&&&**4;777A 8r=actionc  ||S#t$rZtj\}}}|jdt |||dt jiYdSwxYw)zACall requested Callable with given args and capture any exceptionz%s failed with exception %s, %sorig_traceback)extraN) Exceptionsysexc_infor+ exceptionrF traceback format_exc)r:raargsetev_s r<r[zRequestProcessor._safe_execs T64=  T T T IBA K ! !"C"%f++r2)99;O;Q;Q(R " T T T T T T TsA A+*A+to_sleepc|jdtj|t j|dS)zP Log and sleep given number of seconds or 15 minutes by default z%[%s] Routine thread sleeping for (%s)N)r+r,rrPtimesleep)r:rps r<r^zRequestProcessor._simple_sleepsE @')). : : : 8r=ctdt|z }|t|dS)zF Sleep the number of minutes remaining till next hour r)hours)minutesN)r total_secondsr^int)r: start_minute sleep_fors r<r_z&RequestProcessor._sleep_till_next_hoursYQ''') +"+"+""#0=??  3y>>*****r=cd|j5t|ddddS#1swxYwYdSN)r.r)r:r&s r<r\z%RequestProcessor.restore_db_with_locks| Z % % V $ $ $ % % % % % % % % % % % % % % % % % %s %)) timestampcJtj|tjjS)zN Takes an hour of a day, to which the given timestamp belongs )r fromtimestamprrXrZ)r}s r<get_interval_forz!RequestProcessor.get_interval_fors %i>>CCr=c@ |j}|j|t |j|jkr!||jg|_n*#t$r|j dYnwxYw)zK Continuously flush queued request results to the database TzFlush worker failed) r2getr3appendlen BUFFER_SIZE_flush_objectsrer+rhr:objs r<rTzRequestProcessor.flush_workers = =koo'' ##C(((t|$$(888'' 555#%DL = = = %%&;<<<<< = =sA1A55$BBc|jr[ ||jn*#t$r|jdYnwxYwg|_dS#g|_wxYwdS)zq Flush all remaining objects even if less than BUFFER_SIZE. Should be called once a day. zFlush remaining objects failedN)r3rrer+rhr@s r<r]z(RequestProcessor.flush_remaining_objectss < " "##DL1111 H H H %%&FGGGGG H " r !!!!  " "s&$A$A A A  A A ct|jD]} t|j5}||dddn #1swxYwYdS#t $rU}dt |vr9|jd|dz|jtj dnYd}~d}~wwxYwdS)Nzdatabase is lockedz-Database is locked, retrying attempt %s/%s...rg?) rangeDB_ACCESS_RETRIESrr&bulk_save_objectsr rFr+warningrrrs)r:objectsattemptdbrGs r<rzRequestProcessor._flush_objectssT344  G "4;//22((111222222222222222#   '3q6611K''(WY`cdYdfjf|}}}JsOOOO$OOOO   s;AA AA AA A B;&A B66B;datac |s.|jdtjdS|d}||r|jd|dSt|\}}t|||d|d|d|j k|d|d|d |d  }|j |dS) z, Process given request data z [%s] has empty request, skippingNurlz %s ignoredr}durationhitting_limitsthrottled_timeio_throttled_time wordpress) domainpathr}ris_slow_requestrrrr) r+r,rrPr is_ignoreddebugrrrAr2put)r:rrrurirequests r<handlezRequestProcessor.handles  K  ?AQAQAV W W W Fhhuoo ??3    K  lC 0 0 0 Fnn ;'*% ,t/GG 01 01"#67;'          r=cD|jd|d ||n*#t$r|jdYnwxYwt jddS#t jdwxYw)zQ Handle shutdown signals to flush remaining objects before exit. zReceived shutdown signal z+, flushing queue and buffer before shutdownz1Failed to flush remaining objects during shutdownrN)r+r,_drain_queue_to_bufferr]rerhrfexit)r:signumframes r<r8z!RequestProcessor.shutdown_handlers hVhhhiii   ' ' ) ) )  ( ( * * * * W W W K ! !"U V V V V V W HQKKKKKCHQKKKKs)(A B $A0-B /A00B Bc|jsa |j}|j|n#t $rYdSwxYw|j_dSdS)zC Drain all remaining objects from queue to buffer. N)r2empty get_nowaitr3rr rs r<rz'RequestProcessor._drain_queue_to_buffers+##%%  k,,.. ##C((((     +##%%     s3A AAr|)rIN)ro)__name__ __module__ __qualname____doc__rrr(propertyrAdictrHr4r5rNr r r[rxr^r_r\ staticmethodrrTr]rrr8r __classcell__)r;s@r<rr#s K<<<<<<*00X0EEEEE9999>>>>&8&8&8&8PTTSTTTTc+++%%%DCDCDDD\D = = = " " "   !4!D!!!!6          r=r)+rr)rfrrr6rirrr threadingrrrtypingr r queuer r sqlalchemy.excr autotracerrcommonrr/r stat_senderrrrrrrrrinternal.exceptionsrinternal.utilsrrrrr=r<rs 22222222223333333333 ++++++""""""))))))))))))xxxxxxxxxxxxxxxx****** eeeeevee eeer=