aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files/command/deleteorphanedfiles.php
diff options
context:
space:
mode:
authorThomas Müller <thomas.mueller@tmit.eu>2016-02-10 17:26:11 +0100
committerThomas Müller <thomas.mueller@tmit.eu>2016-02-10 17:26:11 +0100
commit6ffb83ae19e423ab894670cef116350ca86f331b (patch)
tree72466ee0c53e0e901dfddd47452fbcd8fa7e824c /apps/files/command/deleteorphanedfiles.php
parent39e6a1897b82b3433b5ed6437f14e2739ba26d32 (diff)
parent0ebb2050102190b1186c7338a84f86bd6f3f9d43 (diff)
downloadnextcloud-server-6ffb83ae19e423ab894670cef116350ca86f331b.tar.gz
nextcloud-server-6ffb83ae19e423ab894670cef116350ca86f331b.zip
Merge pull request #22269 from owncloud/issue-22243-avoid-deadlock-with-lots-of-entries-to-cleanup
Chunk the cleanup queries to make sure they don't time out
Diffstat (limited to 'apps/files/command/deleteorphanedfiles.php')
-rw-r--r--apps/files/command/deleteorphanedfiles.php30
1 files changed, 25 insertions, 5 deletions
diff --git a/apps/files/command/deleteorphanedfiles.php b/apps/files/command/deleteorphanedfiles.php
index d276e9a0993..f897c68fd8d 100644
--- a/apps/files/command/deleteorphanedfiles.php
+++ b/apps/files/command/deleteorphanedfiles.php
@@ -33,6 +33,8 @@ use Symfony\Component\Console\Output\OutputInterface;
*/
class DeleteOrphanedFiles extends Command {
+ const CHUNK_SIZE = 200;
+
/**
* @var IDBConnection
*/
@@ -50,13 +52,31 @@ class DeleteOrphanedFiles extends Command {
}
public function execute(InputInterface $input, OutputInterface $output) {
+ $deletedEntries = 0;
+
+ $query = $this->connection->getQueryBuilder();
+ $query->select('fc.fileid')
+ ->from('filecache', 'fc')
+ ->where($query->expr()->isNull('s.numeric_id'))
+ ->leftJoin('fc', 'storages', 's', $query->expr()->eq('fc.storage', 's.numeric_id'))
+ ->setMaxResults(self::CHUNK_SIZE);
+
+ $deleteQuery = $this->connection->getQueryBuilder();
+ $deleteQuery->delete('filecache')
+ ->where($deleteQuery->expr()->eq('fileid', $deleteQuery->createParameter('objectid')));
- $sql =
- 'DELETE FROM `*PREFIX*filecache` ' .
- 'WHERE NOT EXISTS ' .
- '(SELECT 1 FROM `*PREFIX*storages` WHERE `storage` = `numeric_id`)';
+ $deletedInLastChunk = self::CHUNK_SIZE;
+ while ($deletedInLastChunk === self::CHUNK_SIZE) {
+ $deletedInLastChunk = 0;
+ $result = $query->execute();
+ while ($row = $result->fetch()) {
+ $deletedInLastChunk++;
+ $deletedEntries += $deleteQuery->setParameter('objectid', (int) $row['fileid'])
+ ->execute();
+ }
+ $result->closeCursor();
+ }
- $deletedEntries = $this->connection->executeUpdate($sql);
$output->writeln("$deletedEntries orphaned file cache entries deleted");
}