o
    wvXj9
  ã                   @   s|   d Z ddlmZmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZ dZe	eƒZejejejZZZG d	d
„ d
ejƒZdS )z-Worker <-> Worker Sync at startup (Bootstep).é    )Úabsolute_importÚunicode_literals)Ú	bootsteps)Úitems)Ú
get_loggeré   )ÚEvents)ÚMinglec                       sv   e Zd ZdZd ZefZddhZd‡ fdd„	Zdd„ Z	d	d
„ Z
dd„ Zdd„ Zdd„ Zddd„Zdd„ Zdd„ Z‡  ZS )r	   zŸBootstep syncing state with neighbor workers.

    At startup, or upon consumer restart, this will:

    - Sync logical clocks.
    - Sync revoked tasks.

    ÚamqpÚredisFc                    s4   | o|   |j¡| _tt| ƒj|fd|i|¤Ž d S )NÚwithout_mingle)Úcompatible_transportÚappÚenabledÚsuperr	   Ú__init__)ÚselfÚcr   Úkwargs©Ú	__class__© úZ/var/www/html/myproject/venv/lib/python3.10/site-packages/celery/worker/consumer/mingle.pyr      s   
ÿÿ
ÿzMingle.__init__c                 C   s:   |  ¡ �}|jj| jv W  d   ƒ S 1 sw   Y  d S ©N)Úconnection_for_readÚ	transportÚdriver_typeÚcompatible_transports)r   r   Úconnr   r   r   r   #   s   
$ÿzMingle.compatible_transportc                 C   s   |   |¡ d S r   )Úsync)r   r   r   r   r   Ústart'   s   zMingle.startc                    sb   t dƒ ˆ ˆ ¡}|r+t dtdd„ t|ƒD ƒƒƒ ‡ ‡fdd„t|ƒD ƒ t dƒ d S t dƒ d S )Nzmingle: searching for neighborszmingle: sync with %s nodesc                 S   s   g | ]\}}|r|‘qS r   r   )Ú.0ÚreplyÚvaluer   r   r   Ú
<listcomp>/   s    zMingle.sync.<locals>.<listcomp>c                    s"   g | ]\}}|rˆ  ˆ ||¡‘qS r   )Úon_node_reply)r!   Únodenamer"   ©r   r   r   r   r$   0   s    ÿzmingle: sync completezmingle: all alone)ÚinfoÚ
send_helloÚlenr   )r   r   Úrepliesr   r'   r   r   *   s   
ÿÿzMingle.syncc                 C   sD   |j jjd|jd�}|jjj}| |j|j	¡pi }| 
|jd ¡ |S )Ng      ð?)ÚtimeoutÚ
connection)r   ÚcontrolÚinspectr-   Ú
controllerÚstateÚrevokedÚhelloÚhostnameÚ_dataÚpop)r   r   r/   Úour_revokedr+   r   r   r   r)   6   s
   
zMingle.send_helloc              
   C   sd   t d|ƒ z| j|fi |¤Ž W d S  ty   ‚  ty1 } ztd||ƒ W Y d }~d S d }~ww )Nz mingle: processing reply from %szmingle: sync with %s failed: %r)ÚdebugÚsync_with_nodeÚMemoryErrorÚ	ExceptionÚ	exception)r   r   r&   r"   Úexcr   r   r   r%   =   s   
€ÿzMingle.on_node_replyNc                 K   s   |   ||¡ |  ||¡ d S r   )Úon_clock_eventÚon_revoked_received)r   r   Úclockr2   r   r   r   r   r9   F   s   zMingle.sync_with_nodec                 C   s&   |r|j j |¡ d S |j j ¡  d S r   )r   r@   ÚadjustÚforward)r   r   r@   r   r   r   r>   J   s   &zMingle.on_clock_eventc                 C   s   |r|j jj |¡ d S d S r   )r0   r1   r2   Úupdate)r   r   r2   r   r   r   r?   M   s   ÿzMingle.on_revoked_received)F)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úlabelr   Úrequiresr   r   r   r    r   r)   r%   r9   r>   r?   Ú__classcell__r   r   r   r   r	      s    	
	r	   N)rG   Ú
__future__r   r   Úceleryr   Úcelery.fiver   Úcelery.utils.logr   Úeventsr   Ú__all__rD   Úloggerr8   r(   r<   ÚStartStopStepr	   r   r   r   r   Ú<module>   s    