Add MySQL/MariaDB variable capability matrix to Database section (#8188)

* Add MySQL/MariaDB variable capability matrix to Database section

* Add changelog fragment for PR #8188

* Address review: correct version boundaries, escaping, valid values, focusable hint, unit tests

* Normalize server version suffixes and cache the capability matrix

* Add capability matrix strings to the translation template

* Treat an unknown (null/empty) server version as supported to avoid a TypeError

* Cover the capability helpers in the installer coverage suite

---------

Co-authored-by: TheWitness <copilot@users.noreply.github.com>
This commit is contained in:
TheWitnessandTheWitness authored and GitHub committed 2026-10-05 20:16:01 -04:00
1 parent 1c96e16a3f
commit 3b3544db03
6 files changed
+852 -8

No files matched your search

+1
View File
@@ -0,0 +1 @@
Add a MySQL/MariaDB variable capability matrix to the Database section showing per-version support for each recommended tuning variable, with hover hints, and stop recommending variables that are deprecated or removed on the detected server
+441 -8
View File
@@ -1124,6 +1124,422 @@ function data_input_whitelist_check(int $data_input_id) : bool {
}
}
/**
* utilities_mysql_variable_capabilities - return the support matrix for every
* MySQL/MariaDB system variable that Cacti recommends tuning. Each entry
* carries a human readable description and its available settings (used for the
* hover hint), plus the per-engine version boundaries at which the variable was
* introduced, deprecated or removed. A missing engine key means the variable
* does not exist for that engine (rendered as N/A); an empty engine array means
* the variable is supported for every version of that engine.
*
* @return array the capability matrix keyed by variable name
*/
function utilities_mysql_variable_capabilities() : array {
static $matrix = null;
if ($matrix !== null) {
return $matrix;
}
$matrix = [
'collation_server' => [
'description' => __('Default collation used by the server when creating databases and tables.'),
'settings' => __('e.g. utf8mb4_unicode_ci, utf8mb4_general_ci.'),
'MariaDB' => [],
'MySQL' => [],
],
'character_set_server' => [
'description' => __('Default character set used by the server.'),
'settings' => __('e.g. utf8mb4, utf8, latin1.'),
'MariaDB' => [],
'MySQL' => [],
],
'character_set_client' => [
'description' => __('Character set the client uses when sending statements to the server.'),
'settings' => __('e.g. utf8mb4, utf8, latin1.'),
'MariaDB' => [],
'MySQL' => [],
],
'max_connections' => [
'description' => __('Maximum number of simultaneous client connections permitted.'),
'settings' => __('Integer; default 151. Allow enough for the pollers plus user logins.'),
'MariaDB' => [],
'MySQL' => [],
],
'table_cache' => [
'description' => __('Legacy name for the open-table cache; renamed to table_open_cache.'),
'settings' => __('Integer. Use table_open_cache on modern servers.'),
'MariaDB' => ['removed' => '10.0.0'],
'MySQL' => ['removed' => '5.1.3'],
],
'max_allowed_packet' => [
'description' => __('Maximum size of one packet or any generated/intermediate string.'),
'settings' => __('Bytes; keep at or above 16M for remote pollers.'),
'MariaDB' => [],
'MySQL' => [],
],
'max_heap_table_size' => [
'description' => __('Maximum size to which user-created MEMORY tables may grow.'),
'settings' => __('Bytes; sized relative to total system memory.'),
'MariaDB' => [],
'MySQL' => [],
],
'tmp_table_size' => [
'description' => __('Maximum size of internal in-memory temporary tables before they spill to disk.'),
'settings' => __('Bytes; a larger value keeps temporary tables in memory.'),
'MariaDB' => [],
'MySQL' => [],
],
'join_buffer_size' => [
'description' => __('Minimum per-join buffer size for joins that do not use indexes.'),
'settings' => __('Bytes; per-connection allocation, default 262144.'),
'MariaDB' => [],
'MySQL' => [],
],
'sort_buffer_size' => [
'description' => __('Per-session buffer allocated for sorts (ORDER BY / GROUP BY).'),
'settings' => __('Bytes; per-connection allocation, default 2097152.'),
'MariaDB' => [],
'MySQL' => [],
],
'innodb_file_per_table' => [
'description' => __('Store each InnoDB table and its indexes in its own .ibd tablespace file.'),
'settings' => __('ON or OFF; ON is recommended.'),
'MariaDB' => [],
'MySQL' => [],
],
'innodb_file_format' => [
'description' => __('InnoDB on-disk file format (Antelope or Barracuda); Barracuda is now the only format.'),
'settings' => __('Antelope, Barracuda.'),
'MariaDB' => ['deprecated' => '10.2.2', 'removed' => '10.3.1'],
'MySQL' => ['deprecated' => '5.7.7', 'removed' => '8.0.0'],
],
'innodb_large_prefix' => [
'description' => __('Allow index key prefixes longer than 767 bytes (requires the Barracuda format).'),
'settings' => __('ON/1 or OFF/0; this behaviour is now always enabled.'),
'MariaDB' => ['deprecated' => '10.2.2', 'removed' => '10.3.1'],
'MySQL' => ['deprecated' => '5.7.7', 'removed' => '8.0.0'],
],
'innodb_buffer_pool_size' => [
'description' => __('Total memory InnoDB uses to cache table and index data.'),
'settings' => __('Bytes; commonly 25%-80% of total system memory.'),
'MariaDB' => [],
'MySQL' => [],
],
'innodb_doublewrite' => [
'description' => __('Write pages twice (the doublewrite buffer) to protect against partial page writes.'),
'settings' => __('ON or OFF.'),
'MariaDB' => [],
'MySQL' => [],
],
'innodb_additional_mem_pool_size' => [
'description' => __('Legacy pool for the InnoDB internal data dictionary and structures.'),
'settings' => __('Bytes; obsolete on modern servers.'),
'MariaDB' => ['removed' => '10.0.0'],
'MySQL' => ['removed' => '5.7.4'],
],
'innodb_lock_wait_timeout' => [
'description' => __('Seconds an InnoDB transaction waits for a row lock before giving up.'),
'settings' => __('Seconds; default 50.'),
'MariaDB' => [],
'MySQL' => [],
],
'innodb_flush_method' => [
'description' => __('Method used to flush data and log files to disk.'),
'settings' => __('O_DIRECT, fsync, O_DSYNC, and similar.'),
'MariaDB' => [],
'MySQL' => [],
],
'innodb_flush_log_at_trx_commit' => [
'description' => __('Controls how the redo log is written and flushed at transaction commit.'),
'settings' => __('0, 1, or 2.'),
'MariaDB' => [],
'MySQL' => [],
],
'innodb_file_io_threads' => [
'description' => __('Legacy single setting for InnoDB file I/O threads, replaced by the read/write I/O thread settings.'),
'settings' => __('Integer; superseded by innodb_read_io_threads and innodb_write_io_threads.'),
'MariaDB' => ['removed' => '5.5.0'],
'MySQL' => ['removed' => '5.5.0'],
],
'innodb_flush_log_at_timeout' => [
'description' => __('Write and flush the InnoDB redo log every N seconds.'),
'settings' => __('Seconds (1-2700); default 1.'),
'MariaDB' => [],
'MySQL' => [],
],
'innodb_read_io_threads' => [
'description' => __('Number of I/O threads used for read operations in InnoDB.'),
'settings' => __('1-64; default 4.'),
'MariaDB' => [],
'MySQL' => [],
],
'innodb_write_io_threads' => [
'description' => __('Number of I/O threads used for write operations in InnoDB.'),
'settings' => __('1-64; default 4.'),
'MariaDB' => [],
'MySQL' => [],
],
'innodb_buffer_pool_instances' => [
'description' => __('Number of regions the InnoDB buffer pool is divided into.'),
'settings' => __('1-64; MariaDB removed this in 10.6.'),
'MariaDB' => ['deprecated' => '10.5.0', 'removed' => '10.6.0'],
'MySQL' => [],
],
'innodb_io_capacity' => [
'description' => __('Estimated I/O operations per second available to InnoDB background tasks.'),
'settings' => __('Integer; use higher values for SSD/NVMe storage.'),
'MariaDB' => [],
'MySQL' => [],
],
'innodb_io_capacity_max' => [
'description' => __('Maximum IOPS InnoDB may use when flushing falls behind.'),
'settings' => __('Integer; use higher values for SSD/NVMe storage.'),
'MariaDB' => [],
'MySQL' => [],
],
'innodb_flush_neighbors' => [
'description' => __('Flush neighbouring dirty pages in the same extent when flushing a page.'),
'settings' => __('0, 1, or 2; use 0 on SSD storage.'),
'MariaDB' => [],
'MySQL' => ['deprecated' => '8.0.20', 'removed' => '8.4.0'],
],
'innodb_use_atomic_writes' => [
'description' => __('Use hardware atomic writes (MariaDB) so the doublewrite buffer can be safely disabled.'),
'settings' => __('ON or OFF; MariaDB only.'),
'MariaDB' => [],
],
'innodb_snapshot_isolation' => [
'description' => __('Enforce strict snapshot isolation for InnoDB transactions.'),
'settings' => __('ON or OFF; back-ported to MariaDB 10.6.18+, 10.11.8+ and 11.4.2+. Set OFF for the Cacti poller.'),
'MariaDB' => ['introduced' => ['10.6.18', '10.11.8', '11.4.2']],
],
];
return $matrix;
}
/**
* utilities_mysql_normalize_version - reduce a server version string to its
* leading numeric dotted component so version_compare() behaves predictably.
* Server version() output often carries suffixes such as '-1:10.11.2+maria...'
* or '-0ubuntu0.22.04.1' that version_compare() treats as pre-release markers.
*
* @param string $version the raw version string
*
* @return string the numeric major.minor.patch prefix, or the input unchanged
*/
function utilities_mysql_normalize_version(string $version) : string {
if (preg_match('/^[0-9]+(\.[0-9]+)*/', $version, $matches)) {
return $matches[0];
}
return $version;
}
/**
* utilities_mysql_branch - return the major.minor branch of a version string.
*
* @param string $version the version string, e.g. '10.6.18'
*
* @return string the branch, e.g. '10.6'
*/
function utilities_mysql_branch(string $version) : string {
$parts = explode('.', $version);
return $parts[0] . '.' . ($parts[1] ?? '0');
}
/**
* utilities_mysql_version_introduced - decide whether a variable that was
* introduced (and often back-ported to several stable branches) exists in the
* given version. The variable is present when the version is at or after the
* introduction point for its own major.minor branch, or when the version lives
* on a branch newer than every branch that received a back-port (the feature
* then ships natively).
*
* @param string $version the detected engine version string
* @param array|string $intro one version, or a list of per-branch versions
*
* @return bool true when the variable exists in the version
*/
function utilities_mysql_version_introduced(string $version, array|string $intro) : bool {
if (!is_array($intro)) {
$intro = [$intro];
}
$vbranch = utilities_mysql_branch($version);
$newest = '0';
foreach ($intro as $floor) {
$fbranch = utilities_mysql_branch((string) $floor);
if (version_compare($fbranch, $newest, '>')) {
$newest = $fbranch;
}
if ($vbranch === $fbranch) {
return version_compare($version, (string) $floor, '>=');
}
}
return version_compare($vbranch, $newest, '>');
}
/**
* utilities_mysql_variable_status - determine the support status of a single
* capability-matrix variable for a specific database engine and version.
*
* @param array $cap a single entry from utilities_mysql_variable_capabilities()
* @param string $database the detected engine, either 'MariaDB' or 'MySQL'
* @param string|null $version the detected engine version string, or null/empty when unknown
*
* @return string one of 'ok', 'deprecated', 'removed' or 'na'
*/
function utilities_mysql_variable_status(array $cap, string $database, ?string $version) : string {
if (!isset($cap[$database]) || !is_array($cap[$database])) {
return 'na';
}
if ($version === null || $version === '') {
return 'ok';
}
$version = utilities_mysql_normalize_version($version);
$bounds = $cap[$database];
if (isset($bounds['introduced']) && !utilities_mysql_version_introduced($version, $bounds['introduced'])) {
return 'na';
}
if (isset($bounds['removed']) && version_compare($version, $bounds['removed'], '>=')) {
return 'removed';
}
if (isset($bounds['deprecated']) && version_compare($version, $bounds['deprecated'], '>=')) {
return 'deprecated';
}
return 'ok';
}
/**
* utilities_mysql_capability_cell - render the glyph for a capability-matrix
* cell based on the variable support status.
*
* @param string $status one of 'ok', 'deprecated', 'removed' or 'na'
*
* @return string the HTML glyph for the status
*/
function utilities_mysql_capability_cell(string $status) : string {
switch ($status) {
case 'removed':
return "<span class='deviceDown' title='" . __esc('Removed') . "'>R</span>";
case 'deprecated':
return "<span class='deviceRecovering' title='" . __esc('Deprecated') . "'>D</span>";
case 'na':
return "<span title='" . __esc('Not applicable to this engine') . "'>" . __('N/A') . '</span>';
default:
return "<i class='ti ti-check deviceUp' title='" . __esc('Supported') . "'></i>";
}
}
/**
* utilities_get_mysql_capabilities - render the MySQL/MariaDB capability matrix
* as a separate table in the Database section. Each recommended variable is
* listed with its support status (supported, deprecated, removed or N/A) across
* the common MariaDB and MySQL releases. Hovering a variable name shows a hint
* describing the feature and its available settings.
*
* @return void
*/
function utilities_get_mysql_capabilities() : void {
$mysql_info = get_mysql_info(POLLER_ID);
$database = $mysql_info['database'];
$capabilities = utilities_mysql_variable_capabilities();
// Each column maps a short release label to a representative patch release of
// that series so version_compare reflects a current, fully patched server
// (including back-ported features).
$columns = [
'MariaDB' => [
'10.5' => '10.5.27',
'10.6' => '10.6.21',
'11.4' => '11.4.5',
'11.8' => '11.8.2',
],
'MySQL' => [
'8.0' => '8.0.40',
'8.4' => '8.4.4',
'9.x' => '9.1.0',
],
];
$total_columns = 1;
foreach ($columns as $versions) {
$total_columns += cacti_sizeof($versions);
}
print '<tr class="tableHeader tableFixed">';
print '<th colspan="2">' . __('%s Variable Capability Matrix', $database) . ' - ' . __('Support by engine and version for each Cacti-recommended variable') . '</th>';
print '</tr>';
form_alternate_row();
print "<td colspan='2' style='text-align:left;padding:0px'>";
print "<table id='mysql_capabilities' class='cactiTable' style='width:100%'>";
print '<thead>';
print "<tr class='tableHeader'>";
print " <th class='tableSubHeaderColumn' rowspan='2'>" . __('Variable') . '</th>';
foreach ($columns as $engine => $versions) {
print " <th class='tableSubHeaderColumn center' colspan='" . cacti_sizeof($versions) . "'>" . html_escape($engine) . '</th>';
}
print '</tr>';
print "<tr class='tableHeader'>";
foreach ($columns as $engine => $versions) {
foreach ($versions as $label => $v) {
print " <th class='tableSubHeaderColumn center'>" . html_escape($label) . '</th>';
}
}
print '</tr>';
print '</thead>';
foreach ($capabilities as $name => $cap) {
form_alternate_row();
$title = html_escape_attr($cap['description']) . '<br><br><strong>' . html_escape_attr(__('Available settings:')) . '</strong> ' . html_escape_attr($cap['settings']);
print "<td><span class='cactiTooltipHint' tabindex='0' title='" . $title . "'>" . html_escape($name) . '</span></td>';
foreach ($columns as $engine => $versions) {
foreach ($versions as $v) {
$status = utilities_mysql_variable_status($cap, $engine, $v);
print "<td class='center'>" . utilities_mysql_capability_cell($status) . '</td>';
}
}
form_end_row();
}
form_alternate_row();
$legend = "<i class='ti ti-check deviceUp'></i> " . __('Supported') . ' &nbsp; ';
$legend .= "<span class='deviceRecovering'>D</span> " . __('Deprecated') . ' &nbsp; ';
$legend .= "<span class='deviceDown'>R</span> " . __('Removed') . ' &nbsp; ';
$legend .= __('N/A - Not applicable to this engine');
print "<td colspan='" . $total_columns . "' class='left'>" . $legend . '</td>';
form_end_row();
print '</table>';
print '</td>';
form_end_row();
}
function utilities_get_mysql_recommendations() : int {
global $local_db_cnn_id;
@@ -1359,11 +1775,11 @@ function utilities_get_mysql_recommendations() : int {
'class' => 'warning',
'comment' => __('If you have SSD disks, use this suggestion. If you have physical hard drives, use 2000 * the number of active drives in the array. If using NVMe or PCIe Flash, much larger numbers as high as 200000 can be used.')
],
'innodb_flush_neighbor_pages' => [
'value' => 'none',
'measure' => 'eq',
'innodb_flush_neighbors' => [
'value' => '0',
'measure' => 'equalint',
'class' => 'warning',
'comment' => __('If you have SSD disks, use this suggestion. Otherwise, do not set this setting.')
'comment' => __('If you have SSD disks, set this to 0. Otherwise, do not set this setting.')
]
];
} else {
@@ -1395,11 +1811,11 @@ function utilities_get_mysql_recommendations() : int {
'class' => 'warning',
'comment' => __('If you have SSD disks, use this suggestion. If you have physical hard drives, use 2000 * the number of active drives in the array. If using NVMe or PCIe Flash, much larger numbers as high as 200000 can be used.')
],
'innodb_flush_neighbor_pages' => [
'value' => 'none',
'measure' => 'eq',
'innodb_flush_neighbors' => [
'value' => '0',
'measure' => 'equalint',
'class' => 'warning',
'comment' => __('If you have SSD disks, use this suggestion. Otherwise, do not set this setting.')
'comment' => __('If you have SSD disks, set this to 0. Otherwise, do not set this setting.')
]
];
@@ -1437,6 +1853,23 @@ function utilities_get_mysql_recommendations() : int {
];
}
// Drop any recommendation for a variable that is deprecated, removed or does
// not exist in the detected engine and version so we only suggest tunables
// that are actually present on this server.
$capabilities = utilities_mysql_variable_capabilities();
foreach (array_keys($recommendations) as $rec_name) {
if (!isset($capabilities[$rec_name])) {
continue;
}
$status = utilities_mysql_variable_status($capabilities[$rec_name], $database, $version);
if ($status == 'deprecated' || $status == 'removed' || $status == 'na') {
unset($recommendations[$rec_name]);
}
}
if (file_exists('/etc/my.cnf.d/server.cnf')) {
$location = '/etc/my.cnf.d/server.cnf';
} else {
+276
View File
@@ -24972,6 +24972,282 @@ msgstr ""
msgid "No VDEFs"
msgstr ""
#: lib/utility.php:1147
msgid ""
"Default collation used by the server when creating databases and tables."
msgstr ""
#: lib/utility.php:1148
msgid "e.g. utf8mb4_unicode_ci, utf8mb4_general_ci."
msgstr ""
#: lib/utility.php:1153
msgid "Default character set used by the server."
msgstr ""
#: lib/utility.php:1154 lib/utility.php:1160
msgid "e.g. utf8mb4, utf8, latin1."
msgstr ""
#: lib/utility.php:1159
msgid "Character set the client uses when sending statements to the server."
msgstr ""
#: lib/utility.php:1165
msgid "Maximum number of simultaneous client connections permitted."
msgstr ""
#: lib/utility.php:1166
msgid "Integer; default 151. Allow enough for the pollers plus user logins."
msgstr ""
#: lib/utility.php:1171
msgid "Legacy name for the open-table cache; renamed to table_open_cache."
msgstr ""
#: lib/utility.php:1172
msgid "Integer. Use table_open_cache on modern servers."
msgstr ""
#: lib/utility.php:1177
msgid "Maximum size of one packet or any generated/intermediate string."
msgstr ""
#: lib/utility.php:1178
msgid "Bytes; keep at or above 16M for remote pollers."
msgstr ""
#: lib/utility.php:1183
msgid "Maximum size to which user-created MEMORY tables may grow."
msgstr ""
#: lib/utility.php:1184
msgid "Bytes; sized relative to total system memory."
msgstr ""
#: lib/utility.php:1189
msgid ""
"Maximum size of internal in-memory temporary tables before they spill to "
"disk."
msgstr ""
#: lib/utility.php:1190
msgid "Bytes; a larger value keeps temporary tables in memory."
msgstr ""
#: lib/utility.php:1195
msgid "Minimum per-join buffer size for joins that do not use indexes."
msgstr ""
#: lib/utility.php:1196
msgid "Bytes; per-connection allocation, default 262144."
msgstr ""
#: lib/utility.php:1201
msgid "Per-session buffer allocated for sorts (ORDER BY / GROUP BY)."
msgstr ""
#: lib/utility.php:1202
msgid "Bytes; per-connection allocation, default 2097152."
msgstr ""
#: lib/utility.php:1207
msgid ""
"Store each InnoDB table and its indexes in its own .ibd tablespace file."
msgstr ""
#: lib/utility.php:1208
msgid "ON or OFF; ON is recommended."
msgstr ""
#: lib/utility.php:1213
msgid ""
"InnoDB on-disk file format (Antelope or Barracuda); Barracuda is now the "
"only format."
msgstr ""
#: lib/utility.php:1214
msgid "Antelope, Barracuda."
msgstr ""
#: lib/utility.php:1219
msgid ""
"Allow index key prefixes longer than 767 bytes (requires the Barracuda "
"format)."
msgstr ""
#: lib/utility.php:1220
msgid "ON/1 or OFF/0; this behaviour is now always enabled."
msgstr ""
#: lib/utility.php:1225
msgid "Total memory InnoDB uses to cache table and index data."
msgstr ""
#: lib/utility.php:1226
msgid "Bytes; commonly 25%-80% of total system memory."
msgstr ""
#: lib/utility.php:1231
msgid ""
"Write pages twice (the doublewrite buffer) to protect against partial page "
"writes."
msgstr ""
#: lib/utility.php:1232
msgid "ON or OFF."
msgstr ""
#: lib/utility.php:1237
msgid "Legacy pool for the InnoDB internal data dictionary and structures."
msgstr ""
#: lib/utility.php:1238
msgid "Bytes; obsolete on modern servers."
msgstr ""
#: lib/utility.php:1243
msgid "Seconds an InnoDB transaction waits for a row lock before giving up."
msgstr ""
#: lib/utility.php:1244
msgid "Seconds; default 50."
msgstr ""
#: lib/utility.php:1249
msgid "Method used to flush data and log files to disk."
msgstr ""
#: lib/utility.php:1250
msgid "O_DIRECT, fsync, O_DSYNC, and similar."
msgstr ""
#: lib/utility.php:1255
msgid "Controls how the redo log is written and flushed at transaction commit."
msgstr ""
#: lib/utility.php:1256
msgid "0, 1, or 2."
msgstr ""
#: lib/utility.php:1261
msgid ""
"Legacy single setting for InnoDB file I/O threads, replaced by the read/"
"write I/O thread settings."
msgstr ""
#: lib/utility.php:1262
msgid ""
"Integer; superseded by innodb_read_io_threads and innodb_write_io_threads."
msgstr ""
#: lib/utility.php:1267
msgid "Write and flush the InnoDB redo log every N seconds."
msgstr ""
#: lib/utility.php:1268
msgid "Seconds (1-2700); default 1."
msgstr ""
#: lib/utility.php:1273
msgid "Number of I/O threads used for read operations in InnoDB."
msgstr ""
#: lib/utility.php:1274 lib/utility.php:1280
msgid "1-64; default 4."
msgstr ""
#: lib/utility.php:1279
msgid "Number of I/O threads used for write operations in InnoDB."
msgstr ""
#: lib/utility.php:1285
msgid "Number of regions the InnoDB buffer pool is divided into."
msgstr ""
#: lib/utility.php:1286
msgid "1-64; MariaDB removed this in 10.6."
msgstr ""
#: lib/utility.php:1291
msgid ""
"Estimated I/O operations per second available to InnoDB background tasks."
msgstr ""
#: lib/utility.php:1292 lib/utility.php:1298
msgid "Integer; use higher values for SSD/NVMe storage."
msgstr ""
#: lib/utility.php:1297
msgid "Maximum IOPS InnoDB may use when flushing falls behind."
msgstr ""
#: lib/utility.php:1303
msgid "Flush neighbouring dirty pages in the same extent when flushing a page."
msgstr ""
#: lib/utility.php:1304
msgid "0, 1, or 2; use 0 on SSD storage."
msgstr ""
#: lib/utility.php:1309
msgid ""
"Use hardware atomic writes (MariaDB) so the doublewrite buffer can be safely "
"disabled."
msgstr ""
#: lib/utility.php:1310
msgid "ON or OFF; MariaDB only."
msgstr ""
#: lib/utility.php:1314
msgid "Enforce strict snapshot isolation for InnoDB transactions."
msgstr ""
#: lib/utility.php:1315
msgid ""
"ON or OFF; back-ported to MariaDB 10.6.18+, 10.11.8+ and 11.4.2+. Set OFF "
"for the Cacti poller."
msgstr ""
#: lib/utility.php:1434 lib/utility.php:1529
msgid "Removed"
msgstr ""
#: lib/utility.php:1436 lib/utility.php:1528
msgid "Deprecated"
msgstr ""
#: lib/utility.php:1438
msgid "Not applicable to this engine"
msgstr ""
#: lib/utility.php:1440 lib/utility.php:1527
msgid "Supported"
msgstr ""
#: lib/utility.php:1483
#, php-format
msgid "%s Variable Capability Matrix"
msgstr ""
#: lib/utility.php:1483
msgid "Support by engine and version for each Cacti-recommended variable"
msgstr ""
#: lib/utility.php:1512
msgid "Available settings:"
msgstr ""
#: lib/utility.php:1530
msgid "N/A - Not applicable to this engine"
msgstr ""
#: lib/utility.php:1778 lib/utility.php:1814
msgid ""
"If you have SSD disks, set this to 0. Otherwise, do not set this setting."
msgstr ""
#: lib/html_filter.php
msgid "Layouts"
msgstr ""
+2
View File
@@ -8,6 +8,8 @@
<testsuite name="Installer Unit">
<directory>tests/Unit/Installer</directory>
<file>tests/Unit/Security/Csrf/InstallerCsrfRecoveryTest.php</file>
<!-- Covers the lib/utility.php MySQL capability helpers that the installer's recommendations step relies on. -->
<file>tests/Unit/Ui/Utility/MysqlCapabilityMatrixTest.php</file>
</testsuite>
<testsuite name="Installer Integration">
<file>tests/integration/InstallerComposerContractTest.php</file>
+2
View File
@@ -1953,6 +1953,8 @@ function show_tech_summary() : void {
utilities_get_mysql_recommendations();
utilities_get_mysql_capabilities();
// Shareable diagnostics report (Feature: Copy Diagnostics).
// When the redact toggle is on, hostnames/IPs embedded in the SNMP version
// line and web server string are masked via support_redact(), and the RSA
@@ -0,0 +1,130 @@
<?php
/*
+-------------------------------------------------------------------------+
| Copyright (C) 2004-2026 The Cacti Group |
| |
| This program is free software; you can redistribute it and/or |
| modify it under the terms of the GNU General Public License |
| as published by the Free Software Foundation; either version 2 |
| of the License, or (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
+-------------------------------------------------------------------------+
| Cacti: The Complete RRDtool-based Graphing Solution |
+-------------------------------------------------------------------------+
| This code is designed, written, and maintained by the Cacti Group. See |
| about.php and/or the AUTHORS file for specific developer information. |
+-------------------------------------------------------------------------+
| http://www.cacti.net/ |
+-------------------------------------------------------------------------+
*/
require_once dirname(__DIR__, 3) . '/Helpers/CactiStubs.php';
require_once dirname(__DIR__, 4) . '/include/global.php';
require_once dirname(__DIR__, 4) . '/lib/utility.php';
test('an empty engine bounds array means supported for every version', function () {
$caps = utilities_mysql_variable_capabilities();
$cap = $caps['innodb_buffer_pool_size'];
expect(utilities_mysql_variable_status($cap, 'MariaDB', '10.5.27'))->toBe('ok')
->and(utilities_mysql_variable_status($cap, 'MySQL', '9.1.0'))->toBe('ok');
});
test('a missing engine key renders as not applicable', function () {
$caps = utilities_mysql_variable_capabilities();
$cap = $caps['innodb_use_atomic_writes'];
expect(utilities_mysql_variable_status($cap, 'MySQL', '8.0.40'))->toBe('na')
->and(utilities_mysql_variable_status($cap, 'MariaDB', '10.5.27'))->toBe('ok');
});
test('deprecated and removed boundaries are evaluated per engine and version', function () {
$caps = utilities_mysql_variable_capabilities();
$cap = $caps['innodb_file_format'];
// MariaDB: deprecated 10.2.2, removed 10.3.1.
expect(utilities_mysql_variable_status($cap, 'MariaDB', '10.2.1'))->toBe('ok')
->and(utilities_mysql_variable_status($cap, 'MariaDB', '10.2.2'))->toBe('deprecated')
->and(utilities_mysql_variable_status($cap, 'MariaDB', '10.3.1'))->toBe('removed')
->and(utilities_mysql_variable_status($cap, 'MariaDB', '10.5.27'))->toBe('removed');
// MySQL: deprecated 5.7.7, removed 8.0.0.
expect(utilities_mysql_variable_status($cap, 'MySQL', '5.7.6'))->toBe('ok')
->and(utilities_mysql_variable_status($cap, 'MySQL', '5.7.7'))->toBe('deprecated')
->and(utilities_mysql_variable_status($cap, 'MySQL', '8.0.40'))->toBe('removed');
});
test('innodb_flush_neighbors is deprecated in MySQL 8.0.20 and removed in 8.4', function () {
$caps = utilities_mysql_variable_capabilities();
$cap = $caps['innodb_flush_neighbors'];
expect(utilities_mysql_variable_status($cap, 'MariaDB', '11.8.2'))->toBe('ok')
->and(utilities_mysql_variable_status($cap, 'MySQL', '8.0.19'))->toBe('ok')
->and(utilities_mysql_variable_status($cap, 'MySQL', '8.0.20'))->toBe('deprecated')
->and(utilities_mysql_variable_status($cap, 'MySQL', '8.4.0'))->toBe('removed')
->and(utilities_mysql_variable_status($cap, 'MySQL', '9.1.0'))->toBe('removed');
});
test('innodb_buffer_pool_instances follows the MariaDB lifecycle and stays on MySQL', function () {
$caps = utilities_mysql_variable_capabilities();
$cap = $caps['innodb_buffer_pool_instances'];
expect(utilities_mysql_variable_status($cap, 'MariaDB', '10.5.27'))->toBe('deprecated')
->and(utilities_mysql_variable_status($cap, 'MariaDB', '10.6.21'))->toBe('removed')
->and(utilities_mysql_variable_status($cap, 'MySQL', '8.0.40'))->toBe('ok');
});
test('innodb_snapshot_isolation models branch-specific back-ports', function () {
$caps = utilities_mysql_variable_capabilities();
$cap = $caps['innodb_snapshot_isolation'];
// 10.5 never received the back-port.
expect(utilities_mysql_variable_status($cap, 'MariaDB', '10.5.27'))->toBe('na')
// 10.6 branch gained it in 10.6.18.
->and(utilities_mysql_variable_status($cap, 'MariaDB', '10.6.17'))->toBe('na')
->and(utilities_mysql_variable_status($cap, 'MariaDB', '10.6.18'))->toBe('ok')
// 11.4 branch gained it in 11.4.2.
->and(utilities_mysql_variable_status($cap, 'MariaDB', '11.4.1'))->toBe('na')
->and(utilities_mysql_variable_status($cap, 'MariaDB', '11.4.2'))->toBe('ok')
// Newer branches ship it natively.
->and(utilities_mysql_variable_status($cap, 'MariaDB', '11.8.2'))->toBe('ok')
// MySQL never has it.
->and(utilities_mysql_variable_status($cap, 'MySQL', '9.1.0'))->toBe('na');
});
test('utilities_mysql_version_introduced accepts a scalar or a per-branch list', function () {
expect(utilities_mysql_version_introduced('11.4.2', '11.4.0'))->toBeTrue()
->and(utilities_mysql_version_introduced('11.3.9', '11.4.0'))->toBeFalse()
->and(utilities_mysql_version_introduced('10.6.18', ['10.6.18', '10.11.8', '11.4.2']))->toBeTrue()
->and(utilities_mysql_version_introduced('10.11.7', ['10.6.18', '10.11.8', '11.4.2']))->toBeFalse()
->and(utilities_mysql_version_introduced('12.0.0', ['10.6.18', '10.11.8', '11.4.2']))->toBeTrue();
});
test('version strings with non-numeric suffixes are normalized before comparison', function () {
expect(utilities_mysql_normalize_version('10.11.2-MariaDB-1:10.11.2+maria~ubu2204'))->toBe('10.11.2')
->and(utilities_mysql_normalize_version('8.0.35-0ubuntu0.22.04.1'))->toBe('8.0.35');
$caps = utilities_mysql_variable_capabilities();
// A suffixed build on or past a removal boundary must still read removed.
$ff = $caps['innodb_file_format'];
expect(utilities_mysql_variable_status($ff, 'MariaDB', '10.5.27-1:10.5.27+maria~ubu2004'))->toBe('removed')
->and(utilities_mysql_variable_status($ff, 'MySQL', '8.0.35-0ubuntu0.22.04.1'))->toBe('removed');
// The suffix must not tip a build just under a boundary across it.
$fn = $caps['innodb_flush_neighbors'];
expect(utilities_mysql_variable_status($fn, 'MySQL', '8.0.19-log'))->toBe('ok')
->and(utilities_mysql_variable_status($fn, 'MySQL', '8.0.20-log'))->toBe('deprecated');
});
test('an unknown (null or empty) version is treated as supported', function () {
$caps = utilities_mysql_variable_capabilities();
$cap = $caps['innodb_file_format'];
expect(utilities_mysql_variable_status($cap, 'MariaDB', null))->toBe('ok')
->and(utilities_mysql_variable_status($cap, 'MySQL', ''))->toBe('ok');
});