From 46afd1b5b0f521dc33858004b24a790e9fb675a7 Mon Sep 17 00:00:00 2001 From: Roly Gutierrez Date: Mon, 3 Aug 2026 17:09:00 -0400 Subject: [PATCH] =?UTF-8?q?FOUR-32502=20[Octane]=20MEDIUM=20=E2=80=94=20Ac?= =?UTF-8?q?cumulating=20State=20"Manifest"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Description: Reset request-scoped Manifest statics ($parents, $logger) in ResetRequestState after each Octane request. Keep $tableColumns as a schema cache. Related tickets: https://processmaker.atlassian.net/browse/FOUR-32502 --- ProcessMaker/ImportExport/Manifest.php | 6 +++++ ProcessMaker/Octane/ResetRequestState.php | 2 ++ tests/Feature/ImportExport/ManifestTest.php | 7 +++++ .../Octane/ResetRequestStateTest.php | 27 +++++++++++++++++++ 4 files changed, 42 insertions(+) diff --git a/ProcessMaker/ImportExport/Manifest.php b/ProcessMaker/ImportExport/Manifest.php index ac5372b777..9f2bce95bb 100644 --- a/ProcessMaker/ImportExport/Manifest.php +++ b/ProcessMaker/ImportExport/Manifest.php @@ -21,6 +21,12 @@ class Manifest private static $logger = null; + public static function resetRequestState(): void + { + self::$parents = null; + self::$logger = null; + } + public function has(string $uuid) { return array_key_exists($uuid, $this->manifest); diff --git a/ProcessMaker/Octane/ResetRequestState.php b/ProcessMaker/Octane/ResetRequestState.php index 8bde301049..5dc89ace40 100644 --- a/ProcessMaker/Octane/ResetRequestState.php +++ b/ProcessMaker/Octane/ResetRequestState.php @@ -4,6 +4,7 @@ namespace ProcessMaker\Octane; +use ProcessMaker\ImportExport\Manifest; use ProcessMaker\Providers\ProcessMakerServiceProvider; use ProcessMaker\Services\RedirectToEventService; @@ -17,6 +18,7 @@ public function __construct( public function handle(): void { ProcessMakerServiceProvider::beginRequestTiming(); + Manifest::resetRequestState(); $this->redirectToEventService->reset(); } } diff --git a/tests/Feature/ImportExport/ManifestTest.php b/tests/Feature/ImportExport/ManifestTest.php index c42ac2da83..66ba4782be 100644 --- a/tests/Feature/ImportExport/ManifestTest.php +++ b/tests/Feature/ImportExport/ManifestTest.php @@ -22,6 +22,13 @@ class ManifestTest extends TestCase { use HelperTrait; + protected function tearDown(): void + { + Manifest::resetRequestState(); + + parent::tearDown(); + } + private function mockExporter($dependents) { return $this->mock(ScreenExporter::class, function ($mock) use ($dependents) { diff --git a/tests/unit/ProcessMaker/Octane/ResetRequestStateTest.php b/tests/unit/ProcessMaker/Octane/ResetRequestStateTest.php index 556f80d1cd..b1ac40d268 100644 --- a/tests/unit/ProcessMaker/Octane/ResetRequestStateTest.php +++ b/tests/unit/ProcessMaker/Octane/ResetRequestStateTest.php @@ -10,6 +10,8 @@ use Illuminate\Support\Facades\Event; use Laravel\Octane\Events\RequestTerminated; use ProcessMaker\Events\RedirectToEvent; +use ProcessMaker\ImportExport\Manifest; +use ProcessMaker\ImportExport\Options; use ProcessMaker\Listeners\HandleRedirectListener; use ProcessMaker\Models\ProcessRequest; use ProcessMaker\Octane\ResetRequestState; @@ -23,6 +25,7 @@ class ResetRequestStateTest extends TestCase protected function tearDown(): void { ProcessMakerServiceProvider::beginRequestTiming(); + Manifest::resetRequestState(); parent::tearDown(); } @@ -34,6 +37,30 @@ private function recordQueryDuration(float $milliseconds): void event(new QueryExecuted('SELECT 1', [], $milliseconds, $connection)); } + public function test_octane_request_termination_resets_manifest_request_state(): void + { + Manifest::buildParentModeMap([ + 'parent-uuid' => [ + 'dependents' => [ + ['uuid' => 'child-uuid'], + ], + ], + ], new Options([ + 'parent-uuid' => ['mode' => 'update'], + ])); + + $this->assertNotNull(Manifest::$parents); + + event(new RequestTerminated( + $this->app, + $this->app, + Request::create('/import-request'), + new Response() + )); + + $this->assertNull(Manifest::$parents); + } + public function test_it_clears_request_timing_before_the_next_request(): void { DB::select('SELECT 1');