Improve performance and reduce memory usage of /openapi/tree #1141
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Overview
This PR changes the way the
/openapi/tree
action returns the response payload to minimize memory usage.Notes
This change takes advantage of the fact that the ASP.NET Response object provides access to a BodyWriter instance that can be passed to the constructor of Urtf8JsonWriter. This enables the server to construct the JSON response and have it written directly to the network stream without having to have the entire document buffered in memory.
A further enhancement could be made to cache the entire UrlNodeTree rather than reconstructing on every request.
One downside to this approach is that if an exception occurs whilst writing the tree, the HTTP response will already have returned a 200 response.
Testing Instructions
Calling
https://localhost:5001/openapi/tree?graphVersions=v1.0
from multiple concurrent threads shows reduced memory usage on the server and shorter time to first byte.