From c1d39999ff647828bd6f262d21e992ff2cf83ce6 Mon Sep 17 00:00:00 2001 From: Mark Riddoch Date: Wed, 21 May 2014 17:25:21 +0100 Subject: [PATCH] Improvements to debug interface & blr updates --- server/core/config.c | 4 +- server/core/server.c | 44 +++++++++++++++- server/include/server.h | 2 + server/include/service.h | 1 + .../modules/routing/binlog/.blr_master.c.swp | Bin 36864 -> 0 bytes server/modules/routing/binlog/blr.c | 2 +- server/modules/routing/binlog/blr_master.c | 48 ++++++++++++++---- server/modules/routing/binlog/blr_slave.c | 41 +++++++++++++++ server/modules/routing/debugcmd.c | 41 +++++++++++---- 9 files changed, 158 insertions(+), 25 deletions(-) delete mode 100644 server/modules/routing/binlog/.blr_master.c.swp diff --git a/server/core/config.c b/server/core/config.c index 4da5135e7..dad4c4022 100644 --- a/server/core/config.c +++ b/server/core/config.c @@ -29,7 +29,8 @@ * 06/02/14 Massimiliano Pinto Added support for enable/disable root user in services * 14/02/14 Massimiliano Pinto Added enable_root_user in the service_params list * 11/03/14 Massimiliano Pinto Added Unix socket support - * 11/05/14 Massimiliano Pinto Added version_string support to service + * 11/05/14 Massimiliano Pinto Added version_string support to service + * 19/05/14 Mark Riddoch Added unique names from section headers * * @endverbatim */ @@ -299,6 +300,7 @@ int error_count = 0; obj->element = server_alloc(address, protocol, atoi(port)); + server_set_unique_name(obj->element, obj->object); } else { diff --git a/server/core/server.c b/server/core/server.c index bf5b3174f..fd3e1c876 100644 --- a/server/core/server.c +++ b/server/core/server.c @@ -67,6 +67,7 @@ SERVER *server; server->nextdb = NULL; server->monuser = NULL; server->monpw = NULL; + server->unique_name = NULL; spinlock_acquire(&server_spin); server->next = allServers; @@ -109,10 +110,49 @@ SERVER *ptr; /* Clean up session and free the memory */ free(server->name); free(server->protocol); + if (server->unique_name) + free(server->unique_name); free(server); return 1; } +/** + * Set a unique name for the server + * + * @param server The server to ste the name on + * @param name The unique name for the server + */ +void +server_set_unique_name(SERVER *server, char *name) +{ + server->unique_name = strdup(name); +} + +/** + * Find an existing server using the unique section name in + * configuration file + * + * @param servname The Server name or address + * @param port The server port + * @return The server or NULL if not found + */ +SERVER * +server_find_by_unique_name(char *name) +{ +SERVER *server; + + spinlock_acquire(&server_spin); + server = allServers; + while (server) + { + if (strcmp(server->unique_name, name) == 0) + break; + server = server->next; + } + spinlock_release(&server_spin); + return server; +} + /** * Find an existing server * @@ -190,7 +230,7 @@ char *stat; ptr = allServers; while (ptr) { - dcb_printf(dcb, "Server %p\n", ptr); + dcb_printf(dcb, "Server %p (%s)\n", ptr, ptr->unique_name); dcb_printf(dcb, "\tServer: %s\n", ptr->name); stat = server_status(ptr); dcb_printf(dcb, "\tStatus: %s\n", stat); @@ -215,7 +255,7 @@ dprintServer(DCB *dcb, SERVER *server) { char *stat; - dcb_printf(dcb, "Server %p\n", server); + dcb_printf(dcb, "Server %p (%s)\n", server, server->unique_name); dcb_printf(dcb, "\tServer: %s\n", server->name); stat = server_status(server); dcb_printf(dcb, "\tStatus: %s\n", stat); diff --git a/server/include/server.h b/server/include/server.h index e355e8c49..6b4598c36 100644 --- a/server/include/server.h +++ b/server/include/server.h @@ -51,6 +51,7 @@ typedef struct { * between the gateway and the server. */ typedef struct server { + char *unique_name; /**< Unique name for the server */ char *name; /**< Server name/IP address*/ unsigned short port; /**< Port to listen on */ char *protocol; /**< Protocol module to use */ @@ -103,6 +104,7 @@ typedef struct server { extern SERVER *server_alloc(char *, char *, unsigned short); extern int server_free(SERVER *); +extern SERVER *server_find_by_unique_name(char *); extern SERVER *server_find(char *, unsigned short); extern void printServer(SERVER *); extern void printAllServers(); diff --git a/server/include/service.h b/server/include/service.h index 0a8db9ea2..85fe3972d 100644 --- a/server/include/service.h +++ b/server/include/service.h @@ -148,4 +148,5 @@ extern int service_refresh_users(SERVICE *); extern void printService(SERVICE *); extern void printAllServices(); extern void dprintAllServices(DCB *); +extern void dprintService(DCB *, SERVICE *); #endif diff --git a/server/modules/routing/binlog/.blr_master.c.swp b/server/modules/routing/binlog/.blr_master.c.swp deleted file mode 100644 index 586b89f6a0835bd303ebe0e0c8744ba14c19a6e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 zcmYc?2=nw+FxN9?U|?VnU|^Uqr7ZZvnKov>FANO1iAC8(nJFpx$r&J7oY*(9C|frO zqOe%kH!;~MKR;VHpeSE2CqFqc2d=LU$v}PI#ERhL#GF+9;?$zD)FS=d{FKt1)MEXj z{L+%lymbAf%)FfZbp529qWIjz;*!)Ny=1sSqm0oI7!3i^LZGxHP1k~#!Pv;q0Hje_ zNl`&qC=|pT#iJoG8UmvsFd71*Aut*OqaiRF0;3@?8UiCE1WF3n8R{7r7?_~`&4SX5 zXfzv?p9ZC~p)^b#2b5n6r7u8fm^=%VZw{q>p%PGvffXtq45eG45>SeP9V$KpN?(Oa zKq&@hsJIf8&V_miCJz-JrA9+wGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtsRP zKw=651E`OD6hsIxFu?l%fB6|04)8ND6!SAMsPi*0Nb)lLn{vh zg9#4{%HYBv~04L|GXa1VCz77#N233j@P1 zW(I}@%nS@A%nS@p%nS?y%nS@Km>3wIF)=VaWny4>$i%>~oQZ*92@?ZDJQD*$2onQC zAQJRwFF5C#3ZmH2vZ?5uec;JFFBP#K?|e~BB}>sdL-th>-RbS+4> zLk&@|Re-YM6LWI%lhGZZqX01!*?5qX6l@ioi&7IyQhh6f1AQDzOEO#%OA_I_ON&9t z5*8{2iN(d``9&!@3QFM6f*1+)ImB8QXQ%iee;?O)Prne?AU{Wte;B~YniG_)tr=XL zojA218m$>1*`v55v8V*PmIzngz?L7NDF>1zAZ|oY?Vtnph5ziz+u`lQWH~BixBz>vP*Onf?NaQ zJzO1KT!R#}GE$1rv}<8Y0LdANMG9J==+8^cP1R9=@DT|B!Uv@wP@+aN5fnZtpwP=q zDlJKkhj>1|C^b31Ct=AuR?sTQEUl+^gL#GKMpjncg0%=Em}6lf@dLQO{jE(nTMusTQt=cMK# z%z~N^a#(I+HasX(N^=Wvc^S86=j5lSW#*(7$0uc$}^lAoNPqnBaFps%G6lA2qPUzAu>sZf+!SejV`whoj56%tEJG88~z2&x>B49&?; zkIzlaOH5BK0-1rZtvI_fy*$3OBr~TNn?y-vK`K}R$*kf6P@R^XjjBE+ISExDDF@vu zNRf`JDzPL#H!~Sk3|c5<*dbe*3R-W8sty!5naQbWf+amI@3d6 zFU?6&$jdKLNJ<5joW+?bsYR(Npkg+qG#O-?LQ!gBN+r0=PE^P%%}q)zQpitJ$jQvj zECD;DSWh7&BeNK!r6eB|g9@3&3c0C8sX3Jji6GJZG?0em{JiAUf)a(qJWyLo0n~O% zE-fkowL`$^4Wbj~MUWXOsnEPylCMx)T2PQ*R06FpO!dq_<|t$&7DGLop9i+BI5RIj z2ka40)ekE5p{=CEU^!CuTwP0mQn%Ph_X)eIn?Bi9+Jc_l@e zso=UtA-6QAB(oqVRRN+|p*$lq2UJyoGDv1#Iw-I+^OB2F6N^*9MiiwMg&Cv-hgDyh#R|xw zl$5GaTAZ4qkeR1|Y+q_#S!Pjw9;lQkRw&7b2AKn>Pyp9hkh)ke8CrQJX66+ufXYm8 z9tQ;wB#VH81foa%yH-YKlUlLUMjVB`9J*hPnHND!8ZSr4}XTC81O-RGNQH36pdd%TkVtE=b)a+us%F7y3RECurlu&A zCl(bY=9PdQ?&})l?BVDa;^^e*;~5gEkYA+W<{9GW8XOFA8Z4uNf)Jd=;7tQ?q5=6j zBfkLT#>5hZ%o2t2%$yuh$xvFHnpTh#E z+zbrUc_8cmVe{u}_!$^h@-r|r^D{7n^D{7L@iQ=}@iQ<;@iQ?tBakE_@6O9DEE6EPML zNatl>2;ya6(BWlZVBlq7xW&W3aE*t7;VKUU!#*AchTS|23^REkZkh&i7pRXribq3W zGz3ONU^E0qLtr!nMnhmU1V%$(Gz5lg2-Grg!Uo6Ui&AqyLk${gkgmF}T~2;-HfV;S zmVuKKJVXJSmH-W>>)Pd|R+LyXFmQ5$>_Ih==eG$Xsw}BJ)EEsaoF?@qWetjs5;twg%0XW0P@@i>I5lgK}ivGHYl+ibubDv z;s+Wt26f9Jv#FdJDKN!Iqh#Q?RDjH)AgP5UaH!e&r6s9F=rc_&@a{c$C;$>s3XnMu zh4NGd@R(0lX>kci3^MRjlCO}MlLJ-`8JY(Vf`Y@fSP$I)-wc{N=YsVAVe9ih@-r|T z=4W6y$j`vAg`a_8K0gCPA3p;_FFylA56+Z)mB|ifL6F&pPeLe<;Eqn|N zS$qr(wtNf>pLiJ<4)QWEOygx>=;UQ!Xy;{MXyavIXys*KXyj#JaOY)UaN%WO5aMNE z_yFzq@8V%#SjWS_kk7-wkjuls5W~a35Xr;9V9&$AV8Fw`pu)qzpvc3(AkV|VAjiYN zAjQMLaGjfhVHRlof}4S%h?{{SfSZBAhns=Hft!JWiJO6eft!KhF&6{FWiAGWgIo*@ ztGO5$R&g;fk^=q4<`gbi^ih-QgnVvYLTv8abj6&3UvBaFD)e%GNYygDj6YV4IV;%ODi~mM6~sN!s3ylk-G{|aJ6i<RfflhK3xiyS z9xaf99~vj1u!ea%KN}uwpy^z+343spMGZ1J4{Idl7N;xND)@!^_<&P@V3AqBkrC#f_o zEw!i^W-G*++~RbQS+Hi6T5fTAG{me}=rSdElLpdg)6@Z3p`fb(Q3c6((2^&&I9&(g za2HAr51tGH@MP-1T`#e zLvk)CR6rpPafJfd-=Gv$kX-_GC;mWyg#swhY|$2DfP)^~yi?FtFabFgWE*lEfOKiw zDwtR+fNTMIqFkZ4ATb%7C&6xpwk$ZI?O;xjjv8A94Onu3Ec*aY`(p;Mp_!(Fjg5i@ zByhocakvqx1mr$WkOPs^f~~EBAvp7blMUDuqFrDCc7UN7VHd#E;BtZyniFt%1lE=Y z8-orwz+sz{nwMUZ0iAz=E{#L1V=GE6&P)MK$AT98F*%)hrVlW`FGABPV1(dQuCS%Jp;6$N-wV4k!3?}E}>gOKf0qX=HTIQh6 zfSMY#HvsViSdoGqs3*a|0PZotiW#^s5CsEBKfE(hP>`CJ00LO@X}NVh^_9%#`8G_)Y41E?wk&C@}7$r*{6dGJ1ge3b~-BeO`XKLV12swgPCzv>eoK zD9Kky$p=rOf|6)1c)k);{A2T%f-XEri&CMJ!>CRKr)J2^cP%7cfXWYDTLlYHX#`$G zq+n+UWP?45qjoc{&>9zw^<<$%*eOvh2B*=0fkU{ttEa47qQ2D~? z2VcPfTD}HKOc3i7ATG8T~qybYZ#cFhB?D@a7LO#yjT3D`}Uc?yZpg&rWwQcEDg3|^p`T2fk+ z2daHQp$uvrI(ho}_`Aou`8oQ!`ndXOf(H|zQ3aas1+AH5;4CgF$^(r_Xh1?yQw`+o zXhYLj#1c@5o_LUY9R^NFpgPNV6NL*@RUw7DpE37iWTk8D_h_z5>Mg3NRT4POuM6VnM4) z{e9!1!Q>L^8vt@G*uBpAxw)X#I1r`AAf*NnNw9QqYGG+=UUI5}rwdkh8N`Cy89JbP z0p<(TQkntc3e+MQw4xdmc}0+@gtn&c(p+go}aU z0T%Q2_7pN9UUDV9fb|gf`*qsBc7w9qp2u^rl0{ncrJntT0=Svqobps zz6h+O0gruv2R&dTC7R%ga!&e7{I9< zwPy}n6G6?vQq-YH15jpz6-2NRPo#;J0Utk2N=?mENKVYj0qv^DEXmLVO=W=l|Ddh^ zTS0^X0|V@QzxVtM4Da|E7+yig0rL167z{vSd<+b0`4|}T_!t=U_!t=Y_!ty;@-i^^LFe?Z@GvkO=V4$t#KXX_fQNyhjfa7unTLU)j)#H4jfa7OpNE0r8#e>P z2W|$2J=_coGok(W9&QGPHf{!nW^M+C3~mO7RBi?aXKn@tCvFCY-&_m~KcI8@nOqDE z-dqd}N?Z&K|2Y{Lo^UcS9OPtR*v`qou!WO>0ko!JDklTOBu)l~TuufCXHEu&*BlHC zGdUO-CUP(^WNND+9wl76yhbEDQ{ZEDQ{mEDQ{+EDQ|4nHd5EBE#OGX9;a2$b}&76p-Y{>91%EBdBB7{hR zHnyZeCQ?u(P`91Chj_a9`n$M-QZfD=?G6s^KK@RQK6)T6@gP0mUD^mIf##^;GyTaK z*~O)~MxYJypwTMGXkrlbhyu`QP+N!y7Kn}Lo`8l8r0Pq~&nqs?O$7}G!lpN& z(>0)xL)1vZ5{ibnL$Me-IR$Y9Y{V26l32pckS^h7h&S9q6dWM#MGrIuTLlM)^ql;p z#2h_HTP_~v73zd%MrvYFNm6PeXnh=b6csaF!a@|Gv>>%8Gaoe#dN>8R26_6s&^Rz* z)({z*a3{w@oUCB0U}$a$2IiKgMh4I@)Yn%C@ptjJQgDSF1^}8mf=*uKr$Nsx0FC&A zrk)CNK-0^hy_e8AJ!r&bg2Dry=}^)vWEvqpGX;05O-n6F2G68IOj9pL*ou;5gI$Bd zT!TDm9n3Im@CCDnf4D-JW00q#laFh#f{&-StAaX2U%aP_Iy7X7&+Yp93dn_FqC!b# zZfbE!Vr~I!!GVrKUcLgx@*h2v@PVIS0!oLVIqc%{Oi;+eXJ{ee3n}q688}n&6{;Z< zdytt5kcSB`w}nS@Vsc4lSt@AnJ!nBKxZwlWjcZvaCnuIbfe1l61c)L~Qxj4Y`bGu^ z`oy~i1^EZXJNvu1g33)z9R*}z-(YvBXi`p5F2sYy(by`wSWrEo6a<^`Of4$PFS1fl zP0>+M1?`5+&xLJQPALU#dk2XYWPmCg=-C>OAVfWDMh~>=hd}{1@bPzd^Yn3r_(2D* zlGDfE-P29O$5%%|19EIYPJVhkc(<pi)Ia3)U(tfXsY@ z))&CGOM?zm$jQ&oR!A&SKrC(nE$ULxQV7WaA1aWT1EMNHd;LMD*?`WEN`%go!wxn8 z?QT~{&o5!%VBLA3>HfU*)FK6Ny92BkVnkAET7FTgLJ>Ik zfsV&e@XS-lF9Pq)&IjuSEf2^@Rmd;N0PoiZ1qSFa2hdp)$)Nq=pwNZ{ZDI-NXochq z(DrW7ZgjAAxMM)oZX$Tep#peqXl7n!3g}dV)MC&wE08H5=Ytjt7M14ZfzD+B`5SbO z0w@6U^FTB8i76?d@Xsts%>|u~faDM8p%$shC6F!ai6F~C7)cF=U%~P)TQiFlpcaG9 zWJt_I_Auz!j6~3KDX{NBegkp)F5U03BmdlB$rX0Eu2`VGo%dFD@x6O)e=d0-aZp zmjYf}4>kdQXjyS$F6i8`V$eeUq*RbiP)k!&6!P;B=V+9Gb4D>FWfqqdWhR&8z%vNs zObbX70>wEvvddFJ3wl7=4ZNZsvR0%RY&+6wV9>0;LUCyk>`(*L^V*6PG{6;Xv8F;| zQ7UNd6$1lkjR+_BjGbshBa2vTaQ|P2fq`KK=v+Ag1_s#q`uF%57;f-0FkI$mU^vas zz;KM8fngp$1H%k{1_sbrKn6bpgDpP;gE>C~g9<+b!yi5dhOc}K4Da|D7+yfn2G{@{ zC-CQEV2}fe^D;0z;$>jC%L_RZ;1Vwb!#Q3ChPk{943)eL45hpb3?;k_44J$P45_>f z4B@;C3`V>R4D7rN49vU?41ahS7=G|DFdT!9E9^(wH&D*Qz~ITlz~I8ez+lD0z+le9 zz#t3VBfyBXUf>ru1H(#g28Lza3=GB4H3FdV1#{>*gv`)=1J}417!GhTFs$WbV5sL} zU`XL&U@+riU|{27V7S4_z_1pyXM&S~VHGC>189#x4D_r)Q%(kk9~=w}UpN>To^UWQ z?Bify*u%lVFpqSvM?}QVPRlc$HKs{nuUR3B?|+?3Kj;2B`gdKsnBr@X%+?s zaTW#!P8J4+qs$BphnX1|Rx&d%tYBtf$Yy3>h+$@6uwZ6j5Ch3EF)$orVqjR$#K5qY ziGg7a6C|yH&Nu`OWe|(?VaND^3tk1#=}hsNd1?8eG3@m6_~ML2!}#KoA`J~tAG-vx zl}8hCm{@U1QBG=}224Ox2Vsh?9qg2-j6_3F06 zOckJG%ydA9)D(dhT7gXAgj5r-#nqrzod(=U1zYfFTz;~Kp^gG*QFwlu2BgggJz`H2 zWoZzK6sH#47;A=V1}Yq_23r>dKI#p0gd_MwNbu1jDfy|zdFr4YMTt2%l?q9z-~(bZ zQj1c-^*QvknWR*O+ENIQcWWR`5Kyt7 zl#>c-dVq!~kq^|&+QZRN0Ey{OTI`Ve$DWMU?$B?!)D z5Vt}C4wM5S`w^j?8t}ST*qN=MmLezsK`pyf(9x41#`VQ7J#lvz{^4i3Zta9|gd*C}`xu zPDIO3Q?Sqk1rIbdi;I%MdW#a_EB%Y}ON-#=;KGL1zzcy>i!zfHz;k)v71p2=EN4Rq=is#8E~gcZPt*n;=(g1RrDffrQIs}+u3|W0pPvVP-BhZq6LtB74e{zw&(_fOES>% zUIys#urMD$iWsD$O+mZ75nBo%N1MWu6sWdDOHQEuzMxJRG*d#11J!E<`H=o7QtBzl zE&-<=w1bwx{VB+fZqQktnR(C^<^fO>6cV9@0cd+wDY%CM9t%kX?+66-5kaQ|!paSB zZzU0G9K1_|$ibj;4OAP%r{$CuXF%&iPz3<0ZXrbiVhaZ-jI&E1*%j2B0nMv|dL{ZG zLct5PJE0hKbX%nY=v+onza$lEGwAF$(ApL72q##zGiaU%)U|`{TL!rwvL8f8p#XGn z8MMZO`2@7fAvG}vyw5=o(w_nES^+tf6M23W)CL62vw#m{HBrz86|8zlsR86W@Mav) zrX|?&0-Oebk`L;JGn`5x)5~DvA^S#ii_^h8(4Z_Ryg+>T@dU8Ig|$*3-i-$jO+wl# zobbvY_4I475>RskGytgp&Yb44aEp+A1r8fAG!0}Y3pAx*(EzS{GxMOwQ$lTFTEJ=lxjnLQwn*a(-PVkT!DD`N7Rz*R|L`7TBSR!OQWjyGNLN`xm zPe-44H}D=VSSVP-8*redc(B%05YqO1_yh{1wFYfvA@9iq>4Z1~6ssT?AQx}83LdVG zK_O1Ajv)}opx6(J1xRHIZAidE9$Y4Yf*%_4_$+|5^^i;lD~85A)TfZR2RRkoEK)GV zvJDk<{vT-SUl7{=huz=zjh}(x0d(%am7jsZou7e05xUm@F&_iN1?YPJ3O)t~dp-sR zc|Hb)pS%nVM|l|-cJneYtl(u}$meBXaOP!TkmO}xc*DcMaFmCEVImI$Lpu)xLou|U zE(E;~-~e9pKd4VG&CS5@g^PjVBo_n2R4xXFZY~CfVlD;-LoNmeb}j~nznlyV zKSBL%P6me0oD2+yI2joBa56B=S`G#VKMn>4FX+7h@*E5dvK$Ny0vrqszd`+N zb_RwI>7#Q@}7#N3w^nHU%nnHU&EnHU(r@ek^ZgGN(9ZA?hR zj?)pkTM0RPIHPX5fz4DQS6lFU22tB_LXx=xxWxLDT?L_u11AoGGjr>VfEM?g}L%}CLPhLBz!*j{ic3{eRi@&GNiOE1ZQsW!l_ z8Z?dp>IS2#w#2SDBfq!=MKP8j0kz+dJ(gO88mcwQN-0KR!JFw`|D5)}XX`U>zA110C#S4Y7@aWCtDRg!mZL z#zGlKgzc9mG3|j(gKjYevvDRg(3#%3kU0j(U`9!5MG34K2i6Me4S|YiXsHh?;vuO5 zqJo%&04o4N5elv@U}MC!plP+7R0VLBRD^6{2REr;b8EPd6oa&!V1*TEA`NY!1E`q= zZDoO*S4pL5kZv~8Qcq}2r)vk9Q?dosIS@slq61_CsL=>^9pcUvuv$&f5F@Bi0W}!m zuEja?$qA~g!E?Egz7(jB1??;qLngGq$5A8C%z-AMK$EVpUJqjB9H?1}ZNE6YoewMf zK#AEGv@<^`Kc!L!b2B+�Y#92V|@RG`<9>-ceSrK*k+GTX#WAS2z)_fkgpC59RCl z5Eg;r0DXlcq>mC0YF$9R3r;T}p9X>Qd2xwCq5?=3mX0ABV4WJoqC{9-MPuKcOBxj56~;QyY+b7_cwm z^l=RF^fRP!XhAH&7FOWG26R^ws-rzr6uEP-p)c;Xgq7N?egPgyH11rL!C2s8&! zlP|R>9;BMU%Gcn~P};AB1KEK)$iM*y$s@(k9yC};M?ndc0vx~|2m8fVUA0(U32_zy z$bS%xuq=+UY7iuid%++ig@G0W#)I5PAe?+bYG|Ccz;@scCneCJ0j>puAm_oB3}Ow8 f^peb!_}u&y(9#|}$p^j=n?QJg)PdG(BL@ipZ-R3D diff --git a/server/modules/routing/binlog/blr.c b/server/modules/routing/binlog/blr.c index 005f360dc..143722a25 100644 --- a/server/modules/routing/binlog/blr.c +++ b/server/modules/routing/binlog/blr.c @@ -540,7 +540,7 @@ int i = 0; dcb_printf(dcb, "\t\tServer-id: %d\n", session->serverid); if (session->hostname) dcb_printf(dcb, "\t\tHostname: %s\n", session->hostname); - dcb_printf(dcb, "\t\tSlave DCB: %x\n", session->dcb); + dcb_printf(dcb, "\t\tSlave DCB: %p\n", session->dcb); dcb_printf(dcb, "\t\tNext Sequence No: %d\n", session->seqno); dcb_printf(dcb, "\t\tState: %s\n", blrs_states[session->state]); dcb_printf(dcb, "\t\tBinlog file: %s\n", session->binlogfile); diff --git a/server/modules/routing/binlog/blr_master.c b/server/modules/routing/binlog/blr_master.c index a60145f9e..515745704 100644 --- a/server/modules/routing/binlog/blr_master.c +++ b/server/modules/routing/binlog/blr_master.c @@ -423,21 +423,39 @@ int no_residual = 1; len = extract_field(pdata, 24) + 4; } - if (reslen < len && gwbuf_length(pkt) >= len) // Message straddles buffers + if (reslen < len && gwbuf_length(pkt) >= len) { - /* Allocate a contiguous buffer for the binlog message */ + /* + * The message is contianed in more than the current + * buffer, however we have the complete messasge in + * this buffer and the chain of remaining buffers. + * + * Allocate a contiguous buffer for the binlog message + * and copy the complete message into this buffer. + */ msg = malloc(len); + if (GWBUF_LENGTH(pkt->next) < len - reslen) + printf("Packet (length %d) spans more than 2 buffers\n", len); memcpy(msg, pdata, reslen); memcpy(&msg[reslen], GWBUF_DATA(pkt->next), len - reslen); ptr = msg; } - else if (reslen < len) // Message straddles buffers + else if (reslen < len) { + /* + * The message is not fully contained in the current + * and we do not have the complete message in the + * buffer chain. Therefore we must stop processing until + * we receive the next buffer. + */ break; } else { + /* + * The message is fully contained in the current buffer + */ ptr = pdata; msg = NULL; } @@ -474,10 +492,6 @@ int no_residual = 1; } else { - if (hdr.event_type == ROTATE_EVENT) - { - blr_rotate_event(router, ptr, &hdr); - } if (hdr.event_type == HEARTBEAT_EVENT) { #ifdef SHOW_EVENTS @@ -490,8 +504,20 @@ int no_residual = 1; ptr = ptr + 5; // We don't put the first byte of the payload // into the binlog file blr_write_binlog_record(router, &hdr, ptr); + if (hdr.event_type == ROTATE_EVENT) + { + blr_rotate_event(router, ptr, &hdr); + } blr_distribute_binlog_record(router, &hdr, ptr); } + else + { + ptr += 5; + if (hdr.event_type == ROTATE_EVENT) + { + blr_rotate_event(router, ptr, &hdr); + } + } } } else @@ -508,7 +534,7 @@ int no_residual = 1; } else { - pkt = gwbuf_consume(pkt, 4 + hdr.payload_len); + pkt = gwbuf_consume(pkt, len); } } @@ -578,8 +604,6 @@ int len; uint64_t pos; char file[BINLOG_FNAMELEN+1]; - ptr += 4; // Skip packet header - ptr++; // Skip the OK ptr += 19; // Skip event header len = hdr->event_size - 19; // Event size minus header pos = extract_field(ptr, 32) + (extract_field(ptr+4, 32) << 32); @@ -649,6 +673,10 @@ ROUTER_SLAVE *slave; memcpy(buf, ptr, hdr->event_size); slave->dcb->func.write(slave->dcb, pkt); slave->binlog_pos = hdr->next_pos; + if (hdr->event_type == ROTATE_EVENT) + { + blr_slave_rotate(slave, ptr); + } } slave = slave->next; diff --git a/server/modules/routing/binlog/blr_slave.c b/server/modules/routing/binlog/blr_slave.c index 79a94844b..0a52fe2c0 100644 --- a/server/modules/routing/binlog/blr_slave.c +++ b/server/modules/routing/binlog/blr_slave.c @@ -719,10 +719,36 @@ struct timespec req; *ptr++ = slave->seqno++; *ptr++ = 0; // OK head = gwbuf_append(head, record); + if (hdr.event_type == ROTATE_EVENT) + { + close(fd); + blr_slave_rotate(slave, GWBUF_DATA(record)); + if ((fd = blr_open_binlog(router, slave->binlogfile)) == -1) + { + LOGIF(LE, (skygw_log_write( + LOGFILE_ERROR, + "blr_slave_catchup failed to open binlog file %s\n", + slave->binlogfile))); + break; + } + } written = slave->dcb->func.write(slave->dcb, head); if (written) slave->binlog_pos = hdr.next_pos; rval = written; + if (hdr.event_type == ROTATE_EVENT) + { + close(fd); + blr_slave_rotate(slave, GWBUF_DATA(record)); + if ((fd = blr_open_binlog(router, slave->binlogfile)) == -1) + { + LOGIF(LE, (skygw_log_write( + LOGFILE_ERROR, + "blr_slave_catchup failed to open binlog file %s\n", + slave->binlogfile))); + break; + } + } atomic_add(&slave->stats.n_events, 1); burst++; } @@ -765,3 +791,18 @@ ROUTER_INSTANCE *router = slave->router; blr_slave_catchup(router, slave); } } + +/** + * Rotate the slave to the new binlog file + * + * @param slave The slave instance + * @param ptr The rotate event (minux header and OK byte) + */ +void +blr_slave_rotate(ROUTER_SLAVE *slave, uint8_t *ptr) +{ + ptr += 19; // Skip header + slave->binlog_pos = extract_field(ptr, 32) + (extract_field(ptr+4, 32) << 32); + memcpy(slave->binlogfile, ptr + 8, BINLOG_FNAMELEN); + slave->binlogfile[BINLOG_FNAMELEN] = 0; +} diff --git a/server/modules/routing/debugcmd.c b/server/modules/routing/debugcmd.c index e34b14e94..fe4397d64 100644 --- a/server/modules/routing/debugcmd.c +++ b/server/modules/routing/debugcmd.c @@ -36,7 +36,9 @@ * Date Who Description * 20/06/13 Mark Riddoch Initial implementation * 17/07/13 Mark Riddoch Additional commands - * 09/08/2013 Massimiliano Pinto Addes enable/disable commands (now only for log) + * 09/08/2013 Massimiliano Pinto Added enable/disable commands (now only for log) + * 20/05/14 Mark Riddoch Added ability to give server and service names rather + * than simply addresses * * @endverbatim */ @@ -69,6 +71,8 @@ #define ARG_TYPE_ADDRESS 1 #define ARG_TYPE_STRING 2 #define ARG_TYPE_SERVICE 3 +#define ARG_TYPE_SERVER 4 +#define ARG_TYPE_DBUSERS 5 /** * The subcommand structure * @@ -91,16 +95,16 @@ struct subcommand showoptions[] = { {0, 0, 0} }, { "dcb", 1, dprintDCB, "Show a single descriptor control block e.g. show dcb 0x493340", {ARG_TYPE_ADDRESS, 0, 0} }, - { "dbusers", 1, dcb_usersPrint, "Show statistics and user names for a service's user table.\n\t\tExample : show dbusers ", - {ARG_TYPE_ADDRESS, 0, 0} }, + { "dbusers", 1, dcb_usersPrint, "Show statistics and user names for a service's user table.\n\t\tExample : show dbusers |", + {ARG_TYPE_DBUSERS, 0, 0} }, { "epoll", 0, dprintPollStats, "Show the poll statistics", {0, 0, 0} }, { "modules", 0, dprintAllModules, "Show all currently loaded modules", {0, 0, 0} }, { "monitors", 0, monitorShowAll, "Show the monitors that are configured", {0, 0, 0} }, - { "server", 1, dprintServer, "Show details for a server, e.g. show server 0x485390", - {ARG_TYPE_ADDRESS, 0, 0} }, + { "server", 1, dprintServer, "Show details for a server, e.g. show server 0x485390. The address may also be repalced with the server name form the configuration file", + {ARG_TYPE_SERVER, 0, 0} }, { "servers", 0, dprintAllServers, "Show all configured servers", {0, 0, 0} }, { "services", 0, dprintAllServices, "Show all configured services in MaxScale", @@ -143,7 +147,7 @@ struct subcommand shutdownoptions[] = { "service", 1, shutdown_service, - "Shutdown a service, e.g. shutdown service 0x4838320", + "Shutdown a service, e.g. shutdown service 0x4838320 or shutdown service \"Sales Database\"", {ARG_TYPE_SERVICE, 0, 0} }, { @@ -176,7 +180,7 @@ static void set_server(DCB *dcb, SERVER *server, char *bit); */ struct subcommand setoptions[] = { { "server", 2, set_server, "Set the status of a server. E.g. set server 0x4838320 master", - {ARG_TYPE_ADDRESS, ARG_TYPE_STRING, 0} }, + {ARG_TYPE_SERVER, ARG_TYPE_STRING, 0} }, { NULL, 0, NULL, NULL, {0, 0, 0} } }; @@ -187,7 +191,7 @@ static void clear_server(DCB *dcb, SERVER *server, char *bit); */ struct subcommand clearoptions[] = { { "server", 2, clear_server, "Clear the status of a server. E.g. clear server 0x4838320 master", - {ARG_TYPE_ADDRESS, ARG_TYPE_STRING, 0} }, + {ARG_TYPE_SERVER, ARG_TYPE_STRING, 0} }, { NULL, 0, NULL, NULL, {0, 0, 0} } }; @@ -200,9 +204,9 @@ static void reload_config(DCB *dcb); */ struct subcommand reloadoptions[] = { { "config", 0, reload_config, "Reload the configuration data for MaxScale.", - {ARG_TYPE_ADDRESS, 0, 0} }, + {0, 0, 0} }, { "dbusers", 1, reload_dbusers, "Reload the dbuser data for a service. E.g. reload dbusers 0x849420", - {ARG_TYPE_ADDRESS, 0, 0} }, + {ARG_TYPE_DBUSERS, 0, 0} }, { NULL, 0, NULL, NULL, {0, 0, 0} } }; @@ -358,7 +362,8 @@ static struct { static unsigned long convert_arg(char *arg, int arg_type) { -unsigned long rval; +unsigned long rval; +SERVICE *service; switch (arg_type) { @@ -370,6 +375,20 @@ unsigned long rval; if ((rval = (unsigned long)strtol(arg, NULL, 0)) == 0) rval = (unsigned long)service_find(arg); return rval; + case ARG_TYPE_SERVER: + if ((rval = (unsigned long)strtol(arg, NULL, 0)) == 0) + rval = (unsigned long)server_find_by_unique_name(arg); + return rval; + case ARG_TYPE_DBUSERS: + if ((rval = (unsigned long)strtol(arg, NULL, 0)) == 0) + { + service = service_find(arg); + if (service) + return (unsigned long)(service->users); + else + return 0; + } + return rval; } return 0; }