File: | xlators/mgmt/glusterd/src/glusterd-replace-brick.c |
Location: | line 2020, column 17 |
Description: | Value stored to 'ret' is never read |
1 | /* |
2 | Copyright (c) 2011-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 | #ifndef _CONFIG_H |
11 | #define _CONFIG_H |
12 | #include "config.h" |
13 | #endif |
14 | |
15 | #include "common-utils.h" |
16 | #include "cli1-xdr.h" |
17 | #include "xdr-generic.h" |
18 | #include "glusterfs.h" |
19 | #include "glusterd.h" |
20 | #include "glusterd-op-sm.h" |
21 | #include "glusterd-store.h" |
22 | #include "glusterd-utils.h" |
23 | #include "glusterd-volgen.h" |
24 | #include "run.h" |
25 | #include "syscall.h" |
26 | |
27 | #include <signal.h> |
28 | |
29 | #define GLUSTERD_GET_RB_MNTPT(path, len, volinfo)snprintf (path, len, "/usr/local/var" "/run/gluster""/%s-""rb_mount" , volinfo->volname); \ |
30 | snprintf (path, len, \ |
31 | DEFAULT_VAR_RUN_DIRECTORY"/usr/local/var" "/run/gluster""/%s-"RB_CLIENT_MOUNTPOINT"rb_mount", \ |
32 | volinfo->volname); |
33 | |
34 | |
35 | int |
36 | glusterd_get_replace_op_str (gf1_cli_replace_op op, char *op_str) |
37 | { |
38 | int ret = -1; |
39 | |
40 | if (!op_str) |
41 | goto out; |
42 | |
43 | switch (op) { |
44 | case GF_REPLACE_OP_START: |
45 | strcpy (op_str, "start"); |
46 | break; |
47 | case GF_REPLACE_OP_COMMIT: |
48 | strcpy (op_str, "commit"); |
49 | break; |
50 | case GF_REPLACE_OP_PAUSE: |
51 | strcpy (op_str, "pause"); |
52 | break; |
53 | case GF_REPLACE_OP_ABORT: |
54 | strcpy (op_str, "abort"); |
55 | break; |
56 | case GF_REPLACE_OP_STATUS: |
57 | strcpy (op_str, "status"); |
58 | break; |
59 | case GF_REPLACE_OP_COMMIT_FORCE: |
60 | strcpy (op_str, "commit-force"); |
61 | break; |
62 | default: |
63 | strcpy (op_str, "unknown"); |
64 | break; |
65 | } |
66 | |
67 | ret = 0; |
68 | out: |
69 | return ret; |
70 | } |
71 | |
72 | int |
73 | __glusterd_handle_replace_brick (rpcsvc_request_t *req) |
74 | { |
75 | int32_t ret = -1; |
76 | gf_cli_req cli_req = {{0,}}; |
77 | dict_t *dict = NULL((void*)0); |
78 | char *src_brick = NULL((void*)0); |
79 | char *dst_brick = NULL((void*)0); |
80 | int32_t op = 0; |
81 | char operation[256]; |
82 | glusterd_op_t cli_op = GD_OP_REPLACE_BRICK; |
83 | char *volname = NULL((void*)0); |
84 | char msg[2048] = {0,}; |
85 | xlator_t *this = NULL((void*)0); |
86 | |
87 | GF_ASSERT (req)do { if (!(req)) { do { do { if (0) printf ("Assertion failed: " "req"); } while (0); _gf_log_callingfn ("", "glusterd-replace-brick.c" , __FUNCTION__, 87, GF_LOG_ERROR, "Assertion failed: " "req") ; } while (0); } } while (0); |
88 | this = THIS(*__glusterfs_this_location()); |
89 | GF_ASSERT (this)do { if (!(this)) { do { do { if (0) printf ("Assertion failed: " "this"); } while (0); _gf_log_callingfn ("", "glusterd-replace-brick.c" , __FUNCTION__, 89, GF_LOG_ERROR, "Assertion failed: " "this" ); } while (0); } } while (0); |
90 | |
91 | ret = xdr_to_generic (req->msg[0], &cli_req, (xdrproc_t)xdr_gf_cli_req); |
92 | if (ret < 0) { |
93 | //failed to decode msg; |
94 | req->rpc_err = GARBAGE_ARGS; |
95 | goto out; |
96 | } |
97 | |
98 | gf_log (this->name, GF_LOG_INFO, "Received replace brick req")do { do { if (0) printf ("Received replace brick req"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 98, GF_LOG_INFO, "Received replace brick req"); } while (0); |
99 | |
100 | if (cli_req.dict.dict_len) { |
101 | /* Unserialize the dictionary */ |
102 | dict = dict_new (); |
103 | |
104 | ret = dict_unserialize (cli_req.dict.dict_val, |
105 | cli_req.dict.dict_len, |
106 | &dict); |
107 | if (ret < 0) { |
108 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("failed to " "unserialize req-buffer to dictionary" ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 110, GF_LOG_ERROR, "failed to " "unserialize req-buffer to dictionary" ); } while (0) |
109 | "failed to "do { do { if (0) printf ("failed to " "unserialize req-buffer to dictionary" ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 110, GF_LOG_ERROR, "failed to " "unserialize req-buffer to dictionary" ); } while (0) |
110 | "unserialize req-buffer to dictionary")do { do { if (0) printf ("failed to " "unserialize req-buffer to dictionary" ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 110, GF_LOG_ERROR, "failed to " "unserialize req-buffer to dictionary" ); } while (0); |
111 | snprintf (msg, sizeof (msg), "Unable to decode the " |
112 | "command"); |
113 | goto out; |
114 | } |
115 | } |
116 | |
117 | ret = dict_get_str (dict, "volname", &volname); |
118 | if (ret) { |
119 | snprintf (msg, sizeof (msg), "Could not get volume name"); |
120 | gf_log (this->name, GF_LOG_ERROR, "%s", msg)do { do { if (0) printf ("%s", msg); } while (0); _gf_log (this ->name, "glusterd-replace-brick.c", __FUNCTION__, 120, GF_LOG_ERROR , "%s", msg); } while (0); |
121 | goto out; |
122 | } |
123 | |
124 | ret = dict_get_int32 (dict, "operation", &op); |
125 | if (ret) { |
126 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("dict_get on operation failed"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 127, GF_LOG_DEBUG, "dict_get on operation failed"); } while (0) |
127 | "dict_get on operation failed")do { do { if (0) printf ("dict_get on operation failed"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 127, GF_LOG_DEBUG, "dict_get on operation failed"); } while (0); |
128 | snprintf (msg, sizeof (msg), "Could not get operation"); |
129 | goto out; |
130 | } |
131 | |
132 | ret = dict_get_str (dict, "src-brick", &src_brick); |
133 | |
134 | if (ret) { |
135 | snprintf (msg, sizeof (msg), "Failed to get src brick"); |
136 | gf_log (this->name, GF_LOG_ERROR, "%s", msg)do { do { if (0) printf ("%s", msg); } while (0); _gf_log (this ->name, "glusterd-replace-brick.c", __FUNCTION__, 136, GF_LOG_ERROR , "%s", msg); } while (0); |
137 | goto out; |
138 | } |
139 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("src brick=%s", src_brick); } while ( 0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 140, GF_LOG_DEBUG, "src brick=%s", src_brick); } while (0) |
140 | "src brick=%s", src_brick)do { do { if (0) printf ("src brick=%s", src_brick); } while ( 0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 140, GF_LOG_DEBUG, "src brick=%s", src_brick); } while (0); |
141 | |
142 | ret = dict_get_str (dict, "dst-brick", &dst_brick); |
143 | |
144 | if (ret) { |
145 | snprintf (msg, sizeof (msg), "Failed to get dest brick"); |
146 | gf_log (this->name, GF_LOG_ERROR, "%s", msg)do { do { if (0) printf ("%s", msg); } while (0); _gf_log (this ->name, "glusterd-replace-brick.c", __FUNCTION__, 146, GF_LOG_ERROR , "%s", msg); } while (0); |
147 | goto out; |
148 | } |
149 | |
150 | (void) glusterd_get_replace_op_str (op, operation); |
151 | gf_log (this->name, GF_LOG_DEBUG, "dst brick=%s", dst_brick)do { do { if (0) printf ("dst brick=%s", dst_brick); } while ( 0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 151, GF_LOG_DEBUG, "dst brick=%s", dst_brick); } while (0); |
152 | gf_log (this->name, GF_LOG_INFO, "Received replace brick %s request",do { do { if (0) printf ("Received replace brick %s request", operation); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 153, GF_LOG_INFO, "Received replace brick %s request" , operation); } while (0) |
153 | operation)do { do { if (0) printf ("Received replace brick %s request", operation); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 153, GF_LOG_INFO, "Received replace brick %s request" , operation); } while (0); |
154 | |
155 | ret = glusterd_op_begin (req, GD_OP_REPLACE_BRICK, dict, |
156 | msg, sizeof (msg)); |
157 | |
158 | out: |
159 | free (cli_req.dict.dict_val);//malloced by xdr |
160 | |
161 | glusterd_friend_sm (); |
162 | glusterd_op_sm (); |
163 | |
164 | if (ret) { |
165 | if (msg[0] == '\0') |
166 | snprintf (msg, sizeof (msg), "Operation failed"); |
167 | ret = glusterd_op_send_cli_response (cli_op, ret, 0, req, |
168 | dict, msg); |
169 | } |
170 | |
171 | return ret; |
172 | } |
173 | |
174 | int |
175 | glusterd_handle_replace_brick (rpcsvc_request_t *req) |
176 | { |
177 | return glusterd_big_locked_handler (req, |
178 | __glusterd_handle_replace_brick); |
179 | } |
180 | |
181 | static int |
182 | glusterd_get_rb_dst_brickinfo (glusterd_volinfo_t *volinfo, |
183 | glusterd_brickinfo_t **brickinfo) |
184 | { |
185 | int32_t ret = -1; |
186 | |
187 | if (!volinfo || !brickinfo) |
188 | goto out; |
189 | |
190 | *brickinfo = volinfo->rep_brick.dst_brick; |
191 | |
192 | ret = 0; |
193 | |
194 | out: |
195 | return ret; |
196 | } |
197 | |
198 | int |
199 | glusterd_op_stage_replace_brick (dict_t *dict, char **op_errstr, |
200 | dict_t *rsp_dict) |
201 | { |
202 | int ret = 0; |
203 | int32_t port = 0; |
204 | char *src_brick = NULL((void*)0); |
205 | char *dst_brick = NULL((void*)0); |
206 | char *volname = NULL((void*)0); |
207 | int replace_op = 0; |
208 | glusterd_volinfo_t *volinfo = NULL((void*)0); |
209 | glusterd_brickinfo_t *src_brickinfo = NULL((void*)0); |
210 | char *host = NULL((void*)0); |
211 | char *path = NULL((void*)0); |
212 | char msg[2048] = {0}; |
213 | char *dup_dstbrick = NULL((void*)0); |
214 | glusterd_peerinfo_t *peerinfo = NULL((void*)0); |
215 | glusterd_brickinfo_t *dst_brickinfo = NULL((void*)0); |
216 | gf_boolean_t is_run = _gf_false; |
217 | dict_t *ctx = NULL((void*)0); |
218 | glusterd_conf_t *priv = NULL((void*)0); |
219 | char *savetok = NULL((void*)0); |
220 | char pidfile[PATH_MAX4096] = {0}; |
221 | char *task_id_str = NULL((void*)0); |
222 | xlator_t *this = NULL((void*)0); |
223 | gf_boolean_t is_force = _gf_false; |
224 | |
225 | this = THIS(*__glusterfs_this_location()); |
226 | GF_ASSERT (this)do { if (!(this)) { do { do { if (0) printf ("Assertion failed: " "this"); } while (0); _gf_log_callingfn ("", "glusterd-replace-brick.c" , __FUNCTION__, 226, GF_LOG_ERROR, "Assertion failed: " "this" ); } while (0); } } while (0); |
227 | |
228 | priv = this->private; |
229 | GF_ASSERT (priv)do { if (!(priv)) { do { do { if (0) printf ("Assertion failed: " "priv"); } while (0); _gf_log_callingfn ("", "glusterd-replace-brick.c" , __FUNCTION__, 229, GF_LOG_ERROR, "Assertion failed: " "priv" ); } while (0); } } while (0); |
230 | |
231 | ret = dict_get_str (dict, "src-brick", &src_brick); |
232 | |
233 | if (ret) { |
234 | gf_log (this->name, GF_LOG_ERROR, "Unable to get src brick")do { do { if (0) printf ("Unable to get src brick"); } while ( 0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 234, GF_LOG_ERROR, "Unable to get src brick"); } while (0); |
235 | goto out; |
236 | } |
237 | |
238 | gf_log (this->name, GF_LOG_DEBUG, "src brick=%s", src_brick)do { do { if (0) printf ("src brick=%s", src_brick); } while ( 0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 238, GF_LOG_DEBUG, "src brick=%s", src_brick); } while (0); |
239 | |
240 | ret = dict_get_str (dict, "dst-brick", &dst_brick); |
241 | |
242 | if (ret) { |
243 | gf_log (this->name, GF_LOG_ERROR, "Unable to get dest brick")do { do { if (0) printf ("Unable to get dest brick"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 243, GF_LOG_ERROR, "Unable to get dest brick"); } while (0); |
244 | goto out; |
245 | } |
246 | |
247 | gf_log (this->name, GF_LOG_DEBUG, "dst brick=%s", dst_brick)do { do { if (0) printf ("dst brick=%s", dst_brick); } while ( 0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 247, GF_LOG_DEBUG, "dst brick=%s", dst_brick); } while (0); |
248 | |
249 | ret = dict_get_str (dict, "volname", &volname); |
250 | |
251 | if (ret) { |
252 | gf_log (this->name, GF_LOG_ERROR, "Unable to get volume name")do { do { if (0) printf ("Unable to get volume name"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 252, GF_LOG_ERROR, "Unable to get volume name"); } while (0 ); |
253 | goto out; |
254 | } |
255 | |
256 | ret = dict_get_int32 (dict, "operation", (int32_t *)&replace_op); |
257 | if (ret) { |
258 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("dict get on replace-brick operation failed" ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 259, GF_LOG_DEBUG, "dict get on replace-brick operation failed" ); } while (0) |
259 | "dict get on replace-brick operation failed")do { do { if (0) printf ("dict get on replace-brick operation failed" ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 259, GF_LOG_DEBUG, "dict get on replace-brick operation failed" ); } while (0); |
260 | goto out; |
261 | } |
262 | |
263 | ret = glusterd_volinfo_find (volname, &volinfo); |
264 | if (ret) { |
265 | snprintf (msg, sizeof (msg), "volume: %s does not exist", |
266 | volname); |
267 | *op_errstr = gf_strdup (msg); |
268 | goto out; |
269 | } |
270 | |
271 | if (volinfo->backend == GD_VOL_BK_BD) { |
272 | snprintf (msg, sizeof (msg), "replace brick not supported " |
273 | "for Block backend volume"); |
274 | *op_errstr = gf_strdup (msg); |
275 | goto out; |
276 | } |
277 | |
278 | if (GLUSTERD_STATUS_STARTED != volinfo->status) { |
279 | ret = -1; |
280 | snprintf (msg, sizeof (msg), "volume: %s is not started", |
281 | volname); |
282 | *op_errstr = gf_strdup (msg); |
283 | goto out; |
284 | } |
285 | |
286 | if (!glusterd_store_is_valid_brickpath (volname, dst_brick) || |
287 | !glusterd_is_valid_volfpath (volname, dst_brick)) { |
288 | snprintf (msg, sizeof (msg), "brick path %s is too " |
289 | "long.", dst_brick); |
290 | gf_log (this->name, GF_LOG_ERROR, "%s", msg)do { do { if (0) printf ("%s", msg); } while (0); _gf_log (this ->name, "glusterd-replace-brick.c", __FUNCTION__, 290, GF_LOG_ERROR , "%s", msg); } while (0); |
291 | *op_errstr = gf_strdup (msg); |
292 | |
293 | ret = -1; |
294 | goto out; |
295 | } |
296 | |
297 | ret = glusterd_check_gsync_running (volinfo, &is_run); |
298 | if (ret && (is_run == _gf_false)) |
299 | gf_log (this->name, GF_LOG_WARNING, "Unable to get the status"do { do { if (0) printf ("Unable to get the status" " of active " "geo-replication"" session"); } while (0); _gf_log (this-> name, "glusterd-replace-brick.c", __FUNCTION__, 300, GF_LOG_WARNING , "Unable to get the status" " of active ""geo-replication"" session" ); } while (0) |
300 | " of active "GEOREP" session")do { do { if (0) printf ("Unable to get the status" " of active " "geo-replication"" session"); } while (0); _gf_log (this-> name, "glusterd-replace-brick.c", __FUNCTION__, 300, GF_LOG_WARNING , "Unable to get the status" " of active ""geo-replication"" session" ); } while (0); |
301 | if (is_run) { |
302 | gf_log (this->name, GF_LOG_WARNING, GEOREP" sessions active"do { do { if (0) printf ("geo-replication"" sessions active" "for the volume %s " , volname); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 303, GF_LOG_WARNING, "geo-replication"" sessions active" "for the volume %s ", volname); } while (0) |
303 | "for the volume %s ", volname)do { do { if (0) printf ("geo-replication"" sessions active" "for the volume %s " , volname); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 303, GF_LOG_WARNING, "geo-replication"" sessions active" "for the volume %s ", volname); } while (0); |
304 | snprintf (msg, sizeof(msg), GEOREP"geo-replication"" sessions are active " |
305 | "for the volume %s.\nStop "GEOREP"geo-replication" " sessions " |
306 | "involved in this volume. Use 'volume "GEOREP"geo-replication" |
307 | " status' command for more info.", |
308 | volname); |
309 | *op_errstr = gf_strdup (msg); |
310 | ret = -1; |
311 | goto out; |
312 | } |
313 | |
314 | if (glusterd_is_defrag_on(volinfo)) { |
315 | snprintf (msg, sizeof(msg), "Volume name %s rebalance is in " |
316 | "progress. Please retry after completion", volname); |
317 | gf_log (this->name, GF_LOG_ERROR, "%s", msg)do { do { if (0) printf ("%s", msg); } while (0); _gf_log (this ->name, "glusterd-replace-brick.c", __FUNCTION__, 317, GF_LOG_ERROR , "%s", msg); } while (0); |
318 | *op_errstr = gf_strdup (msg); |
319 | ret = -1; |
320 | goto out; |
321 | } |
322 | |
323 | ctx = glusterd_op_get_ctx(); |
324 | |
325 | switch (replace_op) { |
326 | case GF_REPLACE_OP_START: |
327 | if (glusterd_is_rb_started (volinfo)) { |
328 | snprintf (msg, sizeof (msg), "Replace brick is already " |
329 | "started for volume"); |
330 | gf_log (this->name, GF_LOG_ERROR, "%s", msg)do { do { if (0) printf ("%s", msg); } while (0); _gf_log (this ->name, "glusterd-replace-brick.c", __FUNCTION__, 330, GF_LOG_ERROR , "%s", msg); } while (0); |
331 | *op_errstr = gf_strdup (msg); |
332 | ret = -1; |
333 | goto out; |
334 | } |
335 | if (is_origin_glusterd ()) { |
336 | if (!ctx) { |
337 | ret = -1; |
338 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("Failed to get op_ctx"); } while (0) ; _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 339, GF_LOG_ERROR, "Failed to get op_ctx"); } while (0) |
339 | "Failed to get op_ctx")do { do { if (0) printf ("Failed to get op_ctx"); } while (0) ; _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 339, GF_LOG_ERROR, "Failed to get op_ctx"); } while (0); |
340 | goto out; |
341 | } |
342 | |
343 | ret = glusterd_generate_and_set_task_id |
344 | (ctx, GF_REPLACE_BRICK_TID_KEY"replace-brick-id"); |
345 | if (ret) { |
346 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("Failed to generate task-id"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 347, GF_LOG_ERROR, "Failed to generate task-id"); } while ( 0) |
347 | "Failed to generate task-id")do { do { if (0) printf ("Failed to generate task-id"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 347, GF_LOG_ERROR, "Failed to generate task-id"); } while ( 0); |
348 | goto out; |
349 | } |
350 | |
351 | } else { |
352 | ret = dict_get_str (dict, GF_REPLACE_BRICK_TID_KEY"replace-brick-id", |
353 | &task_id_str); |
354 | if (ret) { |
355 | gf_log (this->name, GF_LOG_WARNING,do { do { if (0) printf ("Missing replace-brick-id"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 356, GF_LOG_WARNING, "Missing replace-brick-id"); } while ( 0) |
356 | "Missing replace-brick-id")do { do { if (0) printf ("Missing replace-brick-id"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 356, GF_LOG_WARNING, "Missing replace-brick-id"); } while ( 0); |
357 | ret = 0; |
358 | } |
359 | } |
360 | is_force = dict_get_str_boolean (dict, "force", _gf_false); |
361 | |
362 | break; |
363 | |
364 | case GF_REPLACE_OP_PAUSE: |
365 | if (glusterd_is_rb_paused (volinfo)) { |
366 | gf_log (this->name, GF_LOG_ERROR, "Replace brick is "do { do { if (0) printf ("Replace brick is " "already paused for volume " ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 367, GF_LOG_ERROR, "Replace brick is " "already paused for volume " ); } while (0) |
367 | "already paused for volume ")do { do { if (0) printf ("Replace brick is " "already paused for volume " ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 367, GF_LOG_ERROR, "Replace brick is " "already paused for volume " ); } while (0); |
368 | ret = -1; |
369 | goto out; |
370 | } else if (!glusterd_is_rb_started(volinfo)) { |
371 | gf_log (this->name, GF_LOG_ERROR, "Replace brick is not"do { do { if (0) printf ("Replace brick is not" " started for volume " ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 372, GF_LOG_ERROR, "Replace brick is not" " started for volume " ); } while (0) |
372 | " started for volume ")do { do { if (0) printf ("Replace brick is not" " started for volume " ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 372, GF_LOG_ERROR, "Replace brick is not" " started for volume " ); } while (0); |
373 | ret = -1; |
374 | goto out; |
375 | } |
376 | break; |
377 | |
378 | case GF_REPLACE_OP_ABORT: |
379 | if (!glusterd_is_rb_ongoing (volinfo)) { |
380 | gf_log (this->name, GF_LOG_ERROR, "Replace brick is not"do { do { if (0) printf ("Replace brick is not" " started or paused for volume " ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 381, GF_LOG_ERROR, "Replace brick is not" " started or paused for volume " ); } while (0) |
381 | " started or paused for volume ")do { do { if (0) printf ("Replace brick is not" " started or paused for volume " ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 381, GF_LOG_ERROR, "Replace brick is not" " started or paused for volume " ); } while (0); |
382 | ret = -1; |
383 | goto out; |
384 | } |
385 | break; |
386 | |
387 | case GF_REPLACE_OP_COMMIT: |
388 | if (!glusterd_is_rb_ongoing (volinfo)) { |
389 | gf_log (this->name, GF_LOG_ERROR, "Replace brick is not "do { do { if (0) printf ("Replace brick is not " "started for volume " ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 390, GF_LOG_ERROR, "Replace brick is not " "started for volume " ); } while (0) |
390 | "started for volume ")do { do { if (0) printf ("Replace brick is not " "started for volume " ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 390, GF_LOG_ERROR, "Replace brick is not " "started for volume " ); } while (0); |
391 | ret = -1; |
392 | goto out; |
393 | } |
394 | break; |
395 | |
396 | case GF_REPLACE_OP_COMMIT_FORCE: |
397 | is_force = _gf_true; |
398 | break; |
399 | |
400 | case GF_REPLACE_OP_STATUS: |
401 | |
402 | if (glusterd_is_rb_ongoing (volinfo) == _gf_false) { |
403 | ret = gf_asprintf (op_errstr, "replace-brick not" |
404 | " started on volume %s", |
405 | volinfo->volname); |
406 | if (ret < 0) { |
407 | *op_errstr = NULL((void*)0); |
408 | goto out; |
409 | } |
410 | |
411 | gf_log (this->name, GF_LOG_ERROR, "%s", *op_errstr)do { do { if (0) printf ("%s", *op_errstr); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__, 411 , GF_LOG_ERROR, "%s", *op_errstr); } while (0); |
412 | ret = -1; |
413 | goto out; |
414 | } |
415 | break; |
416 | |
417 | default: |
418 | ret = -1; |
419 | goto out; |
420 | } |
421 | |
422 | ret = glusterd_volume_brickinfo_get_by_brick (src_brick, volinfo, |
423 | &src_brickinfo); |
424 | if (ret) { |
425 | snprintf (msg, sizeof (msg), "brick: %s does not exist in " |
426 | "volume: %s", src_brick, volname); |
427 | *op_errstr = gf_strdup (msg); |
428 | goto out; |
429 | } |
430 | |
431 | if (ctx) { |
432 | if (!glusterd_is_fuse_available ()) { |
433 | gf_log (this->name, GF_LOG_ERROR, "Unable to open /dev/"do { do { if (0) printf ("Unable to open /dev/" "fuse (%s), replace-brick command failed" , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "glusterd-replace-brick.c", __FUNCTION__, 435, GF_LOG_ERROR , "Unable to open /dev/" "fuse (%s), replace-brick command failed" , strerror ((*__errno_location ()))); } while (0) |
434 | "fuse (%s), replace-brick command failed",do { do { if (0) printf ("Unable to open /dev/" "fuse (%s), replace-brick command failed" , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "glusterd-replace-brick.c", __FUNCTION__, 435, GF_LOG_ERROR , "Unable to open /dev/" "fuse (%s), replace-brick command failed" , strerror ((*__errno_location ()))); } while (0) |
435 | strerror (errno))do { do { if (0) printf ("Unable to open /dev/" "fuse (%s), replace-brick command failed" , strerror ((*__errno_location ()))); } while (0); _gf_log (this ->name, "glusterd-replace-brick.c", __FUNCTION__, 435, GF_LOG_ERROR , "Unable to open /dev/" "fuse (%s), replace-brick command failed" , strerror ((*__errno_location ()))); } while (0); |
436 | snprintf (msg, sizeof(msg), "Fuse unavailable\n " |
437 | "Replace-brick failed"); |
438 | *op_errstr = gf_strdup (msg); |
439 | ret = -1; |
440 | goto out; |
441 | } |
442 | } |
443 | |
444 | if (glusterd_is_local_addr (src_brickinfo->hostname)) { |
445 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("I AM THE SOURCE HOST"); } while (0) ; _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 446, GF_LOG_DEBUG, "I AM THE SOURCE HOST"); } while (0) |
446 | "I AM THE SOURCE HOST")do { do { if (0) printf ("I AM THE SOURCE HOST"); } while (0) ; _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 446, GF_LOG_DEBUG, "I AM THE SOURCE HOST"); } while (0); |
447 | if (src_brickinfo->port && rsp_dict) { |
448 | ret = dict_set_int32 (rsp_dict, "src-brick-port", |
449 | src_brickinfo->port); |
450 | if (ret) { |
451 | gf_log ("", GF_LOG_DEBUG,do { do { if (0) printf ("Could not set src-brick-port=%d", src_brickinfo ->port); } while (0); _gf_log ("", "glusterd-replace-brick.c" , __FUNCTION__, 453, GF_LOG_DEBUG, "Could not set src-brick-port=%d" , src_brickinfo->port); } while (0) |
452 | "Could not set src-brick-port=%d",do { do { if (0) printf ("Could not set src-brick-port=%d", src_brickinfo ->port); } while (0); _gf_log ("", "glusterd-replace-brick.c" , __FUNCTION__, 453, GF_LOG_DEBUG, "Could not set src-brick-port=%d" , src_brickinfo->port); } while (0) |
453 | src_brickinfo->port)do { do { if (0) printf ("Could not set src-brick-port=%d", src_brickinfo ->port); } while (0); _gf_log ("", "glusterd-replace-brick.c" , __FUNCTION__, 453, GF_LOG_DEBUG, "Could not set src-brick-port=%d" , src_brickinfo->port); } while (0); |
454 | } |
455 | } |
456 | |
457 | GLUSTERD_GET_BRICK_PIDFILE (pidfile, volinfo, src_brickinfo,do { char exp_path[4096] = {0,}; char volpath[4096] = {0,}; snprintf (volpath, 4096, "%s/vols/%s", priv->workdir, volinfo-> volname);; do { int i = 0; for (i = 1; i < strlen (src_brickinfo ->path); i++) { exp_path[i-1] = src_brickinfo->path[i]; if (exp_path[i-1] == '/') exp_path[i-1] = '-'; } } while (0) ; snprintf (pidfile, 4096, "%s/run/%s-%s.pid", volpath, src_brickinfo ->hostname, exp_path); } while (0) |
458 | priv)do { char exp_path[4096] = {0,}; char volpath[4096] = {0,}; snprintf (volpath, 4096, "%s/vols/%s", priv->workdir, volinfo-> volname);; do { int i = 0; for (i = 1; i < strlen (src_brickinfo ->path); i++) { exp_path[i-1] = src_brickinfo->path[i]; if (exp_path[i-1] == '/') exp_path[i-1] = '-'; } } while (0) ; snprintf (pidfile, 4096, "%s/run/%s-%s.pid", volpath, src_brickinfo ->hostname, exp_path); } while (0); |
459 | if ((replace_op != GF_REPLACE_OP_COMMIT_FORCE) && |
460 | !glusterd_is_service_running (pidfile, NULL((void*)0))) { |
461 | snprintf(msg, sizeof(msg), "Source brick %s:%s " |
462 | "is not online.", src_brickinfo->hostname, |
463 | src_brickinfo->path); |
464 | *op_errstr = gf_strdup (msg); |
465 | ret = -1; |
466 | goto out; |
467 | } |
468 | |
469 | |
470 | } |
471 | |
472 | dup_dstbrick = gf_strdup (dst_brick); |
473 | if (!dup_dstbrick) { |
474 | ret = -1; |
475 | gf_log (this->name, GF_LOG_ERROR, "Memory allocation failed")do { do { if (0) printf ("Memory allocation failed"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 475, GF_LOG_ERROR, "Memory allocation failed"); } while (0); |
476 | goto out; |
477 | } |
478 | host = strtok_r (dup_dstbrick, ":", &savetok); |
479 | path = strtok_r (NULL((void*)0), ":", &savetok); |
480 | |
481 | if (!host || !path) { |
482 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("dst brick %s is not of form <HOSTNAME>:<export-dir>" , dst_brick); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 484, GF_LOG_ERROR, "dst brick %s is not of form <HOSTNAME>:<export-dir>" , dst_brick); } while (0) |
483 | "dst brick %s is not of form <HOSTNAME>:<export-dir>",do { do { if (0) printf ("dst brick %s is not of form <HOSTNAME>:<export-dir>" , dst_brick); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 484, GF_LOG_ERROR, "dst brick %s is not of form <HOSTNAME>:<export-dir>" , dst_brick); } while (0) |
484 | dst_brick)do { do { if (0) printf ("dst brick %s is not of form <HOSTNAME>:<export-dir>" , dst_brick); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 484, GF_LOG_ERROR, "dst brick %s is not of form <HOSTNAME>:<export-dir>" , dst_brick); } while (0); |
485 | ret = -1; |
486 | goto out; |
487 | } |
488 | |
489 | ret = glusterd_brickinfo_new_from_brick (dst_brick, &dst_brickinfo); |
490 | if (ret) |
491 | goto out; |
492 | |
493 | ret = glusterd_new_brick_validate (dst_brick, dst_brickinfo, |
494 | msg, sizeof (msg)); |
495 | if (ret) { |
496 | *op_errstr = gf_strdup (msg); |
497 | ret = -1; |
498 | gf_log (this->name, GF_LOG_ERROR, "%s", *op_errstr)do { do { if (0) printf ("%s", *op_errstr); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__, 498 , GF_LOG_ERROR, "%s", *op_errstr); } while (0); |
499 | goto out; |
500 | } |
501 | |
502 | if (!glusterd_is_rb_ongoing (volinfo) && |
503 | (replace_op == GF_REPLACE_OP_START || |
504 | replace_op == GF_REPLACE_OP_COMMIT_FORCE)) { |
505 | |
506 | volinfo->rep_brick.src_brick = src_brickinfo; |
507 | volinfo->rep_brick.dst_brick = dst_brickinfo; |
508 | } |
509 | |
510 | if (glusterd_rb_check_bricks (volinfo, src_brickinfo, dst_brickinfo)) { |
511 | |
512 | ret = -1; |
513 | *op_errstr = gf_strdup ("Incorrect source or " |
514 | "destination brick"); |
515 | if (*op_errstr) |
516 | gf_log (this->name, GF_LOG_ERROR, "%s", *op_errstr)do { do { if (0) printf ("%s", *op_errstr); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__, 516 , GF_LOG_ERROR, "%s", *op_errstr); } while (0); |
517 | goto out; |
518 | } |
519 | |
520 | if (!glusterd_is_rb_ongoing (volinfo) && |
521 | glusterd_is_local_addr (host)) { |
522 | ret = glusterd_validate_and_create_brickpath (dst_brickinfo, |
523 | volinfo->volume_id, |
524 | op_errstr, is_force); |
525 | if (ret) |
526 | goto out; |
527 | } |
528 | |
529 | if (!glusterd_is_local_addr (host)) { |
530 | ret = glusterd_friend_find (NULL((void*)0), host, &peerinfo); |
531 | if (ret) { |
532 | snprintf (msg, sizeof (msg), "%s, is not a friend", |
533 | host); |
534 | *op_errstr = gf_strdup (msg); |
535 | goto out; |
536 | } |
537 | |
538 | if (!peerinfo->connected) { |
539 | snprintf (msg, sizeof (msg), "%s, is not connected at " |
540 | "the moment", host); |
541 | *op_errstr = gf_strdup (msg); |
542 | ret = -1; |
543 | goto out; |
544 | } |
545 | |
546 | if (GD_FRIEND_STATE_BEFRIENDED != peerinfo->state.state) { |
547 | snprintf (msg, sizeof (msg), "%s, is not befriended " |
548 | "at the moment", host); |
549 | *op_errstr = gf_strdup (msg); |
550 | ret = -1; |
551 | goto out; |
552 | } |
553 | } |
554 | |
555 | if (replace_op == GF_REPLACE_OP_START && |
556 | glusterd_is_local_addr (volinfo->rep_brick.dst_brick->hostname)) { |
557 | port = pmap_registry_alloc (THIS(*__glusterfs_this_location())); |
558 | if (!port) { |
559 | gf_log (THIS->name, GF_LOG_CRITICAL,do { do { if (0) printf ("No free ports available"); } while ( 0); _gf_log ((*__glusterfs_this_location())->name, "glusterd-replace-brick.c" , __FUNCTION__, 560, GF_LOG_CRITICAL, "No free ports available" ); } while (0) |
560 | "No free ports available")do { do { if (0) printf ("No free ports available"); } while ( 0); _gf_log ((*__glusterfs_this_location())->name, "glusterd-replace-brick.c" , __FUNCTION__, 560, GF_LOG_CRITICAL, "No free ports available" ); } while (0); |
561 | ret = -1; |
562 | goto out; |
563 | } |
564 | |
565 | ctx = glusterd_op_get_ctx(); |
566 | ret = dict_set_int32 ((ctx)?ctx:rsp_dict, "dst-brick-port", |
567 | port); |
568 | if (ret) { |
569 | gf_log (THIS->name, GF_LOG_ERROR, "Failed to set dst "do { do { if (0) printf ("Failed to set dst " "brick port"); } while (0); _gf_log ((*__glusterfs_this_location())->name, "glusterd-replace-brick.c", __FUNCTION__, 570, GF_LOG_ERROR, "Failed to set dst " "brick port"); } while (0) |
570 | "brick port")do { do { if (0) printf ("Failed to set dst " "brick port"); } while (0); _gf_log ((*__glusterfs_this_location())->name, "glusterd-replace-brick.c", __FUNCTION__, 570, GF_LOG_ERROR, "Failed to set dst " "brick port"); } while (0); |
571 | goto out; |
572 | } |
573 | volinfo->rep_brick.dst_brick->port = port; |
574 | } |
575 | |
576 | ret = 0; |
577 | |
578 | out: |
579 | GF_FREE (dup_dstbrick)__gf_free (dup_dstbrick); |
580 | gf_log (this->name, GF_LOG_DEBUG, "Returning %d", ret)do { do { if (0) printf ("Returning %d", ret); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__, 580 , GF_LOG_DEBUG, "Returning %d", ret); } while (0); |
581 | |
582 | return ret; |
583 | } |
584 | |
585 | static int |
586 | rb_set_mntfd (int mntfd) |
587 | { |
588 | int ret = -1; |
589 | dict_t *ctx = NULL((void*)0); |
590 | |
591 | ctx = glusterd_op_get_ctx (); |
592 | if (!ctx) { |
593 | gf_log (THIS->name, GF_LOG_CRITICAL, "Failed to get op ctx")do { do { if (0) printf ("Failed to get op ctx"); } while (0) ; _gf_log ((*__glusterfs_this_location())->name, "glusterd-replace-brick.c" , __FUNCTION__, 593, GF_LOG_CRITICAL, "Failed to get op ctx") ; } while (0); |
594 | goto out; |
595 | } |
596 | ret = dict_set_int32 (ctx, "mntfd", mntfd); |
597 | if (ret) |
598 | gf_log (THIS->name, GF_LOG_DEBUG, "Failed to set mnt fd "do { do { if (0) printf ("Failed to set mnt fd " "in op ctx") ; } while (0); _gf_log ((*__glusterfs_this_location())->name , "glusterd-replace-brick.c", __FUNCTION__, 599, GF_LOG_DEBUG , "Failed to set mnt fd " "in op ctx"); } while (0) |
599 | "in op ctx")do { do { if (0) printf ("Failed to set mnt fd " "in op ctx") ; } while (0); _gf_log ((*__glusterfs_this_location())->name , "glusterd-replace-brick.c", __FUNCTION__, 599, GF_LOG_DEBUG , "Failed to set mnt fd " "in op ctx"); } while (0); |
600 | out: |
601 | return ret; |
602 | } |
603 | |
604 | static int |
605 | rb_get_mntfd (int *mntfd) |
606 | { |
607 | int ret = -1; |
608 | dict_t *ctx = NULL((void*)0); |
609 | |
610 | ctx = glusterd_op_get_ctx (); |
611 | if (!ctx) { |
612 | gf_log (THIS->name, GF_LOG_CRITICAL, "Failed to get op ctx")do { do { if (0) printf ("Failed to get op ctx"); } while (0) ; _gf_log ((*__glusterfs_this_location())->name, "glusterd-replace-brick.c" , __FUNCTION__, 612, GF_LOG_CRITICAL, "Failed to get op ctx") ; } while (0); |
613 | goto out; |
614 | } |
615 | ret = dict_get_int32 (ctx, "mntfd", mntfd); |
616 | if (ret) |
617 | gf_log (THIS->name, GF_LOG_DEBUG, "Failed to get mnt fd "do { do { if (0) printf ("Failed to get mnt fd " "from op ctx" ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "glusterd-replace-brick.c", __FUNCTION__, 618, GF_LOG_DEBUG , "Failed to get mnt fd " "from op ctx"); } while (0) |
618 | "from op ctx")do { do { if (0) printf ("Failed to get mnt fd " "from op ctx" ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "glusterd-replace-brick.c", __FUNCTION__, 618, GF_LOG_DEBUG , "Failed to get mnt fd " "from op ctx"); } while (0); |
619 | out: |
620 | return ret; |
621 | } |
622 | |
623 | static int |
624 | rb_regenerate_volfiles (glusterd_volinfo_t *volinfo, |
625 | glusterd_brickinfo_t *brickinfo, |
626 | int32_t pump_needed) |
627 | { |
628 | dict_t *dict = NULL((void*)0); |
629 | int ret = 0; |
630 | |
631 | dict = volinfo->dict; |
632 | |
633 | gf_log ("", GF_LOG_DEBUG,do { do { if (0) printf ("attempting to set pump value=%d", pump_needed ); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 634, GF_LOG_DEBUG, "attempting to set pump value=%d", pump_needed ); } while (0) |
634 | "attempting to set pump value=%d", pump_needed)do { do { if (0) printf ("attempting to set pump value=%d", pump_needed ); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 634, GF_LOG_DEBUG, "attempting to set pump value=%d", pump_needed ); } while (0); |
635 | |
636 | ret = dict_set_int32 (dict, "enable-pump", pump_needed); |
637 | if (ret) { |
638 | gf_log ("", GF_LOG_DEBUG,do { do { if (0) printf ("could not dict_set enable-pump"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 639, GF_LOG_DEBUG, "could not dict_set enable-pump"); } while (0) |
639 | "could not dict_set enable-pump")do { do { if (0) printf ("could not dict_set enable-pump"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 639, GF_LOG_DEBUG, "could not dict_set enable-pump"); } while (0); |
640 | goto out; |
641 | } |
642 | |
643 | ret = glusterd_create_rb_volfiles (volinfo, brickinfo); |
644 | |
645 | dict_del (dict, "enable-pump"); |
646 | |
647 | out: |
648 | return ret; |
649 | } |
650 | |
651 | static int |
652 | rb_src_brick_restart (glusterd_volinfo_t *volinfo, |
653 | glusterd_brickinfo_t *src_brickinfo, |
654 | int activate_pump) |
655 | { |
656 | int ret = 0; |
657 | |
658 | gf_log ("", GF_LOG_DEBUG,do { do { if (0) printf ("Attempting to kill src"); } while ( 0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 659 , GF_LOG_DEBUG, "Attempting to kill src"); } while (0) |
659 | "Attempting to kill src")do { do { if (0) printf ("Attempting to kill src"); } while ( 0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 659 , GF_LOG_DEBUG, "Attempting to kill src"); } while (0); |
660 | |
661 | ret = glusterd_nfs_server_stop (volinfo); |
662 | |
663 | if (ret) { |
664 | gf_log ("", GF_LOG_ERROR, "Unable to stop nfs, ret: %d",do { do { if (0) printf ("Unable to stop nfs, ret: %d", ret); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 665, GF_LOG_ERROR, "Unable to stop nfs, ret: %d", ret); } while (0) |
665 | ret)do { do { if (0) printf ("Unable to stop nfs, ret: %d", ret); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 665, GF_LOG_ERROR, "Unable to stop nfs, ret: %d", ret); } while (0); |
666 | } |
667 | |
668 | ret = glusterd_volume_stop_glusterfs (volinfo, src_brickinfo, |
669 | _gf_false); |
670 | if (ret) { |
671 | gf_log ("", GF_LOG_ERROR, "Unable to stop "do { do { if (0) printf ("Unable to stop " "glusterfs, ret: %d" , ret); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 672, GF_LOG_ERROR, "Unable to stop " "glusterfs, ret: %d" , ret); } while (0) |
672 | "glusterfs, ret: %d", ret)do { do { if (0) printf ("Unable to stop " "glusterfs, ret: %d" , ret); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 672, GF_LOG_ERROR, "Unable to stop " "glusterfs, ret: %d" , ret); } while (0); |
673 | goto out; |
674 | } |
675 | |
676 | glusterd_delete_volfile (volinfo, src_brickinfo); |
677 | |
678 | if (activate_pump) { |
679 | ret = rb_regenerate_volfiles (volinfo, src_brickinfo, 1); |
680 | if (ret) { |
681 | gf_log ("", GF_LOG_DEBUG,do { do { if (0) printf ("Could not regenerate volfiles with pump" ); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 682, GF_LOG_DEBUG, "Could not regenerate volfiles with pump" ); } while (0) |
682 | "Could not regenerate volfiles with pump")do { do { if (0) printf ("Could not regenerate volfiles with pump" ); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 682, GF_LOG_DEBUG, "Could not regenerate volfiles with pump" ); } while (0); |
683 | goto out; |
684 | } |
685 | } else { |
686 | ret = rb_regenerate_volfiles (volinfo, src_brickinfo, 0); |
687 | if (ret) { |
688 | gf_log ("", GF_LOG_DEBUG,do { do { if (0) printf ("Could not regenerate volfiles without pump" ); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 689, GF_LOG_DEBUG, "Could not regenerate volfiles without pump" ); } while (0) |
689 | "Could not regenerate volfiles without pump")do { do { if (0) printf ("Could not regenerate volfiles without pump" ); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 689, GF_LOG_DEBUG, "Could not regenerate volfiles without pump" ); } while (0); |
690 | goto out; |
691 | } |
692 | |
693 | } |
694 | |
695 | sleep (2); |
696 | ret = glusterd_volume_start_glusterfs (volinfo, src_brickinfo, |
697 | _gf_false); |
698 | if (ret) { |
699 | gf_log ("", GF_LOG_ERROR, "Unable to start "do { do { if (0) printf ("Unable to start " "glusterfs, ret: %d" , ret); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 700, GF_LOG_ERROR, "Unable to start " "glusterfs, ret: %d" , ret); } while (0) |
700 | "glusterfs, ret: %d", ret)do { do { if (0) printf ("Unable to start " "glusterfs, ret: %d" , ret); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 700, GF_LOG_ERROR, "Unable to start " "glusterfs, ret: %d" , ret); } while (0); |
701 | goto out; |
702 | } |
703 | |
704 | out: |
705 | ret = glusterd_nfs_server_start (volinfo); |
706 | if (ret) { |
707 | gf_log ("", GF_LOG_ERROR, "Unable to start nfs, ret: %d",do { do { if (0) printf ("Unable to start nfs, ret: %d", ret) ; } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 708, GF_LOG_ERROR, "Unable to start nfs, ret: %d", ret); } while (0) |
708 | ret)do { do { if (0) printf ("Unable to start nfs, ret: %d", ret) ; } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 708, GF_LOG_ERROR, "Unable to start nfs, ret: %d", ret); } while (0); |
709 | } |
710 | return ret; |
711 | } |
712 | |
713 | static int |
714 | rb_send_xattr_command (glusterd_volinfo_t *volinfo, |
715 | glusterd_brickinfo_t *src_brickinfo, |
716 | glusterd_brickinfo_t *dst_brickinfo, |
717 | const char *xattr_key, const char *value) |
718 | { |
719 | int ret = -1; |
720 | int mntfd = -1; |
721 | |
722 | ret = rb_get_mntfd (&mntfd); |
723 | if (ret) |
724 | goto out; |
725 | |
726 | ret = sys_fsetxattr (mntfd, xattr_key, value, strlen (value) + 1, 0); |
727 | if (ret) |
728 | gf_log (THIS->name, GF_LOG_DEBUG, "setxattr on key: "do { do { if (0) printf ("setxattr on key: " "%s, reason: %s" , xattr_key, strerror ((*__errno_location ()))); } while (0); _gf_log ((*__glusterfs_this_location())->name, "glusterd-replace-brick.c" , __FUNCTION__, 729, GF_LOG_DEBUG, "setxattr on key: " "%s, reason: %s" , xattr_key, strerror ((*__errno_location ()))); } while (0) |
729 | "%s, reason: %s", xattr_key, strerror (errno))do { do { if (0) printf ("setxattr on key: " "%s, reason: %s" , xattr_key, strerror ((*__errno_location ()))); } while (0); _gf_log ((*__glusterfs_this_location())->name, "glusterd-replace-brick.c" , __FUNCTION__, 729, GF_LOG_DEBUG, "setxattr on key: " "%s, reason: %s" , xattr_key, strerror ((*__errno_location ()))); } while (0); |
730 | |
731 | out: |
732 | return ret; |
733 | } |
734 | |
735 | static int |
736 | rb_spawn_dst_brick (glusterd_volinfo_t *volinfo, |
737 | glusterd_brickinfo_t *brickinfo) |
738 | { |
739 | glusterd_conf_t *priv = NULL((void*)0); |
740 | runner_t runner = {0,}; |
741 | int ret = -1; |
742 | int32_t port = 0; |
743 | |
744 | priv = THIS(*__glusterfs_this_location())->private; |
745 | |
746 | port = brickinfo->port; |
747 | GF_ASSERT (port)do { if (!(port)) { do { do { if (0) printf ("Assertion failed: " "port"); } while (0); _gf_log_callingfn ("", "glusterd-replace-brick.c" , __FUNCTION__, 747, GF_LOG_ERROR, "Assertion failed: " "port" ); } while (0); } } while (0); |
748 | |
749 | runinit (&runner); |
750 | runner_add_arg (&runner, SBIN_DIR"/usr/local/sbin""/glusterfs"); |
751 | runner_argprintf (&runner, "-f" "%s/vols/%s/"RB_DSTBRICKVOL_FILENAME"rb_dst_brick.vol", |
752 | priv->workdir, volinfo->volname); |
753 | runner_argprintf (&runner, "-p" "%s/vols/%s/"RB_DSTBRICK_PIDFILE"rb_dst_brick.pid", |
754 | priv->workdir, volinfo->volname); |
755 | runner_add_arg (&runner, "--xlator-option"); |
756 | runner_argprintf (&runner, "src-server.listen-port=%d", port); |
757 | if (volinfo->memory_accounting) |
758 | runner_add_arg (&runner, "--mem-accounting"); |
759 | |
760 | ret = runner_run_nowait (&runner); |
761 | if (ret) { |
762 | pmap_registry_remove (THIS(*__glusterfs_this_location()), 0, brickinfo->path, |
763 | GF_PMAP_PORT_BRICKSERVER, NULL((void*)0)); |
764 | gf_log ("", GF_LOG_DEBUG,do { do { if (0) printf ("Could not start glusterfs"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 765 , GF_LOG_DEBUG, "Could not start glusterfs"); } while (0) |
765 | "Could not start glusterfs")do { do { if (0) printf ("Could not start glusterfs"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 765 , GF_LOG_DEBUG, "Could not start glusterfs"); } while (0); |
766 | goto out; |
767 | } |
768 | |
769 | gf_log ("", GF_LOG_DEBUG,do { do { if (0) printf ("Successfully started glusterfs: brick=%s:%s" , brickinfo->hostname, brickinfo->path); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 771, GF_LOG_DEBUG , "Successfully started glusterfs: brick=%s:%s", brickinfo-> hostname, brickinfo->path); } while (0) |
770 | "Successfully started glusterfs: brick=%s:%s",do { do { if (0) printf ("Successfully started glusterfs: brick=%s:%s" , brickinfo->hostname, brickinfo->path); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 771, GF_LOG_DEBUG , "Successfully started glusterfs: brick=%s:%s", brickinfo-> hostname, brickinfo->path); } while (0) |
771 | brickinfo->hostname, brickinfo->path)do { do { if (0) printf ("Successfully started glusterfs: brick=%s:%s" , brickinfo->hostname, brickinfo->path); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 771, GF_LOG_DEBUG , "Successfully started glusterfs: brick=%s:%s", brickinfo-> hostname, brickinfo->path); } while (0); |
772 | |
773 | ret = 0; |
774 | |
775 | out: |
776 | return ret; |
777 | } |
778 | |
779 | static int |
780 | rb_spawn_glusterfs_client (glusterd_volinfo_t *volinfo, |
781 | glusterd_brickinfo_t *brickinfo) |
782 | { |
783 | xlator_t *this = NULL((void*)0); |
784 | glusterd_conf_t *priv = NULL((void*)0); |
785 | runner_t runner = {0,}; |
786 | struct stat buf = {0,}; |
787 | char mntpt[PATH_MAX4096] = {0,}; |
788 | int mntfd = -1; |
789 | int ret = -1; |
790 | |
791 | this = THIS(*__glusterfs_this_location()); |
792 | priv = this->private; |
793 | |
794 | GLUSTERD_GET_RB_MNTPT (mntpt, sizeof (mntpt), volinfo)snprintf (mntpt, sizeof (mntpt), "/usr/local/var" "/run/gluster" "/%s-""rb_mount", volinfo->volname);; |
795 | runinit (&runner); |
796 | runner_add_arg (&runner, SBIN_DIR"/usr/local/sbin""/glusterfs"); |
797 | runner_argprintf (&runner, "-f" "%s/vols/%s/"RB_CLIENTVOL_FILENAME"rb_client.vol", |
798 | priv->workdir, volinfo->volname); |
799 | runner_add_arg (&runner, mntpt); |
800 | if (volinfo->memory_accounting) |
801 | runner_add_arg (&runner, "--mem-accounting"); |
802 | |
803 | ret = runner_run_reuse (&runner); |
804 | if (ret) { |
805 | runner_log (&runner, this->name, GF_LOG_DEBUG, |
806 | "Could not start glusterfs"); |
807 | runner_end (&runner); |
808 | goto out; |
809 | } else { |
810 | runner_log (&runner, this->name, GF_LOG_DEBUG, |
811 | "Successfully started glusterfs"); |
812 | runner_end (&runner); |
813 | } |
814 | |
815 | ret = stat (mntpt, &buf); |
816 | if (ret) { |
817 | gf_log (this->name, GF_LOG_DEBUG, "stat on mount point %s "do { do { if (0) printf ("stat on mount point %s " "failed", mntpt ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 818, GF_LOG_DEBUG, "stat on mount point %s " "failed" , mntpt); } while (0) |
818 | "failed", mntpt)do { do { if (0) printf ("stat on mount point %s " "failed", mntpt ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 818, GF_LOG_DEBUG, "stat on mount point %s " "failed" , mntpt); } while (0); |
819 | goto out; |
820 | } |
821 | |
822 | mntfd = open (mntpt, O_DIRECTORY0200000); |
823 | if (mntfd == -1) |
824 | goto out; |
825 | |
826 | ret = rb_set_mntfd (mntfd); |
827 | if (ret) |
828 | goto out; |
829 | |
830 | runinit (&runner); |
831 | runner_add_args (&runner, "/bin/umount", "-l", mntpt, NULL((void*)0)); |
832 | ret = runner_run_reuse (&runner); |
833 | if (ret) { |
834 | runner_log (&runner, this->name, GF_LOG_DEBUG, |
835 | "Lazy unmount failed on maintenance client"); |
836 | runner_end (&runner); |
837 | goto out; |
838 | } else { |
839 | runner_log (&runner, this->name, GF_LOG_DEBUG, |
840 | "Successfully unmounted maintenance client"); |
841 | runner_end (&runner); |
842 | } |
843 | |
844 | |
845 | out: |
846 | |
847 | return ret; |
848 | } |
849 | |
850 | static const char *client_volfile_str = "volume mnt-client\n" |
851 | " type protocol/client\n" |
852 | " option remote-host %s\n" |
853 | " option remote-subvolume %s\n" |
854 | " option remote-port %d\n" |
855 | " option transport-type %s\n" |
856 | " option username %s\n" |
857 | " option password %s\n" |
858 | "end-volume\n" |
859 | "volume mnt-wb\n" |
860 | " type performance/write-behind\n" |
861 | " subvolumes mnt-client\n" |
862 | "end-volume\n"; |
863 | |
864 | static int |
865 | rb_generate_client_volfile (glusterd_volinfo_t *volinfo, |
866 | glusterd_brickinfo_t *src_brickinfo) |
867 | { |
868 | glusterd_conf_t *priv = NULL((void*)0); |
869 | xlator_t *this = NULL((void*)0); |
870 | FILE *file = NULL((void*)0); |
871 | char filename[PATH_MAX4096] = {0, }; |
872 | int ret = -1; |
873 | int fd = -1; |
874 | char *ttype = NULL((void*)0); |
875 | |
876 | this = THIS(*__glusterfs_this_location()); |
877 | priv = this->private; |
878 | |
879 | gf_log (this->name, GF_LOG_DEBUG, "Creating volfile")do { do { if (0) printf ("Creating volfile"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__, 879 , GF_LOG_DEBUG, "Creating volfile"); } while (0); |
880 | |
881 | snprintf (filename, PATH_MAX4096, "%s/vols/%s/%s", |
882 | priv->workdir, volinfo->volname, |
883 | RB_CLIENTVOL_FILENAME"rb_client.vol"); |
884 | |
885 | fd = open (filename, O_CREAT0100 | O_RDONLY00, S_IRUSR0400 | S_IWUSR0200); |
886 | if (fd < 0) { |
887 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("%s", strerror ((*__errno_location ( )))); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 888, GF_LOG_ERROR, "%s", strerror ((*__errno_location ()))); } while (0) |
888 | "%s", strerror (errno))do { do { if (0) printf ("%s", strerror ((*__errno_location ( )))); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 888, GF_LOG_ERROR, "%s", strerror ((*__errno_location ()))); } while (0); |
889 | goto out; |
890 | } |
891 | close (fd); |
892 | |
893 | file = fopen (filename, "w+"); |
894 | if (!file) { |
895 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("Open of volfile failed"); } while ( 0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 896, GF_LOG_DEBUG, "Open of volfile failed"); } while (0) |
896 | "Open of volfile failed")do { do { if (0) printf ("Open of volfile failed"); } while ( 0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 896, GF_LOG_DEBUG, "Open of volfile failed"); } while (0); |
897 | ret = -1; |
898 | goto out; |
899 | } |
900 | |
901 | GF_ASSERT (src_brickinfo->port)do { if (!(src_brickinfo->port)) { do { do { if (0) printf ("Assertion failed: " "src_brickinfo->port"); } while (0) ; _gf_log_callingfn ("", "glusterd-replace-brick.c", __FUNCTION__ , 901, GF_LOG_ERROR, "Assertion failed: " "src_brickinfo->port" ); } while (0); } } while (0); |
902 | |
903 | ttype = glusterd_get_trans_type_rb (volinfo->transport_type); |
904 | if (NULL((void*)0) == ttype){ |
905 | ret = -1; |
906 | goto out; |
907 | } |
908 | |
909 | fprintf (file, client_volfile_str, src_brickinfo->hostname, |
910 | src_brickinfo->path, |
911 | src_brickinfo->port, ttype, |
912 | glusterd_auth_get_username (volinfo), |
913 | glusterd_auth_get_password (volinfo)); |
914 | |
915 | fclose (file); |
916 | GF_FREE (ttype)__gf_free (ttype); |
917 | |
918 | ret = 0; |
919 | |
920 | out: |
921 | return ret; |
922 | } |
923 | |
924 | static const char *dst_brick_volfile_str = "volume src-posix\n" |
925 | " type storage/posix\n" |
926 | " option directory %s\n" |
927 | " option volume-id %s\n" |
928 | "end-volume\n" |
929 | "volume %s\n" |
930 | " type features/locks\n" |
931 | " subvolumes src-posix\n" |
932 | "end-volume\n" |
933 | "volume src-server\n" |
934 | " type protocol/server\n" |
935 | " option auth.login.%s.allow %s\n" |
936 | " option auth.login.%s.password %s\n" |
937 | " option auth.addr.%s.allow *\n" |
938 | " option transport-type %s\n" |
939 | " subvolumes %s\n" |
940 | "end-volume\n"; |
941 | |
942 | static int |
943 | rb_generate_dst_brick_volfile (glusterd_volinfo_t *volinfo, |
944 | glusterd_brickinfo_t *dst_brickinfo) |
945 | { |
946 | glusterd_conf_t *priv = NULL((void*)0); |
947 | xlator_t *this = NULL((void*)0); |
948 | FILE *file = NULL((void*)0); |
949 | char filename[PATH_MAX4096] = {0, }; |
950 | int ret = -1; |
951 | int fd = -1; |
952 | char *trans_type = NULL((void*)0); |
953 | |
954 | this = THIS(*__glusterfs_this_location()); |
955 | priv = this->private; |
956 | |
957 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("Creating volfile"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__, 958 , GF_LOG_DEBUG, "Creating volfile"); } while (0) |
958 | "Creating volfile")do { do { if (0) printf ("Creating volfile"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__, 958 , GF_LOG_DEBUG, "Creating volfile"); } while (0); |
959 | |
960 | snprintf (filename, PATH_MAX4096, "%s/vols/%s/%s", |
961 | priv->workdir, volinfo->volname, |
962 | RB_DSTBRICKVOL_FILENAME"rb_dst_brick.vol"); |
963 | |
964 | fd = creat (filename, S_IRUSR0400 | S_IWUSR0200); |
965 | if (fd < 0) { |
966 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("%s", strerror ((*__errno_location ( )))); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 967, GF_LOG_ERROR, "%s", strerror ((*__errno_location ()))); } while (0) |
967 | "%s", strerror (errno))do { do { if (0) printf ("%s", strerror ((*__errno_location ( )))); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 967, GF_LOG_ERROR, "%s", strerror ((*__errno_location ()))); } while (0); |
968 | goto out; |
969 | } |
970 | close (fd); |
971 | |
972 | file = fopen (filename, "w+"); |
973 | if (!file) { |
974 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("Open of volfile failed"); } while ( 0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 975, GF_LOG_DEBUG, "Open of volfile failed"); } while (0) |
975 | "Open of volfile failed")do { do { if (0) printf ("Open of volfile failed"); } while ( 0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 975, GF_LOG_DEBUG, "Open of volfile failed"); } while (0); |
976 | ret = -1; |
977 | goto out; |
978 | } |
979 | |
980 | trans_type = glusterd_get_trans_type_rb (volinfo->transport_type); |
981 | if (NULL((void*)0) == trans_type){ |
982 | ret = -1; |
983 | goto out; |
984 | } |
985 | |
986 | fprintf (file, dst_brick_volfile_str, |
987 | dst_brickinfo->path, |
988 | uuid_utoa (volinfo->volume_id), |
989 | dst_brickinfo->path, |
990 | dst_brickinfo->path, |
991 | glusterd_auth_get_username (volinfo), |
992 | glusterd_auth_get_username (volinfo), |
993 | glusterd_auth_get_password (volinfo), |
994 | dst_brickinfo->path, |
995 | trans_type, |
996 | dst_brickinfo->path); |
997 | |
998 | GF_FREE (trans_type)__gf_free (trans_type); |
999 | |
1000 | fclose (file); |
1001 | |
1002 | ret = 0; |
1003 | |
1004 | out: |
1005 | return ret; |
1006 | } |
1007 | |
1008 | |
1009 | static int |
1010 | rb_mountpoint_mkdir (glusterd_volinfo_t *volinfo, |
1011 | glusterd_brickinfo_t *src_brickinfo) |
1012 | { |
1013 | char mntpt[PATH_MAX4096] = {0,}; |
1014 | int ret = -1; |
1015 | |
1016 | GLUSTERD_GET_RB_MNTPT (mntpt, sizeof (mntpt), volinfo)snprintf (mntpt, sizeof (mntpt), "/usr/local/var" "/run/gluster" "/%s-""rb_mount", volinfo->volname);; |
1017 | ret = mkdir (mntpt, 0777); |
1018 | if (ret && (errno(*__errno_location ()) != EEXIST17)) { |
1019 | gf_log ("", GF_LOG_DEBUG, "mkdir failed, due to %s",do { do { if (0) printf ("mkdir failed, due to %s", strerror ( (*__errno_location ()))); } while (0); _gf_log ("", "glusterd-replace-brick.c" , __FUNCTION__, 1020, GF_LOG_DEBUG, "mkdir failed, due to %s" , strerror ((*__errno_location ()))); } while (0) |
1020 | strerror (errno))do { do { if (0) printf ("mkdir failed, due to %s", strerror ( (*__errno_location ()))); } while (0); _gf_log ("", "glusterd-replace-brick.c" , __FUNCTION__, 1020, GF_LOG_DEBUG, "mkdir failed, due to %s" , strerror ((*__errno_location ()))); } while (0); |
1021 | goto out; |
1022 | } |
1023 | |
1024 | ret = 0; |
1025 | |
1026 | out: |
1027 | return ret; |
1028 | } |
1029 | |
1030 | static int |
1031 | rb_mountpoint_rmdir (glusterd_volinfo_t *volinfo, |
1032 | glusterd_brickinfo_t *src_brickinfo) |
1033 | { |
1034 | char mntpt[PATH_MAX4096] = {0,}; |
1035 | int ret = -1; |
1036 | |
1037 | GLUSTERD_GET_RB_MNTPT (mntpt, sizeof (mntpt), volinfo)snprintf (mntpt, sizeof (mntpt), "/usr/local/var" "/run/gluster" "/%s-""rb_mount", volinfo->volname);; |
1038 | ret = rmdir (mntpt); |
1039 | if (ret) { |
1040 | gf_log ("", GF_LOG_DEBUG, "rmdir failed, reason: %s",do { do { if (0) printf ("rmdir failed, reason: %s", strerror ((*__errno_location ()))); } while (0); _gf_log ("", "glusterd-replace-brick.c" , __FUNCTION__, 1041, GF_LOG_DEBUG, "rmdir failed, reason: %s" , strerror ((*__errno_location ()))); } while (0) |
1041 | strerror (errno))do { do { if (0) printf ("rmdir failed, reason: %s", strerror ((*__errno_location ()))); } while (0); _gf_log ("", "glusterd-replace-brick.c" , __FUNCTION__, 1041, GF_LOG_DEBUG, "rmdir failed, reason: %s" , strerror ((*__errno_location ()))); } while (0); |
1042 | goto out; |
1043 | } |
1044 | |
1045 | ret = 0; |
1046 | |
1047 | out: |
1048 | return ret; |
1049 | } |
1050 | |
1051 | static int |
1052 | rb_destroy_maintenance_client (glusterd_volinfo_t *volinfo, |
1053 | glusterd_brickinfo_t *src_brickinfo) |
1054 | { |
1055 | xlator_t *this = NULL((void*)0); |
1056 | glusterd_conf_t *priv = NULL((void*)0); |
1057 | char volfile[PATH_MAX4096] = {0,}; |
1058 | int ret = -1; |
1059 | int mntfd = -1; |
1060 | |
1061 | this = THIS(*__glusterfs_this_location()); |
1062 | priv = this->private; |
1063 | |
1064 | ret = rb_get_mntfd (&mntfd); |
1065 | if (ret) |
1066 | goto out; |
1067 | |
1068 | ret = close (mntfd); |
1069 | if (ret) { |
1070 | gf_log (this->name, GF_LOG_DEBUG, "Failed to close mount "do { do { if (0) printf ("Failed to close mount " "point directory" ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1071, GF_LOG_DEBUG, "Failed to close mount " "point directory" ); } while (0) |
1071 | "point directory")do { do { if (0) printf ("Failed to close mount " "point directory" ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1071, GF_LOG_DEBUG, "Failed to close mount " "point directory" ); } while (0); |
1072 | goto out; |
1073 | } |
1074 | |
1075 | ret = rb_mountpoint_rmdir (volinfo, src_brickinfo); |
1076 | if (ret) { |
1077 | gf_log (this->name, GF_LOG_DEBUG, "rmdir of mountpoint "do { do { if (0) printf ("rmdir of mountpoint " "failed"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1078, GF_LOG_DEBUG, "rmdir of mountpoint " "failed"); } while (0) |
1078 | "failed")do { do { if (0) printf ("rmdir of mountpoint " "failed"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1078, GF_LOG_DEBUG, "rmdir of mountpoint " "failed"); } while (0); |
1079 | goto out; |
1080 | } |
1081 | |
1082 | snprintf (volfile, PATH_MAX4096, "%s/vols/%s/%s", priv->workdir, |
1083 | volinfo->volname, RB_CLIENTVOL_FILENAME"rb_client.vol"); |
1084 | |
1085 | ret = unlink (volfile); |
1086 | if (ret) { |
1087 | gf_log ("", GF_LOG_DEBUG, "unlink of %s failed, reason: %s",do { do { if (0) printf ("unlink of %s failed, reason: %s", volfile , strerror ((*__errno_location ()))); } while (0); _gf_log ("" , "glusterd-replace-brick.c", __FUNCTION__, 1088, GF_LOG_DEBUG , "unlink of %s failed, reason: %s", volfile, strerror ((*__errno_location ()))); } while (0) |
1088 | volfile, strerror (errno))do { do { if (0) printf ("unlink of %s failed, reason: %s", volfile , strerror ((*__errno_location ()))); } while (0); _gf_log ("" , "glusterd-replace-brick.c", __FUNCTION__, 1088, GF_LOG_DEBUG , "unlink of %s failed, reason: %s", volfile, strerror ((*__errno_location ()))); } while (0); |
1089 | goto out; |
1090 | } |
1091 | |
1092 | ret = 0; |
1093 | |
1094 | out: |
1095 | return ret; |
1096 | } |
1097 | |
1098 | static int |
1099 | rb_spawn_maintenance_client (glusterd_volinfo_t *volinfo, |
1100 | glusterd_brickinfo_t *src_brickinfo) |
1101 | { |
1102 | int ret = -1; |
1103 | |
1104 | ret = rb_generate_client_volfile (volinfo, src_brickinfo); |
1105 | if (ret) { |
1106 | gf_log ("", GF_LOG_DEBUG, "Unable to generate client "do { do { if (0) printf ("Unable to generate client " "volfile" ); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 1107, GF_LOG_DEBUG, "Unable to generate client " "volfile") ; } while (0) |
1107 | "volfile")do { do { if (0) printf ("Unable to generate client " "volfile" ); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 1107, GF_LOG_DEBUG, "Unable to generate client " "volfile") ; } while (0); |
1108 | goto out; |
1109 | } |
1110 | |
1111 | ret = rb_mountpoint_mkdir (volinfo, src_brickinfo); |
1112 | if (ret) { |
1113 | gf_log ("", GF_LOG_DEBUG, "Unable to mkdir "do { do { if (0) printf ("Unable to mkdir " "mountpoint"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1114 , GF_LOG_DEBUG, "Unable to mkdir " "mountpoint"); } while (0) |
1114 | "mountpoint")do { do { if (0) printf ("Unable to mkdir " "mountpoint"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1114 , GF_LOG_DEBUG, "Unable to mkdir " "mountpoint"); } while (0); |
1115 | goto out; |
1116 | } |
1117 | |
1118 | ret = rb_spawn_glusterfs_client (volinfo, src_brickinfo); |
1119 | if (ret) { |
1120 | gf_log ("", GF_LOG_DEBUG, "Unable to start glusterfs")do { do { if (0) printf ("Unable to start glusterfs"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1120 , GF_LOG_DEBUG, "Unable to start glusterfs"); } while (0); |
1121 | goto out; |
1122 | } |
1123 | |
1124 | ret = 0; |
1125 | out: |
1126 | return ret; |
1127 | } |
1128 | |
1129 | static int |
1130 | rb_spawn_destination_brick (glusterd_volinfo_t *volinfo, |
1131 | glusterd_brickinfo_t *dst_brickinfo) |
1132 | |
1133 | { |
1134 | int ret = -1; |
1135 | |
1136 | ret = rb_generate_dst_brick_volfile (volinfo, dst_brickinfo); |
1137 | if (ret) { |
1138 | gf_log ("", GF_LOG_DEBUG, "Unable to generate client "do { do { if (0) printf ("Unable to generate client " "volfile" ); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 1139, GF_LOG_DEBUG, "Unable to generate client " "volfile") ; } while (0) |
1139 | "volfile")do { do { if (0) printf ("Unable to generate client " "volfile" ); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 1139, GF_LOG_DEBUG, "Unable to generate client " "volfile") ; } while (0); |
1140 | goto out; |
1141 | } |
1142 | |
1143 | ret = rb_spawn_dst_brick (volinfo, dst_brickinfo); |
1144 | if (ret) { |
1145 | gf_log ("", GF_LOG_DEBUG, "Unable to start glusterfs")do { do { if (0) printf ("Unable to start glusterfs"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1145 , GF_LOG_DEBUG, "Unable to start glusterfs"); } while (0); |
1146 | goto out; |
1147 | } |
1148 | |
1149 | ret = 0; |
1150 | out: |
1151 | return ret; |
1152 | } |
1153 | |
1154 | static int |
1155 | rb_kill_destination_brick (glusterd_volinfo_t *volinfo, |
1156 | glusterd_brickinfo_t *dst_brickinfo) |
1157 | { |
1158 | glusterd_conf_t *priv = NULL((void*)0); |
1159 | char pidfile[PATH_MAX4096] = {0,}; |
1160 | |
1161 | priv = THIS(*__glusterfs_this_location())->private; |
1162 | |
1163 | snprintf (pidfile, PATH_MAX4096, "%s/vols/%s/%s", |
1164 | priv->workdir, volinfo->volname, |
1165 | RB_DSTBRICK_PIDFILE"rb_dst_brick.pid"); |
1166 | |
1167 | return glusterd_service_stop ("brick", pidfile, SIGTERM15, _gf_true); |
1168 | } |
1169 | |
1170 | static int |
1171 | rb_get_xattr_command (glusterd_volinfo_t *volinfo, |
1172 | glusterd_brickinfo_t *src_brickinfo, |
1173 | glusterd_brickinfo_t *dst_brickinfo, |
1174 | const char *xattr_key, |
1175 | char *value) |
1176 | { |
1177 | int ret = -1; |
1178 | int mntfd = -1; |
1179 | |
1180 | ret = rb_get_mntfd (&mntfd); |
1181 | if (ret) |
1182 | goto out; |
1183 | |
1184 | ret = sys_fgetxattr (mntfd, xattr_key, value, 8192); |
1185 | |
1186 | if (ret < 0) { |
1187 | gf_log (THIS->name, GF_LOG_DEBUG, "getxattr on key: %s "do { do { if (0) printf ("getxattr on key: %s " "failed, reason: %s" , xattr_key, strerror ((*__errno_location ()))); } while (0); _gf_log ((*__glusterfs_this_location())->name, "glusterd-replace-brick.c" , __FUNCTION__, 1188, GF_LOG_DEBUG, "getxattr on key: %s " "failed, reason: %s" , xattr_key, strerror ((*__errno_location ()))); } while (0) |
1188 | "failed, reason: %s", xattr_key, strerror (errno))do { do { if (0) printf ("getxattr on key: %s " "failed, reason: %s" , xattr_key, strerror ((*__errno_location ()))); } while (0); _gf_log ((*__glusterfs_this_location())->name, "glusterd-replace-brick.c" , __FUNCTION__, 1188, GF_LOG_DEBUG, "getxattr on key: %s " "failed, reason: %s" , xattr_key, strerror ((*__errno_location ()))); } while (0); |
1189 | goto out; |
1190 | } |
1191 | |
1192 | ret = 0; |
1193 | out: |
1194 | return ret; |
1195 | } |
1196 | |
1197 | static int |
1198 | rb_send_cmd (glusterd_volinfo_t *volinfo, |
1199 | glusterd_brickinfo_t *src, |
1200 | glusterd_brickinfo_t *dst, |
1201 | gf1_cli_replace_op op) |
1202 | { |
1203 | char start_value[8192] = {0,}; |
1204 | char status_str[8192] = {0,}; |
1205 | char *status_reply = NULL((void*)0); |
1206 | char *tmp = NULL((void*)0); |
1207 | char *save_ptr = NULL((void*)0); |
1208 | char filename[PATH_MAX4096] = {0,}; |
1209 | char *current_file = NULL((void*)0); |
1210 | uint64_t files = 0; |
1211 | int status = 0; |
1212 | dict_t *ctx = NULL((void*)0); |
1213 | int ret = 0; |
1214 | |
1215 | GF_ASSERT (volinfo)do { if (!(volinfo)) { do { do { if (0) printf ("Assertion failed: " "volinfo"); } while (0); _gf_log_callingfn ("", "glusterd-replace-brick.c" , __FUNCTION__, 1215, GF_LOG_ERROR, "Assertion failed: " "volinfo" ); } while (0); } } while (0); |
1216 | GF_ASSERT (src)do { if (!(src)) { do { do { if (0) printf ("Assertion failed: " "src"); } while (0); _gf_log_callingfn ("", "glusterd-replace-brick.c" , __FUNCTION__, 1216, GF_LOG_ERROR, "Assertion failed: " "src" ); } while (0); } } while (0); |
1217 | GF_ASSERT (dst)do { if (!(dst)) { do { do { if (0) printf ("Assertion failed: " "dst"); } while (0); _gf_log_callingfn ("", "glusterd-replace-brick.c" , __FUNCTION__, 1217, GF_LOG_ERROR, "Assertion failed: " "dst" ); } while (0); } } while (0); |
1218 | GF_ASSERT ((op > GF_REPLACE_OP_NONE)do { if (!((op > GF_REPLACE_OP_NONE) && (op <= GF_REPLACE_OP_COMMIT_FORCE ))) { do { do { if (0) printf ("Assertion failed: " "(op > GF_REPLACE_OP_NONE) && (op <= GF_REPLACE_OP_COMMIT_FORCE)" ); } while (0); _gf_log_callingfn ("", "glusterd-replace-brick.c" , __FUNCTION__, 1219, GF_LOG_ERROR, "Assertion failed: " "(op > GF_REPLACE_OP_NONE) && (op <= GF_REPLACE_OP_COMMIT_FORCE)" ); } while (0); } } while (0) |
1219 | && (op <= GF_REPLACE_OP_COMMIT_FORCE))do { if (!((op > GF_REPLACE_OP_NONE) && (op <= GF_REPLACE_OP_COMMIT_FORCE ))) { do { do { if (0) printf ("Assertion failed: " "(op > GF_REPLACE_OP_NONE) && (op <= GF_REPLACE_OP_COMMIT_FORCE)" ); } while (0); _gf_log_callingfn ("", "glusterd-replace-brick.c" , __FUNCTION__, 1219, GF_LOG_ERROR, "Assertion failed: " "(op > GF_REPLACE_OP_NONE) && (op <= GF_REPLACE_OP_COMMIT_FORCE)" ); } while (0); } } while (0); |
1220 | |
1221 | switch (op) { |
1222 | case GF_REPLACE_OP_START: |
1223 | { |
1224 | snprintf (start_value, sizeof (start_value), |
1225 | "%s:%s:%d", dst->hostname, dst->path, |
1226 | dst->port); |
1227 | ret = rb_send_xattr_command (volinfo, src, dst, |
1228 | RB_PUMP_CMD_START"glusterfs.pump.start", |
1229 | start_value); |
1230 | } |
1231 | break; |
1232 | case GF_REPLACE_OP_PAUSE: |
1233 | { |
1234 | ret = rb_send_xattr_command (volinfo, src, dst, |
1235 | RB_PUMP_CMD_PAUSE"glusterfs.pump.pause", |
1236 | RB_PUMP_DEF_ARG"default"); |
1237 | } |
1238 | break; |
1239 | case GF_REPLACE_OP_ABORT: |
1240 | { |
1241 | ret = rb_send_xattr_command (volinfo, src, dst, |
1242 | RB_PUMP_CMD_ABORT"glusterfs.pump.abort", |
1243 | RB_PUMP_DEF_ARG"default"); |
1244 | } |
1245 | break; |
1246 | case GF_REPLACE_OP_COMMIT: |
1247 | { |
1248 | ret = rb_send_xattr_command (volinfo, src, dst, |
1249 | RB_PUMP_CMD_COMMIT"glusterfs.pump.commit", |
1250 | RB_PUMP_DEF_ARG"default"); |
1251 | } |
1252 | break; |
1253 | case GF_REPLACE_OP_STATUS: |
1254 | { |
1255 | ret = rb_get_xattr_command (volinfo, src, dst, |
1256 | RB_PUMP_CMD_STATUS"glusterfs.pump.status", |
1257 | status_str); |
1258 | if (ret) |
1259 | goto out; |
1260 | |
1261 | ctx = glusterd_op_get_ctx (); |
1262 | GF_ASSERT (ctx)do { if (!(ctx)) { do { do { if (0) printf ("Assertion failed: " "ctx"); } while (0); _gf_log_callingfn ("", "glusterd-replace-brick.c" , __FUNCTION__, 1262, GF_LOG_ERROR, "Assertion failed: " "ctx" ); } while (0); } } while (0); |
1263 | if (!ctx) { |
1264 | ret = -1; |
1265 | gf_log (THIS->name, GF_LOG_CRITICAL,do { do { if (0) printf ("ctx is not present."); } while (0); _gf_log ((*__glusterfs_this_location())->name, "glusterd-replace-brick.c" , __FUNCTION__, 1266, GF_LOG_CRITICAL, "ctx is not present.") ; } while (0) |
1266 | "ctx is not present.")do { do { if (0) printf ("ctx is not present."); } while (0); _gf_log ((*__glusterfs_this_location())->name, "glusterd-replace-brick.c" , __FUNCTION__, 1266, GF_LOG_CRITICAL, "ctx is not present.") ; } while (0); |
1267 | goto out; |
1268 | } |
1269 | |
1270 | /* Split status reply into different parts */ |
1271 | tmp = strtok_r (status_str, ":", &save_ptr); |
1272 | if (!tmp) { |
1273 | ret = -1; |
1274 | gf_log (THIS->name, GF_LOG_ERROR,do { do { if (0) printf ("Couldn't tokenize status string"); } while (0); _gf_log ((*__glusterfs_this_location())->name, "glusterd-replace-brick.c", __FUNCTION__, 1275, GF_LOG_ERROR , "Couldn't tokenize status string"); } while (0) |
1275 | "Couldn't tokenize status string")do { do { if (0) printf ("Couldn't tokenize status string"); } while (0); _gf_log ((*__glusterfs_this_location())->name, "glusterd-replace-brick.c", __FUNCTION__, 1275, GF_LOG_ERROR , "Couldn't tokenize status string"); } while (0); |
1276 | goto out; |
1277 | } |
1278 | sscanf (tmp, "status=%d", &status); |
1279 | ret = dict_set_int32 (ctx, "status", status); |
1280 | if (ret) { |
1281 | gf_log (THIS->name, GF_LOG_ERROR, "Couldn't "do { do { if (0) printf ("Couldn't " "set rb status in context" ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "glusterd-replace-brick.c", __FUNCTION__, 1282, GF_LOG_ERROR , "Couldn't " "set rb status in context"); } while (0) |
1282 | "set rb status in context")do { do { if (0) printf ("Couldn't " "set rb status in context" ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "glusterd-replace-brick.c", __FUNCTION__, 1282, GF_LOG_ERROR , "Couldn't " "set rb status in context"); } while (0); |
1283 | goto out; |
1284 | } |
1285 | |
1286 | tmp = NULL((void*)0); |
1287 | tmp = strtok_r (NULL((void*)0), ":", &save_ptr); |
1288 | if (!tmp) { |
1289 | ret = -1; |
1290 | gf_log (THIS->name, GF_LOG_ERROR,do { do { if (0) printf ("Couldn't tokenize status string"); } while (0); _gf_log ((*__glusterfs_this_location())->name, "glusterd-replace-brick.c", __FUNCTION__, 1291, GF_LOG_ERROR , "Couldn't tokenize status string"); } while (0) |
1291 | "Couldn't tokenize status string")do { do { if (0) printf ("Couldn't tokenize status string"); } while (0); _gf_log ((*__glusterfs_this_location())->name, "glusterd-replace-brick.c", __FUNCTION__, 1291, GF_LOG_ERROR , "Couldn't tokenize status string"); } while (0); |
1292 | goto out; |
1293 | } |
1294 | sscanf (tmp, "no_of_files=%"SCNu64"ll" "u", &files); |
1295 | ret = dict_set_uint64 (ctx, "files", files); |
1296 | if (ret) { |
1297 | gf_log (THIS->name, GF_LOG_ERROR, "Couldn't "do { do { if (0) printf ("Couldn't " "set rb files in context" ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "glusterd-replace-brick.c", __FUNCTION__, 1298, GF_LOG_ERROR , "Couldn't " "set rb files in context"); } while (0) |
1298 | "set rb files in context")do { do { if (0) printf ("Couldn't " "set rb files in context" ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "glusterd-replace-brick.c", __FUNCTION__, 1298, GF_LOG_ERROR , "Couldn't " "set rb files in context"); } while (0); |
1299 | goto out; |
1300 | } |
1301 | |
1302 | if (status == 0) { |
1303 | tmp = NULL((void*)0); |
1304 | tmp = strtok_r (NULL((void*)0), ":", &save_ptr); |
1305 | if (!tmp) { |
1306 | ret = -1; |
1307 | gf_log (THIS->name, GF_LOG_ERROR,do { do { if (0) printf ("Couldn't tokenize status " "string" ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "glusterd-replace-brick.c", __FUNCTION__, 1309, GF_LOG_ERROR , "Couldn't tokenize status " "string"); } while (0) |
1308 | "Couldn't tokenize status "do { do { if (0) printf ("Couldn't tokenize status " "string" ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "glusterd-replace-brick.c", __FUNCTION__, 1309, GF_LOG_ERROR , "Couldn't tokenize status " "string"); } while (0) |
1309 | "string")do { do { if (0) printf ("Couldn't tokenize status " "string" ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "glusterd-replace-brick.c", __FUNCTION__, 1309, GF_LOG_ERROR , "Couldn't tokenize status " "string"); } while (0); |
1310 | goto out; |
1311 | } |
1312 | sscanf (tmp, "current_file=%s", filename); |
1313 | current_file = gf_strdup (filename); |
1314 | ret = dict_set_dynstr (ctx, "current_file", |
1315 | current_file); |
1316 | if (ret) { |
1317 | GF_FREE (current_file)__gf_free (current_file); |
1318 | gf_log (THIS->name, GF_LOG_ERROR,do { do { if (0) printf ("Couldn't set rb current file " "in context" ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "glusterd-replace-brick.c", __FUNCTION__, 1320, GF_LOG_ERROR , "Couldn't set rb current file " "in context"); } while (0) |
1319 | "Couldn't set rb current file "do { do { if (0) printf ("Couldn't set rb current file " "in context" ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "glusterd-replace-brick.c", __FUNCTION__, 1320, GF_LOG_ERROR , "Couldn't set rb current file " "in context"); } while (0) |
1320 | "in context")do { do { if (0) printf ("Couldn't set rb current file " "in context" ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "glusterd-replace-brick.c", __FUNCTION__, 1320, GF_LOG_ERROR , "Couldn't set rb current file " "in context"); } while (0); |
1321 | goto out; |
1322 | } |
1323 | } |
1324 | if (status) { |
1325 | ret = gf_asprintf (&status_reply, |
1326 | "Number of files migrated = %" |
1327 | PRIu64"ll" "u""\tMigration complete", |
1328 | files); |
1329 | } else { |
1330 | ret = gf_asprintf (&status_reply, |
1331 | "Number of files migrated = %" |
1332 | PRIu64"ll" "u""\tCurrent file = %s", |
1333 | files, filename); |
1334 | } |
1335 | if (ret == -1) { |
1336 | gf_log (THIS->name, GF_LOG_ERROR,do { do { if (0) printf ("Failed to create status_reply string" ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "glusterd-replace-brick.c", __FUNCTION__, 1337, GF_LOG_ERROR , "Failed to create status_reply string"); } while (0) |
1337 | "Failed to create status_reply string")do { do { if (0) printf ("Failed to create status_reply string" ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "glusterd-replace-brick.c", __FUNCTION__, 1337, GF_LOG_ERROR , "Failed to create status_reply string"); } while (0); |
1338 | goto out; |
1339 | } |
1340 | ret = dict_set_dynstr (ctx, "status-reply", |
1341 | status_reply); |
1342 | if (ret) { |
1343 | GF_FREE (status_reply)__gf_free (status_reply); |
1344 | gf_log (THIS->name, GF_LOG_ERROR, "Couldn't "do { do { if (0) printf ("Couldn't " "set rb status response in context." ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "glusterd-replace-brick.c", __FUNCTION__, 1345, GF_LOG_ERROR , "Couldn't " "set rb status response in context."); } while ( 0) |
1345 | "set rb status response in context.")do { do { if (0) printf ("Couldn't " "set rb status response in context." ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "glusterd-replace-brick.c", __FUNCTION__, 1345, GF_LOG_ERROR , "Couldn't " "set rb status response in context."); } while ( 0); |
1346 | goto out; |
1347 | } |
1348 | } |
1349 | break; |
1350 | default: |
1351 | { |
1352 | GF_ASSERT (0)do { if (!(0)) { do { do { if (0) printf ("Assertion failed: " "0"); } while (0); _gf_log_callingfn ("", "glusterd-replace-brick.c" , __FUNCTION__, 1352, GF_LOG_ERROR, "Assertion failed: " "0") ; } while (0); } } while (0); |
1353 | ret = -1; |
1354 | gf_log (THIS->name, GF_LOG_CRITICAL, "Invalid replace"do { do { if (0) printf ("Invalid replace" " brick subcommand." ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "glusterd-replace-brick.c", __FUNCTION__, 1355, GF_LOG_CRITICAL , "Invalid replace" " brick subcommand."); } while (0) |
1355 | " brick subcommand.")do { do { if (0) printf ("Invalid replace" " brick subcommand." ); } while (0); _gf_log ((*__glusterfs_this_location())->name , "glusterd-replace-brick.c", __FUNCTION__, 1355, GF_LOG_CRITICAL , "Invalid replace" " brick subcommand."); } while (0); |
1356 | } |
1357 | break; |
1358 | } |
1359 | out: |
1360 | return ret; |
1361 | } |
1362 | |
1363 | static int |
1364 | rb_do_operation (glusterd_volinfo_t *volinfo, |
1365 | glusterd_brickinfo_t *src_brickinfo, |
1366 | glusterd_brickinfo_t *dst_brickinfo, |
1367 | gf1_cli_replace_op op) |
1368 | { |
1369 | |
1370 | int ret = -1; |
1371 | char op_str[256] = {0, }; |
1372 | xlator_t *this = NULL((void*)0); |
1373 | |
1374 | this = THIS(*__glusterfs_this_location()); |
1375 | |
1376 | ret = rb_spawn_maintenance_client (volinfo, src_brickinfo); |
1377 | if (ret) { |
1378 | gf_log (this->name, GF_LOG_DEBUG, "Could not spawn "do { do { if (0) printf ("Could not spawn " "maintenance client" ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1379, GF_LOG_DEBUG, "Could not spawn " "maintenance client" ); } while (0) |
1379 | "maintenance client")do { do { if (0) printf ("Could not spawn " "maintenance client" ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1379, GF_LOG_DEBUG, "Could not spawn " "maintenance client" ); } while (0); |
1380 | goto umount; |
1381 | } |
1382 | |
1383 | ret = rb_send_cmd (volinfo, src_brickinfo, dst_brickinfo, op); |
1384 | if (ret) { |
1385 | (void) glusterd_get_replace_op_str (op, op_str); |
1386 | gf_log (this->name, GF_LOG_DEBUG, "Sending replace-brick "do { do { if (0) printf ("Sending replace-brick " "sub-command %s failed." , op_str); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1387, GF_LOG_DEBUG, "Sending replace-brick " "sub-command %s failed." , op_str); } while (0) |
1387 | "sub-command %s failed.", op_str)do { do { if (0) printf ("Sending replace-brick " "sub-command %s failed." , op_str); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1387, GF_LOG_DEBUG, "Sending replace-brick " "sub-command %s failed." , op_str); } while (0); |
1388 | } |
1389 | |
1390 | umount: |
1391 | if (rb_destroy_maintenance_client (volinfo, src_brickinfo)) |
1392 | gf_log (this->name, GF_LOG_DEBUG, "Failed to destroy "do { do { if (0) printf ("Failed to destroy " "maintenance client" ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1393, GF_LOG_DEBUG, "Failed to destroy " "maintenance client" ); } while (0) |
1393 | "maintenance client")do { do { if (0) printf ("Failed to destroy " "maintenance client" ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1393, GF_LOG_DEBUG, "Failed to destroy " "maintenance client" ); } while (0); |
1394 | |
1395 | return ret; |
1396 | } |
1397 | |
1398 | /* Set src-brick's port number to be used in the maintenance mount |
1399 | * after all commit acks are received. |
1400 | */ |
1401 | static int |
1402 | rb_update_srcbrick_port (glusterd_brickinfo_t *src_brickinfo, dict_t *rsp_dict, |
1403 | dict_t *req_dict, int32_t replace_op) |
1404 | { |
1405 | xlator_t *this = NULL((void*)0); |
1406 | dict_t *ctx = NULL((void*)0); |
1407 | int ret = 0; |
1408 | int dict_ret = 0; |
1409 | int src_port = 0; |
1410 | |
1411 | this = THIS(*__glusterfs_this_location()); |
1412 | |
1413 | dict_ret = dict_get_int32 (req_dict, "src-brick-port", &src_port); |
1414 | if (src_port) |
1415 | src_brickinfo->port = src_port; |
1416 | |
1417 | if (glusterd_is_local_addr (src_brickinfo->hostname)) { |
1418 | gf_log ("", GF_LOG_INFO,do { do { if (0) printf ("adding src-brick port no"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1419 , GF_LOG_INFO, "adding src-brick port no"); } while (0) |
1419 | "adding src-brick port no")do { do { if (0) printf ("adding src-brick port no"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1419 , GF_LOG_INFO, "adding src-brick port no"); } while (0); |
1420 | |
1421 | src_brickinfo->port = pmap_registry_search (this, |
1422 | src_brickinfo->path, GF_PMAP_PORT_BRICKSERVER); |
1423 | if (!src_brickinfo->port && |
1424 | replace_op != GF_REPLACE_OP_COMMIT_FORCE ) { |
1425 | gf_log ("", GF_LOG_ERROR,do { do { if (0) printf ("Src brick port not available"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1426 , GF_LOG_ERROR, "Src brick port not available"); } while (0) |
1426 | "Src brick port not available")do { do { if (0) printf ("Src brick port not available"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1426 , GF_LOG_ERROR, "Src brick port not available"); } while (0); |
1427 | ret = -1; |
1428 | goto out; |
1429 | } |
1430 | |
1431 | if (rsp_dict) { |
1432 | ret = dict_set_int32 (rsp_dict, "src-brick-port", src_brickinfo->port); |
1433 | if (ret) { |
1434 | gf_log ("", GF_LOG_DEBUG,do { do { if (0) printf ("Could not set src-brick port no"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 1435, GF_LOG_DEBUG, "Could not set src-brick port no"); } while (0) |
1435 | "Could not set src-brick port no")do { do { if (0) printf ("Could not set src-brick port no"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 1435, GF_LOG_DEBUG, "Could not set src-brick port no"); } while (0); |
1436 | goto out; |
1437 | } |
1438 | } |
1439 | |
1440 | ctx = glusterd_op_get_ctx (); |
1441 | if (ctx) { |
1442 | ret = dict_set_int32 (ctx, "src-brick-port", src_brickinfo->port); |
1443 | if (ret) { |
1444 | gf_log ("", GF_LOG_DEBUG,do { do { if (0) printf ("Could not set src-brick port no"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 1445, GF_LOG_DEBUG, "Could not set src-brick port no"); } while (0) |
1445 | "Could not set src-brick port no")do { do { if (0) printf ("Could not set src-brick port no"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 1445, GF_LOG_DEBUG, "Could not set src-brick port no"); } while (0); |
1446 | goto out; |
1447 | } |
1448 | } |
1449 | |
1450 | } |
1451 | |
1452 | out: |
1453 | return ret; |
1454 | |
1455 | } |
1456 | |
1457 | static int |
1458 | rb_update_dstbrick_port (glusterd_brickinfo_t *dst_brickinfo, dict_t *rsp_dict, |
1459 | dict_t *req_dict, int32_t replace_op) |
1460 | { |
1461 | dict_t *ctx = NULL((void*)0); |
1462 | int ret = 0; |
1463 | int dict_ret = 0; |
1464 | int dst_port = 0; |
1465 | |
1466 | dict_ret = dict_get_int32 (req_dict, "dst-brick-port", &dst_port); |
1467 | if (!dict_ret) |
1468 | dst_brickinfo->port = dst_port; |
1469 | |
1470 | |
1471 | if (glusterd_is_local_addr (dst_brickinfo->hostname)) { |
1472 | gf_log ("", GF_LOG_INFO,do { do { if (0) printf ("adding dst-brick port no"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1473 , GF_LOG_INFO, "adding dst-brick port no"); } while (0) |
1473 | "adding dst-brick port no")do { do { if (0) printf ("adding dst-brick port no"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1473 , GF_LOG_INFO, "adding dst-brick port no"); } while (0); |
1474 | |
1475 | if (rsp_dict) { |
1476 | ret = dict_set_int32 (rsp_dict, "dst-brick-port", |
1477 | dst_brickinfo->port); |
1478 | if (ret) { |
1479 | gf_log ("", GF_LOG_DEBUG,do { do { if (0) printf ("Could not set dst-brick port no in rsp dict" ); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 1480, GF_LOG_DEBUG, "Could not set dst-brick port no in rsp dict" ); } while (0) |
1480 | "Could not set dst-brick port no in rsp dict")do { do { if (0) printf ("Could not set dst-brick port no in rsp dict" ); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 1480, GF_LOG_DEBUG, "Could not set dst-brick port no in rsp dict" ); } while (0); |
1481 | goto out; |
1482 | } |
1483 | } |
1484 | |
1485 | ctx = glusterd_op_get_ctx (); |
1486 | if (ctx) { |
1487 | ret = dict_set_int32 (ctx, "dst-brick-port", |
1488 | dst_brickinfo->port); |
1489 | if (ret) { |
1490 | gf_log ("", GF_LOG_DEBUG,do { do { if (0) printf ("Could not set dst-brick port no"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 1491, GF_LOG_DEBUG, "Could not set dst-brick port no"); } while (0) |
1491 | "Could not set dst-brick port no")do { do { if (0) printf ("Could not set dst-brick port no"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 1491, GF_LOG_DEBUG, "Could not set dst-brick port no"); } while (0); |
1492 | goto out; |
1493 | } |
1494 | } |
1495 | } |
1496 | out: |
1497 | return ret; |
1498 | } |
1499 | |
1500 | static int |
1501 | glusterd_op_perform_replace_brick (glusterd_volinfo_t *volinfo, |
1502 | char *old_brick, char *new_brick) |
1503 | { |
1504 | glusterd_brickinfo_t *old_brickinfo = NULL((void*)0); |
1505 | glusterd_brickinfo_t *new_brickinfo = NULL((void*)0); |
1506 | int32_t ret = -1; |
1507 | |
1508 | GF_ASSERT (volinfo)do { if (!(volinfo)) { do { do { if (0) printf ("Assertion failed: " "volinfo"); } while (0); _gf_log_callingfn ("", "glusterd-replace-brick.c" , __FUNCTION__, 1508, GF_LOG_ERROR, "Assertion failed: " "volinfo" ); } while (0); } } while (0); |
1509 | |
1510 | ret = glusterd_brickinfo_new_from_brick (new_brick, |
1511 | &new_brickinfo); |
1512 | if (ret) |
1513 | goto out; |
1514 | |
1515 | ret = glusterd_resolve_brick (new_brickinfo); |
1516 | |
1517 | if (ret) |
1518 | goto out; |
1519 | |
1520 | ret = glusterd_volume_brickinfo_get_by_brick (old_brick, |
1521 | volinfo, &old_brickinfo); |
1522 | if (ret) |
1523 | goto out; |
1524 | |
1525 | list_add_tail (&new_brickinfo->brick_list, |
1526 | &old_brickinfo->brick_list); |
1527 | |
1528 | volinfo->brick_count++; |
1529 | |
1530 | ret = glusterd_op_perform_remove_brick (volinfo, old_brick, 1, NULL((void*)0)); |
1531 | if (ret) |
1532 | goto out; |
1533 | |
1534 | ret = glusterd_create_volfiles_and_notify_services (volinfo); |
1535 | if (ret) |
1536 | goto out; |
1537 | |
1538 | if (GLUSTERD_STATUS_STARTED == volinfo->status) { |
1539 | ret = glusterd_brick_start (volinfo, new_brickinfo, _gf_false); |
1540 | if (ret) |
1541 | goto out; |
1542 | } |
1543 | |
1544 | out: |
1545 | |
1546 | gf_log ("", GF_LOG_DEBUG, "Returning %d", ret)do { do { if (0) printf ("Returning %d", ret); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1546, GF_LOG_DEBUG , "Returning %d", ret); } while (0); |
1547 | return ret; |
1548 | } |
1549 | |
1550 | int |
1551 | glusterd_op_replace_brick (dict_t *dict, dict_t *rsp_dict) |
1552 | { |
1553 | int ret = 0; |
1554 | dict_t *ctx = NULL((void*)0); |
1555 | int replace_op = 0; |
1556 | glusterd_volinfo_t *volinfo = NULL((void*)0); |
1557 | char *volname = NULL((void*)0); |
1558 | xlator_t *this = NULL((void*)0); |
1559 | glusterd_conf_t *priv = NULL((void*)0); |
1560 | char *src_brick = NULL((void*)0); |
1561 | char *dst_brick = NULL((void*)0); |
1562 | glusterd_brickinfo_t *src_brickinfo = NULL((void*)0); |
1563 | glusterd_brickinfo_t *dst_brickinfo = NULL((void*)0); |
1564 | char *task_id_str = NULL((void*)0); |
1565 | |
1566 | this = THIS(*__glusterfs_this_location()); |
1567 | GF_ASSERT (this)do { if (!(this)) { do { do { if (0) printf ("Assertion failed: " "this"); } while (0); _gf_log_callingfn ("", "glusterd-replace-brick.c" , __FUNCTION__, 1567, GF_LOG_ERROR, "Assertion failed: " "this" ); } while (0); } } while (0); |
1568 | |
1569 | priv = this->private; |
1570 | GF_ASSERT (priv)do { if (!(priv)) { do { do { if (0) printf ("Assertion failed: " "priv"); } while (0); _gf_log_callingfn ("", "glusterd-replace-brick.c" , __FUNCTION__, 1570, GF_LOG_ERROR, "Assertion failed: " "priv" ); } while (0); } } while (0); |
1571 | |
1572 | ret = dict_get_str (dict, "src-brick", &src_brick); |
1573 | if (ret) { |
1574 | gf_log (this->name, GF_LOG_ERROR, "Unable to get src brick")do { do { if (0) printf ("Unable to get src brick"); } while ( 0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1574, GF_LOG_ERROR, "Unable to get src brick"); } while (0); |
1575 | goto out; |
1576 | } |
1577 | |
1578 | gf_log (this->name, GF_LOG_DEBUG, "src brick=%s", src_brick)do { do { if (0) printf ("src brick=%s", src_brick); } while ( 0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1578, GF_LOG_DEBUG, "src brick=%s", src_brick); } while (0); |
1579 | |
1580 | ret = dict_get_str (dict, "dst-brick", &dst_brick); |
1581 | if (ret) { |
1582 | gf_log (this->name, GF_LOG_ERROR, "Unable to get dst brick")do { do { if (0) printf ("Unable to get dst brick"); } while ( 0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1582, GF_LOG_ERROR, "Unable to get dst brick"); } while (0); |
1583 | goto out; |
1584 | } |
1585 | |
1586 | gf_log (this->name, GF_LOG_DEBUG, "dst brick=%s", dst_brick)do { do { if (0) printf ("dst brick=%s", dst_brick); } while ( 0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1586, GF_LOG_DEBUG, "dst brick=%s", dst_brick); } while (0); |
1587 | |
1588 | ret = dict_get_str (dict, "volname", &volname); |
1589 | if (ret) { |
1590 | gf_log (this->name, GF_LOG_ERROR, "Unable to get volume name")do { do { if (0) printf ("Unable to get volume name"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1590, GF_LOG_ERROR, "Unable to get volume name"); } while ( 0); |
1591 | goto out; |
1592 | } |
1593 | |
1594 | ret = dict_get_int32 (dict, "operation", (int32_t *)&replace_op); |
1595 | if (ret) { |
1596 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("dict_get on operation failed"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1597, GF_LOG_DEBUG, "dict_get on operation failed"); } while (0) |
1597 | "dict_get on operation failed")do { do { if (0) printf ("dict_get on operation failed"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1597, GF_LOG_DEBUG, "dict_get on operation failed"); } while (0); |
1598 | goto out; |
1599 | } |
1600 | |
1601 | ret = glusterd_volinfo_find (volname, &volinfo); |
1602 | if (ret) { |
1603 | gf_log (this->name, GF_LOG_ERROR, "Unable to allocate memory")do { do { if (0) printf ("Unable to allocate memory"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1603, GF_LOG_ERROR, "Unable to allocate memory"); } while ( 0); |
1604 | goto out; |
1605 | } |
1606 | |
1607 | ret = glusterd_volume_brickinfo_get_by_brick (src_brick, volinfo, |
1608 | &src_brickinfo); |
1609 | if (ret) { |
1610 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("Unable to get src-brickinfo"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1611, GF_LOG_DEBUG, "Unable to get src-brickinfo"); } while (0) |
1611 | "Unable to get src-brickinfo")do { do { if (0) printf ("Unable to get src-brickinfo"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1611, GF_LOG_DEBUG, "Unable to get src-brickinfo"); } while (0); |
1612 | goto out; |
1613 | } |
1614 | |
1615 | |
1616 | ret = glusterd_get_rb_dst_brickinfo (volinfo, &dst_brickinfo); |
1617 | if (ret) { |
1618 | gf_log (this->name, GF_LOG_ERROR, "Unable to get "do { do { if (0) printf ("Unable to get " "replace brick destination brickinfo" ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1619, GF_LOG_ERROR, "Unable to get " "replace brick destination brickinfo" ); } while (0) |
1619 | "replace brick destination brickinfo")do { do { if (0) printf ("Unable to get " "replace brick destination brickinfo" ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1619, GF_LOG_ERROR, "Unable to get " "replace brick destination brickinfo" ); } while (0); |
1620 | goto out; |
1621 | } |
1622 | |
1623 | ret = glusterd_resolve_brick (dst_brickinfo); |
1624 | if (ret) { |
1625 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("Unable to resolve dst-brickinfo"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1626, GF_LOG_DEBUG, "Unable to resolve dst-brickinfo" ); } while (0) |
1626 | "Unable to resolve dst-brickinfo")do { do { if (0) printf ("Unable to resolve dst-brickinfo"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1626, GF_LOG_DEBUG, "Unable to resolve dst-brickinfo" ); } while (0); |
1627 | goto out; |
1628 | } |
1629 | |
1630 | ret = rb_update_srcbrick_port (src_brickinfo, rsp_dict, |
1631 | dict, replace_op); |
1632 | if (ret) |
1633 | goto out; |
1634 | |
1635 | |
1636 | if ((GF_REPLACE_OP_START != replace_op)) { |
1637 | |
1638 | /* Set task-id, if available, in op_ctx dict for operations |
1639 | * other than start |
1640 | */ |
1641 | if (is_origin_glusterd ()) { |
1642 | ctx = glusterd_op_get_ctx(); |
1643 | if (!ctx) { |
1644 | gf_log (this->name, GF_LOG_ERROR, "Failed to "do { do { if (0) printf ("Failed to " "get op_ctx"); } while ( 0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1645, GF_LOG_ERROR, "Failed to " "get op_ctx"); } while (0) |
1645 | "get op_ctx")do { do { if (0) printf ("Failed to " "get op_ctx"); } while ( 0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1645, GF_LOG_ERROR, "Failed to " "get op_ctx"); } while (0); |
1646 | ret = -1; |
1647 | goto out; |
1648 | } |
1649 | if (!uuid_is_null (volinfo->rep_brick.rb_id)) { |
1650 | ret = glusterd_copy_uuid_to_dict |
1651 | (volinfo->rep_brick.rb_id, ctx, |
1652 | GF_REPLACE_BRICK_TID_KEY"replace-brick-id"); |
1653 | if (ret) { |
1654 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("Failed to set " "replace-brick-id") ; } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1656, GF_LOG_ERROR, "Failed to set " "replace-brick-id" ); } while (0) |
1655 | "Failed to set "do { do { if (0) printf ("Failed to set " "replace-brick-id") ; } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1656, GF_LOG_ERROR, "Failed to set " "replace-brick-id" ); } while (0) |
1656 | "replace-brick-id")do { do { if (0) printf ("Failed to set " "replace-brick-id") ; } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1656, GF_LOG_ERROR, "Failed to set " "replace-brick-id" ); } while (0); |
1657 | goto out; |
1658 | } |
1659 | } |
1660 | } |
1661 | } |
1662 | ret = rb_update_dstbrick_port (dst_brickinfo, rsp_dict, |
1663 | dict, replace_op); |
1664 | if (ret) |
1665 | goto out; |
1666 | |
1667 | switch (replace_op) { |
1668 | case GF_REPLACE_OP_START: |
1669 | { |
1670 | ret = dict_get_str (dict, GF_REPLACE_BRICK_TID_KEY"replace-brick-id", &task_id_str); |
1671 | if (ret) { |
1672 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("Missing replace-brick-id"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1673, GF_LOG_ERROR, "Missing replace-brick-id"); } while (0 ) |
1673 | "Missing replace-brick-id")do { do { if (0) printf ("Missing replace-brick-id"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1673, GF_LOG_ERROR, "Missing replace-brick-id"); } while (0 ); |
1674 | ret = 0; |
1675 | } else { |
1676 | uuid_parse (task_id_str, volinfo->rep_brick.rb_id); |
1677 | } |
1678 | |
1679 | if (glusterd_is_local_addr (dst_brickinfo->hostname)) { |
1680 | gf_log (this->name, GF_LOG_INFO,do { do { if (0) printf ("I AM THE DESTINATION HOST"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1681, GF_LOG_INFO, "I AM THE DESTINATION HOST"); } while (0 ) |
1681 | "I AM THE DESTINATION HOST")do { do { if (0) printf ("I AM THE DESTINATION HOST"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1681, GF_LOG_INFO, "I AM THE DESTINATION HOST"); } while (0 ); |
1682 | if (!glusterd_is_rb_paused (volinfo)) { |
1683 | ret = rb_spawn_destination_brick |
1684 | (volinfo, dst_brickinfo); |
1685 | if (ret) { |
1686 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("Failed to spawn destination " "brick" ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1688, GF_LOG_DEBUG, "Failed to spawn destination " "brick"); } while (0) |
1687 | "Failed to spawn destination "do { do { if (0) printf ("Failed to spawn destination " "brick" ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1688, GF_LOG_DEBUG, "Failed to spawn destination " "brick"); } while (0) |
1688 | "brick")do { do { if (0) printf ("Failed to spawn destination " "brick" ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1688, GF_LOG_DEBUG, "Failed to spawn destination " "brick"); } while (0); |
1689 | goto out; |
1690 | } |
1691 | } else { |
1692 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("Replace brick is already started=> no " "need to restart dst brick "); } while (0); _gf_log (this-> name, "glusterd-replace-brick.c", __FUNCTION__, 1694, GF_LOG_ERROR , "Replace brick is already started=> no " "need to restart dst brick " ); } while (0) |
1693 | "Replace brick is already started=> no "do { do { if (0) printf ("Replace brick is already started=> no " "need to restart dst brick "); } while (0); _gf_log (this-> name, "glusterd-replace-brick.c", __FUNCTION__, 1694, GF_LOG_ERROR , "Replace brick is already started=> no " "need to restart dst brick " ); } while (0) |
1694 | "need to restart dst brick ")do { do { if (0) printf ("Replace brick is already started=> no " "need to restart dst brick "); } while (0); _gf_log (this-> name, "glusterd-replace-brick.c", __FUNCTION__, 1694, GF_LOG_ERROR , "Replace brick is already started=> no " "need to restart dst brick " ); } while (0); |
1695 | } |
1696 | } |
1697 | |
1698 | |
1699 | if (glusterd_is_local_addr (src_brickinfo->hostname)) { |
1700 | ret = rb_src_brick_restart (volinfo, src_brickinfo, |
1701 | 1); |
1702 | if (ret) { |
1703 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("Could not restart src-brick"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1704, GF_LOG_DEBUG, "Could not restart src-brick"); } while (0) |
1704 | "Could not restart src-brick")do { do { if (0) printf ("Could not restart src-brick"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1704, GF_LOG_DEBUG, "Could not restart src-brick"); } while (0); |
1705 | goto out; |
1706 | } |
1707 | } |
1708 | |
1709 | if (glusterd_is_local_addr (dst_brickinfo->hostname)) { |
1710 | gf_log (this->name, GF_LOG_INFO,do { do { if (0) printf ("adding dst-brick port no"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1711, GF_LOG_INFO, "adding dst-brick port no"); } while (0) |
1711 | "adding dst-brick port no")do { do { if (0) printf ("adding dst-brick port no"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1711, GF_LOG_INFO, "adding dst-brick port no"); } while (0); |
1712 | |
1713 | ret = rb_update_dstbrick_port (dst_brickinfo, rsp_dict, |
1714 | dict, replace_op); |
1715 | if (ret) |
1716 | goto out; |
1717 | } |
1718 | |
1719 | glusterd_set_rb_status (volinfo, GF_RB_STATUS_STARTED); |
1720 | break; |
1721 | } |
1722 | |
1723 | case GF_REPLACE_OP_COMMIT: |
1724 | { |
1725 | ctx = glusterd_op_get_ctx (); |
1726 | if (ctx) { |
1727 | ret = rb_do_operation (volinfo, src_brickinfo, |
1728 | dst_brickinfo, |
1729 | GF_REPLACE_OP_COMMIT); |
1730 | if (ret) { |
1731 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("Commit operation failed"); } while ( 0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1732, GF_LOG_ERROR, "Commit operation failed"); } while (0) |
1732 | "Commit operation failed")do { do { if (0) printf ("Commit operation failed"); } while ( 0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1732, GF_LOG_ERROR, "Commit operation failed"); } while (0); |
1733 | goto out; |
1734 | } |
1735 | } |
1736 | } |
1737 | /* fall through */ |
1738 | case GF_REPLACE_OP_COMMIT_FORCE: |
1739 | { |
1740 | if (glusterd_is_local_addr (dst_brickinfo->hostname)) { |
1741 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("I AM THE DESTINATION HOST"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1742, GF_LOG_DEBUG, "I AM THE DESTINATION HOST"); } while ( 0) |
1742 | "I AM THE DESTINATION HOST")do { do { if (0) printf ("I AM THE DESTINATION HOST"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1742, GF_LOG_DEBUG, "I AM THE DESTINATION HOST"); } while ( 0); |
1743 | ret = rb_kill_destination_brick (volinfo, |
1744 | dst_brickinfo); |
1745 | if (ret) { |
1746 | gf_log (this->name, GF_LOG_CRITICAL,do { do { if (0) printf ("Unable to cleanup dst brick"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1747, GF_LOG_CRITICAL, "Unable to cleanup dst brick"); } while (0) |
1747 | "Unable to cleanup dst brick")do { do { if (0) printf ("Unable to cleanup dst brick"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1747, GF_LOG_CRITICAL, "Unable to cleanup dst brick"); } while (0); |
1748 | goto out; |
1749 | } |
1750 | } |
1751 | |
1752 | ret = glusterd_nodesvcs_stop (volinfo); |
1753 | if (ret) { |
1754 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("Unable to stop nfs server, ret: %d" , ret); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1755, GF_LOG_ERROR, "Unable to stop nfs server, ret: %d" , ret); } while (0) |
1755 | "Unable to stop nfs server, ret: %d", ret)do { do { if (0) printf ("Unable to stop nfs server, ret: %d" , ret); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1755, GF_LOG_ERROR, "Unable to stop nfs server, ret: %d" , ret); } while (0); |
1756 | } |
1757 | |
1758 | ret = glusterd_op_perform_replace_brick (volinfo, src_brick, |
1759 | dst_brick); |
1760 | if (ret) { |
1761 | gf_log (this->name, GF_LOG_CRITICAL, "Unable to add "do { do { if (0) printf ("Unable to add " "dst-brick: %s to volume: %s" , dst_brick, volinfo->volname); } while (0); _gf_log (this ->name, "glusterd-replace-brick.c", __FUNCTION__, 1763, GF_LOG_CRITICAL , "Unable to add " "dst-brick: %s to volume: %s", dst_brick, volinfo ->volname); } while (0) |
1762 | "dst-brick: %s to volume: %s", dst_brick,do { do { if (0) printf ("Unable to add " "dst-brick: %s to volume: %s" , dst_brick, volinfo->volname); } while (0); _gf_log (this ->name, "glusterd-replace-brick.c", __FUNCTION__, 1763, GF_LOG_CRITICAL , "Unable to add " "dst-brick: %s to volume: %s", dst_brick, volinfo ->volname); } while (0) |
1763 | volinfo->volname)do { do { if (0) printf ("Unable to add " "dst-brick: %s to volume: %s" , dst_brick, volinfo->volname); } while (0); _gf_log (this ->name, "glusterd-replace-brick.c", __FUNCTION__, 1763, GF_LOG_CRITICAL , "Unable to add " "dst-brick: %s to volume: %s", dst_brick, volinfo ->volname); } while (0); |
1764 | (void) glusterd_nodesvcs_handle_graph_change (volinfo); |
1765 | goto out; |
1766 | } |
1767 | |
1768 | volinfo->rebal.defrag_status = 0; |
1769 | |
1770 | ret = glusterd_nodesvcs_handle_graph_change (volinfo); |
1771 | if (ret) { |
1772 | gf_log (this->name, GF_LOG_CRITICAL,do { do { if (0) printf ("Failed to generate nfs volume file" ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1773, GF_LOG_CRITICAL, "Failed to generate nfs volume file" ); } while (0) |
1773 | "Failed to generate nfs volume file")do { do { if (0) printf ("Failed to generate nfs volume file" ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1773, GF_LOG_CRITICAL, "Failed to generate nfs volume file" ); } while (0); |
1774 | } |
1775 | |
1776 | |
1777 | ret = glusterd_fetchspec_notify (THIS(*__glusterfs_this_location())); |
1778 | glusterd_set_rb_status (volinfo, GF_RB_STATUS_NONE); |
1779 | glusterd_brickinfo_delete (volinfo->rep_brick.dst_brick); |
1780 | volinfo->rep_brick.src_brick = NULL((void*)0); |
1781 | volinfo->rep_brick.dst_brick = NULL((void*)0); |
1782 | uuid_clear (volinfo->rep_brick.rb_id); |
1783 | } |
1784 | break; |
1785 | |
1786 | case GF_REPLACE_OP_PAUSE: |
1787 | { |
1788 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("Received pause - doing nothing"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1789, GF_LOG_DEBUG, "Received pause - doing nothing" ); } while (0) |
1789 | "Received pause - doing nothing")do { do { if (0) printf ("Received pause - doing nothing"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1789, GF_LOG_DEBUG, "Received pause - doing nothing" ); } while (0); |
1790 | ctx = glusterd_op_get_ctx (); |
1791 | if (ctx) { |
1792 | ret = rb_do_operation (volinfo, src_brickinfo, |
1793 | dst_brickinfo, |
1794 | GF_REPLACE_OP_PAUSE); |
1795 | if (ret) { |
1796 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("Pause operation failed"); } while ( 0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1797, GF_LOG_ERROR, "Pause operation failed"); } while (0) |
1797 | "Pause operation failed")do { do { if (0) printf ("Pause operation failed"); } while ( 0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1797, GF_LOG_ERROR, "Pause operation failed"); } while (0); |
1798 | goto out; |
1799 | } |
1800 | } |
1801 | |
1802 | glusterd_set_rb_status (volinfo, GF_RB_STATUS_PAUSED); |
1803 | } |
1804 | break; |
1805 | |
1806 | case GF_REPLACE_OP_ABORT: |
1807 | { |
1808 | |
1809 | ctx = glusterd_op_get_ctx (); |
1810 | if (ctx) { |
1811 | ret = rb_do_operation (volinfo, src_brickinfo, |
1812 | dst_brickinfo, |
1813 | GF_REPLACE_OP_ABORT); |
1814 | if (ret) { |
1815 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("Abort operation failed"); } while ( 0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1816, GF_LOG_ERROR, "Abort operation failed"); } while (0) |
1816 | "Abort operation failed")do { do { if (0) printf ("Abort operation failed"); } while ( 0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1816, GF_LOG_ERROR, "Abort operation failed"); } while (0); |
1817 | goto out; |
1818 | } |
1819 | } |
1820 | |
1821 | if (glusterd_is_local_addr (src_brickinfo->hostname)) { |
1822 | ret = rb_src_brick_restart (volinfo, src_brickinfo, |
1823 | 0); |
1824 | if (ret) { |
1825 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("Couldn't restart src brick " "with pump xlator disabled." ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1827, GF_LOG_ERROR, "Couldn't restart src brick " "with pump xlator disabled."); } while (0) |
1826 | "Couldn't restart src brick "do { do { if (0) printf ("Couldn't restart src brick " "with pump xlator disabled." ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1827, GF_LOG_ERROR, "Couldn't restart src brick " "with pump xlator disabled."); } while (0) |
1827 | "with pump xlator disabled.")do { do { if (0) printf ("Couldn't restart src brick " "with pump xlator disabled." ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1827, GF_LOG_ERROR, "Couldn't restart src brick " "with pump xlator disabled."); } while (0); |
1828 | goto out; |
1829 | } |
1830 | } |
1831 | |
1832 | if (glusterd_is_local_addr (dst_brickinfo->hostname)) { |
1833 | gf_log (this->name, GF_LOG_INFO,do { do { if (0) printf ("I AM THE DESTINATION HOST"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1834, GF_LOG_INFO, "I AM THE DESTINATION HOST"); } while (0 ) |
1834 | "I AM THE DESTINATION HOST")do { do { if (0) printf ("I AM THE DESTINATION HOST"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c", __FUNCTION__ , 1834, GF_LOG_INFO, "I AM THE DESTINATION HOST"); } while (0 ); |
1835 | ret = rb_kill_destination_brick (volinfo, dst_brickinfo); |
1836 | if (ret) { |
1837 | gf_log ("", GF_LOG_DEBUG,do { do { if (0) printf ("Failed to kill destination brick"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 1838, GF_LOG_DEBUG, "Failed to kill destination brick"); } while (0) |
1838 | "Failed to kill destination brick")do { do { if (0) printf ("Failed to kill destination brick"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 1838, GF_LOG_DEBUG, "Failed to kill destination brick"); } while (0); |
1839 | goto out; |
1840 | } |
1841 | } |
1842 | glusterd_set_rb_status (volinfo, GF_RB_STATUS_NONE); |
1843 | glusterd_brickinfo_delete (volinfo->rep_brick.dst_brick); |
1844 | volinfo->rep_brick.src_brick = NULL((void*)0); |
1845 | volinfo->rep_brick.dst_brick = NULL((void*)0); |
1846 | } |
1847 | break; |
1848 | |
1849 | case GF_REPLACE_OP_STATUS: |
1850 | { |
1851 | gf_log (this->name, GF_LOG_DEBUG,do { do { if (0) printf ("received status - doing nothing"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1852, GF_LOG_DEBUG, "received status - doing nothing" ); } while (0) |
1852 | "received status - doing nothing")do { do { if (0) printf ("received status - doing nothing"); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1852, GF_LOG_DEBUG, "received status - doing nothing" ); } while (0); |
1853 | ctx = glusterd_op_get_ctx (); |
1854 | if (ctx) { |
1855 | if (glusterd_is_rb_paused (volinfo)) { |
1856 | ret = dict_set_str (ctx, "status-reply", |
1857 | "replace brick has been paused"); |
1858 | if (ret) |
1859 | gf_log (this->name, GF_LOG_ERROR,do { do { if (0) printf ("failed to set pump status" " in ctx" ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1861, GF_LOG_ERROR, "failed to set pump status" " in ctx"); } while (0) |
1860 | "failed to set pump status"do { do { if (0) printf ("failed to set pump status" " in ctx" ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1861, GF_LOG_ERROR, "failed to set pump status" " in ctx"); } while (0) |
1861 | " in ctx")do { do { if (0) printf ("failed to set pump status" " in ctx" ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1861, GF_LOG_ERROR, "failed to set pump status" " in ctx"); } while (0); |
1862 | goto out; |
1863 | } |
1864 | |
1865 | ret = rb_do_operation (volinfo, src_brickinfo, |
1866 | dst_brickinfo, |
1867 | GF_REPLACE_OP_STATUS); |
1868 | if (ret) |
1869 | goto out; |
1870 | } |
1871 | |
1872 | } |
1873 | break; |
1874 | |
1875 | default: |
1876 | ret = -1; |
1877 | goto out; |
1878 | } |
1879 | if (!ret && replace_op != GF_REPLACE_OP_STATUS) |
1880 | ret = glusterd_store_volinfo (volinfo, |
1881 | GLUSTERD_VOLINFO_VER_AC_INCREMENT); |
1882 | if (ret) |
1883 | gf_log (this->name, GF_LOG_ERROR, "Couldn't store"do { do { if (0) printf ("Couldn't store" " replace brick operation's state" ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1884, GF_LOG_ERROR, "Couldn't store" " replace brick operation's state" ); } while (0) |
1884 | " replace brick operation's state")do { do { if (0) printf ("Couldn't store" " replace brick operation's state" ); } while (0); _gf_log (this->name, "glusterd-replace-brick.c" , __FUNCTION__, 1884, GF_LOG_ERROR, "Couldn't store" " replace brick operation's state" ); } while (0); |
1885 | |
1886 | out: |
1887 | return ret; |
1888 | } |
1889 | |
1890 | void |
1891 | glusterd_do_replace_brick (void *data) |
1892 | { |
1893 | glusterd_volinfo_t *volinfo = NULL((void*)0); |
1894 | int32_t op = 0; |
1895 | int32_t src_port = 0; |
1896 | int32_t dst_port = 0; |
1897 | dict_t *dict = NULL((void*)0); |
1898 | char *src_brick = NULL((void*)0); |
1899 | char *dst_brick = NULL((void*)0); |
1900 | char *volname = NULL((void*)0); |
1901 | glusterd_brickinfo_t *src_brickinfo = NULL((void*)0); |
1902 | glusterd_brickinfo_t *dst_brickinfo = NULL((void*)0); |
1903 | glusterd_conf_t *priv = NULL((void*)0); |
1904 | |
1905 | int ret = 0; |
1906 | |
1907 | dict = data; |
1908 | |
1909 | GF_ASSERT (THIS)do { if (!((*__glusterfs_this_location()))) { do { do { if (0 ) printf ("Assertion failed: " "THIS"); } while (0); _gf_log_callingfn ("", "glusterd-replace-brick.c", __FUNCTION__, 1909, GF_LOG_ERROR , "Assertion failed: " "THIS"); } while (0); } } while (0); |
1910 | |
1911 | priv = THIS(*__glusterfs_this_location())->private; |
1912 | |
1913 | if (priv->timer) { |
1914 | gf_timer_call_cancel (THIS(*__glusterfs_this_location())->ctx, priv->timer); |
1915 | priv->timer = NULL((void*)0); |
1916 | gf_log ("", GF_LOG_DEBUG,do { do { if (0) printf ("Cancelling timer thread"); } while ( 0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1917 , GF_LOG_DEBUG, "Cancelling timer thread"); } while (0) |
1917 | "Cancelling timer thread")do { do { if (0) printf ("Cancelling timer thread"); } while ( 0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1917 , GF_LOG_DEBUG, "Cancelling timer thread"); } while (0); |
1918 | } |
1919 | |
1920 | gf_log ("", GF_LOG_DEBUG,do { do { if (0) printf ("Replace brick operation detected"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 1921, GF_LOG_DEBUG, "Replace brick operation detected"); } while (0) |
1921 | "Replace brick operation detected")do { do { if (0) printf ("Replace brick operation detected"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 1921, GF_LOG_DEBUG, "Replace brick operation detected"); } while (0); |
1922 | |
1923 | ret = dict_get_int32 (dict, "operation", &op); |
1924 | if (ret) { |
1925 | gf_log ("", GF_LOG_DEBUG,do { do { if (0) printf ("dict_get on operation failed"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1926 , GF_LOG_DEBUG, "dict_get on operation failed"); } while (0) |
1926 | "dict_get on operation failed")do { do { if (0) printf ("dict_get on operation failed"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1926 , GF_LOG_DEBUG, "dict_get on operation failed"); } while (0); |
1927 | goto out; |
1928 | } |
1929 | ret = dict_get_str (dict, "src-brick", &src_brick); |
1930 | if (ret) { |
1931 | gf_log ("", GF_LOG_ERROR, "Unable to get src brick")do { do { if (0) printf ("Unable to get src brick"); } while ( 0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1931 , GF_LOG_ERROR, "Unable to get src brick"); } while (0); |
1932 | goto out; |
1933 | } |
1934 | |
1935 | gf_log ("", GF_LOG_DEBUG,do { do { if (0) printf ("src brick=%s", src_brick); } while ( 0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1936 , GF_LOG_DEBUG, "src brick=%s", src_brick); } while (0) |
1936 | "src brick=%s", src_brick)do { do { if (0) printf ("src brick=%s", src_brick); } while ( 0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1936 , GF_LOG_DEBUG, "src brick=%s", src_brick); } while (0); |
1937 | |
1938 | ret = dict_get_str (dict, "dst-brick", &dst_brick); |
1939 | if (ret) { |
1940 | gf_log ("", GF_LOG_ERROR, "Unable to get dst brick")do { do { if (0) printf ("Unable to get dst brick"); } while ( 0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1940 , GF_LOG_ERROR, "Unable to get dst brick"); } while (0); |
1941 | goto out; |
1942 | } |
1943 | |
1944 | gf_log ("", GF_LOG_DEBUG,do { do { if (0) printf ("dst brick=%s", dst_brick); } while ( 0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1945 , GF_LOG_DEBUG, "dst brick=%s", dst_brick); } while (0) |
1945 | "dst brick=%s", dst_brick)do { do { if (0) printf ("dst brick=%s", dst_brick); } while ( 0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1945 , GF_LOG_DEBUG, "dst brick=%s", dst_brick); } while (0); |
1946 | |
1947 | ret = dict_get_str (dict, "volname", &volname); |
1948 | |
1949 | if (ret) { |
1950 | gf_log ("", GF_LOG_ERROR, "Unable to get volume name")do { do { if (0) printf ("Unable to get volume name"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1950 , GF_LOG_ERROR, "Unable to get volume name"); } while (0); |
1951 | goto out; |
1952 | } |
1953 | |
1954 | ret = glusterd_volinfo_find (volname, &volinfo); |
1955 | if (ret) { |
1956 | gf_log ("", GF_LOG_ERROR, "Unable to allocate memory")do { do { if (0) printf ("Unable to allocate memory"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1956 , GF_LOG_ERROR, "Unable to allocate memory"); } while (0); |
1957 | goto out; |
1958 | } |
1959 | |
1960 | ret = glusterd_volume_brickinfo_get_by_brick (src_brick, volinfo, |
1961 | &src_brickinfo); |
1962 | if (ret) { |
1963 | gf_log ("", GF_LOG_DEBUG, "Unable to get src-brickinfo")do { do { if (0) printf ("Unable to get src-brickinfo"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1963 , GF_LOG_DEBUG, "Unable to get src-brickinfo"); } while (0); |
1964 | goto out; |
1965 | } |
1966 | |
1967 | ret = glusterd_get_rb_dst_brickinfo (volinfo, &dst_brickinfo); |
1968 | if (!dst_brickinfo) { |
1969 | gf_log ("", GF_LOG_DEBUG, "Unable to get dst-brickinfo")do { do { if (0) printf ("Unable to get dst-brickinfo"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1969 , GF_LOG_DEBUG, "Unable to get dst-brickinfo"); } while (0); |
1970 | goto out; |
1971 | } |
1972 | |
1973 | ret = glusterd_resolve_brick (dst_brickinfo); |
1974 | if (ret) { |
1975 | gf_log ("", GF_LOG_DEBUG, "Unable to resolve dst-brickinfo")do { do { if (0) printf ("Unable to resolve dst-brickinfo"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__ , 1975, GF_LOG_DEBUG, "Unable to resolve dst-brickinfo"); } while (0); |
1976 | goto out; |
1977 | } |
1978 | |
1979 | ret = dict_get_int32 (dict, "src-brick-port", &src_port); |
1980 | if (ret) { |
1981 | gf_log ("", GF_LOG_ERROR, "Unable to get src-brick port")do { do { if (0) printf ("Unable to get src-brick port"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1981 , GF_LOG_ERROR, "Unable to get src-brick port"); } while (0); |
1982 | goto out; |
1983 | } |
1984 | |
1985 | ret = dict_get_int32 (dict, "dst-brick-port", &dst_port); |
1986 | if (ret) { |
1987 | gf_log ("", GF_LOG_ERROR, "Unable to get dst-brick port")do { do { if (0) printf ("Unable to get dst-brick port"); } while (0); _gf_log ("", "glusterd-replace-brick.c", __FUNCTION__, 1987 , GF_LOG_ERROR, "Unable to get dst-brick port"); } while (0); |
1988 | } |
1989 | |
1990 | dst_brickinfo->port = dst_port; |
1991 | src_brickinfo->port = src_port; |
1992 | |
1993 | switch (op) { |
1994 | case GF_REPLACE_OP_START: |
1995 | if (!dst_port) { |
1996 | ret = -1; |
1997 | goto out; |
1998 | } |
1999 | |
2000 | ret = rb_do_operation (volinfo, src_brickinfo, dst_brickinfo, |
2001 | GF_REPLACE_OP_START); |
2002 | if (ret) |
2003 | goto out; |
2004 | break; |
2005 | case GF_REPLACE_OP_PAUSE: |
2006 | case GF_REPLACE_OP_ABORT: |
2007 | case GF_REPLACE_OP_COMMIT: |
2008 | case GF_REPLACE_OP_COMMIT_FORCE: |
2009 | case GF_REPLACE_OP_STATUS: |
2010 | break; |
2011 | default: |
2012 | ret = -1; |
2013 | goto out; |
2014 | } |
2015 | |
2016 | out: |
2017 | if (ret) |
2018 | ret = glusterd_op_sm_inject_event (GD_OP_EVENT_RCVD_RJT, NULL((void*)0)); |
2019 | else |
2020 | ret = glusterd_op_sm_inject_event (GD_OP_EVENT_COMMIT_ACC, NULL((void*)0)); |
Value stored to 'ret' is never read | |
2021 | |
2022 | glusterd_op_sm (); |
2023 | } |