You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by ph...@apache.org on 2017/12/01 17:59:45 UTC

[25/55] [abbrv] [partial] zookeeper git commit: Add the historical documentation.

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/b38021bc/content/doc/r3.1.2/javaExample.pdf
----------------------------------------------------------------------
diff --git a/content/doc/r3.1.2/javaExample.pdf b/content/doc/r3.1.2/javaExample.pdf
new file mode 100644
index 0000000..21b9dd8
--- /dev/null
+++ b/content/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....@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\...@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(...@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[<JD...@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/...@-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;...@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%...@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/b38021bc/content/doc/r3.1.2/linkmap.html
----------------------------------------------------------------------
diff --git a/content/doc/r3.1.2/linkmap.html b/content/doc/r3.1.2/linkmap.html
new file mode 100644
index 0000000..7b35d15
--- /dev/null
+++ b/content/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> &gt; <a href="http://hadoop.apache.org/">Hadoop</a> &gt; <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">&nbsp; 
+                    <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">
+
+             &nbsp;
+           </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 &amp; 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>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>site</em>
+</li>
+<ul>
+
+  
+<ul>
+<li>
+<a>Overview</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>docs</em>
+</li>
+<ul> 
+    
+<ul>
+<li>
+<a href="index.html">Welcome</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>welcome</em>
+</li>
+</ul>
+    
+<ul>
+<li>
+<a href="zookeeperOver.html">Overview</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>overview</em>
+</li>
+</ul>
+    
+<ul>
+<li>
+<a href="zookeeperStarted.html">Getting Started</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>started</em>
+</li>
+</ul>
+    
+<ul>
+<li>
+<a href="releasenotes.html">Release Notes</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>relnotes</em>
+</li>
+</ul>
+  
+</ul>
+</ul>
+  
+  
+<ul>
+<li>
+<a>Developer</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>docs</em>
+</li>
+<ul>
+    
+<ul>
+<li>
+<a href="api/index.html">API Docs</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>api</em>
+</li>
+</ul>
+    
+<ul>
+<li>
+<a href="zookeeperProgrammers.html">Programmer's Guide</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>program</em>
+</li>
+</ul>
+    
+<ul>
+<li>
+<a href="javaExample.html">Java Example</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>javaEx</em>
+</li>
+</ul>
+    
+<ul>
+<li>
+<a href="zookeeperTutorial.html">Barrier and Queue Tutorial</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>barTutor</em>
+</li>
+</ul>
+    
+<ul>
+<li>
+<a href="recipes.html">Recipes</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>recipes</em>
+</li>
+</ul>
+  
+</ul>
+</ul>
+  
+  
+<ul>
+<li>
+<a>Admin &amp; Ops</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>docs</em>
+</li>
+<ul>
+      
+<ul>
+<li>
+<a href="zookeeperAdmin.html">Administrator's Guide</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>admin</em>
+</li>
+</ul>
+      
+<ul>
+<li>
+<a href="zookeeperQuotas.html">Quota Guide</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>quota</em>
+</li>
+</ul>
+      
+<ul>
+<li>
+<a href="zookeeperJMX.html">JMX</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>jmx</em>
+</li>
+</ul>
+  
+</ul>
+</ul>
+  
+  
+<ul>
+<li>
+<a>Contributor</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>docs</em>
+</li>
+<ul>
+      
+<ul>
+<li>
+<a href="zookeeperInternals.html">ZooKeeper Internals</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>internals</em>
+</li>
+</ul>
+  
+</ul>
+</ul>
+  
+  
+<ul>
+<li>
+<a>Miscellaneous</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>docs</em>
+</li>
+<ul>
+    
+<ul>
+<li>
+<a href="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>wiki</em>
+</li>
+</ul>
+    
+<ul>
+<li>
+<a href="http://wiki.apache.org/hadoop/ZooKeeper/FAQ">FAQ</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>faq</em>
+</li>
+</ul>
+    
+<ul>
+<li>
+<a href="http://hadoop.apache.org/zookeeper/mailing_lists.html">Mailing Lists</a>&nbsp;&nbsp;___________________&nbsp;&nbsp;<em>lists</em>
+</li>
+</ul>
+    
+  
+</ul>
+</ul>
+  
+  
+
+  
+ 
+
+</ul>
+</ul>
+</div>
+<!--+
+    |end content
+    +-->
+<div class="clearboth">&nbsp;</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 &copy;
+         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/b38021bc/content/doc/r3.1.2/linkmap.pdf
----------------------------------------------------------------------
diff --git a/content/doc/r3.1.2/linkmap.pdf b/content/doc/r3.1.2/linkmap.pdf
new file mode 100644
index 0000000..2e55584
--- /dev/null
+++ b/content/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<QZ...@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/b38021bc/content/doc/r3.1.2/recipes.html
----------------------------------------------------------------------
diff --git a/content/doc/r3.1.2/recipes.html b/content/doc/r3.1.2/recipes.html
new file mode 100644
index 0000000..5d7eee7
--- /dev/null
+++ b/content/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> &gt; <a href="http://hadoop.apache.org/">Hadoop</a> &gt; <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">&nbsp; 
+                    <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">
+
+             &nbsp;
+           </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 &amp; 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>+&ldquo;/&rdquo;+<em>p</em></em>
+</p>
+                  
+</li>
+
+                  
+<li>
+                    
+<p>Set watch: <strong>exists(<em>b</em> + &lsquo;&lsquo;/ready&rsquo;&rsquo;,
+                        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 + &lsquo;&lsquo;/ready&rsquo;&rsquo;,
+                        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&sup2;). 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 &lt; 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 &lt; 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">&nbsp;</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 &copy;
+         2008 <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a>
+</div>
+<!--+
+    |end bottomstrip
+    +-->
+</div>
+</body>
+</html>