From 5c01bd5be89b40f2bd5edd4526b474644e053f11 Mon Sep 17 00:00:00 2001 From: Dmitrii Stepanov Date: Tue, 6 Aug 2024 13:20:33 +0300 Subject: [PATCH] [#1298] writecache: Add `restore-mode` flag for Seal command Signed-off-by: Dmitrii Stepanov --- cmd/frostfs-cli/modules/control/writecache.go | 5 +++++ pkg/local_object_storage/engine/writecache.go | 4 +++- pkg/local_object_storage/shard/writecache.go | 5 ++++- pkg/local_object_storage/writecache/seal.go | 19 +++++++++++++----- .../writecache/writecache.go | 7 ++++++- pkg/services/control/ir/service_grpc.pb.go | Bin 9163 -> 9171 bytes .../control/server/seal_writecache.go | 1 + pkg/services/control/service.pb.go | Bin 270289 -> 270827 bytes pkg/services/control/service.proto | 3 +++ pkg/services/control/service_frostfs.pb.go | Bin 124049 -> 124152 bytes pkg/services/tree/service_grpc.pb.go | Bin 19865 -> 19139 bytes 11 files changed, 36 insertions(+), 8 deletions(-) diff --git a/cmd/frostfs-cli/modules/control/writecache.go b/cmd/frostfs-cli/modules/control/writecache.go index abc4ed2e..a665ccae 100644 --- a/cmd/frostfs-cli/modules/control/writecache.go +++ b/cmd/frostfs-cli/modules/control/writecache.go @@ -9,6 +9,8 @@ import ( "github.com/spf13/cobra" ) +const restoreModeFlag = "restore-mode" + var writecacheShardCmd = &cobra.Command{ Use: "writecache", Short: "Operations with storage node's write-cache", @@ -26,10 +28,12 @@ func sealWritecache(cmd *cobra.Command, _ []string) { pk := key.Get(cmd) ignoreErrors, _ := cmd.Flags().GetBool(ignoreErrorsFlag) + restoreMode, _ := cmd.Flags().GetBool(restoreModeFlag) req := &control.SealWriteCacheRequest{Body: &control.SealWriteCacheRequest_Body{ Shard_ID: getShardIDList(cmd), IgnoreErrors: ignoreErrors, + RestoreMode: restoreMode, }} signRequest(cmd, pk, req) @@ -68,6 +72,7 @@ func initControlShardsWritecacheCmd() { ff.StringSlice(shardIDFlag, nil, "List of shard IDs in base58 encoding") ff.Bool(shardAllFlag, false, "Process all shards") ff.Bool(ignoreErrorsFlag, true, "Skip invalid/unreadable objects") + ff.Bool(restoreModeFlag, false, "Restore writecache's mode after sealing") sealWritecacheShardCmd.MarkFlagsMutuallyExclusive(shardIDFlag, shardAllFlag) } diff --git a/pkg/local_object_storage/engine/writecache.go b/pkg/local_object_storage/engine/writecache.go index da488260..8f37d786 100644 --- a/pkg/local_object_storage/engine/writecache.go +++ b/pkg/local_object_storage/engine/writecache.go @@ -70,6 +70,7 @@ func (e *StorageEngine) FlushWriteCache(ctx context.Context, p FlushWriteCachePr type SealWriteCachePrm struct { ShardIDs []*shard.ID IgnoreErrors bool + RestoreMode bool } type ShardSealResult struct { @@ -88,6 +89,7 @@ func (e *StorageEngine) SealWriteCache(ctx context.Context, prm SealWriteCachePr trace.WithAttributes( attribute.Int("shard_id_count", len(prm.ShardIDs)), attribute.Bool("ignore_errors", prm.IgnoreErrors), + attribute.Bool("restore_mode", prm.RestoreMode), )) defer span.End() @@ -114,7 +116,7 @@ func (e *StorageEngine) SealWriteCache(ctx context.Context, prm SealWriteCachePr return nil } - err := sh.SealWriteCache(egCtx, shard.SealWriteCachePrm{IgnoreErrors: prm.IgnoreErrors}) + err := sh.SealWriteCache(egCtx, shard.SealWriteCachePrm{IgnoreErrors: prm.IgnoreErrors, RestoreMode: prm.RestoreMode}) resGuard.Lock() defer resGuard.Unlock() diff --git a/pkg/local_object_storage/shard/writecache.go b/pkg/local_object_storage/shard/writecache.go index 05e014d2..9edad717 100644 --- a/pkg/local_object_storage/shard/writecache.go +++ b/pkg/local_object_storage/shard/writecache.go @@ -4,6 +4,7 @@ import ( "context" "errors" + "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/writecache" "git.frostfs.info/TrueCloudLab/frostfs-observability/tracing" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" @@ -59,6 +60,7 @@ func (s *Shard) FlushWriteCache(ctx context.Context, p FlushWriteCachePrm) error type SealWriteCachePrm struct { IgnoreErrors bool + RestoreMode bool } // SealWriteCache flushes all data from the write-cache and moves it to degraded read only mode. @@ -67,6 +69,7 @@ func (s *Shard) SealWriteCache(ctx context.Context, p SealWriteCachePrm) error { trace.WithAttributes( attribute.String("shard_id", s.ID().String()), attribute.Bool("ignore_errors", p.IgnoreErrors), + attribute.Bool("restore_mode", p.RestoreMode), )) defer span.End() @@ -84,5 +87,5 @@ func (s *Shard) SealWriteCache(ctx context.Context, p SealWriteCachePrm) error { return ErrDegradedMode } - return s.writeCache.Seal(ctx, p.IgnoreErrors) + return s.writeCache.Seal(ctx, writecache.SealPrm{IgnoreErrors: p.IgnoreErrors, RestoreMode: p.RestoreMode}) } diff --git a/pkg/local_object_storage/writecache/seal.go b/pkg/local_object_storage/writecache/seal.go index 48107a75..22b4e098 100644 --- a/pkg/local_object_storage/writecache/seal.go +++ b/pkg/local_object_storage/writecache/seal.go @@ -9,20 +9,29 @@ import ( "go.opentelemetry.io/otel/trace" ) -func (c *cache) Seal(ctx context.Context, ignoreErrors bool) error { +func (c *cache) Seal(ctx context.Context, prm SealPrm) error { ctx, span := tracing.StartSpanFromContext(ctx, "writecache.Seal", trace.WithAttributes( - attribute.Bool("ignore_errors", ignoreErrors), + attribute.Bool("ignore_errors", prm.IgnoreErrors), + attribute.Bool("restore_mode", prm.RestoreMode), )) defer span.End() c.modeMtx.Lock() defer c.modeMtx.Unlock() + sourceMode := c.mode // flush will be done by setMode - err := c.setMode(ctx, mode.DegradedReadOnly, ignoreErrors) - if err == nil { - c.metrics.SetMode(mode.ComponentDisabled) + err := c.setMode(ctx, mode.DegradedReadOnly, prm.IgnoreErrors) + if err != nil { + return err + } + c.metrics.SetMode(mode.ComponentDisabled) + if prm.RestoreMode { + err = c.setMode(ctx, sourceMode, prm.IgnoreErrors) + if err == nil { + c.metrics.SetMode(mode.ConvertToComponentMode(sourceMode)) + } } return err } diff --git a/pkg/local_object_storage/writecache/writecache.go b/pkg/local_object_storage/writecache/writecache.go index 71dba61c..7085a57b 100644 --- a/pkg/local_object_storage/writecache/writecache.go +++ b/pkg/local_object_storage/writecache/writecache.go @@ -20,6 +20,11 @@ type Info struct { Path string } +type SealPrm struct { + IgnoreErrors bool + RestoreMode bool +} + // Cache represents write-cache for objects. type Cache interface { Get(ctx context.Context, address oid.Address) (*objectSDK.Object, error) @@ -36,7 +41,7 @@ type Cache interface { SetLogger(*logger.Logger) DumpInfo() Info Flush(context.Context, bool, bool) error - Seal(context.Context, bool) error + Seal(context.Context, SealPrm) error Init() error Open(ctx context.Context, mode mode.Mode) error diff --git a/pkg/services/control/ir/service_grpc.pb.go b/pkg/services/control/ir/service_grpc.pb.go index 724149c441106253c7d6083f543f941dfeda5f47..336bf5f70d3eaa71f6fccfcbb148ca8614ea91b8 100644 GIT binary patch delta 35 ocmX@@e%XD)A2t>)PJR8&f7m2A!K}%D*c2uo5cb+!C*Ug#0N{2Dr2qf` delta 29 jcmccYe%gJ*AGXO2to)n#**Q5ujLH1$f}3pwrV9fAr_2d! diff --git a/pkg/services/control/server/seal_writecache.go b/pkg/services/control/server/seal_writecache.go index e3f8b8ca..b663cfc8 100644 --- a/pkg/services/control/server/seal_writecache.go +++ b/pkg/services/control/server/seal_writecache.go @@ -19,6 +19,7 @@ func (s *Server) SealWriteCache(ctx context.Context, req *control.SealWriteCache prm := engine.SealWriteCachePrm{ ShardIDs: s.getShardIDList(req.GetBody().GetShard_ID()), IgnoreErrors: req.GetBody().GetIgnoreErrors(), + RestoreMode: req.GetBody().GetRestoreMode(), } res, err := s.s.SealWriteCache(ctx, prm) diff --git a/pkg/services/control/service.pb.go b/pkg/services/control/service.pb.go index 727dd1218b27530339ce996d36d5c06b34de6cf4..895b743684054b9d9b839abb0576ebb04a20ce92 100644 GIT binary patch delta 2921 zcmZ`*YiyI}6_(FQY~qB(xj~3S{KZMg&2bz%ahwuzBNqtG1*UbV%^)Fh$7sMNBpQga zhOM++rL}==Ib!1Cszck<4$@K0(?kgubz&JG2eML)zv*zhC>t*9Qi) z4SsFVzilWm={pSzl?+=G#IG@Q|Ew61Rr;L6;DdFsSJYbN` zJ1Ij9{gf)7j8TgG_j#Hxd$&=B$>-2q+g%lsyqXq@D~=OlHaN_2@}Q5>r6)kK((U0m zxi$}v+yHXC9LH9pInK4c(j%u=&;t29mYXHCjAP|fD;LSz+sPxN!;~xL9aKw5_1b)H zkjQr^OUhoMJSkg%RIUN?h8KN8)do46z^hc)&O|Pd^HWqLJ@Yw9O1n`&a5b4^^vgi; z-U>=kM_E1HmK&@pmL_dc@7k#|v6s6*lJB%{R6XKOZ!^7f$+*Y>IkRbiD!JDDhS=gukJXjC1@MobMv9L$Zy$nzXTDeXpZ-MJq_fxE)QYL!nOJeiWJo#4+SIEU= zE)5^uNGA=_^8pp8G^78dOhLQSrGAiHYUQq4c}}fF4wG4)O^Y6W+5(~vx3W{lTew)h zItb`;~bS^w}wib8Y)h_gXN2xkZoK8kPag+P~ePmW-pG3 zj8Tl(ZqhvU(!?edh$yqv=X1$?V8Vb#@%70i)t#v!@+2s2m%DXU_sQ-|UM?SX03!C{ z1iD%vksPoeyo5oYrotFo-mivx_XO1`ZsS#Sx|~0OUwHw{rVhR*m*aHJyPlSY9dM#U zyQonC8_7bsp-j$^kMcNOt-PAcwG!GvR{5+2ns2be3baCwk;yzL@5vod{Hz)}Ph*&$ z$>%1i%;795cT335i=?ZS3+2!6Qpwnx=x*&2kTuIrS2NehwHHv5b3f(k5s5D_lxg9O$T}osoSyzm*M}LoslY(TEaR(%L^fw^Ue1w`L zau0BokYlP9*}cWwF7u?yt73$_*fA+mR!golGL=-&pPJm{J>Wu2{6Wl;7b#3rcH(qw5oTU2LE za@_`?QXaKPhlVzta&xAF3IDE?kvy1r`3BLt(HQKw)y~!r!AZo1qcXn<;nsOLEp67s zy-zFbRS>;=%@du{yFY*r&**!s0xqUcC9KaVt32RPQ&)uUlZjQFDsNN(_(%lv)^m?K zq^J^S>4rQ|38S0d*b#M(#a`C0uwW%aB{!&E&67vQiy-l&Do#|8r`BSG)?bF_P5Gc3 z*9CZ4_21wVNS!0W78vhj28`<7S~%wyGI1K=wMGZ zT2r@-*Gkt7GS0*7D`wpC*0@skP0|#ak)=R7`aWj)@!RS`oH0TBQkb;v;|TT1$Yr3Z z`;Z<}$qHt=W>iv7k(;%+9@J6sQHOE+9@<8=WZxtG0^EHC>4W#FQR;6)Y8SomzS+~d zOQ6|EE6%_rvrxTME7z|=Rl91qMb%`TGr|{Yx%ms&&2sKObUbwh$&c58NlP;lX$^dJ z<`|>gst0S6Pf(dU!7ZCF(>i(Q7PPnKb67s?v)HWE67^4UHbU=Txk+o}LgRGTEz8mM zXCFW!_dlhLGpS8-W%&$Wcc?9j8&p}Nz4*9^>lEZ&Er@Ds23ylt+U%!Fom{+(an!HK z)D~F8{|Skgo>C~_K?BtD-5iYC$1R+v8?e_WhBGkWsdT`_HDZ#QR;U+uNwT`zYo#Lx z%^F`0%lnZX$_L?jy4c3{fwkXSSc`roSbmE2AFtr%xwGWeX9=H0V=K8mx>2c?y!!W2 mMIVN&7dx3sWYIORzVD6>A#6n6YQh&&&P(JBFKgrPU;ZE33V-$h delta 2698 zcmZuze@xW(8P2^Qet2+j2MAb>A9slSk{`z%oFE9tf#~#-m)K_0B08416zrbQ_oTQV|6KCD z&-;Bp@B2K@`@G-l7i?E1Z39P4Z_Ay$=SwbI;9Fy|!Ixx;gsWJh$8YA#$q4)=#bk%g zBaxWAZ8|tUTq0k8UwXR7mm<|V1>aHG2LA<#LEdpG9v?F+hY52}Ni^PwRjcvHV`9e6 zc1gk=i)w)%Qh;`ga>MaQNkm=0d=ZZ}E33qqQ6J3!Tdm5$oBO2&gUu2(KCwsgOqhx1 z$=W2)Rz=rZ7{p-=cW!+4OpiQ;m@KF|YZd7b2O;B~1z4w@a_F+lDs|l(Y8Li5U z* zVCxcVWQ9kQVr^s(U1=&0SuNokv+TU=S7{`|{{&w+Ygg?Uc}U{%l_fG1C{~dO*qJ2s zO^JZNU2?G4BrJVMI~Kh08WVcp8QeOcsr zVp`JSs#MV!&sDXs?&1K{>?e;Co#ND4T)5FE`EaC@%IE$>5+*w(ULzCCP^AccjoleH zY;EO*6lgkpGvO%5=S8fA!^vCU$)#8ga{nX5g3cnoHvhV8Kwp|NlE2a?4MXQRUQ=lt zuTn1|eR+rEVY*KP=~SsYV{n? z6nzisb9maZUy4`V8;TzIe;{8#pqU)G_7OiyHxj!8`ajKE>=sgCEo3uvgD4$RjNi2= z8zyJinW2p)~wpE&{#lzCEoVrh^u7@j^8R7=QN^#~<1{zs$yAaG#E60Ym?Rjj& zRYqu!W6@t{^G$iVIb)qr3L zfxVGWB70vgh6Lnmu}2|rf-TriG0SUZY;dfQHb6jQbmvj@0;4_#IW-xn2#!h( zTo=ja<###!m)5Jip$R#Jy+y3;#zxLQu^-T)hzpD7uXXI4LMXs&rb@ubDCyyKYd)`t z7IvC=hShq874?^}gt=d{8+y(W{9`jMjFXoV;nv{pE!F6p<>^arOOw&Rly&2?4`dwz z{TvF1PsJkiGbXCLKnZdD+4!i`;@SwY8Q97nR_C>PUH7S?%mbTSbt3CL-}9Vink!|r zx{!tXJO5iD3m!tZ?=9`W7df>W9Q?vfu`bV#VelOB6O{7Zi&XaaCkfIrrg5MUbG1lM zdQ@Ai_V%zJcWZrA!!^iK=Z}#E+p(~ixgj`yn>cwV%kSGG9Qyl1GvTmsoZBksJ$s&` zYdl$@_n0?4BHho^C20~-Nb`~fW9rg=M3?=RmwPPmG>tL8ipi(ERFdy5G5z^X@nNQx zv-ZwmNed6XYnt?|oR0ZaoHn*hjO8-!>_&pHy`LeBOGZiZj2 z>%GBqZ@_T5s=+`Fk@?W8dJ$}7r_FZizIqdFTbuOI9_ny#6Nw)CC_I{17rCEC^mPok zWA=jBBgqtbtE{E&j9Yg5RHLrnjQ%1{7JZ>Wi>?x5SLI<49Eqj4)eG`*IaM+Rs#Q}eaq=0dI4G}6x)^9s tF5D1>&D^qcm?poJ&jJfMZJw@RCA;~)?R&P#_iYs>e{g2q%;-9U0{{XbQ9S?v delta 932 zcmX>+m2u{5#tB`FCL6nZ7#YnbOE8%*T5R@Z`oQgw>|an)tYBrUkXTTVnwO#x9h+WM zkgVsNn3DsP$;{8I2J?eU5=%0ZeN#&^@>4W4YjqUzf!g%+^fV`1^TjYF`%iu=5I6Z7 zUoPe5CGuy$%+nA^q1?PKfh34|dnh++xnLa3Z7D*Pl$&>3r~qc(Dq$*^rzlbgF;9PT ziIm9X`_}A}?~1VVIp<`i=9L7O6s0ESS}AOPA~K(ea%acqpKU!xX7GR0sz>*&K)+PMhz_TFLSSrxul^7Qq8s-1HH0OUnVa{vGU