Performance: AJV schema compiled on every validation call (api.js)#5461
Conversation
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>
|
Docker Image for build 1 is available on DockerHub: Note Ensure you backup your NPM instance before testing this image! Especially if there are database changes. Warning Changes and additions to DNS Providers require verification by at least 2 members of the community! |
Code ReviewThanks for the contribution! The intent here is valid — avoiding repeated AJV schema compilation is a real concern — but the two files need to be assessed separately.
|
Problem
In
backend/lib/validator/api.js,ajv.compile(schema)is called insideapiValidatoron 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:
highFile:
backend/lib/validator/api.jsSolution
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 callgetValidator(schema)instead ofajv.compile(schema)on each invocation.Changes
backend/lib/validator/api.js(modified)backend/lib/validator/index.js(modified)Testing