找回密码
 注册
查看: 827|回复: 1

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2022-8-11 13:50:25 | 显示全部楼层 |阅读模式
元数据模拟故障
" `  B/ W5 S& i# L, C跟元数据相关的故障无非就是mds无法启动,或者元数据pg损坏了,这里我们模拟的比较极端的情况,把metadata的元数据对象全部清空掉,这个基本能覆盖到最严重的故障了,数据的损坏不在元数据损坏的范畴9 A0 Q9 h+ t9 q( V5 G9 k

1 l+ z( R( c/ `2 w: S清空元数据存储池
% \5 X; t, J) q- I2 l. I% I: h- t8 e& j: R9 I  j; N
for object in `rados -p metadata ls`;do rados -p metadata rm $object;done
, `1 h0 r" u! p0 a% `
! o3 ?& Y: @0 M2 F* p5 d2 l; m2 w" H: |* J
重启下mds进程,应该mds是无法恢复正常的8 I; ~7 I8 p% \. Z" n

1 ?. D% Q1 `& k% E- ~# d登录后复制
% N' M' Z/ F3 Xcluster:" W* [) c- m5 k* W7 P- X" M
    id:     9ec7768a-5e7c-4f8e-8a85-89895e338cca/ [- Z( W1 f  X& r/ m0 b
    health: HEALTH_ERR
2 I7 U$ ?- ^* f; D" ?( z" {            1 filesystem is degraded
% X5 W, m- ^. E7 c6 T            1 mds daemon damaged5 l7 z' k2 ~& l2 \: T! @8 ?& d
            too few PGs per OSD (16 < min 30)& `; P6 F/ Z; J' E* @2 v( O% B  k

. t& X# a5 ^8 O9 ?) n2 Y  services:
" w# s& _1 M! V, s    mon: 1 daemons, quorum ceph-1; w2 }" i( s5 H+ M2 K$ K  G' @
    mgr: ceph-1(active)
) {  }9 q( ^7 c6 A$ P    mds: ceph-0/1/1 up , 1 up:standby, 1 damaged
! T: c3 |8 Q6 L& c: E+ z    osd: 1 osds: 1 up, 1 in
4 M3 f  m8 i' f" C. H0 J# J. ^5 j( e3 u) `) a
4 }+ }" o+ M4 p2 g1 i( l
准备开始我们的修复过程
: l  Q; L  w" a9 ?0 ]% j1 u
6 L) O' q& D. _1 B. c0 Z5 ?% c& B* j0 m

& L% n2 d* a  N" D# h% h
+ ]4 D- H6 x: A, ^' Y0 P元数据故障恢复
. J# D0 s2 K, u9 E8 @& r* C: b设置允许多文件系统) K2 N1 d3 I& @& _( A# d# X& T7 B

8 A& I4 h3 J/ n. v% w+ \. [6 Yceph fs flag set enable_multiple true --yes-i-really-mean-it
8 k" ]) _+ I' Z' c5 `5 k
9 v6 K! w1 J; B9 {
& c8 {! ~0 V$ H0 u' m0 t  p创建一个新的元数据池,这里是为了不去动原来的metadata的数据,以免损坏原来的元数据
6 H" J+ z* n2 \- q5 X* J$ O8 G+ R, i& ~
ceph osd pool create recovery 8
* G  l* n; E5 I6 {" J$ ?1 ^7 s5 Z7 O; ?; b8 g

7 i7 v# Z0 l/ b. y- w5 z: m将老的存储池data和新的元数据池recovery关联起来并且创建一个新的recovery-fs# Z9 @4 w. _# {& l) j

3 G5 n* g( i6 ?9 I( z: C5 s3 M[root@ceph-1 ~]# ceph fs new recovery-fs recovery data --allow-dangerous-metadata-overlay
& Z1 c" L1 ~8 wnew fs with metadata pool 3 and data pool 2' `, u- C+ B3 n+ P
6 K" [9 z! g7 z4 N# Z

" o& I: h1 b: ~! V
& Q/ m5 M1 f2 s& r* u做下新的文件系统的初始化相关工作
9 s  p$ t/ I# I' T8 ~
3 v, O" H) B5 E. v% d[root@ceph-1 ~]#cephfs-data-scan init --force-init --filesystem recovery-fs --alternate-pool recovery
, P: J3 E7 f2 G  ^4 m! v# ^3 z9 s
% ?- U4 z6 ?+ s# C& J2 r! E
reset下新的fs
0 i7 W2 R- T! J8 H4 K
- r8 J# ]' x1 @  a' E9 ]/ q/ q[root@ceph-1 ~]#ceph fs reset recovery-fs --yes-i-really-mean-it
; G) I, i3 G  P! q5 ^4 t[root@ceph-1 ~]#cephfs-table-tool recovery-fs:all reset session* q. _- M1 V+ V& C2 W
[root@ceph-1 ~]#cephfs-table-tool recovery-fs:all reset snap% O2 D3 g) o6 ^* C( F2 m1 I* K
[root@ceph-1 ~]#cephfs-table-tool recovery-fs:all reset inode0 `# E' l9 o9 x' W( G" c

& t4 L0 ~" n1 |. A4 H  V) W8 d3 F3 Z2 I
做相关的恢复
* X$ e3 R8 t5 ^, f6 O/ B/ ]) \9 f8 o5 s  u. G1 q# A. x' L* h
[root@ceph-1 ~]# cephfs-data-scan scan_extents --force-pool --alternate-pool recovery --filesystem ceph  data
% N) g, I* [3 r# O5 B[root@ceph-1 ~]# cephfs-data-scan scan_inodes --alternate-pool recovery --filesystem ceph --force-corrupt --force-init data& d; ]7 i  m+ r
[root@ceph-1 ~]# cephfs-data-scan scan_links --filesystem recovery-fs
3 e: {9 I/ F1 F. p: e( J" V3 N1 h4 f5 l; d8 g

) z' i4 B6 J4 K( Q[root@ceph-1 ~]# systemctl start ceph-mds@lab102
* D6 v% p, I( g3 m0 T5 J等待mds active 以后再继续下面操作. \) J: V% a& U' D. y% Q% u1 Y
[root@ceph-1 ~]# ceph daemon mds.lab102 scrub_path / recursive repair* L7 q) L" C: I5 i
6 r& O5 [& r, r9 a4 Q* J

# \- A" ?8 W# d
+ K/ \  F, f9 E$ j3 D设置成默认的fs  i. {* m; x# z) g  @+ e; v

( B, L* S+ M4 d1 S8 u[root@ceph-1 ~]# ceph fs set-default recovery-fs: U2 G4 K2 x$ v7 r) Y( @

! L8 r% q  P3 }: h0 ^2 c- `) v$ A5 l) P! Y7 f
挂载检查数据+ ~" \: [* ?( J0 Y
' m" D( t8 p9 }1 L4 [5 }$ i
[root@ceph-1 ~]#  mount -t ceph ceph-1:/ /mnt
$ P& K& H# ^6 {) E[root@ceph-1 ~]# ll /mnt
% C: ]4 Y0 J# P- Q3 etotal 0/ K' o! f. |; j" E
drwxr-xr-x 1 root root 1 Aug  11  1970 lost+found
9 G' U8 u9 Y+ d[root@ceph-1 ~]# ll /mnt/lost+found/2 E1 ^* D, E$ R* p' L+ [7 w. O
total 226986
) y/ ~. p3 n: i/ }4 z-r-x------ 1 root root   569306 Aug 11 12:16 10000000001
( g' ~7 w: q" E& i9 `-r-x------ 1 root root 16240627 Aug 11 12:16 10000000002
4 ~" C) P* d& j+ u+ L& Q5 [-r-x------ 1 root root  1356367 Aug 11 12:16 10000000003
# O' @* B) _$ x# N# w' u1 f-r-x------ 1 root root   137729 Aug 11 12:16 10000000004$ U5 R8 u( R# F6 F2 Z& L
-r-x------ 1 root root   155163 Aug 11 12:16 10000000005
# x+ x) \- O! S8 o+ [' J: p% L" T-r-x------ 1 root root   118909 Aug 11 12:16 10000000006
/ m9 F/ Y  E2 Q" _-r-x------ 1 root root  1587656 Aug 11 12:16 10000000007
' [) |9 V. ~% X% [7 t6 ?1 {-r-x------ 1 root root   252705 Aug 11 12:16 100000000086 D  h; c2 H* O; l6 k
-r-x------ 1 root root  1825192 Aug 11 12:16 10000000009
7 H3 D6 F5 H8 v5 L/ Y2 a3 h-r-x------ 1 root root   156990 Aug 11 12:16 1000000000a
; H9 S& u5 y/ w, }2 m-r-x------ 1 root root  3493435 Aug 11 12:16 1000000000b
3 X+ M+ r, L  y4 [6 j-r-x------ 1 root root   342390 Aug 11 12:16 1000000000c4 ~9 q- m" V4 @+ t! d
-r-x------ 1 root root  1172247 Aug 11 12:16 1000000000d6 |. a- n& {" G: T
-r-x------ 1 root root  2516169 Aug11 12:16 1000000000e
) Q: `4 A; c; c1 y- {( h8 C4 q3 I-r-x------ 1 root root  3218770 Aug 11 12:16 1000000000f& _! P. l% F! ]7 R! F
-r-x------ 1 root root   592729 Aug 11 12:16 10000000010
6 ]4 b8 e1 V$ j8 Y# b0 r
: W0 b1 R8 U9 p* T3 ]* }" t可以看到在lost+found里面就有数据了
: T- d" Z# [; p' u/ S1 h' r! S; I4 _+ k! R( y9 o2 z
[root@ceph-1 ~]# file /mnt/lost+found/10000000010 ' G  F' L! A: ]% p$ x
/mnt/lost+found/10000000010: Microsoft PowerPoint 2007+2 p2 c( J, k( G! R) {& a1 ?
[root@ceph-1 ~]# file /mnt/lost+found/10000000011+ F! |. Y" ~, B' U& e. E# Y; Y3 L5 C
/mnt/lost+found/10000000011: Microsoft Word 2007+- m$ ~/ m7 T- K3 g" s7 Z$ `
[root@ceph-1 ~]# file /mnt/lost+found/100000000123 L% o& U4 Y0 [- w' Z. {9 h
/mnt/lost+found/10000000012: Microsoft Word 2007+
4 Q; ^6 A5 r& ^2 h0 E% D[root@ceph-1 ~]# file /mnt/lost+found/100000000131 T# g9 H1 O( ^( m+ _* P
/mnt/lost+found/10000000013: Microsoft PowerPoint 2007+
4 R* o. A8 l7 u; N) x. ~( L" ~$ H+ c4 w+ W4 e3 Y& Q' [% E0 B* ^
这个生成的文件名称就是实际文件存储的数据的prifix,也就是通过原始inode进行的运算得到的0 o! X9 W' U/ u7 ~" A' x

& J7 `2 a/ N4 K6 [* s9 K! u! u如果提前备份好了原始的元数据信息
- u/ M4 c3 d0 q( D7 p
3 t! c) q2 r* N! I2 C[root@labceph-1 ~]# ceph daemon mds.ceph-1 dump cache > /tmp/mdscache7 q+ o1 Q8 g4 k, [5 I

. v) u( x3 L% q% y; b) p0 o; Y( N
$ f) [% S& G) j那么可以比较轻松的找到丢失的文件- c$ u# @1 P0 Y, ?4 W  F8 r) o

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2022-8-11 15:39:59 | 显示全部楼层
创建文件系统初始化! r) t* W. C% B) B8 ]. ]* A$ }1 |3 X
9 S! n) _7 T+ i( _% F
" {4 {9 _9 I) g! ]) u+ o( l  |
7 }8 n- _2 X3 O7 K8 X; `
ceph osd pool create metadata_pool 64  64 replicated cache_rule(cache_rule为ssd)
+ R$ u& f2 a4 ?* [  D1 ~4 ~. f8 z2 S0 L
ceph osd pool create data_pool  256 256
: `0 B; K1 {$ @' \/ ]
! I, }' m& A3 [+ F+ X* j/ i3 eceph fs new cephfs metadata_pool data_pool( U9 T9 k# C4 l7 K
4 c- i+ H- f2 b
systemctl start ceph-mds.target! x6 o/ Z* x0 t! x4 h+ U

4 y8 y5 g3 d! V& n% _/ Z5 x- N# R- R* H4 O$ X

' y6 P0 M5 L2 r; U- b9 U' h# w; U6 ?7 e% _0 T

, O* h/ P- {4 L; u$ u/ b
- Z$ e. n$ U9 t3 q6 Q# h, L
6 ]( H) S: C8 Z2 H  V挂载客户端,注入测试数据
) m5 d# ]- `% A2 v+ \/ ^  M# y  F
( O$ D& `7 w/ k3 w; T5 R- c  a* H" O8 k: K: h

& ^3 `5 v1 v" ]ceph-fuse -n client.admin -m 10.10.0.7 –key=AQDncgVfX4NDChAA4yAy6AmbK6YbfLha3zGA7w== /mnt/cephfs
: G4 ?4 l5 R' t; f: l9 E* g+ Z7 v2 ]$ Z. {
mkdir -p /mnt/cephfs/a1/a2/a3/a4
( v& ^* x. n; _% ~5 Y" R( E' ]5 _/ N( T% H
echo hello1>/mnt/cephfs/1& S# M7 Z  y: C6 p# s
! e6 x1 [) _& M8 p+ m+ _
echo hello2>/mnt/cephfs/a1/2
* ?8 @! L( ]$ b) e0 A% ^) ~5 F  K0 a5 Y2 f
echo hello3>/mnt/cephfs/a1/a2/3
1 J  k! A0 m8 ]) k  P
- ]9 p5 ~3 H/ [! T7 p7 Recho hello4>/mnt/cephfs/a1/a2/a3/4& x! ?0 U8 M1 p; a! f, B9 e! ]
- i2 k# \5 k8 O* t+ _; R
umount -l /mnt/cephfs
6 O1 F/ Y% s' i4 ~# ]$ H- W; Z! H9 w; a' R4 C5 ~  j

  Z- a; c4 z. P8 Z; J4 n1 [
# Y9 u  h4 x$ P+ F3 L2 b! r, e! V/ t$ L& Y

! s7 Q8 t5 N+ ^0 O4 B模拟故障
) @( v4 T4 U) g. b& y% T
" I& T! K3 B! s% o将metadata_pool中所有obj删除,重启mds( E% y$ K* u- X* N
6 l+ x" X+ e5 {+ D4 q
5 P7 d) x, _1 A) [! z: _1 ]

8 N2 ^8 B4 W3 F) ?" A# Jfor i in rados -p metadata_pool ls;do rados -p metadata_pool rm $i;done4 D4 D. w; W& ]3 `) Y1 I+ ?

$ [4 ~3 z8 V' F2 n7 e0 bsystemctl restart ceph-mds.target( \; Q: s7 n3 Q7 N! ^4 {- f

5 z; M; k3 t# l9 Z$ B$ k. u
% K' ]) I; u  y0 m5 T6 a3 A! Z7 `" L. k
. T  X/ |& \1 b4 S& X6 f

' {# g7 g0 h: O$ h. c( g& a; R% p) f% H$ y4 Z

9 ~1 w# H, x9 d) L9 Y6 \恢复步骤4 E, w% ~0 @  V
: h  J5 M. `! K7 k& e# a$ O

( \8 h( Y3 t" }, O: G, e& Q3 \, N" p1 f% F) f
设置允许多文件系统
% l6 h# y3 |, A; E: l3 I' R6 k& D- W$ v5 `; I3 Q
ceph fs flag set enable_multiple true –yes-i-really-mean-it
; s4 P8 a" }+ W4 `/ x2 N6 I6 c* D# R: h# l
创建一个新的元数据池,这里是为了不去动原来的metadata的数据,以免损坏原来的元数据! L  h4 p( `" [1 B+ w1 d1 ^

- d, ]: u' F) ]3 qceph osd pool create recovery 8
( S3 a' q# H9 `
# c6 i/ j  Y. B将老的存储池data和新的元数据池recovery关联起来并且创建一个新的recovery-fs
% M6 v8 [  J0 J5 c) Y
) E4 l" D+ Y1 E# K7 kceph fs new recovery-fs recovery data_pool –allow-dangerous-metadata-overlay
1 n. z, b6 d4 e& H* I' s5 A) j" y+ j) Q6 Z* C
做下新的文件系统的初始化相关工作+ A+ t" P4 a5 U( f3 P8 b% F4 ]" |! A
9 p+ C7 X( D8 E, b) y+ N8 f8 E
cephfs-data-scan init –force-init –filesystem recovery-fs –alternate-pool recovery3 o; g; G% O( f/ Z

' v, `2 w. J; x6 b9 a  M9 z; c$ y, lreset下新的fs
0 B; g- D) W; I0 Q1 _( R! r2 L3 M) k- r* Q& r
ceph fs reset recovery-fs –yes-i-really-mean-it
( z- j9 V0 j  g6 E4 X% u
# ^) s, L8 p# {3 H, Qcephfs-table-tool recovery-fs:all reset session' b$ g9 L' a- B, K9 U5 I

/ ^% _! J; }# rcephfs-table-tool recovery-fs:all reset snap0 J* c7 y- |7 N6 A! B

% `0 r7 `( P7 x/ Kcephfs-table-tool recovery-fs:all reset inode: r6 _' B+ _3 ]! ~2 }4 W+ i

8 P5 d3 O' r# R2 w( i8 f做相关的恢复; u; F; T1 V" C. q! u8 C; f- N2 r
. `5 Z7 c, A1 ]
cephfs-data-scan scan_extents –force-pool –alternate-pool recovery –filesystem cephfs data_pool
8 p. O8 S) c* E9 n6 m# k- {+ L( H& E0 u. }+ F+ k- ~
cephfs-data-scan scan_inodes –alternate-pool recovery –filesystem cephfs –force-corrupt –force-init data_pool0 d3 O/ R# G; J' t+ h# [! [1 o1 S
; N, k1 p! k0 T5 s8 o
cephfs-data-scan scan_links –filesystem recovery-fs
, I- o! \, B7 E4 b8 a$ A" [
4 u+ p/ p- F" H& x8 wsystemctl start ceph-mds.target
1 H. Z3 j5 z2 i& b" w$ U6 j7 I& G+ D! _1 |$ B8 d! K9 A
等待mds active 以后再继续下面操作" @- T( a3 m  F$ M) c

' C: [5 w" P# T9 J  V- h. Yceph daemon mds.mon0 scrub_path / recursive repair
/ h$ M  ?- C4 F: P
5 |4 E% T- r1 x6 Xceph fs set-default recovery-fs" V' Y( a7 |5 z" d4 d( W) n

1 ]3 m+ {4 _2 A# A) b+ y, ~  U9 [) @7 m; O4 p: f/ F# [/ t% I

$ T" D/ l9 N, P, M& Y5 d挂载客户端验证* [& b7 S7 U, C+ [+ u

9 m0 b  E+ G4 o% l3 b7 \. E9 l7 {  C8 g2 ^5 |
: {! v9 s8 j- P
ceph-fuse -n client.admin -m 10.10.0.7 --key=AQDncgVfX4NDChAA4yAy6AmbK6YbfLha3zGA7w==  /mnt/cephfs
4 s# G: Q8 }# d7 x2 K7 B: E4 p9 M+ P! F! n1 _
ls -la /mnt/cephfs( Q1 H& b/ P: H5 d
+ F# C4 B7 S" Z0 G8 {/ F( N
/ A0 D; o& }1 p, O8 L
# c, N  J# C( \% C1 R& J1 D
2 d" Z: C. E% H/ y7 |
+ I' E% ?  s0 H) f3 L' w
实际测试中为出现所有lost+found文件夹
/ k" k1 w7 {2 d# y/ d7 k9 E7 ?+ j/ h# d4 k+ ?( e5 j
分析1 w8 G/ f5 P- P5 Q; s

* y3 t* D$ e* G8 H) q- n通过查看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。
" Y/ I4 r" i, h- B! ]8 S0 l) Q
( X$ Y0 C" L" G! q* y. X根目录先保存lost+found文件夹信息" G' R' @& C# ]7 b- z
- u, B0 X  U) P% _( [0 J$ ~6 @

+ m: {$ a$ a- ?( o' U' m+ J% o& X* ]& I( V$ E, q/ K2 g( `
lost+found obj中保存没backtrace ojb信息* K8 E1 d/ q; I: D8 X: c
3 Y! H! C8 J8 G2 l

% m/ u' e$ w  @6 ]" f2 |4 O" m; }& I! q% l" ^/ X" d0 |6 X
此时recover池中根目录下已有对应元数据信息,启动mds时却没有加载1.0000000obj信息。
! [# ?; P0 u6 d0 u# _( L: E7 r" l' e0 X: d. G' k4 d
通过查看mds相关代码,根目录信息通过MDCache.cc中open_root()函数进行加载
$ i: e$ B1 i- u! R9 v" b$ e4 s! g1 h: f% n( C
% b& ^4 F' D: O8 k9 ]& [. g

# W' {$ }1 K+ G# J5 T9 Rvoid MDCache::open_root()
; t! r  a! ]- a3 U8 Y7 X6 v% P/ {5 G5 ^) r
{
" K' z# o2 q* b& f! b% T) e
/ d2 r* W6 S/ g3 q( j  dout(10) << "open_root" << dendl;) j, w- C; ?! @2 J, J

$ e* S5 M2 A8 x( U) K. m' l- A7 C4 S7 f: z/ x3 m$ L
# p# y9 f0 K8 D0 {* @
  if (!root) {8 T% n4 a: M  v) D# B6 `% j
- o* A& \5 Y7 u+ q  T* `! t1 `
    open_root_inode(new C_MDS_RetryOpenRoot(this));7 Q. l1 p% a3 Q% X
8 R' K/ `* _" \) [2 s" W, ~! r
    return;7 A/ J6 Q, B0 ]6 W  @
, S0 P0 j! C0 t  u5 o6 o5 E
  }
+ A5 W- M3 L6 i- m: G! Q" @' S: U1 w, B* |% z) S9 z5 Q
  if (mds->get_nodeid() == mds->mdsmap->get_root()) {
% t8 F' N( V; N
6 L- q! U1 G2 y3 X+ r9 U& O! R    assert(root->is_auth());  $ v+ E) o( Y: ?' o. Z2 Y

2 @$ k2 l" p7 P/ K3 x4 D3 O    CDir *rootdir = root->get_or_open_dirfrag(this, frag_t());
4 L4 d( v2 z+ ^7 d
5 G. ]2 l0 i4 K    assert(rootdir);
, V: X+ h( c. r* `9 f1 @0 i  H$ Z$ P' @' y7 I+ l: E* s3 o
    if (!rootdir->is_subtree_root()), Y' Z* B7 D/ [% @
" n5 f2 ^* |1 k+ b: p
      adjust_subtree_auth(rootdir, mds->get_nodeid());   
$ w$ [* t. O  @: v" }) P- v5 v6 o5 r  T3 I4 P/ {$ [$ v
    if (!rootdir->is_complete()) {: i7 U7 n; T4 e* l

! S" N4 u* X/ S6 ?2 z      rootdir->fetch(new C_MDS_RetryOpenRoot(this));       //读取1.0000000 obj中omap信息
6 n* ~, L3 e8 h' H: g0 r; E+ H% c
      return;
4 P: R" a0 l; U9 |1 m$ v$ l5 K8 `7 m, d7 c% T/ w* K" Q: [! e. n& J
    }3 Q; i: O# Z, e& D$ r9 e

* e" H" S8 W6 N  o! c, J5 S) C% m  } else {
& d# B. |( t( i8 _3 K! W5 b# M* [8 A
2 S! V9 w$ A  _3 j) T& y) Q" ?    assert(!root->is_auth());
  U9 `. x7 Z' y$ d
0 ?' y0 ^: M' B/ G    CDir *rootdir = root->get_dirfrag(frag_t());
2 u9 @1 Q# N+ q/ B. X( ?
( f& f2 h; ]% g" K: z5 y: U2 X    if (!rootdir) {
* p7 O; r0 e& i- W8 K/ _4 E  t
      open_remote_dirfrag(root, frag_t(), new C_MDS_RetryOpenRoot(this));7 `' W4 {# s7 C, O# Y3 W. _- R9 U

' [1 E( Z1 o. H/ l' D      return;
( B9 t% u4 t& t* t* ^5 n
7 Q0 K2 C- y& P) o1 g$ @) ^    }   
: y9 ], G" J0 i0 j
9 R$ Y' x* f3 d% ]  }
7 X/ f  @: Z# {# `% m# h
9 I0 z9 N' e5 G9 N
+ _2 l1 s( k+ S( R$ ~; j
* W9 b1 K/ L3 U+ k  if (!myin) {8 x9 n& w- h% V$ N
8 C+ ?* q/ G: ]; _6 |) C! h( ?
    CInode *in = create_system_inode(MDS_INO_MDSDIR(mds->get_nodeid()), S_IFDIR|0755);  // initially inaccurate!3 h3 }) [! l# e) f) t8 S0 c

  P% t% k) @- A9 m    in->fetch(new C_MDS_RetryOpenRoot(this));
  B. u- o  p  i7 h+ |- K) V; l* m* k) |, f
    return;$ o& y3 K; ~" s4 N
( m' k0 T( c# U! h
  }
- t9 ~  \4 @2 _" q+ [' D
3 n8 n8 v& q' I+ a- J  CDir *mydir = myin->get_or_open_dirfrag(this, frag_t());7 C4 D7 B, ^3 s9 m

* l  n& Q6 L0 f/ C3 w  assert(mydir);
& J9 Z# f' d7 x/ ~4 U+ _" @# |* m! G8 F
  adjust_subtree_auth(mydir, mds->get_nodeid());
& |3 L% ]: u; h, ]7 R2 x+ T
& G8 \+ O$ S, }: v; g8 c) U0 r# Q6 r% i. }+ F

; y( G% Z/ u4 F  populate_mydir();/ F( F6 B" ?; S. D5 r7 w' D

+ f( L6 ?- |! V: }( Q0 ?& _}% w8 ?3 r& i8 W: k# v: q5 r+ m  |
3 c5 [* T4 i2 x/ `2 X7 P

7 J/ p) o9 N2 O. j3 m6 L; `, W7 N  w  H% ~2 s
通过代码发现,只有rootdir->is_complete()不成立的时候会去读取1.0000000 obj的omap信息,rootdir->is_complete()代表此时根目录信息已经完全被加载至内存中。
3 n; O: F, y; V( y7 ]3 s, ^# o5 p! o) m
因为新文件系统recovery-fs在启动时,直接由creating状态进入active状态,在creating过程中调用boot_create()函数创建mds初始化相关信息及内存结构,其中create_empty_hierarchy()会去构建根目录信息
& v: M2 n/ `! s( ~# j/ A+ }
3 V7 Y' {1 D/ I' v) A% }) P0 z# o3 n
8 g$ L+ n, y" {7 x& e
3 L+ q! K+ \. @  i  ivoid MDCache::create_empty_hierarchy(MDSGather *gather)
2 l7 z7 m  A# M$ y8 d% |' U
& j7 @$ {$ ^0 `, ]) e3 [{8 @* O" u# ^% a* x4 m# x. h; _) W* t
& x- @$ ~; H. V
  // create root dir4 ^8 G5 p' L1 S/ P* V7 M! J/ d
5 ]# [/ U5 v2 s' I$ A8 `& K
  CInode *root = create_root_inode();# }3 h" n/ K$ _. B( x

! c2 F' M) }" P9 h7 s
2 d0 r. O/ q( C- p/ R+ X
9 ]4 |" [3 D' f- k  // force empty root dir1 B5 n6 |' ^: G8 v, d, |

9 ^% m" G# m3 I* y' j- j4 ?  CDir *rootdir = root->get_or_open_dirfrag(this, frag_t());
/ b, H8 P- L- [
# A( q' s* U) p  adjust_subtree_auth(rootdir, mds->get_nodeid());   $ z  G: k6 m3 f1 H& f  m
3 D5 y2 U" P, B* M! }4 u1 W0 t
  rootdir->dir_rep = CDir::REP_ALL;   //NONE;
: m# u, e+ |2 G- c  [% f  a) T  k5 Q8 O' g( ~

3 b' b$ {' q) }. ~$ S
& u8 [+ S) F: b' I- u  assert(rootdir->fnode.accounted_fragstat == rootdir->fnode.fragstat);
& h+ g2 I  _7 |2 I, u6 Y# a6 U; j
3 N/ {3 N& V% q2 S& E  assert(rootdir->fnode.fragstat == root->inode.dirstat);6 H- y8 q' q/ @" E1 F  F) J

7 Q" k8 g5 P/ f3 A  assert(rootdir->fnode.accounted_rstat == rootdir->fnode.rstat);
4 n7 n$ ]- P9 T. [/ b1 F8 y! }
) j' u) U/ F6 Q  /* Do no update rootdir rstat information of the fragment, rstat upkeep magic
7 B1 D- ^8 z% J  Q6 l0 M, x% r, ]% d
   * assume version 0 is stale/invalid.
/ T3 M4 a. m4 c6 W
7 v6 s5 C; B; V- Y   */
1 H. \0 q$ l7 a* ?& S6 p& I( K) m" q- C4 Q, d  b2 F; v
# V! Q6 n; T7 a; m4 ]) ]
' w8 c' B: L+ B' N* L$ \
  rootdir->mark_complete();4 A0 X2 w+ a# }. g8 M% |

% P7 N6 `! D  x3 l  rootdir->mark_dirty(rootdir->dirty(), mds->mdlog->get_current_segment());
. _0 ^" n- ~; W) \4 x! q9 A* @5 p& R) e8 ^6 ]0 T/ D
  rootdir->commit(0, gather->new_sub());/ }8 @; F! _3 X, b, R
( |( E8 i8 M2 R+ y

& i' \& W1 t3 ]3 {8 D4 X4 l3 J5 [- ~/ n: P
  root->mark_clean();
2 G7 |. P  c) q* {: l' p# \
, V5 Y5 z% w: O  root->mark_dirty(root->dirty(), mds->mdlog->get_current_segment());
* I: B7 h9 k5 g! @5 J" Z0 t8 E7 k0 B" R, j. @
  root->mark_dirty_parent(mds->mdlog->get_current_segment(), true);
4 o" N% u( |+ U( J
/ _* o1 y. e1 [# E; }, r  root->flush(gather->new_sub());# R$ M/ y/ b& `2 [- e8 ?
6 l8 ], q- J, m5 n: d
}6 T& V4 b6 j. _) y9 @- Q
0 f  B4 ~! b+ |) b1 @

6 v( F7 z6 u$ i! j( S( I+ m  m! m: _* y
其中会将rootdir->mark_complete()标记为complete状态,进入active之后,将不会读取根目录信息。
5 }6 e% E4 _  _1 p, [! y, c# [; A% B9 v. z: i* J: G8 b
8 r& ?, l" R, B5 L, ~

! p3 b! }5 G( P& b. {
. N. w& n' I: P8 A
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-11 23:01 , Processed in 0.034035 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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