
    BvhQ4                        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)y)    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                   t     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| _        y )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     ]/RAG/venv/lib/python3.12/site-packages/chromadb/segment/impl/distributed/segment_directory.pyr-   zMockMemberlistProvider.__init__#   s>     cjw7cjw7cjw7
    returnc                     | j                   S N)r   r/   s    r1   get_memberlistz%MockMemberlistProvider.get_memberlist+   s    r2   
memberlistNc                      y r5    r/   r8   s     r1   set_memberlist_namez*MockMemberlistProvider.set_memberlist_name/   s    r2   c                 D    || _         | j                  D ]
  } ||        y)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   s     %HZ  'r2   )__name__
__module____qualname____doc__r   __annotations__r   r-   r   r7   strr<   rA   __classcell__r0   s   @r1   r   r      sh    0
v 
  
     c d  !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                 >   t         |   |       t        j                          t	        j
                         | _        d | _        d | _        d | _	        t        j                         | _        t        j                         | _        t        j                         | _        y r5   )r,   r-   r
   load_configr	   CustomObjectsApirL   rP   rM   rN   	threadingLockrO   EventrQ   rR   r.   s     r1   r-   z)CustomResourceMemberlistProvider.__init__E   sr     %668! $ $&/nn&6#"+//"3'0'8$r2   r3   Nc                     | j                   t        d      | j                          | j                  j	                          | 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   sQ      (JKK$$**,%%'w}r2   c                 2   d | _         d | _        | j                  j                          | j                  | j                  j                          d | _        | j                  j                          | j                  j                          t        | %         S r5   )
rN   rM   rQ   setrP   joinr[   rR   r,   stopr^   s    r1   rb   z%CustomResourceMemberlistProvider.stopY   s}     $ $ 	##%)##%!%%'$$**,w|~r2   c           
         | j                   j                  j                  d      st        d      | j                  r| j
                  j                          | j                  j                  t        dt        d| j                  ddg id       | j
                  j                  d	       t        j                  d
       y y )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  ??&.$**(&O @ 
 ((--c2 JJsO# !r2   c                 \    | j                   | j                         | _         | j                   S r5   )rN   _fetch_memberlistr6   s    r1   r7   z/CustomResourceMemberlistProvider.get_memberlist   s+      ($($:$:$<D!$$$r2   r8   c                     || _         y r5   )rM   r;   s     r1   r<   z4CustomResourceMemberlistProvider.set_memberlist_name   s
     *r2   c                    | j                   j                  t        dt        d| j                         }t        t        t        t        f   |      }d|vrg S t        t        t        t        f   |d         }| j                  |      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%IT#s(^\&-AB..}==r2   c                      d fd} j                   /t        j                  |d      }|j                          | _         y t	        d      )Nc                     t        j                         dfd} j                  j                         s#	  |         j                  j                         s#y # t        $ r}|j
                  dk(  r	 Y d }~:d }~ww xY w)Nc            	         j                  j                  j                  t        dt        ddj
                   t              D ]  } t        t        t        t        f   |       } | d   d   }t        t        t        t        f   |      }j                  5  j                  |      _        d d d        j                  j                         j                  j                   j#                  d      sj$                  j'                         rt)        j                        dkD  sj$                  j+                           y # 1 sw Y   xY w)	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F* 2(%3D4I4I3J#K$9 & E !c3h7E$)(OF$;M$(c3h$GM44040O0O)1- 5 LL!6!67--55mD $ < < C C E 5 56:4488:- 54s   E

E	i  r3   N)r   WatchrQ   r   r   status)r   er   r/   s     @r1   	run_watchzLCustomResourceMemberlistProvider._watch_worker_memberlist.<locals>.run_watch   sk    A;6 --446J --446 	 $ xx3s   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   sF    %	N %%%YtDFLLN!'D@AAr2   api_response_specc                     d|vrg S g }|d   D ]:  }|d   }d|v r|d   nd}d|v r|d   nd}|j                  t        |||             < |S )Nrh   	member_id	member_ip member_node_namer$   )appendr   )r/   r   parsedmr%   r&   r'   s          r1   r   z;CustomResourceMemberlistProvider._parse_response_memberlist   sq     --I"9-A;B#.!#3;B,>!,C1'(DMM&B2D9:	 .
 r2   c                 6    | j                   D ]
  } ||        y r5   )r>   r?   s      r1   r   z(CustomResourceMemberlistProvider._notify   s    HZ  '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,,,sm#z**%NN*I,,--!'&__,	9v 	9      6 %
 % %
 +c +d + +>: >/Bb!%c3h	!* ! !r2   rK   c                   0    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j0                        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                 D   t         |   |       | j                  t              | _        |j
                  j                  d      }| j                  j                  |       |j
                  j                  d      | _        d | _        t        j                         | _        y )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! //112JK!!55oF#__443
 !%&/nn&6#r2   r3   Nc                     | j                   j                         | _        | j                   j                  | j                         t
        |          S r5   )r   r7   rN   $register_updated_memberlist_callback_update_memberlistr,   r]   r^   s    r1   r]   z$RendezvousHashSegmentDirectory.start   sE     $ 9 9 H H J!!FF##	
 w}r2   c                 j    | j                   j                  | j                         t        |          S r5   )r   &unregister_updated_memberlist_callbackr   r,   rb   r^   s    r1   rb   z#RendezvousHashSegmentDirectory.stop   s.    !!HH##	
 w|~r2   segmentnc           	      <   | j                   t        | j                         dk(  rt        d      t        |t        | j                               }t	        | j                   D cg c]+  }|j
                  dk7  xr t        |j
                        dk7  - c}      xr | j                  t        j                  k(  }|rBt        |d   j                  | j                   D cg c]  }|j
                   c}t        |      }nAt        |d   j                  | j                   D cg c]  }|j                   c}t        |      }t        |      }g }| j                   D ]  }|xr |j
                  |v }	| xr |j                  |v }
|	s|
s-|j                  0|j                  dk7  r!|j                   d}|j                  |       i| j!                  |j                        }|j                   d| dt"         dt$         d}|j                  |        |S c c}w c c}w c c}w )Nr   zMemberlist is not initializedr   
collectionz:50051.)rN   r   rZ   minallr'   r   r   NODEr   hexr   r%   r`   r&   r   extract_service_namerv   HEADLESS_SERVICE)r/   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0E0E,F!,K<==
 3t,,-. D<Q<QR<Qq22#aff+"22<QRS 7""k&6&66 	   %))!%!6!67!6A!67	K !%))#4454!45	K k*++F$G)G ( )(IVYY/-I & +.G 99(VYY"_"())F3H!((2#'#<#<VYY#GL"())Al^1=Q<RRSTdSeeklH!((2! ," M S 8 6s   "0HH
H
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 cg c]  }|j                   c}i       || _        d d d        y c c}w # 1 sw Y   y xY w)Nnew_memberlist)rO   r   r%   rN   )r/   r8   r   s      r1   r   z1RendezvousHashSegmentDirectory._update_memberlist@  sN    
 ((*!*#=*QADD*#=> %/D!	 )(#= )(s   AAAAApod_namec                 j    |j                  d      }t        |      dkD  rdj                  |d d       S y )N-   )splitr   ra   )r/   r   partss      r1   r   z3RendezvousHashSegmentDirectory.extract_service_nameK  s3    s#u:>88E#2J''r2   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    ,,%NN*z**
7v 
7     8W 8 8c 8 8t $ 'D1$	$ $
 ; $$/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 /  
 # @   # & !/1A !8a!'9;K a!Hs%57G sr2   