ó
n®¸Qc           @   sÉ   d  Z  d d l Z d d l Z d d l Z d d l m Z m Z m Z m Z m	 Z	 m
 Z
 d e j f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d	 „  ƒ  YZ d
 „  Z e d k rÅ e j d d ƒ n  d S(   s(   TestCases for distributed transactions.
iÿÿÿÿN(   t   dbt   test_supportt   have_threadst   verboset   get_new_environment_patht   get_new_database_patht   DBReplicationc           B   s   e  Z d  „  Z d „  Z RS(   c            s2  t  ƒ  ˆ  _ t  ƒ  ˆ  _ t j ƒ  ˆ  _ t j ƒ  ˆ  _ ˆ  j j ˆ  j t j t j	 Bt j
 Bt j Bt j Bt j Bt j Bt j Bd ƒ ˆ  j j ˆ  j t j t j	 Bt j
 Bt j Bt j Bt j Bt j Bt j Bd ƒ t ˆ  _ ˆ  _ ‡  f d †  } ‡  f d †  } ˆ  j j | ƒ ˆ  j j | ƒ d  ˆ  _ ˆ  _ d  S(   Ni¶  c            s   | t  j k r t ˆ  _ n  d  S(   N(   R    t   DB_EVENT_REP_MASTERt   Truet   confirmed_master(   t   at   bt   c(   t   self(    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyR	   !   s    c            s   | t  j k r t ˆ  _ n  d  S(   N(   R    t   DB_EVENT_REP_STARTUPDONER   t   client_startupdone(   R
   R   R   (   R   (    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyR   %   s    (   R   t   homeDirMastert   homeDirClientR    t   DBEnvt   dbenvMastert   dbenvClientt   opent	   DB_CREATEt   DB_INIT_TXNt   DB_INIT_LOGt   DB_INIT_MPOOLt   DB_INIT_LOCKt   DB_INIT_REPt
   DB_RECOVERt	   DB_THREADt   FalseR	   R   t   set_event_notifyt   Nonet   dbMastert   dbClient(   R   R	   R   (    (   R   s1   /sys/lib/python2.7/bsddb/test/test_replication.pyt   setUp   s    >>c         C   s™   |  j  r |  j  j ƒ  n  |  j r2 |  j j ƒ  n  d „  } |  j j | ƒ |  j j | ƒ |  j j ƒ  |  j j ƒ  t j |  j ƒ t j |  j	 ƒ d  S(   Nc          W   s   d  S(   N(    (   t   args(    (    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyt   dummy=   s    (
   R"   t   closeR!   R   R   R   R   t   rmtreeR   R   (   R   R%   (    (    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyt   tearDown4   s    			(   t   __name__t
   __module__R#   R(   (    (    (    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyR      s   	%t   DBReplicationManagerc           B   s   e  Z d  „  Z RS(   c         C   s$  t  j ƒ  } t  j ƒ  } t j ƒ  d k r#|  j j d | ƒ |  _ |  j j t j t	 ƒ |  j j t j
 t	 ƒ |  j j d | ƒ |  _ |  j j d | ƒ |  _ |  j j t j t	 ƒ |  j j d | ƒ |  _ |  j j t j
 t	 ƒ i t t t	 t g t j 6t	 t t t g t j 6t t t t g t j 6t	 t t t	 g t j
 6t t t t g t j 6} x‡ | j ƒ  D]y \ } } xj t |  j |  j |  j |  j g | ƒ D]A \ } } | rÂ|  j | j | ƒ ƒ q—|  j | j | ƒ ƒ q—WqcW|  j |  j j ƒ  |  j j ƒ  ƒ |  j |  j j ƒ  |  j j ƒ  ƒ xc t |  j |  j |  j |  j g | | | | g ƒ D]. \ } } | j ƒ  } |  j | d | f ƒ qXWxH |  j |  j g D]4 } |  j | j ƒ  |  j j | j ƒ  ƒ j ƒ  ƒ qWx· |  j |  j g D]4 } |  j | j ƒ  |  j j | j ƒ  ƒ j ƒ  ƒ qèWnl |  j j d | ƒ |  j j d | ƒ |  j j d | ƒ |  j j d | ƒ |  j j d ƒ |  j j d ƒ |  j j  d ƒ |  j j  d ƒ |  j j! t j" d ƒ |  j j! t j" d ƒ |  j |  j j# t j" ƒ d ƒ |  j |  j j# t j" ƒ d ƒ |  j j! t j$ d ƒ |  j j! t j$ d	 ƒ |  j |  j j# t j$ ƒ d ƒ |  j |  j j# t j$ ƒ d	 ƒ |  j j! t j% d
 ƒ |  j j! t j% d ƒ |  j |  j j# t j% ƒ d
 ƒ |  j |  j j# t j% ƒ d ƒ |  j j& t j' ƒ |  j j& t j' ƒ |  j j( d t j) ƒ |  j j( d t j* ƒ |  j |  j j+ ƒ  d ƒ |  j |  j j+ ƒ  d ƒ |  j |  j j, ƒ  d ƒ |  j |  j j, ƒ  d ƒ |  j |  j j- ƒ  t j' ƒ |  j |  j j- ƒ  t j' ƒ d d  l. }	 |	 j. ƒ  d }
 x6 |	 j. ƒ  |
 k  r/|  j/ o|  j0 r/|	 j1 d ƒ qúW|	 j. ƒ  |
 k rdd d  l2 } | j3 d IJt	 } n  |  j j4 ƒ  } |  j t5 | ƒ d ƒ | j6 ƒ  d } |  j | d d ƒ |  j | d | ƒ |  j | d t j7 k pê| d t j8 k ƒ |  j j4 ƒ  } |  j t5 | ƒ d ƒ | j6 ƒ  d } |  j | d d ƒ |  j | d | ƒ |  j | d t j7 k pt| d t j8 k ƒ t j ƒ  d k r¸|  j j9 d t j: ƒ } |  j d | k ƒ n  t j; |  j ƒ |  _< |  j j= ƒ  } |  j< j> d t j? t j@ d d | ƒ| jA ƒ  d d  l. }	 d d  lB } |	 j. ƒ  d }
 xH |	 j. ƒ  |
 k  r}| jC jD | jC jE |  jF d ƒ ƒ r}|	 j1 d ƒ q6Wt j; |  j ƒ |  _G x™ t	 r.	|  j j= ƒ  } y/ |  jG j> d t j? d t jH d d d | ƒWnC t jI k
 r	| jJ ƒ  |  jG jK ƒ  t j; |  j ƒ |  _G q–n X| jA ƒ  Pq–W|  j j= ƒ  } |  j< jL d d d | ƒ| jA ƒ  d d  l. }	 |	 j. ƒ  d }
 d  } xo |	 j. ƒ  |
 k  rô	| d  k rô	|  j j= ƒ  } |  jG jN d d | ƒ} | jA ƒ  | d  k r†	|	 j1 d ƒ q†	q†	W|	 j. ƒ  |
 k r
| r
|  jO d ƒ n  |  j |	 j. ƒ  |
 k  ƒ |  j d | ƒ |  j j= ƒ  } |  j< jP d d | ƒ| jA ƒ  |	 j. ƒ  d }
 xo |	 j. ƒ  |
 k  rö
| d  k	 rö
|  j j= ƒ  } |  jG jN d d | ƒ} | jA ƒ  | d  k rˆ
|	 j1 d ƒ qˆ
qˆ
W|  j |	 j. ƒ  |
 k  ƒ |  j d  | ƒ d  S(   Ni   i   s	   127.0.0.1i
   i    i‡ iá‡ iŠ‡ iPˆ iù‡ i¿ˆ i   iÿÿÿÿi<   gz®Gáz”?sB   XXX: timeout happened beforestartup was confirmed - see issue 3892i   i   t   flagst   msgs_queuedt   testi¶  t   txngz®Gáz„?t   modet   ABCt   123s>   replication test skipped due to random failure, see issue 3892(   i   i   (   i   i   (Q   R   t   find_unused_portR    t   versionR   t   repmgr_sitet   sitet
   set_configt   DB_GROUP_CREATORR   t   DB_LOCAL_SITEt   site2R   t   site3t   DB_BOOTSTRAP_HELPERt   site4R   t	   DB_LEGACYt   DB_REPMGR_PEERt   itemst   zipt
   assertTruet
   get_configt   assertFalset   assertNotEqualt   get_eidt   get_addresst   assertEqualt   repmgr_site_by_eidt   repmgr_set_local_sitet   repmgr_add_remote_sitet   rep_set_nsitest   rep_set_priorityt   rep_set_timeoutt   DB_REP_CONNECTION_RETRYt   rep_get_timeoutt   DB_REP_ELECTION_TIMEOUTt   DB_REP_ELECTION_RETRYt   repmgr_set_ack_policyt   DB_REPMGR_ACKS_ALLt   repmgr_startt   DB_REP_MASTERt   DB_REP_CLIENTt   rep_get_nsitest   rep_get_priorityt   repmgr_get_ack_policyt   timeR	   R   t   sleept   syst   stderrt   repmgr_site_listt   lent   valuest   DB_REPMGR_CONNECTEDt   DB_REPMGR_DISCONNECTEDt   repmgr_statt   DB_STAT_CLEARt   DBR!   t	   txn_beginR   t   DB_HASHR   t   committ   os.patht   patht   existst   joinR   R"   t	   DB_RDONLYt   DBRepHandleDeadErrort   abortR&   t   putR    t   gett   skipTestt   delete(   R   t   master_portt   client_portt   dt   it   jt   kt   vt   addrR[   t   timeoutR]   t   startup_timeoutR/   t   os(    (    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyt   test01_basic_replicationH   s(   1""!#&

(	%
%	


!

!
(   R)   R*   R€   (    (    (    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyR+   G   s   t   DBBaseReplicationc           B   s†   e  Z d  „  Z d „  Z d „  Z d „  Z e j ƒ  d
 k rH d „  Z n  e j ƒ  d k rf d „  Z	 n  e j ƒ  d k r„ d	 „  Z
 n  RS(   c            sã  t  j ˆ  ƒ ‡  f d †  } ‡  f d †  } ˆ  j j | ƒ ˆ  j j | ƒ d d  l } | j ƒ  ˆ  _ | j ƒ  ˆ  _ ‡  f d †  } ‡  f d †  } ˆ  j j d | ƒ ˆ  j j	 d ƒ ˆ  j j d | ƒ ˆ  j j	 d	 ƒ ˆ  j
 ˆ  j j ƒ  d ƒ ˆ  j
 ˆ  j j ƒ  d	 ƒ ‡  f d
 †  } ‡  f d †  } d d l m } | d | ƒ }	 | d | ƒ }
 d d  l } | j d	 d k  r“|	 j t ƒ |
 j t ƒ n t |	 _ t |
 _ |	 ˆ  _ |
 ˆ  _ d  ˆ  _ ˆ  _ t g ˆ  _ t g ˆ  _ d  S(   Nc            s.   | t  j k s | t  j k r* t ˆ  _ n  d  S(   N(   R    R   t   DB_EVENT_REP_ELECTEDR   R	   (   R
   R   R   (   R   (    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyR	     s    c            s   | t  j k r t ˆ  _ n  d  S(   N(   R    R   R   R   (   R
   R   R   (   R   (    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyR     s    iÿÿÿÿc            s   ˆ  j  j | | f ƒ d  S(   N(   t   m2cRq   (   t   dbenvt   controlt   rect   lsnpt   envidR,   (   R   (    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyRƒ     s    c            s   ˆ  j  j | | f ƒ d  S(   N(   t   c2mRq   (   R„   R…   R†   R‡   Rˆ   R,   (   R   (    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyR‰   !  s    i   i
   i   i    c              s"   ˆ  j  ˆ  j ˆ  j d ˆ  j t ƒ S(   Ni   (   t	   thread_doR   R‰   t   master_doing_electionR   (    (   R   (    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyt   thread_master1  s    c              s"   ˆ  j  ˆ  j ˆ  j d ˆ  j t ƒ S(   Ni   (   RŠ   R   Rƒ   t   client_doing_electionR   (    (   R   (    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyt   thread_client5  s    (   t   Threadt   target(   R   R#   R   R   R   t   QueueRƒ   R‰   t   rep_set_transportRM   RH   RY   t	   threadingR   R]   t   version_infot	   setDaemonR   t   daemont   t_mt   t_cR    R!   R"   R   R‹   R   (   R   R	   R   R‘   Rƒ   R‰   RŒ   RŽ   R   R—   R˜   R]   (    (   R   s1   /sys/lib/python2.7/bsddb/test/test_replication.pyR#     s@    				c         C   sù   |  j  r |  j  j ƒ  n  |  j r2 |  j j ƒ  n  |  j j d  ƒ |  j j d  ƒ |  j j ƒ  |  j	 j ƒ  d „  } |  j
 j | ƒ |  j j | ƒ |  j
 j d | ƒ |  j j d | ƒ |  j j ƒ  |  j
 j ƒ  t j |  j ƒ t j |  j ƒ d  S(   Nc          W   s   d  S(   N(    (   R$   (    (    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyR%   Z  s    i   i   (   R"   R&   R!   Rƒ   Rq   R    R‰   R—   Rm   R˜   R   R   R   R’   R   R'   R   R   (   R   R%   (    (    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyR(   M  s"    			c         C   s\   |  j  j d t j ƒ |  j j d t j ƒ d „  } | |  _ |  j j ƒ  |  j	 j ƒ  d  S(   NR,   c         S   sH   xA t  rC | j ƒ  } | d  k r% d  S|  j | d | d | ƒ q Wd  S(   Ni    i   (   R   Rr   R    t   rep_process_message(   t   envt   qRˆ   t   election_statust   must_be_masterR{   (    (    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyRŠ   j  s
    	 (
   R   t	   rep_startR    RV   R   RW   RŠ   R—   t   startR˜   (   R   RŠ   (    (    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyt   basic_rep_threadingf  s    		c         C   sç  |  j  ƒ  d d  l } | j ƒ  d } x6 | j ƒ  | k  r^ |  j oJ |  j r^ | j d ƒ q) W|  j | j ƒ  | k  ƒ t j |  j ƒ |  _	 |  j j
 ƒ  } |  j	 j d t j t j d d | ƒ| j ƒ  d d  l } d d  l } | j ƒ  d } xH | j ƒ  | k  r=| j j | j j |  j d ƒ ƒ r=| j d ƒ qö Wt j |  j ƒ |  _ x™ t rî|  j j
 ƒ  } y/ |  j j d t j d	 t j d
 d d | ƒWnC t j k
 rß| j ƒ  |  j j ƒ  t j |  j ƒ |  _ qVn X| j ƒ  PqVW|  j j d	 t j ƒ } |  j d | k ƒ |  j j
 ƒ  } |  j	 j d d d | ƒ| j ƒ  d d  l } | j ƒ  d } d  } xo | j ƒ  | k  rß| d  k rß|  j j
 ƒ  } |  j j d d | ƒ} | j ƒ  | d  k rq| j d ƒ qqqqW|  j | j ƒ  | k  ƒ |  j  d | ƒ |  j j
 ƒ  } |  j	 j! d d | ƒ| j ƒ  | j ƒ  d } xo | j ƒ  | k  r¹| d  k	 r¹|  j j
 ƒ  } |  j j d d | ƒ} | j ƒ  | d  k rK| j d ƒ qKqKW|  j | j ƒ  | k  ƒ |  j  d  | ƒ d  S(   Niÿÿÿÿi<   gz®Gáz”?R.   i¶  R/   i
   gz®Gáz„?R,   R0   t   master_changesR1   R2   ("   R    R[   R	   R   R\   RB   R    Rf   R   R!   Rg   R   Rh   R   Ri   Rj   Rk   Rl   Rm   R   R   R"   R   Rn   Ro   Rp   R&   t   rep_statRe   Rq   R    Rr   RH   Rt   (   R   R[   R}   R/   R   Rw   R{   (    (    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyR€   u  sr    

%
%	


!

!
i   i   c         C   se   |  j  ƒ  |  j j ƒ  \ } } |  j j | d | d ƒ |  j |  j j ƒ  | d | d f ƒ d  S(   Ni   (   R    R   t   rep_get_requestt   rep_set_requestRH   (   R   t   minimumt   maximum(    (    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyt   test02_test_request¼  s
    
i   c            s  ˆ  j  j d t j ƒ ˆ  j j d t j ƒ ‡  f d †  } | ˆ  _ ˆ  j j ƒ  ˆ  j j ƒ  ˆ  j  j	 t j
 d ƒ ˆ  j j	 t j
 d ƒ t ˆ  j d <xF t rß y% ˆ  j j d d ƒ t ˆ  j d <PWqš t j k
 rÛ qš Xqš Wˆ  j ˆ  j ƒ x ˆ  j j ƒ  d s	qó Wd  S(   NR,   c            s#  xt  r| j ƒ  } | d  k r% d  Sˆ j | d | d | ƒ } | rp ˆ j rp ˆ j j d t j ƒ t	 } n  | d t j
 k r ‡  ‡ f d †  } ˆ  d rˆ j rd d l m } t  ˆ  d <| d | ƒ }	 d d  l }
 |
 j d d k  r|	 j t  ƒ n	 t  |	 _ |	 j ƒ  qq q Wd  S(	   Ni    i   R,   c              sG   x@ t  rB y ˆ j d d ƒ t ˆ  d <PWq t j k
 r> q Xq Wd  S(   Ni   i   i    (   R   t	   rep_electR   R    t   DBRepUnavailError(    (   Rœ   Rš   (    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyt   electÔ  s    	
iÿÿÿÿ(   R   R   i   (   R   Rr   R    R™   R	   R   Rž   R    RV   R   t   DB_REP_HOLDELECTIONR“   R   R]   R”   R•   R–   RŸ   (   Rš   R›   Rˆ   Rœ   R   R{   t   rRª   R   t   tR]   (   R   (   Rœ   Rš   s1   /sys/lib/python2.7/bsddb/test/test_replication.pyRŠ   Ê  s&    	 	
	iPÃ  i    i   i   t   startup_complete(   R   Rž   R    RW   R   RŠ   R—   RŸ   R˜   RN   RQ   R   R   R¨   R   R©   RB   R	   R¢   (   R   RŠ   (    (   R   s1   /sys/lib/python2.7/bsddb/test/test_replication.pyt   test03_master_electionÄ  s&    		c         C   sL   d \ } } |  j  j | | ƒ |  j | | f |  j  j ƒ  ƒ |  j ƒ  d  S(   NiÒ  iÎ  (   iÒ  iÎ  (   R   t   rep_set_clockskewRH   t   rep_get_clockskewR    (   R   t   fastt   slow(    (    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyt   test04_test_clockskew  s
    (   i   i   (   i   i   (   i   i   (   R)   R*   R#   R(   R    R€   R    R4   R§   R¯   R´   (    (    (    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyR   
  s   	B			F<c          C   s    t  j ƒ  }  t j ƒ  d k rœ t j ƒ  } y | j ƒ  t } Wn t } n X| j ƒ  ~ | rz |  j	 t  j
 t ƒ ƒ n  t rœ |  j	 t  j
 t ƒ ƒ qœ n  |  S(   Ni   i   (   i   i   (   t   unittestt	   TestSuiteR    R4   R   RZ   R   R   R&   t   addTestt	   makeSuiteR+   R   R   (   t   suiteR„   t   ReplicationManager_available(    (    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyt
   test_suite
  s    



t   __main__t   defaultTestR»   (   t   __doc__R   R[   Rµ   t   test_allR    R   R   R   R   R   t   TestCaseR   R+   R   R»   R)   t   main(    (    (    s1   /sys/lib/python2.7/bsddb/test/test_replication.pyt   <module>   s   .9Ãÿ 	