From 36dfed7ba21f1335212dc885ff516deaa1ae9f62 Mon Sep 17 00:00:00 2001 From: afederici <ajf5@illinois.edu> Date: Mon, 30 Nov 2020 14:20:38 -0600 Subject: [PATCH] optimize 1 --- Wc | Bin 189120 -> 189152 bytes Wr | Bin 184720 -> 184760 bytes inc/Messages.h | 2 ++ inc/Node.h | 1 - src/Node.cpp | 74 +++++++++++++++++++++++++--------------------- src/TcpSocket.cpp | 20 ++++++++----- 6 files changed, 55 insertions(+), 42 deletions(-) diff --git a/Wc b/Wc index d6b044c26b13deec26661164bb52afa8df9e32c9..2f25d268fed9a59e20f7423d32e5c70e2b7a4571 100755 GIT binary patch delta 18576 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 CngT2U delta 18533 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 E3kinaE&u=k diff --git a/Wr b/Wr index fa64bb38e3524ad4d0ed0b8613405882448bc84f..bc977af4de7b2fbfe76e016cb6c4ef4c65cf3bd4 100755 GIT binary patch delta 17781 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 C7Nuzb delta 17748 zcmaKz33yahmdD=>0Rl9pg6tv`DlRBcfB_P=Dj*tJw4&^5v9C(8BqYI5RU{xGAO%mo zATH&Gh^U1Tfhbr7C@!egYAdvkU1&2?bYolg=!lFqbIv>eXEZb4<b$02{`cH-@4I`w zn;d+qMVS62avXgOLm7tgV~D=dmt)_Vr5S3wS=8v(Hrr#8=4S``Vs2zU(c}s<nQ@u< zX`?l2l{qf6Mup8YnK$-MW*WwY5y}WQHH^~H$~e{BFuW6#kwu(Ax!co!hff(@vJAt2 zRvAunaN{m&KE>;l`IRz0-&%CJ8E$<2)!k-&zP8QB0|r+GdUqVYE3Yk8&~Va!s}kAG zjm+%k=I4#ODTk?=bZMmKDD&zj{W8>gb4rtLITNQVBTAk(aAEX6t9EOXr8k<<CXQ`= zE>q*p>^}3<=VnQt!&h~wHjLEKpkY*AFtV#Uk#FJV!yA6Nbg6K2Zevc{Wsd9X?AR=1 z80RRFQw=M1|3osW?}Fx*zCByMPXQ>UJxg)(-M*dGZu4B<Yt?_4j+;lf?D?D2tIUNr z4{P@hE7j{R{Cw%siFM!8cW#-~A@k_XV@H0ukz?)mbF8-F7b6dpo_oc8lw5O|rPOx; zE6hPVxn_T%Rky>ZIQ4zgm)lOo&C=Xn-M(JKK@VGX{!D(h3V2U`<_Au_VV=xwuY%^; z+`+dj_>KS6-}rlf<3B=vKFE2yQ?FC4y!`V+6^4=BBD+QEMsq>G0qPO+iGEkB1?HRd zeXMz|-)+io_U&KXyJ`bvX-uPlGLA_UR)1Jn{Z{J7dl?H7g^hPp_Z3#3NKK$<g*6q) zR44Ov|A>09wtT?VO5J5XmY1JXQf{TC3Tuj!h1Ew>S?0OCdoG(T>V?AUf>dg%IXC}W z^@O=8zndyHU(R2wwAp#!c=eT8JaBsdnN<{^GVUm>&Z4p?Lo#)=6g_?JYOY#!LArX} zd8$A<wX)3OQ>kTU^FetXS`wb)(fq4V0afBes=}N)=;l^2I}AOICHFU<95hy~F@GF1 zU)^cW80@<;w}jhiUeD|<R15kFds9!Y;&7SQq?Vdr48ETH8V~u0nr41KWQ#g&Rt>#g zMa>t6KBQWjBiuKuQ)Zcas=Cko)crI)&T7wiW!8S=sa2UXmm7w8@38jf6T{o6e&&JU zeN+$gZ^MUV{bL!0uW6iXx<*{1hM40<IMugi$%v=bN%M+=3D-UC=j3(1OEmgxHhbA{ zqkK?DJ!PcUTd9rTFE@LSXk)%uaGCnlJY3L~X53#2p6vYE-JEx`%gUQWy;=R%r8^f? zue*kX)MMu3x9nBVnxk)>l+o@UGiPL5^YE?1RJ)f8voq9ZrekEGI$};5S)}UB=SSW^ zKmTcD&sKR04Wqi?=W~l2bL5H*skLUCQ76?D^Q%$C>P>Uv=tZi%d2I9s^%ryWm;tm_ zts8UviudQUbHRqfn$p6;nsEmUYYIz`@RE^QRXgW)r&7Djb$8sa+L^7r-PL(>sQ0NB zlV=-7O~ofP_y(BYc)O`W^YWr@85d@m`9+;n(wtD#O}%1P6kSgPXIGKC)%aObt>cZX zYDH4dm=}t=|DhwvH5HFglnXP>o_Bg^-uds`<2Xff;lP4Kc2!HR#N}r9yUtQ)IL6L) z1ZG-EQ6$xwm1A#nTr1*kh%?PE#y+IpHCK!qq@J&hj$7R5vUBq&TXn?+YLW}7zt-L` zsaRc;n9LfF-wUaS`RAJ46?56N8EYBxe9t^Oc@6cLXG(vy$1IyNU-hd!Gv!R9E6c}n z#V=6BC(=*5RrWe+Z{r-VnyKlvf0=PCll-5W^Pj4ZsppPp*Vv1tvMV`QGqt9)l$MTv z&Mj8|W-gdFq|M6Pt%OwJi6D;~{-UmXZC;P8zm4IP#s#(Mc|R-F*8FC{D0;TMg@e>) zvt;4Ty?Tz~^omr<Gtyc?x&%4%xWekQg_Y->_CwRd^&U?#dzz;gdez5f_eG-uXNo8% zJ^i_Zl%a5Q<Bx6LE&Qg<+l3F<%rzwcJvP&<Wq#D=1;SyQCkj{ETxfBh#wE5eKpYm@ ze7*2Ao7)Q))n2>!2BrRJdY2URICLu&T2pa~mN8lfkEUK@t~~CVb}WpCrv(Z<US=L$ z(oel={<LICi_dQ1u8UIF?Kk~*cUONlciug9%ofUh?guWWrr=azV;=m}G^c2Yr#e%H z4F$(G797hyav}Rj@wcf~r2N|FR>xaUM9Uo|A4}z$Bkq}Dm1C`jw57awPp--_|9a1$ zj0+>otCsduFPlY6uW0^If%OQ<RKP4*TB4?!-z@E}dYkS2J5*Wi%l^|Dmn|F3^}tiC ztlhEV^-Ps(jxT*yoiYDadfk<845akR<BtF9q1%|l%BHJpYo92)LpA>*&nhaBT5Vn| z@6_U7gx21enrwDm-LczN=A^ZD6(p+1olN!2hlA{(H5G}}gSEcZAE~wz`%}tJYM&DY z8|XWAe8u+EaI>(&R2|GOD#}{@M=lpNCS9{HOv$viAE}+crbww*Y7YhSGiX8hK2&^J zS2~%zRq&&t+_6+^bJg0;&41`^1&gK5n~$%}o$e&0g+9B>h+ju@eTS}YMZVT^|KI65 zoBjXkQ_Mb<JzeK%zS0m%a!;p*au(`Bf<)>gD`gDrk(TgwVfC0;>Pj<Q*^U;`-IbF& zbnIw(^XPk<mdqGE@WI=vW2r^v6;-*kMiy1|%RAeFea0jU2WDkgQH2SL(-bk4`fo}( z$7|cKN;Su;Jno!!EW3+g`l_y*vhFvzD=C$HX*=CQQ-eeBwr_T)C~fSN;@_lnxbZj9 z{?}~y+#I&9TgET>=E8NkL#kXH@bCg_3))}G8_yV$_+YpB4;*{*;6wdr;h4pKn~TF# zcrZnyg)%kXn9sXfwx9Ecjz>tGb}VIXTi?!{U*j;ZTc53tn*G;zY1dZbxH!&Ry$s_G zo?fXTW?+50PC;Udd5Ry120Q&s=NM}m&kNT^*SoUR&$VanZ=b2YuD!UeStE72HuE8` zQm1Oi>5h%m-KPKHKdPOz!*+I5Dp))1kyKNqYj1h_d^5GDw(pCybye4neJRpNrD}h8 zxulWmTD#=co14<{_ld*p0(^WQeaJ9^RIdox1Wl$G+d+nLimZP;)sn1_)~^d>owO}w z)fq;THk0;b6AKMv0P_;6Hd)6~I=qvOlHEYoN9U65Wc{VIT#yZy8OA}f$<>B&zRqZF zB<UoY`I=$4YCT7KsQ{Pfon)xUB=VhXsPI(soocA4&oI(HV%l?!IfhEocI{tasPqEE za4$5JpX%XVMER&5ZaPso?;)RM^z(AEC1h7o3@X!gub~ojRP<JmFC7rwbQE<4=;t8C z4;tpTZxrREV))n+7fT;zVz-)+m?LK*lyJVJ_{?~$U2j`;Q`>Q`hGC<K<3z4P*i&Y+ z_^Lr^P!!(j!IIlKL~L@X*n~%{pVk0H(UY`bnmO^-UDLGJv0#5iyuar}?RW9)AzOV} z4=DF-{uz?!n=aPv6YGF=Q#*68;G<$A)OO4<YEP?F=&=W@)g2wY(?s<mw|A~^;=%9K ztsR`y$DGFv>w82vtZ4<jP9=4jQoWkR@<jC?*hi=GA!?*<>{bKy7`N)*BK0qtPW+|9 zI#i@C*WZ4px@5TuN{nD6<2RCy{h~4tTym>CrQX(g!_>onNUK<eGwhx*WAfPBbnhk^ zz4T?nRp*Sz&wA@9)m={<uJW(ip5b#u!b-fx-+tH1zB6X@9<XrfiW#$Ju9#b31e5xe z;p&0RB)RB)KdL;d98Kjo^o|i~iE``S2QuayxVu0dZ=87{gS^gf%E;A=MyYNpp~Iup zR24h$%_#Lm3l%=FWrEt2(ImaxXp|Y#T_>x3<nr-km8)X9*%Z~C=;kTP-8A{SGBPvM zdi505twW5Khs?}yjK9aM?+N*?4^2^5w~U?UgrxO7qR&lH16xM^Y57{;!@BoW74HyT zn?awPON=L5ct_1PcDKkhk{dIOOe1oj#WXcqwK}!75tmp==TZ3z>xI)*irW0n8S1To zcQH)~a$nclFfOD1<RyZ;^$0jkn;>%|T7Eg*K_?jI+re(|32+4b6F31L)>iVnFd!Zi z4j5ht7vbQ*tQ*h{8NdPJ&MIiwvvNN;f%LzF?fH2_d-3;S=FI@x^Y&4T13|-{njgU- zfecMMNPr}!Y!|RSg~x*Jsl3DX$CUmP*q++gc9eMb6fa{A&=c`o=O*0;2Ybr@18h(E z8?TT6i6ZfzPt0AC94Gt(*fC!C`c9JW1&;&s>dWPQO&s6=F$gzYDH#&rC17KMWOxbe z2Y(L^g8O%t{4sC<oB+QGc1)CbzjQVN))TlO4D2ES+~5UZ-j}$>JHbitCt$}UNpI_v z{7&#RFzq!~eiIx7e?psrRe>0UR$YbDU>DdqSpxXLesB;R0Y|_|Z~|;hk^KJ&c7Zzu zu95<M5Qc)I;5py~coW!|DgjS`o!~}SOFS=l2si>R2gksH{ScB6z5%<YNdY%pBLQ95 zQf>wN!S{jF-~(Xy49Wi)I1Fyp4e@4L=>g+*2woA4YH$$zF4&kQ0h?Yc0r-rfXiSU- z`@x@rBVgxs;-3cZ0efe2e(L{UAowi7FxJuWl4pe<{3VzVC0yV|a0EQ}2Jw%9{|rum zucyPSwQ|mp{1spqGnH?A48aG7p>(F@3_<XIa2R|RoB-$EB<q4}t`x9{nDe{o^u`r_ z0_+DL0*8qM?9jA_1mNQy^B`glz{fu3AlR`;_%N7`Vph89i2|1hJHdYNVlW>YIbH-D zUP|rH!j};EJjr}rFA3=N3r_|6!P~(}@L8}E=b3Dm<oAO|g2UkFz_Df2{#>BZTQcxr zl6frHv0QjBm=2m&x}pO$w~!y)3mgV}!4dG?;23x>I2nL&0fMnY3Ygee3UGq&1-rrL zz&^0+W>g4#7dQ;w2#$fD1qad)K8N63DHZq;>;~VJivqxLV&0Bj#p2(spQMMud%;og zANosr0_+zK7-<LzI5<lrV2=Tk!3Ev{_Jf<`NqPjl5*!1c1t-8`^2Og+CGn40O#SbI z&|{!D@P`>51J8id;4216y0cW$_kq3OCW9rNKLl}pADCbDGOq`x!6%t{{`tzpA%BPj z2!f;F@M=l_2^<6WABt%Uex8^IrLji*FM(a)PHsu(m-OuBC6@gk!d5sW!7qY&mE;WP z!7gwgj|B9AZwH6L4}g>46xbb<crAxfWUjFnf^V1vjDin>6X2ZTc*2kb7zTEN=YZ2| zB|QdqR0`XNS{Jy*2&$P?0SJ>u2q(bLfZbIR;2W?XJgxx#V4P|V_d4;nPtED|!mq<W zdY|y$0uYiA+TJ1o9UH`9IM@xI1NMQdY_1Xizks9QfwxM$$R<g*kL59Nz}`+H_ltwQ zou<L|cIw<B>GpQ&2ix0e0&MT5NwB?}ror}Z>Ihr$0>5sjP7w@yJ9UHC;R(E8dwX?m zl?q)zx(__4P@Xspw%7V7_&%g3ET;bd9D=b;0@`c63vBNNKCr!Ahr#xC9R>HhO)3xr z+v|W~N_=}Aa4}Q)#&l%x!QowS5bPL<CjwW46JUEYN`mdp$ap{s{Ph3={`CMtZ0-N{ zLgRyjJx{}6ny1z*iGb~CYCI?f*wfSrwx_8VY)?}^_+vak@IjjYH2sZUqfh`GOt9l2 zDc}g$3BGN#_<O;hfTQ4?F_InwSAh*J@mk(4=}wK6$=>Z;aIkkfAK2dAoZBUUy}P-= z_U`5bV|O!xV0&|mg6+*M7Jy*yZpIENz~0?lV0(A-g6-YS2ex;&Fj#gs`e+BXH@7s{ z-rNGghowM!cZ-7U-7N{WcQ<3F_*=UdFWq2!^YViyp^1ZF`^4jVO!DJEL!bX4*e4o4 z_!T<<*m;NaSri-rdmqOGcqQEx5#9jyf-eyBfyD=2TEza;|6vH<TLOKY1~0x-GNi#@ zf*nst0psqH0=?k>21mei#$tO0e@1L=&reGJq2nl>KmSJ{JjViY;wf>+9*+W^7Pdc% z1;IU#9tA%FPJo+EK!MLle*2@E1I!=Qto`2y;YMT#gI@zj!PyffU;?}boCf~@Hg-vY z*G>|D2Y5WO)dgVs)GhnJ^I6Hze=?pJybBxzx0)j9QE(8P1pf&3?v{8f=|e3yxexp; zI1DbBM*YtYX$Xs_p#slIfX!e(csDo#J_b&M`%IVo&OMU<Ij|etZU!m@emwvo4Pm)Y z9Nf=KfPVw0!FSD+bYriie+u@3UzjE7esIxj;TZTWZ~`3YF-II6FG#>*up4|B90uPx zSNtR3H^EVG-aP5!82E8wZejO}62IAeVZU&|SOp;phws2iaP<Po;Co2|TmXl`^A}2b z6nqx!jf%hhVbrxxc={so4_Zw9{{Vz299{({!Kc8+%Mu`Gu>^2~bHP6F25=DkM{pF} zaf#$NYAGI-Z|s8LVu85N-Qo}i2f-2WNpK9@@gDNelp7w-e-oH*dYFfR`NoI22+TJ> z*8V>S0$%~K!zwUe1u<^~^OX?uqu}=7ec%D$H^F>W#QvwjrQmPCbaf>Azgj9!upJI< zz<ig)0d4>v1P=z&-IA4F1m-Iy_P1N4HQ0XQo4|A7KlL?gf6h<}VF?^+!1sb518)NF z13v;j4&Dp?4E(z7k0(9}{yWmY2tc?5Aq~FVFD+ucE)~2E>;T&>-~<mux(j><*bSZy z9t&PY+__oM2yBl@0ec~&z-Pc&aY^sJOfvYvbBQl&VHnOv%4)%t#I#iW`t?8q-bp-< zd<X11PD`G|?5T`ahW)FBr^w+N>I;W1D^<O6?0bkWAqVv#l3S(wOV)PF#XH?!U%Zdp z2Z%fsvSWZQud0`yh3p=n>vpML_8kVlT;U=k`cN6gwy!Gggq#?l^T|6WPh#(c?8?*m z_twilLiXnA@+a%%yH-kUf1ci$pdu0EEyyu_sGN$lFFTqQ<Kgpl`NI?>Uy8gHvWsM@ zp)KDJIh?Qa*HdhGABUXKKdq+N_C?4=$nJqU{~-!8P+|`#ks^Hq^~H7d@;#8lByXsf z_d<>i)a6f6kqB}Iazf`-kTc&WQ+pb1S4r%IE+e^_eS>m`{;oo`)7$r{t~rCnb3Q!N zgLU2G6k&+Sk3e<~(eFM-#SInt3}m`oT*JkAM82}rF76P?t?Ubydm#Hq=sFrZjso$H zLr&_v00pscTYiF^)@3Z)moELvBsPr^mhHQj6_BZ|Np59d!Mp@HIZl^zqmGv%2bW6_ z$9TQ*&3f4n**ji_4!j?Q>?dy;I$4l!)XPHDdZ!Z9dXSc_#)FU7`9X?1L5h0?vN1tl zT&;SxvhQntgzlf9%eU6M54u;P1SjY^8aP>q643kB+T}qy0nY?^@=%&6<+ZH9<4v?i zZx-YNy{wV~Y}h~*hExep_e2?skfV@&6LsCj`nX?1PEuTI&8$gMTqnJ(isBYNMsXoc zUn4bePSO`?M%eN*kiC<1IZs)5e-1e~$$DU0?nIjbF9$L54%K^4hMXqv$4Q<nwJ3$` zoUGrC*2}vg`$>MkUVa;LWU_AlR=u2poSdvT#z>wbvD*iwCdL$<zo}jx2-!77mp@Q1 z&w=clqU&f;v4h+PIZEC%Wo>yc<OId$F*8+)`~<QwRp-+nu;uI!8kS^=odxevdfx`> zf~+mn1(24&(@UPbB13)_a%8H$$Xx*WYsj&wy6(|>x${~nE=k@z5T;4x#zS^Zlcg8( zHpt#-`rTvXJzcy%vc0EEGePE;g515n>G~pfFXWDuBKygEbG<wna(cQR`60<OB=$zg z?isp{HyFr!>>x9^nR>ReZ@c~kJxuPrfWzHUC1u7)W_O2AqUS<)_^j<K3-WlqZ<F2H zkV5eE`sC4PN`Rw~T{ESjApgtuo+<MHa^5<rMsTLCtE6h!S8V0bjaf1lW=Ze^ke#z+ z#6$iWvY%ug@sQWAm*A0EdL+*e$O*{lS$g9M8c?$(_GI0AiyGSeh5ICvZ?^OiQgb(m z?4NBlZ!`NU?tcB<7HXL72Wc3>bq`!46oJN@9lwoU7A8+?@r38bY6+T{EsNP4smUqG zjybXwL+-Iryj>*o+=E;R*++6sz5FfY;2d4IrCy#}BSFG*tc}|a@*v~{$$a3LD>XR_ z*)`YdOb6tSn<R)=mu=&1o<3mFs5ZtycF&WM33(G_|2&LL=ublr&(r1i)8+{IpO9&X zH7U4#19;tLwADgsEBZ*pWiE#7SS0%z<lT_Hi*)%K8dvTm;(i{wdx=yLa*O*VxPOVY z-{n9a4>?BOv_v={-wT<x?+2-d_MPI7kR3~9EYsbhRmGdOpvjlYc?R+#$kC;GBQG6v z+T{nTh3xgqjtn^k+3%MP)xLMUCM>~|e%?rWwzBUZmqB+flbJ$iSdP9EvVR%+0{W-W z!^`x>gH##FxmzWAWSK0Tkf%Y8Et91a@+**&%jD=mM_w*7YnuddESD28WPX{=i=lhD zbOq%7kp0V1L+D>a4=<M*Le4Z%!{t&#$Xy}FC^#?fkoo;Kmzks>yxFag8t#Q`tdP|P z@*f@$ZzsvTt3h@_c9Tp;kSxfL>fSqfiCjx70i?ge({BZ!H5q!-2PJTLg{;Ythd_?4 zkli2h6v%1v=G~vp@7%0gAUjt|?I1r7*}c+gRtMy!4@r@JedrMyv#w$ZQViKuEXRAu zry+-nWynJ2chTH@QS#>f9C8eDg1mRs%hzld?{u+M@2nCjvPv&|jM}NNlG+K<8F;!% zWDwgItYdbd(j~I4!@Ul2q(l~2$k*#-kJ}3@q#X}SfJBL$G*(F!)J~C&RdTq2yb7{w zl`OE3&p`IA(#?4vhCJyJJl-nlmQsoRA!KK%oC6`xeN?=?r82D{*FpA|%EAM=^<&~4 zBX2$^K+cDpE|nt7q{tv-XPJxy$ZtS)lgvkD$bW<EE3@{CEXWh}cTZC5y-nvS2c!=k zms*7NPxP^}Rd}@&*DC^fwTxcKrI2GJ^I{44Rme$wh=xon`)0WN6B5K&BVDjYVy}Vh zBAL%>kat4%u94L*2K__mu{AQyAv>Ow;K?;I%>xp=2V^54WkOyI*%gp(hrAE6FCd>z zA-@kfOy0C><v_mtDHIvdbtGp6rO5eu-!5Jh_>>B16Fj{^-TXBQ0QoPFqd}Qlko!L^ zaT7rq!6AtohHQka70UrR4%w*>J*%z@d`)<5X8miqAHeo&xu(xZy8T+NBbZ;yDZ?;& zfbF+(Zm|7U?k=$XR&E}+eVvs*V3b1`AcAo}*nTbdB)AmmuY&2doK=B$!P~)Kg6+3* z{{$aIdXru9K=M|Ox~3xp`?Xw8VkbSB{WZG*>jr$X0jp<!pTDR9um3Gm%Nuoi=5wmc z$bXPN$1ap?^WDGa*2Mg7D)0C2rVJN4b}Xgy%Il*3=JSmG>jk@@r`O6$s7h(KjOWDN zQ7I=#$YUV8DrI&--UiuQ$p@ESIgpc(6O}UQ?B77RX^#YVSINd*C1tLJ?61<z_fZtc zUqDV&A<8;&AO1X|tdrFV^5c+w>vSD$R5|O#dk<vidOh+5nqH6(==feWRK2g&3uM}B z51Y|C#HL)w+3eElMKT|251a3Gh)ru9XVXoqm&gRQhs_r{#O7KZXR}nRD4Ap0!zN3I z*lg2rHeYD^<?5kop7yXgq(f{xI?m={tzIVcs`jwyszYoZ(s4G;w5laDLDSzr4plpK zh|Rz2IGe#*y+UTI_OLmxLu@D}n;ly1C(~Ga*sRteHc#m|n|HK&l}xtwu%R?IaUExq zuhjuERocVmWgTMkv5vF3UaNy-)@To#6FS7^ypFROs?{MfT6@@}b%;$@9cMFKt2#1| zYY&@7I>e@@j<Y$W)oWx%Xb+o^4zc-O$Jtb9^*Wh%w1-VM9b#kZIGc`I9VSz*J#4<z zAvQyFoXt+Hj*w}pJ#1F$5Sy=boXuTYy+P(R?P1efhuG}YaW<E06(duvJ#4z@5Sx`c z&gKKH;$#MC4;yM1HZ66W%~-9DlBv)hHoJ9*4Lt*!nOYsQL=T(RI>hDy9cPoR)p0WS zY7ZOgKQ^;<oJ~rrH_6P<9yTB85S!a{oXxjdy+vlC_ON+RhuHMhaW;=?b%Kmbd)Pdr zLu8s?{G&`9@6*;N>8z(^hP2n}ZF1_TJ#3!QAvO*jXLGYw?~s|JJ#4CUh)ru9XR|=7 zcgcLFJ#22*AvOUWXY-O)?~&=CJ#6UjA;@H0`cxl%PYqFvwK_@aY3*U-)gd<T>o}W2 zt==c|nD($au0w2SptDh0eL$v@_OPkZAvPI0&c?6Rhh*Al4;yL>HvM#*&0eh%WO`{2 zn<hHMW{-}u>7vyi$*k8NHXrB^o3=X6=6S6?BGXxW*lg1wG8q@X(nmj{hnS_+$D}5- zhs{VGVnd^gO_5fgkcnvzn;|;HhE^Ol8Cv~`%mD3SGg*h&+^gek_G|Si8EP0dH|Y?Y zVjX95M61upjMN@BpXv~sYjm6qJ^U%vD{$m*vWM9>M+xvvuSrLL4W0`AFYpp@v%gDz z`{Jk*coWilf$fW<Vc@-z9x%p1uy2kQf=?nq1^5f_R<M0>^bFX(I64HjFOJ>^+ZRV? zz;bbPxncYO!M-_arah<Ctuzg)Pt%Uz#M<wm?J%4E`}8}fRTqzc26hTdreCs{F8m4D z?GwHPc7UB3942VE^$mYkU2^QdN7@ECrYDg+Glu9{jl|pj!=yr+5v|(hxl$Vc4K_!& zuO)r~+kd(=DAO+eG!;Wr>?blF{v$W4rg3ExNwxok$p`l5N&3gk&4PygCtgjP3QyFN zKBocYII!b$r85H?s7)yxN3_1~Z@>>W;GGTlsRsOf1Fmhrb-(9;5&ykloM^y_2K-qA z{;~o8djtMQ1OBhyF+t<jzi)w7+H*#A33O{9_h`Vm4R}ZczNG=*-hjt8;3>c7tBl#d z7mURXc;$hdujnt?GK?(U?`u_}qhG5LO)|6S9yIGf=dV=9UsGtb9=QLks=EBZl|QL5 l)0_0~pF6jI-U0uFjFNs$=FaImpl|;J=Qn4Z98TlU_#bG7h;{$~ diff --git a/inc/Messages.h b/inc/Messages.h index 6f2c310..0bf7d4f 100644 --- a/inc/Messages.h +++ b/inc/Messages.h @@ -7,6 +7,8 @@ using namespace std; +#define T_maples 50 // lines to process, 2 for testing, probably 100 for real + class Messages { public: MessageType type; diff --git a/inc/Node.h b/inc/Node.h index 6a3f50e..e6c6831 100644 --- a/inc/Node.h +++ b/inc/Node.h @@ -46,7 +46,6 @@ using namespace std; #define N_b 5 // how many nodes GOSSIP want to use #define T_election 50 // in T_period #define T_switch 5 // in seconds -#define T_maples 50 // lines to process, 2 for testing, probably 100 for real // void *runUdpServer(void *udpSocket); diff --git a/src/Node.cpp b/src/Node.cpp index 3b5b348..32be8ac 100644 --- a/src/Node.cpp +++ b/src/Node.cpp @@ -228,6 +228,7 @@ int Node::failureDetection(){ workerRing->addNode(nextIp, nextId); string workToDo = "", mapleS = ""; for (auto &e : mapleSending){ + srand(time(NULL)); if (get<0>(e.second).compare(get<0>(keyTuple))) continue; vector<int> temp = randItems(1, fileList[get<0>(e.first)]); string tempIp = hashRing->getValue(temp[0]); @@ -289,15 +290,9 @@ int Node::failureDetection(){ if (aliveIps.count(s[1]) == 0) continue; //cout << "[FIX] " << scopy << endl; if (s[0].compare(nodeInformation.ip) == 0) { - if (s[0].compare("JUICE") == 0){ - string removeSender = scopy.substr(s[0].size() + 2 + s[1].size() + 2); - Messages msg(JUICE, removeSender); - tcpServent->regMessages.push(msg.toString()); - } else{ - string removeSender = scopy.substr(s[0].size() + 2); - Messages msg(CHUNK, removeSender); - tcpServent->regMessages.push(msg.toString()); - } + string removeSender = scopy.substr(s[0].size() + 2); + Messages msg(CHUNK, removeSender); + tcpServent->regMessages.push(msg.toString()); } else tcpServent->mapleMessages.push(scopy); } @@ -1098,7 +1093,7 @@ void Node::handleTcpMessage() if (includedDebug.size()) includedDebug += " | "; includedDebug += get<0>(e); } - vector<string> messagesToSend; //used so we get our full assignments before scheduling + map<tuple<string,string,string>,vector<string>> linesForFile; //(sender,processer,file) -> <lines> for this file //cout << "[MAPLE] " << includedDebug << " are the worker nodes" << endl; for (auto &e: directory){ start = 0; @@ -1106,57 +1101,68 @@ void Node::handleTcpMessage() int lines = get<1>(e); //cout << "[MAPLE] file: " << file << " - " << to_string(lines) << endl; while (start < lines){ - s = file + "::" + to_string(start); - id = workerRing->locateClosestNode(s); + id = workerRing->locateClosestNode(file + "::" + to_string(start)); srand(time(NULL)); vector<int> temp = randItems(1, fileList[file]); string sender = hashRing->getValue(temp[0]); //because files are part of sdfs anyone can be the sender string processor = workerRing->getValue(id); //processor is a maple worker - workerProcessing[processor].push_back(make_tuple(file, to_string(start))); - workerTasks[processor].insert(make_tuple(file, to_string(start))); + linesForFile[make_tuple(sender, processor, file)].push_back(to_string(start)); //cout << "[MAPLE] assign file " << file << " at " << to_string(start) << " to " << processor << endl; - mapleSending[make_tuple(file, to_string(start))] = make_tuple(sender, 0); - string maplemsg = sender + "::" + processor + "::" + exe + "::" + s; - //sender, processor, exec, file, start - messagesToSend.push_back(maplemsg); - start = start + T_maples; + start += T_maples; + } + } + //tasks, processing, sender, and message + for (auto &unitWork : linesForFile){ + string lines = ""; + for (auto &lineNum : unitWork.second) { + if (lines.size()) { lines += ","; } + lines += lineNum; } + auto fileLines = make_tuple(get<2>(unitWork.first), lines); + workerTasks[get<1>(unitWork.first)].insert(fileLines); + workerProcessing[get<1>(unitWork.first)].push_back(fileLines); + mapleSending[fileLines] = make_tuple(get<0>(unitWork.first), 0); + string mapleMsg = get<0>(unitWork.first) + "::" + get<1>(unitWork.first) + "::"; + mapleMsg += (exe + "::" + get<2>(unitWork.first) + "::" + lines); + tcpServent->mapleMessages.push(mapleMsg); } - for (auto mapleMsg : messagesToSend) tcpServent->mapleMessages.push(mapleMsg); break; } case CHUNK: { - //processor, exec, sdfs, start - int end, start; - try {end = stoi(inMsg[3]) + T_maples, start = stoi(inMsg[3]); } - catch(...) { cout << "[ERROR] stoi: bad CHUNK start and end. Last arg is start " << msg.toString() << endl; fflush(stdout);exit(1);} - string starts = inMsg[3] + "," + to_string(end); - + //processor, exec, sdfs, starts string localfile = "", sdfsFile = inMsg[2]; if (localFilelist.find(inMsg[2]) != localFilelist.end()) localfile = localFilelist[inMsg[2]]; else localfile = inMsg[2]; - + vector<string> starts = splitString(inMsg[3], ","); vector<string> unDirectory = splitString(sdfsFile, "-"); //get rid of timestamp - string fileDest = "tmp-"+inMsg[3]+"-"+sdfsFile.substr(unDirectory[0].size()+1); - - int lineCounter = -1, numbytes = 0, readLines = 0; + string fileDest = "tmp-chunk-"+sdfsFile.substr(unDirectory[0].size()+1); + int lineCounter = -1, numbytes = 0, readLines = 0, startInd = 0, start = stoi(starts[startInd]); ifstream file(localfile); string str; - while (getline(file, str) && (lineCounter < end - 1)) + while (getline(file, str)) { lineCounter++; if (lineCounter < start) continue; numbytes += (str.size()); readLines++; + if (lineCounter >= (start+T_maples-1)){ + startInd++; + if (startInd >= starts.size()) break; + else start = stoi(starts[startInd]); + } } file.clear(); // clear fail and eof bits file.seekg(0); // back to the start! - + string chunkStartsFormatted = ""; + for (auto s : starts){ + if (chunkStartsFormatted.size()) chunkStartsFormatted += "-"; + chunkStartsFormatted += s; + } string toSend = localfile + "," + to_string(numbytes); - string header = sdfsFile + "," + inMsg[1] + "," + inMsg[3]; + string header = sdfsFile + "," + inMsg[1] + "," + chunkStartsFormatted; //processor, return type, file dest, header, toSend, starts - string sendMsg = inMsg[0] + "::" + to_string(CHUNKACK) + "::" + fileDest + "::" + header + "::" + toSend + "::" + starts; + string sendMsg = inMsg[0] + "::" + to_string(CHUNKACK) + "::" + fileDest + "::" + header + "::" + toSend + "::" + inMsg[3]; this->tcpServent->mergeMessages.push(sendMsg); break; } diff --git a/src/TcpSocket.cpp b/src/TcpSocket.cpp index c933d9b..73c66cb 100644 --- a/src/TcpSocket.cpp +++ b/src/TcpSocket.cpp @@ -130,7 +130,6 @@ void TcpSocket::mergeFiles(string ip, string port, string handler, string filede try { mode = stoi(handler); } catch (...) { cout << "[ERROR] stoi: " << handler << endl; fflush(stdout);exit(1);} string payload = handler + "," + filedest + "," + header + "," + toSend; - //73,11,dir-w100_1606725536,dir-w100,dataset/100.txt,dataset/100.txt,10502025 payload = to_string(payload.size()) + "," + payload; //cout << "[PUT] payload: " << payload << ", range: " << starts << " sending to " << ip << endl; Messages msg(MERGE, payload); @@ -140,12 +139,13 @@ void TcpSocket::mergeFiles(string ip, string port, string handler, string filede } while (index < dirSize){ if (mode == CHUNKACK) { - try { - int si = stoi(toStart[index]); - int sj = stoi(toStart[index+1]); + for (auto startLine : toStart){ + int si; + try { si = stoi(startLine); } + catch (...) { cout << "[ERROR] stoi: " << "send lines " << toStart[index] << "," << toStart[index+1] << endl; fflush(stdout);exit(1);} + int sj = si + T_maples; sendLines(sockfd, toProcess[index], si, sj); } - catch (...) { cout << "[ERROR] stoi: " << "send lines " << toStart[index] << "," << toStart[index+1] << endl; fflush(stdout);exit(1);} } else{ fp = fopen(toProcess[index].c_str(), "rb"); @@ -270,7 +270,7 @@ int TcpSocket::messageHandler(int sockfd, string payloadMessage, string returnIP int bytesLeft = 0, offset = strlen(extra.c_str()), buffersize = DEFAULT_TCP_BLKSIZE; vector<string> format; char c; - string preProcessed = ""; + string preProcessed = "", startLines = ""; string filedest = filesAndSizes[1], processed = "", filename = "", sdfsfilename = ""; if (returnType == MAPLEACK) returnTypeString = "MAPLEMERGE"; @@ -295,6 +295,12 @@ int TcpSocket::messageHandler(int sockfd, string payloadMessage, string returnIP returnTypeString = "CHUNK"; sdfsfilename = filesAndSizes[2]; //sdfs file execfilename = filesAndSizes[3]; //exec file name + vector<string> reProcessLines = splitString(filesAndSizes[4], "-"); + for (auto re : reProcessLines){ + if (startLines.size()) startLines += ","; + startLines += re; + } + //cout << "[CHUNK] exec: " << execfilename << ", start: " << filesAndSizes[4] << ", sdfs: " << sdfsfilename << endl; index = 5; } @@ -383,7 +389,7 @@ int TcpSocket::messageHandler(int sockfd, string payloadMessage, string returnIP if (fail && (returnType == MAPLEACK)) { Messages ack(MERGEFAIL, returnIP + "::"); regMessages.push(ack.toString()); } else if (returnType == MAPLEACK){ Messages ack(MERGECOMPLETE, returnIP + "::" + processed); regMessages.push(ack.toString()); } else if (returnType == JUICEACK){ Messages ack(JUICEACK, returnIP + "::" + preProcessed); regMessages.push(ack.toString()); } - else if (returnType == CHUNKACK){ Messages ack(CHUNKACK, returnIP + "::" + execfilename + "::" + filesAndSizes[4] + "::" + filename + "::" + sdfsfilename); regMessages.push(ack.toString()); } + else if (returnType == CHUNKACK){ Messages ack(CHUNKACK, returnIP + "::" + execfilename + "::" + startLines + "::" + filename + "::" + sdfsfilename); regMessages.push(ack.toString()); } else if (returnType == PUTACK){ Messages ack(PUTACK, returnIP + "::" + sdfsfilename + "::" + filename+ "::" + remoteLocalname); regMessages.push(ack.toString()); } else { cout << "[MERGE bad return type " << to_string(returnType) << endl;} break; -- GitLab