Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
8c6d6c0c
Commit
8c6d6c0c
authored
Jan 19, 2010
by
Mattias Jonsson
Browse files
Options
Browse Files
Download
Plain Diff
merge
parents
b60d59b9
eab2be0a
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
157 additions
and
28 deletions
+157
-28
mysql-test/r/partition_innodb.result
mysql-test/r/partition_innodb.result
+44
-0
mysql-test/t/partition_innodb-master.opt
mysql-test/t/partition_innodb-master.opt
+1
-0
mysql-test/t/partition_innodb.test
mysql-test/t/partition_innodb.test
+44
-1
sql/ha_partition.cc
sql/ha_partition.cc
+44
-18
sql/sql_parse.cc
sql/sql_parse.cc
+1
-1
sql/sql_partition.cc
sql/sql_partition.cc
+3
-5
sql/sql_table.cc
sql/sql_table.cc
+20
-3
No files found.
mysql-test/r/partition_innodb.result
View file @
8c6d6c0c
...
@@ -274,3 +274,47 @@ CREATE TABLE t1 (a INT) ENGINE=InnoDB
...
@@ -274,3 +274,47 @@ CREATE TABLE t1 (a INT) ENGINE=InnoDB
PARTITION BY list(a) (PARTITION p1 VALUES IN (1));
PARTITION BY list(a) (PARTITION p1 VALUES IN (1));
CREATE INDEX i1 ON t1 (a);
CREATE INDEX i1 ON t1 (a);
DROP TABLE t1;
DROP TABLE t1;
#
# Bug#47343: InnoDB fails to clean-up after lock wait timeout on
# REORGANIZE PARTITION
#
CREATE TABLE t1 (
a INT,
b DATE NOT NULL,
PRIMARY KEY (a, b)
) ENGINE=InnoDB
PARTITION BY RANGE (a) (
PARTITION pMAX VALUES LESS THAN MAXVALUE
) ;
INSERT INTO t1 VALUES (1, '2001-01-01'), (2, '2002-02-02'), (3, '2003-03-03');
START TRANSACTION;
SELECT * FROM t1 FOR UPDATE;
a b
1 2001-01-01
2 2002-02-02
3 2003-03-03
# Connection con1
ALTER TABLE t1 REORGANIZE PARTITION pMAX INTO
(PARTITION p3 VALUES LESS THAN (3),
PARTITION pMAX VALUES LESS THAN MAXVALUE);
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
SHOW WARNINGS;
Level Code Message
Error 1205 Lock wait timeout exceeded; try restarting transaction
ALTER TABLE t1 REORGANIZE PARTITION pMAX INTO
(PARTITION p3 VALUES LESS THAN (3),
PARTITION pMAX VALUES LESS THAN MAXVALUE);
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
SHOW WARNINGS;
Level Code Message
Error 1205 Lock wait timeout exceeded; try restarting transaction
t1.frm
t1.par
# Connection default
SELECT * FROM t1;
a b
1 2001-01-01
2 2002-02-02
3 2003-03-03
COMMIT;
DROP TABLE t1;
mysql-test/t/partition_innodb-master.opt
0 → 100644
View file @
8c6d6c0c
--innodb_lock_wait_timeout=1
mysql-test/t/partition_innodb.test
View file @
8c6d6c0c
...
@@ -5,6 +5,8 @@
...
@@ -5,6 +5,8 @@
drop
table
if
exists
t1
;
drop
table
if
exists
t1
;
--
enable_warnings
--
enable_warnings
let
$MYSQLD_DATADIR
=
`SELECT @@datadir`
;
#
#
# Bug#47029: Crash when reorganize partition with subpartition
# Bug#47029: Crash when reorganize partition with subpartition
#
#
...
@@ -296,6 +298,47 @@ CREATE TABLE t1 (a INT) ENGINE=InnoDB
...
@@ -296,6 +298,47 @@ CREATE TABLE t1 (a INT) ENGINE=InnoDB
PARTITION
BY
list
(
a
)
(
PARTITION
p1
VALUES
IN
(
1
));
PARTITION
BY
list
(
a
)
(
PARTITION
p1
VALUES
IN
(
1
));
CREATE
INDEX
i1
ON
t1
(
a
);
CREATE
INDEX
i1
ON
t1
(
a
);
DROP
TABLE
t1
;
DROP
TABLE
t1
;
let
$MYSQLD_DATADIR
=
`SELECT @@datadir`
;
# Before the fix it should show extra file like #sql-2405_2.par
# Before the fix it should show extra file like #sql-2405_2.par
--
list_files
$MYSQLD_DATADIR
/
test
/
*
--
list_files
$MYSQLD_DATADIR
/
test
/
*
--
echo
#
--
echo
# Bug#47343: InnoDB fails to clean-up after lock wait timeout on
--
echo
# REORGANIZE PARTITION
--
echo
#
CREATE
TABLE
t1
(
a
INT
,
b
DATE
NOT
NULL
,
PRIMARY
KEY
(
a
,
b
)
)
ENGINE
=
InnoDB
PARTITION
BY
RANGE
(
a
)
(
PARTITION
pMAX
VALUES
LESS
THAN
MAXVALUE
)
;
INSERT
INTO
t1
VALUES
(
1
,
'2001-01-01'
),
(
2
,
'2002-02-02'
),
(
3
,
'2003-03-03'
);
START
TRANSACTION
;
SELECT
*
FROM
t1
FOR
UPDATE
;
connect
(
con1
,
localhost
,
root
,,);
--
echo
# Connection con1
--
error
ER_LOCK_WAIT_TIMEOUT
ALTER
TABLE
t1
REORGANIZE
PARTITION
pMAX
INTO
(
PARTITION
p3
VALUES
LESS
THAN
(
3
),
PARTITION
pMAX
VALUES
LESS
THAN
MAXVALUE
);
SHOW
WARNINGS
;
--
error
ER_LOCK_WAIT_TIMEOUT
ALTER
TABLE
t1
REORGANIZE
PARTITION
pMAX
INTO
(
PARTITION
p3
VALUES
LESS
THAN
(
3
),
PARTITION
pMAX
VALUES
LESS
THAN
MAXVALUE
);
SHOW
WARNINGS
;
#Contents of the 'test' database directory:
--
list_files
$MYSQLD_DATADIR
/
test
disconnect
con1
;
connection
default
;
--
echo
# Connection default
SELECT
*
FROM
t1
;
COMMIT
;
DROP
TABLE
t1
;
sql/ha_partition.cc
View file @
8c6d6c0c
...
@@ -1215,17 +1215,28 @@ int ha_partition::prepare_new_partition(TABLE *tbl,
...
@@ -1215,17 +1215,28 @@ int ha_partition::prepare_new_partition(TABLE *tbl,
partition_element
*
p_elem
)
partition_element
*
p_elem
)
{
{
int
error
;
int
error
;
bool
create_flag
=
FALSE
;
DBUG_ENTER
(
"prepare_new_partition"
);
DBUG_ENTER
(
"prepare_new_partition"
);
if
((
error
=
set_up_table_before_create
(
tbl
,
part_name
,
create_info
,
if
((
error
=
set_up_table_before_create
(
tbl
,
part_name
,
create_info
,
0
,
p_elem
)))
0
,
p_elem
)))
goto
error
;
goto
error
_create
;
if
((
error
=
file
->
ha_create
(
part_name
,
tbl
,
create_info
)))
if
((
error
=
file
->
ha_create
(
part_name
,
tbl
,
create_info
)))
goto
error
;
{
create_flag
=
TRUE
;
/*
Added for safety, InnoDB reports HA_ERR_FOUND_DUPP_KEY
if the table/partition already exists.
If we return that error code, then print_error would try to
get_dup_key on a non-existing partition.
So return a more reasonable error code.
*/
if
(
error
==
HA_ERR_FOUND_DUPP_KEY
)
error
=
HA_ERR_TABLE_EXIST
;
goto
error_create
;
}
DBUG_PRINT
(
"info"
,
(
"partition %s created"
,
part_name
));
if
((
error
=
file
->
ha_open
(
tbl
,
part_name
,
m_mode
,
m_open_test_lock
)))
if
((
error
=
file
->
ha_open
(
tbl
,
part_name
,
m_mode
,
m_open_test_lock
)))
goto
error
;
goto
error_open
;
DBUG_PRINT
(
"info"
,
(
"partition %s opened"
,
part_name
));
/*
/*
Note: if you plan to add another call that may return failure,
Note: if you plan to add another call that may return failure,
better to do it before external_lock() as cleanup_new_partition()
better to do it before external_lock() as cleanup_new_partition()
...
@@ -1233,12 +1244,15 @@ int ha_partition::prepare_new_partition(TABLE *tbl,
...
@@ -1233,12 +1244,15 @@ int ha_partition::prepare_new_partition(TABLE *tbl,
Otherwise see description for cleanup_new_partition().
Otherwise see description for cleanup_new_partition().
*/
*/
if
((
error
=
file
->
ha_external_lock
(
ha_thd
(),
m_lock_type
)))
if
((
error
=
file
->
ha_external_lock
(
ha_thd
(),
m_lock_type
)))
goto
error
;
goto
error_external_lock
;
DBUG_PRINT
(
"info"
,
(
"partition %s external locked"
,
part_name
));
DBUG_RETURN
(
0
);
DBUG_RETURN
(
0
);
error:
error_external_lock:
if
(
create_flag
)
VOID
(
file
->
close
());
VOID
(
file
->
ha_delete_table
(
part_name
));
error_open:
VOID
(
file
->
ha_delete_table
(
part_name
));
error_create:
DBUG_RETURN
(
error
);
DBUG_RETURN
(
error
);
}
}
...
@@ -1272,19 +1286,23 @@ int ha_partition::prepare_new_partition(TABLE *tbl,
...
@@ -1272,19 +1286,23 @@ int ha_partition::prepare_new_partition(TABLE *tbl,
void
ha_partition
::
cleanup_new_partition
(
uint
part_count
)
void
ha_partition
::
cleanup_new_partition
(
uint
part_count
)
{
{
handler
**
save_m_file
=
m_file
;
DBUG_ENTER
(
"ha_partition::cleanup_new_partition"
);
DBUG_ENTER
(
"ha_partition::cleanup_new_partition"
);
if
(
m_added_file
&&
m_added_file
[
0
]
)
if
(
m_added_file
)
{
{
m_file
=
m_added_file
;
THD
*
thd
=
ha_thd
();
m_added_file
=
NULL
;
handler
**
file
=
m_added_file
;
while
((
part_count
>
0
)
&&
(
*
file
))
{
(
*
file
)
->
ha_external_lock
(
thd
,
F_UNLCK
);
(
*
file
)
->
close
();
external_lock
(
ha_thd
(),
F_UNLCK
);
/* Leave the (*file)->ha_delete_table(part_name) to the ddl-log */
/* delete_table also needed, a bit more complex */
close
();
m_file
=
save_m_file
;
file
++
;
part_count
--
;
}
m_added_file
=
NULL
;
}
}
DBUG_VOID_RETURN
;
DBUG_VOID_RETURN
;
}
}
...
@@ -1590,7 +1608,15 @@ int ha_partition::change_partitions(HA_CREATE_INFO *create_info,
...
@@ -1590,7 +1608,15 @@ int ha_partition::change_partitions(HA_CREATE_INFO *create_info,
part_elem
->
part_state
=
PART_TO_BE_DROPPED
;
part_elem
->
part_state
=
PART_TO_BE_DROPPED
;
}
}
m_new_file
=
new_file_array
;
m_new_file
=
new_file_array
;
DBUG_RETURN
(
copy_partitions
(
copied
,
deleted
));
if
((
error
=
copy_partitions
(
copied
,
deleted
)))
{
/*
Close and unlock the new temporary partitions.
They will later be deleted through the ddl-log.
*/
cleanup_new_partition
(
part_count
);
}
DBUG_RETURN
(
error
);
}
}
...
...
sql/sql_parse.cc
View file @
8c6d6c0c
...
@@ -6962,7 +6962,7 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables,
...
@@ -6962,7 +6962,7 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables,
/*
/*
If the query was killed then this function must fail.
If the query was killed then this function must fail.
*/
*/
return
result
||
thd
->
killed
;
return
result
||
(
thd
?
thd
->
killed
:
0
)
;
}
}
...
...
sql/sql_partition.cc
View file @
8c6d6c0c
...
@@ -5705,8 +5705,7 @@ static bool write_log_drop_partition(ALTER_PARTITION_PARAM_TYPE *lpt)
...
@@ -5705,8 +5705,7 @@ static bool write_log_drop_partition(ALTER_PARTITION_PARAM_TYPE *lpt)
part_info
->
first_log_entry
=
NULL
;
part_info
->
first_log_entry
=
NULL
;
build_table_filename
(
path
,
sizeof
(
path
)
-
1
,
lpt
->
db
,
build_table_filename
(
path
,
sizeof
(
path
)
-
1
,
lpt
->
db
,
lpt
->
table_name
,
""
,
0
);
lpt
->
table_name
,
""
,
0
);
build_table_filename
(
tmp_path
,
sizeof
(
tmp_path
)
-
1
,
lpt
->
db
,
build_table_shadow_filename
(
tmp_path
,
sizeof
(
tmp_path
)
-
1
,
lpt
);
lpt
->
table_name
,
"#"
,
0
);
pthread_mutex_lock
(
&
LOCK_gdl
);
pthread_mutex_lock
(
&
LOCK_gdl
);
if
(
write_log_dropped_partitions
(
lpt
,
&
next_entry
,
(
const
char
*
)
path
,
if
(
write_log_dropped_partitions
(
lpt
,
&
next_entry
,
(
const
char
*
)
path
,
FALSE
))
FALSE
))
...
@@ -5762,8 +5761,7 @@ static bool write_log_add_change_partition(ALTER_PARTITION_PARAM_TYPE *lpt)
...
@@ -5762,8 +5761,7 @@ static bool write_log_add_change_partition(ALTER_PARTITION_PARAM_TYPE *lpt)
build_table_filename
(
path
,
sizeof
(
path
)
-
1
,
lpt
->
db
,
build_table_filename
(
path
,
sizeof
(
path
)
-
1
,
lpt
->
db
,
lpt
->
table_name
,
""
,
0
);
lpt
->
table_name
,
""
,
0
);
build_table_filename
(
tmp_path
,
sizeof
(
tmp_path
)
-
1
,
lpt
->
db
,
build_table_shadow_filename
(
tmp_path
,
sizeof
(
tmp_path
)
-
1
,
lpt
);
lpt
->
table_name
,
"#"
,
0
);
pthread_mutex_lock
(
&
LOCK_gdl
);
pthread_mutex_lock
(
&
LOCK_gdl
);
if
(
write_log_dropped_partitions
(
lpt
,
&
next_entry
,
(
const
char
*
)
path
,
if
(
write_log_dropped_partitions
(
lpt
,
&
next_entry
,
(
const
char
*
)
path
,
FALSE
))
FALSE
))
...
@@ -5988,7 +5986,7 @@ void handle_alter_part_error(ALTER_PARTITION_PARAM_TYPE *lpt,
...
@@ -5988,7 +5986,7 @@ void handle_alter_part_error(ALTER_PARTITION_PARAM_TYPE *lpt,
partition_info
*
part_info
=
lpt
->
part_info
;
partition_info
*
part_info
=
lpt
->
part_info
;
DBUG_ENTER
(
"handle_alter_part_error"
);
DBUG_ENTER
(
"handle_alter_part_error"
);
if
(
!
part_info
->
first_log_entry
&&
if
(
part_info
->
first_log_entry
&&
execute_ddl_log_entry
(
current_thd
,
execute_ddl_log_entry
(
current_thd
,
part_info
->
first_log_entry
->
entry_pos
))
part_info
->
first_log_entry
->
entry_pos
))
{
{
...
...
sql/sql_table.cc
View file @
8c6d6c0c
...
@@ -647,7 +647,7 @@ static bool read_ddl_log_file_entry(uint entry_no)
...
@@ -647,7 +647,7 @@ static bool read_ddl_log_file_entry(uint entry_no)
Write one entry from ddl log file
Write one entry from ddl log file
SYNOPSIS
SYNOPSIS
write_ddl_log_file_entry()
write_ddl_log_file_entry()
entry_no Entry number to
read
entry_no Entry number to
write
RETURN VALUES
RETURN VALUES
TRUE Error
TRUE Error
FALSE Success
FALSE Success
...
@@ -748,10 +748,10 @@ static uint read_ddl_log_header()
...
@@ -748,10 +748,10 @@ static uint read_ddl_log_header()
else
else
successful_open
=
TRUE
;
successful_open
=
TRUE
;
}
}
entry_no
=
uint4korr
(
&
file_entry_buf
[
DDL_LOG_NUM_ENTRY_POS
]);
global_ddl_log
.
name_len
=
uint4korr
(
&
file_entry_buf
[
DDL_LOG_NAME_LEN_POS
]);
if
(
successful_open
)
if
(
successful_open
)
{
{
entry_no
=
uint4korr
(
&
file_entry_buf
[
DDL_LOG_NUM_ENTRY_POS
]);
global_ddl_log
.
name_len
=
uint4korr
(
&
file_entry_buf
[
DDL_LOG_NAME_LEN_POS
]);
global_ddl_log
.
io_size
=
uint4korr
(
&
file_entry_buf
[
DDL_LOG_IO_SIZE_POS
]);
global_ddl_log
.
io_size
=
uint4korr
(
&
file_entry_buf
[
DDL_LOG_IO_SIZE_POS
]);
DBUG_ASSERT
(
global_ddl_log
.
io_size
<=
DBUG_ASSERT
(
global_ddl_log
.
io_size
<=
sizeof
(
global_ddl_log
.
file_entry_buf
));
sizeof
(
global_ddl_log
.
file_entry_buf
));
...
@@ -832,6 +832,7 @@ static bool init_ddl_log()
...
@@ -832,6 +832,7 @@ static bool init_ddl_log()
goto
end
;
goto
end
;
global_ddl_log
.
io_size
=
IO_SIZE
;
global_ddl_log
.
io_size
=
IO_SIZE
;
global_ddl_log
.
name_len
=
FN_LEN
;
create_ddl_log_file_name
(
file_name
);
create_ddl_log_file_name
(
file_name
);
if
((
global_ddl_log
.
file_id
=
my_create
(
file_name
,
if
((
global_ddl_log
.
file_id
=
my_create
(
file_name
,
CREATE_MODE
,
CREATE_MODE
,
...
@@ -884,6 +885,13 @@ static int execute_ddl_log_action(THD *thd, DDL_LOG_ENTRY *ddl_log_entry)
...
@@ -884,6 +885,13 @@ static int execute_ddl_log_action(THD *thd, DDL_LOG_ENTRY *ddl_log_entry)
{
{
DBUG_RETURN
(
FALSE
);
DBUG_RETURN
(
FALSE
);
}
}
DBUG_PRINT
(
"ddl_log"
,
(
"execute type %c next %u name '%s' from_name '%s' handler '%s'"
,
ddl_log_entry
->
action_type
,
ddl_log_entry
->
next_entry
,
ddl_log_entry
->
name
,
ddl_log_entry
->
from_name
,
ddl_log_entry
->
handler_name
));
handler_name
.
str
=
(
char
*
)
ddl_log_entry
->
handler_name
;
handler_name
.
str
=
(
char
*
)
ddl_log_entry
->
handler_name
;
handler_name
.
length
=
strlen
(
ddl_log_entry
->
handler_name
);
handler_name
.
length
=
strlen
(
ddl_log_entry
->
handler_name
);
init_sql_alloc
(
&
mem_root
,
TABLE_ALLOC_BLOCK_SIZE
,
0
);
init_sql_alloc
(
&
mem_root
,
TABLE_ALLOC_BLOCK_SIZE
,
0
);
...
@@ -1091,6 +1099,15 @@ bool write_ddl_log_entry(DDL_LOG_ENTRY *ddl_log_entry,
...
@@ -1091,6 +1099,15 @@ bool write_ddl_log_entry(DDL_LOG_ENTRY *ddl_log_entry,
DBUG_RETURN
(
TRUE
);
DBUG_RETURN
(
TRUE
);
}
}
error
=
FALSE
;
error
=
FALSE
;
DBUG_PRINT
(
"ddl_log"
,
(
"write type %c next %u name '%s' from_name '%s' handler '%s'"
,
(
char
)
global_ddl_log
.
file_entry_buf
[
DDL_LOG_ACTION_TYPE_POS
],
ddl_log_entry
->
next_entry
,
(
char
*
)
&
global_ddl_log
.
file_entry_buf
[
DDL_LOG_NAME_POS
],
(
char
*
)
&
global_ddl_log
.
file_entry_buf
[
DDL_LOG_NAME_POS
+
FN_LEN
],
(
char
*
)
&
global_ddl_log
.
file_entry_buf
[
DDL_LOG_NAME_POS
+
(
2
*
FN_LEN
)]));
if
(
write_ddl_log_file_entry
((
*
active_entry
)
->
entry_pos
))
if
(
write_ddl_log_file_entry
((
*
active_entry
)
->
entry_pos
))
{
{
error
=
TRUE
;
error
=
TRUE
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment