1. Client端Recovery总体过程
- Client会定期发送的SEQUENCE,由于Server重启,返回NFS4ERR_BADSESSION。导致调用
nfs4_schedule_session_recovery
,标记NFS4CLNT_SESSION_RESET
,进入nfs4_state_manager
状态机处理。 - 标记
NFS4CLNT_SESSION_RESET
会导致Clinet发送DESTROY_SESSION,Server由于重启,无法用sessionid找到原有的session,返回NFS4ERR_BADSESSION - Client发送CREATE_SESSION,Server返回NFS4ERR_STALE_CLIENTID
- Client调用
nfs4_state_start_reclaim_reboot
,并标记NFS4CLNT_LEASE_EXPIRED
+NFS4CLNT_RECLAIM_REBOOT
- 标记
NFS4CLNT_LEASE_EXPIRED
导致发送EXCHANGE_ID+CREATE_SESSION - 标记
NFS4CLNT_RECLAIM_REBOOT
导致调用nfs4_do_reclaim
和nfs4_state_end_reclaim_reboot
。- nfs4_do_reclaim: 枚举所有open和lock,reclaim它们
- nfs4_state_end_reclaim_reboot: 发送RECLAIM_COMPLETE
2. nfs4_do_reclaim
- 从super block可以枚举所有的owner
- 从owner上可以枚举所有的open state
- reclaim所有的 open state
- 每个open state可以枚举所有的lock
- reclaim所有的 lock
3. Server处于grace period
3.1 reclaim open
代码逻辑在nfs4_open_reclaim
,发送CLAIM_PREVIOUS标记的OPEN命令给NFS Server
3.2 reclaim lock
代码逻辑在nfs4_lock_reclaim
,发送带reclaim标记的LOCK命令给NFS Server
4. Server处于non grace period
当某个NFS reclaim操作返回-NFS4ERR_NO_GRACE,client认为它目前已经结束grace period。
4.1 reclaim open
代码逻辑在nfs41_open_expired
。由于Server不在grace period,直接将这个state设置成过期,从链表中删除。
4.2 reclaim lock
代码逻辑在nfs41_lock_expired
。由于Server不在grace period,直接将这个state设置成过期,从链表中删除。
网友评论