File: | rpc/rpc-lib/src/rpc-clnt.c |
Location: | line 193, column 17 |
Description: | Function call argument is an uninitialized value |
1 | /* | |||
2 | Copyright (c) 2008-2012 Red Hat, Inc. <http://www.redhat.com> | |||
3 | This file is part of GlusterFS. | |||
4 | ||||
5 | This file is licensed to you under your choice of the GNU Lesser | |||
6 | General Public License, version 3 or any later version (LGPLv3 or | |||
7 | later), or the GNU General Public License, version 2 (GPLv2), in all | |||
8 | cases as published by the Free Software Foundation. | |||
9 | */ | |||
10 | ||||
11 | ||||
12 | #ifndef _CONFIG_H | |||
13 | #define _CONFIG_H | |||
14 | #include "config.h" | |||
15 | #endif | |||
16 | ||||
17 | #define RPC_CLNT_DEFAULT_REQUEST_COUNT512 512 | |||
18 | ||||
19 | #include "rpc-clnt.h" | |||
20 | #include "byte-order.h" | |||
21 | #include "xdr-rpcclnt.h" | |||
22 | #include "rpc-transport.h" | |||
23 | #include "protocol-common.h" | |||
24 | #include "mem-pool.h" | |||
25 | #include "xdr-rpc.h" | |||
26 | #include "rpc-common-xdr.h" | |||
27 | ||||
28 | void | |||
29 | rpc_clnt_reply_deinit (struct rpc_req *req, struct mem_pool *pool); | |||
30 | ||||
31 | uint64_t | |||
32 | rpc_clnt_new_callid (struct rpc_clnt *clnt) | |||
33 | { | |||
34 | uint64_t callid = 0; | |||
35 | ||||
36 | pthread_mutex_lock (&clnt->lock); | |||
37 | { | |||
38 | callid = ++clnt->xid; | |||
39 | } | |||
40 | pthread_mutex_unlock (&clnt->lock); | |||
41 | ||||
42 | return callid; | |||
43 | } | |||
44 | ||||
45 | ||||
46 | struct saved_frame * | |||
47 | __saved_frames_get_timedout (struct saved_frames *frames, uint32_t timeout, | |||
48 | struct timeval *current) | |||
49 | { | |||
50 | struct saved_frame *bailout_frame = NULL((void*)0), *tmp = NULL((void*)0); | |||
51 | ||||
52 | if (!list_empty(&frames->sf.list)) { | |||
53 | tmp = list_entry (frames->sf.list.next, typeof (*tmp), list)((typeof (*tmp) *)((char *)(frames->sf.list.next)-(unsigned long)(&((typeof (*tmp) *)0)->list))); | |||
54 | if ((tmp->saved_at.tv_sec + timeout) < current->tv_sec) { | |||
55 | bailout_frame = tmp; | |||
56 | list_del_init (&bailout_frame->list); | |||
57 | frames->count--; | |||
58 | } | |||
59 | } | |||
60 | ||||
61 | return bailout_frame; | |||
62 | } | |||
63 | ||||
64 | static int | |||
65 | _is_lock_fop (struct saved_frame *sframe) | |||
66 | { | |||
67 | int fop = 0; | |||
68 | ||||
69 | if (SFRAME_GET_PROGNUM (sframe)(sframe->rpcreq->prog->prognum) == GLUSTER_FOP_PROGRAM1298437 && | |||
70 | SFRAME_GET_PROGVER (sframe)(sframe->rpcreq->prog->progver) == GLUSTER_FOP_VERSION330) | |||
71 | fop = SFRAME_GET_PROCNUM (sframe)(sframe->rpcreq->procnum); | |||
72 | ||||
73 | return ((fop == GFS3_OP_LK) || | |||
74 | (fop == GFS3_OP_INODELK) || | |||
75 | (fop == GFS3_OP_FINODELK) || | |||
76 | (fop == GFS3_OP_ENTRYLK) || | |||
77 | (fop == GFS3_OP_FENTRYLK)); | |||
78 | } | |||
79 | ||||
80 | struct saved_frame * | |||
81 | __saved_frames_put (struct saved_frames *frames, void *frame, | |||
82 | struct rpc_req *rpcreq) | |||
83 | { | |||
84 | struct saved_frame *saved_frame = NULL((void*)0); | |||
85 | ||||
86 | saved_frame = mem_get (rpcreq->conn->rpc_clnt->saved_frames_pool); | |||
87 | if (!saved_frame) { | |||
88 | goto out; | |||
89 | } | |||
90 | /* THIS should be saved and set back */ | |||
91 | ||||
92 | memset (saved_frame, 0, sizeof (*saved_frame)); | |||
93 | INIT_LIST_HEAD (&saved_frame->list)do { (&saved_frame->list)->next = (&saved_frame ->list)->prev = &saved_frame->list; } while (0); | |||
94 | ||||
95 | saved_frame->capital_this = THIS(*__glusterfs_this_location()); | |||
96 | saved_frame->frame = frame; | |||
97 | saved_frame->rpcreq = rpcreq; | |||
98 | gettimeofday (&saved_frame->saved_at, NULL((void*)0)); | |||
99 | ||||
100 | if (_is_lock_fop (saved_frame)) | |||
101 | list_add_tail (&saved_frame->list, &frames->lk_sf.list); | |||
102 | else | |||
103 | list_add_tail (&saved_frame->list, &frames->sf.list); | |||
104 | ||||
105 | frames->count++; | |||
106 | ||||
107 | out: | |||
108 | return saved_frame; | |||
109 | } | |||
110 | ||||
111 | ||||
112 | void | |||
113 | saved_frames_delete (struct saved_frame *saved_frame, | |||
114 | rpc_clnt_connection_t *conn) | |||
115 | { | |||
116 | GF_VALIDATE_OR_GOTO ("rpc-clnt", saved_frame, out)do { if (!saved_frame) { (*__errno_location ()) = 22; do { do { if (0) printf ("invalid argument: " "saved_frame"); } while (0); _gf_log_callingfn ("rpc-clnt", "rpc-clnt.c", __FUNCTION__ , 116, GF_LOG_ERROR, "invalid argument: " "saved_frame"); } while (0); goto out; } } while (0); | |||
117 | GF_VALIDATE_OR_GOTO ("rpc-clnt", conn, out)do { if (!conn) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "conn"); } while (0); _gf_log_callingfn ("rpc-clnt", "rpc-clnt.c", __FUNCTION__, 117, GF_LOG_ERROR, "invalid argument: " "conn"); } while (0); goto out; } } while (0); | |||
118 | ||||
119 | pthread_mutex_lock (&conn->lock); | |||
120 | { | |||
121 | list_del_init (&saved_frame->list); | |||
122 | conn->saved_frames->count--; | |||
123 | } | |||
124 | pthread_mutex_unlock (&conn->lock); | |||
125 | ||||
126 | if (saved_frame->rpcreq != NULL((void*)0)) { | |||
127 | rpc_clnt_reply_deinit (saved_frame->rpcreq, | |||
128 | conn->rpc_clnt->reqpool); | |||
129 | } | |||
130 | ||||
131 | mem_put (saved_frame); | |||
132 | out: | |||
133 | return; | |||
134 | } | |||
135 | ||||
136 | ||||
137 | static void | |||
138 | call_bail (void *data) | |||
139 | { | |||
140 | struct rpc_clnt *clnt = NULL((void*)0); | |||
141 | rpc_clnt_connection_t *conn = NULL((void*)0); | |||
142 | struct timeval current; | |||
143 | struct list_head list; | |||
144 | struct saved_frame *saved_frame = NULL((void*)0); | |||
145 | struct saved_frame *trav = NULL((void*)0); | |||
146 | struct saved_frame *tmp = NULL((void*)0); | |||
147 | char frame_sent[256] = {0,}; | |||
148 | struct timeval timeout = {0,}; | |||
149 | struct iovec iov = {0,}; | |||
150 | ||||
151 | GF_VALIDATE_OR_GOTO ("client", data, out)do { if (!data) { (*__errno_location ()) = 22; do { do { if ( 0) printf ("invalid argument: " "data"); } while (0); _gf_log_callingfn ("client", "rpc-clnt.c", __FUNCTION__, 151, GF_LOG_ERROR, "invalid argument: " "data"); } while (0); goto out; } } while (0); | |||
152 | ||||
153 | clnt = data; | |||
154 | ||||
155 | conn = &clnt->conn; | |||
156 | ||||
157 | gettimeofday (¤t, NULL((void*)0)); | |||
158 | INIT_LIST_HEAD (&list)do { (&list)->next = (&list)->prev = &list; } while (0); | |||
159 | ||||
160 | pthread_mutex_lock (&conn->lock); | |||
161 | { | |||
162 | /* Chaining to get call-always functionality from | |||
163 | call-once timer */ | |||
164 | if (conn->timer) { | |||
| ||||
165 | timeout.tv_sec = 10; | |||
166 | timeout.tv_usec = 0; | |||
167 | ||||
168 | gf_timer_call_cancel (clnt->ctx, conn->timer); | |||
169 | conn->timer = gf_timer_call_after (clnt->ctx, | |||
170 | timeout, | |||
171 | call_bail, | |||
172 | (void *) clnt); | |||
173 | ||||
174 | if (conn->timer == NULL((void*)0)) { | |||
175 | gf_log (conn->trans->name, GF_LOG_WARNING,do { do { if (0) printf ("Cannot create bailout timer"); } while (0); _gf_log (conn->trans->name, "rpc-clnt.c", __FUNCTION__ , 176, GF_LOG_WARNING, "Cannot create bailout timer"); } while (0) | |||
176 | "Cannot create bailout timer")do { do { if (0) printf ("Cannot create bailout timer"); } while (0); _gf_log (conn->trans->name, "rpc-clnt.c", __FUNCTION__ , 176, GF_LOG_WARNING, "Cannot create bailout timer"); } while (0); | |||
177 | } | |||
178 | } | |||
179 | ||||
180 | do { | |||
181 | saved_frame = | |||
182 | __saved_frames_get_timedout (conn->saved_frames, | |||
183 | conn->frame_timeout, | |||
184 | ¤t); | |||
185 | if (saved_frame) | |||
186 | list_add (&saved_frame->list, &list); | |||
187 | ||||
188 | } while (saved_frame); | |||
189 | } | |||
190 | pthread_mutex_unlock (&conn->lock); | |||
191 | ||||
192 | list_for_each_entry_safe (trav, tmp, &list, list)for (trav = ((typeof(*trav) *)((char *)((&list)->next) -(unsigned long)(&((typeof(*trav) *)0)->list))), tmp = ((typeof(*trav) *)((char *)(trav->list.next)-(unsigned long )(&((typeof(*trav) *)0)->list))); &trav->list != (&list); trav = tmp, tmp = ((typeof(*tmp) *)((char *)(tmp ->list.next)-(unsigned long)(&((typeof(*tmp) *)0)-> list)))) { | |||
193 | gf_time_fmt (frame_sent, sizeof frame_sent, | |||
| ||||
194 | trav->saved_at.tv_sec, gf_timefmt_FT); | |||
195 | snprintf (frame_sent + strlen (frame_sent), | |||
196 | 256 - strlen (frame_sent), | |||
197 | ".%"GF_PRI_SUSECONDS"06ld", trav->saved_at.tv_usec); | |||
198 | ||||
199 | gf_log (conn->trans->name, GF_LOG_ERROR,do { do { if (0) printf ("bailing out frame type(%s) op(%s(%d)) xid = 0x%ux " "sent = %s. timeout = %d", trav->rpcreq->prog->progname , (trav->rpcreq->prog->procnames) ? trav->rpcreq-> prog->procnames[trav->rpcreq->procnum] : "--", trav-> rpcreq->procnum, trav->rpcreq->xid, frame_sent, conn ->frame_timeout); } while (0); _gf_log (conn->trans-> name, "rpc-clnt.c", __FUNCTION__, 207, GF_LOG_ERROR, "bailing out frame type(%s) op(%s(%d)) xid = 0x%ux " "sent = %s. timeout = %d", trav->rpcreq->prog->progname , (trav->rpcreq->prog->procnames) ? trav->rpcreq-> prog->procnames[trav->rpcreq->procnum] : "--", trav-> rpcreq->procnum, trav->rpcreq->xid, frame_sent, conn ->frame_timeout); } while (0) | |||
200 | "bailing out frame type(%s) op(%s(%d)) xid = 0x%ux "do { do { if (0) printf ("bailing out frame type(%s) op(%s(%d)) xid = 0x%ux " "sent = %s. timeout = %d", trav->rpcreq->prog->progname , (trav->rpcreq->prog->procnames) ? trav->rpcreq-> prog->procnames[trav->rpcreq->procnum] : "--", trav-> rpcreq->procnum, trav->rpcreq->xid, frame_sent, conn ->frame_timeout); } while (0); _gf_log (conn->trans-> name, "rpc-clnt.c", __FUNCTION__, 207, GF_LOG_ERROR, "bailing out frame type(%s) op(%s(%d)) xid = 0x%ux " "sent = %s. timeout = %d", trav->rpcreq->prog->progname , (trav->rpcreq->prog->procnames) ? trav->rpcreq-> prog->procnames[trav->rpcreq->procnum] : "--", trav-> rpcreq->procnum, trav->rpcreq->xid, frame_sent, conn ->frame_timeout); } while (0) | |||
201 | "sent = %s. timeout = %d",do { do { if (0) printf ("bailing out frame type(%s) op(%s(%d)) xid = 0x%ux " "sent = %s. timeout = %d", trav->rpcreq->prog->progname , (trav->rpcreq->prog->procnames) ? trav->rpcreq-> prog->procnames[trav->rpcreq->procnum] : "--", trav-> rpcreq->procnum, trav->rpcreq->xid, frame_sent, conn ->frame_timeout); } while (0); _gf_log (conn->trans-> name, "rpc-clnt.c", __FUNCTION__, 207, GF_LOG_ERROR, "bailing out frame type(%s) op(%s(%d)) xid = 0x%ux " "sent = %s. timeout = %d", trav->rpcreq->prog->progname , (trav->rpcreq->prog->procnames) ? trav->rpcreq-> prog->procnames[trav->rpcreq->procnum] : "--", trav-> rpcreq->procnum, trav->rpcreq->xid, frame_sent, conn ->frame_timeout); } while (0) | |||
202 | trav->rpcreq->prog->progname,do { do { if (0) printf ("bailing out frame type(%s) op(%s(%d)) xid = 0x%ux " "sent = %s. timeout = %d", trav->rpcreq->prog->progname , (trav->rpcreq->prog->procnames) ? trav->rpcreq-> prog->procnames[trav->rpcreq->procnum] : "--", trav-> rpcreq->procnum, trav->rpcreq->xid, frame_sent, conn ->frame_timeout); } while (0); _gf_log (conn->trans-> name, "rpc-clnt.c", __FUNCTION__, 207, GF_LOG_ERROR, "bailing out frame type(%s) op(%s(%d)) xid = 0x%ux " "sent = %s. timeout = %d", trav->rpcreq->prog->progname , (trav->rpcreq->prog->procnames) ? trav->rpcreq-> prog->procnames[trav->rpcreq->procnum] : "--", trav-> rpcreq->procnum, trav->rpcreq->xid, frame_sent, conn ->frame_timeout); } while (0) | |||
203 | (trav->rpcreq->prog->procnames) ?do { do { if (0) printf ("bailing out frame type(%s) op(%s(%d)) xid = 0x%ux " "sent = %s. timeout = %d", trav->rpcreq->prog->progname , (trav->rpcreq->prog->procnames) ? trav->rpcreq-> prog->procnames[trav->rpcreq->procnum] : "--", trav-> rpcreq->procnum, trav->rpcreq->xid, frame_sent, conn ->frame_timeout); } while (0); _gf_log (conn->trans-> name, "rpc-clnt.c", __FUNCTION__, 207, GF_LOG_ERROR, "bailing out frame type(%s) op(%s(%d)) xid = 0x%ux " "sent = %s. timeout = %d", trav->rpcreq->prog->progname , (trav->rpcreq->prog->procnames) ? trav->rpcreq-> prog->procnames[trav->rpcreq->procnum] : "--", trav-> rpcreq->procnum, trav->rpcreq->xid, frame_sent, conn ->frame_timeout); } while (0) | |||
204 | trav->rpcreq->prog->procnames[trav->rpcreq->procnum] :do { do { if (0) printf ("bailing out frame type(%s) op(%s(%d)) xid = 0x%ux " "sent = %s. timeout = %d", trav->rpcreq->prog->progname , (trav->rpcreq->prog->procnames) ? trav->rpcreq-> prog->procnames[trav->rpcreq->procnum] : "--", trav-> rpcreq->procnum, trav->rpcreq->xid, frame_sent, conn ->frame_timeout); } while (0); _gf_log (conn->trans-> name, "rpc-clnt.c", __FUNCTION__, 207, GF_LOG_ERROR, "bailing out frame type(%s) op(%s(%d)) xid = 0x%ux " "sent = %s. timeout = %d", trav->rpcreq->prog->progname , (trav->rpcreq->prog->procnames) ? trav->rpcreq-> prog->procnames[trav->rpcreq->procnum] : "--", trav-> rpcreq->procnum, trav->rpcreq->xid, frame_sent, conn ->frame_timeout); } while (0) | |||
205 | "--",do { do { if (0) printf ("bailing out frame type(%s) op(%s(%d)) xid = 0x%ux " "sent = %s. timeout = %d", trav->rpcreq->prog->progname , (trav->rpcreq->prog->procnames) ? trav->rpcreq-> prog->procnames[trav->rpcreq->procnum] : "--", trav-> rpcreq->procnum, trav->rpcreq->xid, frame_sent, conn ->frame_timeout); } while (0); _gf_log (conn->trans-> name, "rpc-clnt.c", __FUNCTION__, 207, GF_LOG_ERROR, "bailing out frame type(%s) op(%s(%d)) xid = 0x%ux " "sent = %s. timeout = %d", trav->rpcreq->prog->progname , (trav->rpcreq->prog->procnames) ? trav->rpcreq-> prog->procnames[trav->rpcreq->procnum] : "--", trav-> rpcreq->procnum, trav->rpcreq->xid, frame_sent, conn ->frame_timeout); } while (0) | |||
206 | trav->rpcreq->procnum, trav->rpcreq->xid, frame_sent,do { do { if (0) printf ("bailing out frame type(%s) op(%s(%d)) xid = 0x%ux " "sent = %s. timeout = %d", trav->rpcreq->prog->progname , (trav->rpcreq->prog->procnames) ? trav->rpcreq-> prog->procnames[trav->rpcreq->procnum] : "--", trav-> rpcreq->procnum, trav->rpcreq->xid, frame_sent, conn ->frame_timeout); } while (0); _gf_log (conn->trans-> name, "rpc-clnt.c", __FUNCTION__, 207, GF_LOG_ERROR, "bailing out frame type(%s) op(%s(%d)) xid = 0x%ux " "sent = %s. timeout = %d", trav->rpcreq->prog->progname , (trav->rpcreq->prog->procnames) ? trav->rpcreq-> prog->procnames[trav->rpcreq->procnum] : "--", trav-> rpcreq->procnum, trav->rpcreq->xid, frame_sent, conn ->frame_timeout); } while (0) | |||
207 | conn->frame_timeout)do { do { if (0) printf ("bailing out frame type(%s) op(%s(%d)) xid = 0x%ux " "sent = %s. timeout = %d", trav->rpcreq->prog->progname , (trav->rpcreq->prog->procnames) ? trav->rpcreq-> prog->procnames[trav->rpcreq->procnum] : "--", trav-> rpcreq->procnum, trav->rpcreq->xid, frame_sent, conn ->frame_timeout); } while (0); _gf_log (conn->trans-> name, "rpc-clnt.c", __FUNCTION__, 207, GF_LOG_ERROR, "bailing out frame type(%s) op(%s(%d)) xid = 0x%ux " "sent = %s. timeout = %d", trav->rpcreq->prog->progname , (trav->rpcreq->prog->procnames) ? trav->rpcreq-> prog->procnames[trav->rpcreq->procnum] : "--", trav-> rpcreq->procnum, trav->rpcreq->xid, frame_sent, conn ->frame_timeout); } while (0); | |||
208 | ||||
209 | clnt = rpc_clnt_ref (clnt); | |||
210 | trav->rpcreq->rpc_status = -1; | |||
211 | trav->rpcreq->cbkfn (trav->rpcreq, &iov, 1, trav->frame); | |||
212 | ||||
213 | rpc_clnt_reply_deinit (trav->rpcreq, clnt->reqpool); | |||
214 | clnt = rpc_clnt_unref (clnt); | |||
215 | list_del_init (&trav->list); | |||
216 | mem_put (trav); | |||
217 | } | |||
218 | out: | |||
219 | return; | |||
220 | } | |||
221 | ||||
222 | ||||
223 | /* to be called with conn->lock held */ | |||
224 | struct saved_frame * | |||
225 | __save_frame (struct rpc_clnt *rpc_clnt, call_frame_t *frame, | |||
226 | struct rpc_req *rpcreq) | |||
227 | { | |||
228 | rpc_clnt_connection_t *conn = NULL((void*)0); | |||
229 | struct timeval timeout = {0, }; | |||
230 | struct saved_frame *saved_frame = NULL((void*)0); | |||
231 | ||||
232 | conn = &rpc_clnt->conn; | |||
233 | ||||
234 | saved_frame = __saved_frames_put (conn->saved_frames, frame, rpcreq); | |||
235 | ||||
236 | if (saved_frame == NULL((void*)0)) { | |||
237 | goto out; | |||
238 | } | |||
239 | ||||
240 | /* TODO: make timeout configurable */ | |||
241 | if (conn->timer == NULL((void*)0)) { | |||
242 | timeout.tv_sec = 10; | |||
243 | timeout.tv_usec = 0; | |||
244 | conn->timer = gf_timer_call_after (rpc_clnt->ctx, | |||
245 | timeout, | |||
246 | call_bail, | |||
247 | (void *) rpc_clnt); | |||
248 | } | |||
249 | ||||
250 | out: | |||
251 | return saved_frame; | |||
252 | } | |||
253 | ||||
254 | ||||
255 | struct saved_frames * | |||
256 | saved_frames_new (void) | |||
257 | { | |||
258 | struct saved_frames *saved_frames = NULL((void*)0); | |||
259 | ||||
260 | saved_frames = GF_CALLOC (1, sizeof (*saved_frames),__gf_calloc (1, sizeof (*saved_frames), gf_common_mt_rpcclnt_savedframe_t ) | |||
261 | gf_common_mt_rpcclnt_savedframe_t)__gf_calloc (1, sizeof (*saved_frames), gf_common_mt_rpcclnt_savedframe_t ); | |||
262 | if (!saved_frames) { | |||
263 | return NULL((void*)0); | |||
264 | } | |||
265 | ||||
266 | INIT_LIST_HEAD (&saved_frames->sf.list)do { (&saved_frames->sf.list)->next = (&saved_frames ->sf.list)->prev = &saved_frames->sf.list; } while (0); | |||
267 | INIT_LIST_HEAD (&saved_frames->lk_sf.list)do { (&saved_frames->lk_sf.list)->next = (&saved_frames ->lk_sf.list)->prev = &saved_frames->lk_sf.list; } while (0); | |||
268 | ||||
269 | return saved_frames; | |||
270 | } | |||
271 | ||||
272 | ||||
273 | int | |||
274 | __saved_frame_copy (struct saved_frames *frames, int64_t callid, | |||
275 | struct saved_frame *saved_frame) | |||
276 | { | |||
277 | struct saved_frame *tmp = NULL((void*)0); | |||
278 | int ret = -1; | |||
279 | ||||
280 | if (!saved_frame) { | |||
281 | ret = 0; | |||
282 | goto out; | |||
283 | } | |||
284 | ||||
285 | list_for_each_entry (tmp, &frames->sf.list, list)for (tmp = ((typeof(*tmp) *)((char *)((&frames->sf.list )->next)-(unsigned long)(&((typeof(*tmp) *)0)->list ))); &tmp->list != (&frames->sf.list); tmp = (( typeof(*tmp) *)((char *)(tmp->list.next)-(unsigned long)(& ((typeof(*tmp) *)0)->list)))) { | |||
286 | if (tmp->rpcreq->xid == callid) { | |||
287 | *saved_frame = *tmp; | |||
288 | ret = 0; | |||
289 | goto out; | |||
290 | } | |||
291 | } | |||
292 | ||||
293 | list_for_each_entry (tmp, &frames->lk_sf.list, list)for (tmp = ((typeof(*tmp) *)((char *)((&frames->lk_sf. list)->next)-(unsigned long)(&((typeof(*tmp) *)0)-> list))); &tmp->list != (&frames->lk_sf.list); tmp = ((typeof(*tmp) *)((char *)(tmp->list.next)-(unsigned long )(&((typeof(*tmp) *)0)->list)))) { | |||
294 | if (tmp->rpcreq->xid == callid) { | |||
295 | *saved_frame = *tmp; | |||
296 | ret = 0; | |||
297 | goto out; | |||
298 | } | |||
299 | } | |||
300 | ||||
301 | out: | |||
302 | return ret; | |||
303 | } | |||
304 | ||||
305 | ||||
306 | struct saved_frame * | |||
307 | __saved_frame_get (struct saved_frames *frames, int64_t callid) | |||
308 | { | |||
309 | struct saved_frame *saved_frame = NULL((void*)0); | |||
310 | struct saved_frame *tmp = NULL((void*)0); | |||
311 | ||||
312 | list_for_each_entry (tmp, &frames->sf.list, list)for (tmp = ((typeof(*tmp) *)((char *)((&frames->sf.list )->next)-(unsigned long)(&((typeof(*tmp) *)0)->list ))); &tmp->list != (&frames->sf.list); tmp = (( typeof(*tmp) *)((char *)(tmp->list.next)-(unsigned long)(& ((typeof(*tmp) *)0)->list)))) { | |||
313 | if (tmp->rpcreq->xid == callid) { | |||
314 | list_del_init (&tmp->list); | |||
315 | frames->count--; | |||
316 | saved_frame = tmp; | |||
317 | goto out; | |||
318 | } | |||
319 | } | |||
320 | ||||
321 | list_for_each_entry (tmp, &frames->lk_sf.list, list)for (tmp = ((typeof(*tmp) *)((char *)((&frames->lk_sf. list)->next)-(unsigned long)(&((typeof(*tmp) *)0)-> list))); &tmp->list != (&frames->lk_sf.list); tmp = ((typeof(*tmp) *)((char *)(tmp->list.next)-(unsigned long )(&((typeof(*tmp) *)0)->list)))) { | |||
322 | if (tmp->rpcreq->xid == callid) { | |||
323 | list_del_init (&tmp->list); | |||
324 | frames->count--; | |||
325 | saved_frame = tmp; | |||
326 | goto out; | |||
327 | } | |||
328 | } | |||
329 | ||||
330 | out: | |||
331 | if (saved_frame) { | |||
332 | THIS(*__glusterfs_this_location()) = saved_frame->capital_this; | |||
333 | } | |||
334 | ||||
335 | return saved_frame; | |||
336 | } | |||
337 | ||||
338 | ||||
339 | void | |||
340 | saved_frames_unwind (struct saved_frames *saved_frames) | |||
341 | { | |||
342 | struct saved_frame *trav = NULL((void*)0); | |||
343 | struct saved_frame *tmp = NULL((void*)0); | |||
344 | char timestr[1024] = {0,}; | |||
345 | struct iovec iov = {0,}; | |||
346 | ||||
347 | list_splice_init (&saved_frames->lk_sf.list, &saved_frames->sf.list); | |||
348 | ||||
349 | list_for_each_entry_safe (trav, tmp, &saved_frames->sf.list, list)for (trav = ((typeof(*trav) *)((char *)((&saved_frames-> sf.list)->next)-(unsigned long)(&((typeof(*trav) *)0)-> list))), tmp = ((typeof(*trav) *)((char *)(trav->list.next )-(unsigned long)(&((typeof(*trav) *)0)->list))); & trav->list != (&saved_frames->sf.list); trav = tmp, tmp = ((typeof(*tmp) *)((char *)(tmp->list.next)-(unsigned long)(&((typeof(*tmp) *)0)->list)))) { | |||
350 | gf_time_fmt (timestr, sizeof timestr, | |||
351 | trav->saved_at.tv_sec, gf_timefmt_FT); | |||
352 | snprintf (timestr + strlen (timestr), | |||
353 | sizeof(timestr) - strlen (timestr), | |||
354 | ".%"GF_PRI_SUSECONDS"06ld", trav->saved_at.tv_usec); | |||
355 | ||||
356 | if (!trav->rpcreq || !trav->rpcreq->prog) | |||
357 | continue; | |||
358 | ||||
359 | gf_log_callingfn (trav->rpcreq->conn->trans->name,do { do { if (0) printf ("forced unwinding frame type(%s) op(%s(%d)) " "called at %s (xid=0x%ux)", trav->rpcreq->prog->progname , ((trav->rpcreq->prog->procnames) ? trav->rpcreq ->prog->procnames[trav->rpcreq->procnum] : "--"), trav->rpcreq->procnum, timestr, trav->rpcreq->xid ); } while (0); _gf_log_callingfn (trav->rpcreq->conn-> trans->name, "rpc-clnt.c", __FUNCTION__, 368, GF_LOG_ERROR , "forced unwinding frame type(%s) op(%s(%d)) " "called at %s (xid=0x%ux)" , trav->rpcreq->prog->progname, ((trav->rpcreq-> prog->procnames) ? trav->rpcreq->prog->procnames[ trav->rpcreq->procnum] : "--"), trav->rpcreq->procnum , timestr, trav->rpcreq->xid); } while (0) | |||
360 | GF_LOG_ERROR,do { do { if (0) printf ("forced unwinding frame type(%s) op(%s(%d)) " "called at %s (xid=0x%ux)", trav->rpcreq->prog->progname , ((trav->rpcreq->prog->procnames) ? trav->rpcreq ->prog->procnames[trav->rpcreq->procnum] : "--"), trav->rpcreq->procnum, timestr, trav->rpcreq->xid ); } while (0); _gf_log_callingfn (trav->rpcreq->conn-> trans->name, "rpc-clnt.c", __FUNCTION__, 368, GF_LOG_ERROR , "forced unwinding frame type(%s) op(%s(%d)) " "called at %s (xid=0x%ux)" , trav->rpcreq->prog->progname, ((trav->rpcreq-> prog->procnames) ? trav->rpcreq->prog->procnames[ trav->rpcreq->procnum] : "--"), trav->rpcreq->procnum , timestr, trav->rpcreq->xid); } while (0) | |||
361 | "forced unwinding frame type(%s) op(%s(%d)) "do { do { if (0) printf ("forced unwinding frame type(%s) op(%s(%d)) " "called at %s (xid=0x%ux)", trav->rpcreq->prog->progname , ((trav->rpcreq->prog->procnames) ? trav->rpcreq ->prog->procnames[trav->rpcreq->procnum] : "--"), trav->rpcreq->procnum, timestr, trav->rpcreq->xid ); } while (0); _gf_log_callingfn (trav->rpcreq->conn-> trans->name, "rpc-clnt.c", __FUNCTION__, 368, GF_LOG_ERROR , "forced unwinding frame type(%s) op(%s(%d)) " "called at %s (xid=0x%ux)" , trav->rpcreq->prog->progname, ((trav->rpcreq-> prog->procnames) ? trav->rpcreq->prog->procnames[ trav->rpcreq->procnum] : "--"), trav->rpcreq->procnum , timestr, trav->rpcreq->xid); } while (0) | |||
362 | "called at %s (xid=0x%ux)",do { do { if (0) printf ("forced unwinding frame type(%s) op(%s(%d)) " "called at %s (xid=0x%ux)", trav->rpcreq->prog->progname , ((trav->rpcreq->prog->procnames) ? trav->rpcreq ->prog->procnames[trav->rpcreq->procnum] : "--"), trav->rpcreq->procnum, timestr, trav->rpcreq->xid ); } while (0); _gf_log_callingfn (trav->rpcreq->conn-> trans->name, "rpc-clnt.c", __FUNCTION__, 368, GF_LOG_ERROR , "forced unwinding frame type(%s) op(%s(%d)) " "called at %s (xid=0x%ux)" , trav->rpcreq->prog->progname, ((trav->rpcreq-> prog->procnames) ? trav->rpcreq->prog->procnames[ trav->rpcreq->procnum] : "--"), trav->rpcreq->procnum , timestr, trav->rpcreq->xid); } while (0) | |||
363 | trav->rpcreq->prog->progname,do { do { if (0) printf ("forced unwinding frame type(%s) op(%s(%d)) " "called at %s (xid=0x%ux)", trav->rpcreq->prog->progname , ((trav->rpcreq->prog->procnames) ? trav->rpcreq ->prog->procnames[trav->rpcreq->procnum] : "--"), trav->rpcreq->procnum, timestr, trav->rpcreq->xid ); } while (0); _gf_log_callingfn (trav->rpcreq->conn-> trans->name, "rpc-clnt.c", __FUNCTION__, 368, GF_LOG_ERROR , "forced unwinding frame type(%s) op(%s(%d)) " "called at %s (xid=0x%ux)" , trav->rpcreq->prog->progname, ((trav->rpcreq-> prog->procnames) ? trav->rpcreq->prog->procnames[ trav->rpcreq->procnum] : "--"), trav->rpcreq->procnum , timestr, trav->rpcreq->xid); } while (0) | |||
364 | ((trav->rpcreq->prog->procnames) ?do { do { if (0) printf ("forced unwinding frame type(%s) op(%s(%d)) " "called at %s (xid=0x%ux)", trav->rpcreq->prog->progname , ((trav->rpcreq->prog->procnames) ? trav->rpcreq ->prog->procnames[trav->rpcreq->procnum] : "--"), trav->rpcreq->procnum, timestr, trav->rpcreq->xid ); } while (0); _gf_log_callingfn (trav->rpcreq->conn-> trans->name, "rpc-clnt.c", __FUNCTION__, 368, GF_LOG_ERROR , "forced unwinding frame type(%s) op(%s(%d)) " "called at %s (xid=0x%ux)" , trav->rpcreq->prog->progname, ((trav->rpcreq-> prog->procnames) ? trav->rpcreq->prog->procnames[ trav->rpcreq->procnum] : "--"), trav->rpcreq->procnum , timestr, trav->rpcreq->xid); } while (0) | |||
365 | trav->rpcreq->prog->procnames[trav->rpcreq->procnum]do { do { if (0) printf ("forced unwinding frame type(%s) op(%s(%d)) " "called at %s (xid=0x%ux)", trav->rpcreq->prog->progname , ((trav->rpcreq->prog->procnames) ? trav->rpcreq ->prog->procnames[trav->rpcreq->procnum] : "--"), trav->rpcreq->procnum, timestr, trav->rpcreq->xid ); } while (0); _gf_log_callingfn (trav->rpcreq->conn-> trans->name, "rpc-clnt.c", __FUNCTION__, 368, GF_LOG_ERROR , "forced unwinding frame type(%s) op(%s(%d)) " "called at %s (xid=0x%ux)" , trav->rpcreq->prog->progname, ((trav->rpcreq-> prog->procnames) ? trav->rpcreq->prog->procnames[ trav->rpcreq->procnum] : "--"), trav->rpcreq->procnum , timestr, trav->rpcreq->xid); } while (0) | |||
366 | : "--"),do { do { if (0) printf ("forced unwinding frame type(%s) op(%s(%d)) " "called at %s (xid=0x%ux)", trav->rpcreq->prog->progname , ((trav->rpcreq->prog->procnames) ? trav->rpcreq ->prog->procnames[trav->rpcreq->procnum] : "--"), trav->rpcreq->procnum, timestr, trav->rpcreq->xid ); } while (0); _gf_log_callingfn (trav->rpcreq->conn-> trans->name, "rpc-clnt.c", __FUNCTION__, 368, GF_LOG_ERROR , "forced unwinding frame type(%s) op(%s(%d)) " "called at %s (xid=0x%ux)" , trav->rpcreq->prog->progname, ((trav->rpcreq-> prog->procnames) ? trav->rpcreq->prog->procnames[ trav->rpcreq->procnum] : "--"), trav->rpcreq->procnum , timestr, trav->rpcreq->xid); } while (0) | |||
367 | trav->rpcreq->procnum, timestr,do { do { if (0) printf ("forced unwinding frame type(%s) op(%s(%d)) " "called at %s (xid=0x%ux)", trav->rpcreq->prog->progname , ((trav->rpcreq->prog->procnames) ? trav->rpcreq ->prog->procnames[trav->rpcreq->procnum] : "--"), trav->rpcreq->procnum, timestr, trav->rpcreq->xid ); } while (0); _gf_log_callingfn (trav->rpcreq->conn-> trans->name, "rpc-clnt.c", __FUNCTION__, 368, GF_LOG_ERROR , "forced unwinding frame type(%s) op(%s(%d)) " "called at %s (xid=0x%ux)" , trav->rpcreq->prog->progname, ((trav->rpcreq-> prog->procnames) ? trav->rpcreq->prog->procnames[ trav->rpcreq->procnum] : "--"), trav->rpcreq->procnum , timestr, trav->rpcreq->xid); } while (0) | |||
368 | trav->rpcreq->xid)do { do { if (0) printf ("forced unwinding frame type(%s) op(%s(%d)) " "called at %s (xid=0x%ux)", trav->rpcreq->prog->progname , ((trav->rpcreq->prog->procnames) ? trav->rpcreq ->prog->procnames[trav->rpcreq->procnum] : "--"), trav->rpcreq->procnum, timestr, trav->rpcreq->xid ); } while (0); _gf_log_callingfn (trav->rpcreq->conn-> trans->name, "rpc-clnt.c", __FUNCTION__, 368, GF_LOG_ERROR , "forced unwinding frame type(%s) op(%s(%d)) " "called at %s (xid=0x%ux)" , trav->rpcreq->prog->progname, ((trav->rpcreq-> prog->procnames) ? trav->rpcreq->prog->procnames[ trav->rpcreq->procnum] : "--"), trav->rpcreq->procnum , timestr, trav->rpcreq->xid); } while (0); | |||
369 | saved_frames->count--; | |||
370 | ||||
371 | trav->rpcreq->rpc_status = -1; | |||
372 | trav->rpcreq->cbkfn (trav->rpcreq, &iov, 1, trav->frame); | |||
373 | ||||
374 | rpc_clnt_reply_deinit (trav->rpcreq, | |||
375 | trav->rpcreq->conn->rpc_clnt->reqpool); | |||
376 | ||||
377 | list_del_init (&trav->list); | |||
378 | mem_put (trav); | |||
379 | } | |||
380 | } | |||
381 | ||||
382 | ||||
383 | void | |||
384 | saved_frames_destroy (struct saved_frames *frames) | |||
385 | { | |||
386 | if (!frames) | |||
387 | return; | |||
388 | ||||
389 | saved_frames_unwind (frames); | |||
390 | ||||
391 | GF_FREE (frames)__gf_free (frames); | |||
392 | } | |||
393 | ||||
394 | ||||
395 | void | |||
396 | rpc_clnt_reconnect (void *trans_ptr) | |||
397 | { | |||
398 | rpc_transport_t *trans = NULL((void*)0); | |||
399 | rpc_clnt_connection_t *conn = NULL((void*)0); | |||
400 | struct timeval tv = {0, 0}; | |||
401 | int32_t ret = 0; | |||
402 | struct rpc_clnt *clnt = NULL((void*)0); | |||
403 | ||||
404 | trans = trans_ptr; | |||
405 | if (!trans || !trans->mydata) | |||
406 | return; | |||
407 | ||||
408 | conn = trans->mydata; | |||
409 | clnt = conn->rpc_clnt; | |||
410 | ||||
411 | pthread_mutex_lock (&conn->lock); | |||
412 | { | |||
413 | if (conn->reconnect) | |||
414 | gf_timer_call_cancel (clnt->ctx, | |||
415 | conn->reconnect); | |||
416 | conn->reconnect = 0; | |||
417 | ||||
418 | if (conn->connected == 0) { | |||
419 | tv.tv_sec = 3; | |||
420 | ||||
421 | gf_log (trans->name, GF_LOG_TRACE,do { do { if (0) printf ("attempting reconnect"); } while (0) ; _gf_log (trans->name, "rpc-clnt.c", __FUNCTION__, 422, GF_LOG_TRACE , "attempting reconnect"); } while (0) | |||
422 | "attempting reconnect")do { do { if (0) printf ("attempting reconnect"); } while (0) ; _gf_log (trans->name, "rpc-clnt.c", __FUNCTION__, 422, GF_LOG_TRACE , "attempting reconnect"); } while (0); | |||
423 | ret = rpc_transport_connect (trans, | |||
424 | conn->config.remote_port); | |||
425 | conn->reconnect = | |||
426 | gf_timer_call_after (clnt->ctx, tv, | |||
427 | rpc_clnt_reconnect, | |||
428 | trans); | |||
429 | } else { | |||
430 | gf_log (trans->name, GF_LOG_TRACE,do { do { if (0) printf ("breaking reconnect chain"); } while (0); _gf_log (trans->name, "rpc-clnt.c", __FUNCTION__, 431 , GF_LOG_TRACE, "breaking reconnect chain"); } while (0) | |||
431 | "breaking reconnect chain")do { do { if (0) printf ("breaking reconnect chain"); } while (0); _gf_log (trans->name, "rpc-clnt.c", __FUNCTION__, 431 , GF_LOG_TRACE, "breaking reconnect chain"); } while (0); | |||
432 | } | |||
433 | } | |||
434 | pthread_mutex_unlock (&conn->lock); | |||
435 | ||||
436 | if ((ret == -1) && (errno(*__errno_location ()) != EINPROGRESS115) && (clnt->notifyfn)) { | |||
437 | clnt->notifyfn (clnt, clnt->mydata, RPC_CLNT_DISCONNECT, NULL((void*)0)); | |||
438 | } | |||
439 | ||||
440 | return; | |||
441 | } | |||
442 | ||||
443 | ||||
444 | int | |||
445 | rpc_clnt_fill_request_info (struct rpc_clnt *clnt, rpc_request_info_t *info) | |||
446 | { | |||
447 | struct saved_frame saved_frame; | |||
448 | int ret = -1; | |||
449 | ||||
450 | pthread_mutex_lock (&clnt->conn.lock); | |||
451 | { | |||
452 | ret = __saved_frame_copy (clnt->conn.saved_frames, info->xid, | |||
453 | &saved_frame); | |||
454 | } | |||
455 | pthread_mutex_unlock (&clnt->conn.lock); | |||
456 | ||||
457 | if (ret == -1) { | |||
458 | gf_log (clnt->conn.trans->name, GF_LOG_CRITICAL,do { do { if (0) printf ("cannot lookup the saved " "frame corresponding to xid (%d)" , info->xid); } while (0); _gf_log (clnt->conn.trans-> name, "rpc-clnt.c", __FUNCTION__, 460, GF_LOG_CRITICAL, "cannot lookup the saved " "frame corresponding to xid (%d)", info->xid); } while (0 ) | |||
459 | "cannot lookup the saved "do { do { if (0) printf ("cannot lookup the saved " "frame corresponding to xid (%d)" , info->xid); } while (0); _gf_log (clnt->conn.trans-> name, "rpc-clnt.c", __FUNCTION__, 460, GF_LOG_CRITICAL, "cannot lookup the saved " "frame corresponding to xid (%d)", info->xid); } while (0 ) | |||
460 | "frame corresponding to xid (%d)", info->xid)do { do { if (0) printf ("cannot lookup the saved " "frame corresponding to xid (%d)" , info->xid); } while (0); _gf_log (clnt->conn.trans-> name, "rpc-clnt.c", __FUNCTION__, 460, GF_LOG_CRITICAL, "cannot lookup the saved " "frame corresponding to xid (%d)", info->xid); } while (0 ); | |||
461 | goto out; | |||
462 | } | |||
463 | ||||
464 | info->prognum = saved_frame.rpcreq->prog->prognum; | |||
465 | info->procnum = saved_frame.rpcreq->procnum; | |||
466 | info->progver = saved_frame.rpcreq->prog->progver; | |||
467 | info->rpc_req = saved_frame.rpcreq; | |||
468 | info->rsp = saved_frame.rsp; | |||
469 | ||||
470 | ret = 0; | |||
471 | out: | |||
472 | return ret; | |||
473 | } | |||
474 | ||||
475 | int | |||
476 | rpc_clnt_reconnect_cleanup (rpc_clnt_connection_t *conn) | |||
477 | { | |||
478 | struct rpc_clnt *clnt = NULL((void*)0); | |||
479 | ||||
480 | if (!conn) { | |||
481 | goto out; | |||
482 | } | |||
483 | ||||
484 | clnt = conn->rpc_clnt; | |||
485 | ||||
486 | pthread_mutex_lock (&conn->lock); | |||
487 | { | |||
488 | ||||
489 | if (conn->reconnect) { | |||
490 | gf_timer_call_cancel (clnt->ctx, conn->reconnect); | |||
491 | conn->reconnect = NULL((void*)0); | |||
492 | } | |||
493 | ||||
494 | } | |||
495 | pthread_mutex_unlock (&conn->lock); | |||
496 | ||||
497 | out: | |||
498 | return 0; | |||
499 | } | |||
500 | ||||
501 | /* | |||
502 | * client_protocol_cleanup - cleanup function | |||
503 | * @trans: transport object | |||
504 | * | |||
505 | */ | |||
506 | int | |||
507 | rpc_clnt_connection_cleanup (rpc_clnt_connection_t *conn) | |||
508 | { | |||
509 | struct saved_frames *saved_frames = NULL((void*)0); | |||
510 | struct rpc_clnt *clnt = NULL((void*)0); | |||
511 | ||||
512 | if (!conn) { | |||
513 | goto out; | |||
514 | } | |||
515 | ||||
516 | clnt = conn->rpc_clnt; | |||
517 | ||||
518 | gf_log (conn->trans->name, GF_LOG_TRACE,do { do { if (0) printf ("cleaning up state in transport object %p" , conn->trans); } while (0); _gf_log (conn->trans->name , "rpc-clnt.c", __FUNCTION__, 519, GF_LOG_TRACE, "cleaning up state in transport object %p" , conn->trans); } while (0) | |||
519 | "cleaning up state in transport object %p", conn->trans)do { do { if (0) printf ("cleaning up state in transport object %p" , conn->trans); } while (0); _gf_log (conn->trans->name , "rpc-clnt.c", __FUNCTION__, 519, GF_LOG_TRACE, "cleaning up state in transport object %p" , conn->trans); } while (0); | |||
520 | ||||
521 | pthread_mutex_lock (&conn->lock); | |||
522 | { | |||
523 | saved_frames = conn->saved_frames; | |||
524 | conn->saved_frames = saved_frames_new (); | |||
525 | ||||
526 | /* bailout logic cleanup */ | |||
527 | if (conn->timer) { | |||
528 | gf_timer_call_cancel (clnt->ctx, conn->timer); | |||
529 | conn->timer = NULL((void*)0); | |||
530 | } | |||
531 | ||||
532 | conn->connected = 0; | |||
533 | ||||
534 | if (conn->ping_timer) { | |||
535 | gf_timer_call_cancel (clnt->ctx, conn->ping_timer); | |||
536 | conn->ping_timer = NULL((void*)0); | |||
537 | conn->ping_started = 0; | |||
538 | } | |||
539 | } | |||
540 | pthread_mutex_unlock (&conn->lock); | |||
541 | ||||
542 | saved_frames_destroy (saved_frames); | |||
543 | ||||
544 | out: | |||
545 | return 0; | |||
546 | } | |||
547 | ||||
548 | /* | |||
549 | * lookup_frame - lookup call frame corresponding to a given callid | |||
550 | * @trans: transport object | |||
551 | * @callid: call id of the frame | |||
552 | * | |||
553 | * not for external reference | |||
554 | */ | |||
555 | ||||
556 | static struct saved_frame * | |||
557 | lookup_frame (rpc_clnt_connection_t *conn, int64_t callid) | |||
558 | { | |||
559 | struct saved_frame *frame = NULL((void*)0); | |||
560 | ||||
561 | pthread_mutex_lock (&conn->lock); | |||
562 | { | |||
563 | frame = __saved_frame_get (conn->saved_frames, callid); | |||
564 | } | |||
565 | pthread_mutex_unlock (&conn->lock); | |||
566 | ||||
567 | return frame; | |||
568 | } | |||
569 | ||||
570 | ||||
571 | int | |||
572 | rpc_clnt_reply_fill (rpc_transport_pollin_t *msg, | |||
573 | rpc_clnt_connection_t *conn, | |||
574 | struct rpc_msg *replymsg, struct iovec progmsg, | |||
575 | struct rpc_req *req, | |||
576 | struct saved_frame *saved_frame) | |||
577 | { | |||
578 | int ret = -1; | |||
579 | ||||
580 | if ((!conn) || (!replymsg)|| (!req) || (!saved_frame) || (!msg)) { | |||
581 | goto out; | |||
582 | } | |||
583 | ||||
584 | req->rpc_status = 0; | |||
585 | if ((rpc_reply_status (replymsg)((replymsg)->ru.RM_rmb.rp_stat) == MSG_DENIED) | |||
586 | || (rpc_accepted_reply_status (replymsg)((replymsg)->ru.RM_rmb.ru.RP_ar.ar_stat) != SUCCESS)) { | |||
587 | req->rpc_status = -1; | |||
588 | } | |||
589 | ||||
590 | req->rsp[0] = progmsg; | |||
591 | req->rsp_iobref = iobref_ref (msg->iobref); | |||
592 | ||||
593 | if (msg->vectored) { | |||
594 | req->rsp[1] = msg->vector[1]; | |||
595 | req->rspcnt = 2; | |||
596 | } else { | |||
597 | req->rspcnt = 1; | |||
598 | } | |||
599 | ||||
600 | /* By this time, the data bytes for the auth scheme would have already | |||
601 | * been copied into the required sections of the req structure, | |||
602 | * we just need to fill in the meta-data about it now. | |||
603 | */ | |||
604 | if (req->rpc_status == 0) { | |||
605 | /* | |||
606 | * req->verf.flavour = rpc_reply_verf_flavour (replymsg); | |||
607 | * req->verf.datalen = rpc_reply_verf_len (replymsg); | |||
608 | */ | |||
609 | } | |||
610 | ||||
611 | ret = 0; | |||
612 | ||||
613 | out: | |||
614 | return ret; | |||
615 | } | |||
616 | ||||
617 | ||||
618 | void | |||
619 | rpc_clnt_reply_deinit (struct rpc_req *req, struct mem_pool *pool) | |||
620 | { | |||
621 | if (!req) { | |||
622 | goto out; | |||
623 | } | |||
624 | ||||
625 | if (req->rsp_iobref) { | |||
626 | iobref_unref (req->rsp_iobref); | |||
627 | } | |||
628 | ||||
629 | mem_put (req); | |||
630 | out: | |||
631 | return; | |||
632 | } | |||
633 | ||||
634 | ||||
635 | /* TODO: use mem-pool for allocating requests */ | |||
636 | int | |||
637 | rpc_clnt_reply_init (rpc_clnt_connection_t *conn, rpc_transport_pollin_t *msg, | |||
638 | struct rpc_req *req, struct saved_frame *saved_frame) | |||
639 | { | |||
640 | char *msgbuf = NULL((void*)0); | |||
641 | struct rpc_msg rpcmsg; | |||
642 | struct iovec progmsg; /* RPC Program payload */ | |||
643 | size_t msglen = 0; | |||
644 | int ret = -1; | |||
645 | ||||
646 | msgbuf = msg->vector[0].iov_base; | |||
647 | msglen = msg->vector[0].iov_len; | |||
648 | ||||
649 | ret = xdr_to_rpc_reply (msgbuf, msglen, &rpcmsg, &progmsg, | |||
650 | req->verf.authdata); | |||
651 | if (ret != 0) { | |||
652 | gf_log (conn->trans->name, GF_LOG_WARNING,do { do { if (0) printf ("RPC reply decoding failed"); } while (0); _gf_log (conn->trans->name, "rpc-clnt.c", __FUNCTION__ , 653, GF_LOG_WARNING, "RPC reply decoding failed"); } while ( 0) | |||
653 | "RPC reply decoding failed")do { do { if (0) printf ("RPC reply decoding failed"); } while (0); _gf_log (conn->trans->name, "rpc-clnt.c", __FUNCTION__ , 653, GF_LOG_WARNING, "RPC reply decoding failed"); } while ( 0); | |||
654 | goto out; | |||
655 | } | |||
656 | ||||
657 | ret = rpc_clnt_reply_fill (msg, conn, &rpcmsg, progmsg, req, | |||
658 | saved_frame); | |||
659 | if (ret != 0) { | |||
660 | goto out; | |||
661 | } | |||
662 | ||||
663 | gf_log (conn->trans->name, GF_LOG_TRACE,do { do { if (0) printf ("received rpc message (RPC XID: 0x%ux" " Program: %s, ProgVers: %d, Proc: %d) from rpc-transport (%s)" , saved_frame->rpcreq->xid, saved_frame->rpcreq-> prog->progname, saved_frame->rpcreq->prog->progver , saved_frame->rpcreq->procnum, conn->trans->name ); } while (0); _gf_log (conn->trans->name, "rpc-clnt.c" , __FUNCTION__, 669, GF_LOG_TRACE, "received rpc message (RPC XID: 0x%ux" " Program: %s, ProgVers: %d, Proc: %d) from rpc-transport (%s)" , saved_frame->rpcreq->xid, saved_frame->rpcreq-> prog->progname, saved_frame->rpcreq->prog->progver , saved_frame->rpcreq->procnum, conn->trans->name ); } while (0) | |||
664 | "received rpc message (RPC XID: 0x%ux"do { do { if (0) printf ("received rpc message (RPC XID: 0x%ux" " Program: %s, ProgVers: %d, Proc: %d) from rpc-transport (%s)" , saved_frame->rpcreq->xid, saved_frame->rpcreq-> prog->progname, saved_frame->rpcreq->prog->progver , saved_frame->rpcreq->procnum, conn->trans->name ); } while (0); _gf_log (conn->trans->name, "rpc-clnt.c" , __FUNCTION__, 669, GF_LOG_TRACE, "received rpc message (RPC XID: 0x%ux" " Program: %s, ProgVers: %d, Proc: %d) from rpc-transport (%s)" , saved_frame->rpcreq->xid, saved_frame->rpcreq-> prog->progname, saved_frame->rpcreq->prog->progver , saved_frame->rpcreq->procnum, conn->trans->name ); } while (0) | |||
665 | " Program: %s, ProgVers: %d, Proc: %d) from rpc-transport (%s)",do { do { if (0) printf ("received rpc message (RPC XID: 0x%ux" " Program: %s, ProgVers: %d, Proc: %d) from rpc-transport (%s)" , saved_frame->rpcreq->xid, saved_frame->rpcreq-> prog->progname, saved_frame->rpcreq->prog->progver , saved_frame->rpcreq->procnum, conn->trans->name ); } while (0); _gf_log (conn->trans->name, "rpc-clnt.c" , __FUNCTION__, 669, GF_LOG_TRACE, "received rpc message (RPC XID: 0x%ux" " Program: %s, ProgVers: %d, Proc: %d) from rpc-transport (%s)" , saved_frame->rpcreq->xid, saved_frame->rpcreq-> prog->progname, saved_frame->rpcreq->prog->progver , saved_frame->rpcreq->procnum, conn->trans->name ); } while (0) | |||
666 | saved_frame->rpcreq->xid,do { do { if (0) printf ("received rpc message (RPC XID: 0x%ux" " Program: %s, ProgVers: %d, Proc: %d) from rpc-transport (%s)" , saved_frame->rpcreq->xid, saved_frame->rpcreq-> prog->progname, saved_frame->rpcreq->prog->progver , saved_frame->rpcreq->procnum, conn->trans->name ); } while (0); _gf_log (conn->trans->name, "rpc-clnt.c" , __FUNCTION__, 669, GF_LOG_TRACE, "received rpc message (RPC XID: 0x%ux" " Program: %s, ProgVers: %d, Proc: %d) from rpc-transport (%s)" , saved_frame->rpcreq->xid, saved_frame->rpcreq-> prog->progname, saved_frame->rpcreq->prog->progver , saved_frame->rpcreq->procnum, conn->trans->name ); } while (0) | |||
667 | saved_frame->rpcreq->prog->progname,do { do { if (0) printf ("received rpc message (RPC XID: 0x%ux" " Program: %s, ProgVers: %d, Proc: %d) from rpc-transport (%s)" , saved_frame->rpcreq->xid, saved_frame->rpcreq-> prog->progname, saved_frame->rpcreq->prog->progver , saved_frame->rpcreq->procnum, conn->trans->name ); } while (0); _gf_log (conn->trans->name, "rpc-clnt.c" , __FUNCTION__, 669, GF_LOG_TRACE, "received rpc message (RPC XID: 0x%ux" " Program: %s, ProgVers: %d, Proc: %d) from rpc-transport (%s)" , saved_frame->rpcreq->xid, saved_frame->rpcreq-> prog->progname, saved_frame->rpcreq->prog->progver , saved_frame->rpcreq->procnum, conn->trans->name ); } while (0) | |||
668 | saved_frame->rpcreq->prog->progver,do { do { if (0) printf ("received rpc message (RPC XID: 0x%ux" " Program: %s, ProgVers: %d, Proc: %d) from rpc-transport (%s)" , saved_frame->rpcreq->xid, saved_frame->rpcreq-> prog->progname, saved_frame->rpcreq->prog->progver , saved_frame->rpcreq->procnum, conn->trans->name ); } while (0); _gf_log (conn->trans->name, "rpc-clnt.c" , __FUNCTION__, 669, GF_LOG_TRACE, "received rpc message (RPC XID: 0x%ux" " Program: %s, ProgVers: %d, Proc: %d) from rpc-transport (%s)" , saved_frame->rpcreq->xid, saved_frame->rpcreq-> prog->progname, saved_frame->rpcreq->prog->progver , saved_frame->rpcreq->procnum, conn->trans->name ); } while (0) | |||
669 | saved_frame->rpcreq->procnum, conn->trans->name)do { do { if (0) printf ("received rpc message (RPC XID: 0x%ux" " Program: %s, ProgVers: %d, Proc: %d) from rpc-transport (%s)" , saved_frame->rpcreq->xid, saved_frame->rpcreq-> prog->progname, saved_frame->rpcreq->prog->progver , saved_frame->rpcreq->procnum, conn->trans->name ); } while (0); _gf_log (conn->trans->name, "rpc-clnt.c" , __FUNCTION__, 669, GF_LOG_TRACE, "received rpc message (RPC XID: 0x%ux" " Program: %s, ProgVers: %d, Proc: %d) from rpc-transport (%s)" , saved_frame->rpcreq->xid, saved_frame->rpcreq-> prog->progname, saved_frame->rpcreq->prog->progver , saved_frame->rpcreq->procnum, conn->trans->name ); } while (0); | |||
670 | ||||
671 | out: | |||
672 | if (ret != 0) { | |||
673 | req->rpc_status = -1; | |||
674 | } | |||
675 | ||||
676 | return ret; | |||
677 | } | |||
678 | ||||
679 | int | |||
680 | rpc_clnt_handle_cbk (struct rpc_clnt *clnt, rpc_transport_pollin_t *msg) | |||
681 | { | |||
682 | char *msgbuf = NULL((void*)0); | |||
683 | rpcclnt_cb_program_t *program = NULL((void*)0); | |||
684 | struct rpc_msg rpcmsg; | |||
685 | struct iovec progmsg; /* RPC Program payload */ | |||
686 | size_t msglen = 0; | |||
687 | int found = 0; | |||
688 | int ret = -1; | |||
689 | int procnum = 0; | |||
690 | ||||
691 | msgbuf = msg->vector[0].iov_base; | |||
692 | msglen = msg->vector[0].iov_len; | |||
693 | ||||
694 | clnt = rpc_clnt_ref (clnt); | |||
695 | ret = xdr_to_rpc_call (msgbuf, msglen, &rpcmsg, &progmsg, NULL((void*)0),NULL((void*)0)); | |||
696 | if (ret == -1) { | |||
697 | gf_log (clnt->conn.trans->name, GF_LOG_WARNING,do { do { if (0) printf ("RPC call decoding failed"); } while (0); _gf_log (clnt->conn.trans->name, "rpc-clnt.c", __FUNCTION__ , 698, GF_LOG_WARNING, "RPC call decoding failed"); } while ( 0) | |||
698 | "RPC call decoding failed")do { do { if (0) printf ("RPC call decoding failed"); } while (0); _gf_log (clnt->conn.trans->name, "rpc-clnt.c", __FUNCTION__ , 698, GF_LOG_WARNING, "RPC call decoding failed"); } while ( 0); | |||
699 | goto out; | |||
700 | } | |||
701 | ||||
702 | gf_log (clnt->conn.trans->name, GF_LOG_TRACE,do { do { if (0) printf ("received rpc message (XID: 0x%lx, " "Ver: %ld, Program: %ld, ProgVers: %ld, Proc: %ld) " "from rpc-transport (%s)" , ((&rpcmsg)->rm_xid), ((&rpcmsg)->ru.RM_cmb.cb_rpcvers ), ((&rpcmsg)->ru.RM_cmb.cb_prog), ((&rpcmsg)-> ru.RM_cmb.cb_vers), ((&rpcmsg)->ru.RM_cmb.cb_proc), clnt ->conn.trans->name); } while (0); _gf_log (clnt->conn .trans->name, "rpc-clnt.c", __FUNCTION__, 708, GF_LOG_TRACE , "received rpc message (XID: 0x%lx, " "Ver: %ld, Program: %ld, ProgVers: %ld, Proc: %ld) " "from rpc-transport (%s)", ((&rpcmsg)->rm_xid), ((& rpcmsg)->ru.RM_cmb.cb_rpcvers), ((&rpcmsg)->ru.RM_cmb .cb_prog), ((&rpcmsg)->ru.RM_cmb.cb_vers), ((&rpcmsg )->ru.RM_cmb.cb_proc), clnt->conn.trans->name); } while (0) | |||
703 | "received rpc message (XID: 0x%lx, "do { do { if (0) printf ("received rpc message (XID: 0x%lx, " "Ver: %ld, Program: %ld, ProgVers: %ld, Proc: %ld) " "from rpc-transport (%s)" , ((&rpcmsg)->rm_xid), ((&rpcmsg)->ru.RM_cmb.cb_rpcvers ), ((&rpcmsg)->ru.RM_cmb.cb_prog), ((&rpcmsg)-> ru.RM_cmb.cb_vers), ((&rpcmsg)->ru.RM_cmb.cb_proc), clnt ->conn.trans->name); } while (0); _gf_log (clnt->conn .trans->name, "rpc-clnt.c", __FUNCTION__, 708, GF_LOG_TRACE , "received rpc message (XID: 0x%lx, " "Ver: %ld, Program: %ld, ProgVers: %ld, Proc: %ld) " "from rpc-transport (%s)", ((&rpcmsg)->rm_xid), ((& rpcmsg)->ru.RM_cmb.cb_rpcvers), ((&rpcmsg)->ru.RM_cmb .cb_prog), ((&rpcmsg)->ru.RM_cmb.cb_vers), ((&rpcmsg )->ru.RM_cmb.cb_proc), clnt->conn.trans->name); } while (0) | |||
704 | "Ver: %ld, Program: %ld, ProgVers: %ld, Proc: %ld) "do { do { if (0) printf ("received rpc message (XID: 0x%lx, " "Ver: %ld, Program: %ld, ProgVers: %ld, Proc: %ld) " "from rpc-transport (%s)" , ((&rpcmsg)->rm_xid), ((&rpcmsg)->ru.RM_cmb.cb_rpcvers ), ((&rpcmsg)->ru.RM_cmb.cb_prog), ((&rpcmsg)-> ru.RM_cmb.cb_vers), ((&rpcmsg)->ru.RM_cmb.cb_proc), clnt ->conn.trans->name); } while (0); _gf_log (clnt->conn .trans->name, "rpc-clnt.c", __FUNCTION__, 708, GF_LOG_TRACE , "received rpc message (XID: 0x%lx, " "Ver: %ld, Program: %ld, ProgVers: %ld, Proc: %ld) " "from rpc-transport (%s)", ((&rpcmsg)->rm_xid), ((& rpcmsg)->ru.RM_cmb.cb_rpcvers), ((&rpcmsg)->ru.RM_cmb .cb_prog), ((&rpcmsg)->ru.RM_cmb.cb_vers), ((&rpcmsg )->ru.RM_cmb.cb_proc), clnt->conn.trans->name); } while (0) | |||
705 | "from rpc-transport (%s)", rpc_call_xid (&rpcmsg),do { do { if (0) printf ("received rpc message (XID: 0x%lx, " "Ver: %ld, Program: %ld, ProgVers: %ld, Proc: %ld) " "from rpc-transport (%s)" , ((&rpcmsg)->rm_xid), ((&rpcmsg)->ru.RM_cmb.cb_rpcvers ), ((&rpcmsg)->ru.RM_cmb.cb_prog), ((&rpcmsg)-> ru.RM_cmb.cb_vers), ((&rpcmsg)->ru.RM_cmb.cb_proc), clnt ->conn.trans->name); } while (0); _gf_log (clnt->conn .trans->name, "rpc-clnt.c", __FUNCTION__, 708, GF_LOG_TRACE , "received rpc message (XID: 0x%lx, " "Ver: %ld, Program: %ld, ProgVers: %ld, Proc: %ld) " "from rpc-transport (%s)", ((&rpcmsg)->rm_xid), ((& rpcmsg)->ru.RM_cmb.cb_rpcvers), ((&rpcmsg)->ru.RM_cmb .cb_prog), ((&rpcmsg)->ru.RM_cmb.cb_vers), ((&rpcmsg )->ru.RM_cmb.cb_proc), clnt->conn.trans->name); } while (0) | |||
706 | rpc_call_rpcvers (&rpcmsg), rpc_call_program (&rpcmsg),do { do { if (0) printf ("received rpc message (XID: 0x%lx, " "Ver: %ld, Program: %ld, ProgVers: %ld, Proc: %ld) " "from rpc-transport (%s)" , ((&rpcmsg)->rm_xid), ((&rpcmsg)->ru.RM_cmb.cb_rpcvers ), ((&rpcmsg)->ru.RM_cmb.cb_prog), ((&rpcmsg)-> ru.RM_cmb.cb_vers), ((&rpcmsg)->ru.RM_cmb.cb_proc), clnt ->conn.trans->name); } while (0); _gf_log (clnt->conn .trans->name, "rpc-clnt.c", __FUNCTION__, 708, GF_LOG_TRACE , "received rpc message (XID: 0x%lx, " "Ver: %ld, Program: %ld, ProgVers: %ld, Proc: %ld) " "from rpc-transport (%s)", ((&rpcmsg)->rm_xid), ((& rpcmsg)->ru.RM_cmb.cb_rpcvers), ((&rpcmsg)->ru.RM_cmb .cb_prog), ((&rpcmsg)->ru.RM_cmb.cb_vers), ((&rpcmsg )->ru.RM_cmb.cb_proc), clnt->conn.trans->name); } while (0) | |||
707 | rpc_call_progver (&rpcmsg), rpc_call_progproc (&rpcmsg),do { do { if (0) printf ("received rpc message (XID: 0x%lx, " "Ver: %ld, Program: %ld, ProgVers: %ld, Proc: %ld) " "from rpc-transport (%s)" , ((&rpcmsg)->rm_xid), ((&rpcmsg)->ru.RM_cmb.cb_rpcvers ), ((&rpcmsg)->ru.RM_cmb.cb_prog), ((&rpcmsg)-> ru.RM_cmb.cb_vers), ((&rpcmsg)->ru.RM_cmb.cb_proc), clnt ->conn.trans->name); } while (0); _gf_log (clnt->conn .trans->name, "rpc-clnt.c", __FUNCTION__, 708, GF_LOG_TRACE , "received rpc message (XID: 0x%lx, " "Ver: %ld, Program: %ld, ProgVers: %ld, Proc: %ld) " "from rpc-transport (%s)", ((&rpcmsg)->rm_xid), ((& rpcmsg)->ru.RM_cmb.cb_rpcvers), ((&rpcmsg)->ru.RM_cmb .cb_prog), ((&rpcmsg)->ru.RM_cmb.cb_vers), ((&rpcmsg )->ru.RM_cmb.cb_proc), clnt->conn.trans->name); } while (0) | |||
708 | clnt->conn.trans->name)do { do { if (0) printf ("received rpc message (XID: 0x%lx, " "Ver: %ld, Program: %ld, ProgVers: %ld, Proc: %ld) " "from rpc-transport (%s)" , ((&rpcmsg)->rm_xid), ((&rpcmsg)->ru.RM_cmb.cb_rpcvers ), ((&rpcmsg)->ru.RM_cmb.cb_prog), ((&rpcmsg)-> ru.RM_cmb.cb_vers), ((&rpcmsg)->ru.RM_cmb.cb_proc), clnt ->conn.trans->name); } while (0); _gf_log (clnt->conn .trans->name, "rpc-clnt.c", __FUNCTION__, 708, GF_LOG_TRACE , "received rpc message (XID: 0x%lx, " "Ver: %ld, Program: %ld, ProgVers: %ld, Proc: %ld) " "from rpc-transport (%s)", ((&rpcmsg)->rm_xid), ((& rpcmsg)->ru.RM_cmb.cb_rpcvers), ((&rpcmsg)->ru.RM_cmb .cb_prog), ((&rpcmsg)->ru.RM_cmb.cb_vers), ((&rpcmsg )->ru.RM_cmb.cb_proc), clnt->conn.trans->name); } while (0); | |||
709 | ||||
710 | procnum = rpc_call_progproc (&rpcmsg)((&rpcmsg)->ru.RM_cmb.cb_proc); | |||
711 | ||||
712 | pthread_mutex_lock (&clnt->lock); | |||
713 | { | |||
714 | list_for_each_entry (program, &clnt->programs, program)for (program = ((typeof(*program) *)((char *)((&clnt-> programs)->next)-(unsigned long)(&((typeof(*program) * )0)->program))); &program->program != (&clnt-> programs); program = ((typeof(*program) *)((char *)(program-> program.next)-(unsigned long)(&((typeof(*program) *)0)-> program)))) { | |||
715 | if ((program->prognum == rpc_call_program (&rpcmsg)((&rpcmsg)->ru.RM_cmb.cb_prog)) | |||
716 | && (program->progver | |||
717 | == rpc_call_progver (&rpcmsg)((&rpcmsg)->ru.RM_cmb.cb_vers))) { | |||
718 | found = 1; | |||
719 | break; | |||
720 | } | |||
721 | } | |||
722 | } | |||
723 | pthread_mutex_unlock (&clnt->lock); | |||
724 | ||||
725 | if (found && (procnum < program->numactors) && | |||
726 | (program->actors[procnum].actor)) { | |||
727 | program->actors[procnum].actor (clnt, program->mydata, | |||
728 | &progmsg); | |||
729 | } | |||
730 | ||||
731 | out: | |||
732 | clnt = rpc_clnt_unref (clnt); | |||
733 | return ret; | |||
734 | } | |||
735 | ||||
736 | int | |||
737 | rpc_clnt_handle_reply (struct rpc_clnt *clnt, rpc_transport_pollin_t *pollin) | |||
738 | { | |||
739 | rpc_clnt_connection_t *conn = NULL((void*)0); | |||
740 | struct saved_frame *saved_frame = NULL((void*)0); | |||
741 | int ret = -1; | |||
742 | struct rpc_req *req = NULL((void*)0); | |||
743 | uint32_t xid = 0; | |||
744 | ||||
745 | clnt = rpc_clnt_ref (clnt); | |||
746 | conn = &clnt->conn; | |||
747 | ||||
748 | xid = ntoh32hton32 (*((uint32_t *)pollin->vector[0].iov_base)); | |||
749 | saved_frame = lookup_frame (conn, xid); | |||
750 | if (saved_frame == NULL((void*)0)) { | |||
751 | gf_log (conn->trans->name, GF_LOG_ERROR,do { do { if (0) printf ("cannot lookup the saved frame for reply with xid (%u)" , xid); } while (0); _gf_log (conn->trans->name, "rpc-clnt.c" , __FUNCTION__, 753, GF_LOG_ERROR, "cannot lookup the saved frame for reply with xid (%u)" , xid); } while (0) | |||
752 | "cannot lookup the saved frame for reply with xid (%u)",do { do { if (0) printf ("cannot lookup the saved frame for reply with xid (%u)" , xid); } while (0); _gf_log (conn->trans->name, "rpc-clnt.c" , __FUNCTION__, 753, GF_LOG_ERROR, "cannot lookup the saved frame for reply with xid (%u)" , xid); } while (0) | |||
753 | xid)do { do { if (0) printf ("cannot lookup the saved frame for reply with xid (%u)" , xid); } while (0); _gf_log (conn->trans->name, "rpc-clnt.c" , __FUNCTION__, 753, GF_LOG_ERROR, "cannot lookup the saved frame for reply with xid (%u)" , xid); } while (0); | |||
754 | goto out; | |||
755 | } | |||
756 | ||||
757 | req = saved_frame->rpcreq; | |||
758 | if (req == NULL((void*)0)) { | |||
759 | gf_log (conn->trans->name, GF_LOG_ERROR,do { do { if (0) printf ("no request with frame for xid (%u)" , xid); } while (0); _gf_log (conn->trans->name, "rpc-clnt.c" , __FUNCTION__, 760, GF_LOG_ERROR, "no request with frame for xid (%u)" , xid); } while (0) | |||
760 | "no request with frame for xid (%u)", xid)do { do { if (0) printf ("no request with frame for xid (%u)" , xid); } while (0); _gf_log (conn->trans->name, "rpc-clnt.c" , __FUNCTION__, 760, GF_LOG_ERROR, "no request with frame for xid (%u)" , xid); } while (0); | |||
761 | goto out; | |||
762 | } | |||
763 | ||||
764 | ret = rpc_clnt_reply_init (conn, pollin, req, saved_frame); | |||
765 | if (ret != 0) { | |||
766 | req->rpc_status = -1; | |||
767 | gf_log (conn->trans->name, GF_LOG_WARNING,do { do { if (0) printf ("initialising rpc reply failed"); } while (0); _gf_log (conn->trans->name, "rpc-clnt.c", __FUNCTION__ , 768, GF_LOG_WARNING, "initialising rpc reply failed"); } while (0) | |||
768 | "initialising rpc reply failed")do { do { if (0) printf ("initialising rpc reply failed"); } while (0); _gf_log (conn->trans->name, "rpc-clnt.c", __FUNCTION__ , 768, GF_LOG_WARNING, "initialising rpc reply failed"); } while (0); | |||
769 | } | |||
770 | ||||
771 | req->cbkfn (req, req->rsp, req->rspcnt, saved_frame->frame); | |||
772 | ||||
773 | if (req) { | |||
774 | rpc_clnt_reply_deinit (req, conn->rpc_clnt->reqpool); | |||
775 | } | |||
776 | out: | |||
777 | ||||
778 | if (saved_frame) { | |||
779 | mem_put (saved_frame); | |||
780 | } | |||
781 | ||||
782 | clnt = rpc_clnt_unref (clnt); | |||
783 | return ret; | |||
784 | } | |||
785 | ||||
786 | ||||
787 | inline void | |||
788 | rpc_clnt_set_connected (rpc_clnt_connection_t *conn) | |||
789 | { | |||
790 | if (!conn) { | |||
791 | goto out; | |||
792 | } | |||
793 | ||||
794 | pthread_mutex_lock (&conn->lock); | |||
795 | { | |||
796 | conn->connected = 1; | |||
797 | } | |||
798 | pthread_mutex_unlock (&conn->lock); | |||
799 | ||||
800 | out: | |||
801 | return; | |||
802 | } | |||
803 | ||||
804 | ||||
805 | void | |||
806 | rpc_clnt_unset_connected (rpc_clnt_connection_t *conn) | |||
807 | { | |||
808 | if (!conn) { | |||
809 | goto out; | |||
810 | } | |||
811 | ||||
812 | pthread_mutex_lock (&conn->lock); | |||
813 | { | |||
814 | conn->connected = 0; | |||
815 | } | |||
816 | pthread_mutex_unlock (&conn->lock); | |||
817 | ||||
818 | out: | |||
819 | return; | |||
820 | } | |||
821 | ||||
822 | int | |||
823 | rpc_clnt_notify (rpc_transport_t *trans, void *mydata, | |||
824 | rpc_transport_event_t event, void *data, ...) | |||
825 | { | |||
826 | rpc_clnt_connection_t *conn = NULL((void*)0); | |||
827 | struct rpc_clnt *clnt = NULL((void*)0); | |||
828 | int ret = -1; | |||
829 | rpc_request_info_t *req_info = NULL((void*)0); | |||
830 | rpc_transport_pollin_t *pollin = NULL((void*)0); | |||
831 | struct timeval tv = {0, }; | |||
832 | ||||
833 | conn = mydata; | |||
834 | if (conn == NULL((void*)0)) { | |||
835 | goto out; | |||
836 | } | |||
837 | clnt = conn->rpc_clnt; | |||
838 | if (!clnt) | |||
839 | goto out; | |||
840 | ||||
841 | switch (event) { | |||
842 | case RPC_TRANSPORT_DISCONNECT: | |||
843 | { | |||
844 | rpc_clnt_connection_cleanup (conn); | |||
845 | ||||
846 | pthread_mutex_lock (&conn->lock); | |||
847 | { | |||
848 | if (!conn->rpc_clnt->disabled | |||
849 | && (conn->reconnect == NULL((void*)0))) { | |||
850 | tv.tv_sec = 10; | |||
851 | ||||
852 | conn->reconnect = | |||
853 | gf_timer_call_after (clnt->ctx, tv, | |||
854 | rpc_clnt_reconnect, | |||
855 | conn->trans); | |||
856 | } | |||
857 | } | |||
858 | pthread_mutex_unlock (&conn->lock); | |||
859 | ||||
860 | if (clnt->notifyfn) | |||
861 | ret = clnt->notifyfn (clnt, clnt->mydata, | |||
862 | RPC_CLNT_DISCONNECT, NULL((void*)0)); | |||
863 | break; | |||
864 | } | |||
865 | ||||
866 | case RPC_TRANSPORT_CLEANUP: | |||
867 | /* this event should not be received on a client for, a | |||
868 | * transport is only disconnected, but never destroyed. | |||
869 | */ | |||
870 | ret = 0; | |||
871 | break; | |||
872 | ||||
873 | case RPC_TRANSPORT_MAP_XID_REQUEST: | |||
874 | { | |||
875 | req_info = data; | |||
876 | ret = rpc_clnt_fill_request_info (clnt, req_info); | |||
877 | break; | |||
878 | } | |||
879 | ||||
880 | case RPC_TRANSPORT_MSG_RECEIVED: | |||
881 | { | |||
882 | pthread_mutex_lock (&conn->lock); | |||
883 | { | |||
884 | gettimeofday (&conn->last_received, NULL((void*)0)); | |||
885 | } | |||
886 | pthread_mutex_unlock (&conn->lock); | |||
887 | ||||
888 | pollin = data; | |||
889 | if (pollin->is_reply) | |||
890 | ret = rpc_clnt_handle_reply (clnt, pollin); | |||
891 | else | |||
892 | ret = rpc_clnt_handle_cbk (clnt, pollin); | |||
893 | /* ret = clnt->notifyfn (clnt, clnt->mydata, RPC_CLNT_MSG, | |||
894 | * data); | |||
895 | */ | |||
896 | break; | |||
897 | } | |||
898 | ||||
899 | case RPC_TRANSPORT_MSG_SENT: | |||
900 | { | |||
901 | pthread_mutex_lock (&conn->lock); | |||
902 | { | |||
903 | gettimeofday (&conn->last_sent, NULL((void*)0)); | |||
904 | } | |||
905 | pthread_mutex_unlock (&conn->lock); | |||
906 | ||||
907 | ret = 0; | |||
908 | break; | |||
909 | } | |||
910 | ||||
911 | case RPC_TRANSPORT_CONNECT: | |||
912 | { | |||
913 | /* Every time there is a disconnection, processes | |||
914 | should try to connect to 'glusterd' (ie, default | |||
915 | port) or whichever port given as 'option remote-port' | |||
916 | in volume file. */ | |||
917 | /* Below code makes sure the (re-)configured port lasts | |||
918 | for just one successful attempt */ | |||
919 | conn->config.remote_port = 0; | |||
920 | ||||
921 | if (clnt->notifyfn) | |||
922 | ret = clnt->notifyfn (clnt, clnt->mydata, | |||
923 | RPC_CLNT_CONNECT, NULL((void*)0)); | |||
924 | break; | |||
925 | } | |||
926 | ||||
927 | case RPC_TRANSPORT_ACCEPT: | |||
928 | /* only meaningful on a server, no need of handling this event | |||
929 | * in a client. | |||
930 | */ | |||
931 | ret = 0; | |||
932 | break; | |||
933 | } | |||
934 | ||||
935 | out: | |||
936 | return ret; | |||
937 | } | |||
938 | ||||
939 | ||||
940 | void | |||
941 | rpc_clnt_connection_deinit (rpc_clnt_connection_t *conn) | |||
942 | { | |||
943 | return; | |||
944 | } | |||
945 | ||||
946 | ||||
947 | static inline int | |||
948 | rpc_clnt_connection_init (struct rpc_clnt *clnt, glusterfs_ctx_t *ctx, | |||
949 | dict_t *options, char *name) | |||
950 | { | |||
951 | int ret = -1; | |||
952 | rpc_clnt_connection_t *conn = NULL((void*)0); | |||
953 | ||||
954 | conn = &clnt->conn; | |||
955 | pthread_mutex_init (&clnt->conn.lock, NULL((void*)0)); | |||
956 | ||||
957 | ret = dict_get_int32 (options, "frame-timeout", | |||
958 | &conn->frame_timeout); | |||
959 | if (ret >= 0) { | |||
960 | gf_log (name, GF_LOG_INFO,do { do { if (0) printf ("setting frame-timeout to %d", conn-> frame_timeout); } while (0); _gf_log (name, "rpc-clnt.c", __FUNCTION__ , 961, GF_LOG_INFO, "setting frame-timeout to %d", conn->frame_timeout ); } while (0) | |||
961 | "setting frame-timeout to %d", conn->frame_timeout)do { do { if (0) printf ("setting frame-timeout to %d", conn-> frame_timeout); } while (0); _gf_log (name, "rpc-clnt.c", __FUNCTION__ , 961, GF_LOG_INFO, "setting frame-timeout to %d", conn->frame_timeout ); } while (0); | |||
962 | } else { | |||
963 | gf_log (name, GF_LOG_DEBUG,do { do { if (0) printf ("defaulting frame-timeout to 30mins" ); } while (0); _gf_log (name, "rpc-clnt.c", __FUNCTION__, 964 , GF_LOG_DEBUG, "defaulting frame-timeout to 30mins"); } while (0) | |||
964 | "defaulting frame-timeout to 30mins")do { do { if (0) printf ("defaulting frame-timeout to 30mins" ); } while (0); _gf_log (name, "rpc-clnt.c", __FUNCTION__, 964 , GF_LOG_DEBUG, "defaulting frame-timeout to 30mins"); } while (0); | |||
965 | conn->frame_timeout = 1800; | |||
966 | } | |||
967 | ||||
968 | conn->trans = rpc_transport_load (ctx, options, name); | |||
969 | if (!conn->trans) { | |||
970 | gf_log (name, GF_LOG_WARNING, "loading of new rpc-transport"do { do { if (0) printf ("loading of new rpc-transport" " failed" ); } while (0); _gf_log (name, "rpc-clnt.c", __FUNCTION__, 971 , GF_LOG_WARNING, "loading of new rpc-transport" " failed"); } while (0) | |||
971 | " failed")do { do { if (0) printf ("loading of new rpc-transport" " failed" ); } while (0); _gf_log (name, "rpc-clnt.c", __FUNCTION__, 971 , GF_LOG_WARNING, "loading of new rpc-transport" " failed"); } while (0); | |||
972 | ret = -1; | |||
973 | goto out; | |||
974 | } | |||
975 | ||||
976 | rpc_transport_ref (conn->trans); | |||
977 | ||||
978 | conn->rpc_clnt = clnt; | |||
979 | ||||
980 | ret = rpc_transport_register_notify (conn->trans, rpc_clnt_notify, | |||
981 | conn); | |||
982 | if (ret == -1) { | |||
983 | gf_log (name, GF_LOG_WARNING, "registering notify failed")do { do { if (0) printf ("registering notify failed"); } while (0); _gf_log (name, "rpc-clnt.c", __FUNCTION__, 983, GF_LOG_WARNING , "registering notify failed"); } while (0); | |||
984 | rpc_clnt_connection_cleanup (conn); | |||
985 | conn = NULL((void*)0); | |||
986 | goto out; | |||
987 | } | |||
988 | ||||
989 | conn->saved_frames = saved_frames_new (); | |||
990 | if (!conn->saved_frames) { | |||
991 | gf_log (name, GF_LOG_WARNING, "creation of saved_frames "do { do { if (0) printf ("creation of saved_frames " "failed" ); } while (0); _gf_log (name, "rpc-clnt.c", __FUNCTION__, 992 , GF_LOG_WARNING, "creation of saved_frames " "failed"); } while (0) | |||
992 | "failed")do { do { if (0) printf ("creation of saved_frames " "failed" ); } while (0); _gf_log (name, "rpc-clnt.c", __FUNCTION__, 992 , GF_LOG_WARNING, "creation of saved_frames " "failed"); } while (0); | |||
993 | rpc_clnt_connection_cleanup (conn); | |||
994 | goto out; | |||
995 | } | |||
996 | ||||
997 | ret = 0; | |||
998 | ||||
999 | out: | |||
1000 | return ret; | |||
1001 | } | |||
1002 | ||||
1003 | struct rpc_clnt * | |||
1004 | rpc_clnt_new (dict_t *options, glusterfs_ctx_t *ctx, char *name, | |||
1005 | uint32_t reqpool_size) | |||
1006 | { | |||
1007 | int ret = -1; | |||
1008 | struct rpc_clnt *rpc = NULL((void*)0); | |||
1009 | ||||
1010 | rpc = GF_CALLOC (1, sizeof (*rpc), gf_common_mt_rpcclnt_t)__gf_calloc (1, sizeof (*rpc), gf_common_mt_rpcclnt_t); | |||
1011 | if (!rpc) { | |||
1012 | goto out; | |||
1013 | } | |||
1014 | ||||
1015 | pthread_mutex_init (&rpc->lock, NULL((void*)0)); | |||
1016 | rpc->ctx = ctx; | |||
1017 | ||||
1018 | if (!reqpool_size) | |||
1019 | reqpool_size = RPC_CLNT_DEFAULT_REQUEST_COUNT512; | |||
1020 | ||||
1021 | rpc->reqpool = mem_pool_new (struct rpc_req, reqpool_size)mem_pool_new_fn (sizeof(struct rpc_req), reqpool_size, "struct rpc_req" ); | |||
1022 | if (rpc->reqpool == NULL((void*)0)) { | |||
1023 | pthread_mutex_destroy (&rpc->lock); | |||
1024 | GF_FREE (rpc)__gf_free (rpc); | |||
1025 | rpc = NULL((void*)0); | |||
1026 | goto out; | |||
1027 | } | |||
1028 | ||||
1029 | rpc->saved_frames_pool = mem_pool_new (struct saved_frame,mem_pool_new_fn (sizeof(struct saved_frame), reqpool_size, "struct saved_frame" ) | |||
1030 | reqpool_size)mem_pool_new_fn (sizeof(struct saved_frame), reqpool_size, "struct saved_frame" ); | |||
1031 | if (rpc->saved_frames_pool == NULL((void*)0)) { | |||
1032 | pthread_mutex_destroy (&rpc->lock); | |||
1033 | mem_pool_destroy (rpc->reqpool); | |||
1034 | GF_FREE (rpc)__gf_free (rpc); | |||
1035 | rpc = NULL((void*)0); | |||
1036 | goto out; | |||
1037 | } | |||
1038 | ||||
1039 | ret = rpc_clnt_connection_init (rpc, ctx, options, name); | |||
1040 | if (ret == -1) { | |||
1041 | pthread_mutex_destroy (&rpc->lock); | |||
1042 | mem_pool_destroy (rpc->reqpool); | |||
1043 | mem_pool_destroy (rpc->saved_frames_pool); | |||
1044 | GF_FREE (rpc)__gf_free (rpc); | |||
1045 | rpc = NULL((void*)0); | |||
1046 | if (options) | |||
1047 | dict_unref (options); | |||
1048 | goto out; | |||
1049 | } | |||
1050 | ||||
1051 | rpc->auth_null = dict_get_str_boolean (options, "auth-null", 0); | |||
1052 | ||||
1053 | rpc = rpc_clnt_ref (rpc); | |||
1054 | INIT_LIST_HEAD (&rpc->programs)do { (&rpc->programs)->next = (&rpc->programs )->prev = &rpc->programs; } while (0); | |||
1055 | ||||
1056 | out: | |||
1057 | return rpc; | |||
1058 | } | |||
1059 | ||||
1060 | ||||
1061 | int | |||
1062 | rpc_clnt_start (struct rpc_clnt *rpc) | |||
1063 | { | |||
1064 | struct rpc_clnt_connection *conn = NULL((void*)0); | |||
1065 | ||||
1066 | if (!rpc) | |||
1067 | return -1; | |||
1068 | ||||
1069 | conn = &rpc->conn; | |||
1070 | ||||
1071 | rpc_clnt_reconnect (conn->trans); | |||
1072 | ||||
1073 | return 0; | |||
1074 | } | |||
1075 | ||||
1076 | ||||
1077 | int | |||
1078 | rpc_clnt_register_notify (struct rpc_clnt *rpc, rpc_clnt_notify_t fn, | |||
1079 | void *mydata) | |||
1080 | { | |||
1081 | rpc->mydata = mydata; | |||
1082 | rpc->notifyfn = fn; | |||
1083 | ||||
1084 | return 0; | |||
1085 | } | |||
1086 | ||||
1087 | ssize_t | |||
1088 | xdr_serialize_glusterfs_auth (char *dest, struct auth_glusterfs_parms_v2 *au) | |||
1089 | { | |||
1090 | ssize_t ret = -1; | |||
1091 | XDR xdr; | |||
1092 | ||||
1093 | if ((!dest) || (!au)) | |||
1094 | return -1; | |||
1095 | ||||
1096 | xdrmem_create (&xdr, dest, GF_MAX_AUTH_BYTES2048, XDR_ENCODE); | |||
1097 | ||||
1098 | if (!xdr_auth_glusterfs_parms_v2 (&xdr, au)) { | |||
1099 | gf_log (THIS->name, GF_LOG_WARNING,do { do { if (0) printf ("failed to encode auth glusterfs elements" ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "rpc-clnt.c", __FUNCTION__, 1100, GF_LOG_WARNING, "failed to encode auth glusterfs elements" ); } while (0) | |||
1100 | "failed to encode auth glusterfs elements")do { do { if (0) printf ("failed to encode auth glusterfs elements" ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "rpc-clnt.c", __FUNCTION__, 1100, GF_LOG_WARNING, "failed to encode auth glusterfs elements" ); } while (0); | |||
1101 | ret = -1; | |||
1102 | goto ret; | |||
1103 | } | |||
1104 | ||||
1105 | ret = (((size_t)(&xdr)->x_private) - ((size_t)(&xdr)->x_base)); | |||
1106 | ||||
1107 | ret: | |||
1108 | return ret; | |||
1109 | } | |||
1110 | ||||
1111 | ||||
1112 | int | |||
1113 | rpc_clnt_fill_request (int prognum, int progver, int procnum, | |||
1114 | uint64_t xid, struct auth_glusterfs_parms_v2 *au, | |||
1115 | struct rpc_msg *request, char *auth_data) | |||
1116 | { | |||
1117 | int ret = -1; | |||
1118 | ||||
1119 | if (!request) { | |||
1120 | goto out; | |||
1121 | } | |||
1122 | ||||
1123 | memset (request, 0, sizeof (*request)); | |||
1124 | ||||
1125 | request->rm_xid = xid; | |||
1126 | request->rm_direction = CALL; | |||
1127 | ||||
1128 | request->rm_callru.RM_cmb.cb_rpcvers = 2; | |||
1129 | request->rm_callru.RM_cmb.cb_prog = prognum; | |||
1130 | request->rm_callru.RM_cmb.cb_vers = progver; | |||
1131 | request->rm_callru.RM_cmb.cb_proc = procnum; | |||
1132 | ||||
1133 | /* TODO: Using AUTH_(GLUSTERFS/NULL) in a kludgy way for time-being. | |||
1134 | * Make it modular in future so it is easy to plug-in new | |||
1135 | * authentication schemes. | |||
1136 | */ | |||
1137 | if (auth_data) { | |||
1138 | ret = xdr_serialize_glusterfs_auth (auth_data, au); | |||
1139 | if (ret == -1) { | |||
1140 | gf_log ("rpc-clnt", GF_LOG_DEBUG,do { do { if (0) printf ("cannot encode credentials"); } while (0); _gf_log ("rpc-clnt", "rpc-clnt.c", __FUNCTION__, 1141, GF_LOG_DEBUG , "cannot encode credentials"); } while (0) | |||
1141 | "cannot encode credentials")do { do { if (0) printf ("cannot encode credentials"); } while (0); _gf_log ("rpc-clnt", "rpc-clnt.c", __FUNCTION__, 1141, GF_LOG_DEBUG , "cannot encode credentials"); } while (0); | |||
1142 | goto out; | |||
1143 | } | |||
1144 | ||||
1145 | request->rm_callru.RM_cmb.cb_cred.oa_flavor = AUTH_GLUSTERFS_v2; | |||
1146 | request->rm_callru.RM_cmb.cb_cred.oa_base = auth_data; | |||
1147 | request->rm_callru.RM_cmb.cb_cred.oa_length = ret; | |||
1148 | } else { | |||
1149 | request->rm_callru.RM_cmb.cb_cred.oa_flavor = AUTH_NULL0; | |||
1150 | request->rm_callru.RM_cmb.cb_cred.oa_base = NULL((void*)0); | |||
1151 | request->rm_callru.RM_cmb.cb_cred.oa_length = 0; | |||
1152 | } | |||
1153 | request->rm_callru.RM_cmb.cb_verf.oa_flavor = AUTH_NONE0; | |||
1154 | request->rm_callru.RM_cmb.cb_verf.oa_base = NULL((void*)0); | |||
1155 | request->rm_callru.RM_cmb.cb_verf.oa_length = 0; | |||
1156 | ||||
1157 | ret = 0; | |||
1158 | out: | |||
1159 | return ret; | |||
1160 | } | |||
1161 | ||||
1162 | ||||
1163 | struct iovec | |||
1164 | rpc_clnt_record_build_header (char *recordstart, size_t rlen, | |||
1165 | struct rpc_msg *request, size_t payload) | |||
1166 | { | |||
1167 | struct iovec requesthdr = {0, }; | |||
1168 | struct iovec txrecord = {0, 0}; | |||
1169 | int ret = -1; | |||
1170 | size_t fraglen = 0; | |||
1171 | ||||
1172 | ret = rpc_request_to_xdr (request, recordstart, rlen, &requesthdr); | |||
1173 | if (ret == -1) { | |||
1174 | gf_log ("rpc-clnt", GF_LOG_DEBUG,do { do { if (0) printf ("Failed to create RPC request"); } while (0); _gf_log ("rpc-clnt", "rpc-clnt.c", __FUNCTION__, 1175, GF_LOG_DEBUG , "Failed to create RPC request"); } while (0) | |||
1175 | "Failed to create RPC request")do { do { if (0) printf ("Failed to create RPC request"); } while (0); _gf_log ("rpc-clnt", "rpc-clnt.c", __FUNCTION__, 1175, GF_LOG_DEBUG , "Failed to create RPC request"); } while (0); | |||
1176 | goto out; | |||
1177 | } | |||
1178 | ||||
1179 | fraglen = payload + requesthdr.iov_len; | |||
1180 | gf_log ("rpc-clnt", GF_LOG_TRACE, "Request fraglen %zu, payload: %zu, "do { do { if (0) printf ("Request fraglen %zu, payload: %zu, " "rpc hdr: %zu", fraglen, payload, requesthdr.iov_len); } while (0); _gf_log ("rpc-clnt", "rpc-clnt.c", __FUNCTION__, 1181, GF_LOG_TRACE , "Request fraglen %zu, payload: %zu, " "rpc hdr: %zu", fraglen , payload, requesthdr.iov_len); } while (0) | |||
1181 | "rpc hdr: %zu", fraglen, payload, requesthdr.iov_len)do { do { if (0) printf ("Request fraglen %zu, payload: %zu, " "rpc hdr: %zu", fraglen, payload, requesthdr.iov_len); } while (0); _gf_log ("rpc-clnt", "rpc-clnt.c", __FUNCTION__, 1181, GF_LOG_TRACE , "Request fraglen %zu, payload: %zu, " "rpc hdr: %zu", fraglen , payload, requesthdr.iov_len); } while (0); | |||
1182 | ||||
1183 | ||||
1184 | txrecord.iov_base = recordstart; | |||
1185 | ||||
1186 | /* Remember, this is only the vec for the RPC header and does not | |||
1187 | * include the payload above. We needed the payload only to calculate | |||
1188 | * the size of the full fragment. This size is sent in the fragment | |||
1189 | * header. | |||
1190 | */ | |||
1191 | txrecord.iov_len = requesthdr.iov_len; | |||
1192 | ||||
1193 | out: | |||
1194 | return txrecord; | |||
1195 | } | |||
1196 | ||||
1197 | ||||
1198 | struct iobuf * | |||
1199 | rpc_clnt_record_build_record (struct rpc_clnt *clnt, int prognum, int progver, | |||
1200 | int procnum, size_t hdrsize, uint64_t xid, | |||
1201 | struct auth_glusterfs_parms_v2 *au, | |||
1202 | struct iovec *recbuf) | |||
1203 | { | |||
1204 | struct rpc_msg request = {0, }; | |||
1205 | struct iobuf *request_iob = NULL((void*)0); | |||
1206 | char *record = NULL((void*)0); | |||
1207 | struct iovec recordhdr = {0, }; | |||
1208 | size_t pagesize = 0; | |||
1209 | int ret = -1; | |||
1210 | size_t xdr_size = 0; | |||
1211 | char auth_data[GF_MAX_AUTH_BYTES2048] = {0, }; | |||
1212 | ||||
1213 | if ((!clnt) || (!recbuf) || (!au)) { | |||
1214 | goto out; | |||
1215 | } | |||
1216 | ||||
1217 | /* Fill the rpc structure and XDR it into the buffer got above. */ | |||
1218 | if (clnt->auth_null) | |||
1219 | ret = rpc_clnt_fill_request (prognum, progver, procnum, | |||
1220 | xid, NULL((void*)0), &request, NULL((void*)0)); | |||
1221 | else | |||
1222 | ret = rpc_clnt_fill_request (prognum, progver, procnum, | |||
1223 | xid, au, &request, auth_data); | |||
1224 | ||||
1225 | if (ret == -1) { | |||
1226 | gf_log (clnt->conn.trans->name, GF_LOG_WARNING,do { do { if (0) printf ("cannot build a rpc-request xid (%""ll" "u"")", xid); } while (0); _gf_log (clnt->conn.trans-> name, "rpc-clnt.c", __FUNCTION__, 1227, GF_LOG_WARNING, "cannot build a rpc-request xid (%" "ll" "u"")", xid); } while (0) | |||
1227 | "cannot build a rpc-request xid (%"PRIu64")", xid)do { do { if (0) printf ("cannot build a rpc-request xid (%""ll" "u"")", xid); } while (0); _gf_log (clnt->conn.trans-> name, "rpc-clnt.c", __FUNCTION__, 1227, GF_LOG_WARNING, "cannot build a rpc-request xid (%" "ll" "u"")", xid); } while (0); | |||
1228 | goto out; | |||
1229 | } | |||
1230 | ||||
1231 | xdr_size = xdr_sizeof ((xdrproc_t)xdr_callmsg, &request); | |||
1232 | ||||
1233 | /* First, try to get a pointer into the buffer which the RPC | |||
1234 | * layer can use. | |||
1235 | */ | |||
1236 | request_iob = iobuf_get2 (clnt->ctx->iobuf_pool, (xdr_size + hdrsize)); | |||
1237 | if (!request_iob) { | |||
1238 | goto out; | |||
1239 | } | |||
1240 | ||||
1241 | pagesize = iobuf_pagesize (request_iob)(request_iob->iobuf_arena->page_size); | |||
1242 | ||||
1243 | record = iobuf_ptr (request_iob)((request_iob)->ptr); /* Now we have it. */ | |||
1244 | ||||
1245 | recordhdr = rpc_clnt_record_build_header (record, pagesize, &request, | |||
1246 | hdrsize); | |||
1247 | ||||
1248 | if (!recordhdr.iov_base) { | |||
1249 | gf_log (clnt->conn.trans->name, GF_LOG_ERROR,do { do { if (0) printf ("Failed to build record header"); } while (0); _gf_log (clnt->conn.trans->name, "rpc-clnt.c", __FUNCTION__ , 1250, GF_LOG_ERROR, "Failed to build record header"); } while (0) | |||
1250 | "Failed to build record header")do { do { if (0) printf ("Failed to build record header"); } while (0); _gf_log (clnt->conn.trans->name, "rpc-clnt.c", __FUNCTION__ , 1250, GF_LOG_ERROR, "Failed to build record header"); } while (0); | |||
1251 | iobuf_unref (request_iob); | |||
1252 | request_iob = NULL((void*)0); | |||
1253 | recbuf->iov_base = NULL((void*)0); | |||
1254 | goto out; | |||
1255 | } | |||
1256 | ||||
1257 | recbuf->iov_base = recordhdr.iov_base; | |||
1258 | recbuf->iov_len = recordhdr.iov_len; | |||
1259 | ||||
1260 | out: | |||
1261 | return request_iob; | |||
1262 | } | |||
1263 | ||||
1264 | ||||
1265 | struct iobuf * | |||
1266 | rpc_clnt_record (struct rpc_clnt *clnt, call_frame_t *call_frame, | |||
1267 | rpc_clnt_prog_t *prog, int procnum, size_t hdrlen, | |||
1268 | struct iovec *rpchdr, uint64_t callid) | |||
1269 | { | |||
1270 | struct auth_glusterfs_parms_v2 au = {0, }; | |||
1271 | struct iobuf *request_iob = NULL((void*)0); | |||
1272 | char owner[4] = {0,}; | |||
1273 | ||||
1274 | if (!prog || !rpchdr || !call_frame) { | |||
1275 | goto out; | |||
1276 | } | |||
1277 | ||||
1278 | au.pid = call_frame->root->pid; | |||
1279 | au.uid = call_frame->root->uid; | |||
1280 | au.gid = call_frame->root->gid; | |||
1281 | au.groups.groups_len = call_frame->root->ngrps; | |||
1282 | au.lk_owner.lk_owner_len = call_frame->root->lk_owner.len; | |||
1283 | ||||
1284 | if (au.groups.groups_len) | |||
1285 | au.groups.groups_val = call_frame->root->groups; | |||
1286 | ||||
1287 | if (call_frame->root->lk_owner.len) | |||
1288 | au.lk_owner.lk_owner_val = call_frame->root->lk_owner.data; | |||
1289 | else { | |||
1290 | owner[0] = (char)(au.pid & 0xff); | |||
1291 | owner[1] = (char)((au.pid >> 8) & 0xff); | |||
1292 | owner[2] = (char)((au.pid >> 16) & 0xff); | |||
1293 | owner[3] = (char)((au.pid >> 24) & 0xff); | |||
1294 | ||||
1295 | au.lk_owner.lk_owner_val = owner; | |||
1296 | au.lk_owner.lk_owner_len = 4; | |||
1297 | } | |||
1298 | ||||
1299 | gf_log (clnt->conn.trans->name, GF_LOG_TRACE, "Auth Info: pid: %u, uid: %d"do { do { if (0) printf ("Auth Info: pid: %u, uid: %d" ", gid: %d, owner: %s" , au.pid, au.uid, au.gid, lkowner_utoa (&call_frame->root ->lk_owner)); } while (0); _gf_log (clnt->conn.trans-> name, "rpc-clnt.c", __FUNCTION__, 1301, GF_LOG_TRACE, "Auth Info: pid: %u, uid: %d" ", gid: %d, owner: %s", au.pid, au.uid, au.gid, lkowner_utoa (&call_frame->root->lk_owner)); } while (0) | |||
1300 | ", gid: %d, owner: %s", au.pid, au.uid, au.gid,do { do { if (0) printf ("Auth Info: pid: %u, uid: %d" ", gid: %d, owner: %s" , au.pid, au.uid, au.gid, lkowner_utoa (&call_frame->root ->lk_owner)); } while (0); _gf_log (clnt->conn.trans-> name, "rpc-clnt.c", __FUNCTION__, 1301, GF_LOG_TRACE, "Auth Info: pid: %u, uid: %d" ", gid: %d, owner: %s", au.pid, au.uid, au.gid, lkowner_utoa (&call_frame->root->lk_owner)); } while (0) | |||
1301 | lkowner_utoa (&call_frame->root->lk_owner))do { do { if (0) printf ("Auth Info: pid: %u, uid: %d" ", gid: %d, owner: %s" , au.pid, au.uid, au.gid, lkowner_utoa (&call_frame->root ->lk_owner)); } while (0); _gf_log (clnt->conn.trans-> name, "rpc-clnt.c", __FUNCTION__, 1301, GF_LOG_TRACE, "Auth Info: pid: %u, uid: %d" ", gid: %d, owner: %s", au.pid, au.uid, au.gid, lkowner_utoa (&call_frame->root->lk_owner)); } while (0); | |||
1302 | ||||
1303 | request_iob = rpc_clnt_record_build_record (clnt, prog->prognum, | |||
1304 | prog->progver, | |||
1305 | procnum, hdrlen, | |||
1306 | callid, &au, | |||
1307 | rpchdr); | |||
1308 | if (!request_iob) { | |||
1309 | gf_log (clnt->conn.trans->name, GF_LOG_WARNING,do { do { if (0) printf ("cannot build rpc-record"); } while ( 0); _gf_log (clnt->conn.trans->name, "rpc-clnt.c", __FUNCTION__ , 1310, GF_LOG_WARNING, "cannot build rpc-record"); } while ( 0) | |||
1310 | "cannot build rpc-record")do { do { if (0) printf ("cannot build rpc-record"); } while ( 0); _gf_log (clnt->conn.trans->name, "rpc-clnt.c", __FUNCTION__ , 1310, GF_LOG_WARNING, "cannot build rpc-record"); } while ( 0); | |||
1311 | goto out; | |||
1312 | } | |||
1313 | ||||
1314 | out: | |||
1315 | return request_iob; | |||
1316 | } | |||
1317 | ||||
1318 | int | |||
1319 | rpcclnt_cbk_program_register (struct rpc_clnt *clnt, | |||
1320 | rpcclnt_cb_program_t *program, void *mydata) | |||
1321 | { | |||
1322 | int ret = -1; | |||
1323 | char already_registered = 0; | |||
1324 | rpcclnt_cb_program_t *tmp = NULL((void*)0); | |||
1325 | ||||
1326 | if (!clnt) | |||
1327 | goto out; | |||
1328 | ||||
1329 | if (program->actors == NULL((void*)0)) | |||
1330 | goto out; | |||
1331 | ||||
1332 | pthread_mutex_lock (&clnt->lock); | |||
1333 | { | |||
1334 | list_for_each_entry (tmp, &clnt->programs, program)for (tmp = ((typeof(*tmp) *)((char *)((&clnt->programs )->next)-(unsigned long)(&((typeof(*tmp) *)0)->program ))); &tmp->program != (&clnt->programs); tmp = ( (typeof(*tmp) *)((char *)(tmp->program.next)-(unsigned long )(&((typeof(*tmp) *)0)->program)))) { | |||
1335 | if ((program->prognum == tmp->prognum) | |||
1336 | && (program->progver == tmp->progver)) { | |||
1337 | already_registered = 1; | |||
1338 | break; | |||
1339 | } | |||
1340 | } | |||
1341 | } | |||
1342 | pthread_mutex_unlock (&clnt->lock); | |||
1343 | ||||
1344 | if (already_registered) { | |||
1345 | gf_log_callingfn (clnt->conn.trans->name, GF_LOG_DEBUG,do { do { if (0) printf ("already registered"); } while (0); _gf_log_callingfn (clnt->conn.trans->name, "rpc-clnt.c", __FUNCTION__, 1346 , GF_LOG_DEBUG, "already registered"); } while (0) | |||
1346 | "already registered")do { do { if (0) printf ("already registered"); } while (0); _gf_log_callingfn (clnt->conn.trans->name, "rpc-clnt.c", __FUNCTION__, 1346 , GF_LOG_DEBUG, "already registered"); } while (0); | |||
1347 | ret = 0; | |||
1348 | goto out; | |||
1349 | } | |||
1350 | ||||
1351 | tmp = GF_CALLOC (1, sizeof (*tmp),__gf_calloc (1, sizeof (*tmp), gf_common_mt_rpcclnt_cb_program_t ) | |||
1352 | gf_common_mt_rpcclnt_cb_program_t)__gf_calloc (1, sizeof (*tmp), gf_common_mt_rpcclnt_cb_program_t ); | |||
1353 | if (tmp == NULL((void*)0)) { | |||
1354 | goto out; | |||
1355 | } | |||
1356 | ||||
1357 | memcpy (tmp, program, sizeof (*tmp)); | |||
1358 | INIT_LIST_HEAD (&tmp->program)do { (&tmp->program)->next = (&tmp->program) ->prev = &tmp->program; } while (0); | |||
1359 | ||||
1360 | tmp->mydata = mydata; | |||
1361 | ||||
1362 | pthread_mutex_lock (&clnt->lock); | |||
1363 | { | |||
1364 | list_add_tail (&tmp->program, &clnt->programs); | |||
1365 | } | |||
1366 | pthread_mutex_unlock (&clnt->lock); | |||
1367 | ||||
1368 | ret = 0; | |||
1369 | gf_log (clnt->conn.trans->name, GF_LOG_DEBUG,do { do { if (0) printf ("New program registered: %s, Num: %d, Ver: %d" , program->progname, program->prognum, program->progver ); } while (0); _gf_log (clnt->conn.trans->name, "rpc-clnt.c" , __FUNCTION__, 1372, GF_LOG_DEBUG, "New program registered: %s, Num: %d, Ver: %d" , program->progname, program->prognum, program->progver ); } while (0) | |||
1370 | "New program registered: %s, Num: %d, Ver: %d",do { do { if (0) printf ("New program registered: %s, Num: %d, Ver: %d" , program->progname, program->prognum, program->progver ); } while (0); _gf_log (clnt->conn.trans->name, "rpc-clnt.c" , __FUNCTION__, 1372, GF_LOG_DEBUG, "New program registered: %s, Num: %d, Ver: %d" , program->progname, program->prognum, program->progver ); } while (0) | |||
1371 | program->progname, program->prognum,do { do { if (0) printf ("New program registered: %s, Num: %d, Ver: %d" , program->progname, program->prognum, program->progver ); } while (0); _gf_log (clnt->conn.trans->name, "rpc-clnt.c" , __FUNCTION__, 1372, GF_LOG_DEBUG, "New program registered: %s, Num: %d, Ver: %d" , program->progname, program->prognum, program->progver ); } while (0) | |||
1372 | program->progver)do { do { if (0) printf ("New program registered: %s, Num: %d, Ver: %d" , program->progname, program->prognum, program->progver ); } while (0); _gf_log (clnt->conn.trans->name, "rpc-clnt.c" , __FUNCTION__, 1372, GF_LOG_DEBUG, "New program registered: %s, Num: %d, Ver: %d" , program->progname, program->prognum, program->progver ); } while (0); | |||
1373 | ||||
1374 | out: | |||
1375 | if (ret == -1) { | |||
1376 | gf_log (clnt->conn.trans->name, GF_LOG_ERROR,do { do { if (0) printf ("Program registration failed:" " %s, Num: %d, Ver: %d" , program->progname, program->prognum, program->progver ); } while (0); _gf_log (clnt->conn.trans->name, "rpc-clnt.c" , __FUNCTION__, 1379, GF_LOG_ERROR, "Program registration failed:" " %s, Num: %d, Ver: %d", program->progname, program->prognum , program->progver); } while (0) | |||
1377 | "Program registration failed:"do { do { if (0) printf ("Program registration failed:" " %s, Num: %d, Ver: %d" , program->progname, program->prognum, program->progver ); } while (0); _gf_log (clnt->conn.trans->name, "rpc-clnt.c" , __FUNCTION__, 1379, GF_LOG_ERROR, "Program registration failed:" " %s, Num: %d, Ver: %d", program->progname, program->prognum , program->progver); } while (0) | |||
1378 | " %s, Num: %d, Ver: %d", program->progname,do { do { if (0) printf ("Program registration failed:" " %s, Num: %d, Ver: %d" , program->progname, program->prognum, program->progver ); } while (0); _gf_log (clnt->conn.trans->name, "rpc-clnt.c" , __FUNCTION__, 1379, GF_LOG_ERROR, "Program registration failed:" " %s, Num: %d, Ver: %d", program->progname, program->prognum , program->progver); } while (0) | |||
1379 | program->prognum, program->progver)do { do { if (0) printf ("Program registration failed:" " %s, Num: %d, Ver: %d" , program->progname, program->prognum, program->progver ); } while (0); _gf_log (clnt->conn.trans->name, "rpc-clnt.c" , __FUNCTION__, 1379, GF_LOG_ERROR, "Program registration failed:" " %s, Num: %d, Ver: %d", program->progname, program->prognum , program->progver); } while (0); | |||
1380 | } | |||
1381 | ||||
1382 | return ret; | |||
1383 | } | |||
1384 | ||||
1385 | ||||
1386 | int | |||
1387 | rpc_clnt_submit (struct rpc_clnt *rpc, rpc_clnt_prog_t *prog, | |||
1388 | int procnum, fop_cbk_fn_t cbkfn, | |||
1389 | struct iovec *proghdr, int proghdrcount, | |||
1390 | struct iovec *progpayload, int progpayloadcount, | |||
1391 | struct iobref *iobref, void *frame, struct iovec *rsphdr, | |||
1392 | int rsphdr_count, struct iovec *rsp_payload, | |||
1393 | int rsp_payload_count, struct iobref *rsp_iobref) | |||
1394 | { | |||
1395 | rpc_clnt_connection_t *conn = NULL((void*)0); | |||
1396 | struct iobuf *request_iob = NULL((void*)0); | |||
1397 | struct iovec rpchdr = {0,}; | |||
1398 | struct rpc_req *rpcreq = NULL((void*)0); | |||
1399 | rpc_transport_req_t req; | |||
1400 | int ret = -1; | |||
1401 | int proglen = 0; | |||
1402 | char new_iobref = 0; | |||
1403 | uint64_t callid = 0; | |||
1404 | ||||
1405 | if (!rpc || !prog || !frame) { | |||
1406 | goto out; | |||
1407 | } | |||
1408 | ||||
1409 | conn = &rpc->conn; | |||
1410 | ||||
1411 | if (conn->trans == NULL((void*)0)) { | |||
1412 | goto out; | |||
1413 | } | |||
1414 | ||||
1415 | rpcreq = mem_get (rpc->reqpool); | |||
1416 | if (rpcreq == NULL((void*)0)) { | |||
1417 | goto out; | |||
1418 | } | |||
1419 | ||||
1420 | memset (rpcreq, 0, sizeof (*rpcreq)); | |||
1421 | memset (&req, 0, sizeof (req)); | |||
1422 | ||||
1423 | if (!iobref) { | |||
1424 | iobref = iobref_new (); | |||
1425 | if (!iobref) { | |||
1426 | goto out; | |||
1427 | } | |||
1428 | ||||
1429 | new_iobref = 1; | |||
1430 | } | |||
1431 | ||||
1432 | callid = rpc_clnt_new_callid (rpc); | |||
1433 | ||||
1434 | rpcreq->prog = prog; | |||
1435 | rpcreq->procnum = procnum; | |||
1436 | rpcreq->conn = conn; | |||
1437 | rpcreq->xid = callid; | |||
1438 | rpcreq->cbkfn = cbkfn; | |||
1439 | ||||
1440 | ret = -1; | |||
1441 | ||||
1442 | if (proghdr) { | |||
1443 | proglen += iov_length (proghdr, proghdrcount); | |||
1444 | } | |||
1445 | ||||
1446 | request_iob = rpc_clnt_record (rpc, frame, prog, | |||
1447 | procnum, proglen, | |||
1448 | &rpchdr, callid); | |||
1449 | if (!request_iob) { | |||
1450 | gf_log (conn->trans->name, GF_LOG_WARNING,do { do { if (0) printf ("cannot build rpc-record"); } while ( 0); _gf_log (conn->trans->name, "rpc-clnt.c", __FUNCTION__ , 1451, GF_LOG_WARNING, "cannot build rpc-record"); } while ( 0) | |||
1451 | "cannot build rpc-record")do { do { if (0) printf ("cannot build rpc-record"); } while ( 0); _gf_log (conn->trans->name, "rpc-clnt.c", __FUNCTION__ , 1451, GF_LOG_WARNING, "cannot build rpc-record"); } while ( 0); | |||
1452 | goto out; | |||
1453 | } | |||
1454 | ||||
1455 | iobref_add (iobref, request_iob); | |||
1456 | ||||
1457 | req.msg.rpchdr = &rpchdr; | |||
1458 | req.msg.rpchdrcount = 1; | |||
1459 | req.msg.proghdr = proghdr; | |||
1460 | req.msg.proghdrcount = proghdrcount; | |||
1461 | req.msg.progpayload = progpayload; | |||
1462 | req.msg.progpayloadcount = progpayloadcount; | |||
1463 | req.msg.iobref = iobref; | |||
1464 | ||||
1465 | req.rsp.rsphdr = rsphdr; | |||
1466 | req.rsp.rsphdr_count = rsphdr_count; | |||
1467 | req.rsp.rsp_payload = rsp_payload; | |||
1468 | req.rsp.rsp_payload_count = rsp_payload_count; | |||
1469 | req.rsp.rsp_iobref = rsp_iobref; | |||
1470 | req.rpc_req = rpcreq; | |||
1471 | ||||
1472 | pthread_mutex_lock (&conn->lock); | |||
1473 | { | |||
1474 | if (conn->connected == 0) { | |||
1475 | ret = rpc_transport_connect (conn->trans, | |||
1476 | conn->config.remote_port); | |||
1477 | } | |||
1478 | ||||
1479 | ret = rpc_transport_submit_request (rpc->conn.trans, | |||
1480 | &req); | |||
1481 | if (ret == -1) { | |||
1482 | gf_log (conn->trans->name, GF_LOG_WARNING,do { do { if (0) printf ("failed to submit rpc-request " "(XID: 0x%ux Program: %s, ProgVers: %d, " "Proc: %d) to rpc-transport (%s)", rpcreq->xid, rpcreq-> prog->progname, rpcreq->prog->progver, rpcreq->procnum , rpc->conn.trans->name); } while (0); _gf_log (conn-> trans->name, "rpc-clnt.c", __FUNCTION__, 1487, GF_LOG_WARNING , "failed to submit rpc-request " "(XID: 0x%ux Program: %s, ProgVers: %d, " "Proc: %d) to rpc-transport (%s)", rpcreq->xid, rpcreq-> prog->progname, rpcreq->prog->progver, rpcreq->procnum , rpc->conn.trans->name); } while (0) | |||
1483 | "failed to submit rpc-request "do { do { if (0) printf ("failed to submit rpc-request " "(XID: 0x%ux Program: %s, ProgVers: %d, " "Proc: %d) to rpc-transport (%s)", rpcreq->xid, rpcreq-> prog->progname, rpcreq->prog->progver, rpcreq->procnum , rpc->conn.trans->name); } while (0); _gf_log (conn-> trans->name, "rpc-clnt.c", __FUNCTION__, 1487, GF_LOG_WARNING , "failed to submit rpc-request " "(XID: 0x%ux Program: %s, ProgVers: %d, " "Proc: %d) to rpc-transport (%s)", rpcreq->xid, rpcreq-> prog->progname, rpcreq->prog->progver, rpcreq->procnum , rpc->conn.trans->name); } while (0) | |||
1484 | "(XID: 0x%ux Program: %s, ProgVers: %d, "do { do { if (0) printf ("failed to submit rpc-request " "(XID: 0x%ux Program: %s, ProgVers: %d, " "Proc: %d) to rpc-transport (%s)", rpcreq->xid, rpcreq-> prog->progname, rpcreq->prog->progver, rpcreq->procnum , rpc->conn.trans->name); } while (0); _gf_log (conn-> trans->name, "rpc-clnt.c", __FUNCTION__, 1487, GF_LOG_WARNING , "failed to submit rpc-request " "(XID: 0x%ux Program: %s, ProgVers: %d, " "Proc: %d) to rpc-transport (%s)", rpcreq->xid, rpcreq-> prog->progname, rpcreq->prog->progver, rpcreq->procnum , rpc->conn.trans->name); } while (0) | |||
1485 | "Proc: %d) to rpc-transport (%s)", rpcreq->xid,do { do { if (0) printf ("failed to submit rpc-request " "(XID: 0x%ux Program: %s, ProgVers: %d, " "Proc: %d) to rpc-transport (%s)", rpcreq->xid, rpcreq-> prog->progname, rpcreq->prog->progver, rpcreq->procnum , rpc->conn.trans->name); } while (0); _gf_log (conn-> trans->name, "rpc-clnt.c", __FUNCTION__, 1487, GF_LOG_WARNING , "failed to submit rpc-request " "(XID: 0x%ux Program: %s, ProgVers: %d, " "Proc: %d) to rpc-transport (%s)", rpcreq->xid, rpcreq-> prog->progname, rpcreq->prog->progver, rpcreq->procnum , rpc->conn.trans->name); } while (0) | |||
1486 | rpcreq->prog->progname, rpcreq->prog->progver,do { do { if (0) printf ("failed to submit rpc-request " "(XID: 0x%ux Program: %s, ProgVers: %d, " "Proc: %d) to rpc-transport (%s)", rpcreq->xid, rpcreq-> prog->progname, rpcreq->prog->progver, rpcreq->procnum , rpc->conn.trans->name); } while (0); _gf_log (conn-> trans->name, "rpc-clnt.c", __FUNCTION__, 1487, GF_LOG_WARNING , "failed to submit rpc-request " "(XID: 0x%ux Program: %s, ProgVers: %d, " "Proc: %d) to rpc-transport (%s)", rpcreq->xid, rpcreq-> prog->progname, rpcreq->prog->progver, rpcreq->procnum , rpc->conn.trans->name); } while (0) | |||
1487 | rpcreq->procnum, rpc->conn.trans->name)do { do { if (0) printf ("failed to submit rpc-request " "(XID: 0x%ux Program: %s, ProgVers: %d, " "Proc: %d) to rpc-transport (%s)", rpcreq->xid, rpcreq-> prog->progname, rpcreq->prog->progver, rpcreq->procnum , rpc->conn.trans->name); } while (0); _gf_log (conn-> trans->name, "rpc-clnt.c", __FUNCTION__, 1487, GF_LOG_WARNING , "failed to submit rpc-request " "(XID: 0x%ux Program: %s, ProgVers: %d, " "Proc: %d) to rpc-transport (%s)", rpcreq->xid, rpcreq-> prog->progname, rpcreq->prog->progver, rpcreq->procnum , rpc->conn.trans->name); } while (0); | |||
1488 | } | |||
1489 | ||||
1490 | if ((ret >= 0) && frame) { | |||
1491 | /* Save the frame in queue */ | |||
1492 | __save_frame (rpc, frame, rpcreq); | |||
1493 | ||||
1494 | gf_log ("rpc-clnt", GF_LOG_TRACE, "submitted request "do { do { if (0) printf ("submitted request " "(XID: 0x%ux Program: %s, ProgVers: %d, " "Proc: %d) to rpc-transport (%s)", rpcreq->xid, rpcreq-> prog->progname, rpcreq->prog->progver, rpcreq->procnum , rpc->conn.trans->name); } while (0); _gf_log ("rpc-clnt" , "rpc-clnt.c", __FUNCTION__, 1498, GF_LOG_TRACE, "submitted request " "(XID: 0x%ux Program: %s, ProgVers: %d, " "Proc: %d) to rpc-transport (%s)" , rpcreq->xid, rpcreq->prog->progname, rpcreq->prog ->progver, rpcreq->procnum, rpc->conn.trans->name ); } while (0) | |||
1495 | "(XID: 0x%ux Program: %s, ProgVers: %d, "do { do { if (0) printf ("submitted request " "(XID: 0x%ux Program: %s, ProgVers: %d, " "Proc: %d) to rpc-transport (%s)", rpcreq->xid, rpcreq-> prog->progname, rpcreq->prog->progver, rpcreq->procnum , rpc->conn.trans->name); } while (0); _gf_log ("rpc-clnt" , "rpc-clnt.c", __FUNCTION__, 1498, GF_LOG_TRACE, "submitted request " "(XID: 0x%ux Program: %s, ProgVers: %d, " "Proc: %d) to rpc-transport (%s)" , rpcreq->xid, rpcreq->prog->progname, rpcreq->prog ->progver, rpcreq->procnum, rpc->conn.trans->name ); } while (0) | |||
1496 | "Proc: %d) to rpc-transport (%s)", rpcreq->xid,do { do { if (0) printf ("submitted request " "(XID: 0x%ux Program: %s, ProgVers: %d, " "Proc: %d) to rpc-transport (%s)", rpcreq->xid, rpcreq-> prog->progname, rpcreq->prog->progver, rpcreq->procnum , rpc->conn.trans->name); } while (0); _gf_log ("rpc-clnt" , "rpc-clnt.c", __FUNCTION__, 1498, GF_LOG_TRACE, "submitted request " "(XID: 0x%ux Program: %s, ProgVers: %d, " "Proc: %d) to rpc-transport (%s)" , rpcreq->xid, rpcreq->prog->progname, rpcreq->prog ->progver, rpcreq->procnum, rpc->conn.trans->name ); } while (0) | |||
1497 | rpcreq->prog->progname, rpcreq->prog->progver,do { do { if (0) printf ("submitted request " "(XID: 0x%ux Program: %s, ProgVers: %d, " "Proc: %d) to rpc-transport (%s)", rpcreq->xid, rpcreq-> prog->progname, rpcreq->prog->progver, rpcreq->procnum , rpc->conn.trans->name); } while (0); _gf_log ("rpc-clnt" , "rpc-clnt.c", __FUNCTION__, 1498, GF_LOG_TRACE, "submitted request " "(XID: 0x%ux Program: %s, ProgVers: %d, " "Proc: %d) to rpc-transport (%s)" , rpcreq->xid, rpcreq->prog->progname, rpcreq->prog ->progver, rpcreq->procnum, rpc->conn.trans->name ); } while (0) | |||
1498 | rpcreq->procnum, rpc->conn.trans->name)do { do { if (0) printf ("submitted request " "(XID: 0x%ux Program: %s, ProgVers: %d, " "Proc: %d) to rpc-transport (%s)", rpcreq->xid, rpcreq-> prog->progname, rpcreq->prog->progver, rpcreq->procnum , rpc->conn.trans->name); } while (0); _gf_log ("rpc-clnt" , "rpc-clnt.c", __FUNCTION__, 1498, GF_LOG_TRACE, "submitted request " "(XID: 0x%ux Program: %s, ProgVers: %d, " "Proc: %d) to rpc-transport (%s)" , rpcreq->xid, rpcreq->prog->progname, rpcreq->prog ->progver, rpcreq->procnum, rpc->conn.trans->name ); } while (0); | |||
1499 | } | |||
1500 | } | |||
1501 | pthread_mutex_unlock (&conn->lock); | |||
1502 | ||||
1503 | if (ret == -1) { | |||
1504 | goto out; | |||
1505 | } | |||
1506 | ||||
1507 | ret = 0; | |||
1508 | ||||
1509 | out: | |||
1510 | if (request_iob) { | |||
1511 | iobuf_unref (request_iob); | |||
1512 | } | |||
1513 | ||||
1514 | if (new_iobref && iobref) { | |||
1515 | iobref_unref (iobref); | |||
1516 | } | |||
1517 | ||||
1518 | if (frame && (ret == -1)) { | |||
1519 | if (rpcreq) { | |||
1520 | rpcreq->rpc_status = -1; | |||
1521 | cbkfn (rpcreq, NULL((void*)0), 0, frame); | |||
1522 | mem_put (rpcreq); | |||
1523 | } | |||
1524 | } | |||
1525 | return ret; | |||
1526 | } | |||
1527 | ||||
1528 | ||||
1529 | struct rpc_clnt * | |||
1530 | rpc_clnt_ref (struct rpc_clnt *rpc) | |||
1531 | { | |||
1532 | if (!rpc) | |||
1533 | return NULL((void*)0); | |||
1534 | pthread_mutex_lock (&rpc->lock); | |||
1535 | { | |||
1536 | rpc->refcount++; | |||
1537 | } | |||
1538 | pthread_mutex_unlock (&rpc->lock); | |||
1539 | return rpc; | |||
1540 | } | |||
1541 | ||||
1542 | ||||
1543 | static void | |||
1544 | rpc_clnt_destroy (struct rpc_clnt *rpc) | |||
1545 | { | |||
1546 | if (!rpc) | |||
1547 | return; | |||
1548 | ||||
1549 | if (rpc->conn.trans) { | |||
1550 | rpc_transport_unregister_notify (rpc->conn.trans); | |||
1551 | rpc_transport_disconnect (rpc->conn.trans); | |||
1552 | rpc_transport_unref (rpc->conn.trans); | |||
1553 | } | |||
1554 | ||||
1555 | rpc_clnt_reconnect_cleanup (&rpc->conn); | |||
1556 | saved_frames_destroy (rpc->conn.saved_frames); | |||
1557 | pthread_mutex_destroy (&rpc->lock); | |||
1558 | pthread_mutex_destroy (&rpc->conn.lock); | |||
1559 | ||||
1560 | /* mem-pool should be destroyed, otherwise, | |||
1561 | it will cause huge memory leaks */ | |||
1562 | mem_pool_destroy (rpc->reqpool); | |||
1563 | mem_pool_destroy (rpc->saved_frames_pool); | |||
1564 | ||||
1565 | GF_FREE (rpc)__gf_free (rpc); | |||
1566 | return; | |||
1567 | } | |||
1568 | ||||
1569 | struct rpc_clnt * | |||
1570 | rpc_clnt_unref (struct rpc_clnt *rpc) | |||
1571 | { | |||
1572 | int count = 0; | |||
1573 | ||||
1574 | if (!rpc) | |||
1575 | return NULL((void*)0); | |||
1576 | pthread_mutex_lock (&rpc->lock); | |||
1577 | { | |||
1578 | count = --rpc->refcount; | |||
1579 | } | |||
1580 | pthread_mutex_unlock (&rpc->lock); | |||
1581 | if (!count) { | |||
1582 | rpc_clnt_destroy (rpc); | |||
1583 | return NULL((void*)0); | |||
1584 | } | |||
1585 | return rpc; | |||
1586 | } | |||
1587 | ||||
1588 | ||||
1589 | void | |||
1590 | rpc_clnt_disable (struct rpc_clnt *rpc) | |||
1591 | { | |||
1592 | rpc_clnt_connection_t *conn = NULL((void*)0); | |||
1593 | ||||
1594 | if (!rpc) { | |||
1595 | goto out; | |||
1596 | } | |||
1597 | ||||
1598 | conn = &rpc->conn; | |||
1599 | ||||
1600 | pthread_mutex_lock (&conn->lock); | |||
1601 | { | |||
1602 | rpc->disabled = 1; | |||
1603 | ||||
1604 | if (conn->timer) { | |||
1605 | gf_timer_call_cancel (rpc->ctx, conn->timer); | |||
1606 | conn->timer = NULL((void*)0); | |||
1607 | } | |||
1608 | ||||
1609 | if (conn->reconnect) { | |||
1610 | gf_timer_call_cancel (rpc->ctx, conn->reconnect); | |||
1611 | conn->reconnect = NULL((void*)0); | |||
1612 | } | |||
1613 | conn->connected = 0; | |||
1614 | ||||
1615 | if (conn->ping_timer) { | |||
1616 | gf_timer_call_cancel (rpc->ctx, conn->ping_timer); | |||
1617 | conn->ping_timer = NULL((void*)0); | |||
1618 | conn->ping_started = 0; | |||
1619 | } | |||
1620 | ||||
1621 | } | |||
1622 | pthread_mutex_unlock (&conn->lock); | |||
1623 | ||||
1624 | rpc_transport_disconnect (rpc->conn.trans); | |||
1625 | ||||
1626 | out: | |||
1627 | return; | |||
1628 | } | |||
1629 | ||||
1630 | ||||
1631 | void | |||
1632 | rpc_clnt_reconfig (struct rpc_clnt *rpc, struct rpc_clnt_config *config) | |||
1633 | { | |||
1634 | if (config->rpc_timeout) { | |||
1635 | if (config->rpc_timeout != rpc->conn.config.rpc_timeout) | |||
1636 | gf_log (rpc->conn.trans->name, GF_LOG_INFO,do { do { if (0) printf ("changing timeout to %d (from %d)", config ->rpc_timeout, rpc->conn.config.rpc_timeout); } while ( 0); _gf_log (rpc->conn.trans->name, "rpc-clnt.c", __FUNCTION__ , 1639, GF_LOG_INFO, "changing timeout to %d (from %d)", config ->rpc_timeout, rpc->conn.config.rpc_timeout); } while ( 0) | |||
1637 | "changing timeout to %d (from %d)",do { do { if (0) printf ("changing timeout to %d (from %d)", config ->rpc_timeout, rpc->conn.config.rpc_timeout); } while ( 0); _gf_log (rpc->conn.trans->name, "rpc-clnt.c", __FUNCTION__ , 1639, GF_LOG_INFO, "changing timeout to %d (from %d)", config ->rpc_timeout, rpc->conn.config.rpc_timeout); } while ( 0) | |||
1638 | config->rpc_timeout,do { do { if (0) printf ("changing timeout to %d (from %d)", config ->rpc_timeout, rpc->conn.config.rpc_timeout); } while ( 0); _gf_log (rpc->conn.trans->name, "rpc-clnt.c", __FUNCTION__ , 1639, GF_LOG_INFO, "changing timeout to %d (from %d)", config ->rpc_timeout, rpc->conn.config.rpc_timeout); } while ( 0) | |||
1639 | rpc->conn.config.rpc_timeout)do { do { if (0) printf ("changing timeout to %d (from %d)", config ->rpc_timeout, rpc->conn.config.rpc_timeout); } while ( 0); _gf_log (rpc->conn.trans->name, "rpc-clnt.c", __FUNCTION__ , 1639, GF_LOG_INFO, "changing timeout to %d (from %d)", config ->rpc_timeout, rpc->conn.config.rpc_timeout); } while ( 0); | |||
1640 | rpc->conn.config.rpc_timeout = config->rpc_timeout; | |||
1641 | } | |||
1642 | ||||
1643 | if (config->remote_port) { | |||
1644 | if (config->remote_port != rpc->conn.config.remote_port) | |||
1645 | gf_log (rpc->conn.trans->name, GF_LOG_INFO,do { do { if (0) printf ("changing port to %d (from %d)", config ->remote_port, rpc->conn.config.remote_port); } while ( 0); _gf_log (rpc->conn.trans->name, "rpc-clnt.c", __FUNCTION__ , 1648, GF_LOG_INFO, "changing port to %d (from %d)", config-> remote_port, rpc->conn.config.remote_port); } while (0) | |||
1646 | "changing port to %d (from %d)",do { do { if (0) printf ("changing port to %d (from %d)", config ->remote_port, rpc->conn.config.remote_port); } while ( 0); _gf_log (rpc->conn.trans->name, "rpc-clnt.c", __FUNCTION__ , 1648, GF_LOG_INFO, "changing port to %d (from %d)", config-> remote_port, rpc->conn.config.remote_port); } while (0) | |||
1647 | config->remote_port,do { do { if (0) printf ("changing port to %d (from %d)", config ->remote_port, rpc->conn.config.remote_port); } while ( 0); _gf_log (rpc->conn.trans->name, "rpc-clnt.c", __FUNCTION__ , 1648, GF_LOG_INFO, "changing port to %d (from %d)", config-> remote_port, rpc->conn.config.remote_port); } while (0) | |||
1648 | rpc->conn.config.remote_port)do { do { if (0) printf ("changing port to %d (from %d)", config ->remote_port, rpc->conn.config.remote_port); } while ( 0); _gf_log (rpc->conn.trans->name, "rpc-clnt.c", __FUNCTION__ , 1648, GF_LOG_INFO, "changing port to %d (from %d)", config-> remote_port, rpc->conn.config.remote_port); } while (0); | |||
1649 | ||||
1650 | rpc->conn.config.remote_port = config->remote_port; | |||
1651 | } | |||
1652 | ||||
1653 | if (config->remote_host) { | |||
1654 | if (rpc->conn.config.remote_host) { | |||
1655 | if (strcmp (rpc->conn.config.remote_host, | |||
1656 | config->remote_host)) | |||
1657 | gf_log (rpc->conn.trans->name, GF_LOG_INFO,do { do { if (0) printf ("changing hostname to %s (from %s)", config->remote_host, rpc->conn.config.remote_host); } while (0); _gf_log (rpc->conn.trans->name, "rpc-clnt.c", __FUNCTION__ , 1660, GF_LOG_INFO, "changing hostname to %s (from %s)", config ->remote_host, rpc->conn.config.remote_host); } while ( 0) | |||
1658 | "changing hostname to %s (from %s)",do { do { if (0) printf ("changing hostname to %s (from %s)", config->remote_host, rpc->conn.config.remote_host); } while (0); _gf_log (rpc->conn.trans->name, "rpc-clnt.c", __FUNCTION__ , 1660, GF_LOG_INFO, "changing hostname to %s (from %s)", config ->remote_host, rpc->conn.config.remote_host); } while ( 0) | |||
1659 | config->remote_host,do { do { if (0) printf ("changing hostname to %s (from %s)", config->remote_host, rpc->conn.config.remote_host); } while (0); _gf_log (rpc->conn.trans->name, "rpc-clnt.c", __FUNCTION__ , 1660, GF_LOG_INFO, "changing hostname to %s (from %s)", config ->remote_host, rpc->conn.config.remote_host); } while ( 0) | |||
1660 | rpc->conn.config.remote_host)do { do { if (0) printf ("changing hostname to %s (from %s)", config->remote_host, rpc->conn.config.remote_host); } while (0); _gf_log (rpc->conn.trans->name, "rpc-clnt.c", __FUNCTION__ , 1660, GF_LOG_INFO, "changing hostname to %s (from %s)", config ->remote_host, rpc->conn.config.remote_host); } while ( 0); | |||
1661 | FREE (rpc->conn.config.remote_host)if (rpc->conn.config.remote_host != ((void*)0)) { free ((void *)rpc->conn.config.remote_host); rpc->conn.config.remote_host = (void *)0xeeeeeeee; }; | |||
1662 | } else { | |||
1663 | gf_log (rpc->conn.trans->name, GF_LOG_INFO,do { do { if (0) printf ("setting hostname to %s", config-> remote_host); } while (0); _gf_log (rpc->conn.trans->name , "rpc-clnt.c", __FUNCTION__, 1665, GF_LOG_INFO, "setting hostname to %s" , config->remote_host); } while (0) | |||
1664 | "setting hostname to %s",do { do { if (0) printf ("setting hostname to %s", config-> remote_host); } while (0); _gf_log (rpc->conn.trans->name , "rpc-clnt.c", __FUNCTION__, 1665, GF_LOG_INFO, "setting hostname to %s" , config->remote_host); } while (0) | |||
1665 | config->remote_host)do { do { if (0) printf ("setting hostname to %s", config-> remote_host); } while (0); _gf_log (rpc->conn.trans->name , "rpc-clnt.c", __FUNCTION__, 1665, GF_LOG_INFO, "setting hostname to %s" , config->remote_host); } while (0); | |||
1666 | } | |||
1667 | ||||
1668 | rpc->conn.config.remote_host = gf_strdup (config->remote_host); | |||
1669 | } | |||
1670 | } | |||
1671 | ||||
1672 | int | |||
1673 | rpc_clnt_transport_unix_options_build (dict_t **options, char *filepath, | |||
1674 | int frame_timeout) | |||
1675 | { | |||
1676 | dict_t *dict = NULL((void*)0); | |||
1677 | char *fpath = NULL((void*)0); | |||
1678 | int ret = -1; | |||
1679 | ||||
1680 | GF_ASSERT (filepath)do { if (!(filepath)) { do { do { if (0) printf ("Assertion failed: " "filepath"); } while (0); _gf_log_callingfn ("", "rpc-clnt.c" , __FUNCTION__, 1680, GF_LOG_ERROR, "Assertion failed: " "filepath" ); } while (0); } } while (0); | |||
1681 | GF_ASSERT (options)do { if (!(options)) { do { do { if (0) printf ("Assertion failed: " "options"); } while (0); _gf_log_callingfn ("", "rpc-clnt.c" , __FUNCTION__, 1681, GF_LOG_ERROR, "Assertion failed: " "options" ); } while (0); } } while (0); | |||
1682 | ||||
1683 | dict = dict_new (); | |||
1684 | if (!dict) | |||
1685 | goto out; | |||
1686 | ||||
1687 | fpath = gf_strdup (filepath); | |||
1688 | if (!fpath) { | |||
1689 | ret = -1; | |||
1690 | goto out; | |||
1691 | } | |||
1692 | ||||
1693 | ret = dict_set_dynstr (dict, "transport.socket.connect-path", fpath); | |||
1694 | if (ret) | |||
1695 | goto out; | |||
1696 | ||||
1697 | ret = dict_set_str (dict, "transport.address-family", "unix"); | |||
1698 | if (ret) | |||
1699 | goto out; | |||
1700 | ||||
1701 | ret = dict_set_str (dict, "transport.socket.nodelay", "off"); | |||
1702 | if (ret) | |||
1703 | goto out; | |||
1704 | ||||
1705 | ret = dict_set_str (dict, "transport-type", "socket"); | |||
1706 | if (ret) | |||
1707 | goto out; | |||
1708 | ||||
1709 | ret = dict_set_str (dict, "transport.socket.keepalive", "off"); | |||
1710 | if (ret) | |||
1711 | goto out; | |||
1712 | ||||
1713 | if (frame_timeout > 0) { | |||
1714 | ret = dict_set_int32 (dict, "frame-timeout", frame_timeout); | |||
1715 | if (ret) | |||
1716 | goto out; | |||
1717 | } | |||
1718 | ||||
1719 | *options = dict; | |||
1720 | out: | |||
1721 | if (ret) { | |||
1722 | GF_FREE (fpath)__gf_free (fpath); | |||
1723 | if (dict) | |||
1724 | dict_unref (dict); | |||
1725 | } | |||
1726 | return ret; | |||
1727 | } |