From dff5ded1bd945099847011c62718011541ca832d Mon Sep 17 00:00:00 2001 From: Igor Gaponenko Date: Fri, 27 Sep 2024 18:51:27 -0700 Subject: [PATCH] Refactored and extend the Qserv Documentation Portal - Minor changes in the front page layout - Eliminated obsolete documents in all sections - Added the User's Guide for the asynchronous query interface - Added the User's Guide for the HTTP frontend - Updated Qserv Developer's Guide - Added notes for building the sciSQL library for Qserv containers - Added Administrator's guide on (re-)building the "director" indexes - Added Administrator's guide on (re-)building indexes on the data tables at workers - Added the Ingest Workflow Developer's Guide --- doc/_static/ingest-options-pull.png | Bin 0 -> 60953 bytes doc/_static/ingest-options-push.png | Bin 0 -> 55903 bytes doc/_static/ingest-options-read.png | Bin 0 -> 60993 bytes doc/_static/ingest-options.pptx | Bin 0 -> 45246 bytes doc/_static/ingest-table-types-dependent.png | Bin 0 -> 74134 bytes .../ingest-table-types-partitioned.png | Bin 0 -> 87261 bytes doc/_static/ingest-table-types-regular.png | Bin 0 -> 84448 bytes doc/_static/ingest-table-types.pptx | Bin 0 -> 67480 bytes doc/_static/ingest-trans-multiple-chunks.png | Bin 0 -> 63832 bytes doc/_static/ingest-trans-multiple-one.png | Bin 0 -> 62630 bytes .../ingest-trans-multiple-scattered.png | Bin 0 -> 74718 bytes doc/_static/ingest-trans-multiple.pptx | Bin 0 -> 54238 bytes doc/_static/ingest-transaction-fsm.png | Bin 0 -> 72474 bytes doc/_static/ingest-transaction-fsm.pptx | Bin 0 -> 46083 bytes doc/_static/ingest-transactions-aborted.png | Bin 0 -> 53776 bytes doc/_static/ingest-transactions-aborted.pptx | Bin 0 -> 42974 bytes doc/_static/ingest-transactions-failed.png | Bin 0 -> 77490 bytes doc/_static/ingest-transactions-failed.pptx | Bin 0 -> 45976 bytes doc/_static/ingest-transactions-resolved.png | Bin 0 -> 65354 bytes doc/_static/ingest-transactions-resolved.pptx | Bin 0 -> 46021 bytes doc/_static/subchunks.png | Bin 0 -> 2771 bytes doc/admin/data-table-indexes.rst | 608 +++++++++ doc/admin/director-index.rst | 108 ++ doc/admin/index.rst | 15 +- doc/admin/qserv-ingest/index.rst | 15 - doc/admin/row-counters.rst | 176 +++ doc/admin/test-set.rst | 60 - doc/conf.py | 1 + doc/dev/css.rst | 68 - doc/dev/index.rst | 14 +- doc/dev/quick-start-devel.rst | 4 + doc/dev/scisql.rst | 113 ++ doc/dev/wmgr-api.rst | 1092 ----------------- doc/documenteer.toml | 2 +- doc/index.rst | 1 + doc/ingest/api/advanced/async-concurrency.rst | 75 ++ doc/ingest/api/advanced/charset.rst | 93 ++ doc/ingest/api/advanced/config.rst | 105 ++ doc/ingest/api/advanced/contributions.rst | 51 + doc/ingest/api/advanced/directors.rst | 162 +++ doc/ingest/api/advanced/index.rst | 26 + doc/ingest/api/advanced/optimisations.rst | 59 + doc/ingest/api/advanced/ref-match.rst | 94 ++ doc/ingest/api/advanced/transactions.rst | 277 +++++ doc/ingest/api/advanced/unpublishing.rst | 54 + doc/ingest/api/advanced/warnings.rst | 106 ++ doc/ingest/api/concepts/contributions.rst | 87 ++ doc/ingest/api/concepts/families.rst | 37 + doc/ingest/api/concepts/index.rst | 35 + doc/ingest/api/concepts/overview.rst | 254 ++++ doc/ingest/api/concepts/publishing.rst | 68 + doc/ingest/api/concepts/table-types.rst | 79 ++ doc/ingest/api/concepts/transactions.rst | 257 ++++ doc/ingest/api/index.rst | 21 + doc/ingest/api/introduction.rst | 90 ++ doc/ingest/api/post-ingest/index.rst | 12 + doc/ingest/api/reference/index.rst | 12 + .../api/reference/rest/controller/config.rst | 426 +++++++ .../rest/controller/db-table-management.rst | 559 +++++++++ .../rest/controller/director-index.rst | 139 +++ .../api/reference/rest/controller/index.rst | 14 + .../api/reference/rest/controller/info.rst | 137 +++ .../rest/controller/row-counters.rst | 193 +++ .../rest/controller/table-location.rst | 243 ++++ .../rest/controller/trans-management.rst | 794 ++++++++++++ doc/ingest/api/reference/rest/general.rst | 314 +++++ doc/ingest/api/reference/rest/index.rst | 10 + .../api/reference/rest/worker/index.rst | 915 ++++++++++++++ doc/ingest/api/reference/tools.rst | 17 + doc/ingest/api/simple/index.rst | 648 ++++++++++ doc/ingest/data/index.rst | 13 + doc/ingest/data/intro.rst | 109 ++ doc/ingest/data/partitioner.rst | 171 +++ doc/ingest/data/partitioning.rst | 204 +++ doc/ingest/data/ref-match.rst | 236 ++++ doc/ingest/index.rst | 14 + doc/ingest/intro.rst | 39 + doc/ingest/qserv-ingest/index.rst | 15 + .../qserv-ingest/ingest.yaml | 0 .../qserv-ingest/input-data.rst | 0 doc/{admin => ingest}/qserv-ingest/itest.rst | 0 doc/{admin => ingest}/qserv-ingest/repcli.rst | 0 doc/{admin => ingest}/qserv-ingest/run.rst | 0 .../qserv-ingest/version.rst | 0 doc/templates/overview.html | 142 ++- doc/user/async.rst | 174 +++ doc/user/http-frontend-general.rst | 164 +++ doc/user/http-frontend-ingest.rst | 360 ++++++ doc/user/http-frontend-query.rst | 423 +++++++ doc/user/http-frontend.rst | 35 + doc/user/index.rst | 525 +------- doc/user/sql.rst | 534 ++++++++ 92 files changed, 10075 insertions(+), 1823 deletions(-) create mode 100755 doc/_static/ingest-options-pull.png create mode 100755 doc/_static/ingest-options-push.png create mode 100755 doc/_static/ingest-options-read.png create mode 100644 doc/_static/ingest-options.pptx create mode 100755 doc/_static/ingest-table-types-dependent.png create mode 100755 doc/_static/ingest-table-types-partitioned.png create mode 100755 doc/_static/ingest-table-types-regular.png create mode 100644 doc/_static/ingest-table-types.pptx create mode 100755 doc/_static/ingest-trans-multiple-chunks.png create mode 100755 doc/_static/ingest-trans-multiple-one.png create mode 100755 doc/_static/ingest-trans-multiple-scattered.png create mode 100644 doc/_static/ingest-trans-multiple.pptx create mode 100755 doc/_static/ingest-transaction-fsm.png create mode 100644 doc/_static/ingest-transaction-fsm.pptx create mode 100755 doc/_static/ingest-transactions-aborted.png create mode 100644 doc/_static/ingest-transactions-aborted.pptx create mode 100755 doc/_static/ingest-transactions-failed.png create mode 100644 doc/_static/ingest-transactions-failed.pptx create mode 100755 doc/_static/ingest-transactions-resolved.png create mode 100644 doc/_static/ingest-transactions-resolved.pptx create mode 100644 doc/_static/subchunks.png create mode 100644 doc/admin/data-table-indexes.rst create mode 100644 doc/admin/director-index.rst delete mode 100644 doc/admin/qserv-ingest/index.rst create mode 100644 doc/admin/row-counters.rst delete mode 100644 doc/admin/test-set.rst delete mode 100644 doc/dev/css.rst create mode 100644 doc/dev/scisql.rst delete mode 100644 doc/dev/wmgr-api.rst create mode 100644 doc/ingest/api/advanced/async-concurrency.rst create mode 100644 doc/ingest/api/advanced/charset.rst create mode 100644 doc/ingest/api/advanced/config.rst create mode 100644 doc/ingest/api/advanced/contributions.rst create mode 100644 doc/ingest/api/advanced/directors.rst create mode 100644 doc/ingest/api/advanced/index.rst create mode 100644 doc/ingest/api/advanced/optimisations.rst create mode 100644 doc/ingest/api/advanced/ref-match.rst create mode 100644 doc/ingest/api/advanced/transactions.rst create mode 100644 doc/ingest/api/advanced/unpublishing.rst create mode 100644 doc/ingest/api/advanced/warnings.rst create mode 100644 doc/ingest/api/concepts/contributions.rst create mode 100644 doc/ingest/api/concepts/families.rst create mode 100644 doc/ingest/api/concepts/index.rst create mode 100644 doc/ingest/api/concepts/overview.rst create mode 100644 doc/ingest/api/concepts/publishing.rst create mode 100644 doc/ingest/api/concepts/table-types.rst create mode 100644 doc/ingest/api/concepts/transactions.rst create mode 100644 doc/ingest/api/index.rst create mode 100644 doc/ingest/api/introduction.rst create mode 100644 doc/ingest/api/post-ingest/index.rst create mode 100644 doc/ingest/api/reference/index.rst create mode 100644 doc/ingest/api/reference/rest/controller/config.rst create mode 100644 doc/ingest/api/reference/rest/controller/db-table-management.rst create mode 100644 doc/ingest/api/reference/rest/controller/director-index.rst create mode 100644 doc/ingest/api/reference/rest/controller/index.rst create mode 100644 doc/ingest/api/reference/rest/controller/info.rst create mode 100644 doc/ingest/api/reference/rest/controller/row-counters.rst create mode 100644 doc/ingest/api/reference/rest/controller/table-location.rst create mode 100644 doc/ingest/api/reference/rest/controller/trans-management.rst create mode 100644 doc/ingest/api/reference/rest/general.rst create mode 100644 doc/ingest/api/reference/rest/index.rst create mode 100644 doc/ingest/api/reference/rest/worker/index.rst create mode 100644 doc/ingest/api/reference/tools.rst create mode 100644 doc/ingest/api/simple/index.rst create mode 100644 doc/ingest/data/index.rst create mode 100644 doc/ingest/data/intro.rst create mode 100644 doc/ingest/data/partitioner.rst create mode 100644 doc/ingest/data/partitioning.rst create mode 100644 doc/ingest/data/ref-match.rst create mode 100644 doc/ingest/index.rst create mode 100644 doc/ingest/intro.rst create mode 100644 doc/ingest/qserv-ingest/index.rst rename doc/{admin => ingest}/qserv-ingest/ingest.yaml (100%) rename doc/{admin => ingest}/qserv-ingest/input-data.rst (100%) rename doc/{admin => ingest}/qserv-ingest/itest.rst (100%) rename doc/{admin => ingest}/qserv-ingest/repcli.rst (100%) rename doc/{admin => ingest}/qserv-ingest/run.rst (100%) rename doc/{admin => ingest}/qserv-ingest/version.rst (100%) create mode 100644 doc/user/async.rst create mode 100644 doc/user/http-frontend-general.rst create mode 100644 doc/user/http-frontend-ingest.rst create mode 100644 doc/user/http-frontend-query.rst create mode 100644 doc/user/http-frontend.rst create mode 100644 doc/user/sql.rst diff --git a/doc/_static/ingest-options-pull.png b/doc/_static/ingest-options-pull.png new file mode 100755 index 0000000000000000000000000000000000000000..1d25db0f3a3072a3a82fb7ee94bb27ca7a7bd4a5 GIT binary patch literal 60953 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 literal 0 HcmV?d00001 diff --git a/doc/_static/ingest-options-push.png b/doc/_static/ingest-options-push.png new file mode 100755 index 0000000000000000000000000000000000000000..db9aa5338d0c43e97c772fb7558da504b9dceb0c GIT binary patch literal 55903 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 uQ~^FGG(AA0T9c>7@fL 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 literal 0 HcmV?d00001 diff --git a/doc/_static/ingest-options-read.png b/doc/_static/ingest-options-read.png new file mode 100755 index 0000000000000000000000000000000000000000..6c2b96bb819cf95ca94844010a4478c58735e6ca GIT binary patch literal 60993 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Ø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

snax&wpn&5?u|b|E}71Py$A1pI-Ul?+SIU z_(IZ#SM~W#39v>}n)_AKPSLvqqE6z0VF8Eqdo<*F_1ZHp(3FGhBZW^=%k<&3apw$z zPf0ZS=yQ~nTIyeQO?jRZ+dnP70}@O$mruI?W=l+}1|UhF`Rt#PA)}V$iHkdYmNM8H zpvk~R$HcIjl`*6$j(Yzej2rqwU>%%LoCN;O;Rw(~Mbv@L_xB_<@T{kbqBZy57W}bh z>TiHMCwN4 zU%dXmbAKLH0wm`{G8V!=tHS?BDixQ+_=7$((b|Cf`vC*8FxCKbRqa?^Hwvr|DxZxB z^f_R~|0Pqv_iVo_F2RN3D+V%`!dJ|`&*#5iiUtVMWM;iW9Es`;9!o@Vd z#YZ77h|vcx8F!>{ORf15j11MUuf~M_6yQUMI3dON6!V>=1_({acNmClSbKyR$p>5$rQGd|0E~@0~Z$;1H(~2xz>-a10AQ` z+mxH+ZyItK(6Kd|M~F94s$Qy5QF^^oTDb!&pDU0}0!TLvtlCEw&Q4AWg4_AOg`rq= zvzOZ6Wg$RSL7;o z_QD&5-}@6pILZF5!)iqxQGAP+bN20fGqs!F((H~^TqJHA0a{5EQtx!N$pWqeHwdPA4#a%p#v}blGuTx>s zrKEV~8<+21FbUDI(5OaXJboPcn91n9k4pcMNSL$`cLkg#s-CAyehtV}W@ZGMc$r`F zzXVFY7@_Ew*&W4&nN3#X-*$Ix%3&)((Ce+d7;Xd&e{xK{=%oWASf=FxV|-fLZ(sU{ z#w-$Du2k0XwV%~FCb1j{;}a5(I-O7r5`CJyCNgZ3rKTUDa+#=Q*t8fT|# zu&v-a#}Y!ww)o4i-$syYGj36#d*<%$yoEIO>@2dm}l z@EM>i4?w;E-$|z+*Rb6$wQUrTxw6Qpj!MD=FW+g9OlFRPFl%fFVZGmXm&echSD&cU`V=d$|^;XmiFdLLum4>E+d= zu;4r_0`Lthw54pXS3;?|&)>=xWxCB;0VqGGVrczh&kvkm`FuA<+R&%O zZ!eqA-wLUjq{3eR91-q7|0^)kv7Ie8fKjkq;sl0m-K=d={KXkWaC-Iw1>J7(ld&Jo zm(jl@+yWORB!_rVz z?V29|i^sI{69$uJ#ROx%)KCaEIRUd$lR>MORCF6WR5K6*)M5fK26fORf*3^aZ%)1k zJtC)7->qog_qyJzhhp)NtO4*eHJ5qhFJge%seA|Eu@i4vu7JRZ;-oX=%{#?DR*DV0rjXM@Pr1G`EHNcQmkKWEDR#dZTG=ZH*xbni%owEY&DytkyCk9D$Ae z{P~l1QD0YrTz_bAFb#VE>rW$F63{`;hdXmTly_p-R0=wISkWApl5h+C_|bou{@L-3 z`sNMj#|L>TjtYb)kh~>%pV=Jn$`jpM#BVILc$|3}v?|Xqx>GmWoH-|CVXFBgOT_UQ z07TQEQvdrqOg>A8AE`W`NGqCf$K+~UCad905r8XNVjS-Bqo;?guLCe*>+#I-4@&d0{$Lp}(228PP7-KO)4+pb)^o z*!`1W4WtA!i4pl01Xu;o=m+A0Ga475Jiz$O3E*%6Y_tQ`_Zl}0w%Fx{TC>6o+}vt$ zOL_dKAs^jbG~$iky$9(xD33tqe& z1=x1Wc@!JCqJXh+eb*qU39QjM=(+Zl3tu%_@fLm{N$xJ^ecU7OjcbLBv+8!Rz)>b! z+Y<1ZsN3giuEl@RM(7Lp+QF$yheHb4y=_>h(P|N4i^aD)?f0x0RQs?HY~^FVsgaRN z5bad2;l#{hvO9Ri*kX0C0#LnFehyr_Vn1fqx|9GpL}s5Ph9N1-v8UIT8A+z}fa>akN?xZiqVU}jwtA__?!MO~+7%;8}p zfNa$>-c0C{KG}lV^i)fGHD%cnrh&oH6B%FY$9f_Ey9y*sd=d(i zBXCF7l^~{*5JgefeFoIr=ObIHqXT)KqU2$ne;S^zW2Lh)w1lgobnf0mDqNztK1RW??yU-Rod z#!qGh1Q4H=IQ(Pq_d3QJt$gzw-atR%Q3x_ma^{hxR6a*Y(IVR54#%ejaDyAf6z)OO zZaS4M)Q86LnZWw5BvI`~7W>90trHpc#AO->nT@$0NQa=;IKwhy$1VR*Ff;nY_5 zmmk7&g*~U%+9A7&Y6qg%zF{AqJrJxDj@6gYP1if`w|EpogfpPuWOlJxo1~zBbCJe} z8y5CBtJW<-$1-uLYBRfS&19oNAsG;X{?fZ^QN;HahnYl?B^EvB>9L0=YLl`z7RLv9 z?P>b6ej*-6+qk%t%R}m}_8zbdV+iN97^0A+cRMGE%#gz<+Vcd{Z;PO_ij|>6%#$ob zUPeZF?ae@Rs&7nK7)LI-RJ3OT(W(+sr=aJLmbc3IT;&BKP;iP?yuPhGq}Gv z#SiclP;l>4vSywycDu0%rt_0!_SYo_ACW?PGZ}Oxyd%GcKRILy{K3JuNge+aNQbW@fIw{vmqfm`DW(DhjU^> z2eV~&hi&?i5BdH4cWX(3e$;PKyWKa+X1-=7l#BQ1A1K_NbPEwSj;PO${rZ|DCjb5? zmJGb0Dj4>b{UL~cq>ecyI0_`6-dbM|c{wZYyS zQ0%RoOLV^3I+|I1(3wZ`NN;_LvbZLSO%J*KgUrn!3mP>c_h%Y9D|@9ki zim(va2jh*7Z_=e~`3-pdhB%#}%6kNGtqv;%FY`p>r#%ei8Asb4h=oV2J}V}Y zqy(!ZT)qJ1K%&-0v<0rhGF_bWbW`+tWps7B#Hc^Ft{Vt^mb++j|K6FN#fB*@r{BrR3;@>7#Ti%5@<_qzDbj= zuv+Si%ewKt*th-6@GwXF9Gh%So_kzYH=P6nO~U(Z$1FeUKqpz^HL|m+7WO>*F^^(< zL(wMzs<%c2^1P$&tN1KUIZ0zuHr+OnoOLl}jU4^I8RIM_>T=Y1RGw>it2!smq?zo_ z?-S55FhK8t`+w3(C7 zAX&y4urtTn(9Cv9*lF$Eo>l%5iaAI5_Z&$OYs=vqs1_Gj!pJEvOMRYeBoBXyd>XHg zu2veCKvc4|3{}*`*m~;uH$&9=d8dH}$JN0S@PoJ=OB`H4LdjWPoYrfvQW|M^HQ@wb~xyCKKQ zL4~q-KlQ6Lsnd2j6F%!tA)yy7**~^I9=^|K$w)cfU-+3N45+bBAbq~$bydX!(5Fvm zFl&-g_vED1_@j%K3GJ*cruC$l_pT8t&yz~bF=>{iQJ5fm9J=1nfH<&sDXfJ5KL7l} z&?PnHK;g~nK)MjziA|=$QS5T+qY*kZlP5rC=zU!CdVivrld1lIXX;pKw?hjj&$det z7w2ch>#aJQ0XyAiQeCv%WfG&<8I#YV2NWV_wQ8LW?+6vzSeA4?KOrZr$e}wKLI>nM+>MVrO$Y zS8srSkb!L{GUs7^0ueX0?9<;o&$yl6%Z#!sngR9+VDNJ!?RFCzatr2ale4v+evO5R z-9@bsnp5)(y`ff#lqlaXRuq(Kl8&J=C)It!bU`YB8QlWJW*ge&m3UeAoV!XcD~kY&iynsh-HkMRPR@cUX#TmY4bR z)3SLX__MhqZF^?D)5IgyNcK;!3VqxT&}WmQh? zPFpNY7MQP>6Xq|)QPZ6<`Lt#1GcWb;@ua>2m4{AAV(Y6lBHRAL#&05 z?qWA`ES~C&m_nmJ`p=%(E)ACHRc8uTE9*>84n9|2KqZ)MF#0guJOqdTDy$TKg@J*A zz^Z`YDAStsL~289QqCPRxGbWp=|ec{RLe|mF@v`%+ry;+E*9H{p-7$oM-v$u=?Lwj zLttZMaTl;rNHHRe@muz~SmZV136Rdg+`9!&lhjPALda@8j(!1q<91@oW}8Nfq>=Gx zat?my*yl{|BPoS6Xca}TOlb#e3*K9P=mUu1IkI3Y*`+q$M>rHf4O~w-z62lhIz#*n z+hH0K0@Er6F5S8!)s+BY8^IM*k5BH}8%)FSb^Nu&4tsF(fhM!UWKiY#pn6;Eg(g?f zZQDo{y$Q&Yh0SKSBY#xYBGdDmK$%38GO|fk&+pXN4`CHG#SRJKB_@S^W|KELS%!^R z&jGnEn8(G@_j$W9D!Q#&r1Q*v?$U$aO}W9#>)}DDED!j3zT`z8SEXwiqwCO*Rp)j! zKXEP7^6TRsqjhr&D!;uQvKddBs@%}|G+#?iM9C6oeYu>+sc!GUKwMm-i9Dhv3n+~a z%vWo`(?Yo6WMjD?kILr&Q8Hb_8z{t$CElht`kINq^RS#-#A^*n#`4#iqY&6ad{$-U z1ocf{YWAcGkm@Fy?cE4H6J~5Mh^SI{@Is+|3^M!9&b*0&v%aElzKs#!H!EeBe~+4# zIwd8VMVP85Kuo3j2QMPmWsj|g29 ziYfIx-h7q3<+bVqlZ=Z6?eewf%N8ixbUm)tGw8j0Z~B)~+$~r=oI2(5G9MoCwEJ!C zz_8!r336yQkBs1BvvSNmCDpk+P@JMZcFpljfH*pm0ow?)rJ}gU&ELF!TELU|gCcvh zO5^)7PHkiozJNeu%2l&k$(>ZejC+slUh$x_uxu!$xnvYuU{itOnlZjFhRRl61XC!23yG^msq~x zqlVVDLHueerB0C~9GwksyScyUHCJpYfuePiC?|oy>m344NUfZfpy4^ytVNbU zd~plF87eJ3(=i&}KXwYfB9ICW22~hv$}!i7?{L3iy7b(#0)lx5WGLY5ipA4e@psA( zZ+)yQ!dW_U`gx#oCrXjNG2HtDB-{DV6#=Jj1BkBfEA`wy$&(EzAvFgiMC0&H%2PT8 z?p$&NG&jqC0Re2j{0(GrWS9aQ!~g>bvP_t8;iNgt@lCU9J=0i^zcQO6)A7}GQGIFz zrj$#8uXP@yKbfVEG3eIw-ff-&Q@#J*${B4@hF~#SxFJhHgHNW|j*OAdT-R? zwN~58jFLi3UsPIvsGqJT#1S8l$c~G@xQ-dQSc_4-;p%MtPTaHJa}kM+6}Q-~8H=*Y z&d0-LvPX@0uY2h`pK&0_T9Lx(8tK_cL_KMozRlzp*1VcAl6V!Q%wntI(aD@ruhCZ+ zGua1aXpnvXwNnH!rbM7mPNH3P`oXT}C?9u!{1x*?@XR$YoXK~4u;}C7ef(3zi}OpwG&r;lX}fsfo?wmD1hSHE372I^&}>c;8>;vN2If@=q^x#u9|!LD8v zkfb!3Z?)eBoAUu!bPKM!NtRS^uO{6^QD(w4U#yYVl4+@!2(c?C)_mg2J|#YR&={vf z6wmRV@o`ReKqEt$n=;2SyyvZUy?pgztM|#n9wPwo%)O7~GyIvOK0*yx@0!*J0>cx?}`kvNIXutM<(VxUM$#d7wuYwuI%QEVum@`S_#j#E0t z$!s$r0_xEKEJ+bPVKUzk0Jg|-A&y$rYW1qS+xwtb+Sdob=22qnjD-prf|$C(=hG(s zH%FnO6Gh1yEPIQs&37a|SL;c-@F}`yzKf&g6=XKKuHu6m+5`OZX|&~G0EoZjxtW1@ zS756;5etCpR^xiU^jtm3$+Q_7@4f+84-msE0tiWcG>54y1~!}%g(=nV+Y-UXwEf~FZempoatZCWKcNe_D zFTZJSM&Z#=Ij&m48T7^{=cqzQYpih3yNpv<3!x$k_4kyzWK0n(&?|t3IH&HZ?11>EV3Y>I%AP%}O181foSY zQYH(IH7T=7&2U}Id-RklOK<+XIy~oPjCby{COiU)vE!F}UqLpVB}yL`JvfrYjMOT6 zOznj67JxD;ItEj+J+SGdeh&L5@UgZIvUQVyk3xxvc&z#B08&JR zksUfssb3zP;hi#uTvouPEK5cf6gyx>a`5 z+_U{@?oyJtk|{hc2tlTS$BnxZA&!@ussR-N-ULcwn8)Ql~lm$TyW_@#qcX{R>*Iq;=o)2u$2^V%;iAn>Q}`8g%O48YQB}%)GZrNs)2N;}FwTT-ZIDukI^k z_{>Vbl-?+3f0Q7975jn=*a?`5Q#Vm`2PqL77nEWGHx;@DDx$qQ-PH0uwH(b2){co~ z*JPZyA%-)syhfbQ*)vJgKxHj-J#qHeqYiTAzw^WavxY#CDX^=iI$D%i@zZvO4hERjq;{et+)&&Zlq zJ)u1y)DY=)eQTd#*>&tbW)H%d>(#gBNB8o&!jqAZiI$tJ)I=2;rrWLhym2Bqm}I!4 zW$o9)eTx~!&s0u^Z|?^{s1NC4?kx~sNd-$ki^HOMQY(y^tSGG6-(j0f$h`CDe7c0z zJ)z-uOgv2HE|YdIKOs>6up9PMLDW);?_-*4So4{Durjy1l%A9bDd_IA@CjMDzL!nE zzp6iZQW7b?#%4iHue(~{3+ZqO$yq2^kYPWO4}=1wO0TGRaKH5k-ct>v5PP><_hp39{B`hlscHW#Ei4kN zD0*dwAD=l}?gw%cgw7!qhTcGF0buEKV(PiPf7Dw_a5n;Z)vCjn*=i1tmXMA_@txyw zX0}?hgbu0d@EOFnFZPPj-4xME3h`EyN;vzcoG4gZ#8XT+PI`;2-$pRevaF{2`#S); z0A{NvrxP?%9tc840lKqJDR*lXJ(B9@b5f zi%~1eRJQpllgVh~DLEF~+xQE|z1$G**InBTpl@V(Nj$x-IuZER^Pv%(WQn;(WUQE$`5~`Xo9R1>OI|+FOAuW3GaOt< z_B8@oLO*k8!iuW&Q-SdR);;3ly*c$_#$~&%)Bi)(S4UOZZC?w5(kY#Sba#g$Al=UKFWlNuq0Xq*R89k4W>v;LOe*eJz1Y$^tW)V+! z-u8qDj=425-^%zPj_phqE8@iAP^`w)#;+WHJ3~G!Hl^>XV>GZteYKxt&7aTJ4?1!< z994J}*RHM0jawnFTzR@g{HRb}$DJuy!kqk3T!fYLVe7m3Z(h&6T69-tn<56~ls*zp zLqgr*=2^g{#5cG8R1Vb2_#8dBOSR@pG|k0xnF3}iiJVR2u^0x|5m9G_4ZrRh^7Dm_ z)E7`_7PQ1F$>uA0(@f41UB}q5*>s@bL#T&|D;aGvDWr6g)|H(xbF-mP9Jx&Nrto>` z>806*DkV!7JSTL5qMASjH^epbnbWkl(=>h^!d>CBaSQd`Ux72UqNz=VB=PYvU(<^HtNFY4eqbLWA%zWezhiThl!g)Oj8)IBgsq$`#GYg?MzB%5!cho8gU=sj zx7^fBR`hLEwU)pCEwlkMX`@K~Y7Y0Qp{g-m>h~DK;)FC;tDedlD_EzvDxbuUBSk$4t+TA72uQz4yuc{7EZ(rK^N!=I-UD8 z-OD`XdRTBKWt#f#vk!nrem28WXNM5Z(Q!@U)VpeheQY8It|8$()w!ltsDucd|0O=A(15&G-Gd z?+s&|3PT8+vE}3XN@fo$j}z3=qd8>x_Sthx8>8}yUY?yOt}APu!{nR$woc*CsHdpi zzH9`9ZuiQBDutDaA*P0-kCHLgmS&DyQL59-*wrkqwj+Hn$Xn9J#j0*XSvL3QT^Gkc zX4EB{6q*mj9dC@z5Oxem5QCJzz9v@_+-P%-gLvQ9!FSsgmmc2qx}5#25kx)~cS*}rhG4_u8}r$oSESr+W?!AF5OZWkT}nINqU@)xRQkFh zt`^R}6q>BnDK=hKLEf^{P3&}JIF*Nff4VX7q5**d-(zQe_u`=(c|^OoMOU4$ zIXk@#dC-^%LlFrn2K3(zHs}lv>MTOUsr3wk)QWovjMBDw>QRV>TaYcaTQysM3e0Rv z@n~MMld)&k8pfU-6f*7lA7my+()OHQSjUFFx5ZB|D)U&~6v@Y{q8mcR~SD7i8V>%q~s9!|Vk`N%@ z=d{=}Pw=vg<9T%eJ8fKH;@!0nn`?<$HK#=$&)x7xj1Hgj3YD;r^rEa%jzA?Bt-*iW61s%B zs^p*;8h0(K%2T!$`4*7N&Gy7ZFIFlRW9g^DFZpt6)xxkt`pyMISn|xMER7DmF zBJcn!WNSs`#?Rns=TBM+?I_sYPvD884k4`YZrf{LkbWzBe7H-S{=i0Tun`xyluZ=!B!JU@{D$Z? ze25dRS0MJuU5*0fMTgqyPNlRID2nu}GqB>Lh5xkFnb8{!HiRO&!FkmO&&Q(?Kdb6r zUCK2=y)kgPbmI>dI<_bjh8HpUia{ol^;E!>F$W1q%q5rf9r8KVo$VzuG-2OMXh+eE z=jHhnC6=)>y|HMp5vm^yG!nh5S-I6hZ(Jb;bO_;S%-kj@l++o3*%fHn{LBL6g7=-F znLLD3qIC_v;Kk@t^4{0W#~_y+SdgATEmg4ZafKb=)^=b)v*zbcPYv7K=88j)y0HC zJB^&3zt(=4me}9_RLMZ+SvFI0UM8>i)%k8KZ%RU9d_jc$#enz`P(fjlDV~hE`Qg7{k(_-AhcJVoyy*$?FDLpx7KX<@( z@Y?}&F|c0hAnRp@?bTyeTZ({3rCa1EQKoZDQJTN}y546V&m(kklsd-u_nz;Srsl@T z;|Wf&pB1OkVDU^h4QYlX=DJN|iZ^=-martSmG9bCs6e4}tlIeS0U=!cdzlv+itMD! z7c;T!%k7#i2@`_!GnboFmyaqY2W72p^&OhJ_@im+ff4AgoqQ7S5632ot|>4pLa`pQ zxK=9ZL=tcc`Sa~5G@o(Y3jZoh-D^xN|K3wuBCoG*)W^X@==MnbUP*mdmNAAi^6e8S zAFK~MC$BRYwq(Fez6d?uI&Y zj(&sqetsO#&>^C{Px}l}$m;y#O=S|}i!o=yRmzY;R)-pb=b~O=O+?})_+i+0aJ&qW zr7tir4}>P$w%pu6mg<&PJFUEzT-#Rjcjn)3(@A2Y!EoE)fI=VM?)B-e4^mIZ>w_i*y>ok|5cV}Yhm?nK^UXx2|h;gFqwtX+me?iEU-!|2kwVcH5phu zJqn4ASuK?l|6x~X$T^0tHFYrpEK!?+HccO@Q5wI#_v-sUkdgw~V4ya5*0AZ@Q ztN(jtS?}5QXn#E)QQGG`(mMQULr`V57HJrdab?M@9*zH zkTlzJw;xJ6Q!diS$4y52aU|*A;1Eiz+FUsplzpqxg)CtAeWVFhz)mXv$Qo(^qv_r= zUuyRQ$<5ODjkK#Jk-RT5C)1b9fz4d1t)?sfj1?S}IP!TIP^p+h0dDW@`@flMT%_rA zW2V}Bl_bOpn&|Ys@vqwO-v!!beA;warG62La?DG@`&VrMSUb1hmH%CYX_tk;oH0?_o`R4Heik!9u;o>$A<4lxG?@bCsnOPXLyW2pU5EBcnsp5`HUAPY z`I*p&iHn<))Yd#b2QU5b@AX>Z(pNs+1J&mzRDVhcOD~!RZLZeq?mqST=P%F4EtG3z zEsU$bdi)RXS-u?bXCp(X{Q#v;nGUL`2Ysa0t7?ZeS@d60DjJ}?0y0{QNanvZS^04o zb@9@C0fooCu)$*Tt<3`AcvpfYv&jSZYxn`!d=4OdIcF9q?Nb{_tC`mPh{eUChOW@NHyilznCnE+oQ2qirr z=Pf}&fUuqX5HS22xZ0eWw5hf0q9G~}&)KHu-MkR4x8ea2a7!&s;zx z0~JoT)lULsjf{+icnmg53b>lxM#E=V6#PXc{!(l0-UvTd#Qn6oUy*7?bnd9GC1@v8>&fM*(W084i7y`qjxo`3TC5MV)F26DIQC+?K}G?IQuzG} z_mUD9Z!9`S&M7;AWuN7kI&-1iCYKF92EO)@=`t`c3;y7ISKQhyR;I#tK{IuHeixlO z?$pNnO$HR?2)*2gU4qqRJX;l(kfga*P@PYsWfIAbhm$J56GVD z$4@#TL{L(HT?j1C!*A3Pj3-vHJ6ah>dl*Wt4$^Vr(*wG-!jHLksE4E16&_+|HnVNqNw=5PReYBO+klcLup585_~@qK zBKt7*f;{#Rs1i{8&ic+esqS|-E)RJf8uag?Mtk^)m+TsXTx3}$2|2LQ<{Ld~H0UWQ zJ6Nn=*j2>2@qkUQ22P-qN3b!Sj30IbsZw(1Hh;|*RDjd4dsnJxs(Le-WYf~JYzIkn z@sD%@$&Z8Y(h>@V{CfjKuPqGDfo5GrGvqdcnT|1vQj`qiPhJd7g#b4G zd~TX(5cbVpM&%ciIOk{2aTvArv#Y*|%gTl(w)f?~BL$1w-*&ynTHJVEhYm>y)J_18 zH-Fd{ltBali8*>4_du&3_M_B|&+Ii-m50+5-af&2(T2Pe#Di401#QY_O}(?j?NR9~ z3hMq`rM}PS&k6oPiqB!zu#^egsD0c!v6o-EJziKU^2t7OX*9l19Vu{qk;KtcnX9&2 zUEyA1seBt5+lj~H2?QCeh{3$K7ZvqL_yXr4dA$hP0o+AB1?1e7OnZRgS|TSM_QOxXK=C*TID0ZzHK z9^iHn5fNcyWp%2xp5?5N0Q6t35zQPCc&?!M*zdwW9ANWpeKP>rcw=E8`WC5{5BiI5 z(35}%F|`7dSMq{n;lN074PI`t>mA$7cdyJY5+Se52;g7_lb_Ra#naozAr8n3Xcv@N zZA?+cKul3ShJ?y7V&WIqW#<(S`wrag&tZAltzsi}xhdLI9e=RQ^u%Z#v;v;U9fZ7+ zKg^mA#3O3Kt%WKhTfmWU&HK^8)HB%SlxaC73d`w;0pcKC5lt z$yK{-lNJv>y_rhRJW?FJ2S23hNi?|)oMyJof19r&Gdx-9B3V$L4(V%%u!O`_vv7qo zmzTLD*p}8<1Ieq&j54p9uu^%MbUc18YPgD^sHh4svarOfh#sOH>%kPhI+_g??PSdC zFRrVB4=VW;5fwF7W2+ZEZ#I@2VU?3UXk+HJHB(i94IB^6ftxi(?+KxWC6==)ENb)K zg1y2=-+kD=#3eM#_$UfXxWl=h6)yWT)j2t$FsyL7ha6Hcn+d$7qq#2U=Qwxe=7(jc zYG)K}oY-IIf3iDt%pM1fdbb;_PMD*BP4}U;Wv>6$UG_=?W5pq!KZ(^*T}>lSWTgQr z4|UeE#7w80oR^c~7=7(fHQnsvE-K*hERzD7YHcObZI~ z_n`)^z>77D-UXUbsjiYS^zq`C_#75dNzu{b^9S?}i@?@%T525vH7-y{**a|vy$)h? zi?;}U0>y`*e)UMf7rJJjm?Gr!aK1aa*%z-=ZM6dFTTzT_+TfZ&D$psPxLdC9#=rBb3a7P+k+m~Y zHf2!v8t_e1D_Al4{1&)00vzWp8;oE!y;i_5Mj9dTFe$8zy0v zWOPqVh$!;j`LB%mTev8?DAUup*Gz&+?fVxlv`vD#B{jtb%{I#yBDb>1ld)*Cx-A^c z&9<}44@_Y)wl@Pcu-g=GA@MOX?82k-IbVgE8FCB_TIE@?AjQeL>V9t+WaAFX*we=kHcCp9$QZ=Q%Q6e(j~C=Ez)hQ1Ejwj6eBPht*_{%LB4J{cvXm8A!J8r zetWv+yN!94H|%aVyX#tvVwu(x6ze2?T6`W?K|9dUS_mIN@lYc>RBK=?1a}q1rqp<} z(jTNtb84hCJZ^25LB<9O`&RR;qTaYCca4bt)g>C(pn2P30{x2HN=!xsj=$QsCgApK_4#64)7wVJ@r7pN-6l;6#5@e> zMEF{FQybBcJb@; zbQOjL`3brxSnjp+E_YV9Y4Y7=XmAYZFNiA_!bn!ZsjL3*XrvYWcp$kG7GKj*E+hXJ zjQE5=h}3MEXb~S}e{K@|AZH|)Qb?lR9Z+?^-|ve>bl8M`Sw}EbDNj;m%OR3f*@a7jAC#mW1MD@%VE#VcQh51+Sd@DL08M}zto zz^Df6N3n5SY>2jWU+2fa3Gsh(zOKk8VY!(n40=ucQr{Zz{>1D5`^O$_3ld8G$tX84 zRLu4bN(|Vk6;$Xh#C& zdO4Q5wAR^so0I_uMS$@6^XIA3syAV32cyOQ4p{ipJLjA#TD7&cxIdJfprA(K!w}qy z=DPQLvBc}reflnI(S|SG++Qr-hffXMZK5#m?9@L;NTQWiwe)M*7d>(@Pzt`byi)aC zF-3eN9IePIx_#~O=aEgIA6;C;d~@qt;H?|G!G-pOWBcTMaC41E;G?KU%iiJkKybZa{WG1h~pJfp)0VQGA z71X)M*4=Kbim~)EPx`m4`h&BlVM85vz1oGJ%x#_sG+6!dzL=EUMv^)FjMPktFGtXz zFA=&nnYp>I790>`kZe>oZ#nqV4M!h1WZp><-_G6ydd+HZm( zqcsL4!iz~a7>3}BLwv_4ud4c)&0wK05nygi2&U4jy_cG;W<2)pu)N^^E7JE>ffdxc zF*bAn%Ho;c!Py$0?`j8xAi_Z_&GW?^SPH*RI!ScQcA7bJeEa?qZpuW`^wHE(M(5`~ zuskZd|9f#K^Ol|p%%?4(L#q{Q8_Z0S2Xk8+L&aZEJbG*VM9=>t`YtUMo?2IGwo1+^ zIjidMf-b+_mHG;dQcR%xmP+wBkYDP%LFti{OlnPzPuAPrrg`NIfd4>3L)x43v%bDJ zEH!Q7WOZ0Ur_x{Z)9^@y@QPRadWYz$27nz3_9a!)FN625 z6GU2?pc@G$uiUR=g3!0M;Juk`_xF~WW@^+z$Ln5kuTglJY{b5w=ic09m`2{L&j|*0 z4oO-|he1>ukLUH?!A}z|&QFg=W6{WceHmci*-a@XR-=_R_=e?l{&OLzG+G=k&W0xE zX_SZ4zWnd;Qd-+WB}GY@^Qyq&sn=6I^P@=KN)I#=l4d{<>aWqWv9aN>7|R9OEnul> zYipl*@%cR50U36U)wIJ(Ti`b=x-Vb8TpY~Lc6N&UgnSDl7PwjPILyk-eAf;9t@2e0 zvSrap^O=x!oS#BV37z!*{5e`V?C%uykqI2 zK_Jw(3;<@)jyFnLH3mV|ocGY5W~e>5rDFcFf8^B+X>EyHD=pyEeaWD%4e)z3A62IsJzV3f6iRdj_U!Oq-jeEGH@;4i8E~}3BXZW;&Ff*u z*m`f)-My-J`*x4q7M z<<%Cz2je^9o?z8w*uASvG|`NwZ)`xUy}FUE7ZWV+{42w(2c z=0pR@^xN5@hIbKU>%FmypanvdRLol)rq|t(6amNtzzO`PSP1@hZy-8z6o?9NcU*?> zV9H-H*Ny5tE)ep#x($blXyiw5{aH)6T1zCO*xMBZ`4y+tdykiL=BJyh7#Mus>>|co zV;r-OD2J!(gwE8MTw*eM>E#6Z{4Z&)g_;Ya;)(J9Q zmnFyqoVnfFKvO@;8xJHK(69(ypF@Gsz8M7;t+M=mEKC4)s(^i>!rrzP{+-#=~7^9C{8zPd-#@c&wQ<;u64sw)LoS$XQfy`t_T!RURxP>i8iH zQjLZpbJT8}UV4>x53B`ib#qkH?9R{33o{w7u z(0DKp(|N~qdJnvX{cKDeg&XSzJCDEEy6k|PFC2HOFaH}dL_4$91lAw#+sUpWDf-dy zoij$)#qwsc=mzRpYLiQji%e6Jcj~#@z-+6|#8U3{2988GjiR8}ekiI(Wt4tvn$nCh zNCghG>(kp{9boTjy(bf9XB~(H6Jwqa7cbL6Q{tE@7pL55l-Z6CYHc{@P5)ZLXLW@j zEt*t7f6r^uhZ|`8EMTX)-s6TVgf>Qn-{>4!V_IBC%-8oAc0{PB{{KpFGLmMj8=b%c$Glq+`+RqCW_p*M`pm3V}T2P=^?GTomt zA2#!Hc4Fyhr;*_i)&~@_g;SoIGD>xk!GeN`YN^0V>>_bC>l424_X133V?C_x6#gVKtt{ZrCYi*fXCbNVAu66Da}wE_ zn@e3J&q!Gx@vO~O!a5xUALY4c`}vE$GeKn-fa@hSW-8HeS8Uv+#q9*7Yx7b zmv3Z>47(Q!>Y_eI@91Q_0Dzk<+U1MM4N&9-1=QJ_%d0uFKG9QEyf|F4yI{%ziZ+x7fcZXOn1 z<9a{bAJ5AfPHTvV$_cQ7U~C`s^%n@ecj&>la({++u^2C6GSt89{c5w&pkd6F`B;9H zo5^44*G0n+o*D`4HqzSt5pgD#A50LJ(LE8(->+{Rn3b(I8+|nrm+NyN?^Us zs$G@4nYN+f$$mTcm@(eR`y8gb!^v?R+suB=LAw}W5DoUXqM{;@2MK|mRYkVtWd#6= z8o|qN1!2bc3cv*zv}@%JHBv;Zi_!=3cj3{Pn|vim6uQ?YhB}&k&VUK96(w4|<90vK z;cOufKBVguv6TM7hL=c_POkL{Eox35;e-nIMmYY-vrIv&lE!rB?$E8N$~N)v=8^)& z<20S0NBg=ydbM>2ErExVd*M09-qV$rn#z5J%S;P-fe_>=4R+1IbDC4s*&dt;6jBT4 z+*&2NjUAyxbaY{$+fZjDas(a3c4l+a_0(i0iAf_ZL*#h|Q%e3baL{2en|~Ck{t^?b zIP?)oOT?7B7i6=4b02+aziztfCN>ZM39e~c3f5N%<2*7ti zZjpt9Mg+@(;souR^fV}maaDGzE4#FIcAB27brTa4@3=$55Q?^BhULzAcpS{*-z->C zLmX_hpPt@U6CFIBOgSM~$9_C}PX>uvv!M?k>okqIdS1Y3-pGvp}r`L~;FI0l5p*rsv0AOxb8qvxsp{&%~c?-P#~0FXKb3 z3fG`@RT4d7@>XNmoXIg*S;{F zN~kmVGjKHlf&dn?htY1V5TfuI(aj@hTYz^yPG)_8q_9)MkQ=#wp;Vls@^Z{y)7C2w zg+j6#62It&eB&gI7xVl$_XNGai@!$*oIlKVOVLxlR&G(lRRnNK4XyIxI!sW zaT7OjRL&nF6A8DJLr1Wbkql@l*Xb-jyeH$Ka2uGo zKCNc*d|5eq6!YnHvu{)Sy%9Yecf7BJsa@B^5N-WSSLIoJ-mn9ZaZyv%k0N#UK?@bn zQdsU;P9xi^*WM3-fVvOq_Y?#_8b!Fe{t(?m;K6KtCF-7 zxd@}qutab8W|x7_C`fov&ml+B>OxT()8c)dYlYeKx;!T=KO|@Y0@dEcRyDn=UvnHc zA|NOKH#2M$exvx?wD&->s>Wd2)B?MtxcLk4{R*bkAA#v4=d$)*gB7cfID75~Y^pxE z2b+0JuGke^JT&f4#RoL_|HmcCHy+k|=59B>VAE&+j0K4r zj3of-5Ju-sOFnct;t~N7{#N3Y)7sd~Jr$@!#N*i6pUUIxzE^qo2k(Gf-E^eA)=5FN zmcPouXm}6ows@d7&}#>wXEyNo$wga~p_4`EWVIWPw|<_1Y$2|u&cNR=`%USXzQAA9 zEXyK;_@9Tw9NJQJH5J&~JaL(0ylzT|OO(!F8ffV=wD4Nvq*lidc6zq^TPwNy3zC@W#BRV=Y|WV zM8hIDKhMv*(RD2xt~Ro>_X?bUZ)c9-Uy zb>=@_0O%IMHpMoNW*l#cAhnib*sJ8C<3n_Tw=KV+)3Ok`itQ#3$pkfO1vy_1|L&J3 zf{eE1JHoq<7QwLciy z-~HI~3UZD(Ru4>~UbOS-Agt5o{#k3Qh}_FaC@!+B51j)@0_=MO5(tk)p~yIg{7I1~ zQ3XL#lcuy`7HW(A(ZM+@|3Q5);kz6N3dEQa8r)~rI7W@~6y#h7)B2ysncX2_L7Af4 z{e}ssn8WYz^L2)mTu0r}%sDCg{28ocdg7$sx)24v{{%BuP(CEh5k-23v$>O8bUE4l z(UC%?g6}V57hd|dc)=tw|N1o`artxb#k6+IOJXge#Z4YHHJrp*+~U_Rbj))MEcOA? zRa$<5hioDMep^LY>%u-#okj21ClL^N;unCxOn#rnpY*mR54Ow3tR{9IA?fD*0rMxe zSsPds$M;**{|tmX6aoU;5qi3R1J^dXehqZS96aV_>&tAf_^StIr+;>=-4g&qq1b)j zBKvm&fA-RmI`r}JG02!^Ja5-QKVabaHd6&!^^A45uNPBA4WX4YUXF{`CE@sORM9<5w10I#_MBy~> z>{Ee0%@C<~cgCX&jRu>SsZG>~3ZMq0oMrZ4bDm#Y ze@s_~qzv#OGe1x|06%W2L$8uQ29(t6_R;pM9XhpkuMuMDHBJENBgJewKv?v41+;!` z2HifvBRU2y1~dVd6NM2CV*UtNuON53vT_v6!NCD5R3>Qu%<3hAko8uz3((V@fz27k zhX4N{68~I$OA;`gM1tolrWH2rR2H@iJ{v2xvnZYyw_or?>c7O$7Gh;*X5K9(sp!$q z7vfLZQSbE{CmL5AZSE>7`s0w>T-@BnCQ}XMMeh3q3~D!9Zrmgax6?s0y{!RMV2f(VJ2(RM&-P($XP0wvU@@gMH5a6vl`}+)*c2U#{ zZ-{Lp9C!-WUxTjF**cVRd3Q&xs2G5LAxo@3yy4U}O81JJoumo>wXbIb`T?}pf8GA+uOUisK=LR(5-lm4GptL1}RaMj#5LTkdihZ*Asiu4RIwtJ&R_9 zFrl(vsF$DGIca}Hn(rUaQZj2diI(bHbl2}5AXmhQjXT>+V~+pv(kEU{C;nn~GHKci z1nhV2V@0keOmY$u6yKGcdtO8=IT)QSC~YbQrMTxi?tgolFzMjzOmsWTTU34iT=s2e zyXmE*RCn)^BQVp`~`j|08bFMN$rZQNqT%xNJjS1OtptN?6Jp@7{>QaZnGRi}l z{nPdmu{}aBNM4Fo%kYCzo4rW+B*=Rogswt)KH?;Um3n&S6>P8i?N3IWk@rGSkYBkC zmuU3coGWe?^jdBglgHX*3TifQ+o|syE6KUl{(LBzt-uOeqtl~4TvBzed?OM2c|Pwg z9RPt)7?^KjAIGlcM)3$ts9t4d!}T9U{)MyN20Lz!qyjM$%jY-kH;89%0br**m}xYa z(g;|fHx+GgQ)(?^Y}{+zmEgDm4IgE?J7Ac)mWO>0`)9HZLfxrCK20J4D4=kl!XdVv~3!87Nut_>^?_{OFLX`HevlkpKiud0VZ6q7VGN}vb&k-Fr1J> z`HUh=D(*G$#8^FVjSH0sh2B=0lZL<&+nvX~>yxYpthC1TjM0aMa1ra)7w~HuP6zg!GxbJ}F#v`9Gd3*~nf&)uLN8n6`7bP=hRj3AO5!%qh_jEggA zE%nW@ytDH!a;btv*Im3s?$mCE5UCMuJqxgyntty;mXq>z3J#K6XxBMOq(~3j_}&RI zmC1G>7=zBT7-zbWXC%VCK?BL2qk!gw$9MyXH zN?bQk^D6!?YhjPfj!tkny2M++^P+s>ra8q{aqGepnPyUQZ5nf&#f#8m6WW7^69daJS66 z9udAMB~8-2a3a1DZ)>GmyBXC{haCXpIq!@Or$|R|c?0VRpr=w%0T(=>-4adHO zl-JL^m9|r#-cy>H@J3qB9-gz?q*hb+7=&?2j8;?%QEhfCxKBW8AOhdjR5}=TYu}$t z!KQ1jm?5`{uZeoP@y_Gu6(ytYIS((Vz(8WFT(sruoFN3Mh3$LY$!ud=rX%}}oe;I= zc&fo7quO8*7(!Wn)2RcM=My{i0)_3Qa;{W!#MCr2dA5s9B;HqPoKv8n(cOm_Js=Ma zLH`Whlzsk}hh|bMblS%@LytO5dI9QahQI4sUoj{6N?;O#>3>fSS)))Y0{zaj=A*Ib zMlL>}qM#J3m!%KeVBNn4HCq|lm|T_o@Ft#V8fF$64L!qZ?&YK9aLiUPu~M-bLV%@OXJyfLz*UvqX71`_y>i;1{3MsYF|B}xBWn6Mp8;I1bW1ji8~fvRnZ(B9ghl7T z7Wp1<-vOw$P(|m=WA6sx!|u#N7kw^)i<9{`)55Q^V&UE$oCmdwY{@?C50jn)1%|C- z3iY*hHycrp*{>)%_BEn4$&7WU1>Vq_gX06l6j}&`&30A2wIr=23q$z#hlu?*Tylxp z+0ie$qMHy-LRU?zoHHJIBT~MDq7IXq%e~P==&U2V(M`u>iSy6`9UHgNsD`y%j1XAK%y9F)nK_r~N0s`Pf1%7g zZUX}Yi)n@ZLP?k084OHJ@cw+gV5NCKiG(r2hXOyUx5iu#w~LPuu=WP=D>`$Uu-W$S z5W37_*&N+edTo+K{RN*!?KuIRdxxxt<9<9>yVekM@{+rHjlEEcgs?S1?YZPrzE|f^ zq+se#5%zfPi~FB10w_k#wT9*?uSu89yVTSoZNQtEQjN)QG6;?s2imZAE z4*rTh>*Ri_3_}?A{Wc7Bv_`<)u|oSB5wh_S|=y3HwA&^kI80 zU*_cw8g+F@E&T`LSVUBb$0gUU?*Uz|yTlu`zs+cr(s8q;$bZE)nHvO;R+JOXfRPv+T*Y;kjIUqo7Vt=St${4>L#mV6Lo14~MYME||)gEqv9p1UGl_7gQw!Js& z68HCjvm&><+RF+hkqZlz(h^}8WZ5o??_CRPIzNBhC0R>td~eoHGMOW*H2>iGq5Jjw zb+syZ*A(8p(O1@aq0iQX9xCm_v@v7jln;|_0Z=R{E5YM_@GZaS^|c`|s&83_;Ut`H zxSrzls(Bo?_=;(Z?6KHScHTPKId9ucMota_ajimimiV1wq1kd{DQoY5rf^)SR)C?b z<^eKycik^wPCYs?AFiR!)O3|Dz015OkntXF3iPskCpfJjx;XKD%2B2x>);- z$rfr>MYnu4)4O-J6G@EJc7ueO>tG&Ee3=Tx^(@aPjp`(Wrd0{gLUtoW=qyD|R@Q>=B&bstapZ7#-l zn84WIiYtnb4tD3L4v26k^qLwEA6^ur9XtETkUkul9QMe_r2k_61J%pWM%S|M>&5Q{ zS_PlXFEO6bC5@_)@z2e@TDLzWn4i}+W--4er(;a6$KGDv&}3G7(p$WUC>q!bZxq+0 z!0EFM$XVQT)LYEZa7JP+nQYuWQ8XFbeaU>6AW77`1IhvOX=EP2$uKdws(l8PgM&NX z)a2P)@P$ST$-B(xJ1@JO-D*Ahq|h#n51HwMQpk*e4-FQTxOi?HBv@z8_BEpW2D9E^ z>mssfV2kSNMw%smKxo8uM&E`)TWYwNKc6$=qe7m6JMB)LYW=)1(TTuM93k^@?xag9 zdHbVD|A>iZM@L6b`Y%>jk*1!5Qj6dnXn~snmuU7+{_>98j>--7! z_?LJ)Pw~AJ6`DZ!lg)_^y|F2QZ_4s4kP0E>KEi!1Y{C$t#jmjVUDCg&rm&A(%^gsu zk|bL);ZZcyD?wbaBYObM-uqX>-%K;)y$!^G6ap!6t~wph*J|7lURNXCxvlCn!z<(@ zaUapENQE$-1aKAK6_nit>RyD~YwDL6RBzQ9l zr>+C}HT!#zc2mhDyb46(5bYlvECE#TX5b|V+9VXA$UTMQ4i&bO6{-r;-@bc2`pgw? zBtLZ3X^~YRx=~+1GF#{;<*vP%l!IB7$K=75ZfT*hW;*sixJ+rdaM20}cGz7NfSN0B z^8J;~6`Ruhce3%pD@hl=u{92v;6ejc|0$Gy=AYLXN+)0O;ao3Z zz-jJb)DZ@)EAt6_sPr3qJn)voDVJ8Z_hSl33I7+f(WizwE&gSYJ1cDZA4vY6feMq- z0no7P8}Z?P6`_!X--?P95e@?V7E5TpSt9<6{Vpn5Jwk&F^^th!>A#=<2Y&{`NC((% zIb7H5{}NK4KoP)qp}?Oco`#2`5mbq@!Oh8$($nvGw_h-k|1x;=5JvrXM4*1a`gFc@ zQP5RHCy0_?6R8goFV06=ZmX>b|M8L{}R;3X|)OUF=X)b*V_O zP)cxsVA*bM68_KRK}GuHQ&t0EZmScZ2tYna4p-Wh`v=r$S%w|Z4tysoYky_H{N$h6 z*s1$jDohepA37020b0q@XEyFBo^DnWWQ*IQ|F`2*Q-Q<6z5xPk9lkLbn^$I_~`Fwk|)wOv#Os`Tt_S>`?1#-j9it}d*) z=JN0o0MXBKT?$X%$R!@7^z(@>P`^1;@8Jcp{Tzr(2}bxc1})8z^adl1lgsStTz0UD z6bA*pS`5e<3&E9_A-{V+N5$>mF&h0fs&Y)$l_*_RFq(heB8p9&^9|Ds4Vu>HhAQ*K z7mspb(ci$^o8|I>qXr+nT;~uBL+H9wUOaWGgsdD}M`q8e&cmnPM>rRRVR4?@Y&yko zjH3qifT_}dFBIVDpF;7{^jH*%r)Y1&=$=o$Kw#>VjyCNCkPV?}m0WMMAMA)jhwPJ`7^AgYmpf8fKDz1v3;SCnMx0#(jLH_Z&;??`R*_oA@0b9)c_| zld3ZdOUra%Ap?{Dx%Kkw^z`=eu8saa|3dVmJ$R}$M_69gXFug{V(Lh!Zm0Ytq zjwb|rkdxO9+1T{(w64wKY5^w~tX%zi=W3LH`Vkc_7aeSW21qN@Aci)`p z0$=Xv62q070;RA%-oXj*_m34J^A{O+xj6g!P;eR9OPtidsUvQUNzuJ_f4<<8s|?~d zx_iBByIEtetCfq`01-e2CE&*uh1!(_p-P=iE@o`g;sAeG%az2@a76-u$s6OVAFZ_d zGn9Z8(&>PKjXeOUf_H#YEPT`RNZ2ohu;rKU`PqqnqiLg37zqQ2G=>euWs&jJtONe{ zsx$K9KX7;HpQJhcd$ykQwRpNpF|TP#uU zEBUoO=_N0nqxmCMCb{TMj~>YDTwi~a{wys&V6~GDBzT6*@*-hUk?lO!S@x7q*(M$) z(SX2wZ=d0Tn0_>KbT>4Um5YkEW~))0TH4bX^%qrB?u4|FI(BzJ)*5W3?mRLlnV#O| z)?a$wm+lM_O?i*ed+HhJ`Bct(faVklDwueIfRH$2u;Q~0oSlb;-3eaB#l;Ym`n8Ym zV0GwWu8wd)J|44iCkW;GE))cSR!vIZWW6JpjFJ%E2>{ju2u1x=i$%T7S^?B<^|-Im zqUTemvG&dMrRUu%l4!r_q)PWgOQu&!e%Z+hGj|xfhgYWE6(=k(9a9dtza238VVF^O zC{Gtx6r{u<->1BXfnhoGa=6$KV)JPQOmUqeDd20V$JDOE|O-}Ts@b;gil-56pMpbd_rC3aXJWh0;2*l;n+sOE_}1O0h)tWm>$kdXJK z$vuB}XkPX1s8)TdKr_L?-fj2LOA#r%EZiU&+Y76fY0uGjrKBlo<9Su09?38t9lURD?}U zP0Qhq?jQ(LeYQVh7}o7b9}5qNDgKi}OcMZ-0v4w(lcxO{$ZIdEMgjNL^7b8Lspo?G zy|-8k6)Z%W0e@fv#!-jVA7E#|!6j!!p4+!@I0|K20eCpncnG}w*WK%#b)uIXu5J7kuH4!knO>msG;x_ z+MovUj9~vcXP!N(mbSLz{;K^(eLM5UZ4}bUO*m&Rbw1_3K2+_!s+oa!(hAQIe5^YQ-hO}v(Q^Iial|h zyu8LRH=~DyS4(SpZX`QhK_+=F7*OB+Z_EX%Dhter~uYnWy- zZkvCu{t|=6u2;a-_=OFinxewOU;UaGz5}eDPOYq9IYI1)|2Iz?%H#qbX%Zm%JEwno zAdBVz9x+F;M!-Ebo7GSokt)DbH_YvI*_sxRlYpRt*62yaa+@{K`)AD&6~Ns3=$l)+ zcJWT`F#Bi+7fJ`oE!riuB zA1zfb~5)jPO5-;9E0!~x{o$UZY z52faIJWv>f+q7D?~{S#Q92{%>K>%E#hF}1q-dj_8{<1UmEgDKm5l% zgSvB4nf#9&deh{L_Lln$QKanS#fJQSyf|_LXjO*e8v^zy)hiBL=&LKNSLB=C>ZC;S z!LL$Inl==z4eo;Gb?Q!ga+&`Ec8WM)U9S$}g#V_az)k}VIkCNGs{(mPXrn0MIJe_| z21oAn+?@4>qpo!~V6h7~>vDF19EBDO!eRCN19f3UxP45(!HEa0&lq?`7t29Nt;)&q zWc**{-`xgb4+dj!IoWHx+c;}$&$-P&$5W#Yrzd8%SW5P*B*AoiFcsC{MFDv9Sbrc`0A(*fd@wp_F2fB5(5xTuLQxB z&hnwr92a=$`%VGyo3E^Km~{s`RKcz|`sP5rlh?KjzhE{SuYl?hg-3yGTQ^2ytTV-o z|Ci>NMfaa*zvq*`ne{5}#mzZT^4)-ZTd}!PpHa0H&>=Z;A(A)97;eVYvQMLUH0yi$ z(oi8{b~^TQ1se>M&^S_89xQk}esUDaHH6IfG%4HiAfon#$HJmHQrvOH=R9p^Fia|U zNpxy-LHf5n@0J{WywjMJe9@;ly=_L;=5`CrXHy7Rqi^^@=XJ5tvu=9cV<9d&Q20U& ziDt|`;Yal&l<>UC-nmcIEZRw@TMtI^_45$v_^#|f3XDU$E`7A8EcK`7!kI2C=MHnd zDqFb{%sd}KHk3zV$!ASxQIE75pZ zlMhyyUKSBj;SnsulmQr+-lzcizc)OA&5j4NZ3v<^KD^DQ7=d&6hrTnqQ3m0N=qS^!t0hS9tJ0kZ+iONNFG_+xVLqpE5X%Y(1d%k;e7 zBab^QannD`7ZH^O1S8l0>aol%ts^)OPxkvp0H@A?lb~+?aebBU?%f;ONF|_2;Dda9 z$x-UHu73!n?6r8t4bX0Id4|3IR_*dpOl>eu{^(JVh|atNG*p-%Uch3tI3EO=W}~XA z6qO8JrGm|iz-Gh+hb1FUB@#U`CJ-3Q%-F%PQNTeJu4I9?|cl`4yC3^Y?3ApCYuLd};>4T_1bV zMNGKclx`s3K-JF&mS71xD3kDTTV7idPmn%>A8+1&vT^5b(BvWLZ3nnEDb*}<%|Sgd z?&TVSpGFD0-uW;H%kP^U@7@|y8LaxZ;QEd7=!exuL~GA2HDx1STZ?)qry`~S0L~J& z*{nm2wLgFA@RN{`pb{yxN3uO6C7lgN#-^KXi#V9Vw#0I4z-*jd*nFGLRJ+HZJL6KF zb#7l9Jv-v^+`g>bgn%)HC+iZI&mx3siz(PO}3!n7I!AHsh7!Sz*bXkb9 z1(c-km|4Kq0`VnKG6Dc^xvnu^2K?o%_k7Qb)@s}svG*X5>UuR^he)2~Sw~lOWHYT} z__t|jynrOV4lGpyG9fR{&)^oOrlitjAB*Pzt{%vP>(y#{E1Rh-=Y0fZLJ_uIVpC6G zuvuxs$iw|wdn3KOPCxcJ;{>j*6{sMPELtrjA|Wj|*ND}b-PN+}58eF6GAM{=XKx== zeI`AG5|;sn3(mKcmi5GuJ#5Gdz=T&xEZ3j`q zeti{?8TY$98f^&mbkW4s;<9ZwkLK3pvdb?+n>6GgJ|_tHoHtPkGwy-hU+Zn1;cO4! z2?f)sg>yRESOHc;hpadrI_%uwie5VT zafPlZp#gKg7Q`e#B_xpZxZfkmy*4uwk9ZRSq0q2TWM5LsF;zz(_y8mm3BX6EOBKDC z0{CemQbVgs`US1OfN~uA_2CGp85F?SWm;%K8;v(rxO}_jV`#~rRbi{!@!E)beg4eu zd}^ntI0#%5EP8cSV2X=QNuz=@s>UOKLEv;i=I1^YGH=G|zZaf*-NHVDHs_>woO?gJ zznG!m=pTAi`rpq6i5buM6%+;lpB3}5^e^e8UYIFspj@ichK{gj?Yuiu_A6mGXmBt2 z8ZoG0g(ITJ&E63EQ3FTczx4ewOPYofR2+C8Dhmp*^rJr*OUmxrN#ZmEX7V{J4MIzT=BcsGNifI=_j2pv_P=tpBwIor};87hIM{-45dc6@m8|% zR>wODE*E>9f>`psZQ4+klkdX3an!|9H~l$?OPAwuJB>oMHfecCW>|6SN=rt{5|cds(I&9(qJLfzIIj88!}TeAV;t@bS10mcdNfkO zHIXIqV4Q&g{tg+>-98=`_pHB_7wqiT1cDk9b_^`zPz9U+etHufcowk{ybAwEHN#wM zA#;u}ybTz~@IQ+CUqsdg(s(p9v|&Q5n*mAGk1+gEU;E*+i7^{|{9Q)__MSmtfMMXT zucx{P5YexF6sf&Eilv#Y#dZ5X!*FebXxv{zLn+^#Zjb84kl>bOyE6NJ!f$YTO9`~m zU-PA*oBV)y_i4cDO>RZy)BG16U&w3tq`%Y!?Rm$~Ob-yScBLtYWhe-sT)kiu9u9zP zSy?oj2k;gZAoG{zQOyJ|R(t{}Oh~D|nEu9H)c0=2JA^yNa#N7s#BiTp{fXaVw1Gj2Y2qfCb zQioFWOw1fCWc|tZcP&J49_Kh{?K5|xhM-wkAsu+*hu}&vw-I5KpY%d#ytjU6WPgqb0rf)Uhx-Ge!+ilg8 zI~87;?ykO2)r!j!HQR7>baW7FZNTx#X*Zx>Uz+F8NdqZlPv55EB`vNPt7OUz!6ja* zmp?Txcxsg4#HmBxmGSdBt!d9^i;9W#|B*uo2vsU9GlsoPa&f0suldsl`bZ#?TGR1H zJ_RcX7xh)UTmZyNE>$`a1lDI7zI^fa&ObAW1zNnZjOU{;J_Wt{iTzA;hJxtz88*-6 zku~leNKaaBdERTF!cbCjY3BfYBNYRG19VLW$^bMVF91!$fs$wi{L{nDDUjV?ZMXH^ z*X-Xm5?7vngymqwH?OKvs-oW__cxG}{k77ha54ku=A7&=8_ndM(zBEQ z%4-1@C35JqA844EOb)vSzRxKs4FKW}!cw-NW-W|38O>qez0cx~1-w^pI63b*Go`(( z!nS();d=zwF?ELa*9jqu2#+$)>9+gD<)+t{xhm#}uLdhxGp3FLD)b7!RxPyyo1=9(x* z=rbJIT*ESMp2&@Xk7fGbWmnI83`Zef=fnWIIneqIpfbs`byrtcz-}?fjfnx(wRcu6 z@C@z)DMS9MNHf~6kg9boPeaabT{+?NHA(}fH<1yJOMsn8wPkgH->(&WMFIt>W`eR3 zfO#6Hkn-v^7%Rw9M!9>JPCB8{o4!iOuhx%9F#IKmMVVO{0BeF&j#DLZHvFRMcuO>s zMw&M0O0c`$-p!iWnL8c>Ot)vggx2Nr9bu?A(80b9NB7w9Q88MXwink24-a7`$dyQ? zdG^c-5Q`2fd2BYLLD>%wbJ%bUegP#~hIPDtls=tD0b;loDt+INjPC1~tzt}WU7^*4 zw7~v`lIG|JOJ_S=Xgl!y7rM+Qk)U@SLmXMzELD4uiQq79Jd{`W>sJaon@X;h0NAja z8ORM*eVTQROL}6I0QUe`@U_+vcLCcs9|>X&)zt7<3v!>VG9D>CBP9h8aMddhfOjhV zrmn!IJW9=DGoy|n0^aHey>+%dN+k{zk6BE9Vsmrz0SIPLO%%KdEOY&jB7y0dv zOUjbi4^K{5Ks{Vgmsn1Q?T+)#BH{lv0&W|?(HSaAk)X=2?ry`7~3&eSKQ@f_? zyp6*ATC2ZOL+mn)cXx?oF+o|hOK<5~%iTA3nZ?vAAzoMu!Fk#I0F8$So|*9O&em>< ze8xYxe}8-O8Qi=Rf885Xl7D&sacf0}2#+l#VFX;^TOC9p`sZq@mq-BMGTn{h>^^kw z_qL_AtP-A>uZZ)(1zan@3D_+Ty#X*=&>Kk1INPiG*+sP(Q2UQPpG!olRjp7yyH@=7 z+}?^l0!4lbCW`r@33^QHs^m~h1E8$Yzf*E@${?RDj2i7&ufA2IWg{Nu-9YnOMA(n! z%CYJoQf_j~_f(JWb%A^!WSDA;hiY~W6U1=?!H#(Y8#|;Js1gMyP`+!Th~N+C=!*WJ z+^*s?d1K7O66>J(ODS1n0FV+N8^J|jSSyOgg6sv!5XzM7v-qPGP>Ax6FGCFXyw)b0 zJx5;hDIhifv8$g!b&kp(?gB$GgYwDoI?xz&>L+h%38{+&`z|NXnglcU3FyD2YYq%Y zU1~*8N)nVt*-Yvr2bNDT&lm#$C(`+MjbSmj(e+Vo(6b!rrlu+ynun;Ncf5SR(a@|FhW&o&_vXGD6$rIG`Dx$>vw zL3Qc^{QN*@>E@!3`|-$Mp}!fuHIA7So4~JXu^|GEozWD?(E$b>iqVeGo^rxfy(fGD zz=MrhDpw{o+q&Bq11n+m58Ovg^Pf2Q+cMPP!E!9ZY+8S9L%!L*^t+L=hl zTrQ~#J0a>v`y0R>flA^4)tdLu zlH$V&f@6^G+K&!0@^e%w(~gIMa@qqt@ZY$x4B~07Ss}nTw21&wa0o@l>E;6(I6n}$ zuI<_&J_Fi~;{JoKqUaFE|gxB{X?OA4LBh8F{Brsh6stRcL z&TaI3NW-ZpxPo3oqWW#6ve~h@Cg7P8RpX9dhHhQ8ksDv&Z4|ihMGH&SKB(J8(d7l# z)$d^q9hIMD_TppkdR}5cng@uHBXh?5+LWosGUyTklj4Htibb|_0JA@>a9Ti(Sra-- z$_7`a#sp0J-MznsFtIofp+YH^6K9ASF)1W7YQdE^FHw2v`9DA+ar{3<<~sMMK)U$f zPXK#~F9Gn)+A#)p$YB1j(8K|k@&7k}Q-o3Cz&M{jaUmumQKS}F@Zs;_N|H^U^KVRx zLyHiIJX(Qy(3jUXkuiu%fEPniQ|x$_Cc&lo5mtFo6W1+UL4wm}>JU^P013nf;k=Bm zz=`&76%`Tr{P<=wF<3k|F=U!iXHe_K`{8%(LfiYdcPEa!Gy&mVOrgf(a+My)PR?gW z6rPV!lFolDPe1XtF1usG1(m$Kxkfz(tHmM%Dqa#|__P2#2p$f>5+P;vyZDzmt*)MW%z$p#o1G~ev&KM6$Qa7Lh zUB%Oqmbka^pxS^>O!fWmi{^>puUenbH?dScR^<@kYJ7er#@~V+WL>X}UjRBlz^#~_ z+3Kxu_63kXv)n~VL>QMv{U=@FG_u1T7@0+^M{C>omK=Cl&eJ*qX#!m&O zi#)%inEt+M8H(un2&)9~X-Hfi8CSmBs@`SiYr{*&SyhVVq5u}TdVL)9`rWno9oXxo z*6>P7lRBnL&@fIwF-CdgFKL(OG$*M>fjXJLK_DHAV~o?Y=t1nIV@Yujs8V>AuOwhs z<={Whp{&Yp020`xlsPW`DE}r1hI0U2@xErRk-De9ty5t%e;xVA0{#jd6oj<#qOJcq zu-7mVUKV5~PY^J()A7pV6>2%k`ohkTt2KPpp>}uXhuvGWm7EnHpKX{$C8a>L%bW;6 z-YoCx0W|9e8pJNKE*n77oSizi`2oC8LQ)b2juLBHxgn!rCtt9MPPBxq95l`lC0s&6 zkvw4YFh=gzC$9=gf2mV7z;WHd1J zXT3}SW3*&KjmA)fxgg@fvYJY|#GqrIl#Ku+nT4v^WAs~;Kg!G3(^ zv7zsHZ4xad=U7rY-?0=E8TtJ>F!v<9#!K{dwdslYL^=S)w+=4rK>h>QP6qT%*!m-F z5M!c7+BKA|@%&r?D}d$Fy2Cn}x`KjN0U;mgat>6W(64 za!>^xr1%P4ML)L|%)>w`e?&KK)aX0yO9~*-MNGAY{7N#sm{jiF%T^FSGad6m%lvpp z$5xSV6oVb;hJFaiqE%W32FJA=t|5j~FjWsq#Rr&b#Cx0sZ7Ya8mlF%t3|UJWL~{Ns zlWz|Sg7ze0UZ5ecekD*{Kl=Aea=w74os{%Y{m;`BUx6cv@HF+Bo%}~R ztU}-m*LuMexxUO4Y_ z_GgZ@rZN~$?EV_+D#hl-+Sn~S%sO1x*V4ps@B#OPh`)6@3f>d&9~byM$is_}`%3oL zd+b$|SD(9iZ}6hsSgHh#GrfC1;2OTbJ@9mU&4x&Vs4ppTWU({b4*geQ+1na3hSO0{ z&SVSGRwDU9Hg)ZUgi_f|b`y*tVB zt^tQx8LWUjCTRb+lO#u-0FY6h8V~sC>6w@nme+mbuf`S*!sRX!bZMQ0pn_oFIe52e zhAJ!8I$3649_1}KRdoDdOJvL!_f*(Nwc@4t(1+k9{;wv!Ch@+EU4 zY%|i?tT<4}Gh)%Y*{;4OL=c+^+pW8FPh1+N2^ws0o^PoJVb$|>gI~LPgI+)8U)_=- zz(|65OfNFljN};l&rbrxlj&5M=lw7FJvC%E>?bNFR^95GTjr_9VvPy3@4kWFEdYPp zyrhw*2gFdHNX4r3EQeKgui%Y-@?GK9PUIrHGJx#i@{8L>oGh|)&!ff5@KA-JIb}WM zajmtk503_+03|rKJiT?r?6ll{FY01KPRk#me4tkow0`NxfU0v4!P%&2k_b0v6q5F) zl?0O1C7@>g-2ogU2e2WJkScmo!dKDK&F*2l>@>V-*&{)O{V{y&z0fM%eYYIG`fx{P zrw%(I=&9z9K`$#hrco=b8}O~@{)-=fvHBEBs#P0pcrn)FL(2l5uP8-K$F-i!=I)Cr zPrExPQy2Z@ay3*%YI+hKMD-zUwFA%IpUz-0^)cV};8UeNe0L;% z)$02gc!5?kXACC}4hd&2@!Hc`bZXT!q7U@;o4++t2O3&_Uz2op&lVI^_s$y?8Dg<4 z+9f=|$`i(IFzskI-uc<*T|cke@{P$||0cBJzkV^ZNO=Gd)ki8r(43~|^mY>n|@`?6aw@9x&+SSoagTJa5!<`|DXjry22C0cN% zhF7uoHvb@yv5Nk@+j-_IEf#sTbJl?o(}6U?%bLcwaa{}Kb#bX7>_5-6YcZ_%d*qzRJ=ukjn_tlXnT`I+Jh4ec=% zP+0yADe=WGl+c6pt^Puh{uI@m_fI{aL8|RN=uD()-nqm83_Z%t7kd^6|DO4>9NIKX z&yc)K6AJ23@jx%u0Eg{*% zZ79{Fcu>zrfn~~V04^F&8iKPDD@WhJBd4h!Ikku}rUpt!Vb1hUjHiXX8!QeiOD%mv z;}`G9R{|a>Z~yWL1gA%A_kI`%x01T0gyOl+qcW;@$BIQ+9JM^Slx10uL5<-ow)I`` zezE&@MIxzg`SKg3<$}gxr@UM^m0}e{a?h)3E~3wb20^eRjR!uFYtNz} zd$%_+1Y@!FvvXK?Z4Z537Dzwqu5$Uj9D+jdl9u2^evAcOeXp)}!|c~fidG5$IY?6x zo27fGA+f0U#S61QO9|wbE`r_rT3yd*Kd{S6aG;)ZOhE>DA$AkyljSve@8gOsyDra+ z3IlnWlmT9NqYNREDJ>=2L{gauxmGkqPh&hWt_7+zV;|Z~JrENnu=e~X> znUj_ZGF~yC-&XQQ9>7=Rb{ygG2HjG5h^^tiU}jJPklrZbo0%e&B;uupFxR~iJ!wAI zl?<8{0RileB+y`OB2%p@Woyflzs_6PPUrv7$aS^yxZ0&EZ!v|R^pxR5StqSF=hNm= zgnot6Vuckwi;L=>bB-s9;x${@U1P!`uj?k;AmvhSt zTl#oQWP_|hB|Jx`x)jzp)E6JlS&eFrYw@^^yP38uW+6KwivlQ(z4}N(uy5kG zfhXn|`dGJ{zBcA_bB!yZ?&>bCkf?g@m9kyN6Zbp6nph8pe zFp&|J>S%4(xlpw4v}EXn+}(SH0jz?a`*x;CaHAT{YgfMYKBMgrWE+~`Cg_&1gKN5PSFx!r zQ!Y8^a;({y%w!@hb{OYoG6n8Lf*{ABtToI1jOJpV+pOXHOYS1Y zJpEDut6ICYA31z&E)M5C)!ZRRMNcQFmfEe=i&GZzn>2tL6`fC93DLzh<4|FjY@+by zGHn%pMjPUCsGr^O$R&*5ijVFa9sO|OZk+~uqePikf8h64kLMx1=S5ACCOa6upi+{K zW4i{nU&_fCV{*XTh8+dE0-WA<(z3V+GRblwq6jhFR z(!p*CAF?)GYmro|-#X0)vthN-2NoxkpEzBtjlZ*6!FxDSif-NaUFW-Jb#~}xPvj4; zXoqjD#mg06xhJbU#cl8>&KA~ClukNutfqzqwC6O6*2&G@J+MRtEIt&y^Lvz;Y<(pTdqXe z9hf2qGJ%*44)p@%AzR_AYuZ-^Iq~z%b=IPlp%{&CPuv8eHkc~R%KKNkzN$4ig>L>p z848?h8_q6t+V=22nYk-Hl2aEy_vWs*A&~>6=)xnZdg{sn>`bmg%FVIXbG$FcUv0&F zj<%y)W<1g#SQ36a*PXiUEwjD*Im2bEiIJ#6K3{Eo)t;ukS>*{LkzFoj;IFt357>Q| z0~WdHyASvuG6;5@vzX4s2=|7y%H%0G_xdshD1~ZWnk&Tq9{{F9=2rXo((o}R+1yGP z-%fBZ3vA8RecZ;c@ztN{v2G=zwtJFkC|!@Sw#2KVnhACk+K_6W=5LC^7i{jg+KAFx zgxZMC`UKU-6xg)cQA+Xc1-h$gFZi%RJL||u-hQy@(~xCDRqmG!$<|2n0~rtAu8Wb# z3iOSlPmf=rt4HIU9~et&x4Ujx^7_!u>U&9z zNy(kHBSb)wCL8h{~ z+-i*3%KJAW7gIlkZR3Bg(9&)-dzIw3^{N{y-C3x8$@?{yZh$@IQ{>7qpQ_olG6HKW zK3$Ptf<<0Ij9ANN(jb!N6srXCJhPcR=7s5*F7 z>4kc^%LxpECZ%!W4}*Q0zLCfby-V~d=DNCo7~ zKAg8QJ1pWrBJma>%UI~qcToI=j2_&@cCK`KTyV-y)Qm^%D7hA*D<~PsjpKaO+LvO4 z9#CSwS5+u#Jta#fA^4#sxS$@HQLk|@MU_+APvpRK>uvHdfzOcu95N0nZFl1Kx13L= zLT>Nb_-H=Y)z>M_!Z_lP&7XRYxaKR;GrCLmX^jnBp5aFhCSqipX43nm8+0#7iY0e5 zgFn#Qk_~s(>WeAu@~Zdy%Q2VvoODhn&FzGksLd&Pw|WwasLmA6&FG$t(8i6-OpD*S z5m~B(^R;OWkId|V%=opC-|2SL6K(;v@uf-`+326w7g!8w}aUz_GgH@zcZ+_O$mF)`UBd`Q2UWg#n4(yn=#Ew3d*AnFF! z5Us^k?_f}20h_qy^@TP+GO&j2;eXPr5j?S+E74Wanw}mT8$B*Io91wer}#qLnV~gv zQ+Go}o0OSuKT$&?U-5w!pl$|ls3o#UH@&kxYmpsQDpD1%lWQvFhr`LM6RssvSq$M) zmNk_x)%2KEO>Y5b_k1juXc5<{ij1r(kXEKBV_ZpVS_`AfL7OJ*)anIFVZPY5Q7jqU zBg9C*+bd@sEE`M?$)J8_peb)5SU6Cm7kCj#T?zDH(FWi|Z3#@d4>uYY75kcjBUv?4 zqU;uVZZl?p8}bq^nlSp|#9`tO)DFUO7Z(&I&lk5?;qvDT45BI!w+G6rRdgOXgf5<7 zdj*RL=!I1z%D-d2c)5yVZK8fL`AxptT2<0}@#8Z^(3nZ-d)exX>8Np0s!^b;GtF?5 z3+DM-7Pe6e8YN3~GpL9q+dhm})0=IL3NSkA7L|Y`nhf$M=Hs11BlAtRfR(~!++8U2 z>a|gy7$-Cd86+@?=GTcJ)Tj9c4iovN{^oA)4Zo7Z2yO`#uH81Q{XzL*om+5247yHR zUJK5lM}fJtpla?nTg6@75z3 z9u=NRZh!g=`6m77{^Zu@s?U}Bn2lCc5iRemJjqe2d)c2B12uEMv4CN2TSeFP5VEVe z5b|`los+wqRO}=!9qRodWo2DdIA09oSu`AsLaPp>KISmzTX_BWL9NtM3Jazhp*eGT zFW<~v^gVHQad8f-={CEBg7Xv%qsAW3nD0NzLkq;eq#Sj5bLiUUV zqN_a-jn%HCV#^zM3|C`LI(1%V$Txji=|@leB_6x^%@O6VZcb{sj#*(8rHb0`Asc5~ zU+bRV&%0>+#pI%LKY!uPQ6b&{tum;~IP*-hy?u}&c_-8qs}7y;nBuld>qPG2yZ0WV zx@uqKzc3Y-yz4G|oY$G!{!KyeBOPwx{^ZT5hln`uKm4mh!-MN4i`>ZF7}zh)q)un{ zChTlAXv+pBM+NT#t4|Q0X&9jDepLQL)O-g?eU9Rh+0UQYuAFBIO2|=$ssLN7hVoVA zAckiLKGQtSh$BS}Nm$;&@+P^qPm5e5AAaV|A`|H%bUTAaK0^ifb>F^e=ty^ zpBhJ%)To}u<6mT_ePcV+5qtvC)Ns}9_gh;XL=&rwzHurh8AKrBCVxSOp`G~>E~qaRf9?M_A%|GcR7I8PSbQlu z_J@ai>DGYE&1^FVukDwClDpA+Luo{sL08*@Zf_jFKr>X}Mp!yUWY!A97woKnZWHm{ zLS`YMfjm2X;F|Q=Wuu8Y2byV1Saf6ZH8*`HL*IRh6-*%APf)f;T)(wLVeJ~vZ=MTm z%%@gcl-k0=Eu`5l8Rsp)Hz+GFwN1Uy`<~p$KZ%BL*Mlgm?CrxqAt}+VKc!b2 zu&V=1i~=;G18$RPOae%1#;ks28)(D{yW^>gSBu+Z&@~Lf1Rd4$_#_*Ev)Kk8?UJYJ zR&!$Gd8XGK@XQE>rO3>Uc%sJN^&OVUvzx3so?olW{nixI-37wq($x7|?{Krb z5lKdac8kA$uH9M*qW*3v#G32M;b1;Njj`0NE42L@-aejecl7DQ#`Qo)Ur+Rz!|#2` zv{WoXF>$Vbi~VLN_NaD0dN^Bw)L*O45*s+EUI)0=TM`>VOfvnzpk36X z7}k8FJ`qx7AE&&+HiDJGS-@)}D$}ZNPqYWvA^v&rHKZPf1rAo|*S|t)LEU zLLN0v7f#}Jd#Zrj2#^z`8%J}6@*8N5cN~8Ox8s!@diyb~2@9C0zIVm?Lp~1W0lQ&3nz8&#ZCbZK4KcE>2GNcaQS+^vyWV(&BClLx!{4EufL?h*2n@gC&Ci z2-KaXon$k#FRS|U?1QAQK~g&MPUpi2WSeovH%~*%I>WiV?dls6x&DQKRYCz`-HvZu z%~2)b2cQ`!J7ZsTi6FT9vQ0>;5MmRVU7d|dcDOvu+^1zE1RMR6wBPZvc5cKbgUrN5 z$m$*Q$Av~Ci}Y?dEqJTB_Vofq=J@MBe+kL|RpT6ub?g|s_AAJk_zke5gip+&*FKS& zObtLt3%UJtJa%Fivn%)Q_0Y43bG90TbsZIO9go%HZFQzpE)ng2+!7!)u~w@D4O;ca z3?Dv#w2SS()0m}(QcJ8s>RJtHxAJ1k_w>fmu&l|O5ZXj3=(lG`WK{~0XGI~wP$0FP z{8j0z=;JwWnhEO!zNqH0aM_Oaz^2k;K{IGg;R)%8RgC&*)r=;V{sp#}LL#@pXkD=5 zP0k9hZ_wxXysm1p_^-biJOou^3Ts^S>Gd{u8|Om$QXPdCE}uXO2$0*r(DbCkor|e6 zdy~yZxK4;#3hGxu#_R#|y~&aZcStM4ta9*Ax5T7jZyx|Jv0LQG*1~I|pxY=2iH($p zg5_7%`}LRa@$evn8Z$}6ml!^DFd+vE`p1t7fG|>mem1`|6|X;Y#UieWdo1+(o4mJnV~xZCau)F)K(>iC_MDHpgezg?QCg$bJN|1H{n^d&}YDG49jyQ-ec< z(z+eV;Ph8diiHopE5jB~1*vtAVPUXzCcDo#1c3Im8!eU4q9$XT2TsIARRvms-YfUa zS=~aM&n>(B_{xTuL@`50<1??~ACs|wp8K?~I>Y7k)N57gw7l14Cn#BcUt(h})+ufX zjKZ}Nar5)%O5fXSkn3TJ_$*a+^mgvMgD$3%bH=L}j5)uXuu-y*6`!*6`Lahxva`b4 z&M0@%9 zBW!yKq=NK7G~${qN(WVlMGs(W(3FCFXZG3nzn&N{7ySA~(m-;au&&zQW zO1b{i@DR>|4VwOU2s@=7uYSG?VlZ`e4H0&tX|Q=e;hl7_ngv*aFD6TRX9~ah)9afq zcpnV?ldCF}E)z=KnJ#BCgL2m+>cX+@?$uX-FLY>fWCuFl6w5?+t#l=%U+pP~e8b_( zzfJ(eVxAfrw`38l6m`;HijLJT3j7WA*HOE{{F=U$bUrNKXGJ*zbNV3Kavf2#vx4Sr zDg+UxT}$C&iptE${boQChelQ1sERa+o=lcRUT}+k1yrOKC$_E^ASM$a8$OpF-+c{SzPakA~-Uhn3oam zCknB^V8h|yq{2pu9?l>87QIG=b%*)Dxfhl{wRszkMJs+K*g;ugGHN{C$h~;?Dyo={ zTryT+-?JPf4LCVqyuxrNlF_tSk+liUsh7%b8O~91eS<}Ra&!&(dEfe`eT!tKIyWXP z68^u^E9v$sYti#TddhN18yUl7X-Mk0jewOpB>rDXT8o@>)3X+p+our?o9+kUQ_XNBBqUj*PRGzHu%>_l zKkSP&UB=)KYr^4LsWMZA)xJC;j(Mq}F(H`lo{nZmc4Lo(tbR-A6Rg@ng2z9S<_R9` z2T&Hwsu&LfYpC4tP)>=e<*X&8Q*Z|fhG+<$Q>b0y?e{!5p)7l(FQF!PJ?&@u}ru_!@Wzd zVOwa1x3DJ>@7^Nf35OC}5=3puPJe#6po=MT9%zeLl8CHUO*Veb!os2nTMgsKoi6RM z01rP0(aEBU#|N=p_J&@G;K=$nTawEkb=xlH6n21of`FI=eS z*Ir*L4!6v>5$rW(!;I>8Re6_zeUN+!1oLY={dL$Sr+gK!;PZT#R?l_`M z2yc8Hzy9REe@unlEK~gsZHCi1x|E86y&n430@f!VzcO5Fxhn1Hb*JrzSsKGG!x9G) ze!kvvC{=_6N1btB{Z^k_PsY`Cr`3RHOcuYo{o)t~LA z^-LlVbHp>+QcBUlLThH#P|zCD4%(QJ+Rk_PNqIBdygB_)YAYT>$HjH-uxnlFy(%6t zM4ew1C1$sMeCtGKw~Ngtz+XvMR_xoe`mwQxG9P_}i$(N;UZYI`_dvW%Q8`NdQC=(6 z%(QmmSM{aJ$V1c?UuWaD#H;>R`Ib=wj>U(H==sI%jw{6nS~J?Z3+<_66lD6L-?ig) zpL&Q37MpUF^^LW~tDbiUAgD_np+3L8ME%I>c4ovzV1O z&v#a=zuo-pJK`6Cz?<|B9tGMowZ?F6G<3YveA`du2`>Im1J9t*ampk4a?>=} zbzR|GtXAB655_dYW(f8wUG{u`x_Kze8qV8|#nwS0IR7>NOmWnGfC!$Zj$9&gb_GB-FtrIzQ5a+Kj+xBuG>`cB(cuQU4}hf zY{@r3NnI~UTS3BqgKtVOz~1Y=C|cf58&x3U-iyM1K;zky*yxLUIpX<}C83=V!x1MQ z@0hNKx$PTjGFO2UX(EBJ8ZviS??Rw(Ov^!;J6?bWAK}F$sM6|SuSXfmI9r-V8|V^; z@l6#_dp|ym@FiFRmPPsVYBfAzA;_j?#stzU!ordfy7aPcFL;MEQq)bSn@x`CYOyk0 z;!T5Axx%dcP|yv3GCJ*KXkLsqg>9<(RWP_TklN?`91niruawB~&Ut=23_G1OBy#EP zvazmw>N)Gh46+9KMaTSO0SUDc{IfJF530-)Ew9Z-3qdy!a{-GYcsZ}N52S2Sut78s z$GJ$I=33&31Oma&>{=&!cMT5ssza)_cFjvCsA!obzuFFk%Ngi6x~#)uld%Y@>)Zlm z3uKVgNWQ<=RZ-6kI>vBnWeW(PhF2bYV=oVtqiSd%4cWMiFo|81V7C13h~+I#D$DBHGsSP*YT1Qi67mXbz6x*GP*GCjOM17l0-UX76_e7Vrmf71xZg)KbZlr=Q>jwcgw?&B)aroT*= z%{qT1E|d+~J|QhaR0PX#QwkI4Fs7kEvfm1D`bR9HDdgd9h(r>HVJD}KH(zu=v%e

AbjOe>or?9YRj|rJ=G*^%aQXuA29VzG>c92z!q_Bd~h8@Gb zsbW|8A$GMf0Z(dz@>c{DLK2bwx2kzO%s{_(1Iw+@;i!zweZfee z_5HRPGyo6soa0{pzOMegUb@#VbJ0~m4)BeS$pO*njl}m&GtJLeVjU?Fr|1g%08euL_j&B3kcE-;7cRyvD{5F}?Si8$!V%$CusTfIqbW?%=T-J3Eui zaouTI>;+52awa6)?qjuKHQrd9R?BKHHuHfk2sv&xL0>Z5CxiR2FAHeQi}x{M^pvX3-Tu2+#u;s zX?84#4F06r(5;27W)6Lhqs_X#|EVB}r?Yx?y$&h*38d^VmmaDdXZPgxJ(UDmy^XRY z?_(vxXcr|DEk$gGRzK{v+9$*brMB-B<$tEwF6toj9M#2>#FVkI!x2c_V%~&>sUpV~ z-Rm|vsigSS;d+J|!-{{q72qvDoLcS09%9z$#nny$q8|d42RvzWQ}WHSukvS&duZK= z+g7;tame8eQ6-`v+m*9Z5bm#rpcyi?35C`Xx0)-w^AybL+0*dOhM4e0fb^&at*kz- zyC-5ypk8-Axk+h9q&@0x{smS?* zkko1xMVs%cLOD?Z$=NbyP&JfFAdpZ zUw7@**Cz*XuVt|=rft?V9|ev)-kd0Z)30J?$4kN2JZWTGsYq z_N@JA|1LcA4<@&ER_4Q>35(Ih*VpAXSj078)7@xr-4uymn@N-+44Y5Fk5=acSz}cF zba!)w5Qz)azIm@g+7@N?`hd2h`Yuh(F+ClfCK5Q~oM`pxEXwpI?S}W^{ES&lH>I~< zbrko^Q5;y-9KZD%nself;@2orM}cNZpC06{l%$wk;F%u`lt0K3KYos#YJ9-*Yj7lh zBwgVhE*>CHG1W?YeGQNFM`V^#LUk3zJ|Us&gqY^Ix@Va7(OiL+?Y`Uhg%Alr zxEkvI2f-7OjQ(%WCi55J(==Iy%7(tLuCKywElYO>Ps!VMEg*6rpCAGa1`UhL&<>G= z9HPt6+bv;IF7(dXK?jz7xvESjE}J$Z-D>z8*fINQosH=Y$l{>tf_LTjbJR%~kE%BJ z66?a`=h*bilufGyWd?l=^jDMZrvlQfy?|J^n9!lsw4zk;I_l@0d0w=>hw8H=fdyyPAyEd5_ z>21_UH|yX~Cyt28JAutrBV}9NgC|xwX9stP$BxGsnK?*!+>}coWj1N?8rdQNFbmBr z9XjxHTTZ+NBqO)xqhebz9!GLiso*A3Y=(`aPJN%FC~71FqPq;Epb3og-ezCct0gkZ zt4Vt%RD5G@LhVqUG@Gz$H!ULQrH_*6yK2iPv0qZukhel}!&1aAs@go6zZvkC7)ySH z#Qs=43nB{%6v*i~FVlA;Sh>5`8p`elhWIR$AVd8e_Eql)J3}&hHlJAg1T zFQ+d6=w%^p@(Xo_?Z%gwmr5o}7gPH+l^#0;RQw|2Lo){j(ycxARp?6oX$#mG%4?_ zamw;h8R`N4X>dD@8{J>@u{d1QW9*pAr9~+3E=#6u>0Myvo)Obn40!Ta=vH&f!>wFZ zHU+n*mQC8}4$%o??Apv~!kGqbJuU~@=_z5`7N(p7en$QX<>)G|gH~%u^Ou2iQ@WT> zIB#;SXIBZaWz!jgs5fd^=ZsYXH)`TL1nE45VP>x;5;fXu?h+znxVRO% zn4A@v%%H_L0uJ=y=DiV0<{i6;{FyXyt_}^ZjwF%;B90kP=i!8_N^_zmcCIdarB z;vQ^PSUe-4h;H?qPvv!7eo~ih4fIxs*C8^NP(jSiPp_1mon`{4HDC=Qj8eV0&buvF z$6X0b+MDmVMa|pje)yY1wRulDv>Ks`m<8GSv_4Quy?w5XNsoU$5pMPU`;i&c z>XN25;ZsP3uDfol_5M=NUh!z=<5`?m<~Z-%Bw96yT&w(L-x1qYF&YDooG2l7S|g}- zdc0Ie=SiyBdQPGkh3A}iP27tu;6*BKPkks$RR3&ry=tk6V)Et74v;0JED8{!-{G(& zW5$UW+>p{UPJEVKz5t&#Hdahod^5XrR6c#(^@H@pJF6|@z<9c(Y9eQi=o9tVri{@b z(;WR%96Pu54Lw+*KdJK0vq{grN~@!q7~!nJOq^M`xbubu=)0M%zuoH5Q_vsiW5(cN zaLm~#Zq2v(`B6VMLi3qOIrA|4P+uMMcg0dwQPvx&ODyp@g$E4BMF$1IdeM$wD^kB# z#t-dFrVmzuB#615f=4ZapH5|X{RZeCd^b>5+N=% zKXBWX4z7c-X%-wgkCZ`amkE8IjNibCkdtPK8Gjrin3 z^bp!PPiaS2Gn`$bDvUyE>v5!GM>aF0cYP29VA=<`1i->RCzu!Q%EnS7H|g=Q`c$H9z6+6 zWLAsxfCd=E*!zqn?La=U^d*YkL^JDzid`t;krATmuekl3HgAY^$r!R&vngyxq%0Q| zq=O?J)`4K%*NQ1Bev@NW@-(LO5H4ix)a}P%H!p&Sp{^K9&9V*O>M>{Lfhwi0JV?{} z7Pe=Ykj)BnN>+ZTb<;D?R)62aw8e=;l}g6TnaO;R44HNN_<(BPUy)cbHf*f}Gjlb& zfq_yME>^XZelJOP)LPN7{QXkIitxzE;*QKA3A;Rt1YxA969PNcr~nt0IpW@IrK{!o zLiR9umWGy6g)wXSVYJ-CJb@H;x#Qb(I(LC+A54f>(iDB}oy+%pn6I{8+-xXa7jf#% zByVw%3;H4w=v{I(*o0{JGy5u`zizdF`v-cCDLI?$xEmW2Sd1f)a(V%^zQ}ojhV4Wl zi=&UYHA-udyK0C>H?&<+_2Wj#t>Km*Zw)?+)Sd;%BK(LWBnb$OOwAtWnBa~GbMlq6 zgLS(tf3fMwq90Pr&G{L;PYG!F0v?R_@3hU&vhU1j9We^HL4qXSwGBoTV?0WZPQI;W z31*3}+8H+Qy?9Y?b1$Y`O7rM5sHQo<=gL8u^v%of=7-^`(KVEjwZ(Y|B7&(Qw){Yjz-MJ$*9sJ&Lk1`%t_EGI$!2Un*?+rXzw_TBz!_+3hR86Har z-F%RJFSUV1{LI4TGwrRdPPcB8=PC9sbozc_6%gI}!U-)Ryo(mE zt%m)~pms-tdP0eJb*I=)Y-~U4(+cH0jE-?u0-DI!1w{YjP94j@xQ4Q9t{RGcGHFT4 zy@Lb#lT?crkwM!XqtylqhuyJ}_mAXCu5T&QVfSQE%OoAel{+*~!#j*;?4E@%Z+z_~ z_fJbn8qnha2|>~j8_2W{Hq{c;B7$Mg9;SLwAnCtMg^La$?=?VIdhcwqNQ~xWQ+!yO zjh?PzXDc?bFav%SStVqt*u#D( zP~XW~D3D@BGWdHFi=z}X;;sM7^>X$ zZ@XEzsihv#e<>%1&tXda>$Yx=+3;QwV~)$$A|`}EKnRz9DH?!$!xa4VJ4tRY^FeDf zX?U_tq#S{B&?~6B=q-s@d9}?<;=gvBZzN zy7jsz2v3Ro1T+iVgTK zGaNM$G+%N76FF9^z!;~&->A&zOfc)Xu-IltuPD^)g!e03#d&Fu>$8I1(kUnb0W#`} ztPc$p6%|+=(GjZfF!6eJ*RYfO${`rcA zAt1MymsSO;r2N;BSbES94|SN%p5WJGoi>CndSwiKxcf_Tj2`#rm+A-3%2;W6G`sz~ z4Nm`O$P8|vJYr7x-$&woV3u5JzwgX2x)FG`I(G8Mfx}|zXX9x95RjVPS|#i=TfRxht+kBKJ$?kM`oOM|j_* z1Lb&pJn%pXSPxH6$^(@r?)IKzckLvbCGX_4M?Y9zPxRMfRo6DBxF)dGS5S~x`%-6K zHs!hRRbzqBpB*bX9J9n9?J{=Bi!IWMf?zfCO3xas0XJ(*Z#i^Rwy6PM@3KE|l3u{v zVQFM$+7aY0#RV_3P{ud5GL}8VYZo4L+|Sb!y)IP~Gh)na8M%2Cq?bOxzbO*+;x4YG zw|1~!^V)Wjj9oeijwQ{zTwe0lwlxc+ZC;RV=g-}#^LQ`iB%#>U-135a_v0%Srw8YP z6~hzIQC7TzEYPW7L-x~+VDv@ufXEonfTLM|R8ruHk|CI!hEfaU8-&J%5O)JXG`3OC zPkLH;leF%jksq2==Daq-Jg;7DI&0os@47w}!gYB_K1x!tZHCl1I#|sV5f}2QVCN7> zw182K$$SgB!SqS#tQqXDfX&U%CkP+CD}Y+xKZ0E!l~S{Kg@e-yxs$!?4EavB1(EyC zg?-@ymAjmzn7V-+4}%)aq^Er;E~M--Po|c9bHRZ;VaF`#!1}CRUB5f@3Y+HYCcndm zLxhOe_hhhQE?H_E{pQ%BUPKXGQ|6XimA0EWD&o*(B8Qf{uFN{}75|lqiTX9HK*>RL z`c;6EDjr>AV>nzC1vgEo734JO4C@Wikyd-6@Ii9zDH2{PPV?QaU`t=Swj^^4-ooCu zDpY1LtIn?ZD1|hldxr7}i`GqO)jT4v#NF;hozGcbBo7}vjVdX??%1cZj~; zAtj9tIu8M^=N7uP-7&B@QaWZH*`QP99ZX&plu;SfSlLa(a!|eemEwpSGE$p9yRyB| z3Pi{nMblO9mXP>Almlnp=v|Fb7%`SgjPOC*anyA#iy`i>ti7XHx+QX+hE4*LgJyx?5Swsgr13{1N@K9l;n{~dl-YQ4AziJq-6abZUc{IckJ5`7F{%PBO6jQsG zd4o)Y77J@`-p~;FpS}@THVO;=>LrOG26@t@ht+}lBy%NmLbF1*R04uR2Dm9GDEL|Z zpBdY+Ry2L2q*q^9Sp2RpuS~^4jRIz=Z@t05b{3u@kz4%Od7sxeE>;6)_dqlKCEFBq3PDYL;H7Di094 zkI+huqtKhIXQRSb029bBmwi{aIPL%`X7cgTYY$T2=+c92xyc~cBe!p}- z#nG&w6J(>*ngChd3w$hchi2`A(?w>$=oVf2RSdF~>jX9@as37WzLb#q-^pj8;KvOB zEv9aKk)%26sXw9{fzH{c+S3mb`WZy7k7P2-_ro4Q}AuW zE0qoCy0f3+v-S1{!{pVyKk8U}^8Mm(!9?l}8e~UAy7V-DgE+NzrLsl{rA0hKAqDly zStIo`Sk-!%S*YWo{x=C=N)pDMJ?c2hxGX^NjQ+{wfl3cQn>!`hognjLP_W+)#v!L! z<>t;iHih54NgJrCS6rPeNYN8%1EyP27QxP#rp}xsCa_!zZg+e_xMY4e?wZwoA&Xse zD~a7*AIu!s1=}4f0!zULh}m1Nf?xZ;sEJcxcbrPH(Q$K!9d!TWmbXNwk%8god`-iM zaft;1W&rk{$yWIK*Y5F-NSGk<5~9vU;k@bv*`ps*J+AyZp%(1_isY4GH*~xh(&zuG zkL0t7Hlox&NSFEVu>8OBl$ZPlF$-uVg^wuYQi`qj>o;#Qw#3_MK;0mK>Q3R^eYwX) zI@#iYO+(s!{qW&Kl)ls{o8kKq_=m#hBt$QQk?UJZ95y)zHrI*YS^aP+pOuPIe0R(s zze{xetcOxTLHtz3ZZQRy0%jht@qxSx00@a$YFkZWmk^F%x1Z?`!LX6;yNxq8-48;x zK!16n41g969={$MPqAF0ZMhq{RE`)&2Y-O1VEBgNDlig7ezZpa zPax%EjTWSKIlzYg@oVr`yim}>|NlJ22d1|D=6rtvAL}cUEz-cP>jb8#giu>&mraJ4 z2B%p}!uTk=g}FI1tSb#pX25CMyZB{F2JNQhggaX3az@j)XzI3aIz}m2dJ5^)Haqmd=%j2z~4q3UFRyoB5kS zdb(Z4RJ8mx3Ga)*@@G)XLEPud-*3;5*%>SwiuNzn{ZPSD;PB74G~ zY~*Sz)d%E2%e>Wr*}=c(=Wn31lez6#pt&tWHQzZAp@x$!v4n|;gu7v)hU;xd#TWeB zDMpP%<7z83+d=GK0rUzjurGTpO)rjnRiR-TwC%rP+R}sIjhtik>uz5sYs;qJ97ODD zvgrp_x_>=66KMPRp&zsmBee?spd?opvOdI^|K;LxJx(>l$hfks-7PR!r)JeXIHNla&o%T z1LONLkfTod_(?~C*~IrD{_TDTS+<4`z?quSdsM}W8GwT-+o7zRv*^Eyn;y1;mlJsK z(!6((#if7BZYG4B6}?=xVO3@*^vSbpJG${Q*5@qqmsLBm zxn*_yF)esq$@S&S1%5&JdK#!R(bCdVQ&Y42pV8BMX>YwcHI!=g*UG!m`BH}M`;DbS z9#dk%yJ0bE&CV3zKzx>Vv1INW!;sy$F3a3#@G_H#ztV+X+((jUcLd6GHBOPu$g=+$ zl=ghS;qu<83u9-TI60SvfmfimD*QhI#Nym->b=&5MrCy zU|f{ut$qKAU0z?UDnTHU>>L@TqMZeQyq_{GH-!~0;C+VAC$_kV0NUP@Apppw0L*i! zSzli`g;v_{r}DKv%CnQvFXgP~NTb`1H+u{F{5R*vhzUR!dwNmPE(!T^CD?{TpCEa-@pW z;&oqgCw*bxzIPu!PzhMzJUV?bvOqf-66LCLYF!Y<2(WI=?Hd~#+pm@mC6g8HVgfs5 z>@o0v%j7dv)5zoj+i)?u%fQgDdLGzcrp9OF*TE0ICfKdH5tDO~bW(Twu@Ggq;vPes z{6bSKo7La5U`&KThzMSz&#AcuAW97x5y`)II$#6}-f(=@_OoI09|!{+NPsr#F#3o# z9{uOn=>LV`gSKYuO=0;p3jR1goDP7^|K}I_sUT-`_CWSBKTzLsKuq9Z6V?yWRksDj zkc2FNaupPH+Dg%r=OKqzgSDLtPw4Y~c`Y{Ok8=BO00Bbu>@leQ(C%qneq2Fg{MS0j z3X??T={`uSm5Ku?HrDYnlc5cvmhR-%7$GH~-AKwBNCSrPz^A{bpTuAK{q6+WO>_%j zDG*-4#f2V7h>NQ_#SF>RbGjU2I?MHBz-xFs?n%X{-NwKH`-cBw%7wR5Z<7*_0b~K_ z=JHH2%xC9thrMCSgR^cOz<}T;P`J|D>QHZ)sb{GZgyt1c$^uN7Ps#({Ooz-?dZk4O;m?Wk!Us7Or%ct?CXem)>qry-{NQt= z)Nljn0KZ9+m_`sP+>ef4dzJ+ZRtEXJqBw>N$~#vWc83+{oD{eOhC1$HWxj8!iOG2- zSpUFmgcrI4mRft?y}-6`3Jr}MZu>8tt=f_ZnWmCQl-g}jR!wh*F1M*sFgZ?yNc~R) zRo#`=+M>g~B(0SEQF%WL|3K^&p(+ESAIgcpP)|B7`5p2R;E|LAh3-%TP5o6z&-3^T zxq%5(BUfg|Hjl!ZZP639qx6JR8y_sp`Q7)Qgydp?Jp|QElX6DIq1ZbeTn=56fb@(& z0Uj)~q=on>9(6SM6SIW(NTIC8S*8TE@jlLSY zcmRlcKoJu2FYJjbrW_!1!{bf?jb2sRdTn&mC?dK-%c&bUSP?fv0imf^cjTiA7z5mn zVxF+MyT7;}pNr_Y?<1BHfR1cJS6V5n=~8YII!cgidZoI^V@)0~^BY`At7j&kdFyv? zdfn*bDlw3OZ@L-n2GhS+V?hvX?~392LZVzup2HrgH}J+kdu(0Ihx_{#`2RF*WQark~l5TM!gVmbNiWm zU4Vo<<{7#GPIc&s>@y@2J1l5fP<(<}g@mtU!gX)jZ7WgMA7Kz$pPz@hPV|khzgkJ~ zmX}jg{r4HoM^Q~qrtBuJAB<7DG|m|3sMT;D6ZOVw{-WgRoKSP)_WgA&?HHB#Y3PJ} zU-qMuM1g#KAn_h`SrVN=;wEJc53|L~(>xJ1MD$G_D(p);s}I6s2TW}MnyQ`@bD3lV zR$;k8-0iBmHwytcur9Jd% zR-myMw4?7M!2|`X?iZ4E!j)uQN?UBWeu<w)zd9QXz=&LnpZtFk3 zZ~hjd#iFc#i5Ky69O?)#zJ~B`TCy8m4DWnO0{y5_2*WjE!4ErmX`z`wDqGRpI|9r$ zkPb!WJN@oC9S1#kZrvew{(})SfsRv)?I!KrE`J%NBdX=qJ;JR-7&)Z>)|TPw+4%Se zY32KnXyLGr2l>81iYAE?wFG!^+D+&Zds)H8bG+mgqD!E_!xAP?c*FzQYW@pQu29KC zMT-)W^5{EJovz190;6tVOZ+1+J3QwmhwG%6(`jqc(64p-$&y=@LOopHN+gZ)KBrgj z18S3p&NH20)eFjjaU$1>$+_MMF~auFaRu7eIK@CCC4gR8l-{}$J%6(9eMwY@X4xT= z`_ld#OHz%6PI;(%O;96{umyY8f$CK+87#>I+#6J4fH8*hst9!)VEL*+#klMS<-9Vo z>Z&SS%M-_bubwPZh$(iTvp@I3Q~bl11-&(Y@RJP}3Nn8$ycI8v!`DzUl7kkd{q%h- zFoJK%)t9#wyh wmN!2J5?`ALKBR#j?&Xa~a$jay4nb<}#rlF2fzY70+tjvaqY2 zW^(M~0TeLr;l_}UjhNS~arVz30q~33BEM#ka|fQ9sjdtwP(6I8zD9_T|FlHlISm&6 z)z)E_x1^jD;z$j^9ObDy6?ZYsfrk5mtE(w7L*@##@f?LSq|b7 z0wRrh0#LYOo>a~4yd?K77D6M+1H*NlT!ab=YT0>+{Gc5{>D~SfWlvAGzW`tn-hJ7JH~$*~V?_Ya7G8S& zybRcX&TGT~DLCFns$R+87dSszRtNai`h?&AQMvc*yvyh)^FKXMPnweBsRRxE#{lO@ zN=gD3T$gQ2@C{i8K#c)Q-K%}XDWv;Hu#RPG%?pZ5=Bivx2V8m%hJ=F&h}a@~e#|3=RLjhz2|(^}&R Z#$S+j`5WIA2rqzta#D(t`QnCu|35`M)-3=4 literal 0 HcmV?d00001 diff --git a/doc/_static/ingest-table-types-partitioned.png b/doc/_static/ingest-table-types-partitioned.png new file mode 100755 index 0000000000000000000000000000000000000000..0e5227da3c478c6e6dfc22399ea484146f991d86 GIT binary patch literal 87261 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

VkJ64hxU~875)Jx< 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 z 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

j6rx;db5C5Qm(Nk+ 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 P@TZ}wb0z=s%?JMnsme+0 literal 0 HcmV?d00001 diff --git a/doc/_static/ingest-table-types-regular.png b/doc/_static/ingest-table-types-regular.png new file mode 100755 index 0000000000000000000000000000000000000000..307ef1fe482ed55590b2034bfa3da09030da0455 GIT binary patch literal 84448 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

bR-=dD< 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 Vq5ET1&j<(pX{zdBtCVeT{4erI(;xr< literal 0 HcmV?d00001 diff --git a/doc/_static/ingest-table-types.pptx b/doc/_static/ingest-table-types.pptx new file mode 100644 index 0000000000000000000000000000000000000000..147cc206476bef63731ba52728f51e6ec3bf7f0d GIT binary patch literal 67480 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 literal 0 HcmV?d00001 diff --git a/doc/_static/ingest-trans-multiple-chunks.png b/doc/_static/ingest-trans-multiple-chunks.png new file mode 100755 index 0000000000000000000000000000000000000000..82b077c859c99800a7abb82549c546642f386b8b GIT binary patch literal 63832 zcmeFZcRbbY{|An^GZGOhvt);qEu*qBlk8O)kvR4^HkA;H?7in9^WZonA=@#IeTZ=E zb?o)KPWS!&{yz78|9=1f#-|?6xZdyg>s;eCp09CTA&)hbD9Nvp6A%zkK2nx{LO?*0 zPC#&umy`&!97#Abf;U3vCrS?pN_vWzq zB)>ls5U3C`{_p1}gxr7K184@@5D@=$k0E%+|9cJoz|()dpGznFKPjdY{mFMYG z=kq!IZxhVeQ?`RQG6!V?X95E1Wc(i?XSbv<0f8LBBl-JJJqTAO&nFLBoVGbuub1O6 z*;$$I*|>L0xJ6fx&)4%(S8ut$lt4;#8uXZ+rXrI~F7G@p%X&{KrT@5~zjOD*FL*_U z@s4y-g8H4b7zV2-F3r@16AQntV@}T~Ju|bZP*!4UIRe7Jy|DctI=F9t&razd?cnPT zqMPF4RR4Zr1GE##zH#~Y6Uq(_7uoy?h)DnQMQ)lz*@4)XbnzeU;OocfX{LX6h#=rA z#m8yVW9t6DcNG6?Y)wrP|0GX96u`jNbZP&3_PM|PEdJNz0)w3Y-Af`txj^=fhsx*w zH8g+X^9%p(C9$bLvC?$#$A1rvfb3$=zk5kqPe2y&mFhb4zlKIg!<78*UQ&C2_5jug zlK&nWSb%@`lI_0>@V_hl-vz*n+J7bBe?{%TDhRLe{(q=~xG#89&A3db^=cd}+=aA` z{&+=9y@B}ZISZG9q}iQdRL0`25-LDiHo6AYVWeyy4G7=blWcUc1dW|=$xZA|#rNGH zenLlTFws*~TB=#K9KbugI>JXZWO^-(fJh_YV9#X9xMg{Qn$3TqReYeckDMC$P^xlM zN^v3r(o9cG#73Q4)6LIIDE`y>#@`JfuqZd_Nmu!KbH|^nC?#l=`OCd0*{A3J9+YH1 zOgg<7s>KpOf0+#mXKV1gs6MgVtKUaM97X=-j=eL9Qom!~zb(?fi9d1hl+yd%>;E(v za!-IQc@)C^&vpVLUtlGF?p@0C`Cr}nKfV0;6xg>XH^~3fX#f6A|0!U(_kG@2v;NPm z|4a5J9b40<&+q@$&Nl51I^fHCeJuE2-F^h9-Q>vpS3Bwd6NbaBW*A76K$~A&oGfZL zR@!)4XWgx-uCBh&lY($r>@U(QMP(_)#l~8#^$mW&4`JHSAG?|u!F)-MAb|c7n?0OV z>bwHm5x_>}5RA&D-8ICz?@S1n%>HyxXlQ6W|6@1vPJTF(tnV=ySF&6#JLe@n{G+!h zsF4*HdVT^d5@1D64NoHbu|`U);cxV`T-su9%I_@wevpRj2~KRv`>v_mL%aUm_Gqp& z&-nyi?{Pc0B_f823XedZ*%4;$jj_}}0MdUf0QmWc6eUA^2OuE!bNQP^^-G0C5fbxP zCZlN@-#d3g8c*Do3i4R|jyGLhU3={674b^rM<@YGim!`_7<}GP^RHRG%0YLXnw!vG zs~zJo>9vlGGj<9=%uYJ@N>^1??M=Fy;nqMOCTCj0R+p8+uhCUxBR{alBJFD7RR>MM zqHO;Dn#Auh5dj;b7^qQFRzbZyLBPaiHhZbo$!+Cj&$khOY|{`9gBdd($bp;d=nR>i z9S-Am4G_4qlc}>5@2z(8)(-|=u0;jfd6M?7JiNS4pEnm&Ax3L{>&q#MQ!@Cu~CN3n=K5DyJNOOVr4Y=sb!-jl3!QLf5HV8{i6h+ zKL5JlD&ZLbsXzL!_?#XrpplZ43X}@z*ZlZ_!*3b=VQbNwF-Tk+_6GiwAmB%5CNOr{Y zn9=9K%q7U(G3?gR&=BAQZ5$N+TTuV+Xq13%-R@425<65b(uIYZ+Q3F#hfP#fRhgr0 zt)rK&iaShy520;5JM}8Ea7kbVERdUIe@BGs%I#;R$lW`F%oL5sTb=GxK6zusjSF1~ z0~rs4S)`#Z>lmb7sp-*5g=VAg2@^uxbm@|@YMek-DU;BP@73e>MIv?Qw-)o#PB)sV zT)iSX?j2&Y){%Rudi;7P-Hysdqs&rnmF|6p_M9dz=S0V>+2^W@I~ot>lg>`}8arMt zCP?w=l`!4&*!c3iS#;DQ+OB$(vyMY(IN$Tz+0S5B92*N|5$_@zmel%GHj&{~8?*c1 zs+N$u1qTu72+4blZy4rU3U)tXdMX7=pn)m8Gv8t3L~ z46QZnY(&O=AD3b?8E-%TM$D`{TcYZy;HL$=I0P zx|vYESbigVq*qw!=C~jvEa=y>bKb5OsgZQj-gL+v#!Jkyw8sc@-=O!HcQ+nVG#qw! zKV~fuP4zETOsh!=sextmo-#sa-0G*qOVLM5V#7rmRa=EO8i!`#sKaK~)9L*;Hpp8% zJhjt-6j8nwt{b9U4f(v5k0PYjYT{Qz;9ISX5SPlP`VYQY1yoCMCT<2UIt|dUWZeq& zm(tl`_FprCSqk}#T~ZW;Q+&ev73<2Ih1<&*Y_XTJ7f_bwnTMGg6lc=^9_uR>(5S)WOoL&>mt)_()LxmLj((ViYt0l`r_l0 zgew-q1RJhYD4+;cBZEQ=LP{|=@`hdyI8rTUGO|^cmzT%8M8pKM`qtP)`TWd|)^Pf) zcKBqk5Ub1M#lhdOQY7|>zvNRA<;IYN98UMjrVb7*sNiy}wy_?uqbiTD;OkYJU2KYr~p#&tYMaXyyTk`Qm2Jv4X9}4f?uir{6dO$0H zT?-O0sarwrVd@Yb?NJR9=B6~s}?E!((OcL!bTO81oMb1V@G4Vw=B;WHa4?{-jsuB`EV3)&P{Qj8p z;Zvm`7B(z3^Vyvtyw)rmUmO zxNLptHbibNC$v?;n*+56tUq^mB!G$OPUm*^nRP$--?hicoZuEri#wZ5vZ;z@FWzWI{t9^T_- z#IMz%eN{*)$jsv>N!vB#pfF#r^j@;P4QfMryX&qJi>HOlRp}yeD2FYz+*cYl=y_qN z?Y=+xGTBkcDR_MRG#lk>9yDM0vByY6MbBBk~8*?rp{8=_IW-V zJ9mpfpN1BEFG~-Gi7ySlG*r5J)On8TUZ0jJTmjqZ=XI6e%zLvX;svyzEnPfx(XyWE zC$Fs2uOE!|H9ui+%o8j5Z3(Geb@*JwB(vZEtXrW1nG-fl;QDK+s8mj@k=b2qTX6cVt+c8@j?&iq)c^aW_4o9ptJNskpWXT4? z;k!OraVCTGg1)Us?!j2*?$i(wnd9zmd9i}Kx&Bm2X*G7NJPe=E4PH2>IyxFS3_exA z93c~T&#ak_DWVse;8Q@xw$p-`jSBr9JovVX!PFzei5@!gY9@-uekkrBA__Xwy79A_ znNOrM$UNLsBTYscYS|@nxau<(qbGB^Z{EF~&A5yEJm9uE)^cmHC?+H+g+x+1OV9qA zBfqlZFbW&O+wok9Z!y-Rts_2Cy>_i`88C=fyW?!@sM#xnJ=VpxvZy#xwr31%&~cID z+GI9=TI7j@MJ0K_2LN5}b}T=d`);RsrQrMZ$5@ZXkPg z%mCxyt%cw=Ks4Kz-9z+N{LfvyBI%OvQ#5AoXTwj$B>p%K&XZ*|CG55P`l!>RGgLQm z^nPSsxZc;aWgr#^vZO&h&xfE)`ySw)>$cw$b&Cj&5T|CWFxg& zsXbg`;u;q^+o`5gl7{s$2qGYIBg}-GG($Q=&WWSOA+riz)ITB!9Hpds)*>EExGl7r z{)thy8vIL8{giBnv8Drd_i%j=1(CQYmeeTR?K)KjRu|c$mAld$!ZtsNNqVH#>#;Bj z27$rzRwu`&N9&z&g2P!4cide9*`aOmwtrl>LS3`+PBN-;G$D5&n-MiiDWV3C;+^^x zPoPkdBfbG2c|p;3Z8_%-dnD`t)d{qMrZWO75YsI>t~Se9aSwn*wp4)2Qq{srHJQGK zVEAR^gb4y-X#nEjHX5g-FZ?;O9&x(KaPP~Rfx{GiB>f` z-kP7bK5!glN;_IZl(LLUyRR8fJ_aW6&DPeIM|a&qs@II2iqFZ1t9NlsR^7{vCNeq)^LC8_2V+*n>(O%HDU3PZ%=st=5KWuPvL)Pp5+MHuog!W7 z)BRZ#iSN-W{BmPXBt~yrJQ=!F0NuC7al#hI;p+f)jTLBfb-NYV9vI&<<+G~#sekpd z*YWd?_p8wj*qHud<+6}L483IB}E*h%s{Pd z;$M?e7XwkHf%`}a2UuSri+Fuu09YKa-O-m)5!ngsB2{_0GET)}f&ijU$CE_>4PL9^ zV10T~o$b}d=ltApn{kcD3cYWKEM%>sOK7h*Jr}N|z9lIwp+Jf51+XX$y2PVy0hV)J zS66q;%OW;rw$Jq;?`!lI0B2(XdlJ743^ejT{mBjup8lLg!Otf*VQ=848KE(;`$p&` z-%t9O*B5-c)?0UMwyTCsRUP(cW@h4z#;a@@oRJ0vy+u}|W$B(!CR^MSD(Bi?QK~DW z;n+K)2GQwr0@tSP>}2x77VcX2v6*yd7RAc_OmlpLEafe0ebA78;~n7Eff{bSb)JHfGc5JeBP6m(=5H z>ozI9_qNr#+^``TyE}D5Eteh(8x$b@4bZcO!iZo`8-CpSlpk<++=~ZQCrN3M{o^79 z@Ov?{z^9pg@0;Z;+za)@p_G<+8h6!Srh3koAl6>NKJ{X3eM{=MI#dObgQjYoji-l2 z=9Ge$CVLZ&6Da8f{B3!XaRhE&*RKU)j`#F} z&Qqb)SeF5!a~rqIBjPRK$zqncD9!PdHFR&poT}&#JD-)ZHsNIp`c&p5XeTo=?4W;q zj4617F(u0rt(qdM8hfh@Qny@!z!AStDpA>X9O;br${9Pc4J8(oNYIBfroSmpYvE;82vy^sAQ4dpKGc>~8l zJ55^+MX#1%)r;@5wE-^&#pVAeeY=d2mVS@ zo(NZpOVsQx2ducX^lYnBaJ^>s;v^2&>vyWHcR}Ih=w~9l=l=rTt^%?$P^GkUm{uc* zZJ0ejN^0zl2Tu&w|Sl4HW`0$bQ~v-OgzAik%%Qc$?0|WxG<5 zN-aUy=7~!LyVdiGCwgx6z+bI%Z!dmMNJz{?1eo>xpL3)>qzcRwnJqP*bH|0g|JfU{ z_`iB1GnCDTF5Y^X?D($X!SD%@%~0l5Nn!O?5(Z;xNGSk>_Z{!W^yb%*DeP5XQT&^Q z<><&OLN7W#^YG+8pwWx*um!?o99cC4*iZ@gn+-bwEHM_lnvLvF(DLgk+v81$P18StTybP?M)Ftxh1L3(CBI&mh} z^I^oUHldGA(nTC+zDLR&T2ItClBvYT#sd3Tb=Rt^Pny)cEkdVivd(pY@-0tF!2e7phCSuc>rFDh6b$FdI}Gcdh7);zpdAFG{T}(U4=l!t1G;=5GI8 z%PF5d6ZQ5C?G~oDB*fIpY;w5j*=#z^FR!_+(CKO~Ot}}Njo*V{?sXp)EL>ky z(!5ttTs-)z_Yg!do<*`q-lo-r=qdV5)o6f|ikS5Q*U>@@GE zCc0c@+iWj>$I`;jL1Ss)cf}k6_Pf>LNB0ysOoSpk`C#d+k$md4bpXu(mqBuF=JIPA zQeqQ;{C7y{PK2wHI6(XiM0i#&SyUHYhrTpQp1nTJ2;c+c-3{bBYWTo*$3g!@X4G~b z$VdMp=t^t`VzC=-A6fp<&h~K|Fo)CWWdeMp?til#_^9DDK3#fxrT^UD+X;!C@OjIg zG$Mk3(xUbTqS(ax5c%m904zvjf{z)qkpEKPzSN>Nz_=hK;CE-U-@Gn{$ z__VLzg+;=D28ku`v=%f83H~+?Ff7srkT{)=ye|Epj=m!xI;Ef18=0Do z9!00Xd#e+q398urZe~0qlRr$YWFz&7bO#kRtGVk5l zS-HYg(3Tq%w8*U)g=2@V_0 z+5f?qUi=^;FAaJY_LO*c+Ne`$^(EUY|APuAzv6E}2v{M_zJlCiy!-k#N=oYCH!UC>0hfW$^RQ`s$EQcUfu7JH zdPLi9+|cA1h*txT0paHR8IQn7LB=oB9c1tJ4M0vXO)0oqfjEjYs@6M*mIP4W$dK#D zcF!@&Fo`6-0Z&pRCC(G^0|n979LE=~`B8a(E8JLu3=5JQ#DFOC*ZW!Rc%qpU`JU_D z2S1&G%8+4YOJumDjK7ys;}Ve3uW%x=OtCn~zT2Sn6`&{OaPv&0C3xK(VPao(Z+_T6 z`=j&n&2%_Wp>hEps3Rs8AG)uoY(V*=6mWkgt}cJv`An?z;}7A=$&dtmANnH1m>&`Z zd;uM7z7vHz2dtMWm~Nw4=1fe~G%4!YJ0xF({GB++8=tR>ARYNe9&|P;Ae#}8GzTP^ z7&kt;#1Shg|8a+*?x*ri=L1E73z9w{;Y1BcKD_w)w{l zYBv%(#hk1M7kR<>%>c3L$A2$@Sn2Ee+ii&u8Zh~v%-J>FK|E#zTzwYF z3R5BoFs5UJE-d{xUo+*ov$I2J?^~Q(n(Wfn@yNY(>|5P!(yl_gim7tuv{z!D&zeGS z?|!B`QF1!u2K2lSadfq; z1xo4-S;WD@2NlWC%cPZG&kCVyPw#Q{nWS%qkkpyT@;ee%ztiz2U_pPXI#j@2+}kg7 zmtXIra;(2dgPd)DV=j%7Vw#OlXLufp0ifeq`sgoh!g59#<|~PB0YlsbiD#}~&)LB; zPHThcnCAI+RxLE#AFA%$T>kd?J$d`bK1yO5@{JSC2dNWd$^^Zz&0IJk2mqedpcfplH^Po@9c27u?ll?!S+za{oRUq0et zMS|Eo>3=rDVybCB``Ma?K{l0_8FWaq5fTR8~qC2<1mFBNcBf-S}9dsoyaCaSF|K|LrZmw~- zE5&AqtFhkvdFgesLtO+GJ~rj26@ZN*6XnSNsNQ`k->5cw9uCoYXsTtSb@sEnfLH1$ z@eerfEdiF>H>A$bag)B$0lYf#Nu=pEH_B)*x0`rlI@P0cf(v**X&2svS;Z?WaZ z1iCK)WBd-&p|@su(nE{Bcwi^xe!8vdc|fwcYqoi;9+TEk2qQ5;FCOQ;Txp?sUCv-W z`Y>QjyD+pn{qv&g3q#5yKb2B^9tkGWQvA)c1c75PG zv$Kw?+J!IG^-f^!5;BdI_cjA`8=Tx%zm4*0_rc5#dT41FtoVpzF0nz6EZB^Nn^`WL zyM!E4@=8LIPnTrDWz3)Y9vTjH*|>Jnqhb1)ey3aGZahmBzU`a{I=9v37xE({0k1*D zMMc5tYT3%CkJ!~2r2FL3TufS{>CO(qRdt>(Y5~4%JYs8df)cBGJ9*wiO8& zGKZn4T(DU5&kWa*MSdr4izY9*h3tOWG8|hVgCQ|yk7d>>(Nat?aSU&$gmcds7=s1n zb(>>=pi52d1x+@8Zr>Ewt#>I}tGT4QS(g-NSC=;#Y{^PKD6nq;>);c(J4%VHEcwwF zSRxuaJYPo_7I(IH&4=B64Cp?Q{EXsXZbed;b4KEZ9 z1ll;bn>mRM@s@!$4a*$e0_QW4UoV8@2_V-acVhU=-3v?H<|xD#XO?%BOjplr`_0|2 zH`_jP$R;m#d6$*{t)zr`YY9WBGcb}Mt;ni)c6%O}Qt(|VK z4%34#Qo>{bPk}Wr;MQtgAQH%g+uI1G@M5fk-GYxty;-#zU+!$3oo3CP0|~z)|1>AG@g%<8{xal?I)eQy)~tW*mE5u&RZ;wDNBMbya#LOJ4JNXP z_=nBrFU-ru^>o#|3Uqu@s;Vb5{JL!iP=+P@ScR9UuKJSF!u-g(V9}U|L&GA%QZe6l z@07S#>d`pYHk63YLx=h94nG}M-&%+ev0c;D8ef5Dj@*EJIMOckOMTvJZ;c7BZ)Gcz zGC3YqH+<`F!d8PaLOL)^OsrZeseW0pBj~l(rp4WGNHPZOAvjf5moQwHB8|w1@gz~O z+mqlbRp%;_>+Zc<&y4=M+5gNB$TE_d0piykg5imXNWvnmX8eZI^w6R-$Rv!1QiOq| z)9}m=yfUK1fM|(P5cdVW0q6Ki$HbFDMyJiVrpbey$n)sq%wcykfvp%8=?=+yKdEqV zdw!fi@uW~%BV#Owf*0dwIIw^gNTp3UWfv4|R9^@zS^gY>$#VH+PqtPYy0ZUsJI1VD z3t_Es5~|>tV@K|F5%tiH;)s%O(qgavxW)js#40=R^VNJ$VS*T+Q;f>cU&<3&?Y;qu)4 z?B+MiuiH)(+{1pw#4_w&F&1`^UuKSM=et$D9`9kmjyNu86#M1AZOF5j`$?rftQsxw zLG5csS``hGElbFZer@icp&!qW!cU12_NX1D!Jacmm|eZx*EXW2P)wi;!^9m1J09jM;!`L^5Si+C&FT1V}6XXIUi2l5~OG_psGY; z)9EXS?dyJRNk}LQU|G@u#wbV`x4VIa->aZTx_++9*@l_PN%M0wZc4e@hVQuFU%*fb zE-x>~fNVvQ&w<#T!Z4*C3`VzTqC&PyMY^_@J8;&gKAX^^Sx9+f??BrhMP~Dz0u^xv`NyxzV{G5w zyolCt80+8WjCP9i07pk zug<$hC`61*!4OP8o1NZmxwJ9M?-fH=weAuTGJaq|VLi&$7L*IJIz~Ux)yfgYxob5( zPs}ZI`zeUmXm7X5xS&VLsXE#$2Af?~wpGRHUt;ViPreiTWk(?psa^8@ z%b8?HqU*O}AqtU3pFBURF=m%CgW1ssJ|~&W7sJIgUv>+c!Mu0u+bjizs7&DAsHkxb z(b4c9DMP^~sndl_mSV!68nSpTCDqECUl*QkYM-DwXP%EI5i23i(LTN{6x?Lqlt)Au zilO;rWNeC=A?D!Q+1O%cob9#JmQKiU%c(I88wIilN5G;aAbi(h zJ|UP-(deu_%%?Ktg;jUwOn5}h{?!x!jY=Vk?8t%h{SD2F@+-SdU&h$UVCt?b415vvTXC{Y{KJQI81l6J%W9SR z_&I?RBS}q)4(Om>N&kcAjp1V}j&<}n^Ac*UhG#>+&WtJqoFWwuMxuqeib`UJ=xAfo zkPXKPwyucKYF#y-lGjD&W_>ybzZ@l=)vjeBquxn~c)^USyRW~MKEJGcX)@m2Y6<-y z$uY0B{$`hHNSGxbLd#lq?PYWfTScMa$?4rKAs3?dpQFq+ z{rc;KTMIcI-)>U1&=VhXP^V-0#oe3uol#Q#H#PAJR8pg0S`nPJTT`3XMURR&r%KNw^gHWf6r~d3N;yd@y21{>GHt1U zFHfF}%samx5~HMI>Tft~ZE$h<#Y?xG=dr=9jwurCE{>~1ep7Lf7a%Zjrc^dv-qj6! zxEDl6#WGoA)_kVNdw$Sk=+P0`a7;1$ZPoSC8Z{-Jm5PSM!9szpE7^3tlYN_&2quJ5 zqsyd{l8)s#3tCaTcuqtu+ThM>#8}R@YnV#5zFigOKtdqgab@k$vUs+~wq`Uhx6rCb zEugK)m|^f%?Y7HFmL(ncwQ`#y^V0;E`G|7ZMeeI*suppHOH-v2+Gm2;vC?LnPZP;I z6<(3TYd(BA z*NjB^k1FX6O$DEKi6XZ~NM?G(Yy>}dcFu>L=pK;du(w?!H|fZrkSvaiNvqGzOO99X zHt4gwmdM&vct1^IoW&y~OSC(vZ}&^5(VWPIHTvwQI8wO{lHEE0Fn545HzyK%HbjlRnxiPJfW*`4{tL>!E( z&&nCC;=Zw*>wf4~wYu-D?$$gu2t}}~C5&-|vsuM3P_#!P zJT&TOx%2sv%eT5+Az-?1mp40#iO)X_uPxO$XW~^XoA~wz@8dpLT9u+7U)=Mzs_GoJ zy1XZsD|mHpP~QqjmxmP8U9`U%iqVa}cVW6j3M)PrrKEMHuuhs=^m~r^_}HTbKv4|h z7g#_i@ok!bSP*T&>#%_B-BmHvc*{5hlI1?RH6^l|53r^d`h3C+A-m!3-e9lN0(pdd zR+eo*VS{~5U4{p;n;FiJ4Y|pO_MRU6K%*jniUna@9V7jSn3kRwd{?pmY`<8WZdPCK9>Sx2;buxhqT;8-b}v_i;yd z@j*)Yt&j%XEB$%UZVM(Wm5UWTO@U)pCKDNVS{Pq5R#>3Y)pZ-UJuI|M!UdFV66wWt z7w2&(Q?pUD5T=XHLeN&$r zdFoAZVXu6N&=Z4HtDLHI#D!wwU{f@|Q95yOzgMmrO0rB)zd!oLIPThu&;$}oHJp;5 z>*%YU(y2jgfl$~2@8o0ntAY|Wl-OC7bA#AhZL>aEt=x^Rwo>cF56#6xE$rcuM5wyN zx3XNP@sr6iV-Z)q9ARAX!WdmzM1G#F2*OC)$1wtND{Aunz0Z2GZ;`{x4*mQB-we6~ z)2_YxB0W^Y(}c>2tcq#8L>esTp9%kJavpv`0V2{qPOw%NRFE9*8-aP{w|%ZA7-cjX z4ltz6)A1EgPCao(N_y`bAfVji1);owl3Gki?(l->%tT{h>#&`9vnjvjfrRLic}GrC!NA z(!3`7tZlpn^ETdcg~S*qWR;@M$G9+SZ5W-Bb2-Acobi>`5v_gyEf|j|>@ZId_xMWD zmsD|Ue(Q9;m%{hN(Gwpk4pX><&%Gzd&ZKXpaAoVuwoq@t@UwCuiFV=+h|d6!@8K*N zf6SzMJ(RQbyF$od#Ik_@%Nx+rWbZST@$vXA=^ksO&j2z(fB*z&)bNnLKn169@k%}x zHcIBw88yTsO_J%or%gZQoosK2N-Tt6iuQ3;{o(E!m^miC`+@9h{(5IyF((})K3kf& zr(K72p*Dgs>wUMczMN2rw(Eo0=f2-zqTTLqc$Vg!(I8qL=A-1*{xnvkqBY7$QyAVV zyz)f9xU>alAX!?hzS9+{UC^eL>)XAOVKryC_@n||{SoKv<$P!@rSXMfr%O-$+f2ON zP188s<*$XM7`N9$dIcyx*Snvp${TW{h=U(~hzp=4)y2`5E>Fh-hsGuB16_~pb<6$b!oVI5ye|W^f6sTDi6I&aN%w)|l8Fd@)CKW3gs)j@8{6};Hoby%o!){aCPi#zm$2AU^q52%l*A_5$ zZ7UmWERXEbT~!ZC?FLH=nZfpkcYMS&VifxooK@O{}d^8$Fc3BlfNsO^@Mv{U&^ z76ap0a@?@n8AWIHJ+>Wz$20-OWPgoc0k^y4V)qGaa?&}hV^&hzBPrOp(?k2hH_IS< zQ6Wsl2<8cuTRmn)E1PXjh1_XE zOKC{E4G!v#K(a205t2kWQ%N$ijFPy{no51vGX8xy%#D6MHLM$?;6LPU(b= z$b$i?*5s7ig0g1ATSk#e#YV`?f|gq%AVFyTS^wxP#;if7@l`=piN(mSWzs5gcQ;qh z(~|^XuOgRAO4@;0=}o#eBtG@V%ZoQR#prfT;X1wurk|KOE8@a=6IZehgEe9F z*1Y6=O&LlhiVXo~ce&oLaihe%P*S=+dp`?XuU^HyzJ7u!q_LeRDXK<~GhIuW>|^@o z%13WRl6fYYV0EOxp>GVYlBO zd^Sv1{c;dO^CQx*IrP0;%izL=H&&%0ohXWyy6wy_BZg)|Czd8r&-lfpgR82?9QhRk z)f0m=Jtoy**IZC2;L5l&X}R|c_~AuXNQlK$3b5Q6 zGc1rY)>Utq(vlP8ds%OzYq&QSABUpo#+tiW7L>HF58}9a!b{EJh3mOXr_6k%mq!OJ z7P+xao#owoLnZ^cnIO*l5MC4?7sBxB+PYymm-r2d0+Cw3qmJ)8U+BOVCt?9;*r1(* zZKyZ^5X#Z_D5veEMkWUMiGfnYm6+V|+vIOcT2b^pvS;qC30_fj*5ujk%?8Cz{dT}m z4uRA23Hz=hoLEYn5Me^ z44dsSRp_&qn|-ii*TkBUm3%KkwI-d?$)aWPu1?~lr@61ko7LKNN@c$sHZLqQ3R346 z=@;lE{mWeT7r}k zuIV;-2eaI_FxBlnb=p*KE0I1@95}Km(tkd?ZM+0FBSB}I>V`VI*9@(ZvqJN89dY(B z5RLIH(14vzj}Ad(EMT813@xi$jU0yCJgRca8~OmOt9PgvyEOz7ItC|A&Nob)7OpON z@a}j#QFQ)Rh1s;$9x7Kl%`BAy1EJt-vFf$VXFv<=#*pzorzJXNAhpKP7l%#9qW-cx z3g?sj8s4(`Bf>Bu+kS@L+hujm=quHeXMu-Hg-fGmEyvmj>j<89A|ieOPO3+e&M-zh zAhIeQJc&GUV?get8sGgxe|7kr0KJJY_Cv-a%PTnOXsk_`z>}i?lFVSnr z@RFo?-5*isUgR=>y zlZVTP5p^8fuY6BhFNeV&3p+#)t;^WhnQTr_9%hX{sq|XdW*zRBY06SnT1Rbo>Fa_0 zgFSp$nJ-_4sW%Iqwv$Su<`AhL^^C8rb6X)1GKrHWw=Ppnj_v<=tX)-`|Gn8n7^||X zr|(?w9(PKCBVL&aNV+K_zZ&@Nz<8zh!`Rz!vWuMb>RoNS=|R7pYjr8#%~~ABnbw1T*R*kwE0#LCDg~ zDjb1@9f*vvIu7AIYnjalE8ox@~ z$+8C_C@SskZ3gwx@M9t!7HN`)h;xDhS0&Je-w%xv!V;$%M8K756Uk)g%SW>uT$I65 z)8Fc&oGRk%!wV9Ha;_sj#pyMS^Kc}sSXE2XtB74SlC(;z(naeIm%ff~kY65W@wQpa zcg&Srtv84n;L-u9JP@`?SMHUzLv~-!RhuDk_fa!`83RE=(b0IqIX=Vf}h)Yhwl zR!m|-l^xZ-cKb%kwWX30W9Z)KQ2P@tMK2h!(f}Qkx*nrtZu?-UTr6=QBa-CTjhd=% zi~pVau5C^*^>#QnQ~Lz9JCj@OOXgBUHXyYi?Y++LmFb?y^=xZqvEjsx5y`GSTP3x$ zbi8YlH1^c2lq$&9Qf!N2oMmf4)GHbN^c_bM*d@x?n%GhoN>{b*TZvvOI?6n4PT|Nj zU5NRt;KYR1w5zJ!$k;)j=h4Za2zNPC_;vkOVqw;%vs0jYp`xB=rPQz9M3)NdNui!B zx)_jWr~sj2c=crai;jGbL^c!F+OR*u@9?oxB$8LzHb!Y7-0v+k%@8t{R@romurv48 z!@sP*%k|_4PPdu(SIvt@y z|C~87F{_v#6IFK|Zx=QAlpvV9DU;=a7$06%xv`w{u-){XC9$DATOZ2kg+O3Z$v%jk zL2%*nNX~RG=Eo8@mx;i?1q&Z=17wxb_Xh*dDgEX(!*q0OSr45 z>O_mJnlul^*rRSQjRd*BDJaX);q;D3P*r07!rdxI7*A+u+{2Ikvm;Y&$+$p(znGMj|dpTJ0X)Ae*I%wR5}`Sp)r+9l?-mEn@4M?&Q!fC zKBPz2x@n#adPyH$iv<-J0Ukskug$E;>-#A`%04Kk6SD*h(e zG2w8H8c92C@gllG(=s#M<#{c>#I=L{pS7I+>!3n!-(K08`k!?Tq}hBR7yjR8{%_}i z+-La4`ZeLRWG#%2qWbTukWpGT|Chaq?D)eQFu-*}R%CM$Q#-Iz&l3kTQtfWSzc%WX zLLk#NmS*E-<$oSFpb1KIWZT~A;-3itxs(u}k)?+L)STiSZK*X*{V6h)xsSRTYG8rH zO51cNra``MPcZUhaYCSgwbk0F=0&DE1(lrcMNM1}d4(p`1KjT7S7C&K{JItGAL)S~ z71rwy4-X0Q2jq#-q%Kmsxi7FY2lE??6??!YgC0){W#qyfGz?a`N^U?R0U zOMjK1{k_`dV=5@N!PRr)3-A731S4}996|BlXZ||}|DWRnZrt-EYZ@ZO=?d0`LG(~k zT*TYO3g5f7)F_{ZL9x6ashUxO}DpPPe43vu_6GW7N+3<9+Hj-zv!B<*}<4ao! zS;=pPV~iVqHfv?!3s?zINzQD2AWTXm?OofyPaI+)F!duQ+TZtvzZ?M|O2{Ofh*yF) z>--b-a(YY-{F;{JftUJ8ec%YHZrH% zY3@s@OfCV}AcBI!d;A zfDqV}5C$rUZm~a-1t)>P!F1P(V6HFmlSNQdT8$uPepi}~oKHRlTLhHB)$3Q4>jDUf zB*1pWo-#tJNA7^61)FmQwOfbnmDtAB0Os0H=RJuO;P9%+vph`kA%iw`*QlP@8<<-$Nn9LNt20odI~ zfvU(KI-nr9B*NSOC*kvyT+!c<$so> zCQGe-aBfSvT9rsAab1ppYV$TN^5MN2-Qo9`4AvQ9=9^HiuVjauneKf`w{4Cd(jyLmi2)@wFp2Jg*>55%aIxxenol6gAWvJ>8ew19^y`NC8E_1&TL! zpx^+dcfHpN|8=-wKo@?aOTCcNZ)X3`7w{aoa{Knszd(@OJYHll@$7#$YIxCnhre<+HG*h zeUM{ZUqSGy-)VtV+Q)wT%N;@iVhzyc!J{72@>h%bgzTxO&FpVUC>zZ*{cy(yRLO!L zqQ1?ro{F$L^Fn-gcEy|mP~#LMGp<-R8qZl(wsi! zq2fVg_-Y>gjD|OOx(8EMS6x_IV(htk6!J@=w^|pP&2T(q^Vqcx;B#Q zv>dAkW0rnKtLbZ!a(<)RRufuh-`f-|bC!1aIWA7D=ICp&tA?27q}W^&Uur{ZhrNgE z#08yYo$dVdc!1|YgQj8qMr9a}TiOkgVqsh(4(5`Uwu_6FjCFsiVx30`H_LPWKiGS(s3w;- zj(3ZwC{hFkX@VjkAfN)$L8U2Dq<4_sdkF+W5fK3a3%z%wgbtwvZ1gS=N(fDTTX6BihXMXdajMY^BjH8|Lxc;MGm<{PooGU{S z3ay~Q1O@}@&D$j$pQpJ}B$urp=IpsdE~ah|gmN|xBDTfR6qp8=Md@VcnKhSb{OY0r zX=A1P{47G%2bbC&wuc!A6+AO}jIo?zE?zXyB=LS`Gf{MAL~3`|1Gn17 zNl+{)H6V<*On)|PP;B#Be4qu#;>y`cf@#4S0OyX%@t2qka~9Q;d{fw_X%F54-qYVN z6WCv+{c_=mb;rGHbR!pikHn|JJXY}wKUn5Fl&@0ztVN2H2qPtMO@}ir6FCT!L%`D6 zhfF79_>++>h=+{4ds1p=-HYPS=@qK`|T7nfj z6q}|>Kide1RT?H;m6Gr@MJ!UYIP`yLtl@T|HJ&oaxxg(YL&$@)5FRCT^cg;EF}6cX zr{OQJ)vTKt-pIwJAWc$_w{|k5hq_q-rVaPUVj*5%<7!H3St>@p=DWT+XI!}3huCPj zN0`qD%z&q$#A6ZD<$D8J$WbP#m%rcN2%+8h-07Eo;*;$?OmIy8P^TM~9^!Xd(x>Nm zLTVv;{rs)n^yI@v#D@1b%JwC{hboAygQz(30n6-mr@&YPpv^%SckC7;Xi+<4Am+7D z%~c>R=x|KcQl>YY=d^gn7|+^t5Rh~JopSkeup#kbovJa-dtc`Qi+gv)#fZE{ZrPE1 z^yM!0_czaMlQZQn@f8n$H!#s8P&A3`)u z&)ciaU9xcI2x_-9vl1nJ!hke<=!yLS=6Zy+M5MLJlWS-wlFyJnK|X(nx^~j)9xbkgt@$GXjrMy z;dTK1wQE<$MeOtke^+vq4PXAS@R%u@#P8jh%6Qlmi{E9(qcrt1Rup}8CozY=T`mO* zE=o9vPh&Z!N_Y+8H14PLeEZGdayee& zw$z!AGjHJk(jfGRH!l4t$JZ>*G|&E|XzsabymOI#M}MUMGq1K%uGXf3M-u6-d&|@P zDON6DMq6MK2i+oGi1f;f2xeHC6pO_*4-x9Zz2V`q;htGT7XOZ3#lW5Kp4b7TIL@{D z@mUsuuUU}dMH%-(e)We)%|PKys^;ybx+@kVH9y;mG0MR{vM^!4QLXrMsSs}*`#`KU>N#d&b8oS1Lu+cb15PD;F1ad` z_bMe}ucGLoHHZC*aKEX@TG%pz#ZMOd5rum&p}!-lGx-*s9dGFiqU=%)J=L%PPGl zjqf7u)@Amwdj&5QvHENv8Kq~g7#zcHLsDXlj|bpx_B$fhSDEh&eiykgD!t8c%bRmEEte*-}nWP(>^Nz*L7`p_cfx3;%^3zCmKY_;tD>H#`ZN|BB> zTpAm^4H7F#+O=Ewd94=WA6p+Cj?@TDB_`;9GLq3tX&-iWJz6%2 zOM5t}s*7?&uE*of-!`eOWWv9j_!XNLJ!&l9AV1$*Hr22b&a0!VYpZDdX1hmG;2kT{ zW=?4=;xCdLmvXNOmHaw<2rc&I|CY=$M66H0YsiE$ljE-Bz-6I3>_dT(j;u=YK;Yz2 zVm2i5wR74{ITy9;J^Zv9a&u4y>&A0yq@dozTSjW91s1T*c9AkhQPKC3M^0GLlv#+A zkl1Ih#xUvl{$m2Y%1blKgF{`-5-ZFX^Xccb-bRr95vW{hZGaHgBJ_qwPQsKnmc0Un z<&WX&^B<6Wq`LQK{h|M26rK{juvJl9q_dnk+U%3FU@g*q_;NuJwdICpEesEYTlF4i zF1tQlZyfa2UC$S8Po=3~FhDn)mBqnZq>SD2v5f+|GvIwEqjKnh3jw zh?dnoE)U)a#`=R96-YhQ#er__!nAKs`b^zk)X7mbXGS)RYRdnlW&MP!n5MTe|ENQX z>&UMkOIdv*tDva|%x6{aJ$8#YJKIpO7%c&8u6FO&$Kf9)kMQXdrDks^RWx%A-=nZ% zmMwuS&hv0jS=x(~67=0ojTAIfvg!kQeZ+)(> z4Bh$4XmUj3Prc8L*3QqZ$bBR9ZDrPA6VU)v=Z@Ld(-Khc-9U& zh!L4;g%%c8E%4hV8@I+1HB26Gz1JBabK8k8Zv;w~bjI5`hy{xVyPr-dUuo-s{9lT0 z!lnxW%Y|aML6pOR4HN3T_WVDV^EyfS^M+p)VIy)wbiUL_(DU_gU4Amm%q7Zxg=ZpN z;`zw(qKEZok=1IY_wjqih3h#_nA{m#KU{Na*%Sc(Kf2I zr5uH&xj5p2+0GV5Q(@W~sN}gnhB%9_OiJ|)!-WnJwp`q zau6>uU^ql@4dNqBn}c+ z{}NgH#VRxYdk((CvZjt^UKsn)?Fgbp9d)(VC3kuRsuwz{`!5&OGwn#~VwJRvCx&Y< z21(~sbh8#?45EfG45(LLhG8`&e%d$uP70S$DT_4Ai1mWdDle}$+SXtyd9nysEU|7P ztoa@0@N)0mZKz;cYr-l>*h@z*6-~k`Okwx@)6DMk4u%>ouDQiqd`dTRKo!GzOF9^PTy6j4+ykWpL8%myKd*?E za6Gky7@x7Ci7?|tULln&)cxBh&5Xfw>2bo^^wPM+gKoMuztn88TjWW!;LxEMIzL%BRIa!~_W^us z$MjcBbI-JUhjp31v_7x1&oZ4#lHEzE!T~wqjqRuWBjzc@O_i4?7{9$nDn^G0e4z0? za~kG`xV=IdN&lZno8;oBI|@n=-z7DD^<~xX-lA?{7K&8N42aTLkvox&UG}doR;7A= zHJZ-*h)YspmY`gnm@XNt&`@)=ElWIWX74Z_%I_r3OE7~$5Voyz@lKZ&L6GM;oAm&h z!;Ve@(G(ED90X^l_#uu~IK1x7qYcthsnsHa2vh$C8wr_^B3r?!DNM47M<8yHie*o` zV(*UBEG};N)^ZM4-N?;Mq1a;(R;5oDS!A|09VO}cI-A@V!m@|h$Wnd`;n-_Tc0+RN$YgwR_?}2dt_B>|o(OjLW544N_Awbne>FB*|X7PjQWQLXXUe+wV8f00X%oUQvVB$l1(fo5zq? zqn$C+9q3kq%Sud+aHC5TR)z}svt(6ks`IW)KwF?uk6BK2#~(B+T&7`Jl|E((fK~y! zwYz#c1fKN0j#dmBg7MW`9hd6Kq80G8Ll1Yb(jAFb??J=6Q{ZW6p|#IkePb@;_pGWn zx4(@qRB*4%Xij3;xWk zpY?;RTB&evVw#ffcb7jP2Z83wAm%-4!GMF6_0f%(di|Cg$>H1mc;j5futXA^uXywE z8Wa6RNSO}jOXrTz=7ItO4Dw=VGqH_Y0eeyDyY9Eev2|0Tbn9Ohg> zjqI)eu!GzyHdU@|{)CF#6)ZcsI~Dif@Z(P<*P~|t4~40rcgcldK7CukVyUEkzDwVd zw%MtiMrfNvR*}utCZ9i-E}@#yoCJ||RH=i|V5algotY7N-dipAG;Lta+c%71s#Ca# z3RJUN>H(`%lzz7W>~O`GN-@2mNIxOpNW62xo&XP5?VloeO1+$KVU;cxhAO1Nihb)= zkF2)Wu(Wsg)+QCV-{|RvDxXx$iq%DLWgH)k|AAxxhH6?~Ku^~fEXj4%+G^5Ew~qH% z({25lO2?7;wbm;=F(nD#N5@}O*`%oS8o3T?(kl*+dM1Eukjf4G& zO3s;+CB94aW&ls+f~L?4v@XH*zm)kbY#>fHZa64noDK&H_Z$cOV474w5(F%EPZT#w zLY*(tB75!Pg`j2A#k0wt$fOg0+&lHN=E_E&$4U#&mxx~*Q<=YOsUIXJT6uZOv(9C~ z-^O@(I0v?ugAh|5Rbj3^2!Iy7=bwC=gc(Rr&NlsY6m-UPra$~S|jCjr@_gVO_>S^GRVEFIewFH;$%>nP(Y>OHK;ihI!rGV_LF4uvVaKcY3QUaSv|rpHwa(uv}CA$LtBJX=1(K?F%mjGhZQ-+d=8okvXiB z0Qpn#ZOwO6UBf3}m8|S7n;;|;xc-aVS_EuI&{!^6zab^Lf~=xz2vy#x?W@+x-WzBm z4fC#F?JO=aBxm7T37iTTYwFZ>M7VGOE!YQ04tRwjkAo?@wgX%kXdhBF6P7S8LX(MAU^GSW^9zQ?px5v8T00_}W(K=Gjl;)tLr;2r zezheqac&HrdzoA|)?Aa+y$)TO%M=VCtn4?cB4ns-rhXpaPq40e86^{xV~$O*OM3KS zPn#ldZS7;Jn!V>#x;{j;%u;h?(I(jNl8}iKjW%Kp`MXJyOU5n1C4{&py;f*hC7sf= zlx$>tQ6Y!vvidQJfjcqzVgw-L{puX)^ z)b0A<7q7x<8&2S1{DCWs#X-^~ETYz?4*FmrNg?k|2c$?P`tC<(7X%x*ec^y=RZ1Tj zs=e0EqOyUN$l!i>+9UJBNP>BL#;oq zmyBB@`MM&yqz}y+c8_j5@$m9{NU|Ha?5bi8UV}xitYM&O#nZis)#_PX!;j+f%$ceT z8-K^f+4hv+APK29+dbBqH$Tsb$dUEjfbWQGReiG{n_C??cyiB6e%K064u!6 z=depmlU6TBDz!_vcm~ngn>N9uVKRLcG43yVtx*GS#yBor9gydMDVi3T>)di3C>-U+ zWF|eXiG08=5Fmcj+*Bp_&%UoLS{RdNC1kjpDYy+Ov~hY3`)d`Ot< zAqMv0?f68)*AFnYCdaW@u3lNpq@2uQJU4Xut+4&?1-M~sw-8p?M~ zgL``QSssD&w#w%f={;=~GTtV835?+T8-{j$7g#dvrB2LW2c@EqF*;`Iv1VXbsGWmWY8BuT_9u#+<8u%BW1 zK?lZ2BVibmOu1&up?Z~8QJO`m4|Hx-qwpLZ%rBU+Yd(nQHuZ)lkugL7HXmX`CZe!`E?3 z9|q-I$h$H^Q~edG_lGFyW3rR(Dm%4YR`WDbrjJSY(Jr9EN^LjBXg9-#YIFE8QgXM< z_hvN}CWZf;soIKcl#WRE_ax-+HaJB%w|q=VL6<8Lz+1}?Q*X~sL}7(|!z!;aUd%pF zjMIB|&x4_=)?XKh9O&C%rm>ONcqTIK3Fe`Z3yqQ7nGSIyeKjd4=jjUBj3eHS1|1Gb zZZWG$q4ur?cuM!WX03H7Bd-1_&CavDv9?|&g!6R#3@vBeS&kZ){3f4I;@p?GINo3B z4_*zQT9L3h0}f^n4@nn(liSFxyR(`Cb}prbH;}*Z`&A>Dy(z|Mq$B9e*wL%J8rA9} zZ(1X-Mh4Q!ZR|_)J5%(x%hRhL724y{88{kPz3ojDhwlhGd~$wg&Syy8kXUZ^=OgMn zDg90bs$Z?v-f}1JPPmZvhiuiniSXE-9}kkvQIkJJ_@V^VtK|%$yB}X63x0%?bMcC= z0+9vWx-a1?mJtd)JoeLplkEa2Vb`AP4CG$JsoXu?F3*(*8PIuCg18%5F5neZue`@x=^z7w zO?KG)=nDvuc9bKTE(i>+a(MK@g*?^jMzFdqf-d$OTmtv^q|__;`6LS9S z)S8vQ1$kM%12(g0h>mje5)VCHvfhTPt2#oD z-j|-$lwkBbEm9qTJG|RJ7!bjeKmZdQLp_8@f3klei{7cjeirW1%@_;xUtD0hW$?1! zdFc&%1AXUP@;CDn&cA5X)5C~(3P}JUiV4FDdPE+<5QJP1w+k->vytC>#h!-D@w0hX z=Q?JL)eWp%+I9&f1gz!nq9Kmp%#C}JQiI)FPK>R7WBqy0+^TS9CgN+cDFIMH{@W$u zKhFYUgkj*B&=mmkJax@oSZte`e;zMWfAH+kE$6|?DVMPM4Cn;W3WX6N7oyr&W7jh) zGScTk&$V8SuvP<(llW%;^}&34aKDZJwCMl+L46n0!`Brm1E8h;-`|5bqy$eFePluZ zU)lVfD_J~X`Cjf`fD@nozYn?q7E;Wa73BZSi&!>N#qz_DzpttJZ&)JeZ159GTxYCt zk%_i|X0npRsZ`i138`!2`EF38NBIC$63i>GQ9$Kq0oz9CQ+$28rFOsi71MNbUsqHoJF4RO7xalzX8NjGr`J$Tj%=gkN zFy4MffXAo3T!TsVm2W|JI8P?ylfe_D!E5?q!w%PkQ1 zFQg=h6&Ug8#lrP})CbUFD+D~cnr|WVzcM=lw_whOJ!t>mS|`?x8lX^ox}MMfJF_s5 znM|zM`G3`w4-Y`OG);K^1<0I{Arik?J@@~&(m@;eq6wN&`j&>+zcSmu2{NOyiU$1C zKZ=kJLTj6`30?n^hWkPVG7GrlarqyO3kVm2OUc3tnzW+-m0192;G42Z7XRI{P7?(c z0BcIl=ehqoGg*)sYZo(+75vBh{Qp(+|5nw6O2X5+t~^zrDP|4CG+Wr1#Pt{-Mb>a5 zUaD3RiuI`UPaE{p9N_7r_L&($O}PRh!dtmL`plJ%@p{32wU{$RMAACATcPQ}?5Bfp zKq_Z?2-e*Zj%jizVrbcHzM8Cg;I=)&rg- zm-~NTl(*0R{^icPx6h{r07o~x&LK9(iy#}?N7+v^K~E%Y@Uu-N-BP(N=pV9pk?2_- z0WR+^iBL`=o_GMplx>deNAHO#>mjyi{$PLF&dbv?;Y58;(id#gOTC*>f8iKahz{`W zl;nj62EeTg9(qJt^3Ou=iyj6j_jl+~Bgk|^8Rv(~t3@7q&$=Gje~(N95D@_z+i zzS_YH-CIQIGK{4Vv#tbcb!k#CmP$d6uU9H5Db|*MD1(gIs|mf~0DaU0MKoJ})(1LR zB~iE2n81=<1yW}BUB(y6-TuhXd<93jcm#$#uxGLH-t%?=a1#1NNV1ZWs&g4Ad_GgO z{%&`g@&iR$pBP{t$v~brm*iBzjz}eu2nX4H`SGA72XE=*|x=)_ggww~d`&3sus$Rodx9B*s1% zlkfw|@yrIBOp4-Pdzxs3#T6th2Y2uY$UJ@x@fXd8y!UH&L%*GhUM6X_xRWEoE=qD- zlH+@yRJ_*qx&>eHX}36KL%mN1#DVi;s|Am&C3iSW6p4P1d6M%Fe+W`AfOg+$tNu@s z=rg1w|DXHKi#zY(m&|jH_p$w8eo$n^5xHR~ig2Y)d747PR&IrkkHhL{3+Rqa#XF%9 zaCEhagFE>`JimHZbGQ{4qKIPLHLjv7T+px_R6uckz$~ zHT*%0=?-VTds0_av9M%0^!s5PmX2HNwmfY%BqC@c4ZOk|iDQOFvxxPv3id46omd!2 zf8X`u)i-^9xQ_zT`?#E6l#*@NSI6q{Vitk7>if3)nhNP9y;^ZBXl;*TXjs9=nZ)g1 z^n~`weT++FHj{pZWvGn+lbb8tdN4&V1R&n40^&r+c!y18O9tvkZ;dP#V@s14tOOFj zX&fwRb9RTU$Wa%Az~zqS4S`e!%vM((uaxgs_OKDL+fdD04#2_R;m~+Ps(4Fj+|YV1 zwNnOupuad>=}q1)F#2xBV_q4nTZqRs?RhqfiHUjfvdo~vv2%s$f^Cz>T~eHlALiV+ z0`JQQOOzD_n6?zPmrwPZh-YgPzH3TSH?jwTX+`O4VKu`grTNm-{Qg07<2|f#Z>c9; z9GI~-la&6b_K%@?O;Va#*gxpkIuVDw(Xt6DJ^bQ6dg2;}b=m6|_gUu4ME3EvS1r(( z5JWhRV_P&8xl=w@A%E|0e@~lnomVb%gxHP4x_CH-YyVV$Wy#*6{#NVHvUQ)`=9uP_ z;kfSvAcI0^pL%H}Vjo{Nn6Hja28^NjSkg4?Xr%H$yvsD@WMy~%T-k15g??{aDRZn6 zn5&VW(fyW8PvL=3)m0tpUs^Lx+%2_+G`^bv{X9B|_dcI0;p_PCuB1Z-S#5_cB1^FS6jRkfk!UD695KJkGh#Qov;U(od@9_KLjyo8x0LL7 zxA6_ytOAG1887LNsyDxyKtQMAb5fc8a*-^S$7HLrmY(y)K-#UCCc=*~s`iwd57&qF zGQZTtm_FFfD*7fEExOh>&CV*$PdQ{AUk)XDPHwQf1(z)NM{ zKU=DC(EKDs#A&>GGr`5nxZysdZ1E;6k{QW?Zr%uU=fFs|kV*{-0U^>|Z~yX{EP%UW=EuvG)MY#Atk- zhVQ7{yz_YmveIWhhIh2|u6DN8cb;8C5z(#0H;VK6tuhwJEk@#jxEK#@!?*`=RO2Tz z1YT5w|FE!*H#>A1jz%=!-*bX>Xz{4;)qmE=*C6ohdX}j6s!brqng{2588J`oeol(W z9Ik6pgc?*hTNRpf6epBTeYPi58Kjls4E>Pz_u%!yKc~N|_e4B{D`r?K^`I=FPf6_SFzhTIA-~lzp6bzTT|) zX!@jxwM1`Me?TGuY?bhv)LZVp5x%ArUuNuflCJ0}k?XxJ+W2EUH(Umv=4n-yqbg&u zf8Z9uQE4~6lA(N`q9KxO(x41Ixe{^h)69!7p677kaINPIq$GD#5lZ|N8m)(gD`SlW@F&Aw8)*iSVylS6@DHRL3t>?9yZe}Dnvr29I`h`Ol)tHX^ z$fArI>d{f59^_~u0BPCL4Y7Um6sy2=<(#VY{%tGPqByw!m-Nwhm+m+WERH+uc24sg zt(8ruEc>&j9)0F#excMlVaca#d=ELD7+j1ht3}z)R<%~``Yok=$Je$Tt>6+;R6ez& zW=o_@MA{hzF)(JvDXHE5IP>BYKP=znN1CYg@v-2@i+eVsdO^}$CX61L!QM^#%f)nX zJx7->A}#(RyV&Ih1GVwjvy0NUYVC>U|EVio`}|RLseYfGNqrD^m(}Gn6w9VqS!$wT zR=Q*)<6QnGTi>Q&TRSZJU^5higGLLlp#>*;dESqHyH8=@W$XQ<_)w8qr@(5?Z(chE zRqWJN#!a3-pD#@LPQTJK{HHbYP*rVW60Gvf#Va11B`u-%O3X$~(o#9NiFXpik?l8y zQ<})DrbbdXo~i$JCgU7HREMrNjKDzLIQ_c_1o_qfoxKrKy=O}XJ}xDtxa zba+yi5)E@97|qMxsP6=9(O{x{%WC{?yh}Y!eWRO-IeaI@>rF6KTROII89rxhJufZ4 zH{SB3S2&Q6Wf*AK>MY^(UfRQes^*^6lpnneMv+~#ByJwZx3_2-n0z(-yl3jM?FPQT zNppJ9@Lcshhd+~%>CIak@DzAl*A?4^r`s{bpqQ zjHn@t<4@Oj3?UYX-Xf>vjqV=zoFa;BT5p~EbkrSeXD&Qu|1oIDvUnF<`bZo8_q?Jn zbM%2q??Z5u4cVR+>I@V=RBuDcSN7YSR%fns%bfhd@>Y3MtcreG6Y&X-pw zPqu35R}3yYjf8R$(wS_}+Zr7Np5@$Oa#+j0$adi!veQyTi4F~MO$auoS}W=40HN9f zzN4A^KZr!+y8l{p^o0yt)`d(r4$emP?57ud;hESUJPC!lLb(%1n}#vVuNYa(2O<$( z5<6E%yw^H)_v~x1w_+VKT9(_j8>I(oT_$jIzr0P4UpP-!8qh9gX#53JFaF8<&3)t;}pbw2EelG_jjCJ#of`LT~Gs_-xRyx{D2*-xQdMtePO|;MQpGD9wa>Glz28~b|wEYuSD z-9fh`j}<;RM*V5#vv!4b@nKjBa*H74et12tkUM{w$9dWNlNWacqpuuB7L9>LB!&9) zg#B8(82w=*#^g{%%KU0E-n-+cY z1X~&I_$wWr!K5K?#CpFdxCr;V=?NAr5DlNVsI-G4jw4mR3!6;Ao)=%ULkl=Oi@V=W zJ#nQ&?tb`vEOJ8~XV$s#JkYeIOY%f`{sd_=sZ;fYg5H!;Zo~3EIcMY9`Cnv9->Ci4 zzr_y!U`FvXHd*pHNVcwWm?nnVF#9IgOx?XBsL|lV&BwcZ&qnRO)UZ^%N^n(-`1da7 zMBzht@xxL_NQLiy-;o^(%6GL7lh$KUZ5|Fo#$&ZhEif7L*bE3JguOM8cCpFK{zbs= zHqFu+AQNeoM3Wb{d#}4I#Brk1;rFWp5xaHEs?6teE^E@Z{VSLgfmp+*^wU=fHt!>K zkPrR#)Ne&Bn`y9ILHad2tS{Y{W4L59P7#GE2OMUw5Yjd*WFjdnSsaUyIY~2a<@tm= zr*ied>Kd1_AZ3|{ZGtR`c+c&%7eZ{b=RRIyyczwU4HdqI;T#0S4Aqz{_-9u&*-*cji64IcY&4oxqQVlraJdKOF|AbeR~IHSG^Q>yl2|Tz!+Qs8T2Q;GGvnI zuCxA#YVDK5T~p*_&%)>3IHfgu9C0A7$5BXc@J+=U`E9oD3WKuLu$+VVVWr=4ji{4IM7$FG%n&_ z>^l5VX+A|EWo@RJJU+F#DW_IRwB+ddDn&-$kIZwJKgwuE^^`G^7oEQg%4d%{gnZ9sMgQsZzJ0;7YWwvpsy_NFfXPtXH8u%t^SU$HI`1^+o&hM-H}{tr~t- zbVA0V>oWF~ImLoKuj)&_-^Cil{mD>%>m24~dJDM{UusY~$dIpGu)v}ac&|^$VgbU6 zRb=P(?C!^@sEJlA|4EKvZ{V?USk0kI9f46-Yw`s=xtABrfJGt~78B z1>yVZ;5wnn%l4Ps<-dpoH=UxAFVl$7=x(YfGZIOhE;yzMlarCEu%WXNRReGncBrA6 z@r6PBm;#&&P`wm^CwWx14IbaRGmu4R(o+yl^=3!Cyrb|gtak+J%C<4M0_J(FE(n|W zcGlIKXg<9Pap*DD-ub~QWX1sb%Pl4?R$^BEH_Hd9mlLB1Csb!ewbfpUD zD1%EPruv>B#FLlOly*>2Y*eKqJxwM;xT8bWQQId{9_;6ghhQr=S%fzy{}hKWttF~T zJh-6911(%fuMKFbTpMah^6jIgcPM34d73rIj8Lw_PK~lYNbwZBihV)@PI5T?WYO@X zkJ$%TE5k16%nM8*-F`Y15ENZ3uv3!~ z;li&IA@*};CY!Gsy3=7$1cw7IY+RW0%E)fH8F>S zR_Pp;Q*KheJ-wLK*t6g(d&8A4JE4NTPWrnVP0o{1hnoPxUeT2 z9b4qsQ_LkGYU8K(rdhn&8SorTIt+Yw4QnQ$wleWG4`hklWW8p|giA|{3!|FN5!Xp0 z?%;8Qfs)g}bho0P%s{<-m{4t)?0;VB&*>|tF0G0FC&(fyAZzdn?8$)_295wKxA7wf z!M}Ll;~X8Ik(?k?oB#R<-1AXQrFL&D$#mKNP3t6oKu&CPbRj^@*gstIZuv|>sG6GJ z!-X?DTLa3eB9KOP1ZBmgvBl;6g#;It+oG%5c1l_VTh7RWd_u;$yX8X_JXE2FRB>2H zTu0>t`86U!*<$YYdm-=!ubHHi+QY@VvuNPPl#ADF_I_jeF8G!=Vj3`%dz{&cE>x_6dxa7v$bRNh%L-bEbz12Y*IRV`oa(5cUv z_3HnH2m=BrbN$aw;|5#--m!9E3y;_tnFR6A}T;E+A!Aa0b$RC2VjJzA}>cdOE+#+kp-9ixOl6zvx7)*WrSX|2^U z$qJdiAd-EQ(B0gyv|QZNwdd@QdABvzVy=Q=7@ahp|0JJbYTk$}t-;r>p{4O=@xEgv z3KqTTPEJa0U%w`ai)Jgx+TQw{sM#>F0YzsjNnMC*tclDoKoUm$GW<6fG_&|a82wrW zFX%Wd=@3Bdg^ctSD>8JI?G(as!E&d){Lc)=EBY?m`$3YgF;mT<&b#b`Xy}7QCM1&% zMvBweWnq!e)b;7wby|8J5{IHQngvrbhH+e#V3i=p{S~MiePD~lw>A@Y{RDp&x-Tm& z-hjoosiX$TiD0y!o)s~-78xc{85*c{V;YLR&)U2>2)Vz&Kv-&2d+0Q78Bk(r3Bnqv zqusCo;=(k;Zd{z#@BFAiVW|ClQBs&a90p6B&kl{Ob@6`1omu=+dFpod(Qko#JqLU3 zNtg_!6|brz3RMz_ErxIfR_NYpD+yeJx0l3wdhaR}QT7dshyM5*u)IIciZ?OXp6qe6 zj)G1n>!3{9TIVxRM-M!=azf5~*o(9;6@t~aj<>AE8YhL%hgF5wG*neaZ0y;H z!;Z >fuN;o66nJE|N#ZQ)b)vOK~z2a(A`{WQVv-V#mcB|eCj+y?8aDBNw)>hAXm z8$!CSicPKx{r*$XPi2S!99+(&@y#d@U~Z!8t2!>S;z=1)X@MIL9_8z3mlYLcXolfd zw^wUqO`3nrB5p7dzHT?jy!dgPz!I31^mS`h^a7jD3y9wp&vLR|@rqm=YuxzI+MMYRaExW8bm2CkF2?@4Cz^@*A|S z!W!$|XcmdK9{<_pJ&0-IP`(+KMn1wYRKRh_u!|u$ zKFF@w9FMx1kd{^$62cFbKk{nERxLOCB5HUWWhS35b7`XO!n`Wf&R}P#|3K8`)*n5{!La+lBp^MV{U;m#1cW-yzn<_h99|(wAiwj~>?D{2BprGRv4p3IJ{i zt13U8W}i!c`X6(PLxH*bBNGIB-HGN7c;hU^3g+5RZ$lkuP~IxhB4wE%jwOlz6SS1}a7aYM&Bh8)=ME%odrmtf64 z(E+P@aVJ>xu{(0JM+sb0j<1*gGc^SLOx31{fqp9t^DHvWD>V@#4?Ok;LA9Dw&@$!P zT7x`F=42;tG6@b%yiWqc+rInnjdSEZzeY-1Va;&u|x0cQT*YFO~H>;p7U^|Z<-w1eyF0u>^7-& zLtH}BMsZlhgOcf|LMMwcYp!Z);|?z`#xPHL9(bzdk_pnipW07bjt)|^eZDQyrl4#c zZ%B*!jx}x<=%;uZX8Z?ve32Q5t29n)l_9NEB6bSs5B1EDC7V8IOGGF|3^3^+83-U-!8NU>cJi3sthxHH*&KAT`)&r zm*UnX-nbn9;06J6WFr+;OZ-d2GQz&purOM?B|oSlo>u?u^-HlG{IQSOn2B!J-J2Pe zN<8iYWXa?1F>yhQ8#N2Xn9G#VluCgx1giA{H(b!{dD?- zw>@hoi~D7Ou7Iw}bQ{&`a9P0c-8lQjMBemtQ9Q-kZroZCY1JGqIf@x{wAV z(|oz*C773YNF$}=(C6Kb<(%oXljfQnCHp4X(fBk0@mdJ7%PR-sIeA4#`%k~nhr?|i z3%G!B_Rh$fK$%9v&#{;`2mjZ??uvsiLOc)CJVPrxbo`j_>Zz&X1^KdXaOewhK2Te&*Da~g(9=Kd&RnK1_2gE>n%eHe5Qm?H968V!^K7g&vwrWzripv zI5}}Z4X+;G{ry|w)t3zKI-je(mS*;NE1&Fb^9G-tAI0Ke0Sb13O19QgYFWIN*Kg8X zX{5?{FjpE*l^AC_xvReOI|nNQA9d37#K%oePQKAzN#IxK$$pbaHR^0s&?ylMA9zaL zD^v7C=~Ys9V$FP`M$~YRIQH1YwB*I$d2K8`uaVHSvGN&X^%Cz=Otm*Yn&t4fsqbhF z&+M~K?oWAQIuBhiM&22f!o0)f{qi3()p%MTI#1Pk;cH1V?iDiMDTE2mx26m~Qy1k9 ze&<7JskWmteG2pDrsJMnL)c(y_za5olL9mWj?T3=H{CRE?x ztjmn42?(gvX3r6jf0kPqan*}wL^aovGk)-D)dFX;ot;03rv7v{qKp93n@Z4es)+pv z0qF+^!XUN7%uph~306Jne}Sp7>AAx$9oYr!iNuJ4bR(DspK*8DUVnB6Q~W-e=GuTQ zho+FZjynGMmvq3mWQktoD^7U1i}~NU7$4aFsV?_;LEL|r2M|a^&}#G}1%NR`TFch0j62u}Bsnyk!B+k9?|N zbnot{H&epfElD{d47jNYcE1ZAwiEf3NgBWW2djB4s3LXMu$kzFn|kX`+`)n z!^v_v0i_@;BZA{Mtvu@NRr?vk6sLZHNS6hv0ZJz$Q;aB$Hd6!?r?pjiWZCqHkWa~R zrtoQ&|NSxZ2oPXrg}nd8F$TZ92t>kk0tXoXiH1?TvH_m$43LQ-vKs&W@u(cYaiqmE zwiN&SJxC@>r1SoYGX6JKp$E1t{;!D5tM27$`KubcMbM<5S`*-?7a7}2dbS|6u$}_2 z?gJuK%Pl1@afPh-FLu#y6IH47|9r6iZR&5N?LpD7%Fk!Tv`L?EeR(eGX`KAy;voLn zOZBV4K^HdsT*~_T(kU@xM7+QGvXU3E;srp(nqjfbjziaId>~RYA}@N==3GP z74m};`!G3j@Vmc7aV|Q5r@dk?H3S2pNnh=m$XUDitvCa-%kPv)N!VVJNGkz>fLpP@Xvg}TZW>BOS zO>GVvsFwHApobr>iah}To&lm{Ym?DZFrs9ggxCdT{g;a-2NW3Yhx3eur#AoM2Rh>3 z-*?Hn0`zpPnOhhNTK#uH10I}m(A`R#YAvGpoe!X?anuP#M050mZl6A=QGq8~KqOD0 z>|Dn!KR#sw(K__NIs#gSw8Rd2il^M$ZM*}rlUD|JM+GIN!d@-hBc>|`>2$>kFB8-K z2QYRcLXu1o!?R^yrZipewSI0nWF}h2l?PyWJnaGCXOG0e?)LKV;@C4l4L+rLH+P2m zEhA_9-JCN^*OH072wyJt0<Y4;p51r?O0>G8u1l%w9`n#VJxXT`mxG7!rIVt*ye`zWss5|N#AfeCUN5RK`1v?VU zr|DvISWnlrLz_v^zcY{}AHsO8%eFlAXXoKawRPTIxtUmEY2N`^BpaiI!Iz+EKOz?W zJj3nxv~JI|&kLvJ-}h4k|7h>6qq5r8_F+H}5G4ha zMnnV@M7mKL1SF(OknZkQP>~jCknZky0HwP-9=f}mZ!Y)V=j`oy$9R8ZeBWQc?`+3l z!+O@U*34_(^Pcy0-6TAyzdv7qVjdE?b0xHfiuaG_1DNz#{^u3whIddp<}ceXrT-IL z#4LA6{^PY?U%)I0+0}^rKvS@v;GyC;7YofH;9L;e{<6hK1d=MN0Nm&v&+BQ#WBmFl zAgxP!e&qbx%EMMQcEq=k5yn)u7)mGK)=(0 znkXEMju?Oz=JT=PAO!bSdy3&h&)5cI1>VL<0ct$s4GF$%tTIfw2koT$MtuU(Sv1?LG96i z!X`IDoB$rwEGb}8iiZ^no`DrCr6-<>8=t~|Lm}`I`pgzI*+6DbA=Dn}pg8H)8xc1_ zQH=zagEMahi%7o-zJ!LjEr=W)NbF{Uepdj`%e+-o=K-+jqIgNn9Q|2Xv0CUL#4$Jl zO?o6BqYJGJ<{&n1Dl~Lwbnkf!G=E51D|z#SMYewd4QJ*<0Kdm zXn`oy&2JA6p`rR0e}fhRExhp{ZQ;ZRCzwc zN7m8_yrR$|91GTqxQRjkS0AH zhG8f$2X4eIPkQ$nxdQXqW8N3sP;!nV>HjYZ-_ zG@N)$9YjeT`$$}cJKkPnc%KcQ7c^_q_VqRdo+ zM|LD2#PWfem;rtlrG#hOZwLWb9MB^LM^BbN zARx^GTg9*1L(ty-A;-(%L=`KpWOzcc_UWy41sP+_1Z2O|A5gM+Y-O;#Xjl9G605ZW zL&3^&^ezh`gDkpgP;dMNiv8B45#vFR80Pt{KLH9@0GK-Yy+A5lfPx=<+5M#{Rxm&u z1iPD3;;*&y4}A0F#4XuBL$e7j1;|mwDY|1q^a&2I%yGZhEw_bs9DZCaucSPmSR1=< zKmy$4CMg&q zJ0f6$1<;o|KLC>tPm%6WLEFF!cC&raGURjmb=l;i_kuvoVCGRw0;LOr+e1}&^9l@lCKcuTh5&fHw#bMev{`_nXK(lpLErffY6D#_hfYFZ zypCUSkUDL@;!FuqL70dJo`{Tw1^xO3q#801V()A90Jyg!)XIaXW4d&B|0#qhw?Gy4 zpFs2Nxh&{}Pq1&LWNb+1bI;qln-gHS}yBp4FEGq zE5YFEewc9g1>eGLFd~RSk;X>XW0}EMpyg}-{F#3@UM!j1&|9ak6Atd_Ecg-gMDD<0!bO!qAPeDH)Krp^~6#GV@e7vFlA(S4o~mi zIvlgIp1oU9bBSZZewC|Ul$7fp&LI0FcDYRj8g{e5PV&p<=OhMp76E95vIE=4-OK=^ zWFJd^4*LySK=W+i&ftb`tXXvb9&GOQ8uUM!Ub(d#Xl~H>|NikV0yO#mU%ujdkz&6w zn(0BwFD{J*E#+~b_iQ!V(E;T`5%gYhQcQz&=!c)y4`M|lQTR^n$KYz^iwk#K`|6NT zx}Dx#G(T0##UmTJ?sW6VA96N(5*cPA7H2&C2yt-3n{EO(_VDlR{rpM;zhZ&w(Dh!;ob_l-F^7bH{k0tZwYh*OZJN;1{W?|J12`d? z$PEHRL+isyRq^R#dkvGo3LF#$I+U@df5VD_6poBOe2SO#JC2l6WwlDBq zZq==avrM=a-@$PDyHPIPDM9kDp7(@=a6MuhO^x#bj*xiV74RY%5A%(Yp&!AxsUw%>}!qH2wLxum7k5 zzDW9T0aLv~L|j-CLxEN;YlI24g{Pg?kBzH9BsDTd`Pb$? zSQAVR=Sxm7zbR&3fdY00!1^I1gI$sEa(dO02GPY5pQd!R(bn$-ERfJbNPY5`n+CM_ z7HIJ)u=gcLdB9J9=4godL7*RLs6B#jeWmpUNjlkh#oN-$&^&+AU)_8GX5~3`mlgB} zJ1C^Nv0MZrut;11;b{w9eJazAa)Khz!`FgjQ}ggw?@-Kq0@Vko4jBqO0Cik$zdB?9 zI}*$LU)O2~GBj%s?u(MXBTZeOm0DBEHROE zY^66R=Scj|oq&s`#}HQ#8FUfpd(H26AZUd&n%^}&P7r|%Pau_#iDIny*yfDihog$T zFU36k7N*Ht_FujAFE%e&8UA!<&G`#-cgJzNaR$Rtoh?0V2|UAhq7TvL%_i`^%aq^eVvs@mn^ZB*qiOSU`LIYV&{pki&oc z)fmMK&QJ0wqn>#{09hSx=A3-wF>~DmB*&#=N`qiwP~|6U8yC{yD{%?f6F6wW0M_Xh}q@d7vm>_@*7V}VNp@?^a>=)L=U5wI;Gk3tl&%P-U5-&hKo+Y<~{ zxaek62Iw%cW+`-=9T+O#!+S zaqV_AXXnRX{_hfi4Y?o)M^AEdOto>)kYmgK>LmLDUTcm&}V zg!DNA>JQ-3Ds@Je!IYWh`sj<^!P1B{H|slvOq28^7;ErwTG9QzYmb@Fk* zrOuN%hTcuLJhlZo1L;9M9tQ;}&W?Txy}C!K=?_%6dxiDXcJ@d(XX zLb>;OR1^VQR==Z)`R9`c+WnHTYxje_gJ-iDt}Xn!?46YxfH*`#)1*?tu(R={u-!ak zd`z+y5SW4jxp(fZV{_YYxsQ(~NDeD15llz1A9|zw@VeIA_w@XNBtM7cU`w|X?$=4Mp8lGvNHbUn(}J33!5PM?8* z+WGCIT&<@u{71>VicIT0VWqw(VA0d|P~3m?FaWfo;4*$guBSerEm<=V@ml>!Fw#(4 z><^ExnF(oFBf*8y0=;02aHjhgd!$$iHWsma;|JSgyGATnv>@KAzQEbS>yyo+>yjmd zToaXQ;UdNk^uQBBu7e@pdzPaAvFo@fJR--H zHpwR~ehIsG(4V^$I>FI23f5CTj1;nASM!4ThDz%+zLp()6Qv{Pi=RNiieTE=@rY@)scSMdfs3%-4V?%A9*Beb4erpH)-TKT+v|#M zH7m?+A2oIcexkZey@9Ehb{aY;mdWAOXbc~{giBwBlqcLfpLJxeZ7%n*rT|u~q^D(E z#4Ci6^ZR)%ZWp0Z?^H1jNUX-=(&6egVobV8I48%odj#GXf zb|lpCUJTDWb!8^%PwtMpWe)b#qP>6Pi4d>CyKZn>NptjHL?v^nPS+PPHnvh{DnT0B za-%)3$m1lub-R37M|k-S2UBJA6}6DFN&)5$kromsk91PY9II3t#f{~h0>)C~xAyi@ zJiY|O9`lmX>lrCEwx<`1YHwGFqH-S2rr?OhAk1=^9eD8<?IiUaJx4O zh9-QK2>;~mA}(+2ZkJzXLRZ)}Z*utzAm)6^Tl>-0pqQ(bdr0lSnY~Sxj8SmYYvV4+ zTV+s3<2bzC?E(J^3HgAN*wPlu+>s}J>7>JYAOdY*@3`(#TY~ERI_5|`Le&FFa@IE*|0e{dCe9RJez!{7s}1tytTH-1I`X3HALmLrcBdI8IU6De zwN+gc#5VBZbIMeF)^u|a3ACn^nXYSR3{vJa9R)C03>%UaiQB+0K)4XAp?y|6y#w;J@vwvEeG*p`$ zM{;wme?;yX%&L)Fy=36q;&IzdyO&b^?QzrhHX%lyvhwJ6;k1esqop**0b^n&iw69i z?x)2{g!$@4&J9EXBH909FWF=Z%wa@-&x4CA9dWH4F#9GXoM?goHVl*;LfTobs$=w# zzDN2}pJ$yRJ`*p|5Xo-0^19u&rA8r8+&rVt%ttJJl>ei)qFFFH<=MXY)c9Qt!IJ*%Ql2_w5_^_v*M03q$ft@T~k91ih)o z8)u`PItY2Lw&cfE!d5h$FHo+XR*(9a6Us*pw=Rqt;P(?{UxC=cLQC_v=Z~J!KU_^x zk-{~S3Luu9S@4mOJ4#d?Ye(I1y3Ft_y6F}VQ%tzX{pq}|lXm20xtB~dpEcrJ+NK&= zrR`kDbfb%qW4OJCpl5imm)-B!%;OXs>$9)ZcyJ0ks1~&wz7V|8xq|SNo;O6yTTrU% zAgUH8tl8t@(jY5QyE`vG_bk@YsI&0q_%4u#2hs3_Fhuyp-qc`z`g%Jr^mi1~*cckA-V*_D01X-mcB6vaU#C zxRrjt6*J87Y)Muk;<4HAI#$v&`T~Jv=uC!sT7N0&`Se-)RF;IiOAXsO#0?p9=g{Nr ztX{tPW-ZR6b4H73)Lyf7c&xsa%S!e7Qu*B_^^=pU2$Vl=K9X8MKZvrn&KB1H&vwTT9 z4vP?a$DY%E*wuCt7R}>J#u1eqKZ9k~aceLTl2P33Av5+tyA7SR2 z9FZyy3LNcoUV&&(`x>t&`|Jb(=@Gt%gTk`4R1|W#F?PoVQOeWfhX-SE{-I_VHa`sAVg)8H|#?@uT z#}8^qXT5nbC7En@EIE!NHJuX*jW44CWpHTaw#~=c?Th11Mc$2MnFPmUBPk8tGR%K5 zrg#VcU`)x~Q@VnCqF**gKR?SA|9SHZOgvxh>H72W9~w99c}t3)Q^k~<$CvH+#5BWo zj;i)c&$-9|6ZS)5X9rx3-6S7ZSYqY5wgz(=qwCl0*D>Vo>r5K2lcjt#YjP(N(=*rt zv^Ix~M}!}b@OcabW!uA!jo~GmO)Zb_moUA(M(R=bMW)2o0p~6}=-^Mz6l?47Mg|o?jng+Bihb0S819-U^~4P& z{%osN_>?>zi(>Lm<{acmLpGx53U#dMi8w|;yy%^5BaON@LO164UFZGF6$Ie98q-G) zfIRu9_Ja@Px7}Bdq|~m5o$oX_*$uC2sM>$lLRSMvi1=P9N$)waXQM4Qg)20HdH>bp zDsRdGPKIR;hdPr2XD+gy9e!6I@w=Lc!&5@xWmTX~CXVoD>df>%Q z)@Qo;cXHK@s9)qNqJNRAR>n1^indyv{lKn4l3z8skn+(F*=(JzMmT;zET4#hF=pa@ zdWcxX+AR^lleCq%xy9GiDaNzZuzQ5u(t0e)cu509NU(`{znC1-!Z_w`mp^s?32im4C%|ynD{DFZ9o%*7eQCs6h#ZDc&2j@L& zJ%$Zghkmfj_iY`7jB=AHJaRm@szKa8=oM$mgY9y=z|5M(qq)m6KHtgfW~z26##6V| z?RBN75pVsoy5lbs#)=ss?UI6Ff^f(7Quga@={HH|#;e(LBl&Ke;cwkCSsn= z#B?m)=HHhF6s!_OJR9Y%VSz^`Dzsed_6L3Yi*&!pSNMwkZv!{;4y)irnX?1f);g!rDzbPgbYWwx#5Oy_*6k)#;Pzk$zV6n;D$uq<>~eYo#K7q4y+djV;^}| zb??2&{(%jXy2%l>9{HD7SIi(}0gG ze)H^*Qv`v1if{`W^9s|}E(h*v#UqP=-$U|?D#5*oep)RaK^nO-OSr<;!`Fyj9C^cNSVz^B+?^B2(|x8TE^kYaRM|^KzF|FrqCp z02ym3ku_&z+?XJA^W(>#3xf>p(ci!P8+ z(RBj6ZcWxR`tL#L(cbkNS1Vs>-c%N671=N{$nNIDS#>`wwGIm0Chb@E(GJXACAQ^P zVrF~O5KH$hOWPu>2&)PuQ{^|hR>8K;w_KOItN0bRL)HP^&(^tFx1XK)Sf$;M*3sZ6 z5>KoiD7A3@`AI5hL@jA0D>k<NZo`v;DuaF3{(bfP>T7Cirnc)n>t z_St;1*)CObgJ?OlwXTNiL5SNFT{4Ehj=rlx-A!CI(ZU`SlU&GkSVPcCFM*v$wSYcC z@Uhr3cSEE{v}dR(B`y9>`j%oGErVg1tdyRa8>xFz! zc6qXtoNJw%Y4UJb{yE&Y?z-QvXiRdc_F^oXXg-r(!u+1cKJW_7O$swrQ8SGwFe<&7 zS7f0|ETg+I?QmcxZyvegIO^Cb_}-Bk9aD>2=@*TQTIvrPSEzsP8Y!FJv_h`qO4n@k z^MR|)fIULzQp2$3Xw`wWak!WYbJBJuWAinucB6#l%G@;iWqh6OJ1vvDpQcq;>98*E zGOFj8h0QZ?Ze4ssWeJj%49)&3TXxio-!W`mi!rRs7+%t&fLl0^h<{u@yrTSxhNDEO zGqAu|a{J{6w+URTBt*JaRv4pm1B+53?If=r4i+Ds<$4z94|N?u;G%6wP; zwr#+pK4x~AUTVK|vVK{gF1*zb9C|Eo=G3%cCXc9l^?V&_obw+A2g=7weFF-N%6C`Q zLDGoKrJcW+UDJOsyQ+Rn!1DRuv90PqcD6A4wiyw-f=OEyB6^YF_W4^uLi`@#_B4mM z*8Ga9mdkVD<84Q`t(Yk?KKiqzqN6E1^|GGKx8}FzwOb-b(j%QE#u+pU$?1P2BbP;9 z(WwC$d~U9SJ85sBQ>@wX>8Ybp$%?X$h3Xt)SOVt-4}CRL$;gxe*%%cZ7W!0MpP1EU z6|3-Si$?9nA`V&@0^;O!46-G#zfAak5xN{%U%B_kvTqIsMr?EM+nc0$U&k;FPo@o6 znT-`w0sm{?NP5Xi2E7E!ok&$?AbD{1$xzYHN4n;^lN+M<(;7Uj8#O5LIW_%C(1*-+ z*7u%}2+)alI+8dYvweT~RyQV2I}CV*lhhzFmsO*lX4B7_ zbkU#W9c%}b<+DBA;sY(*PlsQ4H)w{Z2@M757daY_U#|v=>JOCU8#KPM+?X`ljP7~) zA@o}M(cb0fCMHRGr@xcCnl}Dda#uM`(mim1O7Rrwy-6WnUYAXeN`?EyR63Bu;gk1S z3MRH|3;P6jo%&&;d4uPE#cX|m#!FfO1f_D^`Ys#pOoS_7NG`b;2BclTT~Trhcr`*8 z_UK2U^CeNa<_j7&GnZzZbl6T?N7hbxDg8~DW40QrUq!qJKeOM-Lmv<0U+gY^2eH1X z|C!u1b@gv@*W531m(u2%olEEDW>+oaA!#l*v&m@}BfN6!RKr1I==Lk-n{{So(eUUM zg@O5X-27{|tLWjCJiDXZ;VwO;JT)UNa)V0!)3s>!#xJ*`Vp=Bav>49UlG5{^hu1jF zuj_wpxxzPD>#hJXv;$`{1a9u)Ij7U*X7D3GJn9VWGG-Y@?yyn~9ejjp5Up^TR#00p z@Gyrd-L@2dSoR{^8I#Tc2z%~Gds;qK`&sJbO--D~x_rEuKYhO7(i1rq?tJf0qSw?w zcr-{#z#xDC!hR-ss6%hf+{xY|^UGu3+5g7aYxZ-qhrT!mEq@iIv*@RbEn#aH0F7ROouD8XLM)^=(x?MtQB(gH$l1g01E5$74a|cvahkR#G?m(LPul-r21c9)@ ztAQ5Rlb@n+HzGG8a<}8Qw5KthL9E!{C88uuuFeGc{S}{-!516HdGiyohuYsT>kX=A zTV9}a4NTXLp{ISx^Ja1i`>65AgQ-bXK6`E}b3Qzmqi}3Xt=`x=u1#wr{3FvMx$`r8WWVh7@+Q&O8DlP`1wS1-B56-N7_|M;# z`47qA0})aR^_X~S^$yB0%iJ1Q;9dX<4mX))h<0@5#_s&IQ%=6Mych#;tqV_%6@HyXk$)~ivI22qmB?}8F0!V_| zgGTA8{MZ-U{)*%!_R=ipH@ugzTqOnx2Kl6Wz~x+b7`c^^!`&v#a!@qS$YK*nr{%a< ze7SkNCf~O0aXveY?hvD4J8(|4m=&W3h&&9c7VEbJlIrT$?i`#~Gj-U+DEI97lMpqwn6qDDrUX2MQq{m-sZeM5t>ivj}XYlFzu?AU`RWX^-kV{)*rmjVm8)|UO3 zS6bX17m7ewZwIm6rL&GmCmB(qyb2Mc5-@a;R}KfO4e03OCcZ?;vuB6IbU zb$gZTi-C;K%xZ_vbdjgQ5zY=}wTS4E)c0cvb(SK?JgODi`;2^iH~heIou zG$qCrYQ%Owo(r#c!NKto&qW;0copy)YM3O)Oc+%tB~DHPk+?|R>Y2s(_;Qs23{jG) zF+l@^wGHJeqwcqY<10Y{a>Z+nfb>=*SNEn}p*F1{ygN(El2PNs0dQTbe4ugVla=pP z!P>-#juqxVV#VnID)1Y=@;8NY7ATQs@hH^s^5QNmPit1xhZ=BJxIjI>e&%D$R_x2R zV5hC2&<~6^I(=#s)Hvt3{yR%y>HjHnZ}o@FJ+p)RUo!Vff63fO_czzp+WAl&Qrbfj z_Y%J(?x)){A1xITRXVK`EV6bfb`k5;ElJVi6NzYEI3DmS9z0hJY<_2H`@&EE_)~_~ zv3=Eb4!1^v)AVkX2n*v?gRx#VkPPZ{p}BMEvc6Ql3?r0P&Ln}AzBv}oaX5Y(CxNQW zj-b?KM?Yj$?rtnd@f9p`KT9t^#c5Xz*Qg%B_A~<2I<;|-5w2^Q$!dk9}J2=uWvg}NR#n6I#UTG05MNy zq07-PQEYO}gl`FV8~zUp`pQ^4LChzyA?+hamw6a{zqH$9*c{e6ljDe=hiobCy zvNRhhh<}*(-XxptoO137NMVSFHL}~_et_e@K)~kV8EW>{_D#+Uu$AUunsm;?t>2uX z#F*hK72@Io3jEGWNEM4YK~I4-zzX(N*Kusdr)vp0hi9+<(!j4cT4E$o4;X)-!b(YrH=IIV3CGXlO6Mno6`ds@CUT(tUC-3JG6VXUlqfz!1{6S5Io zWDjuqB7f7wR|un6DWk2rlrT3p2MTeL5s&d@1v~vr*z*P!NZS=36J|h?_`9})oPio*GWLmkG;<5DK&+oOpxSK$sC*|_nOvCmbab@ldv1#?WR z283zO)gSiV&C4IFaGD2a;<&CqE8Gtv@%4NC+4av=qN)V66K=d;cjb<-jAIO$M?$ zKP;E%J}(PHNE)5-V5S0hNNAL@h16F7@YcVjWhTkCCDt3siKMkD!g5;&L(w zR6wf3Xky^7ZhHXyfXbvbU>x~N62G9VQ4^ev*zf9ZZdKC2GGkToaC=*+BxC1i><&s?wKV7ysm`_tC z;r^5TMe}d=mx8C|=AV-0(?AUuR-CGjj6@A&^#yGGw&IxPe!g|c)q+%{>Mjq@K`sRg zc%c+}V7ngOY8qvq-mJR>NWvQpmLen_v8j4I#OOok#k!5aa=;2sTFq$)#O9=c#6L!N$~aT@oUn{4>gA z#s>s+lLvDm{~mjS<_LnW8q~Cm|5N|`uR!(RB3yu@ObvA1^qCy@e?062;)|ia!~9SE z^Jx&xxHB9v4njiz9xekOhU)c_kAw>5m*M;dcEIMDT+LA6*74$q%f{c;$fFhTAKr@q z)#B(p7Mhm_m@0nOTxbi_ApA)3k>Cg(jJagKsCaBv#`2v(o$q;$gZUKw4_Od_QgI$r zEQsJ$0HVYi`om%YVGcx1_HkFAaX0j^l|*C!O=OyeYTqTQ;31@%_r;axtCyx*Zr!{C zD2|u<&RA*v?#}%9yhp+mFr-AMUnDVR*jEx#uXiX%+}HN!4F8)H{%fQ}(jPdF^@#p6 z)4+d~;QuSq|9_Q8|LfL)age1!3Ay%ccVv^>e(BB7WK*4T3=oQDnW+2x7afTO;?{iZ zNrVuf1;n$q*ltAHdx5MJ`xlduN6mc*$Y1L9s5GN?+Af4xK&0csC&}tZa-q+EVVNez zLo!%3Y2Si)Qu)Z`3yA0^po8>D)MDC&=8**LH57NtZxXnmtX)qly1cMZSKglS?rQN@ za3#fzKM3U{)W?J(?kwv-sZ4v?#G^~min@`>G3c0 zoCy-}?o-3jq`ox575x=~*Q!MEW2MVw+m)JjrVaq=br)w6-XE&hb^dyy8c&-uD+{q+08Lz3NO+EbLiW25@>66LWF*C`uLZ(-HlOYZ zB;w+P2;c3^A}73ixAbm^r=gIZl^1RwUFj<%v|9w9y}z2$eF|+&yE)e8@vell%4G@W zZn4z0=??$;VXE8$&UZN#)#heUWudfOf{KWQ+${FJqrANE_}-ycg92gjOoq9B&=2&l zk3#470*+lA+h@3%LeQ}(o}~z+TWmijx7NZ(!=@0>evK4Y3k!gu4p9Yir+6Z_1PjqU zeE2$A?C6H}OWucfk&w~8qMsZw$jgHD04Te;x};AF&e5ZZS>6@9oANYR@?ne{)#es1 zDJa1e)y%|%nim2hlHJ{%O^p^!;vObR%P-5*`HPjyxNQvZ3_ZqM(Fk6Bh|uUdj02DNgi@E%UiH7suv3tb+AYGr*``wcv(?`JJoHA!yXEJw*q$(kEBZR zQKAPvIyRT@c`Es^+BG>-W1|KQ+c3q`Vq3&MJM4kL_g&~lc#{;@4_2jo&8d|Aw(i9* z9p7TDPWw%VkPwj$aXH>zPsv0w7i%*4e?#!1L@_^KhcU}s?u8Bnewp114u3--@Ldzh z7k;?L*oSLKXxKSgU5Fl-xi4+9{j38SZBSZ!5hZ^!-vk69>fQp%y^JRtuRKB1-@vu>Z}*%b{RV!A?h}A6f?rnRzyiJfq*Un7zyJE+ zwwQpouD}ka8sQehanE--_fl4Xz(_%SrydPT-Du zPvnOjH<7mse!C9R?mpyjHpry@M6P+a`}{Ra&bO*%68K;)ZfgH3ogBflBk4+q zFEIJ7xcHVwKl*I?U$8k|Umi26maI(L^juzUd%$S}Gv(8_N=G!$H;Q{=Ici!=jvoA8BjU4D&`qr2mPYtZYAfm!d>~im*d9Sx!pYbonyrY z4*3=)SSVXn>v>@^e5aY|@$KVZuA=!pt`Jd43a-x94L%T{Vc)X=<7xG{g3|iT?cqx# zU0Ur8-f!bneBTO>Kd!D-C#&JFO*mZpUqsYhfZXMmYZ#0*maQAj*GDS40Tu1K+pyzl z2e=!#^Gf28b;l)M#cne(IDpN)!F#dOP(Eobd5xK+hlDIg@R4$FveIVWw^TQXx2&Vd z!Rl7-!GRYl**ym$O{c|h+60At9g{mD#s1rK$ZD&rZ?Y9xx8KF#AR-Cgy61u={#6V` zcUy={=ShPlN{h1b@uKo_g2xpIDx^zg8=tS3`%FI<7=Dkw+WUK4s!Rv5X~7Glj?_hv z9?^Bi3w3;5lxW=>gTauo@Rg@PE{e{_izW6tr?Dcv@b0AW_(1MEj8!X1hr??5{k3#K zufBI+pR(pVb+wL{5F#S6;y*jelWhqPETp>Xx7OVzIy8-VP0dj?GpIcf0Xc%j{9S$)uibmXGI~1bu{b|+Ki3#ppiZ&4` zdq8HeUo`^TD(YYeQ(Z&P7eN~o`_3vvw%g>8%WRgKKCvB>5h4J4X?7>XhRH!(=K3fq zKgPU@wmkn067t$(?G24;P3EIKjfem~Z6(Vu)0Wy#N$dt?D@_oKUeC=YlV7fgI!u_A z=R73PvA)7`TM=B2bI^2oTXqo=Z(8mXwi+R z7{s}g2*)6!r962SOS!icV?p+56%01Uy3;O;xw<&%^zitt_>HZS{JmL>65rO{o~=9V zlh{}k{we)rE*raxj2gr(_>FsY9_X*v7G&B;W|&8I$+i)H3L5zE|(xy7`5?&FyVZx=iAf@XU#@$D*fT{Hcr^-uC7{ZIk(CZj9fo zM+A+N>BBq+{PjjG`TeCX`fueC>NZ`hR(f{t1a&%L0Iwq9TTL=`Wn=m=k#vk#h8Fqi z>Vd>>uda^k$|G6=UA8I>vKO|hw`&(dB>^%78uDbp4pJEda+!+tnN;u&uTNU|-IuxH zmHXY?$$LIneD}iV+mK|PMl>AEEcnY~wGlv1>M&cudWy*t8IQWth$qvi9)3LSVv)DF z%y(S5`?%VGcU`4&Z_@ZnknZu^W2XoW`%f3bdDbR}yDj9`od$e({51L=?u6M*n@`Wd z0Vcpwl25*K!;0eSi!t2h>MEqnn*h|!wq4-o5A5VzKO1j2_P#)k1Fb}CUhy_Nq#}xw zt|ccUb$c4L1P22#;5ZGk{(#Q@xyAFUQw^^=*Q!#(d;buhP zmzuF{uhacyk5x%6I%g4QE`}ngvl=5Tjhwm0FXjmAMm38op76#+9Te@ks+t#d)lm3R5$&evhmDgeJzqQQrQ6xFffX!WL<;Zf&v43psP`wT2jN z4vKvx3?g1#eH>J6q~8-yD*uR3hE5`Btl}qw2^%KPNMhrYj?{1}-YHGaiR{u~ZG>8w zjoaXijQQ59Tzg!@9hdsi>H`;UdX}TDgTxGBrv|=CbJ;e&NITV!{)7?@AVrS3kyGI_ zIZ8h=XT!XjgZ`ixi`vuDd^fYL+R(|s&1@!zC70>_cs27%z19RgHJ7GFazYJTS=W;Z zVp@jlRT&Si#jo;nWy`|;1o-7k5=nb4d`E@F-CXoanpIpo2olM1Vx9t2DDD^Y;2rC-ahZUN&gEqF0oDB)Cq~>Q3+OTT|x_RirVlwKO)TsulmNpky$|s=3(ffMzE-mwFZ0%+czlx-S z3AluQ?}5X%yx_tXUl}gNv&V?K+mwp|Fu#X#Z%u)%1mLJel-7;Q^x<7+*GSf3j@kEk zbGHI@ig$x+REqVRh72Lp$b%h?S0q#_(~#j|v#Z}`Zt5N9ji#?0$&7TXAg^Hnoos1@E3qA7<-lJ_^(Hy$h?gOSnii703Uj3BToy6l4&*t>E^IaF| zo7l9j_99wHAM;<#V)bw?$40*9T0*^Sq~VjzA*d$IPi9aw32z)wp6g!$mK!5OMxaZ< zeAZHHqHPuldv=S@O&#~Hijs$#@XIX+8tGW&91?lIyBOTzw|P7jwXN!2U0{qmH)-rv z8qQOGxSl%Mz7E3cc~c-u6oAYYJLnKu;zfn-xpIx$L!7`+5RLB2m(GnG&RlhjRCNL>g#LKYv z^=>b31ugR|b6RPgox`uM?(H?#GD)ohv+86P%Y(xt-Hmdq@so*&G|z5hqz-dhssD>j zV)#k(fb@Bfpv|}mCjSqn9fa|QGGG?@pxh3*1O5?TAUYV|0qYjqk@?O<_1kn1j@f~^ z$%5i$A@gX-g`VwX%c0H%Ebk28T7;XdaD?)Bw$cLc&s%?}9CD0b52cp;Y*xD}Wzjxl znk(W1O-*xoqs6yZNSr$e*2_BK2wpca?mZxWz<#p1If%xhTtCV^QrSGsiJiR)c9$sw zg!m6=VZ^Dn`d7CC2(p@CG#`psAN-Jg@+CAfh${ZB^5meA`E`!|Mg>5)ciCev)iasi z{(Ns*T8iDXFkzS+VEv(xOSk#UoCe*lWus1)PFwwr$G$1=5xmlF-FvX?JdDkW3KfC{ ze@%61YOQIjH%ks2dGygK;O#c49* zxnBF%qfmwptC-H4#HPKeKhfCk@Oa`hni3)*;}Sj->b47}w8m_tLqswHR_pRv($I9DwSMK>lY~!v{fx|r7DX>~zesI9yp~L}p zwf%&TFTwbbuA3L)z(ko$lIxI8U^P)RnoO0kdzxG6xI3rg#8b;q4Wgj~*clW*k{?v@ z;OhZgrpGEXd(73#}$Pk|}W_v_O>bL9L;xFn?;>!ri0>oY!B z48CN?K8*o1GQ5WhR`M=w;xut3!03W3b{B6d2?-CQi>YmQrOCoKdlT@hvWm=-5FJ+P z1{}wQ5K&)wDN-clQ2b{?(q$&dP!$-!u1&*|sHP2=qjA7b-lBQ#&}rc^F(DyXcQWS> z*-Q+afszcB3&jbSrmMBU&d_o>4dmV$tsPgrnnC5ihxe7BgRy#}C{;3IseRrzqF=;% zDCgU)yW|gSdU%h&4l97gO9T0K$a=p#EMNe;vOHdu>KQh`cdvq=#TNmv7P)GVme84% z1Tzn{Y4`I@EdGm~e%)AyX{QNbgr`PmMo)!KW!Zy$iO4M~hRfFQ^0MxDUhX4fi=AFU zEHf>$r;tg?x1LjMy~xD63N~9{ZdJ9AxtIbAw8+-D(E)Ev00A4A^b5bAv8n_wKTI$esv;#&C* zO!}QS`OZVrF59pUhU&(YL^ZS0q2s#iOKH*1=Ze-b_F$`UpILw5mhR!8yiCA4htAwe zh4e%7&!<1I+_4EYBKTfgPS-d!O@-fREa4%c}8ztfsXq)(fP*a&JM8b-Y8u(+V zwLiuxI2=&j6I^i5Fb)&A1^S8h;N`W>v!ktqP35u;rb6A!sd?R8VD)K%1^~O;W10ll zqLS4}$!m6*I*IZ!!rEil_LN!q)VQP$r}?u_{;W%#QDO8!nIbYCXW{fcxmz{+-F_t2 zVtKu5J1F|yu})pABMWQ%Co?{8;dEd4!}7qh)lss+o`(@za3SGx!vJ)O0n;F`rpd-h zPuC+;P638jY?e)If&H~kS5At&^I2Z?R{L5B!2@1WLT^&A_lhwsY6A!|w_76nfHzK_ z=+gLhh(+DykvexsJmzT^JKPmG7G}xeJC(OU{zx$`fCZO)L{jgYr<4064YZUXtfl(& zkfG~i8{?crK*+`g+zpds#&b@CCO6=GyY8B)g=8Q88UKnuz8<&O>lN6n{^ZNzlm8y6 z>bzuc0+#PLU`MMGf^-}$8D zd_a?N|A26q1a)egzoPTmN25Y! z^EVu?yh!awDc!d~`j80PRo+N(}@NVxL7LIHIZn@Ot{J8}Mi3O#OMY*``-E_gY-NI-ffw1t%~xForej4FOz(zsR6@d6Y`;jcPaUiz2VJ$v zxLXfMu{T|i#$_$G!*>H68gr5i65NiYxi`N~45|ij4lVU0kUM>gv?-B{*8}sUYg6+{ z8{J)Ye90_DhO*aBGRO6^-3#M%#0Q@c5J(mwJd%lbU5YYj<~=otwQ61mqdWq(p(md% z-DQ5UTBJMd4OSlD;DX#wB6u;Bdxi%alHUoyJZbVWEPPm1q^$g;&AFx`Q(3Omy6}UJ z_;6aGgNQ8r1FK}hJyrOA+k*tI?ULcWb`0sRTP-~=ZP(kw>9^g_4#6gm=b%@RX<6mM zj0D6Zn2kRsol7hT5my1I{mT3dcrsd89CtrY$W=|s@U>HoyQ!mp*~i+hSX-B-;l_mD z2;x0bew9%IcJ2TZo2@fnrKIZuk?E$pSSI-zZv%HCm07Ie{sd1ylh_t6ipjLhH&FS* z<^#D2%Jr#tdqgjaLvx#7E>!D&4n7Jst(04=NMO2>YC8(}0L?U|y0bSf;!l)}i{%#G zk$Z3P#do_m;VU&V-rB`@aq#lh{qvLgpq8`~yTp*7A4Gl$latkhYmV+%_gq}AN0h$5 zO;AS%C%f8**Tb9I;CO+gUB}Nc$vCRv9>( zzo0}X%-qv`?MDTHmG z0Z##EU@@&8e){$fQt*N)b#Nvm^m`)+gX^EQv+(|LQh|uH3XUpLMra=Vesn^2OUzOM zSw8N!w~GC@>A}+c-=?Sd@2Cf8@?XHA5ct0pa85kJDxN%}7<{yV0R9sfmKMr;sqOv$ E0NA}V`v3p{ literal 0 HcmV?d00001 diff --git a/doc/_static/ingest-trans-multiple-one.png b/doc/_static/ingest-trans-multiple-one.png new file mode 100755 index 0000000000000000000000000000000000000000..27ea3c378c6daff5a85b5f0492d045fcb468c409 GIT binary patch literal 62630 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%0AOdmxf-tl)8NXp)7fIvNZKYg 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 literal 0 HcmV?d00001 diff --git a/doc/_static/ingest-trans-multiple-scattered.png b/doc/_static/ingest-trans-multiple-scattered.png new file mode 100755 index 0000000000000000000000000000000000000000..5ca26980335e9e714757fc6db71603a37130e56b GIT binary patch literal 74718 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 FzW{g5Ufuuz literal 0 HcmV?d00001 diff --git a/doc/_static/ingest-trans-multiple.pptx b/doc/_static/ingest-trans-multiple.pptx new file mode 100644 index 0000000000000000000000000000000000000000..f10512be8ac6d4012121defcf3dbca3015083c19 GIT binary patch literal 54238 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 literal 0 HcmV?d00001 diff --git a/doc/_static/ingest-transaction-fsm.png b/doc/_static/ingest-transaction-fsm.png new file mode 100755 index 0000000000000000000000000000000000000000..29d4a076b52c6b715be617ccc19f64a8d0009e15 GIT binary patch literal 72474 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 literal 0 HcmV?d00001 diff --git a/doc/_static/ingest-transaction-fsm.pptx b/doc/_static/ingest-transaction-fsm.pptx new file mode 100644 index 0000000000000000000000000000000000000000..7f2c2bbf0c133df23e3843ca57397892254b1351 GIT binary patch literal 46083 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

    n_xTU1m-GvgDfAw;)E`p32hoeBI;{*~xOIwN3ke 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�T zq*x-S5XyPaWTwFyx73q=xOo|E)pLv91Cpnwp2v3KEu2~ZLu!8@An?Zj$~AoJ#DQ?2 zdcbo#M&aj}+clThYdSO*<+hnp5MDQqeyP%!J4oHFhkko*P1r2ZlXEf=tUt=E( z?vX$~KcqhCspGgk**32a1b^wxdi4$((xtwmcFFEJZP*TKwc6XB^~(ZQIxPqivTn2| zV|d=;dIu{)?9L6QiCRImpPl*!$%*`m1d@%Y!hg?0yPL=W{eyv8QvZapEw0`BV9RUr zm+FJ0WEd-cw;&l9fgQ}n1I638YfQ(!S(`16P##V{RfKm`diEJ0KnWxOM#hpkIkMIq(|vZ z#DEKbZ(+t`?@}Lh-#e@PZ_OrL?*6?g(Y-3&z2PRy@0>idmsZ#?jhN$Wz4qk|zZBG{ zb9iED2Muc36YToCcrEM~b^E`7>@AsGsoxW?me-6s?zs*!W)R# zl(=93+N0R?$uHITtBQj|RCL%asZUGio%~w{C{}o{UJI4mHfKiAIVlcy95MuwX1@Es z8NAilomhh$2T$Q|g@xZhmSeZglmPcuF0zNe?$;mQT!mFbr4)emb&3bcIhiDK7bn8r z5n&o~cxVM*&~FqdiBde@(Fp`tf9<^<9{JFj6c8PokC66S zCtEib%kyI;>Rrma_66o65KvfLQ}I2Sn@5&*RkL<{@7`X?ir?lr2N4LsX}9wax^)Gr>>d_qP8b)NzY)l0)Hq-JVS)uCAm|%`Xvb?w7}0?g|t*V zTi4fEgGY|^A0(XL6w!eIP;0nWGr6+{0&X5IrKYZZ^sYoq+Y}L{@2la*E3tDa5`9|v z=Rb)N0W4LsEDnfihdDby=S3}W+8kEzU1slok*Xo) zcU@p2moHOagU>-4inPrCNG*AGk#&pt31%G#SP}y@ikWiyf@EHaK{j_cuh;2j9-i;z z{2ju-j!yXahfR>88_)=!#ZQH<&cQGX)lIC(5kcpDvJ=F7-%UEv3zwd1{qeT!e=(l> zD(}IW8|=q$lp<{0@EF0KJO;<)QrpC9ZZ{6+oaNjs>4EdS_>0H}B#YFbai{-aC(`Wi zhX|Kd;?p#5|IA(H}^95a44IoRRfy762o*;Pt(-MhUhA8rse zF1kz@sP!yzwl&+>%(v=#2=!k^Inc1g$Fw1uQlNd|B}yAIxPKJxV19c_0sL8)R zuX{z_oNUh44h`XcMXUNCWeirS4oTWb&X&Bk4A}XFv|N5Xp`iM+i_`xFcFkY*_~hGV zt-QhePj2Fw_V&IHm*jNB;2?Xdl~WkF_;($kZ1#y6PcD_1WbSlJ3+`~r_BtKKzqv)i zkS`wY)TXk6FE-t%QWsxP5;KQP4B%CX6kX(0#gFolu#&FMev-eCFTsAoK5E{;^oYE{ zj&xWc5m`jI*m?6ZLMs;QK}q@O{v`NyEkk$UpgU+Fb zMJm59(q~>c*%t`7MEHw&z`Eef!$5oXUfbq}>Q1caozkpYirBp8GP9|+AtjrtiWUux z4A&|*E|lu7PIB0J=3%jymUjj#kzno6g$uk70*7@~E#KdM8h0kg~sUy{%GO z9=k7@!A(>lhB@_+91cpUDn?OsmeV5E=KGQ&EE#Wsdzczb8JeVeopFkd{E7cjdvnwO$+XnJmw}X^;@+$OZy1gjKjBNHlE}TD{}6}& z6c65Ge`ZkC0(eVTL9-_Tt{jUl5qL5rlx85Uwi5mh^V$E(CH%*V zz<2CwXI~tWCrxfuc~tU}!}ZbD>A=E_((BrucR*X|@}CliybLp&J$J=~lql1ia>SD4 z7C#GdC@e!1{902Jz}j0-^NrWIK##|10Aw=Li%tQTl|Dg0VgR5)Q}BN#^}{RzthGRM z=sBPn_CKdx{&P~_#KFnzuSJx^O`ARv(8v#Bvcv5n#Cv2}`MrEp^b0g_ zP%FU_&R+hh&hp>cF3rC|??5i~W)@L?#V|w0hGKVw_gYz}hUxqU23& zPx8Yr*14$`qXot{_9{p<i?G)_zi1!xIK@5i zX$}QyBeWOwLAVhricH^!0lnSakhA;%AWjn7gtP#qm5;dq{Grm-UR*&BsF43}rv%!9 z(LeA&Rlo#V1_A9A`&Ts>efjdI7K+q<#ICTQbp1KEvW=OlxR~CwQzsB5d`5z-!`p2K zPRrGH%E%<$fVB4j%j?9D2zzlO%UO$2a~m2^<<)fR zKi5)(tyvQMaFB*D^vQ7Gt_NL%v@3a*hx{>1f`(YWMW z|MnEZBb^;MUG~EDcu$|ks`oxj5~!wxlSq(28AdjmrN;_ zVP+(+CQ6|qmz2B6rE)1oM8zAqB~5N6jf^OX3Xxt(zB6a4Go9p{Kfb?S-|@^m&&)jQ zXYY0PK4-7B&R*-QHEpEbz{8(Pskm?X?v_6#x|~aEGHgiTS#o8gUe>gf(8S>Zzj2eG zB-Nujq){YItGI-}KX_|crNS6m?{+mM8I87h9T4kvxH_b!WH_f3Qz-kT&(B()%2~`2 zkXtU3RD0}Dlzv*&VuQP_3ohXwg{DztzlqK^j@dC8<_V+}45AhA)VHYIj6mh#BX!R#s&6xVR{vsAy`^N77{M za1-7uhvUdRd#lK~o1;6bcGFfL@kR>Xl2pso)LOKii#N`tZO`8POYU1$3<3(*o!v5O zS9MQpIIHO|$*^*+n4@orDD78xvx7g>m(g3lARTmE zH5wHBjBkctGm|gH3bnWno)$<*M`E;*{5GhN6e0W6UEyJ=furvAA{TD#{j}=ZjJf-y ze@3&PZ5ydscU#(Tr$FcR8I!BiqA6V zn(y;1+Xm>W8;HmOAv|y=IYVDQcq{?yO>`jw!DRaEW9TpLvBk-?e09TemF#aFO?L@J z+C4kF?xnLUkreDLlD^!&^_l_>=ieg0XJV#B=}5fscjC8BPyO6hk9+CuN>WYB!WWwk z?9A1ZQoS>ER(O{3qv-6afB{v@#KYcQubfl;w|^3s&1gf!2O-QfIxM>mj@lk4^P^jzBQ~yje;e(a zlBFF!6l8(Qiij)~Tm2h)Jwo*1Ybk)dAGAUcO~w$_dL&<$2Zi z7gfs^t)az_cv4sV^*LLfay(y%!?&cuKqoX+OE)438arBTf{MQyo$?Bdy zAJ@=%a!Yz%ti-0>eaJ%?BP&zV)R~K0mb$p3(j)K1e(LY@x~YGZm-O-YQ$Hi_1}k39 z!N#i=nhUxqkIyR0P%s5?bJd`+hOwNi-f&v15?>vuTj@lWShvU{yL`7>qItp^cRpY_Y>JMB`TdT zq=7g_yg_HK$5SE!jRDcC@VDn*td z;=^f`tGou9M=Os7UDwqYRQ(XwS(~15foBPqoV}17kABCEcz?bRuEpnE%I1#LL|a6@7v-Ur zm2&vLSTS9Hu5Vx|$*5RmWg~L=nTld!mGbp$a)P|ls;sWh%P=^yQShLy-;rB0z-{yQ z-al!H9liU#_rDCTAE_dk1{dS2Uo^o56pCIv;y5B+{a&shBwWL9c~zC+INP~b&lgc; zUR@rbCbygj=_5^l+fy85o_WN|Rp@T0y{%+JvUBS2`mXEsPXrep7#FPXF}a^CJnVx@y4lZ`YM>tSJ%~3EYCTyVcWu}5N8*82L%Gkdj(cs=Rj++; z$XMPXq^weUdSBReLMU&Qp4`XDZ6|wM>~y3Ln4YR_w|*-5+CQjt=ff3jxnAw>UQ7Vb zQ~WQq09O72rx-9E=B*aMl0)-e3t$D1d9MYqGQhmo0+`Tx-fIC&;XCiO0OmlQ_gVn+ z1OAJ(pv=5x{PU^_OtbZWHT)Y_k2mdOlBj_7Aj89`ChlN>^CkkevD3}~A1uL}cg9RwpNt_}N!HPwW9HfX zQzV*vXMP(OUb(s{;3zk?KwoRj>G2|mVQm?`7E4%3i zp^cN1!SSN8L5q}PQ#APvY>mp6F8YLU%qx=Y;^t8|8c7KdyTWaAS5oxmPDQ05ZST5B zYCWguit2{`U|auF4-W>gJ&3cL2{TDCj2vy>?Q=EnP0kJ7g3V8`4+sjxjqwU5clKN9 zt+swpX8)o_PFQ}VSC$}gtI{E2V{(39g@84tSoGY+6X}WeUR^2^S2lc*-tALH>oYPAiZi#mG5F=-F(6rZdT=-LDx7CstB(~Zl zPy3)gGl`$pB-;XI;Q9I=-eRX=<4zjjT2kX>JarFT9+(b#rFppPWC!L~!c6jcMLxjw zthRxXF$NM}4p=XA0+X%(y_`G47XZ#KIL`H9Bn1ul4nAul5I`AGro$O`S1FA3lin|D(9W zg|s3Opac9;aE%%Qd3EUGM0czgmhnDo`=3omM&$#IE(KmdNk66|TKqe~#nlsQO$_kF z5@zecR58|<{>c4Spt~q0aiBz?1Oot`k{_3UrVq2W2VP?uBIZlajRWmYxPIYPVj-Ni z!rVB}fP>@U)ej+DA#k(%Ibde#ENBVAaq#kD5H3w^ZX9S*z;W>MG7#>)*4#L7Z4Sr5 zD^ox?HuT&$aFGkg!E@w8xVlYqet;p@Mgf{hY+Ol6cgk}G!ZTik9$GlhG9(N-=kn~X?U~)l8!w6OY8$K2zUKMg5_rz z%9|q)0EfYS*bodI!8A}<@My!yaQ7`lPKjh9|G}9Hr@`H!5H0B(6Ya;PZw}`u>*Vw( zR>+XUk#%wou$Ak#%k^(+XEiFI<>c~;1f1BZ2TWgIJH z$SJ})x#j{ZWXRFLI=S&8D`d!cpNkBv3Yd=Ocvi@a8wzL;vySdaUjsv~gUR$y{{ezDUXK6( literal 0 HcmV?d00001 diff --git a/doc/_static/ingest-transactions-failed.png b/doc/_static/ingest-transactions-failed.png new file mode 100755 index 0000000000000000000000000000000000000000..d2a0d60d5fc9dcdf2013e247432f30a0c52a68c2 GIT binary patch literal 77490 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 literal 0 HcmV?d00001 diff --git a/doc/_static/ingest-transactions-resolved.pptx b/doc/_static/ingest-transactions-resolved.pptx new file mode 100644 index 0000000000000000000000000000000000000000..932f344e0a7fe2759f915fc6ef22a939a43315bf GIT binary patch literal 46021 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

    y$ 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 GUHTJg*9-Xo literal 0 HcmV?d00001 diff --git a/doc/admin/data-table-indexes.rst b/doc/admin/data-table-indexes.rst new file mode 100644 index 0000000000..b6108d206e --- /dev/null +++ b/doc/admin/data-table-indexes.rst @@ -0,0 +1,608 @@ + +.. _admin-data-table-index: + +================== +Data Table Indexes +================== + +.. note:: + + All operations on indexes are only allowed on databases that are in the published state. The system will + refuse all requests on databases that are in a process of being ingested. This is done for three reasons: + + #. To avoid interfering with the catalog ingest operations. + #. To prevent returning an inconsistent (or wrong) state of the indexes + #. To prevent transient errors due to potential race conditions since the overall state of the distributed catalogs + might be being changed by the Ingest system. + +.. _admin-data-table-index-intro: + +Introduction +------------ + +This document explains how to use the index management API of the Qserv Replication System. Services provided by the system +are related to the following index management operations in MySQL: + +.. code-block:: sql + + SHOW INDEX FROM ... + CREATE ... INDEX ON
    ... + DROP INDEX ON
    ... + +However, unlike the single table operations listed above, the services allow managing groups of related tables distributed +across Qserv worker nodes. Hence, each request for any service refers to a single such group. In particular: + +- if a request refers to the *regular* (fully replicated) table then all instances of the table will be affected by the request. +- otherwise (in the case of the *partitioned* tables) each replica of every chunk of the table will be included in an operation. + Note that the index management services differentiate between the *chunk* tables themselves and the corresponding *full overlap* + tables. When submitting a request, a user will have to choose which of those tables will be included in the operation. + +The latter would also be reflected in the result and error reports made by the services. The JSON objects returned by +the services would return the names of the *final* tables affected by the operations, not the names of the corresponding +*base* name of a table specified in service requests. This is done to facilitate investigating problems with Qserv should +they occur. See more on the *base* and *final* table names in the section: + +- :ref:`ingest-general-base-table-names` (REST) + +Things to consider before creating indexes +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The recommendations mentioned in this section are not complete. Please, get yourself familiarized with +the MySQL documentation on indexes before attempting the operation. Read the following instructions on +the index creation command: + +- https://dev.mysql.com/doc/refman/8.4/en/create-index.html + +Always keep in mind that there is the MySQL (or alike) machinery behind Qserv and that the data tables +in Qserv are presently based on the MyISAM storage engine: + +- https://dev.mysql.com/doc/refman/8.4/en/myisam-storage-engine.html + +These are a few points to consider. + +General: + +- Indexes are created on tables, and not on views. +- Indexes are created in the scope of the table, and not databases. +- In the case of the *partitioned* tables, the *chunk* and *full* overlap may not need to have the same set of indexes. + In some cases, it may not be even possible, for instance, due to different ``UNIQUE`` constraints requirements. +- Please, provide a reasonable comment for an index, even though, comments aren't mandatory. Your comments could be useful + for bookkeeping purposes to know why and what the index was created for. +- Be aware that indexes take additional space on the Qserv workers' filesystems where the database tables are residing. + Potentially, if too many indexes were created, MySQL may run out of disk space and stop working. The rule of thumb for + estimating the amount of space to be taken by an index is based on the sizes of columns mentioned in an index + specification (explained in the next section) multiplied by the total number of rows in a table (on which the index + is being created). There are other factors here, such as the type of a table (regular or partitioned) as well as + the number of replicas for the partitioned tables. The index management service which is used for creating indexes + will also make the best attempt to prevent creating indexes if it will detect that the amount of available disk space + is falling too low. In this case, the service will refuse to create an index and an error will be reported back. + +When choosing a name for an index: + +- The name should be unique (don't confuse this with the UNIQUE keyword used in the index specifications) in the scope + of the table. It means it should not be already taken by some other index. Always check which indexes already exist + in a table before creating a new one. +- Generally, the name must adhere to the MySQL requirements for identifiers as explained + in: + + - https://dev.mysql.com/doc/refman/8.4/en/identifier-qualifiers.html + +- Keep in mind that names of identifiers (including indexes) in Qserv are case-insensitive. This is not the general + requirement in MySQL, where the case sensitivity of identifiers is configurable one way or another. It's because + of a design decision the original Qserv developers made to configure the underlying MySQL machinery. +- To make things simple, restrain from using special characters (all but the underscore one ``_``). +- The length of the name should not exceed 64 characters: + + - https://dev.mysql.com/doc/refman/8.4/en/identifier-length.html + +Error reporting +^^^^^^^^^^^^^^^^ + +All services mentioned in the document are the Replication system's services, and they adhere to the same error reporting +schema. The schema is explained in the document: + +- :ref:`ingest-general-error-reporting` (REST) + +In addition, the index managemnt services may return the service-specific error conditions in the ``error_ext`` attribute: + +.. code-block: + + "error_ext" : { + "job_state" : , + "workers" : { + : { +
    : { + "request_status" : , + "request_error" : + }, + ... + }, + ... + } + } + +Where: + +``job_state`` : *string* + The completion status (state) of the corresponding C++ job classes: + + - ``lsst::qserv::replica::SqlGetIndexesJob`` + - ``lsst::qserv::replica::SqlCreateIndexesJob`` + - ``lsst::qserv::replica::SqlDropIndexesJob`` + + The status will be serialized into a string. The explanation of the possible values could be found in + the following C++ header: + + - https://github.com/lsst/qserv/blob/master/src/replica/jobs/Job.h + + Look for this enum type: + + .. code-block:: + + enum ExtendedState { + NONE, ///< No extended state exists at this time. + SUCCESS, ///< The job has been fully implemented. + CONFIG_ERROR, ///< Problems with job configuration found. + FAILED, ///< The job has failed. + ... + } + + Also look for worker/table-specific errors in a JSON object explained below. + +``workers`` : *object* + The JSON object which has unique identifiers of workers (attribute ``worker``) as the keys, where the corresponding + value for the worker is another JSON object which has names of worker-side tables as the next-level keys for + descriptions of problems with managing indexes for the corresponding tables. + + .. note: + + Only the problematic tables (if any) would be mentioned in the report. If no problems were seen during + the index management operations then a collection of workers and tables will be empty. + +``request_status`` : *string* + The completion status (state) of the index creation C++ request classes: + + - ``SqlGetIndexesRequest`` + - ``SqlCreateIndexesRequest`` + - ``SqlDropIndexesRequest`` + + The status will be serialized into a string. More information on possible values could be found in the + following C++ header: + + - https://github.com/lsst/qserv/blob/main/src/replica/requests/Request.h + + Look for this enum type: + + .. code-block:: + + enum ExtendedState { + NONE, /// No extended state exists at this time + SUCCESS, /// The request has been fully implemented + CLIENT_ERROR, /// The request could not be implemented due to + /// an unrecoverable client-side error. + SERVER_BAD, /// Server reports that the request can not be implemented + /// due to incorrect parameters, etc. + SERVER_ERROR, /// The request could not be implemented due to + /// an unrecoverable server-side error. + ... + }; + +``request_error`` : *string* + This string provides an expanded explanation of an error reported by the Replication system's worker (in case if the + request failed on the worker's side and is reported to the service). + +.. note:: + + **Reporting partial successes or failures** + + Since the index management requests may (will) involve multiple tables, the corresponding operations may be potentially + partially successful and partially not successful. All failures for specific indexes which couldn't be managed (created, + queried, or deleted) would be reported as explained in the previous section. For example, that would be a case if a request + was made to drop a known to-exist index, and if no such index existed for some final tables. There may be various reasons + why this might happen. An explanation of the reasons is beyond a scope of this document. The best way a user should treat + this situation is to expect that the service would do the "best effort" of removing the index. It's also allowed to run + the index removal request multiple times. This won't make any harm. All subsequent requests will report failures for all + final tables in the specified group of tables. + +.. _admin-data-table-index-create: + +Creating +-------- + +To create a new index, a user must submit a request to the service: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``POST`` + - ``/replication/sql/index`` + +Where the request object has the following schema: + +.. code-block:: + + { "database" : , + "table" : , + "overlap" : , + "index" : , + "spec" : , + "comment" : , + "columns" : [ + { "column" : , + "length " :, + "ascending" : + }, + .. + ], + "auth_key" : + } + +Where: + +``database`` : *string* + The required name of the database where the table resides. + +``table`` : *string* + The required *base* name of the table where the index will be created. + +``overlap`` : *number* := ``0`` + The optional *overlap* flagg indicating a sub-type of the *chunk* table. The value should be one of the following: + + - ``1`` : *full overlap* + - ``0`` : *chunk* + +``index`` : *string* + The required name of the index to be created. + +``spec`` : *string* + The required index specification. The specification should adhere to the MySQL requirements for the index creation command: + + - https://dev.mysql.com/doc/refman/8.4/en/create-index.html + + Where a value of the parameter should be one of the following keywords: ``DEFAULT``, ``UNIQUE``, ``FULLTEXT``, or ``SPATIAL``. + All but the first one (``DEFAULT``) are mentioned in the MySQL documentation. The keywords map to the indfex + creation command: + + .. code-block:: sql + + CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name ... + + The REST service expects ``DEFAULT`` in those cases when none of the other three specifications are provided. + Any other value or a lack of ant will be considered as an error. + +``comment`` : *string* := ``""`` + The optional comment for the index. The value will be passed via the ``COMMENT`` parameter of the MySQL index + creation command: + + .. code-block:: sql + + CREATE ... INDEX ... COMMENT 'string' ... + +``columns`` : *array* + The required non-empty array of JSON objects keys mentioned in the key_part of the index creation statements: + + .. code-block:: sql + + CREATE ... INDEX index_name ON tbl_name (key_part,...) ... + + .. note:: + + The current implementation of the service doesn't support the extended-expression syntax of key_part introduced + in MySQL version 8. + + These are the mandatory attributes of each key-specific object: + + ``column`` : *string* + The required name of a column. + ``length`` : *number* + The required length of a substring used for the index. It only has a meaning for columns of + types: ``TEXT``, ``CHAR(N)``, ``VARCHAR(N)``, ``BLOB`` , etc. And it must be always 0 for other column + types (numeric, etc.). Otherwise, an index creation request will fail. + + ``ascending`` : *number* + The required sorting order of the column in the index. It translates into ``ASC`` or ``DESC`` optiona + in the key definition in ``key_part``. A value of ``0`` will be interpreted as ``DESC``. Any other positive number + will be imterpreted as to ``ASC``. + +``auth_key`` : *string* + The required zauthorization key. + +Here is an example of the index creation request. Let's supposed we have the *regular* (fully replicated) +table that has the following schema: + +.. code-block:: sql + + CREATE TABLE `sdss_stripe82_01`.`Science_Ccd_Exposure_NoFile` ( + `scienceCcdExposureId` BIGINT(20) NOT NULL, + `run` INT(11) NOT NULL, + `filterId` TINYINT(4) NOT NULL, + `camcol` TINYINT(4) NOT NULL, + `field` INT(11) NOT NULL, + `path` VARCHAR(255) NOT NULL + ); + +And, suppose we are going to create the ``PRIMARY`` key index based on the very first column ``scienceCcdExposureId``. +In this case the request object will look like this: + +.. code-block:: json + + { "database" : "sdss_stripe82_01", + "table" : "Science_Ccd_Exposure_NoFile", + "index" : "PRIMARY", + "spec" : "UNIQUE", + "comment" : "This is the primary key index", + "columns" : [ + { "column" : "scienceCcdExposureId", + "length" : 0, + "ascending" : 1 + } + ], + "auth_key" : "" + } + +The request deliberately misses the optional ``overlap`` attribute since it won't apply to the regular tables. + +Here is how the request could be submitted to the service using ``curl``: + +.. code-block:: bash + + curl 'http://localhost:25081/replication/sql/index' \ + -X POST -H "Content-Type: application/json" \ + -d '{"database":"sdss_stripe82_01","table":"Science_Ccd_Exposure_NoFile", + "index":"PRIMARY","spec":"UNIQUE","comment":"This is the primary key index", + "columns":[{"column":"scienceCcdExposureId","length":0,"ascending":1}], + "auth_key":""}' + +.. _admin-data-table-index-delete: + +Deleting +-------- + +To delete an existing index, a user must submit a request to the service: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``DELETE`` + - ``/replication/sql/index`` + +Where the request object has the following schema: + +.. code-block:: + + { "database" : , + "table" : , + "overlap" : , + "index" : , + "auth_key" : + } + +Where: + +``database`` : *string* + The required name of the database where the table resides. + +``table`` : *string* + The required *base* name of the table where the index will be created. + +``overlap`` : *number* := ``0`` + The optional *overlap* flagg indicating a sub-type of the *chunk* table. The value should be one of the following: + + - ``1`` : *full overlap* + - ``0`` : *chunk* + +``index`` : *string* + The required name of the index to be dropped. + +Here is an example of the index deletion request. It's based on the same table that was mentioned in the previous section. +The request object will look like this: + +.. code-block:: json + + { "database" : "sdss_stripe82_01", + "table" : "Science_Ccd_Exposure_NoFile", + "index" : "PRIMARY", + "auth_key" : "" + } + +Here is how the request could be submitted to the service using ``curl``: + +.. code-block:: bash + + curl 'http://localhost:25081/replication/sql/index' \ + -X DELETE -H "Content-Type: application/json" \ + -d '{"database":"sdss_stripe82_01","table":"Science_Ccd_Exposure_NoFile", + "index":"PRIMARY", + "auth_key":""}' + +.. _admin-data-table-index-inspect: + +Inspecting +---------- + +To inspect the existing indexes, a user must submit a request to the service: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``GET`` + - ``/replication/sql/index/:database/:table[?overlap={0|1}]`` + +Where the service path has the following parameters: + +``database`` : *string* + The name of a database affected by the operation. + +``table`` : *string* + The name of the table for which the indexes are required to be collected. + +The optional query parameyter is + +``overlap`` : *number* := ``0`` + The optional *overlap* flagg indicating a sub-type of the *chunk* table. The value should be one of the following: + + - ``1`` : *full overlap* + - ``0`` : *chunk* + +In case of successful completion of the request the JSON object returned by the service will have the following schema: + +.. code-block:: + + { "status": { + "database" : , + "table" : , + "overlap" : , + "indexes" : [ + { "name" : , + "unique" : , + "type" : , + "comment" : , + "status" : , + "num_replicas_total" : , + "num_replicas" : , + "columns" : [ + { "name" : , + "seq" : , + "sub_part" : , + "collation" : + }, + ... + ] + }, + ... + ] + } + } + +Where: + +``name`` : *string* + The name of the index (the key). + +``unique`` : *number* + The numeric flag indicates of the index's keys are unique, where a value of ``0`` means they're unique. Any other + value would mean the opposite. + +``type`` : *string* + The type of index, such as ``BTREE``, ``SPATIAL``, ``PRIMARY``, ``FULLTEXT``, etc. + +``comment`` : *string* + An optional explanation for the index passed to the index creation statement: + + .. code-block:: sql + + CREATE ... INDEX ... COMMENT 'string' ... + +``status`` : *string* + The status of the index. This parameter considers the aggregate status of the index across all replicas of the table. + Possible values here are: + + - ``COMPLETE`` : the same index (same type, columns) is present in all replicas of the table (or its chunks in the case + of the partitioned table) + - ``INCOMPLETE`` : the same index is present in a subset of replicas of the table, where all indexes have the same + definition. + - ``INCONSISTENT`` : instances of the index that have the same name have different definitions in some replicas + + .. warning:: + + The result object reported by the service will not provide any further details on the last status ``INCONSISTENT`` + apart from indicating the inconsistency. It will be up to the data administrator to investigate which replicas have + unexpected index definitions. + +``num_replicas_total`` : *number* + The total number of replicas that exist for the table. This is the target number of replicas where the index is expected + to be present. + +``num_replicas`` : *number* + The number of replicas where the index was found to be present. If this number is not the same as the one reported + in the attribute + ``num_replicas_total`` then the index will be ``INCOMPLETE``. + +``columns`` : *array* + The collection of columns that were included in the index definition. Each entry of the collection has: + + ``name`` : *string* + The name of the column + ``seq`` : *number* + The 1-based position of the column in the index. + ``sub_part`` : *number* + The index prefix. That is, the number of indexed characters if the column is only partly indexed 0 if + the entire column is indexed. + ``collation`` : *string* + How the column is sorted in the index. This can have values ``ASC``, ``DESC``, or ``NOT_SORTED``. + +The following request will report indexes from the fully-replicated table ``ivoa.ObsCore``: + +.. code-block:: bash + + curl http://localhost:25081/replication/sql/index/ivoa/ObsCore -X GET + +The (truncated and formatted for readability) result of an operation performed in a Qserv deployment with 6-workers may +look like this: + +.. code-block:: json + + { "status" : { + "database" : "ivoa" + "indexes" : [ + { "name" : "idx_dataproduct_subtype", + "type" : "BTREE", + "unique" : 0, + "status" : "COMPLETE", + "num_replicas" : 6, + "num_replicas_total" : 6, + "comment" : "The regular index on the column dataproduct_subtype", + "columns" : [ + { "collation" : "ASC", + "name" : "dataproduct_subtype", + "seq" : 1, + "sub_part" : 0 + } + ] + }, + { "name" : "idx_s_region_bounds", + "type" : "SPATIAL", + "unique" : 0, + "status" : "COMPLETE", + "num_replicas" : 6, + "num_replicas_total" : 6, + "comment" : "The spatial index on the geometric region s_region_bounds", + "columns" : [ + { "collation" : "ASC", + "name" : "s_region_bounds", + "seq" : 1, + "sub_part" : 32 + } + ] + }, + { "name" : "idx_lsst_tract_patch", + "type" : "BTREE", + "unique" : 0, + "status" : "COMPLETE", + "num_replicas" : 6, + "num_replicas_total" : 6, + "comment" : "The composite index on the columns lsst_tract and lsst_patch", + "columns" : [ + { "collation" : "ASC", + "name" : "lsst_tract", + "seq" : 1, + "sub_part" : 0 + }, + { "collation" : "ASC", + "name" : "lsst_patch", + "seq" : 2, + "sub_part" : 0 + } + ] + }, + } + +.. note:: + + - The second index ``idx_s_region_bounds`` is spatial. It's based on the binary column of which only + the first 32 bytes are indexed. + + - The third index ``idx_lsst_tract_patch`` is defined over two columns. diff --git a/doc/admin/director-index.rst b/doc/admin/director-index.rst new file mode 100644 index 0000000000..cc8c9a21a5 --- /dev/null +++ b/doc/admin/director-index.rst @@ -0,0 +1,108 @@ +.. _admin-director-index: + +Director Index +============== + +The *director* indexes in Qserv are optional metadata tables associated with the *director* tables, which are explained in: + +- :ref:`ingest-api-concepts-table-types` (CONCEPTS) + +Each row in the index table refers to the corresponding row in the related *director* table. The association is done via +the unique identifier of rows in the *director* table. In additon to the unique identifier, the index table also contains +the number of a chunk (column ``chunkId``) which contains the row in the *director* table. The index table is used to speed up the queries that +use the primary keys of *director* tables to reference rows. + +Here is an example of the index table schema and the schema of the corresponding *director* table ``Object``: + +.. code-block:: sql + + CREATE TABLE qservMeta.test101__Object ( + objectId BIGINT NOT NULL, + chunkId INT NOT NULL, + subChunkId INT NOT NULL, + PRIMARY KEY (objectId) + ); + + CREATE TABLE test101.Object ( + objectId BIGINT NOT NULL, + .. + ); + +The index allows to speed up the following types of queries: + +- point queries (when an identifier is known) +- ``JOIN`` queries (when the *director* table is used as a reference table by the dependent tables) + +Point queries can be executed without scanning all chunk tables of the *director* table. Once the chunk number is known, +the query will be sent to the corresponding chunk table at a worker node where the table resides. For example, +the following query can be several orders of magnitude faster with the index: + +.. code-block:: sql + + SELECT * FROM test101.Object WHERE objectId = 123456; + +The index is optional. If the index table is not found in the Qserv Czar's database, queries will be executed +by scanning all chunk tables of the *director* table. + +The index table can be built in two ways: + +- Automatically by the Qserv Replication/Ingest system during transaction commit time if the corresponding flag + was set as ``auto_build_secondary_index=1`` when calling the database registration service: + + - :ref:`ingest-db-table-management-register-db` (REST) + + .. note:: + + The index tables that are built automatically will be MySQL-partitioned. The partitioning is done + to speed up the index construction process and to benefit from using the distributed transactions + mechanism implemented in the Qserv Ingest system: + + - :ref:`ingest-api-concepts-transactions` (CONCEPTS) + + Having too many partitions in the index table can slow down user queries that use the index. Another side + effect of the partitions is an increased size of the table. The partitions can be consolidated at the database + *publishing* stage as described in the following section: + + - :ref:`ingest-api-concepts-publishing-data` (CONCEPTS) + +- Manually, on the *published* databases using the following service: + + - :ref:`ingest-director-index-build` (REST) + + Note that the index tables built by this service will not be partitioned. + +The following example illustrates rebuilding the index of the *director* table ``Object`` that resides in +the *published* database ``test101``: + +.. code-block:: bash + + curl localhost:25081/ingest/index/secondary \ + -X POST -H "Content-Type: application/json" \ + -d '{"database":"test101", "director_table":"Object","rebuild":1,"local":1}' + +.. warning:: + + The index rebuilding process can be time-consuming and potentially affect the performance of user query processing + in Qserv. Depending on the size of the *director* table, the process can take from several minutes to several hours. + For *director* tables exceeding 1 billion rows, the process can be particularly lengthy. + It's recommended to perform the index rebuilding during a maintenance window or when the system load is low. + +Notes on the MySQL table engine configuration for the index +----------------------------------------------------------- + +The current implementation of the Replication/Ingest system offers the following options for the implementation +of index table: + +- ``innodb``: https://mariadb.com/kb/en/innodb/ +- ``myisam``: https://mariadb.com/kb/en/myisam-storage-engine/ + +Each engine has its own pros and cons. + +The ``innodb`` engine is the default choice. The option is controlled by the following configuration parameter of the Master +Replication Controller: + +- ``(controller,director-index-engine)`` + +The parameter can be set via the command line when starting the controller: + +- ``--controller-director-index-engine=`` diff --git a/doc/admin/index.rst b/doc/admin/index.rst index d9f6e3f44b..24bb3322b6 100644 --- a/doc/admin/index.rst +++ b/doc/admin/index.rst @@ -1,15 +1,14 @@ -.. warning:: - **Information in this guide is known to be outdated.** A documentation sprint is underway which will - include updates and revisions to this guide. +.. _admin: -#################### -Administration Guide -#################### +##################### +Administrator's Guide +##################### .. toctree:: :maxdepth: 4 k8s - qserv-ingest/index - test-set + row-counters + data-table-indexes + director-index diff --git a/doc/admin/qserv-ingest/index.rst b/doc/admin/qserv-ingest/index.rst deleted file mode 100644 index 38cddd282e..0000000000 --- a/doc/admin/qserv-ingest/index.rst +++ /dev/null @@ -1,15 +0,0 @@ -.. _installation-label: - -######################### -The Qserv Ingest Workflow -######################### - -.. toctree:: - :maxdepth: 2 - - input-data - version - run - repcli - itest - diff --git a/doc/admin/row-counters.rst b/doc/admin/row-counters.rst new file mode 100644 index 0000000000..04d9c975e7 --- /dev/null +++ b/doc/admin/row-counters.rst @@ -0,0 +1,176 @@ + +.. _admin-row-counters: + +========================= +Row counters optimization +========================= + +.. _admin-row-counters-intro: + +Introduction +------------ + +Soon after the initial public deployment of Qserv, it was noticed that numerous users were executing the following query: + +.. code-block:: sql + + SELECT COUNT(*) FROM .
    + +Typically, Qserv handles this query by distributing it to all workers, which then count the rows in each chunk table and aggregate the results +at the Czar. This process is akin to the one used for *shared scan* (or simply *scan*) queries. The performance of these *scan* queries can +fluctuate based on several factors: + +- The number of chunks in the target table +- The number of workers available +- The presence of other concurrent queries (particularly slower ones) + +In the best-case scenario, such a scan would take seconds; in the worst case, it could take many minutes or even hours. +This has led to frustration among users, as this query appears to be (and indeed is) a very trivial non-scan query. + +To address this situation, Qserv includes a built-in optimization specifically for this type of query. +Here's how it works: Qserv Czar maintains an optional metadata table for each data table, which stores the row count for each +chunk. This metadata table is populated and managed by the Qserv Replication system. If the table is found, the query +optimizer will use it to determine the number of rows in the table without the need to scan all the chunks. + +Note that this optimization is currently optional for the following reasons: + +- Collecting counters requires scanning all chunk tables, which can be time-consuming. Performing this during + the catalog *publishing* phase would extend the ingest time and increase the likelihood of workflow instabilities + (generally, the longer an operation takes, the higher the probability of encountering infrastructure-related failures). +- The counters are not necessary for the data ingest process itself. They are merely optimizations for query performance. +- Building the counters before the ingested data have been quality assured (Q&A-ed) may not be advisable. +- The counters may need to be rebuilt if the data are modified (e.g., after making corrections to the ingested catalogs). + +The following sections provide detailed instructions on building, managing, and utilizing the row counters, along with formal +descriptions of the corresponding REST services. + +.. note:: + + In the future, the per-chunk counters will be used for optimizing another class of unconditional queries + presented below: + + .. code-block:: sql + + SELECT * FROM .
    LIMIT + SELECT `col`,`col2` FROM .
    LIMIT + + For these "indiscriminate" data probes, Qserv would dispatch chunk queries to a subset of random chunks that have enough + rows to satisfy the requirements specified in ``LIMIT ``. + +.. _admin-row-counters-build: + +Building and deploying +---------------------- + +.. warning:: + + Depending on the scale of a catalog (data size of the affected table), it may take a while before this operation + will be complete. + +.. note:: + + Please, be advised that the very same operation could be performed at the catalog publishing time as explained in: + + - :ref:`ingest-db-table-management-publish-db` (REST) + + The decision to perform this operation during catalog publishing or as a separate step, as described in this document, + is left to the discretion of Qserv administrators or developers of the ingest workflows. It is generally recommended + to make it a separate stage in the ingest workflow. This approach can expedite the overall transition time of a catalog + to its final published state. Ultimately, row counters optimization is optional and does not impact the core functionality + of Qserv or the query results presented to users. + +To build and deploy the counters, use the following REST service: + +- :ref:`ingest-row-counters-deploy` (REST) + +The service needs to be invoked for every table in the ingested catalog. Here is a typical example of using this service, +which will work even if the same operation was performed previously: + +.. code-block:: bash + + curl http://localhost:25080/ingest/table-stats \ + -X POST -H "Content-Type: application/json" \ + -d '{"database":"test101", + "table":"Object", + "overlap_selector":"CHUNK_AND_OVERLAP", + "force_rescan":1, + "row_counters_state_update_policy":"ENABLED", + "row_counters_deploy_at_qserv":1, + "auth_key":""}' + +This method is applicable to all table types: *director*, *dependent*, *ref-match*, or *regular* (fully replicated). +If the counters already exist in the Replication system's database, they will be rescanned and redeployed. + +It is advisable to compare Qserv's performance for executing the aforementioned queries before and after running this operation. +Typically, if the table statistics are available in Qserv, the result should be returned in a small fraction of +a second (approximately 10 milliseconds) on a lightly loaded Qserv. + +.. _admin-row-counters-delete: + +Deleting +-------- + +In certain situations, such as when there is suspicion that the row counters were inaccurately scanned or during the quality +assurance (Q&A) process of the ingested catalog, a data administrator might need to remove the counters and allow Qserv +to perform a full table scan. This can be achieved using the following REST service: + +- :ref:`ingest-row-counters-delete` (REST) + +Similarly to the previously mentioned service, this one should also be invoked for each table requiring attention. Here is +an example: + +.. code-block:: bash + + curl http://localhost:25080/ingest/table-stats/test101/Object \ + -X DELETE -H "Content-Type: application/json" \ + -d '{"overlap_selector":"CHUNK_AND_OVERLAP","qserv_only":1,"auth_key":""}' + +Note that with the parameters shown above, the statistics will be removed from Qserv only. +This means the system would not need to rescan the tables again if the statistics need to be rebuilt. The counters could simply +be redeployed later at Qserv. To remove the counters from the Replication system's persistent state as well, +the request should have ``qserv_only=0``. + +An alternative approach, detailed in the next section, is to instruct Qserv to bypass the counters for query optimization. + + +.. _admin-row-counters-disable: + +Disabling the optimization at run-time +--------------------------------------- + +.. warning:: + + This is a global setting that affects all users of Qserv. All new queries will be run without the optimization. + It should be used with caution. Typically, it is intended for use by the Qserv data administrator to investigate + suspected issues with Qserv or the catalogs it serves. + +To complement the previously explained methods for scanning, deploying, or deleting row counters for query optimization, +Qserv also supports a run-time switch. This switch can be turned on or off by submitting the following statements via +the Qserv front-ends: + +.. code-block:: sql + + SET GLOBAL QSERV_ROW_COUNTER_OPTIMIZATION = 1 + SET GLOBAL QSERV_ROW_COUNTER_OPTIMIZATION = 0 + +The default behavior of Qserv, when the variable is not set, is to enable the optimization for tables where the counters +are available. + +.. _admin-row-counters-retrieve: + +Inspecting +---------- + +It's also possible to retrieve the counters from the Replication system's state using the following REST service: + +.. code-block:: bash + + curl http://localhost:25080/ingest/table-stats/test101/Object \ + -X GET -H "Content-Type: application/json" \ + -d '{"auth_key":""}' + +- :ref:`ingest-row-counters-inspect` (REST) + +The retrieved information can be utilized for multiple purposes, including investigating potential issues with the counters, +monitoring data distribution across chunks, or creating visual representations of chunk density maps. Refer to the REST service +documentation for more details on this topic. diff --git a/doc/admin/test-set.rst b/doc/admin/test-set.rst deleted file mode 100644 index 8d8a31136a..0000000000 --- a/doc/admin/test-set.rst +++ /dev/null @@ -1,60 +0,0 @@ -********* -Test sets -********* - -.. warning:: - DEPRECATED - -Integration tests -================= - -Once a Qserv mono-node instance is running, you can run advanced integration test on one dataset by using: - -.. code-block:: bash - - qserv-check-integration.py --load --case=01 - # See advanced options with --help option - -You can also run the whole integration test suite, with fixed parameters by using : - -.. code-block:: bash - - qserv-test-integration.py - # See advanced options with --help option - -Results are stored in ``$QSERV_RUN_DIR/tmp/qservTest_case/outputs/``, and are erased before each run. - -Input data sets ---------------- - -Directory structure -^^^^^^^^^^^^^^^^^^^ - -:: - case/ - README.txt - contains info about data - queries/ - data/ -
    .schema - contains schema info per table -
    .csv.gz - contains data`` - -Database -^^^^^^^^ - -data from case will be loaded into databases called - - ``qservTest_case_mysql``, for mysql - - and ``LSST``, for qserv - -Query file format -^^^^^^^^^^^^^^^^^ - -Query file are named ``_.sql`` where ```` means : - - ``0xxx`` supported, trivial (single object) - - ``1xxx`` supported, simple (small area) - - ``2xxx`` supported, medium difficulty (full scan) - - ``3xxx`` supported, difficult /expensive (e.g. full sky joins) - - ``4xxx`` supported, very difficult (eg near neighbor for large area) - - ``8xxx`` queries with bad syntax. They can fail, but should not crash the server - - ``9xxx`` unknown support - -Files that are not yet supported should have extension ``.FIXME``. diff --git a/doc/conf.py b/doc/conf.py index 13dcb17f0b..aded147ad6 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -42,6 +42,7 @@ r"^https://rubinobs.atlassian.net/wiki/", r"^https://rubinobs.atlassian.net/browse/", r"^https://www.slac.stanford.edu/", + r".*/_images/", ] html_additional_pages = { diff --git a/doc/dev/css.rst b/doc/dev/css.rst deleted file mode 100644 index c8bf1a19c0..0000000000 --- a/doc/dev/css.rst +++ /dev/null @@ -1,68 +0,0 @@ -################### -CSS metadata layout -################### - -The Central State System (CSS) maintains information about the data stored in -Qserv. Currently, this consists of the data schema: the names of databases and -what tables they contain, the partitioning parameters used by the database, etc. - -************** -Implementation -************** - -CSS content is stored in a hierarchical key-value structure, with keys -structured much like filename paths. In standard Qserv installations, CSS data -is kept in a MySQL database, although parts of qserv may be tested with CSS -content stored in a more feature-light form, e.g., a file. - -*********** -Packed keys -*********** - -In order to reduce the number of key-value updates when manipulating CSS -content, some portions of the content tree are stored packed in JSON format. -This is signified by presence of ".packed.json" key. The content of this key is -a structure (JSON object) which contains some of the keys appearing at the same -level as ".packed.json" key. For example, suppose CSS content includes -(specified in python dict syntax): - -.. code-block:: python - - { "/foo/bar" : "12345", - "/foo/bar/baz" : "regular data", - "/foo/bar/.packed.json" : '{"a":"aa", "b":"bb"}' } - -The key "/foo/bar/.packed.json" is unpacked, thus the above content will be -interpreted as: - -.. code-block:: python - - { "/foo/bar" : "12345", - "/foo/bar/baz" : "regular data", - "/foo/bar/a" : "aa", - "/foo/bar/b" : "bb" } - -Note that the presence of "/foo/bar/.packed.json" does not prevent the presence -of "/foo/bar/baz". It is not specified what happens if the same key appears in -both regular CSS structure and in packed key value like in this structure: - -.. code-block:: python - - # it is unspecified which value /foo/bar/a has when unpacked - { "/foo/bar" : "12345", - "/foo/bar/a" : "regular key data", - "/foo/bar/.packed.json" : '{"a":"aa", "b":"bb"}' } - -The values in JSON object can be simple types like strings or numbers, complex -objects are not supported there. All values in JSON object are transformed to -strings when unpacked, so the packed object ``"{"key": 1}"`` is treated -identically to ``"{"key": "1"}"``. - -************* -CSS interface -************* - -CSS key-value storage is hidden completely behind CSS interface -(``css/CssAccess`` class). This interface defines all logical operations on -databases, tables, nodes, etc. and translates those operations into key-value -structure manipulatons, including packing and upacking of the keys. diff --git a/doc/dev/index.rst b/doc/dev/index.rst index 1b5134fefd..0fc6b0cc50 100644 --- a/doc/dev/index.rst +++ b/doc/dev/index.rst @@ -1,18 +1,12 @@ -.. warning:: - - **Information in this guide is known to be outdated.** A documentation sprint is underway which will - include updates and revisions to this guide. - .. highlight:: sql -############### -Developer Guide -############### +################# +Developer's Guide +################# .. toctree:: :maxdepth: 2 quick-start-devel doc - css - wmgr-api + scisql diff --git a/doc/dev/quick-start-devel.rst b/doc/dev/quick-start-devel.rst index 4b0cd7b345..1bfdaabbe6 100644 --- a/doc/dev/quick-start-devel.rst +++ b/doc/dev/quick-start-devel.rst @@ -1,3 +1,7 @@ +.. warning:: + + Information in this guide is known to be outdated. The updated version will be available in the near future. + .. _quick-start-devel: ################################ diff --git a/doc/dev/scisql.rst b/doc/dev/scisql.rst new file mode 100644 index 0000000000..d533bd2c43 --- /dev/null +++ b/doc/dev/scisql.rst @@ -0,0 +1,113 @@ +.. note:: + The oficial documentation for the ``sciSQL`` project can be found at https://smonkewitz.github.io/scisql/ + +====================== +sciSQL Developer Notes +====================== + +The document presents the development methodology for ``sciSQL`` in the context of the Qserv container environment. + +Making a build container +------------------------ + +The most straight-forward way to do this involves starting with a generic MariaDB distribution container, +then layering in the development toolchain. Build and test then take place within this customized container. +Here is an example of a small ``Dockerfile`` for this: + +.. code-block:: dockerfile + + FROM mariadb:10.6 + RUN apt-get update \ + && apt-get install -y g++ git make libmariadb-dev python3 python3-pip vim \ + && pip3 install future mako mysqlclient \ + && update-alternatives --install /usr/bin/python python /usr/bin/python3 0 + ENV MARIADB_ROOT_PASSWORD=CHANGEME + VOLUME /root + +With that file the desired image is built by: + +.. code-block:: bash + + docker build -t scisql-dev - < Dockerfile + +The ``ENV`` and ``VOLUME`` lines of the ``Dockerfile`` file are for convenience when running the resulting container. +The stock MariaDB container already has a ``VOLUME`` for ``/var/lib/sql``. Passing this and the additional ``VOLUME`` +for ``/root`` conveniently captures your development state in case the container crashes or you otherwise wish to restart it. + +Running the container +--------------------- + +To run the container built as above: + +.. code-block:: bash + + docker run --name scisql-dev --init -d \ + -v scisql-dev-data:/var/lib/mysql \ + -v scisql-dev-home:/root scisql-dev + +You need to provide names for volumes holding MariaDB state and the root user home directory. This exact same command can be +repeated to re-launch with preserved state (providing, e.g., you check out and build under ``/root`` within the container). + +Now the container will start. If it is a first run on a given data volume, it will take some tens of seconds for MariaDB +to initialize. You can monitor docker logs on the container. When it is ready to go you will see "ready for connections" +near the end of the log. There will be a running MariaDB server within this container, into which scisql can be installed +and tested. + +At this point, it's recommended using a tool like ``VSCode``'s ``"connect to running container"`` to attach +the IDE to the container. It can take ``VSCode`` a little while to download and install its server-side support within +the container (another nice reason to have this persisted in the ``/root`` volume). You may wish to install a few niceties +like your favorite ``.profile``, ssh keys for GitHub, etc. now in ``/root``. + +Building and testing sciSQL +--------------------------- + +Now, inside the container, clone out from ``github.com/smonkewitz/scisql``. Configure and build with: + +.. code-block:: bash + + git clone https://github.com/smonkewitz/scisql.git + cd scisql + ./configure --mysql-includes=/usr/include/mariadb + make + +From here, the somewhat non-obvious iterated incantation to rebuild, deploy into the local MariaDB, and run the test +suite is: + +.. code-block:: bash + + make install && echo $MARIADB_ROOT_PASSWORD | PYTHONPATH=/usr/local/python \ + scisql-deploy.py --mysql-dir=/usr \ + --mysql-socket=/run/mysqld/mysqld.sock \ + --mysql-plugin-dir=/lib/mysql/plugin + +If you don't want to undeploy/redeploy the UDFs and plugin, but are just iterating on the unit tests themselves, +the following shortcut version is also useful: + +.. code-block:: bash + + make install && echo $MARIADB_ROOT_PASSWORD | PYTHONPATH=/usr/local/python \ + scisql-deploy.py --mysql-dir=/usr \ + --mysql-socket=/run/mysqld/mysqld.sock \ + --mysql-plugin-dir=/lib/mysql/plugin \ + --test + +Updating the HTML documentation +------------------------------- + +The HTML documentation is rendered by the Mako template library for Python: https://www.makotemplates.org from comments +embedded in the sources and templates in ``tools/templates/``. Incantation to build is just: + +.. code-block:: bash + + make html_docs + +If you are using ``VSCode``, you can get a tunneled live view on the documentation in your working tree by popping +an additional terminal, and incanting: + +.. code-block:: bash + + cd doc + exec python -m http.server + +Don't forget to add and commit the re-rendered documentation (under ``doc/``) on your PR. After a PR is merged to master, +the documentation will automatically update on github pages at https://smonkewitz.github.io/scisql/ diff --git a/doc/dev/wmgr-api.rst b/doc/dev/wmgr-api.rst deleted file mode 100644 index 27e6cbab62..0000000000 --- a/doc/dev/wmgr-api.rst +++ /dev/null @@ -1,1092 +0,0 @@ -Worker Manager API -################## - -Overview -******** - -Worker manager is a service which runs alongside every qserv worker or czar and -manages many common operations: - -* database operations (table creating, data loading, etc.) -* certain xrootd (plug-in) operations -* management of other services' lifetime - -Primary motivation for implementing wmgr service was to facilitate data loading -in integration tests. It is likely that some of the wmgr functions may be -changed in the future once we implement production-level services for data -loading and distribution. For more details on wmgr design consult pages: - -* https://jira.lsstcorp.org/browse/DM-1900 -* https://dev.lsstcorp.org/trac/wiki/db/Qserv/WMGRDesign - -This document describes wmgr HTTP-basedAPI in details. Note that there is also a -Python client library implemented on top of HTTP API. - - -General API description -*********************** - -Wmgr API is implemented on top of HTTP protocol following RESTful principles -(where possible). All communication with wmgr is performed over HTTP without -encryption (implementing SSL/TLS is feasible but needs solution for certificate -management). - -Wmgr can be configured to require one of few authentication mechanisms - none, -basic, or digest. Lack of SSL/TLS dictates use digest authentication for -production services. - -Whole wmgr API is split into three groups - database, xrootd, and process API. -Below is description of individual API methods (actions). - -Return codes and content types -============================== - -Responses generated by wmgr service use regular HTTP status codes to indicate -success or error. Codes in range 200-299 are used for success, 400-499 for -errors (range 500-599 typically means service failure). - -Normally responses generated by wmgr service include data in JSON format and -have their ``Content-Type`` header set to ``application/json``. This applies to -both successful completion and error conditions. In some cases when error -condition is returned by the transport/framework layer it will have different -content type. - -See also document which defines general structure of JSON objects for returned -response data: -https://confluence.lsstcorp.org/display/DM/REST+API+General+Guidelines - - -Database API -************ - -This section contains description of actions related to database operations - -creating/deleting databases and tables, loading table data, etc. - - -``GET /dbs`` -============ - - Return the list of all existing database names. - - Response headers: - * Content-Type: ``application/json`` - - Status Codes: - * 200 - for successful return - * 500 - for database errors - - Response body (for successful completion): - JSON object, "results" property is a list of database objects with keys: - * name: database name - * uri: URL for database operations - - Request/response example:: - - GET /dbs HTTP/1.0 - - :: - - HTTP/1.0 200 OK - Content-Type: application/json - - { - "results": [ - { - "name": "qservMeta", - "uri": "/dbs/qservMeta" - }, - { - "name": "qservResult", - "uri": "/dbs/qservResult" - } - ] - } - -``POST /dbs`` -============= - - Create new database. In addition to creating database itself this method - also grants all privileges on this database to regular non-privileged - account. - - Request headers: - * Content-Type: required as ``multipart/form-data`` - - Form Parameters: - * db: Database name - - Response headers: - * Content-Type: ``application/json`` - - Status Codes: - * 201 - if database was successfully created - * 400 - if database name is missing - * 409 - if database already exists - * 500 - for other database errors - - Response body (for successful completion): - JSON object, "result" property is a database object with keys: - * name: database name - * uri: URL for database operations - - Request/response example:: - - POST /dbs HTTP/1.0 - Content-Type: multipart/form-data; boundary=------------------------bb306714c15713c2 - - --------------------------bb306714c15713c2 - Content-Disposition: form-data; name="db" - - newDB - --------------------------bb306714c15713c2-- - - :: - - HTTP/1.0 201 CREATED - Content-Type: application/json - - { - "result": { - "name": "newDB", - "uri": "/dbs/newDB" - } - } - -``DELETE /dbs/`` -======================== - - Deletes database. - - Parameters: - * dbName: database name - - Response headers: - * Content-Type: ``application/json`` - - Status Codes: - * 200 - if database was successfully deleted - * 400 - if parameters have invalid format - * 404 - if database does not exist - * 500 - for other database errors - - Response body (for successful completion): - JSON object, "result" property is a database object with keys: - * name: database name - * uri: URL for database operations - - Request/response example:: - - DELETE /dbs/newDB HTTP/1.0 - - :: - - HTTP/1.0 200 OK - Content-Type: application/json - - { - "result": { - "name": "newDB", - "uri": "/dbs/newDB" - } - } - -``GET /dbs//tables`` -============================ - - Returns the list of tables in a database. - - Parameters: - * dbName: database name - - Response headers: - * Content-Type: ``application/json`` - - Status Codes: - * 200 - for successful return - * 400 - if parameters have invalid format - * 404 - if database does not exist - * 500 - for database errors - - Response body (for successful completion): - JSON object, "results" property is a list of table objects with keys: - * name: table name - * uri: URL for database operations - - Request/response example:: - - GET /dbs/qservMeta/tables HTTP/1.0 - - :: - - HTTP/1.0 200 OK - Content-Type: application/json - - { - "results": [ - { - "name": "QCzar", - "uri": "/dbs/qservMeta/tables/QCzar" - }, - { - "name": "QInfo", - "uri": "/dbs/qservMeta/tables/QInfo" - }, - ... - ] - } - -``POST /dbs//tables`` -============================= - - Create new table. - - If ``schemaSource`` (see below) is "request" then request must include - ``schema`` parameter which is an SQL DDL statement starting with 'CREATE - TABLE TableName ...'. - - If ``schemaSource`` is "css" then ``table`` parameter must be specified. - Table schema will be extracted from CSS in this case, ``schemaSource`` must - not be given. - - Parameters: - * dbName: database name - - Request headers: - * Content-Type: required as ``multipart/form-data`` - - Form Parameters: - * table: Table name - * schemaSource: source for schema name, possible - values: "request", "css", (default: "request") - * schema: complete "CREATE TABLE ..." statement - (optional) - * chunkColumns: boolean flag, false by default, - accepted values: '0', '1', 'yes', 'no', 'false', 'true'. If set - to true then delete columns "_chunkId", "_subChunkId" from table - (if they exist) and add columns "chunkId", "subChunkId" (if they - don't exist) - - Response headers: - * Content-Type: ``application/json`` - - Status Codes: - * 201 - if table was successfully created - * 400 - if parameters have invalid format or if form - parameters are missing or conflicting - * 409 - if table already exists - * 500 - if table is not defined in CSS or other - database errors - - Response body (for successful completion): - JSON object, "result" property is a table object with keys: - * name: database name - * uri: URL for database operations - - Request/response example:: - - POST /dbs/newDB/tables HTTP/1.0 - Content-Type: multipart/form-data; boundary=------------------------c5c44964f0f9add0 - - --------------------------c5c44964f0f9add0 - Content-Disposition: form-data; name="schema" - - CREATE TABLE newTable (I INT) - --------------------------c5c44964f0f9add0 - Content-Disposition: form-data; name="table" - - newTable - --------------------------c5c44964f0f9add0-- - - :: - - HTTP/1.0 201 CREATED - Content-Type: application/json - - { - "result": { - "name": "newTable", - "uri": "/dbs/newDB/tables/newTable" - } - } - -``DELETE /dbs//tables/`` -========================================= - - Drop a table and optionally all chunk/overlap tables. - - Parameters: - * dbName: database name - * tblName: table name - - Query Parameters: - * dropChunks: boolean flag, false by default, accepted - values: '0', '1', 'yes', 'no', 'false', 'true' - - Response headers: - * Content-Type: ``application/json`` - - Status Codes: - * 200 - if table was successfully deleted - * 400 - if parameters have invalid format - * 404 - if table does not exist - * 500 - for other database errors - - Response body (for successful completion): - JSON object, "result" property is a table object with keys: - * name: database name - * uri: URL for database operations - - Request/response example:: - - DELETE /dbs/newDB/tables/newTable HTTP/1.0 - - :: - - HTTP/1.0 200 OK - Content-Type: application/json - - { - "result": { - "name": "newTable", - "uri": "/dbs/newDB/tables/newTable" - } - } - - -``GET /dbs//tables//schema`` -============================================= - - Return result of SHOW CREATE TABLE statement for given table. - - Parameters: - * dbName: database name - * tblName: table name - - Response headers: - * Content-Type: ``application/json`` - - Status Codes: - * 200 - for successful return - * 400 - if parameters have invalid format - * 404 - if table does not exist - * 500 - for database errors - - Response body (for successful completion): - JSON object, "result" property is a string with resulting schema. - * name: table name - * uri: URL for database operations - - Request/response example:: - - GET /dbs/newDB/tables/newTable/schema HTTP/1.0 - - :: - - HTTP/1.0 200 OK - Content-Type: application/json - - { - "result": "CREATE TABLE `newTable` (\n `I` int(11) DEFAULT NULL\n) ENGINE=MyISAM DEFAULT CHARSET=latin1" - } - -``GET /dbs//tables//columns`` -============================================== - - Return result of SHOW COLUMNS statement for given table. - - Parameters: - * dbName: database name - * tblName: table name - - Response headers: - * Content-Type: ``application/json`` - - Status Codes: - * 200 - for successful return - * 400 - if parameters have invalid format - * 404 - if table does not exist - * 500 - for database errors - - Response body (for successful completion): - JSON object, "results" property is a list of column - objects with keys: name, type, key, default, null - - Request/response example:: - - GET /dbs/newDB/tables/newTable/columns HTTP/1.0 - - :: - - HTTP/1.0 200 OK - Content-Type: application/json - - { - "results": [ - { - "default": null, - "key": "", - "name": "I", - "null": "YES", - "type": "int(11)" - } - ] - } - -``GET /dbs//tables//chunks`` -============================================= - - Return the list of chunks in a table. For non-chunked table empty list - is returned. - - Parameters: - * dbName: database name - * tblName: table name - - Response headers: - * Content-Type: ``application/json`` - - Status Codes: - * 200 - for successful return - * 400 - if parameters have invalid format - * 404 - if table does not exist - * 500 - for database errors - - Response body (for successful completion): - JSON object, "results" property is a list of chunk objects with keys: - * chunkId: chunk number (integer) - * chunkTable: true if chunk has regular chunk - table (boolean) - * overlapTable: true if chunk has overlap - table (boolean) - * uri: URL for chunk operations - - Request/response example:: - - GET /dbs/qservTest_case01_qserv/tables/Object/chunks HTTP/1.0 - - :: - - HTTP/1.0 200 OK - Content-Type: application/json - - { - "results": [ - { - "chunkId": 7648, - "chunkTable": true, - "overlapTable": true, - "uri": "/dbs/qservTest_case01_qserv/tables/Object/chunks/7648" - }, - ... - ] - } - -``POST /dbs//tables//chunks`` -============================================== - - Create new chunk. - - Parameters: - * dbName: database name - * tblName: table name - - Request headers: - * Content-Type: required as ``multipart/form-data`` - - Form Parameters: - * chunkId: chunk ID, non-negative integer - * overlapFlag: if true then create overlap table too - (default is true), accepted values: '0', '1', 'yes', 'no', - 'false', 'true' - - Response headers: - * Content-Type: ``application/json`` - - Status Codes: - * 201 - if chunk tables were successfully created - * 400 - if parameters have invalid format or if form - parameters are missing or conflicting - * 404 - if table is missing - * 409 - if chunk table already exists - * 500 - if table is not defined in CSS or other - database errors - - Response body (for successful completion): - JSON object, "result" property is a chunk object with keys: - * chunkId: chunk number (integer) - * chunkTable: true if chunk has regular chunk - table (boolean) - * overlapTable: true if chunk has overlap - table (boolean) - * uri: URL for chunk operations - - Request/response example:: - - POST /dbs/newDB/tables/newTable/chunks HTTP/1.0 - Content-Type: multipart/form-data; boundary=------------------------df029da2ec8387ce - - --------------------------df029da2ec8387ce - Content-Disposition: form-data; name="chunkId" - - 1000 - --------------------------df029da2ec8387ce-- - - :: - - HTTP/1.0 201 CREATED - Content-Type: application/json - - { - "result": { - "chunkId": 1000, - "chunkTable": true, - "overlapTable": true, - "uri": "/dbs/newDB/tables/newTable/chunks/1000" - } - } - -``DELETE /dbs//tables//chunks/`` -========================================================== - - Delete chunk from a table, both chunk data and overlap data is dropped. - - Parameters: - * dbName: database name - * tblName: table name - * chunkId: chunk number, non-negative integer - - Response headers: - * Content-Type: ``application/json`` - - Status Codes: - * 200 - if table was successfully deleted - * 400 - if parameters have invalid format - * 404 - if table does not exist - * 500 - for other database errors - - Response body (for successful completion): - JSON object, "result" property is a chunk object with keys: - * chunkId: chunk number (integer) - * chunkTable: true if chunk has regular chunk - table (boolean) - * overlapTable: true if chunk has overlap - table (boolean) - * uri: URL for chunk operations - - Request/response example:: - - DELETE /dbs/newDB/tables/newTable/chunks/1000 HTTP/1.0 - - :: - - HTTP/1.0 200 OK - Content-Type: application/json - - { - "result": { - "chunkId": 1000, - "chunkTable": true, - "overlapTable": true, - "uri": "/dbs/newDB/tables/newTable/chunks/1000" - } - } - -``POST //tables//data`` -======================================== - - Upload data into a table using file format supported by mysql command - LOAD DATA [LOCAL] INFILE. - - Parameters: - * dbName: database name - * tblName: table name - - Request headers: - * Content-Type: required as ``multipart/form-data`` - - Form Parameters: - * table-data: the data come in original LOAD DATA - format with ``binary/octet-stream`` content type and binary - encoding, and it may be compressed with gzip. - * load-options: set of options encoded with usual - ``application/x-www-form-urlencoded`` content type, options are: - - delimiter - defaults to TAB - - enclose - defaults to empty string (strings are not enclosed) - - escape - defaults to backslash - - terminate - defaults to newline - - compressed - "0" or "1", by default is guessed from file extension (.gz) - - Response headers: - * Content-Type: ``application/json`` - - Status Codes: - * 201 - if chunk tables were successfully created - * 400 - if parameters have invalid format or if form - parameters are missing or conflicting - * 404 - if table is missing - * 409 - if chunk table already exists - * 500 - if table is not defined in CSS or other - database errors - - Response body (for successful completion): - JSON object, "result" property is an object with keys: - * status: string "OK" - * count: count of rows added to a table - - Request/response example:: - - POST /dbs/newDB/tables/newTable/data HTTP/1.0 - Content-Type: multipart/form-data; boundary=------------------------345ad77805210ac6 - - --------------------------345ad77805210ac6 - Content-Disposition: form-data; name="table-data"; filename="table.dat.gz" - Content-Type: application/octet-stream - - .....<.U..table.dat.3.2400.2.bS..;....... - - --------------------------345ad77805210ac6 - Content-Disposition: form-data; name="load-options" - - compressed=1&delimiter=%2C - --------------------------345ad77805210ac6-- - - :: - - HTTP/1.0 200 OK - Content-Type: application/json - - { - "result": { - "count": 4, - "status": "OK" - } - } - -``POST //tables//chunks//data`` -========================================================= - - Upload data into a chunk table using file format supported by mysql - command LOAD DATA [LOCAL] INFILE. - - This method works exactly as previous one taking the same form parameter - but it loads data into a chunk and has additional URL parameter specifying - chunk number. - -``POST //tables//chunks//overlap`` -============================================================ - - Upload data into overlap table using file format supported by mysql - command LOAD DATA [LOCAL] INFILE. - - This method works exactly as previous one taking the same form parameter - but it loads data into an overlap table and has additional URL parameter - specifying chunk number. - -``GET /dbs//tables//index`` -============================================ - - Return index data (array of (objectId, chunkId, subChunkId) triplets). - - Parameters: - * dbName: database name - * tblName: table name - * chunkId: chunk number (non-negative integer) - - Query Parameters: - * columns: specifies comma-separated list of three - column names. Default column names are "objectId", "chunkId", - "subChunkId". Result returns columns in the same order as they - are specified in 'columns' argument. - - Response headers: - * Content-Type: ``application/json`` - - Status Codes: - * 200 - for successful return - * 400 - if parameters have invalid format - * 404 - if table does not exist - * 500 - for other database errors - - Response body (for successful completion): - JSON object, "result" property is an object with keys: - * description: array of three objects - describing columns, each with keys "name" (column name) and - "type" (MySQL type name) - * rows: array of arrays of integers - - Request/response example:: - - GET /dbs/qservTest_case01_qserv/tables/Object/index HTTP/1.1 - - :: - - HTTP/1.0 200 OK - Content-Type: application/json - - { - "result": { - "description": [ - { - "name": "objectId", - "type": "LONGLONG" - }, - { - "name": "chunkId", - "type": "LONG" - }, - { - "name": "subChunkId", - "type": "LONG" - } - ], - "rows": [ - [ - 386937898687249, - 6630, - 897 - ], - [ - 386942193651348, - 6630, - 660 - ], - ... - ] - } - } - -``GET /dbs//tables//chunks//index`` -============================================================= - - Return index data (array of (objectId, chunkId, subChunkId) triplets) - for single chunk. - - Does the same as previous method but for one chunk from partitioned - table. Useful when index for whole table may be too big. - - Request/response example:: - - GET /dbs/qservTest_case01_qserv/tables/Object/chunks/7648/index HTTP/1.0 - - :: - - HTTP/1.0 200 OK - Content-Type: application/json - - { - "result": { - "description": [ - { - "name": "objectId", - "type": "LONGLONG" - }, - { - "name": "chunkId", - "type": "LONG" - }, - { - "name": "subChunkId", - "type": "LONG" - } - ], - "rows": [ - [ - 433306365599363, - 7648, - 5 - ], - [ - 433314955527561, - 7648, - 10 - ], - ... - ] - } - } - - -Xrootd API -********** - -This section contains description of actions related to xrootd operations - e.g. -publishing database via xrootd. - - -``GET /xrootd/dbs`` -=================== - - Return the list of databases known to xrootd. - - Response headers: - * Content-Type: ``application/json`` - - Status Codes: - * 200 - for success - * 500 - for other database errors - - Response body (for successful completion): - JSON object, "results" property is a list of database objects with keys: - * name: database name - * uri: URL for *xrootd* database operations - - Request/response example:: - - GET /xrootd/dbs HTTP/1.0 - - :: - - HTTP/1.0 200 OK - Content-Type: application/json - - { - "results": [ - { - "name": "qservTest_case01_qserv", - "uri": "/xrootd/dbs/qservTest_case01_qserv" - } - ] - } - -``POST /xrootd/dbs`` -==================== - - Register new database in xrootd chunk inventory. - - Request headers: - * Content-Type: required as ``multipart/form-data`` - - Form Parameters: - * db: database name (required) - * xrootdRestart: if set to 'no' then do not restart - xrootd (defaults to yes) - - Response headers: - * Content-Type: ``application/json`` - - Status Codes: - * 201 - if database was successfully registered - * 400 - if parameters are missing or have invalid - format - * 409 - if database is already registered - * 500 - on other database errors - - Response body (for successful completion): - JSON object, "results" property is a database object with keys: - * name: database name - * uri: URL for *xrootd* database operations - - Request/response example:: - - POST /xrootd/dbs HTTP/1.0 - Content-Type: multipart/form-data; boundary=------------------------370e6e4d60b7499e - - --------------------------370e6e4d60b7499e - Content-Disposition: form-data; name="db" - - newDB - --------------------------370e6e4d60b7499e - Content-Disposition: form-data; name="xrootdRestart" - - no - --------------------------370e6e4d60b7499e-- - - :: - - HTTP/1.0 200 OK - Content-Type: application/json - - { - "result": { - "name": "newDB", - "uri": "/xrootd/dbs/newDB" - } - } - -``DELETE /xrootd/dbs/`` -=============================== - - Unregister database from xrootd chunk inventory. - - Parameters: - * dbName: database name - - Query Parameters: - * xrootdRestart: if set to 'no' then do not restart - xrootd (defaults to yes) - - Response headers: - * Content-Type: ``application/json`` - - Status Codes: - * 200 - for success - * 400 - if parameters have invalid format - * 409 - if database is not registered - * 500 - for other database errors - - Response body (for successful completion): - JSON object, "results" property is a database object with keys: - * name: database name - * uri: URL for *xrootd* database operations - - Request/response example:: - - DELETE /xrootd/dbs/newDB?xrootdRestart=no HTTP/1.0 - - :: - - HTTP/1.0 200 OK - Content-Type: application/json - - { - "result": { - "name": "newDB", - "uri": "/xrootd/dbs/newDB" - } - } - -``GET /xrootd/dbs/`` -============================ - - Return the list of chunk IDs in a database as known to xrootd. - - .. note:: Not implemented yet. - - -Services API -************ - -This section contains description of actions related to operations on services - -e.g. stopping and starting processes. - - -``GET /services`` -================= - - Return the list of services. - - Response headers: - * Content-Type: ``application/json`` - - Status Codes: - * 200 - for success - - Response body (for successful completion): - JSON object, "results" property is a list of service objects with keys: - * name: service name - * uri: URL for service operations - - Request/response example:: - - GET /services HTTP/1.0 - - :: - - HTTP/1.0 200 OK - Content-Type: application/json - - { - "results": [ - { - "name": "xrootd", - "uri": "/services/xrootd" - }, - { - "name": "mysqld", - "uri": "/services/mysqld" - } - ] - } - -``GET /services/`` -=========================== - - Return service state. - - Parameters: - * service: service name - - Response headers: - * Content-Type: ``application/json`` - - Status Codes: - * 200 - for success - * 404 - for invalid service name - - Response body (for successful completion): - JSON object, "result" property is a service object with keys: - * name: service name - * state: one of "active" or "stopped" - * uri: URL for service operations - - Request/response example:: - - GET /services/mysqld HTTP/1.0 - - :: - - HTTP/1.0 200 OK - Content-Type: application/json - - { - "result": { - "name": "mysqld", - "state": "active", - "uri": "/services/mysqld" - } - } - -``PUT /services/`` -=========================== - - Execute some action on service, like "stop" or "restart". - - Parameters: - * service: service name - - Request headers: - * Content-Type: required as ``multipart/form-data`` - - Form Parameters: - * action: action: one of 'stop', 'start', 'restart' - (required) - - Response headers: - * Content-Type: ``application/json`` - - Status Codes: - * 200 - for success - * 400 - if parameters are missing or have invalid - format - * 409 - if action has failed - - Response body (for successful completion): - JSON object, "result" property is a service object with keys: - * name: service name - * state: state of service after action, one of - "active" or "stopped" - * uri: URL for service operations - - Request/response example:: - - PUT /services/mysqld HTTP/1.0 - Content-Type: multipart/form-data; boundary=------------------------48169e483bc7d12e - - --------------------------48169e483bc7d12e - Content-Disposition: form-data; name="action" - - restart - --------------------------48169e483bc7d12e-- - - :: - - HTTP/1.0 200 OK - Content-Type: application/json - - { - "result": { - "name": "mysqld", - "state": "active", - "uri": "/services/mysqld" - } - } diff --git a/doc/documenteer.toml b/doc/documenteer.toml index 7ae39c6f41..811b923f11 100644 --- a/doc/documenteer.toml +++ b/doc/documenteer.toml @@ -1,5 +1,5 @@ [project] title = "Qserv" -copyright = "2015-2023 Association of Universities for Research in Astronomy, Inc. (AURA)" +copyright = "2015-2024 Association of Universities for Research in Astronomy, Inc. (AURA)" base_url = "https://qserv.lsst.io" github_url = "https://github.com/lsst/qserv" diff --git a/doc/index.rst b/doc/index.rst index e0922133e7..aec51063d6 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -3,4 +3,5 @@ /intro/index /admin/index /user/index + /ingest/index /dev/index diff --git a/doc/ingest/api/advanced/async-concurrency.rst b/doc/ingest/api/advanced/async-concurrency.rst new file mode 100644 index 0000000000..ec9722e101 --- /dev/null +++ b/doc/ingest/api/advanced/async-concurrency.rst @@ -0,0 +1,75 @@ +.. _ingest-api-advanced-concurrency: + +Concurrency control when processing async requests +-------------------------------------------------- + +.. note:: + + This optional mechanism is designed specifically for handling contribution requests submitted asynchronously by reference. + Workflows using the synchronous interface should implement their own request load balancing strategies. + +The current implementation of the worker request processor for *asynchronously* submitted contribution requests +(:ref:`ingest-worker-contrib-by-ref`) follows a straightforward model: + +- Incoming requests are managed by a single input queue. +- Requests are queued based on their creation timestamp. +- At server startup, a fixed-size pool of processing threads is initialized. +- The pool size is configured by the worker's parameter ``(worker,num-async-loader-processing-threads)``, which can be set + at startup using the command line option ``--worker-num-async-loader-processing-threads=``. By default, this value + is twice the number of hardware threads on the worker host. +- Worker threads process requests sequentially from the queue's head. + +This model can cause issues in some deployments where resource availability is limited, such as: + +- Remote data sources (e.g., HTTP servers, object stores) may become overloaded if the total number of parallel requests from all + workers exceeds the service capacity. For instance, disk I/O performance may degrade when services read too many files simultaneously. +- The performance of locally mounted distributed filesystems at workers may degrade if there are too many simultaneous file + reads, especially when input data is located on such filesystems. +- Ongoing ingest activities can significantly degrade Qserv performance for user queries due to resource contention (memory, disk I/O, network I/O, CPU). +- The timing of ingests can be problematic. For instance, massive ingests might be scheduled at night, while less intensive + activities occur during the day when user activity is higher. + +Adjusting the number of processing threads in the service configuration is not an optimal solution because it requires restarting +all worker servers (or the entire Qserv in Kubernetes-based deployments) whenever the ingest workflow needs to manage resource usage. +Additionally, the constraints can vary based on the specific context in both "space" (ingesting particular databases from specific sources) +and "time" (when Qserv is under heavy load from user queries). + +To mitigate these issues, the API provides a feature to control the concurrency level of processed requests. Limits can be configured +at the database level. Workflows can query or set these limits using the existing REST services, as detailed in the following section: + +- :ref:`ingest-config` (REST) + +Here is an example of how to configure all workers to limit concurrency to a maximum of 4 requests per worker for +the database ``test101``: + +.. code-block:: bash + + curl http://localhost:25081/ingest/config \ + -X PUT -H 'Content-Type: application/json' \ + -d'{"database":"test101","ASYNC_PROC_LIMIT":4,"auth_key":""}' + +Specifying a value of ``0`` will remove the concurrency limit, causing the system to revert to using the default number of processing threads. + +Workflows can modify the limit at any time, and changes will take effect immediately. However, the new limit will only +apply to requests that are pulled from the queue after the change. Existing requests in progress will not be interrupted, +even if the limit is reduced. + +The following example demonstrates how to use the related service to retrieve the current concurrency limit for a specific database: + +.. code-block:: bash + + curl 'http://localhost:25081/ingest/config?database=test101' -X GET + +This would return: + +.. code-block:: json + + { "config": { + "ASYNC_PROC_LIMIT": 4, + "database": "test101" + }, + "error": "", + "error_ext": {}, + "success": 1, + "warning": "No version number was provided in the request's query." + } diff --git a/doc/ingest/api/advanced/charset.rst b/doc/ingest/api/advanced/charset.rst new file mode 100644 index 0000000000..f0dacccef7 --- /dev/null +++ b/doc/ingest/api/advanced/charset.rst @@ -0,0 +1,93 @@ +.. _ingest-api-advanced-charset: + +Character sets in contributions +------------------------------- + +.. note:: + + This feature was added in the REST API version ``15``. + +Background +^^^^^^^^^^ + +The current implementation of the Qserv Replication/Ingest system relies on the following SQL statement for ingesting +table data: + +.. code-block:: sql + + LOAD DATA [LOCAL] INFILE ... + +According to the MySQL/MariaDB documentation https://mariadb.com/kb/en/load-data-infile/#character-sets), the database +server may interpret or transform the input data (CSV) differently depending on the character set assumed by the operation. +Incorrect data transformation can result in distorted data being stored in the target table. This issue is most likely +to occur when the input data were produced from another MySQL server using the following SQL statement: + +.. code-block:: sql + + SELECT INTO OUTFILE ... + +The right approach to address this situation is twofold: + +- Know (or configure) a specific character set when producing the data files (CSV). +- Use the same character set when loading these files into Qserv. + +Before version ``15`` of the API, the Qserv Ingest System did not provide any control for the latter. The system relied on +the default character set in the database service configuration. This could lead to the following problems: + +- The character set configured in this way may be random, as it may be set either by a database administrator who might not + be aware of the problem (or the origin and parameters of the input data to be loaded into Qserv). Besides, the default + character set may change between MySQL/MariaDB versions, or it could depend on the choice of the OS (Debian, CentOS, etc.) + for the base Docker image. + +- Different input data may be produced with different character sets. In this case, setting one globally at the database + level (even if this could be done deterministically) wouldn't work for all inputs. + +As of version ``15``: + +- The implementation is reinforced to assume a specific default character set for the data loading operation. The default + is presently set to ``latin1``. +- The ingest API is extended to allow overriding the default character set when loading contributions into Qserv. + +Global configuration +^^^^^^^^^^^^^^^^^^^^ + +.. warning:: + + Setting the server-side configuration parameters of the Ingest system is not supposed to be under the direct control of + the workflow developers. Managing Qserv deployments and the configuration of the Ingest system is the responsibility of + the Qserv administrators. Therefore, the workflow developers are advised to set the name of the desired character set in + each contribution request as explained in the subsections below. + +The configuration of the workers now includes the following parameter ``(worker,ingest-charset-name)``. The parameter can +be set at the server startup via the command line option ``--worker-ingest-charset-name=``. The default value is +``latin1``. + +In the REST API +^^^^^^^^^^^^^^^ + +Overriding the default character set value is supported by all forms of contribution ingest services, whether contributions +are submitted *by reference* or *by value*, and whether they are *synchronous* or *asynchronous* requests. + +The desired character set value is specified via the ``charset_name`` parameter. This parameter should be a string representing +the name of the character set. It is optional; if not provided, the Ingest system will use its default character set value. + +All services that return the status of contribution requests will include the character set name used by the Ingest system when +processing the contributions. This information is reported in the JSON response object as: + +.. code-block:: + + { "charset_name": + } + + +qserv-replica-file +^^^^^^^^^^^^^^^^^^ + +The command line tool :ref:`ingest-tools-qserv-replica-file` allows ingesting contributions via the proprietary binary protocol +and has an option ``--charset-name=``: + +.. code-block:: bash + + qserv-replica-file INGEST {FILE|FILE-LIST|FILE-LIST-TRANS} \ + ... \ + --charset-name= diff --git a/doc/ingest/api/advanced/config.rst b/doc/ingest/api/advanced/config.rst new file mode 100644 index 0000000000..dbccf73099 --- /dev/null +++ b/doc/ingest/api/advanced/config.rst @@ -0,0 +1,105 @@ +.. _ingest-api-advanced-global-config: + +Global configuration options +---------------------------- + +This section presents the configuration parameters of Qserv and the Replication/Ingest system which may +affect the ingest activities. This section provides instructions for finding values of the parameters +via the API, explains roles of the parameters, and outlines possble usage of the parameters by the workflow. + +The number of workers +^^^^^^^^^^^^^^^^^^^^^ + +The total number of Qserv workers is the main factor contributing to the performance of the catalog ingest operations. +The number can be obtained using the following REST service: + +- :ref:`ingest-config-global-workers` (REST) + +The workflow needs to analyze a section ``config.workers`` to select workers in the following state (both apply): + +- ``is-enabled=1`` +- ``is-read-only=0`` + +There are a few possibilities how the workflow could use this information. For example, the workflow +could start a separate transaction (or a set of transactions) per worker. + +Worker-specific parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The second group of parameters found in the section ``config.general.worker`` is related to resources which +are available to the individual worker ingest services for processing contributions. These are instructions +for some of the most relevant parameters: + +- ``num-loader-processing-threads``: + + The parameter affects a flow of ingest requests made via the proprietary binary protocol using the command-line + tool :ref:`ingest-tools-qserv-replica-file`. To achieve the maximum throughput of the ingest the workflows + should aim at having each participated worker loaded with as many parallel requests as there are threads + reported by this parameter. + + .. warning:: + + Exceeding the number of threads will result in having clients to wait for connections to be established + with the workers. In some cases this may lead to the performance degradation if the network connection + is unstable. + +- ``num-http-loader-processing-threads``: + + The parameter affects a flow of ingest requests submitted via the HTTP-based ingest service. Note that + this service is used for processing *synchronous* contribution requests and for submitting the *asynchronous* + requests to the service. + + The workflow may use a value of the parameter differently, depenidng on a type of the contribution request. + Requests which are *synchronous* should be submitted to the service in a way that the number of such requests + per worker was close to the number of threads reported by this parameter. In this case the workflow should + expect the maximum throughput of the ingest. The *asynchronous* requests aren't affected by the parameter, + unless another workflow is using the service in the *synchronous* mode at the same time. + +- ``num-async-loader-processing-threads``: + + The parameter represents the number of the request processing threads in a thread pool allocated for + the *asynchronous* contribution requests. The workflow should aim at having the number of unfinished + *asynchronous* requests submitted to the service close to (or exceeding) the number of threads reported + by this parameter. To do so, the workflow should monitor the number and the status of the *asynchronous* + requests at each worker and submit new requests to the service when the number of the requests being processed + is less than the number of threads. The relevant services for monitoring the contribution requests at workers + are documented in: + + - :ref:`ingest-worker-contrib-get` (WORKER) + + .. note:: + + An alternative approach is to submit all *asynchronous* requests to the relevant worker services at once. + The services will take care of processing the requests in the same order they were submitted. This approach + may not work well where a specific order of the requests is important, or if all input data is not available + at the time of the submission. + +- ``ingest-charset-name``: + + The name of a character set for parsing the payload of the contributions. The workflow may override the default + value of the parameter if the payload of the contributions is encoded in a different character set. See an + attrubute ``charset_name`` in: + + - :ref:`ingest-worker-contrib-by-ref` (WORKER) + - :ref:`ingest-worker-contrib-by-val` (WORKER) + +- ``ingest-num-retries``, ``ingest-max-retries``: + + These parameters are related to the number of the automatic retries of the failed *asynchronous* requests + specific in the parameter ``num_retries`` of the contribution request. The workflow may adjust the number + of such retries if needed. A good example is when the workflow knows that a connection to the data source + (a Web server or the object store) is unstable, or if the server might be overloaded. The workflow may increase + the number of retries to ensure that the data is ingested successfully. + + .. note:: + + The parameter ``ingest-max-retries`` is a hard limit for the number of retries regardless of what's + specified in the request's attribute ``num_retries``. + +- ``loader-max-warnings``: + + This parameter sets the default number for the number of warnings that the worker ingest service can + capture from MySQL after attempting to ingest a contribution. The workflow may adjust the parameter + for individual contributions by setting the desired limit in the request's attribute ``max_warnings``. + The main purpose for setting the limit higher than the default value is to debug problem with the + data of the contributions. diff --git a/doc/ingest/api/advanced/contributions.rst b/doc/ingest/api/advanced/contributions.rst new file mode 100644 index 0000000000..21fad852f2 --- /dev/null +++ b/doc/ingest/api/advanced/contributions.rst @@ -0,0 +1,51 @@ +.. _ingest-api-advanced-contributions: + +Options for making contribution requests +---------------------------------------- + +The API provides a variety of options for making contribution requests. The choice of the most suitable method depends on +the specific needs of the client application. The following list outlines the available ingest modes: + +- **pull**: Tell the ingest service to pull the data from the Web server: + + - :ref:`ingest-worker-contrib-by-ref` (WORKER) + +- **read**: Tell the ingest service to read the data directly from the locally mounted filesystem that is accessible + to the worker: + + - :ref:`ingest-worker-contrib-by-ref` (WORKER) + +- **push**: Send the data over the proprietary binary protocol or ``http`` protocol to the ingest service: + + - :ref:`ingest-tools-qserv-replica-file` (TOOLS) + - :ref:`ingest-worker-contrib-by-val` (WORKER) + + The workflow can either read the data from the local filesystem or access the data directly from memory. + +All methods support the ``CSV`` data format. Additionally, the **push** mode over the ``http`` protocol also supports +the ``JSON`` format. For more details, refer to the documentation of the respective service. + +The **pull** and **read** modes also support both *synchronous* and *asynchronous* data ingestion approaches. + +The following diagrams illustrate the three modes of making contribution requests: + +Pulling data from the Web server +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. image:: /_static/ingest-options-pull.png + :target: ../../../_images/ingest-options-pull.png + :alt: Pull Mode + +Reading data from the local filesystem of the worker +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. image:: /_static/ingest-options-read.png + :target: ../../../_images/ingest-options-read.png + :alt: Read Mode + +Pushing data from the workflow to the service +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. image:: /_static/ingest-options-push.png + :target: ../../../_images/ingest-options-push.png + :alt: Read Mode diff --git a/doc/ingest/api/advanced/directors.rst b/doc/ingest/api/advanced/directors.rst new file mode 100644 index 0000000000..0e0efc82bc --- /dev/null +++ b/doc/ingest/api/advanced/directors.rst @@ -0,0 +1,162 @@ + +.. _ingest-api-advanced-directors: + +Databases with many director tables +=================================== + +.. tip:: + + See the following document first: + + - :ref:`ingest-api-concepts-table-types` (CONCEPTS) + +The API supports ingesting multiple *director* tables within a single catalog. Each *director* table can optionally have its +own set of *dependent* tables. This section demonstrates the necessary configuration for the following table set: + +.. table:: + + +----------+-----------+ + | director | dependent | + +==========+===========+ + | dir_1 | dep_1_1 | + | +-----------+ + | | dep_1_2 | + | +-----------+ + | | dep_1_3 | + +----------+-----------+ + | dir_2 | dep_2_1 | + | +-----------+ + | | dep_2_2 | + +----------+-----------+ + | dir_3 | | + +----------+-----------+ + +In this example, there are 3 *director* tables. Each (except the third one ``dir_3``) has its own set of *dependent* tables. +The key attributes that govern dependencies between the tables are specified in the section :ref:`ingest-db-table-management-register-table` +(REST). The document mentions the following required attributes that need to be provided in the JSON specification of +each table: + +.. table:: + + +--------------------+----------+-----------------------------------------------------------------------------------------------------+ + | attribute | value | comment | + +====================+==========+=====================================================================================================+ + | ``is_partitioned`` | ``1`` | Same value for both *director* and *dependent* tables. | + +--------------------+----------+-----------------------------------------------------------------------------------------------------+ + | ``director_table`` | *string* | Where: | + | | | | + | | | - *director* tables should have the empty string here. | + | | | - *dependent* tables should have the name of the corresponding *director* table here. | + +--------------------+----------+-----------------------------------------------------------------------------------------------------+ + | ``director_key`` | *string* | The non-empty string specifying the name of the corresponding column must be | + | | | provided here. Depending on the type of the table, this name corresponds to either: | + | | | | + | | | - The *primary key* in the *director* table, or | + | | | - The *foreign key* pointing to the corresponding director's primary key in the *dependent* tables. | + +--------------------+----------+-----------------------------------------------------------------------------------------------------+ + +The *director* tables are **required** to have the following attributes: + +.. table:: + + +-------------------+----------+---------------------------------------------------------------------------+ + | attribute | value | comment | + +===================+==========+===========================================================================+ + | ``latitude_key`` | *string* | The names of the director table's columns that were used for partitioning | + | ``longitude_key`` | | the table data into chunks. | + +-------------------+----------+---------------------------------------------------------------------------+ + +The *dependent* tables may also include the attributes ``latitude_key`` and ``longitude_key`` if their input data was partitioned using the columns specified +by these attributes. If not, these attributes can be omitted from the table's JSON specification. + +The following table illustrates how JSON configurations for all the above-mentioned tables might look like +(the examples were simplified for clarity): + +.. table:: + + +-----------------------------------+-------------------------------------------+ + | director | dependents | + +===================================+===========================================+ + | .. code-block:: json | .. code-block:: json | + | | | + | { "table" : "dir_1", | { "table" : "dep_1_1", | + | "is_partitioned" : 1, | "is_partitioned" : 1, | + | "director_table" : "", | "director_table" : "dir_1", | + | "director_key" : "objectId", | "director_key" : "dep_objectId" | + | "latitude_key" : "ra", | } | + | "longitude_key" : "dec" | | + | } | **Note**: Attributes ``latitude_key`` and | + | | ``longitude_key`` were not provided. | + | | is allowed for the dependent tables. | + | | | + | | .. code-block:: json | + | | | + | | { "table" : "dep_1_2", | + | | "is_partitioned" : 1, | + | | "director_table" : "dir_1", | + | | "director_key" : "dep_objectId" | + | | "latitude_key" : "", | + | | "longitude_key" : "" | + | | } | + | | | + | | **Note**: Attributes ``latitude_key`` and | + | | ``longitude_key`` were provided. However | + | | the values were empty strings, which is | + | | allowed for the dependent tables. | + | | | + | | .. code-block:: json | + | | | + | | { "table" : "dep_1_3", | + | | "is_partitioned" : 1, | + | | "director_table" : "dir_1", | + | | "director_key" : "dep_objectId" | + | | "latitude_key" : "dep_ra", | + | | "longitude_key" : "dep_dec" | + | | } | + +-----------------------------------+-------------------------------------------+ + | .. code-block:: json | .. code-block:: json | + | | | + | { "table" : "dir_2", | { "table" : "dep_2_1", | + | "is_partitioned" : 1, | "is_partitioned" : 1, | + | "director_table" : "", | "director_table" : "dir_2", | + | "director_key" : "id", | "director_key" : "dep_id" | + | "latitude_key" : "coord_ra", | } | + | "longitude_key" : "coord_dec" | | + | } | .. code-block:: json | + | | | + | | { "table" : "dep_2_1", | + | | "is_partitioned" : 1, | + | | "director_table" : "dir_2", | + | | "director_key" : "dep_id" | + | | "latitude_key" : "dep_coord_ra", | + | | "longitude_key" : "dep_coord_dec" | + | | } | + +-----------------------------------+-------------------------------------------+ + | .. code-block:: json | No dependents for the *director* table | + | | | + | { "table" : "dir_3", | | + | "is_partitioned" : 1, | | + | "director_table" : "", | | + | "director_key" : "objectId", | | + | "latitude_key" : "ra", | | + | "longitude_key" : "dec" | | + | } | | + +-----------------------------------+-------------------------------------------+ + +.. note:: + + The attributes ``chunk_id_key`` and ``sub_chunk_id_key`` were required in older versions of the API and may still + be present in JSON configurations. However, they are no longer needed for registering tables during ingest. + The role-to-column mapping for these attributes is now predefined in the Ingest system implementation. + The mapping is presented below: + + +----------------------+----------------+ + | role | column | + +======================+================+ + | ``chunk_id_key`` | ``chunkId`` | + +----------------------+----------------+ + | ``sub_chunk_id_key`` | ``subChunkId`` | + +----------------------+----------------+ + + If any of these attributes are found in a configuration, their definitions will be ignored. + diff --git a/doc/ingest/api/advanced/index.rst b/doc/ingest/api/advanced/index.rst new file mode 100644 index 0000000000..fca32c2e3d --- /dev/null +++ b/doc/ingest/api/advanced/index.rst @@ -0,0 +1,26 @@ + +.. _ingest-api-advanced: + +================== +Advanced Scenarios +================== + +.. hint:: + + Read the following document first: + + - :ref:`ingest-api-concepts` (CONCEPTS) + +.. toctree:: + :maxdepth: 4 + + config + charset + async-concurrency + unpublishing + transactions + optimisations + contributions + directors + ref-match + warnings diff --git a/doc/ingest/api/advanced/optimisations.rst b/doc/ingest/api/advanced/optimisations.rst new file mode 100644 index 0000000000..b803546e91 --- /dev/null +++ b/doc/ingest/api/advanced/optimisations.rst @@ -0,0 +1,59 @@ + +.. _ingest-api-advanced-optimisations: + +Optimizations in using the REST services +======================================== + +When designing a workflow, it is crucial to avoid overloading the REST services with repeated or inefficient requests. +Whenever possible, make certain requests once and reuse their results. This is particularly important for workflows +designed for parallel ingests, where the results of some requests can be shared among parallel +activities (processes, etc.) within the workflows. + +While this document does not cover all possible optimizations for interacting with the services, it is +the responsibility of the workflow developer to determine what can be cached or shared based on +the progressive state of the ingested catalog and the organization of the workflow +Below are some of the most useful techniques. + +.. _ingest-api-advanced-optimisations-batch: + +Batch mode for allocating chunks +-------------------------------- + +.. note:: + + This optimization is feasible when all chunk numbers are known upfront. + A common scenario is when the workflow is ingesting a large dataset that has already been + *partitioned* into chunks. In such cases, the chunk numbers are known before the ingestion begins. + +In the example of the :ref:`ingest-api-simple` presented earlier, chunk allocations were made on a per-chunk basis +(:ref:`table-location-chunks-one`). While this method works well for scenarios with a small number of chunks, it may +slow down the performance of workflows ingesting large numbers of chunks or making numerous requests to the chunk +allocation service. This is because chunk allocation operations can be expensive, especially in a Qserv setup with +many pre-deployed chunks. In such cases, chunk allocation requests may take a significant amount of time. +To address this issue, the system provides a service for allocating batches of chunks, as explained in: + +- :ref:`table-location-chunks-many` (REST) + +In the context of the earlier presented example of a simple workflow the chunk allocation request object would +look like this: + +.. code-block:: json + + { "transaction_id" : 123, + "chunks" : [ 187107, 187108, 187109, 187110 ] + } + +The result could be reported as: + +.. code-block:: json + + { "location":[ + { "chunk":187107, "worker":"db01", "host":"qserv-db01", "port":25002 }, + { "chunk":187108, "worker":"db02", "host":"qserv-db02", "port":25002 }, + { "chunk":187109, "worker":"db01", "host":"qserv-db01", "port":25002 }, + { "chunk":187110, "worker":"db02", "host":"qserv-db02", "port":25002 } + ] + } + +The request can be made once, and its results can be distributed among parallel activities within the workflow +to ingest the corresponding chunk contributions. diff --git a/doc/ingest/api/advanced/ref-match.rst b/doc/ingest/api/advanced/ref-match.rst new file mode 100644 index 0000000000..b5f5951e57 --- /dev/null +++ b/doc/ingest/api/advanced/ref-match.rst @@ -0,0 +1,94 @@ +.. _ingest-api-advanced-refmatch: + +Ingesting ref-match tables +========================== + +.. tip:: + + See the following document first: + + - :ref:`ingest-api-concepts-table-types` (CONCEPTS) + +.. note:: + + The input data for *ref-match* tables must be partitioned differently than other subtypes of *partitioned* tables. + Detailed instructions on this topic can be found in the section: + + - :ref:`ingest-data-partitioning-ref-match` (DATA) + +The *ref-match* tables are a specialized class of *partitioned* tables that depend on (match rows of) two *director* tables. +These referenced *director* tables can be located within the same catalog as the *ref-match* table or in any other catalog +served by the same Qserv instance. The only additional requirement in the latter case is that all databases must belong to +the same database *family* (partitioned using the same values for the parameters ``stripes``, ``sub-stripes``, and ``overlap``). +This requirement is enforced by the table registration service of the Replication/Ingest system. From the system's perspective, +these tables are not different from any other *partitioned* tables. The only changes made to the table registration interface +to specifically support *ref-match* tables are redefining (extending) the syntax of the attribute ``director_table`` and adding +four optional attributes allowed in the JSON configurations of the tables as presented below: + +``director_table`` : *string* + A table referenced here must be the **first** *director* table that must be registered in Qserv before the *ref-match* table. + The table registration service will refuse the operation if the *director* doesn't exist. The table name may also include + the name of a database where the table is located if this database differs from the one where the *ref-match* itself + will be placed. The syntax of the parameter's value: + + .. code-block:: + + [.] + + Note that the name cannot be empty, and the database (if specified) or table names should not be enclosed in quotes. + + If the database name is provided, the database should already be known to the Replication/Ingest system. + +``director_key`` : *string* + A non-empty string specifying the name of the primary key column of the referenced *director* table must be provided here. + This column should also be present in the table schema. + +``director_table2`` : *string* + This is the **second** *director* table referenced by the *ref-match* table. The values for this attribute must adhere to the same + requirements and restrictions as those specified for the ``director_table`` attribute. + +``director_key2`` : *string* + A non-empty string specifying the name of the primary key column of the **second** referenced *director* table must be provided here. + This column should also be present in the table schema. Note that the name should be different from the one specified in + the ``director_key`` attribute. + +``flag`` : *string* + The name of a column that stores flags created by the special partitioning tool ``sph-partition-matches``. This column should + also be present in the table schema. Usually, the column has the SQL type ``UNSIGNED INT``. + +``ang_sep`` : *double* + The maximum angular separation (within the spatial coordinate system) between the matched objects. The value of this parameter + must be strictly greater than ``0`` and must not exceed the *overlap* value of the database *family*. The table registration service + will enforce this requirement and refuse to register the table if the condition is violated. + +.. note:: + + Spatial coordinate columns ``latitude_key`` and ``longitude_key`` are ignored for this class of tables. + +Here is an example of the JSON configuration for a *ref-match* table: + +.. code-block:: json + + { "database" : "Catalog-A", + "table" : "RefMatch_A_Object_B_DeepSource", + "is_partitioned" : 1, + "director_table" : "Object", + "director_key" : "objectId", + "director_table2" : "Catalog-B.DeepSource", + "director_key2" : "deepSourceId", + "flag" : "flags", + "ang_sep" : 0.01667, + "schema": [ + {"name" : "objectId", "type" : "BIGINT UNSIGNED"}, + {"name" : "deepSourceId", "type" : "BIGINT UNSIGNED"}, + {"name" : "flag", "type" : "INT UNSIGNED"}, + {"name" : "chunkId", "type" : "INT UNSIGNED"}, + {"name" : "subChunkId", "type" : "INT UNSIGNED"} + ], + "auth_key" : "" + } + +The configuration parameters of the *ref-match* tables can also be seen in the responses of the following REST services: + +- :ref:`ingest-db-table-management-register-table` (REST) +- :ref:`ingest-db-table-management-config` (REST) diff --git a/doc/ingest/api/advanced/transactions.rst b/doc/ingest/api/advanced/transactions.rst new file mode 100644 index 0000000000..07291839c5 --- /dev/null +++ b/doc/ingest/api/advanced/transactions.rst @@ -0,0 +1,277 @@ + +.. _ingest-api-advanced-transactions: + +Transaction management +====================== + +This document presents several advanced recipes related to transaction management in the Ingest API. +Please read the following document first: + +- :ref:`ingest-api-concepts-transactions` (CONCEPTS) + +.. _ingest-api-advanced-transactions-multiple: + +Planning multiple transactions +------------------------------ + +To improve workflow stability, particularly during failures, the system supports distributed transactions. +This method is essential for ensuring stable ingests. Transactions were initially discussed in the section +:ref:`ingest-api-simple`. This section further explores the advantages of this method by detailing the planning +and management of parallel transactions. + +All rows are ingested into the data tables within the scope of transactions. Once a transaction is committed, +all relevant contributions remain in the destination tables. Conversely, if the transaction is aborted, +the rows are removed. The transaction *abort* operation (:ref:`ingest-trans-management-end`) won't revert all +modifications made to tables. It will only remove rows ingested within the corresponding transaction. +For instance, any tables created during transactions will stay in Qserv. Any chunk allocations made during +transactions will also stay. Leaving some tables empty after this operation won't confuse Qserv even if +the tables remain empty after publishing the database. + +When designing a workflow for a specific catalog or a general-purpose workflow, it is crucial to consider potential +failures during ingests. Estimating the likelihood of encountering issues can guide the decision-making process +for planning the number and size of transactions to be started by the workflow. Here are some general guidelines: + +- If the probability of failures is low, it is advisable to divide the input dataset into larger portions + and ingest each portion in a separate transaction. +- Conversely, if the probability of failures is high, using smaller transactions may be more appropriate. + +Another approach is to create a self-adjusting workflow that dynamically decides on transaction sizes based +on feedback from previous transactions. For instance, the workflow could begin with several small transactions +as probes and then progressively increase or decrease the number of contributions per transaction based on the results. +This technique has the potential to enhance workflow performance. + +Other factors influencing the transaction planning process include: + +- **Availability of input data**: Contributions to the catalogs may arrive incrementally over an extended period. +- **Temporary disk space limitations**: The space for storing intermediate products (partitioned CSV files) may be restricted. +- **Qserv configuration**: The number of worker nodes in the Qserv setup can impact the workflow design. + +What is a resonable number of transactions per catalog ingest? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When planning ingest activities, consider the following global limits: + +- The total number of transactions per Qserv instance is capped by an unsigned 32-bit number. + The transaction identifier ``0`` is reserved by the Ingest System, so the maximum number of + transactions is ``4294967295``. +- The total number of transactions per table is limited to ``8192`` due to the MySQL partition + limit. Practically, opening more than ``100`` transactions per database is not advisable because + of the overheads associated with MySQL partitioning. + +Another factor to consider is the implementation of transactions. The Ingest system directly maps transactions +to MySQL table partitions. Each partition is represented by two files in the filesystem of the worker where +the corresponding table resides (in the current implementation of Qserv, the data tables use the ``MyISAM`` storage engine): + +- ``#p.MYD``: The data file of the MySQL partition. +- ``#p.MYI``: The index file of the MySQL partition. + +In the extreme case, the number of files representing chunked tables would be roughly equal to the total number of +chunks multiplied by the number of transactions open per catalog. For example, if there are ``150,000`` chunks in +a catalog and ``10`` transactions are open during the catalog ingest, the total number of files spread across +all workers could be as many as ``3,000,000``. If the number of workers is ``30``, then there would be +approximately ``100,000`` files per worker's filesystem, all in a single folder. + +In reality, the situation may not be as severe because the chunks-to-transactions "matrix" would be rather sparse, +and the actual number of files per directory could be about ``10`` times smaller. Additionally, all MySQL table partitions will +be eliminated during the catalog *publishing* phase. After that, each table will be represented +with the usual three files: + +- ``.frm``: The table definition file. +- ``.MYD``: The data file. +- ``.MYI``: The index file. + +Nevertheless, it is advisable to avoid opening thousands of transactions per catalog ingest, even though the *hard* +limit for MySQL partitions per table might seem quite high at ``8192``. + +.. _ingest-api-advanced-transactions-parallel: + +Parallel transactions +--------------------- + +This section covers some parallel ingest scenarios that may increase the overall performance of a workflow. + +Ingesting chunks in parallel within a single transaction +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This is the simplest scenario that assumes the following organization of the workflow: + +#. **Sequential**: Start a common transaction before uploading the first chunk. +#. **Parallel**: For each chunk: + + #. **Sequential**: Allocate a chunk + #. **Sequential**: Ingest contributions into each chunk. + +#. **Sequential**: Commit the common transaction after all contributions are successfully uploaded. + +The following diagram illustrates the idea: + +.. image:: /_static/ingest-trans-multiple-one.png + :target: ../../../_images/ingest-trans-multiple-one.png + :alt: One Transaction + +Things to consider: + +- The chunk allocation operations are serialized in the current version of the system. This may introduce + indirect synchronization between parallel chunk-specific ingests. The total latency incurred by such synchronization + is the latency of allocating one chunk multiplied by the number of chunks. +- The proposed scheme may not be very efficient if the number of chunks is large (heuristically, many thousands) + while chunk contributions are small. In this case, the latency of the chunk allocation requests may become a significant + factor limiting the performance of the workflow. +- Any failure to ingest a contribution will result in aborting the entire transaction. This can significantly + impact the workflow's performance, especially if the amount of data to be ingested is large. + impact the workflow's performance, especially if the amount of data to be ingested is large. + +Best use: + +- When the number of chunks is small and the amount of data to be ingested into each chunk is large, or + if the amount of data or the number of contributions to be ingested into each chunk is large. In this case + negative effects of the chunk allocation latency are negligible. + +Ingesting chunks in parallel within dedicated transactions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This is a more complex scenario that assumes the following organization of the workflow: + +- **Parallel**: For each chunk do the following: + + #. **Sequential**: Start a separate transaction dedicated for ingesting all contributions of the chunk. + #. **Sequential**: Allocate the chunk and ingest all contributions into the chunk. + #. **Sequential**: Commit the transaction after all contributions into the chunk are successfully uploaded. + +The following diagram illustrates the idea: + +.. image:: /_static/ingest-trans-multiple-chunks.png + :target: ../../../_images/ingest-trans-multiple-chunks.png + :alt: Per-chunk Transaction + +Things to consider: + +- Although this scheme assigns each chunk to a dedicated transaction, it is not strictly necessary. + The Ingest system allows allocating the same chunk and ingesting contributions into that chunk from any (or multiple) transactions. + Just ensure that the same set of rows (the same set of contributions) is not ingested within more than one transaction. + This rule applies to any workflow regardless. +- Failures in one chunk transaction will not affect chunk contributions made in the scope of other transactions. + This is a significant advantage of this scheme compared to the previous one. + +Best use: + +- When ingesting a large dataset, it can be divided into independently ingested groups based on chunks. + Transactions offer a mechanism to handle failures effectively. + + +Scattered ingest of chunk contributions within multiple transactions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Workflow organization: + +- **Parallel**: For each transaction do the following: + + #. **Sequential**: Start a transaction dedicated for ingesting a subset of contributions of any chunks that + may be related to cteh contributions of teh subset. + #. **Sequential**: For each contribution in the subset: + + #. **Sequential**: Allocate a chunk as needed for the contribution. + #. **Sequential**: Ingest the contributions into the chunk. + + #. **Sequential**: Commit the transaction after ingesting all contributions in the subset. + +The following diagram illustrates the idea: + +.. image:: /_static/ingest-trans-multiple-scattered.png + :target: ../../../_images/ingest-trans-multiple-scattered.png + :alt: Scattered Transactions + +Best use: + +- When the workflow is designed to ingest a large dataset where data are streamed into the workflow. + This scenario is particularly useful when the data are not available in a single file or when the data + are generated on-the-fly by some external process. + +.. tip:: + + One can combine the above scenarios to create a more complex workflow that meets the specific requirements + of the ingest process. + +.. _ingest-api-advanced-transactions-abort: + +Aborting transactions +---------------------- + +The concept of distributed transactions was introduced in the section :ref:`ingest-api-concepts-transactions`. Transactions +are a fundamental mechanism for ensuring the consistency of the ingest process. The system allows aborting transactions +to revert the effects of all contributions made to the catalogs within the scope of the transaction. This operation is particularly useful +when the ingest process encounters an issue that cannot be resolved by the system automatically, or when the failure leaves +the data or metadata tables in an inconsistent state. Transactions are aborted using the following service: + +- :ref:`ingest-trans-management-end` (REST) + +Reasons to abort +^^^^^^^^^^^^^^^^ + +There are two primary reasons for aborting a transaction, detailed in the subsections below. + +Communication Failures +~~~~~~~~~~~~~~~~~~~~~~ + +If any communication problem occurs between the workflow and the system during a contribution request, the workflow **must** unconditionally +abort the corresponding transaction. Such problems create uncertainty, making it impossible to determine if any actual changes were made to +the destination tables. + +This rule applies universally, regardless of the method used for making the contribution request (by reference, by value, synchronous, asynchronous, etc.). + +Ingest System Failures +~~~~~~~~~~~~~~~~~~~~~~ + +Unlike the previously explained scenario, this scenario assumes that the workflow can track the status of attempted contribution requests. +The status information is reported by the ingest system. The workflow can detect a failure in the response object and decide to abort +the transaction. However, the analysis of the failure is done slightly differently for *synchronous* and *asynchronous* requests. + +The algorithm for the *synchronous* requests is rather straightforward. If the attribute ``status`` of the response object +indicates a failure as ``status=0``, the workflow must analyze the ``retry-allowed`` flag in :ref:`ingest-worker-contrib-descriptor` (REST). +If the flag is set to ``0``, the transaction must be aborted. If the flag is set to ``1``, the workflow can retry the contribution request +within the scope of the same transaction using the following service: + +- :ref:`ingest-worker-contrib-retry` (REST) + +The algorithm for the *asynchronous* requests is a bit more complex. The response object for the contribution submission request does not contain +the actual completion status of the request. If the request submission was not successful as indicated by ``status=0``, it means the request was incorrect or +made in a wrong context (no transaction open, non-existing table, etc.). In this case, the workflow must abort the transaction. +Otherwise (the response object has ``status=1``), the actual status of the contribution request can be obtained later by polling the system +as explained in the section: + +- :ref:`ingest-api-concepts-contributions-status` (CONCEPTS) + +The REST services explained in this section return the contribution descriptor object that contains the status of the contribution request. +The workflow must first check if a contribution has finished (or failed) or if it's still in progress (or in the wait queue of the processor). + +- :ref:`ingest-worker-contrib-descriptor` (REST) + +Possible values of the attribute ``status`` (**Note** this is an attribute of the contribution itself not the completion status of teh REST request) +are explained in the above-mentioned document. Any value other than ``IN_PROGRESS`` indicates that the contribution request has finished (or failed). +Should the request fail, the workflow must then analyze the flag ``retry-allowed`` as explained above. + +What happens when a transaction is aborted? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Aborting a transaction is a relatively quick operation. The primary change involves the removal of MySQL table partitions associated with the transaction. +The following table files on disk will be deleted: + +- ``#p.MYD``: The data file of the MySQL partition. +- ``#p.MYI``: The index file of the MySQL partition. + +All queued or in-progress contribution requests will be dequeued or stopped. The final status of the requests will be either ``CANCELLED`` (for requests +that were still in the queue) or some other failure state depending on the processing stage of a request. The system will not attempt to process +them further. + +What to do if a transaction cannot be aborted? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +It's possible that the system will not be able to abort a transaction. For example, if one of the workers is down or is not responding to the abort request. +In such cases, the status of the transaction will be ``IS_ABORTING`` or ``ABORT_FAILED`` as explained in the section: + +- :ref:`ingest-trans-management-states` (CONCEPTS) + +If the transaction cannot be aborted, the workflow developer must be prepared to handle the situation. There are a few options: + +- The workflow may be programmed to retry the abort operation after a certain timeout. +- If retrying doesn't help, the user of the workflow should contact the Qserv administrators to resolve the issue. diff --git a/doc/ingest/api/advanced/unpublishing.rst b/doc/ingest/api/advanced/unpublishing.rst new file mode 100644 index 0000000000..7eecd383c4 --- /dev/null +++ b/doc/ingest/api/advanced/unpublishing.rst @@ -0,0 +1,54 @@ + + +.. _ingest-api-advanced-unpublishing-databases: + +Ingesting tables into the published catalogs +-------------------------------------------- + +.. warning:: + + Currently, the ingest system only supports adding new tables to databases. It does not permit adding rows to previously + ingested tables. Any attempts to modify existing tables will be blocked by the system. + +In some cases, especially when ingesting large-scale catalogs, the input data for all tables may not be available at the start +of the ingest campaign. Some tables may be ready for ingestion earlier than others. Another scenario is when a previously +ingested table needs to be re-ingested with corrected data. In these situations, the catalog must be built incrementally +while allowing Qserv users to access the previously published tables. The previously described workflow of ingesting all +tables at once and then publishing the catalog as a whole would not work here. To address these scenarios, the system allows +temporarily *un-publishing* the catalog to add new or replace existing tables. The following REST service should be used for +this: + +- :ref:`ingest-db-table-management-unpublish-db` (REST) + +Key points to note: + +- This operation is very quick. +- The database state transition is largely transparent to Qserv users, except when replacing an existing table with a newer + version. The un-published database, including all previously ingested tables, will still be visible and queryable by Qserv + users. +- The operation requires the ingest workflow to use an administrator-level authorization key. This will be demonstrated in + the example below. + + +The modified workflow sequence expected in this case is as follows: + +#. Unpublish the existing catalog. +#. Delete an existing table if it needs to be replaced. +#. Register a new table (or a new version of the removed table) or multiple tables as needed. +#. Start transactions. +#. Load contributions for the new tables. +#. Commit transactions. +#. Publish the catalog again. + +This sequence can be repeated as needed to modify the catalog. Note that starting from step **3**, this sequence +is no different from the simple scenario of ingesting a catalog from scratch. The last step of the sequence +will only affect the newly added tables. Hence, the performance of that stage will depend only on the scale and the amount +of data ingested into the new tables. + +Here is an example of how to unpublish a catalog: + +.. code-block:: bash + + curl http://qserv-master01:25081/replication/config/database/test101 \ + -X PUT -H 'Content-Type: application/json' \ + -d'{"admin_auth_key":""}' diff --git a/doc/ingest/api/advanced/warnings.rst b/doc/ingest/api/advanced/warnings.rst new file mode 100644 index 0000000000..063986032c --- /dev/null +++ b/doc/ingest/api/advanced/warnings.rst @@ -0,0 +1,106 @@ + +.. _ingest-api-advanced-warnings: + +Using MySQL warnings for the data quality control +================================================= + +The context +----------- + +The table ingest is presently implemented using MySQL/MariaDB bulk insert statement: + +.. code-block:: sql + + LOAD DATA [LOCAL] INFILE ... + +This is currently the most efficient and performant method for adding rows into tables from input CSV files (:ref:`ingest-api-concepts-contributions`). +The technique is detailed in https://mariadb.com/kb/en/load-data-infile/. + +This method differs significantly from the standard SQL ``INSERT``. One caveat of using this mechanism is that MySQL (MariaDB) +attempts to ingest all input data into the table, even if some rows (or fields within rows) cannot be correctly interpreted. Consequently: + +- The table may contain fewer (or sometimes more) rows than expected. +- Some cell values may be truncated. +- Some cells may contain incorrect data. + +In order to help client applications detect these problems, MySQL offers diagnostic tools (queries, counters) that report +internal issues encountered during data loading. These are detailed in https://mariadb.com/kb/en/show-warnings/. + +The current implementation of the Ingest system leverages these features by capturing warnings (as well as notes and errors) +and recording them within the Replication database in association with the corresponding contribution requests. This is done +for each request regardless of how it was submitted, whether via the proprietary binary protocol of +:ref:`ingest-tools-qserv-replica-file`, or by calling the REST services of the Ingest system: + +- :ref:`ingest-worker-contrib-by-ref` (WORKER) +- :ref:`ingest-worker-contrib-by-val` (WORKER) + +Both interfaces also offer a parameter to control the depth of the warning reports by specifying the desired limit on +the number of warnings to be retained for each request. This limit is optional. If not specified at the time of request +submission, the service will use the limit configured at the worker ingest server's startup. + +The REST services that return information on contributions have another optional parameter that indicates whether the client +is interested in seeing just the total number of warnings or the complete description of all warnings retained by the system. +The effect of this parameter on the resulting JSON object returned by the services is explained in: + +- :ref:`ingest-worker-contrib-descriptor` (WORKER) + +In addition to the individual descriptions (if required) of the warnings, the relevant services also report three summary counters: + +``num_warnings``: + The total number of warnings detected by MySQL when loading data into the destination table. Note that this number is not + the same as the number of warning descriptions returned by the REST services. Unlike the latter, ``num_warnings`` represents + the true number of warnings. Only a subset of those is captured in full detail by MySQL. + +``num_rows``: + The total number of rows parsed by the Ingest system in the input file. The ingest service always parses the input files as + it needs to extend each row in order to prepend them with a unique identifier of the corresponding super-transaction (the name + of the added column is ``qserv_trans_id``). + +``num_rows_loaded``: + The total number of rows that were actually loaded by the system into the destination table. Note that in case MySQL + encountered any problems with the input data while interpreting and ingesting those into the destination table, this + counter may not be the same as ``num_rows``. In practice, a value reported in ``num_rows_loaded`` could be either lower or + higher than the value reported in ``num_rows``. + +Using warnings and counters +--------------------------- + +The interfaces described above provide a range of options for workflow developers and Qserv data administrators: + +- Workflow developers can enhance their workflows to analyze the reported counters for contributions. This helps determine + if an ingest operation was genuinely successful or if issues occurred. +- Data administrators can utilize both counters and warning descriptions to analyze ingest results and debug input data. + Any data issues can be traced back to their source (e.g., LSST Pipeline). + +The following subsections present techniques that can be leveraged in this context. + +Analyzing counters +^^^^^^^^^^^^^^^^^^ + +The ingest operation should be considered successful if both of the following conditions are met: + +- ``num_warnings`` equals to ``0`` +- ``num_rows`` is the same as ``num_rows_loaded`` + +If these conditions are not met, a data administrator should inspect the warning descriptions in detail to identify the cause +of the discrepancy. + +Increasing the depth of the warnings queue +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. hint:: + + The default imposed by MySQL would be ``64``. And the upper bound for the limit is ``65535``. + +Significantly increasing the limit above the default value should be considered a temporary measure. All warnings are recorded +within the persistent state of the Replication/Ingest system, and the database serving the system may have limited storage +capacity. Capturing many millions of descriptions across all contributions when ingesting medium-to-large scale catalogs may +also significantly reduce the overall performance of the ingest system. + +Data administrators may temporarily increase the upper limit for the number of warnings to debug input data. The limit can be +set when submitting contribution requests via the APIs mentioned earlier in this chapter. Alternatively, the Replication/Ingest +worker server can be started with the following command-line option: + +.. code-block:: bash + + qserv-replica-worker --worker-loader-max-warnings= diff --git a/doc/ingest/api/concepts/contributions.rst b/doc/ingest/api/concepts/contributions.rst new file mode 100644 index 0000000000..6053d0eff3 --- /dev/null +++ b/doc/ingest/api/concepts/contributions.rst @@ -0,0 +1,87 @@ + +.. _ingest-api-concepts-contributions: + +Table contributions +=================== + +The API defines a *contribution* as a set of rows ingested into a table via a separate request. +These are the most important characteristics of contributions: + +- Each contribution request is always made within the scope of a transaction. This association + is crucial for data provenance and data tagging purposes. +- Information on contributions is preserved in the persistent state of the Ingest system. +- Contributions have unique identifiers assigned by the Ingest system. + +.. _ingest-api-concepts-contributions-atomicity: + +Request atomicity and retries +----------------------------- + +The contribution ingest requests are considered as atomic operations with a few important caveats: + +- The contributions are not committed to the table until the transaction is committed even + if the contribution request was successful. + +- Failed contribution requests must be evaluated by the workflow to determine if the target table + remains in a consistent state. This is indicated by the ``retry-allowed`` attribute returned + in the response object. Based on the value of this flag, the workflow should proceed as follows: + + - ``retry-allowed=0``: The workflow must roll back the transaction and initiate a new + contribution request within the scope of a new transaction. For more details, refer to: + + - :ref:`ingest-api-advanced-transactions-abort` (ADVANCED) + - :ref:`ingest-trans-management-end` (REST) + + - ``retry-allowed=1``: The workflow can retry the contribution within the scope of the same + transaction using: + + - :ref:`ingest-worker-contrib-retry` (REST) + +Note that for contributions submitted by reference, there is an option to configure a request +to automatically retry failed contributions. The maximum number of such retries is controlled +by the ``num_retries`` attribute of the request: + +- :ref:`ingest-worker-contrib-by-ref` (REST) + +Contributions pushed to the service by value can not be automatically retried. The workflow +would have to decide on the retrying the failed contributions explicitly. + +Multiple contributions +---------------------- + +When ingesting rows into a table (whether *partitioned* or *regular*), the workflow does not need to complete +this in a single step from one input file. The Ingest system supports building tables from multiple contributions. +Contributions can be made within different transactions or multiple contributions can be ingested within the same transaction. +It is the responsibility of the workflow to keep track of what has been ingested into each table, within which transaction, +and to handle any failed transactions appropriately. + +Ingest methods +-------------- + +Data (rows) of the contributions are typically stored in the ``CSV``-formatted files. In this +case the files would be either directly pushed to the worker Ingest server or uploaded by +the Ingest service from a location that is accessible to the worker: + +- :ref:`ingest-worker-contrib-by-val` (REST) +- :ref:`ingest-worker-contrib-by-ref` (REST) + +The first option (ingesting by value) also allows pushing data of contributions +directly from the memory of the client process (worklow) w/o the need to store the data in the files. + +.. _ingest-api-concepts-contributions-status: + +Status of the contribution requests +----------------------------------- + +The system allows to pull the information on the contributions given their identifiers: + +- :ref:`ingest-info-contrib-requests` (REST) + +An alternative option is to query the information on contributions submitted in a scope of +a transaction: + +- :ref:`ingest-trans-management-status-one` (REST) + +The schema of the contribution descriptor objects is covered by: + +- :ref:`ingest-worker-contrib-descriptor` diff --git a/doc/ingest/api/concepts/families.rst b/doc/ingest/api/concepts/families.rst new file mode 100644 index 0000000000..5ce1d13e55 --- /dev/null +++ b/doc/ingest/api/concepts/families.rst @@ -0,0 +1,37 @@ + +.. _ingest-api-concepts-database-families: + +Database families +================= + +The concept of *database families* originated from the need to correctly distribute data of the *partitioned* tables within Qserv. This allows +Qserv to accurately process queries that ``JOIN`` between the tables of different databases. A database family is a group of databases where +all tables within the family share the same partitioning parameters: + +- the number of *stripes* +- the number of *sub-stripes* +- the *overlap* radius + +This will ensure that all *chunk* tables with the same chunk number will have: + +- the same spatial dimensions in the coordinate system adopted by Qserv +- the same number and sizes of *sub-chunks* within each chunk. + +The families are defined by the Replication/Ingest system and are not visible to Qserv users. Each family has a unique +identifier (name). The system uses family names to correctly distribute the data of partitioned tables among Qserv worker +nodes, ensuring that the data of tables joined in queries are co-located on the same worker node. + +Families must be defined before the databases and tables are registered in Qserv. The current implementation of the API +automatically creates a new family when the first database with a unique combination of partitioning parameters is registered +in the system using: + +- :ref:`ingest-db-table-management-register-db` (REST) + +If a family with the same partitioning parameters already exists in the system, the new database will be added to the existing family. +Existing databases and families can be found using the following service: + +- :ref:`ingest-db-table-management-config` (REST) + +For instructions on partitioning the tables with the desired set of parameters, refer to the following document: + +- :ref:`ingest-data` (DATA) diff --git a/doc/ingest/api/concepts/index.rst b/doc/ingest/api/concepts/index.rst new file mode 100644 index 0000000000..65bccd87ce --- /dev/null +++ b/doc/ingest/api/concepts/index.rst @@ -0,0 +1,35 @@ + +.. _ingest-api-concepts: + +============= +Main concepts +============= + +.. hint:: + + This section of the document begins with the high-level overview of the Qserv ingest API. + Please read this section carefully to learn about the main concepts of the API and a sequence + of operations for ingesting catalogs into Qserv. + + After completing the overview, a reader has two options for what to read next: + + - Study the core concepts of the API in depth by visiting subsections: + + - :ref:`ingest-api-concepts-table-types` + - :ref:`ingest-api-concepts-transactions` + - :ref:`ingest-api-concepts-publishing-data` + - etc. + + - Go straight to the practical example of a simple workflow presented at: + + - :ref:`ingest-api-simple` + +.. toctree:: + :maxdepth: 4 + + overview + table-types + transactions + contributions + publishing + families diff --git a/doc/ingest/api/concepts/overview.rst b/doc/ingest/api/concepts/overview.rst new file mode 100644 index 0000000000..35b94d31d7 --- /dev/null +++ b/doc/ingest/api/concepts/overview.rst @@ -0,0 +1,254 @@ +.. _ingest-api-concepts-overview: + +Overview of the ingest workflow +=============================== + +The ingest workflow must accomplish a series of tasks to ingest data into Qserv. +These tasks are presented in the correct order below: + +Plan the ingest +--------------- + +.. hint:: + + You may also contact Qserv experts or Qserv administrators to get help on the planning stage. + +There is a number of important questions to be answered and decisions to be made ahead of time in the following +areas before starting ingesting data into Qserv. Knowing these facts allows to organize the ingest activities in +the most efficient way. + +Creating a new database or adding tables to the existing one? + +- :ref:`ingest-api-concepts-publishing-data` (CONCEPTS) + +What are the types of tables to be ingested? + +- :ref:`ingest-api-concepts-table-types` (CONCEPTS) + +What should be the values of the partitioning parameters of the partitioned tables? + +- :ref:`ingest-api-concepts-database-families` (CONCEPTS) + +What is a scale of the planned ingest effort? + +- The amount of data (rows, bytes) to be ingested in each table +- The number of the ``CSV`` files to be ingested +- Sizes of the files +- The number of the workers that are available in Qserv + +Where the ready to ingest data will be located? + +- Are there any data staging areas available? +- :ref:`ingest-api-advanced-contributions` (ADVANCED) + +Prepare the input data +---------------------- + +Data files (table *contributions*) to be ingested into Qserv need to be in the ``CSV`` format. It's up to the workflow +to ensure that the data is in the right format and that it's sanitized to ensure the values of the columns +are compatible with the MySQL expectations. + +- :ref:`ingest-data` (DATA) + +Note that the data preparation stage depends on the types of tables to be ingested. Read about the table types in: + +- :ref:`ingest-api-concepts-table-types` (CONCEPTS) + +Register or un-publish a database +--------------------------------- + +The main goal of this step is to ensure that the database is ready for registering new tables. Firstly, +the database should be registered in the Replication/Ingest system. Secondly, the database should be +found (or put into) the *unpublished* state. Read about the database states in the following document +section: + +- :ref:`ingest-api-concepts-publishing-data` (CONCEPTS) + +Further steps depend on the state of the database. If the database doesn't exists in the Replication/Ingest system +it should be registered using: + +- :ref:`ingest-db-table-management-register-db` (REST) + +The newely registered database will be always in the *unpublished* state. If the database already exists in +the Replication/Ingest and it's in the *published* state it should be *unpublished* state using: + +- :ref:`ingest-db-table-management-unpublish-db` (REST) + +Register tables +--------------- + +Before ingesting data into Qserv the corresponding tables should be registered in the Replication/Ingest system. +Tables are registered using: + +- :ref:`ingest-db-table-management-register-table` (REST) + +Table registration requests should includes various information on each table, such as: + +- the name of the database where the table belongs +- the name of the table +- the type of the table +- the schema + +Detailed instructions on this subjects can be found in the description of the service mentioned above. + +Configure the Ingest service +---------------------------- + +This step is optional. And it's mostly needed to adjust the default configuration parameters of the Ingest service +to allow pulling contributions from the data staging areas, such as web servers, cloud storage, etc. Examples of +the configuration parameters are: timeouts, the number of parallel requests, SSL/TLS certificates, HTTP/HTTPS proxy +settings, etc. More information on this subject can be found in: + +- :ref:`ingest-config` (REST) + +These parameters can be adjusted in real time as needed. The changes get into effect immediately. Note that +the parameters are set on the database level. For example, the configuration parameters set for the database ``db1`` +will not affect the ingest activities for the database ``db2``. + +.. note:: + + Please be aware that the ingest activities can also be affected by the global configuration parameters of + the Replication/Ingest system: + + - :ref:`ingest-api-advanced-global-config` (ADVANCED) + +Start transactions +------------------ + +Making the right choices on how many transactions to start and how many contributions to send in a scope of each transaction +is a key to the ingest performance. The transactions are used to group the contributions. In some cases, when +contributions fail the transactions should be aborted. Should this happen all ingest efforts made in the scope of +the failed transactions would have to be rolled back, and the workflow would have to start the corresponding ingest +activities from the beginning. Hence the workflow should be prepared to handle the transaction aborts and make +reasonable decisions on the amount of data to be sent in a scope of each transaction (a "size" of the transaction) +based on the risk assesment made by the workflow developers or the data administrators who would be using the workflow +for ingesting a catalog. + +.. hint:: + + It's recommended to make the transaction management logic of the workflow configurable. + +More information on this subject can be found in: + +- :ref:`ingest-api-concepts-transactions` (CONCEPTS) +- :ref:`ingest-api-advanced-transactions` (ADVANCED) +- :ref:`ingest-trans-management-start` (REST) + +Figure out locations of tables and chunks +----------------------------------------- + +The design of the API requires the workflow to know the locations of the tables and chunks at workers. +The locations are needed to forward the table contribution requests directly to the corresponding worker +services. The locations can be obtained using services covered in the following document: + +- :ref:`table-location` (REST) + +Send the data to the workers +---------------------------- + +At this stage the actual ingest activities are started. The reader should read the following document document first +to understand the concepts of the *contributions*: + +- :ref:`ingest-api-concepts-contributions` (CONCEPTS) + +The REST API for initiating the contribuiton requests is covered in the following documents: + +- :ref:`ingest-worker-contrib-by-ref` (REST) +- :ref:`ingest-worker-contrib-by-val` (REST) + +Monitor the progress of the ingest activities +---------------------------------------------- + +The workflow should always be avare about the progress of the ingest activities, and about the status of the +contribution requests. This is need for (at least) three reasons: + +#. To know when the ingest activities are finished +#. To know when the ingest activities (and which requests) are failed +#. To make more contribution requests if needed + +In the simplest *linear* design of the workflow, such as the one presented in the :ref:`ingest-api-simple`, +the workflow may implement the monitoring as a separate step after making all contribution requests. In more +realistic scenarious the monitoring stage should be an integral part of the same logic that is responsible for +making the contribution requests. + +Besides the monitoring of the contribution requests the workflow should also monitor the status of the databases, +transactions and Qserv workers to be sure that the ingest activities are going as planned and that the underlying +services are healthy. These are the relevant services for the monitoring: + +- :ref:`ingest-config-global-workers` (REST) +- :ref:`ingest-trans-management-status` (REST) + +Commit/abort the transactions +----------------------------- + +Once all contributions are successfully ingested the transactions should be commited. If any problems occured within +the transactions the workflow should be prepared to handle the transaction aborts. Both operations are performed by: + +- :ref:`ingest-trans-management-end` (REST) + +Read more about the transactions and transaction aborts in: + +- :ref:`ingest-api-concepts-transactions` (CONCEPTS) +- :ref:`ingest-api-advanced-transactions-abort` (ADVANCED) + +Another option in the case of a catastrophic failure during the ingest would be to scrap the whole database +or the tables and start the ingest activities from the beginning. This is a more radical approach, but it's +sometimes the only way to recover from the failure. The services for deleting the database and the tables are +covered in: + +- :ref:`ingest-db-table-management-delete` (REST) + +.. warning:: + + The deletion of the database or the tables is an irreversible operation. Use it with caution. + +Publish the database +-------------------- + +.. warning:: + + Depending on the types of tables created by the workflow, the amount of data ingested into the tables, + and the number of transactions created during the effort, the database publishing operation may take a while. + There is always a chance that it may fail should anything unpredicted happen during the operation. This could be + a problem with the underlying infrastructure, the network, the database, the workers, etc. Or it could be a problem + with the ingested data. The workflow should be prepared to handle the failure of the database publishing operation + and check the completion status of the request. + +.. hint:: + + The current implementation of the operation is *synchronous*, which means the workflow would have to wait + before the service sends back a response to be analyzed. However, the implementation of the operation is *idempotent*, + which means the workflow can retry the operation as many times as needed without any side effects should any network + problems occur during the operation. + +Formally, this would be the last stage of the actual ingest. The database and the tables are published to make them +visible to the users. The database and the tables are published using the following services: + +- :ref:`ingest-db-table-management-publish-db` (REST) + +All new tables that were registered in the database by the workflow would be published automatically. +And the database would be placed into *published* state. + +Read more on this concept in: + +- :ref:`ingest-api-concepts-publishing-data` (CONCEPTS) + +Verify the ingested data products +--------------------------------- + +This step is optional. A possibility of implementing the automatic verification if the ingested +data products are correct and consistent depends on the workflow requirements and the data. +These are some very basic verification steps that the workflow may want to implement: + +- the data can be queried +- the data can be compared to the original data +- the number of rows in the tables is correct + +Perform the optional post-ingest data management operation on the ingested tables +--------------------------------------------------------------------------------- + +This step is optional. The workflow may want to perform some post-ingest data management operations on the ingested tables. +An alternative approach is to perform these operations after verifying the ingested data products. +These operations are covered in: + +- :ref:`ingest-api-post-ingest` (API) diff --git a/doc/ingest/api/concepts/publishing.rst b/doc/ingest/api/concepts/publishing.rst new file mode 100644 index 0000000000..bc27bdfc92 --- /dev/null +++ b/doc/ingest/api/concepts/publishing.rst @@ -0,0 +1,68 @@ + +.. _ingest-api-concepts-publishing-data: + +Publishing databases and tables +=============================== + +Databases +--------- + +Databases in Qserv can be in one of two states: *published* or *unpublished*. Databases in the *published* state +are visible to Qserv users and can be queried. Generally, databases in this state are considered static and cannot be modified. +However, certain operations are still allowed on the tables of published databases. These operations are documented in +the following section: + +- :ref:`ingest-api-post-ingest` + +Databases in the *published* state are also subject to routine replica management operations performed by +the Qserv Replication system. + +The *unpublished* state is reserved for making significant changes to the table data, the table schema, ingesting new tables, etc. +The replica management operations are not performed on the databases in this state in order to avoid conflicts with the ongoing changes. + +Note that newly created databases are always in the *unpublished* state, and they are not visible to the Qserv users. When all desired +tables are ingested into the database and the database is ready for querying, it should be *published* using the following service: + +- :ref:`ingest-db-table-management-publish-db` (REST) + +.. note:: + + Before a database can be published, all transactions open within the context of the database must be either committed or rolled back + using the following service: + + - :ref:`ingest-trans-management-end` (REST) + + If this condition is not met, the database publishing service will reject the request. It is the responsibility of the workflow + to manage these transactions. + +Databases can also be unpublished to allow adding new tables, or for performaging significant changes to the table data or schema +using the following service: + +- :ref:`ingest-db-table-management-unpublish-db` (REST) + +.. note:: + + The database unpublishing service does not affect the visibility of the database to Qserv users. All tables that existed + in the database before unpublishing can still be queried by Qserv users. The unpublishing operation is transparent to the users. + +Tables +------ + +Tables in Qserv can be in one of two states: *published* or *unpublished*. This distinction is relevant only for tables within +databases that are in the *unpublished* state. Unlike databases, the state of a table indicates whether the table is fully ingested +and should not be modified thereafter, regardless of the database's state. + +Newly created tables are always in the *unpublished* state. Once all desired data is ingested into the table and it is ready for querying, +it should be published. This occurs indirectly when the database is published. After publication, the table is marked as *published* +and becomes visible to Qserv users. + +During the table publishing stage the Replication/Ingest system: + +- removes MySQL partitions from the data tables at workers +- (optionally) removes MySQL partitions from the *director* index table + +The last step is optional. It only applies to the *director* tables, and only if the database was registered with +the optional attribute set as ``auto_build_secondary_index=1`` when calling the service: + +- :ref:`ingest-db-table-management-register-db` (REST)` + diff --git a/doc/ingest/api/concepts/table-types.rst b/doc/ingest/api/concepts/table-types.rst new file mode 100644 index 0000000000..c15720ae64 --- /dev/null +++ b/doc/ingest/api/concepts/table-types.rst @@ -0,0 +1,79 @@ +.. _ingest-api-concepts-table-types: + +Types of tables in Qserv +======================== + +There are two types of tables in Qserv: + +- *regular* (fully replicated) +- *partitioned* (distributed) + +A copy of the regular table exists at each worker node. Tables of this type are relatively small so that they can fit on disk +at each worker. The tables are usually meant to store the metadata or the reference data for the large partitioned tables. +The following diagram illustrates the concept: + +.. image:: /_static/ingest-table-types-regular.png + :target: ../../../_images/ingest-table-types-regular.png + :alt: Regular (fully-replicated) Tables + +The partitioned tables are distributed across the workers. These tables are much larger than the regular tables and they can't +fit on disk at each worker. Each such table is *horisontally* (by rows) partitioned into the so called *chunks* (or *chunk tables*). Each chunk +table is a separate table that is stored on the MySQL server of a worker. Depending on values of the partitioning parameters (specifically +on th number of *stripes*) a catalog may have from 10,000 to over 100,000 chunks. The names of the chunk tables are based on the name of +the original table, the chunk number and the optional "FullTableOverlap" suffix after the base name of the table. See the following +section for more information on the naming convention of the tables in Qserv: + +- :ref:`ingest-general-base-table-names` + +Each chunk table has a subset of the rows of the original table. A superposition of rows from all the chunk tables of the same Qserv table +is equal to a set of rows in the original (*base*) table. The following diagram illustrates the concept: + +.. image:: /_static/ingest-table-types-partitioned.png + :target: ../../../_images/ingest-table-types-partitioned.png + :alt: Partitioned (chunk) Tables + + +Note that each chunk of the partitioned table maps to rectangular sector of the Sky based on the spatial coordinates system adopted by Qserv. +Spatial coordinates of all rows within a chunk table are all found within the spatial area of the chunk. The spatial areas of different +chunks never overlap. + +.. note:: + + The chunk *overelap* table includes a "halo" of rows from the neighboring chunks. The size of the overlap is defined by the *overlap* parameter + of the table. The overlap is used to ensure that the rows that are close to the chunk boundary are not missed by the so called "near-neighbour" + queries. These table are explained late rin this section. + +The chunk tables are made by the partitioning process that is documented in: + +- :ref:`ingest-data` + +The partitioned tables are further classified into the following subtypes: + +- *director* tables +- *dependent* tables, which are further classified into: + + - *simple* (1 director) + - *ref-match* (2 directors) + +The *director* tables are the tables in which each row has a unique identifier which is similar to the *primary key* in the relational algebra. +The *dependent* tables have rows which depend on the rows of the corresponding *director* tables via the *foreign*-like key referencing +the corresponing *primary key*. The *simple* tables have only one *director* table, while the *ref-match* tables have two *director* tables. +The *ref-match* tables are used to store the matches between the objects of the two different tables. The following diagram illustrates these +concepts: + +.. image:: /_static/ingest-table-types-dependent.png + :target: ../../../_images/ingest-table-types-dependent.png + :alt: Dependent Tables + +The *director* tables may not have any *dependent* tables. Each such *director* is useable and queriable by itself. The *dependent* tables +must have the corresponding *director* tables. Same rules apply to the *ref-match* tables. + +Each chunk table of the director table has the corresponfing chunk *overlap* table. The *overlap* table includes a subset of rows from the chunk table +and a "halo" of rows from the neighboring chunks. The size of the overlap is defined by the *overlap* parameter of the table. The idea of the overlap +is illustrated in the following diagram: + +.. image:: /_static/subchunks.png + :target: ../../../_images/subchunks.png + :alt: Dependent Tables + +The diagram shown sub-chunk boundaries within the chunk table. diff --git a/doc/ingest/api/concepts/transactions.rst b/doc/ingest/api/concepts/transactions.rst new file mode 100644 index 0000000000..b736824e3b --- /dev/null +++ b/doc/ingest/api/concepts/transactions.rst @@ -0,0 +1,257 @@ +.. _ingest-api-concepts-transactions: + +Transactions +============ + +The distributed transaction mechanism is one of the key technologies that was +implemented in the Qserv Ingest system to allow for the incremental updates of the overall state of the data and metadata +while ensuring the consistency of the ingested catalogs. Transactions also play an important role in allowing +the high-performance ingest activities to be performed in a distributed environment. Transactions if used correct may +significantly increase the level of parallelism of the ingest workflows. Transactions are not visible to end users. + +Transactions are open in a scope of a database. It's a responsibility of the workflows to manage transactions as needed +for the ingest activities uisng the following REST services: + +- :ref:`ingest-trans-management` (REST) + +Isolation and parallelism +------------------------- + +The first role of the transaction is to provide the isolation of the ingest activities. The transactions allow for the +parallel ingest of the data into the tables located at the many workers of the Qserv cluster, and into the same table +located at the same worker. The transactions are started and commited independently of each other. The transactions +are not visible to the users and are not used for the user queries. + +To understand why the transactions help to increase the level of parallelism of the ingest activities, read +the last section on this page: + +- :ref:`ingest-api-concepts-transactions-impl` (CONCEPTS) + +Row tagging +----------- + +The second role of the transactions is to implement the tagging mechanism for the ingested data. All rows +ingested into to the data tables and the *director* index tables are tagged with the transaction identifiers +that is unique for each transaction. Hence, all contribution requests made into the tables via this API are +associated with a specific identifier. The identifiers are usually sent in the service request and response objects +in an attribute ``transaction_id``. As an example of the attribute, see a description of the following REST service: + +- :ref:`ingest-worker-contrib-by-ref` (REST) + +An effect of such tagging can be seen as a special column called ``qserv_trans_id`` that is automatically added by +the Ingest system into the table schema of each table. In the current implementation of the system, this is the very +first column of the table. The column is of the ``UNSIGNED INT`` type and is not nullable. The column is visible +to Qserv users and is queriable. Here is an illustration of a query and the corresponding result set illustrating the concept: + +.. code-block:: sql + + SELECT `qserv_trans_id`, `objectId`,`chunkId` + FROM `dp02_dc2_catalogs`.`Object` + WHERE `qserv_trans_id` IN (860, 861); + + +----------------+---------------------+---------+ + | qserv_trans_id | objectId | chunkId | + +----------------+---------------------+---------+ + | 860 | 1249546586455828954 | 57871 | + | 860 | 1249546586455828968 | 57871 | + . . . . + | 861 | 1252546054176403713 | 57891 | + | 861 | 1252546054176403722 | 57891 | + +----------------+---------------------+---------+ + +.. note:: + + The database administrator can decide to drop the column from the table schema if there is a need to save the space + in the table. The column is not used by Qserv for any other purposes than the ingest activities. And once the ingest + is completed, the column is not needed anymore except for Q&A-ing the data, bookeeping and data provenance. + +Checkpointing +------------- + +Transactions also provide the checkpointing mechanism that allows rolling back to a prior consistent state of the affected tables +should any problem occur during the ingest activities. Transactions may spans across many workers and tables located +at the workers. It's up to the workflow to decide what contrubutions to ingest and in what order to ingest those in +a scope of each transaction. + +The following diagram illustrates the concept of the transactions in Qserv. There are 3 transactions that are started and +commited sequentially (in the real life scenarios the transactions can be and should be started and commited in parallel, +and indepedently of each other). Data are ingested into two separate table located at 2 workers. The diagram also shows +a failure to ingest the data into table ``Table-A`` at ``Worker-X`` in a scope of ``Transaction-2``: + +.. image:: /_static/ingest-transactions-failed.png + :target: ../../../_images/ingest-transactions-failed.png + :alt: Failed Transaction Contribution + +At this point the table ``Table-A`` at ``Worker-X`` is found in an inconsistent state. The workflow can decide to roll back +the failed transaction and to re-try the ingest activities in a scope of the new transaction. The rollback is performed by +the worker ingest service: + +- :ref:`ingest-trans-management-end` (REST) + +Also read the following document to learn more about the transaction abort: + +- :ref:`ingest-api-advanced-transactions-abort` (ADVANCED) + +Removing the failed transaction would result in the following state of the tables, which is *clean* and consistent: + +.. image:: /_static/ingest-transactions-aborted.png + :target: ../../../_images/ingest-transactions-aborted.png + :alt: Aborted Transaction + +After that, the workflow can re-try **ALL** ingest activities that were meant to be done in a scope of the previously +failed transaction by starting another transaction. If the ingest activities are successful, the tables will be in the +consistent state: + +.. image:: /_static/ingest-transactions-resolved.png + :target: ../../../_images/ingest-transactions-resolved.png + :alt: Another Transaction + + +Transaction status and state +---------------------------- + +Each transaction is in a well-defined *state* at each moment of time. The state is a part of the broader collection +if the transaction attributes called the transaction *status*. All of this can be obtained by calling services +documented in the following section: + +- :ref:`ingest-trans-management-status` (REST) +- :ref:`ingest-trans-management-states` (REST) + +The services provide a flexible filtering mechanism for finding the transactions of interest in various scopes and states +and reporting the information at different levels of details as needed by the workflows or other applications. + +These are just a few typical applications for this information in a context of the workflows: + +- *Dynamic* transaction management (versus the *static* management where all transactions would be started at once): + + - Starting the limited number of transactions at the beginning of the ingest + - Monitoring the progress and performance of the transactions + - Committing transactions where all table contributes were successfully ingested + - Starting new transactions to load more contributions to meet the performance goals + +- Locating the failed transactions and re-trying the ingest activities in a scope of the new transactions. +- Locating failed table contribution requests that were made in a scope of a transaction to see if it's possible + to retry the contributions w/o aborting the transaction. +- Building a Web dashboard. + +Contexts +-------- + +When starting (or finishing a transaction) using the corresponding services (see below) a workflow may optionally +attach an piece of arbitrary workflow-defined information (the JSON object) to the transaction. The object is called +the *context*. It will be stored within the Replication/Ingest system's database and be associated with the transaction. +The object could be as large as ``16 MB``. In effect, the context is a part of the transaction's persistent state. + +The initial version of the context object is passed along the transaction start request in the attribute ``context``: + +- :ref:`ingest-trans-management-start` (REST) + +The context object may also be updated when aborting or committing a transaction by: + +- :ref:`ingest-trans-management-end` (REST) + +Contexts are also retrieved by the status retrieval services: + +- :ref:`ingest-trans-management-status` (REST) + +The workflow may use the contexts for the following reasons: + +- Store the information on the input contributions made in a scope of a transaction to be used later for the recovery + from the failures. The information may include locations of the input files, as well as any other information + allowing to retry the contributions. Making the workflows to depend on the contexts may simplify the implementation + of the workflows by allowing to avoid the need to store the information in the external databases or files. + Altogether, the contexts may improve robustness of the workflows. +- Store the information for the purpose of internal bookkeeping that would be independent of the user workflow's + infrastructure or environment. +- Store the additional information to be used as a source of metadata for data provenance systems. + +Obviously, the workflow implementation may have its own mechanism for that, and it probably should. However, attaching +the metadata to transactions in the persistent state of the system along with the transactions has a few important benefits. +In particular, it guarantees consistency between transactions and contexts. Secondly, it provides the precise timing for +the ingest operations (the start and finish times are measured by the Ingest system at the right moments). +Thirdly, the information may be seen from the general-purpose Web Dashboard application of Qserv and could also be used +by the database support teams for building various metrics on the performance of the Qserv Ingest system. + + +.. _ingest-api-concepts-transactions-impl: + +Implementation Details +---------------------- + +The Qserv transactions are quite different from the ones in the typical RDBMS implementations. Firstly, they are not designed +as an an isolation mechanis for executing user queries, and the are not visible to Qserv users. In Qserv, tables that are being +ingested are not seen or queriable by the users anyway. The main purpose of the transactions in Qserv is to allow for +the incremental updates of the distributed state of data in Qserv across many (potentially - hundreds of) workers. +Each worker runs its own instance of the MySQL/MariaDB server which is not aware of the of the others. Some might say that +transactions are associated with *vertical slices* of rows in the tables that are located at the workers. + +The second technical problem to be addressed by the transactions is a lack of the transaction support in the MyISAM table +engine that is used in Qserv for the data tables. The MyISAM engine is used in Qserv due to it ssimplicity and high performance. +Unfortunately, failuires while ingesting data into the MyISAM tables can leave the table in a corrupted state. The transactions +provide a mechanism allowing to roll back the tables to a consistent state in case of the failures. The current implementation +of the transactions in Qserv is based on the MySQL/MariaDB partitions: + +- https://mariadb.com/kb/en/partitioning-overview/ + + +.. warning:: + + When the catalog is being published, the partitioned MyISAM tables are converted to the regular format. + This operation is performed by the Qserv Ingest system. + The conversion is a time-consuming operation and may take a long time to complete for + a single table. An observed performance of the operation per table is on a scale of ``20 MB/s`` to ``50 MB/s``. + However, a typical catalog will have thousands of such chunk tables which would be processed in parallel + at all workers of the Qserv cluster. The resulting performance of the conversion would be on a scale of + many ``GB/s``, and the operation would be completed in a reasonable time. + + - A definition of the *reasonable time* is given rather loosely here. An overall idea is that + such conversion should be on the same scale (smaller) as the table ingest *per se*. A similar + philosophy is applied to other data management operations in Qserv besides the ingest. + +From a prospective of the workflows, these are the most important limitations of the transactions: + +- Transaction identifiers are the 32-bit unsigned integer numbers. The maximum number of the transactions that can be + started in the system is 2^32 - 1 = 4,294,967,295. The transactions are not re-used, so the number of the transactions + that can be started in the system is limited by the number of the unique transaction identifiers that can be generated + by the system. + +- The transaction with the identifier ``0`` is reserved for the system for the so called *default* transaction. + The workflows can't ingest any contributions in a context of that transaction, or manage this special transaction. + +- MySQL tables only allow up to ``8,000`` partitions per table. This is a limitation of the MySQL/MariaDB partitioning mechanism. + And there is a certain overhead in MySQL for each partition. Hence, it's not recommended to start more than ``1,000`` transactions + during the ingest. + +Transaction numbers directly map to the partition identifiers of the MySQL/MariaDB partitioned tables. Here is an example +of a few chunk tables of a catalog that is still being ingested: + +.. code-block:: bash + + -rw-rw----+ 1 rubinqsv gu 4868 Sep 10 20:48 gaia_source_1012.frm + -rw-rw----+ 1 rubinqsv gu 48 Sep 10 20:48 gaia_source_1012.par + -rw-rw----+ 1 rubinqsv gu 0 Sep 10 20:46 gaia_source_1012#P#p0.MYD + -rw-rw----+ 1 rubinqsv gu 2048 Sep 10 20:46 gaia_source_1012#P#p0.MYI + -rw-rw----+ 1 rubinqsv gu 0 Sep 10 20:46 gaia_source_1012#P#p1623.MYD + -rw-rw----+ 1 rubinqsv gu 2048 Sep 10 20:46 gaia_source_1012#P#p1623.MYI + -rw-rw----+ 1 rubinqsv gu 31000308 Sep 10 20:48 gaia_source_1012#P#p1628.MYD + -rw-rw----+ 1 rubinqsv gu 2048 Sep 11 19:49 gaia_source_1012#P#p1628.MYI + -rw-rw----+ 1 rubinqsv gu 4868 Sep 10 20:48 gaia_source_1020.frm + -rw-rw----+ 1 rubinqsv gu 48 Sep 10 20:48 gaia_source_1020.par + -rw-rw----+ 1 rubinqsv gu 0 Sep 10 20:46 gaia_source_1020#P#p0.MYD + -rw-rw----+ 1 rubinqsv gu 2048 Sep 10 20:46 gaia_source_1020#P#p0.MYI + -rw-rw----+ 1 rubinqsv gu 51622084 Sep 10 20:48 gaia_source_1020#P#p1624.MYD + -rw-rw----+ 1 rubinqsv gu 2048 Sep 11 19:49 gaia_source_1020#P#p1624.MYI + -rw-rw----+ 1 rubinqsv gu 0 Sep 10 20:46 gaia_source_1020#P#p1630.MYD + -rw-rw----+ 1 rubinqsv gu 2048 Sep 10 20:46 gaia_source_1020#P#p1630.MYI + -rw-rw----+ 1 rubinqsv gu 4868 Sep 10 20:47 gaia_source_1028.frm + -rw-rw----+ 1 rubinqsv gu 48 Sep 10 20:47 gaia_source_1028.par + -rw-rw----+ 1 rubinqsv gu 0 Sep 10 20:46 gaia_source_1028#P#p0.MYD + -rw-rw----+ 1 rubinqsv gu 2048 Sep 10 20:46 gaia_source_1028#P#p0.MYI + -rw-rw----+ 1 rubinqsv gu 739825104 Sep 10 20:48 gaia_source_1028#P#p1625.MYD + -rw-rw----+ 1 rubinqsv gu 2048 Sep 11 19:49 gaia_source_1028#P#p1625.MYI + -rw-rw----+ 1 rubinqsv gu 0 Sep 10 20:46 gaia_source_1028#P#p1629.MYD + -rw-rw----+ 1 rubinqsv gu 2048 Sep 10 20:46 gaia_source_1028#P#p1629.MYI + +This snapshot was taken by looking at the MariaDB data directory at one of the Qserv workers. Note that the tables +are partitioned by the transaction numbers, where the transaction identifiers are the numbers after the ``#P#`` in +the file names. diff --git a/doc/ingest/api/index.rst b/doc/ingest/api/index.rst new file mode 100644 index 0000000000..99353ca24b --- /dev/null +++ b/doc/ingest/api/index.rst @@ -0,0 +1,21 @@ + +.. note:: + + Information in this guide corresponds to the version **38** of the Qserv REST API. Keep in mind + that each implementation of the API has a specific version. The version number will change + if any changes to the implementation or the API that might affect users will be made. + The current document will be kept updated to reflect the latest version of the API. + +##################################### +The Ingest Workflow Developer's Guide +##################################### + +.. toctree:: + :maxdepth: 4 + + introduction + concepts/index + simple/index + advanced/index + post-ingest/index + reference/index diff --git a/doc/ingest/api/introduction.rst b/doc/ingest/api/introduction.rst new file mode 100644 index 0000000000..9919e399f0 --- /dev/null +++ b/doc/ingest/api/introduction.rst @@ -0,0 +1,90 @@ +Introduction +============ + +This document presents an API that is available in Qserv for constructing the data ingest applications (also mentioned +in the document as *ingest workflows*). The API is designed to provide a high-performance and reliable mechanism for +ingesting large quantities of data where the high performance or reliability of the ingests is at stake. +The document is intended to be a practical guide for the developers who are building those applications. +It provides a high-level overview of the API, its main components, and the typical workflows that can be built using the API. + +At the very high level, the Qserv Ingest system is comprised of: + +- The REST server that is integrated into the Master Replication Controller. The server provides a collection + of services for managing metadata and states of the new catalogs to be ingested. The server also coordinates + its own operations with Qserv itself and the Qserv Replication System to prevent interferences with those + and minimize failures during catalog ingest activities. +- The Worker Ingest REST service run at each Qserv worker node alongside the Qserv worker itself and the worker MariaDB server. + The role of these services is to actually ingest the client's data into the corresponding MySQL tables. + The services would also do an additional (albeit, minimal) preprocessing and data transformation (where or when needed) + before ingesting the input data into MySQL. Each worker server also includes its own REST server for processing + the "by reference" ingest requests as well as various metadata requests in the scope of the workers. + +Implementation-wise, the Ingest System heavily relies on services and functions of the Replication System including +the Replication System's Controller Framework, various (including the Configuration) services, and the worker-side +server infrastructure of the Replication System. + +Client workflows interact with the system's services via open interfaces (based on the HTTP protocol, REST services, +JSON data format, etc.) and use ready-to-use tools to fulfill their goals of ingesting catalogs. + +Here is a brief summary of the Qserv Ingest System's features: + +- It introduces the well-defined states and semantics into the ingest process. With that, a process of ingesting a new catalog + now has to go through a sequence of specific steps maintaining a progressive state of the catalog within Qserv + while it's being ingested. The state transitions and the corresponding enforcements made by the system would + always ensure that the catalog would be in a consistent state during each step of the process. + Altogether, this model increases the robustness of the process, and it also makes it more efficient. + +- To facilitate and implement the above-mentioned state transitions the new system introduces a distributed + *tagging* and *checkpointing* mechanism called *super-transactions*. The transactions allow for incremental + updates of the overall state of the data and metadata while allowing to safely roll back to a prior consistent + state should any problem occur during data loading within such transactions. + + - The data tagging capability of the transactions can be also used by the ingest workflows and by + the Qserv administrators for bookkeeping of the ingest activities and for the quality control of + the ingested catalogs. + +- In its very foundation, the system has been designed for constructing high-performance and parallel ingest + workflows w/o compromising the consistency of the ingested catalogs. + +- For the actual data loading, the system offers plenty of options, inluding pushing data into Qserv directly + via a proprietary binary protocol using :ref:`ingest-tools-qserv-replica-file`, :ref:`ingest-worker-contrib-by-val` + in the HTTP request body, or :ref:`ingest-worker-contrib-by-ref`. In the latter case, the input data (so called table + *contributions*) will be pulled by the worker services from remote locations as instructed by the ingest workflows. + The presently supported sources include the object stores (via the HTTP/HTTPS protocols) and the locally mounted + distributed filesystems (via the POSIX protocol). + + - The ongoing work on the system includes the development of the support for the ingesting contributions + from the S3 object stores. + +- The data loading services also collect various information on the ongoing status of the ingest activities, + abnormal conditions that may occur during reading, interpreting, or loading the data into Qserv, as well + as the metadata for the data that is loaded. The information is retained within the persistent + state of the Replication/Ingest System for the monitoring and debugging purposes. A feedback is provided + to the workflows on various aspects of the ingest activities. The feedback is useful for the workflows to adjust their + behavior and to ensure the quality of the data being ingested. + + - To get further info on this subject, see sections :ref:`ingest-general-error-reporting` and + :ref:`ingest-worker-contrib-descriptor-warnings`. + In addition, the API provides REST services for obtaining metadata on the state of catalogs, tables, distributed + transactions, contribution requests, the progress of the requested operations, etc. + +**What the Ingest System does NOT do**: + +- As per its current implementation (which may change in the future) it does not automatically partition + input files. This task is expected to be a responsibility of the ingest workflows. The only data format + is is presently supported for the table payload are ``CSV`` and ``JSON`` (primarily for ingesting + user-generated data products as explained in :ref:`http-frontend-ingest`). + +- It does not (with an exception of adding an extra leading column ``qserv_trans_id`` required by + the implementation of the previously mentioned *super-transactions*) pre-process the input ``CSV`` + payload sent to the Ingest Data Servers by the workflows for loading into tables. + It's up to the workflows to sanitize the input data and to make them ready to be ingested into Qserv. + +More information on the requirements and the low-level technical details of its implementation (unless it's +needed for the purposes of this document's goals) can be found elsewhere. + +It's recommended to read the document sequentially. Most ideas presented in the document are introduced in +a section :ref:`ingest-api-concepts` and illustrated with a simple practical example in :ref:`ingest-api-simple`. +The section is followed by a few more sections covering :ref:`ingest-api-advanced` and :ref:`ingest-api-post-ingest`. +The :ref:`ingest-api-reference` section of the document provides complete descriptions of the REST services and tools +mentioned in the document. diff --git a/doc/ingest/api/post-ingest/index.rst b/doc/ingest/api/post-ingest/index.rst new file mode 100644 index 0000000000..c26fdd6857 --- /dev/null +++ b/doc/ingest/api/post-ingest/index.rst @@ -0,0 +1,12 @@ + +.. _ingest-api-post-ingest: + +================================= +Post-Ingest Data Management Tasks +================================= + +The following optional steps are performed after the data has been ingested: + +- :ref:`admin-row-counters` (ADMIN) +- :ref:`admin-data-table-index` (ADMIN) +- :ref:`admin-director-index` (ADMIN) diff --git a/doc/ingest/api/reference/index.rst b/doc/ingest/api/reference/index.rst new file mode 100644 index 0000000000..24a58e83d8 --- /dev/null +++ b/doc/ingest/api/reference/index.rst @@ -0,0 +1,12 @@ + +.. _ingest-api-reference: + +###################### +Ingest API Reference +###################### + +.. toctree:: + :maxdepth: 4 + + rest/index + tools diff --git a/doc/ingest/api/reference/rest/controller/config.rst b/doc/ingest/api/reference/rest/controller/config.rst new file mode 100644 index 0000000000..65f47786a6 --- /dev/null +++ b/doc/ingest/api/reference/rest/controller/config.rst @@ -0,0 +1,426 @@ +.. _ingest-config: + +Configuring parameters of the ingests +===================================== + +.. _ingest-config-set: + +Setting configuration parameters +-------------------------------- + +Parameters are set for a database (regardless of the *published* status) using the following service: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``PUT`` + - ``/ingest/config`` + +The request object has the following schema: + +.. code-block:: + + { "database" : , + "SSL_VERIFYHOST" : , + "SSL_VERIFYPEER" : , + "CAPATH" : , + "CAINFO" : , + "CAINFO_VAL" : , + "PROXY_SSL_VERIFYHOST" : , + "PROXY_SSL_VERIFYPEER" : , + "PROXY_CAPATH" : , + "PROXY_CAINFO" : , + "PROXY_CAINFO_VAL" : , + "CURLOPT_PROXY" : , + "CURLOPT_NOPROXY" : , + "CURLOPT_HTTPPROXYTUNNEL" : , + "CONNECTTIMEOUT" : , + "TIMEOUT" : , + "LOW_SPEED_LIMIT" : , + "LOW_SPEED_TIME" : , + "ASYNC_PROC_LIMIT" : + } + +Where: + +``database`` : *string* : **required** + The required name of a database affected by the operation. + +``SSL_VERIFYHOST`` : *number* = ``2`` + The optional flag that tells the system to verify the host of the peer. If the value is set + to ``0`` the system will not check the host name against the certificate. Any other value would tell the system + to perform the check. + + This attribute directly maps to https://curl.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html. + +``SSL_VERIFYPEER`` : *number* = ``1`` + The optional flag that tells the system to verify the peer's certificate. If the value is set + to ``0`` the system will not check the certificate. Any other value would tell the system to perform the check. + + This attribute directly maps to https://curl.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html. + +``CAPATH`` : *string* = ``/etc/ssl/certs`` + The optional path to a directory holding multiple CA certificates. The system will use the certificates + in the directory to verify the peer's certificate. If the value is set to an empty string the system will not use + the certificates. + + Putting the empty string as a value of the parameter will effectively turn this option off as if it has never been + configured for the database. + + This attribute directly maps to https://curl.se/libcurl/c/CURLOPT_CAPATH.html. + +``CAINFO`` : *string* = ``/etc/ssl/certs/ca-certificates.crt`` + The optional path to a file holding a bundle of CA certificates. The system will use the certificates + in the file to verify the peer's certificate. If the value is set to an empty string the system will not use + the certificates. + + Putting the empty string as a value of the parameter will effectively turn this option off as if it has never been + configured for the database. + + This attribute directly maps to https://curl.se/libcurl/c/CURLOPT_CAINFO.html. + +``CAINFO_VAL`` : *string* = ``""`` + The optional value of a certificate bundle for a peer. This parameter is used in those cases when it's + impossible to inject the bundle directly into the Ingest workers' environments. If a non-empty value of the parameter + is provided then ingest servers will use it instead of the one mentioned (if any) in the above-described + attribute ``CAINFO``. + + **Attention**: Values of the attribute are the actual certificates, not file paths like in the case of ``CAINFO``. + +``PROXY_SSL_VERIFYHOST`` : *number* = ``2`` + The optional flag that tells the system to verify the host of the proxy. If the value is set + to ``0`` the system will not check the host name against the certificate. Any other value would tell the system + to perform the check. + + This attribute directly maps to https://curl.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYHOST.html. + +``PROXY_SSL_VERIFYPEER`` : *number* = ``1`` + The optional flag that tells the system to verify the peer's certificate. If the value is set + to ``0`` the system will not check the certificate. Any other value would tell the system to perform the check. + + This attribute directly maps to https://curl.se/libcurl/c/CURLOPT_PROXY_SSL_VERIFYPEER.html. + +``PROXY_CAPATH`` : *string* = ``""`` + The optional path to a directory holding multiple CA certificates. The system will use the certificates + in the directory to verify the peer's certificate. If the value is set to an empty string the system will not use + the certificates. + + Putting the empty string as a value of the parameter will effectively turn this option off as if it has never been + configured for the database. + + This attribute directly maps to https://curl.se/libcurl/c/CURLOPT_PROXY_CAPATH.html. + +``PROXY_CAINFO`` : *string* = ``""`` + The optional path to a file holding a bundle of CA certificates. The system will use the certificates + in the file to verify the peer's certificate. If the value is set to an empty string the system will not use + the certificates. + + Putting the empty string as a value of the parameter will effectively turn this option off as if it has never been + configured for the database. + + This attribute directly maps to https://curl.se/libcurl/c/CURLOPT_PROXY_CAINFO.html. + +``PROXY_CAINFO_VAL`` : *string* = ``""`` + The optional value of a certificate bundle for a proxy. This parameter is used in those cases when it's + impossible to inject the bundle directly into the Ingest workers' environments. If a non-empty value of the parameter + is provided then ingest servers will use it instead of the one mentioned (if any) in the above-described + attribute ``PROXY_CAINFO``. + + **Attention**: Values of the attribute are the actual certificates, not file paths like in the case of ``PROXY_CAINFO``. + +``CURLOPT_PROXY`` : *string* = ``""`` + Set the optional proxy to use for the upcoming request. The parameter should be a null-terminated string + holding the host name or dotted numerical IP address. A numerical IPv6 address must be written within ``[brackets]``. + + This attribute directly maps to https://curl.se/libcurl/c/CURLOPT_PROXY.html. + +``CURLOPT_NOPROXY`` : *string* = ``""`` + The optional string consists of a comma-separated list of host names that do not require a proxy + to get reached, even if one is specified. + + This attribute directly maps to https://curl.se/libcurl/c/CURLOPT_NOPROXY.html. + +``CURLOPT_HTTPPROXYTUNNEL`` : *number* = ``0`` + Set the optional tunnel parameter to ``1`` to tunnel all operations through the HTTP proxy + (set with ``CURLOPT_PROXY``). + + This attribute directly maps to https://curl.se/libcurl/c/CURLOPT_HTTPPROXYTUNNEL.html. + +``CONNECTTIMEOUT`` : *number* = ``0`` + The optional maximum time in seconds that the system will wait for a connection to be established. + The default value means that the system will wait indefinitely. + + This attribute directly maps to https://curl.se/libcurl/c/CURLOPT_CONNECTTIMEOUT.html + +``TIMEOUT`` : *number* = ``0`` + The optional maximum time in seconds that the system will wait for a response from the server. + + This attribute directly maps to https://curl.se/libcurl/c/CURLOPT_TIMEOUT.html + +``LOW_SPEED_LIMIT`` : *number* = ``0`` + The optional transfer speed in bytes per second that the system considers too slow and will abort the transfer. + + This attribute directly maps to https://curl.se/libcurl/c/CURLOPT_LOW_SPEED_LIMIT.html + +``LOW_SPEED_TIME`` : *number* = ``0`` + The optional time in seconds that the system will wait for the transfer speed to be above the limit + set by ``LOW_SPEED_LIMIT``. + + This attribute directly maps to https://curl.se/libcurl/c/CURLOPT_LOW_SPEED_TIME.html + +``ASYNC_PROC_LIMIT`` : *number* = ``0`` + The optional maximum concurrency limit for the number of contributions to be processed in a scope of + the database. The actual number of parallel requests may be further lowered by the hard limit specified by + the Replication System worker's configuration parameter (``worker``, ``num-async-loader-processing-threads``). + The parameter can be adjusted in real time as needed. It gets into effect immediately. Putting ``0`` as a value of + the parameter will effectively turn this option off as if it has never been configured for the database. + + This attribute directly maps to https://curl.se/libcurl/c/CURLOPT_LOW_SPEED_TIME.html + + **Note**: The parameter is available as of API version ``14``. + +If a request is successfully finished it returns the standard JSON object w/o any additional data but +the standard completion status. + +.. _ingest-config-get: + +Retrieving configuration parameters +----------------------------------- + +.. warning:: + As of version ``14`` of the API, the name of the database is required to be passed in the request's query instead of + passing it in the JSON body. The older implementation was wrong. + + +.. list-table:: + :widths: 10 25 65 + :header-rows: 1 + + * - method + - service + - query parameters + * - ``GET`` + - ``/ingest/config`` + - ``database=`` + +Where the mandatory query parameter ``database`` specifies the name of a database affected by the operation. + +If the operation is successfully finished it returns an extended JSON object that has the following schema (in addition +to the standard status and error reporting attributes): + +.. code-block:: + + { "database" : , + "SSL_VERIFYHOST" : , + "SSL_VERIFYPEER" : , + "CAPATH" : , + "CAINFO" : , + "CAINFO_VAL" : , + "PROXY_SSL_VERIFYHOST" : , + "PROXY_SSL_VERIFYPEER" : , + "PROXY_CAPATH" : , + "PROXY_CAINFO" : , + "PROXY_CAINFO_VAL" : , + "CURLOPT_PROXY" : , + "CURLOPT_NOPROXY" : , + "CURLOPT_HTTPPROXYTUNNEL" : , + "CONNECTTIMEOUT" : , + "TIMEOUT" : , + "LOW_SPEED_LIMIT" : , + "LOW_SPEED_TIME" : , + "ASYNC_PROC_LIMIT" : + } + +The attributes of the response object are the same as the ones described in the section :ref:`ingest-config-set`. + +.. _ingest-config-global-workers: + +Global configuration parameters of workers +------------------------------------------ + +.. note:: + This is the same service that was described in: + + - :ref:`ingest-db-table-management-config` (REST) + + The response object of the service also returns the information on the workers. + +There are two sectons related to workers in the response object. The first section ``config.general.worker`` +includes the general parameters of the ingest services. Values of the parameters are the same for all +workers. The second section ``config.workers`` has the information on the individual workers. + +The general information on all workers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The schema of the relevant section of the respionse object is illustrated by the following example: + +.. code-block:: json + + { "config": { + "general" : { + "worker" : { + "num-loader-processing-threads" : 64, + "num-http-loader-processing-threads" : 8, + "num-async-loader-processing-threads" : 8, + + "ingest-charset-name" : "latin1", + + "ingest-max-retries" : 10, + "ingest-num-retries" : 1, + + "loader-max-warnings" : 64, + + "async-loader-auto-resume" : 1, + "async-loader-cleanup-on-resume" : 1, + }, + } + } + } + +Where: + +``config.general.worker`` : *object* + A collection of the general parameters of the worker ingest service. + +``num-loader-processing-threads`` : *number* + The number of ingest request processing threads in the service that supports the proprietary + binary protocol. + +``num-http-loader-processing-threads`` : *number* + The number of ingest request processing threads in the HTTP-based ingest service. Note that + the service is used for processing *synchronous* contribution requess and for submitting + the *asynchronous* requests to the service. + +``num-async-loader-processing-threads`` : *number* + The number of ingest request processing threads in a thread pool that processes + the *asynchronous* contribution requests. + +``ingest-charset-name`` : *string* + The name of a character set for parsing the payload of the contributions. + +``ingest-max-retries`` : *number* + The maximum number of the automated retries of failed contribution attempts + in cases when such retries are still possible. The parameter represents the *hard* + limit for the number of retries regardless of what's specified in the related + parameter ``ingest-num-retries`` or in the contributions requests made by the workflows. + The primary purpose of the parameter is to prevent accidental overloading + of the ingest system should a very large number of retries accidentally specified + by the ingest workflows for individual contributions. Setting a value of the parameter + to ``0`` will unconditionally disable any retries. + +``ingest-num-retries`` : *number* + The default number of the automated retries of failed contribution attempts + in cases when such retries are still possible. The limit can be changed for + individual contributions. Note that the effective number of retries specified + by this parameter or the one set in the contribution requests can not + exceed the *hard* limit set in the related parameter ``ingest-max-retries``. + Setting a value of the parameter to 0 will disable automatic retries (unless they are + explicitly enabled or requested by the ingest workflows for individual contributions). + +``loader-max-warnings`` : *number* + The maximum number of warnings to retain after executing ``LOAD DATA [LOCAL] INFILE`` + when ingesting contributions into worker MySQL database. The warnings (if any) will be recorded in + the persisent state of the Replication/Ingest system and returned to the ingest workflow upon request. + +``async-loader-auto-resume`` : *number* + The flag controlling the behavior of the worker's *asynchronous* ingest service after + (the deliberate or accidental) restarts. If the value of the parameter is not ``0`` then the service + will resume processing incomplete (queued or on-going) requests. Setting a value of the parameter + to ``0`` will result in the unconditional failing of all incomplete contribution requests existed prior + the restart. + + .. warning:: + + Requests failed in the last (loading) stage can't be resumed, and they will require aborting + the corresponding transaction. If the automaticu resume is enabled rhese request will be automatically + closed and marked as failed. + +``async-loader-cleanup-on-resume`` : *number* + The flag controlling the behavior of worker's *asynchronous* ingest service after + restarting the service. If the value of the parameter is not ``0`` the service will try to clean + up the temporary files that might be left on disk for incomplete (queued or ongoing) requests. + The option may be disabled to allow debugging the service. + +Worker-specific information +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The schema of the relevant section of the respionse object is illustrated by the following example: + +.. code-block:: json + + { "config": { + "workers" : [ + { "name" : "db02", + "is-enabled" : 1, + "is-read-only" : 0, + + "loader-host" : { + "addr" : "172.24.49.52", + "name" : "sdfqserv002.sdf.slac.stanford.edu" + }, + "loader-port" : 25002, + "loader-tmp-dir" : "/qserv/data/ingest", + + "http-loader-host" : { + "name" : "sdfqserv002.sdf.slac.stanford.edu", + "addr" : "172.24.49.52" + }, + "http-loader-port" : 25004, + "http-loader-tmp-dir" : "/qserv/data/ingest", + }, + ] + } + } + +Where: + +``config.workers`` : *array* + A collection of worker nodes, where each object represents a worker node. + +``name`` : *string* + The unique identifier of a worker node. + +``is-enabled`` : *number* + The flag that tells if the worker node is enabled. If the value is set to ``0`` the worker node is disabled. + Workers which are not enables do not participate in the ingest activities. + +``is-read-only`` : *number* + The flag that tells if the worker node is read-only. If the value is set to ``0`` the worker node is read-write. + Workers which are in the read-only statte do not participate in the ingest activities. + +**Parameters of the ingest service that supports the proprietary binary protocol**: + +``loader-host`` : *object* + The object with the information about the loader host. + + - ``addr`` : *string* + The IP address of the lder host. + + - ``name`` : *string* + The FQDN (fully-qualified domain name) of the host. + +``loader-port`` : *number* + The port number of the ingest service. + +``loader-tmp-dir`` : *string* + The path to the temporary directory on the loader host that is used by the ingest service + as a staging area for the contributions. + +**Parameters of the HTTP-based ingest service**: + +``http-loader-host`` : *object* + The object with the information about the loader host. + + - ``addr`` : *string* + The IP address of the lder host. + + - ``name`` : *string* + The FQDN (fully-qualified domain name) of the host. + +``http-loader-port`` : *number* + The port number of the ingest service. + +``http-loader-tmp-dir`` : *string* + The path to the temporary directory on the loader host that is used by the ingest service + as a staging area for the contributions. diff --git a/doc/ingest/api/reference/rest/controller/db-table-management.rst b/doc/ingest/api/reference/rest/controller/db-table-management.rst new file mode 100644 index 0000000000..f7624f8eb8 --- /dev/null +++ b/doc/ingest/api/reference/rest/controller/db-table-management.rst @@ -0,0 +1,559 @@ +Database and table management +============================= + +.. _ingest-db-table-management-config: + +Finding existing databases and database families +------------------------------------------------ + +The following service pulls all configuration information of of the Replication/Ingest System, including info +on the known database families, databases and tables: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``GET`` + - ``/replication/config`` + +Upon successful (see :ref:`ingest-general-error-reporting`) completion of the request, the service will return an object +that has the following schema (of which only the database and database family-related fields are shown): + +.. code-block:: json + + { + "config": { + "database_families" : [ + { + "overlap" : 0.01667, + "min_replication_level" : 3, + "num_sub_stripes" : 3, + "name" : "production", + "num_stripes" : 340 + } + ], + "databases" : [ + { + "database" : "dp01_dc2_catalogs_02", + "create_time" : 0, + "is_published" : 1, + "publish_time" : 1662688661000, + "family_name" : "production", + "tables" : [ + { + "ang_sep" : 0, + "is_director" : 1, + "latitude_key" : "coord_dec", + "create_time" : 1662774817703, + "unique_primary_key" : 1, + "flag" : "", + "name" : "Source", + "director_database_name" : "", + "is_ref_match" : 0, + "is_partitioned" : 1, + "longitude_key" : "coord_ra", + "database" : "dp02_dc2_catalogs", + "director_table" : "", + "director_key2" : "", + "director_database_name2" : "", + "director_key" : "sourceId", + "director_table2" : "", + "director_table_name2" : "", + "is_published" : 1, + "director_table_name" : "", + "publish_time" : 1663033002753, + "columns" : [ + { + "name" : "qserv_trans_id", + "type" : "INT NOT NULL" + }, + { + "type" : "BIGINT NOT NULL", + "name" : "sourceId" + }, + { + "type" : "DOUBLE NOT NULL", + "name" : "coord_ra" + }, + { + "type" : "DOUBLE NOT NULL", + "name" : "coord_dec" + } + ] + } + ] + } + ] + } + } + +**Notes**: + +- The sample object was truncated for brevity. The actual number of families, databases, tables and columns were + much higher in the real response. +- The number of attributes varies depending on a particular table type. The example above shows + attributes for the table ``Source``. This table is *partitioned* and is a *director* (all *director*-type tables + are partitioned in Qserv). + + +.. _ingest-db-table-management-register-db: + +Registering databases +---------------------- + +Each database has to be registered in Qserv before one can create tables and ingest data. The following +service of the Replication Controller allows registering a database: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``POST`` + - ``/ingest/database`` + +The service requires a JSON object of the following schema: + +.. code-block:: + + { + "database" : , + "num_stripes" : , + "num_sub_stripes" : , + "overlap" : , + "auto_build_secondary_index" : , + "local_load_secondary_index" : + } + +Where: + +``database`` : *string* + The required name of the database to be created. + +``num_stripes`` : *number* + The required number of stripes that was used when partitioning data of all tables to be ingested in a scope of the database. + +``num_sub_stripes`` : *number* + The required number of sub-stripes that was used when partitioning data of all tables to be ingested in a scope of the database. + +``overlap`` : *number* + The required overlap between the stripes. + +``auto_build_secondary_index`` : *number* = ``1`` + The flag that specifies the desired mode for building the *director* (used to be known as the *secondary*) + indexes of the director tables of the catalog. The flag controls the automatic building of the indexes, where: + + - ``1``: Build the index automatically during transaction commit time. + - ``0``: Do not build the index automatically during transaction commit time. In this case, it will be up to a workflow + to trigger the index building as a separated "post-ingest" action using the corresponding service: + + - :ref:`ingest-director-index-build` + + **Note**: Catalogs in Qserv may have more than one director table. This option applies to all such tables. + +.. warning:: + + - The service will return an error if the database with the same name already exists in the system. + - Values of attributes ``num_stripes``, ``num_sub_stripes`` and ``overlap`` are expected to match + the corresponding partitioning parameters used when partitioning all partitioned tables of the new database. + Note that the current implementation of the Qserv Ingest system will not validate contributions to the partitioned + tables to enforce this requirement. Only the structural correctness will be checked. It's up to a workflow + to ensure the data ingested into tables are correct. + - Building the *director* index during transaction commit time (for the relevant tables) may have a significant + impact on the performance of the transaction commit operation. The impact is proportional to the size of the + contributions made into the table during the transaction. This may orotolng the transaction commit time. + An alternative option is to build the indexes as a separated "post-ingest" action using the corresponding service: + + - :ref:`ingest-director-index-build` + +If the operation is successfully finished (see :ref:`ingest-general-error-reporting`) a JSON object returned by the service +will have the following attribute: + +.. code-block:: + + { + "database": { + ... + } + } + +The object containing the database configuration information has the same schema as it was explained earlier in section: + +- :ref:`ingest-db-table-management-config` + + +.. _ingest-db-table-management-register-table: + +Registering tables +------------------ + +All tables, regardless if they are *partitioned* or *regular* (fully replicated on all worker nodes), have to be registered +using the following Replication Controller's service: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``POST`` + - ``/ingest/table`` + +The service requires a JSON object of the following schema: + +Where a JSON object sent to the service with the request shall describe that table. This is a schema of the object for +the **partitioned** tables is presented below: + +.. code-block:: + + { + "database" : , + "table" : , + "is_partitioned" : , + "schema" : [ + { "name" : , + "type" : + }, + ... + ], + "director_table" : , + "director_key" : , + "director_table2" : , + "director_key2" : , + "latitude_key" : , + "longitude_key" : , + "flag" : , + "ang_sep" : , + "unique_primary_key" : + } + +A description of the *regular* tables has a fewer number of attributes (attributes that which are specific to the *partitioned* +tables are missing): + +.. code-block:: + + { + "database" : , + "table" : , + "is_partitioned" : , + "schema": [ + { + "name" : , + "type" : + }, + ... + ] + } + +Where the attributes are: + +``database`` : *string* + The required name of the existing database. + +``table`` : *string* + The required name of a table to be created. + +``is_partitioned`` : *number* + The required type of table. Allowed values: + + - ``1`` for partitioned tables (including any subtypes) + - ``0`` for the regular tables. + +``schema`` : *array* + The required definition of the table schema, where each entry of the array is an object with the following attributes: + + - ``name``: The name of the column. + - ``type``: The type of the column. The type must adhere to the MySQL requirements for column types. + +``director_table`` : *string* + The name of the corresponding first (or left) *director* table. The name is required to be not empty for + the *dependent* tables and it has to be empty for the *director* tables. This is the only way to differentiate between + two types of *partitioned* tables. + + **Note**: The *ref-match* tables are considered as the *dependent* tables since they have columns that are pointing + to the corresponding *director* tables. See attributes: ``director_key``, ``director_table2``, and ``director_key2``. + +``director_key`` : *string* + The required name of a column in a *partitioned* table. A role of the column depends on a subtype of + the table: + + - *director*: the primary key of the table + - *dependent*: the foreign key pointing to the corresponding column of the *director* table + +``director_table2`` : *string* + The name of the corresponding second (or right) *director* table. The non-empty value + name is required for the *ref-match* tables and it has to be empty for the *director* and *dependent* tables. + + **Note**: The very presence of this attribute in the input configuration would imply an intent to register + a "ref-match* table. In this case, non-empty values of the attributes ``director_key2`` , ``flag`` and ``ang_sep`` + will be required in order to succeed with the registration. + +``director_key2`` : *string* + The name of a column that is associated (AKA *foreign key*) with corresponding column of the second *director* table. + A value of this attribute is required for and it must not be empty when registering the *ref-match* tables. + It will be ignored for other table types. See a description of the attribute ``director_table2``. + +``latitude_key`` : *string* + The required name of a column in a *director* table represents latitude. It's optional for the *dependent* tables. + +``longitude_key`` : *string* + The required name of a column in a *director* table represents longitude. It's optional for the *dependent* tables. + +``flag`` : *string* + The name of the special column that is required to be present on the *ref-match* tables. + Values of the column are populated by the tool ``sph-partition-matches`` when partitioning the input files + of the *ref-match* tables. The data type of this column is usually: + + .. code-block:: sql + + INT UNSIGNED + +``ang_sep`` : *double* + The value of the angular separation for the matched objects that is used by Qserv to process queries which + involve the *ref-match* tables. The value is in radians. The value is required to be non-zero for the *ref-match* tables. + +``unique_primary_key`` : *number* = ``0`` + The optional flag allows to drop the uniqueness requirement for the *director* keys of the table. The parameter + is meant to be used for testing new table products, or for the *director* tables that won't have any dependants (child tables). + Allowed values: + + - ``0``: The primary key is not unique. + - ``1``: The primary key is unique. + +.. warning:: + + - The table schema does not include definitions of indexes. Those are managed separately after the table is published. + The index management interface is documented in a dedicated document + + - **TODO**: Managing indexes of MySQL tables at Qserv workers. + + - The service will return an error if the table with the same name already exists in the system, or + if the database didn' exist at a time when teh request was delivered to the service. + + - The service will return an error if the table schema is not correct. The schema will be checked for the correctness. + +.. note:: Requirements for the table schema: + + - The variable-length columns are not allowed in Qserv for the *director* and *ref-match* tables. All columns of these + tables must have fixed lengths. These are the variable length types: ``VARCHAR``, ``VARBINARY``, ``BLOB``, ``TEXT``, + ``GEOMETRY`` and ``JSON``. + + - The *partitioned* tables are required to have parameters ``director_key``, ``latitude_key`` and ``longitude_key``. + - The *director* tables are required to have non-empty column names in the parameters ``director_key``, ``latitude_key`` and ``longitude_key``. + - The *dependent* tables are required to have a non-empty column name specified in the parameter ``director_key``. + - The *dependent* tables are allowed to have empty values in the parameters ``latitude_key`` and ``longitude_key``. + + - For tables where the attributes ``latitude_key`` and ``longitude_key`` are provided (either because they are required + of if they are optional), values must be either both non-empty or empty. An attempt to specify only one of the attribute + or have a non-empty value in an attribute while the other one has it empty will result in an error. + + - All columns mentioned in attributes ``director_key``, ``director_key2``, ``flag``, ``latitude_key`` and ``longitude_key`` + must be present in the table schema. + + - Do not use quotes around the names or type specifications. + + - Do not start the columm names with teh reserved prefix ``qserv``. This prefix is reserved for the Qserv-specific columns. + +An example of the schema definition for the table ``Source``: + +.. code-block:: json + + [ + { + "name" : "sourceId" + "type" : "BIGINT NOT NULL", + }, + { + "name" : "coord_ra" + "type" : "DOUBLE NOT NULL", + }, + { + "name" : "coord_dec" + "type" : "DOUBLE NOT NULL", + } + ] + +If the operation is successfully finished (see :ref:`ingest-general-error-reporting`) a JSON object returned by the service +will have the following attribute: + +.. code-block:: + + { + "database": { + ... + } + } + +The object will contain the updated database configuration information that will also include the new table. +The object will have the same schema as it was explained earlier in section: + +- :ref:`ingest-db-table-management-config` + +**Notes on the table names**: + +- Generally, the names of the tables must adhere to the MySQL requirements for identifiers + as explained in: + + - https://dev.mysql.com/doc/refman/8.0/en/identifier-qualifiers.html + +- The names of identifiers (including tables) in Qserv are case-insensitive. This is not the general requirement + in MySQL, where the case sensitivity of identifiers is configurable one way or another. This requirement + is enforced by the configuration of MySQL in Qserv. + +- The length of the name should not exceed 64 characters as per: + + - https://dev.mysql.com/doc/refman/8.0/en/identifier-length.html + +- The names should **not** start with the prefix ``qserv``. This prefix is reserved for the Qserv-specific tables. + + +.. _ingest-db-table-management-publish-db: + +Publishing databases +-------------------- + +Databases are published (made visible to Qserv users) by calling this service: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``PUT`` + - ``/ingest/database/:database`` + +The name of the database is provided as a parameter ``database`` of the resource path. There are a few optional +parameters to be sent in the JSON body of the request: + +.. code-block:: + + { + "consolidate_secondary_index" : , + "row_counters_deploy_at_qserv" : + } + +Where: + +``consolidate_secondary_index`` : *number* = ``0`` + The optional parameter that controls the final format of all the *director* index tables of the database. + Normally, the *director* indexes are MySQL-partitioned tables. If the value of this optional parameter is + not ``0`` then the Ingest System will consolidate the MySQL partitions and turn the tables into the monolitical form. + + .. warning:: + + Depending on the scale of the catalog (sizes of the affected tables), this operation may be quite lengthy (up to many hours). + Besides, based on the up to the date experience with using the MySQL-partitioned director indexes, the impact of the partitions + on the index's performance is rather negligible. So, it's safe to ignore this option in most but very special cases that are not + discussed by the document. + + One can find more info on the MySQL partitioning at: + + - https://dev.mysql.com/doc/refman/8.0/en/partitioning.html + +``row_counters_deploy_at_qserv`` : *number* = ``0`` + This optional flag that triggers scanning and deploying the row counters as explained at: + + - :ref:`admin-row-counters` (ADMIN) + - :ref:`ingest-row-counters-deploy` (REST) + + To trigger this operation the ingest workflow should provide a value that is not ``0``. In this case the row counters + collection service will be invoked with the following combination of parameters: + + .. list-table:: + :widths: 50 50 + :header-rows: 1 + + * - attr + - value + * - ``overlap_selector`` + - ``CHUNK_AND_OVERLAP`` + * - ``force_rescan`` + - ``1`` + * - ``row_counters_state_update_policy`` + - ``ENABLED`` + * - ``row_counters_deploy_at_qserv`` + - ``1`` + +.. warning:: + + The row counters deployment is a very resource-consuming operation. It may take a long time to complete + depending on the size of the catalog. This will also delay the catalog publiushing stage of an ingest compaign. + A better approach is to deploy the row counters as the "post-ingest" operation as explained in: + + - (**TODO** link) Deploying row counters as a post-ingest operation + +.. note:: + + The catalogs may be also unpublished to add more tables. The relevant REST service is documented in: + + - (**TODO** link) Un-publishing databases to allow adding more tables + + +.. _ingest-db-table-management-unpublish-db: + +Un-publishing databases to allow adding more tables +--------------------------------------------------- + +Unpublished databases as well as previously ingested tables will be still visible to users of Qserv. +The main purpose of this operation is to allow adding new tables to the existing catalogs. +The new tables won't be seen by users until the catalog is published back using the following REST service: + +- :ref:`ingest-db-table-management-publish-db` + +Databases are un-published by calling this service: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``PUT`` + - ``/replication/config/database/:database`` + +The name of the database is provided in a parameter ``database`` of the resource. The only mandatory parameter +to be sent in the JSON body of the request is: + +``admin_auth_key`` : *string* + The administrator-level authentication key that is required to publish the database. + The key is used to prevent unauthorized access to the service. + + **Note**: The key is different from the one used to publish the database. The elevated privileges + are needed to reduce risks of disrupting user access to the previously loaded and published databases. + + +.. _ingest-db-table-management-delete: + +Deleting databases and tables +----------------------------- + +These services can be used for deleting non-*published* (the ones that are still ingested) as well as *published* databases, +or tables, including deleting all relevant persistent structures from Qserv: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``DELETE`` + - | ``/ingest/database/:database`` + | ``/ingest/table/:database/:table`` + +To delete a non-*published* database (or a table from such database) a client has to provide the normal level authentication +key ``auth_key`` in a request to the service: + +.. code-block:: + + { "auth_key" : + } + +The name of the databases affected by the operation is specified at the resource's path. + +Deleting databases (or tables from those databases) that have already been published requires a user to have +elevated administrator-level privileges. These privileges are associated with the authentication key ``admin_auth_key`` +to be sent with a request instead of ``auth_key``: + +.. code-block:: + + { "admin_auth_key" : + } + +Upon successful completion of the request (for both above-mentioned states of the database), the service will return the standard +response as explained in the section mentoned below. After that, the database (or the table, depending on a scope of a request) +name can be reused for further ingests if needed. + +- :ref:`ingest-general-error-reporting` + diff --git a/doc/ingest/api/reference/rest/controller/director-index.rst b/doc/ingest/api/reference/rest/controller/director-index.rst new file mode 100644 index 0000000000..33595bdefd --- /dev/null +++ b/doc/ingest/api/reference/rest/controller/director-index.rst @@ -0,0 +1,139 @@ +Director Index Management +========================= + +.. _ingest-director-index-build: + +(Re-)building the Index +----------------------- + +.. note:: API version notes: + + - As of version ``21``, the service can no longer be used to (re-)build indexes of all *director* + tables of a catalog. It's now required to provide the name of the affected table in the parameter ``director_table``. + + - As of version ``22``, the service no longer support the option ``allow_for_published``. Any attempts to specify + the option will result in a warning reported by the service back to a client. The service will ignore the option. + +.. warning:: + Be advised that the amount of time needed to build an index of a large-scale catalog may be quite large. + The current implementation of the secondary index is based on MySQL's InnoDB table engine. The insert + time into this B-Tree table has logarithmic performance. It may take many hours to build catalogs of + billions of objects. In some earlier tests, the build time was 20 hours for a catalog of 20 billion objects. + + +The service of the **Master Replication Controller** builds or rebuilds (if needed) the *director* (used to be known as +the *secondary*) index table of a database. The target table must be *published* at the time of this operation. + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``POST`` + - ``/ingest/index/secondary`` + +The request object has the following schema: + +.. code-block:: + + { "database" : , + "director_table" : , + "rebuild" : , + "local" : + } + +Where: + +``database`` : *string* + The required name of a database affected by the operation. + +``director_table`` : *string* + The required name of the *director* table for which the index is required to be (re-)built. + +``rebuild`` : *number* = ``0`` + The optional flag that allows recreating an existing index. If the value is set to ``0`` the service + will refuse to proceed with the request if the index already exists. Any other value would tell the service + to drop (if exists) the index table before re-creating and re-populating it with entries. + +``local`` : *number* = ``0`` + The optional flag that tells the service how to ingest data into the index table, where: + + - ``0``: Index contributions are required to be directly placed by the Replication/Ingest System at a location + that is directly accessible by the MySQL server hosting the index table. This could be either some local folder + of a host where the service is being run or a folder located at a network filesystem mounted on the host. + Once a file is in place, it would be ingested into the destination table using this protocol: + + .. code-block:: sql + + LOAD DATA INFILE ... + + **Note**: Be aware that this option may not be always possible (or cause complications) in Kubernetes-based + deployments of Qserv. + + - ``1`` (or any other numeric value): Index contributions would be ingested into the table using this protocol: + + .. code-block:: sql + + LOAD DATA LOCAL INFILE ... + + **Note**: Files would be first copied by MySQL at some temporary folder owned by the MySQL service before being + ingested into the table. This option has the following caveats: + + - The protocol must be enabled in the MySQL server configuration by setting a system variable: ``local_infile=1``. + - The temporary folder of the MySQL server is required to have sufficient space to temporarily accommodate index + contribution files before they'd be loaded into the table. In the worst-case scenario, there should be enough + space to accommodate all contributions of a given catalog. One could make a reasonable estimate for the latter + by knowing the total number of rows in the director table of the catalog, the size of the primary + key (typically the ``objectId`` column) of the table, as well as types of the ``chunk`` and ``subChunk`` + columns (which are usually the 32-bit integer numbers in Qserv). + - This ingest option would also affect (lower) the overall performance of the operation due to additional + data transfers required for copying file contributions from a location managed by the **Master Replication Controller** + to the temporary folder of the MySQL server. + +If the operation succeeded, the service will respond with the default JSON object which will not carry any additional +attributes on top of what's mandated in :ref:`ingest-general-error-reporting`. + +In case of errors encountered during an actual attempt to build the index was made, the object may have a non-trivial +value of the ``error_ext``. The object wil carry specific reasons for the failures. The schema of the object +is presented below: + +.. code-block:: + + "error_ext" : { +
    : { + : { + : , + ... + }, + }, + ... + } + +Where: + +``table`` : *string* + The placeholder for the name of the director table. + +``worker`` : *string* + The placeholder for the name of the worker service that failed to build the index. + +``chunk`` : *number* + The placeholder for the chunk number. + +``error`` : *string* + The placeholder for the error message. + +Here is an example of how this object might look like: + +.. code-block:: + + "error_ext" : { + "object" : { + "qserv-db01" : { + 122 : "Failed to connect to the worker service", + 3456 : "error: Table 'tes96__Object' already exists, errno: 1050", + }, + "qserv-db23" : { + 123 : "Failed to connect to the worker service" + } + } + } diff --git a/doc/ingest/api/reference/rest/controller/index.rst b/doc/ingest/api/reference/rest/controller/index.rst new file mode 100644 index 0000000000..427d79ace2 --- /dev/null +++ b/doc/ingest/api/reference/rest/controller/index.rst @@ -0,0 +1,14 @@ +############################# +Master Replication Controller +############################# + +.. toctree:: + :maxdepth: 4 + + config + db-table-management + trans-management + table-location + info + director-index + row-counters diff --git a/doc/ingest/api/reference/rest/controller/info.rst b/doc/ingest/api/reference/rest/controller/info.rst new file mode 100644 index 0000000000..7194a567fa --- /dev/null +++ b/doc/ingest/api/reference/rest/controller/info.rst @@ -0,0 +1,137 @@ +Information services +==================== + +.. _ingest-info-chunks: + +Chunk disposition +----------------- + +.. warning:: + Do not use this service for the chunk placement decisions during catalog ingestion. The service is for + informational purposes only. + +The service of the **Master Replication Controller** return information about the chunk *replicas* in a scope of a given database: + +.. list-table:: + :widths: 10 15 75 + :header-rows: 1 + + * - method + - service + - query parameters + * - ``GET`` + - ``/ingest/chunks`` + - ``database=`` + +Where: + +``name`` : *string* + The required name of a database affected by the operation. + +The resulting object has the following schema: + +.. code-block:: + + { + "replica": [ + { + "chunk" : , + "worker": , + "table" : { + : { + "overlap_rows" : , + "overlap_data_size" : , + "overlap_index_size" : , + "rows" : , + "data_size" : , + "index_size" : + }, + ... + } + }, + ... + ] + } + +Where: + +``replica`` : *array* + A collection of chunk **replicas**, where each object representes a chunk replica. Replicas of a chunk + are essentially the same chunk, but placed on different workers. + +``chunk`` : *number* + The chunk number. + +``worker`` : *string* + The unique identifier of a worker where the chunk replica is located. + +``table`` : *object* + The object with the information about the chunk replica in the scope of + a particular *partitioned* table. + + **Attention**: The current implementation is incomplete. It will return ``0`` for all attributes + of the table object. + +``overlap_rows`` : *number* + The number of rows in the chunk's overlap table. + +``overlap_data_size`` : *number* + The number of bytes in the chunk's overlap table (measured by the size of the corresponding file). + +``overlap_index_size`` : *number* + The number of bytes in the index of the chunk's overlap table (measured by the size + of the corresponding file). + +``rows`` : *number* + The number of rows in the chunk table. + +``data_size`` : *number* + The number of bytes in the chunk table (measured by the size of the corresponding file). + +``index_size`` : *number* + The number of bytes in the index of the chunk table (measured by the size of + the corresponding file). + +.. _ingest-info-contrib-requests: + +Status of the contribution request +---------------------------------- + +The service of the **Master Replication Controller** returns information on a contribution request: + +.. list-table:: + :widths: 10 15 75 + :header-rows: 1 + + * - method + - service + - query parameters + * - ``GET`` + - ``/ingest/trans/contrib/:id`` + - | ``include_warnings=<0|1>`` + | ``include_retries=<0|1>`` + +Where: + +``id`` : *number* + The required unique identifier of the contribution request that was submitted + to a Worker Ingest service earlier. + +``include_warnings`` : *number* = ``0`` + The optional flag telling the service to include warnings into the response. Any value + that is not ``0`` is considered as ``1``, meaning that the warnings should be included. + +``include_retries`` : *number* = ``0`` + The optional flag telling the service to include retries into the response. Any value + that is not ``0`` is considered as ``1``, meaning that the retries should be included. + +The resulting object has the following schema: + +.. code-block:: + + { "contribution" : + } + +Where the detailed description on the enclosed contribution object is provided in the section: + +- :ref:`ingest-trans-management-descriptor-contrib-long` diff --git a/doc/ingest/api/reference/rest/controller/row-counters.rst b/doc/ingest/api/reference/rest/controller/row-counters.rst new file mode 100644 index 0000000000..0e2197a3ee --- /dev/null +++ b/doc/ingest/api/reference/rest/controller/row-counters.rst @@ -0,0 +1,193 @@ + +Row counters +============ + +.. _ingest-row-counters-deploy: + +Collecting row counters and deploying them at Qserv +--------------------------------------------------- + +The service collects row counters in the specified table and (optionally) deploys the counters +in Qserv to allow optimizations of the relevant queries. The database may or may not be in +the published state at the time of this operation. + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``POST`` + - ``/ingest/table-stats`` + +Where the request object has the following schema: + +.. code-block:: + + { "database" : , + "table" : , + "overlap_selector" : , + "force_rescan" : , + "row_counters_state_update_policy" : , + "row_counters_deploy_at_qserv" : + } + +Where: + +``database`` : *string* + The required name of a database affected by the operation. + +``table`` : *string* + The required name of the table for which the row counters are required to be collected. + +``overlap_selector`` : *string* = ``CHUNK_AND_OVERLAP`` + The optional selector for a flavor of the table for which the counters will be collected. + Possible options are: + + - ``CHUNK_AND_OVERLAP``: Both the chunk table itself and the overlap table. + - ``CHUNK``: Only the chunk table. + - ``OVERLAP``: Only the overlap table. + + **Note**: This parameter applies to the *partitioned* tables only. It's ignored for the *regular* (fully replicated) + tables. + +``force_rescan`` : *number* = ``0`` + The optional flag that tells the service to rescan the counters that were recorded earlier. + If the value is set to ``0`` the service will not rescan the counters if the previous version already exists. + If the value is set to ``1`` (or any other number) the service will rescan the counters regardless of + the previous version. + +``row_counters_state_update_policy`` : *string* = ``DISABLED`` + The optional parameter that drives the counters update policy within the persistent + state of the Replication/Ingest system. These are the possible options: + + - ``DISABLED``: The service will collect the counters but it will not update the persistent state. + - ``ENABLED``: Update the counters in the system if the scan was successful and if no counters were + recorded earlier. + - ``FORCED``: Same as ``ENABLED`` except it allows overriding the previous state of the counters. + +``row_counters_deploy_at_qserv`` : *number* = ``0`` + The optional flag tells the service if the counters should be deployed at Qserv. + If the value is set to ``0`` the service will not deploy the counters. Any other value would tell + the service to drop the previous version of the counters (if any existed) in Qserv and update the counters. + +.. _ingest-row-counters-delete: + +Deleting row counters for a table +---------------------------------- + +The service removes the previously collected row counters of the specified table from Qserv and (optionally if requested) +from the Replication system's persistent state. The database may or may not be published at the time of this operation: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``DELETE`` + - ``/ingest/table-stats/:database/:table`` + +Where the service path has the following parameters: + +``database`` : *string* + The name of a database affected by the operation. + +``table`` : *string* + The name of the table for which the row counters are required to be collected. + +The request object sent in the JSON body has the following schema: + +.. code-block:: + + { "overlap_selector" : , + "qserv_only" : + } + +Where: + +``overlap_selector`` : *string* = ``CHUNK_AND_OVERLAP`` + The optional selector for a flavor of the table for which the counters will be collected. + Possible options are: + + - ``CHUNK_AND_OVERLAP``: Both the chunk table itself and the overlap table. + - ``CHUNK``: Only the chunk table. + - ``OVERLAP``: Only the overlap table. + + **Note**: This parameter applies to the *partitioned* tables only. It's ignored for the *regular* (fully replicated) + tables. + +``qserv_only`` : *number* = ``0`` + The optional flag tells the service if the counters should be removed + from Qserv and from the Replication system's persistent state as well: + + - ``0``: Remove the counters from both Qserv and the Replication system's persistent state. + - ``1`` (or any other number which is not ``0``): Remove the counters only from Qserv. + +.. _ingest-row-counters-inspect: + +Inspecting rows counters of a table +----------------------------------- + +The service retturns a status of the previously collected (if any) row counters of the specified table from +the Replication system's persistent state. The database may or may not be published at the time of this operation. + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``GET`` + - ``/ingest/table-stats/:database/:table`` + +Where: + +``database`` : *string* + The name of a database affected by the operation. + +``table`` : *string* + The name of the table for which the row counters are required to be collected. + +The response returned by the service has the following JSON schema: + +.. code-block:: + + { "database" : , + "table" : , + "entries": [ + { "transaction_id" : , + "chunk" : , + "is_overlap" : , + "num_rows" : , + "update_time" : + }, + ... + ] + } + +Where: + +``database`` : *string* + The name of a database that was specified in the service resource path. + +``table`` : *string* + The name of the table was specified in the service resource path. + +``entries`` : *array* + The array of the collected row counters entries. + +``transaction_id`` : *number* + The unique identifier of a *super-transaction*. + +``chunk`` : *number* + The chunk number of the entry. + + **Note**: A value of ``0`` will be reported for the *regular* (fully-replicated) tables. + +``is_overlap`` : *number* + The flag indicates if the entry is reported for the chunk overlap (a value would differ from ``0``) + rather than for the chunk itself (a value would be ``0``). + + **Note**: The parameter should be ignored for the *regular* (fully-replicated) tables. + +``num_rows`` : *number* + The number of rows in in a scope of (``transaction_id``, ``chunk``, ``is_overlap``). + +``update_time`` : *number* + The last time the counter was collected. The time is given as the number of milliseconds since + the UNIX *Epoch* time. \ No newline at end of file diff --git a/doc/ingest/api/reference/rest/controller/table-location.rst b/doc/ingest/api/reference/rest/controller/table-location.rst new file mode 100644 index 0000000000..a80c13fa7e --- /dev/null +++ b/doc/ingest/api/reference/rest/controller/table-location.rst @@ -0,0 +1,243 @@ + +.. _table-location: + +Table location services +======================= + +.. _table-location-regular: + +Locate regular tables +--------------------- + +.. warning:: + This service was incorrectly designed by requiring the name of a database (attribute ``database``) be passed + in the ``GET`` request's body. The same problem exists for the alternative method accepting a transaction identifier + (attribute ``transaction_id``). This is not a standard practice. The ``GET`` requests are not supposed to have the body. + The body may be stripped by some HTTP clients or proxies. Both problems will be fixed in the next releases of Qserv + by moving the parameters into the query part of the URL. + +The service returns connection parameters of the Worker Data Ingest Services which are available for ingesting +the regular (fully replicated) tables: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``GET`` + - ``/ingest/regular`` + +Where the request object passed in a request's body has the following schema, in which a client would have to provide the name of a database: + +.. code-block:: + + { "database" : + } + +The database should not be published at a time when the request was being called. Otherwise the service will return an error. + +The service also supports an alternative method accepting a transaction identifier (transactions are always associated with +the corresponding databases): + +.. code-block:: + + { "transaction_id" : + } + +If the transaction identifier was provided then the transaction is required to be in the ``STARTED`` state at the time of a request. +See the section :ref:`ingest-trans-management` for more details on transactions. + +In case of successful completion the service returns the following object: + +.. code-block:: + + { "locations" : [ + { "worker" : , + "host" : , + "host_name" : , + "port" : , + "http_host" : , + "http_host_name" : , + "http_port" : + }, + ... + ] + } + +Where, each object in the array represents a particular worker. See an explanation of the attributes in: + +- :ref:`table-location-connect-params` + +**Note**: If the service will returns an empty array then Qserv is either not properly configured, +or it's not ready to ingest the tables. + +.. _table-location-chunks: + +Allocate/locate chunks of the partitioned tables +------------------------------------------------ + +The current implementation of the system offers two services for allocating (or determining locations of existing) chunks: + +- :ref:`table-location-chunks-one` +- :ref:`table-location-chunks-many` + +Both techniques are explained in the current section. The choice of a particular technique depends on the requirements +of a workflow. However, the second service is recommended as it's more efficient in allocating large quanities of chunks. + +Also note, that once a chunk is assigned (allocated) to a particular worker node all subsequent requests for the chunk are guaranteed +to return the same name of a worker as a location of the chunk. Making multiple requests for the same chunk is safe. Chunk allocation +requests require a valid super-transaction in the ``STARTED`` state. See the section :ref:`ingest-trans-management` for more details on transactions. + +.. _table-location-chunks-one: + +Single chunk allocation +~~~~~~~~~~~~~~~~~~~~~~~ + +The following service is meant to be used for a single chunk allocation/location: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``POST`` + - ``/ingest/chunk`` + +Where the request object has the following schema, in which a client would have to provide the name of a database: + +.. code-block:: + + { "database" : , + "chunk" : + } + +The service also supports an alternative method accepting a transaction identifier (transactions are always associated with the corresponding databases): + +.. code-block:: + + { "transaction_id" : , + "chunk" : + } + +If a request succeeded, the System would respond with the following JSON object: + +.. code-block:: + + { "locations" : [ + { "worker" : , + "host" : , + "host_name" : , + "port" : , + "http_host" : , + "http_host_name" : , + "http_port" : + }, + ... + ] + } + +Where, the object represents a worker where the Ingest system requests the workflow to forward the chunk contributions. +See an explanation of the attributes in: + +- :ref:`table-location-connect-params` + +.. _table-location-chunks-many: + +Multiple chunks allocation +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +For allocating multiple chunks one would have to use the following service: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``POST`` + - ``/ingest/chunks`` + +Where the request object has the following schema, in which a client would have to provide the name of a database: + +.. code-block:: + + { "database" : , + "chunks" : [, , ... ] + } + +Like the above-explained case of the single chunk allocation service, this one also supports an alternative method accepting +a transaction identifier (transactions are always associated with the corresponding databases): + +.. code-block:: + + { "transaction_id" : , + "chunks" : [, , ... ] + } + +**Note** the difference in the object schema - unlike the single-chunk allocator, this one expects an array of chunk numbers. + +The resulting object has the following schema: + +.. code-block:: + + { "locations" : [ + { "chunk" : , + "worker" : , + "host" : , + "host_name" : , + "port" : , + "http_host" : , + "http_host_name" : , + "http_port" : + }, + ... + ] + } + +Where, each object in the array represents a particular worker. See an explanation of the attributes in: + +- :ref:`table-location-connect-params` + +.. _table-location-connect-params: + +Connection parameters of the workers +------------------------------------- + +.. warning:: + In the current implementation of the Ingest system, values of the hostname attributes ``host_name`` and ``http_host_name`` are captured + by the worker services themselves. The names may not be in the FQDN format. Therefore this information has to be used with caution and + only in those contexts where the reported names could be reliably mapped to the external FQDN or IP addresses of the corresponding hosts + (or Kubernetes *pods*). + +Attributes of the returned object are: + +``chunk`` : *number* + The unique identifier of the chunk in Qserv. + + **Note**: This attribute is reported in the chunk location/allocation services: + + - :ref:`table-location-chunks` + +``worker`` : *string* + The unique identifier of the worker in Qserv. + + **Note**: The worker's identifier is not the same as the worker's host name. + +``host`` : *string* + The IP address of the worker's Ingest service that supports the proprietary binary protocol. + +``host_name`` : *string* + The DNS name of the worker's Ingest service that supports the proprietary binary protocol. + +``port`` : *number* + The port number of the worker's Ingest service that supports the proprietary binary protocol. This service requires + the content of an input file be sent directly to the service client. The Replication/Ingest system provides + an application :ref:`ingest-tools-qserv-replica-file` that relies on this protocol. + +``http_host`` : *string* + The IP address of the worker's Ingest service that supports the HTTP protocol. + +``http_host_name`` : *string* + The DNS name of the worker's Ingest service that supports the HTTP protocol. + +``http_port`` : *number* + The port number of the worker's Ingest service that supports the HTTP protocol. The REST server that's placed + in front of the service allows ingesting a single file from a variety of external sources, such as the locally + mounted (at the worker's host) filesystem, or a remote object store. It's also possible to push the content of a file + in the request body ether as teh JSON object or as a binary stream (``multipart/form-data``). diff --git a/doc/ingest/api/reference/rest/controller/trans-management.rst b/doc/ingest/api/reference/rest/controller/trans-management.rst new file mode 100644 index 0000000000..193e9e084b --- /dev/null +++ b/doc/ingest/api/reference/rest/controller/trans-management.rst @@ -0,0 +1,794 @@ +.. _ingest-trans-management: + +Transaction management +====================== + +.. note:: + + - The transaction management services which modify a state of transactions are available only to the authorized users. + The authorization is based on the authentication key. The key is used to prevent unauthorized access to the services. + + - The schema of the JSON object returned for each transaction is the same for all services in the group. + The schema is described in the section: + + - :ref:`ingest-trans-management-descriptor` + +.. _ingest-trans-management-status: + +Status of a transaction +----------------------- + +There are two services in this group. They are documented in the dedicated sections below. + +.. _ingest-trans-management-status-many: + +Database transactions +^^^^^^^^^^^^^^^^^^^^^ + +The service returns the information on many transactions in a scope of a database or databases selected via optional +filters passed via the request's query. The service is meant to be used by workflows for monitoring the status of +transactions and for debugging purposes. To see an actual progress of a transaction (e.g. to see the contributions +loaded into the destination table) a workflow should use the service: :ref:`ingest-trans-management-status-one`. + +.. list-table:: + :widths: 10 15 75 + :header-rows: 1 + + * - method + - service + - query parameters + * - ``GET`` + - ``/ingest/trans`` + - | ``database=`` + | ``family=`` + | ``all_databases={0|1}`` + | ``is_published={0|1}`` + | ``include_context={0|1}`` + | ``contrib={0|1}`` + | ``contrib_long={0|1}`` + | ``include_log={0|1}`` + | ``include_warnings={0|1}`` + | ``include_retries={0|1}`` + +Where: + +``database`` : *string* = ``""`` + The optional name of the database to filter the transactions by. If the parameter is present and if + it's not empty then attributes ``family``, ``all_databases`` and ``is_published`` are ignored. + +``family`` : *string* = ``""`` + The optional name of the database family. If the parameter is present and if + it's not empty then a scope of a request will be narrowed to databases - members of the given family. + Otherwise all databases regardless of their family membership will be considered. + + **Notes**: + + - The parameter is ignored if the parameter ``database`` is present. + - The final selection of the databases is also conditioned by the values of the optional parameters + ``all_databases`` and ``is_published``. See the description of the parameters for more details. + +``all_databases`` : *number* = ``0`` + The optional flag which is used for further filtering of databases selected by the parameter family. + A value of ``0`` tells the service that the parameter ``is_published`` should be used to further filter database + selection to the desired subset. Any other value would mean no additional filters (hence ignoring ``is_published``), + hence including databases selected by the parameter family. + + **Note**: The parameter is ignored if the parameter ``database`` is present. + +``is_published`` : *number* = ``0`` + The optional flag is used only if enabled by setting the previous parameter ``all_databases=0``. + A value of ``0`` tells the service to narrow the database selection to databases which are not *published*. + Any other value would select the *published* databases. + + **Note**: The parameter is ignored if the parameter ``database`` is present or when ``all_databases=1``. + +``include_context`` : *number* = ``0`` + The optional flag tells the service to include the transaction context object in the report for each transaction. + See the documentation on services :ref:`ingest-trans-management-start` or :ref:`ingest-trans-management-end` for further + details. + + .. warning:: + + Potentially, each context object could be as large as **16 MB**. Enable this option only if you really need + to see contexts for all transactions. Otherwise use an alternative (single transaction) request to pull one + transaction at a time. + +``contrib`` : *number* = ``0`` + The optional flag tells the service whether the transaction contribution objects should be included + into the report. See details on this flag in the dedicated section below. + + .. warning:: + + Even though individual contribution objects aren't large, the total number of contribution ingested + in a scope of each transaction (and all transactions of a database, etc.) could be quite large. + This would result in a significant emount of data reported by the service. In extreme cases, the response + object could be **1 GB** or larger. Enable this option only if you really need to see contributions + for selected transactions. Otherwise use an alternative (single transaction) request to pull one transaction + at a time: :ref:`ingest-trans-management-status-one`. + +``contrib_long`` : *number* = ``0`` + This optional flag is considered only if ``contrib=1``. Setting a value of the flag to any value other + than ``0`` will result in returning detailed info on the contributions. Otherwise (if a value of the parameter + is set to ``0``) only the summary report on contributions will be returned. + +``include_log`` : *number* = ``0`` + The optional flag tells the service to include the transaction log in the report for each transaction. + The log is a list of events that were generated by the system in response to the transaction management + reequests. Each entry in the log is a JSON object that includes the timestamp of the event, the event type, + etc. See **TODO** for the details on the log entries. + +``include_warnings`` : *number* = ``0`` + The optional flag, if set to any value that differs from ``0``, tells the service to include MySQL warnings + captured when loading contributions into the destination table. Warnings are reported in a context of + contributiond should they be allow in the report. + + **Note**: The parameter is ignored if ``contrib=0`` or if ``contrib_long=0``. + +``include_retries`` : *number* = ``0`` + The optional flag, if set to any value that differs from ``0``, tells the service to include the information + on the retries to load contributions that were made during the transaction. Retries are reported in a context of + contributiond should they be allow in the report. + + **Note**: The parameter is ignored if ``contrib=0`` or if ``contrib_long=0``. + +This is an example of the most typical request to the service for pulling info on all transactions of ``gaia_edr3``: + +.. code-block:: bash + + curl -X GET "http://localhost:25081/ingest/trans?database=gaia_edr3" + +The service will return a JSON object with the summary report on the transactions in the following JSON object: + +.. code-block:: json + + { + "success" : 1, + "warning" : "No version number was provided in the request's query.", + "error" : "", + "error_ext" : {}, + "databases" : { + "gaia_edr3" : { + "is_published" : 0, + "num_chunks" : 1558, + "transactions" : [ + { + "database" : "gaia_edr3", + "log" : [], + "start_time" : 1726026383559, + "end_time" : 0, + "begin_time" : 1726026383558, + "id" : 1632, + "state" : "STARTED", + "transition_time" : 0, + "context" : {} + }, + { + "end_time" : 1727826539501, + "context" : {}, + "begin_time" : 1726026383552, + "log" : [], + "transition_time" : 1727826539218, + "database" : "gaia_edr3", + "start_time" : 1726026383553, + "state" : "ABORTED", + "id" : 1631 + }, + { + "database" : "gaia_edr3", + "end_time" : 1727826728260, + "id" : 1630, + "transition_time" : 1727826728259, + "start_time" : 1726026383547, + "begin_time" : 1726026383546, + "log" : [], + "state" : "FINISHED", + "context" : {} + }, + +**Note**: that the report doesn't have any entries for the contributions. The contributions are not included in the report since +the parameter ``contrib`` was not set to ``1``. The log entries are also missing since the parameter ``include_log`` was not set to ``1``. +Also, the transaction context objects are not included in the report since the parameter ``include_context`` was not set to ``1``. + +.. _ingest-trans-management-status-one: + +Single transaction finder +^^^^^^^^^^^^^^^^^^^^^^^^^ + +The service returns the information on a single transaction identified by its unique identifier ```` passed +via the request's query: + +.. list-table:: + :widths: 10 15 75 + :header-rows: 1 + + * - method + - service + - query parameters + * - ``GET`` + - ``/ingest/trans/`` + - | ``include_context={0|1}`` + | ``contrib={0|1}`` + | ``contrib_long={0|1}`` + | ``include_log={0|1}`` + | ``include_warnings={0|1}`` + | ``include_retries={0|1}`` + +Where the parameters are the same as for the service :ref:`ingest-trans-management-status-many`. + +This is an example of using the service for pulling info on a transaction ``1630`` and obtaining +the summary report on contributions and the transaction context: + +.. code-block:: bash + + curl -X GET "http://localhost:25881/ingest/trans/1630?contrib=1" + +The service returns a JSON object that has the following structure (the report is truncated by removing stats +on all workers but ``db12`` for brevity): + +.. code-block:: json + + { + "databases" : { + "gaia_edr3" : { + "num_chunks" : 1558, + "is_published" : 0, + "transactions" : [ + { + "id" : 1630, + "database" : "gaia_edr3", + "end_time" : 1727826728260, + "start_time" : 1726026383547, + "begin_time" : 1726026383546, + "transition_time" : 1727826728259, + "log" : [], + "context" : {}, + "state" : "FINISHED", + "contrib" : { + "summary" : { + "num_failed_retries" : 0, + "num_chunk_files" : 156, + "last_contrib_end" : 1726026945059, + "num_regular_files" : 0, + "num_rows" : 223420722, + "table" : { + "gaia_source" : { + "num_failed_retries" : 0, + "overlap" : { + "num_rows" : 6391934, + "num_warnings" : 0, + "num_rows_loaded" : 6391934, + "data_size_gb" : 5.97671127319336, + "num_files" : 155, + "num_failed_retries" : 0 + }, + "num_files" : 156, + "num_rows_loaded" : 217028788, + "num_warnings" : 0, + "data_size_gb" : 201.872497558594, + "num_rows" : 217028788 + } + }, + "num_workers" : 9, + "first_contrib_begin" : 1726026383616, + "num_rows_loaded" : 223420722, + "worker" : { + "db12" : { + "num_failed_retries" : 0, + "num_regular_files" : 0, + "num_chunk_files" : 18, + "num_rows_loaded" : 52289369, + "num_warnings" : 0, + "data_size_gb" : 48.6947402954102, + "num_chunk_overlap_files" : 23, + "num_rows" : 52289369 + }, + }, + "num_warnings" : 0, + "num_files_by_status" : { + "LOAD_FAILED" : 0, + "IN_PROGRESS" : 0, + "CANCELLED" : 0, + "CREATE_FAILED" : 0, + "READ_FAILED" : 0, + "FINISHED" : 311, + "START_FAILED" : 0 + }, + "num_chunk_overlap_files" : 155, + "data_size_gb" : 207.849166870117 + }, + "files" : [] + } + }, + +**Note**: the report doesn't have any entries for individual contributions in the attribute ``files``. Only the summary info +in the attribute ``summary`` is provided. + + +.. _ingest-trans-management-start: + +Start a transaction +------------------- + +Transactions are started by this service: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``POST`` + - ``/ingest/trans`` + +The following JSON object is required to be sent in the body of a request: + +.. code-block:: + + { "database" : , + "context" : + } + +Where: + +``database`` : *string* + The required name of the database definintg a scope of the new transaction. + +``context`` : *object* = ``{}`` + The optional arbitrary workflow-defined object to be stored in the persistet state of + the Ingest System for the transaction. It's up to the workflow to decide what to store in the object. + For exaqmple, this information could be used later for recovering from errors during the ingest, for + general bookkeeping, data provenance, visualization purposes, etc. A value of this attribute, if provided, + must be a valid JSON object. The object could be empty. + + **Note**: The current implementation of the Qserv Ingest system limits the size of the context object by **16 MB**. + +In case of successfull completion of a request (see :ref:`ingest-general-error-reporting`) the service will return +the JSON object with a description of the new transaction: + +.. code-block:: + + { + "databases" : { + : { + "num_chunks" : , + "transactions" : [ + { + "begin_time" : , + "context" : {...}, + "database" : , + "end_time" : , + "id" : , + "log" : [], + "start_time" : , + "state" : "STARTED", + "transition_time" : + } + ] + } + }, + "success" : , + ... + } + } + +Where the attribute ``id`` representing a unique identifier of the transaction is the most important attribute +found in the object. A alue of the identifier needs to be memorized by a workflow to be used in the subsequent +requests to the transaction management services. + +The attribute ``start_time`` will be set to the current time in milliseconds since the UNIX *Epoch*. +And the state of the new transaction will be set to ``STARTED``. The ``end_time`` will be ``0``. A value of +the attribute ``context`` will be the same as it was provided on the input to the service, or the default +value if none was provided. + +.. _ingest-trans-management-end: + +Commit or abort a transaction +----------------------------- + +.. note:: + + - The current design of the service is not correct. The ``abort`` flag should be passed in the request's query + rather than in the body of the request. The service will be updated in the future to reflect the correct design. + + +Transactions are aborted or committed by the following service: + +.. list-table:: + :widths: 10 25 65 + :header-rows: 1 + + * - method + - service + - query parameters + * - ``PUT`` + - ``/ingest/trans/:id`` + - ``abort=<0|1>`` + +A unique identifier of the transaction is passed into the service in the resource's path parameter ``id``. +The only mandatory parameter of the request query is ``abort``. The value of the parameter is ``0`` to tell the services +that the transaction has to be committed normally. Any other number will be interpreted as a request to abort the transaction. + +Other parameters defining a request are passed via the request's body: + +.. code-block:: + + { + "context" : + } + +Where: + +``context`` : *object* = ``{}`` + The optional arbitrary workflow-defined object to be stored in the persistet state of + the Ingest System for the transaction. It's up to the workflow to decide what to store in the object. + For exaqmple, this information could be used later for recovering from errors during the ingest, for + general bookkeeping, data provenance, visualization purposes, etc. A value of this attribute, if provided, + must be a valid JSON object. The object could be empty. + + **Notes**: + + - A value provided in the attribute will replace the initial value specified (if any) at the transaction + start time (see :ref:`ingest-trans-management-start`). + - The current implementation of the Qserv Ingest system limits the size of the context object by **16 MB**. + +Upon successful completion of either request (see :ref:`ingest-general-error-reporting`) the service would return an updated +status of the transaction in a JSON object as it was explained in the section :ref:`ingest-trans-management-start`. + +State transitions of the transactions: + +- Aborted transactions will end up in the ``ABORTED`` state. +- Transactions that were committed will end up in the ``FINISHED`` state. +- In case of any problems encountered during an attempt to end a transaction, other states may be also reported + by the service. + +It's also safe to repeat either of the requests. The service will complain if the transaction won't be in +the ``STARTED`` state at a time when the request was received by the service. + +More information on the statuses of transactions can be found at: + +- :ref:`ingest-trans-management-status` + +.. _ingest-trans-management-descriptor: + +Transaction descriptor +---------------------- + +.. note:: + + This section uses a database ``gaia_edr3`` and transaction ``1630`` as an example. + +The content of a JSON object returned by the services varies depending on a presense of the optional parameters: + +- ``include_context={0|1}`` +- ``contrib={0|1}`` +- ``contrib_long={0|1}`` +- ``include_log={0|1}`` +- ``include_warnings={0|1}`` +- ``include_retries={0|1}`` + +Subsections below describe the gradual expantion of the JSON object returned by the services as the optional parameters +are set to ``1``. + +.. _ingest-trans-management-descriptor-short: + +Shortest form +^^^^^^^^^^^^^ + +The shortest form of the JSON object returned by the services when all optional parameters are set to ``0`` is: + +.. code-block:: + + { + "databases" : { + "gaia_edr3" : { + "is_published" : <0|1>, + "num_chunks" : , + "transactions" : [ + { + "id" : 1630, + "database" : "gaia_edr3", + "begin_time" : , + "start_time" : , + "end_time" : , + "transition_time" : , + "state" : , + "context" : , + "log" : + }, + +Where: + +``is_published`` : *number* + The flag tells whether the database is *published* or not. + +``num_chunks`` : *number* + The total number of chunks in the database, regardless if any contributons were made into the chunks + in a context of any transaction. Chunks need to be registered in Qserv before the corresponding MySQL tables + can be populated with data. This information is meant to be used for the monitoring and Q&A purposes. + +``id`` : *number* + The unique identifier of the transaction. + +``database`` : *string* + The name of the database the transaction is associated with. + +``begin_time`` : *number* + The timestamp of the transaction creation in milliseconds since the UNIX *Epoch*. The value is + set by the service when the transaction is registered in the system and assigned + a state ``IS_STARTING``. The value is guaranteed to be not ``0``. + +``start_time`` : *number* + The timestamp of the transaction start in milliseconds since the UNIX *Epoch*. The value is + set by the service when the transaction is started (gets into the ``STARTED`` state). + The value is ``0`` while while teh transaction is still in a state ``IS_STARTING``. + +``end_time`` : *number* + The timestamp of the transaction end in milliseconds since the UNIX *Epoch*. The value is + set by the service when the transaction is ended (committed, aborted or failed). A value + of the atrribite is ``0`` if the transaction is still active. + +``transition_time`` : *number* + The timestamp of the last state transition in milliseconds since the UNIX *Epoch*. The value is + set by the service when the transaction gets into states ``IS_FINISHING`` (the committing process + was initiated) or ``IS_ABORTING`` (the aborting process was initiated). The value would be set + to ``0`` before that. + +``state`` : *string* + The current state of the transaction. The possible values and their meanings are explained in + the dedicated section: + + - :ref:`ingest-trans-management-states` + +``context`` : *object* + The object that was provided by a workflow at the transaction start time, or updated during transaction + commit/abort time. The object could be empty. The object could be used for the recovery from errors during + the ingest, for general bookkeeping, data provenance, visualization purposes, etc. + +``log`` : *array* + The array of log entries. Each entry is a JSON object that has the following attributes: + + - ``id`` : *number* - The unique identifier of the log entry. + - ``transaction_state`` *string* : - The state of the transaction at the time the log entry was generated. + - ``name`` : *string* - The name of the event that triggered the log entry. + - ``time`` : *number* - The timestamp of the event in milliseconds since the UNIX *Epoch*. + - ``data`` : *object* - The data associated with the event. + +.. _ingest-trans-management-descriptor-contrib-summary: + +With a summary of contributions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Setting the query parameters to ``contrib=1`` (regardless if ``contrib_long`` is set to ``0`` or ``1``) +will result in expaning the ``transaction`` block with the ``summary`` object. The object will +include the summary info on all contributions made in a sewcope of the transaction. + +The following object illustrates the idea (where most of the previous explained attributes and all +worker-level stats but the one for ``db12`` are omitted for brevity): + +.. code-block:: + + "transactions" : [ + { + "contrib" : { + "summary" : { + "first_contrib_begin" : 1726026383616, + "last_contrib_end" : 1726026945059, + "num_rows" : 223420722, + "num_rows_loaded" : 223420722, + "num_regular_files" : 0, + "num_chunk_files" : 156, + "num_failed_retries" : 0, + "num_workers" : 9, + "table" : { + "gaia_source" : { + "data_size_gb" : 201.872497558594, + "num_rows_loaded" : 217028788, + "num_rows" : 217028788, + "num_files" : 156, + "num_failed_retries" : 0, + "num_warnings" : 0 + "overlap" : { + "data_size_gb" : 5.97671127319336, + "num_rows" : 6391934, + "num_rows_loaded" : 6391934, + "num_files" : 155, + "num_failed_retries" : 0, + "num_warnings" : 0 + } + } + }, + "worker" : { + "db12" : { + "data_size_gb" : 48.6947402954102, + "num_rows" : 52289369, + "num_rows_loaded" : 52289369, + "num_regular_files" : 0, + "num_chunk_files" : 18, + "num_chunk_overlap_files" : 23, + "num_failed_retries" : 0, + "num_warnings" : 0, + }, + } + } + +The ``summary`` object includes 3 sets of attributes: + +- The general stats on the contributions made in a scope of the transaction. +- The stats on the contributions made into the table ``gaia_source`` across all workers. +- The stats on the contributions made into into tables by the worker ``db12``. + +These are the general (transaction-level) stats: + +``first_contrib_begin`` : *number* + The timestamp of the first contribution in milliseconds since the UNIX *Epoch*. This is the time when a processing of the contribution started. + +``last_contrib_end`` : *number* + The timestamp of the last contribution in milliseconds since the UNIX *Epoch*. This is the time when a processing of the contribution ended. + +``num_rows`` : *number* + The total number of rows parsed in all input contributions made in a scope of the transaction. + +``num_rows_loaded`` : *number* + The total number of rows that were actually loaded into the destination table(s) in all contributions made in a scope of the transaction. + + **Note**: Normally the number of rows loaded should be equal to the number of rows parsed. If the numbers differ it means that some + rows were rejected during the ingest process. The workflow should be always monitoring any mismatches in these values and trigger alerts. + +``num_regular_files`` : *number* + The total number of regular files (not chunk files) parsed in all input contributions. + +``num_chunk_files`` : *number* + The total number of chunk files parsed in all input contributions. + +``num_failed_retries`` : *number* + The total number of retries that failed during the ingest process. + + **Note**: In most cases it's okay that the number of failed retries is not zero. The system is designed to retry + the ingest of the failed contributions. A problem is when the number of such failures detected in the scope of + a single contribution exceeds a limit set at the Ingest system. The workflow should be always monitoring + the number of failed retries and trigger alerts if the number is too high. + +``num_workers`` : *number* + The total number of workers that were involved in the ingest process. + + +.. _ingest-trans-management-descriptor-contrib-long: + +With detailed info on contributions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Setting the query parameters to ``contrib=1`` and ``contrib_long=1`` will result in expaning the ``contrib`` object +with the ``files`` array. Each entry (JSON object) in the array represents a contribution. The objects provides +the detailed info on all contributions made in a scope of the transaction: + +.. code-block:: + + "transactions" : [ + { + "contrib" : { + "files" : [ + , + ... + + ] + } + } + ] + +The schema of the contribution objects is covered by: + +- :ref:`ingest-worker-contrib-descriptor` + +**Note**: Extended info on warnings and retries posted during contribution loading are still disabled in this case. +To enable warnings use the parameter ``include_warnings=1``. To enable retries use the parameter ``include_retries=1``. + +.. _ingest-trans-management-states: + +Transaction states +------------------ + +Transactions have well-defined states and the state transition algorithm. Normally, Ingest System moves a transaction +from one state to another in response the explicit transaction management requests made by a workflow. In some cases +the Replication/Ingest system may also change the states. + +.. image:: /_static/ingest-transaction-fsm.png + :target: ../../../../../_images/ingest-transaction-fsm.png + :alt: State Transition Diagram + +A few comments on the diagram: + +- States ``STARTED``, ``FINISHED`` and ``ABORTED`` which are shown in grey boxes are the *intended* stable states of + a transaction. These states are *expected* to be reached by the transactin management requests. +- States ``START_FAILED``, ``FINISH_FAILED`` and ``ABORT_FAILED`` which are shown in red are the *unintended* intermediate + stable states of a transaction. the transaction gets into these states when the system encounters problems during + processing of the corresponding transaction management requests. Transitions into these states are shown as red dashed lines. + The only way to get out of these states is to fix the underlying problem (could be a problem with an infrastructure, data + or bugs in the Inges system or Qserv) and issue another transaction management request to *abort* the transaction. + + .. hint:: + + - In many cases a reason of the failure is reported in the response object returned by the corresponding transaction + management request. + +- States ``IS_STARTING``, ``IS_FINISHING`` and ``IS_ABORTING`` are the *transient* unstable states which are meant to be + passed through by a transaction on its way to the desired *intended* stable state. The states are used by the system + to indicate a significant (and often - lengthy) transformation of the data or metadata triggered by the state transition + of the transaction. + + - In some cases the transaction may be staying on one of these states for a while. For example, when the *commit* request + was initiated for the transaction and if the database options specified by a workflow require the system to build + the *director* index of the *director* table at the *commit* time of the transactions. The system will keep + the transaction in the state ``IS_FINISHING`` until the index is built. The state will be changed to ``FINISHED`` + once the index is built successfully. + + - It's possible that a transaction may get stuck in one of these *transient* states. The only scenario when this may + happen in the current implementation would be when the Master Replication Controller gets restarted while the transaction + is in one of these states. The system will not be able to resume the transaction processing after the restart. + This limitation will be addresed in the future. + + +The following table explains possible state transitions of a transaction: + +.. list-table:: + :widths: 10 80 10 + :header-rows: 1 + + * - state + - description + - next states + * - ``IS_STARTING`` + - The initial (transient) state assigned to a transaction right after it's registered in the system + in response to a request to start a transaction: :ref:`ingest-trans-management-start`. + This transient state that should be changed to ``STARTED`` or ``START_FAILED``. + The former state is assigned to a transaction that was successfully started, the latter + to a transaction that failed to start. + + - | ``START`` + | ``START_FAILED`` + + * - ``STARTED`` + - The active state of a transaction that is ready to accept data ingest requests. + When the system receives a request to commit or abort the transaction (see :ref:`ingest-trans-management-end`) + the state would transition to the corresponding transient states ``IS_FINISHING`` or ``IS_ABORTING``. + - | ``IS_FINISHING`` + | ``IS_ABORTING`` + + * - ``IS_FINISHING`` + - The transient state assigned to a transaction that is in the process of being committed. + Depending on the database options specified by a workflow, the transaction may stay in this state + for a while. + The state will change to ``FINISHED`` in case of the succesfull completion of a request, or it may + land in in the ``FINISH_FAILED`` state in case of any problems en countered during the request + execution. A transaction may also get into the ``IS_ABORTING`` state if a workflow issues the abort + request while the transaction is being finished. + + - | ``FINISHED`` + | ``FINISH_FAILED`` + | ``IS_ABORTING`` + + * - ``IS_ABORTING`` + - The transitional state triggered by the transaction abort request (see :ref:`ingest-trans-management-end`). + - | ``ABORTED`` + | ``ABORT_FAILED`` + + * - ``FINISHED`` + - The final state of a transaction that was successfully committed. + - + + * - ``ABORTED`` + - The final state of a transaction that was successfully aborted. + - + + * - ``START_FAILED`` + - The (inactive) state of a transaction that failed to start. The state allows + a workflow to initiate the transaction abort request. + - ``IS_ABORTING`` + + * - ``FINISH_FAILED`` + - The (inactive) state of a transaction that failed to to be commited. The state allows + a workflow to initiate the transaction abort request. + - ``IS_ABORTING`` + + * - ``ABORT_FAILED`` + - The (inactive) state of a transaction that failed to to be aborted. The state allows + a workflow to initiate another transaction abort request (or requests). + - ``IS_ABORTING`` + diff --git a/doc/ingest/api/reference/rest/general.rst b/doc/ingest/api/reference/rest/general.rst new file mode 100644 index 0000000000..85603dd920 --- /dev/null +++ b/doc/ingest/api/reference/rest/general.rst @@ -0,0 +1,314 @@ +General guidelines +================== + +.. _ingest-general-request-headers: + +Request headers +--------------- + +All (but those where it's explicitly stated otherwise) services accepting requests send with ``POST``, ``PUT`` or ``DELETE`` +methods require the following HTTP header to be sent in the request's body along with the JSON request object: + +.. code-block:: + + Content-Type: application/json + +When requests are sent using the command line application ``curl`` then the following option must be used: + +.. code-block:: bash + + curl -X -H "Content-Type: application/json" + +In this case a JSON object can be specified using one of the following methods: + +.. code-block:: bash + + echo '{...}' | curl -X -H
    -d@- + curl -X -H
    -d '{...}' + +Where ``{...}`` represents a JSON object with details of the request. The object may not be required for some requests. +Specific requirements for this will be mentioned in each service. If the object is not required for a for particular +request then the body is allowed to be empty, or it could be an empty JSON object ``{}``. + +All (no exception) services return results and errors as JSON objects as explained in the next subsection below. + +.. _ingest-general-error-reporting: + +Error reporting when calling the services +----------------------------------------- + +.. note: + + The error reporting mechanism implemented in the System serves as a foundation for building reliable workflows. + +All services explained in the document adhere to the usual conventions adopted by the Web community for designing and using the REST APIs. In particular, HTTP code 200 is returned if a request is well-formed and accepted by the corresponding service. Any other code shall be treated as an error. However, the implementation of the System further extends the error reporting mechanism by guaranteeing that all services did the fine-grain error reporting in the response objects. All services of the API are guaranteed to return an JSON object if the HTTP code is 200. The objects would have the following mandatory attributes (other attributes depend on a request): + +.. code-block:: + + { "success" : , + "error" : , + "error_ext" : , + ... + } + +**Note**: depending on the service, additional attributes may be present in the response object. + +Therefore, even if a request is completed with HTTP code ``200``, a client (a workflow) must inspect the above-mentioned +fields in the returned object. These are the rules for inspecting the status attributes: + +- Successful completion of a request is indicated by having success=1 in the response. In these cases, the other + two fields should be ignored. +- Otherwise, a human-readable explanation of a problem would be found in the error field. +- Request-specific extended information on errors is optionally provided in the error_ext field. + +Optional warnings +^^^^^^^^^^^^^^^^^ + +**Note**: Warnings were introduced as of version ``12`` of the API. + +REST services may also return the optional attribute ``warning`` a caller about potential problems with a request. +The very presence of such a warning doesn't necessarily mean that the request failed. Users are still required +to use the above-described error reporting mechanism for inspecting the completion status of requests. +Warnings carry the additional information that may be present in any response regardless if it succeeded or not. +It's up to a user to interpret this information based on a specific request and the context it was made. + +Here is what to expect within the response object if the warning was reported: + +.. code-block:: + + { "success" : , + "warning" : , + ... + } + +.. _ingest-general-auth: + +Authorization and authentication +-------------------------------- + +All services accepting requests sent with ``POST``, ``PUT`` or ``DELETE`` methods require the following attribute +to be present in the request object: + +``auth_key`` : *string* + The authentication key that is required for an operation. The key is used to prevent unauthorized access to the service. + +Certain requests (where it's specificly stated by the description of the service) may require the elevated privileges +to be specified in the following attribute: + +``admin_auth_key`` : *string* + The Administrator-level authentication key that is required for an operation. The key is used to prevent unauthorized + access to the service that will modify existing data visible to Qserv users. + +.. _ingest-general-versioning: + +Protocol Versioning +------------------- + +The API adheres to the optional version control mechanism introduced in: + +- https://rubinobs.atlassian.net/browse/DM-35456 + +Workflow developers are encouraged to use the mechanism to reinforce the integrity of the applications. + +There are two ways the workflows can use the version numbers: + +- *pull mode*: Ask the Replication Controller explicitly what version it implements and cross-check the returned + version versus a number expected by the application. +- *push mode*: Pass the expected version number as a parameter when calling services and let + the services verify if that version matches one of the frontend implementations. + +Workflow developers are free to use neither, either of two, or both methods of reinforcing their applications. + +Pull mode +^^^^^^^^^ + +To support the first scenario, the API provides a special metadata service that will return +the version number (along with some other information on the frontend): + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``GET`` + - ``/meta/version`` + +The request object for this request is not required, or it could be an empty JSON object ``{}``. +In case of its successful completion, the service will return a JSON object that will include +the following attributes (along with the other standard attributed that are used for error reporting): + +.. code-block:: + + { "kind" : , + "name" : , + "id" : , + "instance_id" : , + "version" : , + "database_schema_version" : , + "success" : , + "warning" : , + "error" : , + "error_ext" : + } + +Where, the service-specific attributes are: + +``kind`` : *string* + The name of the service. The following name is always reported: + + .. code-block:: + + replication-controller + +``name`` : *string* + The unique name of the frontend within a given Qserv. The current implementation will always return: + + .. code-block:: + + http + +``id`` : *number* + A unique identifier of the Replication Controller. The number returned here may vary. + +``instance_id`` : *string* + An identifier of the Qserv instance. A value of the attribute depends on a particular deployment of Qserv. + +``version`` : *number* + The current version number of the API. + +``database_schema_version`` : *number* + The schema version number of the Replication System's Database. + +Example: + +.. code-block:: json + + { "kind" : "replication-controller", + "id" : "9037c818-4820-4b5e-9219-edbf971823b2", + "instance_id" : "qserv_proj", + "version" : 27, + "database_schema_version" : 14, + "success" : 1, + "error" : "", + "error_ext" : {}, + "warning" : "" + } + +Push mode +^^^^^^^^^ + +In the case of the second scenario, an application will pass the desired version number as +a request parameter. The number would be a part of the request's query for the method. For example, +the following request for checking the status of the ongoing query might look like this: + +.. code-block:: bash + + curl 'http://localhost:25004/trans/contrib/1234?version=35' -X GET + +For other HTTP methods used by the API, the number is required to be provided within the body +of a request as shown below: + +.. code-block:: bash + + curl 'http://localhost:25004/trans/contrib' -X POST \ + -H 'Content-Type: application/json' \ + -d'{"version":35, ..."}' + +If the number does not match expectations, such a request will fail and the service return the following +response. Here is an example of what will happen if the wrong version number ``29`` is specified instead +of ``35`` (as per the current version of the API): + +.. code-block:: json + + { "success" : 0, + "error" : "The requested version 29 of the API is not in the range supported by the service.", + "error_ext": { + "max_version" : 35, + "min_version" : 32 + }, + "warning" : "" + } + +.. _ingest-general-binary-encoding: + +Binary encoding of the data in JSON +----------------------------------- + +The API supports encoding of the binary data into JSON. The encoding specification is provided as a parameter +``binary_encoding`` when calling several services. The parameter may be optional and if not provided, the default +value is ``hex``. The parameter is used by the services and by the client applications in two different ways: + +- When a client is sending data to a service, the client is required to tell the service how the binary data are encoded. + The service would invoke the corresponding decoding algorithm to decode the data into the original representation. + +- A service designed for sending data to a client is expected to get the name of the desired encoding + algorithm in a request to the service. The service would then encode the binary data into the JSON object + using the specified algorithm. + +The following options for the values of the parameter are allowed in the current version of the API: + +- ``hex`` - for serializing each byte into the hexadecimal format of 2 ASCII characters per each byte + of the binary data, where the encoded characters will be in a range of ``0 .. F``. In this case, + the encoded value will be packaged into the JSON string. +- ``b64`` - for serializing bytes into a string using the ``Base64`` algorithm with padding (to ensure 4-byte alignment). +- ``array`` - for serializing bytes into the JSON array of numbers in a range of ``0 .. 255``. + +Here is an example of the same sequence of 4-bytes encoded into the hexadecimal format: + +.. code-block:: + + 0A11FFD2 + +The array representation of the same binary sequence would look like this: + +.. code-block:: json + + [10,17,255,210] + +MySQL types (regardless of the case) that include the following keywords are treated as binary: + +.. code-block:: sql + + BIT + BINARY + BLOB + +For example, these are the binary types: + +.. code-block:: sql + + BIT(1) + BINARY(8) + VARBINARY(16) + TINYBLOB + BLOB + MEDIUMBLOB + LONGBLOB + + +.. _ingest-general-base-table-names: + +Base versus final table names +----------------------------- + +In descriptions of several services, the documentation uses an adjective *base* when referring to tables affected +by requests to the services. In reality, those *base* tables are exactly the names of the Qserv tables as they are seen +by Qserv users. In the distributed realm of Qserv each such table is collectively represented by many *final* tables +distributed across Qserv worker nodes. The names of the *final* tables depend on the table type: + +- *regular* (fully replicated) tables have the same name as the *base* table +- *partitioned* (chunked) tables have names constructed using the *base* name and the chunk numbers and values + of the overlap attribute of the table. + +Formally, the names of the *final* tables are constructed as follows: + +.. code-block:: + + = | _ | FullOverlap_ + +For example: + +.. code-block:: + + Filter + Object_1234 + ObjectFullOverlap_1234 diff --git a/doc/ingest/api/reference/rest/index.rst b/doc/ingest/api/reference/rest/index.rst new file mode 100644 index 0000000000..84746cc61a --- /dev/null +++ b/doc/ingest/api/reference/rest/index.rst @@ -0,0 +1,10 @@ +############# +REST Services +############# + +.. toctree:: + :maxdepth: 3 + + general + controller/index + worker/index diff --git a/doc/ingest/api/reference/rest/worker/index.rst b/doc/ingest/api/reference/rest/worker/index.rst new file mode 100644 index 0000000000..32884f83ab --- /dev/null +++ b/doc/ingest/api/reference/rest/worker/index.rst @@ -0,0 +1,915 @@ +#################### +Worker Ingest Server +#################### + +.. note:: + + Services explained in this section are provided directly by Qserv workers, not by the main REST server of + the Master Replication Controller. Each Qserv worker runs a dedicated Ingest Server that is reponsible for + ingesting and managing catalogs located on the coresponding worker. Ingest workflows interact directly with + workers using this API. The DNS names (IP addresses) of the corresponding hosts and the relevant port numbers + of the worker services are returned by requests sent to the Master Replication Controller's services: + + - :ref:`table-location-chunks` + - :ref:`table-location-chunks-one` + - :ref:`table-location-regular` + +.. _ingest-worker-contrib-by-ref: + +Ingesting contributions by reference +==================================== + +Contribution ingest requests can be initiated using one of these techniques: + +- *synchronous processing*: a client will get blocked for the duration of the request before it finishes (or failed) + to be executed. After that, the client would have to analyze the final state of the request from a response sent + by the service. +- *asynchronous processing*: a client will not be blocked. Once the request's parameters were successfully parsed and + analyzed (and accepted), the request will be queued for asynchronous processing. After that, the service will send back + a response with the unique identifier and the current status of the request. The workflow will have to use the identifier + to track the progression of the request. For requests that failed the validation stage information on reasons for + the failure will be returned. + +The following REST services implement these protocols: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``POST`` + - | ``/ingest/file`` + | ``/ingest/file-async`` + +The services expect a caller to provide a description of a request in the request's body in a form of a JSON object. +The object should adhere to the following schema: + +.. code-block:: + + { + "transaction_id" : , + "table" : , + "chunk" : , + "overlap" : , + + "url" : , + + "fields_terminated_by" : , + "fields_enclosed_by" : , + "fields_escaped_by" : , + "lines_terminated_by" : , + "charset_name" : , + + "http_method" : , + "http_data" : , + "http_headers" : , + + "max_num_warnings" : , + "num_retries" : + } + + +Where: + +``transaction_id`` : *number* + The required unique identifier of a transaction that is required to be in the ``STARTED`` state + at a time when a request is received by a service. More information on the transaction management and transaction + states can be found in: :ref:`ingest-trans-management`. + +``table`` : *string* + The required *base* name of a table receiving the contribution. See :ref:`ingest-general-base-table-names` for more details + on the meaning of the attriute *base* in a context of this API. + +``chunk`` : *number* + The required chunk number for the partitioned tables. + + **Note**: ignored for the *regular* tables. + +``overlap`` : *number* + The required numeric flag indicates a kind of partitioned table (``0`` if this is not the *overlap* + table or any other number of this is the *overlap* table). + + **Note**: ignored for the *regular* tables. + +``url`` : *string* + The required location of a file to be ingested. The current implementation supports the following schemes: + + - ``file:///``: A file on a filesystem that is mounted locally on the corresponding worker. Note that + the file path must be absolute. See details on this subject at: https://en.wikipedia.org/wiki/File_URI_scheme. + + - ``http://``, ``https://``: A file on a web server. For either of these schemes, additional + attributes (if needed) for pulling a file over the specified protocol could be provided in optional parameters: + ``http_method``, ``http_data`` and ``http_headers``. Descriptions of the parameters are provided below in this table. + + **Note**: Workflows may also configure the behavior of the ``libcurl`` library by settting the library-specific + options at a level of a database. See instructions at: :ref:`ingest-config`. + +``fields_terminated_by`` : *string* = ``\t`` + The optional parameter of the desired CSV dialect: a character that separates fields in a row. + The dafault value assumes the tab character. + +``fields_enclosed_by`` : *string* = ``""`` + The optional parameter of the desired CSV dialect: a character that encloses fields in a row. + The default value assumes no quotes around fields. + +``fields_escaped_by`` : *string* = ``\\`` + The optional parameter of the desired CSV dialect: a character that escapes special characters in a field. + The default value assumes two backslash characters. + +``lines_terminated_by`` : *string* = ``\n`` + The optional parameter of the desired CSV dialect: a character that separates rows. + The default value assumes the newline character. + +``charset_name`` : *string* = ``latin1`` + The optional parameters specify the desired character set name to be assumed when ingesting + the contribution. The default value may be also affected by the ingest services configuration. + See the following document for more details: + + - **TODO**: A reference to the page "Specifying character sets when ingesting tables into Qserv" + +``http_method`` : *string* = ``GET`` + The optional method that is used to pull a file over the HTTP protocol. + +``http_data`` : *string* = ``""`` + The optional data that is sent in the body of the HTTP request. + The default value assumes no data are sent. + +``http_headers`` : *string* = ``""`` + The optional list of headers that are sent in the HTTP request. + The default value assumes no headers are sent. A value of the parameters is a string that contains + zero, one or many headers definition string separated by a colon, where each such definition should look like: + + .. code-block:: + + : + +``max_num_warnings`` : *number* = ``64`` + The optional limit for the number of notes, warnings, and errors to be retained by MySQL/MariaDB when + loading the contribution into the destination table. + + **Note**: The default number of the limit is determined by a configuration of the ingest services. + The default value of the parameter in MySQL/MariaDB is ``64``. The upper limit for the parameter is ``65535``. + Some workflows may choose to set a specific value for the limit when debugging data of the contributions. + + **TODO**: "Configuration Guide for the Replication/Ingest System" (a reference to the page) + +``num_retries`` : *number* : **optional** + The optional number of automated retries of failed contribution attempts in cases when + such retries are still possible. The limit can be further limited by the ingest service to a value that will + not exceed the "hard" limit set in the worker configuration parameter (``worker``, ``ingest-max-retries``). + Setting a value of the parameter to ``0`` will explicitly disable automatic retries regardless of the server's + configuration settings. + + **Notes**: + + - The parameter is ignored by the *synchronous* service. + - The default number of retries set in the Inget Server's configuration parameter + (``worker``, ``ingest-num-retries``) will be assumed. + + **TODO**: "Configuration Guide for the Replication/Ingest System" (a reference to the page) + +The service will return the following JSON object: + +.. code-block:: + + { "contrib": { + ... + } + } + +See the :ref:`ingest-worker-contrib-descriptor` section of document for the details on the schema of the response object. + +.. _ingest-worker-contrib-by-val: + +Ingesting contributions by value +================================ + +Contributions can be also ingested by sending data directly to the worker server in the request body. There are two sevices +in this category. Both techniques are *synchronous* and the client will be blocked until the request is processed: + +- sending data as a JSON object +- sending data as a ``CSV`` file in the ``multipart/form-data`` formatted body + +Each technique has its own pros and cons. + +.. _ingest-worker-contrib-by-val-json: + +JSON object +----------- + +The following service allows a workflow to push both data and a description of the contribution request as a JSON object: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``POST`` + - ``/ingest/data`` + +The service expects a caller to provide a description of a request in the request's body in a form of a JSON object: + +.. code-block:: + + { + "transaction_id" : , + "table" : , + "chunk" : , + "overlap" : , + "charset_name" : , + "binary_encoding" : , + "max_num_warnings" : , + "rows" : [ + , + ... + + ] + } + +Where: + +``transaction_id`` : *number* + The required unique identifier of a transaction that has to be in the ``STARTED`` state + at a time when a request is received by a service. More information on the transaction management and transaction + states can be found in: :ref:`ingest-trans-management`. + +``table`` : *string* + The required *base* name of a table receiving the contribution. See :ref:`ingest-general-base-table-names` for more details + on the meaning of the attriute *base* in a context of this API. + +``chunk`` : *number* + The required chunk number for the partitioned tables. + + **Note**: ignored for the *regular* tables. + +``overlap`` : *number* + The required numeric flag indicates a kind of partitioned table (``0`` if this is not the *overlap* + table or any other number of this is the *overlap* table). + + **Note**: ignored for the *regular* tables. + +``charset_name`` : *string* = ``latin1`` + The optional value depends on Qserv settings. + +``binary_encoding`` : *string* = ``hex`` + See :ref:`ingest-general-binary-encoding` for more details. + +``max_num_warnings`` : *number* = ``64`` + The optional limit for the number of notes, warnings, and errors to be retained by MySQL/MariaDB when + loading the contribution into the destination table. + + **Note**: The default number of the limit is determined by a configuration of the ingest services. + The default value of the parameter in MySQL/MariaDB is ``64``. The upper limit for the parameter is ``65535``. + Some workflows may choose to set a specific value for the limit when debugging data of the contributions. + + **TODO**: "Configuration Guide for the Replication/Ingest System" (a reference to the page) + +``rows`` : *array* + The required collection of the data rows to be ingested. Each element of the array represents a complete row, + where elements of the row represent values of the corresponding columns in the table schema: + + .. code-block:: + + [[, ... ], + ... + [, ... ] + ] + + **Note**: + + - The number of elements in each row must be the same as the number of columns in the table schema. + - Positions of the elements within rows should match the positions of the corresponding columns in the table schema. + - see the :ref:`ingest-db-table-management-register-table` section for the details on the table schema. + +The service will return the following JSON object: + +.. code-block:: + + { "contrib": { + ... + } + } + +See the :ref:`ingest-worker-contrib-descriptor` section of document for the details on the schema of the response object. + +.. _ingest-worker-contrib-by-val-csv: + +CSV file +-------- + +.. warning:: + + The service expectes a certain order of the parts in the body of the request. The description of the contribution + request should be posted first, and the file payload should be posted second. There must be exactly one file payload + in the body of the request. No file or many files will be treated as an error and reported as such in the response. + +The following service allows a workflow to push both data (a ``CSV`` file) and a description of the contribution request in +the ``multipart/form-data`` formatted body: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``POST`` + - ``/ingest/csv`` + +The body should contain two parts posted in the following order: + +- a collection of the key-value pairs that represent the description of the contribution request +- a single file payload that contains the data to be ingested + +Where the keys which describe the contribution request are presented below: + +``transaction_id`` : *number* + The required unique identifier of a transaction that has to be in the ``STARTED`` state + at a time when a request is received by a service. More information on the transaction management and transaction + states can be found in: :ref:`ingest-trans-management`. + +``table`` : *string* + The required *base* name of a table receiving the contribution. See :ref:`ingest-general-base-table-names` for more details + on the meaning of the attriute *base* in a context of this API. + +``chunk`` : *number* + The required chunk number for the partitioned tables. + + **Note**: ignored for the *regular* tables. + +``overlap`` : *number* + The required numeric flag indicates a kind of partitioned table (``0`` if this is not the *overlap* + table or any other number of this is the *overlap* table). + + **Note**: ignored for the *regular* tables. + +``charset_name`` : *string* = ``latin1`` + The optional parameter that depends on Qserv settings. + +``fields_terminated_by`` : *string* = ``\t`` + The optional parameter of the desired CSV dialect: a character that separates fields in a row. + +``fields_enclosed_by`` : *string* = ``""`` + The optional parameter of the desired CSV dialect: a character that encloses fields in a row. + The default value assumes no quotes around fields. + +``fields_escaped_by`` : *string* = ``\\`` + The optional parameter of the desired CSV dialect: a character that escapes special characters in a field. + The default value assumes two backslash characters. + +``lines_terminated_by`` : *string* = ``\n`` + The default value of the optional parameter assumes the newline character. + +``max_num_warnings`` : *number* = ``64`` + The optional limit for the number of notes, warnings, and errors to be retained by MySQL/MariaDB when + loading the contribution into the destination table. + + **Note**: The default number of the limit is determined by a configuration of the ingest services. + The default value of the parameter in MySQL/MariaDB is ``64``. The upper limit for the parameter is ``65535``. + Some workflows may choose to set a specific value for the limit when debugging data of the contributions. + + **TODO**: "Configuration Guide for the Replication/Ingest System" (a reference to the page) + +The service will return the following JSON object: + +.. code-block:: + + { "contrib": { + ... + } + } + +See the :ref:`ingest-worker-contrib-descriptor` section of document for the details on the schema of the response object. + +Here is an example of how the request could be formatted using ``curl``: + +.. code-block:: bash + + curl http://localhost:25004/ingest/csv \ + -X POST -H 'Content-Type: multipart/form-data' \ + -F 'transaction_id=1630'\ + -F 'table=gaia_source' \ + -F 'chunk=675' \ + -F 'overlap=0' \ + -F 'charset_name=latin1' \ + -F 'fields_terminated_by=,' \ + -F 'max_num_warnings=64' \ + -F 'file=@/path/to/file.csv' + +**Note**: the request header ``-H 'Content-Type: multipart/form-data'`` is not required when using ``curl``. The header +is added here for the sake of clarity. + +Another example is based on Python's ``requests`` library and the ``requests_toolbelt`` package: + +.. code-block:: python + + import requests + from requests_toolbelt.multipart.encoder import MultipartEncoder + import urllib3 + + # Supress the warning about the self-signed certificate + urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + + url = "http://localhost:25004/ingest/csv" + encoder = MultipartEncoder( + fields = { + "transaction_id": (None, "1630"), + "table": (None, "gaia_source"), + "chunk": (None, "675"), + "overlap": (None, "0"), + "charset_name": (None, "latin1"), + "fields_terminated_by": (None, ","), + "max_num_warnings": (None, "64"), + "file": ("file.csv", open("/path/to/file.csv", "rb"), "text/csv") + } + ) + req = requests.post(url, data=encoder, + headers={"Content-Type": encoder.content_type}, + verify=False) + req.raise_for_status() + res = req.json() + if res["success"] == 0: + error = res["error"] + raise RuntimeError(f"Failed to ingest data ito the table: {error}") + +**Notes**: + +- The ``MultipartEncoder`` class from the ``requests_toolbelt`` package is used for both formatting + the request and sending it in the *streaming* mode. The mode is essential for avoiding memory problem + on the client side when pushing large contributons into the service. W/o the streaming mode the client + will try to load the whole file into memory before sending it to the server. +- The parameter ``verify=False`` is used to ignore SSL certificate verification. Also note using ``urllib3`` + to suppress the certificate-related warning. Do not use this in production code. + +.. _ingest-worker-contrib-get: + +Status of requests +================== + +There are two services in this group. The first one allows retrieving the status info of a single request by +its identifier. The second service is meant for querying statuses of all asynchronous requests of the given transaction. + +.. _ingest-worker-contrib-get-one: + +One request +----------- + +The service allows obtaining a status of the *asynchronous* contribution requests: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``GET`` + - ``/ingest/file-async/:id`` + +The services expect a caller to provide a unique identifier ``id`` of the contribution request in the resource path. +Values of the identifiers are returned by services that accept the contribution requests. + +If the identifier is valid and the service could locate the desired record for the contributon it will return the following +JSON object: + +.. code-block:: + + { "contrib": { + ... + } + } + +See the :ref:`ingest-worker-contrib-descriptor` section of document for the details on the schema of the response object. + +.. _ingest-worker-contrib-get-trans: + +All requests of a transaction +----------------------------- + +The service allows obtaining a status of the *asynchronous* contribution requests submitted in a scope of +a given transaction: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``GET`` + - ``/ingest/file-async/trans/:id`` + +The services expect a caller to provide a unique identifier ``id`` of the transaction in the resource path. +Values of the transaction identifiers are returned by services that manage transactions. See :ref:`ingest-trans-management` +for more details. + +If the identifier is valid and the service could locate the relevant contributons it will will return the following +JSON array: + +.. code-block:: + + { "contribs": [ + , + .. + + ] + } + +See the :ref:`ingest-worker-contrib-descriptor` section of document for the details on the schema of the contribution objects. + + +.. _ingest-worker-contrib-retry: + +Retrying failed contributions +============================= + +.. note:: + + - Services, presented in this section complement those that were meant for the initial submission of the contribution + requests posted by *by-reference*, regardless of the interface used (*synchronous* or *asynchronous*) as documented + in :ref:`ingest-worker-contrib-by-ref`. The eligibility requirememnts for the requests are further explained in: + + - **TODO**: "Automatic retries for the failed contribution requests" (a reference to the page) + + - Unlike the *automatic* retries that may be configured in the original contribution request, + the *explicit* retrying is a responsibility of the ingest workflow. + - The number of the explicit retries is not a subject for limits set for the automatic retries. + It's up to the workflow to decide how many such retries should be attempted. The workflow should coordinate + the retries with the transaction managemnet to avoid the situation when the same request is retried + while the transaction is already in a state that doesn't allow the contribution to be processed. + - The workflow should avoid making multiple parallel requests to retry the same contribution request. + The workflow should be always waiting for the response of the previous retry before making another one. + - The *automatic* retries are disabled by the Ingest service while processing the explicitly made retries. + +Both *synchronous* and *asynchronous* services are provided for the retrying of the failed contributions: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``PUT`` + - | ``/ingest/file/:id`` + | ``/ingest/file-async/:id`` + +The services expect a caller to provide a unique identifier ``id`` of the contribution request to be retried. + +The services will locate and evaluate the specified request to see if it's eligible for retrying. And if it is then +the request will be processed in accordance with the logic of the called service. Specifically: + +- If the *synchronous* interface was invoked then the request will be attempted right away and only once (no further + automatic replies). +- If the alternative *asynchronous* interface was invoked then the request will be placed at the very end of the input + queue. It will be processed in its turn when picked by one of the processing threads of the ingest server's pool. + Likewise, in the case of *synchronous* processing, only one attempt to process the request will be made. + +The service will return the following JSON object: + +.. code-block:: + + { "contrib": { + ... + } + } + +See the :ref:`ingest-worker-contrib-descriptor` section of document for the details on the schema of the response object. + +.. _ingest-worker-contrib-cancel: + +Cancelling async requests +========================= + +.. warning:: + + In general, request cancellation is a non-deterministic operation that is prone to *race conditions*. + An outcome of the cancellation request depends on the current state of a request within the worker service: + + - If the request is still in the wait queue then the cancellation will be successful. + - If the request is already being processed by the ingest machinery then the cancellation will be successful + only if the request is still in the data *reading* state. + - Requests that are already in the *loading* state are presently not cancellable since MySQL table loading + is a non-interruptible operation. + - If the request is already in the *finished* or any form of the *failed* state then obviously no cancellation + will happen. + + The workflow should be always inspect the state of the requests after the cancellation attempts + to make sure that the requests were indeed cancelled. + +There are two services in this group. The first one allows canceling a single request by its identifier. +The second service is meant for cancelling all asyncgronous requests of the given transaction. + +.. _ingest-worker-contrib-cancel-one: + +One request +----------- + +The service allows cancelling an *asynchronous* contribution request: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``DELETE`` + - ``/ingest/file-async/:id`` + +The services expect a caller to provide a unique identifier ``id`` of the contribution request in the resource path. +Values of the identifiers are returned by services that accept the contribution requests. + +If the identifier is valid and the service could locate the desired record for the contributon it will make an attempt +to cancel it. The service will return the following JSON object: + +.. code-block:: + + { "contrib": { + ... + } + } + +See the :ref:`ingest-worker-contrib-descriptor` section of document for the details on the schema of the response object. + +.. _ingest-worker-contrib-cancel-trans: + +All requests of a transaction +----------------------------- + +The service allows cancelling all *asynchronous* contribution requests submitted in a scope of +a given transaction: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``DELETE`` + - ``/ingest/file-async/trans/:id`` + +The services expect a caller to provide a unique identifier ``id`` of the corresponding transaction in the resource path. +Values of the transaction identifiers are returned by services that manage transactions. See :ref:`ingest-trans-management` +for more details. + +If the identifier is valid and the service could locate the relevant contributons it will make an attempt +to cancel them. The service will return the following JSON array: + +.. code-block:: + + { "contribs": [ + , + .. + + ] + } + +See the :ref:`ingest-worker-contrib-descriptor` section of document for the details on the schema of the contribution objects. + + +.. _ingest-worker-contrib-descriptor: + +Contribution descriptor +======================= + +The following object illustrates the schema and a sample payload of the contribution descriptor: + +.. code-block:: json + + { + "id" : 2651966, + "async" : 1, + "database" : "gaia_edr3", + "table" : "gaia_source", + "worker" : "db13", + "chunk" : 675, + "overlap" : 0, + "transaction_id" : 1630, + + "status" : "FINISHED", + "create_time" : 1726026383616, + "start_time" : 1726026383619, + "read_time" : 1726026396161, + "load_time" : 1726026412474, + + "url" : "http://sdfqserv001:18080/gaia_edr3/gaia_source/files/chunk_675.txt", + "http_method" : "GET", + "http_headers" : [], + "http_data" : "", + "tmp_file" : "/qserv/data/ingest/gaia_edr3-gaia_source-675-1630-7570-6e63-d0b6-6934.csv", + + "max_num_warnings" : 64, + "max_retries" : 4, + + "charset_name" : "latin1", + "dialect_input" : { + "fields_enclosed_by" : "\\0", + "lines_terminated_by" : "\\n", + "fields_escaped_by" : "\\\\", + "fields_terminated_by" : "," + }, + + "num_bytes" : 793031392, + "num_rows" : 776103, + "num_rows_loaded" : 776103, + + "http_error" : 0, + "error" : "", + "system_error" : 0, + "retry_allowed" : 0, + + "num_warnings" : 0, + "warnings" : [], + "num_failed_retries" : 0, + "failed_retries" : [] + } + + +The most important (for the ingest workflows) attributes of the contribution object are: + +``status`` : *string* + The status of the contribution requests. The possible values are: + + - ``IN_PROGRESS``: The transient state of a request before it's ``FINISHED`` or failed. + - ``CREATE_FAILED``: The request was received and rejected right away (incorrect parameters, etc.). + - ``START_FAILED``: The request couldn't start after being pulled from a queue due to changed conditions. + - ``READ_FAILED``: Reading/preprocessing of the input file failed. + - ``LOAD_FAILED``: Loading into MySQL failed. + - ``CANCELLED``: The request was explicitly cancelled by the ingest workflow (ASYNC contributions only). + - ``FINISHED``: The request succeeded, + +``create_time`` : *number* + The timestamp when the contribution request was received (milliseconds since the UNIX *Epoch*). + A value of the attribute is guaranteed to be not ``0``. + +``start_time`` : *number* + The timestamp when the contribution request was started (milliseconds since the UNIX *Epoch*). + A value of the attribute is ``0`` before the processing starts. + +``read_time`` : *number* + The timestamp when the Ingest service finished reading/preprocessing the input file (milliseconds since the UNIX *Epoch*). + A value of the attribute is ``0`` before the reading starts. + +``load_time`` : *number* + The timestamp when the Ingest service finished loading the contribution into the MySQL table (milliseconds since the UNIX *Epoch*). + A value of the attribute is ``0`` before the loading starts. + +``url`` : *string* + The URL of the input file that was used to create the contribution. Depending on a source of the data, + the URL *scheme* could be: + + - ``http``, ``https``: The file was pulled from a remote Web server. + - ``file``: The file was read from a filesystem that is mounted locally on the corresponding worker. The URL is a full path to the file. + - ``data-json``: The file was sent as a JSON object in the request body. The URL is a placeholder. + - ``data-csv``: The file was sent as a CSV file in the ``multipart/form-data`` formatted body. The URL is a placeholder. + + **Note** that there is no guarantee that the URL will be valid after the contribution is processed. + +``max_num_warnings`` : *number* + The maximum number of the MySQL warnings to be captured after loading the contribution into the MySQL table. + The number may correspond to a value that was explicitly set by workflow when making a contribution request. + Otheriwse the default number configured at the system is assumed. + +``max_retries`` : *number* + The maximum number of retries allowed for the contribution. The number may correspond to a value that was explicitly set by workflow + when making a contribution request. Otheriwse the default number configured at the system is assumed. + +``num_bytes`` : *number* + The total number of bytes in the input file. The value is set by the service after it finishes reading + the file and before it starts loading the data into the MySQL table. + +``num_rows`` : *number* + The total number of rows parsed by the ingest service in the input file. + +``num_rows_loaded`` : *number* + The total number of rows loaded into the MySQL table. Normally the number of rows loaded should be equal to the number of rows parsed. + If the numbers differ it means that some rows were rejected during the ingest process. The workflow should be always monitoring any + mismatches in these values and trigger alerts. + +``http_error`` : *number* + The HTTP error code captured by the service when pulling data of the contribution from a remote Web server. + This applies to the corresponidng URL *schemes*. The value is set only if the error was detected. + +``error`` : *string* + The error message captured by the service during the contribution processing. The value is set only if the error was detected. + +``system_error`` : *number* + The system error code captured by the service during the contribution processing. The value is set only if the error was detected. + +``retry_allowed`` : *number* + The flag that tells if the contribution is allowed to be retried. The value is set by the service when the contribution + processing was failed. The value is set to ``1`` if the contribution is allowed to be retried, and to ``0`` otherwise. + + **Important**: The workflow should be always analyze a value of this attribute to decide if the contribution should be retried. + If the retry is not possible then the workflow should give up on the corresponding transaction, abort the one, and start + another transaction to ingest all contributions attempted in a scope of the aborted one. + +``num_warnings`` : *number* + The total number of MySQL warnings captured after loading the contribution into the MySQL table. + + **Note**: The number is reported correctly regardless if the array in the attribute ``warnings`` + is empty or not. + +``warnings`` : *array* + The array of MySQL warnings captured after loading the contribution into the MySQL table. Each entry is + an object that represents a warning/error/note. See the table in :ref:`ingest-worker-contrib-descriptor-warnings` + for the details on the schema of the object. + + **Notes**: The maximum number of warnings captured is limited by the value of the attribute ``max_num_warnings``. + +``num_failed_retries`` : *number* + The total number of retries that failed during the contribution processing. + + **Note**: The number is reported correctly regardless if the array in the attribute ``failed_retries`` + is empty or not. + +``failed_retries`` : *array* + The array of failed retries captured during the contribution processing. Each such retry is represented + by JSON object that has a schema explained in :ref:`ingest-worker-contrib-descriptor-retries`. + + **Note**: The maximum number of failed retries captured is limited by the value of the attribute ``max_retries``. + +.. _ingest-worker-contrib-descriptor-warnings: + +MySQL warnings +-------------- + +Warnings are captured into the JSON array of ``warnings``: + +.. code-block:: + + "warnings" : [ + , + ... + + ] + +The format of the object is presented below: + +``level`` : *string* + The severity of the warning reported by MySQL. Allowed values: + + - ``Note`` + - ``Warning`` + - ``Error`` + +``code`` : *number* + The numeric error code indicates a reason for the observed problem. + +``message`` : *string* + The human-readable explanation for the problem. + +Here is an example of what could be found in the array: + +.. code-block:: json + + "warnings" : [ + {"code" : 1406, "level" : "Warning", "message" : "Data too long for column 's_region_scisql' at row 3670"}, + {"code" : 1261, "level" : "Warning", "message" : "Row 3670 doesn't contain data for all columns"}, + {"code" : 1406, "level" : "Warning", "message" : "Data too long for column 's_region_scisql' at row 3913"}, + {"code" : 1261, "level" : "Warning", "message" : "Row 3913 doesn't contain data for all columns"}, + {"code" : 1406, "level" : "Warning", "message" : "Data too long for column 's_region_scisql' at row 3918"}, + {"code" : 1261, "level" : "Warning", "message" : "Row 3918 doesn't contain data for all columns"} + ], + +More details on the values can be found in the MySQL documentation: + +- https://dev.mysql.com/doc/refman/8.4/en/show-warnings.html + +.. _ingest-worker-contrib-descriptor-retries: + +Retries +------- + +Retries are captured into the JSON array of ``failed_retries``: + +.. code-block:: + + "failed_retries" : [ + , + ... + + ] + +The format of the object is presented below: + +.. code-block:: + + { "start_time" : , + "read_time" : , + "tmp_file" : , + "num_bytes" : , + "num_rows" : , + "http_error" : , + "system_error" : , + "error" : + } + +Where: + +``start_time`` : *number* + The timestamp when the retry attempt was started (milliseconds since the UNIX *Epoch*). + A value of the attribute is ``0`` before the processing starts. + +``read_time`` : *number* + The timestamp when the Ingest service finished reading/preprocessing the input file (milliseconds since the UNIX *Epoch*). + A value of the attribute is ``0`` before the reading starts. + +``num_bytes`` : *number* + The total number of bytes in the input file. The value is set by the service after it finishes reading + the file and before it starts loading the data into the MySQL table. + +``num_rows`` : *number* + The total number of rows parsed by the ingest service in the input file. + +``http_error`` : *number* + The HTTP error code captured by the service when pulling data of the contribution from a remote Web server. + This applies to the corresponidng URL *schemes*. The value is set only if the error was detected. + +``system_error`` : *number* + The system error code captured by the service during the contribution processing. The value is set only if the error was detected. + +``error`` : *string* + The error message captured by the service during the contribution processing. The value is set only if the error was detected. diff --git a/doc/ingest/api/reference/tools.rst b/doc/ingest/api/reference/tools.rst new file mode 100644 index 0000000000..3642fc5fc3 --- /dev/null +++ b/doc/ingest/api/reference/tools.rst @@ -0,0 +1,17 @@ +###################### +The Command Line Tools +###################### + +Error reporting in the command-line tools +========================================= + +All command line tools return ``0`` to indicate the successful completion of the requested operation. +Other values shall be treated as errors. The error messages are printed to the standard error stream. +Additional information on the error can be found in the standard output stream. + +.. _ingest-tools-qserv-replica-file: + +qserv-replica-file +================== + +TBC. \ No newline at end of file diff --git a/doc/ingest/api/simple/index.rst b/doc/ingest/api/simple/index.rst new file mode 100644 index 0000000000..899ac2b46f --- /dev/null +++ b/doc/ingest/api/simple/index.rst @@ -0,0 +1,648 @@ + +.. _ingest-api-simple: + +======================= +Simple Workflow Example +======================= + +This section provides a practical example of a simple workflow, demonstrating the core API interactions without relying on any automation or +wrapper scripts. Ensure you read the overview before proceeding to the example: + +- :ref:`ingest-api-concepts-overview` + +Test data +--------- + +The data used in this example is a small collection of ready-to-use ``CSV`` files and ``JSON`` configurations +located in the directory ``test101``. The directory is available in the Qserv repository at the following subfolder: + +- `doc_datasets/test101 `_ + +The following configuration and data files are available in the directory: + +.. code-block:: + + database_test101.json + + table_Object.json + table_Source.json + table_Filter.json + + data/ + Filter.csv + Object/ + chunk_7310_overlap.txt + chunk_7480_overlap.txt + chunk_7480.txt + Source/ + chunk_7480.txt + +The JSON files provide definitions for the database and tables: + +``database_test101.json`` + The database ``test101`` to be created + +``table_Object.json`` + The *director* table ``Object`` + +``table_Source.json`` + The simple *dependent* table ``Source`` + +``table_Filter.json`` + The *regular* (fully-replicated) table ``Filter`` + +Data files for these 3 tables are found within the subfolder ``data/``. + +Note that the data is already partitioned and ready to be ingested into the Qserv instance. There are two chunks in +the dataset ``7480`` and ``7310``, where the chunk ``7310`` containes only the chunk *overlap*. A table ``Source`` has +no overlaps since it is a dependent table. Only the *director* tables in Qserv can have overlaps. + +Qserv setup +----------- + +There are a few options for setting up the Qserv instance and the database. This example will be using an existing Kubernetes-based Qserv +instance. For the sake of simplicity, all interactins with the Ingest API will be done using the ``curl`` command from inside +the Replication Controller pod. + +.. code-block: bash + + kubectl exec -it qserv-repl-ctl-0 -- /bin/bash + +Ater logging into the pod, one can pull the files form the repository into the container: + +.. code-block: bash + + cd /home/qserv + mkdir test101 + cd test101 + for file in database_test101.json table_Object.json table_Source.json table_Filter.json; do + curl -O https://raw.githubusercontent.com/lsst/qserv/tickets/DM-46111/doc_datasets/test101/data/$file + done + mkdir data + curl -O https://raw.githubusercontent.com/lsst/qserv/tickets/DM-46111/doc_datasets/test101/data/Filter.csv + mkdir Object + cd Object + for file in chunk_7310_overlap.txt chunk_7480_overlap.txt chunk_7480.txt; do + curl -O https://raw.githubusercontent.com/lsst/qserv/tickets/DM-46111/doc_datasets/test101/data/Object/$file + done + cd .. + mkdir Sourcee + cd Source + curl -O https://raw.githubusercontent.com/lsst/qserv/tickets/DM-46111/doc_datasets/test101/data/Source/chunk_7480.txt + cd .. + cd .. + +The next test is to ensure that the Replication Controller server is running. The server should respond to requests send to the following +service: + +.. code-block: bash + + curl http://localhost:8080/meta/version + +The response should be a JSON object explained in: + +- :ref:`ingest-general-versioning` + +Register the database and tables +-------------------------------- + +Register the database: + +.. code-block: bash + + curl http://localhost:8080/ingest/database -X POST -H "Content-Type: application/json" -d @database_test101.json + +Register the tables: + +.. code-block:: bash + + curl http://localhost:8080/ingest/table -X POST -H "Content-Type: application/json" -d @table_Object.json + curl http://localhost:8080/ingest/table -X POST -H "Content-Type: application/json" -d @table_Source.json + curl http://localhost:8080/ingest/table -X POST -H "Content-Type: application/json" -d @table_Filter.json + +Start the transaction +--------------------- + +Start the transaction: + +.. code-block:: bash + + curl http://localhost:8080/ingest/trans \ + -X POST -H "Content-Type: application/json" \ + -d '{"database": "test101","auth_key": ""}' + +The response should be a JSON object with the transaction ID. The transaction ID is needed for all subsequent +requests (insignificant parts of the response are omitted): + +.. code-block:: json + + { "success" : 1, + "databases" : { + "test101" : { + "transactions" : [ + { + "id" : 84, + "state" : "STARTED" + "begin_time" : 1730139963298, + "start_time" : 1730139963367, + "end_time" : 0, + } + ] + } + } + } + +Get locations of the workers for ingesting the regular table Filter +------------------------------------------------------------------- + +.. code-block:: bash + + curl http://localhost:8080/ingest/regular \ + -X GET -H "Content-Type: application/json" -d '{"transaction_id":84}' + +The service returns a JSON object with the locations of the workers for ingesting the regular tables: + +.. code-block:: json + + { "locations" : [ + + { "worker" : "qserv-worker-0", + "host" : "10.141.0.44", + "host_name" : "qserv-worker-0.qserv-worker.default.svc.cluster.local", + "port" : 25002, + "http_host_name" : "qserv-worker-0.qserv-worker.default.svc.cluster.local", + "http_host" : "10.141.0.44", + "http_port" : 25004 + }, + { "worker" : "qserv-worker-1", + "host" : "10.141.7.33", + "host_name" : "qserv-worker-1.qserv-worker.default.svc.cluster.local", + "port" : 25002, + "http_host" : "10.141.7.33", + "http_host_name" : "qserv-worker-1.qserv-worker.default.svc.cluster.local", + "http_port" : 25004 + }, + { "worker" : "qserv-worker-2", + "host" : "10.141.2.45", + "host_name" : "qserv-worker-2.qserv-worker.default.svc.cluster.local", + "port" : 25002, + "http_host" : "10.141.2.45", + "http_host_name" : "qserv-worker-2.qserv-worker.default.svc.cluster.local", + "http_port" : 25004 + }, + { "worker" : "qserv-worker-3", + "host" : "10.141.4.37", + "host_name" : "qserv-worker-3.qserv-worker.default.svc.cluster.local", + "port" : 25002, + "http_host" : "10.141.4.37", + "http_host_name" : "qserv-worker-3.qserv-worker.default.svc.cluster.local", + "http_port" : 25004 + }, + { "worker" : "qserv-worker-4", + "host" : "10.141.6.37", + "host_name" : "qserv-worker-4.qserv-worker.default.svc.cluster.local", + "port" : 25002, + "http_host" : "10.141.6.37", + "http_host_name" : "qserv-worker-4.qserv-worker.default.svc.cluster.local", + "http_port" : 25004 + } + ] + } + +According to the response, the data of the *regular* table ``Filter`` have to be pushed to the folowing worker hosts (using +the FQDNs of the hosts): + +.. code-block: + + qserv-worker-0.qserv-worker.default.svc.cluster.local + qserv-worker-1.qserv-worker.default.svc.cluster.local + qserv-worker-2.qserv-worker.default.svc.cluster.local + qserv-worker-3.qserv-worker.default.svc.cluster.local + qserv-worker-4.qserv-worker.default.svc.cluster.local + +Where the port numbers are: + +- ``25002`` for the binary protocol +- ``25004`` for the HTTP protocol + +The next section will be presenting examples for ingesting the data using both protocols. + +Get locations of the chunks 7310 and 7480 +----------------------------------------- + +For chunk ``7310``: + +.. code-block:: bash + + curl http://localhost:8080/ingest/chunk \ + -X POST -H "Content-Type: application/json" -d '{"transaction_id":84,"chunk":7310,"auth_key":""}' + +.. code-block:: json + + { "location" : { + "worker" : "qserv-worker-2", + "host" : "10.141.2.45", + "host_name" : "qserv-worker-2.qserv-worker.default.svc.cluster.local", + "port" : 25002, + "http_host" : "10.141.2.45", + "http_host_name" : "qserv-worker-2.qserv-worker.default.svc.cluster.local", + "http_port" : 25004 + } + } + +For chunk ``7480``: + +.. code-block:: bash + + curl http://localhost:8080/ingest/chunk \ + -X POST -H "Content-Type: application/json" -d '{"transaction_id":84,"chunk":7480,"auth_key":""}' + +.. code-block:: json + + { "location" : { + "worker" : "qserv-worker-3", + "host" : "10.141.4.37", + "host_name" : "qserv-worker-3.qserv-worker.default.svc.cluster.local", + "port" : 25002, + "http_host" : "10.141.4.37", + "http_host_name" : "qserv-worker-3.qserv-worker.default.svc.cluster.local", + "http_port" : 25004 + } + } + +The following map shows the endpoints for ingesting the chunks over the proprietary binary protocol: + +- ``7310``: ``qserv-worker-2.qserv-worker.default.svc.cluster.local:25002`` +- ``7480``: ``qserv-worker-3.qserv-worker.default.svc.cluster.local:25002`` + +The endpoints for the HTTP-based protocol are presented below: + +- ``7310``: ``qserv-worker-2.qserv-worker.default.svc.cluster.local:25004`` +- ``7480``: ``qserv-worker-3.qserv-worker.default.svc.cluster.local:25004`` + + +.. hint: + + Both ``host`` (``http_host``) abd ``host_name`` (``http_host_name``) addresses are provided in the response. + The former is the IP address. The latter is the fully qualified domain name (FQDN) of the worker host. + It's recommended to use the FQDN in the Kubernetes-based Qserv deployment where IP addresses of the worker + pods are not stable. This suggestion applies to both the binary and HTTP protocols, and to any table type. + +Ingest the data +--------------- + +Two alternative options for ingesting the data are presented in this section. The first option is to ingest the data +via the proprietary binary protocol using the following tool: + +- :ref:`ingest-tools-qserv-replica-file` (TOOLS) + +The second technique is to push the data via the HTTP protocol using the following service: + +- :ref:`ingest-worker-contrib-by-val` (REST) + +Ingest the data using the binary protocol +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following command will ingest the data of the *regular* table ``Filter`` using the binary protocol: + +.. code-block:: bash + + PORT=25002 + TRANS=84 + TABLE_TYPE="R" + + mkdir -p logs + + for idx in $(seq 0 4); do + WORKER_HOST="qserv-worker-${idx}.qserv-worker.default.svc.cluster.local"; + qserv-replica-file INGEST FILE \ + ${WORKER_HOST} \ + ${PORT} \ + ${TRANS} \ + "Filter" \ + ${TABLE_TYPE} \ + data/Filter.csv \ + --verbose >& logs/Filter_${WORKER_HOST_IDX}.log; + done + +Note the flag ``--verbose`` which will print the summary of the ingestion request. The logs will be saved in +the directory ``logs/``. Here is an example of the output found in ``logs/Filter_0.log``: + +.. code-block:: + + Id: 1728535 + Ingest service location: qserv-worker-0.qserv-worker.default.svc.cluster.local:25002 + Transaction identifier: 84 + Destination table: Filter + Chunk: 0 + Is chunk overlap: 0 + Input file name: data/Filter.csv + Start time: 2024-10-28 20:14:55.922 + Finish time: 2024-10-28 20:14:55.945 + Elapsed time: 0 sec + Bytes sent: 75 + MByte/sec: -nan + Number of warnings: 0 + Number of rows parsed: 9 + Number of rows loaded: 9 + +Now ingest the data of the *partitioned* tables ``Object`` and ``Source``: + +.. code-block:: bash + + PORT=25002 + TRANS=84 + TABLE_TYPE="P" + + qserv-replica-file INGEST FILE \ + "qserv-worker-2.qserv-worker.default.svc.cluster.local" \ + ${PORT} \ + ${TRANS} \ + "Object" \ + ${TABLE_TYPE} \ + data/Object/chunk_7310_overlap.txt \ + --fields-terminated-by=',' \ + --verbose >& logs/Object_chunk_7310_overlap.log + + qserv-replica-file INGEST FILE \ + "qserv-worker-3.qserv-worker.default.svc.cluster.local" \ + ${PORT} \ + ${TRANS} \ + "Object" \ + ${TABLE_TYPE} \ + data/Object/chunk_7480_overlap.txt \ + --fields-terminated-by=',' \ + --verbose >& logs/Object_chunk_7480_overlap.log + + qserv-replica-file INGEST FILE \ + "qserv-worker-3.qserv-worker.default.svc.cluster.local" \ + ${PORT} \ + ${TRANS} \ + "Object" \ + ${TABLE_TYPE} \ + data/Object/chunk_7480.txt \ + --fields-terminated-by=',' \ + --verbose >& logs/Object_chunk_7480.log + + qserv-replica-file INGEST FILE \ + "qserv-worker-3.qserv-worker.default.svc.cluster.local" \ + ${PORT} \ + ${TRANS} \ + "Source" \ + ${TABLE_TYPE} \ + data/Source/chunk_7480.txt \ + --fields-terminated-by=',' \ + --verbose >& logs/Source_chunk_7480.log + +Push the data to workers via the HTTP protocol +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. hint:: + + The ``curl`` command is used to push the data to the workers. The worker services return responses in JSON format. + In the examples presented below, the response objects are stored in files with the extension ``.json``. + The corresponding option is ``-o logs/.json``. Always evaluate the response object to ensure the operation + was successful. + + +The following command will ingest the data of the *regular* table ``Filter`` using the HTTP protocol: + +.. code-block:: bash + + mkdir -p logs + + for idx in $(seq 0 4); do + WORKER_HOST="qserv-worker-${idx}.qserv-worker.default.svc.cluster.local"; + + curl http://${WORKER_HOST}:25004/ingest/csv \ + -X POST -H 'Content-Type: multipart/form-data' \ + -F 'transaction_id=84'\ + -F 'table=Filter' \ + -F 'file=@data/Filter.csv' \ + -o logs/Filter_${WORKER_HOST_IDX}.json \ + >& logs/Filter_${WORKER_HOST_IDX}.log; + done + +Now ingest the data of the *partitioned* tables ``Object`` and ``Source``: + +.. code-block:: bash + + curl http://qserv-worker-2.qserv-worker.default.svc.cluster.local:25004/ingest/csv \ + -X POST -H 'Content-Type: multipart/form-data' \ + -F 'transaction_id=84'\ + -F 'table=Object' \ + -F 'chunk=7310' \ + -F 'overlap=1' \ + -F 'fields_terminated_by=,' \ + -F 'file=@data/Object/chunk_7310_overlap.txt' \ + -o logs/logs/Object_chunk_7310_overlap.json \ + >& logs/logs/Object_chunk_7310_overlap.log + + curl http://qserv-worker-3.qserv-worker.default.svc.cluster.local:25004/ingest/csv \ + -X POST -H 'Content-Type: multipart/form-data' \ + -F 'transaction_id=84'\ + -F 'table=Object' \ + -F 'chunk=7480' \ + -F 'overlap=1' \ + -F 'fields_terminated_by=,' \ + -F 'file=@data/Object/chunk_7480_overlap.txt' \ + -o logs/logs/Object_chunk_7480_overlap.json \ + >& logs/logs/Object_chunk_7480_overlap.log + + curl http://qserv-worker-3.qserv-worker.default.svc.cluster.local:25004/ingest/csv \ + -X POST -H 'Content-Type: multipart/form-data' \ + -F 'transaction_id=84'\ + -F 'table=Object' \ + -F 'chunk=7480' \ + -F 'overlap=0' \ + -F 'fields_terminated_by=,' \ + -F 'file=@data/Object/chunk_7480.txt' \ + -o logs/logs/Object_chunk_7480.json \ + >& logs/logs/Object_chunk_7480.log + + curl http://qserv-worker-3.qserv-worker.default.svc.cluster.local:25004/ingest/csv \ + -X POST -H 'Content-Type: multipart/form-data' \ + -F 'transaction_id=84'\ + -F 'table=Source' \ + -F 'chunk=7480' \ + -F 'overlap=0' \ + -F 'fields_terminated_by=,' \ + -F 'file=@data/Source/chunk_7480.txt' \ + -o logs/logs/Source_chunk_7480.json \ + >& logs/logs/Source_chunk_7480.log + +Note that the last 4 commands are overridoimg the default field terminator ``\t`` with the comma ``','``. + +Commit the transaction +---------------------- + +.. code-block:: bash + + curl 'http://localhost:8080/ingest/trans/84?abort=0' \ + -X PUT -H "Content-Type: application/json" \ + -d '{"auth_key": ""}' + +This is a synchronous operation. The response will be a JSON object with the status of the operation. If the response object +contains the key ``success`` with the value ``1``, the operation was successful. The workflow may also check the status of +the transaction by making the following request: + +.. code-block:: bash + + curl 'http://localhost:8080/ingest/database/test101' \ + -X GET -H "Content-Type: application/json" + +The response object will contain the status of the transaction. If the transaction is in the ``FINISHED`` state, the +transaction was successful: + +.. code-block:: json + + { "databases" : { + "test101" : { + "is_published" : 0, + "num_chunks" : 2, + "transactions" : [ + { + "id" : 84, + "database" : "test101", + "state" : "FINISHED", + "begin_time" : 1730139963298, + "start_time" : 1730139963367, + "end_time" : 1730156228946, + "transition_time" : 1730156228374, + "context" : {}, + "log" : [] + } + ] + } + }, + "success" : 1, + "error" : "", + "error_ext" : {}, + "warning" : "No version number was provided in the request's query.", + } + +Publish the database +--------------------- + +.. code-block:: bash + + curl 'http://localhost:8080/ingest/database/test101' \ + -X PUT -H "Content-Type: application/json" \ + -d '{"auth_key": ""}' + +This is a synchronous operation. The response will be a JSON object with the status of the operation (truncated for brevity +to the key ``success``): + +.. code-block:: json + + { "success" : 1 + } + +The database is now published and ready for queries. + +Test the catalog +---------------- + +This can be done by running a few simple queries via the ``mysql`` client: + +.. code-block:: bash + + kubectl exec -it qserv-czar-0 -c proxy -- \ + mysql --protocol=tcp -hlocalhost -P4040 -uqsmaster test101 + +This will open a MySQL client connected to the database ``test101``. The following queries can be run to test the catalog: + +.. code-block:: sql + + SELECT * FROM Filter; + +----------------+----------+------------+----------+--------+ + | qserv_trans_id | filterId | filterName | photClam | photBW | + +----------------+----------+------------+----------+--------+ + | 84 | 0 | u | 0 | 0 | + | 84 | 1 | g | 0 | 0 | + | 84 | 2 | r | 0 | 0 | + | 84 | 3 | i | 0 | 0 | + | 84 | 4 | z | 0 | 0 | + | 84 | 5 | y | 0 | 0 | + | 84 | 6 | w | 0 | 0 | + | 84 | 7 | V | 0 | 0 | + +----------------+----------+------------+----------+--------+ + +.. code-block:: sql + + SELECT COUNT(*) FROM Object; + +----------+ + | COUNT(*) | + +----------+ + | 1000 | + +----------+ + +.. code-block:: sql + + SELECT COUNT(*) FROM Source; + +----------+ + | COUNT(*) | + +----------+ + | 4583 | + +----------+ + +.. code-block:: + + SELECT * FROM Object LIMIT 1\G + *************************** 1. row *************************** + qserv_trans_id: 84 + objectId: 433327840428745 + iauId: NULL + ra_PS: 1.30450574307 + ra_PS_Sigma: 0.0000153903 + decl_PS: 3.34239540723 + decl_PS_Sigma: 0.0000166903 + radecl_PS_Cov: 0.00000000162187 + ra_SG: 1.30451383451 + ra_SG_Sigma: 0.000135688 + decl_SG: 3.34239574427 + decl_SG_Sigma: 0.000145373 + radecl_SG_Cov: -0.00000000107427 + raRange: NULL + declRange: NULL + ... + +**Note** the MySQL-specific syntax for the query ``\G``. The ``\G`` is a MySQL-specific command that formats the output +of the query in a more readable way. The output is presented in a vertical format, where each row is presented on a separate +line. The columns are presented in the format ``column_name: value``. + +.. code-block:: sql + + SELECT objectId FROM Object LIMIT 10; + +-----------------+ + | objectId | + +-----------------+ + | 433327840428745 | + | 433327840428744 | + | 433327840428743 | + | 433327840428742 | + | 433327840428741 | + | 433327840428740 | + | 433327840428739 | + | 433327840428746 | + | 433327840428747 | + | 433327840428748 | + +-----------------+ + 10 rows in set (0.07 sec) + +.. code-block:: sql + + SELECT objectId,decl_PS,ra_PS FROM Object WHERE objectId=433327840428739; + +-----------------+---------------+---------------+ + | objectId | decl_PS | ra_PS | + +-----------------+---------------+---------------+ + | 433327840428739 | 3.33619102281 | 1.29801680549 | + +-----------------+---------------+---------------+ + +Post-ingest operations +---------------------- + +The database is now ready for queries. However, the following operations can be performed: + +- :ref:`ingest-api-post-ingest` + diff --git a/doc/ingest/data/index.rst b/doc/ingest/data/index.rst new file mode 100644 index 0000000000..87b95bc924 --- /dev/null +++ b/doc/ingest/data/index.rst @@ -0,0 +1,13 @@ + +.. _ingest-data: + +Data preparation +================ + +.. toctree:: + :maxdepth: 2 + + intro + partitioning + partitioner + ref-match diff --git a/doc/ingest/data/intro.rst b/doc/ingest/data/intro.rst new file mode 100644 index 0000000000..1aeb993d1d --- /dev/null +++ b/doc/ingest/data/intro.rst @@ -0,0 +1,109 @@ +.. _ingest-data-intro: + +Introduction +============ + +This document presents the requirements for data to be ingested into Qserv and describes the process of preparing +data for ingestion. + +The main data format supported by Qserv is ``CSV``. This choice is motivated by the fact that Qserv is implemented on top of MySQL, +which natively supports the ``CSV`` format. The ``CSV`` format is also very simple and can be easily generated from other +formats like ``Parquet``. Another reason for choosing the ``CSV`` format is the performance of the ``LOAD DATA INFILE`` statement +used to load data into MySQL. The ``LOAD DATA INFILE`` statement is the fastest way to load data into MySQL and is optimized for +the ``CSV`` format. More information on this subject can be found in: + +- `LOAD DATA INFILE `_ (MySQL) + +The second option for loading data into Qserv is to send the data packaged in the ``JSON`` format. This option is not as efficient as the +``CSV`` format but is more flexible and can be used for loading data into Qserv in a more complex way. The ``JSON`` format is supported by +the following service: + +- :ref:`ingest-worker-contrib-by-val-json` + +This format is also used by the simple ingest API documented in :ref:`http-frontend`. The API is meant for ingesting and managing user +tables which are relatively small in size. + +The data preparation process includes 4 steps: + +1. Data conversion +2. Partitioning +3. Post-processing (data sanitization) +4. Staging + +Some steps may be optional depending on the data format and the requirements of the ingest workflow. + +Data conversion +--------------- + +.. note:: + + This section is not complete. More details on the data conversion process will be added in the future + version of the document. + +The data conversion step is required if the input data is not in the ``CSV`` format. The ost common data format +used in the LSST project is the ``Parquet`` format. + +Partitioning +------------ + +This topic is covered in: + +- :ref:`ingest-data-partitioning` (DATA) +- :ref:`ingest-data-partitioner` (DATA) +- :ref:`ingest-data-partitioning-ref-match` (DATA) + + +Post-processing +--------------- + +Besides converting the data to the CSV format, there are other operations that may optionally be performed on +the input data. The purpose of these operations is to ensure the values of the columns are compatible with +MySQL expectations. These are a few examples of what may need to be done: + +- The ``BOOL`` type in MySQL maps to the ``TINYINT`` type in MySQL. Because of that, values like ``true`` + and ``false`` are not supported by MySQL. Hence, they need to be converted to ``1`` and ``0`` respectively. + +- Some data tools may produce ``-inf`` and ``+inf`` values when converting floating point numbers + into the ``CSV`` format. Neither of these values are supported by MySQL. Assuming the column type is ``REAL``, + they need to be converted to ``-1.7976931348623157E+308`` and ``1.7976931348623157E+308`` respectively. + +- The ``NULL`` values in the ``CSV`` files need to be converted into ``\N``. + +Handling the binary data +------------------------ + +The binary data is supported by the Qserv ingest system in two ways: + +- The ``CSV`` format supports the binary data. The coresponidng fields need to be properly escaped + as explained in: + + - `LOAD DATA INFILE `_ (MySQL) + +- The ``JSON`` format also supports the binary data. However, the data in the correspondin columns need + to be encodeded as explained in: + + - :ref:`ingest-general-binary-encoding` (API) + + +Restrictions for the variable-length column types +------------------------------------------------- + +Note that variable-length column types like ``VARCHAR`` and ``TEXT`` are not allowed in the *director* tables in Qserv. +This is because *director* tables are used to materialize sub-chunks of the data. Sub-chunks are the smallest units of +data that can be processed by Qserv workers. The sub-chunk tables are implemented using the ``MEMORY`` storage engine. +Further details on this subject can be found in: + +- `MEMORY Storage Engine `_ (MySQL) + +Staging +------- + +Once the data are converted and partitioned, they need to be staged at a location from where they can be loaded into Qserv. +Depending on the selected ingest method, the data may be: + +- placed locally, from where they would be pushed into Qserv via the proprietary binary protocol or the REST API. +- placed on a distributed filesystem like ``GPFS``, ``Lustre``, etc., which is mounted at the Qserv workers. +- placed on a Web server, from where they could be pulled into Qserv via the HTTP/HTTPS protocol. +- placed into an Object Store (S3 compatible), from where they could be pulled into Qserv via the S3 protocol. + +Besides availability, the workflow may also require the data to be retained until the ingest process is completed. diff --git a/doc/ingest/data/partitioner.rst b/doc/ingest/data/partitioner.rst new file mode 100644 index 0000000000..037be78084 --- /dev/null +++ b/doc/ingest/data/partitioner.rst @@ -0,0 +1,171 @@ +.. _ingest-data-partitioner: + +Partitioner +=========== + +Summary +------- + +Qserv's partitioners are implemented as standalone C++ programs +(``sph-partition`` or ``sph-partition-matches``) that separate input rows from one +or more files and write them into another set of files named according to their +partition numbers. + +``sph-partition[-matches]`` takes as input a set of CSV files, and based on a +specified partition configuration, produces output CSV files (one per partition). +Each partition is called a "chunk" and contains subpartitions ("subchunks"), +although a partition's subpartitions are stored together in a file (and table). + +Tables that are partitioned in Qserv must be partitioned identically within a +Qserv database. + +This means that tables in a database share identical partition +boundaries and identical mappings of ``chunk ID spatial partition``. In order to +facilitate table joining, a single table's columns are chosen to define the +partitioning space and all partitioned tables (within a database) are +partitioned according that pair of columns. Our current plan chooses the +``Object`` table's ``ra_PS`` and ``decl_PS`` columns, meaning that rows in the +``Source`` and ``ForcedSource`` tables would be partitioned according to the +``Object`` they reference. + +However, there is a wrinkle: prototype pipeline development involves comparing +pipeline outputs to a reference catalog, which might correspond to an +independent processing of the input data, or to a ground truth catalog from +which raw pipeline input images were synthesized. Such tables (``SimRefObject`` +for example) share the same partitioning parameters as ```Object```. But, there +is no obvious 1 to 1 mapping between reference objects and objects. Instead, +the pipelines compute a (spatial) match table between the two that provides +a many-to-many relationship between both tables. The complication is that a +match record might reference an object and reference object that fall on +opposite sides of a partition boundary. Qserv deals with this by taking +advantage of the overlap that must be stored alongside each partition (this +overlap is stored so that Qserv can avoid inter-worker communication when +performing spatial joins on the fly). + +Requirements +------------ + +The Qserv partitioning code must be capable of processing: + +- CSV-format files +- files that are very large +- large quantities of files +- tables containing both positions and positional match pairs + +It must be possible to reorder and drop input columns. The output format shall +be CSV suitable for loading into the database instances running on Qserv worker +nodes. + +The following features are desirable, but have yet to be implemented: + +- It should be possible to process FITS table files. + +- It should be possible to lookup the sky-positions of entities in a + record by key. Currently, positions must be present in the records fed to the + partitioner (but can be dropped from the output). Note that it must be + possible to fall-back to another position in case the key is ``NULL``. Such + orphaned entities can be produced if for example the association pipeline + doesn't necessarily associate each ``Source`` to an ``Object`` (some ``Source`` + rows might be considered to be spurious). + +- Producing partitioned output tables in native database format (e.g. + directly producing ``.MYD`` files for the MySQL MyISAM storage engine) + may significantly speed up the loading process. + +Design +------ + +The partitioner is expressed in the map-reduce paradigm. The map function +operates on one input record at a time. It computes the partition(s) +the input record must be assigned to and emits corresponding output +records. Output records are grouped by chunk and passed on to reducers, +which collect statistics on how many records are in each sub-chunk and +write output records to disk. This is all implemented in C++, using a small +in-memory map-reduce processing framework tailored to the task. The framework +is multi-threaded - file input, processing, and output are all block oriented +and parallel (see ``src/MapReduce.h`` in the source tree for details). + +As a result of using this model, the code that deals with parallelization is +separated from the partitioning logic, making the implementation easier to +follow. Another benefit is that porting to the Hadoop framework would at +least be conceptually straightforward. + +Usage +----- + +Here is a fully worked single node example for the PT1.2 ``Object``, +``SimRefObject``, and ``RefObjMatch`` tables. First, the tables are dumped +in TSV format: + +.. code-block:: bash + + mysql -A \ + -h lsst10.ncsa.illinois.edu \ + -D rplante_PT1_2_u_pt12prod_im2000 \ + -B --quick --disable-column-names \ + -e "SELECT * FROM Object;" > Object.tsv + + mysql -A \ + -h lsst10.ncsa.illinois.edu \ + -D rplante_PT1_2_u_pt12prod_im2000 \ + -B --quick --disable-column-names \ + -e "SELECT * FROM SimRefObject;" > SimRefObject.tsv + +For the`RefObjMatch` table, we'll need to pull in the positions of the objects +and reference objects being matched up, so that the partitioner can determine +which partition each side of the match has been assigned to. That can be done via: + +.. code-block:: sql + + SELECT m.*, r.ra, r.decl, o.ra_PS, o.decl_PS + FROM RefObjMatch AS m LEFT JOIN + SimRefObject AS r ON (m.refObjectId = r.refObjectId) LEFT JOIN + Object AS o ON (m.objectId = o.objectId); + +Note the left joins - either side of a match pair can be NULL, indicating an +unmatched object or reference object. + +Assuming ``QSERV_DIR`` has been set to a Qserv install or checkout location, +the ``Source`` and ``Object`` tables can now be partitioned as follows: + +.. code-block:: bash + + CFG_DIR=$QSERV_DIR/admin/dupr/config/PT1.2 + + for TABLE in Object Source; do + sph-partition \ + --config-file=$CFG_DIR/$TABLE.json \ + --config-file=$CFG_DIR/common.json \ + --in.csv.null=NULL \ + --in.csv.delimiter=$'\t' \ + --in.csv.escape=\\ \ + --in.csv.quote=\" \ + --in.path=$TABLE.tsv \ + --verbose \ + --mr.num-workers=6 --mr.pool-size=32768 --mr.block-size=16 \ + --out.dir=chunks/$TABLE + done + + +The matches can be partitioned using: + +.. code-block:: bash + + sph-partition-matches \ + --config-file=$CFG_DIR/RefObjMatch.json \ + --config-file=$CFG_DIR/common.json \ + --in.csv.null=NULL \ + --in.csv.delimiter=$'\t' \ + --in.csv.escape=\\ \ + --in.csv.quote=\" \ + --in.path=RefObjMatch.tsv \ + --verbose \ + --mr.num-workers=6 --mr.pool-size=32768 --mr.block-size=16 \ + --out.num-nodes=1 --out.dir=chunks/RefObjMatch + +Output chunk files are stored in the directory specified by ```--out.dir```, +and can subsequently be distributed and loaded into the MySQL databases +on worker nodes. Examine the config files referenced above and run +``sph-partition --help`` or ```sph-partition-matches --help``` for more +information on partitioning parameters. + diff --git a/doc/ingest/data/partitioning.rst b/doc/ingest/data/partitioning.rst new file mode 100644 index 0000000000..696f313b1e --- /dev/null +++ b/doc/ingest/data/partitioning.rst @@ -0,0 +1,204 @@ +.. _ingest-data-partitioning: + +Partitioning +============ + +Overview +-------- + +The largest LSST tables will not fit on a single node in the projected +production time-frame, and so must be partitioned into smaller pieces +and spread over many nodes. Qserv uses a spatial partitioning scheme. A +dominant table is chosen containing sky coordinates that are used for +partitioning; for LSST data releases, this is the ``Object`` table. All other +tables that contain a foreign key into the ``Object`` table are partitioned by +the position of the associated ``Object``, or by a fall-back position if an +associated ``Object`` is not guaranteed to have been assigned. This means for +example that all the single-exposure sources associated with a particular +``Object`` will end up in the same partition, even if that ``Object`` has +non-trivial proper motion. Large tables (e.g. catalogs from other surveys) +that are not directly related to ``Object`` are also partitioned by position, +using the same scheme and parameters. This results in perfectly aligned +partition boundaries, simplifying the implementation of near-neighbor joins. +The following excerpt from +`Qserv: A distributed shared-nothing database for the LSST catalog `_ +further describes some of the motivations for partitioning data in Qserv: + + Qserv divides data into spatial partitions of roughly the same area. Since + objects occur at a similar density (within an order of magnitude) throughout + the celestial sphere, equal-area partitions should evenly spread a load that + is uniformly distributed over the sky. If partitions are small with respect + to higher-density areas and spread over computational resources in a + non-area-based scheme, density-differential-induced skew will be spread among + multiple nodes. + + Determining the size and number of data partitions may not be obvious. + Queries are fragmented according to partitions so an increasing number of + partitions increases the number of physical queries to be dispatched, + managed, and aggregated. Thus a greater number of partitions increases the + potential for parallelism but also increases the overhead. For a + data-intensive and bandwidth-limited query, a parallelization width close + to the number of disk spindles should minimize seeks while maximizing + bandwidth and performance. + + From a management perspective, more partitions facilitate re-balancing data + among nodes when nodes are added or removed. If the number of partitions + were equal to the number of nodes, then the addition of a new node would + require the data to be re-partitioned. On the other hand, if there were many + more partitions than nodes, then a set of partitions could be assigned to + the new node without re-computing partition boundaries. + + Smaller and more numerous partitions benefit spatial joins. In an + astronomical context, we are interested in objects near other objects, + and thus a full O(n^2) join is not required — a localized spatial join + is more appropriate. With spatial data split into smaller partitions, + a SQL engine computing the join need not even consider (and reject) all + possible pairs of objects, merely all the pairs within a region. Thus a + task that is naively O(n^2) becomes O(kn) where k is the number of objects + in a partition. + + In consideration of these trade-offs, two-level partitioning seems to be a + conceptually simple way to blend the advantages of both extremes. Queries + can be fragmented in terms of coarse partitions (“chunks”), and spatial + near-neighbor joins can be executed over more fine partitions (“subchunks”) + within each partition. To avoid the overhead of the subchunks for non-join + queries, the system can store chunks and generate subchunks on-demand for + spatial join queries. On-the-fly generation for joins is cost-effective + due to the drastic reduction of pairs, which is true as long as there are + many subchunks for each chunk. + +Note that if each point is assigned to exactly one partition, then a spatial join +cannot operate on a single partition at a time because two nearby points could +belong to different partitions. Dealing with outside partitions requires +data exchange, complicating the Qserv implementation. To avoid this, Qserv +stores a precomputed amount of overlapping data along with each partition. + +The Partitioning Scheme +----------------------- + +The celestial sphere is divided into latitude angle “stripes” of fixed height H. +For each stripe, a width W is computed such that any two points in the stripe +with longitude angles separated by at least W have angular separation of +at least H. The stripe is then broken into an integral number of chunks of +width at least W. The same procedure is used to obtain finer subchunks - +each stripe is broken into a configureable number of equal-height “substripes”, +and each substripe is broken into equal-width subchunks. This scheme was chosen +over e.g. the Hierarchical Triangular Mesh for its speed (no trigonometry is +required to locate the partition of a point given in spherical coordinates), +simplicity of implementation, and the fine control it offers over the area of +chunks and sub-chunks. + +Partition Identifiers +--------------------- + +Partition identifiers are integers. No assumptions about the properties +of these IDs (e.g. consecutiveness, non-negativity, etc... ) should be made +outside of the partitioning code itself. For the record, here is how these +identifiers are currently assigned. + +First, stripes are numbered from 0 to S - 1, where 0 denotes the southernmost +stripe. Within a stripe s, chunks are numbered from 0 to C_s - 1, where 0 +denotes the chunk with minimum longitude = 0. Note that according to the rules +above, 2S >= C_s for any s. The identifier (chunk ID) for chunk c in stripe s +is given by: + + 2S*s + c + +Similarly, the identifier (subchunk ID) for subchunk c in substripe s within a +particular chunk is: + + M*s + c + +where M is the maximum number of sub-chunks that fit in a single sub-stripe of +any chunk. + +Overlap +------- + +The boundaries of chunks and subchunks constructed as described are boxes in +longitude and latitude angle. It is relatively straightforward to compute +a spherical box that is a conservative approximation to the region containing +all points within angular separation R of an initial box - the latitude +limits must be adjusted outwards by R, and longitude bounds for the +shape obtained by sweeping a small circle of opening angle R along the sides +of the box must be computed. + +.. image:: /_static/subchunks.png + :target: ../../../_images/subchunks.png + :alt: Subchunks + +In the image above, the white square on the right is a subchunk. The +overlap region of this subchunk consists of the light blue +region around it. On the left, a tiling of multiple subchunks +is shown. + +Qserv implements a spatial join that finds objects in two distinct tables +U and V separated by an angle of at most R by taking the union of the +following over all subchunks: + +.. code-block:: sql + + ( + SELECT ... + FROM U_p, V_p + WHERE scisql_angSep(U_p.ra, U_p.decl, V_p.ra, V_p.decl) <= R AND ... + ) UNION ALL ( + SELECT ... + FROM U_p, OV_p + WHERE scisql_angSep(U_p.ra, U_p.decl, V_p.ra, V_p.decl) <= R AND ... + ) + +Here, U_p and V_p correspond to the subchunk p of U and V (which must be +identically partitioned), and OV_p contains the points inside the overlap +region of p. + +Match Tables +------------ + +Match tables store a precomputed many-to-many relationship between two +identically partitioned tables U and V. For example, a match table might +store a mapping between reference objects and objects that facilitates +data production QA. + +A row in a match table M consists of (at least) a pair of foreign keys +into the two related tables. A match in M is assigned to a subchunk +P if either of the referenced positions to is assigned to P. If no positions +in a match are separated by more than the overlap radius, then a 3-way +equi-join between U, M and V can be decomposed into the union of +3-way joins over the set of subchunks P: + +.. code-block:: sql + + ( + SELECT ... + FROM U_p INNER JOIN M_c ON (U_p.pk = M_c.fk_u) + INNER JOIN V_p ON (M_c.fk_v = V_p.pk) + WHERE ... + ) UNION ALL ( + SELECT ... + FROM U_p INNER JOIN M_c ON (U_p.pk = M_c.fk_u) + INNER JOIN OV_p ON (M_c.fk_v = OV_p.pk) + WHERE ... + ) + +U_p and V_p correspond to the subchunk p of chunk c of tables U and V. M_c +corresponds to chunk c of table M, and OV_p is the subset of V containing +points in the full overlap region of subchunk p. Note that queries which +involve only the match table need to be rewritten to discard duplicates, +since a match pair linking positions in two different chunks will be stored +twice (once in each chunk). + +Object movement +--------------- + +The fact all tables will be partitioned according to ``Object`` RA/Dec implies +that in rare cases when an object is close to the partition edge, some of its +sources may end up in a partition that is different from the "natural" one for +the source's own ra/dec. To address this issue, the Qserv master will expand +the search region by an distance R when determining which partitions to query, +where R is large enough to capture object motion for the duration of the LSST +survey to date. The WHERE clause applied by Qserv workers to their ``Source`` +table partitions will use the original search region to ensure that the query +semantics are preserved. Without this, some sources inside the search region +assigned to objects outside the search region *and* that lie across partition +boundaries might be missed. diff --git a/doc/ingest/data/ref-match.rst b/doc/ingest/data/ref-match.rst new file mode 100644 index 0000000000..7065128fb6 --- /dev/null +++ b/doc/ingest/data/ref-match.rst @@ -0,0 +1,236 @@ +.. _ingest-data-partitioning-ref-match: + +Partitioning data of the ref-match tables +========================================= + +Introduction +------------ + +The *ref-match* tables are a special class of tables that are designed to match rows between two independent *director* tables +belonging to the same or different catalogs. In this case, there is no obvious 1-to-1 match between rows of the director tables. +Instead, the pipelines compute a (spatial) match table between the two that provides a many-to-many relationship between both tables. +The complication is that a match record might reference a row (an *object*) and reference row that fall on opposite sides of +the partition boundary (into different chunks). Qserv deals with this by taking advantage of the overlap that must be stored +alongside each partition (this overlap is stored so that Qserv can avoid inter-worker communication when performing +spatial joins on the fly). + +Since the *ref-match* tables are also partitioned tables the input data (CSV) of the tables have to be partitioned into chunks. +In order to partition the *ref-match* tables one would have to use a special version of the partitioning tool sph-partition-matches. +A source code of the tool is found in the source tree of Qserv: https://github.com/lsst/qserv/blob/main/src/partition/sph-partition-matches.cc. +The corresponding binary is built and placed into the binary Docker image of Qserv. + +Here is an example illustrating how to launch the tool from the container: + +.. code-block:: bash + + % docker run -it qserv/lite-qserv:2022.9.1-rc1 sph-partition-matches --help + + sph-partition-matches [options] + + The match partitioner partitions one or more input CSV files in + preparation for loading by database worker nodes. This involves assigning + both positions in a match pair to a location in a 2-level subdivision + scheme, where a location consists of a chunk and sub-chunk ID, and + outputting the match pair once for each distinct location. Match pairs + are bucket-sorted by chunk ID, resulting in chunk files that can then + be distributed to worker nodes for loading. + A partitioned data-set can be built-up incrementally by running the + partitioner with disjoint input file sets and the same output directory. + Beware - the output CSV format, partitioning parameters, and worker + node count MUST be identical between runs. Additionally, only one + partitioner process should write to a given output directory at a + time. If any of these conditions are not met, then the resulting + chunk files will be corrupt and/or useless. + \_____________________ Common: + -h [ --help ] Demystify program usage. + -v [ --verbose ] Chatty output. + -c [ --config-file ] arg The name of a configuration file + containing program option values in a + ... + +The tool has two parameters specifying the locations of the input (CSV) file and the output folder where +the partitioned products will be stored: + +.. code-block:: bash + + % sph-partition-matches --help + .. + \_____________________ Output: + --out.dir arg The directory to write output files to. + \______________________ Input: + -i [ --in.path ] arg An input file or directory name. If the + name identifies a directory, then all + the files and symbolic links to files + in the directory are treated as inputs. + This option must be specified at least + once. + +.. hint:: + + If the tool is launched via the docker command as was shown above, one would have to mount the corresponding + host paths into the container. + +All tables, including both *director* tables and the *ref-match* table itself, have to be partitioned using +the same values of the partitioning parameters, including: + +- The number of stripes +- The number of sub-stripes +- The overlap radius + +Values of the partitioning parameters should be specified using the following options (the default values shown below are meaningless +for any production scenario): + +.. code-block:: bash + + --part.num-stripes arg (=18) The number of latitude angle stripes to + divide the sky into. + --part.num-sub-stripes arg (=100) The number of sub-stripes to divide + each stripe into. + --part.overlap arg (=0.01) Chunk/sub-chunk overlap radius (deg). + +The next sections present two options for partitioning the input data. + +The spatial match within the given overlap radius +------------------------------------------------- + +This is the most reliable way of partitioning the input data of the match tables. It is available when +the input rows of the match table carry the exact spatial coordinates of both matched rows (from the corresponding +*director* tables). + +In this scenario, the input data file (``CSV``) is expected to have 4 columns representing the spatial coordinates +of the matched rows from the *director* tables on the 1st ("left") and on the 2nd ("righ"). Roles and sample names +of the columns are presented in the table below: + +``dir1_ra`` + The *right ascent* coordinate (*longitude*) of the 1st matched entity (from the 1st *director* table). +``dir1_dec`` + The *declination* coordinate (*latitude*) of the 1st matched entity (from the 1st director table). +``dir2_ra`` + The *right ascent* coordinate (*longitude*) of the 2nd matched entity (from the 2nd *director* table). +``dir2_dec`` + The *declination* coordinate (*latitude*) of the 2nd matched entity (from the 2nd director table). + +The names of these columns need to be passed to the partitioning tool using two special parameters: + +.. code-block:: bash + + % sph-partition-matches \ + --part.pos1="dir1_ra,dir1_dec" \ + --part.pos2="dir2_ra,dir2_dec" + +.. note: + + The order of the columns in each packed pair pf columns is important. The names must be separated by commas. + +When using this technique for partitioning the match tables, it's required that the input CSV file(s) had at least those 4 columns +mentioned above. The actual number of columns could be larger. Values of all additional will be copied into the partitioned +products (the chunk files). The original order of the columns will be preserved. + +Here is an example of a sample ``CSV`` file that has values of the above-described spatial coordinates in the first 4 columns +and the object identifiers of the corresponding rows from the matched *director* tables in the last 2 columns: + +.. code-block:: + + 10.101,43.021,10.101,43.021,123456,6788404040 + 10.101,43.021,10.102,43.023,123456,6788404041 + +The last two columns are meant to store values of the following columns: + +``dir1_objectId`` + The unique object identifier of the 1st *director* table. +``dir2_objectId`` + The unique object identifier of the 2nd *director* table. + +The input CSV file shown above could be also presented in the tabular format: + +.. list-table:: + :widths: 10 10 10 10 10 10 + :header-rows: 1 + + * - ``dir1_ra`` + - ``dir1_dec`` + - ``dir2_ra`` + - ``dir2_dec`` + - ``dir1_objectId`` + - ``dir2_objectId`` + * - 0.101 + - 43.021 + - 10.101 + - 43.021 + - 123456 + - 6788404040 + * - 0.101 + - 43.021 + - 10.102 + - 43.023 + - 123456 + - 6788404041 + +Note that this is actually a 1-to-2 match, in which a single object (``123456``) of the 1st director has two matched +objects (``6788404040`` and ``6788404041``) in the 2nd director. Also, note that the second matched object has slightly +different spatial coordinates than the first one. If the value of the overlap parameter is bigger than the difference +between the coordinates then the tool will be able to match the objects successfully. For example, this would work if +a value of the overlap was set to ``0.01``. Otherwise, no match will be made and the row will be ignored by the tool. + +.. _warning: + + It is assumed that the input data of the *ref-match* tables are correctly produced by the data processing + pipelines. Verifying the quality of the input data is beyond the scope of this document. However, one might + consider writing a special tool for pre-scanning the input files and finding problems in the files. + +Here is the complete practical example of how to run the tool with the assumptions made above: + +.. code-block:: bash + + % cat in.csv + 10.101,43.021,10.101,43.021,123456,6788404040 + 10.101,43.021,10.102,43.023,123456,6788404041 + + % cat config.json + { + "part":{ + "num-stripes":340. + "num-sub-stripes":3, + "overlap":0.01, + "pos1":"dir1_ra,dir1_dec", + "pos2":"dir2_ra,dir2_dec" + }, + "in":{ + "csv":{ + "null":"\\N", + "delimiter":",", + "field":[ + "dir1_ra", + "dir1_dec" + "dir2_ra", + "dir2_dec", + "dir1_objectId", + "dir2_objectId" + ] + } + }, + "out":{ + "csv":{ + "null":"\\N", + "delimiter":",", + "escape":"\\", + "no-quote":true + } + } + } + + % mkdir chunks + % sph-partition-matches -c config.json --in.path=in.csv --out.dir=chunks/ + +Partitioning using index maps +----------------------------- + +.. note:: + + This section is under construction. Only the basic idea is presented here. + +This is an alternative way of partitioning the input data of the match tables. It is available when the input rows of the match table +do not carry the exact spatial coordinates of both matched rows (from the corresponding *director* tables). Instead, the input data +has to carry the unique object identifiers of the matched rows. The tool will use the object identifiers to find the spatial coordinates +of the matched rows in the *director* tables. The tool will use the index maps of the *director* tables to find the spatial coordinates +of the matched rows. diff --git a/doc/ingest/index.rst b/doc/ingest/index.rst new file mode 100644 index 0000000000..35c5945541 --- /dev/null +++ b/doc/ingest/index.rst @@ -0,0 +1,14 @@ + +.. highlight:: sql + +################## +Ingesting catalogs +################## + +.. toctree:: + :maxdepth: 2 + + intro + api/index + qserv-ingest/index + data/index diff --git a/doc/ingest/intro.rst b/doc/ingest/intro.rst new file mode 100644 index 0000000000..c7dd9c830a --- /dev/null +++ b/doc/ingest/intro.rst @@ -0,0 +1,39 @@ +.. _ingest-introduction: + +============ +Introduction +============ + +Unlike traditional RDBMS systems, Qserv does not support direct ingestion of data via +SQL ``INSERT`` or MySQL's ``LOAD DATA INFILE`` statements. Neither one can create databases or tables +directly via SQL DDL statements like ``CREATE DATABASE``, ``CREATE TABLE`` and similar. Instead, data +are ingested and managed via the Qserv Ingest REST API which is fully covered in `The Ingest Workflow Developer's Guide `_. +There are several reasons for this design choice: + +- Implementing a parser for the SQL DDL and DML statements is a complex and time-consuming process. + Implementing a correct semantic of the SQL statements in a realm of the distributed database + is an even more daunting task. +- The performance of the SQL-based ingest protocol is not sufficient for high-throughput data ingestion. + - **Note**: Qserv is designed to handle data volumes of the order of many Petabytes. +- The REST services (unlike the simple text-based SQL statements) allow for more *structural* data formats + for user inputs such as schemas (``JSON``) and data (``CSV``). Verifying the syntactical and semantical + correctness of the data is easier when the data are structured. +- The REST services provide a reliable and transparent mechanism for managing and tracking the distributed + state of the data products within Qserv. +- Many operations on the REST services can be made idempotent and can be easily retried in case of failures. +- By not being bound to a particular SQL dialect, the REST services provide a more flexible and portable + interface for data ingestion. The API can be extended to support new types of data management requests, + new data formats, and data sources as needed without changing the core of the Qserv engine. + +The API serves as a foundation for designing and implementing the data ingestion processes that +are loosely called the *ingest workflows*. There may be many such workflows depending on a particular +use case, the amount of data to be ingested, data delivery requirements, and the overall complexity +of the data. + +Read `The Ingest Workflow Developer's Guide `_ for further details on the REST services and their +usage. An explanation of a simple Kubernetes-based ingest workflow application `qserv-ingest `_ +is also provided in this documentation portal. + +Also note that a simple ingest API is provided by :ref:`http-frontend` for ingesting and managing user tables. + +Instructions on preparing the input data for the ingest workflows can be found in the :ref:`ingest-data` section. diff --git a/doc/ingest/qserv-ingest/index.rst b/doc/ingest/qserv-ingest/index.rst new file mode 100644 index 0000000000..83e2348f20 --- /dev/null +++ b/doc/ingest/qserv-ingest/index.rst @@ -0,0 +1,15 @@ +.. _installation-label: + +#################################### +The Kubernetes-based Ingest Workflow +#################################### + +.. toctree:: + :maxdepth: 2 + + input-data + version + run + repcli + itest + diff --git a/doc/admin/qserv-ingest/ingest.yaml b/doc/ingest/qserv-ingest/ingest.yaml similarity index 100% rename from doc/admin/qserv-ingest/ingest.yaml rename to doc/ingest/qserv-ingest/ingest.yaml diff --git a/doc/admin/qserv-ingest/input-data.rst b/doc/ingest/qserv-ingest/input-data.rst similarity index 100% rename from doc/admin/qserv-ingest/input-data.rst rename to doc/ingest/qserv-ingest/input-data.rst diff --git a/doc/admin/qserv-ingest/itest.rst b/doc/ingest/qserv-ingest/itest.rst similarity index 100% rename from doc/admin/qserv-ingest/itest.rst rename to doc/ingest/qserv-ingest/itest.rst diff --git a/doc/admin/qserv-ingest/repcli.rst b/doc/ingest/qserv-ingest/repcli.rst similarity index 100% rename from doc/admin/qserv-ingest/repcli.rst rename to doc/ingest/qserv-ingest/repcli.rst diff --git a/doc/admin/qserv-ingest/run.rst b/doc/ingest/qserv-ingest/run.rst similarity index 100% rename from doc/admin/qserv-ingest/run.rst rename to doc/ingest/qserv-ingest/run.rst diff --git a/doc/admin/qserv-ingest/version.rst b/doc/ingest/qserv-ingest/version.rst similarity index 100% rename from doc/admin/qserv-ingest/version.rst rename to doc/ingest/qserv-ingest/version.rst diff --git a/doc/templates/overview.html b/doc/templates/overview.html index 808666e237..be06e3bb89 100644 --- a/doc/templates/overview.html +++ b/doc/templates/overview.html @@ -7,58 +7,96 @@

    Qserv documentation

    Welcome! This is the documentation for Qserv {{ version|e }}, last updated {{ last_updated|e }}.

    Qserv is an open source MPP SQL database system designed - originally to host the astronomical catalogs of the Legacy - Survey of Space and Time to be conducted by the - Rubin Observatory.

    + originally to host the astronomical catalogs of the Legacy + Survey of Space and Time  to be conducted by the + Rubin Observatory .

    -

    General documentation for Qserv:

    - -
    - - -
    - - - - - -
    -
    - -

    Indices and tables:

    - - - - -
    - - - - -
    -
    - -

    External links:

    +

    General documentation for Qserv

    + + + + + + + + + + + + + + + + + + + + + + + +
    + Introduction + + – what Qserv is and what makes it different from other RDBMS +
    + User's Guide + + – submitting queries and interpreting results +
    + Administrator's Guide + + – installing, configuring and managing Qserv +
    + Ingesting Catalogs + + – interfaces and tools for ingesting and managing data in Qserv +
    + Developer's Guide + + – how Qserv is implemented and how to contribute into it +
    +

    Indices and tables

    + + + + + + + + + + + + + + + +
    +

    General index

    +
    + – presents all terms and concepts, alphabetically +
    +

    Glossary

    +
    + – Qserv terms explained +
    +

    Full table of contents

    +
    + – list all sections and subsections +
    +

    External links

    + + + + + + + +
    +

    Source code 

    +
    + – the source code on GitHub +
    {% endblock %} \ No newline at end of file diff --git a/doc/user/async.rst b/doc/user/async.rst new file mode 100644 index 0000000000..72d0fa7efa --- /dev/null +++ b/doc/user/async.rst @@ -0,0 +1,174 @@ +.. warning:: Known Issues and Limitations: + + - The API has a confusing inconsistency in the naming convention of identifiers ``ID``, ``job-id``, ``jobId``, + ``query-id`` and ``queryId``. These are used interchangeably in the documentation and error messages posted + by Qserv. In reality, they all refer to the same entity - the autogenerated unique identifiers of the user + queries submitted via this interface. This inconsistency will be addressed in the future. + + - There is no way in the current API to get errors on queries failed during the asynchronous processing. The only + tests made by the ``SUBMIT`` command are to ensure that: + + - the query syntax is valid + - the query refers to the correct context (names of databases, tables, columns) + + Any problems detected by Qserv at the query entry point will be reported right away. + +###################### +Asynchronous Query API +###################### + +This is a summary of Qserv's asynchronous query API, as developed in: + +- https://rubinobs.atlassian.net/browse/DM-4451 + +Submitting Queries +================== + +The general syntax for submitting queries for asynchronous processing is: + +.. code-block:: sql + + SUBMIT + +This is illustrated by the following example: + +.. code-block:: sql + + SUBMIT SELECT objectId FROM dp02_dc2_catalogs.Object LIMIT 3 + +If the query validation succeded and the query placed into a processing queue, the command will always return one row with +two columns, where the particularly interesting column is ``jobId``: + +.. code-block:: + + +--------+---------------------+ + | jobId | resultLocation | + +--------+---------------------+ + | 311817 | table:result_311817 | + +--------+---------------------+ + +At this poing the query is running asynchronously. The ``jobId`` is the unique identifier of the query that can be used +for checking the query status, retrieving the results, or cancelling the query. + +Checking Status +=============== + +Based on the ``jobId`` returned by the ``SUBMIT`` command, you can check the status of the query by querying the +``information_schema.processlist`` table: + +.. code-block:: + + SELECT * FROM information_schema.processlist WHERE id=311817\G + +**Note**: ``\G`` is a MySQL command that formats the output. It's not part of the SQL syntax. +The command is quite handy to display result sets comprising many columns or having long values of +the columns in a more readable format. + +The query will return a row with the following columns: + +.. code-block:: + + *************************** 1. row *************************** + ID: 311817 + USER: anonymous + HOST: NULL + DB: dp02_dc2_catalogs + COMMAND: ASYNC + TIME: NULL + STATE: COMPLETED + INFO: SELECT objectId FROM dp02_dc2_catalogs.Object LIMIT 3 + SUBMITTED: 2024-10-06 20:01:18 + COMPLETED: 2024-10-06 20:01:18 + RETURNED: NULL + CZARID: 9 + RESULTLOCATION: table:result_311817 + NCHUNKS: 1477 + TotalChunks: NULL + CompletedChunks: NULL + LastUpdate: NULL + +Particularly interesting columns here are: + +- ``ID``: the unique identifier of the original query (it's the same as ``jobId`` reported by the ``SUBMIT`` command) +- ``STATE``: the query status, which can be one of: ``EXECUTING``, ``COMPLETED``, ``FAILED``, or ``ABORTED`` + +One can also use the following information commands to get the status of all active queries: + +.. code-block:: sql + + SHOW PROCESSLIST + SHOW FULL PROCESSLIST + +**Note**: once the query is over and the results are retrieved, the corresponding row in the ``information_schema.processlist`` +table will be deleted. And the query status will no longer be available. However, Qserv will still maintain the history +of the queries in other system tables. You may contact the Qserv administrator to get the history of the queries should +you need it. + +Retrieving Results +================== + +To retrieve the results of a query, use the following syntax: + +.. code-block:: sql + + SELECT * FROM qserv_result() + +This will return the full results (columns and rows) of the original query corresponding to the provided identifier of +the query. + +For example, the following query will return the results of the query with ``jobId`` of ``311817``: + +.. code-block:: + + SELECT * FROM qserv_result(311817) + +---------------------+ + | objectId | + +---------------------+ + | 1248649384967536732 | + | 1248649384967536769 | + | 1248649384967536891 | + +---------------------+ + +The command may be called one time only. The query result table will be deleted after returning the result set. +Any subsequent attempts to retrieve the results will return an error message: + +.. code-block:: + + SELECT * FROM qserv_result(311817) + ERROR 1146 (42S02) at line 1: Table 'qservResult.result_311817' doesn't exist + +Cancellation +============ + +The general syntax for cancelling running queries is: + +.. code-block:: sql + + CANCEL + +The following example illustrates the technique for cancelling a query that is supposed to take +a long time to complete (the query produces a very large result set): + +.. code-block:: + + SUBMIT SELECT objectId FROM dp02_dc2_catalogs.Object + +--------+---------------------+ + | jobId | resultLocation | + +--------+---------------------+ + | 311818 | table:result_311818 | + +--------+---------------------+ + + CANCEL 311816 + +--------------------------------------+ + | command | + +--------------------------------------+ + | Trying to kill query: CANCEL 311818 | + +--------------------------------------+ + +Note that it's okay to call the ``CANCEL`` command multiple times. If the query has already completed, the command will +post the following error message: + +.. code-block:: + + CANCEL 311818 + ERROR 4005 (Proxy) at line 1: KILL/CANCEL failed: Unknown or finished query ID: CANCEL 311818 diff --git a/doc/user/http-frontend-general.rst b/doc/user/http-frontend-general.rst new file mode 100644 index 0000000000..990dfc4bb4 --- /dev/null +++ b/doc/user/http-frontend-general.rst @@ -0,0 +1,164 @@ + +General guidelines +================== + +This section provides an overview of the general guidelines for utilizing the REST services of the frontend. + +JSON +--------- + +All services, regardless of the HTTP *method* (``GET``, ``POST``, etc.), report results in JSON objects. +The schema of these objects varies depending on the service called. Detailed explanations of +the schemas can be found in the corresponding sections where the services are described. + +.. _http-frontend-general-error-reporting: + +Error reporting +--------------- + +When a service receives a request, it will always return a response with the HTTP code ``200``. +The actual completion status of the request is indicated in the JSON object: + +.. code-block:: + + { "success" : , + "error" : , + "error_ext" : , + "warning" : + } + +The following attributes are related to the completion status: + +``success`` : *number* + The flag indicating if the request succeeded: + + - ``0`` if a request failed (then see attributes ``warning``, ``error``, and ``error_ext``) + - any other number if a request succeeded (also inspect the attribute ``warning`` for non-critical notifications) + +``error`` : *string* + An explanation of the error (if any). + +``error_ext`` : *object* + The optional information on the error (if any). The content of the object is request-specific. + Details can be found in the reference section of the corresponding request. + +``warning`` : *string* + The optional warning for on-critical conditions. Note that warnings may be posted for both + completed or failed requests. + +Other HTTP codes (``3xx``, ``404``, ``5xx``, etc.) could also be returned by the frontend's HTTP server or intermediate proxy servers. + +Protocol Versioning +------------------- + +The API adheres to the optional version control mechanism introduced in: + +- https://rubinobs.atlassian.net/browse/DM-35456 + +Application developers are encouraged to use the mechanism to reinforce the +integrity of the applications. + +Client applications can utilize version numbers in two ways: + +- *Pull mode*: The client explicitly requests the version implemented by the frontend and compares it with the expected version. +- *Push mode*: The client includes the expected version number as a parameter in service requests, allowing the services to verify + if the version matches the frontend implementation. + +Developers can choose to use either method, both, or neither to ensure application integrity. + +Pull mode +^^^^^^^^^ + +To support the first scenario, the API provides a special metadata service that returns +the version number along with additional information about the frontend: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``GET`` + - ``/meta/version`` + +The request object for this service is not required, or it can be an empty JSON object ``{}``. +Upon successful completion, the service will return a JSON object containing the following attributes: + +.. code-block:: + + { "kind" : , + "name" : , + "id" : , + "instance_id" : , + "version" : + } + +Where: + +``kind`` : *string* + The name of the service. The current implementation always reports: + + .. code-block:: + + qserv-czar-query-frontend + +``name`` : *string* + The unique name of the frontend within a given Qserv. The current implementation always reports: + + .. code-block:: + + http + +``id`` : *number* + The numeric identifier of the frontend within a given Qserv. The number returned here may vary. + +``instance_id`` : *string* + An identifier of the Qserv. A value of the attribute depends on a particular deployment of Qserv. + +``version`` : *number* + The current version number of the API. + +Example: + +.. code-block:: json + + { "kind" : "qserv-czar-query-frontend", + "name" : "http", + "id" : 8, + "instance_id" : "qserv-prod", + "version" : 38, + "success" : 1 + } + +Push mode +^^^^^^^^^ + +In the case of the second scenario, an application will pass the desired version number as +a request parameter. The number would be a part of the request's query for the method. For example, +the following request for checking the status of an ongoing query might look like this: + +.. code-block:: bash + + curl -k 'https://localhost:4041/query-async/status/1234?version=38' -X GET + +For other HTTP methods used by the API, the version number must be included in the body of the request as shown below: + +.. code-block:: bash + + curl -k 'https://localhost:4041/query-async' -X POST \ + -H 'Content-Type: application/json' \ + -d'{"version":38,"query":"SELECT ..."}' + +If the number does not match expectations, such a request will fail and the service will return the following +response. Here is an example of what will happen if the wrong version number ``29`` is specified instead +of ``38`` (as specified in the example above): + +.. code-block:: json + + { "success" : 0, + "error" : "The requested version 29 of the API is not in the range + supported by the service.", + "error_ext" : { + "max_version" : 38, + "min_version" : 30 + }, + "warning" : "" + } diff --git a/doc/user/http-frontend-ingest.rst b/doc/user/http-frontend-ingest.rst new file mode 100644 index 0000000000..c5f64e8458 --- /dev/null +++ b/doc/user/http-frontend-ingest.rst @@ -0,0 +1,360 @@ +.. _http-frontend-ingest: + +The User Table Ingest Interface +=============================== + +The frontend provides a simple interface for ingesting and managing user-defined tables in Qserv. Key features and limitations include: + +- Supports creation and ingestion of simple (non-partitioned) tables only. +- Table sizes are constrained by the frontend's available memory: + + - Practical limit is a few GB. + - Limit may be lower for multiple simultaneous table ingest requests. + +- Only synchronous interface is currently supported. + + - **Asynchronous interface is under evaluation.** + +- Schema definition and table data are sent to the frontend in a single JSON object. +- Clients can request optional indexes on ingested tables during the ingest process. +- User-defined tables are automatically created by the request processor within the user databases. + + - The service enforces a specific naming convention for user databases to avoid conflicts with production data products in Qserv. + - The naming convention is detailed in the relevant section of the document. + +- Users can delete tables or their corresponding databases. + + - **Currently, the service does not support authentication/authorization or user quota control.** + +- No backups are provided for tables ingested using this mechanism. +- Binary data types are supported. + + - **Binary data must be converted to an appropriate format for inclusion in the JSON request object.** + - See: :ref:`ingest-general-binary-encoding` (REST) + +- The API follows the same :ref:`http-frontend-general-error-reporting` scheme as adopted for :ref:`http-frontend-query`. + +Ingesting tables +---------------- + +The following REST service implements the synchronous interface for ingesting a table into Qserv: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``POST`` + - ``/ingest/data`` + +A client must include a JSON object in the request body to specify the operation to be performed. The object follows this schema: + +.. code-block:: + + { "database" : , + "table" : , + "binary_encoding" : , + "timeout" : , + "schema" : , + "indexes" : , + "rows" : + } + +Where: + +``database`` : *string* + The required name of a user database. The names of the databases must start with the following prefix: + + .. code-block:: + + user_ + + The rest of the name should include the name of a user or a role. For example: + + .. code-block:: + + user_gapon + +``table`` : *string* + The required name of a table. Table names may not start with the following prefix: + + .. code-block:: + + qserv_ + + This prefix is reserved for naming internal tables that Qserv places into user databases. + +``binary_encoding`` : *string* = ``hex`` + The optional binary encoding of the binary data in the table. For further details see: + + - :ref:`ingest-general-binary-encoding` (REST) + +``schema`` : *array* + The required schema definition. Each element of the array defines a column: + + .. code-block:: + + { "name" : , + "type" : + } + + Where: + + ``name`` + The name of a column + ``type`` + A valid MySQL type + + **Note**: The service preserves the column order when creating a table. + +``indexes`` : *array* = ``[]`` + The optional indexes will be created after ingesting the table. + + More information on the index specification requirements can be found in the dedicated section of the document: + :ref:`http-frontend-ingest-indexes`. + +``rows`` : *array* + The required collection of the data rows to be ingested. Each element of the array represents a complete row, + where elements of the row correspond to the values of the respective columns: + + .. code-block:: + + [ [ , ... ], + ... + [ , ... ] + ] + + The number of elements in each row must match the number of columns defined in the table schema. In case of a mismatch, + the service will complain and refuse to execute the request. + + The order and types of elements in each row should correspond to the order and types of the corresponding columns in + the table schema. The service will attempt to convert the data to the appropriate types. If the conversion fails, the + service will refuse to execute the request. + +``timeout`` : *number* = ``300`` + The optional timeout (in seconds) that limits the duration of the internal operations initiated by the service. + In practical terms, this means that the total wait time for the completion of a request will not exceed the specified timeout. + + **Note**: The number specified as a value of the attribute can not be ``0``. + +A call to this service will block the client application for the time required to create +a database (if it does not already exist), create a table, process and ingest the data, and perform +additional steps (such as creating indexes). The request will fail if it exceeds the specified (or implied) timeout. + +Here is an example of the simple table creation specification: + +.. code-block:: json + + { "version" : 38, + "database" : "user_gapon", + "table" : "employee", + "schema" : [ + { "name" : "id", "type" : "INT" }, + { "name" : "val", "type" : "VARCHAR(32)" }, + { "name" : "active", "type" : "BOOL" } + ], + "rows" : [ + [ "123", "Igor Gaponenko", 1 ], + [ "2", "John Smith", 0 ] + ] + } + +The description could be pushed to the service using: + +.. code-block:: bash + + curl -k 'https://localhost:4041/ingest/data' -X POST \ + -H 'Content-Type: application/json' \ + -d'{"version":38,"database":"user_gapon",..}' + +If the request succeeds then the following table will be created: + +.. code-block:: sql + + CREATE TABLE `user_gapon`.`employee` ( + + `qserv_trans_id` int(11) NOT NULL, + `id` int(11) DEFAULT NULL, + `val` varchar(32) DEFAULT NULL, + `active` tinyint(1) DEFAULT NULL, + + ) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +.. _http-frontend-ingest-indexes: + +Creating indexes +^^^^^^^^^^^^^^^^ + +.. note:: + + For detailed information on the schema of the index specifications, please refer to the following document: + + - :ref:`admin-data-table-index` (ADMIN) + +Indexes, if needed, must be specified in the ``indexes`` attribute of the table creation request. This attribute is a JSON array, +where each entry represents an index specification: + +.. code-block:: + + { "version" : 38, + "indexes" : [ + { "index" : , + "spec" : , + "comment" : , + "columns" : [ + { "column" : , "length" : , "ascending" : }, + ... + ] + }, + ... + ], + ... + } + +A few notes: + +- It is possible to create one or many indexes in such specifications. +- Index names (attribute ``index``) must be unique for the table. +- An index may involve one or many columns as specified in the array ```columns```. +- Index comment (attribute ``comment``) is optional. +- Other attributes are mandatory. + +Here is an example of the earlier presented simple table creation specification which also +includes an index specification: + +.. code-block:: json + + { "version" : 38, + "database" : "user_gapon", + "table" : "employee", + "schema" : [ + { "name" : "id", "type" : "INT" }, + { "name" : "val", "type" : "VARCHAR(32)" }, + { "name" : "active", "type" : "BOOL" } + ], + "rows" : [ + [ "123", "Igor Gaponenko", 1 ], + [ "2", "John Smith", 0 ] + ], + "indexes" : [ + { "index" : "idx_id", + "spec" : "UNIQUE", + "comment" : "This is the primary key index", + "columns" : [ + { "column" : "id", "length" : 0, "ascending" : 1 } + ] + } + ] + } + +This specification will result in creating the following table: + +.. code-block:: sql + + CREATE TABLE `user_gapon`.`employee` ( + + `qserv_trans_id` int(11) NOT NULL, + `id` int(11) DEFAULT NULL, + `val` varchar(32) DEFAULT NULL, + `active` tinyint(1) DEFAULT NULL, + + UNIQUE KEY `idx_id` (`id`) COMMENT 'This is the primary key index' + + ) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +Deleting tables +--------------- + +Existing tables can be deleted with the following service: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``DELETE`` + - ``/ingest/table/:database/:table`` + +Where: + +``database`` : *string* + The required name of the user database containing the table to be deleted. + + **Note**: Database names must start with the following prefix: + + .. code-block:: + + user__ + +``table`` : *string* + The required name of a table to be deleted. + +For example: + +.. code-block:: bash + + curl -k 'https://localhost:4041/ingest/table/user_gapon/employees' -X DELETE \ + -H 'Content-Type: application/json' \ + -d'{"version":38}' + +A few notes: + +- Option ``-k`` is used to ignore the SSL certificate verification. +- The sender's content header (option ``-H``) is required by the service. +- The request's body can be empty. However, it needs to be a valid JSON object, such as ``{}``. +- The present implementation of the service doesn't provide user authentication/authorization + services that prevent the deletion of someone else's tables. + +Deleting user databases +----------------------- + +Existing databases (including all tables within such databases) can be deleted with the following service: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``DELETE`` + - ``/ingest/database/:database`` + +Where: + +``database`` : *string* + The required name of a database to be deleted. + + **Note**: Database names must start with the following prefix: + + .. code-block:: + + user__ + +For example: + +.. code-block:: bash + + curl -k 'https://localhost:4041/ingest/database/user_gapon' -X DELETE \ + -H 'Content-Type: application/json' \ + -d'{"version":38}' + +A few notes: + +- The ``-k`` option is used to ignore SSL certificate verification. +- The ``-H`` option is required to specify the content type as JSON. +- The request body can be empty but must be a valid JSON object, such as ``{}``. +- The current implementation does not provide authentication/authorization to prevent + the deletion of other users' databases. + +Possible extensions of the table ingest service +----------------------------------------------- + +.. warning:: + + None of the improvements mentioned below have been implemented. This section is primarily + to outline potential future enhancements. + +Potential enhancements for the table ingest service include: + +- Adding services to manage (create or drop) indexes on existing tables. +- Introducing a service for asynchronous table ingests. +- Implementing a service to track the status and progress of asynchronous requests. +- Providing a service to cancel queued asynchronous requests. +- Supporting table ingests using the ``multipart/form-data`` format, where data is sent as + a ``CSV``-formatted file. diff --git a/doc/user/http-frontend-query.rst b/doc/user/http-frontend-query.rst new file mode 100644 index 0000000000..87230e2089 --- /dev/null +++ b/doc/user/http-frontend-query.rst @@ -0,0 +1,423 @@ +.. _http-frontend-query: + +The Query Interface +=================== + +Submitting queries +------------------ + +.. _http-frontend-query-sync: + +Synchronous interface +^^^^^^^^^^^^^^^^^^^^^ + +The following REST service implements the synchronous interface: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``POST`` + - ``/query`` + +To specify the query to be executed, a client must include the following JSON object in the request body: + +.. code-block:: + + { "query" : , + "database" : , + "binary_encoding" : + } + +Where: + +``query`` : *string* + The required query text in which the default database may be missing. In the latter case, + a client needs to provide the name in a separate parameter. + +``database`` : *string* = ``""`` + The optional name of the default database for queries where no such name was provided explicitly. + +``binary_encoding`` : *string* = ``hex`` + The optional binary encoding of the binary data in the table. For further details see: + + - :ref:`ingest-general-binary-encoding` (REST) + +A call to this service will block a client application until one of the following events occurs: + +- The query is successfully processed, and its result is returned to the caller. +- The query fails, and the corresponding error is returned to the caller. +- The frontend becomes unavailable (due to a crash, restart, or networking problem, etc.), and the network connection is lost. + +If the request is successfully completed, the service will return a result set in the JSON object explained in the section Result sets. + +.. _http-frontend-query-async: + +Asynchronous interface +^^^^^^^^^^^^^^^^^^^^^^ + +The following REST service implements the asynchronous interface: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``POST`` + - ``/query-async`` + +A client is required to pass the JSON object in the request body to specify what query +needs to be executed. The object has the following schema: + +.. code-block:: + + { "query" : , + "database" : + } + +Where: + +``query`` : *string* + The required query text in which the default database may be missing. In the latter case, a client needs to provide + the name in a separate parameter. + +``database`` : *string* = ``""`` + The optional name of the default database for queries where no such name was provided explicitly. + +A call to this service will normally block a client application for a short period until +one of the following will happen: + +- The query will be successfully analyzed and queued for asynchronous processing by Qserv. + In this case, a response object with the unique query identifier will be returned to a caller. +- The query will fail and the corresponding error will be returned to the caller. +- The frontend will become unavailable (due to a crash, restart, or networking problem, etc.) + and a network connection will be lost. + +In case of the successful completion of the request, the service will return the following JSON object: + +.. code-block:: + + { "queryId" : + } + +The number reported in the object should be further used for making the following requests explained +in the dedicated subsections below: + +- checking the status of the query to see when it's finished +- requesting a result set of the query +- or, canceling the query if needed + +Checking the status of the ongoing query +----------------------------------------- + +This service also allows checking the status of queries submitted via the synchronous +interface, provided the unique identifier of such query is known to the user: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``GET`` + - ``/query-async/status/:queryId`` + +Where: + +``queryId`` : *number* + The required unique identifier of the previously submitted query. + +If the query identifier is not valid, the service will report an error in the response object. +For example, consider the following request: + +.. code-block:: bash + + curl -k 'https://localhost:4041/query-async/status/123?version=38' -X GET + +It might result in the following response: + +.. code-block:: json + + { "success" : 0, + "error" : "failed to obtain info for queryId=123, + ex: Czar::getQueryInfo Unknown user query, err=, + sql=SELECT status,messageTable,resultQuery FROM QInfo WHERE queryId=123", + "error_ext" : {}, + } + +If the query identifier is valid then the following object will be returned: + +.. code-block:: + + { "success" : 1, + ... + "status" : { + "queryId" : , + "status" : , + "totalChunks" : , + "completedChunks" : , + "queryBeginEpoch" : , + "lastUpdateEpoch" : + } + } + +Where the ``status`` is an object that has following attributes: + +``queryId`` : *number* + The unique identifier of the previously submitted query. + +``status`` : *string* + The current status of the query can have one of the following values: + + - ``EXECUTING`` - The query processing is still in progress. + - ``COMPLETED`` - The query has been completed. + - ``FAILED`` - The query failed. + - ``ABORTED`` - The query was aborted: + + - explicitly by a user using the query cancellation REST service explained in the document. + - or, implicitly by Qserv if the intermediate result set of the query exceeds the large result + limit (which is configured by the Qserv administrators). + - or, implicitly when the query processing service was restarted due to some failure or by + Qserv administrators. + +``totalChunks`` : *number* + The total number of so-called "chunks" (spatial shards used for splitting the large tables in Qserv + into smaller sub-tables to be distributed across worker nodes of Qserv). + +``completedChunks`` : *number* + The number of chunks that have been processed by Qserv so far. The value of this parameter varies + from ``0`` to the maximum number reported in the attribute ``totalChunks``. + +``queryBeginEpoch`` : *number* + The 32-bit number representing the start time of the query expressed in seconds since the UNIX *Epoch*. + +``lastUpdateEpoch`` : *number* + The 32-bit number represents the last time when the query status was recorded/updated by the Qserv + internal monitoring system. The timestamp is the number of seconds since the UNIX *Epoch*. + The service returns a value of ``0`` if either of the following is true: + + - the query processing didn't start + - the requst wasn't inspected by the monitoring system + +Here is an example of the status inquiry request that succeeded: + +.. code-block:: + + { "success" : 1, + "status" : { + "queryId" : 310554, + "status" : "EXECUTING", + "totalChunks" : 1477, + "completedChunks" : 112, + "queryBeginEpoch" : 1708141345, + "lastUpdateEpoch" : 1708141359 + } + } + +Users can use the status service to estimate when the query will finish. Typically, client +applications should wait until the query status is "COMPLETED" before fetching +the result set by calling the next service explained below. + +.. _http-frontend-query-async-result: + +Requesting result sets +---------------------- + +The query results are retrieved by calling the following service: + +.. list-table:: + :widths: 10 25 65 + :header-rows: 1 + + * - method + - service + - query parameters + * - ``GET`` + - ``/query-async/result/:queryId`` + - ``binary_encoding=`` + +Where: + +``queryId`` : *number* + The required unique identifier of the previously submitted query. + +``binary_encoding`` : *string* = ``hex`` + The optional format for encoding the binary data into JSON: + + - ``hex`` - for serializing each byte into the hexadecimal format of 2 ASCII characters per each byte of + the binary data, where the encoded characters will be in a range of ``0 .. F``. In this case, + the encoded value will be packaged into the JSON string. + - ``b64`` - for serializing bytes into a string using the Base64 algorithm with + padding (to ensure 4-byte alignment). + - ``array`` - for serializing bytes into the JSON array of numbers in a range of ``0 … 255``. + + Here is an example of the same sequence of 4-bytes encoded into the hexadecimal format: + + .. code-block:: + + "0A11FFD2" + + The array representation of the same binary sequence would look like this: + + .. code-block:: + + [10,17,255,210] + +Like in the case of the status inquiry request, if the query identifier is not valid then +the service will report an error in the response object. Otherwise, a JSON object explained +in the section :ref:`http-frontend-query-resultsets` will be returned. + +.. _http-frontend-query-resultsets: + +Result sets +^^^^^^^^^^^ + +Both flavors of the query submission services will return the following JSON object in case of +the successful completion of the queries (**Note**: comments ``//`` used in this example are not allowed in JSON): + +.. code-block:: + + { "schema" : [ + + // Col 0 + { "table" : , + "column" : , + "type" : , + "is_binary" : + }, + + // Col 1 + { "table" : , + "column" : , + "type" : , + "is_binary" : + }, + + ... + + // Col (NUM_COLUMNS-1) + { "table" : , + "column" : , + "type" : , + "is_binary" : + } + ], + + "rows" : [ + + // Col 0 Col 1 Col (NUM_COLUMNS-1) + // -------- -------- ------------------ + [ , , ... ], // Result row 0 + [ , , ... ], // Result row 1 + ... + [ , , ... ] // Result row (NUM_ROWS-1) + ] + } + +Where: + +``schema`` : *array* + A collection of rows, in which each row is a dictionary representing a definition of + the corresponding column of the result set: + + ``table`` : *string* + The name of the table the column belongs to. + + ``column`` : *string* + The name of the column. + + ``type`` : *string* + The MySQL type of the column as in the MySQL statement: + + .. code-block:: sql + + CREATE TABLE ... + + ``is_binary`` : *number* + The flag indicating if the column type represents the binary type. + A value that is not ``0`` indicates the binary type. + The MySQL binary types are documented in the corresponding sections of the MySQL Reference Manual: + + - `The BINARY and VARBINARY Types `_ + - `The BLOB and TEXT Types `_ + - `Bit-Value Type - BIT `_ + + **Attention**: Binary values need to be processed according to a format specified in the optional + attribute "binary_encoding" in: + + - Processing responses of query requests submnitted via the :ref:`http-frontend-query-sync` + - :ref:`http-frontend-query-async-result` of queries submitted via the asynchronous interface + +``rows`` : *array* + A collection of the result rows, where each row is a row of strings representing values at positions + of the corresponding columns (see schema attribute above). + +For example, consider the following query submission request: + +.. code-block:: bash + + curl -k 'https://localhost:4041/query' -X POST-H 'Content-Type: application/json' \ + -d'{"version":38,"query":"SELECT objectId,coord_ra,coord_dec FROM dp02_dc2_catalogs.Object LIMIT 5"}' + +The query could return: + +.. code-block:: json + + { "schema":[ + { "column" : "objectId", "table" : "", "type" : "BIGINT", "is_binary" : 0 }, + { "column" : "coord_ra", "table" : "", "type" : "DOUBLE", "is_binary" : 0 }, + { "column" : "coord_dec","table" : "", "type" : "DOUBLE", "is_binary" : 0 }], + "rows":[ + [ "1248640588874548987", "51.5508603", "-44.5061095" ], + [ "1248640588874548975", "51.5626104", "-44.5061529" ], + [ "1248640588874548976", "51.5625138", "-44.5052961" ], + [ "1248640588874548977", "51.3780995", "-44.5072101" ], + [ "1248640588874548978", "51.374245", "-44.5071616" ]], + "success" : 1, + "warning" : "", + "error" : "", + "error_ext" : {} + } + +Canceling queries +----------------- + +.. note:: + + This service can be used for terminating queries submitted via the synchronous or asynchronous + interfaces, provided the unique identifier of such query is known to a user. + +The status of the query can be checked using: + +.. list-table:: + :widths: 10 90 + :header-rows: 0 + + * - ``DELETE`` + - ``/query-async/`` + +Where: + +``queryId`` : *number* + The required unique identifier of the previously submitted query. + +If the query identifier is not valid, the service will report an error in the response object. For example, consider the following request: + +.. code-block:: bash + + curl -k 'https://localhost:4041/query-async/123?version=38' -X DELETE + +It might result in the following response: + +.. code-block:: json + + { "success": 0, + "error" : "failed to obtain info for queryId=123, + ex: Czar::getQueryInfo Unknown user query, err=, + sql=SELECT status,messageTable,resultQuery FROM QInfo WHERE queryId=123", + } + +If the query identifier is valid then the following object will be returned: + +.. code-block:: json + + { "success" : 1 + } + diff --git a/doc/user/http-frontend.rst b/doc/user/http-frontend.rst new file mode 100644 index 0000000000..5de379bba4 --- /dev/null +++ b/doc/user/http-frontend.rst @@ -0,0 +1,35 @@ + +.. note:: + + - This guide corresponds to version **38** of the Qserv REST API. Note that each API implementation has a specific version. + The version number will change if any modifications to the implementation or API that might affect users are made. + This document will be updated to reflect the latest API version. + - As of version **38**, all communications with the service are over SSL/TLS encrypted connections. + The service will not accept unencrypted connections. Use the ``-k`` option with ``curl`` to bypass SSL certificate + verification if necessary. + +.. _http-frontend: + +###################### +HTTP frontend of Qserv +###################### + +.. toctree:: + :maxdepth: 4 + + http-frontend-general + http-frontend-query + http-frontend-ingest + +This document describes the HTTP-based frontend for interacting with Qserv. This frontend complements +the one based on ``mysql-proxy``. + +Key features of the API presented in this document include: + +- Utilizes the HTTP protocol. +- Returns result sets (data and schema) in JSON objects. +- Supports both *synchronous* and *asynchronous* query submission operations. +- Offers a mechanism for tracking the progress of asynchronously submitted queries. +- Allows for query cancellation. +- Provides a simple interface for ingesting and managing user tables. +- Ensures protocol versioning to maintain the integrity of distributed applications. diff --git a/doc/user/index.rst b/doc/user/index.rst index d1f4ccbe62..2a9391affd 100644 --- a/doc/user/index.rst +++ b/doc/user/index.rst @@ -1,519 +1,10 @@ -.. warning:: +############ +User's Guide +############ - **Information in this guide is known to be outdated.** A documentation sprint is underway which will - include updates and revisions to this guide. +.. toctree:: + :maxdepth: 2 -.. highlight:: sql - -########## -User Guide -########## - -Introduction -============ - -LSST Query Services (Qserv) provides access to the LSST Database Catalogs. Users can query the catalogs using -standard SQL query language with a few restrictions described below. Why restricting it? We are intercepting -all queries, rewriting them and executing each large query as many sub-queries in parallel. Introducing these -restrictions greatly simplifies parsing incoming queries. - -Our parser uses an open-source grammar built from the SQL92 specification. It does not include anything beyond -SQL92, with minor exceptions (e.g., != is allowed as well as <>). - -The simplest way to look at it is to treat it as a MySQL database server, modulo restrictions and extensions -described in this document. - -If you run into any syntax that this Manual fails to document, please report it through the Qserv mailing -list. - - -Selected Design Aspects -======================= - -Partitioning and Sharding -------------------------- - -Qserv has been designed to handle large volumes of data that can be partitioned in one or more dimensions (for -example, by spacial locality). Once the partitioning column(s) are selected and partitioning parameters (such -as partition size) are chosen, loaded data gets directed to appropriate partitions ("chunks"), and chunks are -distributed (sharded) across nodes available in the cluster. - -In such scheme, a single large table typically consists of many chunks (it could even be tens of thousands of -chunks). This helps with running full-table-scan queries, as each such query can be executed in pieces, in -parallel. For example, imagine we have an Object table that we split into x chunks. Then Qserv will execute:: - - SELECT * from Object - -as:: - - SELECT * from Object_00001 - SELECT * from Object_00002 - ... - SELECT * from Object_x - -in parallel. - - -Director Table --------------- - -Often, multiple large tables need to be partitioned and joined together. To ensure joining such tables is -possible without sending lots of information between nodes, Qserv has a way to ensure all related chunks -always end up on the same machine. To enable that, Qserv has a notion of "Director Table", which "drives" -partitioning. For example, consider two tables:: - - TABLE Object ( - objectId BIGINT PRIMARY KEY, # unique identifier - ra DOUBLE, # spatial location (right ascension) - decl DOUBLE # spatial location (declination) - ) - -which contains information about astronomical objects (galaxies, stars), one row = one object, and:: - - TABLE Source ( - sourceId BIGINT PRIMARY KEY, # unique identifier - objectId BIGINT, # pointer to corresponding object - # Note, there maybe many sources per object - ra DOUBLE # spatial location (right ascension) - decl DOUBLE # spatial location (declination) - ) - -which contains information about individual detections of astronomical objects, one row = one detection of one -object. - -Note that astronomical objects tend to move, so individual detections of the same object might have different -ra/decl positions than the "average" location represented by the ra/decl of their corresponding object. - -If we elect the Object table to be the "Director Table", not only the Object table will be partitioned -according to its ra/decl values, but more importantly, Source table will be partitioned based on the ra/decl -of corresponding objects. - - -Secondary Index ---------------- - -The sharding scheme described above has a problem with locating data by objectId. To alleviate this, Qserv -maintains a specialized index that maps a primary key of the director table to a chunkId of the chunk that -contains a given row. Consider a query:: - - SELECT * from Object WHERE objectId = - -behind the scene, it will be executed as:: - - SELECT chunkId FROM IdToChunkMapping WHERE objectId = - -which is a quick index lookup, followed by :: - - SELECT * from Object_ WHERE objectId = - -which is another quick index lookup inside one small chunk. - -Note that the use of secondary index has some restrictions, as explained in the restrictions section below. - -By the way, do not attempt to issues queries directly on our internal chunk tables. It is blocked. - - -Extensions -========== - -This section covers extensions to sql which we introduced. - - -Spatial Constraints -------------------- - -Spatial constraints in Qserv can be expressed using one of the functions we introduced. Currently supported:: - - qserv_areaspec_box( - lonMin DOUBLE PRECISION, # [deg] Minimum longitude angle - latMin DOUBLE PRECISION, # [deg] Minimum latitude angle - lonMax DOUBLE PRECISION, # [deg] Maximum longitude angle - latMax DOUBLE PRECISION # [deg] Maximum latitude angle - ) - - qserv_areaspec_circle( - lon DOUBLE PRECISION, # [deg] Circle center longitude - lat DOUBLE PRECISION, # [deg] Circle center latitude - radius DOUBLE PRECISION # [deg] Circle radius - ) - - qserv_areaspec_ellipse( - lon DOUBLE PRECISION, # [deg] Ellipse center longitude - lat DOUBLE PRECISION, # [deg] Ellipse center latitude - semiMajorAxisAngle DOUBLE PRECISION, # [arcsec] Semi-major axis length - semiMinorAxisAngle DOUBLE PRECISION, # [arcsec] Semi-minor axis length - positionAngle DOUBLE PRECISION # [deg] Ellipse position angle, east of north - ) - - qserv_areaspec_poly( - v1Lon DOUBLE PRECISION, # [deg] Longitude angle of first polygon vertex - v1Lat DOUBLE PRECISION, # [deg] Latitude angle of first polygon vertex - v2Lon DOUBLE PRECISION, # [deg] Longitude angle of second polygon vertex - v2Lat DOUBLE PRECISION, # [deg] Latitude angle of second polygon vertex - ... - ) - -Example:: - - SELECT objectId - FROM Object - WHERE qserv_areaspec_box(0, 0, 3, 10) - -Note that as discussed in the "Restrictions" section below, spatial constraints **must** be expressed through -the qserv_areaspec\_* functions. - - -Restrictions -============ - -This section covers restriction you need to be aware of when interacting with Qserv. - - -Spatial constraints should be expressed through our qserv_areaspec\_* functions -------------------------------------------------------------------------------- - -Spatial constraints should be expressed through qserv_areaspec\_* functions (see Extensions section above for -details). Any other way of specifying spatial restrictions may be significantly slower (e.g., they might -devolve to be full table scan). For example, the form:: - - WHERE ra BETWEEN AND - AND decl BETWEEN AND - -even though it is equivalent to: - - qserv_areaspec_box(, , , ) - -should not be used. - - -Spatial constraints must appear at the beginning of WHERE ---------------------------------------------------------- - -Spatial constraint must appear at the very beginning of the WHERE clause (before or after the objectId -constraint, if there is any). - - -Only one spatial constraint is allowed per query ------------------------------------------------- - -Only one spatial constraint expressed through qserv_areaspec\_* is allowed per query, e.g., these are examples -of invalid queries:: - - WHERE qserv_areaspec_box(1, 35, 2, 38) - AND qserv_areaspec_box(5, 77, 6, 78) - -or :: - - WHERE qserv_areaspec_box(1, 35, 2, 38) - AND qserv_areaspec_circle(5, 77, 0.1) - - -Arguments passed to spatial constraints functions must be simple literals -------------------------------------------------------------------------- - -The arguments passed to the qserv_aresspec\_ functions must be simple literals. They may not contain any -references, e.g. may not refer to columns. - -Example of an invalid entry:: - - WHERE qserv_areaspec_box(3+4, ra*2, 0, 0) - - -OR is not allowed after qserv_areaspec\_* constraint ----------------------------------------------------- - -If the query has extra constraints after the qserv_areaspec\_* constraint, OR is not allowed immediately after -qserv_areaspec\_*, for example:: - - SELECT objectId, ra, decl, x - FROM Object - WHERE qserv_areaspec_box(1, 35, 2, 38) - AND x > 3.5 - -is valid, but - - SELECT objectId, ra, decl, x - FROM Object - WHERE qserv_areaspec_box(1, 35, 2, 38) - OR x > 3.5 - -is not allowed. We expect to remove this restriction in the future, see -`DM-2888 `_. - - -Secondary index constraint must be expressed through "=", "IN", or "BETWEEN" ----------------------------------------------------------------------------- - -If the query has objectId constraint, it should be expressed in one of these three forms:: - - SELECT * FROM Object WHERE objectId = 123 - - SELECT * FROM Object WHERE objectId IN (123, 453, 3465) - - SELECT * FROM Object WHERE objectId BETWEEN 123 AND 130 - -E.g., don't try to express it as "WHERE objectId != 1", or WHERE objectId > 123 etc. - -Note, we expect to allow decomposing objectId into bitfields (e.g., for sampling) in the future. See -`DM-2889 `_. - - -Column(s) used in ORDER BY or GROUP BY must appear in SELECT ------------------------------------------------------------- - -At the moment we require columns used in ORDER BY or GROUP BY to be listed in SELECT. Example of an invalid -query:: - - SELECT x - FROM T - ORDER BY y - -Correct version:: - - SELECT y, x - FROM T - ORDER BY y - - -Expressions/functions in ORDER BY clauses are not allowed ---------------------------------------------------------- - -In SQL92 ORDER BY is limited to actual table columns, thus expressions or functions in ORDER BY are rejected. -This is true for Qserv too. - -Example of an invalid ORDER BY:: - - SELECT id, ABS(x) - FROM Source - ORDER BY ABS(x) - -However, one can bypass this by using an alias, for example:: - - SELECT id, ABS(x) as ax - FROM Source - ORDER BY ax - - -Sub-queries are NOT supported ------------------------------ - -Sub queries are not supported. - - -Commands that modify tables are disallowed ------------------------------------------- - -Commands for creating or modifying tables are disabled. These commands include "INSERT, UPDATE, LOAD INTO, -CREATE, ALTER, TRUNCATE, DROP". We will revisit this as we start adding support for Level 3. - - -Outer joins are not supported with near-neighbor queries --------------------------------------------------------- - -Qserv does not support LEFT or RIGHT joins with near-neighbor predicates. - - -MySQL-specific syntax is not supported --------------------------------------- - -MySQL-specific syntax is not supported. Example of unsupported syntax that will be rejected: NAME_CONST. - - -Repeated column names through * are not supported -------------------------------------------------- - -Queries with a * that resolves to repeated column name are not supported. Example:: - - SELECT *, id - FROM Object - -will fail if the table Object has a column called "id". Similarly, this query will fail:: - - SELECT o.*, s.* - FROM Object AS o, - Source AS s - -if both tables Object and Source have a column called "id". - -A workaround would be to select columns explicitly and alias them, e.g. :: - - SELECT o.id AS oId, s.id AS sId - FROM Object AS o, - Source AS s - - -"USE INDEX()" is not supported ------------------------------- - -Qserv will reject query with "USE INDEX" hint. - - -Variables are not supported ---------------------------- - -You can't select into a variable. For example :: - - SELECT scisql_s2CPolyToBin(...) - FROM T - INTO @poly - -will fail. Related story `DM-2874 `_. - -User Defined Functions -====================== - -Qserv installation always comes with a set of predefined user defined functions: - * spherical geometry aimed to allow quick answers to the following sorts of questions: * Which points in a - table lie inside a region on the sphere? For example, an astronomer might wish to know which stars and - galaxies lie inside the region of the sky observed by a single camera CCD. * Which spherical regions in a - table contain a particular point? For example, an astronomer might with to know which telescope images - overlap the position of interesting object X - * photometry, aimed to provide conversions between raw fluxes, calibrated (AB) fluxes and AB magnitudes. - -For details, see `Science Tools for MySQL `_. - - -Example Queries Supported -========================= - - -Counts and simple selections ----------------------------- - -You can count objects and run simple selections. Few examples: - - -Count the number of rows in a table -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -:: - - SELECT COUNT(*) - FROM Object - - -Find rows with a particular id -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -:: - - SELECT * - FROM Object - WHERE objectId = - - -Select rows in a given area -^^^^^^^^^^^^^^^^^^^^^^^^^^^ -:: - - SELECT objectId - FROM Object - WHERE qserv_areaspec_box(1, 35, 2, 38) - - -Select rows in a given area meeting certain criteria -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -:: - - SELECT COUNT(*) - FROM Object - WHERE qserv_areaspec_box(0.1, -6, 4, 6) - AND x = 3.4 - AND y BETWEEN 1 AND 2 - - -Find a row with a particular id -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -:: - - SELECT * - FROM Object - WHERE objectId = - - -Joins ------ - -Join two tables -^^^^^^^^^^^^^^^ -:: - - SELECT s.ra, s.decl, o.raRange, o.declRange - FROM Object o, - Source s - WHERE o.objectId = - AND o.objectId = s.objectId - -or :: - - SELECT s.ra, s.decl, o.raRange, o.declRange - FROM Object o, - Source s USING (objectId - WHERE o.objectId = - - -Find near neighbors in a given region -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -:: - - SELECT o1.objectId AS objId1, - o2.objectId AS objId2, - scisql_angSep(o1.ra_PS, o1.decl_PS, o2.ra_PS, o2.decl_PS) AS distance - FROM Object o1, - Object o2 - WHERE qserv_areaspec_box(0, 0, 0.2, 1) - AND scisql_angSep(o1.ra_PS, o1.decl_PS, o2.ra_PS, o2.decl_PS) < 0.05 - AND o1.objectId <> o2.objectId - - -LIMIT, ORDER BY ---------------- - -Limit results, sort results -^^^^^^^^^^^^^^^^^^^^^^^^^^^ -:: - - SELECT * - FROM Object - WHERE x > 4 - ORDER BY x - LIMIT 100 - - -Known Bugs -========== - -The list of all known / reported problems can be found at: `Data Access and Database Team User-facing -Bugs `_. - - -Selecting by objectId can miss a row ------------------------------------- - -Selecting rows using objectId sometimes does not return rows it should. -For details, see: `DM-2864 `_. - - -WHERE objectId BETWEEN fails ----------------------------- - -As explained above, queries in the form "WHERE objectId BETWEEN" are discouraged. In fact, Qserv will -currently return a cryptic message when such query is executed. For details, see -`DM-2873 `_. - - -Notes of Performance -==================== - -Use objectId when selecting sources ------------------------------------ - -If you need to locate a small number of sources, try to use objectId if you can. If you don't, your query will -require an index scan for every chunk of the Source table (which can potentially mean thousands of -chunk-queries). For example this query will require it:: - - SELECT * FROM Source WHERE sourceId = 500 - -but asking for sources related to a given object, like this one:: - - SELECT * FROM Source WHERE objectId = 123 AND sourceId = 500 - -will require an index scan for just a single chunk, and thus will typically be much faster. + sql + async + http-frontend diff --git a/doc/user/sql.rst b/doc/user/sql.rst new file mode 100644 index 0000000000..4faa348d20 --- /dev/null +++ b/doc/user/sql.rst @@ -0,0 +1,534 @@ + +.. highlight:: sql + +################# +Qserv SQL Dialect +################# + +Introduction +============ + +LSST Query Services (Qserv) provides access to the LSST Database Catalogs. Users can query the catalogs using +standard SQL query language with a few restrictions described below. Why restricting it? We are intercepting +all queries, rewriting them and executing each large query as many sub-queries in parallel. Introducing these +restrictions greatly simplifies parsing incoming queries. + +Our parser uses an open-source grammar built from the `SQL92 `_ specification. +It does not include anything beyond SQL92, with minor exceptions (e.g., ``!=`` is allowed as well as ``<>``). + +The simplest way to look at it is to treat it as a MySQL database server, modulo restrictions and extensions +described in this document. + +If you run into any syntax that this Manual fails to document, please report it to the Qserv developers. + +Selected Design Aspects +======================= + +Partitioning and Sharding +------------------------- + +Qserv is designed to handle large volumes of data that can be partitioned in one or more dimensions (e.g., by spatial locality). +Once the partitioning columns and parameters (such as partition size) are chosen, the data is directed to appropriate +partitions ("chunks"), which are then distributed (sharded) across the nodes in the cluster. + +In this scheme, a single large table typically consists of many chunks (potentially hundreds of thousands). This facilitates +running full-table-scan queries, as each query can be executed in parallel across multiple chunks. For example, if we have +an Object table split into ``12345`` chunks, Qserv will execute: + +.. code-block:: sql + + SELECT * FROM Object + +as ``12345`` worker-side queries processed in parallel: + +.. code-block:: sql + + SELECT * FROM Object_00001 + SELECT * FROM Object_00002 + ... + SELECT * FROM Object_12345 + + +Director Table +-------------- + +Often, multiple large tables need to be partitioned and joined together. To ensure joining such tables is +possible without sending lots of information between nodes, Qserv has a way to ensure all related chunks +always end up on the same machine. To enable that, Qserv has a notion of a "Director Table", which "drives" +partitioning. For example, consider two tables: + +.. code-block:: sql + + CREATE TABLE Object ( + objectId BIGINT PRIMARY KEY, -- unique identifier + ra DOUBLE, -- spatial location (right ascension) + decl DOUBLE -- spatial location (declination) + ) + +which contains information about astronomical objects (galaxies, stars), one row = one object, and: + +.. code-block:: sql + + CREATE TABLE Source ( + sourceId BIGINT PRIMARY KEY, -- unique identifier + objectId BIGINT, -- pointer to corresponding object + -- Note, there maybe many sources per object + ra DOUBLE -- spatial location (right ascension) + decl DOUBLE -- spatial location (declination) + ) + +which contains information about individual detections of astronomical objects, one row representing one detection of one object. + +Note that astronomical objects tend to move, so individual detections of the same object might have different ``ra`` / ``decl`` +positions than the "average" location represented by the ra/decl of their corresponding object. + +If we select the Object table to be the "Director Table", not only will the Object table be partitioned according to +its ``ra`` / ``decl`` values, but more importantly, the Source table will be partitioned based on the ``ra`` / ``decl`` +of corresponding objects. + + +The Director Index +------------------ + +The sharding scheme described above has a problem with locating data by objectId. To alleviate this, Qserv maintains a specialized +index that maps a primary key of the director table to a chunkId of the chunk that contains a given row. Consider the query: + +.. code-block:: sql + + SELECT * FROM Object WHERE objectId = + +behind the scene, it will be executed as: + +.. code-block:: sql + + SELECT chunkId FROM IdToChunkMapping WHERE objectId = + +which is a quick index lookup, followed by: + +.. code-block:: sql + + SELECT * FROM Object_ WHERE objectId = + +which is another quick index lookup inside one small chunk. + +Note that the use of the *director* index has some restrictions, as explained in the restrictions section below. + +By the way, do not attempt to issue queries directly on our internal chunk tables. It is blocked. + + +Extensions +========== + +This section covers extensions to sql which we introduced. + +Spatial Constraints +------------------- + +Spatial constraints in Qserv can be expressed using one of the functions we introduced. Currently supported: + +.. code-block:: sql + + qserv_areaspec_box( + lonMin DOUBLE, -- [deg] Minimum longitude angle + latMin DOUBLE, -- [deg] Minimum latitude angle + lonMax DOUBLE, -- [deg] Maximum longitude angle + latMax DOUBLE -- [deg] Maximum latitude angle + ) + +.. code-block:: sql + + qserv_areaspec_circle( + lon DOUBLE, -- [deg] Circle center longitude + lat DOUBLE, -- [deg] Circle center latitude + radius DOUBLE -- [deg] Circle radius + ) + +.. code-block:: sql + + qserv_areaspec_ellipse( + lon DOUBLE, -- [deg] Ellipse center longitude + lat DOUBLE, -- [deg] Ellipse center latitude + semiMajorAxisAngle DOUBLE, -- [arcsec] Semi-major axis length + semiMinorAxisAngle DOUBLE, -- [arcsec] Semi-minor axis length + positionAngle DOUBLE -- [deg] Ellipse position angle, east of north + ) + +.. code-block:: sql + + qserv_areaspec_poly( + v1Lon DOUBLE, -- [deg] Longitude angle of first polygon vertex + v1Lat DOUBLE, -- [deg] Latitude angle of first polygon vertex + v2Lon DOUBLE, -- [deg] Longitude angle of second polygon vertex + v2Lat DOUBLE, -- [deg] Latitude angle of second polygon vertex + ... + ) + +Example: + +.. code-block:: sql + + SELECT objectId FROM Object WHERE qserv_areaspec_box(0, 0, 3, 10) + +Note that as discussed in the "Restrictions" section below, spatial constraints **must** be expressed through +the ``qserv_areaspec_*`` functions. + + +Restrictions +============ + +This section covers restriction you need to be aware of when interacting with Qserv. + +Spatial constraints should be expressed through our ``qserv_areaspec_*`` functions +---------------------------------------------------------------------------------- + +Spatial constraints should be expressed through ``qserv_areaspec_*`` functions (see Extensions section above for +details). Any other way of specifying spatial restrictions may be significantly slower (e.g., they might +devolve to be full table scan). For example, the form: + +.. code-block:: sql + + WHERE ra BETWEEN AND + AND decl BETWEEN AND + +even though it is equivalent to: + +.. code-block:: sql + + qserv_areaspec_box(, , , ) + +should not be used. + + +Spatial constraints must appear at the beginning of ``WHERE`` +------------------------------------------------------------- + +Spatial constraints must appear at the very beginning of the ``WHERE`` clause (before or after the ``objectId`` +constraint, if there is any). + + +Only one spatial constraint is allowed per query +------------------------------------------------ + +Only one spatial constraint expressed through ``qserv_areaspec_*`` is allowed per query, e.g., these are examples +of invalid queries: + +.. code-block:: sql + + WHERE qserv_areaspec_box(1, 35, 2, 38) + AND qserv_areaspec_box(5, 77, 6, 78) + + WHERE qserv_areaspec_box(1, 35, 2, 38) + AND qserv_areaspec_circle(5, 77, 0.1) + + +Arguments passed to spatial constraints functions must be simple literals +------------------------------------------------------------------------- + +The arguments passed to the ``qserv_aresspec_*`` functions must be simple literals. They may not contain any +references, e.g. may not refer to columns. + +Example of an invalid entry: + +.. code-block:: sql + + WHERE qserv_areaspec_box(3+4, ra*2, 0, 0) + + +``OR`` is not allowed after ``qserv_areaspec_*`` constraint +----------------------------------------------------------- + +If the query has extra constraints after the ``qserv_areaspec_*`` constraint, ``OR`` is not allowed immediately after +``qserv_areaspec_*,`` for example: + +.. code-block:: sql + + SELECT objectId, ra, decl, x + FROM Object + WHERE qserv_areaspec_box(1, 35, 2, 38) AND x > 3.5 + +is valid, but: + +.. code-block:: sql + + SELECT objectId, ra, decl, x + FROM Object + WHERE qserv_areaspec_box(1, 35, 2, 38) OR x > 3.5 + +is not allowed. We expect to remove this restriction in the future, see +`DM-2888 `_. + + +The director index constraint must be expressed through ``=``, ``IN``, or ``BETWEEN`` +------------------------------------------------------------------------------------- + +If the query has objectId constraint, it should be expressed in one of these three forms: + +.. code-block:: sql + + SELECT * FROM Object WHERE objectId = 123 + SELECT * FROM Object WHERE objectId IN (123, 453, 3465) + SELECT * FROM Object WHERE objectId BETWEEN 123 AND 130 + +E.g., don't try to express it as ``WHERE objectId != 1``, or ``WHERE objectId > 123``, etc. + +Note, we expect to allow decomposing objectId into bitfields (e.g., for sampling) in the future. See +`DM-2889 `_. + + +Column(s) used in ``ORDER BY`` or ``GROUP BY`` must appear in ``SELECT`` +------------------------------------------------------------------------ + +At the moment we require columns used in ``ORDER BY`` or ``GROUP BY`` to be listed in ``SELECT``. +Example of an invalid query: + +.. code-block:: sql + + SELECT x FROM T ORDER BY y + +Correct version: + +.. code-block:: sql + + SELECT y, x FROM T ORDER BY y + +Expressions/functions in ``ORDER BY`` clauses are not allowed +------------------------------------------------------------- + +In SQL92 ``ORDER BY`` is limited to actual table columns, thus expressions or functions in ``ORDER BY`` are rejected. +This is true for Qserv too. + +Example of an invalid use of the ``ORDER BY`` clause: + +.. code-block:: sql + + SELECT id, ABS(x) FROM Source ORDER BY ABS(x) + +However, one can bypass this by using an alias, for example: + +.. code-block:: sql + + SELECT id, ABS(x) as ax FROM Source ORDER BY ax + +Sub-queries are NOT supported +----------------------------- + +Sub queries are not supported. + + +Commands that modify tables are disallowed +------------------------------------------ + +Commands for creating or modifying tables are disabled. These commands include ``INSERT``, ``UPDATE``, ``LOAD INTO``, +``CREATE``, ``ALTER``, ``TRUNCATE``, and ``DROP``. We will revisit this as we start adding support for Level 3. + + +Outer joins are not supported with near-neighbor queries +-------------------------------------------------------- + +Qserv does not support ``LEFT`` or ``RIGHT`` joins with near-neighbor predicates. + + +MySQL-specific syntax is not supported +-------------------------------------- + +MySQL-specific syntax is not supported. Example of unsupported syntax that will be rejected: ``NAME_CONST``. + + +Repeated column names through ``*`` are not supported +----------------------------------------------------- + +Queries with a ``*`` that resolves to repeated column name are not supported. Example: + +.. code-block:: sql + + SELECT *, id FROM Object + +will fail if the table Object has a column called ``id``. Similarly, this query will fail: + +.. code-block:: sql + + SELECT o.*, s.* FROM Object AS o, Source AS s + +if both tables Object and Source have a column called ``id``. + +A workaround would be to select columns explicitly and alias them, e.g. : + +.. code-block:: sql + + SELECT o.id AS oId, s.id AS sId FROM Object AS o, Source AS s + +``USE INDEX()`` is not supported +-------------------------------- + +Qserv will reject query with ``USE INDEX`` hint. + +Variables are not supported +--------------------------- + +You can't select into a variable. For example: + +.. code-block:: sql + + SELECT scisql_s2CPolyToBin(...) FROM T INTO @poly + +will fail. Related story is at `DM-2874 `_. + +User Defined Functions +====================== + +Qserv installation always comes with a set of predefined user defined functions: + +- spherical geometry aimed to allow quick answers to the following sorts of questions: + + - Which points in a table lie inside a region on the sphere? For example, an astronomer might wish to know which stars and + galaxies lie inside the region of the sky observed by a single camera CCD. + - Which spherical regions in a table contain a particular point? For example, an astronomer might wish to know which telescope images + overlap the position of interesting object X + +- photometry, aimed to provide conversions between raw fluxes, calibrated (AB) fluxes and AB magnitudes. + +For details, see `Science Tools for MySQL `_. + + +Example Queries Supported +========================= + +Counts and simple selections +---------------------------- + +You can count objects and run simple selections. Few examples: + + +Count the number of rows in a table +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: sql + + SELECT COUNT(*) FROM Object + + +Find rows with a particular ``id`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: sql + + SELECT * FROM Object WHERE objectId = + +Select rows in a given area +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: sql + + SELECT objectId FROM Object + WHERE qserv_areaspec_box(1, 35, 2, 38) + + +Select rows in a given area meeting certain criteria +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: sql + + SELECT COUNT(*) FROM Object + WHERE qserv_areaspec_box(0.1, -6, 4, 6) + AND x = 3.4 + AND y BETWEEN 1 AND 2 + +Joins +----- + +Join two tables +^^^^^^^^^^^^^^^ + +.. code-block:: sql + + SELECT s.ra, s.decl, o.raRange, o.declRange + FROM Object o, Source s + WHERE o.objectId = + AND o.objectId = s.objectId + +or: + +.. code-block:: sql + + SELECT s.ra, s.decl, o.raRange, o.declRange + FROM Object o, Source s USING (objectId) + WHERE o.objectId = + + +Find near neighbors in a given region +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: sql + + SELECT o1.objectId AS objId1, + o2.objectId AS objId2, + scisql_angSep(o1.ra_PS, + o1.decl_PS, + o2.ra_PS, + o2.decl_PS) AS distance + FROM Object o1, Object o2 + WHERE qserv_areaspec_box(0, 0, 0.2, 1) + AND scisql_angSep(o1.ra_PS, + o1.decl_PS, + o2.ra_PS, + o2.decl_PS) < 0.05 + AND o1.objectId <> o2.objectId + + +``LIMIT``, ``ORDER BY`` +----------------------- + +Limit results, sort results +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: sql + + SELECT * FROM Object + WHERE x > 4 + ORDER BY x + LIMIT 100 + + +Known Bugs +========== + +The list of all known / reported problems can be found at: `Data Access and Database Team User-facing +Bugs `_. + + +Selecting by objectId can miss a row +------------------------------------ + +Selecting rows using objectId sometimes does not return rows it should. +For details, see: `DM-2864 `_. + + +``WHERE objectId BETWEEN`` fails +-------------------------------- + +As explained above, queries in the form ``WHERE objectId BETWEEN`` are discouraged. In fact, Qserv will +currently return a cryptic message when such query is executed. For details, see +`DM-2873 `_. + + +Notes of Performance +==================== + +Use objectId when selecting sources +----------------------------------- + +If you need to locate a small number of sources, try to use objectId if you can. If you don't, your query will +require an index scan for every chunk of the Source table (which can potentially mean thousands of +chunk-queries). For example this query will require it: + +.. code-block:: sql + + SELECT * FROM Source WHERE sourceId = 500 + +but asking for sources related to a given object, like this one: + +.. code-block:: sql + + SELECT * FROM Source WHERE objectId = 123 AND sourceId = 500 + +will require an index scan for just a single chunk, and thus will typically be much faster.