Commit 8ec21afc authored by Vicențiu Ciorbaru's avatar Vicențiu Ciorbaru

MDEV-22834: Disks plugin - change datatype to bigint

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.
parent e156a8da
...@@ -34,9 +34,9 @@ ST_FIELD_INFO disks_table_fields[]= ...@@ -34,9 +34,9 @@ ST_FIELD_INFO disks_table_fields[]=
{ {
Column("Disk", Varchar(PATH_MAX), NOT_NULL), Column("Disk", Varchar(PATH_MAX), NOT_NULL),
Column("Path", Varchar(PATH_MAX), NOT_NULL), Column("Path", Varchar(PATH_MAX), NOT_NULL),
Column("Total", SLong(32), NOT_NULL), // Total amount available Column("Total", SLonglong(32), NOT_NULL), // Total amount available
Column("Used", SLong(32), NOT_NULL), // Amount of space used Column("Used", SLonglong(32), NOT_NULL), // Amount of space used
Column("Available", SLong(32), NOT_NULL), // Amount available to users other than root. Column("Available", SLonglong(32), NOT_NULL), // Amount available to users other than root.
CEnd() CEnd()
}; };
...@@ -55,9 +55,10 @@ int disks_table_add_row(THD* pThd, ...@@ -55,9 +55,10 @@ int disks_table_add_row(THD* pThd,
// f_bfree Total number of free blocks. // f_bfree Total number of free blocks.
// f_bavail Number of free blocks available to non-privileged process. // f_bavail Number of free blocks available to non-privileged process.
size_t total = (info.f_frsize * info.f_blocks) / 1024; ulonglong total = ((ulonglong)info.f_frsize * info.f_blocks) / 1024;
size_t used = (info.f_frsize * (info.f_blocks - info.f_bfree)) / 1024; ulonglong used = ((ulonglong)info.f_frsize *
size_t avail = (info.f_frsize * info.f_bavail) / 1024; (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[0]->store(zDisk, strlen(zDisk), system_charset_info);
pTable->field[1]->store(zPath, strlen(zPath), system_charset_info); pTable->field[1]->store(zPath, strlen(zPath), system_charset_info);
......
...@@ -3,9 +3,9 @@ Table Create Table ...@@ -3,9 +3,9 @@ Table Create Table
DISKS CREATE TEMPORARY TABLE `DISKS` ( DISKS CREATE TEMPORARY TABLE `DISKS` (
`Disk` varchar(4096) NOT NULL DEFAULT '', `Disk` varchar(4096) NOT NULL DEFAULT '',
`Path` varchar(4096) NOT NULL DEFAULT '', `Path` varchar(4096) NOT NULL DEFAULT '',
`Total` int(32) NOT NULL DEFAULT 0, `Total` bigint(32) NOT NULL DEFAULT 0,
`Used` int(32) NOT NULL DEFAULT 0, `Used` bigint(32) NOT NULL DEFAULT 0,
`Available` int(32) NOT NULL DEFAULT 0 `Available` bigint(32) NOT NULL DEFAULT 0
) ENGINE=MEMORY DEFAULT CHARSET=utf8 ) ENGINE=MEMORY DEFAULT CHARSET=utf8
select sum(Total) > sum(Available), sum(Total)>sum(Used) from information_schema.disks; select sum(Total) > sum(Available), sum(Total)>sum(Used) from information_schema.disks;
sum(Total) > sum(Available) sum(Total)>sum(Used) sum(Total) > sum(Available) sum(Total)>sum(Used)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment