Skip to content

perf(model): serve integration plan from the request scope - #3461

Merged
bpamiri merged 1 commit into
developfrom
fix/model-integration-request-cache-3213
Aug 31, 2026
Merged

bpamiri merged 1 commit into
developfrom
fix/model-integration-request-cache-3213

Conversation

@bpamiri

@bpamiri bpamiri commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

Part of #3213.

The cached component-integration plan (#3236) was re-read from the application scope on every model/controller/mapper materialization — roughly six synchronized application-scope lookups per instance. The plan is stable within a request (the only invalidation is the #3457 rebuild-on-poison validation, which replaces both copies), so after its first use per request it is now served from a request-scope struct.

Measured on the #3213 benchmark rig (Lucee 7, 2,000 model().new(), instrumented):

  • plan lookup: 123 ms → 2 ms
  • total instantiation: ~1058 ms → ~830 ms (~20%)

Full breakdown of the remaining per-object cost is in the #3213 thread; the copy loop (~45%) and instance setup (~40%) are the next targets.

IntegrationPlanSpec now also pins the request-cache behavior (second call returns the same plan array without touching the application scope) and the rebuild test clears the request cache so it still exercises the poisoned application-scope path.

Verification

  • Local Lucee 7: global 243 pass, model 991 pass, 0 fail.
  • Local RustCFML full suite: no new failures vs baseline.
  • Full local Lucee suite + CI to follow.

The cached component-integration plan (#3236) was re-read from the
application scope on every model/controller/mapper materialization —
roughly six synchronized application-scope lookups per instance. The plan
is stable within a request (the only invalidation is the rebuild-on-poison
validation, which replaces both copies), so after its first use it is now
served from a request-scope struct.

Measured on the #3213 benchmark rig (Lucee 7, 2,000 model().new()):
plan lookup 123ms -> 2ms, ~12-15% off total instantiation time.

IntegrationPlanSpec now also pins the request-cache behavior (second call
returns the same plan array) and the rebuild test clears the request cache
so it still exercises the poisoned application-scope path.

Signed-off-by: Peter Amiri <peter@alurium.com>
@bpamiri
bpamiri merged commit 6cfe50b into develop Aug 31, 2026
12 checks passed
@bpamiri
bpamiri deleted the fix/model-integration-request-cache-3213 branch August 31, 2026 13:19
bpamiri added a commit that referenced this pull request Oct 1, 2026
…grades and install (#3932)

* docs(guides): correct stale 4.1 statements on error email, reload, upgrades and install

- production-config: errorEmailAddress defaults to "" since 4.1.2 (GHSA-8gcv-3v9h-7gj2);
  with no recipient no error email is sent and a one-time warning goes to wheels.log
- environments-and-configuration: an empty reloadPassword fails closed since 4.0.4
  (#3062); #3059 is fixed, not open
- performance-notes: describe the released fixes (4.0.6 #3236, 4.1.0 #3461/#3462/#3464,
  4.1.1 #3656) instead of pointing at bleeding-edge
- manual-installation: use the 4.1.2 release asset names and tag
- upgrade: document the 4.1.0 app template drift advisory (#3379)
- 3x-to-4x: the wheels.Testbox upgrade-check rule shipped in 4.0.4
- manual-upgrades: caution that the 4.1.1 .env boolean fix (#3641) must be applied by
  hand to the app-owned public/Application.cfc

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Peter Amiri <peter@alurium.com>

* docs(guides): give the full error-email sender fallback order

errorEmailFromAddress, then errorEmailAddress, then the recipient (EventMethods.cfc). Review nit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Peter Amiri <peter@alurium.com>

---------

Signed-off-by: Peter Amiri <peter@alurium.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant