Skip to content

Commit

Permalink
MDEV-22834: Disks plugin - change datatype to bigint
Browse files Browse the repository at this point in the history
On large hard disks (> 2TB), the plugin won't function correctly, always
showing 2 TB of available space due to integer overflow. Upgrade table
fields to bigint to resolve this problem.
  • Loading branch information
cvicentiu committed Jun 10, 2020
1 parent 59717bb commit ae3a7d5
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 9 deletions.
13 changes: 7 additions & 6 deletions plugin/disks/information_schema_disks.cc
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ ST_FIELD_INFO disks_table_fields[]=
{
{ "Disk", PATH_MAX, MYSQL_TYPE_STRING, 0, 0 ,0, 0 },
{ "Path", PATH_MAX, MYSQL_TYPE_STRING, 0, 0 ,0, 0 },
{ "Total", 32, MYSQL_TYPE_LONG, 0, 0 ,0 ,0 }, // Total amount available
{ "Used", 32, MYSQL_TYPE_LONG, 0, 0 ,0 ,0 }, // Amount of space used
{ "Available", 32, MYSQL_TYPE_LONG, 0, 0 ,0 ,0 }, // Amount available to users other than root.
{ "Total", 32, MYSQL_TYPE_LONGLONG, 0, 0 ,0 ,0 }, // Total amount available
{ "Used", 32, MYSQL_TYPE_LONGLONG, 0, 0 ,0 ,0 }, // Amount of space used
{ "Available", 32, MYSQL_TYPE_LONGLONG, 0, 0 ,0 ,0 }, // Amount available to users other than root.
{ 0, 0, MYSQL_TYPE_NULL, 0, 0, 0, 0 }
};

Expand All @@ -51,9 +51,10 @@ int disks_table_add_row(THD* pThd,
// f_bfree Total number of free blocks.
// f_bavail Number of free blocks available to non-privileged process.

size_t total = (info.f_frsize * info.f_blocks) / 1024;
size_t used = (info.f_frsize * (info.f_blocks - info.f_bfree)) / 1024;
size_t avail = (info.f_frsize * info.f_bavail) / 1024;
ulonglong total = ((ulonglong)info.f_frsize * info.f_blocks) / 1024;
ulonglong used = ((ulonglong)info.f_frsize *
(info.f_blocks - info.f_bfree)) / 1024;
ulonglong avail = ((ulonglong)info.f_frsize * info.f_bavail) / 1024;

pTable->field[0]->store(zDisk, strlen(zDisk), system_charset_info);
pTable->field[1]->store(zPath, strlen(zPath), system_charset_info);
Expand Down
6 changes: 3 additions & 3 deletions plugin/disks/mysql-test/disks/disks.result
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ Table Create Table
DISKS CREATE TEMPORARY TABLE `DISKS` (
`Disk` varchar(4096) NOT NULL DEFAULT '',
`Path` varchar(4096) NOT NULL DEFAULT '',
`Total` int(32) NOT NULL DEFAULT '0',
`Used` int(32) NOT NULL DEFAULT '0',
`Available` int(32) NOT NULL DEFAULT '0'
`Total` bigint(32) NOT NULL DEFAULT '0',
`Used` bigint(32) NOT NULL DEFAULT '0',
`Available` bigint(32) NOT NULL DEFAULT '0'
) ENGINE=MEMORY DEFAULT CHARSET=utf8
select sum(Total) > sum(Available), sum(Total)>sum(Used) from information_schema.disks;
sum(Total) > sum(Available) sum(Total)>sum(Used)
Expand Down

0 comments on commit ae3a7d5

Please sign in to comment.