1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
4 * Author: Liang Zhen <liangzhen@clusterfs.com>
6 * This file is part of Lustre, http://www.lustre.org
13 #include <lnet/lnetctl.h>
14 #include <lnet/lnetst.h>
15 #include "../selftest/rpc.h"
16 #include "../selftest/selftest.h"
18 static int lstjn_stopping = 0;
19 static int lstjn_intialized = 0;
21 unsigned int libcfs_subsystem_debug = ~0 - (S_LNET | S_LND);
22 unsigned int libcfs_debug = 0;
24 static struct option lstjn_options[] =
26 {"sesid", required_argument, 0, 's' },
27 {"group", required_argument, 0, 'g' },
28 {"server_mode", no_argument, 0, 'm' },
39 lstjn_rpc_done(srpc_client_rpc_t *rpc)
41 if (!lstjn_intialized)
46 lstjn_join_session(char *ses, char *grp)
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;
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);
63 rpc = sfw_create_rpc(sesid, SRPC_SERVICE_JOIN, 0,
64 0, lstjn_rpc_done, NULL);
66 fprintf(stderr, "Out of memory\n");
70 req = &rpc->crpc_reqstmsg.msg_body.join_reqst;
72 req->join_sid = LST_INVALID_SID;
73 strncpy(req->join_group, grp, LST_NAME_SIZE);
78 rc = selftest_wait_events();
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);
91 sfw_unpack_message(&rpc->crpc_replymsg);
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);
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);
106 srep = &rpc->crpc_replymsg.msg_body.mksn_reply;
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);
116 fprintf(stdout, "Session %s, ID: %s, %Lu\n",
117 ses, libcfs_nid2str(rep->join_sid.ses_nid),
118 rep->join_sid.ses_stamp);
120 srpc_client_rpc_decref(rpc);
126 main(int argc, char **argv)
130 int server_mode_flag = 0;
135 const char *usage_string =
136 "Usage: lstclient --sesid ID --group GROUP [--server_mode]\n";
139 c = getopt_long(argc, argv, "s:g:m",
140 lstjn_options, &optidx);
153 server_mode_flag = 1;
156 fprintf(stderr, usage_string);
161 if (optind != argc || grp == NULL || ses == NULL) {
162 fprintf(stderr, usage_string);
166 rc = libcfs_debug_init(5 * 1024 * 1024);
168 CERROR("libcfs_debug_init() failed: %d\n", rc);
174 CERROR("LNetInit() failed: %d\n", rc);
175 libcfs_debug_cleanup();
179 if (server_mode_flag)
182 rc = lnet_selftest_init();
184 fprintf(stderr, "Can't startup selftest\n");
186 libcfs_debug_cleanup();
191 rc = lstjn_join_session(ses, grp);
195 signal(SIGINT, lstjn_stop);
197 fprintf(stdout, "Start handling selftest requests, Ctl-C to stop\n");
199 while (!lstjn_stopping) {
200 selftest_wait_events();
202 if (!sfw_session_removed())
205 fprintf(stdout, "Session ended\n");
210 lnet_selftest_fini();
214 libcfs_debug_cleanup();