Skip to content

Commit

Permalink
Merge pull request #38933 from nextcloud/orphaned-entries-filecache-e…
Browse files Browse the repository at this point in the history
…xtended

feat: remove orphaned entries from filecache_extended
  • Loading branch information
icewind1991 authored Apr 15, 2024
2 parents 10fc78a + 1d34f0a commit b5e3508
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 2 deletions.
38 changes: 37 additions & 1 deletion apps/files/lib/Command/DeleteOrphanedFiles.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,11 @@
*/
namespace OCA\Files\Command;

use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
Expand All @@ -44,7 +46,8 @@ public function __construct(
protected function configure(): void {
$this
->setName('files:cleanup')
->setDescription('cleanup filecache');
->setDescription('cleanup filecache')
->addOption('skip-filecache-extended', null, InputOption::VALUE_NONE, 'don\'t remove orphaned entries from filecache_extended');
}

public function execute(InputInterface $input, OutputInterface $output): int {
Expand Down Expand Up @@ -75,11 +78,44 @@ public function execute(InputInterface $input, OutputInterface $output): int {

$output->writeln("$deletedEntries orphaned file cache entries deleted");

if (!$input->getOption('skip-filecache-extended')) {
$deletedFileCacheExtended = $this->cleanupOrphanedFileCacheExtended();
$output->writeln("$deletedFileCacheExtended orphaned file cache extended entries deleted");
}


$deletedMounts = $this->cleanupOrphanedMounts();
$output->writeln("$deletedMounts orphaned mount entries deleted");
return self::SUCCESS;
}

private function cleanupOrphanedFileCacheExtended(): int {
$deletedEntries = 0;

$query = $this->connection->getQueryBuilder();
$query->select('fce.fileid')
->from('filecache_extended', 'fce')
->leftJoin('fce', 'filecache', 'fc', $query->expr()->eq('fce.fileid', 'fc.fileid'))
->where($query->expr()->isNull('fc.fileid'))
->setMaxResults(self::CHUNK_SIZE);

$deleteQuery = $this->connection->getQueryBuilder();
$deleteQuery->delete('filecache_extended')
->where($deleteQuery->expr()->in('fileid', $deleteQuery->createParameter('idsToDelete')));

$result = $query->executeQuery();
while ($result->rowCount() > 0) {
$idsToDelete = $result->fetchAll(\PDO::FETCH_COLUMN);

$deleteQuery->setParameter('idsToDelete', $idsToDelete, IQueryBuilder::PARAM_INT_ARRAY);
$deletedEntries += $deleteQuery->executeStatement();

$result = $query->executeQuery();
}

return $deletedEntries;
}

private function cleanupOrphanedMounts(): int {
$deletedEntries = 0;

Expand Down
3 changes: 2 additions & 1 deletion apps/files/tests/Command/DeleteOrphanedFilesTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -132,10 +132,11 @@ public function testClearFiles() {

// parent folder, `files`, ´test` and `welcome.txt` => 4 elements
$output
->expects($this->exactly(2))
->expects($this->exactly(3))
->method('writeln')
->withConsecutive(
['3 orphaned file cache entries deleted'],
['0 orphaned file cache extended entries deleted'],
['1 orphaned mount entries deleted'],
);

Expand Down

0 comments on commit b5e3508

Please sign in to comment.