diff --git a/core/Migrations/Version34000Date20260318095645.php b/core/Migrations/Version34000Date20260318095645.php new file mode 100644 index 00000000000..8be6dfc9122 --- /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/private/BackgroundJob/JobList.php b/lib/private/BackgroundJob/JobList.php index c00a51e3851..0cd951c0abf 100644 --- a/lib/private/BackgroundJob/JobList.php +++ b/lib/private/BackgroundJob/JobList.php @@ -24,6 +24,8 @@ use function min; use function strlen; class JobList implements IJobList { + public const MAX_ARGUMENT_JSON_LENGTH = 32000; + /** @var array */ protected array $alreadyVisitedParallelBlocked = []; @@ -43,8 +45,8 @@ class JobList implements IJobList { $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 6f946187c52..a7fb0c7c787 100644 --- a/tests/lib/BackgroundJob/JobListTest.php +++ b/tests/lib/BackgroundJob/JobListTest.php @@ -111,6 +111,24 @@ class JobListTest extends TestCase { $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); + } + /** * @param $argument */ diff --git a/version.php b/version.php index d4ccca163f7..84b7d3aea71 100644 --- a/version.php +++ b/version.php @@ -9,7 +9,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 = [32, 0, 6, 1]; +$OC_Version = [32, 0, 6, 2]; // The human-readable string $OC_VersionString = '32.0.6';