File: | xlators/mgmt/glusterd/src/glusterd-replace-brick.c |
Location: | line 1569, column 16 |
Description: | Access to field 'private' results in a dereference of a null pointer (loaded from variable 'this') |
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)); | |||
2021 | ||||
2022 | glusterd_op_sm (); | |||
2023 | } |