Skip to content

Commit eaec266

Browse files
committed
restore and fix wsrep status variables
1 parent 13af416 commit eaec266

File tree

6 files changed

+53
-94
lines changed

6 files changed

+53
-94
lines changed

sql/mysqld.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8174,6 +8174,9 @@ SHOW_VAR status_vars[]= {
81748174
{"Uptime", (char*) &show_starttime, SHOW_SIMPLE_FUNC},
81758175
#ifdef ENABLED_PROFILING
81768176
{"Uptime_since_flush_status",(char*) &show_flushstatustime, SHOW_SIMPLE_FUNC},
8177+
#endif
8178+
#ifdef WITH_WSREP
8179+
{"wsrep", (char*) &wsrep_show_status, SHOW_FUNC},
81778180
#endif
81788181
{NullS, NullS, SHOW_LONG}
81798182
};

sql/sql_class.cc

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1026,7 +1026,6 @@ THD::THD(bool is_wsrep_applier)
10261026
wsrep_retry_query_len = 0;
10271027
wsrep_retry_command = COM_CONNECT;
10281028
wsrep_consistency_check = NO_CONSISTENCY_CHECK;
1029-
wsrep_status_vars = 0;
10301029
wsrep_mysql_replicated = 0;
10311030
wsrep_TOI_pre_query = NULL;
10321031
wsrep_TOI_pre_query_len = 0;
@@ -1635,7 +1634,6 @@ THD::~THD()
16351634
mysql_mutex_destroy(&LOCK_wsrep_thd);
16361635
if (wsrep_rli) delete wsrep_rli;
16371636
if (wsrep_rgi) delete wsrep_rgi;
1638-
if (wsrep_status_vars) wsrep->stats_free(wsrep, wsrep_status_vars);
16391637
#endif
16401638
/* Close connection */
16411639
#ifndef EMBEDDED_LIBRARY

sql/sql_class.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3767,7 +3767,6 @@ class THD :public Statement,
37673767
enum enum_server_command wsrep_retry_command;
37683768
enum wsrep_consistency_check_mode
37693769
wsrep_consistency_check;
3770-
wsrep_stats_var* wsrep_status_vars;
37713770
int wsrep_mysql_replicated;
37723771
const char* wsrep_TOI_pre_query; /* a query to apply before
37733772
the actual TOI query */

sql/sql_parse.cc

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5705,14 +5705,6 @@ static bool execute_sqlcom_select(THD *thd, TABLE_LIST *all_tables)
57055705
else
57065706
status_var_add(thd->status_var.rows_sent, thd->get_sent_row_count());
57075707

5708-
#ifdef WITH_WSREP
5709-
if (thd->wsrep_status_vars)
5710-
{
5711-
wsrep->stats_free (wsrep, thd->wsrep_status_vars);
5712-
thd->wsrep_status_vars = 0;
5713-
}
5714-
#endif
5715-
57165708
return res;
57175709
}
57185710

sql/wsrep_mysqld.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ extern my_bool wsrep_restart_slave;
8686
extern my_bool wsrep_restart_slave_activated;
8787
extern my_bool wsrep_slave_FK_checks;
8888
extern my_bool wsrep_slave_UK_checks;
89+
extern ulong wsrep_running_threads;
8990

9091
enum enum_wsrep_OSU_method { WSREP_OSU_TOI, WSREP_OSU_RSU };
9192
enum enum_wsrep_sync_wait {

sql/wsrep_var.cc

Lines changed: 49 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515

1616
#include "wsrep_var.h"
1717

18+
#include <sql_plugin.h>
1819
#include <mysqld.h>
1920
#include <sql_class.h>
20-
#include <sql_plugin.h>
2121
#include <set_var.h>
2222
#include <sql_acl.h>
2323
#include "wsrep_priv.h"
@@ -507,99 +507,65 @@ bool wsrep_desync_update (sys_var *self, THD* thd, enum_var_type type)
507507
return false;
508508
}
509509

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+
};
541525

542-
static void export_wsrep_status_to_mysql(THD* thd)
526+
static int show_var_cmp(const void *var1, const void *var2)
543527
{
544-
int wsrep_status_len, i;
528+
return strcasecmp(((SHOW_VAR*)var1)->name, ((SHOW_VAR*)var2)->name);
529+
}
545530

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;
547535

548-
if (!thd->wsrep_status_vars) {
549-
return;
550-
}
536+
var->type= SHOW_ARRAY;
537+
var->value= buff;
551538

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];
555541

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);
561543

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;
565561
}
566-
567-
mysql_status_len = wsrep_status_len;
568-
mysql_status_vars = (SHOW_VAR*)tmp;
562+
DBUG_ASSERT(i < maxi);
569563
}
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);
574565

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);
577567

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
603569
return 0;
604570
}
605571

0 commit comments

Comments
 (0)