diff --git a/core/modules/file/file.module b/core/modules/file/file.module index a6fc3f6..c323483 100644 --- a/core/modules/file/file.module +++ b/core/modules/file/file.module @@ -659,12 +659,10 @@ function file_cron() { foreach ($files as $file) { $references = \Drupal::service('file.usage')->listUsage($file); if (empty($references)) { - if (file_exists($file->getFileUri())) { - $file->delete(); - } - else { - \Drupal::logger('file system')->error('Could not delete temporary file "%path" during garbage collection', ['%path' => $file->getFileUri()]); + if (!file_exists($file->getFileUri())) { + \Drupal::logger('file system')->warning('Temporary file "%path" that was deleted during garbage collection did not exist on the filesystem.', ['%path' => $file->getFileUri()]); } + $file->delete(); } else { \Drupal::logger('file system')->info('Did not delete temporary file "%path" during garbage collection because it is in use by the following modules: %modules.', ['%path' => $file->getFileUri(), '%modules' => implode(', ', array_keys($references))]); diff --git a/core/modules/file/tests/src/Kernel/DeleteTest.php b/core/modules/file/tests/src/Kernel/DeleteTest.php index 3b868c0..ffa0cfa 100644 --- a/core/modules/file/tests/src/Kernel/DeleteTest.php +++ b/core/modules/file/tests/src/Kernel/DeleteTest.php @@ -69,4 +69,29 @@ public function testInUse() { $this->assertFalse(File::load($file->id()), 'File was removed from the database.'); } + /** + * Tries to run cron deletion on file deleted from the file-system. + */ + public function testCronDeleteNonExistingTemporary() { + $file = $this->createFile(); + // Delete the file, but leave it in the file_managed table. + file_unmanaged_delete($file->getFileUri()); + $this->assertFalse(file_exists($file->getFileUri()), 'File is deleted from the filesystem.'); + $this->assertTrue(File::load($file->id()), 'File exist in file_managed table'); + + // Call file_cron() to clean up the file. Make sure the changed timestamp + // of the file is older than the system.file.temporary_maximum_age + // configuration value. + \Drupal::database()->update('file_managed') + ->fields([ + 'changed' => \Drupal::time()->getRequestTime() - ($this->config('system.file')->get('temporary_maximum_age') + 1), + ]) + ->condition('fid', $file->id()) + ->execute(); + \Drupal::service('cron')->run(); + file_test_reset(); + + $this->assertFalse(File::load($file->id()), 'File was removed from the database.'); + } + }