o
    
۾ik                     @   s`   d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	m
Z
 d dlmZmZ G dd de	ZdS )	    )OrderedDict)Iterable)	BlockHash)LoadStoreSpecOffloadingEventOffloadingManagerPrepareStoreOutput)BackendBlockStatusc                   @   s   e Zd ZdZddedefddZdee de	d	B fd
dZ
dee defddZdee fddZdee fddZdee ded	B fddZddee defddZdee fddZd	S )LRUOffloadingManagerzT
    An OffloadingManager with a pluggable backend, which evicts blocks by LRU.
    Fbackendenable_eventsc                 C   s&   || _ t | _|rg | _d S d | _d S N)r   r   blocksevents)selfr   r    r   R/home/ubuntu/.local/lib/python3.10/site-packages/vllm/v1/kv_offload/lru_manager.py__init__   s   zLRUOffloadingManager.__init__block_hashesreturnNc                 C   s:   d}|D ]}| j |}|d u s|js |S |d7 }q|S Nr      )r   getis_ready)r   r   	hit_count
block_hashblockr   r   r   lookup   s   
zLRUOffloadingManager.lookupc                 C   sH   g }|D ]}| j | }|jsJ | jd7  _|| q| j||S )Nr   )r   r   ref_cntappendr   get_load_store_spec)r   r   r   r   r   r   r   r   prepare_load$   s   

z!LRUOffloadingManager.prepare_loadc                 C   s.   t t|D ]}| j|r| j| qd S r   )reversedlistr   r   move_to_end)r   r   r   r   r   r   touch.   s
   zLRUOffloadingManager.touchc                 C   s4   |D ]}| j | }|jdksJ | jd8  _qd S r   )r   r   )r   r   r   r   r   r   r   complete_load3   s
   
z"LRUOffloadingManager.complete_loadc           	         s   fdd|D }t | j  }g }|dkr8 j D ]\}}|jdkr5|| |d8 }|dkr5 nqd S |D ]} j j| q:|r^ j	d ur^ j	t
| jj jjdd  j|}t |t |ksnJ t||D ]	\}}| j|< qs j||}t|||dS )Nc                    s   g | ]	}| j vr|qS r   )r   ).0r   r   r   r   
<listcomp>=   s    z6LRUOffloadingManager.prepare_store.<locals>.<listcomp>r   r   Tr   
block_sizemediumremoved)block_hashes_to_store
store_specblock_hashes_evicted)lenr   get_num_free_blocksr   itemsr   r    freepopr   r   r,   r-   allocate_blockszipr!   r   )	r   r   r/   num_blocks_to_evictto_evictr   r   r   r0   r   r)   r   prepare_store9   sH   


	z"LRUOffloadingManager.prepare_storeTsuccessc                 C   s   g }|r|D ]}| j | }|jsd|_|| qn|D ]}| j | }|js0| j| | j |= q|rJ| jd urL| jt|| jj| jj	dd d S d S d S )Nr   Fr+   )
r   r   r   r    r   r5   r   r   r,   r-   )r   r   r<   stored_block_hashesr   r   r   r   r   complete_storeo   s2   


z#LRUOffloadingManager.complete_storec                 c   s*    | j d ur| j E d H  | j   d S d S r   )r   clearr)   r   r   r   take_events   s
   
z LRUOffloadingManager.take_events)F)T)__name__
__module____qualname____doc__r	   boolr   r   r   intr   r   r"   r&   r'   r   r;   r>   r   r@   r   r   r   r   r      s    	

6r   N)collectionsr   collections.abcr   vllm.v1.core.kv_cache_utilsr   vllm.v1.kv_offload.abstractr   r   r   r   vllm.v1.kv_offload.backendr	   r
   r   r   r   r   r   <module>   s   