Merge 10.0 into 10.1
This commit is contained in:
commit
13a350ac29
@ -3962,6 +3962,7 @@ xtrabackup_backup_func(void)
|
||||
mysql_data_home[0]=FN_CURLIB; // all paths are relative from here
|
||||
mysql_data_home[1]=0;
|
||||
|
||||
srv_n_purge_threads = 1;
|
||||
srv_read_only_mode = TRUE;
|
||||
|
||||
srv_backup_mode = TRUE;
|
||||
@ -4650,6 +4651,7 @@ xtrabackup_stats_func(int argc, char **argv)
|
||||
mysql_data_home[0]=FN_CURLIB; // all paths are relative from here
|
||||
mysql_data_home[1]=0;
|
||||
|
||||
srv_n_purge_threads = 1;
|
||||
/* set read only */
|
||||
srv_read_only_mode = TRUE;
|
||||
|
||||
@ -6407,6 +6409,7 @@ skip_check:
|
||||
|
||||
/* Create logfiles for recovery from 'xtrabackup_logfile', before start InnoDB */
|
||||
srv_max_n_threads = 1000;
|
||||
srv_n_purge_threads = 1;
|
||||
ut_mem_init();
|
||||
/* temporally dummy value to avoid crash */
|
||||
srv_page_size_shift = 14;
|
||||
|
@ -934,6 +934,12 @@ extern ulonglong my_getcputime(void);
|
||||
#define hrtime_sec_part(X) ((ulong)((X).val % HRTIME_RESOLUTION))
|
||||
#define my_time(X) hrtime_to_time(my_hrtime())
|
||||
|
||||
#if STACK_DIRECTION < 0
|
||||
#define available_stack_size(CUR,END) (long) ((char*)(CUR) - (char*)(END))
|
||||
#else
|
||||
#define available_stack_size(CUR,END) (long) ((char*)(END) - (char*)(CUR))
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_MMAN_H
|
||||
#include <sys/mman.h>
|
||||
|
||||
|
@ -1406,7 +1406,7 @@ void set_stmt_errmsg(MYSQL_STMT *stmt, NET *net)
|
||||
DBUG_ASSERT(stmt != 0);
|
||||
|
||||
stmt->last_errno= net->last_errno;
|
||||
if (net->last_error && net->last_error[0])
|
||||
if (net->last_error[0])
|
||||
strmov(stmt->last_error, net->last_error);
|
||||
strmov(stmt->sqlstate, net->sqlstate);
|
||||
|
||||
@ -4709,8 +4709,7 @@ my_bool STDCALL mysql_stmt_close(MYSQL_STMT *stmt)
|
||||
{
|
||||
uchar buff[MYSQL_STMT_HEADER]; /* 4 bytes - stmt id */
|
||||
|
||||
if ((rc= reset_stmt_handle(stmt, RESET_ALL_BUFFERS | RESET_CLEAR_ERROR)))
|
||||
return rc;
|
||||
reset_stmt_handle(stmt, RESET_ALL_BUFFERS | RESET_CLEAR_ERROR);
|
||||
|
||||
int4store(buff, stmt->stmt_id);
|
||||
if ((rc= stmt_command(mysql, COM_STMT_CLOSE, buff, 4, stmt)))
|
||||
|
@ -878,3 +878,8 @@ SET @regCheck= '\\xE0\\x01';
|
||||
SELECT CAST(0xE001 AS BINARY) REGEXP @regCheck;
|
||||
CAST(0xE001 AS BINARY) REGEXP @regCheck
|
||||
1
|
||||
# MDEV-12420: Testing recursion overflow
|
||||
SELECT 1 FROM dual WHERE ('Alpha,Bravo,Charlie,Delta,Echo,Foxtrot,StrataCentral,Golf,Hotel,India,Juliet,Kilo,Lima,Mike,StrataL3,November,Oscar,StrataL2,Sand,P3,P4SwitchTest,Arsys,Poppa,ExtensionMgr,Arp,Quebec,Romeo,StrataApiV2,PtReyes,Sierra,SandAcl,Arrow,Artools,BridgeTest,Tango,SandT,PAlaska,Namespace,Agent,Qos,PatchPanel,ProjectReport,Ark,Gimp,Agent,SliceAgent,Arnet,Bgp,Ale,Tommy,Central,AsicPktTestLib,Hsc,SandL3,Abuild,Pca9555,Standby,ControllerDut,CalSys,SandLib,Sb820,PointV2,BfnLib,Evpn,BfnSdk,Sflow,ManagementActive,AutoTest,GatedTest,Bgp,Sand,xinetd,BfnAgentLib,bf-utils,Hello,BfnState,Eos,Artest,Qos,Scd,ThermoMgr,Uniform,EosUtils,Eb,FanController,Central,BfnL3,BfnL2,tcp_wrappers,Victor,Environment,Route,Failover,Whiskey,Xray,Gimp,BfnFixed,Strata,SoCal,XApi,Msrp,XpProfile,tcpdump,PatchPanel,ArosTest,FhTest,Arbus,XpAcl,MacConc,XpApi,telnet,QosTest,Alpha2,BfnVlan,Stp,VxlanControllerTest,MplsAgent,Bravo2,Lanz,BfnMbb,Intf,XCtrl,Unicast,SandTunnel,L3Unicast,Ipsec,MplsTest,Rsvp,EthIntf,StageMgr,Sol,MplsUtils,Nat,Ira,P4NamespaceDut,Counters,Charlie2,Aqlc,Mlag,Power,OpenFlow,Lag,RestApi,BfdTest,strongs,Sfa,CEosUtils,Adt746,MaintenanceMode,MlagDut,EosImage,IpEth,MultiProtocol,Launcher,Max3179,Snmp,Acl,IpEthTest,PhyEee,bf-syslibs,tacc,XpL2,p4-ar-switch,p4-bf-switch,LdpTest,BfnPhy,Mirroring,Phy6,Ptp' REGEXP '^((?!\b(Strata|StrataApi|StrataApiV2)\b).)*$');
|
||||
1
|
||||
Warnings:
|
||||
Warning 1139 Got error 'pcre_exec: recursion limit of NUM exceeded' from regexp
|
||||
|
@ -27,3 +27,15 @@ CHECK TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 check status OK
|
||||
DROP TABLE t1,t2;
|
||||
call mtr.add_suppression('Incorrect key file for table');
|
||||
create table t1 (a int, index(a));
|
||||
lock tables t1 write;
|
||||
insert t1 values (1),(2),(1);
|
||||
set @old_dbug=@@debug_dbug;
|
||||
set debug_dbug='+d,mi_lock_database_failure';
|
||||
unlock tables;
|
||||
Warnings:
|
||||
Error 126 Incorrect key file for table './test/t1.MYI'; try to repair it
|
||||
Error 1030 Got error 22 "Invalid argument" from storage engine MyISAM
|
||||
set debug_dbug=@old_dbug;
|
||||
drop table t1;
|
||||
|
30
mysql-test/suite/csv/read_only.result
Normal file
30
mysql-test/suite/csv/read_only.result
Normal file
@ -0,0 +1,30 @@
|
||||
create table t1 (a int not null) engine=csv;
|
||||
insert t1 values (1),(2);
|
||||
flush tables;
|
||||
select * from information_schema.tables where table_schema='test';
|
||||
TABLE_CATALOG def
|
||||
TABLE_SCHEMA test
|
||||
TABLE_NAME t1
|
||||
TABLE_TYPE BASE TABLE
|
||||
ENGINE NULL
|
||||
VERSION NULL
|
||||
ROW_FORMAT NULL
|
||||
TABLE_ROWS NULL
|
||||
AVG_ROW_LENGTH NULL
|
||||
DATA_LENGTH NULL
|
||||
MAX_DATA_LENGTH NULL
|
||||
INDEX_LENGTH NULL
|
||||
DATA_FREE NULL
|
||||
AUTO_INCREMENT NULL
|
||||
CREATE_TIME NULL
|
||||
UPDATE_TIME NULL
|
||||
CHECK_TIME NULL
|
||||
TABLE_COLLATION NULL
|
||||
CHECKSUM NULL
|
||||
CREATE_OPTIONS NULL
|
||||
TABLE_COMMENT File './test/t1.CSM' not found (Errcode: 13 "Permission denied")
|
||||
Warnings:
|
||||
Level Warning
|
||||
Code 29
|
||||
Message File './test/t1.CSM' not found (Errcode: 13 "Permission denied")
|
||||
drop table t1;
|
19
mysql-test/suite/csv/read_only.test
Normal file
19
mysql-test/suite/csv/read_only.test
Normal file
@ -0,0 +1,19 @@
|
||||
#
|
||||
# MDEV-11883 MariaDB crashes with out-of-memory when query information_schema
|
||||
#
|
||||
source include/have_csv.inc;
|
||||
|
||||
let datadir=`select @@datadir`;
|
||||
|
||||
create table t1 (a int not null) engine=csv;
|
||||
insert t1 values (1),(2);
|
||||
flush tables;
|
||||
|
||||
chmod 0400 $datadir/test/t1.CSM;
|
||||
chmod 0400 $datadir/test/t1.CSV;
|
||||
|
||||
--replace_result $datadir ./
|
||||
query_vertical select * from information_schema.tables where table_schema='test';
|
||||
|
||||
drop table t1;
|
||||
|
@ -426,3 +426,7 @@ SELECT 0xE001 REGEXP @regCheck;
|
||||
SET NAMES latin1;
|
||||
SET @regCheck= '\\xE0\\x01';
|
||||
SELECT CAST(0xE001 AS BINARY) REGEXP @regCheck;
|
||||
|
||||
--echo # MDEV-12420: Testing recursion overflow
|
||||
--replace_regex /[0-9]+ exceeded/NUM exceeded/
|
||||
SELECT 1 FROM dual WHERE ('Alpha,Bravo,Charlie,Delta,Echo,Foxtrot,StrataCentral,Golf,Hotel,India,Juliet,Kilo,Lima,Mike,StrataL3,November,Oscar,StrataL2,Sand,P3,P4SwitchTest,Arsys,Poppa,ExtensionMgr,Arp,Quebec,Romeo,StrataApiV2,PtReyes,Sierra,SandAcl,Arrow,Artools,BridgeTest,Tango,SandT,PAlaska,Namespace,Agent,Qos,PatchPanel,ProjectReport,Ark,Gimp,Agent,SliceAgent,Arnet,Bgp,Ale,Tommy,Central,AsicPktTestLib,Hsc,SandL3,Abuild,Pca9555,Standby,ControllerDut,CalSys,SandLib,Sb820,PointV2,BfnLib,Evpn,BfnSdk,Sflow,ManagementActive,AutoTest,GatedTest,Bgp,Sand,xinetd,BfnAgentLib,bf-utils,Hello,BfnState,Eos,Artest,Qos,Scd,ThermoMgr,Uniform,EosUtils,Eb,FanController,Central,BfnL3,BfnL2,tcp_wrappers,Victor,Environment,Route,Failover,Whiskey,Xray,Gimp,BfnFixed,Strata,SoCal,XApi,Msrp,XpProfile,tcpdump,PatchPanel,ArosTest,FhTest,Arbus,XpAcl,MacConc,XpApi,telnet,QosTest,Alpha2,BfnVlan,Stp,VxlanControllerTest,MplsAgent,Bravo2,Lanz,BfnMbb,Intf,XCtrl,Unicast,SandTunnel,L3Unicast,Ipsec,MplsTest,Rsvp,EthIntf,StageMgr,Sol,MplsUtils,Nat,Ira,P4NamespaceDut,Counters,Charlie2,Aqlc,Mlag,Power,OpenFlow,Lag,RestApi,BfdTest,strongs,Sfa,CEosUtils,Adt746,MaintenanceMode,MlagDut,EosImage,IpEth,MultiProtocol,Launcher,Max3179,Snmp,Acl,IpEthTest,PhyEee,bf-syslibs,tacc,XpL2,p4-ar-switch,p4-bf-switch,LdpTest,BfnPhy,Mirroring,Phy6,Ptp' REGEXP '^((?!\b(Strata|StrataApi|StrataApiV2)\b).)*$');
|
||||
|
@ -59,3 +59,16 @@ KILL QUERY @thread_id;
|
||||
CHECK TABLE t1;
|
||||
DROP TABLE t1,t2;
|
||||
DISCONNECT insertConn;
|
||||
|
||||
#
|
||||
# MDEV-12761 Error return from external_lock make the server crash
|
||||
#
|
||||
call mtr.add_suppression('Incorrect key file for table');
|
||||
create table t1 (a int, index(a));
|
||||
lock tables t1 write;
|
||||
insert t1 values (1),(2),(1);
|
||||
set @old_dbug=@@debug_dbug;
|
||||
set debug_dbug='+d,mi_lock_database_failure';
|
||||
unlock tables;
|
||||
set debug_dbug=@old_dbug;
|
||||
drop table t1;
|
||||
|
@ -3,6 +3,7 @@
|
||||
#
|
||||
--source include/not_embedded.inc
|
||||
--source include/have_perfschema.inc
|
||||
--source include/have_profiling.inc
|
||||
--source include/platform.inc
|
||||
|
||||
#
|
||||
|
@ -324,12 +324,6 @@ static int match_pins(LF_PINS *el, void *addr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if STACK_DIRECTION < 0
|
||||
#define available_stack_size(CUR,END) (long) ((char*)(CUR) - (char*)(END))
|
||||
#else
|
||||
#define available_stack_size(CUR,END) (long) ((char*)(END) - (char*)(CUR))
|
||||
#endif
|
||||
|
||||
#define next_node(P, X) (*((uchar * volatile *)(((uchar *)(X)) + (P)->free_ptr_offset)))
|
||||
#define anext_node(X) next_node(&allocator->pinbox, (X))
|
||||
|
||||
|
@ -5830,7 +5830,7 @@ int handler::ha_external_lock(THD *thd, int lock_type)
|
||||
|
||||
DBUG_EXECUTE_IF("external_lock_failure", error= HA_ERR_GENERIC;);
|
||||
|
||||
if (error == 0)
|
||||
if (error == 0 || lock_type == F_UNLCK)
|
||||
{
|
||||
m_lock_type= lock_type;
|
||||
cached_table_flags= table_flags();
|
||||
|
@ -5311,6 +5311,15 @@ int Regexp_processor_pcre::default_regex_flags()
|
||||
return default_regex_flags_pcre(current_thd);
|
||||
}
|
||||
|
||||
void Regexp_processor_pcre::set_recursion_limit(THD *thd)
|
||||
{
|
||||
long stack_used;
|
||||
DBUG_ASSERT(thd == current_thd);
|
||||
stack_used= available_stack_size(thd->thread_stack, &stack_used);
|
||||
m_pcre_extra.match_limit_recursion=
|
||||
(my_thread_stack_size - stack_used)/my_pcre_frame_size;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Convert string to lib_charset, if needed.
|
||||
@ -5402,15 +5411,77 @@ void Regexp_processor_pcre::pcre_exec_warn(int rc) const
|
||||
*/
|
||||
switch (rc)
|
||||
{
|
||||
case PCRE_ERROR_NULL:
|
||||
errmsg= "pcre_exec: null arguement passed";
|
||||
break;
|
||||
case PCRE_ERROR_BADOPTION:
|
||||
errmsg= "pcre_exec: bad option";
|
||||
break;
|
||||
case PCRE_ERROR_BADMAGIC:
|
||||
errmsg= "pcre_exec: bad magic - not a compiled regex";
|
||||
break;
|
||||
case PCRE_ERROR_UNKNOWN_OPCODE:
|
||||
errmsg= "pcre_exec: error in compiled regex";
|
||||
break;
|
||||
case PCRE_ERROR_NOMEMORY:
|
||||
errmsg= "pcre_exec: Out of memory";
|
||||
break;
|
||||
case PCRE_ERROR_NOSUBSTRING:
|
||||
errmsg= "pcre_exec: no substring";
|
||||
break;
|
||||
case PCRE_ERROR_MATCHLIMIT:
|
||||
errmsg= "pcre_exec: match limit exceeded";
|
||||
break;
|
||||
case PCRE_ERROR_CALLOUT:
|
||||
errmsg= "pcre_exec: callout error";
|
||||
break;
|
||||
case PCRE_ERROR_BADUTF8:
|
||||
errmsg= "pcre_exec: Invalid utf8 byte sequence in the subject string";
|
||||
break;
|
||||
case PCRE_ERROR_BADUTF8_OFFSET:
|
||||
errmsg= "pcre_exec: Started at invalid location within utf8 byte sequence";
|
||||
break;
|
||||
case PCRE_ERROR_PARTIAL:
|
||||
errmsg= "pcre_exec: partial match";
|
||||
break;
|
||||
case PCRE_ERROR_INTERNAL:
|
||||
errmsg= "pcre_exec: internal error";
|
||||
break;
|
||||
case PCRE_ERROR_BADCOUNT:
|
||||
errmsg= "pcre_exec: ovesize is negative";
|
||||
break;
|
||||
case PCRE_ERROR_RECURSIONLIMIT:
|
||||
my_snprintf(buf, sizeof(buf), "pcre_exec: recursion limit of %ld exceeded",
|
||||
m_pcre_extra.match_limit_recursion);
|
||||
errmsg= buf;
|
||||
break;
|
||||
case PCRE_ERROR_BADNEWLINE:
|
||||
errmsg= "pcre_exec: bad newline options";
|
||||
break;
|
||||
case PCRE_ERROR_BADOFFSET:
|
||||
errmsg= "pcre_exec: start offset negative or greater than string length";
|
||||
break;
|
||||
case PCRE_ERROR_SHORTUTF8:
|
||||
errmsg= "pcre_exec: ended in middle of utf8 sequence";
|
||||
break;
|
||||
case PCRE_ERROR_JIT_STACKLIMIT:
|
||||
errmsg= "pcre_exec: insufficient stack memory for JIT compile";
|
||||
break;
|
||||
case PCRE_ERROR_RECURSELOOP:
|
||||
errmsg= "pcre_exec: Recursion loop detected";
|
||||
break;
|
||||
case PCRE_ERROR_BADMODE:
|
||||
errmsg= "pcre_exec: compiled pattern passed to wrong bit library function";
|
||||
break;
|
||||
case PCRE_ERROR_BADENDIANNESS:
|
||||
errmsg= "pcre_exec: compiled pattern passed to wrong endianness processor";
|
||||
break;
|
||||
case PCRE_ERROR_JIT_BADOPTION:
|
||||
errmsg= "pcre_exec: bad jit option";
|
||||
break;
|
||||
case PCRE_ERROR_BADLENGTH:
|
||||
errmsg= "pcre_exec: negative length";
|
||||
break;
|
||||
default:
|
||||
/*
|
||||
As other error codes should normally not happen,
|
||||
@ -5446,7 +5517,7 @@ int Regexp_processor_pcre::pcre_exec_with_warn(const pcre *code,
|
||||
|
||||
bool Regexp_processor_pcre::exec(const char *str, int length, int offset)
|
||||
{
|
||||
m_pcre_exec_rc= pcre_exec_with_warn(m_pcre, NULL, str, length, offset, 0,
|
||||
m_pcre_exec_rc= pcre_exec_with_warn(m_pcre, &m_pcre_extra, str, length, offset, 0,
|
||||
m_SubStrVec, m_subpatterns_needed * 3);
|
||||
return false;
|
||||
}
|
||||
@ -5457,7 +5528,7 @@ bool Regexp_processor_pcre::exec(String *str, int offset,
|
||||
{
|
||||
if (!(str= convert_if_needed(str, &subject_converter)))
|
||||
return true;
|
||||
m_pcre_exec_rc= pcre_exec_with_warn(m_pcre, NULL,
|
||||
m_pcre_exec_rc= pcre_exec_with_warn(m_pcre, &m_pcre_extra,
|
||||
str->c_ptr_safe(), str->length(),
|
||||
offset, 0,
|
||||
m_SubStrVec, m_subpatterns_needed * 3);
|
||||
|
@ -1892,6 +1892,7 @@ public:
|
||||
class Regexp_processor_pcre
|
||||
{
|
||||
pcre *m_pcre;
|
||||
pcre_extra m_pcre_extra;
|
||||
bool m_conversion_is_needed;
|
||||
bool m_is_const;
|
||||
int m_library_flags;
|
||||
@ -1916,8 +1917,12 @@ public:
|
||||
m_data_charset(&my_charset_utf8_general_ci),
|
||||
m_library_charset(&my_charset_utf8_general_ci),
|
||||
m_subpatterns_needed(0)
|
||||
{}
|
||||
{
|
||||
m_pcre_extra.flags= PCRE_EXTRA_MATCH_LIMIT_RECURSION;
|
||||
m_pcre_extra.match_limit_recursion= 100L;
|
||||
}
|
||||
int default_regex_flags();
|
||||
void set_recursion_limit(THD *);
|
||||
void init(CHARSET_INFO *data_charset, int extra_flags, uint nsubpatterns_arg)
|
||||
{
|
||||
m_library_flags= default_regex_flags() | extra_flags |
|
||||
|
@ -392,6 +392,7 @@ void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock)
|
||||
void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock, bool free_lock)
|
||||
{
|
||||
DBUG_ENTER("mysql_unlock_tables");
|
||||
bool errors= thd->is_error();
|
||||
THD_STAGE_INFO(thd, stage_unlocking_tables);
|
||||
|
||||
if (sql_lock->table_count)
|
||||
@ -400,6 +401,8 @@ void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock, bool free_lock)
|
||||
thr_multi_unlock(sql_lock->locks, sql_lock->lock_count, 0);
|
||||
if (free_lock)
|
||||
my_free(sql_lock);
|
||||
if (!errors)
|
||||
thd->clear_error();
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
@ -1304,7 +1304,7 @@ bool LOGGER::slow_log_print(THD *thd, const char *query, uint query_length,
|
||||
|
||||
/* fill in user_host value: the format is "%s[%s] @ %s [%s]" */
|
||||
user_host_len= (strxnmov(user_host_buff, MAX_USER_HOST_SIZE,
|
||||
sctx->priv_user ? sctx->priv_user : "", "[",
|
||||
sctx->priv_user, "[",
|
||||
sctx->user ? sctx->user : (thd->slave_thread ? "SQL_SLAVE" : ""), "] @ ",
|
||||
sctx->host ? sctx->host : "", " [",
|
||||
sctx->ip ? sctx->ip : "", "]", NullS) -
|
||||
|
@ -1584,8 +1584,7 @@ int Old_rows_log_event::do_apply_event(rpl_group_info *rgi)
|
||||
default:
|
||||
rli->report(ERROR_LEVEL, thd->net.last_errno, NULL,
|
||||
"Error in %s event: row application failed. %s",
|
||||
get_type_str(),
|
||||
thd->net.last_error ? thd->net.last_error : "");
|
||||
get_type_str(), thd->net.last_error);
|
||||
thd->is_slave_error= 1;
|
||||
break;
|
||||
}
|
||||
@ -1624,8 +1623,7 @@ int Old_rows_log_event::do_apply_event(rpl_group_info *rgi)
|
||||
"Error in %s event: error during transaction execution "
|
||||
"on table %s.%s. %s",
|
||||
get_type_str(), table->s->db.str,
|
||||
table->s->table_name.str,
|
||||
thd->net.last_error ? thd->net.last_error : "");
|
||||
table->s->table_name.str, thd->net.last_error);
|
||||
|
||||
/*
|
||||
If one day we honour --skip-slave-errors in row-based replication, and
|
||||
|
@ -105,6 +105,7 @@
|
||||
#include "sp_rcontext.h"
|
||||
#include "sp_cache.h"
|
||||
#include "sql_reload.h" // reload_acl_and_cache
|
||||
#include "pcre.h"
|
||||
|
||||
#ifdef HAVE_POLL_H
|
||||
#include <poll.h>
|
||||
@ -3631,6 +3632,7 @@ static void init_libstrings()
|
||||
#endif
|
||||
}
|
||||
|
||||
ulonglong my_pcre_frame_size;
|
||||
|
||||
static void init_pcre()
|
||||
{
|
||||
@ -3638,6 +3640,8 @@ static void init_pcre()
|
||||
pcre_free= pcre_stack_free= my_str_free_mysqld;
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
pcre_stack_guard= check_enough_stack_size_slow;
|
||||
/* See http://pcre.org/original/doc/html/pcrestack.html */
|
||||
my_pcre_frame_size= -pcre_exec(NULL, NULL, NULL, -999, -999, 0, NULL, 0) + 16;
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -9271,8 +9275,8 @@ mysql_getopt_value(const char *name, uint length,
|
||||
}
|
||||
/* We return in all cases above. Let us silence -Wimplicit-fallthrough */
|
||||
DBUG_ASSERT(0);
|
||||
/* fall through */
|
||||
#ifdef HAVE_REPLICATION
|
||||
/* fall through */
|
||||
case OPT_REPLICATE_DO_DB:
|
||||
case OPT_REPLICATE_DO_TABLE:
|
||||
case OPT_REPLICATE_IGNORE_DB:
|
||||
|
@ -522,6 +522,8 @@ extern pthread_t signal_thread;
|
||||
extern struct st_VioSSLFd * ssl_acceptor_fd;
|
||||
#endif /* HAVE_OPENSSL */
|
||||
|
||||
extern ulonglong my_pcre_frame_size;
|
||||
|
||||
/*
|
||||
The following variables were under INNODB_COMPABILITY_HOOKS
|
||||
*/
|
||||
|
@ -5911,8 +5911,7 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
|
||||
|
||||
TODO: handling `when' for SHOW SLAVE STATUS' snds behind
|
||||
*/
|
||||
if ((memcmp(mi->master_log_name, hb.get_log_ident(), hb.get_ident_len())
|
||||
&& mi->master_log_name != NULL)
|
||||
if (memcmp(mi->master_log_name, hb.get_log_ident(), hb.get_ident_len())
|
||||
|| mi->master_log_pos > hb.log_pos)
|
||||
{
|
||||
/* missed events of heartbeat from the past */
|
||||
@ -6464,7 +6463,7 @@ static int connect_to_master(THD* thd, MYSQL* mysql, Master_info* mi,
|
||||
mysql_options(mysql, MYSQL_PLUGIN_DIR, opt_plugin_dir_ptr);
|
||||
|
||||
/* we disallow empty users */
|
||||
if (mi->user == NULL || mi->user[0] == 0)
|
||||
if (mi->user[0] == 0)
|
||||
{
|
||||
mi->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, NULL,
|
||||
ER_THD(thd, ER_SLAVE_FATAL_ERROR),
|
||||
|
@ -10941,12 +10941,6 @@ void fill_effective_table_privileges(THD *thd, GRANT_INFO *grant,
|
||||
/* global privileges */
|
||||
grant->privilege= sctx->master_access;
|
||||
|
||||
if (!sctx->priv_user)
|
||||
{
|
||||
DBUG_PRINT("info", ("privilege 0x%lx", grant->privilege));
|
||||
DBUG_VOID_RETURN; // it is slave
|
||||
}
|
||||
|
||||
if (!thd->db || strcmp(db, thd->db))
|
||||
{
|
||||
/* db privileges */
|
||||
|
@ -369,8 +369,7 @@ int initialize_audit_plugin(st_plugin_int *plugin)
|
||||
{
|
||||
st_mysql_audit *data= (st_mysql_audit*) plugin->plugin->info;
|
||||
|
||||
if (!data->class_mask || !data->event_notify ||
|
||||
!data->class_mask[0])
|
||||
if (!data->event_notify || !data->class_mask[0])
|
||||
{
|
||||
sql_print_error("Plugin '%s' has invalid data.",
|
||||
plugin->name.str);
|
||||
|
@ -6796,12 +6796,6 @@ bool check_fk_parent_table_access(THD *thd,
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
#if STACK_DIRECTION < 0
|
||||
#define used_stack(A,B) (long) (A - B)
|
||||
#else
|
||||
#define used_stack(A,B) (long) (B - A)
|
||||
#endif
|
||||
|
||||
#ifndef DBUG_OFF
|
||||
long max_stack_used;
|
||||
#endif
|
||||
@ -6818,7 +6812,7 @@ bool check_stack_overrun(THD *thd, long margin,
|
||||
{
|
||||
long stack_used;
|
||||
DBUG_ASSERT(thd == current_thd);
|
||||
if ((stack_used=used_stack(thd->thread_stack,(char*) &stack_used)) >=
|
||||
if ((stack_used= available_stack_size(thd->thread_stack, &stack_used)) >=
|
||||
(long) (my_thread_stack_size - margin))
|
||||
{
|
||||
thd->is_fatal_error= 1;
|
||||
|
@ -270,8 +270,8 @@ IF(CONNECT_WITH_JDBC)
|
||||
# Find required libraries and include directories
|
||||
SET (JAVA_SOURCES JdbcInterface.java)
|
||||
add_jar(JdbcInterface ${JAVA_SOURCES})
|
||||
install_jar(JdbcInterface DESTINATION ${INSTALL_PLUGINDIR} COMPONENT connect-engine)
|
||||
INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/JavaWrappers.jar
|
||||
${CMAKE_CURRENT_BINARY_DIR}/JdbcInterface.jar
|
||||
DESTINATION ${INSTALL_PLUGINDIR} COMPONENT connect-engine)
|
||||
add_definitions(-DJDBC_SUPPORT)
|
||||
ELSE()
|
||||
|
@ -341,7 +341,7 @@ bool ZIPUTIL::OpenTable(PGLOBAL g, MODE mode, char *fn, bool append)
|
||||
bool ZIPUTIL::addEntry(PGLOBAL g, char *entry)
|
||||
{
|
||||
//?? we dont need the stinking time
|
||||
zip_fileinfo zi = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
zip_fileinfo zi = { {0, 0, 0, 0, 0, 0}, 0, 0, 0 };
|
||||
|
||||
getTime(zi.tmz_date);
|
||||
target = entry;
|
||||
|
@ -1192,7 +1192,7 @@ char *ha_connect::GetRealString(const char *s)
|
||||
{
|
||||
char *sv;
|
||||
|
||||
if (IsPartitioned() && s && partname && *partname) {
|
||||
if (IsPartitioned() && s && *partname) {
|
||||
sv= (char*)PlugSubAlloc(xp->g, NULL, 0);
|
||||
sprintf(sv, s, partname);
|
||||
PlugSubAlloc(xp->g, NULL, strlen(sv) + 1);
|
||||
|
@ -7,7 +7,7 @@
|
||||
/***********************************************************************/
|
||||
|
||||
#ifndef __TABEXT_H
|
||||
#define __TABEXTF_H
|
||||
#define __TABEXT_H
|
||||
|
||||
#include "reldef.h"
|
||||
|
||||
|
@ -300,7 +300,7 @@ static int read_meta_file(File meta_file, ha_rows *rows)
|
||||
mysql_file_seek(meta_file, 0, MY_SEEK_SET, MYF(0));
|
||||
if (mysql_file_read(meta_file, (uchar*)meta_buffer, META_BUFFER_SIZE, 0)
|
||||
!= META_BUFFER_SIZE)
|
||||
DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE);
|
||||
DBUG_RETURN(my_errno= HA_ERR_CRASHED_ON_USAGE);
|
||||
|
||||
/*
|
||||
Parse out the meta data, we ignore version at the moment
|
||||
@ -429,10 +429,13 @@ static int free_share(TINA_SHARE *share)
|
||||
int result_code= 0;
|
||||
if (!--share->use_count){
|
||||
/* Write the meta file. Mark it as crashed if needed. */
|
||||
(void)write_meta_file(share->meta_file, share->rows_recorded,
|
||||
share->crashed ? TRUE :FALSE);
|
||||
if (mysql_file_close(share->meta_file, MYF(0)))
|
||||
result_code= 1;
|
||||
if (share->meta_file != -1)
|
||||
{
|
||||
(void)write_meta_file(share->meta_file, share->rows_recorded,
|
||||
share->crashed ? TRUE :FALSE);
|
||||
if (mysql_file_close(share->meta_file, MYF(0)))
|
||||
result_code= 1;
|
||||
}
|
||||
if (share->tina_write_opened)
|
||||
{
|
||||
if (mysql_file_close(share->tina_write_filedes, MYF(0)))
|
||||
@ -954,7 +957,7 @@ int ha_tina::open(const char *name, int mode, uint open_options)
|
||||
if (share->crashed && !(open_options & HA_OPEN_FOR_REPAIR))
|
||||
{
|
||||
free_share(share);
|
||||
DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE);
|
||||
DBUG_RETURN(my_errno ? my_errno : HA_ERR_CRASHED_ON_USAGE);
|
||||
}
|
||||
|
||||
local_data_file_version= share->data_file_version;
|
||||
|
@ -1227,18 +1227,21 @@ btr_cur_ins_lock_and_undo(
|
||||
index, thr, mtr, inherit);
|
||||
|
||||
if (err != DB_SUCCESS
|
||||
|| !(~flags | (BTR_NO_UNDO_LOG_FLAG | BTR_KEEP_SYS_FLAG))
|
||||
|| !dict_index_is_clust(index) || dict_index_is_ibuf(index)) {
|
||||
|
||||
return(err);
|
||||
}
|
||||
|
||||
err = trx_undo_report_row_operation(flags, TRX_UNDO_INSERT_OP,
|
||||
thr, index, entry,
|
||||
NULL, 0, NULL, NULL,
|
||||
&roll_ptr);
|
||||
if (err != DB_SUCCESS) {
|
||||
|
||||
return(err);
|
||||
if (flags & BTR_NO_UNDO_LOG_FLAG) {
|
||||
roll_ptr = 0;
|
||||
} else {
|
||||
err = trx_undo_report_row_operation(thr, index, entry,
|
||||
NULL, 0, NULL, NULL,
|
||||
&roll_ptr);
|
||||
if (err != DB_SUCCESS) {
|
||||
return(err);
|
||||
}
|
||||
}
|
||||
|
||||
/* Now we can fill in the roll ptr field in entry */
|
||||
@ -1287,15 +1290,17 @@ btr_cur_optimistic_insert(
|
||||
btr_cur_t* cursor, /*!< in: cursor on page after which to insert;
|
||||
cursor stays valid */
|
||||
ulint** offsets,/*!< out: offsets on *rec */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap */
|
||||
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||
rec_t** rec, /*!< out: pointer to inserted record if
|
||||
succeed */
|
||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||
be stored externally by the caller, or
|
||||
NULL */
|
||||
be stored externally by the caller */
|
||||
ulint n_ext, /*!< in: number of externally stored columns */
|
||||
que_thr_t* thr, /*!< in: query thread or NULL */
|
||||
que_thr_t* thr, /*!< in/out: query thread; can be NULL if
|
||||
!(~flags
|
||||
& (BTR_NO_LOCKING_FLAG
|
||||
| BTR_NO_UNDO_LOG_FLAG)) */
|
||||
mtr_t* mtr) /*!< in/out: mini-transaction;
|
||||
if this function returns DB_SUCCESS on
|
||||
a leaf page of a secondary index in a
|
||||
@ -1316,6 +1321,7 @@ btr_cur_optimistic_insert(
|
||||
ulint rec_size;
|
||||
dberr_t err;
|
||||
|
||||
ut_ad(thr || !(~flags & (BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG)));
|
||||
*big_rec = NULL;
|
||||
|
||||
block = btr_cur_get_block(cursor);
|
||||
@ -1574,15 +1580,17 @@ btr_cur_pessimistic_insert(
|
||||
cursor stays valid */
|
||||
ulint** offsets,/*!< out: offsets on *rec */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap
|
||||
that can be emptied, or NULL */
|
||||
that can be emptied */
|
||||
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||
rec_t** rec, /*!< out: pointer to inserted record if
|
||||
succeed */
|
||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||
be stored externally by the caller, or
|
||||
NULL */
|
||||
be stored externally by the caller */
|
||||
ulint n_ext, /*!< in: number of externally stored columns */
|
||||
que_thr_t* thr, /*!< in: query thread or NULL */
|
||||
que_thr_t* thr, /*!< in/out: query thread; can be NULL if
|
||||
!(~flags
|
||||
& (BTR_NO_LOCKING_FLAG
|
||||
| BTR_NO_UNDO_LOG_FLAG)) */
|
||||
mtr_t* mtr) /*!< in/out: mini-transaction */
|
||||
{
|
||||
dict_index_t* index = cursor->index;
|
||||
@ -1594,6 +1602,7 @@ btr_cur_pessimistic_insert(
|
||||
ulint n_reserved = 0;
|
||||
|
||||
ut_ad(dtuple_check_typed(entry));
|
||||
ut_ad(thr || !(~flags & (BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG)));
|
||||
|
||||
*big_rec = NULL;
|
||||
|
||||
@ -1778,9 +1787,10 @@ btr_cur_upd_lock_and_undo(
|
||||
|
||||
/* Append the info about the update in the undo log */
|
||||
|
||||
return(trx_undo_report_row_operation(
|
||||
flags, TRX_UNDO_MODIFY_OP, thr,
|
||||
index, NULL, update,
|
||||
return((flags & BTR_NO_UNDO_LOG_FLAG)
|
||||
? DB_SUCCESS
|
||||
: trx_undo_report_row_operation(
|
||||
thr, index, NULL, update,
|
||||
cmpl_info, rec, offsets, roll_ptr));
|
||||
}
|
||||
|
||||
@ -2511,12 +2521,12 @@ btr_cur_pessimistic_update(
|
||||
ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */
|
||||
mem_heap_t** offsets_heap,
|
||||
/*!< in/out: pointer to memory heap
|
||||
that can be emptied, or NULL */
|
||||
that can be emptied */
|
||||
mem_heap_t* entry_heap,
|
||||
/*!< in/out: memory heap for allocating
|
||||
big_rec and the index tuple */
|
||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||
be stored externally by the caller, or NULL */
|
||||
be stored externally by the caller */
|
||||
const upd_t* update, /*!< in: update vector; this is allowed also
|
||||
contain trx id and roll ptr fields, but
|
||||
the values in update vector have no effect */
|
||||
@ -3063,7 +3073,7 @@ btr_cur_del_mark_set_clust_rec(
|
||||
return(err);
|
||||
}
|
||||
|
||||
err = trx_undo_report_row_operation(0, TRX_UNDO_MODIFY_OP, thr,
|
||||
err = trx_undo_report_row_operation(thr,
|
||||
index, NULL, NULL, 0, rec, offsets,
|
||||
&roll_ptr);
|
||||
if (err != DB_SUCCESS) {
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2008, Google Inc.
|
||||
Copyright (c) 2013, 2017, MariaDB Corporation. All Rights Reserved.
|
||||
Copyright (c) 2013, 2017, MariaDB Corporation.
|
||||
|
||||
Portions of this file contain modifications contributed and copyrighted by
|
||||
Google, Inc. Those modifications are gratefully acknowledged and are described
|
||||
@ -1430,8 +1430,6 @@ buf_pool_init_instance(
|
||||
buf_pool->chunks = chunk =
|
||||
(buf_chunk_t*) mem_zalloc(sizeof *chunk);
|
||||
|
||||
UT_LIST_INIT(buf_pool->free);
|
||||
|
||||
if (!buf_chunk_init(buf_pool, chunk, buf_pool_size)) {
|
||||
mem_free(chunk);
|
||||
mem_free(buf_pool);
|
||||
|
@ -6322,6 +6322,7 @@ dict_set_corrupted_index_cache_only(
|
||||
dict_table_t* table) /*!< in/out: table */
|
||||
{
|
||||
ut_ad(index != NULL);
|
||||
ut_ad(table != NULL);
|
||||
ut_ad(mutex_own(&dict_sys->mutex));
|
||||
ut_ad(!dict_table_is_comp(dict_sys->sys_tables));
|
||||
ut_ad(!dict_table_is_comp(dict_sys->sys_indexes));
|
||||
@ -6329,9 +6330,6 @@ dict_set_corrupted_index_cache_only(
|
||||
/* Mark the table as corrupted only if the clustered index
|
||||
is corrupted */
|
||||
if (dict_index_is_clust(index)) {
|
||||
ut_ad((index->table != NULL) || (table != NULL)
|
||||
|| index->table == table);
|
||||
|
||||
table->corrupted = TRUE;
|
||||
}
|
||||
|
||||
|
@ -2021,8 +2021,6 @@ fil_init(
|
||||
fil_system->spaces = hash_create(hash_size);
|
||||
fil_system->name_hash = hash_create(hash_size);
|
||||
|
||||
UT_LIST_INIT(fil_system->LRU);
|
||||
|
||||
fil_system->max_n_open = max_n_open;
|
||||
|
||||
fil_space_crypt_init();
|
||||
@ -2733,14 +2731,12 @@ fil_op_log_parse_or_replay(
|
||||
} else if (log_flags & MLOG_FILE_FLAG_TEMP) {
|
||||
/* Temporary table, do nothing */
|
||||
} else {
|
||||
const char* path = NULL;
|
||||
|
||||
/* Create the database directory for name, if it does
|
||||
not exist yet */
|
||||
fil_create_directory_for_tablename(name);
|
||||
|
||||
if (fil_create_new_single_table_tablespace(
|
||||
space_id, name, path, flags,
|
||||
space_id, name, NULL, flags,
|
||||
DICT_TF2_USE_TABLESPACE,
|
||||
FIL_IBD_FILE_INITIAL_SIZE,
|
||||
FIL_ENCRYPTION_DEFAULT,
|
||||
|
@ -1559,19 +1559,6 @@ thd_is_replication_slave_thread(
|
||||
return thd && ((ibool) thd_slave_thread(thd));
|
||||
}
|
||||
|
||||
/******************************************************************//**
|
||||
Gets information on the durability property requested by thread.
|
||||
Used when writing either a prepare or commit record to the log
|
||||
buffer. @return the durability property. */
|
||||
UNIV_INTERN
|
||||
enum durability_properties
|
||||
thd_requested_durability(
|
||||
/*=====================*/
|
||||
const THD* thd) /*!< in: thread handle */
|
||||
{
|
||||
return(thd_get_durability_property(thd));
|
||||
}
|
||||
|
||||
/******************************************************************//**
|
||||
Returns true if transaction should be flagged as read-only.
|
||||
@return true if the thd is marked as read-only */
|
||||
@ -8557,8 +8544,8 @@ calc_row_difference(
|
||||
}
|
||||
}
|
||||
|
||||
if (o_len != n_len || (o_len != UNIV_SQL_NULL &&
|
||||
0 != memcmp(o_ptr, n_ptr, o_len))) {
|
||||
if (o_len != n_len || (o_len != 0 && o_len != UNIV_SQL_NULL
|
||||
&& 0 != memcmp(o_ptr, n_ptr, o_len))) {
|
||||
/* The field has changed */
|
||||
|
||||
ufield = uvect->fields + n_changed;
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2013, 2016, MariaDB Corporation.
|
||||
Copyright (c) 2013, 2017, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -516,7 +516,7 @@ innobase_index_name_is_reserved(
|
||||
const KEY* key_info, /*!< in: Indexes to be created */
|
||||
ulint num_of_keys) /*!< in: Number of indexes to
|
||||
be created. */
|
||||
MY_ATTRIBUTE((nonnull, warn_unused_result));
|
||||
MY_ATTRIBUTE((nonnull(1), warn_unused_result));
|
||||
|
||||
/*****************************************************************//**
|
||||
#ifdef WITH_WSREP
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 2005, 2016, Oracle and/or its affiliates
|
||||
Copyright (c) 2013, 2017, MariaDB Corporation. All Rights Reserved.
|
||||
Copyright (c) 2005, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2013, 2017, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -2303,10 +2303,10 @@ online_retry_drop_indexes_with_trx(
|
||||
@param drop_fk constraints being dropped
|
||||
@param n_drop_fk number of constraints that are being dropped
|
||||
@return whether the constraint is being dropped */
|
||||
inline MY_ATTRIBUTE((pure, nonnull, warn_unused_result))
|
||||
MY_ATTRIBUTE((pure, nonnull(1), warn_unused_result))
|
||||
inline
|
||||
bool
|
||||
innobase_dropping_foreign(
|
||||
/*======================*/
|
||||
const dict_foreign_t* foreign,
|
||||
dict_foreign_t** drop_fk,
|
||||
ulint n_drop_fk)
|
||||
@ -2330,10 +2330,10 @@ column that is being dropped or modified to NOT NULL.
|
||||
@retval true Not allowed (will call my_error())
|
||||
@retval false Allowed
|
||||
*/
|
||||
static MY_ATTRIBUTE((pure, nonnull, warn_unused_result))
|
||||
MY_ATTRIBUTE((pure, nonnull(1,4), warn_unused_result))
|
||||
static
|
||||
bool
|
||||
innobase_check_foreigns_low(
|
||||
/*========================*/
|
||||
const dict_table_t* user_table,
|
||||
dict_foreign_t** drop_fk,
|
||||
ulint n_drop_fk,
|
||||
@ -2430,10 +2430,10 @@ column that is being dropped or modified to NOT NULL.
|
||||
@retval true Not allowed (will call my_error())
|
||||
@retval false Allowed
|
||||
*/
|
||||
static MY_ATTRIBUTE((pure, nonnull, warn_unused_result))
|
||||
MY_ATTRIBUTE((pure, nonnull(1,2,3,4), warn_unused_result))
|
||||
static
|
||||
bool
|
||||
innobase_check_foreigns(
|
||||
/*====================*/
|
||||
Alter_inplace_info* ha_alter_info,
|
||||
const TABLE* altered_table,
|
||||
const TABLE* old_table,
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 2007, 2016, Oracle and/or its affiliates.
|
||||
Copyrigth (c) 2014, 2017, MariaDB Corporation
|
||||
Copyright (c) 2007, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2014, 2017, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -2972,14 +2972,16 @@ i_s_fts_deleted_generic_fill(
|
||||
|
||||
fields = table->field;
|
||||
|
||||
int ret = 0;
|
||||
|
||||
for (ulint j = 0; j < ib_vector_size(deleted->doc_ids); ++j) {
|
||||
doc_id_t doc_id;
|
||||
|
||||
doc_id = *(doc_id_t*) ib_vector_get_const(deleted->doc_ids, j);
|
||||
|
||||
OK(fields[I_S_FTS_DOC_ID]->store((longlong) doc_id, true));
|
||||
BREAK_IF(ret = fields[I_S_FTS_DOC_ID]->store(doc_id, true));
|
||||
|
||||
OK(schema_table_store_record(thd, table));
|
||||
BREAK_IF(ret = schema_table_store_record(thd, table));
|
||||
}
|
||||
|
||||
trx_free_for_background(trx);
|
||||
@ -2990,7 +2992,7 @@ i_s_fts_deleted_generic_fill(
|
||||
|
||||
rw_lock_s_unlock(&dict_operation_lock);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
||||
/*******************************************************************//**
|
||||
@ -3230,13 +3232,13 @@ i_s_fts_index_cache_fill_one_index(
|
||||
/*===============================*/
|
||||
fts_index_cache_t* index_cache, /*!< in: FTS index cache */
|
||||
THD* thd, /*!< in: thread */
|
||||
fts_string_t* conv_str, /*!< in/out: buffer */
|
||||
TABLE_LIST* tables) /*!< in/out: tables to fill */
|
||||
{
|
||||
TABLE* table = (TABLE*) tables->table;
|
||||
Field** fields;
|
||||
CHARSET_INFO* index_charset;
|
||||
const ib_rbt_node_t* rbt_node;
|
||||
fts_string_t conv_str;
|
||||
uint dummy_errors;
|
||||
char* word_str;
|
||||
|
||||
@ -3245,10 +3247,9 @@ i_s_fts_index_cache_fill_one_index(
|
||||
fields = table->field;
|
||||
|
||||
index_charset = index_cache->charset;
|
||||
conv_str.f_len = system_charset_info->mbmaxlen
|
||||
* FTS_MAX_WORD_LEN_IN_CHAR;
|
||||
conv_str.f_str = static_cast<byte*>(ut_malloc(conv_str.f_len));
|
||||
conv_str.f_n_char = 0;
|
||||
conv_str->f_n_char = 0;
|
||||
|
||||
int ret = 0;
|
||||
|
||||
/* Go through each word in the index cache */
|
||||
for (rbt_node = rbt_first(index_cache->words);
|
||||
@ -3260,16 +3261,16 @@ i_s_fts_index_cache_fill_one_index(
|
||||
|
||||
/* Convert word from index charset to system_charset_info */
|
||||
if (index_charset->cset != system_charset_info->cset) {
|
||||
conv_str.f_n_char = my_convert(
|
||||
reinterpret_cast<char*>(conv_str.f_str),
|
||||
static_cast<uint32>(conv_str.f_len),
|
||||
conv_str->f_n_char = my_convert(
|
||||
reinterpret_cast<char*>(conv_str->f_str),
|
||||
static_cast<uint32>(conv_str->f_len),
|
||||
system_charset_info,
|
||||
reinterpret_cast<char*>(word->text.f_str),
|
||||
static_cast<uint32>(word->text.f_len),
|
||||
index_charset, &dummy_errors);
|
||||
ut_ad(conv_str.f_n_char <= conv_str.f_len);
|
||||
conv_str.f_str[conv_str.f_n_char] = 0;
|
||||
word_str = reinterpret_cast<char*>(conv_str.f_str);
|
||||
ut_ad(conv_str->f_n_char <= conv_str->f_len);
|
||||
conv_str->f_str[conv_str->f_n_char] = 0;
|
||||
word_str = reinterpret_cast<char*>(conv_str->f_str);
|
||||
} else {
|
||||
word_str = reinterpret_cast<char*>(word->text.f_str);
|
||||
}
|
||||
@ -3327,9 +3328,7 @@ i_s_fts_index_cache_fill_one_index(
|
||||
}
|
||||
}
|
||||
|
||||
ut_free(conv_str.f_str);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
/*******************************************************************//**
|
||||
Fill the dynamic table INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHED
|
||||
@ -3373,18 +3372,27 @@ i_s_fts_index_cache_fill(
|
||||
|
||||
ut_a(cache);
|
||||
|
||||
int ret = 0;
|
||||
fts_string_t conv_str;
|
||||
conv_str.f_len = system_charset_info->mbmaxlen
|
||||
* FTS_MAX_WORD_LEN_IN_CHAR;
|
||||
conv_str.f_str = static_cast<byte*>(ut_malloc(conv_str.f_len));
|
||||
|
||||
for (ulint i = 0; i < ib_vector_size(cache->indexes); i++) {
|
||||
fts_index_cache_t* index_cache;
|
||||
|
||||
index_cache = static_cast<fts_index_cache_t*> (
|
||||
ib_vector_get(cache->indexes, i));
|
||||
|
||||
i_s_fts_index_cache_fill_one_index(index_cache, thd, tables);
|
||||
BREAK_IF(ret = i_s_fts_index_cache_fill_one_index(
|
||||
index_cache, thd, &conv_str, tables));
|
||||
}
|
||||
|
||||
ut_free(conv_str.f_str);
|
||||
|
||||
dict_table_close(user_table, FALSE, FALSE);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
||||
/*******************************************************************//**
|
||||
@ -3688,8 +3696,6 @@ i_s_fts_index_table_fill_one_fetch(
|
||||
}
|
||||
}
|
||||
|
||||
i_s_fts_index_table_free_one_fetch(words);
|
||||
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
||||
@ -3703,13 +3709,13 @@ i_s_fts_index_table_fill_one_index(
|
||||
/*===============================*/
|
||||
dict_index_t* index, /*!< in: FTS index */
|
||||
THD* thd, /*!< in: thread */
|
||||
fts_string_t* conv_str, /*!< in/out: buffer */
|
||||
TABLE_LIST* tables) /*!< in/out: tables to fill */
|
||||
{
|
||||
ib_vector_t* words;
|
||||
mem_heap_t* heap;
|
||||
fts_string_t word;
|
||||
CHARSET_INFO* index_charset;
|
||||
fts_string_t conv_str;
|
||||
dberr_t error;
|
||||
int ret = 0;
|
||||
|
||||
@ -3726,10 +3732,6 @@ i_s_fts_index_table_fill_one_index(
|
||||
word.f_n_char = 0;
|
||||
|
||||
index_charset = fts_index_get_charset(index);
|
||||
conv_str.f_len = system_charset_info->mbmaxlen
|
||||
* FTS_MAX_WORD_LEN_IN_CHAR;
|
||||
conv_str.f_str = static_cast<byte*>(ut_malloc(conv_str.f_len));
|
||||
conv_str.f_n_char = 0;
|
||||
|
||||
/* Iterate through each auxiliary table as described in
|
||||
fts_index_selector */
|
||||
@ -3763,17 +3765,17 @@ i_s_fts_index_table_fill_one_index(
|
||||
|
||||
/* Fill into tables */
|
||||
ret = i_s_fts_index_table_fill_one_fetch(
|
||||
index_charset, thd, tables, words, &conv_str, has_more);
|
||||
index_charset, thd, tables, words, conv_str,
|
||||
has_more);
|
||||
i_s_fts_index_table_free_one_fetch(words);
|
||||
|
||||
if (ret != 0) {
|
||||
i_s_fts_index_table_free_one_fetch(words);
|
||||
goto func_exit;
|
||||
}
|
||||
} while (has_more);
|
||||
}
|
||||
|
||||
func_exit:
|
||||
ut_free(conv_str.f_str);
|
||||
mem_heap_free(heap);
|
||||
|
||||
DBUG_RETURN(ret);
|
||||
@ -3815,10 +3817,17 @@ i_s_fts_index_table_fill(
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
int ret = 0;
|
||||
fts_string_t conv_str;
|
||||
conv_str.f_len = system_charset_info->mbmaxlen
|
||||
* FTS_MAX_WORD_LEN_IN_CHAR;
|
||||
conv_str.f_str = static_cast<byte*>(ut_malloc(conv_str.f_len));
|
||||
|
||||
for (index = dict_table_get_first_index(user_table);
|
||||
index; index = dict_table_get_next_index(index)) {
|
||||
if (index->type & DICT_FTS) {
|
||||
i_s_fts_index_table_fill_one_index(index, thd, tables);
|
||||
BREAK_IF(ret = i_s_fts_index_table_fill_one_index(
|
||||
index, thd, &conv_str, tables));
|
||||
}
|
||||
}
|
||||
|
||||
@ -3826,7 +3835,9 @@ i_s_fts_index_table_fill(
|
||||
|
||||
rw_lock_s_unlock(&dict_operation_lock);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
ut_free(conv_str.f_str);
|
||||
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
||||
/*******************************************************************//**
|
||||
@ -3992,6 +4003,8 @@ i_s_fts_config_fill(
|
||||
DBUG_ASSERT(!dict_index_is_online_ddl(index));
|
||||
}
|
||||
|
||||
int ret = 0;
|
||||
|
||||
while (fts_config_key[i]) {
|
||||
fts_string_t value;
|
||||
char* key_name;
|
||||
@ -4016,13 +4029,14 @@ i_s_fts_config_fill(
|
||||
ut_free(key_name);
|
||||
}
|
||||
|
||||
OK(field_store_string(
|
||||
fields[FTS_CONFIG_KEY], fts_config_key[i]));
|
||||
BREAK_IF(ret = field_store_string(
|
||||
fields[FTS_CONFIG_KEY], fts_config_key[i]));
|
||||
|
||||
OK(field_store_string(
|
||||
fields[FTS_CONFIG_VALUE], (const char*) value.f_str));
|
||||
BREAK_IF(ret = field_store_string(
|
||||
fields[FTS_CONFIG_VALUE],
|
||||
reinterpret_cast<const char*>(value.f_str)));
|
||||
|
||||
OK(schema_table_store_record(thd, table));
|
||||
BREAK_IF(ret = schema_table_store_record(thd, table));
|
||||
|
||||
i++;
|
||||
}
|
||||
@ -4035,7 +4049,7 @@ i_s_fts_config_fill(
|
||||
|
||||
rw_lock_s_unlock(&dict_operation_lock);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
||||
/*******************************************************************//**
|
||||
@ -4877,34 +4891,29 @@ i_s_innodb_buffer_page_fill(
|
||||
state_str = NULL;
|
||||
|
||||
OK(fields[IDX_BUFFER_POOL_ID]->store(
|
||||
static_cast<double>(page_info->pool_id)));
|
||||
page_info->pool_id, true));
|
||||
|
||||
OK(fields[IDX_BUFFER_BLOCK_ID]->store(
|
||||
static_cast<double>(page_info->block_id)));
|
||||
page_info->block_id, true));
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_SPACE]->store(
|
||||
static_cast<double>(page_info->space_id)));
|
||||
page_info->space_id, true));
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_NUM]->store(
|
||||
static_cast<double>(page_info->page_num)));
|
||||
page_info->page_num, true));
|
||||
|
||||
OK(field_store_string(
|
||||
fields[IDX_BUFFER_PAGE_TYPE],
|
||||
i_s_page_type[page_info->page_type].type_str));
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_FLUSH_TYPE]->store(
|
||||
page_info->flush_type));
|
||||
page_info->flush_type, true));
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_FIX_COUNT]->store(
|
||||
page_info->fix_count));
|
||||
page_info->fix_count, true));
|
||||
|
||||
if (page_info->hashed) {
|
||||
OK(field_store_string(
|
||||
fields[IDX_BUFFER_PAGE_HASHED], "YES"));
|
||||
} else {
|
||||
OK(field_store_string(
|
||||
fields[IDX_BUFFER_PAGE_HASHED], "NO"));
|
||||
}
|
||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_HASHED],
|
||||
page_info->hashed ? "YES" : "NO"));
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_NEWEST_MOD]->store(
|
||||
(longlong) page_info->newest_mod, true));
|
||||
@ -4913,7 +4922,7 @@ i_s_innodb_buffer_page_fill(
|
||||
(longlong) page_info->oldest_mod, true));
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_ACCESS_TIME]->store(
|
||||
page_info->access_time));
|
||||
page_info->access_time, true));
|
||||
|
||||
fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_null();
|
||||
|
||||
@ -4922,44 +4931,48 @@ i_s_innodb_buffer_page_fill(
|
||||
/* If this is an index page, fetch the index name
|
||||
and table name */
|
||||
if (page_info->page_type == I_S_PAGE_TYPE_INDEX) {
|
||||
const dict_index_t* index;
|
||||
bool ret = false;
|
||||
|
||||
mutex_enter(&dict_sys->mutex);
|
||||
index = dict_index_get_if_in_cache_low(
|
||||
page_info->index_id);
|
||||
|
||||
if (index) {
|
||||
|
||||
if (const dict_index_t* index =
|
||||
dict_index_get_if_in_cache_low(
|
||||
page_info->index_id)) {
|
||||
table_name_end = innobase_convert_name(
|
||||
table_name, sizeof(table_name),
|
||||
index->table_name,
|
||||
strlen(index->table_name),
|
||||
thd, TRUE);
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_TABLE_NAME]->store(
|
||||
table_name,
|
||||
static_cast<uint>(table_name_end - table_name),
|
||||
system_charset_info));
|
||||
fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_notnull();
|
||||
|
||||
OK(field_store_index_name(
|
||||
fields[IDX_BUFFER_PAGE_INDEX_NAME],
|
||||
index->name));
|
||||
ret = fields[IDX_BUFFER_PAGE_TABLE_NAME]
|
||||
->store(table_name,
|
||||
static_cast<uint>(
|
||||
table_name_end
|
||||
- table_name),
|
||||
system_charset_info)
|
||||
|| field_store_index_name(
|
||||
fields
|
||||
[IDX_BUFFER_PAGE_INDEX_NAME],
|
||||
index->name);
|
||||
}
|
||||
|
||||
mutex_exit(&dict_sys->mutex);
|
||||
|
||||
OK(ret);
|
||||
|
||||
fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_notnull();
|
||||
}
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_NUM_RECS]->store(
|
||||
page_info->num_recs));
|
||||
page_info->num_recs, true));
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_DATA_SIZE]->store(
|
||||
page_info->data_size));
|
||||
page_info->data_size, true));
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_ZIP_SIZE]->store(
|
||||
page_info->zip_ssize
|
||||
? (UNIV_ZIP_SIZE_MIN >> 1) << page_info->zip_ssize
|
||||
: 0));
|
||||
page_info->zip_ssize
|
||||
? (UNIV_ZIP_SIZE_MIN >> 1) << page_info->zip_ssize
|
||||
: 0, true));
|
||||
|
||||
#if BUF_PAGE_STATE_BITS > 3
|
||||
# error "BUF_PAGE_STATE_BITS > 3, please ensure that all 1<<BUF_PAGE_STATE_BITS values are checked for"
|
||||
@ -4997,32 +5010,29 @@ i_s_innodb_buffer_page_fill(
|
||||
|
||||
switch (page_info->io_fix) {
|
||||
case BUF_IO_NONE:
|
||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
||||
"IO_NONE"));
|
||||
state_str = "IO_NONE";
|
||||
break;
|
||||
case BUF_IO_READ:
|
||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
||||
"IO_READ"));
|
||||
state_str = "IO_READ";
|
||||
break;
|
||||
case BUF_IO_WRITE:
|
||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
||||
"IO_WRITE"));
|
||||
state_str = "IO_WRITE";
|
||||
break;
|
||||
case BUF_IO_PIN:
|
||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
||||
"IO_PIN"));
|
||||
state_str = "IO_PIN";
|
||||
break;
|
||||
}
|
||||
|
||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
||||
state_str));
|
||||
|
||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IS_OLD],
|
||||
(page_info->is_old) ? "YES" : "NO"));
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_FREE_CLOCK]->store(
|
||||
page_info->freed_page_clock));
|
||||
|
||||
if (schema_table_store_record(thd, table)) {
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
OK(schema_table_store_record(thd, table));
|
||||
}
|
||||
|
||||
DBUG_RETURN(0);
|
||||
@ -5566,17 +5576,10 @@ i_s_innodb_buf_page_lru_fill(
|
||||
ulint num_page) /*!< in: number of page info
|
||||
cached */
|
||||
{
|
||||
TABLE* table;
|
||||
Field** fields;
|
||||
mem_heap_t* heap;
|
||||
|
||||
DBUG_ENTER("i_s_innodb_buf_page_lru_fill");
|
||||
|
||||
table = tables->table;
|
||||
|
||||
fields = table->field;
|
||||
|
||||
heap = mem_heap_create(1000);
|
||||
TABLE* table = tables->table;
|
||||
Field** fields = table->field;
|
||||
|
||||
/* Iterate through the cached array and fill the I_S table rows */
|
||||
for (ulint i = 0; i < num_page; i++) {
|
||||
@ -5591,43 +5594,37 @@ i_s_innodb_buf_page_lru_fill(
|
||||
page_info = info_array + i;
|
||||
|
||||
OK(fields[IDX_BUF_LRU_POOL_ID]->store(
|
||||
static_cast<double>(page_info->pool_id)));
|
||||
|
||||
page_info->pool_id, true));
|
||||
OK(fields[IDX_BUF_LRU_POS]->store(
|
||||
static_cast<double>(page_info->block_id)));
|
||||
page_info->block_id, true));
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_SPACE]->store(
|
||||
static_cast<double>(page_info->space_id)));
|
||||
page_info->space_id, true));
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_NUM]->store(
|
||||
static_cast<double>(page_info->page_num)));
|
||||
page_info->page_num, true));
|
||||
|
||||
OK(field_store_string(
|
||||
fields[IDX_BUF_LRU_PAGE_TYPE],
|
||||
i_s_page_type[page_info->page_type].type_str));
|
||||
fields[IDX_BUF_LRU_PAGE_TYPE],
|
||||
i_s_page_type[page_info->page_type].type_str));
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_FLUSH_TYPE]->store(
|
||||
static_cast<double>(page_info->flush_type)));
|
||||
page_info->flush_type, true));
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_FIX_COUNT]->store(
|
||||
static_cast<double>(page_info->fix_count)));
|
||||
page_info->fix_count, true));
|
||||
|
||||
if (page_info->hashed) {
|
||||
OK(field_store_string(
|
||||
fields[IDX_BUF_LRU_PAGE_HASHED], "YES"));
|
||||
} else {
|
||||
OK(field_store_string(
|
||||
fields[IDX_BUF_LRU_PAGE_HASHED], "NO"));
|
||||
}
|
||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_HASHED],
|
||||
page_info->hashed ? "YES" : "NO"));
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_NEWEST_MOD]->store(
|
||||
page_info->newest_mod, true));
|
||||
page_info->newest_mod, true));
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_OLDEST_MOD]->store(
|
||||
page_info->oldest_mod, true));
|
||||
page_info->oldest_mod, true));
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_ACCESS_TIME]->store(
|
||||
page_info->access_time));
|
||||
page_info->access_time, true));
|
||||
|
||||
fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_null();
|
||||
|
||||
@ -5636,43 +5633,47 @@ i_s_innodb_buf_page_lru_fill(
|
||||
/* If this is an index page, fetch the index name
|
||||
and table name */
|
||||
if (page_info->page_type == I_S_PAGE_TYPE_INDEX) {
|
||||
const dict_index_t* index;
|
||||
bool ret = false;
|
||||
|
||||
mutex_enter(&dict_sys->mutex);
|
||||
index = dict_index_get_if_in_cache_low(
|
||||
page_info->index_id);
|
||||
|
||||
if (index) {
|
||||
|
||||
if (const dict_index_t* index =
|
||||
dict_index_get_if_in_cache_low(
|
||||
page_info->index_id)) {
|
||||
table_name_end = innobase_convert_name(
|
||||
table_name, sizeof(table_name),
|
||||
index->table_name,
|
||||
strlen(index->table_name),
|
||||
thd, TRUE);
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->store(
|
||||
table_name,
|
||||
static_cast<uint>(table_name_end - table_name),
|
||||
system_charset_info));
|
||||
fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_notnull();
|
||||
|
||||
OK(field_store_index_name(
|
||||
fields[IDX_BUF_LRU_PAGE_INDEX_NAME],
|
||||
index->name));
|
||||
ret = fields[IDX_BUF_LRU_PAGE_TABLE_NAME]
|
||||
->store(table_name,
|
||||
static_cast<uint>(
|
||||
table_name_end
|
||||
- table_name),
|
||||
system_charset_info)
|
||||
|| field_store_index_name(
|
||||
fields
|
||||
[IDX_BUF_LRU_PAGE_INDEX_NAME],
|
||||
index->name);
|
||||
}
|
||||
|
||||
mutex_exit(&dict_sys->mutex);
|
||||
|
||||
OK(ret);
|
||||
|
||||
fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_notnull();
|
||||
}
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_NUM_RECS]->store(
|
||||
page_info->num_recs));
|
||||
page_info->num_recs, true));
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_DATA_SIZE]->store(
|
||||
page_info->data_size));
|
||||
page_info->data_size, true));
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_ZIP_SIZE]->store(
|
||||
page_info->zip_ssize ?
|
||||
512 << page_info->zip_ssize : 0));
|
||||
page_info->zip_ssize
|
||||
? 512 << page_info->zip_ssize : 0, true));
|
||||
|
||||
state = static_cast<enum buf_page_state>(page_info->page_state);
|
||||
|
||||
@ -5701,35 +5702,31 @@ i_s_innodb_buf_page_lru_fill(
|
||||
|
||||
switch (page_info->io_fix) {
|
||||
case BUF_IO_NONE:
|
||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX],
|
||||
"IO_NONE"));
|
||||
state_str = "IO_NONE";
|
||||
break;
|
||||
case BUF_IO_READ:
|
||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX],
|
||||
"IO_READ"));
|
||||
state_str = "IO_READ";
|
||||
break;
|
||||
case BUF_IO_WRITE:
|
||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX],
|
||||
"IO_WRITE"));
|
||||
state_str = "IO_WRITE";
|
||||
break;
|
||||
case BUF_IO_PIN:
|
||||
state_str = "IO_PIN";
|
||||
break;
|
||||
}
|
||||
|
||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX],
|
||||
state_str));
|
||||
|
||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IS_OLD],
|
||||
(page_info->is_old) ? "YES" : "NO"));
|
||||
page_info->is_old ? "YES" : "NO"));
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_FREE_CLOCK]->store(
|
||||
page_info->freed_page_clock));
|
||||
page_info->freed_page_clock, true));
|
||||
|
||||
if (schema_table_store_record(thd, table)) {
|
||||
mem_heap_free(heap);
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
mem_heap_empty(heap);
|
||||
OK(schema_table_store_record(thd, table));
|
||||
}
|
||||
|
||||
mem_heap_free(heap);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 2007, 2013, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyrigth (c) 2014, 2015, MariaDB Corporation
|
||||
Copyrigth (c) 2014, 2017, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -72,6 +72,8 @@ extern struct st_maria_plugin i_s_innodb_sys_semaphore_waits;
|
||||
DBUG_RETURN(1); \
|
||||
}
|
||||
|
||||
#define BREAK_IF(expr) if ((expr)) break
|
||||
|
||||
#define RETURN_IF_INNODB_NOT_STARTED(plugin_name) \
|
||||
do { \
|
||||
if (!srv_was_started) { \
|
||||
|
@ -2923,8 +2923,7 @@ ibuf_get_volume_buffered_hash(
|
||||
fold = ut_fold_binary(data, len);
|
||||
|
||||
hash += (fold / (CHAR_BIT * sizeof *hash)) % size;
|
||||
bitmask = static_cast<ulint>(
|
||||
1 << (fold % (CHAR_BIT * sizeof(*hash))));
|
||||
bitmask = static_cast<ulint>(1) << (fold % (CHAR_BIT * sizeof(*hash)));
|
||||
|
||||
if (*hash & bitmask) {
|
||||
|
||||
@ -3691,7 +3690,7 @@ fail_exit:
|
||||
|
||||
if (mode == BTR_MODIFY_PREV) {
|
||||
err = btr_cur_optimistic_insert(
|
||||
BTR_NO_LOCKING_FLAG,
|
||||
BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG,
|
||||
cursor, &offsets, &offsets_heap,
|
||||
ibuf_entry, &ins_rec,
|
||||
&dummy_big_rec, 0, thr, &mtr);
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2017, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -220,15 +221,17 @@ btr_cur_optimistic_insert(
|
||||
btr_cur_t* cursor, /*!< in: cursor on page after which to insert;
|
||||
cursor stays valid */
|
||||
ulint** offsets,/*!< out: offsets on *rec */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap */
|
||||
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||
rec_t** rec, /*!< out: pointer to inserted record if
|
||||
succeed */
|
||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||
be stored externally by the caller, or
|
||||
NULL */
|
||||
be stored externally by the caller */
|
||||
ulint n_ext, /*!< in: number of externally stored columns */
|
||||
que_thr_t* thr, /*!< in: query thread or NULL */
|
||||
que_thr_t* thr, /*!< in/out: query thread; can be NULL if
|
||||
!(~flags
|
||||
& (BTR_NO_LOCKING_FLAG
|
||||
| BTR_NO_UNDO_LOG_FLAG)) */
|
||||
mtr_t* mtr) /*!< in/out: mini-transaction;
|
||||
if this function returns DB_SUCCESS on
|
||||
a leaf page of a secondary index in a
|
||||
@ -256,15 +259,17 @@ btr_cur_pessimistic_insert(
|
||||
cursor stays valid */
|
||||
ulint** offsets,/*!< out: offsets on *rec */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap
|
||||
that can be emptied, or NULL */
|
||||
that can be emptied */
|
||||
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||
rec_t** rec, /*!< out: pointer to inserted record if
|
||||
succeed */
|
||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||
be stored externally by the caller, or
|
||||
NULL */
|
||||
be stored externally by the caller */
|
||||
ulint n_ext, /*!< in: number of externally stored columns */
|
||||
que_thr_t* thr, /*!< in: query thread or NULL */
|
||||
que_thr_t* thr, /*!< in/out: query thread; can be NULL if
|
||||
!(~flags
|
||||
& (BTR_NO_LOCKING_FLAG
|
||||
| BTR_NO_UNDO_LOG_FLAG)) */
|
||||
mtr_t* mtr) /*!< in/out: mini-transaction */
|
||||
MY_ATTRIBUTE((nonnull(2,3,4,5,6,7,10), warn_unused_result));
|
||||
/*************************************************************//**
|
||||
@ -390,12 +395,12 @@ btr_cur_pessimistic_update(
|
||||
ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */
|
||||
mem_heap_t** offsets_heap,
|
||||
/*!< in/out: pointer to memory heap
|
||||
that can be emptied, or NULL */
|
||||
that can be emptied */
|
||||
mem_heap_t* entry_heap,
|
||||
/*!< in/out: memory heap for allocating
|
||||
big_rec and the index tuple */
|
||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||
be stored externally by the caller, or NULL */
|
||||
be stored externally by the caller */
|
||||
const upd_t* update, /*!< in: update vector; this is allowed also
|
||||
contain trx id and roll ptr fields, but
|
||||
the values in update vector have no effect */
|
||||
|
@ -1006,7 +1006,7 @@ fil_create_new_single_table_tablespace(
|
||||
must be >= FIL_IBD_FILE_INITIAL_SIZE */
|
||||
fil_encryption_t mode, /*!< in: encryption mode */
|
||||
ulint key_id) /*!< in: encryption key_id */
|
||||
__attribute__((nonnull, warn_unused_result));
|
||||
MY_ATTRIBUTE((nonnull(2), warn_unused_result));
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
/** Try to adjust FSP_SPACE_FLAGS if they differ from the expectations.
|
||||
(Typically when upgrading from MariaDB 10.1.0..10.1.20.)
|
||||
|
@ -126,18 +126,6 @@ thd_is_replication_slave_thread(
|
||||
/*============================*/
|
||||
THD* thd); /*!< in: thread handle */
|
||||
|
||||
/******************************************************************//**
|
||||
Gets information on the durability property requested by thread.
|
||||
Used when writing either a prepare or commit record to the log
|
||||
buffer.
|
||||
@return the durability property. */
|
||||
UNIV_INTERN
|
||||
enum durability_properties
|
||||
thd_requested_durability(
|
||||
/*=====================*/
|
||||
const THD* thd) /*!< in: thread handle */
|
||||
MY_ATTRIBUTE((nonnull, warn_unused_result));
|
||||
|
||||
/******************************************************************//**
|
||||
Returns true if the transaction this thread is processing has edited
|
||||
non-transactional tables. Used by the deadlock detector when deciding
|
||||
|
@ -908,7 +908,14 @@ struct MY_ALIGNED(CACHE_LINE_SIZE) simple_counter
|
||||
{
|
||||
compile_time_assert(!atomic || sizeof(Type) == sizeof(ulint));
|
||||
if (atomic) {
|
||||
return os_atomic_increment_ulint(&m_counter, i);
|
||||
/* GCC would perform a type check in this code
|
||||
also in case the template is instantiated with
|
||||
simple_counter<Type=not_ulint, atomic=false>.
|
||||
On Solaris, os_atomic_increment_ulint() maps
|
||||
to atomic_add_long_nv(), which expects the
|
||||
parameter to be correctly typed. */
|
||||
return os_atomic_increment_ulint(
|
||||
reinterpret_cast<ulint*>(&m_counter), i);
|
||||
} else {
|
||||
return m_counter += i;
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
Copyright (c) 2005, 2013, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2012, Facebook Inc.
|
||||
Copyright (c) 2017, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -172,7 +173,8 @@ page_zip_rec_needs_ext(
|
||||
ignored if zip_size == 0 */
|
||||
ulint zip_size) /*!< in: compressed page size in bytes, or 0 */
|
||||
{
|
||||
ut_ad(rec_size > comp ? REC_N_NEW_EXTRA_BYTES : REC_N_OLD_EXTRA_BYTES);
|
||||
ut_ad(rec_size
|
||||
> (comp ? REC_N_NEW_EXTRA_BYTES : REC_N_OLD_EXTRA_BYTES));
|
||||
ut_ad(ut_is_2pow(zip_size));
|
||||
ut_ad(comp || !zip_size);
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2017, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -212,10 +213,6 @@ UNIV_INTERN
|
||||
dberr_t
|
||||
trx_undo_report_row_operation(
|
||||
/*==========================*/
|
||||
ulint flags, /*!< in: if BTR_NO_UNDO_LOG_FLAG bit is
|
||||
set, does nothing */
|
||||
ulint op_type, /*!< in: TRX_UNDO_INSERT_OP or
|
||||
TRX_UNDO_MODIFY_OP */
|
||||
que_thr_t* thr, /*!< in: query thread */
|
||||
dict_index_t* index, /*!< in: clustered index */
|
||||
const dtuple_t* clust_entry, /*!< in: in the case of an insert,
|
||||
@ -233,7 +230,7 @@ trx_undo_report_row_operation(
|
||||
inserted undo log record,
|
||||
0 if BTR_NO_UNDO_LOG
|
||||
flag was specified */
|
||||
MY_ATTRIBUTE((nonnull(3,4,10), warn_unused_result));
|
||||
MY_ATTRIBUTE((nonnull(1,2,8), warn_unused_result));
|
||||
/******************************************************************//**
|
||||
Copies an undo record to heap. This function can be called if we know that
|
||||
the undo log record exists.
|
||||
@ -313,10 +310,6 @@ record */
|
||||
storage fields: used by purge to
|
||||
free the external storage */
|
||||
|
||||
/* Operation type flags used in trx_undo_report_row_operation */
|
||||
#define TRX_UNDO_INSERT_OP 1
|
||||
#define TRX_UNDO_MODIFY_OP 2
|
||||
|
||||
#ifndef UNIV_NONINL
|
||||
#include "trx0rec.ic"
|
||||
#endif
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
Copyright (c) 2005, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2012, Facebook Inc.
|
||||
Copyright (c) 2017, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -68,8 +69,8 @@ using namespace std;
|
||||
# define buf_LRU_stat_inc_unzip() ((void) 0)
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
#ifndef UNIV_INNOCHECKSUM
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
/** Statistics on compression, indexed by page_zip_des_t::ssize - 1 */
|
||||
UNIV_INTERN page_zip_stat_t page_zip_stat[PAGE_ZIP_SSIZE_MAX];
|
||||
/** Statistics on compression, indexed by index->id */
|
||||
@ -79,7 +80,6 @@ UNIV_INTERN ib_mutex_t page_zip_stat_per_index_mutex;
|
||||
#ifdef HAVE_PSI_INTERFACE
|
||||
UNIV_INTERN mysql_pfs_key_t page_zip_stat_per_index_mutex_key;
|
||||
#endif /* HAVE_PSI_INTERFACE */
|
||||
#endif /* !UNIV_INNOCHECKSUM */
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
|
||||
/* Compression level to be used by zlib. Settable by user. */
|
||||
@ -128,7 +128,6 @@ Compare at most sizeof(field_ref_zero) bytes.
|
||||
|
||||
/* Enable some extra debugging output. This code can be enabled
|
||||
independently of any UNIV_ debugging conditions. */
|
||||
#ifndef UNIV_INNOCHECKSUM
|
||||
#if defined UNIV_DEBUG || defined UNIV_ZIP_DEBUG
|
||||
# include <stdarg.h>
|
||||
MY_ATTRIBUTE((format (printf, 1, 2)))
|
||||
|
@ -1288,8 +1288,10 @@ rec_convert_dtuple_to_rec_comp(
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(end, dfield_get_data(field), len);
|
||||
end += len;
|
||||
if (len) {
|
||||
memcpy(end, dfield_get_data(field), len);
|
||||
end += len;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 2010, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2015, 2016, MariaDB Corporation.
|
||||
Copyright (c) 2015, 2017, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -246,9 +246,6 @@ row_fts_psort_info_init(
|
||||
each parallel sort thread. Each "sort bucket" holds records for
|
||||
a particular "FTS index partition" */
|
||||
for (j = 0; j < fts_sort_pll_degree; j++) {
|
||||
|
||||
UT_LIST_INIT(psort_info[j].fts_doc_list);
|
||||
|
||||
for (i = 0; i < FTS_NUM_AUX_INDEX; i++) {
|
||||
|
||||
psort_info[j].merge_file[i] =
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2017, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -2148,14 +2149,10 @@ for a clustered index!
|
||||
@retval DB_SUCCESS if no error
|
||||
@retval DB_DUPLICATE_KEY if error,
|
||||
@retval DB_LOCK_WAIT if we have to wait for a lock on a possible duplicate
|
||||
record
|
||||
@retval DB_SUCCESS_LOCKED_REC if an exact match of the record was found
|
||||
in online table rebuild (flags & (BTR_KEEP_SYS_FLAG | BTR_NO_LOCKING_FLAG)) */
|
||||
record */
|
||||
static MY_ATTRIBUTE((nonnull, warn_unused_result))
|
||||
dberr_t
|
||||
row_ins_duplicate_error_in_clust(
|
||||
/*=============================*/
|
||||
ulint flags, /*!< in: undo logging and locking flags */
|
||||
btr_cur_t* cursor, /*!< in: B-tree cursor */
|
||||
const dtuple_t* entry, /*!< in: entry to insert */
|
||||
que_thr_t* thr, /*!< in: query thread */
|
||||
@ -2419,7 +2416,7 @@ row_ins_clust_index_entry_low(
|
||||
DB_LOCK_WAIT */
|
||||
|
||||
err = row_ins_duplicate_error_in_clust(
|
||||
flags, &cursor, entry, thr, &mtr);
|
||||
&cursor, entry, thr, &mtr);
|
||||
}
|
||||
|
||||
if (err != DB_SUCCESS) {
|
||||
|
@ -324,7 +324,7 @@ UNIV_INTERN double srv_adaptive_flushing_lwm = 10.0;
|
||||
UNIV_INTERN ulong srv_flushing_avg_loops = 30;
|
||||
|
||||
/* The number of purge threads to use.*/
|
||||
UNIV_INTERN ulong srv_n_purge_threads = 1;
|
||||
UNIV_INTERN ulong srv_n_purge_threads;
|
||||
|
||||
/* the number of pages to purge in one batch */
|
||||
UNIV_INTERN ulong srv_purge_batch_size = 20;
|
||||
@ -549,16 +549,16 @@ UNIV_INTERN ulong srv_buf_dump_status_frequency = 0;
|
||||
|
||||
/** Acquire the system_mutex. */
|
||||
#define srv_sys_mutex_enter() do { \
|
||||
mutex_enter(&srv_sys->mutex); \
|
||||
mutex_enter(&srv_sys.mutex); \
|
||||
} while (0)
|
||||
|
||||
/** Test if the system mutex is owned. */
|
||||
#define srv_sys_mutex_own() (mutex_own(&srv_sys->mutex) \
|
||||
#define srv_sys_mutex_own() (mutex_own(&srv_sys.mutex) \
|
||||
&& !srv_read_only_mode)
|
||||
|
||||
/** Release the system mutex. */
|
||||
#define srv_sys_mutex_exit() do { \
|
||||
mutex_exit(&srv_sys->mutex); \
|
||||
mutex_exit(&srv_sys.mutex); \
|
||||
} while (0)
|
||||
|
||||
#define fetch_lock_wait_timeout(trx) \
|
||||
@ -650,7 +650,7 @@ struct srv_sys_t{
|
||||
ulint n_sys_threads; /*!< size of the sys_threads
|
||||
array */
|
||||
|
||||
srv_slot_t* sys_threads; /*!< server thread table;
|
||||
srv_slot_t sys_threads[32 + 1]; /*!< server thread table;
|
||||
os_event_set() and
|
||||
os_event_reset() on
|
||||
sys_threads[]->event are
|
||||
@ -670,7 +670,7 @@ struct srv_sys_t{
|
||||
UNIV_INTERN ib_mutex_t server_mutex;
|
||||
#endif /* !HAVE_ATOMIC_BUILTINS */
|
||||
|
||||
static srv_sys_t* srv_sys = NULL;
|
||||
static srv_sys_t srv_sys;
|
||||
|
||||
/** Event to signal srv_monitor_thread. Not protected by a mutex.
|
||||
Set after setting srv_print_innodb_monitor. */
|
||||
@ -692,10 +692,10 @@ and/or load it during startup. */
|
||||
UNIV_INTERN char srv_buffer_pool_dump_at_shutdown = FALSE;
|
||||
UNIV_INTERN char srv_buffer_pool_load_at_startup = FALSE;
|
||||
|
||||
/** Slot index in the srv_sys->sys_threads array for the purge thread. */
|
||||
/** Slot index in the srv_sys.sys_threads array for the purge thread. */
|
||||
static const ulint SRV_PURGE_SLOT = 1;
|
||||
|
||||
/** Slot index in the srv_sys->sys_threads array for the master thread. */
|
||||
/** Slot index in the srv_sys.sys_threads array for the master thread. */
|
||||
static const ulint SRV_MASTER_SLOT = 0;
|
||||
|
||||
/*********************************************************************//**
|
||||
@ -796,21 +796,21 @@ srv_reserve_slot(
|
||||
|
||||
switch (type) {
|
||||
case SRV_MASTER:
|
||||
slot = &srv_sys->sys_threads[SRV_MASTER_SLOT];
|
||||
slot = &srv_sys.sys_threads[SRV_MASTER_SLOT];
|
||||
break;
|
||||
|
||||
case SRV_PURGE:
|
||||
slot = &srv_sys->sys_threads[SRV_PURGE_SLOT];
|
||||
slot = &srv_sys.sys_threads[SRV_PURGE_SLOT];
|
||||
break;
|
||||
|
||||
case SRV_WORKER:
|
||||
/* Find an empty slot, skip the master and purge slots. */
|
||||
for (slot = &srv_sys->sys_threads[2];
|
||||
for (slot = &srv_sys.sys_threads[2];
|
||||
slot->in_use;
|
||||
++slot) {
|
||||
|
||||
ut_a(slot < &srv_sys->sys_threads[
|
||||
srv_sys->n_sys_threads]);
|
||||
ut_a(slot < &srv_sys.sys_threads[
|
||||
srv_sys.n_sys_threads]);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -826,7 +826,7 @@ srv_reserve_slot(
|
||||
|
||||
ut_ad(srv_slot_get_type(slot) == type);
|
||||
|
||||
++srv_sys->n_threads_active[type];
|
||||
++srv_sys.n_threads_active[type];
|
||||
|
||||
srv_sys_mutex_exit();
|
||||
|
||||
@ -856,27 +856,27 @@ srv_suspend_thread_low(
|
||||
case SRV_MASTER:
|
||||
/* We have only one master thread and it
|
||||
should be the first entry always. */
|
||||
ut_a(srv_sys->n_threads_active[type] == 1);
|
||||
ut_a(srv_sys.n_threads_active[type] == 1);
|
||||
break;
|
||||
|
||||
case SRV_PURGE:
|
||||
/* We have only one purge coordinator thread
|
||||
and it should be the second entry always. */
|
||||
ut_a(srv_sys->n_threads_active[type] == 1);
|
||||
ut_a(srv_sys.n_threads_active[type] == 1);
|
||||
break;
|
||||
|
||||
case SRV_WORKER:
|
||||
ut_a(srv_n_purge_threads > 1);
|
||||
ut_a(srv_sys->n_threads_active[type] > 0);
|
||||
ut_a(srv_sys.n_threads_active[type] > 0);
|
||||
break;
|
||||
}
|
||||
|
||||
ut_a(!slot->suspended);
|
||||
slot->suspended = TRUE;
|
||||
|
||||
ut_a(srv_sys->n_threads_active[type] > 0);
|
||||
ut_a(srv_sys.n_threads_active[type] > 0);
|
||||
|
||||
srv_sys->n_threads_active[type]--;
|
||||
srv_sys.n_threads_active[type]--;
|
||||
|
||||
return(os_event_reset(slot->event));
|
||||
}
|
||||
@ -931,7 +931,7 @@ srv_resume_thread(srv_slot_t* slot, ib_int64_t sig_count = 0, bool wait = true,
|
||||
ut_ad(slot->suspended);
|
||||
|
||||
slot->suspended = FALSE;
|
||||
++srv_sys->n_threads_active[slot->type];
|
||||
++srv_sys.n_threads_active[slot->type];
|
||||
srv_sys_mutex_exit();
|
||||
return(timeout);
|
||||
}
|
||||
@ -953,8 +953,8 @@ srv_release_threads(enum srv_thread_type type, ulint n)
|
||||
|
||||
srv_sys_mutex_enter();
|
||||
|
||||
for (ulint i = 0; i < srv_sys->n_sys_threads; i++) {
|
||||
srv_slot_t* slot = &srv_sys->sys_threads[i];
|
||||
for (ulint i = 0; i < srv_sys.n_sys_threads; i++) {
|
||||
srv_slot_t* slot = &srv_sys.sys_threads[i];
|
||||
|
||||
if (!slot->in_use || srv_slot_get_type(slot) != type) {
|
||||
continue;
|
||||
@ -974,7 +974,7 @@ srv_release_threads(enum srv_thread_type type, ulint n)
|
||||
should be the first entry always. */
|
||||
ut_a(n == 1);
|
||||
ut_a(i == SRV_MASTER_SLOT);
|
||||
ut_a(srv_sys->n_threads_active[type] == 0);
|
||||
ut_a(srv_sys.n_threads_active[type] == 0);
|
||||
break;
|
||||
|
||||
case SRV_PURGE:
|
||||
@ -983,12 +983,12 @@ srv_release_threads(enum srv_thread_type type, ulint n)
|
||||
ut_a(n == 1);
|
||||
ut_a(i == SRV_PURGE_SLOT);
|
||||
ut_a(srv_n_purge_threads > 0);
|
||||
ut_a(srv_sys->n_threads_active[type] == 0);
|
||||
ut_a(srv_sys.n_threads_active[type] == 0);
|
||||
break;
|
||||
|
||||
case SRV_WORKER:
|
||||
ut_a(srv_n_purge_threads > 1);
|
||||
ut_a(srv_sys->n_threads_active[type]
|
||||
ut_a(srv_sys.n_threads_active[type]
|
||||
< srv_n_purge_threads - 1);
|
||||
break;
|
||||
}
|
||||
@ -1026,9 +1026,6 @@ void
|
||||
srv_init(void)
|
||||
/*==========*/
|
||||
{
|
||||
ulint n_sys_threads = 0;
|
||||
ulint srv_sys_sz = sizeof(*srv_sys);
|
||||
|
||||
#ifndef HAVE_ATOMIC_BUILTINS
|
||||
mutex_create(server_mutex_key, &server_mutex, SYNC_ANY_LATCH);
|
||||
#endif /* !HAVE_ATOMIC_BUILTINS */
|
||||
@ -1036,29 +1033,19 @@ srv_init(void)
|
||||
mutex_create(srv_innodb_monitor_mutex_key,
|
||||
&srv_innodb_monitor_mutex, SYNC_NO_ORDER_CHECK);
|
||||
|
||||
if (!srv_read_only_mode) {
|
||||
|
||||
/* Number of purge threads + master thread */
|
||||
n_sys_threads = srv_n_purge_threads + 1;
|
||||
|
||||
srv_sys_sz += n_sys_threads * sizeof(*srv_sys->sys_threads);
|
||||
}
|
||||
|
||||
srv_sys = static_cast<srv_sys_t*>(mem_zalloc(srv_sys_sz));
|
||||
|
||||
srv_sys->n_sys_threads = n_sys_threads;
|
||||
srv_sys.n_sys_threads = srv_read_only_mode
|
||||
? 0
|
||||
: srv_n_purge_threads + 1/* purge coordinator */;
|
||||
|
||||
if (!srv_read_only_mode) {
|
||||
|
||||
mutex_create(srv_sys_mutex_key, &srv_sys->mutex, SYNC_THREADS);
|
||||
mutex_create(srv_sys_mutex_key, &srv_sys.mutex, SYNC_THREADS);
|
||||
|
||||
mutex_create(srv_sys_tasks_mutex_key,
|
||||
&srv_sys->tasks_mutex, SYNC_ANY_LATCH);
|
||||
&srv_sys.tasks_mutex, SYNC_ANY_LATCH);
|
||||
|
||||
srv_sys->sys_threads = (srv_slot_t*) &srv_sys[1];
|
||||
|
||||
for (ulint i = 0; i < srv_sys->n_sys_threads; ++i) {
|
||||
srv_slot_t* slot = &srv_sys->sys_threads[i];
|
||||
for (ulint i = 0; i < srv_sys.n_sys_threads; ++i) {
|
||||
srv_slot_t* slot = &srv_sys.sys_threads[i];
|
||||
|
||||
slot->event = os_event_create();
|
||||
|
||||
@ -1070,8 +1057,6 @@ srv_init(void)
|
||||
srv_monitor_event = os_event_create();
|
||||
|
||||
srv_buf_dump_event = os_event_create();
|
||||
|
||||
UT_LIST_INIT(srv_sys->tasks);
|
||||
}
|
||||
|
||||
/* page_zip_stat_per_index_mutex is acquired from:
|
||||
@ -1117,10 +1102,8 @@ srv_free(void)
|
||||
{
|
||||
srv_conc_free();
|
||||
|
||||
/* The mutexes srv_sys->mutex and srv_sys->tasks_mutex should have
|
||||
/* The mutexes srv_sys.mutex and srv_sys.tasks_mutex should have
|
||||
been freed by sync_close() already. */
|
||||
mem_free(srv_sys);
|
||||
srv_sys = NULL;
|
||||
|
||||
trx_i_s_cache_free(trx_i_s_cache);
|
||||
|
||||
@ -2012,7 +1995,7 @@ void
|
||||
srv_inc_activity_count(void)
|
||||
/*========================*/
|
||||
{
|
||||
srv_sys->activity_count.inc();
|
||||
srv_sys.activity_count.inc();
|
||||
}
|
||||
|
||||
/**********************************************************************//**
|
||||
@ -2034,7 +2017,7 @@ srv_get_active_thread_type(void)
|
||||
srv_sys_mutex_enter();
|
||||
|
||||
for (ulint i = SRV_WORKER; i <= SRV_MASTER; ++i) {
|
||||
if (srv_sys->n_threads_active[i] != 0) {
|
||||
if (srv_sys.n_threads_active[i] != 0) {
|
||||
ret = static_cast<srv_thread_type>(i);
|
||||
break;
|
||||
}
|
||||
@ -2073,12 +2056,12 @@ srv_active_wake_master_thread(void)
|
||||
|
||||
srv_inc_activity_count();
|
||||
|
||||
if (srv_sys->n_threads_active[SRV_MASTER] == 0) {
|
||||
if (srv_sys.n_threads_active[SRV_MASTER] == 0) {
|
||||
srv_slot_t* slot;
|
||||
|
||||
srv_sys_mutex_enter();
|
||||
|
||||
slot = &srv_sys->sys_threads[SRV_MASTER_SLOT];
|
||||
slot = &srv_sys.sys_threads[SRV_MASTER_SLOT];
|
||||
|
||||
/* Only if the master thread has been started. */
|
||||
|
||||
@ -2105,7 +2088,7 @@ srv_wake_purge_thread_if_not_active(void)
|
||||
ut_ad(!srv_sys_mutex_own());
|
||||
|
||||
if (purge_sys->state == PURGE_STATE_RUN
|
||||
&& srv_sys->n_threads_active[SRV_PURGE] == 0) {
|
||||
&& srv_sys.n_threads_active[SRV_PURGE] == 0) {
|
||||
|
||||
srv_release_threads(SRV_PURGE, 1);
|
||||
}
|
||||
@ -2134,7 +2117,7 @@ ulint
|
||||
srv_get_activity_count(void)
|
||||
/*========================*/
|
||||
{
|
||||
return(srv_sys->activity_count);
|
||||
return(srv_sys.activity_count);
|
||||
}
|
||||
|
||||
/*******************************************************************//**
|
||||
@ -2146,7 +2129,7 @@ srv_check_activity(
|
||||
/*===============*/
|
||||
ulint old_activity_count) /*!< in: old activity count */
|
||||
{
|
||||
return(srv_sys->activity_count != old_activity_count);
|
||||
return(srv_sys.activity_count != old_activity_count);
|
||||
}
|
||||
|
||||
/********************************************************************//**
|
||||
@ -2517,7 +2500,7 @@ DECLARE_THREAD(srv_master_thread)(
|
||||
srv_main_thread_id = os_thread_pf(os_thread_get_curr_id());
|
||||
|
||||
slot = srv_reserve_slot(SRV_MASTER);
|
||||
ut_a(slot == srv_sys->sys_threads);
|
||||
ut_a(slot == srv_sys.sys_threads);
|
||||
|
||||
last_print_time = ut_time();
|
||||
loop:
|
||||
@ -2607,18 +2590,18 @@ srv_task_execute(void)
|
||||
ut_ad(!srv_read_only_mode);
|
||||
ut_a(srv_force_recovery < SRV_FORCE_NO_BACKGROUND);
|
||||
|
||||
mutex_enter(&srv_sys->tasks_mutex);
|
||||
mutex_enter(&srv_sys.tasks_mutex);
|
||||
|
||||
if (UT_LIST_GET_LEN(srv_sys->tasks) > 0) {
|
||||
if (UT_LIST_GET_LEN(srv_sys.tasks) > 0) {
|
||||
|
||||
thr = UT_LIST_GET_FIRST(srv_sys->tasks);
|
||||
thr = UT_LIST_GET_FIRST(srv_sys.tasks);
|
||||
|
||||
ut_a(que_node_get_type(thr->child) == QUE_NODE_PURGE);
|
||||
|
||||
UT_LIST_REMOVE(queue, srv_sys->tasks, thr);
|
||||
UT_LIST_REMOVE(queue, srv_sys.tasks, thr);
|
||||
}
|
||||
|
||||
mutex_exit(&srv_sys->tasks_mutex);
|
||||
mutex_exit(&srv_sys.tasks_mutex);
|
||||
|
||||
if (thr != NULL) {
|
||||
|
||||
@ -2658,7 +2641,7 @@ DECLARE_THREAD(srv_worker_thread)(
|
||||
|
||||
srv_sys_mutex_enter();
|
||||
|
||||
ut_a(srv_sys->n_threads_active[SRV_WORKER] < srv_n_purge_threads);
|
||||
ut_a(srv_sys.n_threads_active[SRV_WORKER] < srv_n_purge_threads);
|
||||
|
||||
srv_sys_mutex_exit();
|
||||
|
||||
@ -2987,11 +2970,11 @@ srv_que_task_enqueue_low(
|
||||
que_thr_t* thr) /*!< in: query thread */
|
||||
{
|
||||
ut_ad(!srv_read_only_mode);
|
||||
mutex_enter(&srv_sys->tasks_mutex);
|
||||
mutex_enter(&srv_sys.tasks_mutex);
|
||||
|
||||
UT_LIST_ADD_LAST(queue, srv_sys->tasks, thr);
|
||||
UT_LIST_ADD_LAST(queue, srv_sys.tasks, thr);
|
||||
|
||||
mutex_exit(&srv_sys->tasks_mutex);
|
||||
mutex_exit(&srv_sys.tasks_mutex);
|
||||
|
||||
srv_release_threads(SRV_WORKER, 1);
|
||||
}
|
||||
@ -3008,11 +2991,11 @@ srv_get_task_queue_length(void)
|
||||
|
||||
ut_ad(!srv_read_only_mode);
|
||||
|
||||
mutex_enter(&srv_sys->tasks_mutex);
|
||||
mutex_enter(&srv_sys.tasks_mutex);
|
||||
|
||||
n_tasks = UT_LIST_GET_LEN(srv_sys->tasks);
|
||||
n_tasks = UT_LIST_GET_LEN(srv_sys.tasks);
|
||||
|
||||
mutex_exit(&srv_sys->tasks_mutex);
|
||||
mutex_exit(&srv_sys.tasks_mutex);
|
||||
|
||||
return(n_tasks);
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2017, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -1186,10 +1187,6 @@ UNIV_INTERN
|
||||
dberr_t
|
||||
trx_undo_report_row_operation(
|
||||
/*==========================*/
|
||||
ulint flags, /*!< in: if BTR_NO_UNDO_LOG_FLAG bit is
|
||||
set, does nothing */
|
||||
ulint op_type, /*!< in: TRX_UNDO_INSERT_OP or
|
||||
TRX_UNDO_MODIFY_OP */
|
||||
que_thr_t* thr, /*!< in: query thread */
|
||||
dict_index_t* index, /*!< in: clustered index */
|
||||
const dtuple_t* clust_entry, /*!< in: in the case of an insert,
|
||||
@ -1222,17 +1219,8 @@ trx_undo_report_row_operation(
|
||||
ut_ad(!srv_read_only_mode);
|
||||
ut_a(dict_index_is_clust(index));
|
||||
ut_ad(!rec || rec_offs_validate(rec, index, offsets));
|
||||
|
||||
if (flags & BTR_NO_UNDO_LOG_FLAG) {
|
||||
|
||||
*roll_ptr = 0;
|
||||
|
||||
return(DB_SUCCESS);
|
||||
}
|
||||
|
||||
ut_ad(thr);
|
||||
ut_ad((op_type != TRX_UNDO_INSERT_OP)
|
||||
|| (clust_entry && !update && !rec));
|
||||
ut_ad(!clust_entry || (!update && !rec));
|
||||
|
||||
trx = thr_get_trx(thr);
|
||||
|
||||
@ -1253,8 +1241,7 @@ trx_undo_report_row_operation(
|
||||
|
||||
/* If the undo log is not assigned yet, assign one */
|
||||
|
||||
switch (op_type) {
|
||||
case TRX_UNDO_INSERT_OP:
|
||||
if (clust_entry) {
|
||||
undo = trx->insert_undo;
|
||||
|
||||
if (undo == NULL) {
|
||||
@ -1270,10 +1257,7 @@ trx_undo_report_row_operation(
|
||||
|
||||
ut_ad(err == DB_SUCCESS);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ut_ad(op_type == TRX_UNDO_MODIFY_OP);
|
||||
|
||||
} else {
|
||||
undo = trx->update_undo;
|
||||
|
||||
if (undo == NULL) {
|
||||
@ -1297,23 +1281,14 @@ trx_undo_report_row_operation(
|
||||
buf_block_dbg_add_level(undo_block, SYNC_TRX_UNDO_PAGE);
|
||||
|
||||
do {
|
||||
page_t* undo_page;
|
||||
ulint offset;
|
||||
|
||||
undo_page = buf_block_get_frame(undo_block);
|
||||
ut_ad(page_no == buf_block_get_page_no(undo_block));
|
||||
|
||||
switch (op_type) {
|
||||
case TRX_UNDO_INSERT_OP:
|
||||
offset = trx_undo_page_report_insert(
|
||||
undo_page, trx, index, clust_entry, &mtr);
|
||||
break;
|
||||
default:
|
||||
ut_ad(op_type == TRX_UNDO_MODIFY_OP);
|
||||
offset = trx_undo_page_report_modify(
|
||||
page_t* undo_page = buf_block_get_frame(undo_block);
|
||||
ulint offset = clust_entry
|
||||
? trx_undo_page_report_insert(
|
||||
undo_page, trx, index, clust_entry, &mtr)
|
||||
: trx_undo_page_report_modify(
|
||||
undo_page, trx, index, rec, offsets, update,
|
||||
cmpl_info, &mtr);
|
||||
}
|
||||
|
||||
if (UNIV_UNLIKELY(offset == 0)) {
|
||||
/* The record did not fit on the page. We erase the
|
||||
@ -1364,7 +1339,7 @@ trx_undo_report_row_operation(
|
||||
mutex_exit(&trx->undo_mutex);
|
||||
|
||||
*roll_ptr = trx_undo_build_roll_ptr(
|
||||
op_type == TRX_UNDO_INSERT_OP,
|
||||
clust_entry != NULL,
|
||||
rseg->id, page_no, offset);
|
||||
return(DB_SUCCESS);
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2017, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -48,8 +49,6 @@ sess_open(void)
|
||||
sess->trx = trx_allocate_for_background();
|
||||
sess->trx->sess = sess;
|
||||
|
||||
UT_LIST_INIT(sess->graphs);
|
||||
|
||||
return(sess);
|
||||
}
|
||||
|
||||
|
@ -29,7 +29,7 @@ static void mi_update_status_with_lock(MI_INFO *info);
|
||||
|
||||
int mi_lock_database(MI_INFO *info, int lock_type)
|
||||
{
|
||||
int error;
|
||||
int error, mark_crashed= 0;
|
||||
uint count;
|
||||
MYISAM_SHARE *share=info->s;
|
||||
DBUG_ENTER("mi_lock_database");
|
||||
@ -52,6 +52,7 @@ int mi_lock_database(MI_INFO *info, int lock_type)
|
||||
}
|
||||
|
||||
error= 0;
|
||||
DBUG_EXECUTE_IF ("mi_lock_database_failure", error= EINVAL;);
|
||||
mysql_mutex_lock(&share->intern_lock);
|
||||
if (share->kfile >= 0) /* May only be false on windows */
|
||||
{
|
||||
@ -75,17 +76,15 @@ int mi_lock_database(MI_INFO *info, int lock_type)
|
||||
&share->dirty_part_map,
|
||||
FLUSH_KEEP))
|
||||
{
|
||||
error=my_errno;
|
||||
mark_crashed= error=my_errno;
|
||||
mi_print_error(info->s, HA_ERR_CRASHED);
|
||||
mi_mark_crashed(info); /* Mark that table must be checked */
|
||||
}
|
||||
if (info->opt_flag & (READ_CACHE_USED | WRITE_CACHE_USED))
|
||||
{
|
||||
if (end_io_cache(&info->rec_cache))
|
||||
{
|
||||
error=my_errno;
|
||||
mark_crashed= error=my_errno;
|
||||
mi_print_error(info->s, HA_ERR_CRASHED);
|
||||
mi_mark_crashed(info);
|
||||
}
|
||||
}
|
||||
if (!count)
|
||||
@ -110,22 +109,19 @@ int mi_lock_database(MI_INFO *info, int lock_type)
|
||||
share->state.unique= info->last_unique= info->this_unique;
|
||||
share->state.update_count= info->last_loop= ++info->this_loop;
|
||||
if (mi_state_info_write(share->kfile, &share->state, 1))
|
||||
error=my_errno;
|
||||
mark_crashed= error=my_errno;
|
||||
share->changed=0;
|
||||
if (myisam_flush)
|
||||
{
|
||||
if (mysql_file_sync(share->kfile, MYF(0)))
|
||||
error= my_errno;
|
||||
mark_crashed= error= my_errno;
|
||||
if (mysql_file_sync(info->dfile, MYF(0)))
|
||||
error= my_errno;
|
||||
mark_crashed= error= my_errno;
|
||||
}
|
||||
else
|
||||
share->not_flushed=1;
|
||||
if (error)
|
||||
{
|
||||
mi_print_error(info->s, HA_ERR_CRASHED);
|
||||
mi_mark_crashed(info);
|
||||
}
|
||||
}
|
||||
if (info->lock_type != F_EXTRA_LCK)
|
||||
{
|
||||
@ -260,6 +256,8 @@ int mi_lock_database(MI_INFO *info, int lock_type)
|
||||
}
|
||||
#endif
|
||||
mysql_mutex_unlock(&share->intern_lock);
|
||||
if (mark_crashed)
|
||||
mi_mark_crashed(info);
|
||||
DBUG_RETURN(error);
|
||||
} /* mi_lock_database */
|
||||
|
||||
|
@ -216,7 +216,9 @@ enum ESphGroupBy
|
||||
SPH_GROUPBY_WEEK = 1, ///< group by week
|
||||
SPH_GROUPBY_MONTH = 2, ///< group by month
|
||||
SPH_GROUPBY_YEAR = 3, ///< group by year
|
||||
SPH_GROUPBY_ATTR = 4 ///< group by attribute value
|
||||
SPH_GROUPBY_ATTR = 4, ///< group by attribute value
|
||||
SPH_GROUPBY_ATTRPAIR = 5, ///< group by sequential attrs pair (rendered redundant by 64bit attrs support; removed)
|
||||
SPH_GROUPBY_MULTIPLE = 6 ///< group by on multiple attribute values
|
||||
};
|
||||
|
||||
/// known attribute types
|
||||
@ -911,7 +913,7 @@ bool sphinx_show_status ( THD * thd )
|
||||
}
|
||||
|
||||
// show last error or warning (either in addition to stats, or on their own)
|
||||
if ( pTls && pTls->m_pHeadTable && pTls->m_pHeadTable->m_tStats.m_sLastMessage && pTls->m_pHeadTable->m_tStats.m_sLastMessage[0] )
|
||||
if ( pTls && pTls->m_pHeadTable && pTls->m_pHeadTable->m_tStats.m_sLastMessage[0] )
|
||||
{
|
||||
const char * sMessageType = pTls->m_pHeadTable->m_tStats.m_bLastError ? "error" : "warning";
|
||||
|
||||
@ -1563,6 +1565,7 @@ bool CSphSEQuery::ParseField ( char * sField )
|
||||
{ "month:", SPH_GROUPBY_MONTH },
|
||||
{ "year:", SPH_GROUPBY_YEAR },
|
||||
{ "attr:", SPH_GROUPBY_ATTR },
|
||||
{ "multi:", SPH_GROUPBY_MULTIPLE }
|
||||
};
|
||||
|
||||
int i;
|
||||
|
@ -517,7 +517,6 @@ int spider_free_share_alloc(
|
||||
) {
|
||||
int roop_count;
|
||||
DBUG_ENTER("spider_free_share_alloc");
|
||||
if (share->dbton_bitmap)
|
||||
{
|
||||
for (roop_count = SPIDER_DBTON_SIZE - 1; roop_count >= 0; roop_count--)
|
||||
{
|
||||
|
@ -1329,18 +1329,21 @@ btr_cur_ins_lock_and_undo(
|
||||
index, thr, mtr, inherit);
|
||||
|
||||
if (err != DB_SUCCESS
|
||||
|| !(~flags | (BTR_NO_UNDO_LOG_FLAG | BTR_KEEP_SYS_FLAG))
|
||||
|| !dict_index_is_clust(index) || dict_index_is_ibuf(index)) {
|
||||
|
||||
return(err);
|
||||
}
|
||||
|
||||
err = trx_undo_report_row_operation(flags, TRX_UNDO_INSERT_OP,
|
||||
thr, index, entry,
|
||||
NULL, 0, NULL, NULL,
|
||||
&roll_ptr);
|
||||
if (err != DB_SUCCESS) {
|
||||
|
||||
return(err);
|
||||
if (flags & BTR_NO_UNDO_LOG_FLAG) {
|
||||
roll_ptr = 0;
|
||||
} else {
|
||||
err = trx_undo_report_row_operation(thr, index, entry,
|
||||
NULL, 0, NULL, NULL,
|
||||
&roll_ptr);
|
||||
if (err != DB_SUCCESS) {
|
||||
return(err);
|
||||
}
|
||||
}
|
||||
|
||||
/* Now we can fill in the roll ptr field in entry */
|
||||
@ -1389,15 +1392,17 @@ btr_cur_optimistic_insert(
|
||||
btr_cur_t* cursor, /*!< in: cursor on page after which to insert;
|
||||
cursor stays valid */
|
||||
ulint** offsets,/*!< out: offsets on *rec */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap */
|
||||
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||
rec_t** rec, /*!< out: pointer to inserted record if
|
||||
succeed */
|
||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||
be stored externally by the caller, or
|
||||
NULL */
|
||||
be stored externally by the caller */
|
||||
ulint n_ext, /*!< in: number of externally stored columns */
|
||||
que_thr_t* thr, /*!< in: query thread or NULL */
|
||||
que_thr_t* thr, /*!< in/out: query thread; can be NULL if
|
||||
!(~flags
|
||||
& (BTR_NO_LOCKING_FLAG
|
||||
| BTR_NO_UNDO_LOG_FLAG)) */
|
||||
mtr_t* mtr) /*!< in/out: mini-transaction;
|
||||
if this function returns DB_SUCCESS on
|
||||
a leaf page of a secondary index in a
|
||||
@ -1418,6 +1423,7 @@ btr_cur_optimistic_insert(
|
||||
ulint rec_size;
|
||||
dberr_t err;
|
||||
|
||||
ut_ad(thr || !(~flags & (BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG)));
|
||||
*big_rec = NULL;
|
||||
|
||||
block = btr_cur_get_block(cursor);
|
||||
@ -1427,7 +1433,10 @@ btr_cur_optimistic_insert(
|
||||
page = buf_block_get_frame(block);
|
||||
index = cursor->index;
|
||||
|
||||
ut_ad((thr && thr_get_trx(thr)->fake_changes)
|
||||
const bool fake_changes = (~flags & (BTR_NO_LOCKING_FLAG
|
||||
| BTR_NO_UNDO_LOG_FLAG))
|
||||
&& thr_get_trx(thr)->fake_changes;
|
||||
ut_ad(fake_changes
|
||||
|| mtr_memo_contains(mtr, block, MTR_MEMO_PAGE_X_FIX));
|
||||
ut_ad(!dict_index_is_online_ddl(index)
|
||||
|| dict_index_is_clust(index)
|
||||
@ -1568,7 +1577,7 @@ fail_err:
|
||||
goto fail_err;
|
||||
}
|
||||
|
||||
if (UNIV_UNLIKELY(thr && thr_get_trx(thr)->fake_changes)) {
|
||||
if (UNIV_UNLIKELY(fake_changes)) {
|
||||
/* skip CHANGE, LOG */
|
||||
*big_rec = big_rec_vec;
|
||||
return(err); /* == DB_SUCCESS */
|
||||
@ -1686,15 +1695,17 @@ btr_cur_pessimistic_insert(
|
||||
cursor stays valid */
|
||||
ulint** offsets,/*!< out: offsets on *rec */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap
|
||||
that can be emptied, or NULL */
|
||||
that can be emptied */
|
||||
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||
rec_t** rec, /*!< out: pointer to inserted record if
|
||||
succeed */
|
||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||
be stored externally by the caller, or
|
||||
NULL */
|
||||
be stored externally by the caller */
|
||||
ulint n_ext, /*!< in: number of externally stored columns */
|
||||
que_thr_t* thr, /*!< in: query thread or NULL */
|
||||
que_thr_t* thr, /*!< in/out: query thread; can be NULL if
|
||||
!(~flags
|
||||
& (BTR_NO_LOCKING_FLAG
|
||||
| BTR_NO_UNDO_LOG_FLAG)) */
|
||||
mtr_t* mtr) /*!< in/out: mini-transaction */
|
||||
{
|
||||
dict_index_t* index = cursor->index;
|
||||
@ -1706,13 +1717,17 @@ btr_cur_pessimistic_insert(
|
||||
ulint n_reserved = 0;
|
||||
|
||||
ut_ad(dtuple_check_typed(entry));
|
||||
ut_ad(thr || !(~flags & (BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG)));
|
||||
|
||||
*big_rec = NULL;
|
||||
|
||||
ut_ad((thr && thr_get_trx(thr)->fake_changes) || mtr_memo_contains(mtr,
|
||||
const bool fake_changes = (~flags & (BTR_NO_LOCKING_FLAG
|
||||
| BTR_NO_UNDO_LOG_FLAG))
|
||||
&& thr_get_trx(thr)->fake_changes;
|
||||
ut_ad(fake_changes || mtr_memo_contains(mtr,
|
||||
dict_index_get_lock(btr_cur_get_index(cursor)),
|
||||
MTR_MEMO_X_LOCK));
|
||||
ut_ad((thr && thr_get_trx(thr)->fake_changes) || mtr_memo_contains(mtr, btr_cur_get_block(cursor),
|
||||
ut_ad(fake_changes || mtr_memo_contains(mtr, btr_cur_get_block(cursor),
|
||||
MTR_MEMO_PAGE_X_FIX));
|
||||
ut_ad(!dict_index_is_online_ddl(index)
|
||||
|| dict_index_is_clust(index)
|
||||
@ -1773,7 +1788,7 @@ btr_cur_pessimistic_insert(
|
||||
}
|
||||
}
|
||||
|
||||
if (UNIV_UNLIKELY(thr && thr_get_trx(thr)->fake_changes)) {
|
||||
if (UNIV_UNLIKELY(fake_changes)) {
|
||||
/* skip CHANGE, LOG */
|
||||
if (n_reserved > 0) {
|
||||
fil_space_release_free_extents(index->space,
|
||||
@ -1871,7 +1886,9 @@ btr_cur_upd_lock_and_undo(
|
||||
const rec_t* rec;
|
||||
dberr_t err;
|
||||
|
||||
if (UNIV_UNLIKELY(thr_get_trx(thr)->fake_changes)) {
|
||||
ut_ad((thr != NULL) || (flags & BTR_NO_LOCKING_FLAG));
|
||||
|
||||
if (!(flags & BTR_NO_LOCKING_FLAG) && thr_get_trx(thr)->fake_changes) {
|
||||
/* skip LOCK, UNDO */
|
||||
return(DB_SUCCESS);
|
||||
}
|
||||
@ -1906,9 +1923,10 @@ btr_cur_upd_lock_and_undo(
|
||||
|
||||
/* Append the info about the update in the undo log */
|
||||
|
||||
return(trx_undo_report_row_operation(
|
||||
flags, TRX_UNDO_MODIFY_OP, thr,
|
||||
index, NULL, update,
|
||||
return((flags & BTR_NO_UNDO_LOG_FLAG)
|
||||
? DB_SUCCESS
|
||||
: trx_undo_report_row_operation(
|
||||
thr, index, NULL, update,
|
||||
cmpl_info, rec, offsets, roll_ptr));
|
||||
}
|
||||
|
||||
@ -2659,12 +2677,12 @@ btr_cur_pessimistic_update(
|
||||
ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */
|
||||
mem_heap_t** offsets_heap,
|
||||
/*!< in/out: pointer to memory heap
|
||||
that can be emptied, or NULL */
|
||||
that can be emptied */
|
||||
mem_heap_t* entry_heap,
|
||||
/*!< in/out: memory heap for allocating
|
||||
big_rec and the index tuple */
|
||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||
be stored externally by the caller, or NULL */
|
||||
be stored externally by the caller */
|
||||
const upd_t* update, /*!< in: update vector; this is allowed also
|
||||
contain trx id and roll ptr fields, but
|
||||
the values in update vector have no effect */
|
||||
@ -3239,7 +3257,7 @@ btr_cur_del_mark_set_clust_rec(
|
||||
return(err);
|
||||
}
|
||||
|
||||
err = trx_undo_report_row_operation(0, TRX_UNDO_MODIFY_OP, thr,
|
||||
err = trx_undo_report_row_operation(thr,
|
||||
index, NULL, NULL, 0, rec, offsets,
|
||||
&roll_ptr);
|
||||
if (err != DB_SUCCESS) {
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2008, Google Inc.
|
||||
Copyright (c) 2013, 2017, MariaDB Corporation. All Rights Reserved.
|
||||
Copyright (c) 2013, 2017, MariaDB Corporation.
|
||||
|
||||
Portions of this file contain modifications contributed and copyrighted by
|
||||
Google, Inc. Those modifications are gratefully acknowledged and are described
|
||||
@ -1509,8 +1509,6 @@ buf_pool_init_instance(
|
||||
buf_pool->chunks = chunk =
|
||||
(buf_chunk_t*) mem_zalloc(sizeof *chunk);
|
||||
|
||||
UT_LIST_INIT(buf_pool->free);
|
||||
|
||||
if (!buf_chunk_init(buf_pool, chunk, buf_pool_size)) {
|
||||
mem_free(chunk);
|
||||
mem_free(buf_pool);
|
||||
|
@ -2063,8 +2063,6 @@ fil_init(
|
||||
fil_system->spaces = hash_create(hash_size);
|
||||
fil_system->name_hash = hash_create(hash_size);
|
||||
|
||||
UT_LIST_INIT(fil_system->LRU);
|
||||
|
||||
fil_system->max_n_open = max_n_open;
|
||||
|
||||
fil_space_crypt_init();
|
||||
@ -2791,14 +2789,12 @@ fil_op_log_parse_or_replay(
|
||||
} else if (log_flags & MLOG_FILE_FLAG_TEMP) {
|
||||
/* Temporary table, do nothing */
|
||||
} else {
|
||||
const char* path = NULL;
|
||||
|
||||
/* Create the database directory for name, if it does
|
||||
not exist yet */
|
||||
fil_create_directory_for_tablename(name);
|
||||
|
||||
if (fil_create_new_single_table_tablespace(
|
||||
space_id, name, path, flags,
|
||||
space_id, name, NULL, flags,
|
||||
DICT_TF2_USE_TABLESPACE,
|
||||
FIL_IBD_FILE_INITIAL_SIZE,
|
||||
FIL_ENCRYPTION_DEFAULT,
|
||||
|
@ -872,17 +872,6 @@ innobase_purge_changed_page_bitmaps(
|
||||
ulonglong lsn) __attribute__((unused)); /*!< in: LSN to purge files up to */
|
||||
|
||||
|
||||
/*****************************************************************//**
|
||||
Check whether this is a fake change transaction.
|
||||
@return TRUE if a fake change transaction */
|
||||
static
|
||||
my_bool
|
||||
innobase_is_fake_change(
|
||||
/*====================*/
|
||||
handlerton *hton, /*!< in: InnoDB handlerton */
|
||||
THD* thd) __attribute__((unused)); /*!< in: MySQL thread handle of the user for
|
||||
whom the transaction is being committed */
|
||||
|
||||
/** Get the list of foreign keys referencing a specified table
|
||||
table.
|
||||
@param thd The thread handle
|
||||
@ -4598,22 +4587,6 @@ innobase_purge_changed_page_bitmaps(
|
||||
return (my_bool)log_online_purge_changed_page_bitmaps(lsn);
|
||||
}
|
||||
|
||||
/*****************************************************************//**
|
||||
Check whether this is a fake change transaction.
|
||||
@return TRUE if a fake change transaction */
|
||||
static
|
||||
my_bool
|
||||
innobase_is_fake_change(
|
||||
/*====================*/
|
||||
handlerton *hton MY_ATTRIBUTE((unused)),
|
||||
/*!< in: InnoDB handlerton */
|
||||
THD* thd) /*!< in: MySQL thread handle of the user for
|
||||
whom the transaction is being committed */
|
||||
{
|
||||
trx_t* trx = check_trx_exists(thd);
|
||||
return UNIV_UNLIKELY(trx->fake_changes);
|
||||
}
|
||||
|
||||
/*****************************************************************//**
|
||||
Commits a transaction in an InnoDB database. */
|
||||
static
|
||||
@ -9140,8 +9113,8 @@ calc_row_difference(
|
||||
}
|
||||
}
|
||||
|
||||
if (o_len != n_len || (o_len != UNIV_SQL_NULL &&
|
||||
0 != memcmp(o_ptr, n_ptr, o_len))) {
|
||||
if (o_len != n_len || (o_len != 0 && o_len != UNIV_SQL_NULL
|
||||
&& 0 != memcmp(o_ptr, n_ptr, o_len))) {
|
||||
/* The field has changed */
|
||||
|
||||
ufield = uvect->fields + n_changed;
|
||||
@ -15071,7 +15044,8 @@ fill_foreign_key_list(THD* thd,
|
||||
{
|
||||
ut_ad(mutex_own(&dict_sys->mutex));
|
||||
|
||||
for (dict_foreign_set::iterator it = table->referenced_set.begin();
|
||||
for (dict_foreign_set::const_iterator it
|
||||
= table->referenced_set.begin();
|
||||
it != table->referenced_set.end(); ++it) {
|
||||
|
||||
dict_foreign_t* foreign = *it;
|
||||
|
@ -540,7 +540,7 @@ innobase_index_name_is_reserved(
|
||||
const KEY* key_info, /*!< in: Indexes to be created */
|
||||
ulint num_of_keys) /*!< in: Number of indexes to
|
||||
be created. */
|
||||
MY_ATTRIBUTE((nonnull, warn_unused_result));
|
||||
MY_ATTRIBUTE((nonnull(1), warn_unused_result));
|
||||
|
||||
/*****************************************************************//**
|
||||
#ifdef WITH_WSREP
|
||||
|
@ -2307,10 +2307,10 @@ online_retry_drop_indexes_with_trx(
|
||||
@param drop_fk constraints being dropped
|
||||
@param n_drop_fk number of constraints that are being dropped
|
||||
@return whether the constraint is being dropped */
|
||||
inline MY_ATTRIBUTE((pure, nonnull, warn_unused_result))
|
||||
MY_ATTRIBUTE((pure, nonnull(1), warn_unused_result))
|
||||
inline
|
||||
bool
|
||||
innobase_dropping_foreign(
|
||||
/*======================*/
|
||||
const dict_foreign_t* foreign,
|
||||
dict_foreign_t** drop_fk,
|
||||
ulint n_drop_fk)
|
||||
@ -2334,10 +2334,10 @@ column that is being dropped or modified to NOT NULL.
|
||||
@retval true Not allowed (will call my_error())
|
||||
@retval false Allowed
|
||||
*/
|
||||
static MY_ATTRIBUTE((pure, nonnull, warn_unused_result))
|
||||
MY_ATTRIBUTE((pure, nonnull(1,4), warn_unused_result))
|
||||
static
|
||||
bool
|
||||
innobase_check_foreigns_low(
|
||||
/*========================*/
|
||||
const dict_table_t* user_table,
|
||||
dict_foreign_t** drop_fk,
|
||||
ulint n_drop_fk,
|
||||
@ -2434,10 +2434,10 @@ column that is being dropped or modified to NOT NULL.
|
||||
@retval true Not allowed (will call my_error())
|
||||
@retval false Allowed
|
||||
*/
|
||||
static MY_ATTRIBUTE((pure, nonnull, warn_unused_result))
|
||||
MY_ATTRIBUTE((pure, nonnull(1,2,3,4), warn_unused_result))
|
||||
static
|
||||
bool
|
||||
innobase_check_foreigns(
|
||||
/*====================*/
|
||||
Alter_inplace_info* ha_alter_info,
|
||||
const TABLE* altered_table,
|
||||
const TABLE* old_table,
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 2007, 2016, Oracle and/or its affiliates.
|
||||
Copyrigth (c) 2014, 2017, MariaDB Corporation
|
||||
Copyright (c) 2007, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2014, 2017, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -2966,14 +2966,16 @@ i_s_fts_deleted_generic_fill(
|
||||
|
||||
fields = table->field;
|
||||
|
||||
int ret = 0;
|
||||
|
||||
for (ulint j = 0; j < ib_vector_size(deleted->doc_ids); ++j) {
|
||||
doc_id_t doc_id;
|
||||
|
||||
doc_id = *(doc_id_t*) ib_vector_get_const(deleted->doc_ids, j);
|
||||
|
||||
OK(fields[I_S_FTS_DOC_ID]->store((longlong) doc_id, true));
|
||||
BREAK_IF(ret = fields[I_S_FTS_DOC_ID]->store(doc_id, true));
|
||||
|
||||
OK(schema_table_store_record(thd, table));
|
||||
BREAK_IF(ret = schema_table_store_record(thd, table));
|
||||
}
|
||||
|
||||
trx_free_for_background(trx);
|
||||
@ -2984,7 +2986,7 @@ i_s_fts_deleted_generic_fill(
|
||||
|
||||
rw_lock_s_unlock(&dict_operation_lock);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
||||
/*******************************************************************//**
|
||||
@ -3222,13 +3224,13 @@ i_s_fts_index_cache_fill_one_index(
|
||||
/*===============================*/
|
||||
fts_index_cache_t* index_cache, /*!< in: FTS index cache */
|
||||
THD* thd, /*!< in: thread */
|
||||
fts_string_t* conv_str, /*!< in/out: buffer */
|
||||
TABLE_LIST* tables) /*!< in/out: tables to fill */
|
||||
{
|
||||
TABLE* table = (TABLE*) tables->table;
|
||||
Field** fields;
|
||||
CHARSET_INFO* index_charset;
|
||||
const ib_rbt_node_t* rbt_node;
|
||||
fts_string_t conv_str;
|
||||
uint dummy_errors;
|
||||
char* word_str;
|
||||
|
||||
@ -3237,10 +3239,9 @@ i_s_fts_index_cache_fill_one_index(
|
||||
fields = table->field;
|
||||
|
||||
index_charset = index_cache->charset;
|
||||
conv_str.f_len = system_charset_info->mbmaxlen
|
||||
* FTS_MAX_WORD_LEN_IN_CHAR;
|
||||
conv_str.f_str = static_cast<byte*>(ut_malloc(conv_str.f_len));
|
||||
conv_str.f_n_char = 0;
|
||||
conv_str->f_n_char = 0;
|
||||
|
||||
int ret = 0;
|
||||
|
||||
/* Go through each word in the index cache */
|
||||
for (rbt_node = rbt_first(index_cache->words);
|
||||
@ -3252,16 +3253,16 @@ i_s_fts_index_cache_fill_one_index(
|
||||
|
||||
/* Convert word from index charset to system_charset_info */
|
||||
if (index_charset->cset != system_charset_info->cset) {
|
||||
conv_str.f_n_char = my_convert(
|
||||
reinterpret_cast<char*>(conv_str.f_str),
|
||||
static_cast<uint32>(conv_str.f_len),
|
||||
conv_str->f_n_char = my_convert(
|
||||
reinterpret_cast<char*>(conv_str->f_str),
|
||||
static_cast<uint32>(conv_str->f_len),
|
||||
system_charset_info,
|
||||
reinterpret_cast<char*>(word->text.f_str),
|
||||
static_cast<uint32>(word->text.f_len),
|
||||
index_charset, &dummy_errors);
|
||||
ut_ad(conv_str.f_n_char <= conv_str.f_len);
|
||||
conv_str.f_str[conv_str.f_n_char] = 0;
|
||||
word_str = reinterpret_cast<char*>(conv_str.f_str);
|
||||
ut_ad(conv_str->f_n_char <= conv_str->f_len);
|
||||
conv_str->f_str[conv_str->f_n_char] = 0;
|
||||
word_str = reinterpret_cast<char*>(conv_str->f_str);
|
||||
} else {
|
||||
word_str = reinterpret_cast<char*>(word->text.f_str);
|
||||
}
|
||||
@ -3319,9 +3320,7 @@ i_s_fts_index_cache_fill_one_index(
|
||||
}
|
||||
}
|
||||
|
||||
ut_free(conv_str.f_str);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
/*******************************************************************//**
|
||||
Fill the dynamic table INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHED
|
||||
@ -3365,18 +3364,27 @@ i_s_fts_index_cache_fill(
|
||||
|
||||
ut_a(cache);
|
||||
|
||||
int ret = 0;
|
||||
fts_string_t conv_str;
|
||||
conv_str.f_len = system_charset_info->mbmaxlen
|
||||
* FTS_MAX_WORD_LEN_IN_CHAR;
|
||||
conv_str.f_str = static_cast<byte*>(ut_malloc(conv_str.f_len));
|
||||
|
||||
for (ulint i = 0; i < ib_vector_size(cache->indexes); i++) {
|
||||
fts_index_cache_t* index_cache;
|
||||
|
||||
index_cache = static_cast<fts_index_cache_t*> (
|
||||
ib_vector_get(cache->indexes, i));
|
||||
|
||||
i_s_fts_index_cache_fill_one_index(index_cache, thd, tables);
|
||||
BREAK_IF(ret = i_s_fts_index_cache_fill_one_index(
|
||||
index_cache, thd, &conv_str, tables));
|
||||
}
|
||||
|
||||
ut_free(conv_str.f_str);
|
||||
|
||||
dict_table_close(user_table, FALSE, FALSE);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
||||
/*******************************************************************//**
|
||||
@ -3679,8 +3687,6 @@ i_s_fts_index_table_fill_one_fetch(
|
||||
}
|
||||
}
|
||||
|
||||
i_s_fts_index_table_free_one_fetch(words);
|
||||
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
||||
@ -3694,13 +3700,13 @@ i_s_fts_index_table_fill_one_index(
|
||||
/*===============================*/
|
||||
dict_index_t* index, /*!< in: FTS index */
|
||||
THD* thd, /*!< in: thread */
|
||||
fts_string_t* conv_str, /*!< in/out: buffer */
|
||||
TABLE_LIST* tables) /*!< in/out: tables to fill */
|
||||
{
|
||||
ib_vector_t* words;
|
||||
mem_heap_t* heap;
|
||||
fts_string_t word;
|
||||
CHARSET_INFO* index_charset;
|
||||
fts_string_t conv_str;
|
||||
dberr_t error;
|
||||
int ret = 0;
|
||||
|
||||
@ -3717,10 +3723,6 @@ i_s_fts_index_table_fill_one_index(
|
||||
word.f_n_char = 0;
|
||||
|
||||
index_charset = fts_index_get_charset(index);
|
||||
conv_str.f_len = system_charset_info->mbmaxlen
|
||||
* FTS_MAX_WORD_LEN_IN_CHAR;
|
||||
conv_str.f_str = static_cast<byte*>(ut_malloc(conv_str.f_len));
|
||||
conv_str.f_n_char = 0;
|
||||
|
||||
/* Iterate through each auxiliary table as described in
|
||||
fts_index_selector */
|
||||
@ -3754,17 +3756,17 @@ i_s_fts_index_table_fill_one_index(
|
||||
|
||||
/* Fill into tables */
|
||||
ret = i_s_fts_index_table_fill_one_fetch(
|
||||
index_charset, thd, tables, words, &conv_str, has_more);
|
||||
index_charset, thd, tables, words, conv_str,
|
||||
has_more);
|
||||
i_s_fts_index_table_free_one_fetch(words);
|
||||
|
||||
if (ret != 0) {
|
||||
i_s_fts_index_table_free_one_fetch(words);
|
||||
goto func_exit;
|
||||
}
|
||||
} while (has_more);
|
||||
}
|
||||
|
||||
func_exit:
|
||||
ut_free(conv_str.f_str);
|
||||
mem_heap_free(heap);
|
||||
|
||||
DBUG_RETURN(ret);
|
||||
@ -3806,10 +3808,17 @@ i_s_fts_index_table_fill(
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
int ret = 0;
|
||||
fts_string_t conv_str;
|
||||
conv_str.f_len = system_charset_info->mbmaxlen
|
||||
* FTS_MAX_WORD_LEN_IN_CHAR;
|
||||
conv_str.f_str = static_cast<byte*>(ut_malloc(conv_str.f_len));
|
||||
|
||||
for (index = dict_table_get_first_index(user_table);
|
||||
index; index = dict_table_get_next_index(index)) {
|
||||
if (index->type & DICT_FTS) {
|
||||
i_s_fts_index_table_fill_one_index(index, thd, tables);
|
||||
BREAK_IF(ret = i_s_fts_index_table_fill_one_index(
|
||||
index, thd, &conv_str, tables));
|
||||
}
|
||||
}
|
||||
|
||||
@ -3817,7 +3826,9 @@ i_s_fts_index_table_fill(
|
||||
|
||||
rw_lock_s_unlock(&dict_operation_lock);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
ut_free(conv_str.f_str);
|
||||
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
||||
/*******************************************************************//**
|
||||
@ -3982,6 +3993,8 @@ i_s_fts_config_fill(
|
||||
DBUG_ASSERT(!dict_index_is_online_ddl(index));
|
||||
}
|
||||
|
||||
int ret = 0;
|
||||
|
||||
while (fts_config_key[i]) {
|
||||
fts_string_t value;
|
||||
char* key_name;
|
||||
@ -4006,13 +4019,14 @@ i_s_fts_config_fill(
|
||||
ut_free(key_name);
|
||||
}
|
||||
|
||||
OK(field_store_string(
|
||||
fields[FTS_CONFIG_KEY], fts_config_key[i]));
|
||||
BREAK_IF(ret = field_store_string(
|
||||
fields[FTS_CONFIG_KEY], fts_config_key[i]));
|
||||
|
||||
OK(field_store_string(
|
||||
fields[FTS_CONFIG_VALUE], (const char*) value.f_str));
|
||||
BREAK_IF(ret = field_store_string(
|
||||
fields[FTS_CONFIG_VALUE],
|
||||
reinterpret_cast<const char*>(value.f_str)));
|
||||
|
||||
OK(schema_table_store_record(thd, table));
|
||||
BREAK_IF(ret = schema_table_store_record(thd, table));
|
||||
|
||||
i++;
|
||||
}
|
||||
@ -4025,7 +4039,7 @@ i_s_fts_config_fill(
|
||||
|
||||
rw_lock_s_unlock(&dict_operation_lock);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
||||
/*******************************************************************//**
|
||||
@ -4864,34 +4878,29 @@ i_s_innodb_buffer_page_fill(
|
||||
state_str = NULL;
|
||||
|
||||
OK(fields[IDX_BUFFER_POOL_ID]->store(
|
||||
static_cast<double>(page_info->pool_id)));
|
||||
page_info->pool_id, true));
|
||||
|
||||
OK(fields[IDX_BUFFER_BLOCK_ID]->store(
|
||||
static_cast<double>(page_info->block_id)));
|
||||
page_info->block_id, true));
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_SPACE]->store(
|
||||
static_cast<double>(page_info->space_id)));
|
||||
page_info->space_id, true));
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_NUM]->store(
|
||||
static_cast<double>(page_info->page_num)));
|
||||
page_info->page_num, true));
|
||||
|
||||
OK(field_store_string(
|
||||
fields[IDX_BUFFER_PAGE_TYPE],
|
||||
i_s_page_type[page_info->page_type].type_str));
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_FLUSH_TYPE]->store(
|
||||
page_info->flush_type));
|
||||
page_info->flush_type, true));
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_FIX_COUNT]->store(
|
||||
page_info->fix_count));
|
||||
page_info->fix_count, true));
|
||||
|
||||
if (page_info->hashed) {
|
||||
OK(field_store_string(
|
||||
fields[IDX_BUFFER_PAGE_HASHED], "YES"));
|
||||
} else {
|
||||
OK(field_store_string(
|
||||
fields[IDX_BUFFER_PAGE_HASHED], "NO"));
|
||||
}
|
||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_HASHED],
|
||||
page_info->hashed ? "YES" : "NO"));
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_NEWEST_MOD]->store(
|
||||
(longlong) page_info->newest_mod, true));
|
||||
@ -4900,7 +4909,7 @@ i_s_innodb_buffer_page_fill(
|
||||
(longlong) page_info->oldest_mod, true));
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_ACCESS_TIME]->store(
|
||||
page_info->access_time));
|
||||
page_info->access_time, true));
|
||||
|
||||
fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_null();
|
||||
|
||||
@ -4909,44 +4918,48 @@ i_s_innodb_buffer_page_fill(
|
||||
/* If this is an index page, fetch the index name
|
||||
and table name */
|
||||
if (page_info->page_type == I_S_PAGE_TYPE_INDEX) {
|
||||
const dict_index_t* index;
|
||||
bool ret = false;
|
||||
|
||||
mutex_enter(&dict_sys->mutex);
|
||||
index = dict_index_get_if_in_cache_low(
|
||||
page_info->index_id);
|
||||
|
||||
if (index) {
|
||||
|
||||
if (const dict_index_t* index =
|
||||
dict_index_get_if_in_cache_low(
|
||||
page_info->index_id)) {
|
||||
table_name_end = innobase_convert_name(
|
||||
table_name, sizeof(table_name),
|
||||
index->table_name,
|
||||
strlen(index->table_name),
|
||||
thd, TRUE);
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_TABLE_NAME]->store(
|
||||
table_name,
|
||||
static_cast<uint>(table_name_end - table_name),
|
||||
system_charset_info));
|
||||
fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_notnull();
|
||||
|
||||
OK(field_store_index_name(
|
||||
fields[IDX_BUFFER_PAGE_INDEX_NAME],
|
||||
index->name));
|
||||
ret = fields[IDX_BUFFER_PAGE_TABLE_NAME]
|
||||
->store(table_name,
|
||||
static_cast<uint>(
|
||||
table_name_end
|
||||
- table_name),
|
||||
system_charset_info)
|
||||
|| field_store_index_name(
|
||||
fields
|
||||
[IDX_BUFFER_PAGE_INDEX_NAME],
|
||||
index->name);
|
||||
}
|
||||
|
||||
mutex_exit(&dict_sys->mutex);
|
||||
|
||||
OK(ret);
|
||||
|
||||
fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_notnull();
|
||||
}
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_NUM_RECS]->store(
|
||||
page_info->num_recs));
|
||||
page_info->num_recs, true));
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_DATA_SIZE]->store(
|
||||
page_info->data_size));
|
||||
page_info->data_size, true));
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_ZIP_SIZE]->store(
|
||||
page_info->zip_ssize
|
||||
? (UNIV_ZIP_SIZE_MIN >> 1) << page_info->zip_ssize
|
||||
: 0));
|
||||
page_info->zip_ssize
|
||||
? (UNIV_ZIP_SIZE_MIN >> 1) << page_info->zip_ssize
|
||||
: 0, true));
|
||||
|
||||
#if BUF_PAGE_STATE_BITS > 3
|
||||
# error "BUF_PAGE_STATE_BITS > 3, please ensure that all 1<<BUF_PAGE_STATE_BITS values are checked for"
|
||||
@ -4984,32 +4997,29 @@ i_s_innodb_buffer_page_fill(
|
||||
|
||||
switch (page_info->io_fix) {
|
||||
case BUF_IO_NONE:
|
||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
||||
"IO_NONE"));
|
||||
state_str = "IO_NONE";
|
||||
break;
|
||||
case BUF_IO_READ:
|
||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
||||
"IO_READ"));
|
||||
state_str = "IO_READ";
|
||||
break;
|
||||
case BUF_IO_WRITE:
|
||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
||||
"IO_WRITE"));
|
||||
state_str = "IO_WRITE";
|
||||
break;
|
||||
case BUF_IO_PIN:
|
||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
||||
"IO_PIN"));
|
||||
state_str = "IO_PIN";
|
||||
break;
|
||||
}
|
||||
|
||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
||||
state_str));
|
||||
|
||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IS_OLD],
|
||||
(page_info->is_old) ? "YES" : "NO"));
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_FREE_CLOCK]->store(
|
||||
page_info->freed_page_clock));
|
||||
|
||||
if (schema_table_store_record(thd, table)) {
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
OK(schema_table_store_record(thd, table));
|
||||
}
|
||||
|
||||
DBUG_RETURN(0);
|
||||
@ -5550,17 +5560,10 @@ i_s_innodb_buf_page_lru_fill(
|
||||
ulint num_page) /*!< in: number of page info
|
||||
cached */
|
||||
{
|
||||
TABLE* table;
|
||||
Field** fields;
|
||||
mem_heap_t* heap;
|
||||
|
||||
DBUG_ENTER("i_s_innodb_buf_page_lru_fill");
|
||||
|
||||
table = tables->table;
|
||||
|
||||
fields = table->field;
|
||||
|
||||
heap = mem_heap_create(1000);
|
||||
TABLE* table = tables->table;
|
||||
Field** fields = table->field;
|
||||
|
||||
/* Iterate through the cached array and fill the I_S table rows */
|
||||
for (ulint i = 0; i < num_page; i++) {
|
||||
@ -5575,43 +5578,37 @@ i_s_innodb_buf_page_lru_fill(
|
||||
page_info = info_array + i;
|
||||
|
||||
OK(fields[IDX_BUF_LRU_POOL_ID]->store(
|
||||
static_cast<double>(page_info->pool_id)));
|
||||
|
||||
page_info->pool_id, true));
|
||||
OK(fields[IDX_BUF_LRU_POS]->store(
|
||||
static_cast<double>(page_info->block_id)));
|
||||
page_info->block_id, true));
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_SPACE]->store(
|
||||
static_cast<double>(page_info->space_id)));
|
||||
page_info->space_id, true));
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_NUM]->store(
|
||||
static_cast<double>(page_info->page_num)));
|
||||
page_info->page_num, true));
|
||||
|
||||
OK(field_store_string(
|
||||
fields[IDX_BUF_LRU_PAGE_TYPE],
|
||||
i_s_page_type[page_info->page_type].type_str));
|
||||
fields[IDX_BUF_LRU_PAGE_TYPE],
|
||||
i_s_page_type[page_info->page_type].type_str));
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_FLUSH_TYPE]->store(
|
||||
static_cast<double>(page_info->flush_type)));
|
||||
page_info->flush_type, true));
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_FIX_COUNT]->store(
|
||||
static_cast<double>(page_info->fix_count)));
|
||||
page_info->fix_count, true));
|
||||
|
||||
if (page_info->hashed) {
|
||||
OK(field_store_string(
|
||||
fields[IDX_BUF_LRU_PAGE_HASHED], "YES"));
|
||||
} else {
|
||||
OK(field_store_string(
|
||||
fields[IDX_BUF_LRU_PAGE_HASHED], "NO"));
|
||||
}
|
||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_HASHED],
|
||||
page_info->hashed ? "YES" : "NO"));
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_NEWEST_MOD]->store(
|
||||
page_info->newest_mod, true));
|
||||
page_info->newest_mod, true));
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_OLDEST_MOD]->store(
|
||||
page_info->oldest_mod, true));
|
||||
page_info->oldest_mod, true));
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_ACCESS_TIME]->store(
|
||||
page_info->access_time));
|
||||
page_info->access_time, true));
|
||||
|
||||
fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_null();
|
||||
|
||||
@ -5620,43 +5617,47 @@ i_s_innodb_buf_page_lru_fill(
|
||||
/* If this is an index page, fetch the index name
|
||||
and table name */
|
||||
if (page_info->page_type == I_S_PAGE_TYPE_INDEX) {
|
||||
const dict_index_t* index;
|
||||
bool ret = false;
|
||||
|
||||
mutex_enter(&dict_sys->mutex);
|
||||
index = dict_index_get_if_in_cache_low(
|
||||
page_info->index_id);
|
||||
|
||||
if (index) {
|
||||
|
||||
if (const dict_index_t* index =
|
||||
dict_index_get_if_in_cache_low(
|
||||
page_info->index_id)) {
|
||||
table_name_end = innobase_convert_name(
|
||||
table_name, sizeof(table_name),
|
||||
index->table_name,
|
||||
strlen(index->table_name),
|
||||
thd, TRUE);
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->store(
|
||||
table_name,
|
||||
static_cast<uint>(table_name_end - table_name),
|
||||
system_charset_info));
|
||||
fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_notnull();
|
||||
|
||||
OK(field_store_index_name(
|
||||
fields[IDX_BUF_LRU_PAGE_INDEX_NAME],
|
||||
index->name));
|
||||
ret = fields[IDX_BUF_LRU_PAGE_TABLE_NAME]
|
||||
->store(table_name,
|
||||
static_cast<uint>(
|
||||
table_name_end
|
||||
- table_name),
|
||||
system_charset_info)
|
||||
|| field_store_index_name(
|
||||
fields
|
||||
[IDX_BUF_LRU_PAGE_INDEX_NAME],
|
||||
index->name);
|
||||
}
|
||||
|
||||
mutex_exit(&dict_sys->mutex);
|
||||
|
||||
OK(ret);
|
||||
|
||||
fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_notnull();
|
||||
}
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_NUM_RECS]->store(
|
||||
page_info->num_recs));
|
||||
page_info->num_recs, true));
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_DATA_SIZE]->store(
|
||||
page_info->data_size));
|
||||
page_info->data_size, true));
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_ZIP_SIZE]->store(
|
||||
page_info->zip_ssize ?
|
||||
512 << page_info->zip_ssize : 0));
|
||||
page_info->zip_ssize
|
||||
? 512 << page_info->zip_ssize : 0, true));
|
||||
|
||||
state = static_cast<enum buf_page_state>(page_info->page_state);
|
||||
|
||||
@ -5685,35 +5686,31 @@ i_s_innodb_buf_page_lru_fill(
|
||||
|
||||
switch (page_info->io_fix) {
|
||||
case BUF_IO_NONE:
|
||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX],
|
||||
"IO_NONE"));
|
||||
state_str = "IO_NONE";
|
||||
break;
|
||||
case BUF_IO_READ:
|
||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX],
|
||||
"IO_READ"));
|
||||
state_str = "IO_READ";
|
||||
break;
|
||||
case BUF_IO_WRITE:
|
||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX],
|
||||
"IO_WRITE"));
|
||||
state_str = "IO_WRITE";
|
||||
break;
|
||||
case BUF_IO_PIN:
|
||||
state_str = "IO_PIN";
|
||||
break;
|
||||
}
|
||||
|
||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX],
|
||||
state_str));
|
||||
|
||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IS_OLD],
|
||||
(page_info->is_old) ? "YES" : "NO"));
|
||||
page_info->is_old ? "YES" : "NO"));
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_FREE_CLOCK]->store(
|
||||
page_info->freed_page_clock));
|
||||
page_info->freed_page_clock, true));
|
||||
|
||||
if (schema_table_store_record(thd, table)) {
|
||||
mem_heap_free(heap);
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
mem_heap_empty(heap);
|
||||
OK(schema_table_store_record(thd, table));
|
||||
}
|
||||
|
||||
mem_heap_free(heap);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 2007, 2013, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyrigth (c) 2014, 2015, MariaDB Corporation
|
||||
Copyrigth (c) 2014, 2017, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -77,6 +77,8 @@ extern struct st_mysql_plugin i_s_innodb_changed_page_bitmaps;
|
||||
DBUG_RETURN(1); \
|
||||
}
|
||||
|
||||
#define BREAK_IF(expr) if ((expr)) break
|
||||
|
||||
#define RETURN_IF_INNODB_NOT_STARTED(plugin_name) \
|
||||
do { \
|
||||
if (!srv_was_started) { \
|
||||
|
@ -2963,8 +2963,7 @@ ibuf_get_volume_buffered_hash(
|
||||
fold = ut_fold_binary(data, len);
|
||||
|
||||
hash += (fold / (CHAR_BIT * sizeof *hash)) % size;
|
||||
bitmask = static_cast<ulint>(
|
||||
1 << (fold % (CHAR_BIT * sizeof(*hash))));
|
||||
bitmask = static_cast<ulint>(1) << (fold % (CHAR_BIT * sizeof(*hash)));
|
||||
|
||||
if (*hash & bitmask) {
|
||||
|
||||
@ -3733,7 +3732,7 @@ fail_exit:
|
||||
|
||||
if (mode == BTR_MODIFY_PREV) {
|
||||
err = btr_cur_optimistic_insert(
|
||||
BTR_NO_LOCKING_FLAG,
|
||||
BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG,
|
||||
cursor, &offsets, &offsets_heap,
|
||||
ibuf_entry, &ins_rec,
|
||||
&dummy_big_rec, 0, thr, &mtr);
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2017, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -220,15 +221,17 @@ btr_cur_optimistic_insert(
|
||||
btr_cur_t* cursor, /*!< in: cursor on page after which to insert;
|
||||
cursor stays valid */
|
||||
ulint** offsets,/*!< out: offsets on *rec */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap */
|
||||
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||
rec_t** rec, /*!< out: pointer to inserted record if
|
||||
succeed */
|
||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||
be stored externally by the caller, or
|
||||
NULL */
|
||||
be stored externally by the caller */
|
||||
ulint n_ext, /*!< in: number of externally stored columns */
|
||||
que_thr_t* thr, /*!< in: query thread or NULL */
|
||||
que_thr_t* thr, /*!< in/out: query thread; can be NULL if
|
||||
!(~flags
|
||||
& (BTR_NO_LOCKING_FLAG
|
||||
| BTR_NO_UNDO_LOG_FLAG)) */
|
||||
mtr_t* mtr) /*!< in/out: mini-transaction;
|
||||
if this function returns DB_SUCCESS on
|
||||
a leaf page of a secondary index in a
|
||||
@ -256,15 +259,17 @@ btr_cur_pessimistic_insert(
|
||||
cursor stays valid */
|
||||
ulint** offsets,/*!< out: offsets on *rec */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap
|
||||
that can be emptied, or NULL */
|
||||
that can be emptied */
|
||||
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||
rec_t** rec, /*!< out: pointer to inserted record if
|
||||
succeed */
|
||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||
be stored externally by the caller, or
|
||||
NULL */
|
||||
be stored externally by the caller */
|
||||
ulint n_ext, /*!< in: number of externally stored columns */
|
||||
que_thr_t* thr, /*!< in: query thread or NULL */
|
||||
que_thr_t* thr, /*!< in/out: query thread; can be NULL if
|
||||
!(~flags
|
||||
& (BTR_NO_LOCKING_FLAG
|
||||
| BTR_NO_UNDO_LOG_FLAG)) */
|
||||
mtr_t* mtr) /*!< in/out: mini-transaction */
|
||||
MY_ATTRIBUTE((nonnull(2,3,4,5,6,7,10), warn_unused_result));
|
||||
/*************************************************************//**
|
||||
@ -392,12 +397,12 @@ btr_cur_pessimistic_update(
|
||||
ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */
|
||||
mem_heap_t** offsets_heap,
|
||||
/*!< in/out: pointer to memory heap
|
||||
that can be emptied, or NULL */
|
||||
that can be emptied */
|
||||
mem_heap_t* entry_heap,
|
||||
/*!< in/out: memory heap for allocating
|
||||
big_rec and the index tuple */
|
||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||
be stored externally by the caller, or NULL */
|
||||
be stored externally by the caller */
|
||||
const upd_t* update, /*!< in: update vector; this is allowed also
|
||||
contain trx id and roll ptr fields, but
|
||||
the values in update vector have no effect */
|
||||
|
@ -1006,7 +1006,7 @@ fil_create_new_single_table_tablespace(
|
||||
must be >= FIL_IBD_FILE_INITIAL_SIZE */
|
||||
fil_encryption_t mode, /*!< in: encryption mode */
|
||||
ulint key_id) /*!< in: encryption key_id */
|
||||
__attribute__((nonnull, warn_unused_result));
|
||||
MY_ATTRIBUTE((nonnull(2), warn_unused_result));
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
/** Try to adjust FSP_SPACE_FLAGS if they differ from the expectations.
|
||||
(Typically when upgrading from MariaDB 10.1.0..10.1.20.)
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 2006, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2017, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -143,7 +144,7 @@ enum durability_properties
|
||||
thd_requested_durability(
|
||||
/*=====================*/
|
||||
const THD* thd) /*!< in: thread handle */
|
||||
MY_ATTRIBUTE((nonnull, warn_unused_result));
|
||||
MY_ATTRIBUTE((warn_unused_result));
|
||||
|
||||
/******************************************************************//**
|
||||
Returns true if the transaction this thread is processing has edited
|
||||
|
@ -960,7 +960,14 @@ struct MY_ALIGNED(CACHE_LINE_SIZE) simple_counter
|
||||
{
|
||||
compile_time_assert(!atomic || sizeof(Type) == sizeof(ulint));
|
||||
if (atomic) {
|
||||
return os_atomic_increment_ulint(&m_counter, i);
|
||||
/* GCC would perform a type check in this code
|
||||
also in case the template is instantiated with
|
||||
simple_counter<Type=not_ulint, atomic=false>.
|
||||
On Solaris, os_atomic_increment_ulint() maps
|
||||
to atomic_add_long_nv(), which expects the
|
||||
parameter to be correctly typed. */
|
||||
return os_atomic_increment_ulint(
|
||||
reinterpret_cast<ulint*>(&m_counter), i);
|
||||
} else {
|
||||
return m_counter += i;
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
Copyright (c) 2005, 2013, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2012, Facebook Inc.
|
||||
Copyright (c) 2017, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -172,7 +173,8 @@ page_zip_rec_needs_ext(
|
||||
ignored if zip_size == 0 */
|
||||
ulint zip_size) /*!< in: compressed page size in bytes, or 0 */
|
||||
{
|
||||
ut_ad(rec_size > comp ? REC_N_NEW_EXTRA_BYTES : REC_N_OLD_EXTRA_BYTES);
|
||||
ut_ad(rec_size
|
||||
> (comp ? REC_N_NEW_EXTRA_BYTES : REC_N_OLD_EXTRA_BYTES));
|
||||
ut_ad(ut_is_2pow(zip_size));
|
||||
ut_ad(comp || !zip_size);
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2017, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -212,10 +213,6 @@ UNIV_INTERN
|
||||
dberr_t
|
||||
trx_undo_report_row_operation(
|
||||
/*==========================*/
|
||||
ulint flags, /*!< in: if BTR_NO_UNDO_LOG_FLAG bit is
|
||||
set, does nothing */
|
||||
ulint op_type, /*!< in: TRX_UNDO_INSERT_OP or
|
||||
TRX_UNDO_MODIFY_OP */
|
||||
que_thr_t* thr, /*!< in: query thread */
|
||||
dict_index_t* index, /*!< in: clustered index */
|
||||
const dtuple_t* clust_entry, /*!< in: in the case of an insert,
|
||||
@ -233,7 +230,7 @@ trx_undo_report_row_operation(
|
||||
inserted undo log record,
|
||||
0 if BTR_NO_UNDO_LOG
|
||||
flag was specified */
|
||||
MY_ATTRIBUTE((nonnull(3,4,10), warn_unused_result));
|
||||
MY_ATTRIBUTE((nonnull(1,2,8), warn_unused_result));
|
||||
/******************************************************************//**
|
||||
Copies an undo record to heap. This function can be called if we know that
|
||||
the undo log record exists.
|
||||
@ -313,10 +310,6 @@ record */
|
||||
storage fields: used by purge to
|
||||
free the external storage */
|
||||
|
||||
/* Operation type flags used in trx_undo_report_row_operation */
|
||||
#define TRX_UNDO_INSERT_OP 1
|
||||
#define TRX_UNDO_MODIFY_OP 2
|
||||
|
||||
#ifndef UNIV_NONINL
|
||||
#include "trx0rec.ic"
|
||||
#endif
|
||||
|
@ -1293,8 +1293,10 @@ rec_convert_dtuple_to_rec_comp(
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(end, dfield_get_data(field), len);
|
||||
end += len;
|
||||
if (len) {
|
||||
memcpy(end, dfield_get_data(field), len);
|
||||
end += len;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -249,9 +249,6 @@ row_fts_psort_info_init(
|
||||
each parallel sort thread. Each "sort bucket" holds records for
|
||||
a particular "FTS index partition" */
|
||||
for (j = 0; j < fts_sort_pll_degree; j++) {
|
||||
|
||||
UT_LIST_INIT(psort_info[j].fts_doc_list);
|
||||
|
||||
for (i = 0; i < FTS_NUM_AUX_INDEX; i++) {
|
||||
|
||||
psort_info[j].merge_file[i] =
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2017, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -2166,14 +2167,10 @@ for a clustered index!
|
||||
@retval DB_SUCCESS if no error
|
||||
@retval DB_DUPLICATE_KEY if error,
|
||||
@retval DB_LOCK_WAIT if we have to wait for a lock on a possible duplicate
|
||||
record
|
||||
@retval DB_SUCCESS_LOCKED_REC if an exact match of the record was found
|
||||
in online table rebuild (flags & (BTR_KEEP_SYS_FLAG | BTR_NO_LOCKING_FLAG)) */
|
||||
record */
|
||||
static MY_ATTRIBUTE((nonnull, warn_unused_result))
|
||||
dberr_t
|
||||
row_ins_duplicate_error_in_clust(
|
||||
/*=============================*/
|
||||
ulint flags, /*!< in: undo logging and locking flags */
|
||||
btr_cur_t* cursor, /*!< in: B-tree cursor */
|
||||
const dtuple_t* entry, /*!< in: entry to insert */
|
||||
que_thr_t* thr, /*!< in: query thread */
|
||||
@ -2454,7 +2451,7 @@ row_ins_clust_index_entry_low(
|
||||
DB_LOCK_WAIT */
|
||||
|
||||
err = row_ins_duplicate_error_in_clust(
|
||||
flags, &cursor, entry, thr, &mtr);
|
||||
&cursor, entry, thr, &mtr);
|
||||
}
|
||||
|
||||
if (err != DB_SUCCESS) {
|
||||
|
@ -450,7 +450,7 @@ UNIV_INTERN my_bool srv_cleaner_thread_priority = FALSE;
|
||||
UNIV_INTERN my_bool srv_master_thread_priority = FALSE;
|
||||
|
||||
/* The number of purge threads to use.*/
|
||||
UNIV_INTERN ulong srv_n_purge_threads = 1;
|
||||
UNIV_INTERN ulong srv_n_purge_threads;
|
||||
|
||||
/* the number of pages to purge in one batch */
|
||||
UNIV_INTERN ulong srv_purge_batch_size = 20;
|
||||
@ -694,16 +694,16 @@ UNIV_INTERN ulong srv_buf_dump_status_frequency = 0;
|
||||
|
||||
/** Acquire the system_mutex. */
|
||||
#define srv_sys_mutex_enter() do { \
|
||||
mutex_enter(&srv_sys->mutex); \
|
||||
mutex_enter(&srv_sys.mutex); \
|
||||
} while (0)
|
||||
|
||||
/** Test if the system mutex is owned. */
|
||||
#define srv_sys_mutex_own() (mutex_own(&srv_sys->mutex) \
|
||||
#define srv_sys_mutex_own() (mutex_own(&srv_sys.mutex) \
|
||||
&& !srv_read_only_mode)
|
||||
|
||||
/** Release the system mutex. */
|
||||
#define srv_sys_mutex_exit() do { \
|
||||
mutex_exit(&srv_sys->mutex); \
|
||||
mutex_exit(&srv_sys.mutex); \
|
||||
} while (0)
|
||||
|
||||
#define fetch_lock_wait_timeout(trx) \
|
||||
@ -798,7 +798,7 @@ struct srv_sys_t{
|
||||
ulint n_sys_threads; /*!< size of the sys_threads
|
||||
array */
|
||||
|
||||
srv_slot_t* sys_threads; /*!< server thread table;
|
||||
srv_slot_t sys_threads[32 + 1]; /*!< server thread table;
|
||||
os_event_set() and
|
||||
os_event_reset() on
|
||||
sys_threads[]->event are
|
||||
@ -822,7 +822,7 @@ struct srv_sys_t{
|
||||
UNIV_INTERN ib_mutex_t server_mutex;
|
||||
#endif /* !HAVE_ATOMIC_BUILTINS */
|
||||
|
||||
static srv_sys_t* srv_sys = NULL;
|
||||
static srv_sys_t srv_sys;
|
||||
|
||||
/** Event to signal srv_monitor_thread. Not protected by a mutex.
|
||||
Set after setting srv_print_innodb_monitor. */
|
||||
@ -844,10 +844,10 @@ and/or load it during startup. */
|
||||
UNIV_INTERN char srv_buffer_pool_dump_at_shutdown = FALSE;
|
||||
UNIV_INTERN char srv_buffer_pool_load_at_startup = FALSE;
|
||||
|
||||
/** Slot index in the srv_sys->sys_threads array for the purge thread. */
|
||||
/** Slot index in the srv_sys.sys_threads array for the purge thread. */
|
||||
static const ulint SRV_PURGE_SLOT = 1;
|
||||
|
||||
/** Slot index in the srv_sys->sys_threads array for the master thread. */
|
||||
/** Slot index in the srv_sys.sys_threads array for the master thread. */
|
||||
static const ulint SRV_MASTER_SLOT = 0;
|
||||
|
||||
UNIV_INTERN os_event_t srv_checkpoint_completed_event;
|
||||
@ -957,21 +957,21 @@ srv_reserve_slot(
|
||||
|
||||
switch (type) {
|
||||
case SRV_MASTER:
|
||||
slot = &srv_sys->sys_threads[SRV_MASTER_SLOT];
|
||||
slot = &srv_sys.sys_threads[SRV_MASTER_SLOT];
|
||||
break;
|
||||
|
||||
case SRV_PURGE:
|
||||
slot = &srv_sys->sys_threads[SRV_PURGE_SLOT];
|
||||
slot = &srv_sys.sys_threads[SRV_PURGE_SLOT];
|
||||
break;
|
||||
|
||||
case SRV_WORKER:
|
||||
/* Find an empty slot, skip the master and purge slots. */
|
||||
for (slot = &srv_sys->sys_threads[2];
|
||||
for (slot = &srv_sys.sys_threads[2];
|
||||
slot->in_use;
|
||||
++slot) {
|
||||
|
||||
ut_a(slot < &srv_sys->sys_threads[
|
||||
srv_sys->n_sys_threads]);
|
||||
ut_a(slot < &srv_sys.sys_threads[
|
||||
srv_sys.n_sys_threads]);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -987,7 +987,7 @@ srv_reserve_slot(
|
||||
|
||||
ut_ad(srv_slot_get_type(slot) == type);
|
||||
|
||||
++srv_sys->n_threads_active[type];
|
||||
++srv_sys.n_threads_active[type];
|
||||
|
||||
srv_sys_mutex_exit();
|
||||
|
||||
@ -1017,27 +1017,27 @@ srv_suspend_thread_low(
|
||||
case SRV_MASTER:
|
||||
/* We have only one master thread and it
|
||||
should be the first entry always. */
|
||||
ut_a(srv_sys->n_threads_active[type] == 1);
|
||||
ut_a(srv_sys.n_threads_active[type] == 1);
|
||||
break;
|
||||
|
||||
case SRV_PURGE:
|
||||
/* We have only one purge coordinator thread
|
||||
and it should be the second entry always. */
|
||||
ut_a(srv_sys->n_threads_active[type] == 1);
|
||||
ut_a(srv_sys.n_threads_active[type] == 1);
|
||||
break;
|
||||
|
||||
case SRV_WORKER:
|
||||
ut_a(srv_n_purge_threads > 1);
|
||||
ut_a(srv_sys->n_threads_active[type] > 0);
|
||||
ut_a(srv_sys.n_threads_active[type] > 0);
|
||||
break;
|
||||
}
|
||||
|
||||
ut_a(!slot->suspended);
|
||||
slot->suspended = TRUE;
|
||||
|
||||
ut_a(srv_sys->n_threads_active[type] > 0);
|
||||
ut_a(srv_sys.n_threads_active[type] > 0);
|
||||
|
||||
srv_sys->n_threads_active[type]--;
|
||||
srv_sys.n_threads_active[type]--;
|
||||
|
||||
return(os_event_reset(slot->event));
|
||||
}
|
||||
@ -1092,7 +1092,7 @@ srv_resume_thread(srv_slot_t* slot, ib_int64_t sig_count = 0, bool wait = true,
|
||||
ut_ad(slot->suspended);
|
||||
|
||||
slot->suspended = FALSE;
|
||||
++srv_sys->n_threads_active[slot->type];
|
||||
++srv_sys.n_threads_active[slot->type];
|
||||
srv_sys_mutex_exit();
|
||||
return(timeout);
|
||||
}
|
||||
@ -1114,8 +1114,8 @@ srv_release_threads(enum srv_thread_type type, ulint n)
|
||||
|
||||
srv_sys_mutex_enter();
|
||||
|
||||
for (ulint i = 0; i < srv_sys->n_sys_threads; i++) {
|
||||
srv_slot_t* slot = &srv_sys->sys_threads[i];
|
||||
for (ulint i = 0; i < srv_sys.n_sys_threads; i++) {
|
||||
srv_slot_t* slot = &srv_sys.sys_threads[i];
|
||||
|
||||
if (!slot->in_use || srv_slot_get_type(slot) != type) {
|
||||
continue;
|
||||
@ -1135,7 +1135,7 @@ srv_release_threads(enum srv_thread_type type, ulint n)
|
||||
should be the first entry always. */
|
||||
ut_a(n == 1);
|
||||
ut_a(i == SRV_MASTER_SLOT);
|
||||
ut_a(srv_sys->n_threads_active[type] == 0);
|
||||
ut_a(srv_sys.n_threads_active[type] == 0);
|
||||
break;
|
||||
|
||||
case SRV_PURGE:
|
||||
@ -1144,12 +1144,12 @@ srv_release_threads(enum srv_thread_type type, ulint n)
|
||||
ut_a(n == 1);
|
||||
ut_a(i == SRV_PURGE_SLOT);
|
||||
ut_a(srv_n_purge_threads > 0);
|
||||
ut_a(srv_sys->n_threads_active[type] == 0);
|
||||
ut_a(srv_sys.n_threads_active[type] == 0);
|
||||
break;
|
||||
|
||||
case SRV_WORKER:
|
||||
ut_a(srv_n_purge_threads > 1);
|
||||
ut_a(srv_sys->n_threads_active[type]
|
||||
ut_a(srv_sys.n_threads_active[type]
|
||||
< srv_n_purge_threads - 1);
|
||||
break;
|
||||
}
|
||||
@ -1187,9 +1187,6 @@ void
|
||||
srv_init(void)
|
||||
/*==========*/
|
||||
{
|
||||
ulint n_sys_threads = 0;
|
||||
ulint srv_sys_sz = sizeof(*srv_sys);
|
||||
|
||||
#ifndef HAVE_ATOMIC_BUILTINS
|
||||
mutex_create(server_mutex_key, &server_mutex, SYNC_ANY_LATCH);
|
||||
#endif /* !HAVE_ATOMIC_BUILTINS */
|
||||
@ -1197,29 +1194,19 @@ srv_init(void)
|
||||
mutex_create(srv_innodb_monitor_mutex_key,
|
||||
&srv_innodb_monitor_mutex, SYNC_NO_ORDER_CHECK);
|
||||
|
||||
if (!srv_read_only_mode) {
|
||||
|
||||
/* Number of purge threads + master thread */
|
||||
n_sys_threads = srv_n_purge_threads + 1;
|
||||
|
||||
srv_sys_sz += n_sys_threads * sizeof(*srv_sys->sys_threads);
|
||||
}
|
||||
|
||||
srv_sys = static_cast<srv_sys_t*>(mem_zalloc(srv_sys_sz));
|
||||
|
||||
srv_sys->n_sys_threads = n_sys_threads;
|
||||
srv_sys.n_sys_threads = srv_read_only_mode
|
||||
? 0
|
||||
: srv_n_purge_threads + 1/* purge coordinator */;
|
||||
|
||||
if (!srv_read_only_mode) {
|
||||
|
||||
mutex_create(srv_sys_mutex_key, &srv_sys->mutex, SYNC_THREADS);
|
||||
mutex_create(srv_sys_mutex_key, &srv_sys.mutex, SYNC_THREADS);
|
||||
|
||||
mutex_create(srv_sys_tasks_mutex_key,
|
||||
&srv_sys->tasks_mutex, SYNC_ANY_LATCH);
|
||||
&srv_sys.tasks_mutex, SYNC_ANY_LATCH);
|
||||
|
||||
srv_sys->sys_threads = (srv_slot_t*) &srv_sys[1];
|
||||
|
||||
for (ulint i = 0; i < srv_sys->n_sys_threads; ++i) {
|
||||
srv_slot_t* slot = &srv_sys->sys_threads[i];
|
||||
for (ulint i = 0; i < srv_sys.n_sys_threads; ++i) {
|
||||
srv_slot_t* slot = &srv_sys.sys_threads[i];
|
||||
|
||||
slot->event = os_event_create();
|
||||
|
||||
@ -1239,8 +1226,6 @@ srv_init(void)
|
||||
if (srv_track_changed_pages) {
|
||||
os_event_set(srv_redo_log_tracked_event);
|
||||
}
|
||||
|
||||
UT_LIST_INIT(srv_sys->tasks);
|
||||
}
|
||||
|
||||
/* page_zip_stat_per_index_mutex is acquired from:
|
||||
@ -1288,8 +1273,8 @@ srv_free(void)
|
||||
|
||||
if (!srv_read_only_mode) {
|
||||
|
||||
for (ulint i = 0; i < srv_sys->n_sys_threads; i++)
|
||||
os_event_free(srv_sys->sys_threads[i].event);
|
||||
for (ulint i = 0; i < srv_sys.n_sys_threads; i++)
|
||||
os_event_free(srv_sys.sys_threads[i].event);
|
||||
|
||||
os_event_free(srv_error_event);
|
||||
srv_error_event = NULL;
|
||||
@ -1301,8 +1286,8 @@ srv_free(void)
|
||||
srv_checkpoint_completed_event = NULL;
|
||||
os_event_free(srv_redo_log_tracked_event);
|
||||
srv_redo_log_tracked_event = NULL;
|
||||
mutex_free(&srv_sys->mutex);
|
||||
mutex_free(&srv_sys->tasks_mutex);
|
||||
mutex_free(&srv_sys.mutex);
|
||||
mutex_free(&srv_sys.tasks_mutex);
|
||||
}
|
||||
|
||||
#ifdef WITH_INNODB_DISALLOW_WRITES
|
||||
@ -1316,10 +1301,10 @@ srv_free(void)
|
||||
mutex_free(&srv_innodb_monitor_mutex);
|
||||
mutex_free(&page_zip_stat_per_index_mutex);
|
||||
|
||||
mem_free(srv_sys);
|
||||
srv_sys = NULL;
|
||||
|
||||
trx_i_s_cache_free(trx_i_s_cache);
|
||||
|
||||
/* This is needed for Mariabackup. */
|
||||
memset(&srv_sys, 0, sizeof srv_sys);
|
||||
}
|
||||
|
||||
/*********************************************************************//**
|
||||
@ -2457,9 +2442,9 @@ srv_inc_activity_count(
|
||||
is caused by the background
|
||||
change buffer merge */
|
||||
{
|
||||
srv_sys->activity_count.inc();
|
||||
srv_sys.activity_count.inc();
|
||||
if (ibuf_merge_activity)
|
||||
srv_sys->ibuf_merge_activity_count.inc();
|
||||
srv_sys.ibuf_merge_activity_count.inc();
|
||||
}
|
||||
|
||||
/**********************************************************************//**
|
||||
@ -2481,7 +2466,7 @@ srv_get_active_thread_type(void)
|
||||
srv_sys_mutex_enter();
|
||||
|
||||
for (ulint i = SRV_WORKER; i <= SRV_MASTER; ++i) {
|
||||
if (srv_sys->n_threads_active[i] != 0) {
|
||||
if (srv_sys.n_threads_active[i] != 0) {
|
||||
ret = static_cast<srv_thread_type>(i);
|
||||
break;
|
||||
}
|
||||
@ -2700,12 +2685,12 @@ srv_active_wake_master_thread(void)
|
||||
|
||||
srv_inc_activity_count();
|
||||
|
||||
if (srv_sys->n_threads_active[SRV_MASTER] == 0) {
|
||||
if (srv_sys.n_threads_active[SRV_MASTER] == 0) {
|
||||
srv_slot_t* slot;
|
||||
|
||||
srv_sys_mutex_enter();
|
||||
|
||||
slot = &srv_sys->sys_threads[SRV_MASTER_SLOT];
|
||||
slot = &srv_sys.sys_threads[SRV_MASTER_SLOT];
|
||||
|
||||
/* Only if the master thread has been started. */
|
||||
|
||||
@ -2732,7 +2717,7 @@ srv_wake_purge_thread_if_not_active(void)
|
||||
ut_ad(!srv_sys_mutex_own());
|
||||
|
||||
if (purge_sys->state == PURGE_STATE_RUN
|
||||
&& srv_sys->n_threads_active[SRV_PURGE] == 0) {
|
||||
&& srv_sys.n_threads_active[SRV_PURGE] == 0) {
|
||||
|
||||
srv_release_threads(SRV_PURGE, 1);
|
||||
}
|
||||
@ -2761,7 +2746,7 @@ ulint
|
||||
srv_get_activity_count(void)
|
||||
/*========================*/
|
||||
{
|
||||
return(srv_sys->activity_count);
|
||||
return(srv_sys.activity_count);
|
||||
}
|
||||
|
||||
/** Get current server ibuf merge activity count.
|
||||
@ -2770,7 +2755,7 @@ static
|
||||
ulint
|
||||
srv_get_ibuf_merge_activity_count(void)
|
||||
{
|
||||
return(srv_sys->ibuf_merge_activity_count);
|
||||
return(srv_sys.ibuf_merge_activity_count);
|
||||
}
|
||||
|
||||
/*******************************************************************//**
|
||||
@ -2789,14 +2774,14 @@ srv_check_activity(
|
||||
ULINT_UNDEFINED */
|
||||
ulint old_ibuf_merge_activity_count)
|
||||
{
|
||||
ulint new_activity_count = srv_sys->activity_count;
|
||||
ulint new_activity_count = srv_sys.activity_count;
|
||||
if (old_ibuf_merge_activity_count == ULINT_UNDEFINED)
|
||||
return(new_activity_count != old_activity_count);
|
||||
|
||||
/* If we care about ibuf merge activity, then the server is considered
|
||||
idle if all activity, if any, was due to ibuf merge. */
|
||||
ulint new_ibuf_merge_activity_count
|
||||
= srv_sys->ibuf_merge_activity_count;
|
||||
= srv_sys.ibuf_merge_activity_count;
|
||||
|
||||
ut_ad(new_ibuf_merge_activity_count <= new_activity_count);
|
||||
ut_ad(new_ibuf_merge_activity_count >= old_ibuf_merge_activity_count);
|
||||
@ -3193,7 +3178,7 @@ DECLARE_THREAD(srv_master_thread)(
|
||||
srv_main_thread_id = os_thread_pf(os_thread_get_curr_id());
|
||||
|
||||
slot = srv_reserve_slot(SRV_MASTER);
|
||||
ut_a(slot == srv_sys->sys_threads);
|
||||
ut_a(slot == srv_sys.sys_threads);
|
||||
|
||||
last_print_time = ut_time();
|
||||
loop:
|
||||
@ -3289,18 +3274,18 @@ srv_task_execute(void)
|
||||
ut_ad(!srv_read_only_mode);
|
||||
ut_a(srv_force_recovery < SRV_FORCE_NO_BACKGROUND);
|
||||
|
||||
mutex_enter(&srv_sys->tasks_mutex);
|
||||
mutex_enter(&srv_sys.tasks_mutex);
|
||||
|
||||
if (UT_LIST_GET_LEN(srv_sys->tasks) > 0) {
|
||||
if (UT_LIST_GET_LEN(srv_sys.tasks) > 0) {
|
||||
|
||||
thr = UT_LIST_GET_FIRST(srv_sys->tasks);
|
||||
thr = UT_LIST_GET_FIRST(srv_sys.tasks);
|
||||
|
||||
ut_a(que_node_get_type(thr->child) == QUE_NODE_PURGE);
|
||||
|
||||
UT_LIST_REMOVE(queue, srv_sys->tasks, thr);
|
||||
UT_LIST_REMOVE(queue, srv_sys.tasks, thr);
|
||||
}
|
||||
|
||||
mutex_exit(&srv_sys->tasks_mutex);
|
||||
mutex_exit(&srv_sys.tasks_mutex);
|
||||
|
||||
if (thr != NULL) {
|
||||
|
||||
@ -3350,7 +3335,7 @@ DECLARE_THREAD(srv_worker_thread)(
|
||||
|
||||
srv_sys_mutex_enter();
|
||||
|
||||
ut_a(srv_sys->n_threads_active[SRV_WORKER] < srv_n_purge_threads);
|
||||
ut_a(srv_sys.n_threads_active[SRV_WORKER] < srv_n_purge_threads);
|
||||
|
||||
srv_sys_mutex_exit();
|
||||
|
||||
@ -3690,11 +3675,11 @@ srv_que_task_enqueue_low(
|
||||
que_thr_t* thr) /*!< in: query thread */
|
||||
{
|
||||
ut_ad(!srv_read_only_mode);
|
||||
mutex_enter(&srv_sys->tasks_mutex);
|
||||
mutex_enter(&srv_sys.tasks_mutex);
|
||||
|
||||
UT_LIST_ADD_LAST(queue, srv_sys->tasks, thr);
|
||||
UT_LIST_ADD_LAST(queue, srv_sys.tasks, thr);
|
||||
|
||||
mutex_exit(&srv_sys->tasks_mutex);
|
||||
mutex_exit(&srv_sys.tasks_mutex);
|
||||
|
||||
srv_release_threads(SRV_WORKER, 1);
|
||||
}
|
||||
@ -3711,11 +3696,11 @@ srv_get_task_queue_length(void)
|
||||
|
||||
ut_ad(!srv_read_only_mode);
|
||||
|
||||
mutex_enter(&srv_sys->tasks_mutex);
|
||||
mutex_enter(&srv_sys.tasks_mutex);
|
||||
|
||||
n_tasks = UT_LIST_GET_LEN(srv_sys->tasks);
|
||||
n_tasks = UT_LIST_GET_LEN(srv_sys.tasks);
|
||||
|
||||
mutex_exit(&srv_sys->tasks_mutex);
|
||||
mutex_exit(&srv_sys.tasks_mutex);
|
||||
|
||||
return(n_tasks);
|
||||
}
|
||||
|
@ -1186,10 +1186,6 @@ UNIV_INTERN
|
||||
dberr_t
|
||||
trx_undo_report_row_operation(
|
||||
/*==========================*/
|
||||
ulint flags, /*!< in: if BTR_NO_UNDO_LOG_FLAG bit is
|
||||
set, does nothing */
|
||||
ulint op_type, /*!< in: TRX_UNDO_INSERT_OP or
|
||||
TRX_UNDO_MODIFY_OP */
|
||||
que_thr_t* thr, /*!< in: query thread */
|
||||
dict_index_t* index, /*!< in: clustered index */
|
||||
const dtuple_t* clust_entry, /*!< in: in the case of an insert,
|
||||
@ -1223,16 +1219,8 @@ trx_undo_report_row_operation(
|
||||
ut_a(dict_index_is_clust(index));
|
||||
ut_ad(!rec || rec_offs_validate(rec, index, offsets));
|
||||
|
||||
if (flags & BTR_NO_UNDO_LOG_FLAG) {
|
||||
|
||||
*roll_ptr = 0;
|
||||
|
||||
return(DB_SUCCESS);
|
||||
}
|
||||
|
||||
ut_ad(thr);
|
||||
ut_ad((op_type != TRX_UNDO_INSERT_OP)
|
||||
|| (clust_entry && !update && !rec));
|
||||
ut_ad(!clust_entry || (!update && !rec));
|
||||
|
||||
trx = thr_get_trx(thr);
|
||||
|
||||
@ -1253,8 +1241,7 @@ trx_undo_report_row_operation(
|
||||
|
||||
/* If the undo log is not assigned yet, assign one */
|
||||
|
||||
switch (op_type) {
|
||||
case TRX_UNDO_INSERT_OP:
|
||||
if (clust_entry) {
|
||||
undo = trx->insert_undo;
|
||||
|
||||
if (undo == NULL) {
|
||||
@ -1270,10 +1257,7 @@ trx_undo_report_row_operation(
|
||||
|
||||
ut_ad(err == DB_SUCCESS);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ut_ad(op_type == TRX_UNDO_MODIFY_OP);
|
||||
|
||||
} else {
|
||||
undo = trx->update_undo;
|
||||
|
||||
if (undo == NULL) {
|
||||
@ -1297,23 +1281,15 @@ trx_undo_report_row_operation(
|
||||
buf_block_dbg_add_level(undo_block, SYNC_TRX_UNDO_PAGE);
|
||||
|
||||
do {
|
||||
page_t* undo_page;
|
||||
ulint offset;
|
||||
|
||||
undo_page = buf_block_get_frame(undo_block);
|
||||
ut_ad(page_no == buf_block_get_page_no(undo_block));
|
||||
|
||||
switch (op_type) {
|
||||
case TRX_UNDO_INSERT_OP:
|
||||
offset = trx_undo_page_report_insert(
|
||||
undo_page, trx, index, clust_entry, &mtr);
|
||||
break;
|
||||
default:
|
||||
ut_ad(op_type == TRX_UNDO_MODIFY_OP);
|
||||
offset = trx_undo_page_report_modify(
|
||||
page_t* undo_page = buf_block_get_frame(undo_block);
|
||||
ulint offset = clust_entry
|
||||
? trx_undo_page_report_insert(
|
||||
undo_page, trx, index, clust_entry, &mtr)
|
||||
: trx_undo_page_report_modify(
|
||||
undo_page, trx, index, rec, offsets, update,
|
||||
cmpl_info, &mtr);
|
||||
}
|
||||
|
||||
if (UNIV_UNLIKELY(offset == 0)) {
|
||||
/* The record did not fit on the page. We erase the
|
||||
@ -1364,7 +1340,7 @@ trx_undo_report_row_operation(
|
||||
mutex_exit(&trx->undo_mutex);
|
||||
|
||||
*roll_ptr = trx_undo_build_roll_ptr(
|
||||
op_type == TRX_UNDO_INSERT_OP,
|
||||
clust_entry != NULL,
|
||||
rseg->id, page_no, offset);
|
||||
return(DB_SUCCESS);
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2017, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
@ -48,8 +49,6 @@ sess_open(void)
|
||||
sess->trx = trx_allocate_for_background();
|
||||
sess->trx->sess = sess;
|
||||
|
||||
UT_LIST_INIT(sess->graphs);
|
||||
|
||||
return(sess);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user