fix: Adds concurrency protections to field/interface caches #175
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.
This fixes spurious memory reference issues that were somewhat common on x86 Linux machines by adding a read-write lock around the
GraphQLObjectType&GraphQLInterfaceTypefieldsandinterfacescaches. The cache was introduced in #171, and resulted in a 22% reduction in benchmarkedgraphqltime.The original implementation appeared safe because the set values were guaranteed to have the same result. However, without read/write locks they can cause spurious memory reference issues, since we enumerate the results after creation and when overwriting I guess the reference counts can cause the object to be deinitialized in the middle of the enumeration.
This change increases benchmark time by about 4.5%.
Before:
After: