m LEc@sdkZdkZdkZdkZdkZdkZdkZdkZdkZ dk l Z dk l Z dklZdklZdklZdklZlZdklZdklZd klZlZlZlZdkZd kl Z ei!d Z"d d Z#de i$i%fdYZ&de fdYZ'dfdYZ(defdYZ)de)fdYZ*de)fdYZ+de)fdYZ,de)fdYZ-dei.fdYZ/dS( N(s ClientStorage(sClientDisconnected(s Marshaller(sforker(sDB(s ReadOnlyErrors ConflictError(sStorageTestBase(sMinPO(s zodb_pickles zodb_unpickleshandle_all_serialsshandle_serials(s TransactionsZEO.tests.ConnectionTeststitTestServerStubcBs tZeiiiZdZRS(NcCs|i||_|iS(N(tselft'_TestServerStub__super_getInvalidationsttidt _last_invals(RR((t8/data/zmath/zope/lib/python/ZEO/tests/ConnectionTests.pytgetInvalidations/s(t__name__t __module__tZEOt ServerStubt StorageServerRR(((RR,stTestClientStoragecBs>tZeZeZdZdZdZdZ dZ RS(NicCs#ti|||id7_dS(Ni(t ClientStoragetnotifyConnectedRtconntconnection_count_for_tests(RR((RR<scCs(ti|_ti|||_dS(N(t threadingtEventRt end_verifyRt verify_cachetstubt verify_result(RR((RR@scCsti||iidS(N(Rt endVerifyRRtset(R((RRDs cCs%zti||SWdt|_XdS(N(RttestConnectionRRtTruettest_connection(RR((RRHs( RR tFalseRRtStorageServerStubClassRRRRR(((RR 4s   tDummyDBcBstZdZdZRS(NcOsdS(N((Rtargstkwargs((Rt invalidateOscCsdS(N((R((RtinvalidateCacheRs(RR R"R#(((RRNs tCommonSetupTearDownc BstZdZeiZeiZdZe Z e Z dZ e ZdZdZdZdZdZdZe dddde e e d Zd Zdddde d Zdd Zd e dZd dZRS(sCommon boilerplateicCst|itid|iti|_g|_g|_ g|_ g|_ g|_ |i |idS(sTest setup for connection tests. This starts only one server; a test may start more servers by calling self._newAddr() and then self.startServer(index=i) for i in 1, 2, ... s setUp() %sN(Rt!_CommonSetupTearDown__super_setUptloggingtinfotidttempfiletmktemptfiletaddrt_pidst_serverst conf_pathstcachest_newAddrt startServer(R((RtsetUp`s       c Cstid|ix|iD]} ti| q!Wt|dddj oL|i i t |i do(ti d|i i|i iqnx/|iD]$}|dj oti|qqWt tdo(x%|iD]}ti|dqWnx|iD]}xdD]}xdD]} d |d | f}tiiti|}t }tii"|oPt#}xGt$d D]5}yti&|Wnt'i(d qXt }PqWn|oti&|q+q+WqWqW|i)dS(sTry to cause the tests to halts tearDown() %st_storagetcleanupscleanup storage %stwaitpidiits.traces %s-%s.zec%st1if0.5N(ii(R7s.trace(*R&R'RR(R/tptostremovetgetattrtNoneR4tclosethasattrtdebugRR5R.t adminaddrtforkertshutdown_zeo_serverR-tpidR6R0tctitexttbasetpathtjoinR)ttempdirRtneed_to_deletetexistsRtrangetdummytunlinkttimetsleept$_CommonSetupTearDown__super_tearDown( RRLRDRIRARHRORERFR9RG((RttearDownrsP        cCs|ii|idS(N(RR,tappendt_getAddr(R((RR1scCsdtidddfS(Nt localhostiai0ui(trandomt randrange(R((RRVscCs tdS(N(tNotImplementedError(RRItcreatet read_only((Rt getConfigsii@ c Cs|djo(t|ii}|iid7_n|ii|t|i d|dt i d|d|ddd|d |d |d |d | } | itd| S( Nitclienttvart cache_sizetwaittmin_disconnect_pollf0.10000000000000001R\tread_only_fallbacktusernametpasswordtrealm(tcacheR=tstrRt __class__tcache_idR0RUR R,R)RKR`RaR\RcRdReRftstoraget registerDBR( RRgR`RaR\RcRdReRfRk((RtopenClientStorages"    cCsrti|}|o d|_n|io d|_n|i o|i |_ n|i o|i |_ n|S(NiR7i(R7i( RBt ZEOConfigR,tzconftro_svrR\Rtmonitortmonitor_addresstinvqtinvalidation_queue_sizettimeoutttransaction_timeout(RR,RpRo((RtgetServerConfigs     c Cs|i|} tid|||| fd|i|f} |i | ||} |i | |}|djo |i}nti| || d|\} }}} |ii| |ii||ii|dS(Ns3startServer(create=%d, index=%d, read_only=%d) @ %ss%s.%di(RR,tindexR&R'R[R\R+RIR]tsconfRwRpRotkeepR=RBtstart_zeo_servertzeoportRARDR/RUR-R.( RR[RxR\RpRzRoRARDRIRyR|R,((RR2s   (cCsZtid||i|f|i|}|dj oti|d|i|(RRRFR((RtcheckMultipleAddressess  cCs|i|idd|_|i|idd|iddd}xLtdD]>}y|id}PWq\t j ot i dq\Xq\W|i ||iidS(NRiRxiii f0.5(RR1RmR4RR}R2t did_a_storeRNRFtClientDisconnectedRQRRtassert_R>(RRRF((RtcheckMultipleServerss      cCs9|idd|_|it|i|iidS(NR\i(RRmR4t assertRaisest ReadOnlyErrorRR>(R((RtcheckReadOnlyClient(scCsu|ig|_|idddddd|idd|_|it|i|ii t i ddS(NR[iRxRpiR\f0.10000000000000001( RR}R.R2RmR4RRRR>RQRR(R((RtcheckReadOnlyServer1s   cCs0|idd|_|i|iidS(NRci(RRmR4RR>(R((RtcheckReadOnlyFallbackWritableAs cCs~|ig|_|idddddd|idd|_|i|ii|it |i |ii dS(NR[iRxRpiRc( RR}R.R2RmR4Rt isReadOnlyRRRR>(R((Rt#checkReadOnlyFallbackReadOnlyServerJs  cCs~|i|_|i|ig|_|i|it|i|i dd|i |i|ii dS(NR[i( RRmR4RR}R.RRRR2RR>(R((RtcheckReconnectWritable]s      cCsR|i|idddd|_|it|iidd|iidS(NRiRaitfredwashR7(RR}RmR4RRtloadR>(R((RtcheckDisconnectionErrorus   cCs|i|_|ig}tdD]}||iiq*~}t }|ii |x<|D]4}t t|}|ii|d|d|qiW|i|it|ii||ii||idd|ii|idS(NiR7R[i(RRmR4Rt_[1]RNRFRtoidst Transactionttxnt tpc_beginRt zodb_pickleRRtstoreR=R}RRttpc_votet tpc_abortR2t_wait(RRRFRRRR((RtcheckDisconnectedAborts 0    cCs|idd|_|ii}td}|i|d|}|ii |i |idddd|_|ii |d\}}|it|td|i|||ii dS(NRii RRaiR7(RRmR4RRRRRtrevid1R>R}RRtrevid2t assertEqualt zodb_unpickle(RRRRRR((RtcheckBasicPersistences   cCs|id|_|ii}tdd}|i|d||ii}tdd}|i|d||ii |d}|ii |d}|ii |i|iddt|_|i||ii |d|i||ii |d|ii dS(NRR8iRt2R7Ra(RRmR4Rtoid1Rtobj1Rtoid2tobj2Rt expected1t expected2R>R}RR(RRRRRRR((RtcheckDisconnectedCacheWorkss  cCs|iddd|_|ii}tdd}|i|d||ii}tdd}|i|d||ii |d}|ii |i |idddd t|_|i||ii |d|it|ii |d|ii dS( NRR`iR8iRRR7Ra(RRmR4RRRRRRRRRR>R}RRRR(RRRRRR((RtcheckDisconnectedCacheFailss  c Csi|id|_|ii}td}|i|d||ii|i|_|ii |d\}}t |}|i||d|_|i|d|d||ii|id|_td}|ii}|i|d||ii|id|_|ii |d\}}t |}|i|||iidS(NRi RR7i*trevidi(RRmR4RRRRRR>RtpickletrevRtnewobjRtvalueRRt newobj_copy( RRRRRRRRR((Rt%checkVerificationInvalidationPersistss,         cCs |i|_|ii}td}|i|d|ti d|i ti d|i dd|ii}td}x]y|i|d|PWn0t j o$ti dd t tinXtid qWti d |iidS( Ni Rs-checkReconnection(): About to shutdown servers,checkReconnection(): About to restart serverR[iis:checkReconnection(): Error after server restart; retrying.texc_infof0.10000000000000001scheckReconnection(): finished(RRmR4RRRRRR&R'R}R2RRt transactiontabortRQRRR>(RRR((RtcheckReconnections,        cCs|iddS(Ntsalty(Rt _bad_message(R((RtcheckBadMessage1:scCsHdfdYatidddtf}|i|bdS(NtHackcBstZRS(N(RR (((RRAsiitfoo(Rt MarshallertencodetmsgRR(RR((RtcheckBadMessage2>s ! cCs|i|_|i|iii}|i|y|iWnt j onX|ii |i d|ii |i|_|i|ii dS(Ns-Server did not disconnect after bogus message( RRmR4Rt_servertrpct zrpc_conntmessage_outputRRR>R(RRR((RRHs      cCsd}||_||_||_||_x4td|iD] }|i|i d|q=Wg}zxAt|iD]0}t |d|}|i ||iqzWx;|D]3}|id|i|id|iqWWdx|D]}|iqWXdS(NiiRxsT%di<s %s didn't die(tNRtnserverstnthreadstntranstnobjRNRFR1R2tthreadst MSTThreadttRUtstartRJtfailIftisAlivetgetNamet closeclients(RRFRRR((RtNOcheckMultiStorageTransactionhs0       (cCsUt|i}|i}|i}td|d(RRRRFRRR((RtcheckCrossDBInvalidationss.        (RR RRRRRRRRRRRRRRRRRRRR(((RRs(      #    ;   t InvqTestscBs tZdZdZdZRS(NicCsc|idd}|i|id|i|_|ii}|ii}|i|iid|i |}|i ||}|i |}|i ||}|i |i |d|i|i ||}|idd}|i|id|i|ii||dfgf|i|i |d|ii |d|idS(NRgRsfull verificationR7squick verification(RRmt perstorageRRR4RRRRRRRRR>RR(RRRRRR((Rt"checkQuickVerificationWith2Clientss*  cCs|idd}|i|id|i|_|ii}|i|iid|i|}|i||}|i |d|i x&t dD]}|i||}qW|idd}|i|idtid}xC|iip2|iti|jo|idqqW|i|ii |dd||i|i |d|ii |d|i dS( NRgRsfull verificationR7iistimed out waiting for endVerifyi(RRmRRRR4RRRRRR>RNRFRQRRtisSetRR(RRFRRRR((Rt)checkVerificationWith2ClientsInvqOverflows0   #(RR RsRR(((RRs #tReconnectionTestscBs\tZdZdZdZdZdZdZdZdZ d Z d Z RS( Niic Csa|ig|_|idddddddd|idd|_|it|idS(NR[iRxR\iRz( RR}R.R2RmR4RRR(R((RtcheckReadOnlyStorages   "c Csa|ig|_|idddddddd|idd|_|it|idS(NR[iRxR\iRzRc( RR}R.R2RmR4RRR(R((Rt$checkReadOnlyFallbackReadOnlyStorages   "cCs|idd|_|it|i|ig|_|i|it|i|i dddddd|i |it|idS(NR\iR[iRz( RRmR4RRRR}R.RR2R(R((RtcheckReconnectReadOnlys    cCs|idd|_|i|ig|_|i|it|i|i dddddd|i |it |idS(NRciR[iR\Rz( RRmR4RR}R.RRRR2RR(R((RtcheckReconnectFallback+s     cCs|ig|_|idddd|idd|_|it|i|ig|_|i |it |i|idddd|i |idS(NR[iR\iRcRz( RR}R.R2RmR4RRRRRR(R((RtcheckReconnectUpgradeCs      c Cs|ig|_|i|idddddddd|idd|_|it|i |iddddddxYt dD]>}y|i PWqt tfj ot id qXqW|id dS( NR[iRxR\iRzRci,f0.10000000000000001s1Couldn't store after starting a read-write server(RR}R.R1R2RmR4RRRRNRFRRQRRR(RRF((RtcheckReconnectSwitch`s   "  cCs|i|_|i|iid|i|i|id|i_|i dddd|i |i|iiddS(Nsfull verificationR[iRzsno verification( RRmR4RRRR}RR=R2R(R((Rt"checkNoVerificationOnServerRestarts     cCs2|idd}|i|id|i|_|ii}|i|iid|i|}|i|||i |d|i |i d|i_d|_tid|idddd|i|id ||i|iid |i|id |i|iidS( NRgRsfull verificationR7t2ALLBEEFR[iRzRksno verification(RRmRRRR4RRRRRR}RR=R&R'R2RR>(RRRR((Rt.checkNoVerificationOnServerRestartWith2Clientss(       ( RR RzRsRRRRRRRR(((RRs    t TimeoutTestscBs;tZdZdZdZdZdZdZRS(NicCs`|i}t}|i||i|tid|i t |i ||i dS(Ni( RRmRkRRRRRQRRRRt tpc_finishR>(RRRk((Rt checkTimeouts     cCsJ|i}t}|i||i||i||idS(N( RRmRkRRRRRR>(RRRk((RtcheckTimeoutOnAborts      cCs=|i}t}|i||i||idS(N(RRmRkRRRRR>(RRRk((RtcheckTimeoutOnAbortNoLocks     cCs3|i|_}|it|ii |i}t d}t }|i}|i||i|tt|d|}|i|tid|i|i p |i|j|i|i|i|it|i||it|ii |it|i|ddS(NiR7i(RRmR4RkRtlistt_cachetcontentsRRRRRRRtold_connection_countRRtZERORRRRQRRRRRRRtKeyErrorR(RRRRkRRR((RtcheckTimeoutAfterVotes      !  $ cCsa|i|_}|it|ii |i} t d} t }|i||i| tt| d|} |i|} t| | | }|i|d| _t }|i}|i||i| |t| d|}|i|}t| ||}tid}xNti|jo:|i o(|i|joti!|i"dq*Pq*W|i|i p |i|j|i#|i|i |i$t%|i|d| _t }|i||i| |t| d||i$t&|i||i'||i|d| _t }|i||i| |t| d||i$t&|i||i'||i|d| _t }|i||i| |t| d|}|i|}t| ||}|i||i(| d\} }|i+t,| t d|i+||dS( NiR7ii<f1.8i i i (-RRmR4RkRRRRRRRRRRRRRRtrevid1aRtrevid1bthandle_serialsRRRRRtrevid2atrevid2bRRQtdeadlineRRRRuRRRt ConflictErrorRRRRRR(RRRRRRRRkRR RRR RR((RtcheckTimeoutProvokingConflictssf    !     !$              ! (RR RuRRRR R(((RRs    RcBs/tZeiiZdZdZdZRS(NcCs&|id|||_g|_dS(Ntname(Rt_MSTThread__super_initRttestcasetclients(RRR((Rt__init__=s c CsD|i}|i}|i}xPtt|iD]9}|i d|i|}d||_ |i |q4Wxt|i D]}x |D]}g|_h|_qWt}x|D]}|i|qWxt|iD]}x|D]}|i} |ii | td||i ||f} t| } |i| t| d|}|iit| |qWqWx6|D].}|i|}|iitd|q~Wx|D]}|i!|qWxk|D]c}x*|iD]} |i"|ii#| qWx-|ii$D]} |i"| |ijqWqWqWdS(NR,sC%ds %s.%s.t%d.o%dR7(%RRttnameRRRNtlenR,RFRmREt_MSTThread__nameRURt_MSTThread__oidst_MSTThread__serialsRRRRtjRRRRRRRtstupdatethandle_all_serialsRR=Rt failUnlessthas_keyR( RRERFRRRRRRRR((RtrunBsV         ! cCs0x)|iD]}y|iWq q Xq WdS(N(RRRER>(RRE((RR{s  (RR RtThreadRRR#R(((RR9s   9(0R:tsysRQRXRR)RR&tZEO.ServerStubR tZEO.ClientStorageRtZEO.ExceptionsRtZEO.zrpc.marshalRt ZEO.testsRBtZODB.DBRtZODB.POSExceptionRRtZODB.tests.StorageTestBaseRtZODB.tests.MinPORRRR R RRt getLoggertloggerRR R RR RR$RRRRR$R(#RRRXRRRR$RRR)RRR0RRR RRRBR%RRRR RRRR&RR RR RRQR:((Rt?s>                   I