- >csdZ "dkZ#dkZ$dkZ%dkZ'dZ+dZdfdYZdefdYZ4defd YZ Nd efd YZ d fd YZ de fdYZ de fdYZ dZdfdYZDdZJdfdYZde fdYZedZdZdZdZedjoeiendS(sECache simulation. Usage: simul.py [-bflyz] [-X] [-s size] tracefile Use one of -b, -f, -l, -y or -z select the cache simulator: -b: buddy system allocator -f: simple free list allocator -l: idealized LRU (no allocator) -y: variation on the existing ZEO cache that copies to current file -z: existing ZEO cache (default) Options: -s size: cache size in MB (default 20 MB) -X: enable heuristic checking for misaligned records: oids > 2**32 will be rejected; this requires the tracefile to be seekable Note: the buddy system allocator rounds the cache size up to a power of 2 Ncs''(ti|IJ)titIJdS(N(ssyssstderrsmsgs__doc__(smsg((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysusage'sc su+-dd} .d| } /t}0d} 1y&2titidd\}}Wn/3ti j o}4t |5dSnX6x|D6]\}} 7|djo 8t}n9|djo :t}n;|d jo <t}n=|d jo >t}n?|d jo @t}nA|d joBtt| | } nC|d jo Dd} nqWEt|djoFt dGdSnH|d}K|idoMyNdk}Wn-Otj oPtidIJQdSnXRyS|i|d}Wn9Ttj o*}Utid||fIJVdSnXnvW|djoYti}nV\y]t|d}Wn9^tj o*}_tid||fIJ`dSnXc|| }f|i id}jd}k|i#}lt%i&}mx-mdo"o|d}pt|djoqPnr|d7}s|d|\}}t|djo wq0nx|d}yt|djozPn{|d7}||d7}}|d|\}}|d@|d@|d@|d@f\} }}}|i0|| |||||q0W|i1dSdS(Niiiisbflyzs:Xis-bs-fs-ls-ys-zs-ss-Xs"exactly one file argument requireds.gzs)can't read gzipped files (no module gzip)srbscan't open %s: %ss-is>iiis>8s8siii~(2sMBs cachelimitsZEOCacheSimulationssimclasss heuristicsgetoptssyssargvsoptssargsserrorsmsgsusagesosasBuddyCacheSimulationsSimpleCacheSimulationsLRUCacheSimulationsAltZEOCacheSimulationsintsfloatslensfilenamesendswithsgzips ImportErrorsstderrsopensfsIOErrorsstdinssims printheadersoffsetsrecordssreadsf_readsstructsunpacks struct_unpacksrstsscodesoidsserialsdlensversionscurrentseventsfinish(sargss struct_unpacksoidstssf_readsmsgscodesoffsetsserialsas heuristicsdlensMBs cachelimitsfsosfilenamescurrentsrssimsversionsrecordssgzipssimclasssopts((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysmain+s    &                       1' s SimulationcstZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d ZRS( s Base class for simulations. The driver program calls: event(), printheader(), finish(). The standard event() method calls these additional methods: write(), load(), inval(), report(), restart(); the standard finish() method also calls report(). cs\||_t|_d|_d|_d|_d|_|idS(Ni( s cachelimitsselfsNonesepochs total_loadss total_hitss total_invalss total_writessrestart(sselfs cachelimit((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pys__init__s      csCd|_d|_d|_d|_t|_dS(Ni(sselfsloadsshitssinvalsswritessNonests0(sself((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysrestarts     csY|itjo3||_|itjo||_nn||_|o|d@dddfjo|djo;|id7_|i d7_ |i ||n8|i d7_ |i d7_ |i||nW|d@djo|i|n/|djo|i|indS( Nipi i0iPi:iii(sselfsts0sNonestssepochsts1sdlenscodeswritess total_writesswritesoidsloadss total_loadssloadsinvalsreportsrestart(sselfstssdlens_versionscodes_currentsoids_serial((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysevents$  $ cs dS(N((sselfsoidssize((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pyswritescs dS(N((sselfsoidssize((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysloadscs dS(N((sselfsoid((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysinvalss %12s %9s %8s %8s %6s %6s %6s %6ss*** please override ***c sXd|iit|ifGH|idddddd|iidfGHdS( Ns%s, cache size %s bytess START TIMEsDURATIONsLOADSsHITSsINVALSsWRITESsHITRATE(sselfs __class__s__name__s addcommass cachelimitsformats extranamesupper(sself((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pys printheaders!ic s|io|id7_|iti|idd!t|i|i|i|i |i |i t ||i t|i|i fGHndS(Niii(sselfsloadssnreportssformatstimesctimests0sdurationsts1shitssinvalsswritessgetattrs extranameshitrate(sself((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysreports c s|i|idjo}|idti|idd!t|i|i|i |i |i |i t |d|it|i |i fGHndS(Nis OVERALLiistotal_(sselfsreportsnreportssformatstimesctimesepochsdurationsts1s total_loadss total_hitss total_invalss total_writessgetattrs extranameshitrate(sself((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysfinishs (s__name__s __module__s__doc__s__init__srestartseventswritesloadsinvalsformats extranames printheadersnreportssreportsfinish(((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pys Simulations           sZEOCacheSimulationcsYtZdZdZdZ dZdZdZ*dZRS(sSimulate the current (ZEO 1.0 and 2.0) ZEO cache behavior. This assumes the cache is not persistent (we don't know how to simulate cache validation.) sflipscs&ti||d|_dS(Ni(s Simulations__init__sselfs cachelimits total_flips(sselfs cachelimit((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pys__init__scsS  ti| d|_ddg|_hhg|_d|_dS(Nii(s Simulationsrestartsselfsflipssfilesizesfileoidsscurrent(sself((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysrestart s  cs}|i|ii|p|id|ii|o(|id7_|id7_n|i||dS(Ni( sselfsfileoidsscurrentsgetsoidshitss total_hitsswritessize(sselfsoidssize((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysloads;cs|dd} |i|i||idjoa"|id7_#|id7_$d|i|_%d|i|i<&h|i|idZRS(s5A variation of the ZEO cache that copies to the current file. When a hit is found in the non-current cache file, it is copied to the current cache file. Exception: when the copy would cause a cache flip, we don't copy (this is part laziness, part concern over causing extraneous flips). cs*>?|i|ii|o(@|id7_A|id7_nB|id|ii|oC|id7_D|id7_F|dd}G|i|i||i djoLH|i|ic|7<Id|i|i|<J|id|i|=nnL|i ||dS(Niiii( sselfsfileoidsscurrentsgetsoidshitss total_hitsssizesfilesizes cachelimitswrite(sselfsoidssize((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysload>s!% (s__name__s __module__s__doc__sload(((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysAltZEOCacheSimulation4ssLRUCacheSimulationcsPNtZPdZRdZXdZcdZldZdZRS(Nsevictscs&RTti||Vd|_dS(Ni(s Simulations__init__sselfs cachelimits total_evicts(sselfs cachelimit((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pys__init__RscsfXZti|\d|_^h|__d|_`ttt|_a|ii |idS(Ni( s SimulationsrestartsselfsevictsscachessizesNodesNonesheads linkbefore(sself((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysrestartXs    cszcd|ii|}e|tj o;f|id7_g|id7_h|i|i nj|i ||dS(Ni( sselfscachesgetsoidsnodesNoneshitss total_hitss linkbeforesheadswritessize(sselfsoidssizesnode((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysloadcs cslm|ii|}n|tj oJo|ipto|ii tj pt q|i |i 8_ nrt ||}s||i|<t|i |iu|i |7_ wxw|i |ijox|id7_y|id7_z|ii }{to||ij pt ||i}to|ii tj pt ~|i|i=|i |i 8_ qWdS(Ni(sselfscachesgetsoidsnodesNonesunlinks __debug__sheadsnextsAssertionErrorssizesNodes linkbefores cachelimitsevictss total_evicts(sselfsoidssizesnode((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pyswritels& $! $cs|ii|}|tj oto|i|jpt|id7_|i d7_ |i to|i i tj pt|i|=|i |i 8_ to|i djptndS(Nii(sselfscachesgetsoidsnodesNones __debug__sAssertionErrorsinvalss total_invalssunlinksheadsnextssize(sselfsoidsnode((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysinvals! $ (s__name__s __module__s extranames__init__srestartsloadswritesinval(((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysLRUCacheSimulationNs    sNodecsVtZdZeZddddgZdZdZdZRS(sNode in a doubly-linked list, storing oid and size as payload. A node can be linked or unlinked; in the latter case, next and prev are None. Initially a node is unlinked. sprevsnextsoidssizecs2||_||_t|_|_dS(N(soidsselfssizesNonesprevsnext(sselfsoidssize((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pys__init__s  cs|i}|i}|tj oto|tj ptto|i|jptto|i|jpt||_||_t|_|_nto|tjptdS(N(sselfsprevsnextsNones __debug__sAssertionError(sselfsprevsnext((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysunlinks  !!  cs|i|i}|tjo.to|itjpt|}n||_||_||_|_dS(N(sselfsunlinksnextsprevsNones __debug__sAssertionError(sselfsnextsprev((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pys linkbefores  !   ( s__name__s __module__s__doc__stypes __metaclass__s __slots__s__init__sunlinks linkbefore(((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysNodes    sBuddyCacheSimulationcsGtZdZdZdZdZdZRS(Ncs ti|t|dS(N(sLRUCacheSimulations__init__sselfsroundups cachelimit(sselfs cachelimit((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pys__init__scs/ti||i|i|_dS(N(sLRUCacheSimulationsrestartsselfsallocatorFactorys cachelimits allocator(sself((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysrestartscst|SdS(N(sBuddyAllocatorssize(sselfssize((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysallocatorFactoryscs|ii|}|tj o]|ito|ii tj pt |i |i 8_ |i i |nxdo|i i|}|tj oPn|ii }to||ij pt |id7_|id7_|ito|ii tj pt |i|i=|i |i 8_ |i i |qW||_||i|<|i|i|i |i 7_ dS(Ni(sselfscachesgetsoidsnodesNonesunlinks __debug__sheadsnextsAssertionErrorssizes allocatorsfreesallocsevictss total_evictss linkbefore(sselfsoidssizesnode((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pyswrites0 $ ! $ cs|ii|}|tj oto|i|jpt|id7_|i d7_ |i to|i i tj pt|i|=|i |i 8_ to|i djpt|ii|ndS(Nii(sselfscachesgetsoidsnodesNones __debug__sAssertionErrorsinvalss total_invalssunlinksheadsnextssizes allocatorsfree(sselfsoidsnode((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysinvals! $ !(s__name__s __module__s__init__srestartsallocatorFactoryswritesinval(((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysBuddyCacheSimulations     sSimpleCacheSimulationcs#tZdZdZRS(Ncst|SdS(N(sSimpleAllocatorssize(sselfssize((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysallocatorFactoryscs'ti||iidS(N(sBuddyCacheSimulationsfinishsselfs allocatorsreport(sself((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysfinishs(s__name__s __module__sallocatorFactorysfinish(((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysSimpleCacheSimulations  isBuddyAllocatorcs>tZdZdZdZ1ddZRS(Ncst|}||_h|_h|_t}xO||jo>ttt|i|<}|i |||7}qEWt t|d}||id<|i |i|dS(Ni( sroundups cachelimitsselfsavailsnodessMINSIZEsksNodesNonesns linkbefores BlockNodesnode(sselfs cachelimitsnodesksn((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pys__init__s    csIt|}|}x`||ijoE |i|} |i} ||j o Pn ||7}q!Wt S|i |i}x||jo|d}t o||jpt ||_tt ||i|}||i|i<|i|i|qWd|_|SdS(Nii(sroundupssizesksselfs cachelimitsavailsheadsnextsnodesNonesunlinkssize2s __debug__sAssertionErrors BlockNodesaddrsbuddysnodess linkbeforesoid(sselfssizesnodesheadsbuddyssize2sk((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysallocs,       csto||i|ijptto+|i|ijo tjnptt|_  x |i |i jo!|i|i A}"|i|}#to|i|jpt$|i tj p|i |i jo%Pn'|i(|i|ijo)|i|i=*|}n,|i|i=-|i d9_ qrW.to||i|ijpt/|i|i|i dS(Ni(s __debug__snodesselfsnodessaddrsAssertionErrorsprevsnextsNonesoidssizes cachelimits buddy_addrsbuddysunlinks linkbeforesavail(sselfsnodes buddy_addrsbuddy((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysfrees$(5 !&  (scs12|o 3|Gn4t}5d}}6x6||ijo7|i|}8|i }9d}:x.:||j o;|d7}<|i }qrW=|o>d||fGn?||7}@|||7}A||7}q4WBd||fGHdS(Niis%d:%ds -- %d, %d( smsgsMINSIZEssizesblockssbytessselfs cachelimitsavailsheadsnextsnodescount(sselfsmsgsnodesheadsblockssbytesscountssize((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysdump1s&         (s__name__s __module__s__init__sallocsfreesdump(((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysBuddyAllocators    cs?DEt}Fx"F||joG||7}qWH|SdS(N(sMINSIZEskssize(ssizesk((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysroundupDs  sSimpleAllocatorcsJJtZLdZ]dZddZdZddZRS(NcsLM||_Nttdd|_O|i|_Ptt|d}Q|i|iRh|d<|_Sh||<|_ Ud|_ Vd|_ Wd|_ X||_ Yd|_Zd|_[d|_dS(Nii(s arenasizesselfs BlockNodesNonesavailsroversnodes linkbeforestaglostaghisnallocssnfreess allocloopss freebytess freeblockss allocbytess allocblocks(sselfs arenasizesnode((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pys__init__Ls       cs=]^d|i|i|i|i|i|i|ifGHdS(Ns-NA=%d AL=%d NF=%d ABy=%d ABl=%d FBy=%d FBl=%d(sselfsnallocss allocloopssnfreess allocbytess allocblockss freebytess freeblocks(sself((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysreport]scsde|id7_g|i}}hxchdoXi|id7_j|i|jokPnl|i}m||jo ntSnq+Wo|i|jop|i|_q|ir|i |i =s|i |i |=t|i d8_ u|i d7_ v|i|8_w|i|7_x|Snzto|i|jpt{tt||i }||i |i =}|i|8_~|i |7_ ||i |i <|i d7_ |i|8_|i|7_|SdS(Ni(sselfsnallocssroversstops allocloopsssizesnextsNonesunlinkstaglosaddrstaghis freeblockss allocblockss freebytess allocbytess __debug__sAssertionErrors BlockNodesnode(sselfssizesnodesroversstop((s1/usr/pkg/lib/python2.2/site-packages/ZEO/simul.pysallocds<    !cs+|id7_|id7_|id8_|i|i7_|i|i8_|i|i ||i |i <||i |i |i<|i i |i }|tj o|i|id8_|i |i =|i |i |i=|i |i =|i |_ |i|i7_||i |i