From 7c858ece76dec6391a37d85b4042fdb90e00cbb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Thu, 5 Aug 2021 13:27:43 +0100 Subject: [PATCH] implement DagstoreInitializeAll. --- api/api_storage.go | 25 ++++-- api/docgen/docgen.go | 2 +- api/proxy_gen.go | 23 +++-- build/openrpc/full.json.gz | Bin 25246 -> 25245 bytes build/openrpc/miner.json.gz | Bin 10367 -> 10375 bytes build/openrpc/worker.json.gz | Bin 2711 -> 2712 bytes documentation/en/api-v0-methods-miner.md | 31 +++++++ node/impl/storminer.go | 103 ++++++++++++++++++++--- 8 files changed, 161 insertions(+), 23 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index 55ed033aa..c783af106 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -197,8 +197,17 @@ type StorageMiner interface { // error. DagstoreRecoverShard(ctx context.Context, key string) error //perm:write + // DagstoreInitializeAll initializes all uninitialized shards in bulk, + // according to the policy passed in the parameters. + // + // It is recommended to set a maximum concurrency to avoid extreme + // IO pressure if the storage subsystem has a large amount of deals. + // + // It returns the result for each shard it attempted to initialize. + DagstoreInitializeAll(ctx context.Context, params DagstoreInitializeAllParams) (<-chan DagstoreShardResult, error) //perm:write + // DagstoreGC runs garbage collection on the DAG store. - DagstoreGC(ctx context.Context) ([]DagstoreGCResult, error) //perm:admin + DagstoreGC(ctx context.Context) ([]DagstoreShardResult, error) //perm:admin // RuntimeSubsystems returns the subsystems that are enabled // in this instance. @@ -380,9 +389,13 @@ type DagstoreShardInfo struct { Error string } -// DagstoreGCResult is the serialized form of dagstore.GCResult that we expose -// through JSON-RPC to avoid clients having to depend on the dagstore lib. -type DagstoreGCResult struct { - Key string - Error string +// DagstoreShardResult enumerates results per shard. +type DagstoreShardResult struct { + Key string + Success bool + Error string +} + +type DagstoreInitializeAllParams struct { + MaxConcurrency int } diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 8e16e2d42..725ea2bed 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -276,7 +276,7 @@ func init() { api.SubsystemSectorStorage, api.SubsystemMarkets, }) - addExample(api.DagstoreGCResult{ + addExample(api.DagstoreShardResult{ Key: "baga6ea4seaqecmtz7iak33dsfshi627abz4i4665dfuzr3qfs4bmad6dx3iigdq", Error: "", }) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index d32874890..f5df79d0e 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -603,7 +603,9 @@ type StorageMinerStruct struct { CreateBackup func(p0 context.Context, p1 string) error `perm:"admin"` - DagstoreGC func(p0 context.Context) ([]DagstoreGCResult, error) `perm:"admin"` + DagstoreGC func(p0 context.Context) ([]DagstoreShardResult, error) `perm:"admin"` + + DagstoreInitializeAll func(p0 context.Context, p1 DagstoreInitializeAllParams) (<-chan DagstoreShardResult, error) `perm:"write"` DagstoreInitializeShard func(p0 context.Context, p1 string) error `perm:"write"` @@ -3577,15 +3579,26 @@ func (s *StorageMinerStub) CreateBackup(p0 context.Context, p1 string) error { return ErrNotSupported } -func (s *StorageMinerStruct) DagstoreGC(p0 context.Context) ([]DagstoreGCResult, error) { +func (s *StorageMinerStruct) DagstoreGC(p0 context.Context) ([]DagstoreShardResult, error) { if s.Internal.DagstoreGC == nil { - return *new([]DagstoreGCResult), ErrNotSupported + return *new([]DagstoreShardResult), ErrNotSupported } return s.Internal.DagstoreGC(p0) } -func (s *StorageMinerStub) DagstoreGC(p0 context.Context) ([]DagstoreGCResult, error) { - return *new([]DagstoreGCResult), ErrNotSupported +func (s *StorageMinerStub) DagstoreGC(p0 context.Context) ([]DagstoreShardResult, error) { + return *new([]DagstoreShardResult), ErrNotSupported +} + +func (s *StorageMinerStruct) DagstoreInitializeAll(p0 context.Context, p1 DagstoreInitializeAllParams) (<-chan DagstoreShardResult, error) { + if s.Internal.DagstoreInitializeAll == nil { + return nil, ErrNotSupported + } + return s.Internal.DagstoreInitializeAll(p0, p1) +} + +func (s *StorageMinerStub) DagstoreInitializeAll(p0 context.Context, p1 DagstoreInitializeAllParams) (<-chan DagstoreShardResult, error) { + return nil, ErrNotSupported } func (s *StorageMinerStruct) DagstoreInitializeShard(p0 context.Context, p1 string) error { diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 725fc80f9712c473dbc57b5b00ef3495d49f8cb6..38b71652ac975428c1eee570fe2fab413fc52ae1 100644 GIT binary patch delta 22048 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 Af&c&j delta 22177 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 93de3a98e6f711e75cc1c88c4f4d07ccab6daa33..89341da7db1de82d442bac0ef551ebcf82f77a0e 100644 GIT binary patch delta 9234 zcmV+tB<KQ*fe5S^8D2bEr7ct~L#ac<+Rg z^XEAIwwQ{)S(hF-b2@&Li;wLd;i@Z)Voc;d?;e8RqWBXG_v0;%+XT5DZzi60c$>l51{A4jrgq_ zS98F%Q}ZooH>K1?ki=T1CrZ~eyPS>Tn_c{dKtH@NDLFXIk&+W6|Be4f^+jX^Ln9wM zVATg{jSODFDegw!6$;I$X`bFsz^pDZ6XOtgZ!I&!NniD!zLwXTDv2r0jv@WpFoeJ) zCF|uBc^NRj$;TW3GXO!@BsT2fXt;lLI2;cT#$Ter`7NI}a}LLoDFf;OWRnyGwF7_9 zGn32&{N z{TL?RnlLbj-W1Leu&L`JTg(xlibu{)J^Q*x{jl$Kp+O5icCl*b!?de#* zqK)?XWNq8R64H3_e*k?t9^|v!Il&x57yqqRaepiROTntGWexDQRk&s}&AQiw3J!lW z00~%==z#;6XwtnQHzfQFN>;TgVVH3S=nTvdw--XMNWCq-_#Xxw$RT*;An1Y>+_)4v zuffctOQk)1e-&WsDcdlPmK`uh1bL7PIFJBL9CWXA?h1LLtDpn<=7w+zX3)ki=1`Cv z%Qw^$Dtx655lAig+w zDGhIvAO{wIG=f$hy~AYQ1?Plu1RWo`1Reu?L!>n`!ye-RN|A#cfe&WDH@;?6OkaFP z0>YrPaNN_)4N;#93^13g8AsYfE`t6`A3kPa&CqP^iV=N<-V&@=%6PM(y+9zj?1FsI zUu&^AskIjkeTqU6*&rqfC!~l4T81>?ZgkWzgV<$J0M8=Y7AUHf0Fr?w0+Zj+SHQ#{ z-5YYw!PKSpEdy)9v74Tt877!5B<-~p;PX{S2fb0gI=aA&O9H7Ela&Qi$|6*5y<&SX z0$biL6tHVqg_8&fB7ZDL@H=rg0Nz3D%IzE_a-SLP3I#tep?8Zoi?mSV2B+^W%r!S3 z#iLlm*c9Tdq*wlBS(*p^{e0HGLN>ia-u7l@9MIM_W*k^k24)JuV(T)21mqkoSDXp{ z^wbLgrAkehmi1Jwq-X)hpmzNZH<7{x=d;*TiA6`4C4r!kB7a0qbE})5HvOv6!I<6J`T~23?XvKB_cZ!xEiQUkgW#nPUu#T zeoMHIL%92fpnn|A8Z|6zGcX$?+MSD99qKK?J`TYi8o~+^EA)xnAy1x6H%qj7xD61l z9`G)R*EochfFFl|$EKt6_$vK#C*-Sx+5qwD!0v){4d}Oo`#6MqWIBKr>u|mlYk3Aa ztWTy943jg^#!mMXJ2G&$*fE%dxwTI)gW{tE;QB)@PJhYJ2D~O=oni-gg0>hUTprLO zcebb6Ofi|OIVU{Gg+mU&A+#quvrZV7dVi{8OdtcK`&Z)Im0Q^>u;m1;E6? zwv29rV7YcVw#D1M6|`@W6ZRt5E(&!}aE1y+)(K-N<^V>rKp!(QSR3 z-$4o;_J%o9=mN8BcvETlBfd7BGJce2WujT3S`=V%PZc9r)s7QmIPOH}#WB;I+9h7@ zI2_xfE6Si-F~{oE#fb3gxz*~sQ|ih%niAb+Ab-3g&bt-07v;joFW?lp+Ed3%jBHdZ zlRMBKt_m1>SWXz_OOQD%tCd=ssnZOwX@r5zvz!YO5C~|`Mj!vnI zAe%Oxs-8gpREISr#ew8E(xWDdb!B zcscAb%8M0=Q$nLB?*)LHVvy1Y@LO<*9)JCoMP3ez?B_+MWJsZT1ybgizdn2HRDI}B zZ&~Bzu*N}N>`ROgnvNzY1lEHmPK9;iyY;}^-K_N(9^7gW-fddIEITkqNKyQIveP)-8t>IPUT%Wm0Nzl7=Mm? zhHxl#OnwT9jodTH;k5?|n`x+~47;0vnYi779CE)+H)wo*CIhBc2zg!k_pnGsn!4Rq z9^?$CxaO@9DO)}gJRz%Y1mh1YUx7KkLnL~BekPfN@&)qbtTdMHXqf)p6`kHmJzbwr z%0)Ky2WP`yDgEQa-}it2`tN_;p?_cgkFP!)oG|axKi=AZ-2d|S{bcY9dq+Q9-+Lb~ z?tcA0KC2x8^+apT{&2FdZwSItEcyZQ6L!0Wyi)-5$LBx!wR2SQg6;&*NoZD|u-m*t z^*C_7BqP|Za(te`b|;7C1>?=ka&h}Ib&N$z8Ha^!fke-WqG#gIK4KD!JAdl;hJ%jv z5#DE?sp8kc)c_sq8ZQy!aJdpK`n`U~dUwCV0xAFJ1pW0JwT?%FhmIx20M*QWvs7j4 zLC2D@#>dvbh}--3q2fg-{!ptFlkib36Q7fujZ$AE=CtG&^#Zx% zLROC5QY%vivDhk?X`Z66YJZ4ngSX;@Q(=J>Y1Jz1+OaB^UeAridd^y6Xo&F$#b$W$ zw6(g3Lo(=%utJtE8Oth*IOt}zMhfZOs1MDsvpPfHsN7vxDkSsmh6hUF6JfG`ccdmR z;bw^lmosn&T_M&p56_A1A;^%F`PC$N27IXiSX1}qqG#iyt|~zj6Ms}w%DoT~v2QrQ zS3Kfp+aT!HPAt*^Y9zZz2e_H-aR%8oaYV(X9Su!0M;wBW2USP)KKB#(!Tn1R? zN{3OS(*-01SgkrGgWMuCn^@k zF04Ff6GZ&no$T9>h<`CS*Oe~pSikcH@-7k5mqMIyI7h`-Q>N}}2|p@#v1KY_OI{V= zh>c=(JL)XH%9`<9(0OgdF6dkf)6eUvgRpLgn!YgfH@MWV+)n#7B|fcL$$ft0>8{jX zDuz;?0lKyqTB?2d`Ag$NLzq%b*47TQNWs`H`!xk@7dfz5e1F?a*ftYZ^JSX}+h)RU z?|pq?n&ik3#TQA{bD}PM;9G?58KIf9OY+1@!YZ$7Qhnqq9YaSoHBfeRJJLl4w9WV6 zYFh4AOPx5*`!#XcDR!#M>yw~L{d?+#E^+2vdxd5dsXqwU-8t=C!LKqTxWX5d^6F>>4u?=u8=MGEbm3(lT_Ea+ILYtO43 zqv6}5Hp2Dn(UK#*KyzqsE=igSUt#y3R z3;$O!zH=-6@l5@Kt>3EkTRjE8RVi~O$>^mfUn57pS?Z!&l}Cy8I9{S08|Y<3Kpzcq zQ|ZEaYDR%(p=tGKLC~`XOf!+sdi-{xD}S_j)}x`J3bLB{E5rm7Hk7Zff%Yf~>zaO> zA%9H$fXb$<>(ENx4J_Zc`Ri@|dYixgD8g`*o0&M-Hh+C$%3qfvPs}6hzQyx%!lj%` zJs1Kw#of~d#6+5T9k3e7N0-oXkQ17@9kANhJueiKlbj6rs**7rYFro!j0JW(O<0Q0 zS~*tlSw;KKdX{CLEP9GqW<^hu;C3eNWq)pe10sK<9YBf=b~uXRpn*Z`KifgHD&%5# zv~Q@)9*V_=lG`VR$?a09=u)`LD1zeb_8J-?h49WRy|wx4FFk*~6*(8fqXSd2JSLdT z--^|*C1=9V4V5#L4ReiG6U1|mR6;<_)X9kBwVUD?@sVYvO6qMHadL{C@T^2ewtt1c zenEJ?;MQ^R;m3<|Zyp-bsHKI&J|KR2ex^OFDnq$xAO(dT1TC-RC!Bhy>wlC-(diBv zp=%A+JJ*nHb%*a*-9amQvV@owK-xB?#E?2aYhuv;xtbJa7u1%?3cgUQXy(*E)Ju0> z?o!hhJ1&m79dD9&svr4WLtrWV4_N-2i0b+f7=j(e*d zeq`lfW(HHMQrq5`aBD_O#KMFgGrXq_4}Gbj5u;wukglwx%~N5!EAA1 zZx&eNm-TA#Z7=G5A$KY~RVM5ka-1S+RDW&Bg6gkE7*PGSL-q@CZJDoSzJHxE-@p)7 zf9WD;j+EU|kMUvv^h^h*xEmNYxqKIcl*4mzaMjo@iK(9DuF-M@;0gYhT^^?$<|?rNpU!1gzg{I zyG5P?(OC3hde%zv)g(+(GjN#71hsmH>i>J1e+B=yDzc;6q=g&T5-}LXe7l7A=L%r| zpkpmDiTz4%6(@BP^mZ#lwy#y57f+R7qOt@MyNRS}$4Awp{@PCEvVV^224+1QAEpyj zWsf4LgRJ9TEQ2~(q`K-Mf&^FURup5#b{mASg>D@g@(7eJc#pV@AFQib<@c4eYAqcq zyJ<#&1{gm|k^WXgwi>cXL$v0~=;FV(aUPnWy6W8Xp{t`-R}!h9X6#@(xYhi2d!Fp5`Su?mFcZa_htH#Av;RR zunB_hDP1lx&kCCI@;nBmk}UVHm+Jc8{=Vk*cMLHcni22GLAASvR=htM@t)WL99^6>zr%9vm zDiU7Qd9{4X_%u99k)>8|w|cvT-X7)FF7QilZy6yNgMYI7SdLg{&FJMM_H7JDtB{|B zLT+VvE5m&mzHiErUlWd(XtJKN4U?=>ONOVR=nFWhZ^A}-HJmaKa|$`7z*ef|q{Cb< zx3d^2XiVOR$D+r40Xcvk0*Jt=D|*KS@C9Z76UHI2QFrS?P^lqj7A^a}nCU-T>Usl9 zna{yrLVspPIb7;O6=r>TI^L%z%5evVOlN;?Po~t%Uhq(c+2R1o+DbVlQ5@X1)=&zy zotKGjjiA;DYBju)H;0ByT%RW=_5wL)7|yqmIUx{}+);PpzQRHv2)_LGkf-F+P#Y;& zuR+x;hcXyA>*Y!)Y6T21^&SX{an>&K0OOFO#((O|eZLD~slVR>~m1O$EczW`sc>w+l)wub}_b^!I19dAR|_20VGz6D}u;DROf z&koz_t7Bby^bR}1 zPK%yhz$tRmex8ms;n3si65eBZTW-gCN1WsXUyKEJIQlQuMU{R}r_^;JN1nh+zEDV| z9{aa;Onh}KPg4r}f9P1hBD9K*Pb5K9zwx8&r5)*2t>OpsSEB0umf6Xw3L%=aQh)c7 zC|bz);I_GgDn_d1E(8rowCYfGBv%zioa#zlxT58Ns=X$eH=O;z+S6XulIE8R)L4xs zs!fRw)g+f@hu296)WXn4eKrvkpA~%l8Gk+x;zlGdhT%lZ_cLsRwg(0RMYM9;0@tAhXY2@&7 zi5v_$ayNh>;xKuWhIkK_>JUen+<`?5=W`Fu1--~S5meLe4Y~5&=)!;kcouyO8TlVB zK=ZBr<>u+qTxpWiv_@oR6?rTV=yY25J;W|@)Eda9E6BwXUM9Zp{*-rY7Jn1OAKARR z{*LwDtot(QqSOhbmvuBS=ou2K<2-hWh@*~Rwv$pm9Fv?Xd#8#9WUh3oeYuJr_hOk8 zAQc?SLEvJ>0iA)B|HhY1fjHt+?9YXC0rGqf0fO#%B&7m5)PU^Cy|yLudbcv>(Qa#b zVLUr9B$29x`+)en`xUae5P#CpJzIOwCylz?Yk;WdV~&@o8#F0qV*~6QhE8-)gP+Z# z$>VGjo^!<2sXOxD0)d~jDq!He<5W8Dx8~l&$TRDie!Ckl+(9q=Uu|dH6J@KRAYj<6xR%pb+40xh9Tx0joq9h5RAeLdBy1g1)+&J>MVgbAQPV`3f~*z>dC7_4Qcr_D?wLxPPWk&n>3eNVkltGNfAda=4XKzV0Vs=Zo~ z+z^y3*zH46w5aYpBqcrUozd}8UFvP4B`!vTeM3yUTDmaDYFkfH5>T+j`6YP~++RpcBP zLaZn1DzXi4w3 zv8xq;#_VYYt{FQzL@h6rGS;al|Kq1dD2L3{9O2(YK%3T}Dwh4AFCmm6IrBLt(| z(b_y21Jjr_90%GETPD#gWXm`LL3RLiUE}~tLK77e@NT){8$dnq2gLkLa-mE*VmE|S zz&$*lBQMNMLeO(Jt>OA(v0*ZNY;fjK&x+gn!r!_r(z`V!f#AaIcxzng*Lr z@Jeh8$y}&AP63Q|l9c!kp&9lVf87yZlN$opoGu~9f{!=hrWfV()GeT0@DrS~N>Bs`->C@)i}I62-Xpkc5emkTjYej2-bZqoo^6)6s;DJExJjG;(MzD zF87a@o;RP5azmFwQr`YNCk?8Z^PDu)U7qJ?Mt@LB3>2T|1fHUZ)!P%D_C%*N5AWwj zOtA~h>elE9zc1!iwIanFE5VgyQ{O1B&Z+^9)=9jWA? zn18ot1wD@KwF|w_%hS+yF)@iXZxu+}Yc)x}W%;Mc@`t%0N$d*EwqkYhy0%Q&|>*3a6Xdm~jV}*63ug5Yo)5d0Ha?X#&y%iP5? z&`0C_!-HPO3d)Db-w%?=bJ9!0D8QYju78)U#Zk7Ngf0uVI0ErG^Y%D5ScwU(u-=Nh z6@;?>VOf>RFAwK0F`3a49Iv`5tT`piTGin5a1{AfyFVbVJjMzeIs*{Q@m*MK3QRZP z{OkvE_2yQ0`hI2YB4RKU?x;}RDUw7-vib=Z9mwJ`(w%ckm&>!D?vwa&75q>)6Mr6C z{~~Vh-;=isoBU&e{`cpfEmf_B1?{e}eXGRcKV`8c|8c6e(FCb#DS2(euvQu49ifzX zaD})h1@dUnv94*52;|T21!Vl4=Vc2(UCY>w~LxqVof>3)U1_HsRVN^%dQHBBB>Z{?&##y``Wy^n zd3zxamWXkl0TL}fi>???Qvc6zaqF`+RvcOl6f?I0?5#ny%IrzT-CNnDb z4o$huHAB#P5wdMcRX6ob-GAf$pjY4&Xn=KJ7}tz?x#7!f+iSD3VDj#Qh_2<6ZZ^L_ zv`SG8stLc{aCA-_bT8{gn@UTM{GB~?uOM;gk|4%9V6_i|5QoA*FxKGpTiRKOSB(}J z3-oq=4Mk#xOEQ?UJ&boyNL%Jw^2E5-EfY`X06AHlH5k+mi&GYro_{t_{toMCk9xy# z6Q#7Xg{z-sMevcqgOh3uum&zyO?huLM4xW;+(!v z@k{tk>HGlMN4akEnLFgGMgoMkf6K62FzmpTrlDBy#BnaD4YPAnie-~9%*MZ1v^>^K z!r7WRGiW`+C2*cPkbfyb)`_EymbSN`?U5tEf4Zw`8 zId;46<*{xFs+WBuN z(;>3=j^M%Ia5kF4eK@u{)~BnB@BlOLkB$Z%>m$4mt_hXDPk$kq#P6ViM7&0|Zf6N$ z=^VBZWZhfezn?jWiD6r2)2l`ub5>^{rjJ-6-|=_Z-{A8`wB7S-3eTdjhoj;C(cy4B zJQ(l9^Oz;wl2*81BBDtHTu0Wr%AEB~q-}DuemvvlWq(DWi|SO$)l?VBzFjA?vws`~+06NZKY~XHA9*@E51sHS;nr@? z{a=jh{27b1{hldLOig(GVrtR%dDUcmHvST-;4@^qC8SwFRka-8b;Me3d9_CB%4ktF z6qhlzEh9Wi$qnPKLDr&4nbpUGom8KBwA_{#T~KDfZ%SzM347a6R#O~nhQXEWEyLO7 zh<{cMYx|+Hb$Hsx{1KQs40g@q<_Zz9W!czz<3JAItRP=l1uSYRNAN<}U|`C^2x;MV zOD?!=#z$8FOhMq#&}o7{oJTuHXq{R=h*RtN45K||xESpZ^HX82kPs-pAn5X~k_O^% z${oe}ztkt{^I`!R@1`L^nZo>0lG>h<>wlwAW~COXYz;RKx$-156WZRfG&RyH>Izf6 zsQ}kDc7Ds)`K>GQv?BXrw7;L9;pOL*)E3p^`!XKtL?TOxO`m9%v*$}@h}GEa`FQ{E ze(7|AQJa4Bl0@hW*{mPrX9Qh)n{D^&K8Rg!*E6cp&?u559-|_@01cE7@&^CO+ct!@FD?a+s%6#C9_qS?3N?f zRacM_>L9?W7>jyC!B^Rofvd~Y21^69MKT_r7siI<14Rt~pwoI6Fhrl5kIU9;>~ueU z3eR?xj19lcGbJMM1!rdkeN@_AC4a`WvxBq(jJ4-##ov^%PS9-Z938>I-of}_e{a+u zAMK52Gq`s&L$ls&+&e%B#fn1uA=jqzko{iIk8!aM4|?PN6!!KG`cr3bv=8_9rgm?< z2WP$gS>GNUpnWGQcU=JS8nRm3^&8xOHp| zdV}6xzrWWXT=$NS2ZQ6@;lHhp^$TU(pY{c1+}g>xe$h8a^-Sv?nbwtU=35R?e{eLFEFQeenLRo%Ttl(s`(i%?NNevAbjOr0ooEGH*6=(XU zITiQKk^!m-`K^>h$2y-A>Y*#d=-RVmav}EQoAnVbFBcnzZRlFZgTvAI@bIX2a5Nfq z#H-0yxU!D>gYkHD)a#GOP<~Y+VttsU zu2Kn**Tu(%$ZCUU{S|6V8K>7(*JatPY9&8VB-@l; ojuT}`1VWmA%rmwpsu$D_di&PH!RV|DSYi#w*qV09*V7lmGw# delta 9199 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 F0RWhF&$s{p diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index c1f825ab3657e738607ad1f641ba577749fdc36c..cb039b1ea4bc677f6663173ec1e0a9a79d450d4c 100644 GIT binary patch delta 1421 zcmV;81#_5Dh5FKNyw_QjlTC4E!G+!CjdsZ_-={EJI9?@9xI z^hDf1`{t_=;{t9#@<7XHFX3O>xlawfNy6~!%$VX8%YU?h=Xsr3=4!eifkDp^_fY#v77qBpWrsaD2CoDMY)-5pdrdn^}j8MpB1sj_d5k7b^+hN zp9EhGy=&;bZ!xWRRvgo=i5g48Xcp2GgYRe&53&)50$p`kU<#XB5|WDAGk*$8GhVj> zzl*pl$!p{)Z8y1bLD((CXfX$I^-axE@!iNPi5eyag#EbBz~Xv$%#Zp*QW2rdHa!-Z^jzrN^rY`pcyLxJ zU~gr!-Rcm$A7*yiDmJqlaDhnp#v~B)y*~@of9JE9g|4@?Qp-zNuhw=7d+x$&t$rF) zFA3`<;a)EZ&)Q}2Gu-rJ8a6diS+pbr8vFgL%fl!F76(AxNO9aVi8*gEE4u6AkT%PO zHqozYtWo5KVq99ziq>9Y<7Q^NT?;VO_aa~UHE{F$jN`&o!f%ddUH6?E*LkOtEe76y zW6XTkDmlcN;JJMGu8NsE=KF4RX$&KO4b<8&x3hhi+o^N7yJnla0B!S1{Qlrx9p~ye zw{LN-U2?))JM?P->!*hj;*Dg87FJVhM8JfhZ3e-N*y(gn9Se8Des>`j?tPl4PJPrU zqDB!P2t{;C4x(ow;yMfFgm}F*a}th!*IPCx{r@eXpwNG8UzZ>H`lXxuT^TtytV>|%J8j%^=|nO zvs?bGS8}NN7Swt#$xH~#VB&ytcgb$Qq=C2Y_{*@eWY=HPp-04{L~0B(s~{3aL3FP< zvyKM($`w*$qJOAF5|pBBbjLh0L5e&AB4`NDNP^9oBaz}ryLU1o3iO2{@)2oucLH~V zdkp`cw{zB;_&)c}j!TnI2sHsIlZ6O60nd}b2pj=klidhie>-(_-YPkk6K&sJ=bKe2 z%5`7uHT#gwKPL*Vm;)~>K3!F~UE>(p)M;E$$MA_uivMjrZpjW&eIBQN?o#PBVL7wd z;`g0;t?t<-KJm1-U#i-({WJLkFtPVsJu`)yT(WIlPzMR!y#%JTC=%S^QB-F@*(iz< zOd;Yp0;B{7f6;ks4RodS01UbCz(IovBIrNSHyABM&;@tEMhDMhYL5|R4%H&+KD@wH z)Yf;8d}2R>Gw(%(s}aH+M9>#qYfR+0kyV_{9JZ-H6j48=te;XwP_tcfnkBYnLzo#; z6)(}|?x7s!#Z{I-ytsxDvP-zy%KP=ohAJuFQWWjBU%Q?2wd3fHDrBc*+xhQ=s(%L* zl%Yz_=?ayyH2F0rdu#41-G8zAC0z|%Za+#CFhyOY#vlL@0fXW8t&CH)`xh bOGce{kMVSRKmA_-00960!w23lS$Y5fatXa& delta 1421 zcmV;81#owtis>1R;(*iex|8Z$JTINGRO_pbp(2xpU< z*F=ru;$EuwlN}EG7w&)|s0~@&7NVVvLp3;C#zjk zQZ~XVrlb;K$!1_?&OcP+%i~Y5Hd8gytdZuPA7!5ccp

0baRE0Vc_8dr`q{#%f>-Vk{w zZ!-Gpm+&v`+^2@#Bw_eHK=j9k(^ii3C ztkOkhY%3B(GgG^%-f5>-?54i(C%BC;ilMhkQEnz1Xo&Jt{cj86XGN^>{Z0XiUBLJ6 zC&5=k?;3jVTTJU77ss?~qQ=rNnuRpQ;5%BxgKWg1Kv!KBn8K!(gruVOjDNz?jMuHe z?;`F>@*25H+f8m<5OxbOTFgOQeN(ekd^hq6IZXPQ+r$ldFS`3X(9yV3GG&7)l3lg6 z-bsnA32uXww;*MtTt-HhAuhJQAfQg;+qdOdFx$`)+ncv$W^jvq7F%9KsDq0j%;6r= z9U(qM&!N;vM)VdM0Ry3DIDf9_PSEohSX}Rp`B8sJDk7BGrpF?ao(r9up7fmx56&tD z?5%9JTOES;!_1CPi_Po?Tp$v@F$u(c@6Q7D-}x+Nq3dm})bbM6tF@iNp1ZJGtDnZy zOTv0dxYtX-4;nE(YFz zXUu$Fa)>j*bNTRH6*G6t_uc5y7)JgYsI_5kXZtX>Q|EAZ%{F%d+UAw`{lUFD&ed^l z&*I!!tK@{acIejv)=v*5#2d*FEv%;2h=2)0+YEvkvD4|EIu`DP{q906-1{_7o%*Oz zM2#Xo5Q=D*97NAV#B~)rAn zX1DxVx8zXsEvWTgl9>>e!NdXQ?vmYpNds@)@t0v`$*#YoLyw3@iPRWoRzW02g6Ljz zW*rUml`EviME_8UBq&AM=#F`0f)sfKM9>hPkp!DFM?Z|AHx@qO-{^-7aa2sHsNlZFU70Z)^`2pj=glimnje>`<`R&p#S+P=HaH>*;V z>%Q7+_92^pP83`*2VPcux~g!y#xb&~)3~6H;S-k>|J!=pk{zP@JWl=GrP6D{a%Qo` z?>qHc-Lp-6;%RTcRJCXOXYvPNV(+t2moEY*T+IqJBzQKcx(z=6S2+G)rvDhA=ax zDqf<^-9tIdi>oYwcySFQWS4NYmG|qF4OLRUr6}5MUw1p_Ysb+YRmgV9w)5W!RsRks zC_|N;(-kUZY4U4M_SW22y8mMJOS&4k+WNZ`9b2 bmW(>@bntX~KmA_-00960WVEVsS$Y5fMSIkM diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 0bd212a3d..6b42ec53a 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -20,6 +20,7 @@ * [CreateBackup](#CreateBackup) * [Dagstore](#Dagstore) * [DagstoreGC](#DagstoreGC) + * [DagstoreInitializeAll](#DagstoreInitializeAll) * [DagstoreInitializeShard](#DagstoreInitializeShard) * [DagstoreListShards](#DagstoreListShards) * [DagstoreRecoverShard](#DagstoreRecoverShard) @@ -363,6 +364,36 @@ Inputs: `null` Response: `null` +### DagstoreInitializeAll +DagstoreInitializeAll initializes all uninitialized shards in bulk, +according to the policy passed in the parameters. + +It is recommended to set a maximum concurrency to avoid extreme +IO pressure if the storage subsystem has a large amount of deals. + +It returns the result for each shard it attempted to initialize. + + +Perms: write + +Inputs: +```json +[ + { + "MaxConcurrency": 123 + } +] +``` + +Response: +```json +{ + "Key": "baga6ea4seaqecmtz7iak33dsfshi627abz4i4665dfuzr3qfs4bmad6dx3iigdq", + "Success": false, + "Error": "\u003cerror\u003e" +} +``` + ### DagstoreInitializeShard DagstoreInitializeShard initializes an uninitialized shard. diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 4b766b6f6..fbfb0cff7 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -7,6 +7,7 @@ import ( "net/http" "os" "strconv" + "sync" "time" "github.com/filecoin-project/dagstore" @@ -616,6 +617,87 @@ func (sm *StorageMinerAPI) DagstoreInitializeShard(ctx context.Context, key stri return nil } +func (sm *StorageMinerAPI) DagstoreInitializeAll(ctx context.Context, params api.DagstoreInitializeAllParams) (<-chan api.DagstoreShardResult, error) { + if sm.DAGStore == nil { + return nil, fmt.Errorf("dagstore not available on this node") + } + + // prepare the thottler tokens. + var throttle chan struct{} + if c := params.MaxConcurrency; c > 0 { + throttle = make(chan struct{}, c) + for i := 0; i < c; i++ { + throttle <- struct{}{} + } + } + + info := sm.DAGStore.AllShardsInfo() + var uninit []string + for k, i := range info { + if i.ShardState != dagstore.ShardStateNew { + continue + } + uninit = append(uninit, k.String()) + } + + if len(uninit) == 0 { + out := make(chan api.DagstoreShardResult) + close(out) + return out, nil + } + + var wg sync.WaitGroup + wg.Add(len(uninit)) + + // response channel must be closed when we're done, or the context is cancelled. + // this buffering is necessary to prevent inflight children goroutines from + // publishing to a closed channel (res) when the context is cancelled. + out := make(chan api.DagstoreShardResult, 32) // internal buffer. + res := make(chan api.DagstoreShardResult, 32) // returned to caller. + + go func() { + close(res) // close the caller channel. + + pending := len(uninit) + for pending > 0 { + select { + case res <- <-out: + pending-- + continue + case <-throttle: + // acquired a throttle token, proceed. + case <-ctx.Done(): + return + } + + next := uninit[0] + uninit = uninit[1:] + + go func() { + err := sm.DagstoreInitializeShard(ctx, next) + throttle <- struct{}{} + + r := api.DagstoreShardResult{Key: next} + if err == nil { + r.Success = true + } else { + r.Success = false + r.Error = err.Error() + } + + select { + case out <- r: + case <-ctx.Done(): + } + }() + } + + }() + + return res, nil + +} + func (sm *StorageMinerAPI) DagstoreRecoverShard(ctx context.Context, key string) error { if sm.DAGStore == nil { return fmt.Errorf("dagstore not available on this node") @@ -646,7 +728,7 @@ func (sm *StorageMinerAPI) DagstoreRecoverShard(ctx context.Context, key string) return res.Error } -func (sm *StorageMinerAPI) DagstoreGC(ctx context.Context) ([]api.DagstoreGCResult, error) { +func (sm *StorageMinerAPI) DagstoreGC(ctx context.Context) ([]api.DagstoreShardResult, error) { if sm.DAGStore == nil { return nil, fmt.Errorf("dagstore not available on this node") } @@ -656,17 +738,16 @@ func (sm *StorageMinerAPI) DagstoreGC(ctx context.Context) ([]api.DagstoreGCResu return nil, fmt.Errorf("failed to gc: %w", err) } - ret := make([]api.DagstoreGCResult, 0, len(res.Shards)) + ret := make([]api.DagstoreShardResult, 0, len(res.Shards)) for k, err := range res.Shards { - ret = append(ret, api.DagstoreGCResult{ - Key: k.String(), - Error: func() string { - if err == nil { - return "" - } - return err.Error() - }(), - }) + r := api.DagstoreShardResult{Key: k.String()} + if err == nil { + r.Success = true + } else { + r.Success = false + r.Error = err.Error() + } + ret = append(ret, r) } return ret, nil