Whamcloud - gitweb
Branch HEAD
[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 static struct option lstjn_options[] =
25 {
26         {"sesid",       required_argument,  0, 's' },
27         {"group",       required_argument,  0, 'g' },
28         {"server_mode", no_argument,        0, 'm' },
29         {0,             0,                  0,  0  }
30 };
31
32 void
33 lstjn_stop (int sig)
34 {
35         lstjn_stopping = 1;
36 }
37
38 void
39 lstjn_rpc_done(srpc_client_rpc_t *rpc)
40 {
41         if (!lstjn_intialized)
42                 lstjn_intialized = 1;
43 }
44
45 int
46 lstjn_join_session(char *ses, char *grp)
47 {
48         lnet_process_id_t  sesid;
49         srpc_client_rpc_t *rpc;
50         srpc_join_reqst_t *req;
51         srpc_join_reply_t *rep;
52         srpc_mksn_reqst_t *sreq;
53         srpc_mksn_reply_t *srep;
54         int                rc;
55
56         sesid.pid = LUSTRE_LNET_PID;
57         sesid.nid = libcfs_str2nid(ses);
58         if (sesid.nid == LNET_NID_ANY) {
59                 fprintf(stderr, "Invalid session NID: %s\n", ses);
60                 return -1;
61         }
62
63         rpc = sfw_create_rpc(sesid, SRPC_SERVICE_JOIN, 0,
64                              0, lstjn_rpc_done, NULL);
65         if (rpc == NULL) {
66                 fprintf(stderr, "Out of memory\n");
67                 return -1;
68         }
69
70         req = &rpc->crpc_reqstmsg.msg_body.join_reqst;
71
72         req->join_sid = LST_INVALID_SID;
73         strncpy(req->join_group, grp, LST_NAME_SIZE);
74
75         sfw_post_rpc(rpc);
76
77         for (;;) {
78                 rc = selftest_wait_events();
79
80                 if (lstjn_intialized)
81                         break;
82         }
83
84         if (rpc->crpc_status != 0) {
85                 fprintf(stderr, "Failed to send RPC to console: %s\n",
86                         strerror(rpc->crpc_status));
87                 srpc_client_rpc_decref(rpc);
88                 return -1;
89         }
90
91         sfw_unpack_message(&rpc->crpc_replymsg);
92
93         rep = &rpc->crpc_replymsg.msg_body.join_reply;
94         if (rep->join_status != 0) {
95                 fprintf(stderr, "Can't join session %s group %s: %s\n",
96                         ses, grp, strerror(rep->join_status));
97                 srpc_client_rpc_decref(rpc);
98                 return -1;
99         }
100
101         sreq = &rpc->crpc_reqstmsg.msg_body.mksn_reqst;
102         sreq->mksn_sid     = rep->join_sid;
103         sreq->mksn_force   = 0;
104         strcpy(sreq->mksn_name, rep->join_session);
105
106         srep = &rpc->crpc_replymsg.msg_body.mksn_reply;
107
108         rc = sfw_make_session(sreq, srep);
109         if (rc != 0 || srep->mksn_status != 0) {
110                 fprintf(stderr, "Can't create session: %d, %s\n",
111                         rc, strerror(srep->mksn_status));
112                 srpc_client_rpc_decref(rpc);
113                 return -1;
114         }
115
116         fprintf(stdout, "Session %s, ID: %s, %Lu\n",
117                 ses, libcfs_nid2str(rep->join_sid.ses_nid),
118                 rep->join_sid.ses_stamp);
119
120         srpc_client_rpc_decref(rpc);
121
122         return 0;
123 }
124
125 int
126 main(int argc, char **argv)
127 {
128         char   *ses = NULL;
129         char   *grp = NULL;
130         int     server_mode_flag = 0;
131         int     optidx;
132         int     c;
133         int     rc;
134
135         const char *usage_string =
136                 "Usage: lstclient --sesid ID --group GROUP [--server_mode]\n";
137
138         while (1) {
139                 c = getopt_long(argc, argv, "s:g:m",
140                                 lstjn_options, &optidx);
141
142                 if (c == -1)
143                         break;
144
145                 switch (c) {
146                 case 's':
147                         ses = optarg;
148                         break;
149                 case 'g':
150                         grp = optarg;
151                         break;
152                 case 'm':
153                         server_mode_flag = 1;
154                         break;
155                 default:
156                         fprintf(stderr, usage_string);
157                         return -1;
158                 }
159         }
160
161         if (optind != argc || grp == NULL || ses == NULL) {
162                 fprintf(stderr, usage_string);
163                 return -1;
164         }
165
166         rc = libcfs_debug_init(5 * 1024 * 1024);
167         if (rc != 0) {
168                 CERROR("libcfs_debug_init() failed: %d\n", rc);
169                 return -1;
170         }
171
172         rc = LNetInit();
173         if (rc != 0) {
174                 CERROR("LNetInit() failed: %d\n", rc);
175                 libcfs_debug_cleanup();
176                 return -1;
177         }
178
179         if (server_mode_flag)
180                 lnet_server_mode();
181
182         rc = lnet_selftest_init();
183         if (rc != 0) {
184                 fprintf(stderr, "Can't startup selftest\n");
185                 LNetFini();
186                 libcfs_debug_cleanup();
187
188                 return -1;
189         }
190
191         rc = lstjn_join_session(ses, grp);
192         if (rc != 0)
193                 goto out;
194
195         signal(SIGINT, lstjn_stop);
196
197         fprintf(stdout, "Start handling selftest requests, Ctl-C to stop\n");
198
199         while (!lstjn_stopping) {
200                 selftest_wait_events();
201
202                 if (!sfw_session_removed())
203                         continue;
204
205                 fprintf(stdout, "Session ended\n");
206                 break;
207         }
208
209 out:
210         lnet_selftest_fini();
211
212         LNetFini();
213
214         libcfs_debug_cleanup();
215
216         return rc;
217 }