|
8 | 8 | * pgpool: a language independent connection pool server for PostgreSQL |
9 | 9 | * written by Tatsuo Ishii |
10 | 10 | * |
11 | | - * Copyright (c) 2003-2021 PgPool Global Development Group |
| 11 | + * Copyright (c) 2003-2024 PgPool Global Development Group |
12 | 12 | * |
13 | 13 | * Permission to use, copy, modify, and distribute this software and |
14 | 14 | * its documentation for any purpose and without fee is hereby |
@@ -390,132 +390,140 @@ static PCPResultInfo * process_pcp_response(PCPConnInfo * pcpConn, char sentMsg) |
390 | 390 |
|
391 | 391 | switch (toc) |
392 | 392 | { |
393 | | - case 'r': /* Authentication Response */ |
394 | | - { |
395 | | - if (sentMsg != 'R') |
396 | | - { |
397 | | - setResultStatus(pcpConn, PCP_RES_BAD_RESPONSE); |
398 | | - } |
399 | | - else if (strcmp(buf, "AuthenticationOK") == 0) |
400 | | - { |
401 | | - pcpConn->connState = PCP_CONNECTION_OK; |
402 | | - setResultStatus(pcpConn, PCP_RES_COMMAND_OK); |
403 | | - } |
404 | | - else |
405 | | - { |
406 | | - pcp_internal_error(pcpConn, |
407 | | - "ERROR: authentication failed. reason=\"%s\"", buf); |
408 | | - setResultStatus(pcpConn, PCP_RES_BACKEND_ERROR); |
409 | | - } |
410 | | - } |
| 393 | + case 'a': /* set configuration parameter */ |
| 394 | + if (sentMsg != 'A') |
| 395 | + setResultStatus(pcpConn, PCP_RES_BAD_RESPONSE); |
| 396 | + else |
| 397 | + process_command_complete_response(pcpConn, buf, rsize); |
411 | 398 | break; |
412 | | - case 'm': |
413 | | - if (sentMsg != 'M') |
| 399 | + |
| 400 | + case 'b': /* status request */ |
| 401 | + if (sentMsg != 'B') |
414 | 402 | setResultStatus(pcpConn, PCP_RES_BAD_RESPONSE); |
415 | 403 | else |
416 | | - process_salt_info_response(pcpConn, buf, rsize); |
| 404 | + process_pool_status_response(pcpConn, buf, rsize); |
417 | 405 | break; |
418 | 406 |
|
419 | | - case 'E': |
420 | | - setResultStatus(pcpConn, PCP_RES_BACKEND_ERROR); |
421 | | - process_error_response(pcpConn, toc, buf); |
| 407 | + case 'c': /* attach node */ |
| 408 | + if (sentMsg != 'C' && sentMsg != 'O') |
| 409 | + setResultStatus(pcpConn, PCP_RES_BAD_RESPONSE); |
| 410 | + else |
| 411 | + process_command_complete_response(pcpConn, buf, rsize); |
422 | 412 | break; |
423 | 413 |
|
424 | | - case 'N': |
| 414 | + case 'd': /* detach node */ |
| 415 | + if (sentMsg != 'D' && sentMsg != 'J') |
| 416 | + setResultStatus(pcpConn, PCP_RES_BAD_RESPONSE); |
| 417 | + else |
| 418 | + process_command_complete_response(pcpConn, buf, rsize); |
| 419 | + break; |
| 420 | + |
| 421 | + case 'E': /* error */ |
| 422 | + setResultStatus(pcpConn, PCP_RES_BACKEND_ERROR); |
425 | 423 | process_error_response(pcpConn, toc, buf); |
426 | | - pfree(buf); |
427 | | - continue; |
428 | 424 | break; |
429 | 425 |
|
430 | | - case 'i': |
431 | | - if (sentMsg != 'I') |
| 426 | + case 'g': /* invalidate query cache */ |
| 427 | + if (sentMsg != 'G') |
432 | 428 | setResultStatus(pcpConn, PCP_RES_BAD_RESPONSE); |
433 | 429 | else |
434 | | - process_node_info_response(pcpConn, buf, rsize); |
| 430 | + process_command_complete_response(pcpConn, buf, rsize); |
435 | 431 | break; |
436 | 432 |
|
437 | | - case 'h': |
| 433 | + case 'h': /* health check stats */ |
438 | 434 | if (sentMsg != 'H') |
439 | 435 | setResultStatus(pcpConn, PCP_RES_BAD_RESPONSE); |
440 | 436 | else |
441 | 437 | process_health_check_stats_response(pcpConn, buf, rsize); |
442 | 438 | break; |
443 | 439 |
|
444 | | - case 'l': |
445 | | - if (sentMsg != 'L') |
| 440 | + case 'i': /* node info */ |
| 441 | + if (sentMsg != 'I') |
446 | 442 | setResultStatus(pcpConn, PCP_RES_BAD_RESPONSE); |
447 | 443 | else |
448 | | - process_pcp_node_count_response(pcpConn, buf, rsize); |
| 444 | + process_node_info_response(pcpConn, buf, rsize); |
449 | 445 | break; |
450 | 446 |
|
451 | | - case 'c': |
452 | | - if (sentMsg != 'C' && sentMsg != 'O') |
| 447 | + case 'l': /* node count */ |
| 448 | + if (sentMsg != 'L') |
453 | 449 | setResultStatus(pcpConn, PCP_RES_BAD_RESPONSE); |
454 | 450 | else |
455 | | - process_command_complete_response(pcpConn, buf, rsize); |
| 451 | + process_pcp_node_count_response(pcpConn, buf, rsize); |
456 | 452 | break; |
457 | 453 |
|
458 | | - case 'd': |
459 | | - if (sentMsg != 'D' && sentMsg != 'J') |
| 454 | + case 'm': /* salt info response */ |
| 455 | + if (sentMsg != 'M') |
460 | 456 | setResultStatus(pcpConn, PCP_RES_BAD_RESPONSE); |
461 | 457 | else |
462 | | - process_command_complete_response(pcpConn, buf, rsize); |
| 458 | + process_salt_info_response(pcpConn, buf, rsize); |
463 | 459 | break; |
464 | 460 |
|
465 | | - case 'a': |
466 | | - if (sentMsg != 'A') |
467 | | - setResultStatus(pcpConn, PCP_RES_BAD_RESPONSE); |
468 | | - else |
469 | | - process_command_complete_response(pcpConn, buf, rsize); |
| 461 | + case 'N': /* error response */ |
| 462 | + process_error_response(pcpConn, toc, buf); |
| 463 | + pfree(buf); |
| 464 | + continue; |
470 | 465 | break; |
471 | 466 |
|
472 | | - case 'z': |
473 | | - if (sentMsg != 'Z') |
| 467 | + case 'n': /* process count */ |
| 468 | + if (sentMsg != 'N') |
474 | 469 | setResultStatus(pcpConn, PCP_RES_BAD_RESPONSE); |
475 | 470 | else |
476 | | - process_command_complete_response(pcpConn, buf, rsize); |
| 471 | + process_process_count_response(pcpConn, buf, rsize); |
477 | 472 | break; |
478 | 473 |
|
479 | | - case 'v': /* pcp_log_rotate */ |
480 | | - if (sentMsg != 'V') |
| 474 | + case 'p': /* process info */ |
| 475 | + if (sentMsg != 'P') |
481 | 476 | setResultStatus(pcpConn, PCP_RES_BAD_RESPONSE); |
482 | 477 | else |
483 | | - process_command_complete_response(pcpConn, buf, rsize); |
| 478 | + process_process_info_response(pcpConn, buf, rsize); |
484 | 479 | break; |
485 | 480 |
|
486 | | - case 'w': |
487 | | - if (sentMsg != 'W') |
488 | | - setResultStatus(pcpConn, PCP_RES_BAD_RESPONSE); |
489 | | - else |
490 | | - process_watchdog_info_response(pcpConn, buf, rsize); |
| 481 | + case 'r': /* Authentication Response */ |
| 482 | + { |
| 483 | + if (sentMsg != 'R') |
| 484 | + { |
| 485 | + setResultStatus(pcpConn, PCP_RES_BAD_RESPONSE); |
| 486 | + } |
| 487 | + else if (strcmp(buf, "AuthenticationOK") == 0) |
| 488 | + { |
| 489 | + pcpConn->connState = PCP_CONNECTION_OK; |
| 490 | + setResultStatus(pcpConn, PCP_RES_COMMAND_OK); |
| 491 | + } |
| 492 | + else |
| 493 | + { |
| 494 | + pcp_internal_error(pcpConn, |
| 495 | + "ERROR: authentication failed. reason=\"%s\"", buf); |
| 496 | + setResultStatus(pcpConn, PCP_RES_BACKEND_ERROR); |
| 497 | + } |
| 498 | + } |
491 | 499 | break; |
492 | 500 |
|
493 | | - case 'p': |
494 | | - if (sentMsg != 'P') |
| 501 | + case 't': /* shutdown request */ |
| 502 | + if (sentMsg != 'T') |
495 | 503 | setResultStatus(pcpConn, PCP_RES_BAD_RESPONSE); |
496 | 504 | else |
497 | | - process_process_info_response(pcpConn, buf, rsize); |
| 505 | + setResultStatus(pcpConn, PCP_RES_COMMAND_OK); |
498 | 506 | break; |
499 | 507 |
|
500 | | - case 'n': |
501 | | - if (sentMsg != 'N') |
| 508 | + case 'v': /* pcp_log_rotate */ |
| 509 | + if (sentMsg != 'V') |
502 | 510 | setResultStatus(pcpConn, PCP_RES_BAD_RESPONSE); |
503 | 511 | else |
504 | | - process_process_count_response(pcpConn, buf, rsize); |
| 512 | + process_command_complete_response(pcpConn, buf, rsize); |
505 | 513 | break; |
506 | 514 |
|
507 | | - case 'b': |
508 | | - if (sentMsg != 'B') |
| 515 | + case 'w': /* watchdog info */ |
| 516 | + if (sentMsg != 'W') |
509 | 517 | setResultStatus(pcpConn, PCP_RES_BAD_RESPONSE); |
510 | 518 | else |
511 | | - process_pool_status_response(pcpConn, buf, rsize); |
| 519 | + process_watchdog_info_response(pcpConn, buf, rsize); |
512 | 520 | break; |
513 | 521 |
|
514 | | - case 't': |
515 | | - if (sentMsg != 'T') |
| 522 | + case 'z': /* command complete */ |
| 523 | + if (sentMsg != 'Z') |
516 | 524 | setResultStatus(pcpConn, PCP_RES_BAD_RESPONSE); |
517 | 525 | else |
518 | | - setResultStatus(pcpConn, PCP_RES_COMMAND_OK); |
| 526 | + process_command_complete_response(pcpConn, buf, rsize); |
519 | 527 | break; |
520 | 528 |
|
521 | 529 | default: |
@@ -959,6 +967,28 @@ pcp_log_rotate(PCPConnInfo * pcpConn,char command_scope) |
959 | 967 | return process_pcp_response(pcpConn, 'V'); |
960 | 968 | } |
961 | 969 |
|
| 970 | +PCPResultInfo * |
| 971 | +pcp_invalidate_query_cache(PCPConnInfo * pcpConn) |
| 972 | +{ |
| 973 | + int wsize; |
| 974 | + |
| 975 | + if (PCPConnectionStatus(pcpConn) != PCP_CONNECTION_OK) |
| 976 | + { |
| 977 | + pcp_internal_error(pcpConn, "invalid PCP connection"); |
| 978 | + return NULL; |
| 979 | + } |
| 980 | + |
| 981 | + pcp_write(pcpConn->pcpConn, "G", 1); |
| 982 | + wsize = htonl(sizeof(int)); |
| 983 | + pcp_write(pcpConn->pcpConn, &wsize, sizeof(int)); |
| 984 | + if (PCPFlush(pcpConn) < 0) |
| 985 | + return NULL; |
| 986 | + if (pcpConn->Pfdebug) |
| 987 | + fprintf(pcpConn->Pfdebug, "DEBUG: send: tos=\"G\", len=%d\n", ntohl(wsize)); |
| 988 | + |
| 989 | + return process_pcp_response(pcpConn, 'G'); |
| 990 | +} |
| 991 | + |
962 | 992 | /* |
963 | 993 | * Process health check response from PCP server. |
964 | 994 | * pcpConn: connection to the server |
|
0 commit comments