diff --git a/cronjobs/archive_cleanup.php b/cronjobs/archive_cleanup.php index 83c347c4..c65d8006 100755 --- a/cronjobs/archive_cleanup.php +++ b/cronjobs/archive_cleanup.php @@ -27,7 +27,7 @@ require_once('shared.inc.php'); // If we don't keep archives, delete some now to release disk space if (!$share->purgeArchive()) { - $log->logError("Failed to delete archived shares, not critical but should be checked!"); + $log->logError("Failed to delete archived shares, not critical but should be checked: " . $share->getCronError()); $monitoring->endCronjob($cron_name, 'E0008', 1, true); } diff --git a/public/include/classes/share.class.php b/public/include/classes/share.class.php index 5af52897..0b6beb89 100644 --- a/public/include/classes/share.class.php +++ b/public/include/classes/share.class.php @@ -175,30 +175,40 @@ class Share Extends Base { if (!isset($this->config['purge']['shares'])) $this->config['purge']['shares'] = 25000; if (!isset($this->config['purge']['sleep'])) $this->config['purge']['sleep'] = 1; + // TODO: This could need some cleanup work somtime but works if ($this->config['payout_system'] == 'pplns') { // Fetch our last block so we can go back configured rounds $aLastBlock = $this->block->getLast(); // Fetch the block we need to find the share_id $aBlock = $this->block->getBlock($aLastBlock['height'] - $this->config['archive']['maxrounds']); + + // We need to find a hard limit id so we don't run into an infinite loop, skip process if we can't find a limit + $stmt = $this->mysqli->prepare("SELECT MAX(id) AS id FROM $this->tableArchive WHERE block_id < ? AND time < DATE_SUB(now(), INTERVAL ? MINUTE)"); + if ($this->checkStmt($stmt) && $stmt->bind_param('ii', $aBlock['id'], $this->config['archive']['maxage']) && $stmt->execute() && $result = $stmt->get_result()) + if ( ! $max_id = $result->fetch_object()->id ) return true; // Now that we know our block, remove those shares $affected = 1; while ($affected > 0) { // Sleep first to allow any IO to cleanup sleep($this->config['purge']['sleep']); - $stmt = $this->mysqli->prepare("DELETE FROM $this->tableArchive WHERE block_id < ? AND time < DATE_SUB(now(), INTERVAL ? MINUTE) LIMIT " . $this->config['purge']['shares']); - if ($this->checkStmt($stmt) && $stmt->bind_param('ii', $aBlock['id'], $this->config['archive']['maxage']) && $stmt->execute()) { + $stmt = $this->mysqli->prepare("DELETE FROM $this->tableArchive WHERE block_id < ? AND time < DATE_SUB(now(), INTERVAL ? MINUTE) AND id <= ? LIMIT " . $this->config['purge']['shares']); + if ($this->checkStmt($stmt) && $stmt->bind_param('iii', $aBlock['id'], $this->config['archive']['maxage'], $max_id) && $stmt->execute()) { $affected = $stmt->affected_rows; } else { return $this->sqlError(); } } } else { + // We need to find a hard limit id so we don't run into an infinite loop, skip process if we can't find a limit + $stmt = $this->mysqli->prepare("SELECT MAX(id) AS id FROM $this->tableArchive WHERE time < DATE_SUB(now(), INTERVAL ? MINUTE)"); + if ($this->checkStmt($stmt) && $stmt->bind_param('i', $this->config['archive']['maxage']) && $stmt->execute() && $result = $stmt->get_result()) + if ( ! $max_id = $result->fetch_object()->id ) return true; $affected = 1; while ($affected > 0) { // Sleep first to allow any IO to cleanup sleep($this->config['purge']['sleep']); - $stmt = $this->mysqli->prepare("DELETE FROM $this->tableArchive WHERE time < DATE_SUB(now(), INTERVAL ? MINUTE) LIMIT " . $this->config['purge']['shares']); - if ($this->checkStmt($stmt) && $stmt->bind_param('i', $this->config['archive']['maxage']) && $stmt->execute()) { + $stmt = $this->mysqli->prepare("DELETE FROM $this->tableArchive WHERE time < DATE_SUB(now(), INTERVAL ? MINUTE) AND id <= ? LIMIT " . $this->config['purge']['shares']); + if ($this->checkStmt($stmt) && $stmt->bind_param('ii', $this->config['archive']['maxage'], $max_id) && $stmt->execute()) { $affected = $stmt->affected_rows; } else { return $this->sqlError();