-ķ Ś„?csĒdZnpdkZqdkZrdkZsdklZlZtdklZvdk l Z l Z l Z xdk Z ydklZ{dZ|dZ~dd Z€d fd „ƒYZdS( s7 Implement a client cache The cache is managed as two files. The cache can be persistent (meaning it is survives a process restart) or temporary. It is persistent if the client argument is not None. Persistent cache files live in the var directory and are named 'c--.zec' where is the storage argument (default '1'), is the client argument, and is 0 or 1. Temporary cache files are unnamed files in the standard temporary directory as determined by the tempfile module. Each cache file has a 12-byte header followed by a sequence of records. The header format is as follows: offset in header: name -- description 0: magic -- 4-byte magic number, identifying this as a ZEO cache file 4: lasttid -- 8-byte last transaction id Each record has the following form: offset in record: name -- description 0: oidlen -- 2-byte unsigned object id length 2: reserved (6 bytes) 8: status -- 1-byte status 'v': valid, 'n': non-version valid, 'i': invalid ('n' means only the non-version data in the record is valid) 9: tlen -- 4-byte (unsigned) record length 13: vlen -- 2-byte (unsigned) version length 15: dlen -- 4-byte length of non-version data 19: serial -- 8-byte non-version serial (timestamp) 27: oid -- object id 27+oidlen: data -- non-version data 27+oidlen+dlen: version -- Version string (if vlen > 0) 27+oidlen+dlen+vlen: vdlen -- 4-byte length of version data (if vlen > 0) 31+oidlen+dlen+vlen: vdata -- version data (if vlen > 0) 31+oidlen+dlen+vlen+vdlen: vserial -- 8-byte version serial (timestamp) (if vlen > 0) 27+oidlen+dlen (if vlen == 0) **or** 39+oidlen+dlen+vlen+vdlen: tlen -- 4-byte (unsigned) record length (for redundancy and backward traversal) 31+oidlen+dlen (if vlen == 0) **or** 43+oidlen+dlen+vlen+vdlen: -- total record length (equal to tlen) There is a cache size limit. The cache is managed as follows: - Data are written to file 0 until file 0 exceeds limit/2 in size. - Data are written to file 1 until file 1 exceeds limit/2 in size. - File 0 is truncated to size 0 (or deleted and recreated). - Data are written to file 0 until file 0 exceeds limit/2 in size. - File 1 is truncated to size 0 (or deleted and recreated). - Data are written to file 1 until file 1 exceeds limit/2 in size. and so on. On startup, index information is read from file 0 and file 1. Current serial numbers are sent to the server for verification. If any serial numbers are not valid, then the server will send back invalidation messages and the cache entries will be invalidated. When a cache record is invalidated, the data length is overwritten with ''. If var is not writable, then temporary files are used for file 0 and file 1. N(spacksunpack(s allocate_lock(soid_reprsu64sz64(sICachesZEC2i iis ClientCachecsG€tZ‚eZ„ddeeed„ZŹd„Zßd„Zéd„Z ųd„Z d„Z d „Z d „Z $d „ZId „Z›eeeed „Z×d„Zżd„Z)d„ZPd„Z[d„Zd„Z•ddddeied„Z§d„Z÷d„Züeid„ZRS(Ns1icsN„‹||_Œ|d|_||_Žt|_‘t ƒ}’|i |_ “|i |_•|tj oł—|tjo˜tiƒ}nštii|d||fƒ} œ| d| dg|_}ttg|_}žd|_Ÿttg}  x£ddfD ]’} ”tii|| ƒor¢t|| dƒ}£|i dƒt!jo§|i dƒ| | |o|d d !d jo*?|id ||ƒA|id ƒn4C|id||ƒD|i|=E|idƒWdFG|iƒXdS(NiiisCinvalidate: short record for oid %s at position %d in cache file %ds>HisMinvalidate: oid mismatch: expected %s read %s at position %d in cache file %diiisisnisi(sselfs_acquires_getsoidsNonesps_tracesversions_fsfsabssapsseeksreadshslenslogsoid_reprs_indexsunpacksoidlensrec_oidswrites_release( sselfsoidsversionspsoidlenshsfsapsrec_oid((s7/usr/pkg/lib/python2.2/site-packages/ZEO/ClientCache.pys invalidate$s:  )  2   c sIJ|iƒKzäL|i|tƒ} M| tjo!N|id||ƒOtSnP|i| dj} Qt | ƒ}R| i } S| i }T| |ƒU|dƒ} Vtd| d ƒd}W||ƒ}Xt| ƒdjo| ddjo ||jo&Ytd| d d !ƒ\}}} n [d }\|djp(|djp| djp|| |joA]|id t|ƒ|| djfƒ`|i|=atSnc| dd johd|o!e|id||ƒftSng| o.i|id||ƒj|i|=ktSnnm| p| oįn| o¶o|| ƒ}p|id||| d | ƒq| dj|ijoYt|ou||dƒ}n wt}x|i|||| || y|||ƒ nz|| d fSn||id||ƒ}tSn| o€| | dƒn||dƒ}‚|d }ƒ||joĢ„| o”…| |d|ƒ†|| ƒ}‡|id||| d | ƒˆ| dj|ijo/‰|i|||| || Š|||ƒ n‹|| d fSn|id||ƒŽtSntd|dƒd}‘||ƒ}’|dƒ}“|id||||ƒ”| dj|ijo5•|i|||| || –|t|||ƒ n—||fSWd˜™|i!ƒXdS(Ni iis>Hiisnvs>iHii ii’’’’s;load: bad record for oid %s at position %d in cache file %dsni"i$i*ii&iiü’’’i,i(s>ii.("sselfs_acquires_getsoidsNonesps_tracesversions_fsfsabssapsseeksreadshsunpacksoidlensrec_oidslenstlensvlensdlenslogsoid_reprs_indexsdatas_currentsvheaders_copytocurrentsvsvdlensvdatasvserials_release(sselfsoidsversionsoidlensvlensreadsapsvdatasdatasdlensseeksfshspsrec_oidstlensvdlensvsvheadersvserial((s7/usr/pkg/lib/python2.2/site-packages/ZEO/ClientCache.pysloadIs†     4& ;)                c s󛢣|i||ijo ¤dSn„to#t|ƒdjptt|ƒ‚¦|ddjoO©d||}Ŗd}«t } ®|d t d|||ƒ|d }n#°to|dd jpt‚±|i|i } ²|t joO³| i|d|ƒ“| i|ƒ}µt|ƒ|jo ¶dSnn·|||g} ø|o4¹to| t j pt‚ŗ| i| ƒ»to | t j| t jjpt‚¼| t joؽtd | d ƒd}¾| i|d|||d ƒæ| i|ƒ} Ąt| ƒ|jo ĮdSnĀ| idƒ} Ćt| ƒdjo ÄdSnnÅ| i| ƒĘ| i| ƒnKČto@t | jo| jo | jnpt|| | | f‚Ź| i|dd!ƒĖ|i|i}Ģ|i|iƒĶ|i| ƒĪto!|iƒ|i|jpt‚Ļ|ioŠ|i |i|IHIių’’’svs>Iiü’’’ii ijs(!sselfs_posstlens_limits __debug__slensheadersAssertionErrorsoidlensdlensvlensNonesvheaderspacks_fs_currentsfsdatasseekspossreadsoidslsappendsvdatasvserialsunpacksvdlensgs writelinesstells_indexs_trace(sselfspossoidlenstlensdlensvlensheadersoidsdatasvheadersvdatasvserialsfslsgsvdlen((s7/usr/pkg/lib/python2.2/site-packages/ZEO/ClientCache.pys_copytocurrent›sX -  ," *$ J+ $cs‡×Ų|iƒŁz\Ś|id|||t|ƒƒŪ|o Ż|i|t ƒ}Ž|t jo#ß|i |dd|||ƒSną|i |dj} įt|ƒ} ā| i} ć| i}ä| | ƒå|dƒ} ętd| d ƒd}ē||ƒ}čt| ƒdjo| ddjo ||jo&étd | d d !ƒ\}}} n ė|i |dd|||ƒSķ|djp(|djp| djp|| |jo#ī|i |dd|||ƒSnš| o ń|| ƒ}ņ| d }n ō|i |dd|||ƒSö|i ||||||ƒn ł|i |||dt t ƒWdśū|iƒXdS( Ni:siis>Hiisnvs>iHii i(sselfs_acquires_tracesoidsversionsserialslensdatas_getsNonesps_stores_fsfsabssapsseeksreadshsunpacksoidlensrec_oidstlensvlensdlensnvdatasnvserials_release(sselfsoidsserialsversionsdatasnvserialsoidlensvlensreadsapsseeksdlensfshspsnvdatasrec_oidstlen((s7/usr/pkg/lib/python2.2/site-packages/ZEO/ClientCache.pysupdate×s8 " #   4&;# ##csjż|iƒz?|i|tƒ}|tjo|id|ƒtSn|i|dj} t |ƒ}  |i }  |i } | | ƒ |dƒ}td|d ƒd}||ƒ} t|ƒdjo|ddjo | |jo&td|d d !ƒ\} }}n d } | djp(|djp|djp||| joA|id t|ƒ| |djfƒ|i|=tSn|dd jo|id|ƒtSn| o |id|ƒ!dSn"| |dƒ#||ƒ} $|id|| ƒ%| SWd&'|iƒXdS(Ni@iis>Hiisnvs>iHii ii’’’’sHmodifiedInVersion: bad record for oid %s at position %d in cache file %dsniJiLsiiN(sselfs_acquires_getsoidsNonesps_traces_fsfsabssapsseeksreadshsunpacksoidlensrec_oidslenstlensvlensdlenslogsoid_reprs_indexsversions_release(sselfsoidsoidlensvlensdlensfsreadshspsapsrec_oidsversionsseekstlen((s7/usr/pkg/lib/python2.2/site-packages/ZEO/ClientCache.pysmodifiedInVersionżsB     4& ;)      cs÷),|iƒ-zĢ.|i||ijo®/|iƒ}0|i }1||_2|i dƒ3|i d|ƒ5|i }6x?|i ƒD6].}7||dj|jo8||=nq˜W9|i|tj o=|i|tj oF>|i|iƒ?y@ti|i|ƒWn ABnXnCt|i|dƒ|i|Iiili s>H6xsvs>HI(ssspsz64slensoidstlensversionspvsvlenspacksstlens __debug__sAssertionErrorslsappendsextendssvsselfs_fs_currentsfsseeks_poss writeliness_index( sselfsoidspsssversionspvssvsfsvlenslstlensstlen((s7/usr/pkg/lib/python2.2/site-packages/ZEO/ClientCache.pys_store[s2    ! (""<  / csś„t|_…tiidƒ}†|o™‡|d|i}ˆy)‰t|dƒ|_Š|i dƒWn>‹t j o/}Œt|_|i d||fƒnX|i d|ƒn|itjo‘d„}“||_ ndS(NsZEO_CACHE_TRACEs-sabiscannot write tracefile %s (%s)sopened tracefile %scs ‘’dS(N((sargs((s7/usr/pkg/lib/python2.2/site-packages/ZEO/ClientCache.pysnotrace‘s(sNonesselfs _tracefilesossenvironsgetstfns_storagesopens_tracesIOErrorsmsgslogsnotrace(sselfsnotracestfnsmsg((s7/usr/pkg/lib/python2.2/site-packages/ZEO/ClientCache.pys _setup_traces    sicss•ž|oŸ|dO}n |ii|d¢|ƒ£|dd@|B|iB¤t |ƒ„|ƒ|ƒdS(Ni€s>iiH8si’i’’( sversionscodesselfs _tracefileswrites struct_packs time_timesdlens_currentslensoidsserial(sselfscodesoidsversionsserialsdlens time_times struct_pack((s7/usr/pkg/lib/python2.2/site-packages/ZEO/ClientCache.pys_trace•s   csZ§Ø|i}©|i|}Ŗ|i}«|i} ¬t} ­d}Æx”Ædo–°|i| ƒ±| dƒ} ²t | ƒdjo,“| oµ|i d| |ƒn¶Pnø| ddjo&¹td| dd !ƒ\} }}n »d } ¼| djp(|djp|djp||| jo½|i d | |ƒ¾PnĄtd | d ƒd}Į| |ƒ}Ć| ddjo|o Ä|||dƒÅ| dƒ}Ęt |ƒdjoĒ|i d| |ƒČPnÉtd|ƒd}Ź|||d|| joĖ|i d| |ƒĢPnĶ||dƒĪ| dƒ} Ļ| dƒ| dd!joŠ|i d| |ƒŃPnn¬Ó| ddjo |djoŌ||d| joÕ|i d| |ƒnÖ||dƒ×| dƒ| dd!joŲ|i d| |ƒŁPnnŚt} Ü| ddjoDŻ|oŽ| ||iHii ii’’’’sinvalid header datas>Hisvistruncated records>ii+sinconsistent lengthsi sinconsistent tlensvnisinconsistent nv lengthssinconsistent nv tlenių’’’s5read_index: cache file %d has %d records and %d bytes(sselfs_indexsindexs_fs fileindexsfsseeksreads headersizesposscountshslensrilogsunpackstlensvlensdlensoidlensoidsvdlensvssNonesserialshas_keystruncateslog(sselfsserials fileindexscountsindexsoidlensvlensoidsfsreadshspossvsstlensvdlensseeksdlen((s7/usr/pkg/lib/python2.2/site-packages/ZEO/ClientCache.pys read_index§s~       & ;  !       !cs$÷ł|id|||fƒdS(Ns.read_index: %s at position %d in cache file %d(sselfslogsmsgsposs fileindex(sselfsmsgsposs fileindex((s7/usr/pkg/lib/python2.2/site-packages/ZEO/ClientCache.pysrilog÷scs+ü’tid|i|i||ƒdS(NsZEC:%s(szLOGsLOGsselfs_ps_currentslevelsmsg(sselfsmsgslevel((s7/usr/pkg/lib/python2.2/site-packages/ZEO/ClientCache.pyslogüs(s__name__s __module__sICaches__implements__sMBsNones__init__sopenscloses getLastTids _getLastTids setLastTids _setLastTidsverifys invalidatesloads_copytocurrentsupdatesmodifiedInVersions checkSizesstores_stores _setup_tracestimespacks_traces read_indexsrilogszLOGsINFOslog(((s7/usr/pkg/lib/python2.2/site-packages/ZEO/ClientCache.pys ClientCache€s,  F     % R< & , ' $ ! P (s__doc__sosstimestempfilesstructspacksunpacksthreads allocate_locks ZODB.utilssoid_reprsu64sz64szLOGs ZEO.ICachesICachesmagics headersizesMBs ClientCache(sICachesmagicsMBs allocate_locksunpacksu64stempfilestimeszLOGsoid_reprspacksoss ClientCaches headersizesz64((s7/usr/pkg/lib/python2.2/site-packages/ZEO/ClientCache.pys?ns