o
    g                  
   @   s  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
 d
eZ eej!ddddeddde"ddfddZ#d'de	ej$ defddZ%G dd dZ&dej$de"fddZ'deddfddZ(eej!dddej!dd dej!dd!dd"eddde"d#e"d$e"ddfd%d&Z)dS )(    N)sleep)DictAnyOptional)ThreadPoolExecutor)RuleBasedStateMachineBundlerulerun_state_machine_as_testconsumesMultipleResultsmultiple)givensettings)SegmentLRUCacheSegmentCache)SegmentSegmentScopec                       s   e Zd ZU eejef ed< edZ	de
f fddZee	ddd	d
Zeee	ddddZee	ddeej fddZdd Z  ZS )LRUCacheStateMachine_modelcollection_keyscapacityc                    s<   t    g  _t|dd  fddd _i  _| _d S )Nc                 S   s   dS )N
    _r   r   U/var/www/visachat/venv/lib/python3.10/site-packages/chromadb/test/cache/test_cache.py<lambda>"   s    z/LRUCacheStateMachine.__init__.<locals>.<lambda>c                    s    j |  j| fS N)evicted_itemsappendr   popkvselfr   r   r   #   s    )r   	size_funccallback)super__init__r   r   _cacher   	_capacity)r&   r   	__class__r%   r   r*      s   


zLRUCacheStateMachine.__init__collection_idreturnNc                 C   2   || j vrd S | j |}| j||ksJ d S r   )r   getr+   r&   r0   expectedr   r   r   test_get(      
zLRUCacheStateMachine.test_getc                 C   r2   r   )r   r!   r+   r4   r   r   r   test_pop/   r7   zLRUCacheStateMachine.test_pop)targetc                 C   sx   t  }|d }|| j|< | j|| | j||ksJ t| jj| jks(J | jr8| jd }|| jjvs8J t	|S )N
collection)
new_segmentr   r+   setr3   lencacher,   r   r   )r&   segmentr0   last_evictedr   r   r   test_set6   s   

zLRUCacheStateMachine.test_setc                 C   s   | j   | j  d S r   )r+   resetr   clearr%   r   r   r   teardownC   s   
zLRUCacheStateMachine.teardown)r1   N)__name__
__module____qualname__r   uuidUUIDr   __annotations__r   r   intr*   r	   r6   r   r8   r   rB   rE   __classcell__r   r   r-   r   r      s   
 r   r     )	min_value	max_valuer      )max_examplesr   r1   c                    s   t  fdd d S )Nc                      s
   t  dS )NrQ   )r   r   rQ   r   r   r   K   s   
 ztest_caches.<locals>.<lambda>)r
   rQ   r   rQ   r   test_cachesH   s   rT   r0   c                 C   s*   | d u rt  } tt  dtj| d i dS )Ntest)idtypescoper:   metadata
file_paths)rI   uuid4r   r   VECTORr/   r   r   r   r<   N   s   r<   c                   @   s0   e Zd Z		d	dedee dee fddZdS )

CacheSetuprN   2   r?   
iterationsnum_threadsc                 C   s.   || _ || _|| _g d g d| _t | _d S )N)errorstime_to_first_errorerror_timings)r?   r_   r`   metrics	threadingLocklock)r&   r?   r_   r`   r   r   r   r*   \   s   zCacheSetup.__init__N)rN   r^   )rF   rG   rH   r   r   rL   r*   r   r   r   r   r]   [   s    r]   r   c                 C   s   t jddS )N   r   )nprandomrandintr   r   r   r   _get_segment_disk_sizem   s   rl   c                 C   s   d S r   r   r   r   r   r   callback_cache_evictq   s   rm   rh   (   i   )r   r`   r_   r`   r_   c                    s   t t| dd dd d||d  fdd}t jd}t jD ]}|| q"W d	   n1 s4w   Y  t j t jd
 dksKJ dd	S )z<Test that demonstrates thread safety issues in the LRU cachec                 S   s   t |S r   )rm   r"   r   r   r   r          z$test_thread_safety.<locals>.<lambda>c                 S   s   t | S r   )rl   )r#   r   r   r   r      ro   )r   r(   r'   )r_   r`   c                     s  d} t  }zu|  jkry| d7 } t jj }tjdddk r2t	|dkr2 j
tj| nt }t|} j|| ttjdd tjdddk rct	|dkrc j
tj| tjdddk rq j  |  jksW d
S W d
S  ty } zC j*  jd | t  | } jd |  jd	 d
u r| jd	< W d
   n1 sw   Y  W Y d
}~d
S W Y d
}~d
S d
}~ww )z.Worker that performs multiple cache operationsr   rh   g      ?g{Gz?g333333?g?ra   rc   rb   N)timeperf_counterr_   listr?   keysri   rj   uniformr>   r3   choicerI   r[   r<   r=   r   rC   	Exceptionrg   rd   r    )_iterations
start_time
cache_keyskeyr@   etime_to_errorcache_setupr   r   worker   s8   


8z"test_thread_safety.<locals>.worker)max_workersNra   r   zThread safety issues found)	r]   r   r   r`   rangesubmitprintrd   r>   )r   r`   r_   r   executorr   r   r}   r   test_thread_safetyu   s"   	

r   r   )*re   rp   r   numpyri   rI   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   integersrL   rT   rJ   r<   r]   rl   rm   r   r   r   r   r   <module>   s6    $	/"