mirror of
https://github.com/nextcloud/server.git
synced 2026-06-06 07:13:23 -04:00
Merge pull request #38933 from nextcloud/orphaned-entries-filecache-extended
feat: remove orphaned entries from filecache_extended
This commit is contained in:
commit
b5e3508a0b
2 changed files with 39 additions and 2 deletions
|
|
@ -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;
|
||||
|
||||
/**
|
||||
|
|
@ -44,7 +46,8 @@ class DeleteOrphanedFiles extends Command {
|
|||
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 {
|
||||
|
|
@ -75,11 +78,44 @@ class DeleteOrphanedFiles extends Command {
|
|||
|
||||
$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;
|
||||
|
||||
|
|
|
|||
|
|
@ -132,10 +132,11 @@ class DeleteOrphanedFilesTest extends TestCase {
|
|||
|
||||
// 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'],
|
||||
);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue