
    Hmd<                       d dl Z d dlZd dlZd dlZd dlZd dl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mZ d dlmZmZ d dlmZ d dlZd dlZd dlmZ d dlmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& dZ'dZ(d	 Z)d
 Z*d Z+d/dZ, G d de-          Z. G d de.          Z/ G d de.          Z0 G d de-          Z1 G d de-          Z2 G d de-          Z3 G d de-          Z4 G d de-          Z5 G d de-          Z6 G d d e-          Z7 G d! d"e-          Z8 G d# d$e7          Z9 G d% d&e9          Z: G d' d(e9          Z; G d) d*e<          Z= G d+ d,e>          Z? G d- d.e-          Z@dS )0    N)ENOENTENODATAEEXISTEACCESEAGAINESTALEEINTR)	ConditionLock)datetime)rconf)ThreadGsyncdErrorescape_space_newlineunescape_space_newlinegauxpfxescapelstat
errno_wrap
FreeObjectlfmatching_disk_gfidNoStimeAvailablePartialHistoryAvailablehost_brick_split)r      c                  x    t          j                     } t          |           }t          | |z
  dz            }||fS )Ni@B )timeint)tsecnsecs      @/usr/lib/x86_64-linux-gnu/glusterfs/python/syncdaemon/primary.py
_xtime_nowr%   0   s8    	A
a&&CC7"##D;    c                 :   |                                  }|| j                 }|rw|d         t          t          j                              z
  dz   }t	          j        t          d|                     t          j        |           |                                  }|S )Ntimeout   z-foreign volume info found, waiting for expiry)expiry)get_sys_volinfoKFGNr    r   logginginfor   sleep)selfvolinfo_sysfgn_vir*   s       r$   _volinfo_hook_relax_foreignr3   7   s    &&((K#F -	"S%5%559RG%' ' ' 	( 	( 	(
6**,,r&   c                     i }| |d<   d|d<   |D ]W}|dk    rD||         }i x}|d<   |r2|j         |d<   |j        |d<   |j        |d<   |j        |d<   |j        |d	<   L||         ||<   X|S )
NopF
skip_entrystatuidgidmodeatimemtimest_uidst_gidst_modest_atimest_mtime)r5   eddctkstdsts         r$   edctrH   C   s    
CCI C  ;;AB ""C#f+ +YE
YE
 jF!{G!{GUCFFJr&   c           	         t           j        t                   }t          j        d          }|sd}t          j        d          dk    rd}n| r| }nt          j        d          }t          j        t          d|                     t          ||	                                dz             }t          |d|	                                z   dz             }t          j        d	          rt          }nt          }t          j        d
          rt          }nt          }t          j        d          dk    rt          }nt          } G d d|||||          }|S )zDproduce the GPrimary class variant corresponding
       to sync modezspecial-sync-modenormalzchange-detectorxsyncz setting up change detection mode)r:   MixinGPrimaryzuse-rsync-xattrsignore-deletessync-methodtarsshc                       e Zd ZdS )#gprimary_builder.<locals>._GPrimaryN__name__
__module____qualname__ r&   r$   	_GPrimaryrR   }   s        r&   rX   )sysmodulesrT   gconfgetr-   debugr   getattr
capitalizeSendmarkRsyncMixinSendmarkNormalMixinPurgeNoopMixinPurgeNormalMixinTarSSHEngineRsyncEngine)	excrawlthis	modemixinchangemixin
crawlmixinsendmarkmixin
purgemixin
syncenginerX   s	            r$   gprimary_builderrn   Z   ss    ;x D	-..I 	y"##w..	 3i 122M"7%' ' ' ( ( (i2244w>??IzK,B,B,D,DDwNOOJy#$$ ,*+y!"" &#

%
y8++!

 
    J	=z   r&   c                       e Zd ZdZeZed             Zed             Zed             Z	ed             Z
d Zd Zd Zd	 Zd
 Zd Zd ZdS )NormalMixinznormal geo-rep behaviorc                 &    dt          |           z  S )Nz%d.%d)tuplexts    r$   serialize_xtimezNormalMixin.serialize_xtime   s    r""r&   c                 Z    t          d |                     d          D                       S )Nc              3   4   K   | ]}t          |          V  d S N)r    ).0xs     r$   	<genexpr>z0NormalMixin.deserialize_xtime.<locals>.<genexpr>   s(      33SVV333333r&   .)rr   splitrs   s    r$   deserialize_xtimezNormalMixin.deserialize_xtime   s)    33RXXc]]333333r&   c                     | S rx   rW   rs   s    r$   native_xtimezNormalMixin.native_xtime   s    	r&   c                     | |k    S rx   rW   )xt0xt1s     r$   	xtime_geqzNormalMixin.xtime_geq   s    czr&   c                 8    d|vr||d<   d|vrt           |d<   d S d S )Ncreatedefault_xtimeURXTIME)r0   
is_primaryoptss      r$   make_xtime_optszNormalMixin.make_xtime_opts   s9    4'DN$&&$+D!!! '&r&   c                    || j         k    r!|j                            || j                  }n|j                            || j                  }t          |t                    rf|t          k    r[|j                            || j                  }t          |t                    s&| j        j        	                    || j        |           t          |t                    r|t          k    r|S |t          k    s|| j
        k     rM|d         r5t                      }|j        j                            || j        |           nd}||k    r|d         }|S )Nr   r   r   r   )primaryserverxtimeuuidstime
isinstancer    r   	secondary	set_stimevolmarkr%   
aggregated	set_xtime)r0   rscpathr   rt   	zero_zeros         r$   	xtime_lowzNormalMixin.xtime_low   s1   $,!!$	22BB!!$	22B"c"" IrW}}Z%%dDI66!"c** IN)33D$)RHHHb# 	2==I==B--H~ /\\
%//diDDDD"	??o.B	r&   c                     | j         }|r;|                                }t          t          j                              |z   |d<   nt	          d|          }||fS )Nr(   
   )volinfocopyr    r   min)r0   timogapvis       r$   keepalive_payload_hookz"NormalMixin.keepalive_payload_hook   sW     \ 		B	,,t3ByMM b#,,CCyr&   c                 *    |                                  S rx   )r+   r0   s    r$   volinfo_hookzNormalMixin.volinfo_hook   s    ##%%%r&   c                 6    ||k    rt          d|z             d S )Nztimestamp corruption for )r   r0   r   xtlxtrs       r$   xtime_reversion_hookz NormalMixin.xtime_reversion_hook   s&    999D@AAA 9r&   c                     ||k    S rx   rW   )r0   extextrds       r$   	need_synczNormalMixin.need_sync   s    Tzr&   c                 R    | j         j                            || j        |           d S rx   )r   r   r   r   )r0   r   marks      r$   set_secondary_xtimezNormalMixin.set_secondary_xtime   s'    ''di>>>>>r&   N)rT   rU   rV   __doc__r   minus_infinitystaticmethodru   r~   r   r   r   r   r   r   r   r   r   rW   r&   r$   rp   rp      s        !!N # # \# 4 4 \4   \   \, , ,  *   & & &B B B  ? ? ? ? ?r&   rp   c                       e Zd ZdZd ZdS )PartialMixinzpa variant tuned towards operation with a primary
       that has partial info of the secondary (brick typically)c                     d S rx   rW   r   s       r$   r   z!PartialMixin.xtime_reversion_hook       r&   N)rT   rU   rV   r   r   rW   r&   r$   r   r      s/        C C    r&   r   c                   4    e Zd ZdZed             Zd Zd ZdS )RecoverMixinzPa variant that differs from normal in terms
       of ignoring non-indexed filesc                 8    d|vrd|d<   d|vrt           |d<   d S d S )Nr   Fr   r   )r   r   s     r$   r   zRecoverMixin.make_xtime_opts   s9    4"DN$&&$+D!!! '&r&   c                 
    d |fS rx   rW   )r0   r   r   s      r$   r   z#RecoverMixin.keepalive_payload_hook   s    c{r&   c                      t          |           S rx   )r3   r   s    r$   r   zRecoverMixin.volinfo_hook   s    *4000r&   N)rT   rU   rV   r   r   r   r   r   rW   r&   r$   r   r      sW        ( ( , , \,  1 1 1 1 1r&   r   c                       e Zd Zd ZdS )ra   c                      | j         |i |S rx   )sendmarkr0   akws      r$   sendmark_regularz$SendmarkNormalMixin.sendmark_regular   s    t}a&2&&&r&   NrT   rU   rV   r   rW   r&   r$   ra   ra      s#        ' ' ' ' 'r&   ra   c                       e Zd Zd ZdS )r`   c                     d S rx   rW   r   s      r$   r   z#SendmarkRsyncMixin.sendmark_regular  r   r&   Nr   rW   r&   r$   r`   r`     #            r&   r`   c                       e Zd Zd ZdS )rc   c                 F    | j         j                            ||           d S rx   )r   r   purger0   r   namess      r$   purge_missingzPurgeNormalMixin.purge_missing
  s#    ##D%00000r&   NrT   rU   rV   r   rW   r&   r$   rc   rc     s#        1 1 1 1 1r&   rc   c                       e Zd Zd ZdS )rb   c                     d S rx   rW   r   s      r$   r   zPurgeNoopMixin.purge_missing  r   r&   Nr   rW   r&   r$   rb   rb     r   r&   rb   c                   $    e Zd ZdZd Zd Zd ZdS )rd   zlSync engine that uses tar(1) piped over ssh(1)
       for data transfers. Good for lots of small files.
    c           	           t          j        t          d|                     |D ]@} j                            |          } fd}                      j        d||d |           Ad S )NFilesfilesc                 
   |                                 }|d         r%t          j        t          d|                      dS t	          |           }t          |t                    rj                            |            dS d S Nr   syncedfileT	waitr-   r]   r   r   r   r    unlinked_gfidsaddser   pbrvrF   r0   s        r$   regjobz'TarSSHEngine.a_syncdata.<locals>.regjob       WWYYa5 	$M"XB"7"7"78884 rB!"c** $+//333#t$ $r&   regr-   r]   r   syncerr   add_jobFLAT_DIR_HIERARCHYr0   r   fr   r   s   `    r$   
a_syncdatazTarSSHEngine.a_syncdata  s    b.../// 	N 	NA##B$ $ $ $ $ LL0%D"MMMM!	N 	Nr&   c                 @    |                      | j        d           rdS d S NTr   r   r   s    r$   syncdata_waitzTarSSHEngine.syncdata_wait/  *    99T,d33 	4	 	r&   c                 X    |                      |           |                                  d S rx   r   r   r0   r   s     r$   syncdatazTarSSHEngine.syncdata3  ,    r&   NrT   rU   rV   r   r   r   r   rW   r&   r$   rd   rd     sN         N N N*      r&   rd   c                   $    e Zd ZdZd Zd Zd ZdS )re   z1Sync engine that uses rsync(1) for data transfersc           	          t          j        t          d|                     |D ]c}t          j        t          d|                      j                            |          } fd}                      j        d||d |           dd S )Nr   r   zcandidate for syncingr   c                 
   |                                 }|d         r%t          j        t          d|                      dS t	          |           }t          |t                    rj                            |            dS d S r   r   r   s        r$   r   z&RsyncEngine.a_syncdata.<locals>.regjobC  r   r&   r   r   r   s   `    r$   r   zRsyncEngine.a_syncdata<  s    b.../// 	N 	NAM"41===>>>##B$ $ $ $ $ LL0%D"MMMM#	N 	Nr&   c                 @    |                      | j        d           rdS d S r   r   r   s    r$   r   zRsyncEngine.syncdata_waitR  r   r&   c                 X    |                      |           |                                  d S rx   r   r   s     r$   r   zRsyncEngine.syncdataV  r   r&   Nr   rW   r&   r$   re   re   8  sJ        ;;N N N,      r&   re   c                       e Zd ZdZdZdZd Zed             Zed             Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd ZddZed             Zd Zd Zd Zd ZddZdS )GPrimaryCommonz(abstract class impementling primary roler   r)   c                     | j         j        j                                        | j         j        j                                        }}d}|r*t          |          dk    rt          d          |d         }||fS )zTquery volume marks on fs root

        err out on multiple foreign primarys
        Nr)   z*cannot work with multiple foreign primarysr   )r   r   r   foreign_volume_infosnative_volume_infolenr   )r0   fgn_visnat_vir2   s       r$   r+   zGPrimaryCommon.get_sys_volinfob  s{     L*??AAL*==??   	 7||a!"NOOOQZFv~r&   c                 .    | j         r| j         d         S d S )Nr   r   r   s    r$   r   zGPrimaryCommon.uuidq  s#    < 	(<''	( 	(r&   c                 .    | j         r| j         d         S d S )Nvolume_markr  r   s    r$   r   zGPrimaryCommon.volmarkv  s#    < 	/<..	/ 	/r&   c                 ~    | j         j                            d| j                  }t	          |t
                    rd }|S Nr|   )r   r   entry_stimer   r   r    r0   datas     r$   get_entry_stimezGPrimaryCommon.get_entry_stime{  s:    ~$00di@@dC   	Dr&   c                 ~    | j         j                            d| j                  }t	          |t
                    rd }|S r  )r   r   r   r   r   r    r  s     r$   get_data_stimezGPrimaryCommon.get_data_stime  s:    ~$**3	::dC   	Dr&   c                     |r	|d         }n| j         }|                     || j         k    |            | j        ||fi |S )a  get amended xtime

        as of amending, we can create missing xtime, or
        determine a valid value if what we get is expired
        (as of the volume mark expiry); way of amendig
        depends on @opts and on subject of query (primary
        or secondary).
        r   )r   r   r   )r0   r   r   r   r   s        r$   r   zGPrimaryCommon.xtime  sW      	A$CC,CSDL0$777t~c4004000r&   c                    || _         || _        i | _        t          j        d          dk    r"t          || j        j        dg          | _        n"t          || j        j        ddg          | _        d| _	        d| _
        t          j
        | _        t          j                    | _        dddd| _        d | _        d | _        d | _        d| _        d	| _        t-                      | _        d S )
NrO   rP            r   crawlsturnsr   Fr)   )r   r   jobtabr[   r\   SyncerrP   r   rsyncr  r  r   total_turnsr   nowcrawl_start
lastreportstartchange_seenr   	terminatesleep_intervalsetr   )r0   r   r   s      r$   __init__zGPrimaryCommon.__init__  s    "9]##x// DN,AA3GGDKK !DN,@2r(KKDK 
 ;#<>>%&A>>
!eer&   c                      t          j        dd          dk    r, fd}t          |          }|                                 dS dS )zstart the keep-alive thread zsecondary-timeoutr   c                      	                      dz            \  } }j        j                            |            t	          j        |           P)NT      ?)r   r   r   
keep_aliver   r/   )r   r   clsr   s     r$   r/  z2GPrimaryCommon.init_keep_alive.<locals>.keep_alive  sP    $!88tczJJGBM(33B777JsOOO$r&   targetN)r[   r\   r   r&  )r0  r/  r!   r   s   `  @r$   init_keep_alivezGPrimaryCommon.init_keep_alive  sg    y,a00!88$ $ $ $ $ $
 j)))AGGIIIII 8r&   c                    t           j        r	 t          j        t           j        t          j        t          j        z             dS #  t          j                    d         }t          |t                    r|j
        t          t          fv rY dS  xY wd}t          | j                  dz   t           j        j        z   dz   t          t           j        j                  z   dz   }t$          j                            t+          j        d          d	          }t$          j                            ||          }t/          j        t3          d
|                     	 t%          j        |t$          j        t$          j        z            }n# t:          $ r t          j                    d         }|j
        t<          k    rt/          j        d           	 t%          j         |           n;# t:          $ r. t          j                    d         }|j
        tB          k    rn Y nw xY wt%          j        |t$          j        t$          j        z            }n Y nw xY w	 t          j        |t          j        t          j        z             |t           _        nX#  t          j                    d         }t          |t                    r$|j
        t          t          fv r|t           _        Y dS  xY wdS )zTake management volume lock Tr)   FN__subvol_z.lockmeta-volume-mntzgeo-repzlock file pathr   z,Creating geo-rep directory in meta volume...)"r   mgmt_lock_fdfcntllockfLOCK_EXLOCK_NBrY   exc_infor   IOErrorerrnor   r   strr   argssecondary_id
subvol_numosr   joinr[   r\   r-   r]   r   openO_CREATO_RDWROSErrorr   r.   makedirsr   )r0   exfdbnamemgmt_lock_dirr   s         r$   	mgmt_lockzGPrimaryCommon.mgmt_lock  s     	E.0MNNNt\^^A&b'** !rxFF;K/K/K 55DI$uz'>>K%*'(()+23UY/@%A%A9MMw||M511b)555666	rzBI566BB 	 	 	"Bx6!!KLLLK....   *Bx6))  WT2:	#9:: 	
	KEMEM9:::!#E	"B"g&& 287G+G+G%'"uuts\   6A ABB,F AIG"!I"5HIH1II8J AK K c                 b   t          j        d          s/t          j        j        | j        j                                        v S t          j	        
                    t          j        d                    s(t          j        d           t          j        d           |                                 S )Nzuse-meta-volumer7  z-Meta-volume is not mounted. Worker Exiting...r)   )r[   r\   r   rB  local_node_idr   r   	node_uuidrE  r   ismountr-   errorrY   exitrP  r   s    r$   should_crawlzGPrimaryCommon.should_crawl  s    y*++ 	O:+t|/B/L/L/N/NNNwuy):;;<< 	MIJJJHQKKK~~r&   c                 .    |                                   d S rx   )registerr   s    r$   rY  zGPrimaryCommon.register  s    r&   FNc                 	   |r|                                   d | _        |r	|df| _        |                                 }|| j                 | _        || j                 }t          j        |rdpdd| j        d           | j        t          _
        | j        r<| j        d         r.t          j        t          d| j        d                              nt          d	          t          j                    | j        d
<   t          j                    }|                                 }| j        sT| j        r7t          j        d| j        t          j                    | j        z
  fz             t          j                    | _        | j        | j        d
         z
  dk    }|rht          j        d| j        | j        d         z
  | j        | j        d         z
             | j                            | j        | j        | j                   t          j                    }t-          ||z
            t/          j        d          k    r|                                 }|}|                                  |s| j                                         |                     d| j                  }	| j        j        j         !                    dd"                    tG          | j                  t          j$        j%        g                    t          j        t          d|	                     tM          t,                    s|	k     r| j        j        '                    | j(        | j                   | )                               tT          j+        "                    | j,        d          }
tT          j+        -                    |
          rWfdtU          j.        |
          D             }|D ]4}tU          j/        tT          j+        "                    |
|                     5t          j0        d           | j        1                                 | 2                                 |rd S t          j0        | j3                   | j        Rd S d S )Nr   intermediater   z primary with volume id z ...retvalz'primary cluster's info may not be validrU  zprimary volinfo unavailabler   z%... crawl #%d done, took %.6f seconds<   z%d crawls, %d turnsr  r  r  zreplica-failover-intervalr|   z
Crawl info)cluster_stimebrick_stimez.processingc                     g | ]K}|                     d           r4t          |                    d          d                   d         k     I|LS )z
CHANGELOG.r|   r   r   )
startswithr    r}   )ry   r   r_  s     r$   
<listcomp>z,GPrimaryCommon.crawlwrap.<locals>.<listcomp>Q  sh     (? (? (?a,-LL,F,F(?,/R0@,A,A,9!,<-= -= )*-= -= -=r&      )4r3  live_changelog_start_timer   KNATr   r,   r-   r]   r   r   	volume_idwarnr   r   r   r%  rW  r(  r&  r  r  updater    r[   r\   update_worker_remote_nodestatusset_passiver   r   r   r   r   	stime_mntrF  rA  rB  rC  r   r   r   	upd_stimerE  r   tempdirexistslistdirremover/   
set_activecrawlr)  )r0   oneshotregister_timer1   inter_primaryt0rt  should_display_infot1r`  proc_dirto_purger   r_  s                @r$   	crawlwrapzGPrimaryCommon.crawlwrap   s    	#   """ *.& 	@.;Q-?D* ''))"49-#DI.$7D9DDyyy" 	# 	# 	# )< 	=|H% ?R I&*l8&<> > > ? ? ? ;<<<"&)++Y[[!!##. 7	,z GE#{DIKK$*,DEF G G GDJ"&*tv/F"F""L" 83"kDOH,EE"j4?7+CCE E E &&dk-1Z,0J ' 8 8 8 B27||uy)DEEEE))++**,,, ''))) #jjdn== $ 3 > H H3ty>>5:3J"KLL!N !Nb/<-8: : : ; ; ; "-55 E"]22-77 3TYO O O}555 $&7<<0=$? $? 7>>(33 E(? (? (? (?2:h3G3G (? (? (?H &. E E "	"',,x*C*C D D D D
1K""$$$JJLLL Jt*+++o . 7	, 7	, 7	, 7	, 7	,r&   c                     t          j        t          d                    d | D                                                               d          }t          |           dk    r|dt          | d                   z   z  }|S )z;format xtime-like (sec, nsec) pair to human readable formatr|   c              3   4   K   | ]}t          |          V  d S rx   )rA  )ry   ns     r$   r{   z+GPrimaryCommon.humantime.<locals>.<genexpr>e  s(      2I2Ia3q662I2I2I2I2I2Ir&   z%Y-%m-%d %H:%M:%Sr)   )r   fromtimestampfloatrF  strftimer  rA  )tpairtss     r$   	humantimezGPrimaryCommon.humantimeb  su     #E#((2I2I52I2I2I*I*I$J$JKKH()) 	u::>>#E!H%%B	r&   c           	         t          |j        d          \  }}t          |          }t          |          }d}t          |j        d          \  }}t          |d          \  }}|dk    r||d|dk    rdnddz  }|dk    r||d|dk    rd	nd
dz  }|t	          j        |d          dt	          j        |d          dt	          j        |d          z  }|S )Ng     v@ r^  r    r)   yearyearsdaydaysr  :)divmodr  r    secondsstringzfill)r0   
crawl_timer  r  datemshs           r$   _crawl_time_formatz!GPrimaryCommon._crawl_time_formatk  s   Z_f55tE

4yyj("--1a}}1A::!vv'H'HIID199tqyyeef&D&DEEDfl1a0000$l1a0000&,q!2D2D2DF 	Fr&   c                     | j                             |          
g | j         |<   | j         |                             |fdf           dS )z6insert @job function to job table at @path with @labelNc                        i S rx   rW   )r   jobr   s   r$   <lambda>z(GPrimaryCommon.add_job.<locals>.<lambda>  s    CCMbMM r&   )r  r\   append)r0   r   labelr  r   r   s      ```r$   r   zGPrimaryCommon.add_job~  s]    ;??4  ( "DKD  %,A,A,A,A,A,A!BCCCCCr&   c                 d    t          j        d|z              |                     ||d            dS )z7invoke .add_job with a job that does nothing just failsz
salvaged: c                      dS NFrW   rW   r&   r$   r  z,GPrimaryCommon.add_failjob.<locals>.<lambda>  s    % r&   N)r-   r]   r   )r0   r   r  s      r$   add_failjobzGPrimaryCommon.add_failjob  s5    lU*+++T5--00000r&   c                     | j                             |g           }d}|D ]} |d                     }|sd}|r|d          | j        |g|R   |S )zperform jobs registered for @path

        Reset jobtab entry for @path,
        determine success as the conjunction of
        success of all the jobs. In case of
        success, call .sendmark on @path
        Tr   Fr   )r  popr   )r0   r   rB  jobssucceedjrets          r$   r   zGPrimaryCommon.wait  sy     {tR(( 	  	 A!B%''C   	'47?DM$&&&&&r&   c                 v    |r | j         j                            ||           |                     ||           dS )zupdate secondary side xtime for @path to primary side xtime

        also can send a setattr payload (see Server.setattr).
        N)r   r   setattrr   )r0   r   r   adcts       r$   r   zGPrimaryCommon.sendmark  sC    
  	6N!))$555  t,,,,,r&   )FNrx   )rT   rU   rV   r   r,   rf  r+   propertyr   r   r  r  r   r+  r3  rP  rW  rY  r}  r   r  r  r   r  r   r   rW   r&   r$   r  r  [  si       22DD   ( ( X( / / X/    1 1 1 $ $ $>
 
 
0 0 0d       `, `, `, `,D   \  &D D D1 1 1
  $- - - - - -r&   r  c                       e Zd Zd ZdS )XCrawlMetadatac                     t          |          | _        t          |          | _        t          |          | _        t	          |          | _        t	          |          | _        d S rx   )r    r>   r?   r@   r  rA   rB   )r0   r>   r?   r@   rA   rB   s         r$   r+  zXCrawlMetadata.__init__  sG    &kk&kk7||hhr&   N)rT   rU   rV   r+  rW   r&   r$   r  r    s#        ( ( ( ( (r&   r  c                       e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZd	Zd	Zd
ZdZd Zd Zd Zd Zd Zd Zd Zd ZddZd ZddZd Zd Zd Zd ZdS )GPrimaryChangelogMixinz. changelog based change detection and syncing r   r  r)   r   zM zD zE r   r|   rd  c                 4    dddddddddddddddd| _         d S )Nr   )CREATEMKNODUNLINKMKDIRRMDIRLINKSYMLINKRENAMESETATTRSETXATTRXATTROPDATAENTRY_SYNC_TIMEMETA_SYNC_TIMEDATA_START_TIME)batch_statsr   s    r$   init_fop_batch_statsz+GPrimaryChangelogMixin.init_fop_batch_stats  sD      
 
r&   c                 ^    |dv rd}| j                             |d          dz   | j         |<   d S )N)	FSETXATTRr  r   r)   )r  r\   )r0   tys     r$   update_fop_batch_statsz-GPrimaryChangelogMixin.update_fop_batch_stats  s=    B#/33B::Q>r&   c                    dt          j                                        t          j        d                    z  }	 t          j        t          j        	                    | j
        |          d          }nM# t
          j        $ r; t          j        t          j        	                    | j
        |          d          }Y nw xY w|D ]}	 t          j                            |          }|                    t          j        	                    | j
        |          t          j                            |                     z#  t          j                    d         }t!          |t"                    st!          |t$                    r|j        t(          k    rY |                                  xY w|                                 |D ]}	 t          j                            |          }t          j        t          j        	                    | j
        |                     Z# t"          $ r }|j        t&          j        k    rY d }~~ d }~ww xY wd S )Nzarchive_%s.tarzchangelog-archive-formatr   w)arcnamer)   )r   todayr  r[   r\   tarfilerG  rE  r   rF  processed_changelogs_dir	ReadErrorbasenamer   rY   r>  r   rJ  r?  r@  r   closerr  )r0   
changelogsarchive_nametarr   excr   s          r$   archive_and_purge_changelogsz3GPrimaryChangelogMixin.archive_and_purge_changelogs  s1    ((.*:*:*C*CI011+3 +3 3	$,rw||D,I,8 :  :"$ $CC   	$ 	$ 	$,rw||D,I,8 :  :"$ $CCC	$
  	 	AG$$Q''T%BAFF " 0 0 3 3  5 5 5 5lnnQ'W-- W--3693F3FHIIKKK		 	 	AG$$Q''	"',,t'DaHHIIII   7el**HHHH			 	sE   8A6 6AC ?C A6D??AF+F+AH
I(IIIc                     t           j                            t          j        d          t          t          j        j                            }t          j
        d|z             |S )Nzworking-dirzchangelog working dir %s)rE  r   rF  r[   r\   r   r   rB  
local_pathr-   r]   )r0   workdirs     r$   setup_working_dirz(GPrimaryChangelogMixin.setup_working_dir  sN    ',,uy77%ej&;<<> >07:;;;r&   c                 ~   d}|D ]}t          t          j                            ||d         |                             }t	          |t
                    sL|dz  }t          j        t          d|z  |                     |d         d         dk    rt          d          | j
                            d|           d S )	Nr   r)   z	%s FAILED)r  r5   r  zEThe above directory failed to sync. Please fix it to proceed further.failures)r   rE  r   rF  r   r    r-   rU  r   r   rk  	inc_value)r0   r  	entry_keygfid_prefix
log_prefixnum_failuresfailurerF   s           r$   log_failuresz#GPrimaryChangelogMixin.log_failures  s     	L 	LGrw||KI1FGGHHBb#&& L!bz!9&-/ / / 0 0 01:d#w..% 'K L L L 	j,77777r&   c                    t                      }g }g }t                      }|D ]7}|d         d         r|d         d         }	n+|d         d         r|d         d         }	n|d         d         }	|d         d         }
|d         d	         s|d         d         r|d         d
         }t          t          j                            ||                    }t          |t                    r|t          k    rt          j
        t          d|t          |                               |d         d         r2|                    t          d|d         d
         |	                     n1|                    t          d|d         d
         |	                     |                    |           |
dv rt          t          j                            ||d         d                             }t          |t                    r|t          k    rt          j
        dt          |          z             |                    |d         d                    |                    t          d|d         d         |d         d                              kt          |t                    st!          ||	          rt          j
        t          d|t          |                               |                    |d         d                    |
dk    r=|                    t          d|d         d         |d         d                              (|d         d         rt          j        t          j                            t$          j        j        d|dd         |dd         |                    }t          j                            ||                    d          d         |                    d          d                   }|	}t          j
        t          d|t          |                               ||k    r`t          j
        t          d|t          |                               	 |                    |d                    f# t.          $ r Y sw xY wt          d||||d           }t          j
        t          d|t          |                               |                    |           t          j
        t          d|t          |                               |                    t          d|d         d
         |	                     8|d          t          k    r|
dv r|d         d         }	n|d         d         }	|	                    d          d          }t          t          j                            ||                    }t          |t                    r`t          j
        t          d!|t          |                               	 |                    |d                    # t.          $ r Y $w xY wt          j
        t          d"|t          |                               t          j        t          j                            t$          j        j        d|dd         |dd         |                    }t          j                            ||                    d          d         |                    d          d                   }|                    t          d#|||j        |j        |j        $                     9t          j
        d%t          |          z             |rB|D ]?}|d         d&v r3|d         |v r)t          j
        d't          |          z             d(|d)<   @|r| j        j                            |          }||fS )*Nr  name_mismatchsecondary_entryrG   r   entry1entryr5   gfid_mismatchsecondary_gfidzSEntry not present on primary. Fixing gfid mismatch in secondary. Deleting the entry)retry_countr  secondary_isdirr  gfidr  r  )r  r  zUnlink source %szBFixing gfid mismatch in secondary.  Safe to ignore, take out entryr  z
.glusterfs   /r   z*Fixing dir name/gfid mismatch in secondaryzJFixing dir name/gfid mismatch in secondary. Safe to ignore, take out entryr  r  r  r7   linkz4Fixing dir name/gfid mismatch in secondary. RenamingzLFixing file gfid mismatch in secondary. Hardlink/Rename Case. Deleting entryr)   zbFixing ENOENT error in secondary. Parent does not exist on primary. Safe to ignore, take out entryzGFixing ENOENT error in secondary. Create parent directory on secondary.r  r  r  r:   r8   r9   zremove_gfids: %s)r  r  r  r  z-Removed entry op from retrial list: entry: %sTr6   )r   r*  r   rE  r   rF  r   r    r   r-   r]   r   reprr  rH   r   r   readlinkr   rB  r  r}   rr  
ValueErrorr@   r>   r?   r   r   	entry_ops)r0   r  r  entriespfxfix_entry_ops	failures1remove_gfidsr  pbnamer5   r  rF   realpath	dst_entry	src_entryrename_dictpargfid	dir_entryr   s                       r$   fix_possible_entry_failuresz2GPrimaryChangelogMixin.fix_possible_entry_failures  s   ii	uu N	M N	MGqz/* - $56E" - H- G,D!Bqz/* DMgaj.I DM!(,<!=27<<^<<==b#&& ]02<<M" &P0;*.w--#9 #9 #9 : : :
 qz"34 	0%,, &-aj1A&B'-/ / /0 0 0 0
 &,, &-aj1A&B'-/ / /0 0 0 !$$^444Z'' #27<<WQZ5G#H#HII%b#.. A2<<#M*<tG}}*LMMM(,,WQZ-?@@@)00 $X*1!*V*<+21:g+>!@ !@ !@A A A
 $B,, @0).&AA ?0  b *J4?.27mm'= '= '= > > > %((F);<<<>>)00 $X*1!*V*<+21:g+>!@ !@ !@A A A !$56 00#%;rw||/4z/D/;/=ac/B/=ac/B/=0? 0? $@ $@ %'GLLhnnS6I6I"6M191D1DR1H%J %J	$*	b *4AL.27mm'= '= '= > > > %	11 $M" .= 9D26w--	+A +A +A B B B
% 'wqz : : : :#- % % % $% +/xn5>6?b48+: +: +:K $M" .F8C26{2C2C+E +E +E F F F *00====  b *O4?.27mm'= '= '= > > > &,, &-aj1A&B'-/ / /0 0 0 v%%##$QZ1FF$QZ0F ,,s++A.27<<W5566 b#&& MM" &= 1<*.w--	#9 #9 #9 : : :
wqz2222%    M" &E0;*.w--#9 #9 #9 : : :  "{27<<
8M8D8?!8?!8?	,A ,A  B  BH
 !#S(..2E2Eb2I-5^^C-@-@-D!F !FI!((W7)"$*")L L LM M M 	(4+=+==>>> 	+ + +T7DDDyL00M"QTXYZT[T["[\\\&*AlO 	G-77FFI=))s$   ,R		
RRX::
YYc                 V   d}d}g }g }g }g }|rd}|}|}|re|| j         k     rZ|dz  }|                     |||          \  }}|s&d}t          j        t	          d|                     nd}|}|}|r|| j         k     Z|r)|D ](}	t          j        dt          |	                     %d S d S d S )Nr   FTr)   z/Successfully fixed entry ops with gfid mismatch)r  zFailed to fix entry ops %s)MAX_EF_RETRIESr  r-   r.   r   rU  r  )
r0   r  r  retriespending_failuresr  	failures2
entry_ops1
entry_ops2r  s
             r$   handle_entry_failuresz,GPrimaryChangelogMixin.handle_entry_failures  sE    		

 	O# I J" ,w1D'D'D1*.*J*Jw
+4 +4'J  ,',$L %,9@"B "B "B C C C C (,$ )I!+J # ,w1D'D'D   O( O OGM">WNNNN)	O 	O$O OO Or&   c                 4   t                      }g }g }t                      }t                      }|                    d          d         }	d}
d }d }| j        dv r(|                                 }|                                 }|1|/|d         |d         k    r|}t          |	          |d         k    rd}
	 t          |d          }|                                }|	                                 n# t          $ r  w xY w|D 	]}|                                }|| j        | j                 }|| j        d                              d          }| j        d	k    s| j        d
k    rKt          j        j        r:|| j        k    r/t%          j        t)          d|| j                                      |
r|| j        k    r|| j                 dvr|| j        k    r|| j                 }|                     || j                            t/          t0          j                            ||| j                                     }|| j                 }|dv rt/          t0          j                            ||| j                                     }t0          j                            ||d                   }t=          |          }||v r*t?          |t                    r|                     |           |dv r;t?          |t                    s&t%          j!        t)          d||                     (tE          j#        d          s'|
s%|$                    tK          |||                     e|dv r/|dv rt          |d                   }|dz  rtM          t          |d                   t          |d                   t          |d                   dd          }|$                    tK          d|||                     |'                    t0          j                            ||d                              6|$                    tK          |||t          |d                   t          |d                   t          |d                                        |dk    rAt0          j                            ||          }t=          |          }t?          |t                    ri }d }|r_tQ          j)        |j*                  rFtW          t0          j,        |gtZ          gt\          t^          g          }t?          |t                    rd }t/          t0          j                            ||| j        dz
                               }|$                    tK          ||||||                      |'                    t0          j                            ||                     ta          ||          s&t%          j        t)          d!||"                     t0          j                            ||          }t=          |          }t?          |t                    r&t%          j        t)          d!||"                     |dk    rd }|r_tQ          j)        |j*                  rFtW          t0          j,        |gtZ          gt\          t^          g          }t?          |t                    rd }|$                    tK          |||||#                     |3|'                    t0          j                            ||                     H|d$k    rotW          t0          j,        |gtZ          gt\          t^          g          }t?          |t                    r|$                    tK          |||||#                     t%          j1        t)          d%||&                     || j2        k    r| j3        rCt0          j                            ||d                   | j3        v rt%          j        d'           8|'                    t0          j                            ||d                              s|| j4        k    rm|                     || j                            |d         d(k    rtk          |          d)k    rm|'                    t0          j                            ||d                   tm          |d         |d         |d         |d)         |d*         +          f           +|'                    t0          j                            ||d                   f           g|d         d,v rytE          j#        d-          d.k    satE          j#        d/          stE          j#        d0          r9|'                    t0          j                            ||d                              t%          j1        t)          d1|2                     	t%          j        d3to          |          z             | xj8        tk          |          z  c_8        | j9        :                    d4tk          |                     | j;        d5xx         | j8        | j;        d6         z
  | j;        d7         z
  z  cc<   ty          j<                    }|r:|
s7| j9        :                    d8tk          |                     | j=        j>        ?                    |          }tE          j#        d9          r<d}tk          |          }tk          |          }|r#t%          j!        t)          d:|;                     |r|| j@        k     r|dz  }| A                    ||           t%          j!        t)          d<|;                     | j=        j>        ?                    |          }|st%          j!        d=           nv|tk          |          k    r8|tk          |          k    r%t%          j!        t)          d>||?                     n+tk          |          }tk          |          }|r|| j@        k     | B                    |d@t                      dA           | j9        C                    d8tk          |                     | j        dv rJt          |	          dz
  df}| D                    |           | j9        E                    dB|d                    | j;        dCxx         ty          j<                    |z
  z  cc<   |
r%| xjF        dz  c_F        | jG        |	| _G        |	| _H        ty          j<                    } |r+g }!|D ]}tk          |          dk    r	|d         }nt=          |d                   }t?          |t                    r*t%          j        t)          dD|d         E                     r|!$                    tK          dF|d         |G                     |!r| j9        :                    dHtk          |!                     | j=        j>        I                    |!          }| B                    |dIdJdF           | j9        C                    dHtk          |!                     | j;        dKxx         ty          j<                    | z
  z  cc<   | j;        dL         dk    rty          j<                    | j;        dL<   |r1| J                    |           | jK        L                    |           d S d S )MNr|   r   F)live_changeloghistory_changelogr   Trr  r  r  zskip ENTRY op if hot tier brick)r5   )r  r  r  )r  r  )r  z,Ignoring rmdir. Directory present in primary)r  pgfid_bnamerN   r  )r  r  r  )r  r        r  )r@   r>   r?   rA   rB   r  )r7   r  r  r  r  r)   r  z%Ignoring entry, purged in the interim)r   r  )r7   r  r  r  r  zignoring op)r  typez(ignoring data, since file purged interimr  rd     r=   )r  r  FXATTROPrO   rP   zsync-xattrsz	sync-aclszgot invalid fop type)r  zentries: %sr  r  r  r  r  zgfid-conflict-resolutionz#Entry ops failed with gfid mismatch)countzRetry original entriesz3Successfully fixed all entry ops with gfid mismatchz$No more gfid mismatches can be fixed)r  r  r  ENTRYlast_synced_entryr  zfile got purged in the interimr   META)gor7   metar  r  r  r  )Mr   r*  r}   namer  r  r    rG  	readlinesr  r?  strip	IDX_STARTIDX_ENDr   rB  
is_hottier
TYPE_ENTRYr-   r]   r   POS_TYPEr  r   rE  r   rF  
POS_ENTRY1POS_GFIDUNLINK_ENTRYr   r   rr  r.   r[   r\   r  rH   r   r   r7   S_ISLNKr@   r   r  r   r   r	   r   rh  	TYPE_GFIDr   	TYPE_METAr  r  r  files_in_batchrk  r  r  r   r   r   r  MAX_OE_RETRIESr  r  	dec_valueupd_entry_stime	set_fieldnum_skipped_entry_changelogsskipped_entry_changelogs_firstskipped_entry_changelogs_lastmeta_opsr   datas_in_batchri  )"r0   changedoneretryr  clistr  	meta_gfiddatas	change_tsignore_entry_opsr  
data_stimer   r   etecr  enr  ptrF   r:   r  rle1entry_start_timer  r  num_entriesr  entry_stime_to_updatemeta_start_timemeta_entriess"                                     r$   process_changez%GPrimaryChangelogMixin.process_change  s3   iiEE	LL%%b)	 !
9???..00K,,..J"z'= !}{1~--( 9~~Q//#' 	VS!!AKKMMEGGIIII 	 	 		  u	* u	*A		A4>$,./B4<==!'',,B y,,,y///:( R4?-B-BM"%F(*4=(9#; #; #; < < <   B$/$9$9$- (DDDT_$$
 &++Bt},=>>> ,GLLb&9::< < $-(,,, 0S"T->*?@@B BB
 c2a511BrBU{{z"c':':{R(((Yz"c/B/BR )28<"&N &N &N O O O  9%566 J/ J#NN4R+H+H+HIII777Y"2a5zz&= ) &0BqE

7:2a5zz7:2a5zz9:9:	&< &< &< !(tF2480: 0: 0: !; !; !;
 !&		"',,sBqE*B*B C C C ( NN4R(+BqE

'*2a5zzs2a5zz$C $C $C D D D D 8^^c400BrB!"c**  B &dl2:66 &'bTF8)/9 9%b#.. &!%B/S"T_q-@*ABBD DBNN4R-/b$: $: $: ; ; ; IIbgll3556666 .dB77 !b *068t'E 'E 'E F F F c400BrB!"c** !b *068t'E 'E 'E F F F V||! *$,rz":": *!+BK"x-3UO"= "=B)"c22 *%)tBRr,.(0 (0 (0 1 1 1 :!IIbgll3&=&=>>>y'bTF8)/9 9%b#.. %$ "BTKKKM M M M  R-1-/&1 &1 &1 2 2 2 2 t~%% & 87<<RU++t/BBBM"LMMMMIIbgll31667777t~%%++Bt},=>>>a5I%%2ww!|| "rw||CA'?'?'5RU=?U>@e?A!u?A!u	(F (F (F'G H H H H "rw||CA'?'?&BCCCCUAAA !9]33x??	-00 @49Ik4J4J @		"',,sBqE":":;;;R 6%') ) ) * * * *md7mm3444 	s5zz)fc%jj111   D$7Z(%)Y'%( 	(     9;; -	@+ -	@K!!'3w<<888~,66w??Hy344 1!'ll"8}} 9L$I*6"8 "8 "8 9 9 9 154+>#>#>QJE..xAAAL$<E!J!J!JKKK#~4>>wGGH#  &5 6 6 6 %G44%X66R(N0;1=&? &? &? @ @ @ "%g,,K#&x==L-  154+>#>#>0 h		7CCCK!!'3w<<888 yCCC),Y!);Q(?%$$%:;;;%%&9&;A&>@ @ @ 	*+++ty{{=M/MM+++ 	;--2--2:6?31:D.)++ 	AL 	E 	Er77Q;;ABBr!uBb#&& M"%E*,Q%#1 #1 #1 2 2 2##DBqE$C$C$CDDDD A%%fc,.?.?@@@>099,GG!!(D"f===%%fc,.?.?@@@)***dikkO.KK***-.!3326)++D./  	.OOE"""&&u-----	. 	.s   58C. .C:c                 2   d}d}t                      | _        d| _        t                      | _        | j                                         d | _        d | _        d| _        t          j	                    | _
        |                                  	 |r|t          j        d          dz
  k    r| j                                         | j        D ]%}|| j        v r| j                            |           &| j        r|                     | j                   nQ|D ]N}t#          j        t'          d|                     |                     |||           |s| xj        dz  c_        O|                                 rt                      | _        |ryt/          |                    d          d	                   dz
  df}|                     |           t5          t7          | j        |                     |                     |           | j                            d
| j                   d| _        t                      | _        nd}|dz  }|t          j        d          k    rt#          j         t'          dt5          t7          tB          j"        j#        |                                         | j                            d
| j                   d| _        t                      | _        |ryt/          |                    d          d	                   dz
  df}|                     |           t5          t7          | j        |                     |                     |           nt#          j$        t'          dt5          t7          tB          j"        j#        |                                         | j                            d
| j                   d| _        |                                  t          j%        d           u| j        ;| j        4t#          j&        t'          d| j        | j        | j                             |rt#          j&        t'          d| j'        d         | j'        d         | j'        d         | j'        d         | j'        d         | j'        d         | j'        d         | j'        d         d| j'        d         z  
  
                   t#          j&        t'          d| j'        d         d| j'        d         z  | j'        d          | j'        d!         | j'        d"         dt          j	                    | j'        d#         z
  z  $                     t#          j&        t'          d%| j(        dt          j	                    | j
        z
  z  |d                             d          d	         |d	                             d          d	         tS          |          | *                                | +                                &                     d S d S )'Nr   FTzmax-rsync-retriesr)   zprocessing change	changelogr|   r   r  z;changelogs could not be processed completely - moving on...r   z$incomplete sync, retrying changelogsr.  z$Skipping already processed entry ops)from_changelogto_changelognum_changelogszEntry Time Takenr  r  r  r  r  r  r  r  %.4fr  )	UNLRMDCREMKNMKDRENLINSYMdurationzData/Metadata Time Takenr  r  r  r  r  r  )SETAmeta_durationSETXXATTr  data_durationzBatch Completed)r:   rY  changelog_startchangelog_endrO  r   r  ),r*  r   r+  r4  r   disable_errorlogr1  r2  r0  r   batch_start_timer  r[   r\   enable_errorlogrr  r   r-   r]   r   rI  r  r   r    r}   rn  listmapchangelog_done_funcr  rk  r-  rU  rE  r   r  rh  r/   r.   r  r  r  r  r  )r0   changesr6  triesr7  unlinked_gfidr5  r   s           r$   processzGPrimaryChangelogMixin.process  s+   !ee!ee$$&&&.2+-1*,-) $	!!###a	  (UY':;;a?@@K//111 &*%8 B BM$(;;;+22=AAA & 9OOD$7888% ( (FM"%8/5#7 #7 #7 8 8 8''e<<<  (

a

, !!## &)ee# ?v||C0045591=CNN3'''T5w??@@@55g>>> %%fd.ABBB&'#&)ee# EQJE	"56666b "='+C0@',J,J'K'KM M M N N N
 %%fd.ABBB&'#&)ee# ?v||C0045591=CNN3'''T5w??@@@55g>>> LB"&s27+;W'E'E"F"FH H H I I I K!!&$*=>>>"#D%%'''JsOOOCa	H .:-9LB+/+N)-)K+/+LN N N O O O  	8L%'1'0'1'0'0'1'/'	2"T%56G%HH	J 	J 	J
K 
K 
K L-(3!'$*:;K*L!L(4(3(0!'y{{T%56G%HH"JK K KL L L L$	"dikkD4I&IJ#*1:#3#3C#8#8#<!(!2!23!7!7!;"%g,,,,..#33557 7 78 8 8 8 8/	8 	8r&   c                 \    | j         j                            | j        | j        |           d S rx   )r   r   set_entry_stimer   r   )r0   r   s     r$   r.  z&GPrimaryChangelogMixin.upd_entry_stime  s6    --d.E*.)*/	1 	1 	1 	1 	1r&   Nc                     |s| j         }|t          k    s|                     ||           || j         k    rDt          j        d          }d}|t          |          }| j                            ||           d S d S )N
checkpointr   )r   r   r   r[   getrr    rk  set_last_synced)r0   r   r   
chkpt_timecheckpoint_times        r$   rn  z GPrimaryChangelogMixin.upd_stime  s     	+*DMM$&&& 4***L11JO%"%j//K''????? +*r&   c                     t           j        j        }|                    d          }|d         }t	          |          \  }}| j                            |           d S )N@r   )r   rB  resource_remoter}   r   rk  set_secondary_node)r0   node	node_dataremote_node_ipr5  s        r$   rj  z0GPrimaryChangelogMixin.update_worker_remote_node  sR    z)JJsOO	},T22&&~66666r&   c                    g }d}|D ]}t          j        |          j        }||z   t          j        d          k    r|                    |g           |}O||z  }|s|                    |g           m|d                             |           |D ]:}t          j        t          d|                     | 	                    |           ;d S )Nr   zchangelog-batch-sizer   zprocessing changes)batch)
rE  r   st_sizer[   r\   r  r-   r]   r   rj  )r0   rg  changelogs_batchescurrent_sizecsir{  s          r$   changelogs_batch_processz/GPrimaryChangelogMixin.changelogs_batch_process  s    	5 	5A!$B\!UY/E%F%FFF #))1#...! ") 5&--qc2222&r*11!4444' 	  	 EM"1#(* * * + + +LL	  	 r&   c           	      p   | j                             d           g }|                                 t          j                     | xj        dz  c_        t          j                    }|rrt          j        t          d                     fd|D             }|D ]l}t          j
        t          dt          j                            |                               |                     |           |                    |           m|                     |           |                     |           d S )NzChangelog Crawlr)   secondary's timer   c                 x    g | ]6}t          |                    d           d                   d         k     4|7S r|   r   r   r    r}   ry   rz   r=  s     r$   rc  z0GPrimaryChangelogMixin.crawl.<locals>.<listcomp>  sK     G G G1 #AGGCLL$4 5 5
1 E E  E E Er&   !skipping already processed changerK  )rk  set_worker_crawl_statusr  libgfchangelogscanr  
getchangesr-   r.   r   r]   rE  r   r  rf  rr  r  r  )r0   rg  	processedprr=  s       @r$   rt  zGPrimaryChangelogMixin.crawl  sl   ++,=>>> ((**
q +-- 	= =R 2&02 2 2 3 3 3G G G G G G G	# ' 'BM>%'W%5%5b%9%9; ; ;< < < ,,R000NN2&&&&11)<<<%%g.....r&   c                     t          j        d          | _        t          j        | _        |                                 | _        t          j	        
                    | j        d          | _        d| _        || _        d S )Nzchange-intervalz
.processedr  )r[   r\   r)  r  r6  rf  r  ro  rE  r   rF  r  r  rk  r0   rv  rk  s      r$   rY  zGPrimaryChangelogMixin.register  sf    #i(9::#1#6 --//(*T\5A)C )C%$	r&   )r)   rx   ) rT   rU   rV   r   r   r!  r'  r&  r$  r%  r*  r)  r#  r  r,  r   CHANGELOG_CONN_RETRIESr  r  r  r  r  r  r  rI  rj  r.  rn  rj  r  rt  rY  rW   r&   r$   r  r    sa       88 IGLHHJIIJNN 
 
 
&? ? ?
' ' 'R  8 8 8a* a* a*FO O O<{. {. {.z	Y8 Y8 Y8 Y8v1 1 1
@ @ @ @ 7 7 7     ./ / /4    r&   r  c                       e Zd Zd Zd ZdS )GPrimaryChangeloghistoryMixinc                     || _         || _        t          j        | _        d| _        |                                 | _        t          j	        
                    | j        d          | _        d| _        || _        d S )Nr   z.history/.processedr  )changelog_register_timehistory_crawl_start_timer  history_donerf  history_turnsr  ro  rE  r   rF  r  r  rk  r  s      r$   rY  z&GPrimaryChangeloghistoryMixin.register  sk    '4$(5%#1#> --//(*T\5J)L )L%'	r&   c           
        
 | xj         dz  c_         | j                            d           |                                 
t	          t          j                              }t          j        d          r#t          j	        t          d
                     t          j	        t          d| j         
||                                                      
r
t          k    rt                      t          j                            t"          j        j        d          }t)          j        |
d	         |t          j        d
                    \  }}t)          j                    d	k    r| xj        dz  c_        t)          j                    }|r
rt          j	        t          d
                     
fd|D             }|D ]l}t          j        t          dt          j                            |                               |                     |           |                    |           m|                     |           t)          j                    d	k    t	          t          j                              | j        z
  }t          j	        t          d||                                 |                                                      || j        k     r| j         dk     rfd}	|t@          k     r
t@          |z
  }	t          j!        |	           t	          t          j                              | _        | "                                 d S tG          tI          |                    d S )Nr)   zHistory CrawlrN   z#ignore-deletes config option is setr  zstarting history crawl)r  r   etimer  z.glusterfs/changelogsr   	sync-jobsr  c                 x    g | ]6}t          |                    d           d                   d         k     4|7S r  r  r  s     r$   rc  z7GPrimaryChangeloghistoryMixin.crawl.<locals>.<listcomp>F  sK     !K !K !Kq$'R(8$9$9JqM$I$I "#$I$I$Ir&   r  rK  zfinished history crawl)endtimer   r  r  )%r  rk  r  r  r    r   r[   r\   r-   r.   r   r  r   r   rE  r   rF  r   rB  r  r  r  history_scanr  history_getchangesr]   r  rf  rr  r  r  r  CHANGELOG_ROLLOVER_TIMEr/   rt  r   rA  )r0   end_timechangelog_pathr  
actual_endrg  r  r  history_turn_time
sleep_timer=  s             @r$   rt  z#GPrimaryChangeloghistoryMixin.crawl  s}   a++O<<<((**
ty{{## 9%&& 	,LA)+ + + , , , 	R0"0(&$($8$8$:$:	< < < 	= 	= 	=  	%Z722"$$$
 ej&;&=? ?(:qMIk""	$ $Z )++a//KK1KK$799G 
+ 	+L$6*4"6 "6 "6 7 7 7!K !K !K !KG !K !K !KI' + +b)L3573C3CB3G3G'I 'I 'I J J J00444r****))'222! )++a//$  	,,t/LLR0 *"1133$($8$8$:$:< < < 	= 	= 	= 444!A%%
$'>>>!8;L!LJ
:&&&03DIKK0@0@-

 .c*oo>>> 54r&   N)rT   rU   rV   rY  rt  rW   r&   r$   r  r    s7        	 	 	M? M? M? M? M?r&   r  c                   n    e Zd ZdZdZddZd Zg fdZd Zd Z	d	 Z
d
 Zd ZddZg dfdZd ZddZdS )GPrimaryXsyncMixina>  
    This crawl needs to be xtime based (as of now
    it's not. this is because we generate CHANGELOG
    file during each crawl which is then processed
    by process_change()).
    For now it's used as a one-shot initial sync
    mechanism and only syncs directories, regular
    files, hardlinks and symlinks.
    i    Nc                    || _         d| _        g | _        g | _        d| _        |                                 | _        t          j        t          d| j                             t          j                            | j        d          | _        | j        | _        d| _        	 t          j        | j                   n_# t           $ rR t#          j                    d         }|j        t(          k    r%t          j                            | j                  rn Y nw xY wt          j        | j                  D ]N}|                    d          r7t          j        t          j                            | j        |                     Od S )Nr   r^  zWorking dirr8  rK   r)   zXSYNC-CHANGELOG)rk  countercomliststimesr)  r  ro  r-   r.   r   rE  r   rF  r  r  rK  rJ  rY   r>  r@  r   isdirrq  rb  rr  )r0   rv  rk  rL  r   s        r$   rY  zGPrimaryXsyncMixin.registerv  sb    --//R!\+ + + 	, 	, 	,w||DL'::(,%		K%%%% 	 	 	"Bx6!!bgmmDL&A&A! 	 DL)) 	9 	9A||-.. 9	"',,t|Q77888	9 	9s   #B= =ADDc                      fd}t          |          }|                                 t          j        t	          d                                                       j                            d           	 	  j        	                    d          }|d         dk    r7t          j        t	          d	                                                      dS |d         d
k    rct          j        t	          d|d                               
                    |d         gd                                |d         g           n|d         dk    rXt          j        t	          d|d                                                   |d         d         |d         d                    n#t          j        t	          d|                     n$# t          $ r t!          j        d           Y nw xY w{)z
        event dispatcher thread

        this thread dispatches either changelog or synchronizes stime.
        additionally terminates itself on receiving a 'finale' event
        c                  0                                       d S rx   )Xcrawlr   s   r$   Xsyncerz)GPrimaryXsyncMixin.crawl.<locals>.Xsyncer  s    KKMMMMMr&   r1  zstarting hybrid crawlr  zHybrid CrawlTr   finalezfinished hybrid crawlrK   zprocessing xsync changelogr)   r8  r   zsetting secondary time)r   zunknown tuple in comlist)r  N)r   r&  r-   r.   r   r  rk  r  r  r  rj  r  r]   rn  rh  
IndexErrorr   r/   )r0   r  r!   items   `   r$   rt  zGPrimaryXsyncMixin.crawl  s-   	 	 	 	 	'"""				R/"11335 5 5 	6 	6 	6++N;;;	|''**7h&&L$;*.*=*=*?*?"A "A "A B B BE!W''L$@)-a"2 "2 "2 3 3 3LL$q'A...55tAwi@@@@!W''M"%=*.q'#3 #3 #3 4 4 4NN471:tAwqz::::L$>*."0 "0 "0 1 1 1   
1'	s   <AG C6G G10G1c                     t          | dd           s|                                  | j                            |dd                    |          d           d S )Nfhr  
)r^   rG  r  writerF  )r0   prefixr  s      r$   write_entry_changez%GPrimaryXsyncMixin.write_entry_change  sT    tT4(( 	IIKKK666388D>>>>:;;;;;r&   c           
      
   	 t           j                            | j        dt	          t          t          j                                        z             | _        t          | j        d          | _	        d S # t          $ r  w xY w)NzXSYNC-CHANGELOG.r  )rE  r   rF  ro  rA  r    r   xsync_changerG  r  r?  r   s    r$   rG  zGPrimaryXsyncMixin.open  sz    	 "03s49;;7G7G3H3HH!J !JD4,c22DGGG 	 	 		s   A2A6 6Bc                     t          | dd           rf| j                                         t          j        | j                                                   | j                                         d | _        d S d S )Nr  )r^   r  flushrE  fsyncfilenor  r   s    r$   r  zGPrimaryXsyncMixin.close  se    4t$$ 	GMMOOOHTW^^%%&&&GMMOOODGGG		 	r&   c                     | j         S rx   )r  r   s    r$   fnamezGPrimaryXsyncMixin.fname  s      r&   c                 >    | j                             ||f           d S rx   )r  r  )r0   r   r  s      r$   putzGPrimaryXsyncMixin.put  s"    T4L)))))r&   c                     |                                   | j        dk    r(|                     d|                                            d| _        |st	          j        d           dS dS )z"schedule a processing of changelogr   rK   r)   N)r  r  r  r  r   r/   )r0   lasts     r$   
sync_xsynczGPrimaryXsyncMixin.sync_xsync  sb    

<!HHWdjjll+++ 	JqMMMMM	 	r&   Fc                 j    |r|                      d|           |r|                      dd           dS dS )z schedule a stime synchronizationr   r  N)r  )r0   r   r  s      r$   
sync_stimezGPrimaryXsyncMixin.sync_stime  sJ     	%HHWe$$$ 	%HHXt$$$$$	% 	%r&   c                     |                      |           |rK|d d         D ]}|                     |d           |r(|d         r"|                     |d         |           d S d S d S d S )Nr   F)r  r  )r0   r   r  rF   s       r$   	sync_donezGPrimaryXsyncMixin.sync_done  s     	1CRCj + +E**** 1r 1b	400000	1 	1
1 1 1 1r&   c                 R    d}|dz  r| j         j                            |          }|S )z%check for DHTs linkto sticky bit fileFr  )r   r   linkto_check)r0   r   mostickys       r$   	is_stickyzGPrimaryXsyncMixin.is_sticky  s0    ; 	<\(55d;;Fr&   r|   c                 T   |dk    r| xj         dz  c_         |se|                     d| j                  }t          |t                    r5|t
          k    r#t          j        t          d|                     | j	        }|                     |          }t          |t                    rt          j        d           |                     || j                  }t          |t                    r6|t
          k    r$t          j        t          d||                     | j	        }t          ||          }d}||k    r| j	        }|                     |||          s!|dk    r|                     ||fgd	           d
S |                     |||           t          j        d|z              | j        j                            |          }| j        j                            |          }t          |t                    r#t          j        t          d|                     |D ]}|}	t&          j                            ||          }|                     |          }
t          |
t                    r5t          j        t          d|t,          j        |
                              |                     ||
|          s| j        j                            |          }t          |t                    r$t          j        t          d|                     |                     ||j                  r%t          j        t          d|                     4| j        j                            |          }t          |t                    r%t          j        t          d|                     |j        }| xj        t9          j        |          s(t9          j        |          st9          j        |          rdndz  c_        | j        | j         k    r"|                     | j!        d           g | _!        t9          j        |          r7| "                    d|dtG          |          tG          d          tG          d          tI          t&          j                            ||	                    g           | "                    d|dtG          |j%                  tG          |j&                  tG          |j                  tG          |j'                  tG          |j(                  g           | )                    ||           |
}| j*        rtW          | j*        |
          }| j!        ,                    ||f           `t9          j        |          rF| "                    d|dtI          t&          j                            ||	                    g           t9          j        |          r|j-        }|dz  }|dk    ro| "                    d|dtG          |          tG          d          tG          d          tI          t&          j                            ||	                    g           nD| "                    d|dtI          t&          j                            ||	                    g           | "                    d|g           |dk    rW|}| j*        rtW          | j*        |          }| j!        ,                    ||f           |                     | j!        d	           d
S d
S )z
        generate a CHANGELOG file consumable by process_change.

        secondary's xtime (stime) is _cached_ for comparisons across
        the filesystem tree, but set after directory synchronization.
        r|   r)   z2secondary cluster not returning the xtime for rootr]  z!primary cluster's xtime not foundz1secondary cluster not returning the xtime for dir)r   rU  r   TNz	entering zskipping directoryr8  zirregular xtimezgot purged in the interimzignoring sticky bit filezskipping entryr   FEr  Mr  r  r  r  D).r  r   r   r   r    r   r-   rh  r   r   maxr   r  r   r]   r   r   r  r  rE  r   rF  r@  	errorcoder   r  r@   r  r7   S_ISDIRr(  S_ISREGXSYNC_MAX_ENTRIESr  r  rA  r   r>   r?   rA   rB   r  re  r   r  st_nlink)r0   r   xtr_rootr   r   r   demr  r   rN  r   rF   r  r  stime_to_updatenlinks                   r$   r  zGPrimaryXsyncMixin.Xcrawl  s;    3;;KK1KK 	/zz#t~66H(C(( /v%%L %5*2"4 "4 "4 5 5 5  .jjc3 	>L<===jjt~..c3 	&f}}R !0%)&)+ + + , , , %C#x  	y  %C~~dC-- 	s{{s}d333F!!$S111kD()))l!))$//,%**400gs## 	(L0!%' ' ' ( ( ( J	5 J	5AET1%%A**Q--C#s## R 1%&&+oc&:< < < = = = >>!S#.. $**1--B"c"" R ;%&( ( ( ) ) )~~a,, b!;&') ) ) * * *<&++A..D$$$ R 0%&( ( ( ) ) )BLL4<#3#3 =#'<#3#3=#'<#3#3=AA;<=LL |t555t{E222 |B *5'')-wB),QQ9M-/W\\'5-I-I:K :K)LM M M ''dIs29~~.1")nnc"*oo.1"+.>.>.1"+.>.>.@ A A A Ax((("% 1 O&)$*H#&N&NO""A#78888b!! 5''$	+?We44,6 ,6 78 8 8 8 b!! 5
 A::++C-17CGG-0VVSVV-A135<e2E 2E.F .F-GH H H H ++dF,@GLL%88-: -: ;< < < ''dV4443;;!O- K"%d&Dc"J"JKo6777NN4;----- ;r&   )NNr  )r|   N)rT   rU   rV   r   r  rY  rt  r  rG  r  r  r  r  r  r  r  r  rW   r&   r$   r  r  h  s          9 9 9 94" " "H /1 < < < <    ! ! !* * *  % % % % !u 1 1 1 1  |. |. |. |. |. |.r&   r  c                       e Zd ZdS )BoxClosedErrNrS   rW   r&   r$   r  r  o  s        Dr&   r  c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )PostBoxzDsynchronized collection for storing things thought of as "requests" c                 l    t          j        | g|R   t                      | _        d| _        d| _        d S )NTF)rd  r+  r
   leverrG  r6  )r0   r   s     r$   r+  zPostBox.__init__w  s9    dQ [[
				r&   c                     | j                                          | j        s| j                                          | j                                          | j        S )z wait on requests to be processed)r  acquirer6  r   releaseresultr   s    r$   r   zPostBox.wait  sN    
y 	JOO
{r&   c                     || _         | j                                         d| _        | j                                         | j                                         dS )z"wake up requestors with the resultTN)r  r  r  r6  	notifyAllr  r  s     r$   wakeupzPostBox.wakeup  sR    
	

r&   c                     | j                                          | j        st          t                              | |           | j                                          dS )zpost a requestN)r  r  rG  r  rd  r  r  )r0   r   s     r$   r  zPostBox.append  sT    
y 	D!
r&   c                 x    | j                                          d| _        | j                                          dS )z(prohibit the posting of further requestsFN)r  r  rG  r  r   s    r$   r  zPostBox.close  s7    
	
r&   N)	rT   rU   rV   r   r+  r   r  r  r  rW   r&   r$   r  r  s  se        NN            r&   r  c                   4    e Zd ZdZg fdZd Zd Zd Zd ZdS )r   a  a staged queue to relay rsync requests to rsync workers

    By "staged queue" its meant that when a consumer comes to the
    queue, it takes _all_ entries, leaving the queue empty.
    (I don't know if there is an official term for this pattern.)

    The queue uses a PostBox to accumulate incoming items.
    When a consumer (rsync worker) comes, a new PostBox is
    set up and the old one is passed on to the consumer.

    Instead of the simplistic scheme of having one big lock
    which synchronizes both the addition of new items and
    PostBox exchanges, use a separate lock to arbitrate consumers,
    and rely on PostBox's synchronization mechanisms take
    care about additions.

    There is a corner case racy situation, producers vs. consumers,
    which is not handled by this scheme: namely, when the PostBox
    exchange occurs in between being passed to the producer for posting
    and the post placement. But that's what Postbox.close is for:
    such a posting will find the PostBox closed, in which case
    the producer can re-try posting against the actual PostBox of
    the queue.

    To aid accumlation of items in the PostBoxen before grabbed
    by an rsync worker, the worker goes to sleep a bit after
    each completed syncjob.
    c                 .   d| _         || _        t                      | _        t	                      | _        || _        || _        t          t          j
        d                    D ]0}t          | j        |dz   f          }|                                 1dS )zspawn worker threadsFr  r)   )r2  rB  N)log_errr   r   lockr  r   sync_engine	errnos_okranger[   r\   r   syncjobr&  )r0   r   r  resilient_errnosir!   s         r$   r+  zSyncer.__init__  s    "FF	))&)uy--.. 	 	Adl!a%;;;AGGIIII	 	r&   c                    	 d}	 | j                                          | j        r| j        t                      c}| _        | j                                          |rnt          j        d           l|                                 t          j                    }|                     || j	                  }t          j        t          d|t          |          |j        dt          j                    |z
  z                       |j        dk    rd}n,|j        | j        v r
d	|j        f}n|                                 |                    |           Q)
zthe life of a workerTNr.  zSync Time TakenrP  )r  	num_filesreturn_coderY  r   )Tr   F)r  r  r   r  r  r   r/   r  r  r  r-   r.   r   r  
returncoder  errfailr  )r0   job_idr   r&  por  s         r$   r  zSyncer.syncjob  sJ   	B 	!!###7 5"&'799KB	!!### 
3  HHJJJIKKE!!"dl33BL- &&)"gg(*%+ty{{U/B%C	E E E F F F }!!$.00bm,

IIcNNN3	r&   c                 d    	 | j         }	 |                    |           |S # t          $ r Y nw xY w0rx   )r   r  r  )r0   r   r   s      r$   r   z
Syncer.add  sL    	B		!	   	s   ! 
..c                     d| _         d S r   r  r   s    r$   rc  zSyncer.enable_errorlog  s    r&   c                     d| _         d S r  r  r   s    r$   ra  zSyncer.disable_errorlog  s    r&   N)	rT   rU   rV   r   r+  r  r   rc  ra  rW   r&   r$   r   r     su         : AC 
 
 
 
  :        r&   r   rx   )ArE  rY   r   r7   r-   r:  r  r@  r  r   r   r   r   r   r   r	   	threadingr
   r   r   gsyncdconfigr[   r  r   
syncdutilsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r%   r3   rH   rn   objectrp   r   r   ra   r`   rc   rb   rd   re   r  r  r  r  r  	Exceptionr  rd  r  r   rW   r&   r$   <module>r     s   
			 



        H H H H H H H H H H H H H H H H H H % % % % % % % %                    * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *     	 	 	  .' ' ' '\R? R? R? R? R?& R? R? R?l    ;   1 1 1 1 1; 1 1 1*' ' ' ' '& ' ' '       1 1 1 1 1v 1 1 1    V   ! ! ! ! !6 ! ! !H         &      FG- G- G- G- G-V G- G- G-T
( ( ( ( (V ( ( ([ [ [ [ [^ [ [ [|Y? Y? Y? Y? Y?$: Y? Y? Y?xD. D. D. D. D./ D. D. D.N	 	 	 	 	9 	 	 	) ) ) ) )d ) ) )XU U U U UV U U U U Ur&   