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