Atree v0.8.0 introduces payload inlining and metadata deduplication to improve memory use, storage size, and speed of various servers that use payloads (not limited to EN). This improves network stability and performance as we handle future data growth.
Inlining and deduplication reduces payload count and mtrie nodes. This reduces size and growth rate of execution state.
- Inlining stores small arrays and maps (previously stored in their own payload) into an existing payload.
- Deduplication removes redundant metadata (e.g. Cadence struct field names and type information) to reduce payload size.
This release passed multiple types of tests, including 1034 hours of smoke tests that concluded on August 19, 2024.
Results exceeded goals mentioned in Scaling Execution Node (forum announcement).
Note
Sept. 4, 2024: 🏆 Atree inlined 500 million payloads (-61%) and eliminated over 1 billion mtrie nodes on mainnet!
Impact of these payload and mtrie node reductions include:
- Reduced RAM use by hundreds of GB on each mainnet execution node.
- Reduced SSD storage use (e.g. checkpoint file sizes).
- Reduced network bandwidth for chunk data packs (mentioned by Peter).
- Speedup transactions by 5-8% (mentioned by Jan).
- Speedup network upgrades (e.g. Cadence 1.0 migrations, future migrations).
- Future efficiency of other servers, components, databases (files/cache/index), etc. that benefit from fewer payloads.
Sept. 30, 2024: 🏆 Beyond execution nodes, bluesign shared a 5x speedup in tinyAN bootstrap time!
"btw amazing work this atree inlining, my tinyAN bootstrap time improved like 5x"
Future: We can replace nonatree domain payloads with atree payloads to reduce mainnet payload count by another 20-30%.
While devnet (shown below) had better percentage improvements, mainnet eliminated more mtrie nodes (over 1 billion)!
Memory Reduction Before/After Atree Inlining & Deduplication (Devnet Aug 14, 2024)
Mtrie Nodes and Atree Payloads (Aug 14, 2024 Devnet) | Atree Payload Sizes (bytes) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Total Counts
Total Sizes
|
|
What's Changed (since v0.6.0)
- Change
OrderedMap.Get()
to returnValue
instead ofStorable
by @fxamacker in #318 - Change
Array.Get()
to returnValue
instead ofStorable
by @fxamacker in #316 - Optimize max map value size to reduce number of registers by @fxamacker in #314
- Refactor to remove lint warnings by @fxamacker in #319
- Add
Array.ID()
andOrderedMap.ID()
by @fxamacker in #321 - Rename ID to ValueID by @fxamacker in #325
- Refactor creating new StorableSlab by @fxamacker in #324
- Unexport
SlabID
fields to prevent misuse by @fxamacker in #323 - Rename StorageID related types, vars, and funcs by @fxamacker in #322
- Add support for iterating only loaded values by @fxamacker in #311
- Refactor
hasPointer
for register inlining by @fxamacker in #327 - Reduce size of encoded array slab and bump version by @fxamacker in #330
- Add ignore filters to dependabot.yml by @fxamacker in #302
- Reduce encoded size of map and bump version by @fxamacker in #331
- Update README.md to describe Atree by @fxamacker in #332
- Update responsible disclosure link by @jribbink in #333
- Fix slab size when resetting mutable storable in OrderedMap by @fxamacker in #337
- Omit empty next slab ID in encoded map data slab by @fxamacker in #340
- Omit empty next slab ID in encoded array data slab by @fxamacker in #339
- Fix slab size when resetting mutable storable in Array by @fxamacker in #336
- Refactor encoding version and flag to add more flags by @fxamacker in #338
- Add readonly iterators and support value mutations only from non-readonly iterators by @fxamacker in #345
- Atree Register Inlining and Data Deduplication by @fxamacker in #342
- Update smoke test for atree inlining by @fxamacker in #348
- Update for Cadence integration for atree inlining and deduplication by @fxamacker in #352
- Make smoke tests check recently added data deduplication feature by @fxamacker in #350
- Remove ContainerStorable.EncodeAsElement by @fxamacker in #354
- Add feature to support mutation for array and map iterators by @fxamacker in #359
- Add support for changing type info of atree arrays (atree inlining branch) by @fxamacker in #376
- Add support for changing type info of atree maps (atree inlining branch) by @fxamacker in #377
- Reduce RAM and persistent storage by deduplicating inlined dict type info by @fxamacker in #369
- Use encoded type info to deduplicate extra data by @fxamacker in #381
- Fix error type for external errors during serialization by @fxamacker in #382
- Add PersistentSlabStorage.GetAllChildReferences() for atree inlining by @fxamacker in #392
- Add feature to enable atree inlining migration to fix references to non-existent registers by @fxamacker in #388
- Fix migration filter for old unreferenced slabs (atree inlining feature branch) by @fxamacker in #396
- Add NonderterministicFastCommit to speed up migrations when ordering isn't required by @fxamacker in #403
- Add BatchPreload to decode slabs in parallel and cache by @fxamacker in #404
- Check mutation of elements from readonly map iterator by @fxamacker in #410
- Check mutation of elements from readonly array iterator by @fxamacker in #411
- Update comment for NondeterministicFastCommit by @fxamacker in #412
- Update copyright notice to Flow Foundation by @fxamacker in #415
- Update copyright notice to Flow Foundation (in main branch) by @fxamacker in #417
- Update feature/array-map-inlining (atree inlining feature branch) by @fxamacker in #428
- Merge
feature/array-map-inlining
(atree inlining feature branch) tomain
by @fxamacker in #429 - Add functions to check availablility of CBOR tag numbers by @fxamacker in #434
- Add SlabID.Address() by @fxamacker in #435
- Make smoke tests check if CBOR tag nums are reserved by @fxamacker in #436
Changes to CI and version bumps...
- Bump github.com/stretchr/testify from 1.8.1 to 1.8.2 by @dependabot in #289
- Bump actions/setup-go from 3 to 4 by @dependabot in #298
- Bump codecov/codecov-action from 3.1.1 to 3.1.3 by @dependabot in #300
- Bump codecov/codecov-action from 3.1.3 to 3.1.4 by @dependabot in #305
- Bump lukechampine.com/blake3 from 1.1.7 to 1.2.1 by @dependabot in #308
- Bump github.com/stretchr/testify from 1.8.2 to 1.8.4 by @dependabot in #309
- Bump safer-golangci-lint to 1.52.2 by @fxamacker in #304
- Bump codecov/codecov-action from 3.1.4 to 4.0.2 by @dependabot in #368
- Bump github.com/stretchr/testify from 1.8.4 to 1.9.0 by @dependabot in #371
- Pin CodeQL workflow dependencies by @fxamacker in #363
- Pin dependencies in coverage.yml by @fxamacker in #366
- Pin dependencies in ci.yml by @fxamacker in #367
- Bump github/codeql-action from 3.24.6 to 3.24.8 by @dependabot in #378
- Bump github/codeql-action from 3.24.8 to 3.24.9 by @dependabot in #379
- Bump github/codeql-action from 3.24.9 to 3.24.10 by @dependabot in #384
- Bump codecov/codecov-action from 4.0.1 to 4.2.0 by @dependabot in #385
- Bump lukechampine.com/blake3 from 1.2.1 to 1.2.2 by @dependabot in #383
- Bump github/codeql-action from 3.24.10 to 3.25.0 by @dependabot in #389
- Bump github/codeql-action from 3.25.0 to 3.25.1 by @dependabot in #393
- Bump codecov/codecov-action from 4.2.0 to 4.3.0 by @dependabot in #390
- Bump github/codeql-action from 3.25.1 to 3.25.3 by @dependabot in #400
- Bump codecov/codecov-action from 4.3.0 to 4.3.1 by @dependabot in #401
- Bump github/codeql-action from 3.25.3 to 3.25.5 by @dependabot in #405
- Bump codecov/codecov-action from 4.3.1 to 4.4.1 by @dependabot in #408
- Bump github/codeql-action from 3.25.5 to 3.25.6 by @dependabot in #413
- Bump lukechampine.com/blake3 from 1.2.2 to 1.3.0 by @dependabot in #402
- Bump github/codeql-action from 3.25.6 to 3.25.7 by @dependabot in #414
- Bump github/codeql-action from 3.25.7 to 3.25.8 by @dependabot in #418
- Bump github/codeql-action from 3.25.8 to 3.25.10 by @dependabot in #420
- Bump codecov/codecov-action from 4.4.1 to 4.5.0 by @dependabot in #419
- Bump github/codeql-action from 3.25.10 to 3.25.11 by @dependabot in #423
- Bump golangci-lint to 1.56.2 by @fxamacker in #422
- Bump github/codeql-action from 3.25.11 to 3.25.12 by @dependabot in #424
- Bump actions/checkout from 4.1.1 to 4.1.7 by @dependabot in #425
- Bump github/codeql-action from 3.25.12 to 3.25.13 by @dependabot in #426
- Bump actions/setup-go from 4.1.0 to 5.0.2 by @dependabot in #427
- Bump github/codeql-action from 3.25.13 to 3.25.15 by @dependabot in #430
- Bump github/codeql-action from 3.25.15 to 3.26.0 by @dependabot in #432
- Bump github/codeql-action from 3.26.0 to 3.26.2 by @dependabot in #438
- Bump github/codeql-action from 3.26.2 to 3.26.5 by @dependabot in #439
- Add go1.22 to ci.yml by @fxamacker in #433
- Bump github/codeql-action from 3.26.5 to 3.26.6 by @dependabot in #440
Special thanks (alphabetically):
- Bastian for feature requests, approving proposed designs, numerous PR reviews, and feedback! 🙌
- Dete for suggestion to deduplicate data when encoding (in 2021)! 🙏
- Ramtin for suggestion to inline atree registers, approving the proposed designs, and feedback! 💪
New Contributors
Full Changelog: v0.6.0...v0.8.0