From 20d7f118eaea23168059277259bb72209e99a5da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E4=BA=BA=E9=B1=BC?= <1823748191@qq.com> Date: Mon, 9 Dec 2024 23:43:48 +0800 Subject: [PATCH] update doc and fix bug --- db/db_impl.cc | 23 +-- test/test.cpp | 25 ++- 设计文档.assets/lock_for_GC.png | Bin 0 -> 40815 bytes 设计文档.md | 314 +++++++++++++++++++++--------------- 4 files changed, 204 insertions(+), 158 deletions(-) create mode 100644 设计文档.assets/lock_for_GC.png diff --git a/db/db_impl.cc b/db/db_impl.cc index ba5ef9e..99b98d6 100644 --- a/db/db_impl.cc +++ b/db/db_impl.cc @@ -820,7 +820,7 @@ void DBImpl::BackgroundCompaction() { CleanupCompaction(compact); c->ReleaseInputs(); RemoveObsoleteFiles(); - MaybeScheduleGarbageCollect(); + //MaybeScheduleGarbageCollect(); } delete c; @@ -1354,17 +1354,17 @@ Status DBImpl::Write(const WriteOptions& options, WriteBatch* updates) { while (true) { Writer* ready = writers_.front(); writers_.pop_front(); - //if (ready != &w) { - ready->status = status; - ready->done = true; - ready->cv.SignalAll(); - //} + if (ready != &w) { + ready->status = status; + ready->done = true; + ready->cv.Signal(); + } if (ready == last_writer) break; } // Notify new head of write queue if (!writers_.empty()) { - writers_.front()->cv.SignalAll(); + writers_.front()->cv.Signal(); } return status; @@ -1857,14 +1857,7 @@ void DBImpl::GarbageCollect() { valuelog_finding_key=key; spj_mutex_.Unlock(); //wait for current writer queue to do all their thing - mutex_.Lock(); - if(writers_.size()>0){ - auto last_writer=writers_.back(); - while(!last_writer->done){ - last_writer->cv.Wait(); - } - } - mutex_.Unlock(); + Write(leveldb::WriteOptions(), nullptr); auto option=leveldb::ReadOptions(); option.find_value_log_for_gc = true; diff --git a/test/test.cpp b/test/test.cpp index 7b1e506..b0d17c3 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -37,7 +37,6 @@ TEST(Test, CheckGetFields) { db->Put(WriteOptions(), key1, value1); - // 璇诲彇骞跺弽搴忓垪鍖? std::string value_ret; FieldArray res1; @@ -101,23 +100,23 @@ TEST(Test, LARGE_DATA_COMPACT_TEST) { for(int i=0;i<500000;i++){ std::string key=std::to_string(i); std::string value; - for(int j=0;j<1000;j++){ + for(int j=0;j<5000;j++){ value+=std::to_string(i); } values.push_back(value); db->Put(writeOptions,key,value); } - // for(int i=0;i<500000;i++){ - // std::string key=std::to_string(i); - // std::string value; - // Status s=db->Get(readOptions,key,&value); - // assert(s.ok()); - // if(values[i]!=value){ - // std::cout<Get(readOptions,key,&value); + assert(s.ok()); + if(values[i]!=value){ + std::cout<d3CUTcASoiCygrifs z1f=AD&F6XF@BM!NZ$H6p-1l`~b)M&O9_MjAf*WelQnOG)AP`y|Z4DC$gp>e&SSinf zZ{#yf*uZ}z7!xfuNNF$I5(Gk78=z?wfDUp;qTC?766*iF;}sY6@WBM|N@(zki)*6X zTmt-kyun-WJ=(_=>5g=B{pWAuqT-T5V&X!ga%N%@yb`LSqTrX5n6RvvoXtPiJ0aY> z|82;?Cj^N?Iq{0aq=ZF5Q`an!-mX4440vm327ZZ&g0Cgiz&r2bMf*a-s0--gcC;kfXl@} zhlGipSNHJuL4%86Vq%iQqQX)#5>mqAvU1=r|7VaeaVc=M82HZA$=%5x`9F^%HsKcF zg!p&tM&hnwo<2et34If5e{Hy~oTd9eW5&AqV~}9N{!ZV29!|VDAlTRKpKo2=ut*os z6LDS%O)%}QNGF896B=CN?F2gb_eNe#8D3R&;y*Ao;D=XJj#pKTS54}lhamr50&^`R zBUv#aOJ6k?F=sPN*$}fJa0jtn84F(%7hZ8S1GFYwQq0@m8jiKmR>cL_cuEGEnYsq( zx{3Rngao@97e8c2?Gg4kgBYPn5Hh+G%%EwiIu5$h_*h?+{9N}JJ3Qk zAW+&>PE$QdG(g|dLq`^6qm8pbAe{`YE!B`ghNh-!P6im9l(>wk4BT1I3pC+sZeSv7 zY$~B@Es1e5cXu-NM4J2iXd=ak9Z{8rnOJE{*qB)P$~lPziHRYxy4FF#!Di+Ln)>3d zxF8cRGaE~^oRtks6Jg=*VeTU(<1Vcs=4Pqq;;W|*M`+5r%j(HVh>6PSf@f)CW#Rsy zU6{0mbf7E-E@6oY@b*?Sk;a*s8LFGOh8)4t<^2PY{UYB zb-YnlR4IvlC1@KwlT>rR@dm)B}g~)^b7l1c4sBrPmzE6ib2Bs`_D;e}6RD|>Ge+SIf{py8A zBcUb(z6C3)<}EH0EGJ=Y?&gMpdpSADsj17Uqtz@B)^bQGD<4f4F;8hdEgfK^u)qL! zFPMg=6-pf`2D6b0@w9R>boTZ1C+=EP7g-Z&QBMpq*jx)8fQ0+N#q>obfxCnGnwh(* zVKx1=P|~_^NhvQ`;((-m{Urhsh6qEKKrLcFP+}MtNm+5LKsQ5iag2+oCfr*}TnqS8 zH9u2*bbuNHYviJa7DtE&V3Bg#L2}YAXlaDAwiUuk6Qw2R30gD`1m+Ku6_Y_D+}!nj zqXr%5Tp=YeGZ{_cz=^X$MHWu{|_YKievvh^q7?_&|`I&p!IC(p{=*Wti8skjN z&`5JVw2leN8SE8*OF1VUbu$Awahxw&%UaveFTmN&+R(+xI@r_I&BWha)m1`A(_0+) zC73wIRZ87k))n}4n1zOyq_jzhx2lmh5@(|-i<4HBLb_-KYseaT8L684%E8oN2yp{1 ztpH{ZTqQ>IFj6|ER#-_55F5dV z|AfcCu@Zd#7o|vO4rYi=Lm-?G9Sv2pAcxglsvxuP2kny(C#tLD{2!Z5NUUSZ(0TnUDfP?9$ck&6ms}}Gp1rMzRylJKKF4^C6sqy|oDE~lfW;_j#RVbxt5o+O zR8glp28%D!uS#GL3+p=*i>g=U_7x`g6&Aa1@63ON6! zz9B692Wf2FFLnR^{nXf)7^ujtCOf{XSEo&!ot=#jw&(l!`1qb)x5ckEpQEP!V-APE zqli2nMW*horju){oF^&87-WnQu6<~HCMFK$B!RwTkD`GH4Gs**FU-x2nG_r59>d~T zQhPps)-Ju(e6zIqPsq2I#$>Nvz0%gzRU55vGq$sPeCH17+`_`l+?Qn8@MGDEii&rk z`|HQK3b;!ga{fHEHdUUtf*U8QAmSvec>8Yw(d09+km2C4INXSb0R9t~Ga2#8(T`Nf zAmb*crW{~sx=SPFE(d8swiY!<>-EOZbyG8Fx_S`3IUhPWA|7{lcc1ebE)}|Q?V4hhB1ppaxR#6sH1kz0a>ef4b6K={IeRf#-#eX1avFY4=GE!N-rV|1MBh`Y@p@dD zZwEV$X<{j!UE!T`TgN<8XYzyBiad@O`{}Ktyf7(cVyXqX{)~&iBDl7 zB!jtE@gOY$lf!3OVpG+-IsNI)-qK))xPxBWjSugUgWKR0AJjNu43V~8pi$r>!7)zB za3wK%`H7_qb) zLUDBK?fbZhfP3U@8j&kws(0NkTMFRU#G$|Ll54koA?M@acYn3|M_8g2+gz)H}oM7j~QMm>wKD~$=547w#bM8{n zXCxQ4c}_B!gzRk2pVi7fLstX>x46WM<@TiblK!ey? zp4>lodFB!S({}?2FAu{H=F_+4l8rhWD_+?dicD*g^7u-DUDX?tK?O&3JWf2T9Z5bD zrvg^c{dDs52cNjl20$s=RB&Mb94KMU$Pwp*b`|uG4J}~8k{CxIsdotqm z#NMH7zgjF~x`byc2;3Xbp+-2PQjV^_`b-_%i{;^@pTeUF6HNh213U_c#Se`dLw2u^ zymR_=`NCMp*CJYeC|Ky3m!p%281zvBqY@9Wq>RX8-Ge_z8$Ju|kFlIKUwnPW>jGJ; zQ>+x1MjDsMYkCc|uE?;PpgMZs5^yMIln3Q!J(K2x9-k0z0=~pka$jNVse4b>{K=Y6 zgl&5|U#@J(FF6*_yMFkrk`0($FWxpR=-rm~)E29Ejnl$YrBIWxP4S{3l9Y75!NEbJ zh@-XYzD+BYl5ZouAHV~HkBgrTraKeh4U&eWJX4OO%#c4#m_-QgRb((I2NfV zgovJxGW{lVx9K=r0(%3!e@i|ek!BN90Ji1JMUv35(^I6A?CtOTfu%7>Z#o<7+Kryx z-aoYt(#VJ8t6;mbP07oI!%R@DeHlu?U&$u4+yiq*7rvN_Gs#)3Yr0bHHN5`o0WIqS zgsHg9&4!z#i^@0m=poqXBemM)=o`0e_`$QTMEz=QZOwg1$FAG(=Wr!=v9b3GhjKXE z?(%oR>({S8QQ{2^kT$~bI9>$X?P72##-;db8@@aYnF~zBiF__+eDP`M`UEf#`EJbY zSgw@UC5NEt`}Dzo@P3bxqr@#@xw9ZI<4p&;+L4w997T>+eqgSAphY;CH$O~w-q6*$ z=?ARa@oaJfv@Luk`|sGPMpA(1N{pJ8mvL_g_kBvW0Qa$Ja|#Kqy^+H#6ya9*vYw=8 zwRENmiUn;>DS>@;>B&_R{_|7v^fyE77Tdc~F=&^Xf$P8;cPQV#wJe)>{r2q*_o};( z?N1JOcj(yVzg<*$vGXAPN^)cZcvi-vmcY_e-De|1c>+RDz;q@?u1@EOyLC3+KK$jE zzrRq^;Q9snm`(0UXm!tr9tRq*YFDmY9}W(JCE@e`|)A50_*5|isi{=A&I4G)8(U|?@Kkb)3#+S}dzHW;|t z8X4_eE<(8rg$*7R%q1hUUo4+l#0(X^51xtbwp;vRjYR5{m)wUEz=o;GRA~U>vf^EuV?wn7;&FySsRLaYqAU`hK!4jmJ>{v{Y-` zDm`2qzLV-~tDN>;19V@76p2LEJKWy=eyiGh{72M;?d=yy`X!S`C!B#Zys%|sOtQbj=MO(`+CU$6b1ZZcB>0SCcm2E6=j zHk=fo@18_vt|;b=OjP@Dq>0>GKi};i$0|eD7`hL$v0*97PeUmq$7;k{d%^UDtzkDN z;(&LbDyg1O`}Ba;K=n&tDTjLu`owAg`gaRTz6M*+;!?$_1JQS1uGzVb`WDQ#6`RawP)d1C zNohR2XD_6YchtAAI^iYzl>D${^GE4|5xUrDS`a_RbU6hCkQ2YRW+`qStyX%|_P?un zVU#CaEZ8k_?HZG-6~ClDsXT*dXl`uc&9L8_7mJg~-Ahv6_2w!(ysG{nUn}8ClZXI8 zkMvB{7{_X;JSVm19WaQx{|o> z!uH3bmbBA1`@z|nqhO!Ncd1nujto8IE+KlwM3pMf?{rQ36QR34^*veYQYp7seI}d6 z_tjGDqL@WBJ@gjz$gAzPH%~xxy>W4@9=rCDj9xJ@H92{(B}&~WeKtDs;)c7aRT*l?M-g&@)CM2o2$Uxb4J~}cWZoGgvWr~-dm}hl zchudvu25AT0A850^UU+EbdhZOK4FHR54kC=YJ1s9uH8!p7XO&D4S$mjc^`y;Omg8{ zO<|+ZK6N+z{LgoFfh%dzYb_;wX|i^@#Z**HT9kR*SZ0Pp#>bIvD`T|k9|Nx(UE5X{ z$3A$k0z3em)WW?%4b5oWif>?GUUkz(VkU3zr#4t2_ZUQH-K72YE(?(e4hO%#NtnM` zin$HD<7~?j|6c8{^RU>Mr@^v3x`2lpUZVtW{CP4ie111G<6tQGva-*E(yFnyaBEa} z-#2$f0{TBI^zM_unW)gJs+`L40?pVbPkJq!76r~&Bq5rUpzr*1DN23XaJ$BlA7-e+ z%D4w=c0Kw6ODQzhs|Fu({oPbgA}=m($V1Hp40n$0s~;B~&4RlGoo!=AuZhTcDb)?q zIcKlfiTM!$)AoX@TAR)P`9ZGokIKl1-)6PTC`G;Gaw(1-1fBG`X6RtX#B-L%*Eczoy1 z9o3Nq+GBG(I$(@T~W{d?*!_TCg9e71ny<~ zG-a;p@0aWxK6`kj^A<1|21o?H_uQU7X%?jwzW46hsD(o$-PrX4;Vy5A@}9s_WcYow zMmhT>Mpj}V$xtZ_*@hU{Y*wHLF|o0+U2;-q57}>#zqMIRib3zz z9$FxX#%9Y6ma@Ev7kEVqsJ5OSVR!jW*&nd+hUk7xu%yeNf86W161utpFoCp}qGK5k z12f5+q1sF3`ZIVP$_1}=BPs&X}$0m!NXb8TT zv($9pK+hui^CJj&{G=Jq;Tx+-Bf{6N zMVcj<|H!a!iCIy69c-~|@ZZiNpr32j>sD?m`psxu1TMU3SjuZiac3MiIeyNu`k=8= z3mP2*pvb+EnqF@5O9gUm`0yLZN5ICOk%N5gG&eKTdM93C-PePBp|;VbgYG?QbX&vQ zd)=sKB~>X&WfefrDv3Gy;a*)my%@Am%E$w7?;3eKJ)5jAdG(Wf9PX!OX~m>W98FTT ziIF9gzPVm(bfuWMd`W5GFezhtKn$=m$XA{3Og&A?%e&S8-FTV7&fkCg03>vOs9RLo zyZgzhGIT)Z#|>8T|GIC?Kt)&HC{uiX;^ytc8ilV+1-2EgRIqrqgJ;7lCukb?AVDfC zSmcVLVo2%E=3_3jYB{@r7@mkg1*6gc*tBgUmHF^+_|{Z`V5EMvA!+-32tYhe4>DHl zPNh`JOO#D*0NVGx76o>7*+O?_aw%K&{8v#LKihbIR>h#rD`mr>u~*r@UZctY;8;=C z10Yr6HWRZ$rv7zPHp8z>5%blP;a%HnB(u0rv@&z-a{d~0C*yP7&z=wSz(Gc<_}LYp zYWGz5e<7!?%3i?D{V~iw5ivev{JF9B*1B@@<2e!EGW;J8WIq=X-`-sW_*VS?;9DI| zB{4C-MSzK+WgwGB!14=+fw$KJ*-Q+0v5<@u79z8_NCW{OfAbTQ%c^iu03SE6w*u0P zULMhBXafH3Wbk6{1w>t0-tgLwDuqU;PY>iE?MsN%H0_p4V4+VwwFG*vh82xSr-_t+ zlvy@~n7O%wR98l6tMxox94EH=R``M2<10!bK3MEtpG!6D9FL<*TRTsj2|?|v zQGaJf9CCacr0q3pctQ@dDviU&kE(NVEMIyVk6BvQne?|TpzkCA_%FqLTI6rTPe+5K zJu&hwm0~!U!|t(4gpqFQb#pd0m}_aC9OmrO(o%8r$sPd#IhL!aAI&0X(~4ZlSsDAP zqgRf;=DusK$`_iX>!t8Nxjz^#ul6en<;@RJA;cQo8N z+XG}_T6*#O0AaS$5_6;UqmAa~(Z7CcFP{UXm&YZx)!tpbz2RTi%EfO&;UEuK3=@rk zwBe0ik${3}F(;q1oA_^TX?f-a^$W`~hcm3wsNWw~cK-~Oh=~hBDK$Y)cRo>)ULe5W z&kcZsv4kd4`0Xt8_+VTf*oyzyXg>WTOpUfQv_E^11ke_gj^(fTz|~oz<%~qq=r}#{ z__dsp(#b^g@w|xn_~t-S1I@vIGG}#f_URk^#H^j<1dM2DX=lMk{Ha}F%EpICSMS)KppdNNTo2_2O)rSsvA)1 zYwPQWc`tu^^$1|Nsz-X3^}yEXh}%0P>?|_lPN6$giIb$H&JafERLvgra8I*sqcxh@{R? z(CA0o7_==7SuQa#W{esF2}AN5ixL~e@6BoRqhCov{X=&D4_;`NDwLOGnApU4BFkll zHoPASnF)BICaU-PdU~wk>tnSFp?j;DUjd+}#*O(soYugujznD)w6L?nqekb!{=B`u z8&XX2S+c6XEz;l0WYX_Ff!yp!Q7E<^8#fzIyQ&Lg}%3V6Pg>3O} zefP(4>Is;-`JB}RqwDHfu1g(T`*b>!sa*n(+Jo_uLsSOG%Tm)(`&hdJ&hg)rKp7caO31gHRl)AaKb zqo$@#%+8KY<~LF^JpZM$^W*w>{SGi9>#(`cNpqgxU*DeJ4H-U^7^z1y3gmJ|{pJO! zYqQHO&$$bP90uY*9ND8_kb&eUPv-hWK-`V6F*6G=aB^~*2RL!N%4^sVP$EC)0Zs66 zd%i2rKwn?c9L!O~%-{j}3IQXY1E0kdJlz<=d;AHU3<#%WbtJPOi`}iE(!&Qo* zm1G~e=S+yY3ri<%c%yu&$hg_|xKH<}&hv~&ht>A)y7WS3(_7pi-&};RM9`JSQlvj4 zrjt)1jXZqDY8Ziaw}ZU!>x(!KG_|)@JYOzf)F$~g{3i+jfO9cuEqabzqFZ5(61<0p zvYx5#f@Mx8wxoh9>~C@tf3?sg04E?uu6yyvg|T>MWqDoFeke%W({j|;3rDb@Rr>#0 z`*})%_X0KcN_#Z%fA6LEKlkpDOHzSn6B4-Dd7?b1?m-FWkY8s+C2VFJ`a*yU7)l^f z0$Vit7AYgRZvA)ewZ~)M$#u^YxGGL59c3e(A*pr-E%P6YQT1Vw%vZodqp37_!PC$R zPXiv47x3m^BE)>Ya#p2DI08nJalXWF0-;0_gI?)~yaGH+D@RnuJ?S&JV*@7GswXMe zOVi^_l%}g-<|+z;ERDZOcc*Y9{;sNfG+0kOSAOi*7gPA}83WAF=rolT`M_nAqW|1y zEl4<7enaP1UWi+P6l(T}XDAfCnzvqRj9Q6LISZCXoAVlp{e9^(G6)tb*(?>u=OfjS z_xnEV#^QuxNDv$Q{P*6D@g>0v1mWxtG!May;>l?k!HnYBedJ-J&nU^?TsWeDEJ0iq z9=YP@{RvOeG3ZiSBJIpcGET*G9Sk>+LxhEggqzCa)rF(-2>R+AZLZ=Z9_FRQFL(jG z!P(w*078hUMW5KNcOL9Dhho;{s%7!H>Jj};Hm9h5RY1E z3W*C3jg}x~RI-Y5p53Ov8;^LTlmFsl_`VnwJ1o+MpOARGN9+`5FQvw=qf|^%EXN4! zYN0*!YqE-d9)+-d^94dkujmghqED9PW*|PyLin~L>-|`)j*19rUD%Zx-xCwmiqt0$ zFlT>xT0rkK-TpoOaOE+F@&xu-tdUQ{R(sN23i=60g~gu?R5b~a!fLi3X2d@jl&>`% z^hW=k6-m;%n~uBNKiud&8{d7Uqhiu*N$exJT;dXgE_A=L25759l^h1qIaO96h099$ zg_k$7M1rs?XE(&JykS zZzo1RCB~>iopN?&5j+4WoOD%A696?zcNk91qPm|62>4p zAGP|G!Y8a70$YNSzIeOhJH=MB4hj~u*PD$<|N7aBB`z; zcUsAFRu~|04<$Z`lca~7CRjybRrL+?CDtdA22@NH@h)-SRrAO$5X$MKH-LX2_D4r$ zn4;?Lm3J_s*avQ%DNDwH^f3elk5{HvR#yE#>5$6ur1M?r%C`WM&MhY==LJZn_iQbH ze%`RgTo!C=?^XhN1Vf80WPq$;gfyQuay6r|en7~ZDDay8Hp;Zvl(_fSzcy@P~5)KdL6$=8q`_DF>npP`}E~|E#mC(L8F(V*77Od zBx#rJ1St}JyhoaP_2$UwTo{2BNVnrDH$L2@xQrUB*|Nf7u@aC;=E3B33m2Q_kkHw8 zePo4gc-I*ZZad!Lx1R+Oxfz=KAT>jS$W zBRJ7pd`b*aeA)>G2G4}Atr#hK^lAdEBJsFf;{e~kPFAA5T2GmAM27q5+5!WF_HLjKOr(-ba%Dwp$qIEf{lUgdiv)^?5&hAH~m~s_^E4Zo? zf5s2_->pb30%gg?bLY+pTCeK|&@o-FvEL46crzl5?!#BCsrRDNQSU2+H1_-jMHGfi za{HAow5+Kba#Ou;L-X{P+!tKGPBB$LhxNEa+&jOxra~PP0Ev2@PoE(hJ;!9<__)5M z7ns|8a8FkpITRYktCC|!(aP{)4f;&Tg*A30KA>}@f|h5%kc^-ZEZ)IVKc-v?xQ6iv z;5)I9y=A9FX`-#E@ROFT43*T+fLh@=EyEB0_P1<--#>1=8Cv#QuKu-K`t1^xbj+Hz zhuqteC}-P>dH)M`$`_&5w<<1uwD-4ZbBaT^rIp@Muy|(Q9Dc%WZEd~nJpI-;Dr@t0 z4Ej7Lp&<6U`Rf~i!gT<+T%p+Tsp7#ez%RQwkvGM8p1ZX~4m{ZyRCMN95hYq+JwKXe z_evX_E6Z8IySN}Yij@bS8Z2_gU{2AkHl<8pQSc$PxJh|Q_EfyN$I;!ou^PYGv6G|y zjs1|uMv^e}M6|>AWX3$NOApRBt<-d*LKUCx0{pk%07|sxU8#Z(WhR2i5)`+!{lH5L zvT?7Y{nFosq$c6MqPtwZ=@#LFEGT^M={aEd<$+hvJ=QaiGSP*ff3%dUIxB1*yYUVT z#K)LIePWLnrDCNMWA6DQd+rJDxpexj@VsxkJeidVia1Y$7nl#Kk2_x9s0MwJ&Zzxh zA1za!8@5(8+_c|9Mt|(t7IQK6I}t43*;^xAcBt{4rh;^#lsp6CL9BG3WZHt8oL+By z)a;yb|h*&7%*h?>MG`LgOXbgL!LN~)j)F@KUp2`aj8ZobTMU^H-7;QLTg_*IyZ zu$>O_W)@JWsTA)*w-)>q&;E}VU@_}UrDVnWj1FpeJ4n%%*dk6AaP8g zh95YTSx#tYF*57^6M_KjIDnfpmy5&;eza}6@-{0gM@z4~o;z&l`8lF z=mWyg8hLlfwKJE3C@l;O6hT$uW;lxZ3<(+VUzzA#4(=3PtmN!H z1PgQSgJUS3tPNlHtvW0020{B9mZzlA2|#wL=WaE$&>sU4pZD4Hd;M9rYTZ}NXRzht za#yc9eJA)d=YB0OJZ@nb{a$KcKbUuWZ*&n*`$8v+YB2Z6lD`O3niQs(qN@<4O5QJaiTPTlh@SaJECB^I4KM`XRD?#IrqM&ak{CG1>I{RPQw8* zyRx&`_i%Vc=%BuX`{izZcZ?Q&0xgsf1ekz~WGBkM;Bh>@nU9+1y*_OX2N-yl@??MKvtEdBnkUjYrf zL$)3x@2*x27M>=@cyc9VRJ0C~}i2XEfejo+;SqKM76rQxWyF1s^l7_WT>TvD>A!x~N;2 z9x0#V;$oR}XDN`(f4l8RtZM%RHqhS|ds%@Ae$yHkflLGdcZ+;x{aKM;YXOvw1$~rt zCI)?w#id3;!!&ii352#$Pp(N08SflLZXjq_IRA;ul~u-j_52*yYqE{Yerzb#N6~1; z7DBa;77W&YamH%(3-6w0E3mspjp&Ex2_PG92Z{UFLM{3{pMg_TBc=Pbn8gAxCA=rU zHYPd9DCll5ZVe>ZLDTy!a~`2TAlu~=LVB1I=cTzF3X72%d*fVq!57b;Hx2{B(H00{ zQrQ@zC|SFjUIQl5?#A`&%V$)AG0JL!D4;P=0YrW4xVp~yR8f9GkN1of*7+meKiM%LYIgbzZc&PZ#{q7#~GW{RPw$i2_V)S9O*8z1Puez#(gXjrpB+s)x4{YURF27_htnzCv**U{_;i z&!#F7xL$uh>T>gXd>q=7CFQh#&x=jQprI#YCep>xvM?LzQ9lQuK&L9*m2*U8LzZSHYmRhQ=F-AIoTw$j@_*FC1dK&tki+79W&kUaJ^$Z}qzCbdq<@@B-oXlP6CW8h3gXE&`nE&YGbV zx_4s)K&0V6Gcv(IQxXsGuxuvLNgm(j&3h&QaUd6^ZP_Qe>yhE>`@@wgjM>!Zl((`3 zCD%{DiiWDT;-goUNtx*KnIipCA9Pdyia5zA@1?buV05qTi5@;Srs*#nY~9;rk@9@} zqahfRYU|VZ-GZ|%laU*CLByfqH?f{e2B9PLs>%~J3zEd0vP}=?X#Se^d!B80G`#<$ z@bu^bHHCr^)Xk^niGgLs!c3)qDK7uCb96K*C!ypQH~w*H0rO9v$Po(-e2QNB0cXS< zuaFG8p<}zej9ZUKw|_QcSxH*CODmSB-~yG3MKJ*j?&iA66<(32K=9BXy3ox$YEm&+ z8a^Nb9Jm%k;==)1NV-|XoY!(h*W}tSsm9|`iu?x=Db$e9NYjcy74h+6*K-^qIOt|9 z`k?25YsJN+64#1KlA_uh{t~Ul0?xMWn(AqU$3bW*O}4A}H|B5f%a@yfYsU6u%M|nR zvxYpz3*W6ojfyLRdctMubLR+TBL%U>ETD=Utwp*G&!WtKyqpl`{pM6C0yjH+o$T6T zf&ufW zxrcd_Ei04NLbv1>`xcBSM9EZ|Mn8TqO#Zmmbngo)k95k9nM`7+HdmY=%-Xa$Jz|X- z-UNV=SY4QUp6)QvycZHAEmoZd%Of zZt^#OPV2_oy`Z8{_~=(}baf8}(lp`q(fBZEMuodsC_axwRM1~$Jouq~+n#~RTldYW z55rxx&kdWJ4i;G7dwyU31r%Iv0|vhSH+~V7Qvsw~*YIvW>&OV{(285GT}$VeyDm&K zEO~VKMVKJ{fXWaAelzbvErF z(N$ye(x{|ME^D2;w3rp1N^NznJ+H6UqO5)8-u{QB%W;5(KU zA7n6*fh<^nygP_88>)RTmj?2VvsLK<^+U?ryHb{ytCD6!ZG_*n;weMr28gPla|fRy z)0iH6e8S-4@;%3V?#{i>0wu1P!ESd7X8HO@YkPo@w%<8iDN83(TeO*I3+Be4tpeAY z9UzZ6F~(x?4YFVU`nivc(U#@xX|dybsIK5)UA&cjosy7HkEQPmKv%=#SCWMufF!4| z?3k!c&A;$u3y4-a_Fu(zMXv$5jT%%2HxbNVltFmHs~7ed#MCo^{cM3BSPz=U_?cH# zoXT9MpC=mfXpuf(Wm0PDqka+sZ|HomuAKk6Vw9r6q0FrR&ku$^d&h5v&h?1<)E6Bb zn!|4gA0+y%dF-&cQI_`LT5MGRW* z^bizGb{}~K$^`_D1}xob68UI_fBKTJHqpom>M7R*GE2?EF7!W5N{S+?V*q2pB#p}0 z*f7YJ-W`RimZUgeKH@rD1ZDp(D6Qm238_g#M*{e&CowN`OT8Y9u11d>#m82Bl3M-Y zRmNV89DFeca`Dj*9O}1&7BUer4xwvRK9!Y~n!X$o?=Lyz?xo`&Gx1?po`n@FIFurCjI~zhVK6L95@a z2w)_1yKBivr^T)TuHWd5eLc1rfY#S0P-%zKSEj`?_b)sAp8mBoC`1y*EaE3&2%>s4 zB`6T7px$VfP%eWAaE*B$?p&{v%x9_b21TE=#tTFwBCqCN;;-7Od~>$_5+eBE+eNF$SrrjABcCy{KG}SF(bhO)bO@6| zTjll_Tx}L5jdV<0FVCIY3KHL_TPallMOJo!FD%u=KdQX8jwVkXE~#2V-ppPiCj)fh zwK$>|;D3@}Bg=FV^-_so(~AH7e4?J7UzifVYzU8h(CaX|VWcFQltYi2#cW z@5X}h7?&`+SGruW%_9+P#q$dZp}l|{!rQJPs63~bWqr1c1TxwTh zAO+kcoHApJ0n4@a^4{H~s0RvhMeor(XU?1fOP5aRvWw(dJ`a2Ej-Q{`Egx(Q#pM~u zooG0ertCDOni^kF4q|zfRC(2z;Qn?edWfcSlrh2SGi&!Hf-<1TeuM&cp-c)nz*BiN zl%CT&^yi>2qSJb;xcO*Z;Z+LXeYPMX7yEa#Ch^*`8I1Y4M*G)U6A^O!vD!*ayML1NKQ_kybaQWH?&t2txmP=9Jg8@o&P<)5zgP{V{z%ig_^>G zgmdlpuO>#`CwdrLCWmkKUYF>M_Ziyau)UYwd@@E%7g7#x+Frxcs!G+SU%R$mlRmY{>5fMxAYwWGZ4HbZUN7%K;bH#rk`nr;bOBR$6To7g z^`2;`UG59tlVG=tGdfR95gs#3H1+lLq_XUtJ~pC$oJBs925FOS!;Tq*19N=Ppn;MA z^D>zTqh%zRzp=3Yk*|7}4pbChnPAf_QRJ6|?V^DTUdU69XcCH~cd2Zz2RSwnvpZ)y z6I2JyIe?sfcbdtujsNeU&{lQ+yfb{K8bk_e&oCeqcPsy_ zm+bXv@&l1l`hSeeAH*Zf{>EhU;j=QZ!U@ilth&0XjvqG?@fKUy94PSn3NZKz@48y zQYzTy36y`f2vGlY`xMx@p=C7HCDNQyS<{!J7;Hj4sUJH5-5{2fA;9ASpQmqn+a8Ee z)A>uRja2B%$6tc-ZFWaI`wBDgxVwyPQ54`qvS)IwRyvSn7c+aCu`SAqjX zBjJdx>{vhAyC0Gxk0>{<+I41h_E#7wpZwxL^kk*}Y`U7T5&eI$%7wGh^3P~sl}C2~sL5>8R`Ha*sEF(m2zt6Y!Py&AC0^y2_McN)mF z4f+J557py6+M=o>AT(n$EXIuZ24Z|Ydb-i92=V4vJGZdm(n0r$$lp}|E zQuDku*b9b_r@5k7;|Q#y1MnQ#B)@xujayg6hJ(8)*U&1lBZf_TKfJ2(9{n>5fbX`% z<79ssQldsH&a4rtMH+mkKc0uAB~gO~aG~0~`qt^EtKJvDSA;4Z%q3HSON{i5j419` zpY^>Y#TeCy=)3avR&$fb^vC<@fDo>hq^pj9xrE8JmAu@uES)n_IuAN{^YCY(Om~i4 zvd`^osq6B;D!~ba_uk|3r{HK$4#e>R9Ul^~@_;!9Whdn)si{(y>QXW{?^Q|oSiR8C zyz>3E`APsN=EwsRxL7sWndT0?2F&CD5aDbOq zG$RAfK#gZ)XA`)4{Y1l{@6JU5xN)nUsM6||=!-Vm&a-|l+wt(7J*=BWISulY&QT>vJjE@0Gy+|rj?Nj*h3V`W-8v>3aoR`P0dOY_r-X-!EN9(K-?)ql?Z+s4a4H}h) z9r$-YRboxOE?4i50y<&C2%y1K0IO~L`&L~{COs{%dJTgXe*F9)z`*@wx0)TTy>H$t zgsuK&bqm#`fNYn3+lQ25!Zc_&nSit=y)RCs{KOUL>$+)KrOoPqMwy*iz74zSwDLbR zrpYlMA&E@CSf_=ZT(=bujlbRniY%zp;R6P2N01gv8w=zKlQA7{;&Mxv&vlcSUSwb3 zdQN#vr)ky5mB8`9;S(_l35j{2M~?5zVE3lx#RKo10Jx9e6L-9Ua-K-%C3MVUY)=}2 zZ1bRE6tKm@Ur>74|6u~l`+4162Z{PsF z!~l(9{_6an%aOh!6&-TA!}m{xBkRr8Y)KUv77Ov7xRAbmrke z4OfSrXpl2+ElMtPbXHJMUacx?L3fv>2js9}HQ*6ATuz{0e= zV8=+8nh(#55puS9eM48;_Rq;TQzIupN^OQTK40&#*h3W;6{+;1FD9+0>46hq;EYro zI7UE0g7Vk1dwiFiO^vf?B#p^c1Xt$J=nG^^>`sO^{Iov@n36@k3Rk_|9dW2F6p?1z zI#LK3@_hG!ua_Gf1#1wC{XAR4NZ`uRj25)j;u$P)tpsY_`+%LBdwu!p{8K)IEXRL{ zu#bRuWjie>5?45OuCD*l0 z{j-~s=OID0aX=$SfJt&btr>+uK~js)0w+B_Radprj-tJ}{SIEc2N`naTcbb$kbyr< z_Nv1n6En%^j0{xe{3&{cWOhf9s6S8?DF_aPUS&!`as9(p)Q)E07~<_?V!xP%9z{GouDe zk#2O(^2&(}5M>EIK+m*3YC5l>mJ2IDF(J`hf1sbX_@&ptz&i+IPZiBQOtsV zT1?9M;0_D#VE!g1cXaf zaDU%yUuRo2z5hGvV13{E%^rf3`fJneqmSn<3oDX1T91+Us_3-Hkq2BRbo(nHHr0db z$XYxgw)Tv)cfSIBWGg7}5I@L;zx^!u-$JDJ^Dh9R%Sqbp*Ppbr`e<7p%;=>H2a<9k zDz|~Y)-i>;qU?EU6$iPiziEt-o2>N8Kf)-nz_;|)pR zXIm(>f(;P60C|^CXtENbwNXd2OqRecKg*W!F|1vBk&R-r39IFMKDXGNiBXi1spgIJ znGp5;~BJH~)rLNMN$VThb0`#oUnFlem=7IQ_lzg@b3kpS&&0S9Xg2{nE$Cdqud zQr4_mOa8-$`x_DAK&eatlI{%(-+}pQaYd*v8OdNPp7hP_qrDN}If)V;|Li*_?r;o5 z1mfYUJp40>3ap4hB+Bh_e++u-U>Z~eo0jRcU3O|#`fdC8B;6Piftc&-b|y`31@%Pk@# zYzcYqm|qc9vR%dMZ=G#7C10C7?_2;v#t`DUL4UhF$_;Sj%H%EI{^um_vZo3-?`Wll zg3BN^U}O+A1Gx$N2W_j#_va!zAjiESmOrC3!B~YzeJrX&qS0Gb-ayDd0fL!NE&#D< zQe6i@tBU}~w{C>**GqtNS}8Ka#qHc=?fM|oaLgD12P>r?(53#k<|s{IKJO+JiGwsO z)8Lk#lYmxfBR%<(Lmr_Y2}prMfQ{ft&9O58%Q{%<0ih-o0Z$8L()DmST$Hi}THV?v ztIbJA^-~ycKDtWgP*$DJR?Ys7gJJI)fUt2?J8qgn|4o-=Yv6 zf175?2qGqwB!iC(wtY$FcLB-c zo7sT0w1Q&r8^RdV&Hz7+%`XoeWakY?`svb(-^pKPqR5 zC9-5Ne`W{03iC2<4O~|@0lc|fYFE3R*lgAFNPFGQ7EsK#=c8>6pP{(MvD2z#*XlP;gE48n3JB@>{;_0CLEkYBXW*IcO^Q6>YVd*t6#wD#(&9%M$eiX-->!s?9+nIKui645mE&hrjxLUpXt^xWimw^314;Hu zny~%<$JduYQ@ytBZ`)Q|$~>epkC~+mnKKhYAv1|&Z$pO6L&+E!3L(l+N<_5HLx#*k zVzbSO%t9j5|K6SV{nmQl?_2-YI<0fodG_;r=I6ez`?{|u4WDy#f|UG19Do22(ew5H z!nwTnZ!W;rlJ6nF!|Ug`iIDhj8aM+a(wD2qd+8ej5c5Sb4@q8=TetwdVg-!M-;g>r z&Y_3ShEujiTn9t(=|3P0{CCqFidBFx?u2`=cLtXI~1YYb>y+m(fWKF<+U+T@^yv5Tj)5oqI*YIZ-I>LEqE~ zJp)X-G{3Ru%?Fdea`W=A%e^m}Vj+dD$X>12dvT+QN>LRsjn8v)b2`K254<-X9T0s_ zJ+L^8Z!oD{LseN*C&yL>2Q!U%KzHvQcA}~2+fVy( z2vFaxgSg9C5yvy2L&7`IALe9}X@t3JP4VyV5gXwA5HG4^kAnCwAo;nEY zk!Im4WuQ7ylB|3`A5l8yH&6OpCPc*BNaG4;LQB<;HG%+WvP0)O|=$wpyc zjMjk%>1+ka!+R>lz2bs=>l&XvleZ4w5wYELbnIlsTES86t_`DnWP(-B=Sq)RCWGE% z57Af7yzL%{pkp>6&YX7aQ)pFg9K(&SI}uF_HLC<&pnvc_5i}V;56TCRLrKRBhQ5R5 z#GP;)eZloWa0!EY(s?&iA&9|=996fY@gc2xa@QmC$XW>r&Z$2Wl}!tV1i?e>#?Ov8 zJM-zvvllLSbppck4#MdcLO-tuL1^DUPhe&qC=l95obP?7>?4w5_=pBj|1GlLzq}Fe zNGtkSro@iLqOuvGGH33kcn5C=!o7FlMAIljaqq=PNP7^x7&gb?;xbXk@~;riX-bUu7|J)eF#u`|1*3k8 zg*Yw+yXMGg02bK5h4)1?*b-zkBZw8LLq$$p-g))wbq16nBZwe3Z~je%W61C*s4VB? z2?|&DG(6+gzp>dufF3Sw%o_e0WHkXJjRHKd?GHnXPvCgoT8p+KhG#S2Vl6#-Wqf!Z zJ*n&%p}d;IZIe$l%sUK9CMEfzu^$J-K|N&|E=nHHmC<1&=5WzaTLcn9{%iulPVtvt z?R&4Vzig!+YG8tjCJy3q+_wPUPR0mN3>OX<&^Nb#`_x-i)GKg3uv*ywa~fzZQcNo;=~HubR6_`WO31ga2~W zZT(_=>@{O0lhQRr3P$X>=f?n|1;$ebINS|buo{%Gf9`|z)@p;w5W?}iOwZfy24RYz zbGHZhjWl)|LPthgUD|V;}pXIX|T!K_xlrWyZ1*!VdXOkSyp+T z3W?fUYoiwpM{di6wCc{sKEo%3IN7B?#mZ719tPa0!Y6Cq2JG-RAlSx-Elk!zu18ir zD;`?l;xgpD79K|~$vAAbE5Ov1(d5Hj*#pfqas@IDR;u{P6sqpeg5Y_;`+oy2_VxH` zmjcTYg8g%3;g)+;W-4*?Mi&9#m9%p_8gSYFc{5tW>WW7n&Lz9$N*j-$lRQ zE0&%=r&}lyGc8QSQ%jQ5t^2~z8K7nP-Zw7XE_xpu-ZIw#+cgF<+Rn(q(e!y~Hl5_) z@?T$o6!Rt51AUSg2U-iUFH~;6qAeZPOQkHLB_RJ|4FD`uYyC_IM!|yQ5s%rfkE!A} z?yPTYd_Q|o=@RY~2|$=AvhWmSgM9+mDD~@LOn#5I3vlvlh&ZXxh`HkzZ;89;hENa>Zv?URP~C_6aV9W;)N78Q<( z;2!vw9%B%wk#HTa$%XvUTc;v`uLx0d0m!edJq=*I|E;R1SXk|EIj^uZfbpxJ?dP=v zoMSo&G_zfSlqh$DgKs!aDN7Q~DDS!#&U0F~GF=T~u$kxW#@V0t8OcRrr+l12@MzZK zv%E=Qb7Ze*1e-#D=~?5_{NiG_3g-I_#LZ;K*}y3&J|%JJz{FH}onn#&@h(mOiTp^s z(p91XcskDhp-4*%p7HVrIo8jE0OW6mgKz|I@+U0tf)o3CfWb?LaI3d`m=sf<6vB)$ zZT@t;)@=70lL!=Fxq-v!(=D~Li)lW z0!Og7_yOrTNs#bR_pJXVNhOlbV* zT?_E3s}I+jsFo2+UYnZzzQk-CA-ivTBzFxG(tjch5!(xn8=NGHp@slv`IjE5l`OBw z(5>2;tCyb%iCJNFP}e{faly=qFdL@OSMD59(nrWzoD({(!iF@7T4whz&5JwwD^;Nj z>-6BhbEoYKBN)mT=;Fv&|JewN=+X0JVr)uP{^}1BeyBcI#YD(B0gH=o())r+33e#q zg*BA^NGu&Q8xEx-dk-iZ=$TGXsPsjI=wqCviKW@baUU*~UP_X*k8bf^dW*$|+7SkuROVpuA<5xayR%{UV@5p@>~qdi z9uxUu*{0;@Z}m_K!eor-#li-fk~9!z3|=OyW~wr&9g8^Uy{ z-`3W27K|3jh|-(2S1{(`nJkc)r>Y&IhT-Iy&Df$8y2GWh{~eisg#EKj?)>W$;2sj( zu55Zn*_rF7m4URB4L1p6iFjhs35@L9HeEJEH;HEn$;GNk47dzEto6m?Mwke-<|EKk zZ*~}V?~`OV0^Lj#PQO06LmTqpli`bB(tyh>uPeUIL3={YT$jTF5i5AEo+HI2&+1$47zjm$CdGU2tTJ+ymoK=RVkU02o zPa=`wj3wl}mp}t6!u{K)7jU`&G4;ha@rARvuVS0H#duCBYZ9Mh4XtrmCyzH!0_?CX zcI?O>kf>s}NP~=~-UkiW)Gz>{M)v_SBUwGGa5i=L1pD8)1 zVN@sU);k2LIsBIJ;?_t0fO5p8-L2)oO9n**m+EdlGdK_zJ1=(*DelbBO?Xq&OickZ zaQ3a%C1Gk zDAlX}coQt0f4%hO>d^!n=35U^_8PLqXl*Tk+K|{)7wOMqWy=hF-1YkrVkx^Vahr-5 zd~srZjOdg|I#cCSa(1?c3ODz)UGC=zV3w+1(Zi~jEDt2)OmI`Pp|pkVa(YlP)Q=Sp zw_6o^>w|+Yr%M(N6taafuWB~q62BTZmvA-%1HkV|z6q7ia~qR7rtM$-=Lj8CgWg5jythh8dP+*b?kYU^4*ubH{I-D$(1=Lu|j1A#~A2n%et?1QWO zUH-+i4l{A`|E81PAt`dl?8h*0njHV>KQ^$3Y|Xv8c&%rOv#J;;DGx& z?9BWQFl*ubuisAdM}LUKR$8l;W?bdmon-T!p{d#I*OB&^edubgH>t1<<%V_M@ieiy zxQrCHbvq-xNm7}5?gnL{IAP1PkO=Wf=Hb1k^ZOiWBT11{(fCNEC$%H*rA)V6VnQ;d zTv?BtICYhint{lepCL%RMR#hp;Ltr+{Bife<|h?7OkqRN8|=SQ+$RT=d~?|``CSZu zrb3`!JL?+cl!=*({3cRyJ0%k}B?!~$qk{F!@o#aM4eFo5bprJqy=lXgqwCpXMzG`w zZe@Db=?s;x(d7;i!qo81IW4J z!L>+z&(o5LRUN)WyFG0;DM@=XM#Cl}y0#%j>nrmDG(0}bFFodtVf1>FUM|dfDcr9b z2v5}7bN>_;uF^=@9%_@_3(0l_q5dUERaKH8sg1$kT1h>D)o4&xbCGN(Pe6>9v2b6U z@r0{DkL{z_fziKDh4_#cYM3)^Tt${REw~C8&%Sz;i>#m@B5jH?!@%5c7-suf}&&se6u)k`?r4zLCi~pd1Oh? zZuV@y0 zernv&6jKN|!M1>D_M!du_px>e4My8V(N+|B|Me!&?KveVWt zPJK7bdMa$4WT!}EC4MjnE87+*0Z{qRv1KBrP9z0EX|cO27U_>b zn=oy&2=3CrYMP(DyyV+pLsSO{JdVWj=taAvJd$oANjDp&<%2F8Dl4*EGUBEm#{@NQ=frA2_{LWgS;0U}P z$d426odb2X?XY)4iw~yjr(>#U^9*$jN1{HjH$5=J6zo1e$PFGI;jD|MJ_NB1F*yGP z1E@a4a;IjgV^hQ{+q&%#M`s-KOlR3vc|yhDTDMeC1K*H-OoYunTmvb|ZDUW9-mpG< zd+Ow6jG&!S`?j_$%@e@2)qpn?c``+KFEzZa zr!neo=9F3w=ptLwLA1t3K9JOE&?kl-jX3i0FMoLNw1M4JOck0n^v?Ql44|nYVC{Y9 zzY+MZ0n3^YiM{C@Hl2W$SBpGKM=<u+#l0Kehc_kFYLcRIoTA29X6)@;b@cP7rP)e5pW;C1U67} zy8T`Bd``-|lI(jb4ec@=#Tv~9P1yG8{U1V?i|x|02}g2NnKT=|qm~kfjd7}|W4A9H zG%OV^c^Kp3G#z#!7qjm2yJSIpOwtRh{Nr881rp!Q&Jm_lwuN5#w*kLIFmeLibv0vS zMqmm}?p9s&XVb<2k)ZeP#V7-UI#MPrbvXIk!62!RZl~${6XeZcEXp47(W|&tN*tj^ zw|)&;HzAUy-ve<;vu4roG=2EcZfS z|Cd+#zn5Pn>(GpIDyZ!V?04X3D+lhGE@onBT01h`OK6tz^k}9#7?U93;(Jiu1Y~DS zbSC#3;~(R&+;0AwlYPMp@`T%pv3^?px$*>X>&olpc4b1T-n%l~&q0u%(GLm=(sD4X9aA~?M*EW)%@a@~`3U!U z072~WQqdn`E=4@bg@)YQPh--FyW=&_i*tnNRLJ&tE6TWI1bDTeRs7W>%EE~%*bn6N z1fWabh?3t4Rb8AH@VgvLr_aUwLorkpm$1f3k^`Ibv@YIm7aZbfml%z>F(QR5^-d3t zS@dV6>#Zf4gs3@8@Nt_{A-Y?U8CDfU_^$J)v_pw597W8HYnlzJNQbNOAU5Q#w8>BYgi!$j!d?}OK8js~Bg!;cryyQf7o%f)Pv0w2FoV2MA-wd) z?&_il?rarSan>^)h0%RZj8#KiLcjKVvN>j%@0rA-1{3Q*9?=g(C0AS;c`b-y@P)AO zZnlVMDxrTsDg;6^DmJVBSt0 zKt>yPi*EDr^W6W&1Fvpf(b?*0D>xgn6QpcsuUMvwyp8mWTy6@wAKf4*qWS!5;@R%#f?9k-fcnq@|)N(=foeZ8lUiVr%g^jz?|3(di8HkD<; zyL%XMU5sEZ@sp15$&-2wZJbgi(xMs%?KHu6BtKMf+ViLPjnegK{9>N$*cqEzabNhY zD`dwNsoHgTq=DnrdiF#d_j3~m^Y=Z8GRezlL`hE;jZD8_Y)^cV%qGNBV3CHWOddAI z2%4*L(hx$CR$D2nb`FHe9qm4>m`xfVi6fmDSfpjQvT1sV->C;^g_og(W`{Z*;podUq-6giP8@J(y^ph8qzAz(;D2iSdU(-f5GhmwGRet> z#v|?fRB~$wy)1=gXTg-m#@1z;L0>5N)$TkF0>8!Y>+jrWgF!jAc|-ENj3qQFCM4U4 z2D{q5S1h!>n$SjJO94@p1HMT$&Dt$Y!7{%FC1hOP6vY9dUZ^_b7H6Ynt)ux*ETTN& zRtAfoWX_MlBwlPnh#)%EaE6!Ga6#z9=&Q$WDTgV>X_hnu!`rnG*f4n#s_4CBs^$9| zq{4SpOAU`$EvHl+_fuC7fA`FS6X)2KYG6ofrQIj^eeU~i|7z)Hg~bh{<*dOVF54Tb z=5#UmHiO_w#7tR|9GBe-U0SrVl55HGuFtwFpTX)oO1W6oEiFM&`3`xoPD9NVX8afE zROw~ETpRW%;mJ0$vP(|VozcG&|3&jL*RiL=xZBsSc$%wa?k9%qqf-rLcoXx#0_rrf zuuoX8{g=9>aJw1ED(-uEIc-8B!W7sIXWJc)Cfk_=Q0!H$ubwq}X#*NZKfqOfw^?IY z{0cakL>055H4W?y-~*)ni4BV##}e0A(QlGo3$IJ}#;1B&0hR{|16;JrXykWOlJtXn zxyBJ^t3D*!$XbKG@7E`D)Cqn=z4`xUboAS1>@1)5<)w%)@Gs zkLDDj=frP(dJZr`-NQ<7Sejn}T>qyTS2Y2wlss!e$K)tA4EN>NC(rup44E-Y?8ceH z4I#qjM~KEgkX0-1bYySh0()fX>WuoMF5E>@k*CW5EbKPl$rl{y^5!R2Qo#GFT@ACa zLxFG8v4A*tmm&6lPxK(ps z86#C+?!R75;r@b5WCH$NNn~uruQMT8$ap54PeKR-7(<26UF@>rXrMOUo@3r>$SqD{ zZP7m%npDk_#N-1B(u2otB(6#>P@=( zHuVTEQ%M4K{W{a{ZG5!PFdzAkD@D(!v3d>e!~=g;B6=kugaox@HuEXu%D3@c=-Ucn z?G!==_mGL)R4wEwwxBJ2;N6WDNwsn5Xoj+_7H0*JxDQl2i>9P_FH+aS)fZ8#H^q1E7`=8~b+H*S?~(X4K>ce;TTQCA|x z>^FDk?>yKHMZ$%c^7$&*fFaA#qX2^O*x1pWcCYzx_`U7W#bQnkIS2+iF0S^he6=3j z>FMWO@#N&DmxvV$g--VC>5ABK(cgTxC4$(nh<+eM>>OgL2ZSYNAj} zdJV>EE=!c1S_e-pnqOwu%lQi<6s4o+0=;;^-7%qDJiK?O_OHz5^J;;FfeN+@22j!tI&WGb2e#v1*wc?zm#Q3#nDedG^T0*gyD z;43ydNTEA7I&Gsy&nCs-Bk#*19v&&aaK{yNj!#|!)0X<}mbi8aix?x2I~yQ{hyu`z zmUS&HtqpiI;U!YqHj5*N4?x9B@Wl*8Dj|M54~mcvh=q$;tXyt1Fj7n>9GqTU!5n3_ zAf!juegt1aQrQD?!rb~U#h0^9& z2*HcuUbv-7spVSYQV&s7$PdX(E}@8qov6ek~` z7cvqWW1x=t&CS5G6&+um1j3%CGrZp6FRv44ta*^3feT^wl#ySS6NDsy>{oin9^^is zg~w)_^TnT6K^jooB&72{zwQ}B2B(jq%!;dg$dJ&n^sz)Ge&VvvVxuQqq!Lpr?@@A! zgZLpd9-ATLdQ+Ju-I-*MV4b<2@g4C4L2jW-bVo|>*%6+Ty!;`F7J>yxO`PGw*S5+u zr$f*61|y>|T<{iwH#hkAtp?1r;xK%y2x&q=`=*lDE{uYuz;NhUC3{efih8MKXoJ#OyUMO%$HaU zq`{_RiN!pdiQ~roiBywBY~ZEo4@Pn{tc{ebaDG^a^^ zo(RcAc;g=(ljjVj{W}21=?RR)0cas@SQ*oVg@KWLLu?~bm!#`xyo){i5{&U zK;!oCb?iB6&!!WoH$-PF=Iz_JBQEGqC&UNfzit^D4=y8u#Kc+uF{13UmZDMFz=mZx zapC9~L=Z|pX8*tqhxD@07AGUv8v8bwY!6Q(BC@4E%4#*xgGl2`8(a|`2)*GWmY!x4 zUXrSmYc^Ow8iqz|_5H(uWrx18o@&j8tHhGilJyeN*o~(e16*o%RV(nRs8MxDGx?$J z$q+(?5QrD9vA(Q0>vHho0NrQ@KF2~^kr1`VS2jK`Ic$w0I(M^*biGsHOC zW0^_{D|Gq_-6!!6Q5m|>__kJk0rfhR4R)q{oszaV3>w6P?_M1EX;%##;<|?(kj*X* zW(!*-q<;Q+KRk7g09eb}wDV5W)vv7UgCId%5|R>TcFXO182tY&$nX?fdAA{i#AmUv zyr``rUCQ%tIVzignO=H?y37OlA@&uEaHZy|d7m~<3dsZAGT|22fVmQIEbI71QGfq+tTj|_%xIdC_K8H4f-Z~Hx^W&ECvK{JpTJcbx`|PPmbd- z%FGZ_x+Z!}z|K6Jn}>&(f>OSz*6wEXZ8i8%_Rr?LQ2?-ff*o(({7OEQIRUAV#XKaC z8A8>`g0LcUO9IMDA_}7n4@odK*<{dx9di5U+YI$=v~|0Kpg#_@3Hlsxd2H>eI8ER=HL7KOAv*5B1m1jJtNqieCW}*WoJ$^*b#JF`9+XS2@qIK zYAW(CloEBeFnkG%hlFajN&ZFuiEnI|@6(c!cbl=096hf0^^3DKz3Os{Gnuf_k(kZ6 zOCO_+-)fgdE;Gcl_Ho)=%RP1YNx+!@wS-#Hah9uVelM=kXtzK0_^PLTa!2A|_%X`v zN`Kok>(Lgkc89F7xxrm9)mO?mK?} zq5QkU8}oT-c*`)ognI3A2$k*PfIqjTz&v&_rI$8T3B9I3rOG^-t~%L-yY6?jL8yeBn8zYJ9> zh68P-jy0XT`^lzuamObNHNPhGMcHD?`7(a1(jg3!MbWT^Mw!C~8U4k~>6DlI<-X-5 zhX^Gr=!tJs<5)=Xve742`rpRMzZztP$5r#%u3? zyvGe4_D@v=j`?8iKjsxWT}w37s~eFMs4(oKW0%{u&}p{Rk;GHpa>%1Bmn^X-*0}Pz z?qxEcERCAAFl-9N^WtCNc%e zvme^F~c1NBlAg=BBol|!hxc^nH{ma7WGNVzKhQAdQz5x+`) zUf+;SOQO=5Ix-ajp9B zBG#C^B$WNLa>=HIxJuQZo5Sj%saLjR!;ufu)HhvcMNTnJs%*#n2^5-_(~@np)N^>G zltLWZpc~DS7-CJ1P*XMsY*WulZjZXH{9BJ7Ut@QBNNoHBeF+62Y$rd(v5H3)j%>P^DcnSI6BJIQ?$C~$5DlQp%EX)m?XJ5B7eh@N!pzvr6={hw_LygI&g$xG4@`6sKxm7NVw;RbtT~U|yCchUUYzdau6aG{d(9Yc; zeK8Ug^_q2q+?eEUdG}Vr)_}sYwA@z(j$a!~ukvu8XWld?aA~v=Tqa)1`+3e{8gYbP z>maG7{e+VrnL-=Fu$OS6zZ|cisL?N#X1^>;%YUsi>-W)0nLA5iOSr$AT)a%O&ZM$t zPms7Bd}Li7`nZ2qE{8KjX_Bnpzx>;K69T<`Z0;QQ1!~-Wy&^dw^D7*T%pVjPa;v2ml zKo@DXhNrO>#t2LFCBHBFtUZ^+;GYB0J_rXGbrTkgJ(`xDo|RZ;(XY7lYi0PW3is1` zp$r#y)kd5ezic;rZ1Y%EaL(Y+cKZu6JZ7zIW?6yDW>$(tCzIcOhvLS$Zpyn;Bt0o>7iv4BSh`V-{ zu#6_)$nTGZej~2xrF#;xC~7xL8w_Vc#jEUWyUFG92`h1I+7scnm9E!ybykqJ>Z+ro z(^+JH&Ixxb^^3y2?GcXoh(z4=j5D?b&d1Lj!mzS_WR^O3kx0RSSQg^xvc{0b%oP%n zgS-%>YNzGvyHo!;OR?T=eWpFm+vQa$ghHJmzfu@hK`@NIgdsfB_a!fBC@#57slSrU zQyVXWD8RoATekattS+wDQtWz#NHGg>B?w5Dsv$^BP%8q$!p~~qWvG7O=T)5xp?fA` zRbvWo4BU2gb(JDWu6SnaAN`Y`vgxv5a<0%@1CJB9nZsgBIAUd+LW`r=IA*z+-2~^3 z=Ld&IH2Y*tL+_h6Z*DSKxGC3bu=?gclF{YCMUGyGkBe_t>(wAS=h@E>oU6P5RE{t93xKbM%IK9UW%*Nt`)v{{krlN#OoOJGLn`L9#*q`%=jW7w6~r7>C>m7w6wHO{?b`VhUOXq z+<|736=BQBkI_zgcoFr&d}lO4t>nR6b_Q`NWpbV~f@4mdJwbCX3)GOP%z+hEDaGX{ z)d5f4nGFHMi|6U(prITCXCuD&R4n&{IyB)yG(%rzu_emPJ%t(<<3Z7VtrdAlwyDk!jL0!cP* zwt@eAm;}78^Az`R+>3yzDbzV|(E2=StqwrL^sP5pvz!^viox_T-P;CD-bFM!# zGM4?1mS$oI(-a3Sv+drlT1W3IUUP^R8@?0BnjspkB?HeUUp>v2(p-|Wk<&cvVYxv*$LoY;|a zx<+p|=cX>0uA?L#nZ%cpMAKwS@%PUKq?UE65KjzX{{(c0Zj_(qt`(TqN;l&D|5f52 zS^~0;7Vy+#5B|)C;}aj4Hep~5q*=^7>P@wM2v&f$mauVacOQ%eU2n(tFsz_xqj>q`O)*(c%+XSju45#q8m5y*mX>41fxF(Bx95u4QM*r};;Nq%@st{;JjoGK(*kMvXX?c&LPZ zgGw3S<4V847`A*Rk@k8Fs5+pLU zAdPaEFgiLqG2L-|!BETbI>t4RSsz!(4^l#S9Qm#NJB>K6f-5*~OvHQ4+`<6~?Gn`x;p)wynd^r5bNV}N!x{&*>j+xEW8~H?$C!6plm~lEau26gU7Fg0%J|miQ>_{-S4o86SsI@x2#93mN2o&QtAS?`4 z5sP)FNB1gsEzj$o+Y^ig8l3Q@VJCGwF2|(zL)h}YipC-E!|T$-Z$M-8Y<#@DehKcy z>rOp?%~nyV+CO{7B>e_`_vg|q-uawHjUQX!K{q{@8{R^k|4ki+wcZ(HgSA>G&cz<0 zSAOgjv{~9a^0RlIwKm+ zj`3Gt{;U*+4IX7?AOTPDim~z5T8;0 z3Fj+{&k-wvMRui{6;|r$S}9UGT&=qUJ*?E{Av;l9d|3hO*`1lTZAg6k zMMP`zrr@2fLhFO|lrgJ4$cr39S;8sv`pugTreVn7P#&@l4lK%Yk#clP|BG#`G@`0c z5GpamH+L6hCwBDaJReRyF|m3LcV^C)-SOXbuV7c-O}mKQOR3*e`z-%EgEe4H8IHdK zokZ*X1(S>Wn_pyCW4dJ0>W@1dxR#IJiDC8o!4bHTJ|Q>q8E$eI8^ZlSDkg&Nppg8=Zda@Wh zYumU4N!+qoBJf_*Zfn?b7rXO;+;Y}sUfIKq%DKz}FbciHt?5Q|3oos#c zPf-Q`2tYm?{tYh@JqlmwvdLiO+jkYZd^nfk5qIj;sf(>r`>7XFhd^!PVwSy>lvL-# zlAwJ*dElg1Exqr&nC0g<&IZ>0Gi;X6bX1SCMAq6}lPs`-!wnxNVBGdN0hx)h?q z=|&potW~%RAA45C`n!hb`Wp_h@y#E+?X|p$@1ew5$`9+gert1a#%1J|d!$nDwJIKz zNX(>}RIzPj=~lBHtVKN2e4d*}g~*%w4L7Y$I4T}m8v(_jPZIAOIfe#dL5C|EQ!hZe2J7G z4kdit_A~g)Clufi^b8}!{?1}I8WJK0D;1^u1(kXmy)`r<;FUT> z#XB>alH-k!XE5p6x`}m}3*X|oH+-K^j)6R=_)hMkNl~zK@3oMg(bD}dSqGaxG8b0v z`ObP%Nf?8-G?z5jHHp24naz6oYH()@lfEc%*!{^B_-#GQT)g@9e-;X=AnVu@UdH_a z@>>RfoPL3ff$VCEg)L#z=|HYF@6&=YkB6lI=C_u7J9KI@31gHM)_uxD##WZ`Hv;~; z>5u@cRHdQZNcav}E+5%R7+(AnxYL#vOhsK}%)!+%{hHkX}1PUq;je|6nTw`7u94VB*959YC?k9hFOD>iJo!Z_0lE=Auv zbGu2)U7|m4CUeVT99N~bcF!lC(Z^}%n6b}W9Cdk@o4Xn0rjd!6Ba}Yde_WMX{ET^0 zqCU*&S3B-$Q_dp=fl}SMql(+gb15>q@pZ6KWPiJs<8Z7S+_KhqJw@NoPb_>PWyXWUD^hya{8X!G6mhSK5RdK6I{&Oc~FD4YvPXp}xsGPM+{9aolS% zEP68&yTSaVGLU;;t^M9_jJZr~a}*!psed)aSSfZPeY`vnk{f!KIp^hfUas)ovUYD_ zc;;VNT7KVjtn}Hk%~ZShMLzqLVLi6FwoL3ny%3TSg(fh@-@1oD_R*uKow%R&^S;%6 zdMh|YZEP$Z@;W{0 z-bv*fb`agJ_15ERAHSHent}b6aWHLj_f^;oLEX^6pwD+*W7bLBSdUBV=werVrb3eJ zhA8r- zK?nEj@q)cAqMCJo-86aAbXRN4vI|z6g24LtDF=0AIDF)kmpucT{Yse9_3Oh;@Iqa| zg*mB94DA6~qeGS<@9dZYVH$qtv`^OF?IKcV0;Ij zKv*_2(ii4&loQQP?HmevVZo3BQ{Vh33qvJXBeV7H-zG?sCoVUI=htsHdAP5Oi9V8q zsu29JgkK^?6%lHI1n8g>a&7D7AvhQ>bPTwY>OgYZcRu&@3~&3MUgeI~>QhG1yV=aP z1oD;u{cnDr>Zm*Sjt(BD!IF%t_7#a1s31c3kRD)K9)5!~LIni~UYraCdH$W!s;a7L zqk6`jzpj;Uz6x|Zo$tS!;DQRz1XJ+c@>uoI-X&I13M6Fp%T_=KVz{4*CM$3|MLy`v zz<_~mD4}6Zw2zrN8IfVjrjMVh0X}vY2{@ELJPk*11*}HtI}N_fDGAK{((=m6;ibN! zq%zT8VFVr7M%>Yn|Mg?mP+u@@O7Yr>hYDI)4spImskI|)Iv4f(O{~ zX!tdUaYQP)s96FB+wz9T<2jYG;$(MQS1z#)o7bIqG zl7PiYa?zGRY9Ai?;D3%!8)cizUS3|Lif&2f0>4xw>3C{6USBuN%Vng%=}Ce2BRrx8 zZr*>6P6$J&DrX6{J(1@E&=zt1a>iH)uoeNo{XB1ymdASAuSAh#`+MbVqA)xQ|LfOk z|Kp131=Yz@VE*NaoeQQAS8T7->j%u+%+sq1mWGo-CdQw=gW8<|I{RV$?P(HJ6}^~$ zIWUt0`?{W59kAOK$CUW|w1bzK#A;2d|AOJ`?t}2jHQ)EkB!8OKtP|1oa< zK2>KAi3g_?Mwia?mGfYA3mr;wNncw(+Vlv825kPX25^!UorcgdX>4q4ATgoao@uIj z36viIK$0m2ub99s|D@#JKVHt~0ys~uAYc^Qj?+-UStQia#Yv;|+%(jx)=!@J@Pu_K zuqp9pj!NGi$WI2`(@^^QNFM)LFe#{RS1a_+BWHZ0JSXr=!?*6<8sbFT1I(aPwn zte~nc7i;C(14z-ungfB?yxo4i`nreQUvysU4?ki9w#yaNfA^$;oP@3d#J}W)qV+4f z>6Rgz06Wil>vUBC&r`m!6xpdCN^D`+qtqK-;O_D@XK~r+h7@DFqm0qu7rhD@HiS2S zJ^Db0N+5eJPYci_c=ov*K%lz8mcaziuZP_27%nGt8y4FB9Nen^+CE9hS)HU;8FxB9 z00tG1CB{Z^EADsobhIF4z}m;7`i_Cj=aLG77d8{LwX$UAZ{@%?Iw4m8*k_@3A7$tY z;69@q#D=&dhqT@VL+qRW6I-3QqN&HXSgEup`kfcYMa`Se9Nu+!W9e?#W37hw9^Xu5 z{qGe)l7b31zIIKxdh#B{ANln*uD~PkzDB=Tk5@J93NR}78{iGny7JerowPqu4bGfu z&QLn1(SLEy!M2*O5r=Ku1H5SCbRUvL5J?0}%9IhXJ((&BV3Tb@?xQv+nKPRffS?7a zhF&LPJ`_A-PPW$x%4r9FdW1N zDrbA15&B0){*>FFlTk6u`5<`nQl)P<4nJN1I5t)8|LP$X*(YAwD1QL~fg{8;d4?}9 zp9=RK)GRD6dV!8O4pecMw0V;tW?(dVc|7U7az76F&Z8P|7Obt-|C%)_gWEs|!#skD&FY-zkKT27dag6W;SQiZ1@GS*f^Q^n_N)Pz{t)9C7#)2JqBU1$ z&nE!?#CdVBun>gXR`4I3O?&}MDd$Pj+E7#9K=~JtI?IbdAk0x`=t z0s6mhWN4 zsH3gDRrcY-zKOYc`c7ibj$bNWA~+NB9SPc6LnC2@V&r2o0Mlr+iWQVUBJy7ocG zkXwGS32z+EjWIWPKO7FQUVJBwCi(Wy!{(0~uvV#yc_%gS2jRKDd5BT`fsym_u4?$L z5CA~_^X5Rm4q>yc{wJ7DJHP~CyAJCAzPvdY*0?aPkIV8SB`RyVdH=7K9d@;0u^6kz z=6l`nFvOpk$!Z)OPgmpa@EA?8#vASCe*F{@9cBe(JSO|U4?&DY@i8|o-^ z0Sx7SNQ!N>UcZ7CMI)l=3=Py=3^g|yo}Gn~?(}QtFu{LAtyjqg~^~yi3~5&wUakoajz$Ha`V5F2}-hFdTujWpb0nnCSQ!^=sKi*c}iL#Vc?; zDipO z5ke896zCF)(3GTQO9U0g1cTY7f+4KP2!^&sQXZuNB&8q_;-k1k!01+NcxgK*Tf$ly z(SndY_X~D9D}Usl``zTQw zbRtM-*(6NjEab_?WO0rom;5nPZU9?+bhj)XR12^eu{3xp3gn9c%uRdBOX3mdUU*d} zDIIiZf1g7(mG@T~_llzbK{!Zan+-ynyLmXmb#nU}wfSV)k{g>0U4C$E3LI;r#T6)$ z?h&FT#-%!QhwNFJ6Lddp|9%lF#nSl9TW}w6z$>rL@nr-5450bqboNNxPFS5@mkxHf zJqWAnU83|-#i4h@Kjb4%NFjjUu3wph&V_F8iS%JtY|7_tOtL4@AlZets7Qq(^3L^Y z$J&)ODUaPh!b}naSGCT=^d<&u9dXFs&g=2y7Ap9ku+J|cBNDsUQg}Im$Z5Unvb}j{ zDgQH!4Vl^4KkMoJ>I$Qkcw>QrWwWSlGl8{!BLz+MvN0o__W@uBAgV>o0P zzwASIA2zH%cdzC)inJMGwWYz{BgKR3dlxjq5yrsHU4fYl6ioF(d(HxeGFgXW zenNU!?nI6rkjWvg@k)#7Q^rptkHTcakvaASx$`3S$uEu+-lM>;EWr2^=Y*rG6d!K8 zqG9oU+|O?Ug}=e-4~sUbi(t`od?zO#yQC41l<8I@Z?u5D|Ml;KU|ri>Je^~x4td(5 zSmH#aVv%17kVtaQ|g3CjDxVl`;zyg zZ(|9g!S}nd*}yN0Kun5lGDu~9$AfgzE+fRQ$^x&cnZ{86(5Zq;ik{A}tQ+}k{b!Ez zwJapfWsqj5qVykddRP-bD>AytmbTP&Y+PYqaO>BE_597sfuFnM^=^_yOM}fxy$ecn zz~+*m7Bb{WZCI14%dc(Zz6GRTZGpb)Ky11D?6`?i7p`Z?_BjQb^0zVH*gMayH+ijR zH}+7c2J1|VR?N-qZ0Y63&(*gZ$qh&qGQ^9ca1XqShiN_(L06J@&kvuMB;wF#Z{{X? zhgErwpD0V0?|a^FIjB_1ixZd~5qcMyoy=7x_+0UPzi8xT+?6Sqw{snLwgwM90D6*( z(J<~teCRb4KkRye+(UgT6|`m2XQ$eZ?1mDuCL=TCnJd-HMeQ%SId&>-zTJD>(1`)L z@$i_U5ni`C03C89X4HG^&AZ1snxJ3dpjC6zza7x&TlNyjbzSLaW#gBN#j z=v^u9$D@KYPOktDMi2-mVGAMK&dmrE6l*L*49kuIP z`SSOxXl|3HjF3wMZJ7q=O_kpdR>5pg@oszYO$`K6!CRTvAue1+)2c;m*0D_`Zqll) z1}2@SAH|viX9Hw9n)_7lIIE<5EIe%~YZ7{i`IMwtEOEUCRC@(F>$xQ~Y^Vt<4fvN6@kU)Eg+vjzP@+ z_D!%4K;^`$^i%vCS>Kz?tin(}_6|>x0{NV6WmM?tp+8xgk zg4-sG1jF4d7+NzF(&Mo*fdVCjD>|aI9#R{_e> WriteValueLog(std::vector value); @@ -349,7 +369,7 @@ std::vector> WriteValueLog(std::vector [!NOTE] > -> 在第三版设计中,valuelog中会存储key,所以有部分改动。 +> 在第三版设计中,valuelog中会存储key,所以还需要传入key @@ -357,8 +377,6 @@ std::vector> WriteValueLog(std::vector [!NOTE] > -> 在第三版设计中,valuelog中会存储key,所以有部分改动。 - - +> 在第三版设计中,valuelog中会存储key,所以还会多一个返回参数Key ##### **4.2.3 测试GC** @@ -384,7 +400,7 @@ void DBImpl::TEST_GarbageCollect() ##### **4.2.4 调用线程进行GC** -启动一个新的后台线程执行`BGWorkGC`方法。这里使用了`gc_mutex_.Lock()`来确保线程安全。 +启动一个新的后台线程执行`BGWorkGC`方法。使用互斥锁gc_mutex_确保同时最多只有一个GC后台线程会进行。 ```cpp void DBImpl::MaybeScheduleGarbageCollect() @@ -404,7 +420,9 @@ void DBImpl::BGWorkGC(void* db) ##### **4.2.6 后台GC函数** -负责执行后台垃圾回收任务。它确保在进行垃圾回收时,只有一个线程能够访问共享资源,并且在完成任务后通知等待的线程。 +负责执行后台垃圾回收任务(即调用GarbageCollect)。确保在完成任务后通知等待的线程。 + +(当前等待的函数仅两个:Test与DBImpl的析构函数) ```cpp void DBImpl::BackgroundGarbageCollect() @@ -422,6 +440,28 @@ void DBImpl::GarbageCollect() +##### 4.2.8 改动TableMeta(用于valuelog per table) + +对TableMeta新增一个uint64_t的属性valuelog_id,表示该SSTable所对应的valuelog id。如果该SSTable内所有Value长度均小于ValueLog要求长度,则该属性值为0。 + +这个设计对versionEdit以及compact的各个函数均有影响。 + + + +##### 4.2.9 class ValueLogInserter : public WriteBatch::Handler{} + +用于将一个WriteBatch里的所有键值对插入到ValueLog里,并生成将Value指向ValueLog的新WriteBatch。 + + + +##### 4.2.10 Status WriteBatchInternal::ConverToValueLog(WriteBatch* b,DB* db_) + +使用ValueLogInserter将b中的键值对更新至ValueLog,并将更新后的WriteBatch放回b。 + +该函数用于Write中的队首线程build batch后且写WAL日志/写Memtable前。 + + + ------ @@ -432,7 +472,7 @@ void DBImpl::GarbageCollect() #### 依据我们的设计,每周的工作内容完成后,都将对当前完成的功能进行正确性检验。以下以第一周我们完成的功能为例: -#### 第一周 +#### 第一周(已完成) **字段数组的存储与读取:** @@ -446,80 +486,95 @@ void DBImpl::GarbageCollect() 并未额外设计,通过上两个功能的正确运行能够证明Key Value分离的初步实现大体是正确的。 -```c++ -#include "gtest/gtest.h" -#include "leveldb/env.h" -#include "leveldb/db.h" -using namespace leveldb; - -constexpr int value_size = 2048; -constexpr int data_size = 128 << 20; - -Status OpenDB(std::string dbName, DB **db) { - Options options; - options.create_if_missing = true; - return DB::Open(options, dbName, db); -} - -TEST(TestTTL, OurTTL) { - DB *db; - WriteOptions writeOptions; - ReadOptions readOptions; - if(OpenDB("testdb_for_XOY", &db).ok() == false) { - std::cerr << "open db failed" << std::endl; - abort(); - } - std::string key = "k_1"; - - std::string key1 = "k_2"; - - FieldArray fields = { - {"name", "Customer#000000001"}, - {"address", "IVhzIApeRb"}, - {"phone", "25-989-741-2988"} - }; - - FieldArray fields1 = { - {"name", "Customer#000000001"}, - {"address", "abc"}, - {"phone", "def"} - }; - - db->Put_with_fields(WriteOptions(), key, fields); - - db->Put_with_fields(WriteOptions(), key1, fields1); - - // 读取并反序列化 - FieldArray value_ret; - db->Get_with_fields(ReadOptions(), key, &value_ret);; - for(auto pr:value_ret){ - std::cout< v; - db->Get_keys_by_field(ReadOptions(),fields[0],&v); - for(auto s:v)std::cout< keys; + std::vector target_keys; + for(int i=0;i<10000;i++){ + std::string key=std::to_string(rand()%10000)+"_"+std::to_string(i);//random for generate nonincreasing keys + FieldArray fields={ + {"name", key}, + {"address", std::to_string(rand()%7)}, + {"phone", std::to_string(rand()%114514)} + }; + if(rand()%5==0){ + fields[0].second="special_key"; + target_keys.push_back(key); + } + keys.push_back(key); + db->Put(WriteOptions(),key,SerializeValue(fields)); + } + std::sort(target_keys.begin(),target_keys.end()); + std::vector key_res; + Get_keys_by_field(db,ReadOptions(),{"name", "special_key"},&key_res); + ASSERT_TRUE(CompareKey(key_res, target_keys)); +``` -**对KV分离实现更细粒度的测试,以及对KV分离GC操作实现测试** +2.向表内插入大量value较大的键值对后检验正确性(该测试被leveldb原benchmark完美取代。使用leveldb原benchmark获得了正确性保障) -1.向表内插入一些value较小的键值对以及value较大的键值对,随后通过检查ValueLog内部数据(也可以是ValueLog文件长度)来判断是否对长短数据各自进行了处理。 +对于for(int j=0;j<5000;j++)这一段,我们也尝试过将5000改成rand()%1000,同样通过了测试。 -2.向表内插入大量value较大的键值对后,查询ValueLog文件总数,删除其中绝大多数键值对,然后再查一次ValueLog文件总数,期望文件总数变少。 +``` +std::vector values; + for(int i=0;i<500000;i++){ + std::string key=std::to_string(i); + std::string value; + for(int j=0;j<5000;j++){ + value+=std::to_string(i); + } + values.push_back(value); + db->Put(writeOptions,key,value); + } + for(int i=0;i<500000;i++){ + std::string key=std::to_string(i); + std::string value; + Status s=db->Get(readOptions,key,&value); + assert(s.ok()); + if(values[i]!=value){ + std::cout< values; + for(int i=0;i<5000;i++){ + std::string key=std::to_string(i); + std::string value; + for(int j=0;j<1000;j++){ + value+=std::to_string(i); + } + values.push_back(value); + db->Put(writeOptions,key,value); + } + std::cout<<"start gc"<TEST_GarbageCollect(); + std::cout<<"finish gc"<Get(readOptions,key,&value); + assert(s.ok()); + if(values[i]!=value){ + std::cout<