Skip to content

Commit

Permalink
PS-7657 crash seen with update query on a partition table having comp…
Browse files Browse the repository at this point in the history
…ressed column

https://jira.percona.com/browse/PS-7657

Analysis :
Update statements execution flow on tables with partitions by key and having compressed column:

1.First it searches for the row and positions the cursor (the blob is decompressed and stored in blob_heap and record is returned to server)
2. Builds new row and then calls update(old_row, new_row). Since the blob field doesn't change, the blob from old row is stored in the new row (mysql record)
3. Parition hanlder detects that the updated row should be in different partition
4. Insert the new row in new parition. During insertion, we empty the blob heap. This releases the blocks used by blob and corrupts the blob data in new row
5. So we end up inserting garbage to the new partition after the update

Fix :
Avoided prebuilt->compress_heap from being empty
till it's required
  • Loading branch information
Nitendra Bhosle committed May 11, 2021
1 parent 1c6e68c commit 59cb3d5
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 4 deletions.
9 changes: 9 additions & 0 deletions mysql-test/suite/innodb/r/xtradb_compressed_columns.result
Original file line number Diff line number Diff line change
Expand Up @@ -319,3 +319,12 @@ CREATE TABLE t1 (c1 VARBINARY(5) COLUMN_FORMAT COMPRESSED) ENGINE=InnoDB;
ALTER TABLE t1 ADD c2 CHAR(10) FIRST;
INSERT INTO t1 VALUES(0,11111);
DROP TABLE t1;
#
# Bug PS-7657 crash seen with update query on a partition table having compressed column
#
CREATE TABLE t1 (ip_col INT, i0 INT, v1 VARCHAR(29), v2 VARCHAR(23), lt3 LONGTEXT COLUMN_FORMAT COMPRESSED, b4 BLOB , v5 VARCHAR(10), g6 CHAR(9) AS (CONCAT(SUBSTRING(ip_col,1,1),SUBSTRING(i0,1,3),SUBSTRING(lt3,1,3),SUBSTRING(v1,1,2))), INDEX tt_47_pi1(i0, v2 ASC, ip_col, v5 DESC, g6, v1) ) ENGINE=INNODB PARTITION BY KEY (ip_col) PARTITIONS 13;
INSERT INTO t1 ( ip_col ,i0 ,v1 ,v2 ,lt3 ,b4 ,v5 ,g6 ) VALUES( 23486, 49601, 'OQ7LVj1N0RhGn2EUxVHO9qD', 'oCwtfvdUs3', 'S6GaiUP5cMt7uS38D6B31KSJW0mkt7EQBu7sbK7G7LgYcQ3p6EE9HbTSGI9bMU4vQ8bJABIUbsjp0hIDtwgZOpSkc9xHvYPCx99DK6IDkEqioZu4808QqFCrtcGJWFceOMVyfG8f2NOQT58WAYPKBq5jkuHOtHBSIXyA1DFvWhifC0u0xXCULBrd9EF0Te0l5NcaQZTvJeKjoDjpRA4zfR7Z0t04QOhwVcad2ZbBWOfFiKiEz5DzOKzImrRLmcOtmgbPpTdBU8lND8r2FKSn0VwT7aYyyJHHJwvTlo8qepdbi4zdN1GPUAKeRtPLECGUkqQwLHacNWB2ZNlSDg788CXMsUgYpzB7TNqCB897PmOOPse0N', 'YAEFg2tZrqDiCF6CDpnZsIAf1VVnb0OSNToflk0970II8D04zLbXuL9w0l5eWvzXzaOlgqQwnWQHP547QM2cQuP2DTMkoEAWhghCXAgTTDrKcCspo0MrJ3L3BXmqvkdOXzVnro0I385cegV1U1sRuqp8lbtjoEtRmhZP3AzYIwJHR42Hny4KCmoPr6opoUtGoCrJxKCOyRKaWkEEinXAdEEkUpF9WhpasEc50fKENiHhXzidUm0vBLLurLsAcIkkf74YSIvQl30sM2a6eHK8x1dZUHvm50KvKBem21QkwKHlseYAqnaXoyckMN4PnAyRarRoFdVEA88Gwahc2wqRwC7Y2DFOijSvuwbbCVJhpO6G5DDLJotJpwdgyOotKyxWJmhWJFrRTOerNuNhK6kbaEmZAYXpHvi64JM0CK3slKNZ8CH1WgpRKcU3GSYRNulxECpei76HhY3jcBCG3diORUhjuWwLAc40jSmxVYlLCCaKOJJRukalTZ35XhSPRTqS8E8xuTzf5JUQDQLAJQW95GkOns2xbhctxuNv0nU1f6CvnPtMvbcY9DDaRW62uqzkMZP1rfsKc8J7cT6C4M0WxjHc1RkFmzAEexW1QYj2agnzb4UjEvUwWUWU6Z6gnqHr3Npo2EeEZVHsphaTMzM6pk09g9rBrV0ss8FJ1BZWnLopnsXDulc9a51cn51QNkkExx61PxEla6o2J9wzObCvAXfqAbcV8ovqt1SHXixvIUxN8dkTN6Em2idc5s1QJooc9TXAnPQlpGh3Vnc1EYLp05Hnl6phiIZuYtbY9qSsAd5bAojNhX70v7RjPDn5KAk3qgypDw9qXyJjKD3ICsr1IcOK3xiXlFe1dzs7d1ObjSBtGn0qUSyRBJKG86ZoNWRF4RC9juaQuHO14ha6dQFZ2c56LER60ptaYBhOMKBpfICkoHWZJWEmFxua36s2SYWdUVd3Z8JbtGuhv77h4TqP', 'x966Fv9V', default );
UPDATE t1 SET ip_col=2680 WHERE ip_col = 23486;
UPDATE t1 SET ip_col=23486 WHERE ip_col = 2680;
include/assert.inc ['value inside lt3 compressed column should be valid']
DROP TABLE t1;
17 changes: 17 additions & 0 deletions mysql-test/suite/innodb/t/xtradb_compressed_columns.test
Original file line number Diff line number Diff line change
Expand Up @@ -220,3 +220,20 @@ CREATE TABLE t1 (c1 VARBINARY(5) COLUMN_FORMAT COMPRESSED) ENGINE=InnoDB;
ALTER TABLE t1 ADD c2 CHAR(10) FIRST;
INSERT INTO t1 VALUES(0,11111);
DROP TABLE t1;

--echo #
--echo # Bug PS-7657 crash seen with update query on a partition table having compressed column
--echo #
CREATE TABLE t1 (ip_col INT, i0 INT, v1 VARCHAR(29), v2 VARCHAR(23), lt3 LONGTEXT COLUMN_FORMAT COMPRESSED, b4 BLOB , v5 VARCHAR(10), g6 CHAR(9) AS (CONCAT(SUBSTRING(ip_col,1,1),SUBSTRING(i0,1,3),SUBSTRING(lt3,1,3),SUBSTRING(v1,1,2))), INDEX tt_47_pi1(i0, v2 ASC, ip_col, v5 DESC, g6, v1) ) ENGINE=INNODB PARTITION BY KEY (ip_col) PARTITIONS 13;

INSERT INTO t1 ( ip_col ,i0 ,v1 ,v2 ,lt3 ,b4 ,v5 ,g6 ) VALUES( 23486, 49601, 'OQ7LVj1N0RhGn2EUxVHO9qD', 'oCwtfvdUs3', 'S6GaiUP5cMt7uS38D6B31KSJW0mkt7EQBu7sbK7G7LgYcQ3p6EE9HbTSGI9bMU4vQ8bJABIUbsjp0hIDtwgZOpSkc9xHvYPCx99DK6IDkEqioZu4808QqFCrtcGJWFceOMVyfG8f2NOQT58WAYPKBq5jkuHOtHBSIXyA1DFvWhifC0u0xXCULBrd9EF0Te0l5NcaQZTvJeKjoDjpRA4zfR7Z0t04QOhwVcad2ZbBWOfFiKiEz5DzOKzImrRLmcOtmgbPpTdBU8lND8r2FKSn0VwT7aYyyJHHJwvTlo8qepdbi4zdN1GPUAKeRtPLECGUkqQwLHacNWB2ZNlSDg788CXMsUgYpzB7TNqCB897PmOOPse0N', 'YAEFg2tZrqDiCF6CDpnZsIAf1VVnb0OSNToflk0970II8D04zLbXuL9w0l5eWvzXzaOlgqQwnWQHP547QM2cQuP2DTMkoEAWhghCXAgTTDrKcCspo0MrJ3L3BXmqvkdOXzVnro0I385cegV1U1sRuqp8lbtjoEtRmhZP3AzYIwJHR42Hny4KCmoPr6opoUtGoCrJxKCOyRKaWkEEinXAdEEkUpF9WhpasEc50fKENiHhXzidUm0vBLLurLsAcIkkf74YSIvQl30sM2a6eHK8x1dZUHvm50KvKBem21QkwKHlseYAqnaXoyckMN4PnAyRarRoFdVEA88Gwahc2wqRwC7Y2DFOijSvuwbbCVJhpO6G5DDLJotJpwdgyOotKyxWJmhWJFrRTOerNuNhK6kbaEmZAYXpHvi64JM0CK3slKNZ8CH1WgpRKcU3GSYRNulxECpei76HhY3jcBCG3diORUhjuWwLAc40jSmxVYlLCCaKOJJRukalTZ35XhSPRTqS8E8xuTzf5JUQDQLAJQW95GkOns2xbhctxuNv0nU1f6CvnPtMvbcY9DDaRW62uqzkMZP1rfsKc8J7cT6C4M0WxjHc1RkFmzAEexW1QYj2agnzb4UjEvUwWUWU6Z6gnqHr3Npo2EeEZVHsphaTMzM6pk09g9rBrV0ss8FJ1BZWnLopnsXDulc9a51cn51QNkkExx61PxEla6o2J9wzObCvAXfqAbcV8ovqt1SHXixvIUxN8dkTN6Em2idc5s1QJooc9TXAnPQlpGh3Vnc1EYLp05Hnl6phiIZuYtbY9qSsAd5bAojNhX70v7RjPDn5KAk3qgypDw9qXyJjKD3ICsr1IcOK3xiXlFe1dzs7d1ObjSBtGn0qUSyRBJKG86ZoNWRF4RC9juaQuHO14ha6dQFZ2c56LER60ptaYBhOMKBpfICkoHWZJWEmFxua36s2SYWdUVd3Z8JbtGuhv77h4TqP', 'x966Fv9V', default );

UPDATE t1 SET ip_col=2680 WHERE ip_col = 23486;
UPDATE t1 SET ip_col=23486 WHERE ip_col = 2680;

--let $query_out=`SELECT COUNT(*) FROM t1 WHERE lt3='S6GaiUP5cMt7uS38D6B31KSJW0mkt7EQBu7sbK7G7LgYcQ3p6EE9HbTSGI9bMU4vQ8bJABIUbsjp0hIDtwgZOpSkc9xHvYPCx99DK6IDkEqioZu4808QqFCrtcGJWFceOMVyfG8f2NOQT58WAYPKBq5jkuHOtHBSIXyA1DFvWhifC0u0xXCULBrd9EF0Te0l5NcaQZTvJeKjoDjpRA4zfR7Z0t04QOhwVcad2ZbBWOfFiKiEz5DzOKzImrRLmcOtmgbPpTdBU8lND8r2FKSn0VwT7aYyyJHHJwvTlo8qepdbi4zdN1GPUAKeRtPLECGUkqQwLHacNWB2ZNlSDg788CXMsUgYpzB7TNqCB897PmOOPse0N'`
--let $assert_text= 'value inside lt3 compressed column should be valid'
--let $assert_cond= "$query_out" = 1
--source include/assert.inc

DROP TABLE t1;
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
include/master-slave.inc
Warnings:
Note #### Sending passwords in plain text without SSL/TLS is extremely insecure.
Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information.
[connection master]
CREATE TABLE t1 (f1 INT, f2 BLOB COLUMN_FORMAT COMPRESSED) ENGINE=INNODB PARTITION BY HASH (f1) PARTITIONS 2;
REPLACE INTO t1 (f1,f2)VALUES(0,'123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456');
UPDATE t1 SET f1=1 WHERE f1 = 0;
include/sync_slave_sql_with_master.inc
include/diff_tables.inc [master:t1,slave:t1]
[connection master]
DROP TABLE t1;
include/rpl_end.inc
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#
# PS-7599 : Node inconsistency seen in PS during update on compressed column table
#
--source include/have_binlog_format_row.inc
--source include/master-slave.inc

CREATE TABLE t1 (f1 INT, f2 BLOB COLUMN_FORMAT COMPRESSED) ENGINE=INNODB PARTITION BY HASH (f1) PARTITIONS 2;

REPLACE INTO t1 (f1,f2)VALUES(0,'123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456');

UPDATE t1 SET f1=1 WHERE f1 = 0;

--source include/sync_slave_sql_with_master.inc

--let $diff_tables= master:t1,slave:t1
--source include/diff_tables.inc

--source include/rpl_connection_master.inc

DROP TABLE t1;

--source include/rpl_end.inc
3 changes: 0 additions & 3 deletions storage/innobase/row/row0mysql.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2299,9 +2299,6 @@ row_insert_for_mysql_using_ins_graph(
return(DB_TABLE_CORRUPT);
}

if (UNIV_LIKELY_NULL(prebuilt->compress_heap))
mem_heap_empty(prebuilt->compress_heap);

trx->op_info = "inserting";

row_mysql_delay_if_needed();
Expand Down
2 changes: 1 addition & 1 deletion storage/innobase/row/row0sel.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3319,7 +3319,7 @@ row_sel_store_mysql_rec(
}

if (UNIV_LIKELY_NULL(prebuilt->compress_heap))
mem_heap_empty(prebuilt->compress_heap);
row_mysql_prebuilt_free_compress_heap(prebuilt);

if (clust_templ_for_sec) {
/* Store all clustered index column of
Expand Down

0 comments on commit 59cb3d5

Please sign in to comment.