From fc9a3472e95ad7dfe23bde420b2eff5e5ae5ef5c Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Wed, 1 Jun 2022 09:12:36 +0200 Subject: Revert "[remoteaccess] Avoid waking too many machines" This doesn't make any sense; we already account for this by looking at the woltime column. This reverts commit 0c561cd07c82d09ec5f6f1aa0a92ead403d0952b. --- .../remoteaccess/inc/remoteaccess.inc.php | 50 +++++----------------- 1 file changed, 11 insertions(+), 39 deletions(-) diff --git a/modules-available/remoteaccess/inc/remoteaccess.inc.php b/modules-available/remoteaccess/inc/remoteaccess.inc.php index 0e8b52b4..1910c595 100644 --- a/modules-available/remoteaccess/inc/remoteaccess.inc.php +++ b/modules-available/remoteaccess/inc/remoteaccess.inc.php @@ -28,63 +28,40 @@ class RemoteAccess return; } - $res = Database::simpleQuery("SELECT rg.groupid, rg.groupname, rg.wolcount, GROUP_CONCAT(rxl.locationid) AS locs - FROM remoteaccess_group rg + $res = Database::simpleQuery("SELECT rg.groupid, rg.groupname, rg.wolcount, GROUP_CONCAT(rxl.locationid) AS locs FROM remoteaccess_group rg INNER JOIN remoteaccess_x_location rxl USING (groupid) WHERE rg.active = 1 GROUP BY groupid"); // Consider machines we tried to wake in the past 90 seconds as online $wolDeadline = time() - 90; - // Keep track of locations where we sent a WOL to clients, so we don't wake too many machines in locations - // that appear in multiple groups - $locationDone = []; foreach ($res as $row) { + if ($row['wolcount'] <= 0) + continue; // This can't really be anything but a CSV list, but better be safe $locs = preg_replace('/[^0-9,]/', '', $row['locs']); if (empty($locs)) continue; - $wantedCount = $row['wolcount']; - // Account for machines in the same location(s) already woken in a previous loop iteration - foreach (explode(',', $locs) as $lid) { - $wantedCount -= ($locationDone[$lid] ?? 0); - } - // Nothing to do? - if ($wantedCount <= 0) - continue; - // Subtract number of idle machines in those locations, or machines that have - // received a WOL in the past $wolDeadline (90) seconds. $active = Database::queryFirst("SELECT Count(*) AS cnt FROM machine m INNER JOIN remoteaccess_machine rm USING (machineuuid) WHERE m.locationid IN ($locs) AND (m.state = 'IDLE' OR rm.woltime > $wolDeadline)"); - $active = ($active['cnt'] ?? 0); - $wantedCount -= $active; - if ($wantedCount <= 0) + $active = (isset($active['cnt']) ? $active['cnt'] : 0); + $wantNum = $row['wolcount'] - $active; + if ($wantNum <= 0) continue; - $wokenMachines = self::tryWakeMachines($locs, $wantedCount); - // Update our lookup table of locations and number of machines woken up in them for additional iterations - if (!empty($wokenMachines)) { - $locations = array_count_values($wokenMachines); - foreach ($locations as $lid => $count) { - $locationDone[$lid] = ($locationDone[$lid] ?? 0) + $count; - } - } + self::tryWakeMachines($locs, $wantNum); } } - private static function tryWakeMachines(string $locs, int $num): array + private static function tryWakeMachines($locs, $num) { $res = Database::simpleQuery("SELECT m.machineuuid, m.macaddr, m.clientip, m.locationid FROM machine m LEFT JOIN remoteaccess_machine rm USING (machineuuid) WHERE m.locationid IN ($locs) AND m.state IN ('OFFLINE', 'STANDBY') ORDER BY rm.woltime ASC"); $NOW = time(); - // List of machines we did successfully try to send a WOL to - $retval = []; - // Loop while we still have machines to wake while ($num > 0) { $list = []; - // Try to gather as many machines as required for ($i = 0; $i < $num && $row = $res->fetch(); ++$i) { $list[] = $row; Database::exec("INSERT INTO remoteaccess_machine (machineuuid, password, woltime) @@ -95,13 +72,6 @@ class RemoteAccess if (empty($list)) break; // No more clients in this location RebootControl::wakeMachines($list, $fails); - $triedKv = array_column($list, 'locationid', 'machineuuid'); - // Remove failed from list, flatten to list of machineuuid => location for return - foreach (array_column($fails, 'machineuuid') as $failMachineUuid) { - unset($triedKv[$failMachineUuid]); - } - $retval += $triedKv; - // Now reduce $num by how many machines were actually reachable, so we keep going in case there were fails $num -= count($list) - count($fails); if (!empty($fails)) { $failIds = ArrayUtil::flattenByKey($fails, 'machineuuid'); @@ -110,7 +80,9 @@ class RemoteAccess ['faketime' => $NOW - 95, 'fails' => $failIds]); } } - return $retval; + if ($num > 0) { + error_log("Could not wake $num clients in ($locs)..."); + } } } -- cgit v1.2.3-55-g7522