Merge pull request #59029 from nextcloud/fix/58913/bg-job-argument-type-text

This commit is contained in:
Kate 2026-03-19 11:01:57 +01:00 committed by GitHub
commit 95f22bc48d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 66 additions and 3 deletions

View file

@ -0,0 +1,41 @@
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OC\Core\Migrations;
use Closure;
use Doctrine\DBAL\Types\Type;
use OCP\DB\ISchemaWrapper;
use OCP\DB\Types;
use OCP\Migration\Attributes\ColumnType;
use OCP\Migration\Attributes\ModifyColumn;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;
use Override;
#[ModifyColumn(table: 'jobs', name: 'argument', type: ColumnType::TEXT, description: 'Migrate background job arguments to a text column')]
class Version34000Date20260318095645 extends SimpleMigrationStep {
#[Override]
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();
if ($schema->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;
}
}

View file

@ -1594,6 +1594,7 @@ return array(
'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',

View file

@ -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',

View file

@ -28,6 +28,8 @@ use function min;
use function strlen;
class JobList implements IJobList {
public const MAX_ARGUMENT_JSON_LENGTH = 32000;
/** @var array<string, string> */
protected array $alreadyVisitedParallelBlocked = [];
@ -49,8 +51,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();

View file

@ -99,6 +99,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);
}
#[DataProvider('argumentProvider')]
public function testRemoveDifferentArgument(mixed $argument): void {
$existingJobs = $this->getAllSorted();

View file

@ -11,7 +11,7 @@ declare(strict_types=1);
// 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';