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 7, 2021
1 parent 1c6e68c commit cb62982
Show file tree
Hide file tree
Showing 6 changed files with 59 additions and 4 deletions.
11 changes: 11 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,14 @@ 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;
SELECT lt3 FROM t1 WHERE ip_col=23486;
lt3
S6GaiUP5cMt7uS38D6B31KSJW0mkt7EQBu7sbK7G7LgYcQ3p6EE9HbTSGI9bMU4vQ8bJABIUbsjp0hIDtwgZOpSkc9xHvYPCx99DK6IDkEqioZu4808QqFCrtcGJWFceOMVyfG8f2NOQT58WAYPKBq5jkuHOtHBSIXyA1DFvWhifC0u0xXCULBrd9EF0Te0l5NcaQZTvJeKjoDjpRA4zfR7Z0t04QOhwVcad2ZbBWOfFiKiEz5DzOKzImrRLmcOtmgbPpTdBU8lND8r2FKSn0VwT7aYyyJHHJwvTlo8qepdbi4zdN1GPUAKeRtPLECGUkqQwLHacNWB2ZNlSDg788CXMsUgYpzB7TNqCB897PmOOPse0N
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;

SELECT lt3 FROM t1 WHERE ip_col=23486;

DROP TABLE t1;



Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
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
[connection master]
DROP TABLE t1;
include/rpl_end.inc
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#
# 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
--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 cb62982

Please sign in to comment.