
    ug              
       V   d dl Z d dlZd dlmZ d dlZd dlZd dlmZmZm	Z	 d dl
mZ d dlmZ d dlmZmZmZmZmZmZmZ d dlmZmZ d dlmZmZ d dlmZmZ  G d	 d
e      Z  e ejB                  dd             ed      de"ddfd              Z#d"de	ejH                     defdZ% G d d      Z&dejH                  de"fdZ'deddfdZ( e ejB                  dd       ejB                  dd       ejB                  dd             ed      de"de"d e"ddfd!              Z)y)#    N)sleep)DictAnyOptional)ThreadPoolExecutor)RuleBasedStateMachineBundlerulerun_state_machine_as_testconsumesMultipleResultsmultiple)givensettings)SegmentLRUCacheSegmentCache)SegmentSegmentScopec                        e Zd ZU eej
                  ef   ed<    ed      Z	de
f fdZ ee	      dd       Z e ee	            dd       Z ee		      deej
                     fd
       Zd Z xZS )LRUCacheStateMachine_modelcollection_keyscapacityc                 |     t                    g  _        t        |d  fd       _        i  _        | _        y )Nc                      y)N
    _s    S/var/www/openai/venv/lib/python3.12/site-packages/chromadb/test/cache/test_cache.py<lambda>z/LRUCacheStateMachine.__init__.<locals>.<lambda>"   s        c                 p    j                   j                  |       j                  j                  |       fS N)evicted_itemsappendr   pop)kvselfs     r    r!   z/LRUCacheStateMachine.__init__.<locals>.<lambda>#   s)    4#5#5#<#<Q#?QRAS"Tr"   )r   	size_funccallback)super__init__r%   r   _cacher   	_capacity)r*   r   	__class__s   ` r    r.   zLRUCacheStateMachine.__init__   s;    %"T

 !r"   collection_idreturnc                     || j                   vry | j                   j                  |      }| j                  j                  |      |k(  sJ y r$   )r   getr/   r*   r3   expecteds      r    test_getzLRUCacheStateMachine.test_get(   >    +;;??=1{{}-999r"   c                     || j                   vry | j                   j                  |      }| j                  j                  |      |k(  sJ y r$   )r   r'   r/   r7   s      r    test_popzLRUCacheStateMachine.test_pop/   r:   r"   )targetc                    t               }|d   }|| j                  |<   | j                  j                  ||       | j                  j	                  |      |k(  sJ t        | j                  j                        | j                  k  sJ | j                  r)| j                  d   }|| j                  j                  vsJ t        |      S )N
collection)
new_segmentr   r/   setr6   lencacher0   r%   r   )r*   segmentr3   last_evicteds       r    test_setzLRUCacheStateMachine.test_set6   s    --%,M"w/{{}-8884;;$$%777--b1Lt{{'8'8888&&r"   c                 l    | j                   j                          | j                  j                          y r$   )r/   resetr   clear)r*   s    r    teardownzLRUCacheStateMachine.teardownC   s"    r"   )r4   N)__name__
__module____qualname__r   uuidUUIDr   __annotations__r	   r   intr.   r
   r9   r   r<   r   rG   rK   __classcell__)r1   s   @r    r   r      s    G#$$./O	" 	" 
(: ): 
12: 3: 
!
'/$))4 
' "
'r"   r   r     )	min_value	max_valuer      )max_examplesr   r4   c                 "     t         fd       y )Nc                      t               S )NrW   )r   rW   s   r    r!   ztest_caches.<locals>.<lambda>K   s    &:H&Mr"   )r   rW   s   `r    test_cachesr\   H   s     MNr"   r3   c                     | t        j                         } t        t        j                         dt        j                  | d i       S )Ntest)idtypescoper?   metadata
file_paths)rO   uuid4r   r   VECTORr2   s    r    rA   rA   N   s>    

::<!!  r"   c                   2    e Zd Z	 	 ddedee   dee   fdZy)
CacheSetuprD   
iterationsnum_threadsc                 v    || _         || _        || _        g d g d| _        t	        j
                         | _        y )N)errorstime_to_first_errorerror_timings)rD   rh   ri   metrics	threadingLocklock)r*   rD   rh   ri   s       r    r.   zCacheSetup.__init__\   s<     $)
$&#'(

 NN$	r"   N)rT   2   )rL   rM   rN   r   r   rR   r.   r   r"   r    rg   rg   [   s3     %)%'	%% SM% c]	%r"   rg   r   c                 B    t         j                  j                  dd      S )N   r   )nprandomrandintr   s    r    _get_segment_disk_sizerx   m   s    99Q##r"   c                      y r$   r   r   s    r    callback_cache_evictrz   q   s    r"   rt   (   i   )r   ri   rh   ri   rh   c                 d   t        t        | d d       ||      fd}t        j                        5 }t	        j                        D ]  }|j                  |        	 ddd       t        j                         t        j                  d         d	k(  sJ d
       y# 1 sw Y   AxY w)z<Test that demonstrates thread safety issues in the LRU cachec                     t        |      S r$   )rz   )r(   r)   s     r    r!   z$test_thread_safety.<locals>.<lambda>   s
    "6q"9r"   c                     t        |       S r$   )rx   )r(   s    r    r!   z$test_thread_safety.<locals>.<lambda>   s
     6q 9r"   )r   r,   r+   )rh   ri   c                      d} t        j                         }	 | j                  k  r| dz  } t        j                  j                  j                               }t        j                  j                  dd      dk  rGt        |      dkD  r9j                  j                  t        j                  j                  |             n;t        j                         }t        |      }j                  j                  ||       t!        t        j                  j                  dd             t        j                  j                  dd      dk  rFt        |      dkD  r8j                  j                  t        j                  j                  |             t        j                  j                  dd      dk  rj                  j#                          | j                  k  ry
y
# t$        $ r}j&                  5  j(                  d   j+                  |       t        j                         |z
  }j(                  d   j+                  |       j(                  d	   |j(                  d	<   d
d
d
       n# 1 sw Y   nxY wY d
}~y
Y d
}~y
d
}~ww xY w)z.Worker that performs multiple cache operationsr   rt   g      ?g{Gz?g333333?g?rk   rm   rl   N)timeperf_counterrh   listrD   keysru   rv   uniformrC   r6   choicerO   rd   rA   rB   r   rI   	Exceptionrq   rn   r&   )_iterations
start_time
cache_keyskeyrE   etime_to_errorcache_setups          r    workerz"test_thread_safety.<locals>.worker   s   &&(
	O!7!77q !+"3"3"9"9">">"@A
99$$Q*S0S_q5H%%))"))*:*::*FG**,C)#.G%%))#w7bii''40199$$Q*S0S_q5H%%))"))*:*::*FG99$$Q*T1%%++- !7!77  	O!!##H-44Q7 $ 1 1 3j @##O4;;MJ&&'<=EANK''(=> "!!!!	Os1   GG" "	J+J7A2I2)	J2I;	7JJ)max_workersNrk   r   zThread safety issues found)	rg   r   r   ri   rangesubmitprintrn   rC   )r   ri   rh   r   executorr   r   s         @r    test_thread_safetyr   u   s     99	

 KO6 
(?(?	@H{../AOOF# 0 
A 
+

{""8,-2P4PP2	 
A	@s   ,B&&B/r$   )*ro   r   r   numpyru   rO   typingr   r   r   concurrent.futuresr   hypothesis.strategies
strategiessthypothesis.statefulr   r	   r
   r   r   r   r   
hypothesisr   r   )chromadb.segment.impl.manager.cache.cacher   r   chromadb.typesr   r   r   integersrR   r\   rP   rA   rg   rx   rz   r   r   r"   r    <module>r      sW        & & 1 "   ' S 0,0 ,^ bD9:	rO# O$ O  ;O
x		2 
g 
% %$$dii $C $	G 	 	 R[[15a26r{{Q#6
 
r,Q ,Q3 ,QC ,QD ,Q ,Qr"   