diff --git a/src/Worker/WorkerOptions.php b/src/Worker/WorkerOptions.php index e6ad1b63f..e2ebd969c 100644 --- a/src/Worker/WorkerOptions.php +++ b/src/Worker/WorkerOptions.php @@ -293,6 +293,9 @@ class WorkerOptions #[Marshal(name: 'MaxEagerActivityReservationsPerWorkflowTask')] public ?int $maxEagerActivityReservationsPerWorkflowTask = null; + #[Marshal(name: 'DisablePayloadErrorLimit')] + public bool $disablePayloadErrorLimit = false; + /** * Optional: Disable allowing workflow and activity functions that are * registered with custom names from being able to be called with their @@ -829,6 +832,13 @@ public function withMaxEagerActivityReservationsPerWorkflowTask(int $value): sel return $self; } + public function withDisablePayloadErrorLimit(bool $disable = true): self + { + $self = clone $this; + $self->disablePayloadErrorLimit = $disable; + return $self; + } + /** * Optional: Disable allowing workflow and activity functions that are * registered with custom names from being able to be called with their diff --git a/tests/Acceptance/App/TaskQueueResolver.php b/tests/Acceptance/App/TaskQueueResolver.php index 399ab18fc..b0d6b5890 100644 --- a/tests/Acceptance/App/TaskQueueResolver.php +++ b/tests/Acceptance/App/TaskQueueResolver.php @@ -23,6 +23,7 @@ final class TaskQueueResolver \Temporal\Tests\Acceptance\Extra\Versioning\Classic\ClassicTest::class, \Temporal\Tests\Acceptance\Extra\Versioning\Deployment\DeploymentTest::class, \Temporal\Tests\Acceptance\Extra\Activity\ActivityPaused\ActivityPausedTest::class, + \Temporal\Tests\Acceptance\Extra\Workflow\PayloadErrorLimitDisabled\PayloadErrorLimitDisabledTest::class, ]; /** diff --git a/tests/Acceptance/Extra/Workflow/PayloadErrorLimitDisabledTest.php b/tests/Acceptance/Extra/Workflow/PayloadErrorLimitDisabledTest.php new file mode 100644 index 000000000..20bbb8a0e --- /dev/null +++ b/tests/Acceptance/Extra/Workflow/PayloadErrorLimitDisabledTest.php @@ -0,0 +1,61 @@ +getResult(timeout: 10); + self::fail('The Workflow must not complete'); + } catch (WorkflowFailedException) { + } + + self::assertSame(WorkflowExecutionStatus::Terminated, $stub->describe()->info->status); + foreach ($client->getWorkflowHistory($stub->getExecution()) as $event) { + self::assertNotSame( + WorkflowTaskFailedCause::WORKFLOW_TASK_FAILED_CAUSE_PAYLOADS_TOO_LARGE, + $event->getWorkflowTaskFailedEventAttributes()?->getCause(), + ); + } + } +} + +class WorkerFactory +{ + public static function options(): WorkerOptions + { + return WorkerOptions::new()->withDisablePayloadErrorLimit(); + } +} + +#[WorkflowInterface] +class TestWorkflow +{ + #[WorkflowMethod(name: 'Extra_Workflow_PayloadErrorLimitDisabled')] + public function handle(): string + { + return \str_repeat('a', 3 * 1024 * 1024); + } +} diff --git a/tests/Acceptance/Extra/Workflow/PayloadErrorLimitTest.php b/tests/Acceptance/Extra/Workflow/PayloadErrorLimitTest.php new file mode 100644 index 000000000..63d23587d --- /dev/null +++ b/tests/Acceptance/Extra/Workflow/PayloadErrorLimitTest.php @@ -0,0 +1,59 @@ +describe()->info->status); + $stub->terminate('test finished'); + } + + private static function waitForWorkflowTaskFailureCause( + WorkflowClientInterface $client, + WorkflowStubInterface $stub, + ): int { + $deadline = \microtime(true) + 10; + do { + foreach ($client->getWorkflowHistory($stub->getExecution()) as $event) { + $failed = $event->getWorkflowTaskFailedEventAttributes(); + if ($failed !== null) { + return $failed->getCause(); + } + } + \usleep(100_000); + } while (\microtime(true) < $deadline); + + self::fail('The Workflow Task did not fail'); + } +} + +#[WorkflowInterface] +class TestWorkflow +{ + #[WorkflowMethod(name: 'Extra_Workflow_PayloadErrorLimit')] + public function handle(): string + { + return \str_repeat('a', 3 * 1024 * 1024); + } +} diff --git a/tests/Unit/DTO/WorkerOptionsTestCase.php b/tests/Unit/DTO/WorkerOptionsTestCase.php index 2768f72c6..09db12556 100644 --- a/tests/Unit/DTO/WorkerOptionsTestCase.php +++ b/tests/Unit/DTO/WorkerOptionsTestCase.php @@ -52,6 +52,7 @@ public function testMarshalling(): void 'DisableEagerActivities' => false, 'MaxConcurrentEagerActivityExecutionSize' => 0, 'MaxEagerActivityReservationsPerWorkflowTask' => null, + 'DisablePayloadErrorLimit' => false, 'DisableRegistrationAliasing' => false, 'BuildID' => "", 'DeploymentOptions' => null, @@ -362,6 +363,17 @@ public function testMaxEagerActivityReservationsPerWorkflowTaskRejectsNonPositiv (new WorkerOptions())->withMaxEagerActivityReservationsPerWorkflowTask(0); } + public function testDisablePayloadErrorLimit(): void + { + $dto = new WorkerOptions(); + $result = $dto->withDisablePayloadErrorLimit(); + + self::assertNotSame($dto, $result); + self::assertFalse($dto->disablePayloadErrorLimit); + self::assertTrue($result->disablePayloadErrorLimit); + self::assertTrue($this->marshal($result)['DisablePayloadErrorLimit']); + } + public function testDisableRegistrationAliasing(): void { $dto = new WorkerOptions();