feat:(ast) Node
support concurrently-read
#661
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.
Background
Since sonic uses
Lazy-Load
design to parse JSON nodes on demands, it doesn't supportconcurrently-Read
by default. But in practice, we found many users may use it in such scenarios and cause panic.Desgin
Thus we design one kind of
State Transition Lock
to achieve the goal by least cost. In brief:Lazy
state (parse transversely on demands). Every node has only two state:Parsed
(bool, number, or object slice...) orRaw
(JSON), and the only transit direction isRaw->Parsed
;Get()
) will check its state usingAtomic Load
:Write Lock
Raw()
andMarshalJSON()
). In these circumstances, we need keep the Raw state to achieve the best performance. Thus useRead Lock
to keep the state.Performance
Get
, about 5~10%. Thus we not enable it by default, except user manually setSearchOption.ConcurrentRead=true
or create JSON node byNewNodeSafeRead()
or callNode.LoadAll()/Load()