Whamcloud - gitweb
1f5999ab49f10346aa8ea0a10884b759984d1389
[doc/protocol.git] / ptlrpc_body.txt
1 Ptlrpc_body - The Lustre RPC Descriptor
2 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
3 [[struct-ptlrpc-body]]
4
5 Every Lustre message starts with both the above header and an
6 additional set of fields (in its first "buffer") given by the 'struct
7 ptlrpc_body_v3' structure. This preamble has information information
8 relevant to every RPC type. In particular, the RPC type is itself
9 encoded in the 'pb_opc' Lustre operation number. The value of that
10 opcode, as well as whether it is an RPC 'request' or 'reply',
11 determines what else will be in the message following the preamble.
12 ----
13 #define PTLRPC_NUM_VERSIONS     4
14 #define JOBSTATS_JOBID_SIZE     32
15 struct ptlrpc_body {
16     struct lustre_handle pb_handle;
17     __u32 pb_type;
18     __u32 pb_version;
19     __u32 pb_opc;
20     __u32 pb_status;
21     __u64 pb_last_xid;
22     __u64 pb_last_seen;
23     __u64 pb_last_committed;
24     __u64 pb_transno;
25     __u32 pb_flags;
26     __u32 pb_op_flags;
27     __u32 pb_conn_cnt;
28     __u32 pb_timeout;
29     __u32 pb_service_time;
30     __u32 pb_limit;
31     __u64 pb_slv;
32     __u64 pb_pre_versions[PTLRPC_NUM_VERSIONS];
33     __u64 pb_padding[4];
34     char  pb_jobid[JOBSTATS_JOBID_SIZE];
35 };
36 ----
37
38 In a connection request, sent by a client to a server and regarding a
39 specific target, the 'pb_handle' is 0. In the reply to a connection
40 request, sent by the target, the handle is a value uniquely
41 identifying the target. Subsequent messages between this client and
42 this target will use this handle to to gain access to their shared
43 state. The handle is persistent across client reconnects to the same
44 instance of the server, but if the client unmounts the filesystem or
45 is evicted then it must re-connect as a new client.
46
47 The 'pb_type' is PTL_RPC_MSG_REQUEST in messages when they are
48 initiated, it is PTL_RPC_MSG_REPLY in a reply, and it is
49 PTL_RPC_MSG_ERR in a reply to convey that a message was received that
50 could not be interpreted, that is, if it was corrupt or
51 incomplete. The encoding of those type values is given by:
52 ----
53 #define PTL_RPC_MSG_REQUEST 4711
54 #define PTL_RPC_MSG_ERR     4712
55 #define PTL_RPC_MSG_REPLY   4713
56 ----
57 The 'pb_type' = PTL_RPC_MSG_ERR is only for message handling errors.
58 This may be a message that failed to be interpreted as an actual
59 message, or it may indicate some more general problem with the
60 connection between the client and the target. Note that other errors,
61 such as those that emerge from processing the actual message content,
62 do not use the PTL_RPC_MSG_ERR type.
63
64 The 'pb_status' field provides an error return code, if any, for the
65 RPC. When 'pb_type' = PTL_RPC_MSG_ERR the 'pb_status' will also be
66 set to one of the following message handling errors:
67
68 .format
69 [options="header"]
70 |====
71 | pb_type          | pb_status | if
72 | PTL_RPC_MSG_ERR  | -ENOMEM    | No memory for reply buffer
73 | PTL_RPC_MSG_ERR  | -ENOTSUPP  | Invalid opcode
74 | PTL_RPC_MSG_ERR  | -EINVAL    | Bad magic or version
75 | PTL_RPC_MSG_ERR  | -EPROTO    | Request is malformed or cannot be
76                                   processed in current context
77 |====
78
79 A PTL_RPC_MSG_ERR message does not need to allocate memory, so it
80 should normally be sent as a reply even if there is not enough memory
81 to allocate the normal reply buffer, unless the underlying network
82 transport itself cannot allocate memory to send it. (fixme: and what
83 happens then?)
84
85 In most cases there is a reply with 'pb_type' = PTL_RPC_MSG_REPLY,
86 indicating that the request was processed, but it may still have
87 'pb_status' set to a non-zero value to indicate that the request
88 encountered an error during processing (see below).  This may indicate
89 something very specific to the particular RPC, but it may also be a
90 very general sort of error. Those that are specific to particular RPCs
91 will be documented with the respective RPCs, and those that are more
92 generic are listed here:
93
94 .format
95 [options="header"]
96 |====
97 | pb_type            | pb_status    | meaning
98 | PTL_RPC_MSG_REPLY  | -ENOTCONN    | Client is not connected to the
99                                       target, typically meaning the
100                                       server was restarted or the
101                                       client was evicted, and the
102                                       client needs to reconnect.
103 | PTL_RPC_MSG_REPLY  | -EINPROGRESS | The request cannot be processed
104                                       currently due to some other
105                                       factor, such as during initial
106                                       mount, a delay contacting the
107                                       quota master during a write, or
108                                       LFSCK rebuilding the OI table,
109                                       but the client should continue
110                                       to retry after a delay until
111                                       interrupted or successful.  This
112                                       avoids blocking the server
113                                       threads with client requests
114                                       that cannot currently be
115                                       processed, but other requests
116                                       might be processed in the
117                                       meantime.
118 | PTL_RPC_MSG_REPLY  | -ESHUTDOWN   | The server is being stopped and
119                                       no new connections are allowed.
120 |====
121
122 The significance of -ENOTCONN is discussed more fully in
123 <<connection>>, but a brief comment may be useful here. The networking
124 layers supporting the exchange of RPCs can be in good working order
125 when 'pb_status' = -ENOTCONN is returned in an RPC reply message. The
126 connection refered to by that status is the Lustre connection. That
127 connection is part of the shared state between Lustre clients and
128 servers that gets established via MDS_CONNECT and OST_CONNECT RPCs,
129 and can be lost due to an 'eviction'. So, even when that Lusre
130 connection is lost (or has not been established, yet), RPC messages
131 can be exchanged.
132
133 The 'pb_version' identifies the version of the Lustre protocol and is
134 derived from the following constants. The lower two bytes give the
135 version of PtlRPC being employed in the message, and the upper two
136 bytes encode the role of the host for the service being
137 requested. That role is one of OBD, MDS, OST, DLM, LOG, or MGS.
138 ----
139 #define PTLRPC_MSG_VERSION  0x00000003
140 #define LUSTRE_VERSION_MASK 0xffff0000
141 #define LUSTRE_OBD_VERSION  0x00010000
142 #define LUSTRE_MDS_VERSION  0x00020000
143 #define LUSTRE_OST_VERSION  0x00030000
144 #define LUSTRE_DLM_VERSION  0x00040000
145 #define LUSTRE_LOG_VERSION  0x00050000
146 #define LUSTRE_MGS_VERSION  0x00060000
147 ----
148
149 The 'pb_opc' value (operation code) gives the actual Lustre operation
150 that is the subject of this message. For example, MDS_CONNECT is a
151 Lustre operation (number 38). The following list gives the name used
152 and the value for each operation.
153 ----
154 typedef enum {
155     OST_REPLY                       =  0,
156     OST_GETATTR                     =  1,
157     <<ost-setattr-rpc,OST_SETATTR>>                     =  2,
158     OST_READ                        =  3,
159     OST_WRITE                       =  4,
160     OST_CREATE                      =  5,
161     OST_DESTROY                     =  6,
162     OST_GET_INFO                    =  7,
163     <<ost-connect-rpc,OST_CONNECT>>                     =  8,
164     <<ost-connect-rpc,OST_DISCONNECT>>                  =  9,
165     OST_PUNCH                       = 10,
166     OST_OPEN                        = 11,
167     OST_CLOSE                       = 12,
168     OST_STATFS                      = 13,
169     OST_SYNC                        = 16,
170     OST_SET_INFO                    = 17,
171     OST_QUOTACHECK                  = 18,
172     OST_QUOTACTL                    = 19,
173     OST_QUOTA_ADJUST_QUNIT          = 20,
174
175     <<mds-getattr-rpc,MDS_GETATTR>>                     = 33,
176     MDS_GETATTR_NAME                = 34,
177     MDS_CLOSE                       = 35,
178     MDS_REINT                       = 36,
179     MDS_READPAGE                    = 37,
180     <<mds-connect-rpc,MDS_CONNECT>>                     = 38,
181     <<mds-disconnect,MDS_DISCONNECT>>                  = 39,
182     <<mds-getstatus-rpc,MDS_GETSTATUS>>                   = 40,
183     <mds-statfs-rpc,MDS_STATFS>>                      = 41,
184     MDS_PIN                         = 42,
185     MDS_UNPIN                       = 43,
186     MDS_SYNC                        = 44,
187     MDS_DONE_WRITING                = 45,
188     MDS_SET_INFO                    = 46,
189     MDS_QUOTACHECK                  = 47,
190     MDS_QUOTACTL                    = 48,
191     <<mds-getxattr-rpc,MDS_GETXATTR>>                    = 49,
192     MDS_SETXATTR                    = 50,
193     MDS_WRITEPAGE                   = 51,
194     MDS_IS_SUBDIR                   = 52,
195     MDS_GET_INFO                    = 53,
196     MDS_HSM_STATE_GET               = 54,
197     MDS_HSM_STATE_SET               = 55,
198     MDS_HSM_ACTION                  = 56,
199     MDS_HSM_PROGRESS                = 57,
200     MDS_HSM_REQUEST                 = 58,
201     MDS_HSM_CT_REGISTER             = 59,
202     MDS_HSM_CT_UNREGISTER           = 60,
203     MDS_SWAP_LAYOUTS                = 61,
204
205     <<ldlm-enqueue-rpc,LDLM_ENQUEUE>>                    = 101,
206     LDLM_CONVERT                    = 102,
207     <ldlm-cancel-rpc,LDLM_CANCEL>>                     = 103,
208     <ldlm_bl_callback-rpc,LDLM_BL_CALLBACK>>                = 104,
209     <ldlm-cp-callback-rpc,LDLM_CP_CALLBACK>>                = 105,
210     LDLM_GL_CALLBACK                = 106,
211     LDLM_SET_INFO                   = 107,
212
213     <<mgs-connect-rpc,MGS_CONNECT>>                     = 250,
214     <<mgs-disconnect-rpc,MGS_DISCONNECT>>                  = 251,
215     MGS_EXCEPTION                   = 252,
216     MGS_TARGET_REG                  = 253,
217     MGS_TARGET_DEL                  = 254,
218     MGS_SET_INFO                    = 255,
219     <<mgs-config-read-rpc,MGS_CONFIG_READ>>                 = 256,
220
221     OBD_PING                        = 400,
222     OBD_LOG_CANCEL                  = 401,
223     OBD_QC_CALLBACK                 = 402,
224     OBD_IDX_READ                    = 403,
225
226     <<llog-origin-handle-create-rpc,LLOG_ORIGIN_HANDLE_CREATE>>       = 501,
227     <<llog-origin-handle-next-block,LLOG_ORIGIN_HANDLE_NEXT_BLOCK>>   = 502,
228     <<llog-origin-handle-read-header,LLOG_ORIGIN_HANDLE_READ_HEADER>>  = 503,
229     LLOG_ORIGIN_HANDLE_WRITE_REC    = 504,
230     LLOG_ORIGIN_HANDLE_CLOSE        = 505,
231     LLOG_ORIGIN_CONNECT             = 506,
232     LLOG_ORIGIN_HANDLE_PREV_BLOCK   = 508,
233     LLOG_ORIGIN_HANDLE_DESTROY      = 509,
234
235     QUOTA_DQACQ                     = 601,
236     QUOTA_DQREL                     = 602,
237
238     SEQ_QUERY                       = 700,
239
240     SEC_CTX_INIT                    = 801,
241     SEC_CTX_INIT_CONT               = 802,
242     SEC_CTX_FINI                    = 803,
243
244     FLD_QUERY                       = 900,
245     FLD_READ                        = 901,
246
247     UPDATE_OBJ                      = 1000
248 } cmd_t;
249 ----
250 The symbols and values above identify the operations Lustre uses in
251 its protocol. They are examined in detail in the
252 <<lustre-prcs,Lustre RPCs>> section. Lustre carries out
253 each of these operations via the exchange of a pair of messages: a
254 request and a reply.
255
256 The 'pb_status' field was already mentioned above in conjuction with
257 the 'pb_type' field in replies.  In a request message 'pb_status' is
258 set to the 'pid' of the process making the request. In a reply
259 message, a zero indicates that the service successfully initiated the
260 requested operation. When an error is being reported the value will
261 encode a standard Linux kernel (POSIX) error code as initially
262 defined for the i386/x86_64 architecture. The 'pb_status' value is
263 returned as a negative number, so for example, a permissions error
264 would be indicated as -EPERM.
265
266 'pb_last_xid' and 'pb_last_seen' are not used.
267
268 The 'pb_last_committed' value is always zero in a request. In a reply
269 it is the highest transaction number that has been committed to
270 storage. The transaction numbers are maintained on a per-target basis
271 and each series of transaction numbers is a strictly increasing
272 sequence for modifications originating from any client. This field is
273 set in any kind of reply message including pings and non-modifying
274 transactions. If 'pb_last_committed' is larger than, or equal to, any
275 of the client's uncommitted requests (see 'pb_transno' below) then the
276 server is confirming those requests have been committed to stable
277 storage. At that point the client will free the request structures.
278
279 The 'pb_transno' value is always zero in a new request. It is also
280 zero for replies to operations that do not modify the file system. For
281 replies to operations that do modify the file system it is the
282 target-unique, server-assigned transaction number for the client
283 request.  The 'pb_transno' assigned to each modifying request is in
284 strictly increasing order, but may not be sequential for a single
285 client, and the client may receive replies in a different order than
286 they were processed by the server.Upon receipt of the reply, the
287 client copies this transaction number from 'pb_transno' of the reply
288 to 'pb_transno' of the saved request.  If 'pb_transno' is larger than
289 'pb_last_commited' (above) then the request has only been processed at
290 the target and is not yet committed to stable storage.  The client
291 must save the request for later resend to the server in case the
292 target fails before the modification can be committed to disk.If the
293 request has to be replayed it will include the transaction number.
294
295 The 'pb_flags' value governs the client state machine. Fixme: document
296 what the states and transitions are of this state machine. Currently,
297 only the bottom two bytes are used, and they encode state according to
298 the following values:
299 ----
300 #define MSG_GEN_FLAG_MASK     0x0000ffff
301 #define MSG_LAST_REPLAY           0x0001
302 #define MSG_RESENT                0x0002
303 #define MSG_REPLAY                0x0004
304 #define MSG_DELAY_REPLAY          0x0010
305 #define MSG_VERSION_REPLAY        0x0020
306 #define MSG_REQ_REPLAY_DONE       0x0040
307 #define MSG_LOCK_REPLAY_DONE      0x0080
308 ----
309
310 MGS_LAST_REPLAY is currently unused. It had been used to indicate that
311 this is the last RPC request to be replayed by this client during
312 recovery.  MGS_LAST_REPLAY has been replaced by MSG_REQ_REPLAY_DONE
313 and MSG_LOCK_REPLAY_DONE.
314
315 MGS_RESENT is set when this RPC request is being resent because no
316 reply was received.
317
318 MGS_REPLAY indicates this RPC request is being replayed after the
319 client received a reply but before it was committed to storage.  The
320 'pb_transno' field holds the server-assigned transaction number.
321
322 MGS_DELAY_REPLAY is currently unused.
323
324 MSG_VERSION_REPLAY indicates that a replayed request has
325 pb_pre_versions[] filled with the prior object versions and can be
326 used with Version Based Recovery.
327
328 MSG_LOCK_REPLAY_DONE indicates the client has completed lock replay,
329 and is ready to finish recovery.
330
331 The 'pb_op_flags' values are specific to a particular 'pb_opc', but
332 are currently only used by the *_CONNECT RPCs.The 'pb_op_flags' value
333 for connect operations governs the client connection status state
334 machine.
335
336 ----
337 #define MSG_CONNECT_RECOVERING  0x00000001
338 #define MSG_CONNECT_RECONNECT   0x00000002
339 #define MSG_CONNECT_REPLAYABLE  0x00000004
340 #define MSG_CONNECT_LIBCLIENT   0x00000010
341 #define MSG_CONNECT_INITIAL     0x00000020
342 #define MSG_CONNECT_ASYNC       0x00000040
343 #define MSG_CONNECT_NEXT_VER    0x00000080
344 #define MSG_CONNECT_TRANSNO     0x00000100
345 ----
346
347 MGS_CONNECT_RECOVERING indicate the server is in recovery
348
349 MGS_CONNECT_RECONNECT indicates the client is reconnecting after
350 non-responsiveness from the server.
351
352 MGS_CONNECT_REPLAYABLE indicates the server connection supports RPC
353 replay (only OSTs support non-recoverable connections, but that is not
354 the default).
355
356 The MGS_CONNECT_LIBCLIENT is for the a 'liblustre' client. It is
357 currently unused.
358
359 The client sends MGS_CONNECT_INITIAL the first time the client is
360 connecting to the server.  MSG_CONNECT_INITIAL connections are not
361 allowed during server recovery.
362
363 MGS_CONNECT_ASYNC is currently unused.
364
365 MSG_CONNECT_NEXT_VER indicates that the client can understand the next
366 higher protocol version, and the server can reply to the connect with
367 that RPC version if it is supported, otherwise it will reply with the
368 same RPC version as the request.  This allows RPC protocol versions to
369 be negotiated during a transition period (e.g. upgrade from RPC from
370 LUSTRE_MSG_MAGIC_V1 to LUSTRE_MSG_MAGIC_V2).
371
372 In normal operation an initial request to connect will set
373 'pb_op_flags' to MSG_CONNECT_INITIAL (in some earlier versions
374 MSG_CONNECT_NEXT_VER was mistakenly included, though it did no
375 harm). The reply to that connection request (and all other,
376 non-connect, requests and replies) will set 'pb_op_flags' to 0.
377
378 The 'pb_conn_cnt' (connection count) value in a request message
379 reports the client's "era", which is part of the client and server's
380 shared state. The value of the era is initialized to one when it is
381 first connected to the MDT. Each subsequent connection (after an
382 eviction) increments the era for the client. Since the 'pb_conn_cnt'
383 reflects the client's era at the time the message was composed the
384 server can use this value to discard late-arriving messages requesting
385 operations on out-of-date shared state.
386
387 The 'pb_timeout' value in a request indicates how long (in seconds)
388 the requester plans to wait before timing out the operation. That is,
389 the corresponding reply for this message should arrive within this
390 time frame. The service may extend this time frame via an "early
391 reply", which is a reply to this message that notifies the requester
392 that it should extend its timeout interval by the value of the
393 'pb_timeout' field in the reply. The "early reply" does not indicate
394 the operation has actually been initiated.  Clients maintain multiple
395 request queues, called "portals", and each type of operation is
396 assigned to one of these queues. There is a timeout value associated
397 with each queue, and the timeout update affects all the messages
398 associated with the given queue, not just the specific message that
399 initiated the request. Finally, in a reply message (one that does
400 indicate the operation has been initiated) the timeout value updates
401 the timeout interval for the queue. Is this last point different from
402 the "early reply" update?
403
404 The 'pb_service_time' value is zero in a request. In a reply it
405 indicates how long this particular operation actually took from the
406 time it first arrived in the request queue (at the service) to the
407 time the server replied. Note that the client can use this value and
408 the local elapsed time for the operation to calculate network latency.
409
410 The 'pb_limit' value is zero in a request. In a reply it is a value
411 sent from a lock service to a client to set the maximum number of
412 locks available to the client. When dynamic lock LRU's are enabled
413 this allows for managing the size of the LRU.
414
415 The 'pb_slv' value is zero in a request. On a DLM service, the "server
416 lock volume" is a value that characterizes (estimates) the amount of
417 traffic, or load, on that lock service. It is calculated as the
418 product of the number of locks and their age. In a reply, the 'pb_slv'
419 value indicates to the client the available share of the total lock
420 load on the server that the client is allowed to consume. The client
421 is then responsible for reducing its number or (or age) of locks to
422 stay within this limit.
423
424 The array of 'pb_pre_versions' values has four entries. They are
425 always zero in a new request message. They are also zero in replies to
426 operations that do not modify the file system. For an operation that
427 does modify the file system, the reply encodes the most recent
428 transaction numbers for the objects modified by this operation, and
429 the 'pb_pre_versions' values are copied into the original request when
430 the reply arrives. If the request needs to be replayed then the
431 updated 'pb_pre_versions' values accompany the replayed request.
432
433 'pb_padding' is reserved for future use.
434
435 The 'pb_jobid' (string) value gives a unique identifier associated
436 with the process on behalf of which this message was generated. The
437 identifier is assigned to the user process by a job scheduler, if any.