Skip to content

Performance: AJV schema compiled on every validation call (api.js)#5461

Open
barttran2k wants to merge 2 commits intoNginxProxyManager:developfrom
barttran2k:contribai/perf/ajv-schema-compiled-on-every-validation-
Open

Performance: AJV schema compiled on every validation call (api.js)#5461
barttran2k wants to merge 2 commits intoNginxProxyManager:developfrom
barttran2k:contribai/perf/ajv-schema-compiled-on-every-validation-

Conversation

@barttran2k
Copy link
Copy Markdown

Problem

In backend/lib/validator/api.js, ajv.compile(schema) is called inside apiValidator on every single request. AJV schema compilation is computationally expensive and should be done once per schema, then the compiled validate function should be reused. Under load, this causes significant CPU overhead on every API request that involves validation.

Severity: high
File: backend/lib/validator/api.js

Solution

Cache compiled validators using a Map keyed by schema (or schema $id). For example: const cache = new Map(); function getValidator(schema) { let v = cache.get(schema); if (!v) { v = ajv.compile(schema); cache.set(schema, v); } return v; } Then call getValidator(schema) instead of ajv.compile(schema) on each invocation.

Changes

  • backend/lib/validator/api.js (modified)
  • backend/lib/validator/index.js (modified)

Testing

  • Existing tests pass
  • Manual review completed
  • No new warnings/errors introduced

In `backend/lib/validator/api.js`, `ajv.compile(schema)` is called inside `apiValidator` on every single request. AJV schema compilation is computationally expensive and should be done once per schema, then the compiled validate function should be reused. Under load, this causes significant CPU overhead on every API request that involves validation.

Affected files: api.js, index.js

Signed-off-by: Trần Bách <45133811+barttran2k@users.noreply.github.com>
In `backend/lib/validator/api.js`, `ajv.compile(schema)` is called inside `apiValidator` on every single request. AJV schema compilation is computationally expensive and should be done once per schema, then the compiled validate function should be reused. Under load, this causes significant CPU overhead on every API request that involves validation.

Affected files: api.js, index.js

Signed-off-by: Trần Bách <45133811+barttran2k@users.noreply.github.com>
@nginxproxymanagerci
Copy link
Copy Markdown

Docker Image for build 1 is available on DockerHub:

nginxproxymanager/nginx-proxy-manager-dev:pr-5461

Note

Ensure you backup your NPM instance before testing this image! Especially if there are database changes.
This is a different docker image namespace than the official image.

Warning

Changes and additions to DNS Providers require verification by at least 2 members of the community!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant