将设为首页浏览此站
开启辅助访问 天气与日历 收藏本站联系我们切换到窄版

易陆发现论坛

 找回密码
 开始注册
查看: 97|回复: 1
收起左侧

ceph 分布式存储出现1 filesystem is degraded 源数据删除恢复

[复制链接]
发表于 2022-8-11 13:50:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?开始注册

x
元数据模拟故障
* u0 j( R" @; j8 n# L跟元数据相关的故障无非就是mds无法启动,或者元数据pg损坏了,这里我们模拟的比较极端的情况,把metadata的元数据对象全部清空掉,这个基本能覆盖到最严重的故障了,数据的损坏不在元数据损坏的范畴( S2 B% T% U' W4 w
& @5 t2 H3 y$ a1 l' e7 j
清空元数据存储池
% j0 @8 e4 E7 j! u: K- B" O
% J7 R9 s, Q) \1 G1 N, Pfor object in `rados -p metadata ls`;do rados -p metadata rm $object;done
5 ]' x' U$ T- _+ Q( J! u( @5 Z/ Q

% @& g1 w, v1 x8 T- I& A重启下mds进程,应该mds是无法恢复正常的$ a2 {' e! m7 |$ T: [5 ]

" h7 |! d) h1 ~- q9 c3 o登录后复制 : f# I2 x% |  f5 p
cluster:
2 r1 C: L) `& E4 [/ E    id:     9ec7768a-5e7c-4f8e-8a85-89895e338cca6 h7 h; D3 G6 e; t  {8 M
    health: HEALTH_ERR5 v+ b/ v& d1 z- x7 N5 ^
            1 filesystem is degraded4 p7 E$ b( k0 U: J
            1 mds daemon damaged  U* {' a2 q1 m! @: s
            too few PGs per OSD (16 < min 30)2 k) W, s! {7 F( S# D0 u  @1 B
7 t9 x( d9 K$ l0 D
  services:
+ O" L8 d/ g9 w    mon: 1 daemons, quorum ceph-1' }* f6 ^( S5 h7 V1 X& E
    mgr: ceph-1(active)" g$ c3 N! r. }$ F
    mds: ceph-0/1/1 up , 1 up:standby, 1 damaged
& w! L: r3 r8 }# h1 v    osd: 1 osds: 1 up, 1 in
1 y4 m% b# q0 L
% Y* ]$ T1 ]3 t+ h3 n
4 j5 Y3 J1 E, Q/ [1 C8 r准备开始我们的修复过程% h7 e) H1 H) R/ x

- I$ I+ O5 u+ w9 j9 u: l0 |! e
5 {, Y, M0 x" G2 L2 L9 M$ v7 l( o! j

  }* B9 K2 ~3 x) D' v& y1 U. C元数据故障恢复
9 N! l* ^) ~, {  {* Y设置允许多文件系统" X/ f; v: \- Y0 R& q

  \+ I/ L4 _2 \8 B2 `9 z+ \: |ceph fs flag set enable_multiple true --yes-i-really-mean-it
7 N! C0 E) p: g% Y( T& m* V
& h3 A9 b# H" D0 K
! b* a  ]" s2 ]* n创建一个新的元数据池,这里是为了不去动原来的metadata的数据,以免损坏原来的元数据
6 l% z, P/ N( b' Y7 D% x# G% J
# J. S9 r5 A/ f; Y/ ^2 H5 D9 Sceph osd pool create recovery 8
9 D+ ~' l: K" h) K) w5 R: X
5 r: ~& a1 a& L. }. p  I3 K, I- \6 S7 b$ z4 n/ P8 z
将老的存储池data和新的元数据池recovery关联起来并且创建一个新的recovery-fs
4 d- W" h& v- k, b' z8 v$ U6 g: {, R
; @$ p3 U  N& S% i, N" k[root@ceph-1 ~]# ceph fs new recovery-fs recovery data --allow-dangerous-metadata-overlay
) A; Q0 |; D" J! unew fs with metadata pool 3 and data pool 2- Q3 A4 l5 r, W. u
/ e( `, P% Z& T4 a
- Y1 Y0 v( e8 D. _2 u3 z! y
0 ^5 E2 X: K0 ]5 o! t% a7 s
做下新的文件系统的初始化相关工作
: t3 @. N8 T' L5 H  U$ K8 F1 l& `5 Y
( g6 w' d  k5 \2 `7 m4 c. Q[root@ceph-1 ~]#cephfs-data-scan init --force-init --filesystem recovery-fs --alternate-pool recovery
: Y9 h4 I: T$ x! E9 v6 c/ m  z
$ p) ?5 k7 m5 y& v$ ?
5 q8 B! ~( [& \' t" g; n3 b+ D/ yreset下新的fs1 ?6 U. U+ X4 W; \: |

& l" Z( B/ y! C/ B[root@ceph-1 ~]#ceph fs reset recovery-fs --yes-i-really-mean-it* n1 @  L9 v: r$ H6 T
[root@ceph-1 ~]#cephfs-table-tool recovery-fs:all reset session
$ N6 ?8 e/ M0 Y  h3 K1 h[root@ceph-1 ~]#cephfs-table-tool recovery-fs:all reset snap# ]3 g: o9 i1 V; A
[root@ceph-1 ~]#cephfs-table-tool recovery-fs:all reset inode9 k, _& R) U" @  m7 }9 Z7 y! {

" A1 a) K8 T( v0 K, b. r" m: R: K* ?. V% g9 M
做相关的恢复
% W$ m+ F  }5 h! [
$ @0 x) h/ Z8 b% b( z[root@ceph-1 ~]# cephfs-data-scan scan_extents --force-pool --alternate-pool recovery --filesystem ceph  data
- V( i. b% |# H  v9 ~: k$ g  \; m% {[root@ceph-1 ~]# cephfs-data-scan scan_inodes --alternate-pool recovery --filesystem ceph --force-corrupt --force-init data
$ @- f& o, ~1 `1 g' C1 s$ W; h1 q[root@ceph-1 ~]# cephfs-data-scan scan_links --filesystem recovery-fs
1 T' W( B8 Z4 q/ [& I* f) P) _1 \! t) |- t* F: W, |

3 |4 o' c8 x" W+ }' H& X[root@ceph-1 ~]# systemctl start ceph-mds@lab102- v2 }& K) {. w0 d. D9 X9 _# r# A4 H
等待mds active 以后再继续下面操作
/ i! Z1 @& c$ i2 i[root@ceph-1 ~]# ceph daemon mds.lab102 scrub_path / recursive repair$ V0 z9 C) z" ]8 j, T+ P# V% G! U
# U5 O5 B+ E; h; n- P

( E( i# ~2 b3 P7 F, H+ j' X! I% M' I( {0 D  x1 x
设置成默认的fs
1 b' y0 e/ R5 B, l3 c' V- x( T* x0 |4 E% Q
[root@ceph-1 ~]# ceph fs set-default recovery-fs( ~- I& h& G7 u5 f7 z
( K" x+ {; V6 a# T
4 y* M7 g# S1 [" P; z1 ^$ v- C
挂载检查数据
6 Y+ ?% H8 b$ ^& r* G' h3 F: D; H6 M
[root@ceph-1 ~]#  mount -t ceph ceph-1:/ /mnt( Z, V# N- R2 C7 L7 a- O0 J
[root@ceph-1 ~]# ll /mnt
9 r) p( n; i  t, Itotal 0
& l- N- ~* C8 Z) Y7 Cdrwxr-xr-x 1 root root 1 Aug  11  1970 lost+found
  e- ^7 X, @7 r( A( w[root@ceph-1 ~]# ll /mnt/lost+found/
! n6 v) [: |; d; H$ a/ S: K7 l- qtotal 226986
. r, e) I2 }( Y( z-r-x------ 1 root root   569306 Aug 11 12:16 10000000001
5 k1 x8 ~* U7 D1 |. |5 A7 D-r-x------ 1 root root 16240627 Aug 11 12:16 10000000002
$ ^7 W' Q$ y" ?2 y) M, W-r-x------ 1 root root  1356367 Aug 11 12:16 10000000003
/ ?! \2 }# Y0 Y; y5 A: p; ~-r-x------ 1 root root   137729 Aug 11 12:16 10000000004. \6 H$ T* e& ~! M, P3 b% @/ f
-r-x------ 1 root root   155163 Aug 11 12:16 10000000005
; a6 ?& O/ L7 U. t! \* D9 ^) @-r-x------ 1 root root   118909 Aug 11 12:16 10000000006
4 F- v4 J( L/ g, }-r-x------ 1 root root  1587656 Aug 11 12:16 100000000077 s$ \1 b1 e" j7 s3 \' a) B
-r-x------ 1 root root   252705 Aug 11 12:16 10000000008
( {, l, y$ E/ z& i% D# \-r-x------ 1 root root  1825192 Aug 11 12:16 10000000009
! l% e8 E/ K' q-r-x------ 1 root root   156990 Aug 11 12:16 1000000000a
) d1 D' O8 |, y5 z# F$ j4 E-r-x------ 1 root root  3493435 Aug 11 12:16 1000000000b
' i- V3 i6 ]" k( }; L-r-x------ 1 root root   342390 Aug 11 12:16 1000000000c
0 K5 G% H; e" ^. ]# ?& y-r-x------ 1 root root  1172247 Aug 11 12:16 1000000000d
2 u% h& k& R2 ~/ ~-r-x------ 1 root root  2516169 Aug11 12:16 1000000000e
' V1 \& f. }8 `, Y  K-r-x------ 1 root root  3218770 Aug 11 12:16 1000000000f
+ \# z& `+ l0 [! P% d: K" D-r-x------ 1 root root   592729 Aug 11 12:16 10000000010, U7 S1 |! _. O8 n& w) p; U

+ l! Q' B* D1 U  _6 M可以看到在lost+found里面就有数据了
8 \3 f0 `4 X6 T& v* Y, H" ]* l/ Y: z* o% J& \) w
[root@ceph-1 ~]# file /mnt/lost+found/10000000010
+ _& a) J- _* v) x, ?/mnt/lost+found/10000000010: Microsoft PowerPoint 2007+
1 S9 ^' j8 z# {4 o( v[root@ceph-1 ~]# file /mnt/lost+found/10000000011
# G2 D1 i8 p  O, C/mnt/lost+found/10000000011: Microsoft Word 2007+: K3 X$ p" K) X- B/ f1 a
[root@ceph-1 ~]# file /mnt/lost+found/10000000012
# s: ~0 e2 w9 P$ H3 `8 _$ t' }9 P$ B/mnt/lost+found/10000000012: Microsoft Word 2007+
  @5 D9 w9 A% q# y[root@ceph-1 ~]# file /mnt/lost+found/10000000013
4 D$ r8 R3 H8 g! a7 m7 p6 d7 g/mnt/lost+found/10000000013: Microsoft PowerPoint 2007+$ t6 r: p- F8 S6 i- i4 w

, q: e4 X9 P# M5 f5 \1 Y这个生成的文件名称就是实际文件存储的数据的prifix,也就是通过原始inode进行的运算得到的5 G( s2 H# H8 B$ P; j: S9 m( \+ ?
8 B: b: o8 I% d: X/ a0 @
如果提前备份好了原始的元数据信息
7 u0 Y# J9 D+ K0 W" K: V2 w' K8 \! j! ?$ c) d: M% X% f
[root@labceph-1 ~]# ceph daemon mds.ceph-1 dump cache > /tmp/mdscache* C0 J( J: I  e3 R

1 A! J: U) \" l: Y# q/ d8 O, z+ D/ a
1 ^; S! J9 q2 g7 E6 R; _) ?  V& V那么可以比较轻松的找到丢失的文件
; n& ?8 Q2 H) Y& u9 n+ d
 楼主| 发表于 2022-8-11 15:39:59 | 显示全部楼层
创建文件系统初始化8 g1 Z4 E* d) C

/ v7 I% a+ `  j. X4 h2 R0 N2 E$ ?- b0 _/ G1 v* U' G# z
( b; n. V# [  P* r4 p+ W  F: z* a
ceph osd pool create metadata_pool 64  64 replicated cache_rule(cache_rule为ssd)
  w4 N! x4 F5 C9 O8 |1 F9 c. k0 N! o" o( Y7 V2 `% J
ceph osd pool create data_pool  256 256
8 w) E* ~/ M# N. l9 Z4 i; x* \; E/ R' q6 f- R
ceph fs new cephfs metadata_pool data_pool/ i+ d7 ~7 ?+ Y3 _8 o* v
* V, @  N, ^% R6 w
systemctl start ceph-mds.target6 }8 Z5 i& T4 e( R9 }2 t0 _5 O/ u) Z! u5 i

! w! r; n2 @/ }
  _1 I% I* [' t8 g* ]# t
, S; q& H4 Z6 ]# L- w; k2 n8 P
9 A9 l) t% H8 I( C! Z- t& d/ [/ r, q- D- `3 u3 P9 h! ?1 t( d

4 N# @) D' G. g/ F7 x' ?( r; P& _6 f" W* [4 o$ n; [- a
挂载客户端,注入测试数据
; d: @+ S4 ~" P; u* Z" @7 t# v/ L; p3 j

1 A$ j- o2 u* Z, j( @) j! b6 k7 o; C0 h/ I9 l- |3 H
ceph-fuse -n client.admin -m 10.10.0.7 –key=AQDncgVfX4NDChAA4yAy6AmbK6YbfLha3zGA7w== /mnt/cephfs) [, k( `1 F& C! B
) w' ?. ~3 ?4 B4 S4 V) n* y2 ^; J
mkdir -p /mnt/cephfs/a1/a2/a3/a4
6 H0 Y: s; \# k) |; d
& M/ h) m3 z2 Becho hello1>/mnt/cephfs/16 }7 E( K" u: t' q/ m* m) E, q

( X6 P! x0 x. u9 F8 S) _echo hello2>/mnt/cephfs/a1/2
6 v/ T. c5 Y7 t. i+ k: {
$ X+ j4 |' a" C! Z' Z7 c: S6 Mecho hello3>/mnt/cephfs/a1/a2/3
) z+ ~) ]; h) n( z) M& ^9 i
; ~2 ^# c9 E8 L' _echo hello4>/mnt/cephfs/a1/a2/a3/4
: B# I5 C$ S2 f8 B
, x) l" h9 O- m5 c0 p6 Dumount -l /mnt/cephfs
3 }4 I( y+ E+ D9 _4 V) Z' ?4 b) F( A8 \" q  m- E

4 Z8 d9 ]4 N: y0 P/ t  E1 C
/ D9 [) {* O) C" Y1 I! z$ C
- j% K# ]4 Q% b
, Y6 l( N% G1 X) v模拟故障
, s" s" S# O1 _- I& O, r, g' s. i2 O: p# s
将metadata_pool中所有obj删除,重启mds
4 {. s$ Q6 @6 M6 t' ^9 P. N" D3 x( ~' ^8 ^6 o  R0 ]
6 l' x. N; z' ?

' ~# j: _6 _$ W  zfor i in rados -p metadata_pool ls;do rados -p metadata_pool rm $i;done: c, U' K8 W* g/ S/ |

( J8 K6 {6 J9 t- Usystemctl restart ceph-mds.target% ]% u' h1 O& J+ p& H3 d
- `$ z4 s. \% ]& Z) e5 l

/ }+ Y! ?/ E( i" j9 d3 s3 d4 F8 B9 s4 \" o; O9 N4 B) e# S' S
! {! B- {! E4 P0 m, _. `1 C7 I; H9 ]
0 C& u$ D" O2 v" \

8 b1 [. b$ G9 g  O2 b  l* b& @3 A
# s4 E  c  M" @- w5 h0 T" |恢复步骤6 @/ ]( S% s, c
! s" U$ w) W  }0 u: y9 F
( }9 h( l3 l7 P, M' N

' i3 G( u2 @$ j设置允许多文件系统
: d/ [: g) p9 ]3 _& D+ H! I$ Q0 P# q& _$ ?+ V0 J1 r5 M5 }
ceph fs flag set enable_multiple true –yes-i-really-mean-it
) N" ]5 ]+ y7 h' u
8 h6 Y3 u9 l" B8 g& Z- F; J9 ?8 Y创建一个新的元数据池,这里是为了不去动原来的metadata的数据,以免损坏原来的元数据6 k" P4 {  l: F4 B+ H7 Y8 W

/ r, U, f  W3 l6 ?! d) ^; ~$ Vceph osd pool create recovery 8. v) f- C# z1 \$ Z! Y( t) r  Q
0 T4 Q8 H# f3 f; d: N2 n" E/ X
将老的存储池data和新的元数据池recovery关联起来并且创建一个新的recovery-fs
$ l4 ~. J+ G7 G' D, E' k3 `; d$ B# E1 z) @
ceph fs new recovery-fs recovery data_pool –allow-dangerous-metadata-overlay/ o# m0 s$ ?7 h: a6 {: X& Y( P5 p, I2 e

1 s' ^/ p/ h. c4 A# H1 ]做下新的文件系统的初始化相关工作+ O' M) g0 f; z6 }' k

0 z1 a. A4 a9 F2 }% V0 E* ]5 i# G. Wcephfs-data-scan init –force-init –filesystem recovery-fs –alternate-pool recovery* W: e3 i1 N2 D9 X. W

" e  ^# B0 P: o: v) Sreset下新的fs) z6 }$ J: j; |
/ Y; w  e6 W5 j
ceph fs reset recovery-fs –yes-i-really-mean-it* H; F/ B- J7 m
& n, [+ ]/ B0 i) Z' b, O( i" D
cephfs-table-tool recovery-fs:all reset session1 K* {# Q) y: T  T" R& y( I. p$ s

/ o3 u: i% ^4 l; h3 |, Ccephfs-table-tool recovery-fs:all reset snap
+ `: f0 c/ m  V3 |+ o- y9 K* \! |6 w. Y" j( Q
cephfs-table-tool recovery-fs:all reset inode
; v5 x! e! _. m! F1 t# p( U* g$ s; M, `( N2 L2 a, W% y
做相关的恢复
* }( N- c! {* M/ w0 t" t; k; f- z* }/ `( E
cephfs-data-scan scan_extents –force-pool –alternate-pool recovery –filesystem cephfs data_pool
# I, i  A& E; O4 ^- h7 ]6 b! k  k3 p; [1 P* `( }, H
cephfs-data-scan scan_inodes –alternate-pool recovery –filesystem cephfs –force-corrupt –force-init data_pool
" t1 n  y/ V' C# Z9 m  o/ \4 k" Q2 e# h; P# K' y7 u
cephfs-data-scan scan_links –filesystem recovery-fs
( U" z8 L7 Z- x: N
1 p; c5 i, H/ L: d0 Bsystemctl start ceph-mds.target
; R- f) Z7 F1 I1 m2 N5 q
# ?# N2 F9 Z# U1 q% H+ d% Q/ b" J等待mds active 以后再继续下面操作
9 v2 N$ N- K9 r8 ?. u
7 B" K. u7 e  w" ]ceph daemon mds.mon0 scrub_path / recursive repair9 t" L% d. D4 S. ~
2 U' ^' |( C# z9 i4 h0 S, E7 l
ceph fs set-default recovery-fs. U; H: A5 U& q+ F* F1 J# N: T/ F

9 C0 K( [* f& ]7 c+ y6 X4 j
, R: P$ n% Y: g' s. F, B. ?) h3 D  A# z5 w7 T
挂载客户端验证
2 [; @2 y- T1 h* g; `& |# A& ?" z! ^. z

4 s, ?' G  R' z6 N  E; P7 y4 e$ D9 N4 U: L+ r5 _' Q+ T. a
ceph-fuse -n client.admin -m 10.10.0.7 --key=AQDncgVfX4NDChAA4yAy6AmbK6YbfLha3zGA7w==  /mnt/cephfs8 a* u+ I' q6 O- j  [
7 v4 ]  y, K% f# y( E
ls -la /mnt/cephfs9 r# S6 Q7 h* e0 z2 T' i

3 u1 R3 a9 K9 q; X, n% Z( ^" T- A% F  n
" L5 D& O4 H# {+ O6 ]7 B8 g
1 `6 H# X, X1 [$ G, |
6 n+ _# x; f4 w3 F8 \/ S& |# @
实际测试中为出现所有lost+found文件夹) ~3 F9 Q( G8 |& ?4 _. b0 ~
, `% `$ Y8 [$ _) f, O
分析5 \/ M: ], }$ n! Z. W& [( v" {

4 m4 H: z' Z$ `+ }通过查看cephfs-data-scan代码得知,cephfs-data-scan通过执行文件系统数据池,去扫描文件系统中对应保存文件内容的obj的backtrace,backtrace中保存该inode对应文件名以及对应目录结构,然后在新元数据池中构建各级目录对应的inode obj。对于在journal中还未flush到data池的数据,此时data池中无backtrace,此时无法确定该inode目录结构,会在根目录下建立lost+found文件夹,将没有flush值data池中的数据放入lost+found文件夹中。该文件夹对应元数据4.0000000 obj。
1 ?! q: ?* t4 E( ^: q
4 k* a" b* l7 b9 v) r; W& ]# K根目录先保存lost+found文件夹信息" c9 W! Z4 }" ~! n' n
0 G& J1 T7 I$ x' V; F2 m9 U! E5 M

5 B! M" H) s% }: l- W
. y0 ?  b2 U7 J+ g  J( Zlost+found obj中保存没backtrace ojb信息1 L" _/ k; W% g

' w: P1 S) k, P, o8 U
3 }9 k5 D) Y# A' J9 ?( `8 O* S; B. ~
此时recover池中根目录下已有对应元数据信息,启动mds时却没有加载1.0000000obj信息。6 M: E" A! O  V) _) ~

7 y0 [  {# H3 a4 ^! m5 I通过查看mds相关代码,根目录信息通过MDCache.cc中open_root()函数进行加载
4 J7 t  P+ ~+ J- q& R& W
( [  v0 ?- m; z6 ~
# k* K% E1 A0 D$ ]
8 f6 Y6 [8 U; O$ Q; m  _void MDCache::open_root()
/ G/ t6 u8 V! M3 J# M; M3 O3 p5 D* v8 X: ^, O# ?# B/ o
{0 z$ K: N  P0 w$ ^8 e

/ C7 |: f4 V9 R  dout(10) << "open_root" << dendl;0 d. F7 K' d' m2 X5 J2 g; t

) \. z, q* c5 C+ L/ ^. l! N5 K4 ^7 x

  Z% F% {' y& O- ^  if (!root) {$ p& B. d) Q; v- u

" X( a9 p& t2 G4 \- t, A    open_root_inode(new C_MDS_RetryOpenRoot(this));) F+ c2 ~! W; W
7 {4 ?7 x$ K: n% o
    return;
, f& f. a- G/ ^( z; w( @/ f4 a, a% k" V* m/ R
  }
, S3 [" a. _1 ]. M2 I! n* m# A7 N, n" c4 `7 ~
  if (mds->get_nodeid() == mds->mdsmap->get_root()) {7 V9 h5 z, u* |5 \' `

  L0 \) Y. [7 T* W: z& |& c    assert(root->is_auth());  
+ T1 z1 `5 }- F% u0 [3 W# f" G  _/ f! j5 ~
    CDir *rootdir = root->get_or_open_dirfrag(this, frag_t());
- Q0 B& f1 o0 y0 a% c* {  Y* Y* `& l+ g6 W* l' I+ P) a
    assert(rootdir);7 b7 b9 Z+ s0 t8 o& A' W# b9 w

! [' ~1 }6 ]" d4 g5 Q$ `    if (!rootdir->is_subtree_root())# ?1 g4 P) X+ z* h) C
8 ^' m! s+ |. s% {. r7 j
      adjust_subtree_auth(rootdir, mds->get_nodeid());   
3 s8 r# Y+ T+ K: `4 A: X% `5 H8 {# p, o! _4 @* q! {
    if (!rootdir->is_complete()) {" j6 W; Z1 i' M2 o( j

! o7 @& G7 ^' D, Y2 a) e1 A      rootdir->fetch(new C_MDS_RetryOpenRoot(this));       //读取1.0000000 obj中omap信息
$ Z, n2 A( [, L. i' J/ y# U2 @" O- U. d! ?
      return;
" O1 u+ l+ H& E: Z) g0 O/ \7 l0 b% c  o4 M  @( G
    }
8 r! P% J- O9 O! b+ ?  O
/ g4 \8 I8 e+ w2 {  } else {! m& u. J. c, s4 C( X

3 n# J3 K7 |2 I1 R2 ^2 S+ A    assert(!root->is_auth());- S; S$ A& Z* x  w1 H: a

6 u8 f( b/ c7 u! v2 Z- \    CDir *rootdir = root->get_dirfrag(frag_t());) Z  X: k' m) ?3 g2 S5 T2 k# ^
* Q. {! o+ ^! S* D5 J+ D& g
    if (!rootdir) {" ]6 P- A1 d9 @* n) D
# b( k3 F% a: Z. k
      open_remote_dirfrag(root, frag_t(), new C_MDS_RetryOpenRoot(this));9 L/ J8 \  t5 C) `( |; n+ d) d

4 q$ ?6 p) l( {7 c( ^! G2 b6 T      return;
5 Y3 V; z! L  k! i8 S. v
1 |& T9 n( Q* K, c5 a    }   
6 c( w* p6 N  s! G  R% M
! A) o% R- m; I  }: I- G' O* g7 A6 p5 Q* \. Y/ f
4 }/ d' U* y, E- k: p; d0 H/ n

* V7 u/ H4 N) N! f+ H; |9 Z
& ~/ x6 C: o6 V( }9 p! ]% P1 R5 \  if (!myin) {* K3 M1 h4 I( X2 w

4 v8 U4 f/ V  e' h* B1 p5 [    CInode *in = create_system_inode(MDS_INO_MDSDIR(mds->get_nodeid()), S_IFDIR|0755);  // initially inaccurate!4 c3 p- c( }' t
' W, B& G: [6 r% j. t8 {# ]: Q) ~# V0 R
    in->fetch(new C_MDS_RetryOpenRoot(this));# Z' G+ x; R* H) a- p# U4 z* z# B

: V0 N+ c- F' K+ O    return;
& b  a3 F1 ~/ L
! I$ Z0 e8 d# Z- c# H$ V8 O  }7 F9 N1 _( n$ T. D# G2 k
! a, Q$ ]/ w. w8 Y. d
  CDir *mydir = myin->get_or_open_dirfrag(this, frag_t());
# y8 |  d7 O0 U7 B& J
$ E8 d. \. W( r: e9 S' ~9 f  assert(mydir);/ {  ~: Y, j0 V$ I6 J7 Q8 f4 `/ X
. [- c: [8 z4 k
  adjust_subtree_auth(mydir, mds->get_nodeid());
: H3 T! i8 K$ ?; k$ l3 W% K2 `/ x3 d: b4 ?+ [) D9 w- O

# l3 f7 m; M6 S. i
: p3 J+ L+ |$ ?5 o' B  populate_mydir();5 ~* E' k2 o9 F7 _( B# b* _9 g

5 O8 q' e# [5 R) o}2 y) d. h  B, I- F0 K* L
- O( N6 K% h2 b; Z! R4 D
3 G- O1 R7 |' D2 r3 o. I$ h7 S

% _) N/ R# C! v) l1 H7 i% O6 h/ w通过代码发现,只有rootdir->is_complete()不成立的时候会去读取1.0000000 obj的omap信息,rootdir->is_complete()代表此时根目录信息已经完全被加载至内存中。* W) k- m  B  ^7 Q9 c# N
6 |6 q/ q$ M# r4 n6 Z- d3 {! X
因为新文件系统recovery-fs在启动时,直接由creating状态进入active状态,在creating过程中调用boot_create()函数创建mds初始化相关信息及内存结构,其中create_empty_hierarchy()会去构建根目录信息1 w$ d! v/ _* I6 K9 A

' ]7 F' I1 L4 [: `/ l/ G$ Y9 r/ Y
) ?6 m2 P" ^* \( L9 G) I3 e' y" I7 ~% p
void MDCache::create_empty_hierarchy(MDSGather *gather)
) `2 D4 A2 C" c' A$ f) \( {5 ?3 F& A$ Y
{/ J) ]& j! h1 w2 |5 m& G

& G& ~7 [: Q! f6 O2 s  // create root dir7 {1 d! @& Q' x

3 H# b# i' @) F( b  CInode *root = create_root_inode();
+ A8 N; h' D7 X) E+ j4 O  r6 i" n1 a/ C7 q
9 D# u+ O; w9 J7 y% m
: s# d. u' c( \( g# e
  // force empty root dir
! |! X3 B+ C2 a, R
" }$ m7 T; [1 p. i+ c$ O  CDir *rootdir = root->get_or_open_dirfrag(this, frag_t());
! l9 n8 V6 W4 ~6 I6 M  Z- Q5 G- f, Q0 j# z3 M* ^
  adjust_subtree_auth(rootdir, mds->get_nodeid());   ( w. h& {3 R: X7 I/ W8 W- A

# h/ V% Q  a; z' A! e7 y8 M  rootdir->dir_rep = CDir::REP_ALL;   //NONE;7 W; _  r4 p5 t; K4 q

- G% X1 }  D$ b0 S. R9 J) @. \/ S- ]6 t

* e, n5 c" {4 A" b0 G  assert(rootdir->fnode.accounted_fragstat == rootdir->fnode.fragstat);
3 x' V2 V1 H  g5 e2 T, S) A) ]; |& P  r0 x( u! p& `
  assert(rootdir->fnode.fragstat == root->inode.dirstat);
+ y7 f4 J( @3 H& y8 o" [& K: D$ t, u, G8 `
  assert(rootdir->fnode.accounted_rstat == rootdir->fnode.rstat);
7 d7 m- Q% n: K7 v5 `1 x4 ?: c6 ~
  /* Do no update rootdir rstat information of the fragment, rstat upkeep magic* {1 T8 D. v! {* I
% \) @/ V6 J9 A; ]) g
   * assume version 0 is stale/invalid.
  a, d  D' w  @, F  i  X
* v& M# J7 r1 J, ~. r* L   */! n5 n; b" @$ D

$ R4 p9 `6 y0 Q  C. y. |) Q5 R) k0 F& e5 F+ ^
5 Y" o" A% B# W, M2 Q) R/ _# m
  rootdir->mark_complete();8 y; x4 j# U, l3 o  g; J! A
% r' f1 k8 L1 X; u
  rootdir->mark_dirty(rootdir->pre_dirty(), mds->mdlog->get_current_segment());% n6 X0 U. A+ O
* U9 o7 E. t0 k1 `, V
  rootdir->commit(0, gather->new_sub());) B5 ]0 m- z* \) ]7 S; Z5 s. O0 N# k5 s

3 L6 l! g/ Z. a" ?$ h5 W; \
. W) _7 K% o5 M9 ~' x- q
9 g! j- o, v& o/ o& p  root->mark_clean();
! A! ^, w: {( ~# s* O; W+ i" x+ }" _: d9 P' u- Z2 s
  root->mark_dirty(root->pre_dirty(), mds->mdlog->get_current_segment());
; |, ?4 |) G/ h$ J1 `% B# c$ w! `; `; O3 [  G6 ?, S2 l3 `
  root->mark_dirty_parent(mds->mdlog->get_current_segment(), true);1 A! C6 f$ b8 Z) q5 \$ k" D
7 m7 P" ~* j8 \/ y+ ]
  root->flush(gather->new_sub());
4 }- x  v; L2 r$ |4 ^
; \5 V, @/ n7 q! a}
# c, C& q- T( v+ ]
! t7 q( H4 X/ |* O" T+ B( X. K& o+ h' W* I0 k- `
3 w% S5 l& I7 M% E8 O+ W' l7 l, T
其中会将rootdir->mark_complete()标记为complete状态,进入active之后,将不会读取根目录信息。
8 `; h- j: v: f* k& G2 }! I9 Z
( ]$ b# I1 d- B! w. k- V; S
4 A7 }4 f6 z( s( m
9 c8 }) \+ R8 }2 U. o/ p3 }. \/ t" G! I  n
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

如有购买积分卡请联系497906712

QQ|返回首页|Archiver|手机版|小黑屋|易陆发现 点击这里给我发消息

GMT+8, 2022-10-4 04:49 , Processed in 0.046387 second(s), 22 queries .

Powered by LR.LINUX.cloud bbs168x X3.2 Licensed

© 2012-2022 Comsenz Inc.

快速回复 返回顶部 返回列表