http://git-wip-us.apache.org/repos/asf/zookeeper/blob/01b6b5e4/doc/r3.1.2/javaExample.pdf ---------------------------------------------------------------------- diff --git a/doc/r3.1.2/javaExample.pdf b/doc/r3.1.2/javaExample.pdf new file mode 100644 index 0000000..21b9dd8 --- /dev/null +++ b/doc/r3.1.2/javaExample.pdf @@ -0,0 +1,540 @@ +%PDF-1.3 +%���� +4 0 obj +<< /Type /Info +/Producer (FOP 0.20.5) >> +endobj +5 0 obj +<< /Length 630 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gaua<bAu;j'Sc@2$8'LHMQXZEF!6IKSOnHH3n'r6`=^*G?kHQ&o(KJ%N9!_<=FjVjDkD+3n(0kg\qi!--m/pB:s:.p^WHh5.`)1.*t31:04>.7,Ql!mr/#nRohET:e.Zded]@d8hhsGPeau51ek8"(ImJ)ClK<Tk;,*WYR*]]pkKdFU$8D?,S8j?=m_]G&D!PF>DBHi4mXLS'0sWP$Xr[fbNU("@CdEXrA\9[P_f50R\B>tJ?hsA,FjE,4?c&$805m/!pGN]C"?afV/WQ"t;L<t^lnuZJ(Io2!SIohE'nen;:3`#,Rp+!8n+d8Ea2E8W""2,#Z])`U'9e'eUP&lS.P4\MO)JT6=3Wb`m8amL,e542?"9Z4aBibN570%Z6(:Y7A@XEeLRg'OF*)s*+QpeQ]<d$!O:P%WYQ\J1aF[W)`"1DJB6M,^e(jIL&G*g;'`!B?*TdmMDj3EO9OP_2D0-ZZmr`F2VE17O%R1o@5MPa&Ms/]N0fM0J8n$HPMqom-83"s/bbLfX[2ja-B,#q8Z0gtW+6FR*#mYa"$D`:ZlVCef$f_KK'B.RoJl(U[[Ujc)[2*>PB52>@Kb!P+WD2t.9W]3MUb.p>\@('Vb?!meq#W_U5D*.4'E~> +endstream +endobj +6 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 5 0 R +/Annots 7 0 R +>> +endobj +7 0 obj +[ +8 0 R +10 0 R +12 0 R +14 0 R +16 0 R +18 0 R +] +endobj +8 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 102.0 529.541 222.332 517.541 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 9 0 R +/H /I +>> +endobj +10 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 108.0 511.341 190.16 499.341 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 11 0 R +/H /I +>> +endobj +12 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 108.0 493.141 201.824 481.141 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 13 0 R +/H /I +>> +endobj +14 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 102.0 474.941 203.984 462.941 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 15 0 R +/H /I +>> +endobj +16 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 102.0 456.741 222.656 444.741 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 17 0 R +/H /I +>> +endobj +18 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 102.0 438.541 234.668 426.541 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 19 0 R +/H /I +>> +endobj +20 0 obj +<< /Length 2075 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm<>Ar7S'Roe[&GhUk#pW@BDD/]!76:q!RLB;LoRW;F>H9<TPT2X:TAS&@4Hr:d_1oa]8aGl9o:>>TW7Q6OX*9[nIH!;3%h$ul/Z@^H+*A24p-RX]e-hhZNUut)P&ofL"mu<B/,f-!hc,<VlT]WXY4_?[Oc-M*GJ6%\*uEOQMf58^eae1:C[c]aLS<aP:LADk-'9--8iY#5Di<5LI=XagDkC__UVr4>e*a#4R$Weqfeu8G4isg42!EV)NLouFb$Th#K[O'Hq'/C)hgDr\WuVht`1n_kV)QslTqB^MO$Z"o<B\09B4@3NfT?1sdsF##D"N1If14XfLDUkC6p5>DN-Hd-AE/<\-a.g+1/9;T]hkH+A=;!>i%Her%9H81Y4PJijj<B;$&C[Q>rT'h$lS+qV;t8=c%oZGEc6\$5o:.O`?W8Ta$5E!gK]RE5Z_1c)[$a]e/S3V"-8tjh>f;]VY^?#Ha))6`o(bM``HC>EpkHbBOi9[ae80qZ!]5(BHdV'ob-4sis0*m_nR*E8)Gg,W/F-D]g7i<h1YRQYi:hoR;Cqe#4t2/bD4R<[MJ-_D_&V^"b+<2@TEk/`-^ua?9]Xfhe%%:>)\]BY[kR,rC&V_Fp-$uR*Cc@ik%aj%::#b-#ZU[iG,df-prGO)*ae4HPU0rM0P%9%q8FW%!48]E6P4`VE&Q_Aokd"Sj^Am5[@[#C"6&Y(^XkScV'j1677hR]+`qSEdD/>H<M5O3"B^RbGMIL[ds?G_*^SQ4:`JOkrNc54BZ"^WY/R-N6p1h.%]IkV+Z%f,lnCn0#:AN\EOrlhKUR9HrX>hL)5+\fZuY/FbtT?^[ORVd*V55GU(C%E&3h,08_-1`Cq]`^kt89mDG:rGW]+Yq%_LER%Wr-ZpTagR5Yt1UTEk63M'P8*"ISH'`Z(RmeK,?d5`=d.FQf($O^mt_?qf)[m>V^;BZ_-;M2j\Tu?-R3=5e"B,el3.YVPlWL]J[ZXNMh&riJiGD+`^5- rAk,pWWi(ihO-O%k;R"8P/Al?a[_'9h<?'RoFZF2ZfS,3D5/N345?o10tFbL6K+PS!V=;q)F'UEbCalOh4mOPlaqi7S7sR5Ak-ih81gVP#SK&3mj.aAng@C83hGM;:thF`*-D``0]WF!OuN9nOPDeegB>SkqO,9khiK:QA'PSecOE.-?V!M6Es#(7<WqA2\+0C:<7]<)"mOEBUB3VW0(FUQ6JA;jKh?<$]AoReQQk)$FDMQc/bWPH4HaHj@/G7n9bl\?fgg='?"P`rI*S1mKOHmT.nS1C,q*1&8&?)kGQPanGF:Q4.[OE1]#U8;I$9VQWg^VTX@c/517nB_!]<V<p#RPL,f0V&`_^Q[]%fk#9P*U/LfAj0o"UWoFXp;&gH0e"nUpIoo7-nfV;"G:>u`iX[H1g1g"RE3dN36`u4-ieT'&#LM4m+a$t\?i_KDA4g#T:+#7*j\+CBpej<8@V*c$]`RBGHY3AUR3[7IPu!e1C`M>d`n%-V2@@JNE=b,lkI,$R+KJPghGScV[WF`"c>&muBsf9X[2pBN9FgQCrF'M*@,JHfJg_[b\AbWZoqD4j@^nfm5B6j&(/YT;L&Wh96p3Z`+'Str$:8Y>FTt>jM9Q/ui*nG";cd?TM#5Rr:p-rDcCs!:4=)q4eL0%S5fl1UF9<'tdoUOAM?rPX"r5[3#mmRWg[^0PO##&RWgsgkcYa[*[J'2.]am9&YNEb!T;c;']gP`-'Z=LdbTHK;pY>kG&ETobojR`1rRF,YHIsP]KtFuZ^APZmWZ/2d6;:h1YmtsB;aO!=#unF?.DW2)^YcbOJ,SpTZ>3T%2c;MZB>!krEQZ+WmS1o6Q_YZK*Z^C#p[piCEsmS+6MS:-\3L"-?V$Ot_rV8%W^(#H$lpH6Te&2PGaBt=T[8?c^DYmH>^sf-Hq;+S:L4ChNIl_nd,0G@\ITp+l-tXle9eI`^^q2MK,$=m,n,21\M5i]fYA[q5\WfB!60i1M.)ubFM'b;:F]_ R],hR'*FDo6onp:tXB.dDlPH`ST&TFFHt[]@A[:3=-b!Zaqp?P;Nd9ZZdp8`VBOBAJ%$ca#!Ek3!f)~> +endstream +endobj +21 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 20 0 R +/Annots 22 0 R +>> +endobj +22 0 obj +[ +23 0 R +] +endobj +23 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 364.944 223.626 443.268 211.626 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 13 0 R +/H /I +>> +endobj +24 0 obj +<< /Length 2065 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0D>Ar7S'RnB3d/($N86D"KDB&;rDXEO'_m7k/JAlqu-/)BMMjc8<SRMPH8,"6^Ph0A3;+F,%cfI5ilK.<je`u/?$Yo%ds,Ru18PI$A*;JW=rHr*Z*jH_1(WPUs[u6U/IZlbH2/U5V0""qbs)m:[@H9L;^\ILm6Qs:?2R+-_nGK\4d!BE6]eCDE9__*elEL,dm/^R(FYN5:hjoX&*/OA(Qg7;Q^A@QGG]0\?N$gl935Ic;g$OX2eN;^@pH+sX*iHV#j2Nfh*A7)l..:\QNc2WN++nrBgmdaiEg]_%V<7WAb"1`!;B8Eq'BZ;tDW=-\_-qmFdr@6n_Ps!)pa!`RpI_$V30$CRm_4uS5`]3]+4kDM7n]V/mJFi1-XI8Q4?/$M409IhY7ZuaWIBX[B1ndJ]$RZET/`D%bPX2grG0-\M*9VdM:[#p@f7eg<L#=H&)hOloC_cT8'P"=?]hunf9]ZH*M<,p&B=[r0IT;AobqoY797D`7I8W-B2*G@6G"'G,Qh\Fn&cdN\B9G#/1:Z^b]LBaH+ej"`:=^g0W5hZ@9L!0i_Tf[/haEk0rP=`QSI*,7%aa0MckU./bce<(*idA&=LTE?Q^q<IoUaWM,RT"@F=Pj/ba6N(3@,q<-sN"PaFYo<SO2-;_Mg/Ga,EbrZ=@r0+*2"g#A[K$d1AH]%0L<_Ml*k=C$_NL\$+I#g2'ARDqt^4FUO+`jA@$o1CiZarO)j\eN8V;r[Z=8:HY?1f@VVT*kX:;;tg[\it*<^E$"e.1IFIe+cc_\a.PX"\rCQRjfS`Zh:h`^qqY:M@LmE6+"Rb2'&3VN*'?c++q-t/&6!)>!=09=!ejG/<:C`>&*(OCquuh^-^\RV9&6X.n0*``Ng3]$MfUB@+c;MB6Eb?CYPM`SSS)XbrB6:/hoNGmX?\'+A"g#Ap4h)PaE(.d20j,Mt,U.\J^5@/X1:'0$5:id9;W$GYr&kJYE_nC_HC.#ap[nXu^^T8QI'u"U1&,Vr Mh-rrg7U(1n/^LLm2M-kD)ic:ON516T*PYt,4\_EQQ7OGb<H.5h>S-6>R4&_k=95k6i]%:V[.7)j+.Lp0;$^*mTD.A23-EdB.N!3'60TseS<=G3V\,9N?m\.hn@^L7NQ%,+bC+q6E.`FU3U/NR$JK`5;U-jBu)^?P][X2&,W96^u%emnsT+o&OjWt;A]"A=gjo)CTfoqn?kQupe\7>7!J-`jdtKL7&&@Q.bGcLO%*cIp>QM/<Z;]4#;*'KmPD6l`(LZB=fK5[bZiF;*bZ0o9?fcW_5JMf62%s2COm3>UO5>WUi`__lY`WM8/c/ogKK*[Y_mS'@tnRgC:p].VU\bji,6e%2F%a3[l$jU=(3jBA::,$if83AG0VjUji)25Rm8F5D1U<<l%'hgMf&;G%pAH=Fs/XV>OI`1h'oD",-LM)@$_V1nY<n:3:h`SE+Kgg3]q5G$un;g^$Y-.^gJGGm!N@IufGD;[USXV[13/H[\*=/:^'bN,IKb;;4f$HYDdE\F3R_%6MY5B%9JCQhQecZ0?f=0sc`eqMn1jHq#XeY26T$Da?%RJlj*7NN'@<>rjW1"s=A1SIB<:$5iMV[gPMS)c9`U-V:M$')ZD`I]@on1/'2;\q'O^$.u9bbaKk,>;l4MW@gE:YkP=(cL+D[QgrGqMOn&L]S'MeaeAIKrn*PL#o`N27g,!Hj]/eL]l8)'#j?@k/SU*-BLp`bdgq&Gtcb.EkXWph2r!'BJSEKReVffo.a:T3Qh/"gH^n=(C[9aBI7jH8LeE?PPCNtS&on121RP45B6@L:oPV/[eDSA+au')5q!n,/*p(OH58G2r"4^+1D5c@1N6srlq>28)cu"O"@(p,4r9Y"/eX#nl%+7\<od()RGebWUn>M/67DF?7F-+5mlG9$:rA2mI@?fXaOmol$oM>Mg>+m?I"[,dB%p*;<2kMrM:[6L\-mIh,0W@X%%lF6a'<NBO79SPI)e.<K[]o&_=o]Hjmd6G@-lG\jNBE ekt!PXoL>i2-8"a3$URP%PM6^*+2)qOX#(/uk7Vm<]cspR,J-2tN0F'iLr]kW5:L%8A,~> +endstream +endobj +25 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 24 0 R +>> +endobj +26 0 obj +<< /Length 2038 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0DD/\/e&H;*)U%QU7TOgO)CI<Z\>LKobJZ^k,?qij>&oDEH79-)KGf0OX:@C]@Z<NthO@5=Xms!(uq0]`_?7nDpW3M*7(Q6WcVVueAr,pfkq2&lc@Kf6;NP!.OMs&:&eW"?@$U-.D$aV!4iJ/='WTt/BFH#>4pimtCL)3&k:TT<""lJiDQK)/+nThE?h#52:=d&="90#2BZp^]iaYD7=JlYS@_T,*h=0,"+cY15%N2K4#Cjb)XP%^UlI$GD%m@MFGj!S@4C>p&M-;O#ree-!5gP[ulZb`qIK2O%A6#M29A2LPIM<FZ2CRE&<[Vs^rI<]6=`S-^Zq!Nj`7GE!Bf14R*M;p##%Lm0]_<qc,e>^Q'5TI6j.'N'e,Q]P\ZdEe@P'C6nKnstVhHkT.]u/mrgALJ^j,Mcerl%)8#?!X^jd?-h_cC*V,m2VVr21u@USJh5`4&sFJ%H^\J!Ck]JOR@5mI"PV/_tmUBKr>XGb.Ot/!K=Za:]qZhigt/XA7t^M3d6gA5j%1#/OTMLd.J("[6-FOM3Fn_`<nePik%Wcq:BO\1<J%Km:jf51lWVbmTB_>O_"HbF+f!WY1Sff]FWL4?]?]<@Pm&O_WYao.jH]4@Y#QMRfH1=Y0cucZ;WY-52LbD9%I5p&Uo@RM\i:C(?=<oE>=%=MCoC=q.:\*K0@YgCoO9OiSe@+Mj.0-5`TS>J\MC3,=HW\>$[af+1!D1_u9$k+k`OUC\Up'B1&8>B8'?q#0ss1!Tr]ZNlSeN_dMJ+P2bW``Z9%ES.)TQ/2[cW7D"aTUO]1kgedkG)l_Jk&e[g3APEahh1,[,7nWh8g^TZ>W9(I4\JJ<M&<?Q%+3R1EQr!ff..,_f7E8LQ%"W%q!5Cne>CS@%.J[hO@XU)*rPeI%a?"Q,j%+"3?b)/S;$HKE#/)/UqtbK]HqaJpm_\1#U8'/1n!qG1fN-M<71*;T\]H7b5Melc*lZDM"K1R,T]+CQ=ilC3%M81;%nC!Ik r@aHSW<Y(m6#k`A^CXR:PX<\k]IUa0BJ2c*%(qBqr+bO?GL:%!<J]_4P0&99cTAbdCM(dRP`:0s5,U;r(rl0T1;jqdW<:GY]!P2:jWUd$so@_m@0DiUL;b_-l8K.SVRToL1^_O4q\Yd*\Ah:jotipDcsJB2"5/Pf1'ZmPeCA?>ueEgqk:.Q(u'G8BOXQ[GCuX]jC).lqmn+73pHpi1DM:jL:>`r#Li#RUR0^:NK@0Ne?3(qaBP&\F@L^ljcfAq^1=Vm=/ch[G*aYG)4U/+bG=/PB0eAIIB.HTMpSrUN1&=k![?g(E.%]dcaVtg;NjA<5pa^.M);p3gX--=Ap:@F"ZM/b35rQq-<XE3&rB:9:hja?-Qu?/Wb4fa@`TO2E/jTEAE/l/eMj#Cfpu8J1'qJ.:ID^X8pR^j(grq+#)^mo$Tg'j'nLZ2omWk[R9nn.qlmo7'od\ban*ue$rSfD7ikPm'\JK;oId-e]f""4a0;^e)#"UW)=_I+WB6JjFG@3li$.B$N#hC3s/MsneQ9e)AH*p?-e5279BfEE<9.EB$U@\f&?fj0rNfq/ip$uCNb+2F\6t8#,dP*!0Jb+DgB.&//p/*%i?u;qr_io=u$a$QSSjTrOb8,W@-kiT@DP>>b/N(BkB:BHG]n]K$FS0'2D>qU.Mjee+6Wu2"67#)O5BN8Q'*KG@/8AX!:5bDn+/>It6a$M5V]A!Kgo]h-N3i%F)<&KZWW1,L)pVjlgt8k[s<R4Tb+*$ZW+dH%lIUS_6G+(5EPa#PCN#IGCVNQEY"Y]Fi*h$+<X2E#=@cTt7pD*<#]=*d<MlLS=>9+l^%3c7iMdc`8#.J=9N]&l/>4k8BB:K_Al?52ekYpH?^0Gf=i"H#`f0?*9hu1=g;>:t)TY&8b:3d"q"N=S3t+VeW^ah@=?HF<D]s(2qlp/+OZj7UK%IVcl9[neqr_0ZA:>!C]f]"8jer588P/nUni4Q:o8`AX^HFl7P$L`Nu('Gl:sMjM"" :p<ASqZ?X#[lH%[FY?`uj9=0Gn;s_NA2>HT($+$#B~> +endstream +endobj +27 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 26 0 R +>> +endobj +28 0 obj +<< /Length 1590 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0Chf%7-&:X@\U%QM.g5ALZP.74sD3kCm2KW^C'\L&'7Aaq<ZKOl%&pr:2^6:rhPV"?+L*;ASUNjO;*^:]19L`*Id@VZC/F`[O,[>:/htQ[*nacVfiuSK`aea&;qK;GHb]gnt!gbu$"G?rcr!dV`EUnh4s7,E7o,J:-f>8]mVoa>I<e7gV7i^O;;O</Pf9r_2hoC4R3.EoOcclk6Q8?/b69[@2T0h$`ian:u/t=l7>IkfhCL4>aR_Cr8-XNcJ"V>kLE);X1+WK[LDV%8V%;OF(hTVR_#4gSA,h%YPdkrn`!7)d/].:6nKA((mj@Q5tCc[#fX4:gGA;eH(jn%$pi[i?s+;Y)=[pXfU/9J%<drDQ`.)7d_l?kN%E``hC5X<D,%hDO3Y>mdE_&"5G1[O-ma%IAs:RRMo^>3H_]6]Ft7OK[lQKi0D\aKSSE69*<>91\`8KPik+?llA3`pgcF+K1a)9`90SqCM>P2_c`OBa04r3FkB/I%]fB\hmt<RG+7nt?XjeYhFfNb$O@p?%9;2)I"\$[B`+NUY.9*VHG*0>STm3)rC+U(nT<+Q/,iXSA-3\'SGPJ?kLmF<+CIJ-A<`kkP?@H1j">S:JojpMZ;^([PMT,7lt/F'lDE:=^$n;Oc8nB9800SrTjaT6Wmk(u/:`<0tn>Z4M&oCSg]"R8m;:Mq=931#$#A'VE55I9ksFb(k?f2tS^RTg6a"=Doeq`a;th9Mk6TBVRVS=@g8@h(u'P(JeO'Mh`Wu#-J8LZb9"q\4Pgh,ut&3HPT7o3l^BQd6&ID^Q-`P5YN6</rQ(,b*'H.g!K"q;@Ha/&Rc+#T`C?Qk.CA4:3HY?4/NG!_<_I1s.m'4]FLH()k2u@A/^1f!l(>O!+Vj*5;Sl^AL%,'2#&lhVcDR^IS?N20_WiI08aD:E;`.N6p(fb]05-`Tj87==*:1*Vh9fk+:dBdZ35#[Y@XLK8^2UZrMJ)*;Jr;l,#sOH[ZL;qfh!`=CK9S?f> u@5/C`7>'kO_S7AEtjlu5YUbKTN3b7bkG-\,;FnZ%j9Q??U`Ch9,I4k[k*_p2p7[k'`hHMP7fcMt.dVB,t[<JDHEf@N!k0qogHNo.OR/Pr=H<A`V-/"8\EhE$2\R@6_5qmV_6D=)Qc-(19kn^j?/QkE(\R..1rIS,^%1YZ)J7\430MW"9RfIZ7ip8cL!DnkRL$R3H.!GhjLY2)"Y00Np/-3UTuZk;Q0f:LE#(hpkK[c-ieY'9'Mobc]jRFE(c]PQ)8UrDcBX^U:blpkmO^>%=$aEZ78(&PR@Dk9<$g;6iR@]0H42._2pE_BN5b'mDU*aXPPNdS4>U:!\6C;!38QDp.cJPD)*ZcV`>^oP<9?8K;5?@`S:^0a0sch)%S+C2?B>XD)bYC(8Lm\kbbjD8<N;ZNNR0PrO`&E#.^Vp>'YF<@mpXra>nf+p$uq,>rkD?'\r"B4,dOBpuRFs3D2#S4d>Qha:]O=b,#9&OrlLQD]][r:u1K>?%soIq6%jWE#bQR@]&`TKNho`^SD7\[%)2Ng)iC>o+<MJ`/ic1OG03bIGVD)8i!@-\#_>+.?9jh%a-=igMIcCb4++7sRr)Z~> +endstream +endobj +29 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 28 0 R +>> +endobj +30 0 obj +<< /Length 2353 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU5h/D%+&:`#5Tsl=ubD7A8eR8u&RhY7o[VGpY=ORLXVJXS8kXeaD[+PDmUI87_0?<;i,Vg\%nNMGH8&)Vq\\'rukCd"hpj7?#g;LE^c\)8QeXp3YbU,N[Ead3gr]GI;hRA?^IG;0f).gOWY<LaHXF+SR5Q(H1)VH8ZJVX#m?\K9G%rR[\FsWF`^XT7ih#NgG2g<j)dso]FDq<0[+E/pte-+To\O1bilaLf`ill`-<*Ps6;4=pD-23qH!@Q#M@1M`]qb,)hL"M9QLkhd&`U2pWf`>e,h]lR%8%]W-VJ)f.arH7kV60G&=c@7?ji"dg1V"('G$PB-p5%F`]1Bp,R1[#G2CBbf,A!)k>+0;-'OmS</s[^Mb,ES=HqmWa;C(l$klHu0S.RGX<tMc7MM!71)grXlPeF0;KZ.DG[nVQKACca$Gnb1Y_<6<+=HW<s]+":($>f:7^b/1-W0O>P=<m#Vl%B--b>nf?p(Ftol'`J?PD]\Mp,88B.,b&(HZ'pA[ice#KXJlJ\5b88'Yu!Ua_Cu#?P&u;%1A9`gkHo\HI]D-K]-bW"k4$4PoKSX0oJu5_#Q5TTEDP=B0/FUi=Ca2`t8-:3:Jc9Bei<*c:8GXNcUT_r6!oL(e#QZ6k2QC#IWk^80qScCe-lfWGaXqg48JH2R6aCakhapo[,SHB&J55R*ijL2=](+pdsIKE^MtO4e:`OYRXL0?ZUWb\EDC#Hm>t)'[GoY=VapbEa6?I'"'nU.iMTE%99O`_ctJV.L$.n\kZ=Z-ONJ,"fDB0I27V1Rc/?a[.GA(1+)ZRnJZ9IR)!B!T<djT:i!V/et%Pcpg2>'l<6XAF^mfA=eA,[VWtB#(o)cXR3gPmG9TreeZE?hi8-jOqEnkO_R6k-qUmjr-/#ue@,<bgNg\@=Ts=-Vl@jD@MT78Sk;&64>LL08Xh:=8($5V[>]ntPZ4Scf3b:F/6&h^IQb.nNN4KUCHTHYHp8?rgNNgIbH*PT/Hb@Z+(N 'o<\F5MXr[^Hd&,VCaK8%6]2X#78VNsB_Y-T?`Og%/L[>%GVe!FVRgdrYAiZ>s\4Rj*eQ9i;?kg[!`Z(@9m+tfq[T!gkJ0&EECAAFn)UYVY]6<:[+c#K0\g94?afu.T8pnI/7%63U7ICtP]CLatQ"I^,?5)>)ldmcRE&trR9=sF8`:r0DMOdZi''Q%;^VV"XX+buARDPSZ7g4B3Ko*#?+D3V(H0%1*>dAq:f:j,Id^)c[1f>_K_2T`mT4K(dJ`s>p(#^*Jdghp]+`^Abrl:(i*0sF&cHZiBc/fl2G36:o2\HDNrfb9r^8;pCW'o2^39KqqW6))bY4>lbOaQJYQ\`1f:\"=^`!<JS:V183/$a`&4,;nTYLd%;Q3YFIiTAGQe>F\&<D.KZ)GVKp67o"_9,0+C!\^Kg.s4;5skCDp#3A4gL$Q1jB@a\91@J`&p>L(\C"t?5Lf2CJKAC7Q+D-'UM+S..FBC4\^R6'"47V[o(J#n10?,u6(6QDe4"g"^jDq7,W8YB\t%WDk3<Tu3(1)1Nt)j363IiTm>+L7KF$/51^bm`D[./!5`%(]HFEu\3OKR*O(>R9n?o<M02FDYRi-V^8ao!O.c[3&CTMLj\C"!9QJj0^lUoUBk!FQ;FVMt]MdJBNV%Y&;.L'QFGuBM(b>8bfZKbU#0>'_,A!9uu\l@@KNc0G(X(iOFOF#IM,leTsPTl=rSb8/EIR4P(%(B&"4PXUa7h#3/\Jj-2TR`p"I.D*sTs<T_uED&aC?IGRN(N$.T/eSoo7!lb<)kH3g;KutK7.ce.a#:6qCTMJdO+hhmg:qf.D7&Iam^dPQRau#Ygg%A_c4$mTJ&_9+XmChG&`,.j@;'Bl(^O@-pT,)3O1[5S0BUp\omMc6Jb5YWsgXA[Ao`0barF91:.30NaolO30TfuPW'c@`+*3g,K2\JJR</EPJq_>Ua"f?iH.,Ptg&&M0Sr9B_rq%/IdWH(]E*AgBjR-t]$,TOQAB._>Q9I%7 _./Bmoc[=Tk*8<?>b7YU4&^,OKXZ)['O`j`cE=F]\nb-MeI);GJbY:r)n@)&jD[+EXT?FYn\O9j?AN9L?VUY3D>)>EiOR!Rh!FW2:'c#6<G]T'=Z-Z4rGb.e#'E;e@^<<2"bfd+$MkBVroCYd:P0`;m%LeH3Eu;k6@F1'#o0TAhp)6HW(.#ll5*W(rpX+E=\T(dHg>+"7<Sd<2P=aXh9b.YeDWb\pp;PBg*=J5<2*:;e'VD+bkj7IU2>5o^OhgLtMbb0q(C"T@PW:.&^2/*I[uYejpZYTe0XTlgG3.A"d&tUg6G9n]7PS4VbGEo]3P'8XbA:$uaTRaVhbhp^C@;5+7F`:9j7iQR.gpjg~> +endstream +endobj +31 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 30 0 R +>> +endobj +32 0 obj +<< /Length 2236 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm<h/D%+&:`#5TtRf^O>%mOh4bGY8;_Rmd4GA+Cu0dqdC'TTF=#U3]'b(*;5C"_9K@M<N&[\&*q+Q%]_``,hOIj-S:!Dlc5Q[GS0T_,SM1K2gCNB6o>$!.bc/.Z4Ses:Xe,!Ed#ZttECiR3LroZ/4E6m;mEE?Cj+Cjp+c8i2UCAiY&r4Ug2ldV$e'!FUFf6,"V*PN!SXV_(YL@u.3.F"KT>hbuQSX"#(`](IP*/5X-rr!ko?`d"SM&j,*/C_)O2%`$=cT7icc4jU_(TK<[c[J]Bq$_]9N;@d<.Q?KH:il55HkJNo&^\^j\9$YNt((*G%oV\L7QYPNf+_E1HtS(.s5i#klCD[BUTJJ.1OIpBmI[5_B7\Pli@/p%3grq$#W(WmAaJAKJ$0kQ.8SpP)s(kO^/e-EC.O\S8`H_30]irW6(/l,3GrZ2]E7]ZRu5R1QeH[Wi2C&^"i,D[Md+;?HMM:e>=?FFbS_$YDcaJ+F07B1Gg3C.4;tOoKKDJEDZ7#m!5-SbGdZ7Z!nHZ,j<MQ\=,-c<FBg)dfTuh+Mp$E"Ug"<R^[@:jXLc:/Sf>b1U5\S%KMl!TrkB/\E.dLdSY@1()8TR7(aS//1o%VRba!^"iBQqJS2S1K2To:fsGIOL78mNO_rN]c#YX(q(,]5"(X$/;a#'(W'*%<i2IQo8$$pS[r!9<X8SVcBQ*pZ()_%ZU0>m]Z!en;q7Y`\$/[^GngrTSghrI0aF2dZ5sl0k]ZTE&!9;dmn[dPPps=n(R:E?[/M*bTQR'9/.13!@+MI[Z2k-_V5SiFnj=S\4)IUGk(_X:^-e(]loA"l#f[TXk+b&O#$X$WE!<otb$i3%LR)h7V0rsmNJn*+WUi""R/"1?4B%Z5*7.dQtPVEf*^:AVJmbmTgCh!M(1R6A=`HodEjHE02b(K\.f#dTDA$HSbGIOW1/6-?+Ln6D4`?AE6if=C+'33"-;p')%5afLPjke(5X]aKjAV8ue[@-Q.>AFE4Tn !VunuAVg^rJ6Y'&"PI),K%K!u[]FM5i7MVp7/IRKk/t2_VQsrs//f_Z3O%W@*T+P5$igdj-/%YY%^?U$Z`#(>6c9p7fV_oBXV(S:9jg>(3FkVdFX+fsmD@Sp^;C1jQZe8FDXH^I-^mX@0(P/^qNPQm%O7!O5P.=\Q]J`d\3o2ih1GcCBk'G:&I?>>?H97E(=Ve8\fe!d3+:mG_TFrKWGYds>o9j9>gj-kYT&r=:-[XtR_>-ruOW2FUp8&%k7uNK^01WA<%#:kd^Te,qVpl2YSe$Phi[^gB`W-1XjlklL`o[-'"M1@k:Hb2+RYH2_iq30qgU(F@!-%W2,G@=3q:7pQQOHrm1&$Fkl`DHij+n'UT/.,NBr0UuX6#s8gqHmnA?V*jGp/.n\A[2tk`FTu/\NA'41GEBFJ/U/6WfDN;DCWXn<X>0KdA(N2\2T-4\%Bk>VA(,J9c6I)hdUd70.59+<N+Z^1jI#hOZ"rVPO:`!\c&3q7_Z_!<>L"Pg/2)ppWSR\)3'(VnN\/;,%_,ZtnAD\:.Hi''d363)H$Xh!^f9C<98UG"q3MUr.#`4%&(HA<_WPG+*/=g.>'(gmaau;,BrC,V77b)2DVXaa$e03ai(puNX;$hC02<8T)-AtG#:u'D93s5#D4r8bGCg]s\aX;9=U_]XmZO@r&hJ&p4>tg/M(^U=p;Fm98mK\C?d-[cF8$Voc#C4eS'[qP;;i'_67nm[%Eta=*KI#d+Te[36e=8pH3e=/8("?PVd8YdN*0r\;rVM0ID6f4me;QS)+SoWH25[;c4UW0'cn\#EBc6OK&l,(8kEQ9-\,2r4BFqKSp0PM[>_Y\`7eLo<&3qlc(+-jL*e&*ke/*u)5.]lAoET@(_R`OF^:a4mWhah-?*X(`^aUFXOFbr9K0lV-<(rp49\huZ^KRjhJ1,NXa"R?lSMupktP9IS7"[gnZ<;8:p?<Bm:%$"Q&n8!T-d_oqRh2d?fU969G+b$#GiX0c-oiY5B`l rb?;U9V"P>]ftDu;=%'iQldM3u_/Qpqd#"o:[TPPfWT0+$1%>dk&_\*h=Yf6$V3EAP8JErCoM`=sN<be52abiRZW:oSQ$m\GgE;ie5k[ID^'CB5*M?c!Hi!^f?#sM^#T5=$hNO<qOF5Ci5.'P\F<7^"ERKX8S_-+-gY$]D6udu#,k#`k>W3]oqW:ffhJCXLO0?O&]iPnD5IhE=.ds*oTOfSae=bR.6"Ab30de2brrL5srbh~> +endstream +endobj +33 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 32 0 R +>> +endobj +34 0 obj +<< /Length 1887 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat=,=``=U&:W67i1ljJ@=eW,9W&CmC1i^<P;LiaB,]k4Q6;#A7Ar="-_:82/kCRrnZ^Ns@uC>l]AF[^6Z;+ng\L3>)0Ik,pMLbY`-$YSJH(SokA(ir^r`GE0`,_\Aj3i;istb?`I'giCEaRDWRDE!Ns%(Vju_bL78dAOf3Z__,*N8D82C)?LJg?0\X0k_nd0[p/rADpQh&T#lHDIL=;uh:kBG4qe*)/i"B30&nBUQ0$4rqL-ZrZ,n^'9UpPf5+FhViVm$8$2O-#?YmL.I;fup+F/6JMJj!=?N1^aE=Os7u^MfQ@n710rZa(J8m(HVouU"i8Pf]R"5MqnkiAQ'm*FC_N#]:I*l/![LBN^L^FCQ3)NjYeQLIp^sNLSV;8<#mZGPr`I9;5F"2CfRnp'9ukVXi"26j$/Aur2R&u`(FiVM0K;J>X$92S5<MDa7#F"8L+sbZ4q"fr,QipG;na<6s`-k622&fS.oP>\6*!Z%/>@(kCI-(3KskZ:9kW*:fUuR#di:mA;'&FA/i''S_VScC]l_Y3T5G6Lh4Z4Dq/`taq=lu]rLWL>5nZ8-/#02Qg?+:nL,Yh&9QS2!]Z-94u.<hJd[%c1T3P(q`V6eY8qa1br?+M`jJFj'J::ePOB=j$@b=S5)22Ke,^qU#;mNuXm@jB\`]NVY2/.W2q]1tU(/Bah:>Z:cZ31)/KfP#-ZQLQ8pVapP_P4oCpW<G2R73.YdH+T@M21DRo^PbqM_Y_;3CZl97F='r\o+ThiLVqQNSj]3REN1%mBk/_N$@q`66k"Ph$'0)?\OL^d.n(Ja+fF%dRq(%<]NH?G(RVWg@_A*Vtj.5%*b$3-#I3RWR:J(5]buFtK?*nO?^ilpdOGg?5J$-]aJVaQ]E5H"iU3B;@93*[Hq_Lq5"b*Wss/.NVJnm`agG.-/N'FWp%GfuH-L'>'iS?de[VC20Zp<fZ4;S:o`)m_)jPlN@<j&bIX%*>_KRBkFUO'B<-qR<,@u>S_[OXb q,i:Z?OXM1Qo=*loUr!4>S;#N(D:mZ:0#@n3Fc5748%*3iN,O:g\-L-F-.69caWp3[/jhc)\9n-E"J/rVOKRAD@X'>AifCt7ttNrhX<Y%IK=/10]S5]%2F+`S(Na>aN4_7H[j1H8=r:7)3P$#@Tt$K#8t.7g2S*Q5b6Wn^\;I@3a5qdH!0%gW\@Y^6?>p3A+]\pp4-_?(@]Vmp98YkS6UfEj0CW!%:>;q=hAL5<NnoKg2Ap"4A-9iH7.8%32Yc=bn=ri98ZWfH]Cit0AhJ*34qY_0ZK:Dn,9?.[J!0FU8\),ot(LGW/.m$<M1KsYPoqM_**!@&YK(`=ul^"_B.F_,b\=';D9$/.`-N1ah>YKBNK,W@3gPXURgruMF.8&R2qK?/Z$[s*f:enO=rZu*fDUSW,k%+1NlM^&iP:jCbR66@T=_O.j\"B(f_1U3DLlg^A;_$$a?gg@cj&AjMG)!cRleP]k[0=ONaRNSEQ?VUccM3c*\b>oA>-\u$gpJIQqnD7:,WfJ\$CKtiBAP;6lc6i3h*K\:SA:\-]1helR+U<Gr%.M\$!DlSK#.(0(nI4%#bU<m25/YUO(8Hi\M[:^BFP\@O^-@WU2r>I[M_8f^@kRAHGJD!a9T$gNK]E\JEt]q%h.b!pW\"59eT>20<LTLK;+E,G?m%.#n^$tB"potm)Z6'dc\VqF'0'KNIG&#VJ5R'ln$s6$4q%P>\bJu3G%fpe[/9V;Y"^]slR=CGmG&-_`/dA]g5!L1]H?rEbX`GV-pEKI4H^L(27h`NZ@9kS*cX/p"O<QoJO6_PoiCIpjiM+=IoR*GOm-?6EGAPdjcNh+4ajqe>ur5^^/sXk+EFi1VlC/oCUd%@Oeo$_e?TIhQA*PTlus[^]70k;3s-r~> +endstream +endobj +35 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 34 0 R +/Annots 36 0 R +>> +endobj +36 0 obj +[ +37 0 R +] +endobj +37 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 247.632 660.8 345.924 648.8 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (zookeeperProgrammers.html#ch_zkWatches) +/S /URI >> +/H /I +>> +endobj +38 0 obj +<< /Length 1573 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatlPgMWcUo\Ek?[kH#V3FQNM@="')XcdA,&)B.H+uRXJMoR_])na'JM,X*)H[rp@"RK)l9*rg]me?<j1:j!7^5RlS^q]2tE5?[K+Me#K?bE$,<.H&O8iiS6^Q%(fGSc$'#^>P]E?)B*qQ>=_G"0CZ)m[D_aG,+R&^tgkLX2W@Q=Piq&VmRj4R*K*D1n?"a7^t\$LCB.K3\djd-)Z@i,R@=<)+:.`KT=VD3][5V/6JeD8Q_8Pe>9KJQoQC^Ch#*]J5hLR"_G782Msh8mL7D_Tl]Zgl:3_3+jX%hN!*>6n2A!k=@2q'Be5?I-BR:5(pYd5OX1X^Au+M6<#(smAEqs2fs*]C&@gi-*ua@NfnKF^<nE%(O,UjBr39&q<oqC?PIm%!/+@"PBd6n/b*6qdtM*df0;*qhEg.0@I8RJ5^>frAs[;D#,tQ,Pd8_*0"Tr-(cJ=N?D1D<rj]MK^AP.mF87*AXj0meZcmIg0iPZoGtt]6m)i8HJ1gunN?@9hl5$L5K==_2U?0_5b+\J?!:J`<:VQ9teIM`f6sJ3>6r1k1#G\Z=cN=H4jo=S#^iU@"q+CZ.;Z"MClgNX+!PU`&6MdZ"dg_Eb6R4f)eF+d\d`u-uFGMF,^dLCeM/co.]1"N@O3PM:7;j`L26Uge"NnPn/[%W97CtP6m&CIS[>:?]jg0tbkED$>0Jj&j^c5Z$h6Ag.Z$;&DUFkm!Cmj_/jg=(6e!H*[LcR["[Dc)bP1:3cKYJ&X)E!OsCtX,lZG^dYP:X,_+0QenM"TK?J?8%QNK3#E',ALWJ5A?23g<i[^%Hsg(a"8VMhU>J&/`C3hu8,?h@AML&@cu4@;`3SR:WKu(!GC49i5XoM0tDa[Q\;-Q-7^1["J&!UAWV$f67-aX1N&'lTA+,OdbrI$`=GB/?Y>fWhNW'r@/KQ']5tH#N6#_4`*-ErT0RV!R,d>;[\C>;7r._S7S=hgdhUX78QVLXYJ_?*t#dJXG4D>Cg"\jO*iJmi/ *)'ST+Z2lYl+V2SPNW@QZ.YGC4_LS[1T>kYq#@X^P#TTYJR68k;>bjA<9=cNQ'XS[?p$[Gn-TbQZ!m?/ZX>ajI&Pn'ZH[Z8?j8j)g/UQQ2N>BK>'-SFQ`Vlf/UNSk\2`1tbPlZ\)f2EJ<@ADF3_F.f0'9j&QR;%fE";0Q*j0%?]Yd6%EtWKHID&mo,5;eTR]BI/[olXV_3EfYL+O4orto#_<3>Y6t)MQ0$YhVrP^UF;;PW:.cZ,b'5V[-b-b;]ee-ZI!;i!%6#'f;BQ4p-\;C?nok8REVZPemu6u1.^I5YN\<.khl6hXC:@b+e!U@t=X)MbR*eGipKPkF>J8_TMS)rho7!fu8,(3Kqm6S_fd!(q;'uLMfV<1"ji34*)3EQ)IqI@eAZ\B.PiM\W"6th06k</\ipnO%DcV"_2_3s`g7X@X'bdfTU"s2SD"bj>/(,r#n1\O7#TogqCbZTh!rG\'6HV%:XaLa>6%Ms#kb0oSQ9XC`W05+tQh8-MqCkX4'6W-83DGgF3F%fnV`EXFF,`?6]",tlkq";>)(`/FW]?<VF6bAuW?1+/)T2L]!rpd6~> +endstream +endobj +39 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 38 0 R +>> +endobj +40 0 obj +<< /Length 1408 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0Ch/D%+&:aF]U%QM.P)K*0@b?3RLl8\P>oNkJ(?[uGBh+P-BbHsI'`6d7P*h&C,fdpU!0K\G^@-:,h:q2X@QO?u7%u",^DiRXi^c[u:G1r$1I2HU*L/Oo)1<R>p%0sU:5Fe!hB\!$A^n3fj]s\eZ0oOChMTj3@ZckppkNe@]Gn+$<ldXq"AU1nT:Ji;f=;']s+.eih/g'Ff.t'Q#0BjrOAumiB`1uAo+[I@+.Lmod_pmjZ"\<NeHYK\k'UV^;J0LN5Vq_"Tog0s,#$8)"_\KBf?r.DdZl^ns&isZQF$,Y9sJj.ek't<:*K9iX%p:GVlf8.afF)d\,(C`>t<?SSQ9%N.[^9H>-73NX!"H(Q<ut$5PObJ$%rK[Gs?dB`(qXTeacco.G\f&4*a-G"t7LPOd>Xs?4*AP8FK6W]ieo\B>@fEc+?udh:.<gMiLUH[.j"NdFjQZk3BP0c],UKLlg^ja4L9m$S3R`?-bD]0J4AR&.44(J1D^sNMfLE$*Jf)5i(=0X2'&R*OQ;$)A#@/g%]0&&dIROmPE]936I]DA."^M6sd]XNFW_@5W1e8*IaDtmfQQ4fKda:TF_9)4]=J"9G<cLL(:uuFRbIH_I`P?gU7>P!:A-[;9(P[],@9Wnj3\[JIZtQ;@#BTaW\a5%pA"o=c9B^KCd#-HbF-1jVjr87(*B];tC6E#U-leX^7&%B,[$!PFNij!XF086?ES:NgG^piOaK=S6\LrF\n<)2(Pcg2]oBV.bcL93CT@6[]80m_28m7L'LF_*mAK_b5AO5o^OK;!I@T42$LdS!@C,BpIXKoGr_sWB`m-1JE.0r$K\^8G()!<]cq#QmO]n8%:3q!.1f7/"TJ(dL7$lt_jo7oM0S!\>ugSUUbNnmq(YEM/-`NnBpUG*MB/WQ3X:5U.!?iU!KCNG+HHL@rhthZ)TDDHs'VKW[S`#[+&:Q[n^8`JhpX>Pm2l-=!O<Mi<"`S+LN6$2#]OeQ>tI$WiBoB:X0 TL6=q!5Hc)&0j7+2Xs;,F?$l>4,KSP?DuK41DUZk('K]0tD+IXm,[O%_U#FHoq@JbDBe.?KlbpcmQ)XZ=<rT]V(.[q64HJaYaoLr._H*LpCZ.JE+Tb8NIg,KcG\qV8+^T71.U)jdZY/?SN9[Ei5&CcWLocQVhK4u_Rb%H["_d$?ac%gI\j_l4Gu5,")C?B6%$ni:?uUl98E!V2JD^[h;t[=p20&QK1-;G!YRLZC)@fsl8tej\C`2T#Es[;9L#HF1RgW#[eV]'\i2X7HYnh@+rK&t0@LNX5A[r/iPtN]n'\IQYqNTW,fF%]:\E@'HQV*'Njar]MnUbA;Ii)M,Ic0qJ[,MT2ph<mt:-/Uf451gFDM$[85-_9O=`DQjJQ)B`ElXh$rr]*d,tZK7XJ6PmCRUPGS1~> +endstream +endobj +41 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 40 0 R +>> +endobj +42 0 obj +<< /Length 1588 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0DhbW9%&:Vr4iQ$IVia$nJYGus--m5[pH7b8@HFX9EC_@Q):=k4&WrDIXrB\*92Fj]l&spggk1c;BB4o6[3$"Pa7t6MS\&,n<&bj-9U+!nY6`.R>1R\;VSeU&+kdSr0X7$-$$&Q@Y:Z?Y?jn15*Ic69BT/<bt<3SK<3:*<4@Hc`9r/C9G7O<MB-7nkA7NTCLS6=n6pPg&eml*.b>@Z^(Jp:u<;&K0=9k+gS<.2crnk@0@6VRt4R[?>PU\?fEOu>%YF7'W_'%8.QWD3bJ6t38I_e=ibh0<;H=-$?52Gi8\Z\'>0]W^2adnZBI$DW\K_MiX]^)_I=(b;bMYA,N7c*bc1+_Tj23m/>D'(qZWV)6M1j4V8r$W-.U^ju$B$UW"=$RASH7Pk/Z)!uek#Nf_`?T6t\I/3*]_d%$DX=TfO0fs'%^\^AD&^]1g$eWV'W3>K.IQNhZ>c8bLh!uZqaj.#s#3.0>GQ`s7BHRJWO[KcN!=_a<M^(cE[`3+If<a7;-Pl8".uuDR'(Y2^e?SJcl;oWKO?gmo)+J4]If![r2P-GZ]5/j4[Tf()fH^/GXj^Y",-+?CJ#;u)9=`%04,T<rdB\\(^jaf@mlL4j`m?*;?aY3XZ16Tfs)6GF@BqCq9XtM7OMAJ60p7(3s2j5.kDncM6JO7O3etss5A@i4fk-]]Vfq-8<Ae7!:?tC'R%.hQGAJ(_2N<q:$`DW>A6@'5\YEF_*SoQk*qBG9@_D`9/:S:A.qERgTdo]A'5(/p">o,7'?XT,S1rCVZ'__+=d4-UWjClK\^-TWoXbY^O@7ZR8UijbWdS%Q=YHW3Nk/e@=(aO`8=;YBS\f+A<0^&O&PBTcFIUS-!hRR*<r3?GrE\q85Rf]+F:Zl:eR-8Sls:D!!$p[AU:h`3!#jf-mfBjY[fJI\6PAg<GG;D'1sPV2m!XC)Y^RAa2[DAJrZ@.,:,-[BTR@s[S<^[Lg>r@J=Ogji\%TDqZh[uTE-ajWW/J\#e% ehf7sX/*6k*YD,DYO\!=m7LpWbuB4`r24AcXe2RrC>sA];fs.Ji6bAk3!2nQWaK!nM'dLrE2*C&lD]M;%R2.Ebtlc@iS:l!hFZ``Cp[]g(g$l+2u2PlVSRrQW474P!8Eh+D[jJA6IPYRDo_;?+0g%aFj2TQRV)>T\*OTf;]o[V%[P[&NJP`d4Y\KOR1%K='7m>;M"3T0d?#XOgSY:JQ@fGW"fo4lI)7FmW3(r=HY6BM_ZQOb;(oUDN>[\S6$C!*n^X%T=J+OD+n+?`F1NrFF>Y>mRA-i$QFc.0NYAb$$bl^s/VnJ=,6&;C>\[:_&D#:A#l03F2U;H'h4ORqdT[&DDbCQ$V3!.)Q$/g5WBjSJ^-bWDqu_(:b*F:ef=d!A_Or]A)D:HAO,\bMC27-N]eJZ)I83dA([i4@Y[WTC`ic/=\l!AoMhKHWK8V#;n?Ybl6aTDqhAd:-a,R^r\BhXUCcMQ"Y#(L_IUB+GGKg34h4].DA%<Lj;RJiRmn>drP=6ZdlY<J834IcR:#t7"%:6V!2&>_MN/BNI4_YlYlWUT3'=]])k'alC!Z8Si;8X]5hFZ$$e0>cnP2Ih4-<'~> +endstream +endobj +43 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 42 0 R +>> +endobj +44 0 obj +<< /Length 1776 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0D>Ar7S'Roe[csBm'=D3i.:u"lTCR,\#DV\cp_!4,111L\l,Zg.m\AS=C%Op*mZ71.9YQ0N%'OJNFSLaM^3kC`>5*)YOK\n^5i=k+,iu%cMOab'&Qlo8c<Q^elINQ83j*`+<9"DEX;U;D0T'PtiDnH\TPAXMA[`^##ART37_[ek>o/+WgT>MWe`$Ak7L"?garV>+YA,ft\MquZr_<Wrg-^-ONIKWS0%62g4%UXC\%/eRn6`K#kd+k#%Xu,&X2j7J);/M<W4i#R5!g#Z"NJ*lB7Bj!TIIKFZ^O.6j3NJWq2Z?U=$ha1HG6Q.)W,YaQHK$ETO]ZGjI!5&IL%iua^?mfa,/$8ZOX+[#ptIr``InH_Lrnc?iL%uj87TM]46Ej'ppXk3W_Q6/=kB\A5&=tf5pP=nfuROC,&9e-J%k=,Z\N\+*`UNt`Nl[l-U"D?<A*'WIB^9DolB'A3ta9)/2QV:4O6p4HdSeW?D_VY5D,(tJMmJnE!Kn..#CMH#+:G[$6GBV3+@&gaYI1r$B1j"A@"R$PkP8JCIdZcPsf]APq8596/8smhut2HYZ3@9KNaBXbA;.u(u0AMD:%DQ@.;'(LSM;Y"e5_YaC:Z-B?9qU/:UQ4NNE:H=_D;sbZeS/](`i?6I<Y@R:enb:ep"&,$Z?8nKmf5m!!5JabNWo;WmCCE$D#o[W!,9TkgK8NE&]4rEU?fOKZSo",Au^/8uIdc-%",F/B$CX"oon_Di\>5F$r>0HosO2"pZM=(M^CSW2OM-=*Uic(i,uPSRmJk@-4U'#LdIG>6W212GRE3pG22g171OG;*Ja*cg?RlD(SrALK6Fh#c'm>3Q4;2J=2-&i"n/5k8\nW08\WV?0WIgladfFJI_<O-.tS0N\3H>NUb5AgJBI*Fp?>*[N!H:gXc'O+F0>;5gkdKrQY53>W-X+G"[.qC)NuE"[YuiG.N$o,/g*K[rRiM+cOX[RdT+Y\N^Q_.7-rSq%1]#KJn)=C?Ss,( dJSAEbG-.%8\me9/"mn:^CI=hI.'.?q[b/+LDBrCl)]_ucBq(8<@gJ4;VN9,I)4iNO+4Ig"pATeqm7&%UMn.3Bi!.e=W[r(:6pC8i^hF_p%QYjQ8.M8@%Z2qZJ)<#gOm<V;.]V(<BafUb>=l!_,=;=2E*Z@&U[8b:/:,aS^d:BKhs:YN-\$8C[T*FZV%l?)31#Y:9E3/Gt,Q"Q/+e2gs3:otM#&08;6aO%T>f(`siWG7WR>e"2[DQP^M1A'fZ3LZmUE(iin;0DKCcDmR_@L7R)`Dc@@q\^`U2"l*p`@7LHiJ!GNTNBe0)g.s-@>)Ua"I>2*[Xr$s&_hnbo:2hgc=GuS$8B#+3tSIOES[k/,"f_%_'!j0OVfLDV?!lO&g$C0m'B9Dl#nF;`[FEgX*40:i`CpcIK&H+(GGWMPc2nIRI:VCV\?8qJ\n,,O`0Y[h=:6^Pe0'E4eNVtd=^IZY'ODrTAeR%D@U10U@]=sdJn901T$gs&U)UJ1gqX<:6+7O*-I\`aN=jtBUbr8fWaQ),`ULV%,5-Sm!CVEQ+?c<)R2)2<#RM9%]GcM1+sfE5$.1WLLEH"3;2:/:?[^!ga"Zc>r@\22h!8!AadO]Y1/oZmB+72]i<C'(m*J*>8<d7#[JTIDWr='aA;GFJL<bi-&^cR>cQY0PT`3`(Bc!l*)ZdN-A[J.`]+8j,>7TM\_]YE=uBp.`7P`D7jg%K:HGI<*a.J![7miQ=5Gl3D0`QsDTb`T7l?jLcnlEp<\SmP862UtmS?G?hESJt;/H~> +endstream +endobj +45 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 44 0 R +>> +endobj +46 0 obj +<< /Length 1405 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU3D/\/e&H;*)Tml5GTOC7RL#du:8@t["#II]E@)2&VTOcd-X@as2gI^#qpRNQZU`IS![KMG/'(>VNF"]YhSkZA"P:mU9Xl/[8K_rjbi])\m@FX))LB0l3GY3;(jL<6HZee27`0blL'mlNUGsdX2hKfk%1M[b]X]aWoR0Cj^LEF%GmBng0I0r"\$kZtjDN'YueFI>@LlhY1h-i7r*VdXoYqh2(l:7L>EBm*:V=:9nA`RFG%E9tY5m+4Elb(p4J=DI4mboK2ZR*D'+pB*?>T?.kDAXN4H*biRa(_qUnglrqcG9U-2;OPN_Fg(C;d%^2ZJO_i50XFOhl675'lLG%MNsqbo\+Th+o,'6Nc(lc%[7.0qrH#Y=eM=L!139eBFTm^B3+9#@uZ:')C.d3kVSI.bbZ_hMS.,I?2lU[LgriOfkR/DFD^^5i9N2-p1"frc9a!qC"L*K(D;/KI"/6;RLhqN7Ze!H#LFt"BQ(<4b"'N7""ZpH+Xp8dCk`shBT-%I$L`E=*\JZKTaj)2'&lgMobb]),)i/6(fEbr;2huGMHO(eh,Tl+Mapl2'*1N&5N1bd<j,$K,SW\%TnO2=IiAVd;/B@WJL"AhL!mW8TeO%d)UX1D`=+[tlE)OjaU'sr4R1lW"]XQe+!H96?mrOpYg@<a<qf?H-rm9nfE,W?(act7:`&a!oP4IA^,k>l("ZUULrD9ua*\A,L'%2[T-K(7_p.)V.ftH=TDeN<M0JO\dpN:t>U-imL:D4b>IsKG(c^%J3kmB$0n(.)ICu)W#?9o.7/F2+":OS"V#Er!nX0<ahO[;`^c;ar#9k8dYW-B>^IVL!F`j%n8jfR<flG72cC9?('Fs3[mnQ[pAau=4%MVf%AYr+I^FtkqT1I,,HhPOfgr[GYV^V;\9!boF4Al7';/B^Sn%9`_-0B1-5'A4eH(Kh6j#"Q"QKM<&AEh*+jjM6p;7OU>R,PG$(4#5n&0OM?DDFYT$9ZpZC8RJg&uhBs8& O2BABtPYc\7*sYcY9;r5[HF0V.`t"l01dHkZ^]$9E\t0;Kss^gn,=Te`/\<7+Rf>Nt6BVb>[s(QLhYjK>VrZXJ&d'fEXQqrU3^Yr<0N`MHJl^..\:(@$2EYd79\ao&79IB*)SR)Kq-3e7(`SW'BN@8I^d,5pANXXG')RY8Oo4;P,Dga"UD_,q@hMipIFL!ek:Meh<,'K-V@^UX6nJ;G+T?/t&hA_D2WJ4V/ZO#/3?oUXWkK*PJ%icCCZ%D`JAX7"`=q,Dl@FrrAd1OdtJrSe_+@c/rppP7%t@O2OC_h$ja_[qhFU#;Y$MFTAT`f\<1dG;%uVQB2c[T`"J+DWb?\?Q\:I:f=aa7[;\,uRgY/XLc:Pk3tIg_L:FPW!R3g:T7/]6EY`ZBf5Q(W\B+%lINGg&~> +endstream +endobj +47 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 46 0 R +>> +endobj +49 0 obj +<< + /Title (\376\377\0\61\0\40\0\101\0\40\0\123\0\151\0\155\0\160\0\154\0\145\0\40\0\127\0\141\0\164\0\143\0\150\0\40\0\103\0\154\0\151\0\145\0\156\0\164) + /Parent 48 0 R + /First 50 0 R + /Last 51 0 R + /Next 52 0 R + /Count -2 + /A 9 0 R +>> endobj +50 0 obj +<< + /Title (\376\377\0\61\0\56\0\61\0\40\0\122\0\145\0\161\0\165\0\151\0\162\0\145\0\155\0\145\0\156\0\164\0\163) + /Parent 49 0 R + /Next 51 0 R + /A 11 0 R +>> endobj +51 0 obj +<< + /Title (\376\377\0\61\0\56\0\62\0\40\0\120\0\162\0\157\0\147\0\162\0\141\0\155\0\40\0\104\0\145\0\163\0\151\0\147\0\156) + /Parent 49 0 R + /Prev 50 0 R + /A 13 0 R +>> endobj +52 0 obj +<< + /Title (\376\377\0\62\0\40\0\124\0\150\0\145\0\40\0\105\0\170\0\145\0\143\0\165\0\164\0\157\0\162\0\40\0\103\0\154\0\141\0\163\0\163) + /Parent 48 0 R + /Prev 49 0 R + /Next 53 0 R + /A 15 0 R +>> endobj +53 0 obj +<< + /Title (\376\377\0\63\0\40\0\124\0\150\0\145\0\40\0\104\0\141\0\164\0\141\0\115\0\157\0\156\0\151\0\164\0\157\0\162\0\40\0\103\0\154\0\141\0\163\0\163) + /Parent 48 0 R + /Prev 52 0 R + /Next 54 0 R + /A 17 0 R +>> endobj +54 0 obj +<< + /Title (\376\377\0\64\0\40\0\103\0\157\0\155\0\160\0\154\0\145\0\164\0\145\0\40\0\123\0\157\0\165\0\162\0\143\0\145\0\40\0\114\0\151\0\163\0\164\0\151\0\156\0\147\0\163) + /Parent 48 0 R + /Prev 53 0 R + /A 19 0 R +>> endobj +55 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F3 +/BaseFont /Helvetica-Bold +/Encoding /WinAnsiEncoding >> +endobj +56 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F5 +/BaseFont /Times-Roman +/Encoding /WinAnsiEncoding >> +endobj +57 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F6 +/BaseFont /Times-Italic +/Encoding /WinAnsiEncoding >> +endobj +58 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F1 +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding >> +endobj +59 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F11 +/BaseFont /Courier-Bold +/Encoding /WinAnsiEncoding >> +endobj +60 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F9 +/BaseFont /Courier +/Encoding /WinAnsiEncoding >> +endobj +61 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F2 +/BaseFont /Helvetica-Oblique +/Encoding /WinAnsiEncoding >> +endobj +62 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F7 +/BaseFont /Times-Bold +/Encoding /WinAnsiEncoding >> +endobj +1 0 obj +<< /Type /Pages +/Count 13 +/Kids [6 0 R 21 0 R 25 0 R 27 0 R 29 0 R 31 0 R 33 0 R 35 0 R 39 0 R 41 0 R 43 0 R 45 0 R 47 0 R ] >> +endobj +2 0 obj +<< /Type /Catalog +/Pages 1 0 R + /Outlines 48 0 R + /PageMode /UseOutlines + >> +endobj +3 0 obj +<< +/Font << /F3 55 0 R /F5 56 0 R /F1 58 0 R /F6 57 0 R /F9 60 0 R /F11 59 0 R /F2 61 0 R /F7 62 0 R >> +/ProcSet [ /PDF /ImageC /Text ] >> +endobj +9 0 obj +<< +/S /GoTo +/D [21 0 R /XYZ 85.0 659.0 null] +>> +endobj +11 0 obj +<< +/S /GoTo +/D [21 0 R /XYZ 85.0 580.266 null] +>> +endobj +13 0 obj +<< +/S /GoTo +/D [21 0 R /XYZ 85.0 396.613 null] +>> +endobj +15 0 obj +<< +/S /GoTo +/D [21 0 R /XYZ 85.0 266.16 null] +>> +endobj +17 0 obj +<< +/S /GoTo +/D [29 0 R /XYZ 85.0 304.04 null] +>> +endobj +19 0 obj +<< +/S /GoTo +/D [35 0 R /XYZ 85.0 611.4 null] +>> +endobj +48 0 obj +<< + /First 49 0 R + /Last 54 0 R +>> endobj +xref +0 63 +0000000000 65535 f +0000028782 00000 n +0000028925 00000 n +0000029017 00000 n +0000000015 00000 n +0000000071 00000 n +0000000792 00000 n +0000000912 00000 n +0000000972 00000 n +0000029174 00000 n +0000001107 00000 n +0000029237 00000 n +0000001243 00000 n +0000029303 00000 n +0000001380 00000 n +0000029369 00000 n +0000001517 00000 n +0000029434 00000 n +0000001654 00000 n +0000029499 00000 n +0000001791 00000 n +0000003959 00000 n +0000004082 00000 n +0000004109 00000 n +0000004248 00000 n +0000006406 00000 n +0000006514 00000 n +0000008645 00000 n +0000008753 00000 n +0000010436 00000 n +0000010544 00000 n +0000012990 00000 n +0000013098 00000 n +0000015427 00000 n +0000015535 00000 n +0000017515 00000 n +0000017638 00000 n +0000017665 00000 n +0000017853 00000 n +0000019519 00000 n +0000019627 00000 n +0000021128 00000 n +0000021236 00000 n +0000022917 00000 n +0000023025 00000 n +0000024894 00000 n +0000025002 00000 n +0000026500 00000 n +0000029563 00000 n +0000026608 00000 n +0000026862 00000 n +0000027036 00000 n +0000027221 00000 n +0000027433 00000 n +0000027663 00000 n +0000027897 00000 n +0000028010 00000 n +0000028120 00000 n +0000028231 00000 n +0000028339 00000 n +0000028451 00000 n +0000028557 00000 n +0000028673 00000 n +trailer +<< +/Size 63 +/Root 2 0 R +/Info 4 0 R +>> +startxref +29614 +%%EOF
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/01b6b5e4/doc/r3.1.2/linkmap.html ---------------------------------------------------------------------- diff --git a/doc/r3.1.2/linkmap.html b/doc/r3.1.2/linkmap.html new file mode 100644 index 0000000..7b35d15 --- /dev/null +++ b/doc/r3.1.2/linkmap.html @@ -0,0 +1,375 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<html> +<head> +<META http-equiv="Content-Type" content="text/html; charset=UTF-8"> +<meta content="Apache Forrest" name="Generator"> +<meta name="Forrest-version" content="0.8"> +<meta name="Forrest-skin-name" content="pelt"> +<title>Site Linkmap Table of Contents</title> +<link type="text/css" href="skin/basic.css" rel="stylesheet"> +<link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet"> +<link media="print" type="text/css" href="skin/print.css" rel="stylesheet"> +<link type="text/css" href="skin/profile.css" rel="stylesheet"> +<script src="skin/getBlank.js" language="javascript" type="text/javascript"></script><script src="skin/getMenu.js" language="javascript" type="text/javascript"></script><script src="skin/fontsize.js" language="javascript" type="text/javascript"></script> +<link rel="shortcut icon" href="images/favicon.ico"> +</head> +<body onload="init()"> +<script type="text/javascript">ndeSetTextSize();</script> +<div id="top"> +<!--+ + |breadtrail + +--> +<div class="breadtrail"> +<a href="http://www.apache.org/">Apache</a> > <a href="http://hadoop.apache.org/">Hadoop</a> > <a href="http://hadoop.apache.org/zookeeper/">ZooKeeper</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script> +</div> +<!--+ + |header + +--> +<div class="header"> +<!--+ + |start group logo + +--> +<div class="grouplogo"> +<a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a> +</div> +<!--+ + |end group logo + +--> +<!--+ + |start Project Logo + +--> +<div class="projectlogo"> +<a href="http://hadoop.apache.org/zookeeper/"><img class="logoImage" alt="ZooKeeper" src="images/zookeeper_small.gif" title="ZooKeeper: distributed coordination"></a> +</div> +<!--+ + |end Project Logo + +--> +<!--+ + |start Search + +--> +<div class="searchbox"> +<form action="http://www.google.com/search" method="get" class="roundtopsmall"> +<input value="hadoop.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google"> + <input name="Search" value="Search" type="submit"> +</form> +</div> +<!--+ + |end search + +--> +<!--+ + |start Tabs + +--> +<ul id="tabs"> +<li> +<a class="unselected" href="http://hadoop.apache.org/zookeeper/">Project</a> +</li> +<li> +<a class="unselected" href="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a> +</li> +<li class="current"> +<a class="selected" href="index.html">ZooKeeper 3.1 Documentation</a> +</li> +</ul> +<!--+ + |end Tabs + +--> +</div> +</div> +<div id="main"> +<div id="publishedStrip"> +<!--+ + |start Subtabs + +--> +<div id="level2tabs"></div> +<!--+ + |end Endtabs + +--> +<script type="text/javascript"><!-- +document.write("Last Published: " + document.lastModified); +// --></script> +</div> +<!--+ + |breadtrail + +--> +<div class="breadtrail"> + + + </div> +<!--+ + |start Menu, mainarea + +--> +<!--+ + |start Menu + +--> +<div id="menu"> +<div onclick="SwitchMenu('menu_1.1', 'skin/')" id="menu_1.1Title" class="menutitle">Overview</div> +<div id="menu_1.1" class="menuitemgroup"> +<div class="menuitem"> +<a href="index.html">Welcome</a> +</div> +<div class="menuitem"> +<a href="zookeeperOver.html">Overview</a> +</div> +<div class="menuitem"> +<a href="zookeeperStarted.html">Getting Started</a> +</div> +<div class="menuitem"> +<a href="releasenotes.html">Release Notes</a> +</div> +</div> +<div onclick="SwitchMenu('menu_1.2', 'skin/')" id="menu_1.2Title" class="menutitle">Developer</div> +<div id="menu_1.2" class="menuitemgroup"> +<div class="menuitem"> +<a href="api/index.html">API Docs</a> +</div> +<div class="menuitem"> +<a href="zookeeperProgrammers.html">Programmer's Guide</a> +</div> +<div class="menuitem"> +<a href="javaExample.html">Java Example</a> +</div> +<div class="menuitem"> +<a href="zookeeperTutorial.html">Barrier and Queue Tutorial</a> +</div> +<div class="menuitem"> +<a href="recipes.html">Recipes</a> +</div> +</div> +<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">Admin & Ops</div> +<div id="menu_1.3" class="menuitemgroup"> +<div class="menuitem"> +<a href="zookeeperAdmin.html">Administrator's Guide</a> +</div> +<div class="menuitem"> +<a href="zookeeperQuotas.html">Quota Guide</a> +</div> +<div class="menuitem"> +<a href="zookeeperJMX.html">JMX</a> +</div> +</div> +<div onclick="SwitchMenu('menu_1.4', 'skin/')" id="menu_1.4Title" class="menutitle">Contributor</div> +<div id="menu_1.4" class="menuitemgroup"> +<div class="menuitem"> +<a href="zookeeperInternals.html">ZooKeeper Internals</a> +</div> +</div> +<div onclick="SwitchMenu('menu_1.5', 'skin/')" id="menu_1.5Title" class="menutitle">Miscellaneous</div> +<div id="menu_1.5" class="menuitemgroup"> +<div class="menuitem"> +<a href="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a> +</div> +<div class="menuitem"> +<a href="http://wiki.apache.org/hadoop/ZooKeeper/FAQ">FAQ</a> +</div> +<div class="menuitem"> +<a href="http://hadoop.apache.org/zookeeper/mailing_lists.html">Mailing Lists</a> +</div> +</div> +<div id="credit"></div> +<div id="roundbottom"> +<img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div> +<!--+ + |alternative credits + +--> +<div id="credit2"></div> +</div> +<!--+ + |end Menu + +--> +<!--+ + |start content + +--> +<div id="content"> +<div title="Portable Document Format" class="pdflink"> +<a class="dida" href="linkmap.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br> + PDF</a> +</div> +<h1>Site Linkmap Table of Contents</h1> +<p> + This is a map of the complete site and its structure. + </p> +<ul> +<li> +<a>Hadoop</a> ___________________ <em>site</em> +</li> +<ul> + + +<ul> +<li> +<a>Overview</a> ___________________ <em>docs</em> +</li> +<ul> + +<ul> +<li> +<a href="index.html">Welcome</a> ___________________ <em>welcome</em> +</li> +</ul> + +<ul> +<li> +<a href="zookeeperOver.html">Overview</a> ___________________ <em>overview</em> +</li> +</ul> + +<ul> +<li> +<a href="zookeeperStarted.html">Getting Started</a> ___________________ <em>started</em> +</li> +</ul> + +<ul> +<li> +<a href="releasenotes.html">Release Notes</a> ___________________ <em>relnotes</em> +</li> +</ul> + +</ul> +</ul> + + +<ul> +<li> +<a>Developer</a> ___________________ <em>docs</em> +</li> +<ul> + +<ul> +<li> +<a href="api/index.html">API Docs</a> ___________________ <em>api</em> +</li> +</ul> + +<ul> +<li> +<a href="zookeeperProgrammers.html">Programmer's Guide</a> ___________________ <em>program</em> +</li> +</ul> + +<ul> +<li> +<a href="javaExample.html">Java Example</a> ___________________ <em>javaEx</em> +</li> +</ul> + +<ul> +<li> +<a href="zookeeperTutorial.html">Barrier and Queue Tutorial</a> ___________________ <em>barTutor</em> +</li> +</ul> + +<ul> +<li> +<a href="recipes.html">Recipes</a> ___________________ <em>recipes</em> +</li> +</ul> + +</ul> +</ul> + + +<ul> +<li> +<a>Admin & Ops</a> ___________________ <em>docs</em> +</li> +<ul> + +<ul> +<li> +<a href="zookeeperAdmin.html">Administrator's Guide</a> ___________________ <em>admin</em> +</li> +</ul> + +<ul> +<li> +<a href="zookeeperQuotas.html">Quota Guide</a> ___________________ <em>quota</em> +</li> +</ul> + +<ul> +<li> +<a href="zookeeperJMX.html">JMX</a> ___________________ <em>jmx</em> +</li> +</ul> + +</ul> +</ul> + + +<ul> +<li> +<a>Contributor</a> ___________________ <em>docs</em> +</li> +<ul> + +<ul> +<li> +<a href="zookeeperInternals.html">ZooKeeper Internals</a> ___________________ <em>internals</em> +</li> +</ul> + +</ul> +</ul> + + +<ul> +<li> +<a>Miscellaneous</a> ___________________ <em>docs</em> +</li> +<ul> + +<ul> +<li> +<a href="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a> ___________________ <em>wiki</em> +</li> +</ul> + +<ul> +<li> +<a href="http://wiki.apache.org/hadoop/ZooKeeper/FAQ">FAQ</a> ___________________ <em>faq</em> +</li> +</ul> + +<ul> +<li> +<a href="http://hadoop.apache.org/zookeeper/mailing_lists.html">Mailing Lists</a> ___________________ <em>lists</em> +</li> +</ul> + + +</ul> +</ul> + + + + + + +</ul> +</ul> +</div> +<!--+ + |end content + +--> +<div class="clearboth"> </div> +</div> +<div id="footer"> +<!--+ + |start bottomstrip + +--> +<div class="lastmodified"> +<script type="text/javascript"><!-- +document.write("Last Published: " + document.lastModified); +// --></script> +</div> +<div class="copyright"> + Copyright © + 2008 <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a> +</div> +<!--+ + |end bottomstrip + +--> +</div> +</body> +</html> http://git-wip-us.apache.org/repos/asf/zookeeper/blob/01b6b5e4/doc/r3.1.2/linkmap.pdf ---------------------------------------------------------------------- diff --git a/doc/r3.1.2/linkmap.pdf b/doc/r3.1.2/linkmap.pdf new file mode 100644 index 0000000..2e55584 --- /dev/null +++ b/doc/r3.1.2/linkmap.pdf @@ -0,0 +1,94 @@ +%PDF-1.3 +%���� +4 0 obj +<< /Type /Info +/Producer (FOP 0.20.5) >> +endobj +5 0 obj +<< /Length 1121 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0C>uTN:'RekGiMVDm7+&L27n=a3%7pgeP>7TB8*jtVM:XMg%-bO1/-D2/Kc+g?40tuKnMs+kpIMk#bJhXLP$n]*[bNEAs0l1IlsbN$ke8Gqq_:hh+M>d]g[*8"1M,\>likZB2m`6Re_dg0)$cJe]F*foAo,61[?\.:T4`Xbb@AT:15#npLlURWi/eFjb=gCZ&?MMW$eo-,hC9@'"6In<QZDGooX:`p%7XM9p-cS(Qu#%<>19TiB-b"=NY:&K$-M7.q\P4E,E#!p%h%D/d(@j-.b7etCLPR's8D!@*g$C%LiW^A'$$*O)UflammU%U0T9PW5\O9tLMLV,Q+WNcMP(q#`++h8?9OSZM"^u[]AJ:Aca%T[;pH/tOFL%<`Q]FcPV.bXnUEucOWdmOLV="a:dtgJ>3CIB2ptl0?]8-9AqdL14^4n,F]n:&Zb=8H'$BI+U(;p+P*H_u@*JB!b'(Kml2qqZ)HkSmk_(Z=AP$CEQIiFjNAU6td;KdTa-2HJHYj'hq]F^UOaHKCk%5h2]1GC;)E"W,nt\E4)LZ&4Ft:hD@"3URWV('X;oes51o>*oSk6&[aHM?=(>$A?F80&5a2e*7`.#U\#erET_sc%uH''r,JM9Rh'`>.5m'Ms^@&.@H[8EZe*GWFlG*\0lSI=ItVjB]mUmF9eQ"kIr3@-jj,78LI3T4sE@+n?@XfBDAr\?Ar2"T7\_@oDW:GP+"0PN*l<Oo/fE%g87\]YH/U555V&=!R,\3ro,ST`_ET-TP<B.:i1^8lfm8tpB<b#ub4^X%DGn0.SYm@ul>M2:!@T/&reGrFr80\T3#[i9T\o;&b2KI.`1LXs43fn<SV>BeCP[A[[V`'k-"SAr3V7%K2[U.L]AW-0Jf9%6a_3uGI1"Oib%8WcCe97#U(qPJGZ\-W&Q_bKC;H-u[_qklNu$,JR[C0D(iP6NuYWf!s_n(_6Y_l_:N[-l?R0ieCNJ*:j^\FPoh0C'1n6-_7NR3B?s1G []9:)=.`"c_>#\?2D3S5U1;d"jECat,%L@/3(Z8iQbeF`D-9deF2^B^B.5MkHfY%-m*U7]aK+RGQR8@=jUdh:6:LQ**FB=B1>$ceSeRft-`@Y/.X?IfZFaa]&~> +endstream +endobj +6 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 5 0 R +>> +endobj +7 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F3 +/BaseFont /Helvetica-Bold +/Encoding /WinAnsiEncoding >> +endobj +8 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F5 +/BaseFont /Times-Roman +/Encoding /WinAnsiEncoding >> +endobj +9 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F6 +/BaseFont /Times-Italic +/Encoding /WinAnsiEncoding >> +endobj +10 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F1 +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding >> +endobj +11 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F2 +/BaseFont /Helvetica-Oblique +/Encoding /WinAnsiEncoding >> +endobj +1 0 obj +<< /Type /Pages +/Count 1 +/Kids [6 0 R ] >> +endobj +2 0 obj +<< /Type /Catalog +/Pages 1 0 R + >> +endobj +3 0 obj +<< +/Font << /F3 7 0 R /F5 8 0 R /F1 10 0 R /F6 9 0 R /F2 11 0 R >> +/ProcSet [ /PDF /ImageC /Text ] >> +endobj +xref +0 12 +0000000000 65535 f +0000001945 00000 n +0000002003 00000 n +0000002053 00000 n +0000000015 00000 n +0000000071 00000 n +0000001284 00000 n +0000001390 00000 n +0000001502 00000 n +0000001611 00000 n +0000001721 00000 n +0000001829 00000 n +trailer +<< +/Size 12 +/Root 2 0 R +/Info 4 0 R +>> +startxref +2173 +%%EOF http://git-wip-us.apache.org/repos/asf/zookeeper/blob/01b6b5e4/doc/r3.1.2/recipes.html ---------------------------------------------------------------------- diff --git a/doc/r3.1.2/recipes.html b/doc/r3.1.2/recipes.html new file mode 100644 index 0000000..5d7eee7 --- /dev/null +++ b/doc/r3.1.2/recipes.html @@ -0,0 +1,932 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<html> +<head> +<META http-equiv="Content-Type" content="text/html; charset=UTF-8"> +<meta content="Apache Forrest" name="Generator"> +<meta name="Forrest-version" content="0.8"> +<meta name="Forrest-skin-name" content="pelt"> +<title>ZooKeeper Recipes and Solutions</title> +<link type="text/css" href="skin/basic.css" rel="stylesheet"> +<link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet"> +<link media="print" type="text/css" href="skin/print.css" rel="stylesheet"> +<link type="text/css" href="skin/profile.css" rel="stylesheet"> +<script src="skin/getBlank.js" language="javascript" type="text/javascript"></script><script src="skin/getMenu.js" language="javascript" type="text/javascript"></script><script src="skin/fontsize.js" language="javascript" type="text/javascript"></script> +<link rel="shortcut icon" href="images/favicon.ico"> +</head> +<body onload="init()"> +<script type="text/javascript">ndeSetTextSize();</script> +<div id="top"> +<!--+ + |breadtrail + +--> +<div class="breadtrail"> +<a href="http://www.apache.org/">Apache</a> > <a href="http://hadoop.apache.org/">Hadoop</a> > <a href="http://hadoop.apache.org/zookeeper/">ZooKeeper</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script> +</div> +<!--+ + |header + +--> +<div class="header"> +<!--+ + |start group logo + +--> +<div class="grouplogo"> +<a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a> +</div> +<!--+ + |end group logo + +--> +<!--+ + |start Project Logo + +--> +<div class="projectlogo"> +<a href="http://hadoop.apache.org/zookeeper/"><img class="logoImage" alt="ZooKeeper" src="images/zookeeper_small.gif" title="ZooKeeper: distributed coordination"></a> +</div> +<!--+ + |end Project Logo + +--> +<!--+ + |start Search + +--> +<div class="searchbox"> +<form action="http://www.google.com/search" method="get" class="roundtopsmall"> +<input value="hadoop.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google"> + <input name="Search" value="Search" type="submit"> +</form> +</div> +<!--+ + |end search + +--> +<!--+ + |start Tabs + +--> +<ul id="tabs"> +<li> +<a class="unselected" href="http://hadoop.apache.org/zookeeper/">Project</a> +</li> +<li> +<a class="unselected" href="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a> +</li> +<li class="current"> +<a class="selected" href="index.html">ZooKeeper 3.1 Documentation</a> +</li> +</ul> +<!--+ + |end Tabs + +--> +</div> +</div> +<div id="main"> +<div id="publishedStrip"> +<!--+ + |start Subtabs + +--> +<div id="level2tabs"></div> +<!--+ + |end Endtabs + +--> +<script type="text/javascript"><!-- +document.write("Last Published: " + document.lastModified); +// --></script> +</div> +<!--+ + |breadtrail + +--> +<div class="breadtrail"> + + + </div> +<!--+ + |start Menu, mainarea + +--> +<!--+ + |start Menu + +--> +<div id="menu"> +<div onclick="SwitchMenu('menu_1.1', 'skin/')" id="menu_1.1Title" class="menutitle">Overview</div> +<div id="menu_1.1" class="menuitemgroup"> +<div class="menuitem"> +<a href="index.html">Welcome</a> +</div> +<div class="menuitem"> +<a href="zookeeperOver.html">Overview</a> +</div> +<div class="menuitem"> +<a href="zookeeperStarted.html">Getting Started</a> +</div> +<div class="menuitem"> +<a href="releasenotes.html">Release Notes</a> +</div> +</div> +<div onclick="SwitchMenu('menu_selected_1.2', 'skin/')" id="menu_selected_1.2Title" class="menutitle" style="background-image: url('skin/images/chapter_open.gif');">Developer</div> +<div id="menu_selected_1.2" class="selectedmenuitemgroup" style="display: block;"> +<div class="menuitem"> +<a href="api/index.html">API Docs</a> +</div> +<div class="menuitem"> +<a href="zookeeperProgrammers.html">Programmer's Guide</a> +</div> +<div class="menuitem"> +<a href="javaExample.html">Java Example</a> +</div> +<div class="menuitem"> +<a href="zookeeperTutorial.html">Barrier and Queue Tutorial</a> +</div> +<div class="menupage"> +<div class="menupagetitle">Recipes</div> +</div> +</div> +<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">Admin & Ops</div> +<div id="menu_1.3" class="menuitemgroup"> +<div class="menuitem"> +<a href="zookeeperAdmin.html">Administrator's Guide</a> +</div> +<div class="menuitem"> +<a href="zookeeperQuotas.html">Quota Guide</a> +</div> +<div class="menuitem"> +<a href="zookeeperJMX.html">JMX</a> +</div> +</div> +<div onclick="SwitchMenu('menu_1.4', 'skin/')" id="menu_1.4Title" class="menutitle">Contributor</div> +<div id="menu_1.4" class="menuitemgroup"> +<div class="menuitem"> +<a href="zookeeperInternals.html">ZooKeeper Internals</a> +</div> +</div> +<div onclick="SwitchMenu('menu_1.5', 'skin/')" id="menu_1.5Title" class="menutitle">Miscellaneous</div> +<div id="menu_1.5" class="menuitemgroup"> +<div class="menuitem"> +<a href="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a> +</div> +<div class="menuitem"> +<a href="http://wiki.apache.org/hadoop/ZooKeeper/FAQ">FAQ</a> +</div> +<div class="menuitem"> +<a href="http://hadoop.apache.org/zookeeper/mailing_lists.html">Mailing Lists</a> +</div> +</div> +<div id="credit"></div> +<div id="roundbottom"> +<img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div> +<!--+ + |alternative credits + +--> +<div id="credit2"></div> +</div> +<!--+ + |end Menu + +--> +<!--+ + |start content + +--> +<div id="content"> +<div title="Portable Document Format" class="pdflink"> +<a class="dida" href="recipes.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br> + PDF</a> +</div> +<h1>ZooKeeper Recipes and Solutions</h1> +<div id="minitoc-area"> +<ul class="minitoc"> +<li> +<a href="#ch_recipes">A Guide to Creating Higher-level Constructs with ZooKeeper</a> +<ul class="minitoc"> +<li> +<a href="#sc_outOfTheBox">Out of the Box Applications: Name Service, Configuration, Group + Membership</a> +</li> +<li> +<a href="#sc_recipes_eventHandles">Barriers</a> +<ul class="minitoc"> +<li> +<a href="#sc_doubleBarriers">Double Barriers</a> +</li> +</ul> +</li> +<li> +<a href="#sc_recipes_Queues">Queues</a> +<ul class="minitoc"> +<li> +<a href="#sc_recipes_priorityQueues">Priority Queues</a> +</li> +</ul> +</li> +<li> +<a href="#sc_recipes_Locks">Locks</a> +<ul class="minitoc"> +<li> +<a href="#Shared+Locks">Shared Locks</a> +</li> +<li> +<a href="#sc_recoverableSharedLocks">Recoverable Shared Locks</a> +</li> +</ul> +</li> +<li> +<a href="#sc_recipes_twoPhasedCommit">Two-phased Commit</a> +</li> +<li> +<a href="#sc_leaderElection">Leader Election</a> +</li> +</ul> +</li> +</ul> +</div> + + + + + +<a name="N10009"></a><a name="ch_recipes"></a> +<h2 class="h3">A Guide to Creating Higher-level Constructs with ZooKeeper</h2> +<div class="section"> +<p>In this article, you'll find guidelines for using + ZooKeeper to implement higher order functions. All of them are conventions + implemented at the client and do not require special support from + ZooKeeper. Hopfully the community will capture these conventions in client-side libraries + to ease their use and to encourage standardization.</p> +<p>One of the most interesting things about ZooKeeper is that even + though ZooKeeper uses <em>asynchronous</em> notifications, you + can use it to build <em>synchronous</em> consistency + primitives, such as queues and locks. As you will see, this is possible + because ZooKeeper imposes an overall order on updates, and has mechanisms + to expose this ordering.</p> +<p>Note that the recipes below attempt to employ best practices. In + particular, they avoid polling, timers or anything else that would result + in a "herd effect", causing bursts of traffic and limiting + scalability.</p> +<p>There are many useful functions that can be imagined that aren't + included here - revocable read-write priority locks, as just one example. + And some of the constructs mentioned here - locks, in particular - + illustrate certain points, even though you may find other constructs, such + as event handles or queues, a more practical means of performing the same + function. In general, the examples in this section are designed to + stimulate thought.</p> +<a name="N10021"></a><a name="sc_outOfTheBox"></a> +<h3 class="h4">Out of the Box Applications: Name Service, Configuration, Group + Membership</h3> +<p>Name service and configuration are two of the primary applications + of ZooKeeper. These two functions are provided directly by the ZooKeeper + API.</p> +<p>Another function directly provided by ZooKeeper is <em>group + membership</em>. The group is represented by a node. Members of the + group create ephemeral nodes under the group node. Nodes of the members + that fail abnormally will be removed automatically when ZooKeeper detects + the failure.</p> +<a name="N10031"></a><a name="sc_recipes_eventHandles"></a> +<h3 class="h4">Barriers</h3> +<p>Distributed systems use <em>barriers</em> + to block processing of a set of nodes until a condition is met + at which time all the nodes are allowed to proceed. Barriers are + implemented in ZooKeeper by designating a barrier node. The + barrier is in place if the barrier node exists. Here's the + pseudo code:</p> +<ol> + +<li> + +<p>Client calls the ZooKeeper API's <strong>exists()</strong> function on the barrier node, with + <em>watch</em> set to true.</p> + +</li> + + +<li> + +<p>If <strong>exists()</strong> returns false, the + barrier is gone and the client proceeds</p> + +</li> + + +<li> + +<p>Else, if <strong>exists()</strong> returns true, + the clients wait for a watch event from ZooKeeper for the barrier + node.</p> + +</li> + + +<li> + +<p>When the watch event is triggered, the client reissues the + <strong>exists( )</strong> call, again waiting until + the barrier node is removed.</p> + +</li> + +</ol> +<a name="N10067"></a><a name="sc_doubleBarriers"></a> +<h4>Double Barriers</h4> +<p>Double barriers enable clients to synchronize the beginning and + the end of a computation. When enough processes have joined the barrier, + processes start their computation and leave the barrier once they have + finished. This recipe shows how to use a ZooKeeper node as a + barrier.</p> +<p>The pseudo code in this recipe represents the barrier node as + <em>b</em>. Every client process <em>p</em> + registers with the barrier node on entry and unregisters when it is + ready to leave. A node registers with the barrier node via the <strong>Enter</strong> procedure below, it waits until + <em>x</em> client process register before proceeding with + the computation. (The <em>x</em> here is up to you to + determine for your system.)</p> +<table class="ForrestTable" cellspacing="1" cellpadding="4"> + + +<tr> + +<td><strong>Enter</strong></td> + + <td><strong>Leave</strong></td> + +</tr> + + +<tr> + +<td> +<ol> + +<li> + +<p>Create a name <em><em>n</em> = + <em>b</em>+“/”+<em>p</em></em> +</p> + +</li> + + +<li> + +<p>Set watch: <strong>exists(<em>b</em> + ‘‘/ready’’, + true)</strong> +</p> + +</li> + + +<li> + +<p>Create child: <strong>create( + <em>n</em>, EPHEMERAL)</strong> +</p> + +</li> + + +<li> + +<p> +<strong>L = getChildren(b, + false)</strong> +</p> + +</li> + + +<li> + +<p>if fewer children in L than<em> + x</em>, wait for watch event</p> + +</li> + + +<li> + +<p>else <strong>create(b + ‘‘/ready’’, + REGULAR)</strong> +</p> + +</li> + +</ol> +</td> + + <td> +<ol> + +<li> + +<p> +<strong>L = getChildren(b, + false)</strong> +</p> + +</li> + + +<li> + +<p>if no children, exit</p> + +</li> + + +<li> + +<p>if <em>p</em> is only process node in + L, delete(n) and exit</p> + +</li> + + +<li> + +<p>if <em>p</em> is the lowest process + node in L, wait on highest process node in P</p> + +</li> + + +<li> + +<p>else <strong>delete(<em>n</em>) </strong>if + still exists and wait on lowest process node in L</p> + +</li> + + +<li> + +<p>goto 1</p> + +</li> + +</ol> +</td> + +</tr> + + +</table> +<p>On entering, all processes watch on a ready node and + create an ephemeral node as a child of the barrier node. Each process + but the last enters the barrier and waits for the ready node to appear + at line 5. The process that creates the xth node, the last process, will + see x nodes in the list of children and create the ready node, waking up + the other processes. Note that waiting processes wake up only when it is + time to exit, so waiting is efficient. + </p> +<p>On exit, you can't use a flag such as <em>ready</em> + because you are watching for process nodes to go away. By using + ephemeral nodes, processes that fail after the barrier has been entered + do not prevent correct processes from finishing. When processes are + ready to leave, they need to delete their process nodes and wait for all + other processes to do the same.</p> +<p>Processes exit when there are no process nodes left as children of + <em>b</em>. However, as an efficiency, you can use the + lowest process node as the ready flag. All other processes that are + ready to exit watch for the lowest existing process node to go away, and + the owner of the lowest process watches for any other process node + (picking the highest for simplicity) to go away. This means that only a + single process wakes up on each node deletion except for the last node, + which wakes up everyone when it is removed.</p> +<a name="N1011A"></a><a name="sc_recipes_Queues"></a> +<h3 class="h4">Queues</h3> +<p>Distributed queues are a common data structure. To implement a + distributed queue in ZooKeeper, first designate a znode to hold the queue, + the queue node. The distributed clients put something into the queue by + calling create() with a pathname ending in "queue-", with the + <em>sequence</em> and <em>ephemeral</em> flags in + the create() call set to true. Because the <em>sequence</em> + flag is set, the new pathnames will have the form + _path-to-queue-node_/queue-X, where X is a monotonic increasing number. A + client that wants to be remove from the queue calls ZooKeeper's <strong>getChildren( )</strong> function, with + <em>watch</em> set to true on the queue node, and begins + processing nodes with the lowest number. The client does not need to issue + another <strong>getChildren( )</strong> until it exhausts + the list obtained from the first <strong>getChildren( + )</strong> call. If there are are no children in the queue node, the + reader waits for a watch notification to check to queue again.</p> +<a name="N10138"></a><a name="sc_recipes_priorityQueues"></a> +<h4>Priority Queues</h4> +<p>To implement a priority queue, you need only make two simple + changes to the generic <a href="#sc_recipes_Queues">queue + recipe</a> . First, to add to a queue, the pathname ends with + "queue-YY" where YY is the priority of the element with lower numbers + representing higher priority (just like UNIX). Second, when removing + from the queue a client uses an up-to-date children list meaning that + the client will invalidate previously obtained children lists if a watch + notification triggers for the queue node.</p> +<a name="N10147"></a><a name="sc_recipes_Locks"></a> +<h3 class="h4">Locks</h3> +<p>Fully distributed locks that are globally synchronous, meaning at + any snapshot in time no two clients think they hold the same lock. These + can be implemented using ZooKeeeper. As with priority queues, first define + a lock node.</p> +<p>Clients wishing to obtain a lock do the following:</p> +<ol> + +<li> + +<p>Call <strong>create( )</strong> with a pathname + of "_locknode_/lock-" and the <em>sequence</em> and + <em>ephemeral</em> flags set.</p> + +</li> + + +<li> + +<p>Call <strong>getChildren( )</strong> on the lock + node <em>without</em> setting the watch flag (this is + important to avoid the herd effect).</p> + +</li> + + +<li> + +<p>If the pathname created in step <strong>1</strong> has the lowest sequence number suffix, the + client has the lock and the client exits the protocol.</p> + +</li> + + +<li> + +<p>The client calls <strong>exists( )</strong> with + the watch flag set on the path in the lock directory with the next + lowest sequence number.</p> + +</li> + + +<li> + +<p>if <strong>exists( )</strong> returns false, go + to step <strong>2</strong>. Otherwise, wait for a + notification for the pathname from the previous step before going to + step <strong>2</strong>.</p> + +</li> + +</ol> +<p>The unlock protocol is very simple: clients wishing to release a + lock simply delete the node they created in step 1.</p> +<p>Here are a few things to notice:</p> +<ul> + +<li> + +<p>The removal of a node will only cause one client to wake up + since each node is watched by exactly one client. In this way, you + avoid the herd effect.</p> + +</li> + +</ul> +<ul> + +<li> + +<p>There is no polling or timeouts.</p> + +</li> + +</ul> +<ul> + +<li> + +<p>Because of the way you implement locking, it is easy to see the + amount of lock contention, break locks, debug locking problems, + etc.</p> + +</li> + +</ul> +<a name="N101B3"></a><a name="Shared+Locks"></a> +<h4>Shared Locks</h4> +<p>You can implement shared locks by with a few changes to the lock + protocol:</p> +<table class="ForrestTable" cellspacing="1" cellpadding="4"> + + +<tr> + +<td><strong>Obtaining a read + lock:</strong></td> + + <td><strong>Obtaining a write + lock:</strong></td> + +</tr> + + +<tr> + +<td> +<ol> + +<li> + +<p>Call <strong>create( )</strong> to + create a node with pathname + "<span class="codefrag filename">_locknode_/read-</span>". This is the + lock node use later in the protocol. Make sure to set both + the <em>sequence</em> and + <em>ephemeral</em> flags.</p> + +</li> + + +<li> + +<p>Call <strong>getChildren( )</strong> + on the lock node <em>without</em> setting the + <em>watch</em> flag - this is important, as it + avoids the herd effect.</p> + +</li> + + +<li> + +<p>If there are no children with a pathname starting + with "<span class="codefrag filename">write-</span>" and having a lower + sequence number than the node created in step <strong>1</strong>, the client has the lock and can + exit the protocol. </p> + +</li> + + +<li> + +<p>Otherwise, call <strong>exists( + )</strong>, with <em>watch</em> flag, set on + the node in lock directory with pathname staring with + "<span class="codefrag filename">write-</span>" having the next lowest + sequence number.</p> + +</li> + + +<li> + +<p>If <strong>exists( )</strong> + returns <em>false</em>, goto step <strong>2</strong>.</p> + +</li> + + +<li> + +<p>Otherwise, wait for a notification for the pathname + from the previous step before going to step <strong>2</strong> +</p> + +</li> + +</ol> +</td> + + <td> +<ol> + +<li> + +<p>Call <strong>create( )</strong> to + create a node with pathname + "<span class="codefrag filename">_locknode_/write-</span>". This is the + lock node spoken of later in the protocol. Make sure to + set both <em>sequence</em> and + <em>ephemeral</em> flags.</p> + +</li> + + +<li> + +<p>Call <strong>getChildren( ) + </strong> on the lock node <em>without</em> + setting the <em>watch</em> flag - this is + important, as it avoids the herd effect.</p> + +</li> + + +<li> + +<p>If there are no children with a lower sequence + number than the node created in step <strong>1</strong>, the client has the lock and the + client exits the protocol.</p> + +</li> + + +<li> + +<p>Call <strong>exists( ),</strong> + with <em>watch</em> flag set, on the node with + the pathname that has the next lowest sequence + number.</p> + +</li> + + +<li> + +<p>If <strong>exists( )</strong> + returns <em>false</em>, goto step <strong>2</strong>. Otherwise, wait for a + notification for the pathname from the previous step + before going to step <strong>2</strong>.</p> + +</li> + +</ol> +</td> + +</tr> + + +</table> +<div class="note"> +<div class="label">Note</div> +<div class="content"> + +<p>It might appear that this recipe creates a herd effect: + when there is a large group of clients waiting for a read + lock, and all getting notified more or less simultaneously + when the "<span class="codefrag filename">write-</span>" node with the lowest + sequence number is deleted. In fact. that's valid behavior: + as all those waiting reader clients should be released since + they have the lock. The herd effect refers to releasing a + "herd" when in fact only a single or a small number of + machines can proceed. + </p> + +</div> +</div> +<a name="N1027F"></a><a name="sc_recoverableSharedLocks"></a> +<h4>Recoverable Shared Locks</h4> +<p>With minor modifications to the Shared Lock protocol, you make + shared locks revocable by modifying the shared lock protocol:</p> +<p>In step <strong>1</strong>, of both obtain reader + and writer lock protocols, call <strong>getData( + )</strong> with <em>watch</em> set, immediately after the + call to <strong>create( )</strong>. If the client + subsequently receives notification for the node it created in step + <strong>1</strong>, it does another <strong>getData( )</strong> on that node, with + <em>watch</em> set and looks for the string "unlock", which + signals to the client that it must release the lock. This is because, + according to this shared lock protocol, you can request the client with + the lock give up the lock by calling <strong>setData() + </strong> on the lock node, writing "unlock" to that node.</p> +<p>Note that this protocol requires the lock holder to consent to + releasing the lock. Such consent is important, especially if the lock + holder needs to do some processing before releasing the lock. Of course + you can always implement <em>Revocable Shared Locks with Freaking + Laser Beams</em> by stipulating in your protocol that the revoker + is allowed to delete the lock node if after some length of time the lock + isn't deleted by the lock holder.</p> +<a name="N102AB"></a><a name="sc_recipes_twoPhasedCommit"></a> +<h3 class="h4">Two-phased Commit</h3> +<p>A two-phase commit protocol is an algorithm that lets all clients in + a distributed system agree either to commit a transaction or abort.</p> +<p>In ZooKeeper, you can implement a two-phased commit by having a + coordinator create a transaction node, say "/app/Tx", and one child node + per participating site, say "/app/Tx/s_i". When coordinator creates the + child node, it leaves the content undefined. Once each site involved in + the transaction receives the transaction from the coordinator, the site + reads each child node and sets a watch. Each site then processes the query + and votes "commit" or "abort" by writing to its respective node. Once the + write completes, the other sites are notified, and as soon as all sites + have all votes, they can decide either "abort" or "commit". Note that a + node can decide "abort" earlier if some site votes for "abort".</p> +<p>An interesting aspect of this implementation is that the only role + of the coordinator is to decide upon the group of sites, to create the + ZooKeeper nodes, and to propagate the transaction to the corresponding + sites. In fact, even propagating the transaction can be done through + ZooKeeper by writing it in the transaction node.</p> +<p>There are two important drawbacks of the approach described above. + One is the message complexity, which is O(n²). The second is the + impossibility of detecting failures of sites through ephemeral nodes. To + detect the failure of a site using ephemeral nodes, it is necessary that + the site create the node.</p> +<p>To solve the first problem, you can have only the coordinator + notified of changes to the transaction nodes, and then notify the sites + once coordinator reaches a decision. Note that this approach is scalable, + but it's is slower too, as it requires all communication to go through the + coordinator.</p> +<p>To address the second problem, you can have the coordinator + propagate the transaction to the sites, and have each site creating its + own ephemeral node.</p> +<a name="N102C4"></a><a name="sc_leaderElection"></a> +<h3 class="h4">Leader Election</h3> +<p>A simple way of doing leader election with ZooKeeper is to use the + <strong>SEQUENCE|EPHEMERAL</strong> flags when creating + znodes that represent "proposals" of clients. The idea is to have a znode, + say "/election", such that each znode creates a child znode "/election/n_" + with both flags SEQUENCE|EPHEMERAL. With the sequence flag, ZooKeeper + automatically appends a sequence number that is greater that any one + previously appended to a child of "/election". The process that created + the znode with the smallest appended sequence number is the leader. + </p> +<p>That's not all, though. It is important to watch for failures of the + leader, so that a new client arises as the new leader in the case the + current leader fails. A trivial solution is to have all application + processes watching upon the current smallest znode, and checking if they + are the new leader when the smallest znode goes away (note that the + smallest znode will go away if the leader fails because the node is + ephemeral). But this causes a herd effect: upon of failure of the current + leader, all other processes receive a notification, and execute + getChildren on "/election" to obtain the current list of children of + "/election". If the number of clients is large, it causes a spike on the + number of operations that ZooKeeper servers have to process. To avoid the + herd effect, it is sufficient to watch for the next znode down on the + sequence of znodes. If a client receives a notification that the znode it + is watching is gone, then it becomes the new leader in the case that there + is no smaller znode. Note that this avoids the herd effect by not having + all clients watching the same znode. </p> +<p>Here's the pseudo code:</p> +<p>Let ELECTION be a path of choice of the application. To volunteer to + be a leader: </p> +<ol> + +<li> + +<p>Create znode z with path "ELECTION/n_" with both SEQUENCE and + EPHEMERAL flags;</p> + +</li> + + +<li> + +<p>Let C be the children of "ELECTION", and i be the sequence + number of z;</p> + +</li> + + +<li> + +<p>Watch for changes on "ELECTION/n_j", where j is the smallest + sequence number such that j < i and n_j is a znode in C;</p> + +</li> + +</ol> +<p>Upon receiving a notification of znode deletion: </p> +<ol> + +<li> + +<p>Let C be the new set of children of ELECTION; </p> + +</li> + + +<li> + +<p>If z is the smallest node in C, then execute leader + procedure;</p> + +</li> + + +<li> + +<p>Otherwise, watch for changes on "ELECTION/n_j", where j is the + smallest sequence number such that j < i and n_j is a znode in C; + </p> + +</li> + +</ol> +<p>Note that the znode having no preceding znode on the list of + children does not imply that the creator of this znode is aware that it is + the current leader. Applications may consider creating a separate to znode + to acknowledge that the leader has executed the leader procedure. </p> +</div> + +<p align="right"> +<font size="-2"></font> +</p> +</div> +<!--+ + |end content + +--> +<div class="clearboth"> </div> +</div> +<div id="footer"> +<!--+ + |start bottomstrip + +--> +<div class="lastmodified"> +<script type="text/javascript"><!-- +document.write("Last Published: " + document.lastModified); +// --></script> +</div> +<div class="copyright"> + Copyright © + 2008 <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a> +</div> +<!--+ + |end bottomstrip + +--> +</div> +</body> +</html>