Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Invalidate references to nested resources upon the move of the outer resource #2460

Merged

Conversation

SupunS
Copy link
Member

@SupunS SupunS commented Apr 21, 2023

Closes #2458

Description

When a resource is moved, invalidate references taken not only to the moved resource, but also the references taken to the nested resources of that moved resource.

Also refactored the code to move all the invalidation logic to a single place, which was scattered in the Transfer/Destroy methods of each value type.


  • Targeted PR against master branch
  • Linked to Github issue with discussion and accepted design OR link to spec that describes this work
  • Code follows the standards mentioned here
  • Updated relevant documentation
  • Re-reviewed Files changed in the Github PR explorer
  • Added appropriate labels

@SupunS SupunS added the Bugfix label Apr 21, 2023
@SupunS SupunS self-assigned this Apr 21, 2023
@SupunS SupunS changed the title Invalidate nested resources upon the move of the outer resource Invalidate references to nested resources upon the move of the outer resource Apr 21, 2023
@SupunS SupunS marked this pull request as ready for review April 21, 2023 18:38
@turbolent
Copy link
Member

I'll review this on Monday

Base automatically changed from supun/sync-stable-cadence to feature/stable-cadence April 26, 2023 20:03
@github-actions
Copy link

github-actions bot commented Apr 26, 2023

Cadence Benchstat comparison

This branch with compared with the base branch onflow:feature/stable-cadence commit 07f5125
The command for i in {1..N}; do go test ./... -run=XXX -bench=. -benchmem -shuffle=on; done was used.
Bench tests were run a total of 7 times on each branch.

Collapsed results for better readability

old.txtnew.txt
time/opdelta
CheckContractInterfaceFungibleTokenConformance-2138µs ± 0%140µs ± 0%~(p=1.000 n=1+1)
ContractInterfaceFungibleToken-246.9µs ± 0%47.0µs ± 0%~(p=1.000 n=1+1)
DecodeBatchEventsCCF-2193ms ± 0%201ms ± 0%~(p=1.000 n=1+1)
DecodeBatchEventsJSON-2587ms ± 0%587ms ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowFees.FeesDeducted-25.92µs ± 0%4.20µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowFees.TokensWithdrawn-24.71µs ± 0%3.25µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowIDTableStaking.DelegatorRewardsPaid-25.95µs ± 0%4.32µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowIDTableStaking.EpochTotalRewardsPaid-26.22µs ± 0%4.54µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowIDTableStaking.NewWeeklyPayout-23.76µs ± 0%3.29µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowIDTableStaking.RewardsPaid-24.23µs ± 0%3.91µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowToken.TokensDeposited-23.83µs ± 0%4.01µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowToken.TokensDeposited_with_nil_receiver-23.74µs ± 0%3.85µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowToken.TokensMinted-23.19µs ± 0%3.27µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowToken.TokensWithdrawn-23.91µs ± 0%4.02µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowFees.FeesDeducted-214.7µs ± 0%20.0µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowFees.TokensWithdrawn-28.25µs ± 0%12.21µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowIDTableStaking.DelegatorRewardsPaid-213.1µs ± 0%22.6µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowIDTableStaking.EpochTotalRewardsPaid-218.3µs ± 0%26.0µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowIDTableStaking.NewWeeklyPayout-28.42µs ± 0%11.91µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowIDTableStaking.RewardsPaid-210.9µs ± 0%14.3µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowToken.TokensDeposited-211.8µs ± 0%11.6µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowToken.TokensDeposited_with_nil_receiver-210.5µs ± 0%10.6µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowToken.TokensMinted-28.53µs ± 0%8.44µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowToken.TokensWithdrawn-211.8µs ± 0%12.1µs ± 0%~(p=1.000 n=1+1)
EncodeBatchEventsCCF-288.6ms ± 0%89.5ms ± 0%~(p=1.000 n=1+1)
EncodeBatchEventsJSON-2153ms ± 0%152ms ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowFees.FeesDeducted-21.92µs ± 0%1.92µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowFees.TokensWithdrawn-21.49µs ± 0%1.50µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowIDTableStaking.DelegatorRewardsPaid-21.88µs ± 0%1.88µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowIDTableStaking.EpochTotalRewardsPaid-22.17µs ± 0%2.15µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowIDTableStaking.NewWeeklyPayout-21.55µs ± 0%1.51µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowIDTableStaking.RewardsPaid-21.69µs ± 0%1.71µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowToken.TokensDeposited-21.83µs ± 0%1.84µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowToken.TokensDeposited_with_nil_receiver-21.79µs ± 0%1.81µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowToken.TokensMinted-21.52µs ± 0%1.50µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowToken.TokensWithdrawn-21.87µs ± 0%1.84µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowFees.FeesDeducted-23.76µs ± 0%3.77µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowFees.TokensWithdrawn-21.98µs ± 0%2.00µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowIDTableStaking.DelegatorRewardsPaid-23.26µs ± 0%3.23µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowIDTableStaking.EpochTotalRewardsPaid-24.78µs ± 0%4.75µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowIDTableStaking.NewWeeklyPayout-22.03µs ± 0%2.02µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowIDTableStaking.RewardsPaid-22.72µs ± 0%2.75µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowToken.TokensDeposited-23.15µs ± 0%3.14µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowToken.TokensDeposited_with_nil_receiver-22.44µs ± 0%2.42µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowToken.TokensMinted-22.02µs ± 0%2.04µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowToken.TokensWithdrawn-23.09µs ± 0%3.09µs ± 0%~(p=1.000 n=1+1)
ExportType/composite_type-2415ns ± 0%427ns ± 0%~(p=1.000 n=1+1)
ExportType/simple_type-2103ns ± 0%101ns ± 0%~(p=1.000 n=1+1)
InterpretRecursionFib-22.84ms ± 0%2.86ms ± 0%~(p=1.000 n=1+1)
NewInterpreter/new_interpreter-21.55µs ± 0%1.56µs ± 0%~(p=1.000 n=1+1)
NewInterpreter/new_sub-interpreter-2791ns ± 0%786ns ± 0%~(p=1.000 n=1+1)
ParseArray-29.73ms ± 0%9.69ms ± 0%~(p=1.000 n=1+1)
ParseDeploy/byte_array-215.5ms ± 0%15.0ms ± 0%~(p=1.000 n=1+1)
ParseDeploy/decode_hex-21.53ms ± 0%1.53ms ± 0%~(p=1.000 n=1+1)
ParseFungibleToken/With_memory_metering-2245µs ± 0%245µs ± 0%~(p=1.000 n=1+1)
ParseFungibleToken/Without_memory_metering-2187µs ± 0%190µs ± 0%~(p=1.000 n=1+1)
ParseInfix-28.41µs ± 0%8.35µs ± 0%~(p=1.000 n=1+1)
QualifiedIdentifierCreation/One_level-22.80ns ± 0%2.82ns ± 0%~(p=1.000 n=1+1)
QualifiedIdentifierCreation/Three_levels-2149ns ± 0%151ns ± 0%~(p=1.000 n=1+1)
RuntimeResourceDictionaryValues-26.20ms ± 0%6.29ms ± 0%~(p=1.000 n=1+1)
RuntimeScriptNoop-25.58µs ± 0%5.81µs ± 0%~(p=1.000 n=1+1)
SuperTypeInference/arrays-2425ns ± 0%436ns ± 0%~(p=1.000 n=1+1)
SuperTypeInference/composites-2176ns ± 0%176ns ± 0%~(p=1.000 n=1+1)
SuperTypeInference/integers-2194ns ± 0%195ns ± 0%~(p=1.000 n=1+1)
ValueIsSubtypeOfSemaType-2118ns ± 0%121ns ± 0%~(p=1.000 n=1+1)
 
alloc/opdelta
CheckContractInterfaceFungibleTokenConformance-253.6kB ± 0%53.6kB ± 0%~(all equal)
ContractInterfaceFungibleToken-226.0kB ± 0%26.0kB ± 0%~(all equal)
DecodeBatchEventsCCF-267.3MB ± 0%67.3MB ± 0%~(p=1.000 n=1+1)
DecodeBatchEventsJSON-2246MB ± 0%246MB ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowFees.FeesDeducted-21.41kB ± 0%1.41kB ± 0%~(all equal)
DecodeCCF/FlowFees.TokensWithdrawn-21.22kB ± 0%1.22kB ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.DelegatorRewardsPaid-21.49kB ± 0%1.49kB ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.EpochTotalRewardsPaid-21.50kB ± 0%1.50kB ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.NewWeeklyPayout-21.26kB ± 0%1.26kB ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.RewardsPaid-21.38kB ± 0%1.38kB ± 0%~(all equal)
DecodeCCF/FlowToken.TokensDeposited-21.34kB ± 0%1.34kB ± 0%~(all equal)
DecodeCCF/FlowToken.TokensDeposited_with_nil_receiver-21.33kB ± 0%1.33kB ± 0%~(all equal)
DecodeCCF/FlowToken.TokensMinted-21.22kB ± 0%1.22kB ± 0%~(all equal)
DecodeCCF/FlowToken.TokensWithdrawn-21.35kB ± 0%1.35kB ± 0%~(all equal)
DecodeJSON/FlowFees.FeesDeducted-26.02kB ± 0%6.02kB ± 0%~(all equal)
DecodeJSON/FlowFees.TokensWithdrawn-23.62kB ± 0%3.62kB ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.DelegatorRewardsPaid-25.45kB ± 0%5.45kB ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.EpochTotalRewardsPaid-27.37kB ± 0%7.37kB ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.NewWeeklyPayout-23.66kB ± 0%3.66kB ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.RewardsPaid-24.55kB ± 0%4.55kB ± 0%~(all equal)
DecodeJSON/FlowToken.TokensDeposited-24.91kB ± 0%4.91kB ± 0%~(all equal)
DecodeJSON/FlowToken.TokensDeposited_with_nil_receiver-24.49kB ± 0%4.49kB ± 0%~(all equal)
DecodeJSON/FlowToken.TokensMinted-23.62kB ± 0%3.62kB ± 0%~(all equal)
DecodeJSON/FlowToken.TokensWithdrawn-24.91kB ± 0%4.91kB ± 0%~(all equal)
EncodeBatchEventsCCF-237.1MB ± 0%37.1MB ± 0%~(p=1.000 n=1+1)
EncodeBatchEventsJSON-234.0MB ± 0%34.0MB ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowFees.FeesDeducted-2736B ± 0%736B ± 0%~(all equal)
EncodeCCF/FlowFees.TokensWithdrawn-2688B ± 0%688B ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.DelegatorRewardsPaid-2800B ± 0%800B ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.EpochTotalRewardsPaid-2768B ± 0%768B ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.NewWeeklyPayout-2704B ± 0%704B ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.RewardsPaid-2784B ± 0%784B ± 0%~(all equal)
EncodeCCF/FlowToken.TokensDeposited-2752B ± 0%752B ± 0%~(all equal)
EncodeCCF/FlowToken.TokensDeposited_with_nil_receiver-2736B ± 0%736B ± 0%~(all equal)
EncodeCCF/FlowToken.TokensMinted-2688B ± 0%688B ± 0%~(all equal)
EncodeCCF/FlowToken.TokensWithdrawn-2752B ± 0%752B ± 0%~(all equal)
EncodeJSON/FlowFees.FeesDeducted-2768B ± 0%768B ± 0%~(all equal)
EncodeJSON/FlowFees.TokensWithdrawn-2408B ± 0%408B ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.DelegatorRewardsPaid-2760B ± 0%760B ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.EpochTotalRewardsPaid-2952B ± 0%952B ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.NewWeeklyPayout-2424B ± 0%424B ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.RewardsPaid-2624B ± 0%624B ± 0%~(all equal)
EncodeJSON/FlowToken.TokensDeposited-2680B ± 0%680B ± 0%~(all equal)
EncodeJSON/FlowToken.TokensDeposited_with_nil_receiver-2544B ± 0%544B ± 0%~(all equal)
EncodeJSON/FlowToken.TokensMinted-2416B ± 0%416B ± 0%~(all equal)
EncodeJSON/FlowToken.TokensWithdrawn-2672B ± 0%672B ± 0%~(all equal)
ExportType/composite_type-2136B ± 0%136B ± 0%~(all equal)
ExportType/simple_type-20.00B 0.00B ~(all equal)
InterpretRecursionFib-21.00MB ± 0%1.00MB ± 0%~(all equal)
NewInterpreter/new_interpreter-2976B ± 0%976B ± 0%~(all equal)
NewInterpreter/new_sub-interpreter-2200B ± 0%200B ± 0%~(all equal)
ParseArray-22.74MB ± 0%2.83MB ± 0%~(p=1.000 n=1+1)
ParseDeploy/byte_array-24.09MB ± 0%4.32MB ± 0%~(p=1.000 n=1+1)
ParseDeploy/decode_hex-2214kB ± 0%214kB ± 0%~(p=1.000 n=1+1)
ParseFungibleToken/With_memory_metering-229.7kB ± 0%29.7kB ± 0%~(p=1.000 n=1+1)
ParseFungibleToken/Without_memory_metering-229.7kB ± 0%29.7kB ± 0%~(all equal)
ParseInfix-21.91kB ± 0%1.91kB ± 0%~(p=1.000 n=1+1)
QualifiedIdentifierCreation/One_level-20.00B 0.00B ~(all equal)
QualifiedIdentifierCreation/Three_levels-264.0B ± 0%64.0B ± 0%~(all equal)
RuntimeResourceDictionaryValues-22.29MB ± 0%2.30MB ± 0%~(p=1.000 n=1+1)
RuntimeScriptNoop-23.21kB ± 0%3.26kB ± 0%~(p=1.000 n=1+1)
SuperTypeInference/arrays-296.0B ± 0%96.0B ± 0%~(all equal)
SuperTypeInference/composites-20.00B 0.00B ~(all equal)
SuperTypeInference/integers-20.00B 0.00B ~(all equal)
ValueIsSubtypeOfSemaType-248.0B ± 0%48.0B ± 0%~(all equal)
 
allocs/opdelta
CheckContractInterfaceFungibleTokenConformance-2853 ± 0%853 ± 0%~(all equal)
ContractInterfaceFungibleToken-2393 ± 0%393 ± 0%~(all equal)
DecodeBatchEventsCCF-21.48M ± 0%1.48M ± 0%~(p=1.000 n=1+1)
DecodeBatchEventsJSON-24.70M ± 0%4.70M ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowFees.FeesDeducted-230.0 ± 0%30.0 ± 0%~(all equal)
DecodeCCF/FlowFees.TokensWithdrawn-226.0 ± 0%26.0 ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.DelegatorRewardsPaid-230.0 ± 0%30.0 ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.EpochTotalRewardsPaid-232.0 ± 0%32.0 ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.NewWeeklyPayout-226.0 ± 0%26.0 ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.RewardsPaid-229.0 ± 0%29.0 ± 0%~(all equal)
DecodeCCF/FlowToken.TokensDeposited-231.0 ± 0%31.0 ± 0%~(all equal)
DecodeCCF/FlowToken.TokensDeposited_with_nil_receiver-229.0 ± 0%29.0 ± 0%~(all equal)
DecodeCCF/FlowToken.TokensMinted-226.0 ± 0%26.0 ± 0%~(all equal)
DecodeCCF/FlowToken.TokensWithdrawn-231.0 ± 0%31.0 ± 0%~(all equal)
DecodeJSON/FlowFees.FeesDeducted-2126 ± 0%126 ± 0%~(all equal)
DecodeJSON/FlowFees.TokensWithdrawn-271.0 ± 0%71.0 ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.DelegatorRewardsPaid-2102 ± 0%102 ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.EpochTotalRewardsPaid-2159 ± 0%159 ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.NewWeeklyPayout-270.0 ± 0%70.0 ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.RewardsPaid-287.0 ± 0%87.0 ± 0%~(all equal)
DecodeJSON/FlowToken.TokensDeposited-295.0 ± 0%95.0 ± 0%~(all equal)
DecodeJSON/FlowToken.TokensDeposited_with_nil_receiver-286.0 ± 0%86.0 ± 0%~(all equal)
DecodeJSON/FlowToken.TokensMinted-271.0 ± 0%71.0 ± 0%~(all equal)
DecodeJSON/FlowToken.TokensWithdrawn-295.0 ± 0%95.0 ± 0%~(all equal)
EncodeBatchEventsCCF-2467k ± 0%467k ± 0%~(p=1.000 n=1+1)
EncodeBatchEventsJSON-2757k ± 0%757k ± 0%~(all equal)
EncodeCCF/FlowFees.FeesDeducted-29.00 ± 0%9.00 ± 0%~(all equal)
EncodeCCF/FlowFees.TokensWithdrawn-29.00 ± 0%9.00 ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.DelegatorRewardsPaid-29.00 ± 0%9.00 ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.EpochTotalRewardsPaid-29.00 ± 0%9.00 ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.NewWeeklyPayout-29.00 ± 0%9.00 ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.RewardsPaid-29.00 ± 0%9.00 ± 0%~(all equal)
EncodeCCF/FlowToken.TokensDeposited-210.0 ± 0%10.0 ± 0%~(all equal)
EncodeCCF/FlowToken.TokensDeposited_with_nil_receiver-210.0 ± 0%10.0 ± 0%~(all equal)
EncodeCCF/FlowToken.TokensMinted-29.00 ± 0%9.00 ± 0%~(all equal)
EncodeCCF/FlowToken.TokensWithdrawn-210.0 ± 0%10.0 ± 0%~(all equal)
EncodeJSON/FlowFees.FeesDeducted-217.0 ± 0%17.0 ± 0%~(all equal)
EncodeJSON/FlowFees.TokensWithdrawn-210.0 ± 0%10.0 ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.DelegatorRewardsPaid-214.0 ± 0%14.0 ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.EpochTotalRewardsPaid-223.0 ± 0%23.0 ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.NewWeeklyPayout-210.0 ± 0%10.0 ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.RewardsPaid-213.0 ± 0%13.0 ± 0%~(all equal)
EncodeJSON/FlowToken.TokensDeposited-217.0 ± 0%17.0 ± 0%~(all equal)
EncodeJSON/FlowToken.TokensDeposited_with_nil_receiver-212.0 ± 0%12.0 ± 0%~(all equal)
EncodeJSON/FlowToken.TokensMinted-211.0 ± 0%11.0 ± 0%~(all equal)
EncodeJSON/FlowToken.TokensWithdrawn-216.0 ± 0%16.0 ± 0%~(all equal)
ExportType/composite_type-23.00 ± 0%3.00 ± 0%~(all equal)
ExportType/simple_type-20.00 0.00 ~(all equal)
InterpretRecursionFib-218.9k ± 0%18.9k ± 0%~(all equal)
NewInterpreter/new_interpreter-216.0 ± 0%16.0 ± 0%~(all equal)
NewInterpreter/new_sub-interpreter-24.00 ± 0%4.00 ± 0%~(all equal)
ParseArray-259.6k ± 0%59.6k ± 0%~(p=1.000 n=1+1)
ParseDeploy/byte_array-289.4k ± 0%89.4k ± 0%~(p=1.000 n=1+1)
ParseDeploy/decode_hex-263.0 ± 0%63.0 ± 0%~(all equal)
ParseFungibleToken/With_memory_metering-2778 ± 0%778 ± 0%~(all equal)
ParseFungibleToken/Without_memory_metering-2778 ± 0%778 ± 0%~(all equal)
ParseInfix-248.0 ± 0%48.0 ± 0%~(all equal)
QualifiedIdentifierCreation/One_level-20.00 0.00 ~(all equal)
QualifiedIdentifierCreation/Three_levels-22.00 ± 0%2.00 ± 0%~(all equal)
RuntimeResourceDictionaryValues-237.7k ± 0%37.7k ± 0%~(p=1.000 n=1+1)
RuntimeScriptNoop-251.0 ± 0%52.0 ± 0%~(p=1.000 n=1+1)
SuperTypeInference/arrays-23.00 ± 0%3.00 ± 0%~(all equal)
SuperTypeInference/composites-20.00 0.00 ~(all equal)
SuperTypeInference/integers-20.00 0.00 ~(all equal)
ValueIsSubtypeOfSemaType-21.00 ± 0%1.00 ± 0%~(all equal)
 

@codecov
Copy link

codecov bot commented Apr 26, 2023

Codecov Report

Merging #2460 (e90ddca) into feature/stable-cadence (07f5125) will increase coverage by 0.01%.
The diff coverage is 93.15%.

@@                    Coverage Diff                     @@
##           feature/stable-cadence    #2460      +/-   ##
==========================================================
+ Coverage                   79.39%   79.40%   +0.01%     
==========================================================
  Files                         336      336              
  Lines                       80145    80137       -8     
==========================================================
+ Hits                        63628    63634       +6     
+ Misses                      14215    14207       -8     
+ Partials                     2302     2296       -6     
Flag Coverage Δ
unittests 79.40% <93.15%> (+0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files Changed Coverage Δ
runtime/interpreter/interpreter.go 88.55% <88.88%> (-0.03%) ⬇️
runtime/interpreter/value.go 67.00% <100.00%> (+0.03%) ⬆️
runtime/interpreter/value_function.go 73.25% <100.00%> (-0.31%) ⬇️

@SupunS
Copy link
Member Author

SupunS commented May 2, 2023

@turbolent can you maybe have a look when you got some time? 🙏

Copy link
Member

@turbolent turbolent left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great catch and work @SupunS! Sorry I missed this

Do you think there is maybe a way to implement this without having to traverse the whole object graph? The traversal can get quickly very expensive

@fxamacker
Copy link
Member

The traversal can get quickly very expensive

Yeah, I agree. While traversing whole object graph, additional register reads may be needed if they are not loaded already.

@turbolent
Copy link
Member

onflow/atree#311 is ready now. Next step is to update to atree version which includes feature and using new iteration function

@SupunS SupunS requested a review from turbolent July 24, 2023 22:00
@SupunS
Copy link
Member Author

SupunS commented Jul 24, 2023

Updated to use the new atree APIs: f21739f
Depends on the feature/stable-cadence branch of atree.

Copy link
Member

@turbolent turbolent left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice!

runtime/interpreter/interpreter.go Show resolved Hide resolved
@turbolent
Copy link
Member

@SupunS Could you please add a benchmark that exercises this a bit? The current benchmarks don't, and it would be good to know what kind of performance impact the reference invalidation will have

@SupunS
Copy link
Member Author

SupunS commented Aug 9, 2023

Added a benchmark in e90ddca. The results are as follows:

Master:

BenchmarkRuntimeResourceTracking-8   	1000000000	         0.005154 ns/op	       0 B/op	       0 allocs/op

Stable-Cadence (current):

BenchmarkRuntimeResourceTracking-8   	1000000000	         0.005317 ns/op	       0 B/op	       0 allocs/op

This PR:

BenchmarkRuntimeResourceTracking-8   	1000000000	         0.008469 ns/op	       0 B/op	       0 allocs/op

This test assumes the worst-case: i.e. All elements are loaded onto the memory (of an array of size 1000).
So there is roughly a 59% increase ((0.008469-0.005317)/0.005317*100) for 6 move-operations, for a resource array with 1000 elements.

On a side note, I noticed that when the resource array is loaded from storage, all elements seem to be also 'loaded' every time (so they get iterated every time, during resource tracking). Not sure if it is due to the mocked 'test ledger' we are using for unit tests, or the expected behavior. cc: @fxamacker

@turbolent
Copy link
Member

Thank you for adding that benchmark @SupunS! I think the worst-case decrease is acceptable, if it becomes an issue we can look into optimizing it.

On a side note, I noticed that when the resource array is loaded from storage, all elements seem to be also 'loaded' every time (so they get iterated every time, during resource tracking). Not sure if it is due to the mocked 'test ledger' we are using for unit tests, or the expected behavior.

Hmm, that seems odd. Could you please open a separate issue (bug?) for that? We should look into it, normally this should not happen. It doesn't block this PR.

Copy link
Member

@turbolent turbolent left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great work!

@SupunS SupunS merged commit 341b7b5 into feature/stable-cadence Aug 9, 2023
8 of 11 checks passed
@SupunS SupunS deleted the supun/resource-reference-invalidation branch August 9, 2023 20:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants