From f5b94b9ed8c7ec099d6496c29338dd7112bc5cb4 Mon Sep 17 00:00:00 2001 From: Carl Schwan Date: Fri, 22 May 2026 16:06:02 +0200 Subject: [PATCH] perf: Optimize deleting the list of invalid shares And make the code a bit easier to read. Signed-off-by: Carl Schwan --- lib/private/Repair/RepairInvalidShares.php | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/lib/private/Repair/RepairInvalidShares.php b/lib/private/Repair/RepairInvalidShares.php index 1793ef55f30e9..2634b805a3ddb 100644 --- a/lib/private/Repair/RepairInvalidShares.php +++ b/lib/private/Repair/RepairInvalidShares.php @@ -8,6 +8,7 @@ namespace OC\Repair; use OCP\Constants; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IConfig; use OCP\IDBConnection; use OCP\Migration\IOutput; @@ -67,18 +68,20 @@ private function removeSharesNonExistingParent(IOutput $output): void { $deleteQuery = $this->connection->getQueryBuilder(); $deleteQuery->delete('share') - ->where($deleteQuery->expr()->eq('parent', $deleteQuery->createParameter('parent'))); + ->where($deleteQuery->expr()->in('parent', $deleteQuery->createParameter('parent'))); - $deletedInLastChunk = self::CHUNK_SIZE; - while ($deletedInLastChunk === self::CHUNK_SIZE) { - $deletedInLastChunk = 0; + while (true) { $result = $query->executeQuery(); - while ($row = $result->fetch()) { - $deletedInLastChunk++; - $deletedEntries += $deleteQuery->setParameter('parent', (int)$row['parent']) - ->executeStatement(); - } + $parents = $result->fetchFirstColumn(); + $parents = array_unique($parents); $result->closeCursor(); + + if ($parents === []) { + break; + } + + $deletedEntries += $deleteQuery->setParameter('parent', $parents, IQueryBuilder::PARAM_INT_ARRAY) + ->executeStatement(); } if ($deletedEntries) {