summaryrefslogtreecommitdiff
path: root/storage/federatedx
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2015-12-21 21:24:22 +0100
committerSergei Golubchik <serg@mariadb.org>2015-12-21 21:24:22 +0100
commita2bcee626d4ef2836e38e4932305871390164644 (patch)
treeb41e357427318bad8985078b91bbd2b0360defc8 /storage/federatedx
parent1788bfe93a745582d938a608d5959b7d2e6b2f23 (diff)
parent4fdf25afa8188905653a83e08fc387243e584600 (diff)
downloadmariadb-git-a2bcee626d4ef2836e38e4932305871390164644.tar.gz
Merge branch '10.0' into 10.1
Diffstat (limited to 'storage/federatedx')
-rw-r--r--storage/federatedx/ha_federatedx.cc71
1 files changed, 38 insertions, 33 deletions
diff --git a/storage/federatedx/ha_federatedx.cc b/storage/federatedx/ha_federatedx.cc
index 28b9b33b1e5..5834e70c2e5 100644
--- a/storage/federatedx/ha_federatedx.cc
+++ b/storage/federatedx/ha_federatedx.cc
@@ -1641,6 +1641,7 @@ error:
}
+static federatedx_txn zero_txn;
static int free_server(federatedx_txn *txn, FEDERATEDX_SERVER *server)
{
bool destroy;
@@ -1656,12 +1657,9 @@ static int free_server(federatedx_txn *txn, FEDERATEDX_SERVER *server)
MEM_ROOT mem_root;
if (!txn)
- {
- federatedx_txn tmp_txn;
- tmp_txn.close(server);
- }
- else
- txn->close(server);
+ txn= &zero_txn;
+
+ txn->close(server);
DBUG_ASSERT(server->io_count == 0);
@@ -1680,7 +1678,7 @@ static int free_server(federatedx_txn *txn, FEDERATEDX_SERVER *server)
free memory associated with it.
*/
-static int free_share(federatedx_txn *txn, FEDERATEDX_SHARE *share)
+static void free_share(federatedx_txn *txn, FEDERATEDX_SHARE *share)
{
bool destroy;
DBUG_ENTER("free_share");
@@ -1703,7 +1701,7 @@ static int free_share(federatedx_txn *txn, FEDERATEDX_SHARE *share)
free_server(txn, server);
}
- DBUG_RETURN(0);
+ DBUG_VOID_RETURN;
}
@@ -1753,7 +1751,7 @@ int ha_federatedx::disconnect(handlerton *hton, MYSQL_THD thd)
int ha_federatedx::open(const char *name, int mode, uint test_if_locked)
{
int error;
- THD *thd= current_thd;
+ THD *thd= ha_thd();
DBUG_ENTER("ha_federatedx::open");
if (!(share= get_share(name, table)))
@@ -1783,6 +1781,20 @@ int ha_federatedx::open(const char *name, int mode, uint test_if_locked)
DBUG_RETURN(0);
}
+class Net_error_handler : public Internal_error_handler
+{
+public:
+ Net_error_handler() {}
+
+public:
+ bool handle_condition(THD *thd, uint sql_errno, const char* sqlstate,
+ Sql_condition::enum_warning_level level,
+ const char* msg, Sql_condition ** cond_hdl)
+ {
+ return sql_errno >= ER_ABORTING_CONNECTION &&
+ sql_errno <= ER_NET_WRITE_INTERRUPTED;
+ }
+};
/*
Closes a table. We call the free_share() function to free any resources
@@ -1797,8 +1809,8 @@ int ha_federatedx::open(const char *name, int mode, uint test_if_locked)
int ha_federatedx::close(void)
{
- int retval= 0, error;
- THD *thd= current_thd;
+ int retval= 0;
+ THD *thd= ha_thd();
DBUG_ENTER("ha_federatedx::close");
/* free the result set */
@@ -1808,24 +1820,18 @@ int ha_federatedx::close(void)
/* Disconnect from mysql */
if (!thd || !(txn= get_txn(thd, true)))
- {
- federatedx_txn tmp_txn;
-
- tmp_txn.release(&io);
+ txn= &zero_txn;
- DBUG_ASSERT(io == NULL);
+ txn->release(&io);
+ DBUG_ASSERT(io == NULL);
- if ((error= free_share(&tmp_txn, share)))
- retval= error;
- }
- else
- {
- txn->release(&io);
- DBUG_ASSERT(io == NULL);
+ Net_error_handler err_handler;
+ if (thd)
+ thd->push_internal_handler(&err_handler);
+ free_share(txn, share);
+ if (thd)
+ thd->pop_internal_handler();
- if ((error= free_share(txn, share)))
- retval= error;
- }
DBUG_RETURN(retval);
}
@@ -1848,9 +1854,8 @@ int ha_federatedx::close(void)
0 otherwise
*/
-static inline uint field_in_record_is_null(TABLE *table,
- Field *field,
- char *record)
+static inline uint field_in_record_is_null(TABLE *table, Field *field,
+ char *record)
{
int null_offset;
DBUG_ENTER("ha_federatedx::field_in_record_is_null");
@@ -2187,7 +2192,7 @@ int ha_federatedx::end_bulk_insert()
*/
void ha_federatedx::update_auto_increment(void)
{
- THD *thd= current_thd;
+ THD *thd= ha_thd();
DBUG_ENTER("ha_federatedx::update_auto_increment");
ha_federatedx::info(HA_STATUS_AUTO);
@@ -3034,7 +3039,7 @@ error:
int ha_federatedx::info(uint flag)
{
uint error_code;
- THD *thd= current_thd;
+ THD *thd= ha_thd();
federatedx_txn *tmp_txn;
federatedx_io *tmp_io= 0, **iop= 0;
DBUG_ENTER("ha_federatedx::info");
@@ -3165,7 +3170,7 @@ int ha_federatedx::reset(void)
federatedx_io *tmp_io= 0, **iop;
// external_lock may not have been called so txn may not be set
- tmp_txn= get_txn(current_thd);
+ tmp_txn= get_txn(ha_thd());
if (!*(iop= &io) && (error= tmp_txn->acquire(share, TRUE, (iop= &tmp_io))))
{
@@ -3340,7 +3345,7 @@ int ha_federatedx::create(const char *name, TABLE *table_arg,
HA_CREATE_INFO *create_info)
{
int retval;
- THD *thd= current_thd;
+ THD *thd= ha_thd();
FEDERATEDX_SHARE tmp_share; // Only a temporary share, to test the url
federatedx_txn *tmp_txn;
federatedx_io *tmp_io= NULL;