Skip to content

Commit a88d4e0

Browse files
solracsfartonge
andcommitted
Max file size for metadata generation
Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com> enh(metadata): Introduce a memory limit for metadata generation Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com> From Bytes to MiB Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com> Fix psalm Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com> Rename var to max_filesize Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com> Co-Authored-By: Louis <louis@chmn.me>
1 parent 32bf74a commit a88d4e0

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

config/config.sample.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1324,6 +1324,15 @@
13241324
'OC\Preview\XBitmap',
13251325
],
13261326

1327+
/**
1328+
* Maximum file size for metadata generation.
1329+
* If a file exceeds this size, metadata generation will be skipped.
1330+
* Note: memory equivalent to this size will be used for metadata generation.
1331+
*
1332+
* Default: 256 megabytes.
1333+
*/
1334+
'metadata_max_filesize' => 256,
1335+
13271336
/**
13281337
* LDAP
13291338
*

core/BackgroundJobs/GenerateMetadataJob.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@
3737
use Psr\Log\LoggerInterface;
3838

3939
class GenerateMetadataJob extends TimedJob {
40+
// Default file size limit for metadata generation (MBytes).
41+
protected const DEFAULT_MAX_FILESIZE = 256;
42+
4043
public function __construct(
4144
ITimeFactory $time,
4245
private IConfig $config,
@@ -100,6 +103,15 @@ private function scanFolder(Folder $folder): void {
100103
continue;
101104
}
102105

106+
// Don't generate metadata for files bigger than configured metadata_max_filesize
107+
// Files are loaded in memory so very big files can lead to an OOM on the server
108+
$nodeSize = $node->getSize();
109+
$nodeLimit = $this->config->getSystemValueInt('metadata_max_filesize', self::DEFAULT_MAX_FILESIZE);
110+
if ($nodeSize > $nodeLimit * 1000000) {
111+
$this->logger->debug("Skipping generating metadata for fileid " . $node->getId() . " as its size exceeds configured 'metadata_max_filesize'.");
112+
continue;
113+
}
114+
103115
try {
104116
$this->filesMetadataManager->getMetadata($node->getId(), false);
105117
} catch (FilesMetadataNotFoundException) {

0 commit comments

Comments
 (0)