From 00b3590a1dc4526e8b159d5829b77c3fb124b499 Mon Sep 17 00:00:00 2001 From: Alex Pott Date: Fri, 19 Apr 2019 12:47:53 +0100 Subject: [PATCH] Issue #2802803 by Berdir, AdamPS, Darren Oh, alexpott, Munavijayalakshmi, jackbravo, slashrsm, mmbk, Dane Powell, larowlan, LittleCoding, gapple, catch, wiifm, quantumized, acbramley: Temporary files whose files are missing on the disk result in never-ending error log messages --- core/modules/file/file.module | 15 ++++++++---- .../file/tests/src/Kernel/DeleteTest.php | 24 +++++++++++++++++++ 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/core/modules/file/file.module b/core/modules/file/file.module index 92299e80ceec..3b7f0092b48f 100644 --- a/core/modules/file/file.module +++ b/core/modules/file/file.module @@ -728,12 +728,17 @@ 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())) { + if (!file_valid_uri($file->getFileUri())) { + \Drupal::logger('file system')->warning('Temporary file "%path" that was deleted during garbage collection did not exist on the filesystem. This could be caused by a missing stream wrapper.', ['%path' => $file->getFileUri()]); + } + else { + \Drupal::logger('file system')->warning('Temporary file "%path" that was deleted during garbage collection did not exist on the filesystem.', ['%path' => $file->getFileUri()]); + } } + // Delete the file entity. If the file does not exist, this will + // generate a second notice in the watchdog. + $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 a82e009eb1c8..a0b3822e26d4 100644 --- a/core/modules/file/tests/src/Kernel/DeleteTest.php +++ b/core/modules/file/tests/src/Kernel/DeleteTest.php @@ -77,4 +77,28 @@ class DeleteTest extends FileManagedUnitTestBase { $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. + \Drupal::service('file_system')->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' => REQUEST_TIME - ($this->config('system.file')->get('temporary_maximum_age') + 1), + ]) + ->condition('fid', $file->id()) + ->execute(); + \Drupal::service('cron')->run(); + + $this->assertFalse(File::load($file->id()), 'File was removed from the database.'); + } + }