diff --git a/core/Migrations/Version34000Date20260318095645.php b/core/Migrations/Version34000Date20260318095645.php new file mode 100644 index 0000000000000..8be6dfc912277 --- /dev/null +++ b/core/Migrations/Version34000Date20260318095645.php @@ -0,0 +1,41 @@ +hasTable('jobs')) { + $table = $schema->getTable('jobs'); + $argumentColumn = $table->getColumn('argument'); + + if ($argumentColumn->getType() !== Type::getType(Types::TEXT)) { + $argumentColumn->setType(Type::getType(Types::TEXT)); + return $schema; + } + } + + return null; + } +} diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 93f5def20a52a..34628bc692ab0 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -1594,6 +1594,7 @@ 'OC\\Core\\Migrations\\Version33000Date20251126152410' => $baseDir . '/core/Migrations/Version33000Date20251126152410.php', 'OC\\Core\\Migrations\\Version33000Date20251209123503' => $baseDir . '/core/Migrations/Version33000Date20251209123503.php', 'OC\\Core\\Migrations\\Version33000Date20260126120000' => $baseDir . '/core/Migrations/Version33000Date20260126120000.php', + 'OC\\Core\\Migrations\\Version34000Date20260318095645' => $baseDir . '/core/Migrations/Version34000Date20260318095645.php', 'OC\\Core\\Notification\\CoreNotifier' => $baseDir . '/core/Notification/CoreNotifier.php', 'OC\\Core\\ResponseDefinitions' => $baseDir . '/core/ResponseDefinitions.php', 'OC\\Core\\Service\\CronService' => $baseDir . '/core/Service/CronService.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index bc27a12cf46b6..17be02ae2d065 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -1635,6 +1635,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OC\\Core\\Migrations\\Version33000Date20251126152410' => __DIR__ . '/../../..' . '/core/Migrations/Version33000Date20251126152410.php', 'OC\\Core\\Migrations\\Version33000Date20251209123503' => __DIR__ . '/../../..' . '/core/Migrations/Version33000Date20251209123503.php', 'OC\\Core\\Migrations\\Version33000Date20260126120000' => __DIR__ . '/../../..' . '/core/Migrations/Version33000Date20260126120000.php', + 'OC\\Core\\Migrations\\Version34000Date20260318095645' => __DIR__ . '/../../..' . '/core/Migrations/Version34000Date20260318095645.php', 'OC\\Core\\Notification\\CoreNotifier' => __DIR__ . '/../../..' . '/core/Notification/CoreNotifier.php', 'OC\\Core\\ResponseDefinitions' => __DIR__ . '/../../..' . '/core/ResponseDefinitions.php', 'OC\\Core\\Service\\CronService' => __DIR__ . '/../../..' . '/core/Service/CronService.php', diff --git a/lib/private/BackgroundJob/JobList.php b/lib/private/BackgroundJob/JobList.php index 203a070bf2c28..b62bec1ae5fa1 100644 --- a/lib/private/BackgroundJob/JobList.php +++ b/lib/private/BackgroundJob/JobList.php @@ -28,6 +28,8 @@ use function strlen; class JobList implements IJobList { + public const MAX_ARGUMENT_JSON_LENGTH = 32000; + /** @var array */ protected array $alreadyVisitedParallelBlocked = []; @@ -49,8 +51,8 @@ public function add(IJob|string $job, mixed $argument = null, ?int $firstCheck = $class = ($job instanceof IJob) ? get_class($job) : $job; $argumentJson = json_encode($argument); - if (strlen($argumentJson) > 4000) { - throw new \InvalidArgumentException('Background job arguments can\'t exceed 4000 characters (json encoded)'); + if (strlen($argumentJson) > self::MAX_ARGUMENT_JSON_LENGTH) { + throw new \InvalidArgumentException('Background job arguments can\'t exceed ' . self::MAX_ARGUMENT_JSON_LENGTH . ' characters (json encoded)'); } $query = $this->connection->getQueryBuilder(); diff --git a/tests/lib/BackgroundJob/JobListTest.php b/tests/lib/BackgroundJob/JobListTest.php index affd97a238a06..df3cd451be4eb 100644 --- a/tests/lib/BackgroundJob/JobListTest.php +++ b/tests/lib/BackgroundJob/JobListTest.php @@ -99,6 +99,24 @@ public function testAddRemove(mixed $argument): void { $this->assertEquals($existingJobs, $jobs); } + public function testAddAcceptsArgumentUnderMaxLength(): void { + $argument = str_repeat('a', $this->instance::MAX_ARGUMENT_JSON_LENGTH - 100); + $job = new TestJob(); + $this->assertFalse($this->instance->has($job, $argument)); + $this->instance->add($job, $argument); + + $this->assertTrue($this->instance->has($job, $argument)); + } + + public function testAddRejectsArgumentAboveMaxLength(): void { + $argument = str_repeat('a', $this->instance::MAX_ARGUMENT_JSON_LENGTH + 100); + + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('Background job arguments can\'t exceed ' . $this->instance::MAX_ARGUMENT_JSON_LENGTH . ' characters (json encoded)'); + + $this->instance->add(new TestJob(), $argument); + } + #[DataProvider('argumentProvider')] public function testRemoveDifferentArgument(mixed $argument): void { $existingJobs = $this->getAllSorted(); diff --git a/version.php b/version.php index e9b4ce3677dc8..702b8a91a794e 100644 --- a/version.php +++ b/version.php @@ -11,7 +11,7 @@ // between betas, final and RCs. This is _not_ the public version number. Reset minor/patch level // when updating major/minor version number. -$OC_Version = [34, 0, 0, 0]; +$OC_Version = [34, 0, 0, 1]; // The human-readable string $OC_VersionString = '34.0.0 dev';