@@ -22,100 +22,100 @@ |
||
| 22 | 22 | use Psr\Log\LoggerInterface; |
| 23 | 23 | |
| 24 | 24 | class GenerateMetadataJob extends TimedJob { |
| 25 | - // Default file size limit for metadata generation (MBytes). |
|
| 26 | - protected const DEFAULT_MAX_FILESIZE = 256; |
|
| 27 | - |
|
| 28 | - public function __construct( |
|
| 29 | - ITimeFactory $time, |
|
| 30 | - private IConfig $config, |
|
| 31 | - private IAppConfig $appConfig, |
|
| 32 | - private IRootFolder $rootFolder, |
|
| 33 | - private IUserManager $userManager, |
|
| 34 | - private IFilesMetadataManager $filesMetadataManager, |
|
| 35 | - private IJobList $jobList, |
|
| 36 | - private LoggerInterface $logger, |
|
| 37 | - ) { |
|
| 38 | - parent::__construct($time); |
|
| 39 | - |
|
| 40 | - $this->setTimeSensitivity(self::TIME_INSENSITIVE); |
|
| 41 | - $this->setInterval(24 * 60 * 60); |
|
| 42 | - } |
|
| 43 | - |
|
| 44 | - protected function run(mixed $argument): void { |
|
| 45 | - if ($this->appConfig->getValueBool('core', 'metadataGenerationDone', false)) { |
|
| 46 | - return; |
|
| 47 | - } |
|
| 48 | - |
|
| 49 | - $lastHandledUser = $this->appConfig->getValueString('core', 'metadataGenerationLastHandledUser', ''); |
|
| 50 | - |
|
| 51 | - $users = $this->userManager->search(''); |
|
| 52 | - |
|
| 53 | - // we'll only start timer once we have found a valid user to handle |
|
| 54 | - // meaning NOW if we have not handled any user from a previous run |
|
| 55 | - $startTime = ($lastHandledUser === '') ? time() : null; |
|
| 56 | - foreach ($users as $user) { |
|
| 57 | - $userId = $user->getUID(); |
|
| 58 | - |
|
| 59 | - // if we already handled a previous run, we start timer only when we face the last handled user |
|
| 60 | - if ($startTime === null) { |
|
| 61 | - if ($userId === $lastHandledUser) { |
|
| 62 | - $startTime = time(); |
|
| 63 | - } |
|
| 64 | - continue; |
|
| 65 | - } |
|
| 66 | - |
|
| 67 | - $this->appConfig->setValueString('core', 'metadataGenerationLastHandledUser', $userId); |
|
| 68 | - $this->scanFilesForUser($user->getUID()); |
|
| 69 | - |
|
| 70 | - // Stop if execution time is more than one hour. |
|
| 71 | - if (time() - $startTime > 3600) { |
|
| 72 | - return; |
|
| 73 | - } |
|
| 74 | - } |
|
| 75 | - |
|
| 76 | - $this->appConfig->deleteKey('core', 'metadataGenerationLastHandledUser'); |
|
| 77 | - $this->appConfig->setValueBool('core', 'metadataGenerationDone', true); |
|
| 78 | - } |
|
| 79 | - |
|
| 80 | - private function scanFilesForUser(string $userId): void { |
|
| 81 | - $userFolder = $this->rootFolder->getUserFolder($userId); |
|
| 82 | - $this->scanFolder($userFolder); |
|
| 83 | - } |
|
| 84 | - |
|
| 85 | - private function scanFolder(Folder $folder): void { |
|
| 86 | - // Do not scan share and other moveable mounts. |
|
| 87 | - if ($folder->getMountPoint() instanceof MoveableMount) { |
|
| 88 | - return; |
|
| 89 | - } |
|
| 90 | - |
|
| 91 | - foreach ($folder->getDirectoryListing() as $node) { |
|
| 92 | - if ($node instanceof Folder) { |
|
| 93 | - $this->scanFolder($node); |
|
| 94 | - continue; |
|
| 95 | - } |
|
| 96 | - |
|
| 97 | - // Don't generate metadata for files bigger than configured metadata_max_filesize |
|
| 98 | - // Files are loaded in memory so very big files can lead to an OOM on the server |
|
| 99 | - $nodeSize = $node->getSize(); |
|
| 100 | - $nodeLimit = $this->config->getSystemValueInt('metadata_max_filesize', self::DEFAULT_MAX_FILESIZE); |
|
| 101 | - $nodeLimitMib = $nodeLimit * 1024 * 1024; |
|
| 102 | - if ($nodeSize > $nodeLimitMib) { |
|
| 103 | - $this->logger->debug('Skipping generating metadata for fileid ' . $node->getId() . " as its size exceeds configured 'metadata_max_filesize'."); |
|
| 104 | - continue; |
|
| 105 | - } |
|
| 106 | - |
|
| 107 | - try { |
|
| 108 | - $this->filesMetadataManager->getMetadata($node->getId(), false); |
|
| 109 | - } catch (FilesMetadataNotFoundException) { |
|
| 110 | - try { |
|
| 111 | - $this->filesMetadataManager->refreshMetadata( |
|
| 112 | - $node, |
|
| 113 | - IFilesMetadataManager::PROCESS_LIVE | IFilesMetadataManager::PROCESS_BACKGROUND |
|
| 114 | - ); |
|
| 115 | - } catch (\Throwable $ex) { |
|
| 116 | - $this->logger->warning('Error while generating metadata for fileid ' . $node->getId(), ['exception' => $ex]); |
|
| 117 | - } |
|
| 118 | - } |
|
| 119 | - } |
|
| 120 | - } |
|
| 25 | + // Default file size limit for metadata generation (MBytes). |
|
| 26 | + protected const DEFAULT_MAX_FILESIZE = 256; |
|
| 27 | + |
|
| 28 | + public function __construct( |
|
| 29 | + ITimeFactory $time, |
|
| 30 | + private IConfig $config, |
|
| 31 | + private IAppConfig $appConfig, |
|
| 32 | + private IRootFolder $rootFolder, |
|
| 33 | + private IUserManager $userManager, |
|
| 34 | + private IFilesMetadataManager $filesMetadataManager, |
|
| 35 | + private IJobList $jobList, |
|
| 36 | + private LoggerInterface $logger, |
|
| 37 | + ) { |
|
| 38 | + parent::__construct($time); |
|
| 39 | + |
|
| 40 | + $this->setTimeSensitivity(self::TIME_INSENSITIVE); |
|
| 41 | + $this->setInterval(24 * 60 * 60); |
|
| 42 | + } |
|
| 43 | + |
|
| 44 | + protected function run(mixed $argument): void { |
|
| 45 | + if ($this->appConfig->getValueBool('core', 'metadataGenerationDone', false)) { |
|
| 46 | + return; |
|
| 47 | + } |
|
| 48 | + |
|
| 49 | + $lastHandledUser = $this->appConfig->getValueString('core', 'metadataGenerationLastHandledUser', ''); |
|
| 50 | + |
|
| 51 | + $users = $this->userManager->search(''); |
|
| 52 | + |
|
| 53 | + // we'll only start timer once we have found a valid user to handle |
|
| 54 | + // meaning NOW if we have not handled any user from a previous run |
|
| 55 | + $startTime = ($lastHandledUser === '') ? time() : null; |
|
| 56 | + foreach ($users as $user) { |
|
| 57 | + $userId = $user->getUID(); |
|
| 58 | + |
|
| 59 | + // if we already handled a previous run, we start timer only when we face the last handled user |
|
| 60 | + if ($startTime === null) { |
|
| 61 | + if ($userId === $lastHandledUser) { |
|
| 62 | + $startTime = time(); |
|
| 63 | + } |
|
| 64 | + continue; |
|
| 65 | + } |
|
| 66 | + |
|
| 67 | + $this->appConfig->setValueString('core', 'metadataGenerationLastHandledUser', $userId); |
|
| 68 | + $this->scanFilesForUser($user->getUID()); |
|
| 69 | + |
|
| 70 | + // Stop if execution time is more than one hour. |
|
| 71 | + if (time() - $startTime > 3600) { |
|
| 72 | + return; |
|
| 73 | + } |
|
| 74 | + } |
|
| 75 | + |
|
| 76 | + $this->appConfig->deleteKey('core', 'metadataGenerationLastHandledUser'); |
|
| 77 | + $this->appConfig->setValueBool('core', 'metadataGenerationDone', true); |
|
| 78 | + } |
|
| 79 | + |
|
| 80 | + private function scanFilesForUser(string $userId): void { |
|
| 81 | + $userFolder = $this->rootFolder->getUserFolder($userId); |
|
| 82 | + $this->scanFolder($userFolder); |
|
| 83 | + } |
|
| 84 | + |
|
| 85 | + private function scanFolder(Folder $folder): void { |
|
| 86 | + // Do not scan share and other moveable mounts. |
|
| 87 | + if ($folder->getMountPoint() instanceof MoveableMount) { |
|
| 88 | + return; |
|
| 89 | + } |
|
| 90 | + |
|
| 91 | + foreach ($folder->getDirectoryListing() as $node) { |
|
| 92 | + if ($node instanceof Folder) { |
|
| 93 | + $this->scanFolder($node); |
|
| 94 | + continue; |
|
| 95 | + } |
|
| 96 | + |
|
| 97 | + // Don't generate metadata for files bigger than configured metadata_max_filesize |
|
| 98 | + // Files are loaded in memory so very big files can lead to an OOM on the server |
|
| 99 | + $nodeSize = $node->getSize(); |
|
| 100 | + $nodeLimit = $this->config->getSystemValueInt('metadata_max_filesize', self::DEFAULT_MAX_FILESIZE); |
|
| 101 | + $nodeLimitMib = $nodeLimit * 1024 * 1024; |
|
| 102 | + if ($nodeSize > $nodeLimitMib) { |
|
| 103 | + $this->logger->debug('Skipping generating metadata for fileid ' . $node->getId() . " as its size exceeds configured 'metadata_max_filesize'."); |
|
| 104 | + continue; |
|
| 105 | + } |
|
| 106 | + |
|
| 107 | + try { |
|
| 108 | + $this->filesMetadataManager->getMetadata($node->getId(), false); |
|
| 109 | + } catch (FilesMetadataNotFoundException) { |
|
| 110 | + try { |
|
| 111 | + $this->filesMetadataManager->refreshMetadata( |
|
| 112 | + $node, |
|
| 113 | + IFilesMetadataManager::PROCESS_LIVE | IFilesMetadataManager::PROCESS_BACKGROUND |
|
| 114 | + ); |
|
| 115 | + } catch (\Throwable $ex) { |
|
| 116 | + $this->logger->warning('Error while generating metadata for fileid ' . $node->getId(), ['exception' => $ex]); |
|
| 117 | + } |
|
| 118 | + } |
|
| 119 | + } |
|
| 120 | + } |
|
| 121 | 121 | } |
@@ -100,7 +100,7 @@ discard block |
||
| 100 | 100 | $nodeLimit = $this->config->getSystemValueInt('metadata_max_filesize', self::DEFAULT_MAX_FILESIZE); |
| 101 | 101 | $nodeLimitMib = $nodeLimit * 1024 * 1024; |
| 102 | 102 | if ($nodeSize > $nodeLimitMib) { |
| 103 | - $this->logger->debug('Skipping generating metadata for fileid ' . $node->getId() . " as its size exceeds configured 'metadata_max_filesize'."); |
|
| 103 | + $this->logger->debug('Skipping generating metadata for fileid '.$node->getId()." as its size exceeds configured 'metadata_max_filesize'."); |
|
| 104 | 104 | continue; |
| 105 | 105 | } |
| 106 | 106 | |
@@ -113,7 +113,7 @@ discard block |
||
| 113 | 113 | IFilesMetadataManager::PROCESS_LIVE | IFilesMetadataManager::PROCESS_BACKGROUND |
| 114 | 114 | ); |
| 115 | 115 | } catch (\Throwable $ex) { |
| 116 | - $this->logger->warning('Error while generating metadata for fileid ' . $node->getId(), ['exception' => $ex]); |
|
| 116 | + $this->logger->warning('Error while generating metadata for fileid '.$node->getId(), ['exception' => $ex]); |
|
| 117 | 117 | } |
| 118 | 118 | } |
| 119 | 119 | } |