Whamcloud - gitweb
- added LNET self test (landing b_self_test).
[fs/lustre-release.git] / lnet / utils / lstclient.c
1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=8:tabstop=8:
3  * 
4  * Author: Liang Zhen <liangzhen@clusterfs.com>
5  *
6  * This file is part of Lustre, http://www.lustre.org
7  */
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <getopt.h>
11 #include <errno.h>
12 #include <pwd.h>
13 #include <lnet/lnetctl.h>
14 #include <lnet/lnetst.h>
15 #include "../selftest/rpc.h"
16 #include "../selftest/selftest.h"
17
18 static int lstjn_stopping = 0;
19 static int lstjn_intialized = 0;
20
21 unsigned int libcfs_subsystem_debug = ~0 - (S_LNET | S_LND);
22 unsigned int libcfs_debug = 0;
23
24 extern int sfw_session_removed(void);
25
26 static struct option lstjn_options[] =
27 {
28         {"sesid",   required_argument,  0, 's' },
29         {"group",   required_argument,  0, 'g' },
30         {0,         0,                  0,  0  }
31 };
32
33 void
34 lstjn_stop (int sig)
35 {
36         lstjn_stopping = 1;
37 }
38
39 void
40 lstjn_rpc_done(srpc_client_rpc_t *rpc)
41 {
42         if (!lstjn_intialized)
43                 lstjn_intialized = 1;
44 }
45
46 int
47 lstjn_join_session(char *ses, char *grp)
48 {
49         lnet_process_id_t  sesid;
50         srpc_client_rpc_t *rpc;
51         srpc_join_reqst_t *req;
52         srpc_join_reply_t *rep;
53         srpc_mksn_reqst_t *sreq;
54         srpc_mksn_reply_t *srep;
55         int                rc;
56
57         sesid.nid = libcfs_str2nid(ses);
58         sesid.pid = LUSTRE_LNET_PID;
59
60         rpc = sfw_create_rpc(sesid, SRPC_SERVICE_JOIN, 0,
61                              0, lstjn_rpc_done, NULL);
62         if (rpc == NULL) {
63                 fprintf(stderr, "Out of memory\n");
64                 return -1;
65         }
66
67         req = &rpc->crpc_reqstmsg.msg_body.join_reqst;
68
69         req->join_sid = LST_INVALID_SID;
70         strncpy(req->join_group, grp, LST_NAME_SIZE);
71
72         sfw_post_rpc(rpc);
73
74         for (;;) {
75                 rc = selftest_wait_events();
76
77                 if (lstjn_intialized)
78                         break;
79         }
80
81         if (rpc->crpc_status != 0) {
82                 fprintf(stderr, "Failed to send RPC to console: %s\n",
83                         strerror(rpc->crpc_status));
84                 srpc_client_rpc_decref(rpc);
85                 return -1;
86         }
87
88         sfw_unpack_message(&rpc->crpc_replymsg);
89
90         rep = &rpc->crpc_replymsg.msg_body.join_reply;
91         if (rep->join_status != 0) {
92                 fprintf(stderr, "Can't join session %s group %s: %s\n",
93                         ses, grp, strerror(rep->join_status));
94                 srpc_client_rpc_decref(rpc);
95                 return -1;
96         }
97
98         sreq = &rpc->crpc_reqstmsg.msg_body.mksn_reqst;
99         sreq->mksn_sid     = rep->join_sid;
100         sreq->mksn_force   = 0;
101         strcpy(sreq->mksn_name, rep->join_session);
102
103         srep = &rpc->crpc_replymsg.msg_body.mksn_reply;
104
105         rc = sfw_make_session(sreq, srep);
106         if (rc != 0 || srep->mksn_status != 0) {
107                 fprintf(stderr, "Can't create session: %d, %s\n",
108                         rc, strerror(srep->mksn_status));
109                 srpc_client_rpc_decref(rpc);
110                 return -1;
111         }
112
113         fprintf(stdout, "Session %s, ID: %s, %Lu\n",
114                 ses, libcfs_nid2str(rep->join_sid.ses_nid),
115                 rep->join_sid.ses_stamp);
116
117         srpc_client_rpc_decref(rpc);
118
119         return 0;
120 }
121
122 int
123 main(int argc, char **argv)
124 {
125         char   *ses = NULL;
126         char   *grp = NULL;
127         int     optidx;
128         int     c;
129         int     rc;
130
131         while (1) {
132                 c = getopt_long(argc, argv, "s:g:",
133                                 lstjn_options, &optidx);
134
135                 if (c == -1)
136                         break;
137
138                 switch (c) {
139                 case 's':
140                         ses = optarg;
141                         break;
142                 case 'g':
143                         grp = optarg;
144                         break;
145                 default:
146                         fprintf(stderr,
147                                 "Usage: lstclient --sesid ID --group GROUP\n");
148                         return -1;
149                 }
150         }
151
152         if (optind != argc || grp == NULL || ses == NULL) {
153                 fprintf(stderr, "Usage: lstclient --sesid ID --group GROUP\n");
154                 return -1;
155         }
156
157         rc = libcfs_debug_init(5 * 1024 * 1024);
158         if (rc != 0) {
159                 CERROR("libcfs_debug_init() failed: %d\n", rc);
160                 return -1;
161         }
162
163         rc = LNetInit();
164         if (rc != 0) {
165                 CERROR("LNetInit() failed: %d\n", rc);
166                 libcfs_debug_cleanup();
167                 return -1;
168         }
169
170         rc = lnet_selftest_init();
171         if (rc != 0) {
172                 fprintf(stderr, "Can't startup selftest\n");
173                 LNetFini();
174                 libcfs_debug_cleanup();
175
176                 return -1;
177         }
178         
179         rc = lstjn_join_session(ses, grp);
180         if (rc != 0)
181                 goto out;
182
183         signal(SIGINT, lstjn_stop);
184
185         fprintf(stdout, "Start handling selftest requests, Ctl-C to stop\n");
186
187         while (!lstjn_stopping) {
188                 selftest_wait_events();
189
190                 if (!sfw_session_removed())
191                         continue;
192
193                 fprintf(stdout, "Session ended\n");
194                 break;
195         }
196
197 out:
198         lnet_selftest_fini();
199
200         LNetFini();
201
202         libcfs_debug_cleanup();
203
204         return rc;
205 }