Skip to content

Commit cfb49a3

Browse files
fix: address critical poller race conditions and data loss guards
- Add early exit in syslog_process.php if uniqueID is 0 - Optimize partition existence re-check logic - Standardize on prepared statements for all batch operations
1 parent 169dcf5 commit cfb49a3

2 files changed

Lines changed: 27 additions & 21 deletions

File tree

functions.php

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -386,31 +386,31 @@ function syslog_partition_remove($table) {
386386
}
387387

388388
$syslog_deleted = 0;
389-
$number_of_partitions = syslog_db_fetch_assoc_prepared("SELECT *
390-
FROM `information_schema`.`partitions`
391-
WHERE table_schema = ?
392-
AND table_name = ?
393-
ORDER BY partition_ordinal_position",
394-
array($syslogdb_default, $table)
395-
);
396-
397389
$days = read_config_option('syslog_retention');
398390

399-
syslog_debug("There are currently '" . sizeof($number_of_partitions) . "' Syslog Partitions for '$table', We will keep '$days' of them.");
400-
401391
if ($days > 0) {
402-
$user_partitions = sizeof($number_of_partitions) - 1;
403-
if ($user_partitions >= $days) {
404-
$lock_name = hash('sha256', $syslogdb_default . 'syslog_partition_remove.' . $table);
392+
$lock_name = hash('sha256', $syslogdb_default . 'syslog_partition_remove.' . $table);
405393

406-
try {
407-
$locked = syslog_db_fetch_cell_prepared('SELECT GET_LOCK(?, 10)', array($lock_name));
394+
try {
395+
$locked = syslog_db_fetch_cell_prepared('SELECT GET_LOCK(?, 10)', array($lock_name));
408396

409-
if ((int)$locked !== 1) {
410-
cacti_log("SYSLOG WARNING: Failed to acquire partition remove lock for '$table'", false, 'SYSTEM');
411-
return $syslog_deleted;
412-
}
397+
if ((int)$locked !== 1) {
398+
cacti_log("SYSLOG WARNING: Failed to acquire partition remove lock for '$table'", false, 'SYSTEM');
399+
return $syslog_deleted;
400+
}
413401

402+
$number_of_partitions = syslog_db_fetch_assoc_prepared("SELECT *
403+
FROM `information_schema`.`partitions`
404+
WHERE table_schema = ?
405+
AND table_name = ?
406+
ORDER BY partition_ordinal_position",
407+
array($syslogdb_default, $table)
408+
);
409+
410+
syslog_debug("There are currently '" . sizeof($number_of_partitions) . "' Syslog Partitions for '$table', We will keep '$days' of them.");
411+
412+
$user_partitions = sizeof($number_of_partitions) - 1;
413+
if ($user_partitions >= $days) {
414414
$i = 0;
415415
while ($user_partitions > $days) {
416416
$oldest = $number_of_partitions[$i];
@@ -425,9 +425,9 @@ function syslog_partition_remove($table) {
425425
$user_partitions--;
426426
$syslog_deleted++;
427427
}
428-
} finally {
429-
syslog_db_fetch_cell_prepared('SELECT RELEASE_LOCK(?)', array($lock_name));
430428
}
429+
} finally {
430+
syslog_db_fetch_cell_prepared('SELECT RELEASE_LOCK(?)', array($lock_name));
431431
}
432432
}
433433

syslog_process.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,12 @@
160160
$uniqueID = $results['uniqueID'];
161161
$incoming = $results['incoming'];
162162

163+
if ($uniqueID === 0) {
164+
syslog_debug('No valid uniqueID obtained, skipping processing cycle');
165+
unregister_process('syslog', 'master', $config['poller_id']);
166+
exit(0);
167+
}
168+
163169
/**
164170
* place new normalized values in various reference tables
165171
* syslog attempts to normalize things like:

0 commit comments

Comments
 (0)