mò Mã¸Ec@sÝdZdkZdkZdkZdkZdkZdkZdklZl Z ei dƒZ de fd„ƒYZ de fd„ƒYZde fd „ƒYZd Zd Zd d dZd„Zde fd„ƒYZdS(s’Disk-based client cache for ZEO. ClientCache exposes an API used by the ZEO client storage. FileCache stores objects on disk using a 2-tuple of oid and tid as key. ClientCache's API is similar to a storage API, with methods like load(), store(), and invalidate(). It manages in-memory data structures that allow it to map this richer API onto the simple key-based API of the lower-level FileCache. N(sz64su64s ZEO.cachet ClientCachecBsÜtZdZedddd„Zd„Zd„Zd„Zd„Zd „Z d d „Z d „Z d „Z d„Z d„Zd„Zd„Zd„Zd„Zd„Zd„Zd d eedeieid„ZRS(sA simple in-memory cache.iÈiicCsY||_||_h|_h|_h|_t||i|ƒ|_|i|iƒdS(N( tpathtselftsizetcurrentt noncurrenttversiont FileCachetfct _setup_trace(RRR((t(/data/zmath/zope/lib/python/ZEO/cache.pyt__init__Os     cCs|ii|iƒdS(N(RRtscantinstall(R((R topenoscCsõti||idtƒ}|djodSn|id}|i o|i |i f|i |R=((R t_remove_noncurrent_revisions+s c Cs]||iijo!|dj o|ii|ƒn|dj} ||ijo…|id|||ƒ|i|\}}| p||jpt ||f‚|ii ||fƒ||ijpt ‚t } n| o|i|||ƒn|ii|ƒ}|p|id|||ƒdSn| oK|id|||ƒ|ii ||fƒ||ijpt ‚dSn|dj o ||jpt ‚|id|||ƒ|i|=|ii||fƒ}|dj pt ‚|idjpt ‚|djodSn||_|ii|ƒ|ii|gƒ}ti|||fƒdS(Niiii(R%RRRR$tremove_all_knowledge_of_oidRRR+t dllversiontdlltidRR@RRARRtcur_tidR,RRtupdateRR:R0RR ( RRRR%RDR0RRERCRB((R t invalidateGsB  % !   cCsJt|iƒt|iƒ}|io |ttt|iƒƒ7}n|S(N(R-RRRtnRtsumtmap(RRH((R t__len__‡s  ccsmxf|iD][}|i\}}||ijo)|ii|iƒ}|||ifVq ||dfVq WdS(NR)( RRRRRR%RR,tobj(RR%RRLR((R tcontentss cCsèdkl}dGt|ƒGHt|iƒƒ}|iƒx6|D].\}}}||ƒG||ƒGt |ƒGHq?WdGHt|i ƒ}|id„ƒxK|D]C}|ipt}||idƒG||idƒG||ƒGHqœWHdS(N(soid_reprs cache sizes dll contentscCst|i|iƒS(N(tcmptxRty(RORP((R t¤sii(t ZODB.utilstoid_reprR-RtlistRMR0tsortRR%RtreprRRORR'R(RRRR0RR%RORS((R tdump›s  #1cCs®|i\}}|idjo&|io|i|=qª|i|=nf|i |}|i |if}t |ƒdjo&|d|jpt‚|i |=n|i|ƒdS(Nii(RRRR%RRRRRRR0RtelementR-RR@(RRRR0RXR%((R t_evictedªs  cCsÂd|_|oˆtiidƒou|d}y#t|dƒ|_|i dƒWn1t j o%}d|_t i d||ƒq˜Xt id|ƒn|idjod„}||_ ndS(NtZEO_CACHE_TRACEs.tracetabiscannot write tracefile %r (%s)sopened tracefile %rcOsdS(N((targstkws((R tnotraceÕs(RRR"RtostenvironRttfnRR+tIOErrortmsgtloggertwarningtinfoR^(RRRaR^Rc((R R Çs    ic Cs§|o|dO}n|dd@|B} |djo t}n|djo t}ny6|i i |d|ƒ| t |ƒ||ƒ|ƒWn| G| GH‚nXdS(Ni€iÿiÿÿs>iiH8s8s(RtcodeR7tencodedR%RR'RRR"twritet struct_packt time_timeR-R( RRgRRR%RR7RkRjRh((R R+Ùs       (t__name__t __module__t__doc__RR RR R!R&R(R/R5R6R<RARGRKRMRWRYR R'ttimetstructtpackR+(((R RCs&         ,  @   RcBs}tZdZdZeieƒZedjpt‚ed Zd „Z d „Z d „Z d „Z e d„ZeeƒZRS(NRRRRR.Rs>8shiiicCsb||_||_||_||_||_|dj o$|it|ƒt|ƒ|_ ndS(N( RRRR.RRRtTOTAL_FIXED_SIZER-R(RRRR.RR((R R /s      cCs5ti|i|iptt|iƒt|iƒƒS(N( RpRqRtfmtRR'R-RR.(R((R t get_header>s   cCs0|i|iƒ|i|i|idgƒdS(Ni(Rt writelinesRRtRR.R(RR((R t serializeGscCs|i|iƒƒdS(N(RRiRRt(RR((R tserialize_headerRsc Cs/|i|iƒ}|pdSn|\}} t i |i |ƒ\}}}|tjo d}n|i|ƒ} |t| ƒjotdƒ‚n|od} |i|dƒn3|i|ƒ} |t| ƒjotdƒ‚n|idƒ}||jotdƒ‚n||| f| | | |ƒS(Nscorrupted record, versioniscorrupted record, dataiscorrupted record, oid(RtreadtclstFIXED_HEADER_SIZEtsRRRRRptunpackRsRtvlenR7R'RR-R8RR.tseek( RyRRRR7RRR}R{RRR.((R R^s(    (skeys start_tidsend_tidsversionsdatassize(RlRmt __slots__RsRptcalcsizeRzRRrR RtRvRwtFalseRt classmethod(((R Rs'   tEntrycBstZdZddd„ZRS(NRtoffsetcCs||_||_dS(N(RRR„(RRR„((R R ‹s (skeysoffset(RlRmRRR (((R Rƒ~s tZEC3i iiicCs5|iƒttdƒoti|iƒƒndS(Ntfsync(RtflushthasattrR_R†tfileno(R((R R#Ås RcBs­tZd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Z d „Z d „Z d „Z d „Z d „Zd„Zd„Zd„Zd„Zed„ZRS(NcCs…||_||_d|_h|_h|_t|_||_ |o0t i i |ƒod|_ tid|ƒn|o&t|dƒ|_ tid|ƒn&tiƒ|_ tid|i iƒ|i i|idƒ|i idƒ|i iƒ|i idƒ|i itƒ|i itƒ|i idtid |itƒƒ|iƒ|itdf|it<|iƒdS( Ns reusing persistent cache file %rswb+s created persistent cache file %rscreated temporary cache file %riROiRs>I(tmaxsizeRtparentRR%tfilemapt key2entrytZEC3_HEADER_SIZEt currentofstfpathR_RtexistsRRdRfRttempfilet TemporaryFiletnameR~RittruncatetmagicR'RpRqR#t clearStats(RRŠRR‹((R R Ìs2         ' c Cs¿|idj odSntii|iƒ}||ijo)t i d|i||iƒ||_nt |idƒ|_|ii dƒ}|tjotd|ƒ‚n|ii dƒ|_t|iƒdjotdƒ‚nd}} t} xz| |jol|ii| ƒd}|ii dƒ}|d jo}tid |ii d ƒƒ\}} | d | df}||ijpt‚t || ƒ|i|<}||i|ƒno|d jo%tid |ii dƒƒ\}n=|djot"|ƒ}n tddt#t$|ƒƒƒ‚||f|i%| <|djo||jo|| }} n| |7} qüW| |jotd| |fƒ‚nt&o|i'ƒn| |_(dS(Ns=existing cache file %r has size %d; requested size %d ignoredsrb+isunexpected magic number: %ris'cache file too small -- no tid at startiitas>I16siRs>It1234s1unknown status byte value %s in client cache files4final offset %s != file size %s in client cache file()RRRR_RtgetsizeRtfsizeRŠRdReRRxt_magicR–R8R%R-t max_free_sizetmax_free_offsetRŽtofsR~RtstatusRpR|RtrawkeyRRRRƒR tintthextordRŒt __debug__t_verify_filemapR( RR RRR›RR RRœR¡RŸRž((R R #sV       $ %   cCs-d|_|_d|_|_d|_dS(Ni(Rt_n_addst_n_added_bytest _n_evictst_n_evicted_bytest _n_accesses(R((R R—YscCs"|i|i|i|i|ifS(N(RR§R¨R©RªR«(R((R tgetStats^scCs t|iƒS(N(R-RR(R((R RKfscCs |iiƒS(N(RRt itervalues(R((R t__iter__kscCs ||ijS(N(RRR(RR((R t __contains__pscCst|iƒdS(N(R#RR(R((R R#vscCs2|io$|iƒ|iiƒd|_ndS(N(RRR#R!R(R((R R!|s   cCsÓd|jo|itjnpt‚|i||ijo t|_n|i}xl|djo^|ii|ƒ\}}|dj o!|i |i =|i||ƒn||7}||8}q\W||iS(Ni(tnbytesRRŠRŽRRRŸRŒtpopRteRRRt _evictobj(RR°R²RŸR((R t _makerooms,      cCsKt|i}||jpt‚||}|djo d}n2|djod|}ndtid|ƒ}|i i |i ƒ|i i dtid||id|id ƒfƒ|i|i ƒ|i i|ƒt|i|i ƒ}||i|i<||f|i|i <|i |7_ |o|df|i|i IR˜s>I8s8si(tOBJECT_HEADER_SIZERLRt nfreebytesRtexcesstextraRpRqRRR~RRuRRvRiRƒR²RRŒR(RRLR·R¹R¸R²R((R t _writeobj¡s&     cCsÆt|i}||itjodSn|i|ijpt‚t |idƒdjpt‚t |idƒdjpt‚|i d7_ |i |7_ |i |ƒ}|i||ƒdS(Niii(R¶tobjectRRRŠRŽRRRR-R§R¨R´t availableRº(RR»R¼R((R R;Äs !!cCsg|id7_|i|7_|ii|itƒt i |i|i dt ƒ}|ii|ƒdS(NiR(RR©RªRRR~R²R„R¶RRRRRR‹RY(RR²RR((R R³Ýs cCs|id7_|ii|ƒ}|djodSn|i}|i|\}}||jpt ‚|i i |tƒti|i |ƒS(Ni(RR«RRRR²RR„RŒRte2RRR~R¶RR(RRR²R„R½R((R R,ès  cCsñ|ii|dƒ}|djodSn|i}|i|\}}||jpt ‚|df|i|<|i i |t ƒti|i |dtƒ}|djpt ‚|i i |ƒ|i idƒ|i iƒ|ii|ƒdS(NRiR(RRR±RRR²R„RŒRR½RRR~R¶RRRRRiR‡R‹RY(RRR²RR„R½R((R R@ös    cCs;|i|i}|ii|itƒ|i |iƒdS(N( RRRLRR²RR~R„R¶Rw(RRLR²((R RFscCs³|idj o9||ijo)tdt|ƒt|iƒfƒ‚nt|tƒot|ƒdjpt‚||_|i i tt ƒƒ|i i |ƒ|i i ƒdS(Ns8new last tid (%s) must be greater than previous one (%s)i(RR%RR8tu64t isinstancetstrR-RRR~R–RiR‡(RR%((R R$"s )* cCsmt}|i}x4||ijo#|i|ƒ|idƒ}|djo"ti d|idƒƒ\}n t |ƒ}|o*||i jodGnd||fGn|i|\}}||jpt‚|dj |djjpt‚|dj o9|i|jpt‚|i|i|jpt‚n||7}qW|oHn||ijpt‚dS(Nitafs>Iis*****s%c%dR˜(RŽR˜RRRŠR~RxR RpR|RR¢tdisplayRRŒtsize2RLRRR„RR(RRÂR˜R RLRÃRR((R R¦0s.   "   "(RlRmR R R—R¬RKR®R¯R#R!R´RºR;R³R,R@RFR$RR¦(((R RÊs$ W 6         #   " (RnRtloggingR_RpR’RoRRR'R¾t getLoggerRdR»RRRƒR–RŽR¶R#R(R–RRÄRpRR¾R#RR’RŽRoRƒRdR¶R_RR'((R t?s"      !ÿÀ|