Description:
If records are shrunk, no matter how much, InnoDB does not care much about it, which is sad, as it could use reclaimed space for stuff like needed data records.
Looks like that space is not even recorded in PAGE_GARBAGE, so pages are not considered for merging with neighbors.
How to repeat:
DROP TABLE IF EXISTS garbageleak;
CREATE TABLE garbageleak (a INT PRIMARY KEY AUTO_INCREMENT, b VARCHAR(255), c VARCHAR(1000));
INSERT INTO garbageleak VALUES (NULL, REPEAT("b",50), REPEAT("c", 500));
INSERT INTO garbageleak SELECT NULL, b, c FROM garbageleak;
INSERT INTO garbageleak SELECT NULL, b, c FROM garbageleak;
INSERT INTO garbageleak SELECT NULL, b, c FROM garbageleak;
INSERT INTO garbageleak SELECT NULL, b, c FROM garbageleak;
INSERT INTO garbageleak SELECT NULL, b, c FROM garbageleak;
INSERT INTO garbageleak SELECT NULL, b, c FROM garbageleak;
INSERT INTO garbageleak SELECT NULL, b, c FROM garbageleak;
INSERT INTO garbageleak SELECT NULL, b, c FROM garbageleak;
INSERT INTO garbageleak SELECT NULL, b, c FROM garbageleak;
INSERT INTO garbageleak SELECT NULL, b, c FROM garbageleak;
INSERT INTO garbageleak SELECT NULL, b, c FROM garbageleak;
INSERT INTO garbageleak SELECT NULL, b, c FROM garbageleak;
INSERT INTO garbageleak SELECT NULL, b, c FROM garbageleak;
INSERT INTO garbageleak SELECT NULL, b, c FROM garbageleak;
INSERT INTO garbageleak SELECT NULL, b, c FROM garbageleak;
INSERT INTO garbageleak SELECT NULL, b, c FROM garbageleak;
UPDATE garbageleak SET b="b", c="c";
UPDATE garbageleak SET b="bb", c="cc";
Suggested fix:
account garbage properly, merge pages, release space