Ë
    {Ìj”  ã                   ó0  — d Z ddlZddlZddlZddlZddlZddlmZmZ ddl	m
Z
  ej                  d«      Z ej                  «       › d ej                  «       j                  dd › �ZdZd	Zd
edefd„Zd
eddfd„Zd
edefd„Zd
edeg ed   f   ddfd„Zy)uF  
Ã‰lection d'un worker Â« leader Â» pour les tÃ¢ches de fond.

Avec plusieurs workers uvicorn, chacun exÃ©cuterait le nettoyage RGPD, le backup
et l'organizer en double. Un verrou en base (bail de 60 s renouvelÃ© toutes les
20 s) garantit qu'un seul worker les exÃ©cute ; si le leader tombe, un autre
reprend automatiquement.
é    N)Ú	AwaitableÚCallable)Úget_dbzmeeconic.leaderú-é   g      N@g      4@ÚnameÚreturnc           	      óL  — t        j                   «       }t        «       5 }|j                  d| t        |t        z   f«      j
                  }|r
	 d d d «       y|j                  dt        |t        z   | t        |f«      j
                  }t        |«      cd d d «       S # 1 sw Y   y xY w)NzHINSERT IGNORE INTO leader_locks (name, owner, expires_at) VALUES (?,?,?)TzXUPDATE leader_locks SET owner=?, expires_at=? WHERE name=? AND (owner=? OR expires_at<?))Útimer   ÚexecuteÚ_OWNERÚ_LEASEÚrowcountÚbool)r   ÚnowÚconnÚcreatedÚtakens        ú&/var/www/photos/backend/core/leader.pyÚ_try_acquirer      sš   € Ü
�)‰)‹+€Cô 
‹ð 	�TØ—,‘,ØVØ”6˜3¤™<Ð(ó*ç*2©(ð 	ñ Ø÷	ð 	ð —‘ØfÜ�Sœ6‘\ 4¬°Ð5ó7ç7?±xð 	ô �E‹{÷	÷ 	ò 	ús   Ÿ.BÁ:BÂB#c                 ó²   — 	 t        «       5 }|j                  d| t        f«       |j                  «        d d d «       y # 1 sw Y   y xY w# t        $ r Y y w xY w)Nz1DELETE FROM leader_locks WHERE name=? AND owner=?)r   r   r   ÚcommitÚ	Exception)r   r   s     r   Ú_releaser   )   sS   € ðÜ‹Xð 	˜Ø�L‰LÐLÈtÔU[ÈnÔ]Ø�K‰KŒM÷	÷ 	ñ 	ûô ò Ùðús+   ‚
A
 Œ)>µA
 ¾AÁA
 ÁA
 Á
	AÁAc                 ó  — 	 t        «       5 }|j                  d| f«      j                  «       }d d d «       t        xr( |d   t        k(  xr |d   t        j
                  «       kD  «      S # 1 sw Y   Œ>xY w# t        $ r Y yw xY w)Nz7SELECT owner, expires_at FROM leader_locks WHERE name=?ÚownerÚ
expires_atF)r   r   Úfetchoner   r   r   r   )r   r   Úrows      r   Ú	is_leaderr    2   s†   € ðÜ‹Xð 	n˜Ø—,‘,ÐXÐ[_ÐZaÓb×kÑkÓmˆC÷	nä�CÒV˜C ™L¬FÑ2ÒV°s¸<Ñ7HÌ4Ï9É9Ë;Ñ7VÓWÐW÷	nð 	nûô ò Ùðús'   ‚
A7 Œ"A+®<A7 Á+A4Á0A7 Á7	BÂBÚfactoryc              ƒ   ó¸  K  — d}	 	 	 t        j                  t        | «      ƒ d{  –—† }|rŸ|�|j                  «       r�|�U|j                  «       rE|j                  «       s5|j                  «       r%t        j                  d| |j                  «       «       t        j                   |«       d| › �¬«      }t        j                  d| «       n:|s8|�6|j                  «       s&|j                  «        t        j                  d	| «       t        j                  t        «      ƒ d{  –—†  �Œ!7 �Œ# t        $ r$}t        j                  d| |«       d}Y d}~�Œ)d}~ww xY w7 Œ9# t         j                  $ rg |�@|j                  «       s0|j                  «        t        j                   |d¬
«      ƒ d{  –—†7   t        j                  t"        | «      ƒ d{  –—†7   ‚ w xY w­w)uB   ExÃ©cute `factory()` tant que ce worker dÃ©tient le verrou `name`.NTzElection '%s' failed: %sFu.   Task %s stopped by an error: %s â€” restartingzbg-)r   u    Ce worker est leader de Â« %s Â»u   Lock '%s' lost â€” task stopped)Úreturn_exceptions)ÚasyncioÚ	to_threadr   r   ÚlogÚerrorÚdoneÚ	cancelledÚ	exceptionÚcreate_taskÚinfoÚcancelÚwarningÚsleepÚ_RENEWÚCancelledErrorÚgatherr   )r   r!   ÚtaskÚheldÚes        r   Úrun_as_leaderr6   ;   sk  è ø€ à $€DðØðÜ$×.Ñ.¬|¸TÓB×B�ñ ˜˜¨¯©¬ØÐ#¨¯	©	¬¸D¿N¹NÔ<LÐQU×Q_ÑQ_ÔQaÜ—I‘IÐNÐPTÐVZ×VdÑVdÓVfÔgÜ×*Ñ*©7«9¸SÀÀ¸<ÔH�Ü—‘Ð;¸TÕBÙ˜dÐ.°t·y±y´{Ø—‘”Ü—‘Ð=¸tÔDÜ—-‘-¤Ó'×'Ð'ñ àBúÜò Ü—	‘	Ð4°d¸AÔ>Ø–ûðúð (ùÜ×!Ñ!ò ØÐ D§I¡I¤KØ�K‰KŒMÜ—.‘. ¸Ô>×>Ñ>Ü×Ñ¤¨$Ó/×/Ñ/Øðüst   ‚G†E ˆD+ ¥D(¦D+ ªC7E Ä!EÄ"E Ä(D+ Ä+	EÄ4EÅE ÅEÅE ÅAGÆ,F/Æ-"GÇGÇGÇG)Ú__doc__r$   ÚloggingÚosr   ÚuuidÚtypingr   r   Úcore.dbr   Ú	getLoggerr&   ÚgetpidÚuuid4Úhexr   r   r0   Ústrr   r   r   r    r6   © ó    r   ú<module>rD      sÍ   ðñó Û Û 	Û Û ß &å à€g×ÑÐ)Ó*€àˆB�I‰I‹Kˆ=˜˜*˜$Ÿ*™*›,×*Ñ*¨2¨AÐ.Ð/Ð	0€Ø	€Ø	€ð�sð ˜tó ð �3ð ˜4ó ð�Cð ˜Dó ð˜cð ¨H°R¸À4¹Ð5HÑ,Ið Èdô rC   