
    _jQ4                     (   d dl Z d dlZd dlmZmZmZmZmZmZ d dl	m
Z
mZmZ d dlmZ d dlmZmZ d dlmZmZ d dlmZmZmZmZ d dlmZmZmZ d d	lmZ d d
l m!Z!m"Z" dZ#dZ$dZ%dZ& G d dee          Z' G d dee          Z( G d dee          Z)dS )    N)AnyCallableDictListOptionalcast)clientconfigwatch)ApiException)EnforceOverridesoverride)RoutingModeSystem)Member
MemberlistMemberlistProviderSegmentDirectory)OpenTelemetryGranularityadd_attributes_to_current_spantrace_method)Segment)assignmurmur3hasher<   chromazchroma.clusterzsvc.cluster.localc                        e Zd ZU dZeed<   def fdZedefd            Z	ede
ddfd	            Zdeddfd
Z xZS )MockMemberlistProviderz&A mock memberlist provider for testing_memberlistsystemc                     t                                          |           t          ddd          t          ddd          t          dd	d
          g| _        d S )Naz10.0.0.1node1idipnodebz10.0.0.2node2cz10.0.0.3node3)super__init__r   r   selfr    	__class__s     p/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/chromadb/segment/impl/distributed/segment_directory.pyr-   zMockMemberlistProvider.__init__#   sa       cjw777cjw777cjw777
    returnc                     | j         S N)r   r/   s    r1   get_memberlistz%MockMemberlistProvider.get_memberlist+   s    r2   
memberlistNc                     d S r5    r/   r8   s     r1   set_memberlist_namez*MockMemberlistProvider.set_memberlist_name/   s    r2   c                 >    || _         | j        D ]} ||           dS )z]Updates the memberlist and calls all registered callbacks. This mocks an update from a k8s CRN)r   	callbacksr/   r8   callbacks      r1   update_memberlistz(MockMemberlistProvider.update_memberlist3   s8    % 	! 	!HHZ    	! 	!r2   )__name__
__module____qualname____doc__r   __annotations__r   r-   r   r7   strr<   rA   __classcell__r0   s   @r1   r   r      s         00
v 
 
 
 
 
 
  
       X  c d    X!J !4 ! ! ! ! ! ! ! !r2   r   c                       e Zd ZU dZej        ed<   ee         ed<   ee	         ed<   e
j        ed<   ee
j                 ed<   e
j        ed<   e
j        ed<   d	ef fd
Zed fd            Zed fd            Zedd            Zede	fd            Zededdfd            Zde	fdZddZdeeef         de	fdZde	ddfdZ xZS ) CustomResourceMemberlistProviderzMA memberlist provider that uses a k8s custom resource to store the memberlist_kubernetes_api_memberlist_name_curr_memberlist_curr_memberlist_mutex_watch_thread_kill_watch_thread_done_waiting_for_resetr    c                 Z   t                                          |           t          j                     t	          j                    | _        d | _        d | _        d | _	        t          j                    | _        t          j                    | _        t          j                    | _        d S r5   )r,   r-   r
   load_configr	   CustomObjectsApirL   rP   rM   rN   	threadingLockrO   EventrQ   rR   r.   s     r1   r-   z)CustomResourceMemberlistProvider.__init__E   s       %688! $ $&/n&6&6#"+/"3"3'0'8'8$$$r2   r3   Nc                     | j         t          d          |                                  | j                                         |                                  t                                                      S )Nz+Memberlist name must be set before starting)rM   
ValueErrorr7   rR   clear_watch_worker_memberlistr,   startr/   r0   s    r1   r]   z&CustomResourceMemberlistProvider.startP   sf     (JKKK$**,,,%%'''ww}}r2   c                 D   d | _         d | _        | j                                         | j        | j                                         d | _        | j                                         | j                                         t                      	                                S r5   )
rN   rM   rQ   setrP   joinr[   rR   r,   stopr^   s    r1   rb   z%CustomResourceMemberlistProvider.stopY   s     $ $ 	##%%%)##%%%!%%'''$**,,,ww||~~r2   c           
      j   | j         j                            d          st          d          | j        r}| j                                         | j                            t          dt          d| j        ddg id           | j                            d	           t          j        d
           d S d S )Nallow_resetzResetting the database is not allowed. Set `allow_reset` to true in the config in tests or other non-production environments where reset should be permitted.v1memberlists
MemberListmembers)kindspec)groupversion	namespacepluralnamebodyg      @g      ?)_systemsettingsrequirerZ   rM   rR   r[   rL   patch_namespaced_custom_objectKUBERNETES_GROUPKUBERNETES_NAMESPACEwaittimesleepr6   s    r1   reset_statez,CustomResourceMemberlistProvider.reset_stateg   s    
 |$,,];; 	 p     	(..000 ??&.$*(&O  @ 
 
 
 (--c222 JsOOOOO#	 	r2   c                 P    | j         |                                 | _         | j         S r5   )rN   _fetch_memberlistr6   s    r1   r7   z/CustomResourceMemberlistProvider.get_memberlist   s(     ($($:$:$<$<D!$$r2   r8   c                     || _         d S r5   )rM   r;   s     r1   r<   z4CustomResourceMemberlistProvider.set_memberlist_name   s     *r2   c                 >   | j                             t          dt          d| j                   }t          t          t          t          f         |          }d|vrg S t          t          t          t          f         |d                   }| 	                    |          S )Nre   rf   )rk   rl   rm   rn   ro   rj   )
rL   get_namespaced_custom_objectru   rv   rM   r   r   rG   r   _parse_response_memberlist)r/   api_responseresponse_specs      r1   r|   z2CustomResourceMemberlistProvider._fetch_memberlist   s    +HH"* )+ I 
 
 DcNL99%%IT#s(^\&-ABB..}===r2   c                      d fd} j         3t          j        |d          }|                                 | _         d S t	          d          )Nr3   c                      t          j                    dfd} j                                        sH	  |              n## t          $ r}|j        dk    r	 Y d }~nd }~ww xY wj                                        Hd S )Nr3   c            	                              j        j        t          dt          ddj         t                    D ]} t          t          t          t          f         |           } | d         d         }t          t          t          t          f         |          }j        5                      |          _        d d d            n# 1 swxY w Y                       j                   j        j                            d          rJj                                        s1t)          j                  dk    rj                                         d S )	Nre   rf   zmetadata.name=)rk   rl   rm   rn   field_selectortimeout_secondsobjectrj   rd   r   )streamrL   list_namespaced_custom_objectru   rv   rM   WATCH_TIMEOUT_SECONDSr   r   rG   r   rO   r   rN   _notifyrq   rr   rs   rR   is_setlenr`   )eventr   r/   ws     r1   do_watchz^CustomResourceMemberlistProvider._watch_worker_memberlist.<locals>.run_watch.<locals>.do_watch   s   XX(F* 2(#KD4I#K#K$9 &   ; ;E !c3h77E$)(OF$;M$(c3h$G$GM4  040O0O)1 1-               LL!6777-55mDD; $ < C C E E;   566::488:::-; ;s   %CC	C	i  r3   N)r   WatchrQ   r   r   status)r   er   r/   s     @r1   	run_watchzLCustomResourceMemberlistProvider._watch_worker_memberlist.<locals>.run_watch   s    A; ; ; ; ; ; ;6 -4466 HJJJJ#   x3 -4466  Fs   
A 
A"AA"T)targetdaemonz"A watch thread is already running.r   )rP   rV   Threadr]   	Exception)r/   r   threads   `  r1   r\   z9CustomResourceMemberlistProvider._watch_worker_memberlist   sl    %	 %	 %	 %	 %	 %	N %%YtDDDFLLNNN!'D@AAAr2   api_response_specc                     d|vrg S g }|d         D ]K}|d         }d|v r|d         nd}d|v r|d         nd}|                     t          |||                     L|S )Nrh   	member_id	member_ip member_node_namer$   )appendr   )r/   r   parsedmr%   r&   r'   s          r1   r   z;CustomResourceMemberlistProvider._parse_response_memberlist   s     ---I"9- 	; 	;A;B#.!#3#3;B,>!,C,C1'((DMM&B2D999::::r2   c                 0    | j         D ]} ||           d S r5   )r>   r?   s      r1   r   z(CustomResourceMemberlistProvider._notify   s0     	! 	!HHZ    	! 	!r2   r   )rB   rC   rD   rE   r	   rU   rF   r   rG   r   rV   rW   r   rX   r   r-   r   r]   rb   rz   r7   r<   r|   r\   r   r   r   r   rH   rI   s   @r1   rK   rK   :   s        WW,,,,sm###z****%N***I,----!'''&_,,,	9v 	9 	9 	9 	9 	9 	9      X      X    X6 %
 % % % X%
 +c +d + + + X+>: > > > >/B /B /B /Bb!%c3h	   !* ! ! ! ! ! ! ! ! !r2   rK   c                   X    e Zd ZU eed<   ej        ed<   ee         ed<   e	ed<   de
f fdZed fd	            Zed fd
            Zedededee         fd            Zedeegdf         ddfd            Z edej                  deddfd            Zdedee         fdZ xZS )RendezvousHashSegmentDirectory_memberlist_providerrO   rN   _routing_moder    c                 l   t                                          |           |                     t                    | _        |j                            d          }| j                            |           |j                            d          | _        d | _        t          j
                    | _        d S )Nworker_memberlist_name%chroma_segment_directory_routing_mode)r,   r-   rs   r   r   rr   r<   r   rN   rV   rW   rO   )r/   r    memberlist_namer0   s      r1   r-   z'RendezvousHashSegmentDirectory.__init__   s       $(LL1C$D$D! /112JKK!55oFFF#_443
 
 !%&/n&6&6###r2   r3   Nc                     | j                                         | _        | j                             | j                   t                                                      S r5   )r   r7   rN   $register_updated_memberlist_callback_update_memberlistr,   r]   r^   s    r1   r]   z$RendezvousHashSegmentDirectory.start   sO     $ 9 H H J J!FF#	
 	
 	
 ww}}r2   c                     | j                             | j                   t                                                      S r5   )r   &unregister_updated_memberlist_callbackr   r,   rb   r^   s    r1   rb   z#RendezvousHashSegmentDirectory.stop   s8    !HH#	
 	
 	
 ww||~~r2   segmentnc           	      >   | j         t          | j                   dk    rt          d          t          |t          | j                             }t	          d | j         D                       o| j        t          j        k    }|r2t          |d         j	        d | j         D             t          |          }n1t          |d         j	        d | j         D             t          |          }t          |          }g }| j         D ]}|o|j        |v }| o|j        |v }	|s|	r~|j        +|j        dk    r |j         d}
|                    |
           O|                     |j                  }|j         d	| d	t"           d	t$           d}
|                    |
           |S )
Nr   zMemberlist is not initializedc                 T    g | ]%}|j         d k    ot          |j                   dk    &S )r   r   )r'   r   .0r   s     r1   
<listcomp>zHRendezvousHashSegmentDirectory.get_segment_endpoints.<locals>.<listcomp>  s0    RRRq22#af++"2RRRr2   
collectionc                     g | ]	}|j         
S r:   )r'   r   s     r1   r   zHRendezvousHashSegmentDirectory.get_segment_endpoints.<locals>.<listcomp>  s    777A777r2   c                     g | ]	}|j         
S r:   r%   r   s     r1   r   zHRendezvousHashSegmentDirectory.get_segment_endpoints.<locals>.<listcomp>!  s    555!555r2   r   z:50051.)rN   r   rZ   minallr   r   NODEr   hexr   r`   r'   r%   r&   r   extract_service_namerv   HEADLESS_SERVICE)r/   r   r   can_use_node_routingassignmentsassignments_setout_endpointsmemberis_chosen_with_node_routingis_chosen_with_id_routingendpointservice_names               r1   get_segment_endpointsz4RendezvousHashSegmentDirectory.get_segment_endpoints   s    (C0E,F,F!,K,K<===
 3t,--.. RRD<QRRRSS 7"k&66 	   	 %)77!6777	 KK !%)55t4555	 K k**+ 	3 	3F$G)G ( )(IVY/-I & + 	3.G 	3 9(VY"__"()333H!((2222#'#<#<VY#G#GL"()lllll=QllTdlllH!((222r2   r@   c                     t                      r5   )NotImplementedError)r/   r@   s     r1   !register_updated_segment_callbackz@RendezvousHashSegmentDirectory.register_updated_segment_callback:  s     "###r2   z1RendezvousHashSegmentDirectory._update_memberlistr8   c                     | j         5  t          dd |D             i           || _        d d d            d S # 1 swxY w Y   d S )Nnew_memberlistc                     g | ]	}|j         
S r:   r   r   s     r1   r   zERendezvousHashSegmentDirectory._update_memberlist.<locals>.<listcomp>G  s    #=#=#=QAD#=#=#=r2   )rO   r   rN   r;   s     r1   r   z1RendezvousHashSegmentDirectory._update_memberlist@  s    
 ( 	/ 	/*!#=#=*#=#=#=>   %/D!		/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/s   #8<<pod_namec                     |                     d          }t          |          dk    rd                    |d d                   S d S )N-   )splitr   ra   )r/   r   partss      r1   r   z3RendezvousHashSegmentDirectory.extract_service_nameK  sA    s##u::>>88E#2#J'''tr2   r   )rB   rC   rD   r   rF   rV   rW   r   r   r   r   r-   r   r]   rb   r   intr   rG   r   r   r   r   r   ALLr   r   rH   rI   s   @r1   r   r      s        ,,,,%N***z****
7v 
7 
7 
7 
7 
7 
7      X      X 8W 8 8c 8 8 8 X8t $ 'D1$	$ $ $ X$
 \; $ /Z /D / / /	 /S Xc]        r2   r   )*rV   rx   typingr   r   r   r   r   r   
kubernetesr	   r
   r   kubernetes.client.restr   	overridesr   r   chromadb.configr   r   chromadb.segment.distributedr   r   r   r    chromadb.telemetry.opentelemetryr   r   r   chromadb.typesr   chromadb.utils.rendezvous_hashr   r   r   rv   ru   r   r   rK   r   r:   r2   r1   <module>r      s        < < < < < < < < < < < < < < < < , , , , , , , , , , / / / / / / 0 0 0 0 0 0 0 0 / / / / / / / /                    
 # " " " " " @ @ @ @ @ @ @ @   # & ! ! ! ! !/1A ! ! !8a! a! a! a! a!'9;K a! a! a!Hs s s s s%57G s s s s sr2   