polardbxengine/storage/ndb/plugin/ndb_thd.cc

136 lines
4.4 KiB
C++

/*
Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License, version 2.0,
as published by the Free Software Foundation.
This program is also distributed with certain software (including
but not limited to OpenSSL) that is licensed under separate terms,
as designated in a particular file or component or in included license
documentation. The authors of MySQL hereby grant you an additional
permission to link the program and your derivative works with the
separately licensed software that they have included with MySQL.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License, version 2.0, for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "storage/ndb/plugin/ndb_thd.h"
#include "my_dbug.h"
#include "mysql/thread_type.h"
#include "sql/handler.h"
#include "sql/sql_class.h"
#include "storage/ndb/plugin/ndb_log.h" // ndb_log_*
#include "storage/ndb/plugin/ndb_thd_ndb.h"
/*
Make sure THD has a Thd_ndb struct allocated and associated
- validate_ndb, check if the Ndb object need to be recycled
*/
Ndb *check_ndb_in_thd(THD *thd, bool validate_ndb) {
Thd_ndb *thd_ndb = get_thd_ndb(thd);
if (!thd_ndb) {
if (!(thd_ndb = Thd_ndb::seize(thd))) return NULL;
thd_set_thd_ndb(thd, thd_ndb);
}
else if (validate_ndb && !thd_ndb->valid_ndb()) {
if (!thd_ndb->recycle_ndb()) return NULL;
}
DBUG_ASSERT(thd_ndb->is_slave_thread() == thd->slave_thread);
return thd_ndb->ndb;
}
bool applying_binlog(const THD *thd) {
if (thd->slave_thread) {
DBUG_PRINT("info", ("THD is slave thread"));
return true;
}
if (thd->rli_fake) {
/*
Thread is in "pseudo_slave_mode" which is entered implicitly when the
first BINLOG statement is executed (see 'mysql_client_binlog_statement')
and explicitly ended when SET @pseudo_slave_mode=0 is finally executed.
*/
DBUG_PRINT("info", ("THD is in pseduo slave mode"));
return true;
}
return false;
}
extern ulong opt_server_id_mask;
uint32 thd_unmasked_server_id(const THD *thd) {
const uint32 unmasked_server_id = thd->unmasked_server_id;
assert(thd->server_id == (thd->unmasked_server_id & opt_server_id_mask));
return unmasked_server_id;
}
const char *ndb_thd_query(const THD *thd) { return thd->query().str; }
size_t ndb_thd_query_length(const THD *thd) { return thd->query().length; }
bool ndb_thd_is_binlog_thread(const THD *thd) {
return thd->system_thread == SYSTEM_THREAD_NDBCLUSTER_BINLOG;
}
bool ndb_thd_is_background_thread(const THD *thd) {
return thd->system_thread == SYSTEM_THREAD_BACKGROUND;
}
void ndb_thd_register_trans(THD *thd, bool register_trans) {
// Always register for the statement
trans_register_ha(thd, false, ndbcluster_hton, nullptr);
// Register for the transaction if requested.
if (register_trans &&
thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) {
trans_register_ha(thd, true, ndbcluster_hton, nullptr);
}
}
void clear_thd_conditions(THD *thd) {
// Remove the THD conditions
thd->get_stmt_da()->reset_diagnostics_area();
thd->get_stmt_da()->reset_condition_info(thd);
}
void log_and_clear_thd_conditions(THD *thd,
condition_logging_level logging_level) {
// Print THD's list of conditions to error log
Diagnostics_area::Sql_condition_iterator it(
thd->get_stmt_da()->sql_conditions());
const Sql_condition *err;
while ((err = it++)) {
switch (logging_level) {
case condition_logging_level::INFO: {
ndb_log_info("Got error '%u: %s'", err->mysql_errno(),
err->message_text());
} break;
case condition_logging_level::WARNING: {
ndb_log_warning("Got error '%u: %s'", err->mysql_errno(),
err->message_text());
} break;
case condition_logging_level::ERROR: {
ndb_log_error("Got error '%u: %s'", err->mysql_errno(),
err->message_text());
} break;
}
}
clear_thd_conditions(thd);
}