
    çgp{              	         U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
mZ d dlmZmZmZmZmZmZmZmZmZ erd dlZd dlmZ  ed          Zn ed          Z ed          Z ej        d          Zeeegef         Z G d	 d
          Z  G d de           Z! G d de           Z" G d de           Z# G d de           Z$ G d de           Z% G d de           Z& G d de           Z' G d deeef                   Z( G d de           Z)de iZ*de+d<   d'd(d&Z,e e!e%e"e$e#e&e'e)f	D ]Z- e,e-           dS ))    )annotationsN)FutureThreadPoolExecutor)	TYPE_CHECKINGAnyCallableClassVarGeneric
NamedTupleOptionalOrderedDictTypeVar)	ParamSpecPTfsspecc                  J    e Zd ZU dZdZded<   ddZddZddZddZ	ddZ
dS )	BaseCacheag  Pass-though cache: doesn't keep anything, calls every time

    Acts as base class for other cachers

    Parameters
    ----------
    blocksize: int
        How far to read ahead in numbers of bytes
    fetcher: func
        Function of the form f(start, end) which gets bytes from remote as
        specified
    size: int
        How big this file is
    noneClassVar[str]name	blocksizeintfetcherFetchersizereturnNonec                h    || _         d| _        || _        || _        d| _        d| _        d| _        d S Nr   )r   nblocksr   r   	hit_count
miss_counttotal_requested_bytes)selfr   r   r   s       J/var/www/html/ai-engine/env/lib/python3.11/site-packages/fsspec/caching.py__init__zBaseCache.__init__:   s:    "	%&"""    start
int | Nonestopbytesc                n    |d}|| j         }|| j         k    s||k    rdS |                     ||          S )Nr   r(   )r   r   r%   r)   r+   s      r&   _fetchzBaseCache._fetchD   sF    =E<9DDI$3||E4(((r(   c                0    d| _         d| _        d| _        dS )zAReset hit and miss counts for a more ganular report e.g. by file.r   N)r"   r#   r$   r%   s    r&   _reset_statszBaseCache._reset_statsM   s    %&"""r(   strc                l    | j         dk    r| j        dk    rdS d| j        | j         | j        | j        fz  S )z2Return a formatted string of the cache statistics.r    z3 , %s: %d hits, %d misses, %d total requested bytes)r"   r#   r   r$   r1   s    r&   
_log_statszBaseCache._log_statsS   sH    >Q4?a#7#72DINO&	H
 
 	
r(   c                    d| j         j         d| j         d| j         d| j         d| j         d| j         d| j         dS )	Nz

        <z:
            block size  :   z
            block count :   z
            file size   :   z
            cache hits  :   z
            cache misses:   z$
            total requested bytes: z
>
        )	__class____name__r   r!   r   r"   r#   r$   r1   s    r&   __repr__zBaseCache.__repr___   s    
.
! !^  "\  "Y	 
 "^  "_  %)$>   	r(   Nr   r   r   r   r   r   r   r   r)   r*   r+   r*   r   r,   r   r   )r   r3   )r9   
__module____qualname____doc__r   __annotations__r'   r/   r2   r6   r:    r(   r&   r   r   (   s           !D    ' ' ' ') ) ) )' ' ' '

 

 

 


 
 
 
 
 
r(   r   c                  N     e Zd ZdZdZ	 	 dd fdZddZddZddZd dZ	 xZ
S )!	MMapCachezmemory-mapped sparse file cache

    Opens temporary file, which is filled blocks-wise when data is requested.
    Ensure there is enough disc space in the temporary location.

    This cache method might only work on posix
    mmapNr   r   r   r   r   location
str | Noneblocksset[int] | Noner   r   c                    t                                          |||           |t                      n|| _        || _        |                                 | _        d S N)superr'   setrH   rF   	_makefilecache)r%   r   r   r   rF   rH   r8   s         r&   r'   zMMapCache.__init__w   sP     	GT222%~ceee6 ^^%%


r(   mmap.mmap | bytearrayc                *   dd l }dd l}| j        dk    rt                      S | j        $t
          j                            | j                  s| j        (|                                }t                      | _
        nt          | j        d          }|                    | j        dz
             |                    d           |                                 nt          | j        d          } |j         |                                | j                  S )Nr   zwb+      1zr+b)rE   tempfiler   	bytearrayrF   ospathexistsTemporaryFilerM   rH   openseekwriteflushfileno)r%   rE   rT   fds       r&   rN   zMMapCache._makefile   s    9>>;; = t}(E(E }$++--!ee$-//GGDIM"""HHTNNNHHJJJJdmU++Btydi000r(   r)   r*   endr,   c           	         t                               d| d|            |d}| j        }| j        k    s||k    rdS | j        z  }| j        z  } fdt	          ||dz             D             } fdt	          ||dz             D             } xj        t          |          z  c_         xj        t          |          z  c_        |r|                    d          }| j        z  }t          | j        z    j                  }	 xj
        |	|z
  z  c_
        t                               d| d	| d|	 d
                                ||	           j        ||	<    j                            |           | j        ||         S )NzMMap cache fetching -r   r(   c                &    g | ]}|j         v|S rB   rH   .0ir%   s     r&   
<listcomp>z$MMapCache._fetch.<locals>.<listcomp>   s%    UUUa@T@T@T@T@Tr(   rR   c                &    g | ]}|j         v |S rB   rd   re   s     r&   rh   z$MMapCache._fetch.<locals>.<listcomp>   s%    QQQaT[@P@P@P@P@Pr(   zMMap get block #z ())loggerdebugr   r   ranger#   lenr"   popminr$   r   rO   rH   add)
r%   r)   r`   start_block	end_blockneedhitsrg   sstartsends
   `         r&   r/   zMMapCache._fetch   s   9E99C99:::=E;)CDI#3t~-4>)	UUUU5i!m<<UUUQQQQ5i!m<<QQQ3t99$#d))# 
	 A'Fv.	::D&&$-7&&LLAAAAAA$AAABBB&*ll64&@&@DJvd{#KOOA  
	 z%)$$r(   dict[str, Any]c                >    | j                                         }|d= |S )NrO   )__dict__copyr%   states     r&   __getstate__zMMapCache.__getstate__   s!    ""$$'Nr(   r}   c                l    | j                             |           |                                 | _        d S rK   )rz   updaterN   rO   r|   s     r&   __setstate__zMMapCache.__setstate__   s-    U###^^%%


r(   )NN)r   r   r   r   r   r   rF   rG   rH   rI   r   r   )r   rP   r)   r*   r`   r*   r   r,   r   rx   r}   rx   r   r   )r9   r>   r?   r@   r   r'   rN   r/   r~   r   __classcell__r8   s   @r&   rD   rD   l   s          D  $"&& & & & & & &1 1 1 1,% % % %8   & & & & & & & &r(   rD   c                  0     e Zd ZdZdZd fd
ZddZ xZS )ReadAheadCachea!  Cache which reads only when we get beyond a block of data

    This is a much simpler version of BytesCache, and does not attempt to
    fill holes in the cache or keep fragments alive. It is best suited to
    many small reads in a sequential order (e.g., reading lines from a file).
    	readaheadr   r   r   r   r   r   r   c                x    t                                          |||           d| _        d| _        d| _        d S )Nr(   r   )rL   r'   rO   r)   r`   r%   r   r   r   r8   s       r&   r'   zReadAheadCache.__init__   s8    GT222

r(   r)   r*   r`   r,   c                   |d}||| j         k    r| j         }|| j         k    s||k    rdS ||z
  }|| j        k    r:|| j        k    r/| xj        dz  c_        | j        || j        z
  || j        z
           S | j        |cxk    r| j        k     rDn nA| xj        dz  c_        | j        || j        z
  d          }|t          |          z  }| j        }n| xj        dz  c_        d}t          | j         || j        z             }| xj	        ||z
  z  c_	        | 
                    ||          | _        || _        | j        t          | j                  z   | _        || j        d |         z   S Nr   r(   rR   )r   r)   r`   r"   rO   r#   rn   rp   r   r$   r   )r%   r)   r`   lparts        r&   r/   zReadAheadCache._fetch   s   =E;#	//)CDI#3%KDJ3$(??NNaNN:edj033CCDDZ5++++48+++++OOq OO:edj0223DTNAHEE OOq OOD$)S4>122""cEk1""\\%--

:DJ/dj!n$$r(   r;   r   r9   r>   r?   r@   r   r'   r/   r   r   s   @r&   r   r      sb          D     % % % % % % % %r(   r   c                  0     e Zd ZdZdZd fd
ZddZ xZS )FirstChunkCachezCaches the first block of a file only

    This may be useful for file types where the metadata is stored in the header,
    but is randomly accessed.
    firstr   r   r   r   r   r   r   c                l    ||k    r|}t                                          |||           d | _        d S rK   )rL   r'   rO   r   s       r&   r'   zFirstChunkCache.__init__   s:    tIGT222#'


r(   r)   r*   r`   r,   c                   |pd}|| j         k    rt                              d           dS t          || j                   }|| j        k     r| j        | xj        dz  c_        || j        k    rD| xj        |z  c_        |                     d|          }|d | j                 | _        ||d          S |                     d| j                  | _        | xj        | j        z  c_        | j        ||         }|| j        k    r6| xj        || j        z
  z  c_        ||                     | j        |          z  }| xj	        dz  c_	        |S | xj        dz  c_        | xj        ||z
  z  c_        |                     ||          S )Nr   z,FirstChunkCache: requested start > file sizer(   rR   )
r   rk   rl   rp   r   rO   r#   r$   r   r"   )r%   r)   r`   datar   s        r&   r/   zFirstChunkCache._fetch   s   
49LLGHHH3#ty!!4>!!z!1$''..#5..<<3//D!%&6&6!7DJ<'!\\!T^<<
**dn<**:eCi(DT^##**cDN.BB**T^S999NNaNNKOOq OO&&#+5&&<<s+++r(   r;   r   r   r   s   @r&   r   r      sb          D( ( ( ( ( (, , , , , , , ,r(   r   c                  ^     e Zd ZdZdZ	 dd fdZd ZddZddZd dZ	d! fdZ
d"dZ xZS )#
BlockCachea  
    Cache holding memory as a set of blocks.

    Requests are only ever made ``blocksize`` at a time, and are
    stored in an LRU cache. The least recently accessed block is
    discarded when more than ``maxblocks`` are stored.

    Parameters
    ----------
    blocksize : int
        The number of bytes to store in each block.
        Requests are only ever made for ``blocksize``, so this
        should balance the overhead of making a request against
        the granularity of the blocks.
    fetcher : Callable
    size : int
        The total size of the file being cached.
    maxblocks : int
        The maximum number of blocks to cache for. The maximum memory
        use for this cache is then ``blocksize * maxblocks``.
    
blockcache    r   r   r   r   r   	maxblocksr   r   c                    t                                          |||           t          j        ||z            | _        || _         t          j        |          | j                  | _	        d S rK   )
rL   r'   mathceilr!   r   	functools	lru_cache_fetch_block_fetch_block_cachedr%   r   r   r   r   r8   s        r&   r'   zBlockCache.__init__7  sd     	GT222y	!122"#A9#6y#A#A$BS#T#T   r(   c                4    | j                                         S z
        The statistics on the block cache.

        Returns
        -------
        NamedTuple
            Returned directly from the LRU Cache used internally.
        r   
cache_infor1   s    r&   r   zBlockCache.cache_info?       '22444r(   rx   c                    | j         }|d= |S )Nr   rz   r|   s     r&   r~   zBlockCache.__getstate__J  s    '(r(   r}   c                    | j                             |            t          j        |d                   | j                  | _        d S )Nr   )rz   r   r   r   r   r   r|   s     r&   r   zBlockCache.__setstate__O  sH    U####J9#6u[7I#J#J$
 $
   r(   r)   r*   r`   r,   c                    |d}|| j         }|| j         k    s||k    rdS || j        z  }|| j        z  }t          ||dz             D ]}|                     |           |                     ||||          S )Nr   r(   rR   start_block_numberend_block_number)r   r   rm   r   _read_cache)r%   r)   r`   r   r   block_numbers         r&   r/   zBlockCache._fetchU  s    =E;)CDI#3 #dn4$.0 ""46F6JKK 	3 	3L$$\22221-	   
 
 	
r(   r   c                <   || j         k    rt          d| d| j          d          || j        z  }|| j        z   }| xj        ||z
  z  c_        | xj        dz  c_        t
                              d|           t                                          ||          }|S )=
        Fetch the block of data for `block_number`.
        'block_number=(' is greater than the number of blocks (rj   rR   zBlockCache fetching block %d)	r!   
ValueErrorr   r$   r#   rk   inforL   r/   )r%   r   r)   r`   block_contentsr8   s        r&   r   zBlockCache._fetch_blockl  s     $,&&9 9 9)-9 9 9  
 t~-dn$""cEk1""12LAAAs33r(   r   r   c           	        || j         z  }|| j         z  }| xj        dz  c_        ||k    r|                     |          }|||         S |                     |          |d         g}|                    t	          | j        t          |dz   |                               |                    |                     |          d|                    d                    |          S z
        Read from our block cache.

        Parameters
        ----------
        start, end : int
            The start and end byte positions.
        start_block_number, end_block_number : int
            The start and end block numbers.
        rR   Nr(   r   r"   r   extendmaprm   appendjoin	r%   r)   r`   r   r   	start_posend_posblockouts	            r&   r   zBlockCache._read_cache~  s     DN*	&!!111334FGGE7*++ ++,>??	

KLC
 JJ,,q02BCC    JJt//0@AA(7(KLLL88C== r(   r   
r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r,   
r)   r   r`   r   r   r   r   r   r   r,   )r9   r>   r?   r@   r   r'   r   r~   r   r/   r   r   r   r   s   @r&   r   r     s         , D MOU U U U U U U	5 	5 	5   

 
 
 

 
 
 
.     $&! &! &! &! &! &! &! &!r(   r   c                  H     e Zd ZU dZdZded<   	 dd fdZddZddZ xZ	S )
BytesCacheaK  Cache which holds data in a in-memory bytes object

    Implements read-ahead by the block size, for semi-random reads progressing
    through the file.

    Parameters
    ----------
    trim: bool
        As we read more data, whether to discard the start of the buffer when
        we are more than a blocksize ahead of it.
    r,   r   r   Tr   r   r   r   r   trimboolr   r   c                    t                                          |||           d| _        d | _        d | _        || _        d S )Nr(   )rL   r'   rO   r)   r`   r   )r%   r   r   r   r   r8   s        r&   r'   zBytesCache.__init__  sA     	GT222
!%
#			r(   r)   r*   r`   c                V   |d}|| j         }|| j         k    s||k    rdS | j        L|| j        k    rA| j        :|| j        k     r/|| j        z
  }| xj        dz  c_        | j        |||z   |z
           S | j        rt          | j         || j        z             }n|}||k    s|| j         k    rdS | j        || j        k     rY| j        || j        k    rG| xj        ||z
  z  c_        | xj        dz  c_        | 	                    ||          | _        || _        nu| j        J | j        J | xj        dz  c_        || j        k     r| j        | j        |z
  | j        k    r6| xj        ||z
  z  c_        | 	                    ||          | _        || _        n| xj        | j        |z
  z  c_        | 	                    || j                  }|| _        || j        z   | _        n| j        || j        k    r| j        | j         k    rn|| j        z
  | j        k    r6| xj        ||z
  z  c_        | 	                    ||          | _        || _        nB| xj        || j        z
  z  c_        | 	                    | j        |          }| j        |z   | _        | j        t          | j                  z   | _        || j        z
  }| j        |||z   |z
           }| j        rT| j        | j        z
  | j        dz   z  }|dk    r4| xj        | j        |z  z  c_        | j        | j        |z  d          | _        |S r   )r   r)   r`   r"   rO   r   rp   r$   r#   r   rn   r   )r%   r)   r`   offsetbendnewr   nums           r&   r/   zBytesCache._fetch  sa    =E;)CDI#3J"##$dh TZ'FNNaNN:fv|e';;<<> 	ty#"677DDD5==EDI--3J%$*"4"4Hdh &&$,6&&OOq OOeT22DJDJJ:)))8'''OOq OOtz!!8#tx#~'F'F..$,>..!%eT!:!:DJ!&DJJ..$*u2DD..,,udj99C!&DJ!$tz!1DJJ%$//8di''48^dn44..$,>..!%eT!:!:DJ!&DJJ..$/A..,,tx66C!%c!1DJ:DJ/#j&3,"6679 	@8dj(dnq.@ACQww

dns22

!Z(<(>(>?

r(   c                *    t          | j                  S rK   )rn   rO   r1   s    r&   __len__zBytesCache.__len__  s    4:r(   )T)
r   r   r   r   r   r   r   r   r   r   r   )r   r   )
r9   r>   r?   r@   r   rA   r'   r/   r   r   r   s   @r&   r   r     s         
 
 "D!!!! IM      G G G GR       r(   r   c                  F     e Zd ZU dZdZded<   	 	 	 	 dd fdZddZ xZS )AllBytesz!Cache entire contents of the fileallr   r   Nr   r*   r   Fetcher | Noner   r   bytes | Noner   r   c                    t                                          |||           |@| xj        dz  c_        | xj        | j        z  c_        |                     d| j                  }|| _        d S )NrR   r   )rL   r'   r#   r$   r   r   r   )r%   r   r   r   r   r8   s        r&   r'   zAllBytes.__init__  sl     	GT222<OOq OO&&$)3&&<<49--D			r(   r)   r+   r,   c                @    | xj         dz  c_         | j        ||         S )NrR   )r"   r   r.   s      r&   r/   zAllBytes._fetch  s#    !yt$$r(   )NNNN)
r   r*   r   r   r   r*   r   r   r   r   r<   	r9   r>   r?   r@   r   rA   r'   r/   r   r   s   @r&   r   r     s}         ++D !%"&!      % % % % % % % %r(   r   c                  F     e Zd ZU dZdZded<   	 	 dd fdZd fdZ xZS )KnownPartsOfAFilea  
    Cache holding known file parts.

    Parameters
    ----------
    blocksize: int
        How far to read ahead in numbers of bytes
    fetcher: func
        Function of the form f(start, end) which gets bytes from remote as
        specified
    size: int
        How big this file is
    data: dict
        A dictionary mapping explicit `(start, stop)` file-offset tuples
        with known bytes.
    strict: bool, default True
        Whether to fetch reads that go beyond a known byte-range boundary.
        If `False`, any read that ends outside a known part will be zero
        padded. Note that zero padding will not be used for reads that
        begin outside a known byte-range.
    partsr   r   NTr   r   r   r   r   r   &Optional[dict[tuple[int, int], bytes]]strictr   _r   c                `   t                                          |||           || _        |rt          |                                          }|d         g}|                    |d                   g}	|dd          D ]\  }
}|d         \  }}|
|k    r-||f|d<   |	dxx         |                    |
|f          z  cc<   C|                    |
|f           |	                    |                    |
|f                     t          t          ||	                    | _	        d S i | _	        d S )Nr   rR   )
rL   r'   r   sortedkeysro   r   dictzipr   )r%   r   r   r   r   r   r   old_offsetsoffsetsrH   r)   r+   start0stop0r8   s                 r&   r'   zKnownPartsOfAFile.__init__=  s4    	GT222  	 --K"1~&Ghh{1~../F*122 ; ;t 'E>>#)4.GBK2JJJ$((E4="9"99JJJJNNE4=111MM$((E4="9"9::::S&1122DIIIDIIIr(   r)   r*   r+   r   r,   c                   |d}|| j         }d}| j                                        D ]w\  \  }}}||cxk    r|k     rbn ||z
  }||||z   |z
           }| j        r||cxk    r|k    r2n n/|d||z
  t	          |          z
  z  z  }| xj        dz  c_        |c S |} nx| j        t          d||f d          t          j	        d||f d           t                              d| d	|            | xj        ||z
  z  c_        | xj        dz  c_        |t                                          ||          z   S )
Nr   r(       rR   z&Read is outside the known file parts: z. z%. IO/caching performance may be poor!z!KnownPartsOfAFile cache fetching rb   )r   r   itemsr   rn   r"   r   r   warningswarnrk   rl   r$   r#   rL   r/   )	r%   r)   r+   r   loc0loc1r   offr8   s	           r&   r/   zKnownPartsOfAFile._fetch[  s   =E<9D"&)//"3"3 	 	LT4$ u####t#####dl3te!334{ dd&:&:&:&:d&:&:&:&:&:
 7dUlSXX&=>>CNNa'NNJJJ
 !EE! $* <WudmWWWXXX 	3eT] 3 3 3	
 	
 	
 	GGGGGHHH""dUl2""1UWW^^E40000r(   )NT)r   r   r   r   r   r   r   r   r   r   r   r   r<   r   r   s   @r&   r   r   $  s          , "D!!!! 8<      <+1 +1 +1 +1 +1 +1 +1 +1 +1 +1r(   r   c                  X    e Zd ZdZ G d de          ZdddZddZddZddZ	ddZ
dS ) UpdatableLRUzg
    Custom implementation of LRU cache that allows updating keys

    Used by BackgroudBlockCache
    c                  8    e Zd ZU ded<   ded<   ded<   ded<   dS )UpdatableLRU.CacheInfor   ru   missesmaxsizecurrsizeN)r9   r>   r?   rA   rB   r(   r&   	CacheInfor     s4         			r(   r      funcCallable[P, T]max_sizer   r   r   c                    t          j                    | _        || _        || _        d| _        d| _        t          j                    | _	        d S r    )
collectionsr   _cache_func	_max_size_hits_misses	threadingLock_lock)r%   r   r   s      r&   r'   zUpdatableLRU.__init__  sA    +6+B+D+D
!
^%%


r(   argsP.argskwargsP.kwargsr   c                &   |r$t          d|                                           | j        5  || j        v rC| j                            |           | xj        dz  c_        | j        |         cd d d            S 	 d d d            n# 1 swxY w Y    | j        |i |}| j        5  || j        |<   | xj        dz  c_        t          | j                  | j	        k    r| j        
                    d           d d d            n# 1 swxY w Y   |S )Nz Got unexpected keyword argument rR   Flast)	TypeErrorr   r	  r  move_to_endr  r  r  rn   r  popitem)r%   r
  r  results       r&   __call__zUpdatableLRU.__call__  s    	PNv{{}}NNOOOZ 	) 	)t{""''---

a

{4(		) 	) 	) 	) 	) 	) 	) 	)"	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) T,V,,Z 	0 	0 &DKLLALL4;$.00###///		0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 s%   A BBB'ADD
D
r   r   c                V    | j         5  || j        v cd d d            S # 1 swxY w Y   d S rK   )r	  r  )r%   r
  s     r&   is_key_cachedzUpdatableLRU.is_key_cached  sx    Z 	' 	'4;&	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	's   	""r  c                    | j         5  || j        |<   t          | j                  | j        k    r| j                            d           d d d            d S # 1 swxY w Y   d S )NFr  )r	  r  rn   r  r  )r%   r  r
  s      r&   add_keyzUpdatableLRU.add_key  s    Z 	0 	0 &DK4;$.00###///	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0s   AAAAr   c                    | j         5  |                     | j        t          | j                  | j        | j                  cd d d            S # 1 swxY w Y   d S )N)r   r   ru   r   )r	  r   r  rn   r  r  r  r1   s    r&   r   zUpdatableLRU.cache_info  s    Z 	 	>>T[))Z|	 "  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   :AAAN)r   )r   r   r   r   r   r   )r
  r  r  r  r   r   )r
  r   r   r   )r  r   r
  r   r   r   r   r   )r9   r>   r?   r@   r   r   r'   r  r  r  r   rB   r(   r&   r   r     s             J   & & & & &   &' ' ' '0 0 0 0     r(   r   c                  n     e Zd ZU dZdZded<   	 d!d" fdZd#dZd$dZd%dZ	d&dZ
d'd( fdZd)d Z xZS )*BackgroundBlockCachea  
    Cache holding memory as a set of blocks with pre-loading of
    the next block in the background.

    Requests are only ever made ``blocksize`` at a time, and are
    stored in an LRU cache. The least recently accessed block is
    discarded when more than ``maxblocks`` are stored. If the
    next block is not in cache, it is loaded in a separate thread
    in non-blocking way.

    Parameters
    ----------
    blocksize : int
        The number of bytes to store in each block.
        Requests are only ever made for ``blocksize``, so this
        should balance the overhead of making a request against
        the granularity of the blocks.
    fetcher : Callable
    size : int
        The total size of the file being cached.
    maxblocks : int
        The maximum number of blocks to cache for. The maximum memory
        use for this cache is then ``blocksize * maxblocks``.
    
backgroundr   r   r   r   r   r   r   r   r   r   r   c                >   t                                          |||           t          j        ||z            | _        || _        t          | j        |          | _        t          d          | _
        d | _        d | _        t          j                    | _        d S )NrR   max_workers)rL   r'   r   r   r!   r   r   r   r   r   _thread_executor_fetch_future_block_number_fetch_futurer  r  _fetch_future_lockr   s        r&   r'   zBackgroundBlockCache.__init__  s     	GT222y	!122"#/0A9#M#M  2q A A A6:'37"+."2"2r(   r   c                4    | j                                         S r   r   r1   s    r&   r   zBackgroundBlockCache.cache_info  r   r(   rx   c                2    | j         }|d= |d= |d= |d= |d= |S )Nr   r"  r#  r$  r%  r   r|   s     r&   r~   z!BackgroundBlockCache.__getstate__  s:    '($%.//"&'r(   c                    | j                             |           t          | j        |d                   | _        t          d          | _        d | _        d | _        t          j
                    | _        d S )Nr   rR   r   )rz   r   r   r   r   r   r"  r#  r$  r  r  r%  r|   s     r&   r   z!BackgroundBlockCache.__setstate__  sk    U####/0A5CU#V#V  2q A A A*.'!"+."2"2r(   r)   r*   r`   r,   c                V   |d}|| j         }|| j         k    s||k    rdS || j        z  }|| j        z  }d }d }| j        5  | j        | j        J | j                                        r`t                              d           | j        	                    | j        
                                | j                   d | _        d | _        n@t          || j        cxk    o|k    nc           }|r| j        }| j        }d | _        d | _        d d d            n# 1 swxY w Y   |Gt                              d           | j        	                    |
                                |           t          ||dz             D ]}|                     |           |dz   }	| j        5  | j        R|	| j        k    rG| j                            |	          s-|	| _        | j                            | j        |	d          | _        d d d            n# 1 swxY w Y   |                     ||||          S )Nr   r(   z3BlockCache joined background fetch without waiting.z(BlockCache waiting for background fetch.rR   asyncr   )r   r   r%  r$  r#  donerk   r   r   r  r  r   rm   r!   r  r"  submitr   r   )
r%   r)   r`   r   r   fetch_future_block_numberfetch_future	must_joinr   end_block_plus_1s
             r&   r/   zBackgroundBlockCache._fetch
  s,   =E;)CDI#3 #dn4$.0$(!$ 	2 	2!-6BBB%**,, 2KK UVVV,44*1133T5T   7;D3)-D&& !%*:, , , ,+, , , ,! !I
 ! 2 594S1'+'9 ;?7-1*7	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2< #KKBCCC$,,##%%'@  
 ""46F6JKK 	3 	3L$$\2222 ,a/$ 		 		"*$440>>?OPP 5 3C/%)%:%A%A%'7& &"		 		 		 		 		 		 		 		 		 		 		 		 		 		 		 1-	   
 
 	
s&    C
DDD!AHHHsyncr   log_infor3   c                >   || j         k    rt          d| d| j          d          || j        z  }|| j        z   }t                              d||           | xj        ||z
  z  c_        | xj        dz  c_        t                                          ||          }|S )r   r   r   rj   z!BlockCache fetching block (%s) %drR   )	r!   r   r   rk   r   r$   r#   rL   r/   )r%   r   r2  r)   r`   r   r8   s         r&   r   z!BackgroundBlockCache._fetch_blockV  s     $,&&9 9 9)-9 9 9  
 t~-dn$7<PPP""cEk1""1s33r(   r   r   c           	        || j         z  }|| j         z  }| xj        dz  c_        ||k    r|                     |          }|||         S |                     |          |d         g}|                    t	          | j        t          |dz   |                               |                    |                     |          d|                    d                    |          S r   r   r   s	            r&   r   z BackgroundBlockCache._read_cacheh  s     DN*	& 	!!111,,-?@@E7*++ ++,>??	

KLC
 JJ,,q02BCC    JJt//0@AA(7(KLLL88C== r(   r   r   r  r   r=   r   )r1  )r   r   r2  r3   r   r,   r   )r9   r>   r?   r@   r   rA   r'   r   r~   r   r/   r   r   r   r   s   @r&   r  r    s          2 'D&&&& MO3 3 3 3 3 3 3	5 	5 	5 	5   3 3 3 3J
 J
 J
 J
X      $(! (! (! (! (! (! (! (!r(   r  z!dict[str | None, type[BaseCache]]cachesFclstype[BaseCache]clobberr   r   r   c                ~    | j         }|s)|t          v r t          d|dt          |                    | t          |<   dS )z'Register' cache implementation.

    Parameters
    ----------
    clobber: bool, optional
        If set to True (default is False) - allow to overwrite existing
        entry.

    Raises
    ------
    ValueError
    zCache with name z is already known: N)r   r5  r   )r6  r8  r   s      r&   register_cacher:    sL     8D Wtv~~UDUUvd|UUVVVF4LLLr(   )F)r6  r7  r8  r   r   r   ).
__future__r   r  r   loggingr   rV   r  r   concurrent.futuresr   r   typingr   r   r   r	   r
   r   r   r   r   rE   typing_extensionsr   r   r   	getLoggerrk   r   r,   r   r   rD   r   r   r   r   r   r   r   r  r5  rA   r:  crB   r(   r&   <module>rB     s   " " " " " " "           				      9 9 9 9 9 9 9 9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  KKK++++++	#AAAGCLL 
	8	$	$
C:u$
%A A A A A A A AHS& S& S& S& S&	 S& S& S&l+% +% +% +% +%Y +% +% +%\+, +, +, +, +,i +, +, +,\F! F! F! F! F! F! F! F!Rb b b b b b b bJ% % % % %y % % %0b1 b1 b1 b1 b1	 b1 b1 b1J9 9 9 9 971a4= 9 9 9xK! K! K! K! K!9 K! K! K!` 	)-        ( 

  A N1 r(   