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[0]=FN_CURLIB; // all paths are relative from here
|
||||||
mysql_data_home[1]=0;
|
mysql_data_home[1]=0;
|
||||||
|
|
||||||
|
srv_n_purge_threads = 1;
|
||||||
srv_read_only_mode = TRUE;
|
srv_read_only_mode = TRUE;
|
||||||
|
|
||||||
srv_backup_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[0]=FN_CURLIB; // all paths are relative from here
|
||||||
mysql_data_home[1]=0;
|
mysql_data_home[1]=0;
|
||||||
|
|
||||||
|
srv_n_purge_threads = 1;
|
||||||
/* set read only */
|
/* set read only */
|
||||||
srv_read_only_mode = TRUE;
|
srv_read_only_mode = TRUE;
|
||||||
|
|
||||||
@ -6407,6 +6409,7 @@ skip_check:
|
|||||||
|
|
||||||
/* Create logfiles for recovery from 'xtrabackup_logfile', before start InnoDB */
|
/* Create logfiles for recovery from 'xtrabackup_logfile', before start InnoDB */
|
||||||
srv_max_n_threads = 1000;
|
srv_max_n_threads = 1000;
|
||||||
|
srv_n_purge_threads = 1;
|
||||||
ut_mem_init();
|
ut_mem_init();
|
||||||
/* temporally dummy value to avoid crash */
|
/* temporally dummy value to avoid crash */
|
||||||
srv_page_size_shift = 14;
|
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 hrtime_sec_part(X) ((ulong)((X).val % HRTIME_RESOLUTION))
|
||||||
#define my_time(X) hrtime_to_time(my_hrtime())
|
#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
|
#ifdef HAVE_SYS_MMAN_H
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
|
|
||||||
|
@ -1406,7 +1406,7 @@ void set_stmt_errmsg(MYSQL_STMT *stmt, NET *net)
|
|||||||
DBUG_ASSERT(stmt != 0);
|
DBUG_ASSERT(stmt != 0);
|
||||||
|
|
||||||
stmt->last_errno= net->last_errno;
|
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->last_error, net->last_error);
|
||||||
strmov(stmt->sqlstate, net->sqlstate);
|
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 */
|
uchar buff[MYSQL_STMT_HEADER]; /* 4 bytes - stmt id */
|
||||||
|
|
||||||
if ((rc= reset_stmt_handle(stmt, RESET_ALL_BUFFERS | RESET_CLEAR_ERROR)))
|
reset_stmt_handle(stmt, RESET_ALL_BUFFERS | RESET_CLEAR_ERROR);
|
||||||
return rc;
|
|
||||||
|
|
||||||
int4store(buff, stmt->stmt_id);
|
int4store(buff, stmt->stmt_id);
|
||||||
if ((rc= stmt_command(mysql, COM_STMT_CLOSE, buff, 4, stmt)))
|
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;
|
SELECT CAST(0xE001 AS BINARY) REGEXP @regCheck;
|
||||||
CAST(0xE001 AS BINARY) REGEXP @regCheck
|
CAST(0xE001 AS BINARY) REGEXP @regCheck
|
||||||
1
|
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
|
Table Op Msg_type Msg_text
|
||||||
test.t1 check status OK
|
test.t1 check status OK
|
||||||
DROP TABLE t1,t2;
|
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 NAMES latin1;
|
||||||
SET @regCheck= '\\xE0\\x01';
|
SET @regCheck= '\\xE0\\x01';
|
||||||
SELECT CAST(0xE001 AS BINARY) REGEXP @regCheck;
|
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;
|
CHECK TABLE t1;
|
||||||
DROP TABLE t1,t2;
|
DROP TABLE t1,t2;
|
||||||
DISCONNECT insertConn;
|
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/not_embedded.inc
|
||||||
--source include/have_perfschema.inc
|
--source include/have_perfschema.inc
|
||||||
|
--source include/have_profiling.inc
|
||||||
--source include/platform.inc
|
--source include/platform.inc
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -324,12 +324,6 @@ static int match_pins(LF_PINS *el, void *addr)
|
|||||||
return 0;
|
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 next_node(P, X) (*((uchar * volatile *)(((uchar *)(X)) + (P)->free_ptr_offset)))
|
||||||
#define anext_node(X) next_node(&allocator->pinbox, (X))
|
#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;);
|
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;
|
m_lock_type= lock_type;
|
||||||
cached_table_flags= table_flags();
|
cached_table_flags= table_flags();
|
||||||
|
@ -5311,6 +5311,15 @@ int Regexp_processor_pcre::default_regex_flags()
|
|||||||
return default_regex_flags_pcre(current_thd);
|
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.
|
Convert string to lib_charset, if needed.
|
||||||
@ -5402,15 +5411,77 @@ void Regexp_processor_pcre::pcre_exec_warn(int rc) const
|
|||||||
*/
|
*/
|
||||||
switch (rc)
|
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:
|
case PCRE_ERROR_NOMEMORY:
|
||||||
errmsg= "pcre_exec: Out of memory";
|
errmsg= "pcre_exec: Out of memory";
|
||||||
break;
|
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:
|
case PCRE_ERROR_BADUTF8:
|
||||||
errmsg= "pcre_exec: Invalid utf8 byte sequence in the subject string";
|
errmsg= "pcre_exec: Invalid utf8 byte sequence in the subject string";
|
||||||
break;
|
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:
|
case PCRE_ERROR_RECURSELOOP:
|
||||||
errmsg= "pcre_exec: Recursion loop detected";
|
errmsg= "pcre_exec: Recursion loop detected";
|
||||||
break;
|
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:
|
default:
|
||||||
/*
|
/*
|
||||||
As other error codes should normally not happen,
|
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)
|
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);
|
m_SubStrVec, m_subpatterns_needed * 3);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -5457,7 +5528,7 @@ bool Regexp_processor_pcre::exec(String *str, int offset,
|
|||||||
{
|
{
|
||||||
if (!(str= convert_if_needed(str, &subject_converter)))
|
if (!(str= convert_if_needed(str, &subject_converter)))
|
||||||
return true;
|
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(),
|
str->c_ptr_safe(), str->length(),
|
||||||
offset, 0,
|
offset, 0,
|
||||||
m_SubStrVec, m_subpatterns_needed * 3);
|
m_SubStrVec, m_subpatterns_needed * 3);
|
||||||
|
@ -1892,6 +1892,7 @@ public:
|
|||||||
class Regexp_processor_pcre
|
class Regexp_processor_pcre
|
||||||
{
|
{
|
||||||
pcre *m_pcre;
|
pcre *m_pcre;
|
||||||
|
pcre_extra m_pcre_extra;
|
||||||
bool m_conversion_is_needed;
|
bool m_conversion_is_needed;
|
||||||
bool m_is_const;
|
bool m_is_const;
|
||||||
int m_library_flags;
|
int m_library_flags;
|
||||||
@ -1916,8 +1917,12 @@ public:
|
|||||||
m_data_charset(&my_charset_utf8_general_ci),
|
m_data_charset(&my_charset_utf8_general_ci),
|
||||||
m_library_charset(&my_charset_utf8_general_ci),
|
m_library_charset(&my_charset_utf8_general_ci),
|
||||||
m_subpatterns_needed(0)
|
m_subpatterns_needed(0)
|
||||||
{}
|
{
|
||||||
|
m_pcre_extra.flags= PCRE_EXTRA_MATCH_LIMIT_RECURSION;
|
||||||
|
m_pcre_extra.match_limit_recursion= 100L;
|
||||||
|
}
|
||||||
int default_regex_flags();
|
int default_regex_flags();
|
||||||
|
void set_recursion_limit(THD *);
|
||||||
void init(CHARSET_INFO *data_charset, int extra_flags, uint nsubpatterns_arg)
|
void init(CHARSET_INFO *data_charset, int extra_flags, uint nsubpatterns_arg)
|
||||||
{
|
{
|
||||||
m_library_flags= default_regex_flags() | extra_flags |
|
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)
|
void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock, bool free_lock)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("mysql_unlock_tables");
|
DBUG_ENTER("mysql_unlock_tables");
|
||||||
|
bool errors= thd->is_error();
|
||||||
THD_STAGE_INFO(thd, stage_unlocking_tables);
|
THD_STAGE_INFO(thd, stage_unlocking_tables);
|
||||||
|
|
||||||
if (sql_lock->table_count)
|
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);
|
thr_multi_unlock(sql_lock->locks, sql_lock->lock_count, 0);
|
||||||
if (free_lock)
|
if (free_lock)
|
||||||
my_free(sql_lock);
|
my_free(sql_lock);
|
||||||
|
if (!errors)
|
||||||
|
thd->clear_error();
|
||||||
DBUG_VOID_RETURN;
|
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]" */
|
/* fill in user_host value: the format is "%s[%s] @ %s [%s]" */
|
||||||
user_host_len= (strxnmov(user_host_buff, MAX_USER_HOST_SIZE,
|
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->user ? sctx->user : (thd->slave_thread ? "SQL_SLAVE" : ""), "] @ ",
|
||||||
sctx->host ? sctx->host : "", " [",
|
sctx->host ? sctx->host : "", " [",
|
||||||
sctx->ip ? sctx->ip : "", "]", NullS) -
|
sctx->ip ? sctx->ip : "", "]", NullS) -
|
||||||
|
@ -1584,8 +1584,7 @@ int Old_rows_log_event::do_apply_event(rpl_group_info *rgi)
|
|||||||
default:
|
default:
|
||||||
rli->report(ERROR_LEVEL, thd->net.last_errno, NULL,
|
rli->report(ERROR_LEVEL, thd->net.last_errno, NULL,
|
||||||
"Error in %s event: row application failed. %s",
|
"Error in %s event: row application failed. %s",
|
||||||
get_type_str(),
|
get_type_str(), thd->net.last_error);
|
||||||
thd->net.last_error ? thd->net.last_error : "");
|
|
||||||
thd->is_slave_error= 1;
|
thd->is_slave_error= 1;
|
||||||
break;
|
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 "
|
"Error in %s event: error during transaction execution "
|
||||||
"on table %s.%s. %s",
|
"on table %s.%s. %s",
|
||||||
get_type_str(), table->s->db.str,
|
get_type_str(), table->s->db.str,
|
||||||
table->s->table_name.str,
|
table->s->table_name.str, thd->net.last_error);
|
||||||
thd->net.last_error ? thd->net.last_error : "");
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
If one day we honour --skip-slave-errors in row-based replication, and
|
If one day we honour --skip-slave-errors in row-based replication, and
|
||||||
|
@ -105,6 +105,7 @@
|
|||||||
#include "sp_rcontext.h"
|
#include "sp_rcontext.h"
|
||||||
#include "sp_cache.h"
|
#include "sp_cache.h"
|
||||||
#include "sql_reload.h" // reload_acl_and_cache
|
#include "sql_reload.h" // reload_acl_and_cache
|
||||||
|
#include "pcre.h"
|
||||||
|
|
||||||
#ifdef HAVE_POLL_H
|
#ifdef HAVE_POLL_H
|
||||||
#include <poll.h>
|
#include <poll.h>
|
||||||
@ -3631,6 +3632,7 @@ static void init_libstrings()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ulonglong my_pcre_frame_size;
|
||||||
|
|
||||||
static void init_pcre()
|
static void init_pcre()
|
||||||
{
|
{
|
||||||
@ -3638,6 +3640,8 @@ static void init_pcre()
|
|||||||
pcre_free= pcre_stack_free= my_str_free_mysqld;
|
pcre_free= pcre_stack_free= my_str_free_mysqld;
|
||||||
#ifndef EMBEDDED_LIBRARY
|
#ifndef EMBEDDED_LIBRARY
|
||||||
pcre_stack_guard= check_enough_stack_size_slow;
|
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
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -9271,8 +9275,8 @@ mysql_getopt_value(const char *name, uint length,
|
|||||||
}
|
}
|
||||||
/* We return in all cases above. Let us silence -Wimplicit-fallthrough */
|
/* We return in all cases above. Let us silence -Wimplicit-fallthrough */
|
||||||
DBUG_ASSERT(0);
|
DBUG_ASSERT(0);
|
||||||
/* fall through */
|
|
||||||
#ifdef HAVE_REPLICATION
|
#ifdef HAVE_REPLICATION
|
||||||
|
/* fall through */
|
||||||
case OPT_REPLICATE_DO_DB:
|
case OPT_REPLICATE_DO_DB:
|
||||||
case OPT_REPLICATE_DO_TABLE:
|
case OPT_REPLICATE_DO_TABLE:
|
||||||
case OPT_REPLICATE_IGNORE_DB:
|
case OPT_REPLICATE_IGNORE_DB:
|
||||||
|
@ -522,6 +522,8 @@ extern pthread_t signal_thread;
|
|||||||
extern struct st_VioSSLFd * ssl_acceptor_fd;
|
extern struct st_VioSSLFd * ssl_acceptor_fd;
|
||||||
#endif /* HAVE_OPENSSL */
|
#endif /* HAVE_OPENSSL */
|
||||||
|
|
||||||
|
extern ulonglong my_pcre_frame_size;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The following variables were under INNODB_COMPABILITY_HOOKS
|
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
|
TODO: handling `when' for SHOW SLAVE STATUS' snds behind
|
||||||
*/
|
*/
|
||||||
if ((memcmp(mi->master_log_name, hb.get_log_ident(), hb.get_ident_len())
|
if (memcmp(mi->master_log_name, hb.get_log_ident(), hb.get_ident_len())
|
||||||
&& mi->master_log_name != NULL)
|
|
||||||
|| mi->master_log_pos > hb.log_pos)
|
|| mi->master_log_pos > hb.log_pos)
|
||||||
{
|
{
|
||||||
/* missed events of heartbeat from the past */
|
/* 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);
|
mysql_options(mysql, MYSQL_PLUGIN_DIR, opt_plugin_dir_ptr);
|
||||||
|
|
||||||
/* we disallow empty users */
|
/* 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,
|
mi->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, NULL,
|
||||||
ER_THD(thd, ER_SLAVE_FATAL_ERROR),
|
ER_THD(thd, ER_SLAVE_FATAL_ERROR),
|
||||||
|
@ -10941,12 +10941,6 @@ void fill_effective_table_privileges(THD *thd, GRANT_INFO *grant,
|
|||||||
/* global privileges */
|
/* global privileges */
|
||||||
grant->privilege= sctx->master_access;
|
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))
|
if (!thd->db || strcmp(db, thd->db))
|
||||||
{
|
{
|
||||||
/* db privileges */
|
/* db privileges */
|
||||||
|
@ -369,8 +369,7 @@ int initialize_audit_plugin(st_plugin_int *plugin)
|
|||||||
{
|
{
|
||||||
st_mysql_audit *data= (st_mysql_audit*) plugin->plugin->info;
|
st_mysql_audit *data= (st_mysql_audit*) plugin->plugin->info;
|
||||||
|
|
||||||
if (!data->class_mask || !data->event_notify ||
|
if (!data->event_notify || !data->class_mask[0])
|
||||||
!data->class_mask[0])
|
|
||||||
{
|
{
|
||||||
sql_print_error("Plugin '%s' has invalid data.",
|
sql_print_error("Plugin '%s' has invalid data.",
|
||||||
plugin->name.str);
|
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
|
#ifndef DBUG_OFF
|
||||||
long max_stack_used;
|
long max_stack_used;
|
||||||
#endif
|
#endif
|
||||||
@ -6818,7 +6812,7 @@ bool check_stack_overrun(THD *thd, long margin,
|
|||||||
{
|
{
|
||||||
long stack_used;
|
long stack_used;
|
||||||
DBUG_ASSERT(thd == current_thd);
|
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))
|
(long) (my_thread_stack_size - margin))
|
||||||
{
|
{
|
||||||
thd->is_fatal_error= 1;
|
thd->is_fatal_error= 1;
|
||||||
|
@ -270,8 +270,8 @@ IF(CONNECT_WITH_JDBC)
|
|||||||
# Find required libraries and include directories
|
# Find required libraries and include directories
|
||||||
SET (JAVA_SOURCES JdbcInterface.java)
|
SET (JAVA_SOURCES JdbcInterface.java)
|
||||||
add_jar(JdbcInterface ${JAVA_SOURCES})
|
add_jar(JdbcInterface ${JAVA_SOURCES})
|
||||||
install_jar(JdbcInterface DESTINATION ${INSTALL_PLUGINDIR} COMPONENT connect-engine)
|
|
||||||
INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/JavaWrappers.jar
|
INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/JavaWrappers.jar
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/JdbcInterface.jar
|
||||||
DESTINATION ${INSTALL_PLUGINDIR} COMPONENT connect-engine)
|
DESTINATION ${INSTALL_PLUGINDIR} COMPONENT connect-engine)
|
||||||
add_definitions(-DJDBC_SUPPORT)
|
add_definitions(-DJDBC_SUPPORT)
|
||||||
ELSE()
|
ELSE()
|
||||||
|
@ -341,7 +341,7 @@ bool ZIPUTIL::OpenTable(PGLOBAL g, MODE mode, char *fn, bool append)
|
|||||||
bool ZIPUTIL::addEntry(PGLOBAL g, char *entry)
|
bool ZIPUTIL::addEntry(PGLOBAL g, char *entry)
|
||||||
{
|
{
|
||||||
//?? we dont need the stinking time
|
//?? 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);
|
getTime(zi.tmz_date);
|
||||||
target = entry;
|
target = entry;
|
||||||
|
@ -1192,7 +1192,7 @@ char *ha_connect::GetRealString(const char *s)
|
|||||||
{
|
{
|
||||||
char *sv;
|
char *sv;
|
||||||
|
|
||||||
if (IsPartitioned() && s && partname && *partname) {
|
if (IsPartitioned() && s && *partname) {
|
||||||
sv= (char*)PlugSubAlloc(xp->g, NULL, 0);
|
sv= (char*)PlugSubAlloc(xp->g, NULL, 0);
|
||||||
sprintf(sv, s, partname);
|
sprintf(sv, s, partname);
|
||||||
PlugSubAlloc(xp->g, NULL, strlen(sv) + 1);
|
PlugSubAlloc(xp->g, NULL, strlen(sv) + 1);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
|
|
||||||
#ifndef __TABEXT_H
|
#ifndef __TABEXT_H
|
||||||
#define __TABEXTF_H
|
#define __TABEXT_H
|
||||||
|
|
||||||
#include "reldef.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));
|
mysql_file_seek(meta_file, 0, MY_SEEK_SET, MYF(0));
|
||||||
if (mysql_file_read(meta_file, (uchar*)meta_buffer, META_BUFFER_SIZE, 0)
|
if (mysql_file_read(meta_file, (uchar*)meta_buffer, META_BUFFER_SIZE, 0)
|
||||||
!= META_BUFFER_SIZE)
|
!= 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
|
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;
|
int result_code= 0;
|
||||||
if (!--share->use_count){
|
if (!--share->use_count){
|
||||||
/* Write the meta file. Mark it as crashed if needed. */
|
/* Write the meta file. Mark it as crashed if needed. */
|
||||||
|
if (share->meta_file != -1)
|
||||||
|
{
|
||||||
(void)write_meta_file(share->meta_file, share->rows_recorded,
|
(void)write_meta_file(share->meta_file, share->rows_recorded,
|
||||||
share->crashed ? TRUE :FALSE);
|
share->crashed ? TRUE :FALSE);
|
||||||
if (mysql_file_close(share->meta_file, MYF(0)))
|
if (mysql_file_close(share->meta_file, MYF(0)))
|
||||||
result_code= 1;
|
result_code= 1;
|
||||||
|
}
|
||||||
if (share->tina_write_opened)
|
if (share->tina_write_opened)
|
||||||
{
|
{
|
||||||
if (mysql_file_close(share->tina_write_filedes, MYF(0)))
|
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))
|
if (share->crashed && !(open_options & HA_OPEN_FOR_REPAIR))
|
||||||
{
|
{
|
||||||
free_share(share);
|
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;
|
local_data_file_version= share->data_file_version;
|
||||||
|
@ -1227,19 +1227,22 @@ btr_cur_ins_lock_and_undo(
|
|||||||
index, thr, mtr, inherit);
|
index, thr, mtr, inherit);
|
||||||
|
|
||||||
if (err != DB_SUCCESS
|
if (err != DB_SUCCESS
|
||||||
|
|| !(~flags | (BTR_NO_UNDO_LOG_FLAG | BTR_KEEP_SYS_FLAG))
|
||||||
|| !dict_index_is_clust(index) || dict_index_is_ibuf(index)) {
|
|| !dict_index_is_clust(index) || dict_index_is_ibuf(index)) {
|
||||||
|
|
||||||
return(err);
|
return(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
err = trx_undo_report_row_operation(flags, TRX_UNDO_INSERT_OP,
|
if (flags & BTR_NO_UNDO_LOG_FLAG) {
|
||||||
thr, index, entry,
|
roll_ptr = 0;
|
||||||
|
} else {
|
||||||
|
err = trx_undo_report_row_operation(thr, index, entry,
|
||||||
NULL, 0, NULL, NULL,
|
NULL, 0, NULL, NULL,
|
||||||
&roll_ptr);
|
&roll_ptr);
|
||||||
if (err != DB_SUCCESS) {
|
if (err != DB_SUCCESS) {
|
||||||
|
|
||||||
return(err);
|
return(err);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Now we can fill in the roll ptr field in entry */
|
/* 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;
|
btr_cur_t* cursor, /*!< in: cursor on page after which to insert;
|
||||||
cursor stays valid */
|
cursor stays valid */
|
||||||
ulint** offsets,/*!< out: offsets on *rec */
|
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 */
|
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||||
rec_t** rec, /*!< out: pointer to inserted record if
|
rec_t** rec, /*!< out: pointer to inserted record if
|
||||||
succeed */
|
succeed */
|
||||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||||
be stored externally by the caller, or
|
be stored externally by the caller */
|
||||||
NULL */
|
|
||||||
ulint n_ext, /*!< in: number of externally stored columns */
|
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;
|
mtr_t* mtr) /*!< in/out: mini-transaction;
|
||||||
if this function returns DB_SUCCESS on
|
if this function returns DB_SUCCESS on
|
||||||
a leaf page of a secondary index in a
|
a leaf page of a secondary index in a
|
||||||
@ -1316,6 +1321,7 @@ btr_cur_optimistic_insert(
|
|||||||
ulint rec_size;
|
ulint rec_size;
|
||||||
dberr_t err;
|
dberr_t err;
|
||||||
|
|
||||||
|
ut_ad(thr || !(~flags & (BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG)));
|
||||||
*big_rec = NULL;
|
*big_rec = NULL;
|
||||||
|
|
||||||
block = btr_cur_get_block(cursor);
|
block = btr_cur_get_block(cursor);
|
||||||
@ -1574,15 +1580,17 @@ btr_cur_pessimistic_insert(
|
|||||||
cursor stays valid */
|
cursor stays valid */
|
||||||
ulint** offsets,/*!< out: offsets on *rec */
|
ulint** offsets,/*!< out: offsets on *rec */
|
||||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap
|
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 */
|
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||||
rec_t** rec, /*!< out: pointer to inserted record if
|
rec_t** rec, /*!< out: pointer to inserted record if
|
||||||
succeed */
|
succeed */
|
||||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||||
be stored externally by the caller, or
|
be stored externally by the caller */
|
||||||
NULL */
|
|
||||||
ulint n_ext, /*!< in: number of externally stored columns */
|
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 */
|
mtr_t* mtr) /*!< in/out: mini-transaction */
|
||||||
{
|
{
|
||||||
dict_index_t* index = cursor->index;
|
dict_index_t* index = cursor->index;
|
||||||
@ -1594,6 +1602,7 @@ btr_cur_pessimistic_insert(
|
|||||||
ulint n_reserved = 0;
|
ulint n_reserved = 0;
|
||||||
|
|
||||||
ut_ad(dtuple_check_typed(entry));
|
ut_ad(dtuple_check_typed(entry));
|
||||||
|
ut_ad(thr || !(~flags & (BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG)));
|
||||||
|
|
||||||
*big_rec = NULL;
|
*big_rec = NULL;
|
||||||
|
|
||||||
@ -1778,9 +1787,10 @@ btr_cur_upd_lock_and_undo(
|
|||||||
|
|
||||||
/* Append the info about the update in the undo log */
|
/* Append the info about the update in the undo log */
|
||||||
|
|
||||||
return(trx_undo_report_row_operation(
|
return((flags & BTR_NO_UNDO_LOG_FLAG)
|
||||||
flags, TRX_UNDO_MODIFY_OP, thr,
|
? DB_SUCCESS
|
||||||
index, NULL, update,
|
: trx_undo_report_row_operation(
|
||||||
|
thr, index, NULL, update,
|
||||||
cmpl_info, rec, offsets, roll_ptr));
|
cmpl_info, rec, offsets, roll_ptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2511,12 +2521,12 @@ btr_cur_pessimistic_update(
|
|||||||
ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */
|
ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */
|
||||||
mem_heap_t** offsets_heap,
|
mem_heap_t** offsets_heap,
|
||||||
/*!< in/out: pointer to memory heap
|
/*!< in/out: pointer to memory heap
|
||||||
that can be emptied, or NULL */
|
that can be emptied */
|
||||||
mem_heap_t* entry_heap,
|
mem_heap_t* entry_heap,
|
||||||
/*!< in/out: memory heap for allocating
|
/*!< in/out: memory heap for allocating
|
||||||
big_rec and the index tuple */
|
big_rec and the index tuple */
|
||||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
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
|
const upd_t* update, /*!< in: update vector; this is allowed also
|
||||||
contain trx id and roll ptr fields, but
|
contain trx id and roll ptr fields, but
|
||||||
the values in update vector have no effect */
|
the values in update vector have no effect */
|
||||||
@ -3063,7 +3073,7 @@ btr_cur_del_mark_set_clust_rec(
|
|||||||
return(err);
|
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,
|
index, NULL, NULL, 0, rec, offsets,
|
||||||
&roll_ptr);
|
&roll_ptr);
|
||||||
if (err != DB_SUCCESS) {
|
if (err != DB_SUCCESS) {
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2008, Google Inc.
|
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
|
Portions of this file contain modifications contributed and copyrighted by
|
||||||
Google, Inc. Those modifications are gratefully acknowledged and are described
|
Google, Inc. Those modifications are gratefully acknowledged and are described
|
||||||
@ -1430,8 +1430,6 @@ buf_pool_init_instance(
|
|||||||
buf_pool->chunks = chunk =
|
buf_pool->chunks = chunk =
|
||||||
(buf_chunk_t*) mem_zalloc(sizeof *chunk);
|
(buf_chunk_t*) mem_zalloc(sizeof *chunk);
|
||||||
|
|
||||||
UT_LIST_INIT(buf_pool->free);
|
|
||||||
|
|
||||||
if (!buf_chunk_init(buf_pool, chunk, buf_pool_size)) {
|
if (!buf_chunk_init(buf_pool, chunk, buf_pool_size)) {
|
||||||
mem_free(chunk);
|
mem_free(chunk);
|
||||||
mem_free(buf_pool);
|
mem_free(buf_pool);
|
||||||
|
@ -6322,6 +6322,7 @@ dict_set_corrupted_index_cache_only(
|
|||||||
dict_table_t* table) /*!< in/out: table */
|
dict_table_t* table) /*!< in/out: table */
|
||||||
{
|
{
|
||||||
ut_ad(index != NULL);
|
ut_ad(index != NULL);
|
||||||
|
ut_ad(table != NULL);
|
||||||
ut_ad(mutex_own(&dict_sys->mutex));
|
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_tables));
|
||||||
ut_ad(!dict_table_is_comp(dict_sys->sys_indexes));
|
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
|
/* Mark the table as corrupted only if the clustered index
|
||||||
is corrupted */
|
is corrupted */
|
||||||
if (dict_index_is_clust(index)) {
|
if (dict_index_is_clust(index)) {
|
||||||
ut_ad((index->table != NULL) || (table != NULL)
|
|
||||||
|| index->table == table);
|
|
||||||
|
|
||||||
table->corrupted = TRUE;
|
table->corrupted = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2021,8 +2021,6 @@ fil_init(
|
|||||||
fil_system->spaces = hash_create(hash_size);
|
fil_system->spaces = hash_create(hash_size);
|
||||||
fil_system->name_hash = 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_system->max_n_open = max_n_open;
|
||||||
|
|
||||||
fil_space_crypt_init();
|
fil_space_crypt_init();
|
||||||
@ -2733,14 +2731,12 @@ fil_op_log_parse_or_replay(
|
|||||||
} else if (log_flags & MLOG_FILE_FLAG_TEMP) {
|
} else if (log_flags & MLOG_FILE_FLAG_TEMP) {
|
||||||
/* Temporary table, do nothing */
|
/* Temporary table, do nothing */
|
||||||
} else {
|
} else {
|
||||||
const char* path = NULL;
|
|
||||||
|
|
||||||
/* Create the database directory for name, if it does
|
/* Create the database directory for name, if it does
|
||||||
not exist yet */
|
not exist yet */
|
||||||
fil_create_directory_for_tablename(name);
|
fil_create_directory_for_tablename(name);
|
||||||
|
|
||||||
if (fil_create_new_single_table_tablespace(
|
if (fil_create_new_single_table_tablespace(
|
||||||
space_id, name, path, flags,
|
space_id, name, NULL, flags,
|
||||||
DICT_TF2_USE_TABLESPACE,
|
DICT_TF2_USE_TABLESPACE,
|
||||||
FIL_IBD_FILE_INITIAL_SIZE,
|
FIL_IBD_FILE_INITIAL_SIZE,
|
||||||
FIL_ENCRYPTION_DEFAULT,
|
FIL_ENCRYPTION_DEFAULT,
|
||||||
|
@ -1559,19 +1559,6 @@ thd_is_replication_slave_thread(
|
|||||||
return thd && ((ibool) thd_slave_thread(thd));
|
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.
|
Returns true if transaction should be flagged as read-only.
|
||||||
@return true if the thd is marked 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 &&
|
if (o_len != n_len || (o_len != 0 && o_len != UNIV_SQL_NULL
|
||||||
0 != memcmp(o_ptr, n_ptr, o_len))) {
|
&& 0 != memcmp(o_ptr, n_ptr, o_len))) {
|
||||||
/* The field has changed */
|
/* The field has changed */
|
||||||
|
|
||||||
ufield = uvect->fields + n_changed;
|
ufield = uvect->fields + n_changed;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
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
|
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 */
|
const KEY* key_info, /*!< in: Indexes to be created */
|
||||||
ulint num_of_keys) /*!< in: Number of indexes to
|
ulint num_of_keys) /*!< in: Number of indexes to
|
||||||
be created. */
|
be created. */
|
||||||
MY_ATTRIBUTE((nonnull, warn_unused_result));
|
MY_ATTRIBUTE((nonnull(1), warn_unused_result));
|
||||||
|
|
||||||
/*****************************************************************//**
|
/*****************************************************************//**
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 2005, 2016, Oracle and/or its affiliates
|
Copyright (c) 2005, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2013, 2017, MariaDB Corporation. All Rights Reserved.
|
Copyright (c) 2013, 2017, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
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
|
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 drop_fk constraints being dropped
|
||||||
@param n_drop_fk number of constraints that are being dropped
|
@param n_drop_fk number of constraints that are being dropped
|
||||||
@return whether the constraint is 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
|
bool
|
||||||
innobase_dropping_foreign(
|
innobase_dropping_foreign(
|
||||||
/*======================*/
|
|
||||||
const dict_foreign_t* foreign,
|
const dict_foreign_t* foreign,
|
||||||
dict_foreign_t** drop_fk,
|
dict_foreign_t** drop_fk,
|
||||||
ulint n_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 true Not allowed (will call my_error())
|
||||||
@retval false Allowed
|
@retval false Allowed
|
||||||
*/
|
*/
|
||||||
static MY_ATTRIBUTE((pure, nonnull, warn_unused_result))
|
MY_ATTRIBUTE((pure, nonnull(1,4), warn_unused_result))
|
||||||
|
static
|
||||||
bool
|
bool
|
||||||
innobase_check_foreigns_low(
|
innobase_check_foreigns_low(
|
||||||
/*========================*/
|
|
||||||
const dict_table_t* user_table,
|
const dict_table_t* user_table,
|
||||||
dict_foreign_t** drop_fk,
|
dict_foreign_t** drop_fk,
|
||||||
ulint n_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 true Not allowed (will call my_error())
|
||||||
@retval false Allowed
|
@retval false Allowed
|
||||||
*/
|
*/
|
||||||
static MY_ATTRIBUTE((pure, nonnull, warn_unused_result))
|
MY_ATTRIBUTE((pure, nonnull(1,2,3,4), warn_unused_result))
|
||||||
|
static
|
||||||
bool
|
bool
|
||||||
innobase_check_foreigns(
|
innobase_check_foreigns(
|
||||||
/*====================*/
|
|
||||||
Alter_inplace_info* ha_alter_info,
|
Alter_inplace_info* ha_alter_info,
|
||||||
const TABLE* altered_table,
|
const TABLE* altered_table,
|
||||||
const TABLE* old_table,
|
const TABLE* old_table,
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 2007, 2016, Oracle and/or its affiliates.
|
Copyright (c) 2007, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyrigth (c) 2014, 2017, MariaDB Corporation
|
Copyright (c) 2014, 2017, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
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
|
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;
|
fields = table->field;
|
||||||
|
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
for (ulint j = 0; j < ib_vector_size(deleted->doc_ids); ++j) {
|
for (ulint j = 0; j < ib_vector_size(deleted->doc_ids); ++j) {
|
||||||
doc_id_t doc_id;
|
doc_id_t doc_id;
|
||||||
|
|
||||||
doc_id = *(doc_id_t*) ib_vector_get_const(deleted->doc_ids, j);
|
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);
|
trx_free_for_background(trx);
|
||||||
@ -2990,7 +2992,7 @@ i_s_fts_deleted_generic_fill(
|
|||||||
|
|
||||||
rw_lock_s_unlock(&dict_operation_lock);
|
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 */
|
fts_index_cache_t* index_cache, /*!< in: FTS index cache */
|
||||||
THD* thd, /*!< in: thread */
|
THD* thd, /*!< in: thread */
|
||||||
|
fts_string_t* conv_str, /*!< in/out: buffer */
|
||||||
TABLE_LIST* tables) /*!< in/out: tables to fill */
|
TABLE_LIST* tables) /*!< in/out: tables to fill */
|
||||||
{
|
{
|
||||||
TABLE* table = (TABLE*) tables->table;
|
TABLE* table = (TABLE*) tables->table;
|
||||||
Field** fields;
|
Field** fields;
|
||||||
CHARSET_INFO* index_charset;
|
CHARSET_INFO* index_charset;
|
||||||
const ib_rbt_node_t* rbt_node;
|
const ib_rbt_node_t* rbt_node;
|
||||||
fts_string_t conv_str;
|
|
||||||
uint dummy_errors;
|
uint dummy_errors;
|
||||||
char* word_str;
|
char* word_str;
|
||||||
|
|
||||||
@ -3245,10 +3247,9 @@ i_s_fts_index_cache_fill_one_index(
|
|||||||
fields = table->field;
|
fields = table->field;
|
||||||
|
|
||||||
index_charset = index_cache->charset;
|
index_charset = index_cache->charset;
|
||||||
conv_str.f_len = system_charset_info->mbmaxlen
|
conv_str->f_n_char = 0;
|
||||||
* FTS_MAX_WORD_LEN_IN_CHAR;
|
|
||||||
conv_str.f_str = static_cast<byte*>(ut_malloc(conv_str.f_len));
|
int ret = 0;
|
||||||
conv_str.f_n_char = 0;
|
|
||||||
|
|
||||||
/* Go through each word in the index cache */
|
/* Go through each word in the index cache */
|
||||||
for (rbt_node = rbt_first(index_cache->words);
|
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 */
|
/* Convert word from index charset to system_charset_info */
|
||||||
if (index_charset->cset != system_charset_info->cset) {
|
if (index_charset->cset != system_charset_info->cset) {
|
||||||
conv_str.f_n_char = my_convert(
|
conv_str->f_n_char = my_convert(
|
||||||
reinterpret_cast<char*>(conv_str.f_str),
|
reinterpret_cast<char*>(conv_str->f_str),
|
||||||
static_cast<uint32>(conv_str.f_len),
|
static_cast<uint32>(conv_str->f_len),
|
||||||
system_charset_info,
|
system_charset_info,
|
||||||
reinterpret_cast<char*>(word->text.f_str),
|
reinterpret_cast<char*>(word->text.f_str),
|
||||||
static_cast<uint32>(word->text.f_len),
|
static_cast<uint32>(word->text.f_len),
|
||||||
index_charset, &dummy_errors);
|
index_charset, &dummy_errors);
|
||||||
ut_ad(conv_str.f_n_char <= conv_str.f_len);
|
ut_ad(conv_str->f_n_char <= conv_str->f_len);
|
||||||
conv_str.f_str[conv_str.f_n_char] = 0;
|
conv_str->f_str[conv_str->f_n_char] = 0;
|
||||||
word_str = reinterpret_cast<char*>(conv_str.f_str);
|
word_str = reinterpret_cast<char*>(conv_str->f_str);
|
||||||
} else {
|
} else {
|
||||||
word_str = reinterpret_cast<char*>(word->text.f_str);
|
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(ret);
|
||||||
|
|
||||||
DBUG_RETURN(0);
|
|
||||||
}
|
}
|
||||||
/*******************************************************************//**
|
/*******************************************************************//**
|
||||||
Fill the dynamic table INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHED
|
Fill the dynamic table INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHED
|
||||||
@ -3373,18 +3372,27 @@ i_s_fts_index_cache_fill(
|
|||||||
|
|
||||||
ut_a(cache);
|
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++) {
|
for (ulint i = 0; i < ib_vector_size(cache->indexes); i++) {
|
||||||
fts_index_cache_t* index_cache;
|
fts_index_cache_t* index_cache;
|
||||||
|
|
||||||
index_cache = static_cast<fts_index_cache_t*> (
|
index_cache = static_cast<fts_index_cache_t*> (
|
||||||
ib_vector_get(cache->indexes, i));
|
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);
|
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);
|
DBUG_RETURN(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3703,13 +3709,13 @@ i_s_fts_index_table_fill_one_index(
|
|||||||
/*===============================*/
|
/*===============================*/
|
||||||
dict_index_t* index, /*!< in: FTS index */
|
dict_index_t* index, /*!< in: FTS index */
|
||||||
THD* thd, /*!< in: thread */
|
THD* thd, /*!< in: thread */
|
||||||
|
fts_string_t* conv_str, /*!< in/out: buffer */
|
||||||
TABLE_LIST* tables) /*!< in/out: tables to fill */
|
TABLE_LIST* tables) /*!< in/out: tables to fill */
|
||||||
{
|
{
|
||||||
ib_vector_t* words;
|
ib_vector_t* words;
|
||||||
mem_heap_t* heap;
|
mem_heap_t* heap;
|
||||||
fts_string_t word;
|
fts_string_t word;
|
||||||
CHARSET_INFO* index_charset;
|
CHARSET_INFO* index_charset;
|
||||||
fts_string_t conv_str;
|
|
||||||
dberr_t error;
|
dberr_t error;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
@ -3726,10 +3732,6 @@ i_s_fts_index_table_fill_one_index(
|
|||||||
word.f_n_char = 0;
|
word.f_n_char = 0;
|
||||||
|
|
||||||
index_charset = fts_index_get_charset(index);
|
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
|
/* Iterate through each auxiliary table as described in
|
||||||
fts_index_selector */
|
fts_index_selector */
|
||||||
@ -3763,17 +3765,17 @@ i_s_fts_index_table_fill_one_index(
|
|||||||
|
|
||||||
/* Fill into tables */
|
/* Fill into tables */
|
||||||
ret = i_s_fts_index_table_fill_one_fetch(
|
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) {
|
if (ret != 0) {
|
||||||
i_s_fts_index_table_free_one_fetch(words);
|
|
||||||
goto func_exit;
|
goto func_exit;
|
||||||
}
|
}
|
||||||
} while (has_more);
|
} while (has_more);
|
||||||
}
|
}
|
||||||
|
|
||||||
func_exit:
|
func_exit:
|
||||||
ut_free(conv_str.f_str);
|
|
||||||
mem_heap_free(heap);
|
mem_heap_free(heap);
|
||||||
|
|
||||||
DBUG_RETURN(ret);
|
DBUG_RETURN(ret);
|
||||||
@ -3815,10 +3817,17 @@ i_s_fts_index_table_fill(
|
|||||||
DBUG_RETURN(0);
|
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);
|
for (index = dict_table_get_first_index(user_table);
|
||||||
index; index = dict_table_get_next_index(index)) {
|
index; index = dict_table_get_next_index(index)) {
|
||||||
if (index->type & DICT_FTS) {
|
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);
|
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));
|
DBUG_ASSERT(!dict_index_is_online_ddl(index));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
while (fts_config_key[i]) {
|
while (fts_config_key[i]) {
|
||||||
fts_string_t value;
|
fts_string_t value;
|
||||||
char* key_name;
|
char* key_name;
|
||||||
@ -4016,13 +4029,14 @@ i_s_fts_config_fill(
|
|||||||
ut_free(key_name);
|
ut_free(key_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
OK(field_store_string(
|
BREAK_IF(ret = field_store_string(
|
||||||
fields[FTS_CONFIG_KEY], fts_config_key[i]));
|
fields[FTS_CONFIG_KEY], fts_config_key[i]));
|
||||||
|
|
||||||
OK(field_store_string(
|
BREAK_IF(ret = field_store_string(
|
||||||
fields[FTS_CONFIG_VALUE], (const char*) value.f_str));
|
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++;
|
i++;
|
||||||
}
|
}
|
||||||
@ -4035,7 +4049,7 @@ i_s_fts_config_fill(
|
|||||||
|
|
||||||
rw_lock_s_unlock(&dict_operation_lock);
|
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;
|
state_str = NULL;
|
||||||
|
|
||||||
OK(fields[IDX_BUFFER_POOL_ID]->store(
|
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(
|
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(
|
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(
|
OK(fields[IDX_BUFFER_PAGE_NUM]->store(
|
||||||
static_cast<double>(page_info->page_num)));
|
page_info->page_num, true));
|
||||||
|
|
||||||
OK(field_store_string(
|
OK(field_store_string(
|
||||||
fields[IDX_BUFFER_PAGE_TYPE],
|
fields[IDX_BUFFER_PAGE_TYPE],
|
||||||
i_s_page_type[page_info->page_type].type_str));
|
i_s_page_type[page_info->page_type].type_str));
|
||||||
|
|
||||||
OK(fields[IDX_BUFFER_PAGE_FLUSH_TYPE]->store(
|
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(
|
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],
|
||||||
OK(field_store_string(
|
page_info->hashed ? "YES" : "NO"));
|
||||||
fields[IDX_BUFFER_PAGE_HASHED], "YES"));
|
|
||||||
} else {
|
|
||||||
OK(field_store_string(
|
|
||||||
fields[IDX_BUFFER_PAGE_HASHED], "NO"));
|
|
||||||
}
|
|
||||||
|
|
||||||
OK(fields[IDX_BUFFER_PAGE_NEWEST_MOD]->store(
|
OK(fields[IDX_BUFFER_PAGE_NEWEST_MOD]->store(
|
||||||
(longlong) page_info->newest_mod, true));
|
(longlong) page_info->newest_mod, true));
|
||||||
@ -4913,7 +4922,7 @@ i_s_innodb_buffer_page_fill(
|
|||||||
(longlong) page_info->oldest_mod, true));
|
(longlong) page_info->oldest_mod, true));
|
||||||
|
|
||||||
OK(fields[IDX_BUFFER_PAGE_ACCESS_TIME]->store(
|
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();
|
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
|
/* If this is an index page, fetch the index name
|
||||||
and table name */
|
and table name */
|
||||||
if (page_info->page_type == I_S_PAGE_TYPE_INDEX) {
|
if (page_info->page_type == I_S_PAGE_TYPE_INDEX) {
|
||||||
const dict_index_t* index;
|
bool ret = false;
|
||||||
|
|
||||||
mutex_enter(&dict_sys->mutex);
|
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_end = innobase_convert_name(
|
||||||
table_name, sizeof(table_name),
|
table_name, sizeof(table_name),
|
||||||
index->table_name,
|
index->table_name,
|
||||||
strlen(index->table_name),
|
strlen(index->table_name),
|
||||||
thd, TRUE);
|
thd, TRUE);
|
||||||
|
|
||||||
OK(fields[IDX_BUFFER_PAGE_TABLE_NAME]->store(
|
ret = fields[IDX_BUFFER_PAGE_TABLE_NAME]
|
||||||
table_name,
|
->store(table_name,
|
||||||
static_cast<uint>(table_name_end - table_name),
|
static_cast<uint>(
|
||||||
system_charset_info));
|
table_name_end
|
||||||
fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_notnull();
|
- table_name),
|
||||||
|
system_charset_info)
|
||||||
OK(field_store_index_name(
|
|| field_store_index_name(
|
||||||
fields[IDX_BUFFER_PAGE_INDEX_NAME],
|
fields
|
||||||
index->name));
|
[IDX_BUFFER_PAGE_INDEX_NAME],
|
||||||
|
index->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_exit(&dict_sys->mutex);
|
mutex_exit(&dict_sys->mutex);
|
||||||
|
|
||||||
|
OK(ret);
|
||||||
|
|
||||||
|
fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_notnull();
|
||||||
}
|
}
|
||||||
|
|
||||||
OK(fields[IDX_BUFFER_PAGE_NUM_RECS]->store(
|
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(
|
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(
|
OK(fields[IDX_BUFFER_PAGE_ZIP_SIZE]->store(
|
||||||
page_info->zip_ssize
|
page_info->zip_ssize
|
||||||
? (UNIV_ZIP_SIZE_MIN >> 1) << page_info->zip_ssize
|
? (UNIV_ZIP_SIZE_MIN >> 1) << page_info->zip_ssize
|
||||||
: 0));
|
: 0, true));
|
||||||
|
|
||||||
#if BUF_PAGE_STATE_BITS > 3
|
#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"
|
# 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) {
|
switch (page_info->io_fix) {
|
||||||
case BUF_IO_NONE:
|
case BUF_IO_NONE:
|
||||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
state_str = "IO_NONE";
|
||||||
"IO_NONE"));
|
|
||||||
break;
|
break;
|
||||||
case BUF_IO_READ:
|
case BUF_IO_READ:
|
||||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
state_str = "IO_READ";
|
||||||
"IO_READ"));
|
|
||||||
break;
|
break;
|
||||||
case BUF_IO_WRITE:
|
case BUF_IO_WRITE:
|
||||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
state_str = "IO_WRITE";
|
||||||
"IO_WRITE"));
|
|
||||||
break;
|
break;
|
||||||
case BUF_IO_PIN:
|
case BUF_IO_PIN:
|
||||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
state_str = "IO_PIN";
|
||||||
"IO_PIN"));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
||||||
|
state_str));
|
||||||
|
|
||||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IS_OLD],
|
OK(field_store_string(fields[IDX_BUFFER_PAGE_IS_OLD],
|
||||||
(page_info->is_old) ? "YES" : "NO"));
|
(page_info->is_old) ? "YES" : "NO"));
|
||||||
|
|
||||||
OK(fields[IDX_BUFFER_PAGE_FREE_CLOCK]->store(
|
OK(fields[IDX_BUFFER_PAGE_FREE_CLOCK]->store(
|
||||||
page_info->freed_page_clock));
|
page_info->freed_page_clock));
|
||||||
|
|
||||||
if (schema_table_store_record(thd, table)) {
|
OK(schema_table_store_record(thd, table));
|
||||||
DBUG_RETURN(1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
@ -5566,17 +5576,10 @@ i_s_innodb_buf_page_lru_fill(
|
|||||||
ulint num_page) /*!< in: number of page info
|
ulint num_page) /*!< in: number of page info
|
||||||
cached */
|
cached */
|
||||||
{
|
{
|
||||||
TABLE* table;
|
|
||||||
Field** fields;
|
|
||||||
mem_heap_t* heap;
|
|
||||||
|
|
||||||
DBUG_ENTER("i_s_innodb_buf_page_lru_fill");
|
DBUG_ENTER("i_s_innodb_buf_page_lru_fill");
|
||||||
|
|
||||||
table = tables->table;
|
TABLE* table = tables->table;
|
||||||
|
Field** fields = table->field;
|
||||||
fields = table->field;
|
|
||||||
|
|
||||||
heap = mem_heap_create(1000);
|
|
||||||
|
|
||||||
/* Iterate through the cached array and fill the I_S table rows */
|
/* Iterate through the cached array and fill the I_S table rows */
|
||||||
for (ulint i = 0; i < num_page; i++) {
|
for (ulint i = 0; i < num_page; i++) {
|
||||||
@ -5591,34 +5594,28 @@ i_s_innodb_buf_page_lru_fill(
|
|||||||
page_info = info_array + i;
|
page_info = info_array + i;
|
||||||
|
|
||||||
OK(fields[IDX_BUF_LRU_POOL_ID]->store(
|
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(
|
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(
|
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(
|
OK(fields[IDX_BUF_LRU_PAGE_NUM]->store(
|
||||||
static_cast<double>(page_info->page_num)));
|
page_info->page_num, true));
|
||||||
|
|
||||||
OK(field_store_string(
|
OK(field_store_string(
|
||||||
fields[IDX_BUF_LRU_PAGE_TYPE],
|
fields[IDX_BUF_LRU_PAGE_TYPE],
|
||||||
i_s_page_type[page_info->page_type].type_str));
|
i_s_page_type[page_info->page_type].type_str));
|
||||||
|
|
||||||
OK(fields[IDX_BUF_LRU_PAGE_FLUSH_TYPE]->store(
|
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(
|
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],
|
||||||
OK(field_store_string(
|
page_info->hashed ? "YES" : "NO"));
|
||||||
fields[IDX_BUF_LRU_PAGE_HASHED], "YES"));
|
|
||||||
} else {
|
|
||||||
OK(field_store_string(
|
|
||||||
fields[IDX_BUF_LRU_PAGE_HASHED], "NO"));
|
|
||||||
}
|
|
||||||
|
|
||||||
OK(fields[IDX_BUF_LRU_PAGE_NEWEST_MOD]->store(
|
OK(fields[IDX_BUF_LRU_PAGE_NEWEST_MOD]->store(
|
||||||
page_info->newest_mod, true));
|
page_info->newest_mod, true));
|
||||||
@ -5627,7 +5624,7 @@ i_s_innodb_buf_page_lru_fill(
|
|||||||
page_info->oldest_mod, true));
|
page_info->oldest_mod, true));
|
||||||
|
|
||||||
OK(fields[IDX_BUF_LRU_PAGE_ACCESS_TIME]->store(
|
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();
|
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
|
/* If this is an index page, fetch the index name
|
||||||
and table name */
|
and table name */
|
||||||
if (page_info->page_type == I_S_PAGE_TYPE_INDEX) {
|
if (page_info->page_type == I_S_PAGE_TYPE_INDEX) {
|
||||||
const dict_index_t* index;
|
bool ret = false;
|
||||||
|
|
||||||
mutex_enter(&dict_sys->mutex);
|
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_end = innobase_convert_name(
|
||||||
table_name, sizeof(table_name),
|
table_name, sizeof(table_name),
|
||||||
index->table_name,
|
index->table_name,
|
||||||
strlen(index->table_name),
|
strlen(index->table_name),
|
||||||
thd, TRUE);
|
thd, TRUE);
|
||||||
|
|
||||||
OK(fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->store(
|
ret = fields[IDX_BUF_LRU_PAGE_TABLE_NAME]
|
||||||
table_name,
|
->store(table_name,
|
||||||
static_cast<uint>(table_name_end - table_name),
|
static_cast<uint>(
|
||||||
system_charset_info));
|
table_name_end
|
||||||
fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_notnull();
|
- table_name),
|
||||||
|
system_charset_info)
|
||||||
OK(field_store_index_name(
|
|| field_store_index_name(
|
||||||
fields[IDX_BUF_LRU_PAGE_INDEX_NAME],
|
fields
|
||||||
index->name));
|
[IDX_BUF_LRU_PAGE_INDEX_NAME],
|
||||||
|
index->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_exit(&dict_sys->mutex);
|
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(
|
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(
|
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(
|
OK(fields[IDX_BUF_LRU_PAGE_ZIP_SIZE]->store(
|
||||||
page_info->zip_ssize ?
|
page_info->zip_ssize
|
||||||
512 << page_info->zip_ssize : 0));
|
? 512 << page_info->zip_ssize : 0, true));
|
||||||
|
|
||||||
state = static_cast<enum buf_page_state>(page_info->page_state);
|
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) {
|
switch (page_info->io_fix) {
|
||||||
case BUF_IO_NONE:
|
case BUF_IO_NONE:
|
||||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX],
|
state_str = "IO_NONE";
|
||||||
"IO_NONE"));
|
|
||||||
break;
|
break;
|
||||||
case BUF_IO_READ:
|
case BUF_IO_READ:
|
||||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX],
|
state_str = "IO_READ";
|
||||||
"IO_READ"));
|
|
||||||
break;
|
break;
|
||||||
case BUF_IO_WRITE:
|
case BUF_IO_WRITE:
|
||||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX],
|
state_str = "IO_WRITE";
|
||||||
"IO_WRITE"));
|
break;
|
||||||
|
case BUF_IO_PIN:
|
||||||
|
state_str = "IO_PIN";
|
||||||
break;
|
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],
|
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(
|
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)) {
|
OK(schema_table_store_record(thd, table));
|
||||||
mem_heap_free(heap);
|
|
||||||
DBUG_RETURN(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mem_heap_empty(heap);
|
|
||||||
}
|
|
||||||
|
|
||||||
mem_heap_free(heap);
|
|
||||||
|
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 2007, 2013, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
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
|
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); \
|
DBUG_RETURN(1); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define BREAK_IF(expr) if ((expr)) break
|
||||||
|
|
||||||
#define RETURN_IF_INNODB_NOT_STARTED(plugin_name) \
|
#define RETURN_IF_INNODB_NOT_STARTED(plugin_name) \
|
||||||
do { \
|
do { \
|
||||||
if (!srv_was_started) { \
|
if (!srv_was_started) { \
|
||||||
|
@ -2923,8 +2923,7 @@ ibuf_get_volume_buffered_hash(
|
|||||||
fold = ut_fold_binary(data, len);
|
fold = ut_fold_binary(data, len);
|
||||||
|
|
||||||
hash += (fold / (CHAR_BIT * sizeof *hash)) % size;
|
hash += (fold / (CHAR_BIT * sizeof *hash)) % size;
|
||||||
bitmask = static_cast<ulint>(
|
bitmask = static_cast<ulint>(1) << (fold % (CHAR_BIT * sizeof(*hash)));
|
||||||
1 << (fold % (CHAR_BIT * sizeof(*hash))));
|
|
||||||
|
|
||||||
if (*hash & bitmask) {
|
if (*hash & bitmask) {
|
||||||
|
|
||||||
@ -3691,7 +3690,7 @@ fail_exit:
|
|||||||
|
|
||||||
if (mode == BTR_MODIFY_PREV) {
|
if (mode == BTR_MODIFY_PREV) {
|
||||||
err = btr_cur_optimistic_insert(
|
err = btr_cur_optimistic_insert(
|
||||||
BTR_NO_LOCKING_FLAG,
|
BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG,
|
||||||
cursor, &offsets, &offsets_heap,
|
cursor, &offsets, &offsets_heap,
|
||||||
ibuf_entry, &ins_rec,
|
ibuf_entry, &ins_rec,
|
||||||
&dummy_big_rec, 0, thr, &mtr);
|
&dummy_big_rec, 0, thr, &mtr);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
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
|
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;
|
btr_cur_t* cursor, /*!< in: cursor on page after which to insert;
|
||||||
cursor stays valid */
|
cursor stays valid */
|
||||||
ulint** offsets,/*!< out: offsets on *rec */
|
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 */
|
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||||
rec_t** rec, /*!< out: pointer to inserted record if
|
rec_t** rec, /*!< out: pointer to inserted record if
|
||||||
succeed */
|
succeed */
|
||||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||||
be stored externally by the caller, or
|
be stored externally by the caller */
|
||||||
NULL */
|
|
||||||
ulint n_ext, /*!< in: number of externally stored columns */
|
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;
|
mtr_t* mtr) /*!< in/out: mini-transaction;
|
||||||
if this function returns DB_SUCCESS on
|
if this function returns DB_SUCCESS on
|
||||||
a leaf page of a secondary index in a
|
a leaf page of a secondary index in a
|
||||||
@ -256,15 +259,17 @@ btr_cur_pessimistic_insert(
|
|||||||
cursor stays valid */
|
cursor stays valid */
|
||||||
ulint** offsets,/*!< out: offsets on *rec */
|
ulint** offsets,/*!< out: offsets on *rec */
|
||||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap
|
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 */
|
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||||
rec_t** rec, /*!< out: pointer to inserted record if
|
rec_t** rec, /*!< out: pointer to inserted record if
|
||||||
succeed */
|
succeed */
|
||||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||||
be stored externally by the caller, or
|
be stored externally by the caller */
|
||||||
NULL */
|
|
||||||
ulint n_ext, /*!< in: number of externally stored columns */
|
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 */
|
mtr_t* mtr) /*!< in/out: mini-transaction */
|
||||||
MY_ATTRIBUTE((nonnull(2,3,4,5,6,7,10), warn_unused_result));
|
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 */
|
ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */
|
||||||
mem_heap_t** offsets_heap,
|
mem_heap_t** offsets_heap,
|
||||||
/*!< in/out: pointer to memory heap
|
/*!< in/out: pointer to memory heap
|
||||||
that can be emptied, or NULL */
|
that can be emptied */
|
||||||
mem_heap_t* entry_heap,
|
mem_heap_t* entry_heap,
|
||||||
/*!< in/out: memory heap for allocating
|
/*!< in/out: memory heap for allocating
|
||||||
big_rec and the index tuple */
|
big_rec and the index tuple */
|
||||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
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
|
const upd_t* update, /*!< in: update vector; this is allowed also
|
||||||
contain trx id and roll ptr fields, but
|
contain trx id and roll ptr fields, but
|
||||||
the values in update vector have no effect */
|
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 */
|
must be >= FIL_IBD_FILE_INITIAL_SIZE */
|
||||||
fil_encryption_t mode, /*!< in: encryption mode */
|
fil_encryption_t mode, /*!< in: encryption mode */
|
||||||
ulint key_id) /*!< in: encryption key_id */
|
ulint key_id) /*!< in: encryption key_id */
|
||||||
__attribute__((nonnull, warn_unused_result));
|
MY_ATTRIBUTE((nonnull(2), warn_unused_result));
|
||||||
#ifndef UNIV_HOTBACKUP
|
#ifndef UNIV_HOTBACKUP
|
||||||
/** Try to adjust FSP_SPACE_FLAGS if they differ from the expectations.
|
/** Try to adjust FSP_SPACE_FLAGS if they differ from the expectations.
|
||||||
(Typically when upgrading from MariaDB 10.1.0..10.1.20.)
|
(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 */
|
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
|
Returns true if the transaction this thread is processing has edited
|
||||||
non-transactional tables. Used by the deadlock detector when deciding
|
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));
|
compile_time_assert(!atomic || sizeof(Type) == sizeof(ulint));
|
||||||
if (atomic) {
|
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 {
|
} else {
|
||||||
return m_counter += i;
|
return m_counter += i;
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
Copyright (c) 2005, 2013, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 2005, 2013, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2012, Facebook Inc.
|
Copyright (c) 2012, Facebook Inc.
|
||||||
|
Copyright (c) 2017, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
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
|
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 */
|
ignored if zip_size == 0 */
|
||||||
ulint zip_size) /*!< in: compressed page size in bytes, or 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(ut_is_2pow(zip_size));
|
||||||
ut_ad(comp || !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) 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
|
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
|
the terms of the GNU General Public License as published by the Free Software
|
||||||
@ -212,10 +213,6 @@ UNIV_INTERN
|
|||||||
dberr_t
|
dberr_t
|
||||||
trx_undo_report_row_operation(
|
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 */
|
que_thr_t* thr, /*!< in: query thread */
|
||||||
dict_index_t* index, /*!< in: clustered index */
|
dict_index_t* index, /*!< in: clustered index */
|
||||||
const dtuple_t* clust_entry, /*!< in: in the case of an insert,
|
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,
|
inserted undo log record,
|
||||||
0 if BTR_NO_UNDO_LOG
|
0 if BTR_NO_UNDO_LOG
|
||||||
flag was specified */
|
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
|
Copies an undo record to heap. This function can be called if we know that
|
||||||
the undo log record exists.
|
the undo log record exists.
|
||||||
@ -313,10 +310,6 @@ record */
|
|||||||
storage fields: used by purge to
|
storage fields: used by purge to
|
||||||
free the external storage */
|
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
|
#ifndef UNIV_NONINL
|
||||||
#include "trx0rec.ic"
|
#include "trx0rec.ic"
|
||||||
#endif
|
#endif
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
Copyright (c) 2005, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 2005, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2012, Facebook Inc.
|
Copyright (c) 2012, Facebook Inc.
|
||||||
|
Copyright (c) 2017, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
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
|
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)
|
# define buf_LRU_stat_inc_unzip() ((void) 0)
|
||||||
#endif /* !UNIV_HOTBACKUP */
|
#endif /* !UNIV_HOTBACKUP */
|
||||||
|
|
||||||
#ifndef UNIV_HOTBACKUP
|
|
||||||
#ifndef UNIV_INNOCHECKSUM
|
#ifndef UNIV_INNOCHECKSUM
|
||||||
|
#ifndef UNIV_HOTBACKUP
|
||||||
/** Statistics on compression, indexed by page_zip_des_t::ssize - 1 */
|
/** Statistics on compression, indexed by page_zip_des_t::ssize - 1 */
|
||||||
UNIV_INTERN page_zip_stat_t page_zip_stat[PAGE_ZIP_SSIZE_MAX];
|
UNIV_INTERN page_zip_stat_t page_zip_stat[PAGE_ZIP_SSIZE_MAX];
|
||||||
/** Statistics on compression, indexed by index->id */
|
/** 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
|
#ifdef HAVE_PSI_INTERFACE
|
||||||
UNIV_INTERN mysql_pfs_key_t page_zip_stat_per_index_mutex_key;
|
UNIV_INTERN mysql_pfs_key_t page_zip_stat_per_index_mutex_key;
|
||||||
#endif /* HAVE_PSI_INTERFACE */
|
#endif /* HAVE_PSI_INTERFACE */
|
||||||
#endif /* !UNIV_INNOCHECKSUM */
|
|
||||||
#endif /* !UNIV_HOTBACKUP */
|
#endif /* !UNIV_HOTBACKUP */
|
||||||
|
|
||||||
/* Compression level to be used by zlib. Settable by user. */
|
/* 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
|
/* Enable some extra debugging output. This code can be enabled
|
||||||
independently of any UNIV_ debugging conditions. */
|
independently of any UNIV_ debugging conditions. */
|
||||||
#ifndef UNIV_INNOCHECKSUM
|
|
||||||
#if defined UNIV_DEBUG || defined UNIV_ZIP_DEBUG
|
#if defined UNIV_DEBUG || defined UNIV_ZIP_DEBUG
|
||||||
# include <stdarg.h>
|
# include <stdarg.h>
|
||||||
MY_ATTRIBUTE((format (printf, 1, 2)))
|
MY_ATTRIBUTE((format (printf, 1, 2)))
|
||||||
|
@ -1288,9 +1288,11 @@ rec_convert_dtuple_to_rec_comp(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (len) {
|
||||||
memcpy(end, dfield_get_data(field), len);
|
memcpy(end, dfield_get_data(field), len);
|
||||||
end += len;
|
end += len;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************//**
|
/*********************************************************//**
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 2010, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
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
|
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
|
each parallel sort thread. Each "sort bucket" holds records for
|
||||||
a particular "FTS index partition" */
|
a particular "FTS index partition" */
|
||||||
for (j = 0; j < fts_sort_pll_degree; j++) {
|
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++) {
|
for (i = 0; i < FTS_NUM_AUX_INDEX; i++) {
|
||||||
|
|
||||||
psort_info[j].merge_file[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) 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
|
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
|
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_SUCCESS if no error
|
||||||
@retval DB_DUPLICATE_KEY if error,
|
@retval DB_DUPLICATE_KEY if error,
|
||||||
@retval DB_LOCK_WAIT if we have to wait for a lock on a possible duplicate
|
@retval DB_LOCK_WAIT if we have to wait for a lock on a possible duplicate
|
||||||
record
|
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)) */
|
|
||||||
static MY_ATTRIBUTE((nonnull, warn_unused_result))
|
static MY_ATTRIBUTE((nonnull, warn_unused_result))
|
||||||
dberr_t
|
dberr_t
|
||||||
row_ins_duplicate_error_in_clust(
|
row_ins_duplicate_error_in_clust(
|
||||||
/*=============================*/
|
|
||||||
ulint flags, /*!< in: undo logging and locking flags */
|
|
||||||
btr_cur_t* cursor, /*!< in: B-tree cursor */
|
btr_cur_t* cursor, /*!< in: B-tree cursor */
|
||||||
const dtuple_t* entry, /*!< in: entry to insert */
|
const dtuple_t* entry, /*!< in: entry to insert */
|
||||||
que_thr_t* thr, /*!< in: query thread */
|
que_thr_t* thr, /*!< in: query thread */
|
||||||
@ -2419,7 +2416,7 @@ row_ins_clust_index_entry_low(
|
|||||||
DB_LOCK_WAIT */
|
DB_LOCK_WAIT */
|
||||||
|
|
||||||
err = row_ins_duplicate_error_in_clust(
|
err = row_ins_duplicate_error_in_clust(
|
||||||
flags, &cursor, entry, thr, &mtr);
|
&cursor, entry, thr, &mtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (err != DB_SUCCESS) {
|
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;
|
UNIV_INTERN ulong srv_flushing_avg_loops = 30;
|
||||||
|
|
||||||
/* The number of purge threads to use.*/
|
/* 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 */
|
/* the number of pages to purge in one batch */
|
||||||
UNIV_INTERN ulong srv_purge_batch_size = 20;
|
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. */
|
/** Acquire the system_mutex. */
|
||||||
#define srv_sys_mutex_enter() do { \
|
#define srv_sys_mutex_enter() do { \
|
||||||
mutex_enter(&srv_sys->mutex); \
|
mutex_enter(&srv_sys.mutex); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/** Test if the system mutex is owned. */
|
/** 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)
|
&& !srv_read_only_mode)
|
||||||
|
|
||||||
/** Release the system mutex. */
|
/** Release the system mutex. */
|
||||||
#define srv_sys_mutex_exit() do { \
|
#define srv_sys_mutex_exit() do { \
|
||||||
mutex_exit(&srv_sys->mutex); \
|
mutex_exit(&srv_sys.mutex); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define fetch_lock_wait_timeout(trx) \
|
#define fetch_lock_wait_timeout(trx) \
|
||||||
@ -650,7 +650,7 @@ struct srv_sys_t{
|
|||||||
ulint n_sys_threads; /*!< size of the sys_threads
|
ulint n_sys_threads; /*!< size of the sys_threads
|
||||||
array */
|
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_set() and
|
||||||
os_event_reset() on
|
os_event_reset() on
|
||||||
sys_threads[]->event are
|
sys_threads[]->event are
|
||||||
@ -670,7 +670,7 @@ struct srv_sys_t{
|
|||||||
UNIV_INTERN ib_mutex_t server_mutex;
|
UNIV_INTERN ib_mutex_t server_mutex;
|
||||||
#endif /* !HAVE_ATOMIC_BUILTINS */
|
#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.
|
/** Event to signal srv_monitor_thread. Not protected by a mutex.
|
||||||
Set after setting srv_print_innodb_monitor. */
|
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_dump_at_shutdown = FALSE;
|
||||||
UNIV_INTERN char srv_buffer_pool_load_at_startup = 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;
|
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;
|
static const ulint SRV_MASTER_SLOT = 0;
|
||||||
|
|
||||||
/*********************************************************************//**
|
/*********************************************************************//**
|
||||||
@ -796,21 +796,21 @@ srv_reserve_slot(
|
|||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SRV_MASTER:
|
case SRV_MASTER:
|
||||||
slot = &srv_sys->sys_threads[SRV_MASTER_SLOT];
|
slot = &srv_sys.sys_threads[SRV_MASTER_SLOT];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SRV_PURGE:
|
case SRV_PURGE:
|
||||||
slot = &srv_sys->sys_threads[SRV_PURGE_SLOT];
|
slot = &srv_sys.sys_threads[SRV_PURGE_SLOT];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SRV_WORKER:
|
case SRV_WORKER:
|
||||||
/* Find an empty slot, skip the master and purge slots. */
|
/* 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->in_use;
|
||||||
++slot) {
|
++slot) {
|
||||||
|
|
||||||
ut_a(slot < &srv_sys->sys_threads[
|
ut_a(slot < &srv_sys.sys_threads[
|
||||||
srv_sys->n_sys_threads]);
|
srv_sys.n_sys_threads]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -826,7 +826,7 @@ srv_reserve_slot(
|
|||||||
|
|
||||||
ut_ad(srv_slot_get_type(slot) == type);
|
ut_ad(srv_slot_get_type(slot) == type);
|
||||||
|
|
||||||
++srv_sys->n_threads_active[type];
|
++srv_sys.n_threads_active[type];
|
||||||
|
|
||||||
srv_sys_mutex_exit();
|
srv_sys_mutex_exit();
|
||||||
|
|
||||||
@ -856,27 +856,27 @@ srv_suspend_thread_low(
|
|||||||
case SRV_MASTER:
|
case SRV_MASTER:
|
||||||
/* We have only one master thread and it
|
/* We have only one master thread and it
|
||||||
should be the first entry always. */
|
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;
|
break;
|
||||||
|
|
||||||
case SRV_PURGE:
|
case SRV_PURGE:
|
||||||
/* We have only one purge coordinator thread
|
/* We have only one purge coordinator thread
|
||||||
and it should be the second entry always. */
|
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;
|
break;
|
||||||
|
|
||||||
case SRV_WORKER:
|
case SRV_WORKER:
|
||||||
ut_a(srv_n_purge_threads > 1);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ut_a(!slot->suspended);
|
ut_a(!slot->suspended);
|
||||||
slot->suspended = TRUE;
|
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));
|
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);
|
ut_ad(slot->suspended);
|
||||||
|
|
||||||
slot->suspended = FALSE;
|
slot->suspended = FALSE;
|
||||||
++srv_sys->n_threads_active[slot->type];
|
++srv_sys.n_threads_active[slot->type];
|
||||||
srv_sys_mutex_exit();
|
srv_sys_mutex_exit();
|
||||||
return(timeout);
|
return(timeout);
|
||||||
}
|
}
|
||||||
@ -953,8 +953,8 @@ srv_release_threads(enum srv_thread_type type, ulint n)
|
|||||||
|
|
||||||
srv_sys_mutex_enter();
|
srv_sys_mutex_enter();
|
||||||
|
|
||||||
for (ulint i = 0; i < srv_sys->n_sys_threads; i++) {
|
for (ulint i = 0; i < srv_sys.n_sys_threads; i++) {
|
||||||
srv_slot_t* slot = &srv_sys->sys_threads[i];
|
srv_slot_t* slot = &srv_sys.sys_threads[i];
|
||||||
|
|
||||||
if (!slot->in_use || srv_slot_get_type(slot) != type) {
|
if (!slot->in_use || srv_slot_get_type(slot) != type) {
|
||||||
continue;
|
continue;
|
||||||
@ -974,7 +974,7 @@ srv_release_threads(enum srv_thread_type type, ulint n)
|
|||||||
should be the first entry always. */
|
should be the first entry always. */
|
||||||
ut_a(n == 1);
|
ut_a(n == 1);
|
||||||
ut_a(i == SRV_MASTER_SLOT);
|
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;
|
break;
|
||||||
|
|
||||||
case SRV_PURGE:
|
case SRV_PURGE:
|
||||||
@ -983,12 +983,12 @@ srv_release_threads(enum srv_thread_type type, ulint n)
|
|||||||
ut_a(n == 1);
|
ut_a(n == 1);
|
||||||
ut_a(i == SRV_PURGE_SLOT);
|
ut_a(i == SRV_PURGE_SLOT);
|
||||||
ut_a(srv_n_purge_threads > 0);
|
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;
|
break;
|
||||||
|
|
||||||
case SRV_WORKER:
|
case SRV_WORKER:
|
||||||
ut_a(srv_n_purge_threads > 1);
|
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);
|
< srv_n_purge_threads - 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1026,9 +1026,6 @@ void
|
|||||||
srv_init(void)
|
srv_init(void)
|
||||||
/*==========*/
|
/*==========*/
|
||||||
{
|
{
|
||||||
ulint n_sys_threads = 0;
|
|
||||||
ulint srv_sys_sz = sizeof(*srv_sys);
|
|
||||||
|
|
||||||
#ifndef HAVE_ATOMIC_BUILTINS
|
#ifndef HAVE_ATOMIC_BUILTINS
|
||||||
mutex_create(server_mutex_key, &server_mutex, SYNC_ANY_LATCH);
|
mutex_create(server_mutex_key, &server_mutex, SYNC_ANY_LATCH);
|
||||||
#endif /* !HAVE_ATOMIC_BUILTINS */
|
#endif /* !HAVE_ATOMIC_BUILTINS */
|
||||||
@ -1036,29 +1033,19 @@ srv_init(void)
|
|||||||
mutex_create(srv_innodb_monitor_mutex_key,
|
mutex_create(srv_innodb_monitor_mutex_key,
|
||||||
&srv_innodb_monitor_mutex, SYNC_NO_ORDER_CHECK);
|
&srv_innodb_monitor_mutex, SYNC_NO_ORDER_CHECK);
|
||||||
|
|
||||||
if (!srv_read_only_mode) {
|
srv_sys.n_sys_threads = srv_read_only_mode
|
||||||
|
? 0
|
||||||
/* Number of purge threads + master thread */
|
: srv_n_purge_threads + 1/* purge coordinator */;
|
||||||
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;
|
|
||||||
|
|
||||||
if (!srv_read_only_mode) {
|
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,
|
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();
|
slot->event = os_event_create();
|
||||||
|
|
||||||
@ -1070,8 +1057,6 @@ srv_init(void)
|
|||||||
srv_monitor_event = os_event_create();
|
srv_monitor_event = os_event_create();
|
||||||
|
|
||||||
srv_buf_dump_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:
|
/* page_zip_stat_per_index_mutex is acquired from:
|
||||||
@ -1117,10 +1102,8 @@ srv_free(void)
|
|||||||
{
|
{
|
||||||
srv_conc_free();
|
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. */
|
been freed by sync_close() already. */
|
||||||
mem_free(srv_sys);
|
|
||||||
srv_sys = NULL;
|
|
||||||
|
|
||||||
trx_i_s_cache_free(trx_i_s_cache);
|
trx_i_s_cache_free(trx_i_s_cache);
|
||||||
|
|
||||||
@ -2012,7 +1995,7 @@ void
|
|||||||
srv_inc_activity_count(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();
|
srv_sys_mutex_enter();
|
||||||
|
|
||||||
for (ulint i = SRV_WORKER; i <= SRV_MASTER; ++i) {
|
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);
|
ret = static_cast<srv_thread_type>(i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2073,12 +2056,12 @@ srv_active_wake_master_thread(void)
|
|||||||
|
|
||||||
srv_inc_activity_count();
|
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_slot_t* slot;
|
||||||
|
|
||||||
srv_sys_mutex_enter();
|
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. */
|
/* 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());
|
ut_ad(!srv_sys_mutex_own());
|
||||||
|
|
||||||
if (purge_sys->state == PURGE_STATE_RUN
|
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);
|
srv_release_threads(SRV_PURGE, 1);
|
||||||
}
|
}
|
||||||
@ -2134,7 +2117,7 @@ ulint
|
|||||||
srv_get_activity_count(void)
|
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 */
|
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());
|
srv_main_thread_id = os_thread_pf(os_thread_get_curr_id());
|
||||||
|
|
||||||
slot = srv_reserve_slot(SRV_MASTER);
|
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();
|
last_print_time = ut_time();
|
||||||
loop:
|
loop:
|
||||||
@ -2607,18 +2590,18 @@ srv_task_execute(void)
|
|||||||
ut_ad(!srv_read_only_mode);
|
ut_ad(!srv_read_only_mode);
|
||||||
ut_a(srv_force_recovery < SRV_FORCE_NO_BACKGROUND);
|
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_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) {
|
if (thr != NULL) {
|
||||||
|
|
||||||
@ -2658,7 +2641,7 @@ DECLARE_THREAD(srv_worker_thread)(
|
|||||||
|
|
||||||
srv_sys_mutex_enter();
|
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();
|
srv_sys_mutex_exit();
|
||||||
|
|
||||||
@ -2987,11 +2970,11 @@ srv_que_task_enqueue_low(
|
|||||||
que_thr_t* thr) /*!< in: query thread */
|
que_thr_t* thr) /*!< in: query thread */
|
||||||
{
|
{
|
||||||
ut_ad(!srv_read_only_mode);
|
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);
|
srv_release_threads(SRV_WORKER, 1);
|
||||||
}
|
}
|
||||||
@ -3008,11 +2991,11 @@ srv_get_task_queue_length(void)
|
|||||||
|
|
||||||
ut_ad(!srv_read_only_mode);
|
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);
|
return(n_tasks);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
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
|
the terms of the GNU General Public License as published by the Free Software
|
||||||
@ -1186,10 +1187,6 @@ UNIV_INTERN
|
|||||||
dberr_t
|
dberr_t
|
||||||
trx_undo_report_row_operation(
|
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 */
|
que_thr_t* thr, /*!< in: query thread */
|
||||||
dict_index_t* index, /*!< in: clustered index */
|
dict_index_t* index, /*!< in: clustered index */
|
||||||
const dtuple_t* clust_entry, /*!< in: in the case of an insert,
|
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_ad(!srv_read_only_mode);
|
||||||
ut_a(dict_index_is_clust(index));
|
ut_a(dict_index_is_clust(index));
|
||||||
ut_ad(!rec || rec_offs_validate(rec, index, offsets));
|
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(thr);
|
||||||
ut_ad((op_type != TRX_UNDO_INSERT_OP)
|
ut_ad(!clust_entry || (!update && !rec));
|
||||||
|| (clust_entry && !update && !rec));
|
|
||||||
|
|
||||||
trx = thr_get_trx(thr);
|
trx = thr_get_trx(thr);
|
||||||
|
|
||||||
@ -1253,8 +1241,7 @@ trx_undo_report_row_operation(
|
|||||||
|
|
||||||
/* If the undo log is not assigned yet, assign one */
|
/* If the undo log is not assigned yet, assign one */
|
||||||
|
|
||||||
switch (op_type) {
|
if (clust_entry) {
|
||||||
case TRX_UNDO_INSERT_OP:
|
|
||||||
undo = trx->insert_undo;
|
undo = trx->insert_undo;
|
||||||
|
|
||||||
if (undo == NULL) {
|
if (undo == NULL) {
|
||||||
@ -1270,10 +1257,7 @@ trx_undo_report_row_operation(
|
|||||||
|
|
||||||
ut_ad(err == DB_SUCCESS);
|
ut_ad(err == DB_SUCCESS);
|
||||||
}
|
}
|
||||||
break;
|
} else {
|
||||||
default:
|
|
||||||
ut_ad(op_type == TRX_UNDO_MODIFY_OP);
|
|
||||||
|
|
||||||
undo = trx->update_undo;
|
undo = trx->update_undo;
|
||||||
|
|
||||||
if (undo == NULL) {
|
if (undo == NULL) {
|
||||||
@ -1297,23 +1281,14 @@ trx_undo_report_row_operation(
|
|||||||
buf_block_dbg_add_level(undo_block, SYNC_TRX_UNDO_PAGE);
|
buf_block_dbg_add_level(undo_block, SYNC_TRX_UNDO_PAGE);
|
||||||
|
|
||||||
do {
|
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));
|
ut_ad(page_no == buf_block_get_page_no(undo_block));
|
||||||
|
page_t* undo_page = buf_block_get_frame(undo_block);
|
||||||
switch (op_type) {
|
ulint offset = clust_entry
|
||||||
case TRX_UNDO_INSERT_OP:
|
? trx_undo_page_report_insert(
|
||||||
offset = trx_undo_page_report_insert(
|
undo_page, trx, index, clust_entry, &mtr)
|
||||||
undo_page, trx, index, clust_entry, &mtr);
|
: trx_undo_page_report_modify(
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ut_ad(op_type == TRX_UNDO_MODIFY_OP);
|
|
||||||
offset = trx_undo_page_report_modify(
|
|
||||||
undo_page, trx, index, rec, offsets, update,
|
undo_page, trx, index, rec, offsets, update,
|
||||||
cmpl_info, &mtr);
|
cmpl_info, &mtr);
|
||||||
}
|
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(offset == 0)) {
|
if (UNIV_UNLIKELY(offset == 0)) {
|
||||||
/* The record did not fit on the page. We erase the
|
/* 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);
|
mutex_exit(&trx->undo_mutex);
|
||||||
|
|
||||||
*roll_ptr = trx_undo_build_roll_ptr(
|
*roll_ptr = trx_undo_build_roll_ptr(
|
||||||
op_type == TRX_UNDO_INSERT_OP,
|
clust_entry != NULL,
|
||||||
rseg->id, page_no, offset);
|
rseg->id, page_no, offset);
|
||||||
return(DB_SUCCESS);
|
return(DB_SUCCESS);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
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
|
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 = trx_allocate_for_background();
|
||||||
sess->trx->sess = sess;
|
sess->trx->sess = sess;
|
||||||
|
|
||||||
UT_LIST_INIT(sess->graphs);
|
|
||||||
|
|
||||||
return(sess);
|
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 mi_lock_database(MI_INFO *info, int lock_type)
|
||||||
{
|
{
|
||||||
int error;
|
int error, mark_crashed= 0;
|
||||||
uint count;
|
uint count;
|
||||||
MYISAM_SHARE *share=info->s;
|
MYISAM_SHARE *share=info->s;
|
||||||
DBUG_ENTER("mi_lock_database");
|
DBUG_ENTER("mi_lock_database");
|
||||||
@ -52,6 +52,7 @@ int mi_lock_database(MI_INFO *info, int lock_type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
error= 0;
|
error= 0;
|
||||||
|
DBUG_EXECUTE_IF ("mi_lock_database_failure", error= EINVAL;);
|
||||||
mysql_mutex_lock(&share->intern_lock);
|
mysql_mutex_lock(&share->intern_lock);
|
||||||
if (share->kfile >= 0) /* May only be false on windows */
|
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,
|
&share->dirty_part_map,
|
||||||
FLUSH_KEEP))
|
FLUSH_KEEP))
|
||||||
{
|
{
|
||||||
error=my_errno;
|
mark_crashed= error=my_errno;
|
||||||
mi_print_error(info->s, HA_ERR_CRASHED);
|
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 (info->opt_flag & (READ_CACHE_USED | WRITE_CACHE_USED))
|
||||||
{
|
{
|
||||||
if (end_io_cache(&info->rec_cache))
|
if (end_io_cache(&info->rec_cache))
|
||||||
{
|
{
|
||||||
error=my_errno;
|
mark_crashed= error=my_errno;
|
||||||
mi_print_error(info->s, HA_ERR_CRASHED);
|
mi_print_error(info->s, HA_ERR_CRASHED);
|
||||||
mi_mark_crashed(info);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!count)
|
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.unique= info->last_unique= info->this_unique;
|
||||||
share->state.update_count= info->last_loop= ++info->this_loop;
|
share->state.update_count= info->last_loop= ++info->this_loop;
|
||||||
if (mi_state_info_write(share->kfile, &share->state, 1))
|
if (mi_state_info_write(share->kfile, &share->state, 1))
|
||||||
error=my_errno;
|
mark_crashed= error=my_errno;
|
||||||
share->changed=0;
|
share->changed=0;
|
||||||
if (myisam_flush)
|
if (myisam_flush)
|
||||||
{
|
{
|
||||||
if (mysql_file_sync(share->kfile, MYF(0)))
|
if (mysql_file_sync(share->kfile, MYF(0)))
|
||||||
error= my_errno;
|
mark_crashed= error= my_errno;
|
||||||
if (mysql_file_sync(info->dfile, MYF(0)))
|
if (mysql_file_sync(info->dfile, MYF(0)))
|
||||||
error= my_errno;
|
mark_crashed= error= my_errno;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
share->not_flushed=1;
|
share->not_flushed=1;
|
||||||
if (error)
|
if (error)
|
||||||
{
|
|
||||||
mi_print_error(info->s, HA_ERR_CRASHED);
|
mi_print_error(info->s, HA_ERR_CRASHED);
|
||||||
mi_mark_crashed(info);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (info->lock_type != F_EXTRA_LCK)
|
if (info->lock_type != F_EXTRA_LCK)
|
||||||
{
|
{
|
||||||
@ -260,6 +256,8 @@ int mi_lock_database(MI_INFO *info, int lock_type)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
mysql_mutex_unlock(&share->intern_lock);
|
mysql_mutex_unlock(&share->intern_lock);
|
||||||
|
if (mark_crashed)
|
||||||
|
mi_mark_crashed(info);
|
||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
} /* mi_lock_database */
|
} /* mi_lock_database */
|
||||||
|
|
||||||
|
@ -216,7 +216,9 @@ enum ESphGroupBy
|
|||||||
SPH_GROUPBY_WEEK = 1, ///< group by week
|
SPH_GROUPBY_WEEK = 1, ///< group by week
|
||||||
SPH_GROUPBY_MONTH = 2, ///< group by month
|
SPH_GROUPBY_MONTH = 2, ///< group by month
|
||||||
SPH_GROUPBY_YEAR = 3, ///< group by year
|
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
|
/// 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)
|
// 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";
|
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 },
|
{ "month:", SPH_GROUPBY_MONTH },
|
||||||
{ "year:", SPH_GROUPBY_YEAR },
|
{ "year:", SPH_GROUPBY_YEAR },
|
||||||
{ "attr:", SPH_GROUPBY_ATTR },
|
{ "attr:", SPH_GROUPBY_ATTR },
|
||||||
|
{ "multi:", SPH_GROUPBY_MULTIPLE }
|
||||||
};
|
};
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
@ -517,7 +517,6 @@ int spider_free_share_alloc(
|
|||||||
) {
|
) {
|
||||||
int roop_count;
|
int roop_count;
|
||||||
DBUG_ENTER("spider_free_share_alloc");
|
DBUG_ENTER("spider_free_share_alloc");
|
||||||
if (share->dbton_bitmap)
|
|
||||||
{
|
{
|
||||||
for (roop_count = SPIDER_DBTON_SIZE - 1; roop_count >= 0; roop_count--)
|
for (roop_count = SPIDER_DBTON_SIZE - 1; roop_count >= 0; roop_count--)
|
||||||
{
|
{
|
||||||
|
@ -1329,19 +1329,22 @@ btr_cur_ins_lock_and_undo(
|
|||||||
index, thr, mtr, inherit);
|
index, thr, mtr, inherit);
|
||||||
|
|
||||||
if (err != DB_SUCCESS
|
if (err != DB_SUCCESS
|
||||||
|
|| !(~flags | (BTR_NO_UNDO_LOG_FLAG | BTR_KEEP_SYS_FLAG))
|
||||||
|| !dict_index_is_clust(index) || dict_index_is_ibuf(index)) {
|
|| !dict_index_is_clust(index) || dict_index_is_ibuf(index)) {
|
||||||
|
|
||||||
return(err);
|
return(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
err = trx_undo_report_row_operation(flags, TRX_UNDO_INSERT_OP,
|
if (flags & BTR_NO_UNDO_LOG_FLAG) {
|
||||||
thr, index, entry,
|
roll_ptr = 0;
|
||||||
|
} else {
|
||||||
|
err = trx_undo_report_row_operation(thr, index, entry,
|
||||||
NULL, 0, NULL, NULL,
|
NULL, 0, NULL, NULL,
|
||||||
&roll_ptr);
|
&roll_ptr);
|
||||||
if (err != DB_SUCCESS) {
|
if (err != DB_SUCCESS) {
|
||||||
|
|
||||||
return(err);
|
return(err);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Now we can fill in the roll ptr field in entry */
|
/* 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;
|
btr_cur_t* cursor, /*!< in: cursor on page after which to insert;
|
||||||
cursor stays valid */
|
cursor stays valid */
|
||||||
ulint** offsets,/*!< out: offsets on *rec */
|
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 */
|
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||||
rec_t** rec, /*!< out: pointer to inserted record if
|
rec_t** rec, /*!< out: pointer to inserted record if
|
||||||
succeed */
|
succeed */
|
||||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||||
be stored externally by the caller, or
|
be stored externally by the caller */
|
||||||
NULL */
|
|
||||||
ulint n_ext, /*!< in: number of externally stored columns */
|
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;
|
mtr_t* mtr) /*!< in/out: mini-transaction;
|
||||||
if this function returns DB_SUCCESS on
|
if this function returns DB_SUCCESS on
|
||||||
a leaf page of a secondary index in a
|
a leaf page of a secondary index in a
|
||||||
@ -1418,6 +1423,7 @@ btr_cur_optimistic_insert(
|
|||||||
ulint rec_size;
|
ulint rec_size;
|
||||||
dberr_t err;
|
dberr_t err;
|
||||||
|
|
||||||
|
ut_ad(thr || !(~flags & (BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG)));
|
||||||
*big_rec = NULL;
|
*big_rec = NULL;
|
||||||
|
|
||||||
block = btr_cur_get_block(cursor);
|
block = btr_cur_get_block(cursor);
|
||||||
@ -1427,7 +1433,10 @@ btr_cur_optimistic_insert(
|
|||||||
page = buf_block_get_frame(block);
|
page = buf_block_get_frame(block);
|
||||||
index = cursor->index;
|
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));
|
|| mtr_memo_contains(mtr, block, MTR_MEMO_PAGE_X_FIX));
|
||||||
ut_ad(!dict_index_is_online_ddl(index)
|
ut_ad(!dict_index_is_online_ddl(index)
|
||||||
|| dict_index_is_clust(index)
|
|| dict_index_is_clust(index)
|
||||||
@ -1568,7 +1577,7 @@ fail_err:
|
|||||||
goto fail_err;
|
goto fail_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(thr && thr_get_trx(thr)->fake_changes)) {
|
if (UNIV_UNLIKELY(fake_changes)) {
|
||||||
/* skip CHANGE, LOG */
|
/* skip CHANGE, LOG */
|
||||||
*big_rec = big_rec_vec;
|
*big_rec = big_rec_vec;
|
||||||
return(err); /* == DB_SUCCESS */
|
return(err); /* == DB_SUCCESS */
|
||||||
@ -1686,15 +1695,17 @@ btr_cur_pessimistic_insert(
|
|||||||
cursor stays valid */
|
cursor stays valid */
|
||||||
ulint** offsets,/*!< out: offsets on *rec */
|
ulint** offsets,/*!< out: offsets on *rec */
|
||||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap
|
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 */
|
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||||
rec_t** rec, /*!< out: pointer to inserted record if
|
rec_t** rec, /*!< out: pointer to inserted record if
|
||||||
succeed */
|
succeed */
|
||||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||||
be stored externally by the caller, or
|
be stored externally by the caller */
|
||||||
NULL */
|
|
||||||
ulint n_ext, /*!< in: number of externally stored columns */
|
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 */
|
mtr_t* mtr) /*!< in/out: mini-transaction */
|
||||||
{
|
{
|
||||||
dict_index_t* index = cursor->index;
|
dict_index_t* index = cursor->index;
|
||||||
@ -1706,13 +1717,17 @@ btr_cur_pessimistic_insert(
|
|||||||
ulint n_reserved = 0;
|
ulint n_reserved = 0;
|
||||||
|
|
||||||
ut_ad(dtuple_check_typed(entry));
|
ut_ad(dtuple_check_typed(entry));
|
||||||
|
ut_ad(thr || !(~flags & (BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG)));
|
||||||
|
|
||||||
*big_rec = NULL;
|
*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)),
|
dict_index_get_lock(btr_cur_get_index(cursor)),
|
||||||
MTR_MEMO_X_LOCK));
|
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));
|
MTR_MEMO_PAGE_X_FIX));
|
||||||
ut_ad(!dict_index_is_online_ddl(index)
|
ut_ad(!dict_index_is_online_ddl(index)
|
||||||
|| dict_index_is_clust(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 */
|
/* skip CHANGE, LOG */
|
||||||
if (n_reserved > 0) {
|
if (n_reserved > 0) {
|
||||||
fil_space_release_free_extents(index->space,
|
fil_space_release_free_extents(index->space,
|
||||||
@ -1871,7 +1886,9 @@ btr_cur_upd_lock_and_undo(
|
|||||||
const rec_t* rec;
|
const rec_t* rec;
|
||||||
dberr_t err;
|
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 */
|
/* skip LOCK, UNDO */
|
||||||
return(DB_SUCCESS);
|
return(DB_SUCCESS);
|
||||||
}
|
}
|
||||||
@ -1906,9 +1923,10 @@ btr_cur_upd_lock_and_undo(
|
|||||||
|
|
||||||
/* Append the info about the update in the undo log */
|
/* Append the info about the update in the undo log */
|
||||||
|
|
||||||
return(trx_undo_report_row_operation(
|
return((flags & BTR_NO_UNDO_LOG_FLAG)
|
||||||
flags, TRX_UNDO_MODIFY_OP, thr,
|
? DB_SUCCESS
|
||||||
index, NULL, update,
|
: trx_undo_report_row_operation(
|
||||||
|
thr, index, NULL, update,
|
||||||
cmpl_info, rec, offsets, roll_ptr));
|
cmpl_info, rec, offsets, roll_ptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2659,12 +2677,12 @@ btr_cur_pessimistic_update(
|
|||||||
ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */
|
ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */
|
||||||
mem_heap_t** offsets_heap,
|
mem_heap_t** offsets_heap,
|
||||||
/*!< in/out: pointer to memory heap
|
/*!< in/out: pointer to memory heap
|
||||||
that can be emptied, or NULL */
|
that can be emptied */
|
||||||
mem_heap_t* entry_heap,
|
mem_heap_t* entry_heap,
|
||||||
/*!< in/out: memory heap for allocating
|
/*!< in/out: memory heap for allocating
|
||||||
big_rec and the index tuple */
|
big_rec and the index tuple */
|
||||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
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
|
const upd_t* update, /*!< in: update vector; this is allowed also
|
||||||
contain trx id and roll ptr fields, but
|
contain trx id and roll ptr fields, but
|
||||||
the values in update vector have no effect */
|
the values in update vector have no effect */
|
||||||
@ -3239,7 +3257,7 @@ btr_cur_del_mark_set_clust_rec(
|
|||||||
return(err);
|
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,
|
index, NULL, NULL, 0, rec, offsets,
|
||||||
&roll_ptr);
|
&roll_ptr);
|
||||||
if (err != DB_SUCCESS) {
|
if (err != DB_SUCCESS) {
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2008, Google Inc.
|
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
|
Portions of this file contain modifications contributed and copyrighted by
|
||||||
Google, Inc. Those modifications are gratefully acknowledged and are described
|
Google, Inc. Those modifications are gratefully acknowledged and are described
|
||||||
@ -1509,8 +1509,6 @@ buf_pool_init_instance(
|
|||||||
buf_pool->chunks = chunk =
|
buf_pool->chunks = chunk =
|
||||||
(buf_chunk_t*) mem_zalloc(sizeof *chunk);
|
(buf_chunk_t*) mem_zalloc(sizeof *chunk);
|
||||||
|
|
||||||
UT_LIST_INIT(buf_pool->free);
|
|
||||||
|
|
||||||
if (!buf_chunk_init(buf_pool, chunk, buf_pool_size)) {
|
if (!buf_chunk_init(buf_pool, chunk, buf_pool_size)) {
|
||||||
mem_free(chunk);
|
mem_free(chunk);
|
||||||
mem_free(buf_pool);
|
mem_free(buf_pool);
|
||||||
|
@ -2063,8 +2063,6 @@ fil_init(
|
|||||||
fil_system->spaces = hash_create(hash_size);
|
fil_system->spaces = hash_create(hash_size);
|
||||||
fil_system->name_hash = 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_system->max_n_open = max_n_open;
|
||||||
|
|
||||||
fil_space_crypt_init();
|
fil_space_crypt_init();
|
||||||
@ -2791,14 +2789,12 @@ fil_op_log_parse_or_replay(
|
|||||||
} else if (log_flags & MLOG_FILE_FLAG_TEMP) {
|
} else if (log_flags & MLOG_FILE_FLAG_TEMP) {
|
||||||
/* Temporary table, do nothing */
|
/* Temporary table, do nothing */
|
||||||
} else {
|
} else {
|
||||||
const char* path = NULL;
|
|
||||||
|
|
||||||
/* Create the database directory for name, if it does
|
/* Create the database directory for name, if it does
|
||||||
not exist yet */
|
not exist yet */
|
||||||
fil_create_directory_for_tablename(name);
|
fil_create_directory_for_tablename(name);
|
||||||
|
|
||||||
if (fil_create_new_single_table_tablespace(
|
if (fil_create_new_single_table_tablespace(
|
||||||
space_id, name, path, flags,
|
space_id, name, NULL, flags,
|
||||||
DICT_TF2_USE_TABLESPACE,
|
DICT_TF2_USE_TABLESPACE,
|
||||||
FIL_IBD_FILE_INITIAL_SIZE,
|
FIL_IBD_FILE_INITIAL_SIZE,
|
||||||
FIL_ENCRYPTION_DEFAULT,
|
FIL_ENCRYPTION_DEFAULT,
|
||||||
|
@ -872,17 +872,6 @@ innobase_purge_changed_page_bitmaps(
|
|||||||
ulonglong lsn) __attribute__((unused)); /*!< in: LSN to purge files up to */
|
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
|
/** Get the list of foreign keys referencing a specified table
|
||||||
table.
|
table.
|
||||||
@param thd The thread handle
|
@param thd The thread handle
|
||||||
@ -4598,22 +4587,6 @@ innobase_purge_changed_page_bitmaps(
|
|||||||
return (my_bool)log_online_purge_changed_page_bitmaps(lsn);
|
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. */
|
Commits a transaction in an InnoDB database. */
|
||||||
static
|
static
|
||||||
@ -9140,8 +9113,8 @@ calc_row_difference(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (o_len != n_len || (o_len != UNIV_SQL_NULL &&
|
if (o_len != n_len || (o_len != 0 && o_len != UNIV_SQL_NULL
|
||||||
0 != memcmp(o_ptr, n_ptr, o_len))) {
|
&& 0 != memcmp(o_ptr, n_ptr, o_len))) {
|
||||||
/* The field has changed */
|
/* The field has changed */
|
||||||
|
|
||||||
ufield = uvect->fields + n_changed;
|
ufield = uvect->fields + n_changed;
|
||||||
@ -15071,7 +15044,8 @@ fill_foreign_key_list(THD* thd,
|
|||||||
{
|
{
|
||||||
ut_ad(mutex_own(&dict_sys->mutex));
|
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) {
|
it != table->referenced_set.end(); ++it) {
|
||||||
|
|
||||||
dict_foreign_t* foreign = *it;
|
dict_foreign_t* foreign = *it;
|
||||||
|
@ -540,7 +540,7 @@ innobase_index_name_is_reserved(
|
|||||||
const KEY* key_info, /*!< in: Indexes to be created */
|
const KEY* key_info, /*!< in: Indexes to be created */
|
||||||
ulint num_of_keys) /*!< in: Number of indexes to
|
ulint num_of_keys) /*!< in: Number of indexes to
|
||||||
be created. */
|
be created. */
|
||||||
MY_ATTRIBUTE((nonnull, warn_unused_result));
|
MY_ATTRIBUTE((nonnull(1), warn_unused_result));
|
||||||
|
|
||||||
/*****************************************************************//**
|
/*****************************************************************//**
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
|
@ -2307,10 +2307,10 @@ online_retry_drop_indexes_with_trx(
|
|||||||
@param drop_fk constraints being dropped
|
@param drop_fk constraints being dropped
|
||||||
@param n_drop_fk number of constraints that are being dropped
|
@param n_drop_fk number of constraints that are being dropped
|
||||||
@return whether the constraint is 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
|
bool
|
||||||
innobase_dropping_foreign(
|
innobase_dropping_foreign(
|
||||||
/*======================*/
|
|
||||||
const dict_foreign_t* foreign,
|
const dict_foreign_t* foreign,
|
||||||
dict_foreign_t** drop_fk,
|
dict_foreign_t** drop_fk,
|
||||||
ulint n_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 true Not allowed (will call my_error())
|
||||||
@retval false Allowed
|
@retval false Allowed
|
||||||
*/
|
*/
|
||||||
static MY_ATTRIBUTE((pure, nonnull, warn_unused_result))
|
MY_ATTRIBUTE((pure, nonnull(1,4), warn_unused_result))
|
||||||
|
static
|
||||||
bool
|
bool
|
||||||
innobase_check_foreigns_low(
|
innobase_check_foreigns_low(
|
||||||
/*========================*/
|
|
||||||
const dict_table_t* user_table,
|
const dict_table_t* user_table,
|
||||||
dict_foreign_t** drop_fk,
|
dict_foreign_t** drop_fk,
|
||||||
ulint n_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 true Not allowed (will call my_error())
|
||||||
@retval false Allowed
|
@retval false Allowed
|
||||||
*/
|
*/
|
||||||
static MY_ATTRIBUTE((pure, nonnull, warn_unused_result))
|
MY_ATTRIBUTE((pure, nonnull(1,2,3,4), warn_unused_result))
|
||||||
|
static
|
||||||
bool
|
bool
|
||||||
innobase_check_foreigns(
|
innobase_check_foreigns(
|
||||||
/*====================*/
|
|
||||||
Alter_inplace_info* ha_alter_info,
|
Alter_inplace_info* ha_alter_info,
|
||||||
const TABLE* altered_table,
|
const TABLE* altered_table,
|
||||||
const TABLE* old_table,
|
const TABLE* old_table,
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 2007, 2016, Oracle and/or its affiliates.
|
Copyright (c) 2007, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyrigth (c) 2014, 2017, MariaDB Corporation
|
Copyright (c) 2014, 2017, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
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
|
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;
|
fields = table->field;
|
||||||
|
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
for (ulint j = 0; j < ib_vector_size(deleted->doc_ids); ++j) {
|
for (ulint j = 0; j < ib_vector_size(deleted->doc_ids); ++j) {
|
||||||
doc_id_t doc_id;
|
doc_id_t doc_id;
|
||||||
|
|
||||||
doc_id = *(doc_id_t*) ib_vector_get_const(deleted->doc_ids, j);
|
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);
|
trx_free_for_background(trx);
|
||||||
@ -2984,7 +2986,7 @@ i_s_fts_deleted_generic_fill(
|
|||||||
|
|
||||||
rw_lock_s_unlock(&dict_operation_lock);
|
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 */
|
fts_index_cache_t* index_cache, /*!< in: FTS index cache */
|
||||||
THD* thd, /*!< in: thread */
|
THD* thd, /*!< in: thread */
|
||||||
|
fts_string_t* conv_str, /*!< in/out: buffer */
|
||||||
TABLE_LIST* tables) /*!< in/out: tables to fill */
|
TABLE_LIST* tables) /*!< in/out: tables to fill */
|
||||||
{
|
{
|
||||||
TABLE* table = (TABLE*) tables->table;
|
TABLE* table = (TABLE*) tables->table;
|
||||||
Field** fields;
|
Field** fields;
|
||||||
CHARSET_INFO* index_charset;
|
CHARSET_INFO* index_charset;
|
||||||
const ib_rbt_node_t* rbt_node;
|
const ib_rbt_node_t* rbt_node;
|
||||||
fts_string_t conv_str;
|
|
||||||
uint dummy_errors;
|
uint dummy_errors;
|
||||||
char* word_str;
|
char* word_str;
|
||||||
|
|
||||||
@ -3237,10 +3239,9 @@ i_s_fts_index_cache_fill_one_index(
|
|||||||
fields = table->field;
|
fields = table->field;
|
||||||
|
|
||||||
index_charset = index_cache->charset;
|
index_charset = index_cache->charset;
|
||||||
conv_str.f_len = system_charset_info->mbmaxlen
|
conv_str->f_n_char = 0;
|
||||||
* FTS_MAX_WORD_LEN_IN_CHAR;
|
|
||||||
conv_str.f_str = static_cast<byte*>(ut_malloc(conv_str.f_len));
|
int ret = 0;
|
||||||
conv_str.f_n_char = 0;
|
|
||||||
|
|
||||||
/* Go through each word in the index cache */
|
/* Go through each word in the index cache */
|
||||||
for (rbt_node = rbt_first(index_cache->words);
|
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 */
|
/* Convert word from index charset to system_charset_info */
|
||||||
if (index_charset->cset != system_charset_info->cset) {
|
if (index_charset->cset != system_charset_info->cset) {
|
||||||
conv_str.f_n_char = my_convert(
|
conv_str->f_n_char = my_convert(
|
||||||
reinterpret_cast<char*>(conv_str.f_str),
|
reinterpret_cast<char*>(conv_str->f_str),
|
||||||
static_cast<uint32>(conv_str.f_len),
|
static_cast<uint32>(conv_str->f_len),
|
||||||
system_charset_info,
|
system_charset_info,
|
||||||
reinterpret_cast<char*>(word->text.f_str),
|
reinterpret_cast<char*>(word->text.f_str),
|
||||||
static_cast<uint32>(word->text.f_len),
|
static_cast<uint32>(word->text.f_len),
|
||||||
index_charset, &dummy_errors);
|
index_charset, &dummy_errors);
|
||||||
ut_ad(conv_str.f_n_char <= conv_str.f_len);
|
ut_ad(conv_str->f_n_char <= conv_str->f_len);
|
||||||
conv_str.f_str[conv_str.f_n_char] = 0;
|
conv_str->f_str[conv_str->f_n_char] = 0;
|
||||||
word_str = reinterpret_cast<char*>(conv_str.f_str);
|
word_str = reinterpret_cast<char*>(conv_str->f_str);
|
||||||
} else {
|
} else {
|
||||||
word_str = reinterpret_cast<char*>(word->text.f_str);
|
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(ret);
|
||||||
|
|
||||||
DBUG_RETURN(0);
|
|
||||||
}
|
}
|
||||||
/*******************************************************************//**
|
/*******************************************************************//**
|
||||||
Fill the dynamic table INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHED
|
Fill the dynamic table INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHED
|
||||||
@ -3365,18 +3364,27 @@ i_s_fts_index_cache_fill(
|
|||||||
|
|
||||||
ut_a(cache);
|
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++) {
|
for (ulint i = 0; i < ib_vector_size(cache->indexes); i++) {
|
||||||
fts_index_cache_t* index_cache;
|
fts_index_cache_t* index_cache;
|
||||||
|
|
||||||
index_cache = static_cast<fts_index_cache_t*> (
|
index_cache = static_cast<fts_index_cache_t*> (
|
||||||
ib_vector_get(cache->indexes, i));
|
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);
|
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);
|
DBUG_RETURN(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3694,13 +3700,13 @@ i_s_fts_index_table_fill_one_index(
|
|||||||
/*===============================*/
|
/*===============================*/
|
||||||
dict_index_t* index, /*!< in: FTS index */
|
dict_index_t* index, /*!< in: FTS index */
|
||||||
THD* thd, /*!< in: thread */
|
THD* thd, /*!< in: thread */
|
||||||
|
fts_string_t* conv_str, /*!< in/out: buffer */
|
||||||
TABLE_LIST* tables) /*!< in/out: tables to fill */
|
TABLE_LIST* tables) /*!< in/out: tables to fill */
|
||||||
{
|
{
|
||||||
ib_vector_t* words;
|
ib_vector_t* words;
|
||||||
mem_heap_t* heap;
|
mem_heap_t* heap;
|
||||||
fts_string_t word;
|
fts_string_t word;
|
||||||
CHARSET_INFO* index_charset;
|
CHARSET_INFO* index_charset;
|
||||||
fts_string_t conv_str;
|
|
||||||
dberr_t error;
|
dberr_t error;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
@ -3717,10 +3723,6 @@ i_s_fts_index_table_fill_one_index(
|
|||||||
word.f_n_char = 0;
|
word.f_n_char = 0;
|
||||||
|
|
||||||
index_charset = fts_index_get_charset(index);
|
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
|
/* Iterate through each auxiliary table as described in
|
||||||
fts_index_selector */
|
fts_index_selector */
|
||||||
@ -3754,17 +3756,17 @@ i_s_fts_index_table_fill_one_index(
|
|||||||
|
|
||||||
/* Fill into tables */
|
/* Fill into tables */
|
||||||
ret = i_s_fts_index_table_fill_one_fetch(
|
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) {
|
if (ret != 0) {
|
||||||
i_s_fts_index_table_free_one_fetch(words);
|
|
||||||
goto func_exit;
|
goto func_exit;
|
||||||
}
|
}
|
||||||
} while (has_more);
|
} while (has_more);
|
||||||
}
|
}
|
||||||
|
|
||||||
func_exit:
|
func_exit:
|
||||||
ut_free(conv_str.f_str);
|
|
||||||
mem_heap_free(heap);
|
mem_heap_free(heap);
|
||||||
|
|
||||||
DBUG_RETURN(ret);
|
DBUG_RETURN(ret);
|
||||||
@ -3806,10 +3808,17 @@ i_s_fts_index_table_fill(
|
|||||||
DBUG_RETURN(0);
|
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);
|
for (index = dict_table_get_first_index(user_table);
|
||||||
index; index = dict_table_get_next_index(index)) {
|
index; index = dict_table_get_next_index(index)) {
|
||||||
if (index->type & DICT_FTS) {
|
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);
|
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));
|
DBUG_ASSERT(!dict_index_is_online_ddl(index));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
while (fts_config_key[i]) {
|
while (fts_config_key[i]) {
|
||||||
fts_string_t value;
|
fts_string_t value;
|
||||||
char* key_name;
|
char* key_name;
|
||||||
@ -4006,13 +4019,14 @@ i_s_fts_config_fill(
|
|||||||
ut_free(key_name);
|
ut_free(key_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
OK(field_store_string(
|
BREAK_IF(ret = field_store_string(
|
||||||
fields[FTS_CONFIG_KEY], fts_config_key[i]));
|
fields[FTS_CONFIG_KEY], fts_config_key[i]));
|
||||||
|
|
||||||
OK(field_store_string(
|
BREAK_IF(ret = field_store_string(
|
||||||
fields[FTS_CONFIG_VALUE], (const char*) value.f_str));
|
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++;
|
i++;
|
||||||
}
|
}
|
||||||
@ -4025,7 +4039,7 @@ i_s_fts_config_fill(
|
|||||||
|
|
||||||
rw_lock_s_unlock(&dict_operation_lock);
|
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;
|
state_str = NULL;
|
||||||
|
|
||||||
OK(fields[IDX_BUFFER_POOL_ID]->store(
|
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(
|
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(
|
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(
|
OK(fields[IDX_BUFFER_PAGE_NUM]->store(
|
||||||
static_cast<double>(page_info->page_num)));
|
page_info->page_num, true));
|
||||||
|
|
||||||
OK(field_store_string(
|
OK(field_store_string(
|
||||||
fields[IDX_BUFFER_PAGE_TYPE],
|
fields[IDX_BUFFER_PAGE_TYPE],
|
||||||
i_s_page_type[page_info->page_type].type_str));
|
i_s_page_type[page_info->page_type].type_str));
|
||||||
|
|
||||||
OK(fields[IDX_BUFFER_PAGE_FLUSH_TYPE]->store(
|
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(
|
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],
|
||||||
OK(field_store_string(
|
page_info->hashed ? "YES" : "NO"));
|
||||||
fields[IDX_BUFFER_PAGE_HASHED], "YES"));
|
|
||||||
} else {
|
|
||||||
OK(field_store_string(
|
|
||||||
fields[IDX_BUFFER_PAGE_HASHED], "NO"));
|
|
||||||
}
|
|
||||||
|
|
||||||
OK(fields[IDX_BUFFER_PAGE_NEWEST_MOD]->store(
|
OK(fields[IDX_BUFFER_PAGE_NEWEST_MOD]->store(
|
||||||
(longlong) page_info->newest_mod, true));
|
(longlong) page_info->newest_mod, true));
|
||||||
@ -4900,7 +4909,7 @@ i_s_innodb_buffer_page_fill(
|
|||||||
(longlong) page_info->oldest_mod, true));
|
(longlong) page_info->oldest_mod, true));
|
||||||
|
|
||||||
OK(fields[IDX_BUFFER_PAGE_ACCESS_TIME]->store(
|
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();
|
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
|
/* If this is an index page, fetch the index name
|
||||||
and table name */
|
and table name */
|
||||||
if (page_info->page_type == I_S_PAGE_TYPE_INDEX) {
|
if (page_info->page_type == I_S_PAGE_TYPE_INDEX) {
|
||||||
const dict_index_t* index;
|
bool ret = false;
|
||||||
|
|
||||||
mutex_enter(&dict_sys->mutex);
|
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_end = innobase_convert_name(
|
||||||
table_name, sizeof(table_name),
|
table_name, sizeof(table_name),
|
||||||
index->table_name,
|
index->table_name,
|
||||||
strlen(index->table_name),
|
strlen(index->table_name),
|
||||||
thd, TRUE);
|
thd, TRUE);
|
||||||
|
|
||||||
OK(fields[IDX_BUFFER_PAGE_TABLE_NAME]->store(
|
ret = fields[IDX_BUFFER_PAGE_TABLE_NAME]
|
||||||
table_name,
|
->store(table_name,
|
||||||
static_cast<uint>(table_name_end - table_name),
|
static_cast<uint>(
|
||||||
system_charset_info));
|
table_name_end
|
||||||
fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_notnull();
|
- table_name),
|
||||||
|
system_charset_info)
|
||||||
OK(field_store_index_name(
|
|| field_store_index_name(
|
||||||
fields[IDX_BUFFER_PAGE_INDEX_NAME],
|
fields
|
||||||
index->name));
|
[IDX_BUFFER_PAGE_INDEX_NAME],
|
||||||
|
index->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_exit(&dict_sys->mutex);
|
mutex_exit(&dict_sys->mutex);
|
||||||
|
|
||||||
|
OK(ret);
|
||||||
|
|
||||||
|
fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_notnull();
|
||||||
}
|
}
|
||||||
|
|
||||||
OK(fields[IDX_BUFFER_PAGE_NUM_RECS]->store(
|
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(
|
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(
|
OK(fields[IDX_BUFFER_PAGE_ZIP_SIZE]->store(
|
||||||
page_info->zip_ssize
|
page_info->zip_ssize
|
||||||
? (UNIV_ZIP_SIZE_MIN >> 1) << page_info->zip_ssize
|
? (UNIV_ZIP_SIZE_MIN >> 1) << page_info->zip_ssize
|
||||||
: 0));
|
: 0, true));
|
||||||
|
|
||||||
#if BUF_PAGE_STATE_BITS > 3
|
#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"
|
# 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) {
|
switch (page_info->io_fix) {
|
||||||
case BUF_IO_NONE:
|
case BUF_IO_NONE:
|
||||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
state_str = "IO_NONE";
|
||||||
"IO_NONE"));
|
|
||||||
break;
|
break;
|
||||||
case BUF_IO_READ:
|
case BUF_IO_READ:
|
||||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
state_str = "IO_READ";
|
||||||
"IO_READ"));
|
|
||||||
break;
|
break;
|
||||||
case BUF_IO_WRITE:
|
case BUF_IO_WRITE:
|
||||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
state_str = "IO_WRITE";
|
||||||
"IO_WRITE"));
|
|
||||||
break;
|
break;
|
||||||
case BUF_IO_PIN:
|
case BUF_IO_PIN:
|
||||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
state_str = "IO_PIN";
|
||||||
"IO_PIN"));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
||||||
|
state_str));
|
||||||
|
|
||||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IS_OLD],
|
OK(field_store_string(fields[IDX_BUFFER_PAGE_IS_OLD],
|
||||||
(page_info->is_old) ? "YES" : "NO"));
|
(page_info->is_old) ? "YES" : "NO"));
|
||||||
|
|
||||||
OK(fields[IDX_BUFFER_PAGE_FREE_CLOCK]->store(
|
OK(fields[IDX_BUFFER_PAGE_FREE_CLOCK]->store(
|
||||||
page_info->freed_page_clock));
|
page_info->freed_page_clock));
|
||||||
|
|
||||||
if (schema_table_store_record(thd, table)) {
|
OK(schema_table_store_record(thd, table));
|
||||||
DBUG_RETURN(1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
@ -5550,17 +5560,10 @@ i_s_innodb_buf_page_lru_fill(
|
|||||||
ulint num_page) /*!< in: number of page info
|
ulint num_page) /*!< in: number of page info
|
||||||
cached */
|
cached */
|
||||||
{
|
{
|
||||||
TABLE* table;
|
|
||||||
Field** fields;
|
|
||||||
mem_heap_t* heap;
|
|
||||||
|
|
||||||
DBUG_ENTER("i_s_innodb_buf_page_lru_fill");
|
DBUG_ENTER("i_s_innodb_buf_page_lru_fill");
|
||||||
|
|
||||||
table = tables->table;
|
TABLE* table = tables->table;
|
||||||
|
Field** fields = table->field;
|
||||||
fields = table->field;
|
|
||||||
|
|
||||||
heap = mem_heap_create(1000);
|
|
||||||
|
|
||||||
/* Iterate through the cached array and fill the I_S table rows */
|
/* Iterate through the cached array and fill the I_S table rows */
|
||||||
for (ulint i = 0; i < num_page; i++) {
|
for (ulint i = 0; i < num_page; i++) {
|
||||||
@ -5575,34 +5578,28 @@ i_s_innodb_buf_page_lru_fill(
|
|||||||
page_info = info_array + i;
|
page_info = info_array + i;
|
||||||
|
|
||||||
OK(fields[IDX_BUF_LRU_POOL_ID]->store(
|
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(
|
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(
|
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(
|
OK(fields[IDX_BUF_LRU_PAGE_NUM]->store(
|
||||||
static_cast<double>(page_info->page_num)));
|
page_info->page_num, true));
|
||||||
|
|
||||||
OK(field_store_string(
|
OK(field_store_string(
|
||||||
fields[IDX_BUF_LRU_PAGE_TYPE],
|
fields[IDX_BUF_LRU_PAGE_TYPE],
|
||||||
i_s_page_type[page_info->page_type].type_str));
|
i_s_page_type[page_info->page_type].type_str));
|
||||||
|
|
||||||
OK(fields[IDX_BUF_LRU_PAGE_FLUSH_TYPE]->store(
|
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(
|
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],
|
||||||
OK(field_store_string(
|
page_info->hashed ? "YES" : "NO"));
|
||||||
fields[IDX_BUF_LRU_PAGE_HASHED], "YES"));
|
|
||||||
} else {
|
|
||||||
OK(field_store_string(
|
|
||||||
fields[IDX_BUF_LRU_PAGE_HASHED], "NO"));
|
|
||||||
}
|
|
||||||
|
|
||||||
OK(fields[IDX_BUF_LRU_PAGE_NEWEST_MOD]->store(
|
OK(fields[IDX_BUF_LRU_PAGE_NEWEST_MOD]->store(
|
||||||
page_info->newest_mod, true));
|
page_info->newest_mod, true));
|
||||||
@ -5611,7 +5608,7 @@ i_s_innodb_buf_page_lru_fill(
|
|||||||
page_info->oldest_mod, true));
|
page_info->oldest_mod, true));
|
||||||
|
|
||||||
OK(fields[IDX_BUF_LRU_PAGE_ACCESS_TIME]->store(
|
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();
|
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
|
/* If this is an index page, fetch the index name
|
||||||
and table name */
|
and table name */
|
||||||
if (page_info->page_type == I_S_PAGE_TYPE_INDEX) {
|
if (page_info->page_type == I_S_PAGE_TYPE_INDEX) {
|
||||||
const dict_index_t* index;
|
bool ret = false;
|
||||||
|
|
||||||
mutex_enter(&dict_sys->mutex);
|
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_end = innobase_convert_name(
|
||||||
table_name, sizeof(table_name),
|
table_name, sizeof(table_name),
|
||||||
index->table_name,
|
index->table_name,
|
||||||
strlen(index->table_name),
|
strlen(index->table_name),
|
||||||
thd, TRUE);
|
thd, TRUE);
|
||||||
|
|
||||||
OK(fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->store(
|
ret = fields[IDX_BUF_LRU_PAGE_TABLE_NAME]
|
||||||
table_name,
|
->store(table_name,
|
||||||
static_cast<uint>(table_name_end - table_name),
|
static_cast<uint>(
|
||||||
system_charset_info));
|
table_name_end
|
||||||
fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_notnull();
|
- table_name),
|
||||||
|
system_charset_info)
|
||||||
OK(field_store_index_name(
|
|| field_store_index_name(
|
||||||
fields[IDX_BUF_LRU_PAGE_INDEX_NAME],
|
fields
|
||||||
index->name));
|
[IDX_BUF_LRU_PAGE_INDEX_NAME],
|
||||||
|
index->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_exit(&dict_sys->mutex);
|
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(
|
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(
|
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(
|
OK(fields[IDX_BUF_LRU_PAGE_ZIP_SIZE]->store(
|
||||||
page_info->zip_ssize ?
|
page_info->zip_ssize
|
||||||
512 << page_info->zip_ssize : 0));
|
? 512 << page_info->zip_ssize : 0, true));
|
||||||
|
|
||||||
state = static_cast<enum buf_page_state>(page_info->page_state);
|
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) {
|
switch (page_info->io_fix) {
|
||||||
case BUF_IO_NONE:
|
case BUF_IO_NONE:
|
||||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX],
|
state_str = "IO_NONE";
|
||||||
"IO_NONE"));
|
|
||||||
break;
|
break;
|
||||||
case BUF_IO_READ:
|
case BUF_IO_READ:
|
||||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX],
|
state_str = "IO_READ";
|
||||||
"IO_READ"));
|
|
||||||
break;
|
break;
|
||||||
case BUF_IO_WRITE:
|
case BUF_IO_WRITE:
|
||||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX],
|
state_str = "IO_WRITE";
|
||||||
"IO_WRITE"));
|
break;
|
||||||
|
case BUF_IO_PIN:
|
||||||
|
state_str = "IO_PIN";
|
||||||
break;
|
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],
|
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(
|
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)) {
|
OK(schema_table_store_record(thd, table));
|
||||||
mem_heap_free(heap);
|
|
||||||
DBUG_RETURN(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mem_heap_empty(heap);
|
|
||||||
}
|
|
||||||
|
|
||||||
mem_heap_free(heap);
|
|
||||||
|
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 2007, 2013, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
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
|
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); \
|
DBUG_RETURN(1); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define BREAK_IF(expr) if ((expr)) break
|
||||||
|
|
||||||
#define RETURN_IF_INNODB_NOT_STARTED(plugin_name) \
|
#define RETURN_IF_INNODB_NOT_STARTED(plugin_name) \
|
||||||
do { \
|
do { \
|
||||||
if (!srv_was_started) { \
|
if (!srv_was_started) { \
|
||||||
|
@ -2963,8 +2963,7 @@ ibuf_get_volume_buffered_hash(
|
|||||||
fold = ut_fold_binary(data, len);
|
fold = ut_fold_binary(data, len);
|
||||||
|
|
||||||
hash += (fold / (CHAR_BIT * sizeof *hash)) % size;
|
hash += (fold / (CHAR_BIT * sizeof *hash)) % size;
|
||||||
bitmask = static_cast<ulint>(
|
bitmask = static_cast<ulint>(1) << (fold % (CHAR_BIT * sizeof(*hash)));
|
||||||
1 << (fold % (CHAR_BIT * sizeof(*hash))));
|
|
||||||
|
|
||||||
if (*hash & bitmask) {
|
if (*hash & bitmask) {
|
||||||
|
|
||||||
@ -3733,7 +3732,7 @@ fail_exit:
|
|||||||
|
|
||||||
if (mode == BTR_MODIFY_PREV) {
|
if (mode == BTR_MODIFY_PREV) {
|
||||||
err = btr_cur_optimistic_insert(
|
err = btr_cur_optimistic_insert(
|
||||||
BTR_NO_LOCKING_FLAG,
|
BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG,
|
||||||
cursor, &offsets, &offsets_heap,
|
cursor, &offsets, &offsets_heap,
|
||||||
ibuf_entry, &ins_rec,
|
ibuf_entry, &ins_rec,
|
||||||
&dummy_big_rec, 0, thr, &mtr);
|
&dummy_big_rec, 0, thr, &mtr);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
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
|
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;
|
btr_cur_t* cursor, /*!< in: cursor on page after which to insert;
|
||||||
cursor stays valid */
|
cursor stays valid */
|
||||||
ulint** offsets,/*!< out: offsets on *rec */
|
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 */
|
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||||
rec_t** rec, /*!< out: pointer to inserted record if
|
rec_t** rec, /*!< out: pointer to inserted record if
|
||||||
succeed */
|
succeed */
|
||||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||||
be stored externally by the caller, or
|
be stored externally by the caller */
|
||||||
NULL */
|
|
||||||
ulint n_ext, /*!< in: number of externally stored columns */
|
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;
|
mtr_t* mtr) /*!< in/out: mini-transaction;
|
||||||
if this function returns DB_SUCCESS on
|
if this function returns DB_SUCCESS on
|
||||||
a leaf page of a secondary index in a
|
a leaf page of a secondary index in a
|
||||||
@ -256,15 +259,17 @@ btr_cur_pessimistic_insert(
|
|||||||
cursor stays valid */
|
cursor stays valid */
|
||||||
ulint** offsets,/*!< out: offsets on *rec */
|
ulint** offsets,/*!< out: offsets on *rec */
|
||||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap
|
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 */
|
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||||
rec_t** rec, /*!< out: pointer to inserted record if
|
rec_t** rec, /*!< out: pointer to inserted record if
|
||||||
succeed */
|
succeed */
|
||||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||||
be stored externally by the caller, or
|
be stored externally by the caller */
|
||||||
NULL */
|
|
||||||
ulint n_ext, /*!< in: number of externally stored columns */
|
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 */
|
mtr_t* mtr) /*!< in/out: mini-transaction */
|
||||||
MY_ATTRIBUTE((nonnull(2,3,4,5,6,7,10), warn_unused_result));
|
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 */
|
ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */
|
||||||
mem_heap_t** offsets_heap,
|
mem_heap_t** offsets_heap,
|
||||||
/*!< in/out: pointer to memory heap
|
/*!< in/out: pointer to memory heap
|
||||||
that can be emptied, or NULL */
|
that can be emptied */
|
||||||
mem_heap_t* entry_heap,
|
mem_heap_t* entry_heap,
|
||||||
/*!< in/out: memory heap for allocating
|
/*!< in/out: memory heap for allocating
|
||||||
big_rec and the index tuple */
|
big_rec and the index tuple */
|
||||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
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
|
const upd_t* update, /*!< in: update vector; this is allowed also
|
||||||
contain trx id and roll ptr fields, but
|
contain trx id and roll ptr fields, but
|
||||||
the values in update vector have no effect */
|
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 */
|
must be >= FIL_IBD_FILE_INITIAL_SIZE */
|
||||||
fil_encryption_t mode, /*!< in: encryption mode */
|
fil_encryption_t mode, /*!< in: encryption mode */
|
||||||
ulint key_id) /*!< in: encryption key_id */
|
ulint key_id) /*!< in: encryption key_id */
|
||||||
__attribute__((nonnull, warn_unused_result));
|
MY_ATTRIBUTE((nonnull(2), warn_unused_result));
|
||||||
#ifndef UNIV_HOTBACKUP
|
#ifndef UNIV_HOTBACKUP
|
||||||
/** Try to adjust FSP_SPACE_FLAGS if they differ from the expectations.
|
/** Try to adjust FSP_SPACE_FLAGS if they differ from the expectations.
|
||||||
(Typically when upgrading from MariaDB 10.1.0..10.1.20.)
|
(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) 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
|
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
|
the terms of the GNU General Public License as published by the Free Software
|
||||||
@ -143,7 +144,7 @@ enum durability_properties
|
|||||||
thd_requested_durability(
|
thd_requested_durability(
|
||||||
/*=====================*/
|
/*=====================*/
|
||||||
const THD* thd) /*!< in: thread handle */
|
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
|
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));
|
compile_time_assert(!atomic || sizeof(Type) == sizeof(ulint));
|
||||||
if (atomic) {
|
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 {
|
} else {
|
||||||
return m_counter += i;
|
return m_counter += i;
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
Copyright (c) 2005, 2013, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 2005, 2013, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2012, Facebook Inc.
|
Copyright (c) 2012, Facebook Inc.
|
||||||
|
Copyright (c) 2017, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
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
|
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 */
|
ignored if zip_size == 0 */
|
||||||
ulint zip_size) /*!< in: compressed page size in bytes, or 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(ut_is_2pow(zip_size));
|
||||||
ut_ad(comp || !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) 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
|
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
|
the terms of the GNU General Public License as published by the Free Software
|
||||||
@ -212,10 +213,6 @@ UNIV_INTERN
|
|||||||
dberr_t
|
dberr_t
|
||||||
trx_undo_report_row_operation(
|
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 */
|
que_thr_t* thr, /*!< in: query thread */
|
||||||
dict_index_t* index, /*!< in: clustered index */
|
dict_index_t* index, /*!< in: clustered index */
|
||||||
const dtuple_t* clust_entry, /*!< in: in the case of an insert,
|
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,
|
inserted undo log record,
|
||||||
0 if BTR_NO_UNDO_LOG
|
0 if BTR_NO_UNDO_LOG
|
||||||
flag was specified */
|
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
|
Copies an undo record to heap. This function can be called if we know that
|
||||||
the undo log record exists.
|
the undo log record exists.
|
||||||
@ -313,10 +310,6 @@ record */
|
|||||||
storage fields: used by purge to
|
storage fields: used by purge to
|
||||||
free the external storage */
|
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
|
#ifndef UNIV_NONINL
|
||||||
#include "trx0rec.ic"
|
#include "trx0rec.ic"
|
||||||
#endif
|
#endif
|
||||||
|
@ -1293,9 +1293,11 @@ rec_convert_dtuple_to_rec_comp(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (len) {
|
||||||
memcpy(end, dfield_get_data(field), len);
|
memcpy(end, dfield_get_data(field), len);
|
||||||
end += len;
|
end += len;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************//**
|
/*********************************************************//**
|
||||||
|
@ -249,9 +249,6 @@ row_fts_psort_info_init(
|
|||||||
each parallel sort thread. Each "sort bucket" holds records for
|
each parallel sort thread. Each "sort bucket" holds records for
|
||||||
a particular "FTS index partition" */
|
a particular "FTS index partition" */
|
||||||
for (j = 0; j < fts_sort_pll_degree; j++) {
|
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++) {
|
for (i = 0; i < FTS_NUM_AUX_INDEX; i++) {
|
||||||
|
|
||||||
psort_info[j].merge_file[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) 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
|
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
|
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_SUCCESS if no error
|
||||||
@retval DB_DUPLICATE_KEY if error,
|
@retval DB_DUPLICATE_KEY if error,
|
||||||
@retval DB_LOCK_WAIT if we have to wait for a lock on a possible duplicate
|
@retval DB_LOCK_WAIT if we have to wait for a lock on a possible duplicate
|
||||||
record
|
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)) */
|
|
||||||
static MY_ATTRIBUTE((nonnull, warn_unused_result))
|
static MY_ATTRIBUTE((nonnull, warn_unused_result))
|
||||||
dberr_t
|
dberr_t
|
||||||
row_ins_duplicate_error_in_clust(
|
row_ins_duplicate_error_in_clust(
|
||||||
/*=============================*/
|
|
||||||
ulint flags, /*!< in: undo logging and locking flags */
|
|
||||||
btr_cur_t* cursor, /*!< in: B-tree cursor */
|
btr_cur_t* cursor, /*!< in: B-tree cursor */
|
||||||
const dtuple_t* entry, /*!< in: entry to insert */
|
const dtuple_t* entry, /*!< in: entry to insert */
|
||||||
que_thr_t* thr, /*!< in: query thread */
|
que_thr_t* thr, /*!< in: query thread */
|
||||||
@ -2454,7 +2451,7 @@ row_ins_clust_index_entry_low(
|
|||||||
DB_LOCK_WAIT */
|
DB_LOCK_WAIT */
|
||||||
|
|
||||||
err = row_ins_duplicate_error_in_clust(
|
err = row_ins_duplicate_error_in_clust(
|
||||||
flags, &cursor, entry, thr, &mtr);
|
&cursor, entry, thr, &mtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (err != DB_SUCCESS) {
|
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;
|
UNIV_INTERN my_bool srv_master_thread_priority = FALSE;
|
||||||
|
|
||||||
/* The number of purge threads to use.*/
|
/* 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 */
|
/* the number of pages to purge in one batch */
|
||||||
UNIV_INTERN ulong srv_purge_batch_size = 20;
|
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. */
|
/** Acquire the system_mutex. */
|
||||||
#define srv_sys_mutex_enter() do { \
|
#define srv_sys_mutex_enter() do { \
|
||||||
mutex_enter(&srv_sys->mutex); \
|
mutex_enter(&srv_sys.mutex); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/** Test if the system mutex is owned. */
|
/** 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)
|
&& !srv_read_only_mode)
|
||||||
|
|
||||||
/** Release the system mutex. */
|
/** Release the system mutex. */
|
||||||
#define srv_sys_mutex_exit() do { \
|
#define srv_sys_mutex_exit() do { \
|
||||||
mutex_exit(&srv_sys->mutex); \
|
mutex_exit(&srv_sys.mutex); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define fetch_lock_wait_timeout(trx) \
|
#define fetch_lock_wait_timeout(trx) \
|
||||||
@ -798,7 +798,7 @@ struct srv_sys_t{
|
|||||||
ulint n_sys_threads; /*!< size of the sys_threads
|
ulint n_sys_threads; /*!< size of the sys_threads
|
||||||
array */
|
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_set() and
|
||||||
os_event_reset() on
|
os_event_reset() on
|
||||||
sys_threads[]->event are
|
sys_threads[]->event are
|
||||||
@ -822,7 +822,7 @@ struct srv_sys_t{
|
|||||||
UNIV_INTERN ib_mutex_t server_mutex;
|
UNIV_INTERN ib_mutex_t server_mutex;
|
||||||
#endif /* !HAVE_ATOMIC_BUILTINS */
|
#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.
|
/** Event to signal srv_monitor_thread. Not protected by a mutex.
|
||||||
Set after setting srv_print_innodb_monitor. */
|
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_dump_at_shutdown = FALSE;
|
||||||
UNIV_INTERN char srv_buffer_pool_load_at_startup = 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;
|
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;
|
static const ulint SRV_MASTER_SLOT = 0;
|
||||||
|
|
||||||
UNIV_INTERN os_event_t srv_checkpoint_completed_event;
|
UNIV_INTERN os_event_t srv_checkpoint_completed_event;
|
||||||
@ -957,21 +957,21 @@ srv_reserve_slot(
|
|||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SRV_MASTER:
|
case SRV_MASTER:
|
||||||
slot = &srv_sys->sys_threads[SRV_MASTER_SLOT];
|
slot = &srv_sys.sys_threads[SRV_MASTER_SLOT];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SRV_PURGE:
|
case SRV_PURGE:
|
||||||
slot = &srv_sys->sys_threads[SRV_PURGE_SLOT];
|
slot = &srv_sys.sys_threads[SRV_PURGE_SLOT];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SRV_WORKER:
|
case SRV_WORKER:
|
||||||
/* Find an empty slot, skip the master and purge slots. */
|
/* 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->in_use;
|
||||||
++slot) {
|
++slot) {
|
||||||
|
|
||||||
ut_a(slot < &srv_sys->sys_threads[
|
ut_a(slot < &srv_sys.sys_threads[
|
||||||
srv_sys->n_sys_threads]);
|
srv_sys.n_sys_threads]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -987,7 +987,7 @@ srv_reserve_slot(
|
|||||||
|
|
||||||
ut_ad(srv_slot_get_type(slot) == type);
|
ut_ad(srv_slot_get_type(slot) == type);
|
||||||
|
|
||||||
++srv_sys->n_threads_active[type];
|
++srv_sys.n_threads_active[type];
|
||||||
|
|
||||||
srv_sys_mutex_exit();
|
srv_sys_mutex_exit();
|
||||||
|
|
||||||
@ -1017,27 +1017,27 @@ srv_suspend_thread_low(
|
|||||||
case SRV_MASTER:
|
case SRV_MASTER:
|
||||||
/* We have only one master thread and it
|
/* We have only one master thread and it
|
||||||
should be the first entry always. */
|
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;
|
break;
|
||||||
|
|
||||||
case SRV_PURGE:
|
case SRV_PURGE:
|
||||||
/* We have only one purge coordinator thread
|
/* We have only one purge coordinator thread
|
||||||
and it should be the second entry always. */
|
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;
|
break;
|
||||||
|
|
||||||
case SRV_WORKER:
|
case SRV_WORKER:
|
||||||
ut_a(srv_n_purge_threads > 1);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ut_a(!slot->suspended);
|
ut_a(!slot->suspended);
|
||||||
slot->suspended = TRUE;
|
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));
|
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);
|
ut_ad(slot->suspended);
|
||||||
|
|
||||||
slot->suspended = FALSE;
|
slot->suspended = FALSE;
|
||||||
++srv_sys->n_threads_active[slot->type];
|
++srv_sys.n_threads_active[slot->type];
|
||||||
srv_sys_mutex_exit();
|
srv_sys_mutex_exit();
|
||||||
return(timeout);
|
return(timeout);
|
||||||
}
|
}
|
||||||
@ -1114,8 +1114,8 @@ srv_release_threads(enum srv_thread_type type, ulint n)
|
|||||||
|
|
||||||
srv_sys_mutex_enter();
|
srv_sys_mutex_enter();
|
||||||
|
|
||||||
for (ulint i = 0; i < srv_sys->n_sys_threads; i++) {
|
for (ulint i = 0; i < srv_sys.n_sys_threads; i++) {
|
||||||
srv_slot_t* slot = &srv_sys->sys_threads[i];
|
srv_slot_t* slot = &srv_sys.sys_threads[i];
|
||||||
|
|
||||||
if (!slot->in_use || srv_slot_get_type(slot) != type) {
|
if (!slot->in_use || srv_slot_get_type(slot) != type) {
|
||||||
continue;
|
continue;
|
||||||
@ -1135,7 +1135,7 @@ srv_release_threads(enum srv_thread_type type, ulint n)
|
|||||||
should be the first entry always. */
|
should be the first entry always. */
|
||||||
ut_a(n == 1);
|
ut_a(n == 1);
|
||||||
ut_a(i == SRV_MASTER_SLOT);
|
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;
|
break;
|
||||||
|
|
||||||
case SRV_PURGE:
|
case SRV_PURGE:
|
||||||
@ -1144,12 +1144,12 @@ srv_release_threads(enum srv_thread_type type, ulint n)
|
|||||||
ut_a(n == 1);
|
ut_a(n == 1);
|
||||||
ut_a(i == SRV_PURGE_SLOT);
|
ut_a(i == SRV_PURGE_SLOT);
|
||||||
ut_a(srv_n_purge_threads > 0);
|
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;
|
break;
|
||||||
|
|
||||||
case SRV_WORKER:
|
case SRV_WORKER:
|
||||||
ut_a(srv_n_purge_threads > 1);
|
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);
|
< srv_n_purge_threads - 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1187,9 +1187,6 @@ void
|
|||||||
srv_init(void)
|
srv_init(void)
|
||||||
/*==========*/
|
/*==========*/
|
||||||
{
|
{
|
||||||
ulint n_sys_threads = 0;
|
|
||||||
ulint srv_sys_sz = sizeof(*srv_sys);
|
|
||||||
|
|
||||||
#ifndef HAVE_ATOMIC_BUILTINS
|
#ifndef HAVE_ATOMIC_BUILTINS
|
||||||
mutex_create(server_mutex_key, &server_mutex, SYNC_ANY_LATCH);
|
mutex_create(server_mutex_key, &server_mutex, SYNC_ANY_LATCH);
|
||||||
#endif /* !HAVE_ATOMIC_BUILTINS */
|
#endif /* !HAVE_ATOMIC_BUILTINS */
|
||||||
@ -1197,29 +1194,19 @@ srv_init(void)
|
|||||||
mutex_create(srv_innodb_monitor_mutex_key,
|
mutex_create(srv_innodb_monitor_mutex_key,
|
||||||
&srv_innodb_monitor_mutex, SYNC_NO_ORDER_CHECK);
|
&srv_innodb_monitor_mutex, SYNC_NO_ORDER_CHECK);
|
||||||
|
|
||||||
if (!srv_read_only_mode) {
|
srv_sys.n_sys_threads = srv_read_only_mode
|
||||||
|
? 0
|
||||||
/* Number of purge threads + master thread */
|
: srv_n_purge_threads + 1/* purge coordinator */;
|
||||||
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;
|
|
||||||
|
|
||||||
if (!srv_read_only_mode) {
|
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,
|
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();
|
slot->event = os_event_create();
|
||||||
|
|
||||||
@ -1239,8 +1226,6 @@ srv_init(void)
|
|||||||
if (srv_track_changed_pages) {
|
if (srv_track_changed_pages) {
|
||||||
os_event_set(srv_redo_log_tracked_event);
|
os_event_set(srv_redo_log_tracked_event);
|
||||||
}
|
}
|
||||||
|
|
||||||
UT_LIST_INIT(srv_sys->tasks);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* page_zip_stat_per_index_mutex is acquired from:
|
/* page_zip_stat_per_index_mutex is acquired from:
|
||||||
@ -1288,8 +1273,8 @@ srv_free(void)
|
|||||||
|
|
||||||
if (!srv_read_only_mode) {
|
if (!srv_read_only_mode) {
|
||||||
|
|
||||||
for (ulint i = 0; i < srv_sys->n_sys_threads; i++)
|
for (ulint i = 0; i < srv_sys.n_sys_threads; i++)
|
||||||
os_event_free(srv_sys->sys_threads[i].event);
|
os_event_free(srv_sys.sys_threads[i].event);
|
||||||
|
|
||||||
os_event_free(srv_error_event);
|
os_event_free(srv_error_event);
|
||||||
srv_error_event = NULL;
|
srv_error_event = NULL;
|
||||||
@ -1301,8 +1286,8 @@ srv_free(void)
|
|||||||
srv_checkpoint_completed_event = NULL;
|
srv_checkpoint_completed_event = NULL;
|
||||||
os_event_free(srv_redo_log_tracked_event);
|
os_event_free(srv_redo_log_tracked_event);
|
||||||
srv_redo_log_tracked_event = NULL;
|
srv_redo_log_tracked_event = NULL;
|
||||||
mutex_free(&srv_sys->mutex);
|
mutex_free(&srv_sys.mutex);
|
||||||
mutex_free(&srv_sys->tasks_mutex);
|
mutex_free(&srv_sys.tasks_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WITH_INNODB_DISALLOW_WRITES
|
#ifdef WITH_INNODB_DISALLOW_WRITES
|
||||||
@ -1316,10 +1301,10 @@ srv_free(void)
|
|||||||
mutex_free(&srv_innodb_monitor_mutex);
|
mutex_free(&srv_innodb_monitor_mutex);
|
||||||
mutex_free(&page_zip_stat_per_index_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);
|
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
|
is caused by the background
|
||||||
change buffer merge */
|
change buffer merge */
|
||||||
{
|
{
|
||||||
srv_sys->activity_count.inc();
|
srv_sys.activity_count.inc();
|
||||||
if (ibuf_merge_activity)
|
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();
|
srv_sys_mutex_enter();
|
||||||
|
|
||||||
for (ulint i = SRV_WORKER; i <= SRV_MASTER; ++i) {
|
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);
|
ret = static_cast<srv_thread_type>(i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2700,12 +2685,12 @@ srv_active_wake_master_thread(void)
|
|||||||
|
|
||||||
srv_inc_activity_count();
|
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_slot_t* slot;
|
||||||
|
|
||||||
srv_sys_mutex_enter();
|
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. */
|
/* 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());
|
ut_ad(!srv_sys_mutex_own());
|
||||||
|
|
||||||
if (purge_sys->state == PURGE_STATE_RUN
|
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);
|
srv_release_threads(SRV_PURGE, 1);
|
||||||
}
|
}
|
||||||
@ -2761,7 +2746,7 @@ ulint
|
|||||||
srv_get_activity_count(void)
|
srv_get_activity_count(void)
|
||||||
/*========================*/
|
/*========================*/
|
||||||
{
|
{
|
||||||
return(srv_sys->activity_count);
|
return(srv_sys.activity_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Get current server ibuf merge activity count.
|
/** Get current server ibuf merge activity count.
|
||||||
@ -2770,7 +2755,7 @@ static
|
|||||||
ulint
|
ulint
|
||||||
srv_get_ibuf_merge_activity_count(void)
|
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_UNDEFINED */
|
||||||
ulint old_ibuf_merge_activity_count)
|
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)
|
if (old_ibuf_merge_activity_count == ULINT_UNDEFINED)
|
||||||
return(new_activity_count != old_activity_count);
|
return(new_activity_count != old_activity_count);
|
||||||
|
|
||||||
/* If we care about ibuf merge activity, then the server is considered
|
/* If we care about ibuf merge activity, then the server is considered
|
||||||
idle if all activity, if any, was due to ibuf merge. */
|
idle if all activity, if any, was due to ibuf merge. */
|
||||||
ulint new_ibuf_merge_activity_count
|
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 <= new_activity_count);
|
||||||
ut_ad(new_ibuf_merge_activity_count >= old_ibuf_merge_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());
|
srv_main_thread_id = os_thread_pf(os_thread_get_curr_id());
|
||||||
|
|
||||||
slot = srv_reserve_slot(SRV_MASTER);
|
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();
|
last_print_time = ut_time();
|
||||||
loop:
|
loop:
|
||||||
@ -3289,18 +3274,18 @@ srv_task_execute(void)
|
|||||||
ut_ad(!srv_read_only_mode);
|
ut_ad(!srv_read_only_mode);
|
||||||
ut_a(srv_force_recovery < SRV_FORCE_NO_BACKGROUND);
|
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_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) {
|
if (thr != NULL) {
|
||||||
|
|
||||||
@ -3350,7 +3335,7 @@ DECLARE_THREAD(srv_worker_thread)(
|
|||||||
|
|
||||||
srv_sys_mutex_enter();
|
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();
|
srv_sys_mutex_exit();
|
||||||
|
|
||||||
@ -3690,11 +3675,11 @@ srv_que_task_enqueue_low(
|
|||||||
que_thr_t* thr) /*!< in: query thread */
|
que_thr_t* thr) /*!< in: query thread */
|
||||||
{
|
{
|
||||||
ut_ad(!srv_read_only_mode);
|
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);
|
srv_release_threads(SRV_WORKER, 1);
|
||||||
}
|
}
|
||||||
@ -3711,11 +3696,11 @@ srv_get_task_queue_length(void)
|
|||||||
|
|
||||||
ut_ad(!srv_read_only_mode);
|
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);
|
return(n_tasks);
|
||||||
}
|
}
|
||||||
|
@ -1186,10 +1186,6 @@ UNIV_INTERN
|
|||||||
dberr_t
|
dberr_t
|
||||||
trx_undo_report_row_operation(
|
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 */
|
que_thr_t* thr, /*!< in: query thread */
|
||||||
dict_index_t* index, /*!< in: clustered index */
|
dict_index_t* index, /*!< in: clustered index */
|
||||||
const dtuple_t* clust_entry, /*!< in: in the case of an insert,
|
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_a(dict_index_is_clust(index));
|
||||||
ut_ad(!rec || rec_offs_validate(rec, index, offsets));
|
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(thr);
|
||||||
ut_ad((op_type != TRX_UNDO_INSERT_OP)
|
ut_ad(!clust_entry || (!update && !rec));
|
||||||
|| (clust_entry && !update && !rec));
|
|
||||||
|
|
||||||
trx = thr_get_trx(thr);
|
trx = thr_get_trx(thr);
|
||||||
|
|
||||||
@ -1253,8 +1241,7 @@ trx_undo_report_row_operation(
|
|||||||
|
|
||||||
/* If the undo log is not assigned yet, assign one */
|
/* If the undo log is not assigned yet, assign one */
|
||||||
|
|
||||||
switch (op_type) {
|
if (clust_entry) {
|
||||||
case TRX_UNDO_INSERT_OP:
|
|
||||||
undo = trx->insert_undo;
|
undo = trx->insert_undo;
|
||||||
|
|
||||||
if (undo == NULL) {
|
if (undo == NULL) {
|
||||||
@ -1270,10 +1257,7 @@ trx_undo_report_row_operation(
|
|||||||
|
|
||||||
ut_ad(err == DB_SUCCESS);
|
ut_ad(err == DB_SUCCESS);
|
||||||
}
|
}
|
||||||
break;
|
} else {
|
||||||
default:
|
|
||||||
ut_ad(op_type == TRX_UNDO_MODIFY_OP);
|
|
||||||
|
|
||||||
undo = trx->update_undo;
|
undo = trx->update_undo;
|
||||||
|
|
||||||
if (undo == NULL) {
|
if (undo == NULL) {
|
||||||
@ -1297,23 +1281,15 @@ trx_undo_report_row_operation(
|
|||||||
buf_block_dbg_add_level(undo_block, SYNC_TRX_UNDO_PAGE);
|
buf_block_dbg_add_level(undo_block, SYNC_TRX_UNDO_PAGE);
|
||||||
|
|
||||||
do {
|
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));
|
ut_ad(page_no == buf_block_get_page_no(undo_block));
|
||||||
|
|
||||||
switch (op_type) {
|
page_t* undo_page = buf_block_get_frame(undo_block);
|
||||||
case TRX_UNDO_INSERT_OP:
|
ulint offset = clust_entry
|
||||||
offset = trx_undo_page_report_insert(
|
? trx_undo_page_report_insert(
|
||||||
undo_page, trx, index, clust_entry, &mtr);
|
undo_page, trx, index, clust_entry, &mtr)
|
||||||
break;
|
: trx_undo_page_report_modify(
|
||||||
default:
|
|
||||||
ut_ad(op_type == TRX_UNDO_MODIFY_OP);
|
|
||||||
offset = trx_undo_page_report_modify(
|
|
||||||
undo_page, trx, index, rec, offsets, update,
|
undo_page, trx, index, rec, offsets, update,
|
||||||
cmpl_info, &mtr);
|
cmpl_info, &mtr);
|
||||||
}
|
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(offset == 0)) {
|
if (UNIV_UNLIKELY(offset == 0)) {
|
||||||
/* The record did not fit on the page. We erase the
|
/* 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);
|
mutex_exit(&trx->undo_mutex);
|
||||||
|
|
||||||
*roll_ptr = trx_undo_build_roll_ptr(
|
*roll_ptr = trx_undo_build_roll_ptr(
|
||||||
op_type == TRX_UNDO_INSERT_OP,
|
clust_entry != NULL,
|
||||||
rseg->id, page_no, offset);
|
rseg->id, page_no, offset);
|
||||||
return(DB_SUCCESS);
|
return(DB_SUCCESS);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
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
|
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 = trx_allocate_for_background();
|
||||||
sess->trx->sess = sess;
|
sess->trx->sess = sess;
|
||||||
|
|
||||||
UT_LIST_INIT(sess->graphs);
|
|
||||||
|
|
||||||
return(sess);
|
return(sess);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user