|
15 | 15 |
|
16 | 16 | #include "wsrep_var.h"
|
17 | 17 |
|
| 18 | +#include <sql_plugin.h> |
18 | 19 | #include <mysqld.h>
|
19 | 20 | #include <sql_class.h>
|
20 |
| -#include <sql_plugin.h> |
21 | 21 | #include <set_var.h>
|
22 | 22 | #include <sql_acl.h>
|
23 | 23 | #include "wsrep_priv.h"
|
@@ -507,99 +507,65 @@ bool wsrep_desync_update (sys_var *self, THD* thd, enum_var_type type)
|
507 | 507 | return false;
|
508 | 508 | }
|
509 | 509 |
|
510 |
| -/* |
511 |
| - * Status variables stuff below |
512 |
| - */ |
513 |
| -static inline void |
514 |
| -wsrep_assign_to_mysql (SHOW_VAR* mysql, wsrep_stats_var* wsrep) |
515 |
| -{ |
516 |
| - mysql->name = wsrep->name; |
517 |
| - switch (wsrep->type) { |
518 |
| - case WSREP_VAR_INT64: |
519 |
| - mysql->value = (char*) &wsrep->value._int64; |
520 |
| - mysql->type = SHOW_LONGLONG; |
521 |
| - break; |
522 |
| - case WSREP_VAR_STRING: |
523 |
| - mysql->value = (char*) &wsrep->value._string; |
524 |
| - mysql->type = SHOW_CHAR_PTR; |
525 |
| - break; |
526 |
| - case WSREP_VAR_DOUBLE: |
527 |
| - mysql->value = (char*) &wsrep->value._double; |
528 |
| - mysql->type = SHOW_DOUBLE; |
529 |
| - break; |
530 |
| - } |
531 |
| -} |
532 |
| - |
533 |
| -#if DYNAMIC |
534 |
| -// somehow this mysql status thing works only with statically allocated arrays. |
535 |
| -static SHOW_VAR* mysql_status_vars = NULL; |
536 |
| -static int mysql_status_len = -1; |
537 |
| -#else |
538 |
| -static SHOW_VAR mysql_status_vars[512 + 1]; |
539 |
| -static const int mysql_status_len = 512; |
540 |
| -#endif |
| 510 | +static SHOW_VAR wsrep_status_vars[]= |
| 511 | +{ |
| 512 | + {"connected", (char*) &wsrep_connected, SHOW_BOOL}, |
| 513 | + {"ready", (char*) &wsrep_ready, SHOW_BOOL}, |
| 514 | + {"cluster_state_uuid",(char*) &wsrep_cluster_state_uuid,SHOW_CHAR_PTR}, |
| 515 | + {"cluster_conf_id", (char*) &wsrep_cluster_conf_id, SHOW_LONGLONG}, |
| 516 | + {"cluster_status", (char*) &wsrep_cluster_status, SHOW_CHAR_PTR}, |
| 517 | + {"cluster_size", (char*) &wsrep_cluster_size, SHOW_LONG_NOFLUSH}, |
| 518 | + {"local_index", (char*) &wsrep_local_index, SHOW_LONG_NOFLUSH}, |
| 519 | + {"local_bf_aborts", (char*) &wsrep_show_bf_aborts, SHOW_SIMPLE_FUNC}, |
| 520 | + {"provider_name", (char*) &wsrep_provider_name, SHOW_CHAR_PTR}, |
| 521 | + {"provider_version", (char*) &wsrep_provider_version, SHOW_CHAR_PTR}, |
| 522 | + {"provider_vendor", (char*) &wsrep_provider_vendor, SHOW_CHAR_PTR}, |
| 523 | + {"thread_count", (char*) &wsrep_running_threads, SHOW_LONG_NOFLUSH} |
| 524 | +}; |
541 | 525 |
|
542 |
| -static void export_wsrep_status_to_mysql(THD* thd) |
| 526 | +static int show_var_cmp(const void *var1, const void *var2) |
543 | 527 | {
|
544 |
| - int wsrep_status_len, i; |
| 528 | + return strcasecmp(((SHOW_VAR*)var1)->name, ((SHOW_VAR*)var2)->name); |
| 529 | +} |
545 | 530 |
|
546 |
| - thd->wsrep_status_vars = wsrep->stats_get(wsrep); |
| 531 | +int wsrep_show_status (THD *thd, SHOW_VAR *var, char *buff) |
| 532 | +{ |
| 533 | + uint i, maxi= SHOW_VAR_FUNC_BUFF_SIZE / sizeof(*var) - 1; |
| 534 | + SHOW_VAR *v= (SHOW_VAR *)buff; |
547 | 535 |
|
548 |
| - if (!thd->wsrep_status_vars) { |
549 |
| - return; |
550 |
| - } |
| 536 | + var->type= SHOW_ARRAY; |
| 537 | + var->value= buff; |
551 | 538 |
|
552 |
| - for (wsrep_status_len = 0; |
553 |
| - thd->wsrep_status_vars[wsrep_status_len].name != NULL; |
554 |
| - wsrep_status_len++); |
| 539 | + for (i=0; i < array_elements(wsrep_status_vars); i++) |
| 540 | + *v++= wsrep_status_vars[i]; |
555 | 541 |
|
556 |
| -#if DYNAMIC |
557 |
| - if (wsrep_status_len != mysql_status_len) { |
558 |
| - void* tmp = realloc (mysql_status_vars, |
559 |
| - (wsrep_status_len + 1) * sizeof(SHOW_VAR)); |
560 |
| - if (!tmp) { |
| 542 | + DBUG_ASSERT(i < maxi); |
561 | 543 |
|
562 |
| - sql_print_error ("Out of memory for wsrep status variables." |
563 |
| - "Number of variables: %d", wsrep_status_len); |
564 |
| - return; |
| 544 | + wsrep_stats_var* stats= wsrep->stats_get(wsrep); |
| 545 | + for (wsrep_stats_var *sv= stats; i < maxi && sv && sv->name; i++, sv++, v++) |
| 546 | + { |
| 547 | + v->name = thd->strdup(sv->name); |
| 548 | + switch (sv->type) { |
| 549 | + case WSREP_VAR_INT64: |
| 550 | + v->value = (char*)thd->memdup(&sv->value._int64, sizeof(longlong)); |
| 551 | + v->type = SHOW_LONGLONG; |
| 552 | + break; |
| 553 | + case WSREP_VAR_STRING: |
| 554 | + v->value = thd->strdup(sv->value._string); |
| 555 | + v->type = SHOW_CHAR; |
| 556 | + break; |
| 557 | + case WSREP_VAR_DOUBLE: |
| 558 | + v->value = (char*)thd->memdup(&sv->value._double, sizeof(double)); |
| 559 | + v->type = SHOW_DOUBLE; |
| 560 | + break; |
565 | 561 | }
|
566 |
| - |
567 |
| - mysql_status_len = wsrep_status_len; |
568 |
| - mysql_status_vars = (SHOW_VAR*)tmp; |
| 562 | + DBUG_ASSERT(i < maxi); |
569 | 563 | }
|
570 |
| - /* @TODO: fix this: */ |
571 |
| -#else |
572 |
| - if (mysql_status_len < wsrep_status_len) wsrep_status_len= mysql_status_len; |
573 |
| -#endif |
| 564 | + wsrep->stats_free(wsrep, stats); |
574 | 565 |
|
575 |
| - for (i = 0; i < wsrep_status_len; i++) |
576 |
| - wsrep_assign_to_mysql (mysql_status_vars + i, thd->wsrep_status_vars + i); |
| 566 | + my_qsort(buff, i, sizeof(*v), show_var_cmp); |
577 | 567 |
|
578 |
| - mysql_status_vars[wsrep_status_len].name = NullS; |
579 |
| - mysql_status_vars[wsrep_status_len].value = NullS; |
580 |
| - mysql_status_vars[wsrep_status_len].type = SHOW_LONG; |
581 |
| -} |
582 |
| - |
583 |
| -int wsrep_show_status (THD *thd, SHOW_VAR *var, char *buff) |
584 |
| -{ |
585 |
| - export_wsrep_status_to_mysql(thd); |
586 |
| - var->type= SHOW_ARRAY; |
587 |
| - var->value= (char *) &mysql_status_vars; |
588 |
| -#if 0 |
589 |
| - {"wsrep_connected", (char*) &wsrep_connected, SHOW_BOOL}, |
590 |
| - {"wsrep_ready", (char*) &wsrep_ready, SHOW_BOOL}, |
591 |
| - {"wsrep_cluster_state_uuid", (char*) &wsrep_cluster_state_uuid,SHOW_CHAR_PTR}, |
592 |
| - {"wsrep_cluster_conf_id", (char*) &wsrep_cluster_conf_id, SHOW_LONGLONG}, |
593 |
| - {"wsrep_cluster_status", (char*) &wsrep_cluster_status, SHOW_CHAR_PTR}, |
594 |
| - {"wsrep_cluster_size", (char*) &wsrep_cluster_size, SHOW_LONG_NOFLUSH}, |
595 |
| - {"wsrep_local_index", (char*) &wsrep_local_index, SHOW_LONG_NOFLUSH}, |
596 |
| - {"wsrep_local_bf_aborts", (char*) &wsrep_show_bf_aborts, SHOW_SIMPLE_FUNC}, |
597 |
| - {"wsrep_provider_name", (char*) &wsrep_provider_name, SHOW_CHAR_PTR}, |
598 |
| - {"wsrep_provider_version", (char*) &wsrep_provider_version, SHOW_CHAR_PTR}, |
599 |
| - {"wsrep_provider_vendor", (char*) &wsrep_provider_vendor, SHOW_CHAR_PTR}, |
600 |
| - {"wsrep_thread_count", (char*) &wsrep_running_threads, SHOW_LONG_NOFLUSH}, |
601 |
| - {"wsrep", (char*) &wsrep_show_status, SHOW_FUNC}, |
602 |
| -#endif |
| 568 | + v->name= 0; // terminator |
603 | 569 | return 0;
|
604 | 570 | }
|
605 | 571 |
|
0 commit comments