美文网首页
NFS Client in Linux Kernel - Ses

NFS Client in Linux Kernel - Ses

作者: 帆子_8c3a | 来源:发表于2019-03-13 19:49 被阅读0次

1. EXCHANGE_ID

在创建session之前,要先发这个operation。将client_owner4转换成64bit的clientid ,作为client_owner的shorthand。此逻辑封装在nfs4_proc_exchange_id

struct client_owner4 {
        verifier4       co_verifier;//client重启后会变化
        opaque          co_ownerid<NFS4_OPAQUE_LIMIT>;//client重启后不会变化
};
  • co_verifier从nfs4_init_boot_verifier中获得,重启后此值变化
  • co_ownerid从nfs4_init_uniform_client_string中获得,重启后此值不变化
    下面的内核log打印出co_ownerid
[77666.150517] NFS call  exchange_id auth=UNIX, 'Linux NFSv4.1 ubuntu-xenial'

2. CREATE_SESSION

被封装在nfs4_proc_create_session中。CREATE_SESSION是对EXCHANGE_ID的confirm,并同时获得session id。

3. SEQUENCE

在NFS4.1,每个compound RPC的第一个operation必须是SEQUENCE,其中带着seqid和session id。
nfs41_proc_reclaim_complete为例,其它的COMPOUND RPC类似。

  1. 它的rpc_call_prepare为nfs4_reclaim_complete_prepare,其中调用nfs41_setup_sequence。它主要工作是从session中分配slot和seqid。
  2. 它的编解码函数分别为nfs4_xdr_enc_reclaim_completenfs4_xdr_dec_reclaim_complete。在编解码的时候,加入sequence的编解码,如encode_sequencedecode_sequence

4. 获得Session

static inline struct nfs4_session *nfs4_get_session(const struct nfs_server *server)
{
    return server->nfs_client->cl_session;
}

5. EOS - Exactly Once Semantics

Sever端通过session id + seq id判断是否处理过改结果,如果处理过则从cache中返回。对于Client端完全感知不到。

6. Session过期

当Session过期后,调用nfs4_schedule_state_manager。此函数会触发nfs4_state_manager,可以理解为一个简单的状态机,将EXCHANGE_ID、CREATE_SESSION、RECLAIM_COMPLETE等操作再做一遍。状态机运行完,session重新连接完毕。

7. Session Trunking

当Server和Client通过两个以上连接时候,使用同一个Session。代码逻辑发生在nfs41_discover_server_trunking

7.1 用第一个连接mount时

  1. 调用nfs4_proc_exchange_id,发送EXCHANGE_ID,Server返回client id。
  2. 调用nfs41_walk_client_list,查看是否以前有不同连接,但有相同session的Client对象。
  3. 因为是第一次,所以肯定没有。则发送CREATE_SESSION,建立session。

7.2用第二个连接mount时

  1. 调用nfs4_proc_exchange_id,发送EXCHANGE_ID,Server返回client id。
  2. 调用nfs41_walk_client_list,查看是否以前有不同连接,但有相同session的Client对象。
  3. 因为是第二次,所以有。这次不发CREATE_SESSION。
  4. 因为没有创建session,会触发nfs4_reset_session,先发送DESTROY_SESSION给Server。
  5. Server返回NFS4ERR_CONN_NOT_BOUND_TO_SESSION错误码。
  6. Client根据这个错误码,发送BIND_CONN_TO_SESSION给Server。至此,第一次连接的mount使用上一个连接的session。
    (恢复session的逻辑类似这个,发送BIND_CONN_TO_SESSION,而非CREATE_SESSION)

相关文章

网友评论

      本文标题:NFS Client in Linux Kernel - Ses

      本文链接:https://www.haomeiwen.com/subject/yvgtmqtx.html