diff options
author | Sergei Golubchik <serg@mariadb.org> | 2014-09-28 12:41:51 +0200 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2014-10-01 23:48:35 +0200 |
commit | eaec266eb16c8f02835f76ac987fca5de4debd51 (patch) | |
tree | 9cca42f62ebe463f1ac8600f2b6cfde5356d2056 | |
parent | 13af416a82796648dffdffbda0da6d60513d7ddf (diff) | |
download | mariadb-git-eaec266eb16c8f02835f76ac987fca5de4debd51.tar.gz |
restore and fix wsrep status variables
-rw-r--r-- | sql/mysqld.cc | 3 | ||||
-rw-r--r-- | sql/sql_class.cc | 2 | ||||
-rw-r--r-- | sql/sql_class.h | 1 | ||||
-rw-r--r-- | sql/sql_parse.cc | 8 | ||||
-rw-r--r-- | sql/wsrep_mysqld.h | 1 | ||||
-rw-r--r-- | sql/wsrep_var.cc | 132 |
6 files changed, 53 insertions, 94 deletions
diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 4119e0e5554..17f8169259e 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -8175,6 +8175,9 @@ SHOW_VAR status_vars[]= { #ifdef ENABLED_PROFILING {"Uptime_since_flush_status",(char*) &show_flushstatustime, SHOW_SIMPLE_FUNC}, #endif +#ifdef WITH_WSREP + {"wsrep", (char*) &wsrep_show_status, SHOW_FUNC}, +#endif {NullS, NullS, SHOW_LONG} }; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 782e4a27317..dde0a9a2f7a 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -1026,7 +1026,6 @@ THD::THD(bool is_wsrep_applier) wsrep_retry_query_len = 0; wsrep_retry_command = COM_CONNECT; wsrep_consistency_check = NO_CONSISTENCY_CHECK; - wsrep_status_vars = 0; wsrep_mysql_replicated = 0; wsrep_TOI_pre_query = NULL; wsrep_TOI_pre_query_len = 0; @@ -1635,7 +1634,6 @@ THD::~THD() mysql_mutex_destroy(&LOCK_wsrep_thd); if (wsrep_rli) delete wsrep_rli; if (wsrep_rgi) delete wsrep_rgi; - if (wsrep_status_vars) wsrep->stats_free(wsrep, wsrep_status_vars); #endif /* Close connection */ #ifndef EMBEDDED_LIBRARY diff --git a/sql/sql_class.h b/sql/sql_class.h index 2db9618a824..4b787943ec9 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -3767,7 +3767,6 @@ public: enum enum_server_command wsrep_retry_command; enum wsrep_consistency_check_mode wsrep_consistency_check; - wsrep_stats_var* wsrep_status_vars; int wsrep_mysql_replicated; const char* wsrep_TOI_pre_query; /* a query to apply before the actual TOI query */ diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index cdafeccd392..0180a1d97c5 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -5705,14 +5705,6 @@ static bool execute_sqlcom_select(THD *thd, TABLE_LIST *all_tables) else status_var_add(thd->status_var.rows_sent, thd->get_sent_row_count()); -#ifdef WITH_WSREP - if (thd->wsrep_status_vars) - { - wsrep->stats_free (wsrep, thd->wsrep_status_vars); - thd->wsrep_status_vars = 0; - } -#endif - return res; } diff --git a/sql/wsrep_mysqld.h b/sql/wsrep_mysqld.h index d9ac32d1f6c..bc78d2beecf 100644 --- a/sql/wsrep_mysqld.h +++ b/sql/wsrep_mysqld.h @@ -86,6 +86,7 @@ extern my_bool wsrep_restart_slave; extern my_bool wsrep_restart_slave_activated; extern my_bool wsrep_slave_FK_checks; extern my_bool wsrep_slave_UK_checks; +extern ulong wsrep_running_threads; enum enum_wsrep_OSU_method { WSREP_OSU_TOI, WSREP_OSU_RSU }; enum enum_wsrep_sync_wait { diff --git a/sql/wsrep_var.cc b/sql/wsrep_var.cc index 3f4b163281b..c6e9b89ca55 100644 --- a/sql/wsrep_var.cc +++ b/sql/wsrep_var.cc @@ -15,9 +15,9 @@ #include "wsrep_var.h" +#include <sql_plugin.h> #include <mysqld.h> #include <sql_class.h> -#include <sql_plugin.h> #include <set_var.h> #include <sql_acl.h> #include "wsrep_priv.h" @@ -507,99 +507,65 @@ bool wsrep_desync_update (sys_var *self, THD* thd, enum_var_type type) return false; } -/* - * Status variables stuff below - */ -static inline void -wsrep_assign_to_mysql (SHOW_VAR* mysql, wsrep_stats_var* wsrep) -{ - mysql->name = wsrep->name; - switch (wsrep->type) { - case WSREP_VAR_INT64: - mysql->value = (char*) &wsrep->value._int64; - mysql->type = SHOW_LONGLONG; - break; - case WSREP_VAR_STRING: - mysql->value = (char*) &wsrep->value._string; - mysql->type = SHOW_CHAR_PTR; - break; - case WSREP_VAR_DOUBLE: - mysql->value = (char*) &wsrep->value._double; - mysql->type = SHOW_DOUBLE; - break; - } -} - -#if DYNAMIC -// somehow this mysql status thing works only with statically allocated arrays. -static SHOW_VAR* mysql_status_vars = NULL; -static int mysql_status_len = -1; -#else -static SHOW_VAR mysql_status_vars[512 + 1]; -static const int mysql_status_len = 512; -#endif +static SHOW_VAR wsrep_status_vars[]= +{ + {"connected", (char*) &wsrep_connected, SHOW_BOOL}, + {"ready", (char*) &wsrep_ready, SHOW_BOOL}, + {"cluster_state_uuid",(char*) &wsrep_cluster_state_uuid,SHOW_CHAR_PTR}, + {"cluster_conf_id", (char*) &wsrep_cluster_conf_id, SHOW_LONGLONG}, + {"cluster_status", (char*) &wsrep_cluster_status, SHOW_CHAR_PTR}, + {"cluster_size", (char*) &wsrep_cluster_size, SHOW_LONG_NOFLUSH}, + {"local_index", (char*) &wsrep_local_index, SHOW_LONG_NOFLUSH}, + {"local_bf_aborts", (char*) &wsrep_show_bf_aborts, SHOW_SIMPLE_FUNC}, + {"provider_name", (char*) &wsrep_provider_name, SHOW_CHAR_PTR}, + {"provider_version", (char*) &wsrep_provider_version, SHOW_CHAR_PTR}, + {"provider_vendor", (char*) &wsrep_provider_vendor, SHOW_CHAR_PTR}, + {"thread_count", (char*) &wsrep_running_threads, SHOW_LONG_NOFLUSH} +}; -static void export_wsrep_status_to_mysql(THD* thd) +static int show_var_cmp(const void *var1, const void *var2) { - int wsrep_status_len, i; + return strcasecmp(((SHOW_VAR*)var1)->name, ((SHOW_VAR*)var2)->name); +} - thd->wsrep_status_vars = wsrep->stats_get(wsrep); +int wsrep_show_status (THD *thd, SHOW_VAR *var, char *buff) +{ + uint i, maxi= SHOW_VAR_FUNC_BUFF_SIZE / sizeof(*var) - 1; + SHOW_VAR *v= (SHOW_VAR *)buff; - if (!thd->wsrep_status_vars) { - return; - } + var->type= SHOW_ARRAY; + var->value= buff; - for (wsrep_status_len = 0; - thd->wsrep_status_vars[wsrep_status_len].name != NULL; - wsrep_status_len++); + for (i=0; i < array_elements(wsrep_status_vars); i++) + *v++= wsrep_status_vars[i]; -#if DYNAMIC - if (wsrep_status_len != mysql_status_len) { - void* tmp = realloc (mysql_status_vars, - (wsrep_status_len + 1) * sizeof(SHOW_VAR)); - if (!tmp) { + DBUG_ASSERT(i < maxi); - sql_print_error ("Out of memory for wsrep status variables." - "Number of variables: %d", wsrep_status_len); - return; + wsrep_stats_var* stats= wsrep->stats_get(wsrep); + for (wsrep_stats_var *sv= stats; i < maxi && sv && sv->name; i++, sv++, v++) + { + v->name = thd->strdup(sv->name); + switch (sv->type) { + case WSREP_VAR_INT64: + v->value = (char*)thd->memdup(&sv->value._int64, sizeof(longlong)); + v->type = SHOW_LONGLONG; + break; + case WSREP_VAR_STRING: + v->value = thd->strdup(sv->value._string); + v->type = SHOW_CHAR; + break; + case WSREP_VAR_DOUBLE: + v->value = (char*)thd->memdup(&sv->value._double, sizeof(double)); + v->type = SHOW_DOUBLE; + break; } - - mysql_status_len = wsrep_status_len; - mysql_status_vars = (SHOW_VAR*)tmp; + DBUG_ASSERT(i < maxi); } - /* @TODO: fix this: */ -#else - if (mysql_status_len < wsrep_status_len) wsrep_status_len= mysql_status_len; -#endif + wsrep->stats_free(wsrep, stats); - for (i = 0; i < wsrep_status_len; i++) - wsrep_assign_to_mysql (mysql_status_vars + i, thd->wsrep_status_vars + i); + my_qsort(buff, i, sizeof(*v), show_var_cmp); - mysql_status_vars[wsrep_status_len].name = NullS; - mysql_status_vars[wsrep_status_len].value = NullS; - mysql_status_vars[wsrep_status_len].type = SHOW_LONG; -} - -int wsrep_show_status (THD *thd, SHOW_VAR *var, char *buff) -{ - export_wsrep_status_to_mysql(thd); - var->type= SHOW_ARRAY; - var->value= (char *) &mysql_status_vars; -#if 0 - {"wsrep_connected", (char*) &wsrep_connected, SHOW_BOOL}, - {"wsrep_ready", (char*) &wsrep_ready, SHOW_BOOL}, - {"wsrep_cluster_state_uuid", (char*) &wsrep_cluster_state_uuid,SHOW_CHAR_PTR}, - {"wsrep_cluster_conf_id", (char*) &wsrep_cluster_conf_id, SHOW_LONGLONG}, - {"wsrep_cluster_status", (char*) &wsrep_cluster_status, SHOW_CHAR_PTR}, - {"wsrep_cluster_size", (char*) &wsrep_cluster_size, SHOW_LONG_NOFLUSH}, - {"wsrep_local_index", (char*) &wsrep_local_index, SHOW_LONG_NOFLUSH}, - {"wsrep_local_bf_aborts", (char*) &wsrep_show_bf_aborts, SHOW_SIMPLE_FUNC}, - {"wsrep_provider_name", (char*) &wsrep_provider_name, SHOW_CHAR_PTR}, - {"wsrep_provider_version", (char*) &wsrep_provider_version, SHOW_CHAR_PTR}, - {"wsrep_provider_vendor", (char*) &wsrep_provider_vendor, SHOW_CHAR_PTR}, - {"wsrep_thread_count", (char*) &wsrep_running_threads, SHOW_LONG_NOFLUSH}, - {"wsrep", (char*) &wsrep_show_status, SHOW_FUNC}, -#endif + v->name= 0; // terminator return 0; } |