Changeset 989 for vendor/current/ctdb/client
- Timestamp:
- Nov 25, 2016, 8:04:54 PM (9 years ago)
- Location:
- vendor/current/ctdb/client
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
vendor/current/ctdb/client/client.h
r988 r989 73 73 bool ctdb_client_message_recv(struct tevent_req *req, int *perr); 74 74 75 struct tevent_req *ctdb_client_message_multi_send( 76 TALLOC_CTX *mem_ctx, 77 struct tevent_context *ev, 78 struct ctdb_client_context *client, 79 uint32_t *pnn_list, int count, 80 struct ctdb_req_message *message); 81 82 bool ctdb_client_message_multi_recv(struct tevent_req *req, int *perr, 83 TALLOC_CTX *mem_ctx, int **perr_list); 84 75 85 int ctdb_client_message(TALLOC_CTX *mem_ctx, struct tevent_context *ev, 76 86 struct ctdb_client_context *client, 77 87 uint32_t destnode, struct ctdb_req_message *message); 88 89 struct tevent_req *ctdb_client_set_message_handler_send( 90 TALLOC_CTX *mem_ctx, 91 struct tevent_context *ev, 92 struct ctdb_client_context *client, 93 uint64_t srvid, 94 srvid_handler_fn handler, 95 void *private_data); 96 bool ctdb_client_set_message_handler_recv(struct tevent_req *req, int *perr); 97 98 struct tevent_req *ctdb_client_remove_message_handler_send( 99 TALLOC_CTX *mem_ctx, 100 struct tevent_context *ev, 101 struct ctdb_client_context *client, 102 uint64_t srvid, 103 void *private_data); 104 bool ctdb_client_remove_message_handler_recv(struct tevent_req *req, 105 int *perr); 78 106 79 107 int ctdb_client_set_message_handler(TALLOC_CTX *mem_ctx, … … 710 738 uint32_t db_id); 711 739 740 int ctdb_ctrl_db_pull(TALLOC_CTX *mem_ctx, struct tevent_context *ev, 741 struct ctdb_client_context *client, 742 int destnode, struct timeval timeout, 743 struct ctdb_pulldb_ext *pulldb, uint32_t *num_records); 744 745 int ctdb_ctrl_db_push_start(TALLOC_CTX *mem_ctx, struct tevent_context *ev, 746 struct ctdb_client_context *client, 747 int destnode, struct timeval timeout, 748 struct ctdb_pulldb_ext *pulldb); 749 750 int ctdb_ctrl_db_push_confirm(TALLOC_CTX *mem_ctx, struct tevent_context *ev, 751 struct ctdb_client_context *client, 752 int destnode, struct timeval timeout, 753 uint32_t db_id, uint32_t *num_records); 754 712 755 /* from client/client_db.c */ 713 756 -
vendor/current/ctdb/client/client_control_sync.c
r988 r989 3118 3118 return 0; 3119 3119 } 3120 3121 int ctdb_ctrl_db_pull(TALLOC_CTX *mem_ctx, struct tevent_context *ev, 3122 struct ctdb_client_context *client, 3123 int destnode, struct timeval timeout, 3124 struct ctdb_pulldb_ext *pulldb, uint32_t *num_records) 3125 { 3126 struct ctdb_req_control request; 3127 struct ctdb_reply_control *reply; 3128 int ret; 3129 3130 ctdb_req_control_db_pull(&request, pulldb); 3131 ret = ctdb_client_control(mem_ctx, ev, client, destnode, timeout, 3132 &request, &reply); 3133 if (ret != 0) { 3134 DEBUG(DEBUG_ERR, 3135 ("Control DB_PULL failed to node %u, ret=%d\n", 3136 destnode, ret)); 3137 return ret; 3138 } 3139 3140 ret = ctdb_reply_control_db_pull(reply, num_records); 3141 if (ret != 0) { 3142 DEBUG(DEBUG_ERR, ("Control DB_PULL failed, ret=%d\n", ret)); 3143 return ret; 3144 } 3145 3146 return 0; 3147 } 3148 3149 int ctdb_ctrl_db_push_start(TALLOC_CTX *mem_ctx, struct tevent_context *ev, 3150 struct ctdb_client_context *client, 3151 int destnode, struct timeval timeout, 3152 struct ctdb_pulldb_ext *pulldb) 3153 { 3154 struct ctdb_req_control request; 3155 struct ctdb_reply_control *reply; 3156 int ret; 3157 3158 ctdb_req_control_db_push_start(&request, pulldb); 3159 ret = ctdb_client_control(mem_ctx, ev, client, destnode, timeout, 3160 &request, &reply); 3161 if (ret != 0) { 3162 DEBUG(DEBUG_ERR, 3163 ("Control DB_PUSH failed to node %u, ret=%d\n", 3164 destnode, ret)); 3165 return ret; 3166 } 3167 3168 ret = ctdb_reply_control_db_push_start(reply); 3169 if (ret != 0) { 3170 DEBUG(DEBUG_ERR, 3171 ("Control DB_PUSH failed, ret=%d\n", ret)); 3172 return ret; 3173 } 3174 3175 return 0; 3176 } 3177 3178 int ctdb_ctrl_db_push_confirm(TALLOC_CTX *mem_ctx, struct tevent_context *ev, 3179 struct ctdb_client_context *client, 3180 int destnode, struct timeval timeout, 3181 uint32_t db_id, uint32_t *num_records) 3182 { 3183 struct ctdb_req_control request; 3184 struct ctdb_reply_control *reply; 3185 int ret; 3186 3187 ctdb_req_control_db_push_confirm(&request, db_id); 3188 ret = ctdb_client_control(mem_ctx, ev, client, destnode, timeout, 3189 &request, &reply); 3190 if (ret != 0) { 3191 DEBUG(DEBUG_ERR, 3192 ("Control DB_PUSH failed to node %u, ret=%d\n", 3193 destnode, ret)); 3194 return ret; 3195 } 3196 3197 ret = ctdb_reply_control_db_push_confirm(reply, num_records); 3198 if (ret != 0) { 3199 DEBUG(DEBUG_ERR, 3200 ("Control DB_PUSH failed, ret=%d\n", ret)); 3201 return ret; 3202 } 3203 3204 return 0; 3205 } -
vendor/current/ctdb/client/client_message.c
r988 r989 158 158 159 159 /* 160 * Handle multiple nodes 161 */ 162 163 struct ctdb_client_message_multi_state { 164 uint32_t *pnn_list; 165 int count; 166 int done; 167 int err; 168 int *err_list; 169 }; 170 171 struct message_index_state { 172 struct tevent_req *req; 173 int index; 174 }; 175 176 static void ctdb_client_message_multi_done(struct tevent_req *subreq); 177 178 struct tevent_req *ctdb_client_message_multi_send( 179 TALLOC_CTX *mem_ctx, 180 struct tevent_context *ev, 181 struct ctdb_client_context *client, 182 uint32_t *pnn_list, int count, 183 struct ctdb_req_message *message) 184 { 185 struct tevent_req *req, *subreq; 186 struct ctdb_client_message_multi_state *state; 187 int i; 188 189 if (pnn_list == NULL || count == 0) { 190 return NULL; 191 } 192 193 req = tevent_req_create(mem_ctx, &state, 194 struct ctdb_client_message_multi_state); 195 if (req == NULL) { 196 return NULL; 197 } 198 199 state->pnn_list = pnn_list; 200 state->count = count; 201 state->done = 0; 202 state->err = 0; 203 state->err_list = talloc_zero_array(state, int, count); 204 if (tevent_req_nomem(state->err_list, req)) { 205 return tevent_req_post(req, ev); 206 } 207 208 for (i=0; i<count; i++) { 209 struct message_index_state *substate; 210 211 subreq = ctdb_client_message_send(state, ev, client, 212 pnn_list[i], message); 213 if (tevent_req_nomem(subreq, req)) { 214 return tevent_req_post(req, ev); 215 } 216 217 substate = talloc(subreq, struct message_index_state); 218 if (tevent_req_nomem(substate, req)) { 219 return tevent_req_post(req, ev); 220 } 221 222 substate->req = req; 223 substate->index = i; 224 225 tevent_req_set_callback(subreq, ctdb_client_message_multi_done, 226 substate); 227 } 228 229 return req; 230 } 231 232 static void ctdb_client_message_multi_done(struct tevent_req *subreq) 233 { 234 struct message_index_state *substate = tevent_req_callback_data( 235 subreq, struct message_index_state); 236 struct tevent_req *req = substate->req; 237 int idx = substate->index; 238 struct ctdb_client_message_multi_state *state = tevent_req_data( 239 req, struct ctdb_client_message_multi_state); 240 bool status; 241 int ret; 242 243 status = ctdb_client_message_recv(subreq, &ret); 244 TALLOC_FREE(subreq); 245 if (! status) { 246 if (state->err == 0) { 247 state->err = ret; 248 state->err_list[idx] = state->err; 249 } 250 } 251 252 state->done += 1; 253 254 if (state->done == state->count) { 255 tevent_req_done(req); 256 } 257 } 258 259 bool ctdb_client_message_multi_recv(struct tevent_req *req, int *perr, 260 TALLOC_CTX *mem_ctx, int **perr_list) 261 { 262 struct ctdb_client_message_multi_state *state = tevent_req_data( 263 req, struct ctdb_client_message_multi_state); 264 int err; 265 266 if (tevent_req_is_unix_error(req, &err)) { 267 if (perr != NULL) { 268 *perr = err; 269 } 270 if (perr_list != NULL) { 271 *perr_list = talloc_steal(mem_ctx, state->err_list); 272 } 273 return false; 274 } 275 276 if (perr != NULL) { 277 *perr = state->err; 278 } 279 280 if (perr_list != NULL) { 281 *perr_list = talloc_steal(mem_ctx, state->err_list); 282 } 283 284 if (state->err != 0) { 285 return false; 286 } 287 288 return true; 289 } 290 291 /* 160 292 * sync version of message send 161 293 */ … … 191 323 talloc_free(tmp_ctx); 192 324 return 0; 325 } 326 327 struct ctdb_client_set_message_handler_state { 328 struct ctdb_client_context *client; 329 uint64_t srvid; 330 srvid_handler_fn handler; 331 void *private_data; 332 }; 333 334 static void ctdb_client_set_message_handler_done(struct tevent_req *subreq); 335 336 struct tevent_req *ctdb_client_set_message_handler_send( 337 TALLOC_CTX *mem_ctx, 338 struct tevent_context *ev, 339 struct ctdb_client_context *client, 340 uint64_t srvid, 341 srvid_handler_fn handler, 342 void *private_data) 343 { 344 struct tevent_req *req, *subreq; 345 struct ctdb_client_set_message_handler_state *state; 346 struct ctdb_req_control request; 347 348 req = tevent_req_create(mem_ctx, &state, 349 struct ctdb_client_set_message_handler_state); 350 if (req == NULL) { 351 return NULL; 352 } 353 354 state->client = client; 355 state->srvid = srvid; 356 state->handler = handler; 357 state->private_data = private_data; 358 359 ctdb_req_control_register_srvid(&request, srvid); 360 subreq = ctdb_client_control_send(state, ev, client, client->pnn, 361 tevent_timeval_zero(), &request); 362 if (tevent_req_nomem(subreq, req)) { 363 return tevent_req_post(req, ev); 364 } 365 tevent_req_set_callback(subreq, ctdb_client_set_message_handler_done, 366 req); 367 368 return req; 369 } 370 371 static void ctdb_client_set_message_handler_done(struct tevent_req *subreq) 372 { 373 struct tevent_req *req = tevent_req_callback_data( 374 subreq, struct tevent_req); 375 struct ctdb_client_set_message_handler_state *state = tevent_req_data( 376 req, struct ctdb_client_set_message_handler_state); 377 struct ctdb_reply_control *reply; 378 bool status; 379 int ret; 380 381 status = ctdb_client_control_recv(subreq, &ret, state, &reply); 382 TALLOC_FREE(subreq); 383 if (! status) { 384 tevent_req_error(req, ret); 385 return; 386 } 387 388 ret = ctdb_reply_control_register_srvid(reply); 389 talloc_free(reply); 390 if (ret != 0) { 391 tevent_req_error(req, ret); 392 return; 393 } 394 395 ret = srvid_register(state->client->srv, state->client, state->srvid, 396 state->handler, state->private_data); 397 if (ret != 0) { 398 tevent_req_error(req, ret); 399 return; 400 } 401 402 tevent_req_done(req); 403 } 404 405 bool ctdb_client_set_message_handler_recv(struct tevent_req *req, int *perr) 406 { 407 int err; 408 409 if (tevent_req_is_unix_error(req, &err)) { 410 if (perr != NULL) { 411 *perr = err; 412 } 413 return false; 414 } 415 return true; 416 } 417 418 struct ctdb_client_remove_message_handler_state { 419 struct ctdb_client_context *client; 420 uint64_t srvid; 421 void *private_data; 422 }; 423 424 static void ctdb_client_remove_message_handler_done(struct tevent_req *subreq); 425 426 struct tevent_req *ctdb_client_remove_message_handler_send( 427 TALLOC_CTX *mem_ctx, 428 struct tevent_context *ev, 429 struct ctdb_client_context *client, 430 uint64_t srvid, 431 void *private_data) 432 { 433 struct tevent_req *req, *subreq; 434 struct ctdb_client_remove_message_handler_state *state; 435 struct ctdb_req_control request; 436 437 req = tevent_req_create(mem_ctx, &state, 438 struct ctdb_client_remove_message_handler_state); 439 if (req == NULL) { 440 return NULL; 441 } 442 443 state->client = client; 444 state->srvid = srvid; 445 state->private_data = private_data; 446 447 ctdb_req_control_deregister_srvid(&request, srvid); 448 subreq = ctdb_client_control_send(state, ev, client, client->pnn, 449 tevent_timeval_zero(), &request); 450 if (tevent_req_nomem(subreq, req)) { 451 return tevent_req_post(req, ev); 452 } 453 tevent_req_set_callback(subreq, 454 ctdb_client_remove_message_handler_done, req); 455 456 return req; 457 } 458 459 static void ctdb_client_remove_message_handler_done(struct tevent_req *subreq) 460 { 461 struct tevent_req *req = tevent_req_callback_data( 462 subreq, struct tevent_req); 463 struct ctdb_client_remove_message_handler_state *state = tevent_req_data( 464 req, struct ctdb_client_remove_message_handler_state); 465 struct ctdb_reply_control *reply; 466 bool status; 467 int ret; 468 469 status = ctdb_client_control_recv(subreq, &ret, state, &reply); 470 TALLOC_FREE(subreq); 471 if (! status) { 472 tevent_req_error(req, ret); 473 return; 474 } 475 476 ret = ctdb_reply_control_deregister_srvid(reply); 477 talloc_free(reply); 478 if (ret != 0) { 479 tevent_req_error(req, ret); 480 return; 481 } 482 483 ret = srvid_deregister(state->client->srv, state->srvid, 484 state->private_data); 485 if (ret != 0) { 486 tevent_req_error(req, ret); 487 return; 488 } 489 490 tevent_req_done(req); 491 } 492 493 bool ctdb_client_remove_message_handler_recv(struct tevent_req *req, int *perr) 494 { 495 int err; 496 497 if (tevent_req_is_unix_error(req, &err)) { 498 if (perr != NULL) { 499 *perr = err; 500 } 501 return false; 502 } 503 return true; 193 504 } 194 505
Note:
See TracChangeset
for help on using the changeset viewer.