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