o
    ›¨ÊhÏ  ã                   @   s¼   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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ZZG dd„ dejƒZdS )z)Worker <-> Worker communication Bootstep.é    )Údefaultdict)Úpartial)Úheappush)Ú
itemgetter)ÚConsumer)Ú	DummyLock)ÚContentDisallowedÚDecodeError)Ú	bootsteps)Ú
get_logger)ÚBunché   )ÚMingle)ÚGossipc                       sÂ   e Zd ZdZd ZefZedddddddƒZd	d
hZ			d-‡ fdd„	Z
dd„ Zd.dd„Zdd„ Zdd„ Z‡ fdd„Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Z‡  ZS )/r   zfBootstep consuming events from other workers.

    This keeps the logical clock value up to date.
    ÚidÚclockÚhostnameÚpidÚtopicÚactionÚcverÚamqpÚredisFç      @ç       @c                    s  | o|   |j¡| _|j| _| |_|jjj| _|j| _d | jt|j	ƒg¡| _
ttƒ tƒ tƒ d�| _|j| _| jrR|jjj| j| jdd�| _|jrMtƒ |_| jj| _|| _|| _d | _ttƒ| _i | _| j| j dœ| _!|jj"| _"d| j#i| _$t%ƒ j&|fi |¤Ž d S )NÚ.)Ú	node_joinÚ
node_leaveÚ	node_lostr   )Úon_node_joinÚon_node_leaveÚmax_tasks_in_memory)zworker.electzworker.elect.ackÚtask)'Úcompatible_transportÚappÚenabledÚgossipÚeventsÚReceiverr   ÚjoinÚstrr   Úfull_hostnamer   ÚsetÚonÚtimerÚStater   r    ÚstateÚhubr   Ú_mutexÚeventÚupdate_stateÚintervalÚheartbeat_intervalÚ_trefr   ÚlistÚconsensus_requestsÚconsensus_repliesÚon_electÚon_elect_ackÚevent_handlersr   Ú	call_taskÚelection_handlersÚsuperÚ__init__)ÚselfÚcÚwithout_gossipr5   r6   Úkwargs©Ú	__class__© úO/var/www/html/env/lib/python3.10/site-packages/celery/worker/consumer/gossip.pyrA   $   sB   ýý

þ
ÿzGossip.__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)rB   r$   ÚconnrH   rH   rI   r#   M   s   
$ÿzGossip.compatible_transportNc                 C   s$   g | j |< | jjd|||dd� d S )Nzworker-electr   )r   r   r   r   )r:   Ú
dispatcherÚsend)rB   r   r   r   rH   rH   rI   ÚelectionQ   s
   

þzGossip.electionc              
   C   sJ   z| j  |¡ ¡  W d S  ty$ } zt d|¡ W Y d }~d S d }~ww )NzCould not call task: %r)r$   Ú	signatureÚapply_asyncÚ	ExceptionÚloggerÚ	exception)rB   r"   ÚexcrH   rH   rI   r>   X   s   €ÿzGossip.call_taskc           
   
   C   s„   z|   |¡\}}}}}}}W n ty& }	 zt d|	¡W  Y d }	~	S d }	~	ww t| j| ||› d|› �||fƒ | jjd|d� d S )Nz!election request missing field %sr   zworker-elect-ack)r   )Ú_cons_stamp_fieldsÚKeyErrorrV   rW   r   r9   rP   rQ   )
rB   r3   Úid_r   r   r   r   r   Ú_rX   rH   rH   rI   r;   ^   s   
ÿ
€ÿþzGossip.on_electc                    s   t ƒ  |¡ |j| _d S rJ   )r@   ÚstartÚevent_dispatcherrP   )rB   rC   rF   rH   rI   r]   j   s   zGossip.startc           
      C   sî   |d }z| j | }W n
 ty   Y d S w t| j ¡ ƒ}| |d ¡ t|ƒt|ƒkru| j | j	| ¡\}}}}|| j
kr_td|ƒ z| j| }	W n tyY   t d|¡ Y nw |	|ƒ ntd||ƒ | j	 |d ¡ | j  |d ¡ d S d S )Nr   r   zI won the election %rzUnknown election topic %rznode %s elected for %r)r:   rZ   r,   r0   Úalive_workersÚappendÚlenr   Ú	sort_heapr9   r+   Úinfor?   rV   rW   Úpop)
rB   r3   r   Úrepliesr_   r\   Úleaderr   r   ÚhandlerrH   rH   rI   r<   n   s0   ÿÿ

ÿ
ñzGossip.on_elect_ackc                 C   ó    t d|jƒ |  | jj|¡ d S )Nz%s joined the party)Údebugr   Ú_call_handlersr-   r   ©rB   ÚworkerrH   rH   rI   r   ˆ   ó   zGossip.on_node_joinc                 C   rh   )Nz%s left)ri   r   rj   r-   r   rk   rH   rH   rI   r    Œ   rm   zGossip.on_node_leavec                 C   rh   )Nzmissed heartbeat from %s)rc   r   rj   r-   r   rk   rH   rH   rI   Úon_node_lost�   rm   zGossip.on_node_lostc                 O   sR   |D ]$}z	||i |¤Ž W q t y& } zt d||¡ W Y d }~qd }~ww d S )Nz!Ignored error from handler %r: %r)rU   rV   rW   )rB   ÚhandlersÚargsrE   rg   rX   rH   rH   rI   rj   ”   s   ÿ€ÿýzGossip._call_handlersc                 C   s,   | j d ur
| j  ¡  | j | j| j¡| _ d S rJ   )r7   Úcancelr.   Úcall_repeatedlyr5   Úperiodic)rB   rH   rH   rI   Úregister_timerœ   s   

zGossip.register_timerc                 C   sR   | j j}tƒ }| ¡ D ]}|js| |¡ |  |¡ q|D ]	}| |jd ¡ qd S rJ   )	r0   Úworkersr,   ÚvaluesÚaliveÚaddrn   rd   r   )rB   ru   Údirtyrl   rH   rH   rI   rs   ¡   s   

€ÿzGossip.periodicc                 C   s>   |   ¡  | j|d| jd�}t||jgt| j|jƒ|jdd�gS )Nzworker.#)Úrouting_keyÚ	queue_ttlT)ÚqueuesÚ
on_messageÚacceptÚno_ack)	rt   r(   r6   r   Úqueuer   r}   Úevent_from_messager~   )rB   ÚchannelÚevrH   rH   rI   Úget_consumers«   s   ÿûzGossip.get_consumersc           	   
   C   sÒ   |j d }| dd¡d dkrd S z| j| }W n	 ty!   Y nw ||jƒS |j d¡p1|jd }|| jkrbz||jƒ\}}|  |¡ W d S  t	t
tfya } zt |¡ W Y d }~d S d }~ww | j ¡  d S )Nrz   r   r   r   r"   r   )Údelivery_infoÚsplitr=   rZ   ÚpayloadÚheadersÚgetr   r4   r	   r   Ú	TypeErrorrV   Úerrorr   Úforward)	rB   ÚprepareÚmessageÚ_typerg   r   r\   r3   rX   rH   rH   rI   r}   ·   s*   
ÿ
ÿ
€ÿzGossip.on_message)Fr   r   rJ   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úlabelr   Úrequiresr   rY   rN   rA   r#   rR   r>   r;   r]   r<   r   r    rn   rj   rt   rs   r„   r}   Ú__classcell__rH   rH   rF   rI   r      s2    ÿÿ)

r   N)r“   Úcollectionsr   Ú	functoolsr   Úheapqr   Úoperatorr   Úkombur   Úkombu.asynchronous.semaphorer   Úkombu.exceptionsr   r	   Úceleryr
   Úcelery.utils.logr   Úcelery.utils.objectsr   Úmingler   Ú__all__r�   rV   ri   rc   ÚConsumerStepr   rH   rH   rH   rI   Ú<module>   s     