Compare commits

..

1151 Commits

Author SHA1 Message Date
Clayton Calabrese 4ccaca399f Merge branch 'fix_missing_node_py_changes' of https://github.com/AntelopeIO/leap into fix_missing_node_py_changes 2023-03-22 18:14:16 -05:00
Clayton Calabrese 09390a4725 return lost changes to Node.py functions 2023-03-22 18:13:24 -05:00
Matt Witherspoon 7c94e3a102 add PACKED_STRUCT on ControlStructureImm to silence warning 2023-03-22 18:12:54 -05:00
Matt Witherspoon f469d2b78a add static_assert()s on required size of IR::OpcodeAndImm<>s 2023-03-22 18:12:54 -05:00
Matt Witherspoon a9c5cd9f95 fix comparison of different signedness warning in log_index 2023-03-22 18:12:54 -05:00
Lin Huang 41f5a148bb correct version after merging from 4.0.0-rc1 2023-03-22 18:12:54 -05:00
Zach Butler 1f0f5280d5 Restore markdown formatting erroneously deleted in commit 06c9e25327 2023-03-22 18:12:54 -05:00
Zach Butler 6b54dac75f Cardinal objects should be in a numbered list 2023-03-22 18:12:54 -05:00
Zach Butler df4a974b8a Pull note about sudo into its own quote block 2023-03-22 18:12:54 -05:00
Zach Butler c9596cd699 Minor pinned build script README changes 2023-03-22 18:12:54 -05:00
Clayton Calabrese 6c8441bc6c return lost changes to Node.py functions 2023-03-22 17:15:59 -05:00
Matt Witherspoon 1985e28a63 Merge pull request #866 from AntelopeIO/ignored_pack_warn_fix
fix noisy `ignoring packed attribute` warning on `IR::ControlStructureImm`
2023-03-22 11:06:46 -07:00
Vlad 2829420ecb Merge pull request #856 from AntelopeIO/increase-snapshot-test-robustness
[4.0] Increase robustness of snapshot diff python test
2023-03-22 11:51:46 -04:00
Matt Witherspoon 95c22b6e70 add PACKED_STRUCT on ControlStructureImm to silence warning 2023-03-22 10:57:40 -04:00
Matt Witherspoon f8ca18d5f5 add static_assert()s on required size of IR::OpcodeAndImm<>s 2023-03-22 10:55:29 -04:00
Matt Witherspoon bef672aae2 Merge pull request #860 from AntelopeIO/log_index_un_signed_warn
fix comparison of different signedness warning in log_index
2023-03-22 07:30:28 -07:00
Kevin Heifner 87c7480656 Merge pull request #852 from AntelopeIO/GH-850-test-fix
[4.0] Test Fix: Pass a large time limit to get table call
2023-03-22 09:25:02 -05:00
Matt Witherspoon c2366d392b fix comparison of different signedness warning in log_index 2023-03-21 20:17:49 -04:00
766C6164 cb64c3fb38 schedule snapshot at exact block num of another one 2023-03-21 15:43:31 -04:00
Lin Huang c7d0f6c1c2 Merge pull request #855 from AntelopeIO/merge_4_0_0_rc_1
[4.0 -> main] Merge 4.0.0-rc1 version bump to main
2023-03-21 15:31:31 -04:00
Lin Huang 3beffd5765 correct version after merging from 4.0.0-rc1 2023-03-21 14:46:34 -04:00
Lin Huang 1e3f12dc60 Merge remote-tracking branch 'origin/release/4.0' into merge_4_0_0_rc_1 2023-03-21 14:43:12 -04:00
Lin Huang 61cb264885 Merge pull request #851 from AntelopeIO/create_release_4_0_rc_1
Create v4.0.0-rc1 on release/4.0 branch
2023-03-21 14:34:46 -04:00
Kevin Heifner 446a04a607 GH-850 Pass a large time limit so python does not have to handle more=true case. 2023-03-21 13:09:26 -05:00
Zach f3aab2cfa5 Merge pull request #849 from AntelopeIO/zach-readme
Fix README.md Formatting
2023-03-21 14:08:04 -04:00
Lin Huang 28ac7906dc Create v4.0.0-rc1 on release/4.0 branch 2023-03-21 14:03:42 -04:00
Lin Huang 5d4a7ee60e Merge pull request #848 from AntelopeIO/bump_to_4_1
Bump Leap Main branch version to 4.1.0-dev
2023-03-21 13:35:49 -04:00
Zach Butler 8fc769efd1 Restore markdown formatting erroneously deleted in commit 06c9e25327 2023-03-21 13:19:33 -04:00
Zach Butler 7f27916d3d Cardinal objects should be in a numbered list 2023-03-21 13:19:19 -04:00
Zach Butler df3685516e Pull note about sudo into its own quote block 2023-03-21 13:17:58 -04:00
Zach Butler 866dfae99c Minor pinned build script README changes 2023-03-21 13:12:34 -04:00
Lin Huang 4ef610fa33 Bump Leap Main branch version to 4.1.0-dev 2023-03-21 13:00:08 -04:00
Zach 17ca88c8ad Merge pull request #847 from AntelopeIO/zach-libcurl4-openssl-dev
Restore libcurl4-openssl-dev
2023-03-20 22:26:45 -04:00
Zach Butler 60e757d677 export TZ 2023-03-20 18:36:55 -04:00
Zach Butler cc6c3255a7 SC2034 - warning: DEBIAN_FRONTEND appears unused. Verify use (or export if used externally). 2023-03-20 18:01:01 -04:00
Zach Butler 958f6d53b6 tzdata does not need to be separate 2023-03-20 18:00:26 -04:00
Zach Butler e0dac2c6ed Restore libcurl4-openssl-dev 2023-03-20 17:51:58 -04:00
Zach Butler 5027a17a3b Sort packages, each one on its own line 2023-03-20 17:48:57 -04:00
Zach Butler 9398564118 Quote strings 2023-03-20 17:48:49 -04:00
Zach Butler d42262bfeb "apt-get install -y" 2023-03-20 17:48:31 -04:00
Zach Butler 3ba58b20b7 Whitespace 2023-03-20 17:48:23 -04:00
Zach 35b56406cc Merge pull request #835 from AntelopeIO/zach-ascii-art
Change ASCII Art Banner in Build Script
2023-03-20 13:41:26 -04:00
Zach 069245d4f3 Merge pull request #812 from AntelopeIO/zach-lint
Pinned Build Script Linter Changes
2023-03-20 13:39:33 -04:00
Zach 0f84d4e534 Merge pull request #833 from AntelopeIO/zach-revert-799
Fix Pinned Build on Ubuntu 22.04
2023-03-20 10:01:05 -04:00
Lin Huang ace9c40d56 Merge pull request #845 from AntelopeIO/fix_pr_192_bad_merge
Fix test coverage regression by a bad merge conflict in PR #192
2023-03-17 19:31:54 -04:00
Lin Huang 3c53734d2f add missing 2023-03-17 18:59:30 -04:00
Lin Huang 255617660d Fix test coverage regression by a bad merge conflict in PR #192 2023-03-17 18:29:20 -04:00
Vlad e3807c2b5f Merge pull request #842 from AntelopeIO/snapshot-diff-test-fix
snapshot-diff-test fix
2023-03-17 14:35:44 -04:00
766C6164 5324a5da79 sync scheduled snapshot with 2 others 2023-03-17 13:56:06 -04:00
ClaytonCalabrese 264737b4ef Merge pull request #791 from AntelopeIO/performance_harness_distributed_producer_ports
[PH] Distribute Transaction Generators Across Producer Nodes.
2023-03-17 12:28:19 -05:00
766C6164 b4fe3c654f test fix 2023-03-17 12:49:47 -04:00
Clayton Calabrese be75e8aa3a merge from main 2023-03-17 11:26:55 -05:00
Peter Oschwald 77dfd0c2bf Merge pull request #818 from AntelopeIO/dev-install-add-testharness
Add TestHarness python integration scripts to dev package
2023-03-17 11:07:03 -05:00
Peter Oschwald b1225959e4 Merge pull request #798 from AntelopeIO/GH-789-remove-private-key
Remove deprecated `--private-key` option from nodeos
2023-03-17 11:06:04 -05:00
jgiszczak 0c6892fe65 Merge pull request #192 from AntelopeIO/eosio-launcher-python-port
Port eosio-launcher to Python
2023-03-17 11:04:16 -05:00
Kevin Heifner 6491c667a3 Merge pull request #836 from AntelopeIO/fix-snapshot-schedule
Snapshot: fix issue with erasing element while iterating
2023-03-17 10:36:31 -05:00
Peter Oschwald d6e6a93150 Fix CORE_SYMBOL import and cleanup other imports. 2023-03-17 10:17:40 -05:00
Peter Oschwald 3e9d098e4b Merge branch 'eosio-launcher-python-port' into dev-install-add-testharness 2023-03-17 10:00:04 -05:00
Kevin Heifner 48f2396904 Fix issue with erasing element while iterating 2023-03-17 09:03:30 -05:00
Kevin Heifner fc08e7d99c Fix issue with erasing element while iterating 2023-03-17 08:58:48 -05:00
Zach Butler 383fb714d4 Appreciate our users and make them feel like they are part of a community 2023-03-17 02:09:45 -04:00
Zach Butler 01b4454090 Cooler Leap ASCII art banner at end of pinned build script 2023-03-17 02:09:38 -04:00
Zach Butler 08aca00905 Revert "Merge pull request #799 from AntelopeIO/sbailey/autofind_llvm_7-11"
Co-authored-by: Matt Witherspoon <32485495+spoonincode@users.noreply.github.com>
2023-03-17 00:53:32 -04:00
jgiszczak 8eb33401eb Merge branch 'main' into eosio-launcher-python-port 2023-03-16 21:26:47 -05:00
Zach Butler 03b1ebd46f Fix shebang in bash build scripts
Looking for BASH in the environment instead of invoking it directly
enables attacks where malware could escalate privileges by pointing BASH
to itself and tricking the user into entering a superuser password when
a user invokes our script, a familiar request the user may be expecting.
2023-03-16 21:03:43 -04:00
Zach Butler 0697aa31f3 SC2016 - note: Expressions don't expand in single quotes, use double quotes for that 2023-03-16 21:03:43 -04:00
Zach Butler 07208ec800 SC2006 - note: Use $(...) notation instead of legacy backticks ... 2023-03-16 21:03:42 -04:00
Zach Butler eee850dc38 SC2086 - note: Double quote to prevent globbing and word splitting. 2023-03-16 21:03:42 -04:00
Zach Butler 1038a94e66 SC2294 - warning: eval negates the benefit of arrays. Drop eval to preserve whitespace/symbols (or eval as string). 2023-03-16 21:03:42 -04:00
Zach Butler 633a8d37b3 SC2164 - Use "pushd ... || exit" or "pushd ... || return" in case pushd fails. 2023-03-16 21:03:42 -04:00
Zach Butler 83e6c6c6eb SC2034 - warning: "output" appears unused. Verify use (or export if used externally). 2023-03-16 21:03:41 -04:00
Zach Butler 46e50a4ee5 SC2034 - warning: ARCH appears unused. Verify use (or export if used externally). 2023-03-16 21:03:41 -04:00
Zach Butler 28c790be89 SC2034 - warning: CORE_SYM appears unused. Verify use (or export if used externally). 2023-03-16 21:03:41 -04:00
Zach Butler 25a7550166 SC2068 - error: Double quote array expansions to avoid re-splitting elements 2023-03-16 21:03:41 -04:00
Zach Butler 2e831bf906 SC2242 - error: Can only exit with status 0-255. Other data should be written to stdout/stderr. 2023-03-16 21:03:40 -04:00
Zach Butler 108a902a83 E011 - then keyword is not on same line as if or elif keyword 2023-03-16 21:03:40 -04:00
Zach Butler 2c92ef7ef2 E001 - Trailing Whitespace 2023-03-16 21:03:40 -04:00
Zach Butler a3284f4d5d E003 - Inconsistent indentation 2023-03-16 21:03:40 -04:00
Peter Oschwald e7e66a5d19 Simplify postinst and prerm scripts
leap_testing dir is already part of package so don't need to mkdir or rmdir as it will be cleaned up appropriately.

However, continue to clean up dir potentially created directly by postinst
2023-03-16 19:39:52 -05:00
Matt Witherspoon 18e812a99f Merge pull request #831 from AntelopeIO/peering_signed_warning
fix signed vs unsigned comparison warning in autobp peering
2023-03-16 17:29:22 -07:00
Peter Oschwald 7d78b885d6 Merge branch 'dev-install-add-testharness' of ssh://github.com/AntelopeIO/leap into dev-install-add-testharness 2023-03-16 19:08:51 -05:00
Peter Oschwald c46400c527 Best effort attempt to remove the directorys we may have created during the install.
Can ignore failed directory deletion as they may be installing to location that has more than leap in it, for instance the ~/lib/python3/dist-packages, however if it is empty it is a safe assumption that it is in the location the install created it and can be removed as the inverse uninstall operation.
2023-03-16 19:07:10 -05:00
Jonathan Giszczak 3ea8cf1b5c Update test from main. 2023-03-16 18:45:13 -05:00
Peter Oschwald 9c066a76af Update package.cmake
Co-authored-by: Scott B <Scott@TheBaileyFamily.org>
2023-03-16 18:11:15 -05:00
Clayton Calabrese 39bdbfe675 use lambda for transaction generator calculations 2023-03-16 17:52:37 -05:00
jgiszczak 7815146f8a Merge branch 'main' into eosio-launcher-python-port 2023-03-16 17:34:28 -05:00
Jonathan Giszczak 42df97f5d5 Some limits to prevent division by zero in performance linear search. 2023-03-16 17:20:30 -05:00
Vlad e3b31cda96 Merge pull request #759 from AntelopeIO/snapshot-api
Programmable snapshots API
2023-03-16 17:08:54 -04:00
Huang-Ming Huang 326c169e10 Merge pull request #820 from AntelopeIO/huangminghuang/get_raw_block
get_raw_block api endpoint
2023-03-16 16:02:54 -05:00
Peter Oschwald 8c8ad50862 Don't overwrite the env variable so you get both postinst and prerm 2023-03-16 15:50:00 -05:00
766C6164 17c4ce3a5c feedback addressed 2023-03-16 16:46:43 -04:00
Matt Witherspoon 81ec6137c8 fix un/signed comparison warning in autobp peering 2023-03-16 16:43:21 -04:00
Jonathan Giszczak 4c9a2fe2a1 Fix merge error. 2023-03-16 15:42:50 -05:00
Huang-Ming Huang af1dcf23cf fix assertion message 2023-03-16 15:35:42 -05:00
Jonathan Giszczak b52517bef3 Fix merge error. 2023-03-16 15:28:13 -05:00
766C6164 af808b72e6 feedback addressed 2023-03-16 16:20:18 -04:00
Jonathan Giszczak 1cdb4c5bdc Ignore errors in shutil.rmtree. 2023-03-16 15:19:31 -05:00
Peter Oschwald 08b1eb5252 Addressing peer review comment.
Simplify prerm script.
2023-03-16 14:34:29 -05:00
Jonathan Giszczak 60902e95fe Clean up launcher log directory on successful run. 2023-03-16 14:29:32 -05:00
Jonathan Giszczak 5ab118f982 Fix automatic merge failure. 2023-03-16 14:28:04 -05:00
Peter Oschwald 61b0efe536 Address a couple more review comments. 2023-03-16 14:24:15 -05:00
Jonathan Giszczak 1d95b12268 Merge branch 'main' into eosio-launcher-python-port 2023-03-16 14:19:51 -05:00
Peter Oschwald b6007e022d Peer review recommended using sh instead of bash as more likely to exist. 2023-03-16 13:56:16 -05:00
Peter Oschwald be154da603 Address peer review comments.
Adding additional commentary on cmake version based processing paths.

Added prerm script to cleanup symbolic links

Added EXCLUDE_FROM_ALL where necessary.

Move setting scripts to the package.cmake location suggested.
2023-03-16 13:54:19 -05:00
Clayton Calabrese 15d92a1797 use proper arg instead of empty string in launch transaction generators 2023-03-16 12:34:45 -05:00
Clayton Calabrese 5e21ecfea4 handle whitespace stripping in launch transaction generators 2023-03-16 12:31:37 -05:00
Clayton Calabrese 07ec10dd46 update readme to reflect port endpoint changes in performance harness 2023-03-16 11:03:47 -05:00
Peter Oschwald 38f8c59642 Address peer review comment. 2023-03-16 10:54:07 -05:00
Clayton Calabrese e3915ba846 merge from main 2023-03-16 10:53:05 -05:00
766C6164 6e0672ece4 Addressing feedback 2023-03-16 11:52:01 -04:00
Peter Oschwald d4ffa14da8 Merge pull request #829 from AntelopeIO/ph-fix-bug-and-arg-passing
[PH] fix bug and arg passing
2023-03-16 08:37:06 -05:00
Peter Oschwald c8d36c2ff7 Merge branch 'eosio-launcher-python-port' into dev-install-add-testharness 2023-03-16 08:30:41 -05:00
Peter Oschwald 315874ae2f DataDir now returns absolute path instead of relative.
Don't add cwd to the front of the already absolute path. Fixes error where unix socket path  was too long.
2023-03-15 23:59:57 -05:00
Peter Oschwald ed5aeca689 Fix comment to reflect updated floor in range. 2023-03-15 23:06:05 -05:00
Peter Oschwald e94cb14af8 Fix command line argument passing.
When additional command line arguments were added to performance_test_basic.py, some were inadvertently missed being passed from performance_test down to the performance_test_basic.  Update the argument passing to match that in performance_test_basic.py.
2023-03-15 23:01:11 -05:00
Jonathan Giszczak 9921db1a5c Avoid division by zero in performance_test. 2023-03-15 23:01:04 -05:00
Peter Oschwald 74696f2c0c Fix bug causing possible division by 0.
If the targetTps is allowed to be 0, there can be a division by 0 error TpsTrxGensConfig because the numGenerators would be 0 and thus initialTpsPerGenerator would be division by 0.  Fix this error through starting search floor at min 1 as well as capping the min to the floor.
2023-03-15 22:59:39 -05:00
Peter Oschwald d55b043b8d Merge branch 'eosio-launcher-python-port' into dev-install-add-testharness 2023-03-15 22:02:10 -05:00
Peter Oschwald b2db52d14b Update install mkdir and symbolic linking steps.
Existing steps were failing to work with package and old versions of cmake.
2023-03-15 21:24:28 -05:00
Vlad 82093b0203 Merge branch 'main' into snapshot-api 2023-03-15 21:58:39 -04:00
Huang-Ming Huang 58d6eb0327 Merge pull request #802 from AntelopeIO/huangminghuang/rm-eosio-blocklog 2023-03-15 17:56:10 -05:00
Vlad 152198f779 Merge branch 'main' into snapshot-api 2023-03-15 18:25:17 -04:00
Huang-Ming Huang e6020fbec2 address PR comments 2023-03-15 17:10:50 -05:00
Lin Huang 1e042d15df Merge pull request #823 from AntelopeIO/merge_3_2_2_version_bump_to_main
[3.2 -> Main] Merge 3.2.2 version bump to main
2023-03-15 18:07:03 -04:00
766C6164 b72027cf22 should allow loop to run from start to finish 2023-03-15 18:03:48 -04:00
Lin Huang 0f15f5f94a Merge branch 'main' into merge_3_2_2_version_bump_to_main 2023-03-15 17:33:24 -04:00
Vlad 135a9ee265 Merge branch 'main' into snapshot-api 2023-03-15 17:30:00 -04:00
766C6164 696f30f8ed more selectability for invalid request 2023-03-15 17:22:52 -04:00
Lin Huang 5cac6638ed Merge pull request #776 from AntelopeIO/parallel_readonly_trxs
Parallelize Read-only Transaction Execution
2023-03-15 17:02:03 -04:00
Jonathan Giszczak 156a055bcc Fix test bug. 2023-03-15 15:29:05 -05:00
Jonathan Giszczak e7b4866553 Missed a moved variable in performance test basic. 2023-03-15 14:57:49 -05:00
Jonathan Giszczak ecc8fb9b04 Fix merge error. 2023-03-15 14:43:12 -05:00
jgiszczak 794b4b4a04 Merge branch 'main' into eosio-launcher-python-port 2023-03-15 14:34:32 -05:00
Jonathan Giszczak a17d8f4293 Make network isolation default disabled but enabled in CI/CD.
Remove some obsolete and broken test scripts.
2023-03-15 14:32:37 -05:00
Huang-Ming Huang 22605db687 address PR comment 2023-03-15 14:26:21 -05:00
Lin Huang a5036cab0d Merge branch 'main' into parallel_readonly_trxs 2023-03-15 15:25:35 -04:00
Lin Huang c2c41c2c5c Merge branch 'main' into merge_3_2_2_version_bump_to_main 2023-03-15 15:07:14 -04:00
ClaytonCalabrese 1e70108ab4 Merge pull request #827 from AntelopeIO/remove_read_log_data
[PH] [4.0] Remove read_log_data.py
2023-03-15 14:06:34 -05:00
Huang-Ming Huang 5e48d00e22 Merge branch 'main' into huangminghuang/rm-eosio-blocklog 2023-03-15 13:00:26 -05:00
Clayton Calabrese cce332d1c9 remove undesired read_log_data.py and related components 2023-03-15 12:57:15 -05:00
jgiszczak 6023f71672 Merge branch 'main' into eosio-launcher-python-port 2023-03-15 12:38:35 -05:00
Peter Oschwald a211e57c8b Merge pull request #819 from AntelopeIO/ph-add-performance-test
[PH] Add performance test to CI/CD
2023-03-15 12:36:59 -05:00
Lin Huang 07fad93eb2 restore VERSION_SUFFIX to dev after merging 3.2.2 version bump 2023-03-15 13:24:09 -04:00
Lin Huang 061f010258 Merge pull request #821 from AntelopeIO/bump_to_3_2_2
[3.2] Bump Leap version to release 3.2.2
2023-03-15 13:06:29 -04:00
Lin Huang 68df37da0c Bump Leap version to release 3.2.2 2023-03-15 12:34:27 -04:00
766C6164 b25ee3c306 break after unschedule 2023-03-15 11:27:55 -04:00
Huang-Ming Huang 75fb80b6f8 get_raw_block api endpoint 2023-03-15 08:44:39 -05:00
Peter Oschwald 0a01800886 Add performance test to excercise user defined contract and test action with data file. 2023-03-15 08:23:32 -05:00
Peter Oschwald e43d6339e7 Add performance_test run to long_running_tests to exercise performance_test.py. 2023-03-15 08:04:30 -05:00
Peter Oschwald 39c2242d17 Fix some dataclass initialization for python 3.11 2023-03-15 07:57:43 -05:00
766C6164 d0d5d02f0d one more fix 2023-03-14 22:30:59 -04:00
766C6164 1041600558 logic fix 2023-03-14 22:05:39 -04:00
766C6164 3ec37d2eee fixed ups 2023-03-14 21:38:54 -04:00
Peter Oschwald d56b97e527 Update core_symbol imports to reflect it being part of TestHarness module. 2023-03-14 19:16:01 -05:00
766C6164 41601acac4 make sure future scheduled snapshots treated correctly 2023-03-14 20:08:43 -04:00
Peter Oschwald 6f16347f6e Fix install steps to only apply to COMPONENT dev 2023-03-14 18:46:21 -05:00
Jonathan Giszczak c6b839025e Correct syntax of suggested change. 2023-03-14 18:23:34 -05:00
766C6164 dfe1c55ed6 Addressing feedback 2023-03-14 19:20:46 -04:00
jgiszczak 3346d1e04f Create output directory just-in-time for the shutdown case.
Co-authored-by: Scott B <Scott@TheBaileyFamily.org>
2023-03-14 18:12:09 -05:00
Peter Oschwald 0a1ec82bcd Add TestHarness python integration scripts to dev-install package. 2023-03-14 18:11:08 -05:00
Peter Oschwald f81921ad3b Fix lost force option. 2023-03-14 18:01:08 -05:00
Clayton Calabrese 26da362b5d Convert Cluster's connectionPairList to match proper format 2023-03-14 16:04:17 -05:00
Lin Huang d0ef1cf667 revert _ro_num_active_trx_exec_tasks to uint32_t 2023-03-14 17:02:09 -04:00
Lin Huang 9adc66513e make window switching assert conditions stronger 2023-03-14 16:42:43 -04:00
Clayton Calabrese 3e19ad1fb0 rework when splitting of connectionpairList happens to simplify use 2023-03-14 13:27:25 -05:00
766C6164 dfc8d629f3 cleaned up listeners/handlers 2023-03-14 14:03:06 -04:00
766C6164 c8487beb17 Renamed and cleaned up last test 2023-03-14 12:38:28 -04:00
Lin Huang 8997ae2f89 make exec_queue parameter explicit in all APIs 2023-03-14 11:58:55 -04:00
Clayton Calabrese 9a2eb7b85b allow passing of endpoints in addition to ports. Create even distribution of generators accross ports based on number of ports passed to the transaction generator launcher 2023-03-14 10:25:56 -05:00
Lin Huang 8502c2ea66 move add_greylist_accounts and remove_greylist_accounts to general queue; correct an error text 2023-03-14 09:53:28 -04:00
766C6164 dbf901a55f Quit node gracefully on scheduler errors 2023-03-13 22:15:40 -04:00
Lin Huang 76bef699db move more read-only-non-safe operations to general queue 2023-03-13 21:47:08 -04:00
766C6164 b4b677866e Merge branch 'snapshot-api' of https://github.com/AntelopeIO/leap into snapshot-api 2023-03-13 21:24:56 -04:00
766C6164 ec624b5dcc Improved snapshot_diff test 2023-03-13 21:24:40 -04:00
Lin Huang 7f9002f10f Move update_runtime_options, set_whitelist_blacklist, and schedule_protocol_feature_activations to general queue 2023-03-13 18:21:18 -04:00
Lin Huang 9a9ba76f5b Merge branch 'main' into parallel_readonly_trxs 2023-03-13 18:03:58 -04:00
Kevin Heifner cf75235531 Merge pull request #809 from AntelopeIO/GH-808-test
Test fix: Increase abi-serializer-max-time-ms & http-max-response-time-ms for test
2023-03-13 16:15:52 -05:00
Jonathan Giszczak 6b78bac09c Remove eosio-launcher and testnet.template shell script. 2023-03-13 16:03:45 -05:00
Lin Huang ae158d5a77 fix merge conflicts from Main 2023-03-13 16:12:49 -04:00
Kevin Heifner 8f2b48e2a8 GH-808 All other integration tests set a high abi-serializer-max-time-ms and http-max-response-time-ms. Increase for this test as well. 2023-03-13 14:40:24 -05:00
Lin Huang 832db1158d Merge branch 'main' into parallel_readonly_trxs 2023-03-13 15:37:02 -04:00
Huang-Ming Huang fd9c2a64b9 fix snapshot test 2023-03-13 14:00:43 -05:00
Kevin Heifner 2573a5e7f5 Merge pull request #623 from AntelopeIO/feature_prometheus_plugin
Add Prometheus Plugin
2023-03-13 13:57:50 -05:00
Huang-Ming Huang 63157c187b fix unittest 2023-03-13 13:20:36 -05:00
Lin Huang 1880d22796 fail some trxs on authorization and expiration; wait sufficient time for all transactions to be executed 2023-03-13 14:09:34 -04:00
Kevin Heifner 6475b8fe70 Merge branch 'main' into feature_prometheus_plugin 2023-03-13 13:05:29 -05:00
Huang-Ming Huang e643eb6331 fix tests 2023-03-13 12:21:53 -05:00
Vlad df5ad0cf0c Merge branch 'main' into snapshot-api 2023-03-13 12:50:13 -04:00
Lin Huang 536546e12a Merge branch 'main' into parallel_readonly_trxs 2023-03-13 11:56:57 -04:00
Matt Witherspoon 2a9c20cc16 Merge pull request #807 from AntelopeIO/fix_ship_session_test_linkage
fix mixed up boost test linkage in ship session_test
2023-03-13 08:55:47 -07:00
Lin Huang e0feb2466f put back chain.is_building_block() check 2023-03-13 11:15:23 -04:00
766C6164 24cd36d37c Fix for the flakiness of snapshot test 2023-03-13 00:16:59 -04:00
Lin Huang a39e7b59a8 do not check is_building_block 2023-03-12 22:29:58 -04:00
Lin Huang 84fd3ada3c Add read-only trxs unit tests test_read_only_trx.cpp 2023-03-12 21:24:35 -04:00
Lin Huang adde995462 Merge branch 'main' into parallel_readonly_trxs 2023-03-12 21:17:09 -04:00
Jonathan Giszczak 02e7433a37 More missed renames of Queries class. 2023-03-12 18:22:03 -05:00
Matt Witherspoon 84c48b78e9 fix mixed up boost test linkage in ship session_test 2023-03-12 19:11:38 -04:00
Jonathan Giszczak 44ed18203e Fix missed rename of Queries class. 2023-03-12 18:01:40 -05:00
Kevin Heifner df5dd69af2 Merge pull request #805 from AntelopeIO/log-spam
Improve logging during syncing when `producer_plugin` `debug` level is enabled
2023-03-11 13:05:03 -06:00
Kevin Heifner b020a077ec Add comment 2023-03-11 12:13:11 -06:00
Lin Huang f573906fe2 correct typos in comments 2023-03-11 11:00:01 -05:00
Kevin Heifner ff671fcd35 Improve logging during syncing when producer_plugin debug level is enabled. 2023-03-11 08:34:25 -06:00
Jonathan Giszczak cad96d77e3 Address review comments.
CMake simplification.
Rename Queries to NodeosQueries.
Make transferFundsCmdArr conventionally accessible.
Rewrite some ancient C-style code to something more Pythonic.
Make appropriate use of sys.executable.
2023-03-10 19:01:09 -06:00
Clayton Calabrese e12d2befb8 Merge branch 'eosio-launcher-python-port' of https://github.com/AntelopeIO/leap into eosio-launcher-python-port 2023-03-10 17:42:39 -06:00
Clayton Calabrese 7aafa96d3d merge from main 2023-03-10 17:42:01 -06:00
jgiszczak 7d4a9e802e Reduce CMakeLists verbosity still further.
Co-authored-by: Scott B <Scott@TheBaileyFamily.org>
2023-03-10 17:35:42 -06:00
Clayton Calabrese 52606ac5fe resolve some cleanup from merge PR 2023-03-10 17:23:17 -06:00
Lin Huang debcd87f70 Merge branch 'main' into parallel_readonly_trxs 2023-03-10 18:18:15 -05:00
Peter Oschwald cf833519a5 Merge pull request #803 from AntelopeIO/ph_trxgen_remove_contracts_dep
[PH] Remove unnecessary dependency on contracts.
2023-03-10 16:46:44 -06:00
Lin Huang 5bc9c1ab72 correct typos in comments 2023-03-10 17:09:10 -05:00
ClaytonCalabrese f8118ee918 Merge pull request #804 from AntelopeIO/merge_performance_harness_phase2_python_launcher
[TH] Merge Main Containing PH Phase 2
2023-03-10 15:46:09 -06:00
Lin Huang d6a0062ca1 more comments and finishing touch 2023-03-10 16:33:52 -05:00
Clayton Calabrese 6e3ee81336 merge main containing performance test phase 2 into python launcher 2023-03-10 13:25:41 -06:00
Peter Oschwald 3be20fa28b Remove unnecessary dependency on contracts. 2023-03-10 13:06:51 -06:00
Huang-Ming Huang d5deb4eef1 remove eosio-blocklog 2023-03-10 11:56:54 -06:00
Lin Huang 2d5a313f00 Merge branch 'main' into parallel_readonly_trxs 2023-03-10 11:51:51 -05:00
Lin Huang 23baf6dfe9 Merge branch 'parallel_readonly_trxs' of https://github.com/AntelopeIO/leap into parallel_readonly_trxs 2023-03-10 11:51:01 -05:00
Lin Huang 48b40afbca add a test of doing read-only trxs, send_transaction, and push_block in parallell; improve test names 2023-03-10 11:50:36 -05:00
Scott B eac39208ff Merge pull request #799 from AntelopeIO/sbailey/autofind_llvm_7-11
Search for LLVM versions 7-11, prefering latest version.
2023-03-10 10:15:47 -06:00
Lin Huang 7e4b451c9b Merge branch 'main' into parallel_readonly_trxs 2023-03-10 11:04:10 -05:00
Lin Huang 5522e274af compile when EOSIO_EOS_VM_OC_RUNTIME_ENABLED is not defined 2023-03-10 11:03:31 -05:00
Peter Oschwald f9becdbf21 Merge pull request #473 from AntelopeIO/feature_performance_harness_stage_2
[PH] Feature performance harness stage 2 development
2023-03-10 09:46:46 -06:00
Lin Huang ed647f8628 make code_cache_sync (used by EOSIO_EOS_VM_OC_DEVELOPER) multi-threaded safe 2023-03-10 10:39:54 -05:00
Scott Bailey cb160e00c2 untabify 2023-03-10 09:24:07 -06:00
Peter Oschwald da92673aff Merge branch 'main' into feature_performance_harness_stage_2 2023-03-10 09:01:41 -06:00
Peter Oschwald a9aea207be Switch to support older versions of python.
Before text=True (3.7) there was universal_newlines=True. Ubuntu 18 build still running on older version of python.
2023-03-10 08:56:50 -06:00
Lin Huang 7f258bcd43 for dry-run, only append action_receipt_digests; add more comments about thread-local data 2023-03-10 09:20:49 -05:00
Scott Bailey ab0752c7c9 Ubuntu18 default CMake is 3.10 and will not execute the search path. 2023-03-10 07:58:47 -06:00
Scott Bailey 0c180d04c5 Addressing review comment. 2023-03-10 07:49:32 -06:00
Lin Huang e0c3b9daaf set a hard limit of read-only trx thread number for EOS VM OC 2023-03-09 20:37:04 -05:00
Lin Huang 94d8f4470b delete removed abi_json_to_bin and abi_bin_to_json from read_only_trx_test.py 2023-03-09 18:37:45 -05:00
Lin Huang 46b0a2a55c Merge branch 'main' into parallel_readonly_trxs 2023-03-09 17:50:09 -05:00
Kevin Heifner 8bf37aac8a Merge pull request #797 from AntelopeIO/GH-788-remove-abi
Remove deprecated `/v1/chain/abi_bin_to_json` and `/v1/chain/abi_json_to_bin`
2023-03-09 16:49:14 -06:00
Peter Oschwald a24b05cd4e Switch to support older versions of python.
capture_output not added until python 3.7. Ubuntu 18 build still running on older version of python.
2023-03-09 16:33:03 -06:00
Peter Oschwald 93f52ea34f Don't require these find packages, which are already being done higher up. 2023-03-09 16:20:50 -06:00
Peter Oschwald 7ee35bb31d Generate *PluginArgs.py files directly.
Since they are now being generated they will always be kept in sync with nodeos arguments and the validation test is no longer needed.
2023-03-09 16:14:01 -06:00
Peter Oschwald 9063dd87e1 Addressing peer review comments.
Add long form for help message.

Make sure launch_transaction_generators is added to the module.

Remove executable bits from scripts internal to the module.
2023-03-09 15:05:53 -06:00
Peter Oschwald df957cd13d Addressing peer review comment to remove unused code. 2023-03-09 15:04:20 -06:00
Jonathan Giszczak 094448ac06 Remove obsolete support for txn_test_gen_plugin.
Restore a missed nodeos version hardcoding.
Whitespace cleanup.
2023-03-09 14:38:16 -06:00
Peter Oschwald 6ba406ff2d Address peer review comments.
Moving some functions out of trx_generator since they don't need to be member functions.

Addressing a couple missed const qualifiers on arguments.
2023-03-09 14:31:25 -06:00
Scott Bailey 4394506093 Search for LLVM versions 7-11, prefering latest version. 2023-03-09 14:20:20 -06:00
Lin Huang 70a6c94b3a Use correct window deadline and max trx time 2023-03-09 15:17:27 -05:00
Kevin Heifner c2c784fb25 GH-789 Fix regex 2023-03-09 14:09:28 -06:00
Kevin Heifner 2099dc1d36 GH-789 Remove --private-key option from nodeos 2023-03-09 14:05:47 -06:00
Peter Oschwald 5ec692a2be Fixup documentation for missing arguments. 2023-03-09 13:54:14 -06:00
Huang-Ming Huang cdc3ffe4da Merge pull request #796 from AntelopeIO/huangminghuang/fix_prometheus_test
Huangminghuang/fix_prometheus_test
2023-03-09 13:48:23 -06:00
Kevin Heifner 7baee720cd GH-788 Remove abi_json_to_bin 2023-03-09 13:39:27 -06:00
Kevin Heifner d680c62f79 GH-788 Remove abi_bin_to_json 2023-03-09 13:33:02 -06:00
Lin Huang 2cac6cd13f fix a capture reference probem in http_plugin::make_app_thread_url_handler, remove duplicate code in transient_trx logging, and some small changes 2023-03-09 14:27:09 -05:00
Peter Oschwald 500814876e Addressing peer review comments. 2023-03-09 13:26:13 -06:00
Peter Oschwald 1c612e8189 Update ProducerPluginArgs for newly added arguments. 2023-03-09 13:03:36 -06:00
Peter Oschwald 93fc50a277 Merge branch 'main' into feature_performance_harness_stage_2 2023-03-09 13:00:25 -06:00
766C6164 041d897df0 Addressing feedback 2023-03-09 13:55:08 -05:00
Peter Oschwald 045db81995 Addressing peer review comments.
Newer versions of Python, e.g. 3.11 require use of default_factory in dataclasses.

Newer versions of python/numpy no longer require np predicate before float, and can use float directly.
2023-03-09 12:51:16 -06:00
Huang-Ming Huang 0dd648a10e Merge pull request #795 from AntelopeIO/huangminghuang/prometheus_int_test
prometheus plugin integeration test
2023-03-09 12:49:30 -06:00
Lin Huang 2b67c0f654 Merge branch 'main' into parallel_readonly_trxs 2023-03-09 12:06:21 -05:00
Peter Oschwald c6717c4054 Peer review comment.
Use variable to make this easier to read and follow.
2023-03-09 10:23:26 -06:00
Huang-Ming Huang 70fe996081 Merge pull request #793 from AntelopeIO/huangminghuang/strike-rule-main
[3.2 -> main] subjective-account-max-failures-window-size
2023-03-09 10:09:45 -06:00
Lin Huang f250a2d545 add transient_trx_success_tracing and transient_trx_failure_tracing for dry-run and read-only transactions; remove a redundant db_read_only_mode_guard.cancel 2023-03-09 10:46:11 -05:00
Peter Oschwald 72451aad53 Address peer review comments.
Combine pieces of argument onto same line.

Remove trailing whitespace.
2023-03-09 08:57:14 -06:00
Peter Oschwald bafd7ddd69 Address peer review comments.
Break up some rather long lines of code.
2023-03-09 08:53:17 -06:00
Peter Oschwald 173fff951f Fix braces. 2023-03-09 08:36:59 -06:00
Huang-Ming Huang 2b469c4748 remove num_call assertion 2023-03-09 02:15:46 -06:00
Huang-Ming Huang c1c32ee562 head_block_num 2023-03-08 22:58:48 -06:00
Huang-Ming Huang 35df1bc591 Merge remote-tracking branch 'origin/feature_prometheus_plugin' into huangminghuang/prometheus_int_test 2023-03-08 22:47:16 -06:00
Huang-Ming Huang 9784e89666 create integeration test 2023-03-08 22:05:53 -06:00
Kevin Heifner c0ed157959 Add tracking of num_peers and num_clients 2023-03-08 21:14:19 -06:00
Kevin Heifner ba8ba7f0e9 Use tlog for trace logging of adding metrics 2023-03-08 21:09:09 -06:00
Kevin Heifner 3e2fd4d55b Merge remote-tracking branch 'origin/main' into feature_prometheus_plugin 2023-03-08 21:02:04 -06:00
Kevin Heifner 8eb0d86f71 Cleanup for peer review comments 2023-03-08 21:01:40 -06:00
Lin Huang 16e5a1c5ff make read_only_trx_test handle clean-run properly 2023-03-08 21:19:13 -05:00
Lin Huang 832fa96e09 fix crash caused by handle_push_result 2023-03-08 20:11:23 -05:00
Lin Huang 3a35e0e799 revert back pushing receipts, correct a commment about non-parallized read-only trx 2023-03-08 18:33:29 -05:00
Jonathan Giszczak 045b439cfa Update auto-bp-peering test for new launcher topology format.
Also fix typos in comments.
2023-03-08 17:30:54 -06:00
Peter Oschwald 778ff304e6 Cleaning up using namespace statements and namespace qualifiers. 2023-03-08 16:43:56 -06:00
Huang-Ming Huang b1972b154e Merge pull request #794 from AntelopeIO/huangminghuang/prometheus-fix
fix create_metrics_listener
2023-03-08 15:18:22 -06:00
Huang-Ming Huang abf26654a0 fix mutable 2023-03-08 14:33:28 -06:00
Huang-Ming Huang 3bcf55d1f7 address PR comment 2023-03-08 14:28:30 -06:00
Huang-Ming Huang cb153b637b fix create_metrics_listener 2023-03-08 14:20:55 -06:00
Jonathan Giszczak 320cc044aa Fix defect in launcher_test when no asserts found in log. 2023-03-08 13:11:59 -06:00
Lin Huang 8128ea9502 make handle_push_result some simpler and rename exhausted to retry to better reflect intention. 2023-03-08 14:02:37 -05:00
Peter Oschwald 3cd1b3609c Addressing peer review comments
Updates to emplace_back, push_back, transform usage.
2023-03-08 13:01:51 -06:00
Jonathan Giszczak 178f3988db Manually set GITHUB_ACTIONS environment variable in custom docker run. 2023-03-08 12:52:46 -06:00
Jonathan Giszczak 784fc5e176 Github 2023-03-08 11:57:25 -06:00
Peter Oschwald 2d31597efc Put back in blank line so list will render properly. 2023-03-08 11:45:41 -06:00
Peter Oschwald eed59be134 Work to coalesce arguments into config objects.
Additional work to clean up argument handling in trx generator main.

Drop a couple helper functions that we not needed.

Don't pass arguments into member functions that could simple access member variables.
2023-03-08 11:39:18 -06:00
Jonathan Giszczak 7d36182587 Merge branch 'eosio-launcher-python-port' of github.com:AntelopeIO/leap into eosio-launcher-python-port 2023-03-08 11:24:11 -06:00
Jonathan Giszczak a8c8f4d278 Fix misspelling. 2023-03-08 11:23:58 -06:00
Huang-Ming Huang 19cd5ee282 Merge remote-tracking branch 'origin/release/3.2' into huangminghuang/strike-rule-main
# Conflicts:
#	plugins/producer_plugin/producer_plugin.cpp
2023-03-08 11:16:53 -06:00
Huang-Ming Huang 7988545513 Merge pull request #785 from AntelopeIO/huangminghuang/strike-rule-3.2
[3.1 -> 3.2] subjective-account-max-failures-window-size
2023-03-08 10:45:19 -06:00
Clayton Calabrese 29564f6a6f Remove hardcoded number of ports in transaction generator 2023-03-08 09:45:20 -06:00
Huang-Ming Huang 264ff183cb address PR comment 2023-03-08 09:31:40 -06:00
Kevin Heifner efc31df65d Merge pull request #786 from AntelopeIO/external-order
Use appbase with external order for priority queue.
2023-03-08 07:20:02 -06:00
Kevin Heifner 740e60de64 Update appbase to head of main 2023-03-08 07:05:13 -06:00
Lin Huang 7894aabf1e refactor push_read_only_transaction to reuse common push transaction result handling 2023-03-07 22:12:44 -05:00
jgiszczak 6073cce8d6 Merge branch 'main' into eosio-launcher-python-port 2023-03-07 18:48:24 -06:00
Jonathan Giszczak 9bd0629176 Github 2023-03-07 18:25:49 -06:00
Clayton Calabrese 5747877d1c update readmes for trxgen and perf test to fit new port system 2023-03-07 17:45:19 -06:00
Clayton Calabrese 1c2f0567ce account for other routes into transactiongeneratorlauncher when dealing with ports 2023-03-07 16:55:33 -06:00
Clayton Calabrese 5baeede259 evenly distribute created transaction generators across multiple producer's ports 2023-03-07 16:17:29 -06:00
Kevin Heifner 8d7845f89c Use correct register_plugin of appbase 2023-03-07 15:51:24 -06:00
Peter Oschwald 23670d00ca Reintroduce stop-on-trx-failed argument.
Inadvertently removed in commit d8d9fa3.
2023-03-07 15:25:22 -06:00
Lin Huang 7b529301a3 Merge branch 'main' into parallel_readonly_trxs 2023-03-07 15:44:49 -05:00
Peter Oschwald bbf4a2e110 Merge branch 'main' into feature_performance_harness_stage_2 2023-03-07 13:21:00 -06:00
Peter Oschwald fe8e3dfca3 Clean up argument handling per peer review suggestions. 2023-03-07 13:20:23 -06:00
766C6164 dec7c1103a Fixed whitespace plus additional test 2023-03-07 14:01:18 -05:00
Peter Oschwald ed797fbc16 Merge pull request #787 from AntelopeIO/https-cleanup-in-http-plugin-test
Cleanup some missed https support from test that was missed.
2023-03-07 12:56:06 -06:00
Lin Huang f04718b930 do not use mutex for code_cache_async::get_descriptor_for_code and protect _cache_index.relocate 2023-03-07 13:44:15 -05:00
Peter Oschwald 8470e01f24 Cleanup some missed https support from test that was missed. 2023-03-07 12:27:42 -06:00
Peter Oschwald 71a155b9cf Updates for changes in nodeos plugin args from merge from main. 2023-03-07 12:20:41 -06:00
Clayton Calabrese 0ec3c58be4 remove hardcoded use of TestLogs name from tests 2023-03-07 12:07:50 -06:00
Lin Huang 7702f1a6d3 protect code cache from evicting entries while read-only trxs threads are executing 2023-03-07 12:15:01 -05:00
Peter Oschwald 5d3988570c Merge branch 'main' into feature_performance_harness_stage_2 2023-03-07 10:48:27 -06:00
Kevin Heifner cd42afafcb Merge pull request #784 from AntelopeIO/fix-warn
Minor cleanup and fix for clang warning
2023-03-07 10:41:34 -06:00
Kevin Heifner b3a1eafdaf Use appbase with external order for priority queue. 2023-03-07 10:24:06 -06:00
Peter Oschwald 602e9eec89 Merge branch 'main' into feature_performance_harness_stage_2 2023-03-07 10:21:58 -06:00
Lin Huang c2ef8b2f59 use _producers.empty() instead _production_enabled to determine production node 2023-03-07 10:43:59 -05:00
Lin Huang 5ace1197c6 Do not post transaction related RPCs to general queue, revert not to do push_receipt for read-only trx, and move _ro_trx_exec_tasks_fut.clear inside post task 2023-03-07 10:26:40 -05:00
766C6164 2c5bb903e7 Cleanup requests with invalid start 2023-03-07 10:02:21 -05:00
766C6164 dc5c15426f Updated snapshot_diff_test to use scheduler 2023-03-07 10:01:24 -05:00
Kevin Heifner 62b9337cb8 Minor cleanup and fix for clang++ warning: suggest braces around initialization of subobject [-Wmissing-braces] 2023-03-07 08:52:58 -06:00
Lin Huang 428de82034 update _idle_trx_time, correct assertion text for read-only-thread with production node 2023-03-07 09:12:25 -05:00
766C6164 7cf95895eb Better handling of "now" snapshots 2023-03-07 08:42:21 -05:00
Lin Huang 3598fda51b make custom_appbase as an interface so its users do not need to use relative include path in their CMakeList.txt files 2023-03-07 08:36:21 -05:00
Lin Huang 37f374f2d5 fix merging conflict errors 2023-03-06 22:33:29 -05:00
Huang-Ming Huang a8877f19cd extract block_time_tracker 2023-03-06 21:26:31 -06:00
Huang-Ming Huang bd8d23a2e8 Merge remote-tracking branch 'origin/release/3.1' into huangminghuang/strike-rule-3.2
# Conflicts:
#	plugins/producer_plugin/producer_plugin.cpp
2023-03-07 08:38:58 -06:00
Huang-Ming Huang 9d1ea27ed7 Merge pull request #777 from AntelopeIO/huangminghuang/strike-rule
[3.1] subjective-account-max-failures-window-size
2023-03-07 08:19:34 -06:00
Lin Huang 09434dabfb Merge branch 'main' into parallel_readonly_trxs 2023-03-06 21:51:05 -05:00
Lin Huang 30eb5da5c6 do not all multi-threaded read-only transaction execution when production is enabled; revert net_plugin process_packed_transaction changes; and some minor changes 2023-03-06 21:37:58 -05:00
766C6164 d0a21f7828 Added multinode py test, fixed bug in scheduler 2023-03-06 20:42:54 -05:00
Jonathan Giszczak a0ddca815b Github 2023-03-06 19:33:56 -06:00
Jonathan Giszczak dfd1444e1c Github 2023-03-06 19:32:51 -06:00
Jonathan Giszczak 3677252f0a Indentation. (Lost in auto-merge?) 2023-03-06 18:46:17 -06:00
Kevin Heifner 283daf3d2e Use http_plugin max_response_time 2023-03-06 18:40:48 -06:00
Jonathan Giszczak 792f5184a1 Merge branch 'eosio-launcher-python-port' of github.com:AntelopeIO/leap into eosio-launcher-python-port 2023-03-06 18:13:14 -06:00
Jonathan Giszczak ac5286401c Missing seccomp setting from NP and LR tests. 2023-03-06 18:12:27 -06:00
jgiszczak e2c8a2ad81 Merge branch 'main' into eosio-launcher-python-port 2023-03-06 18:02:42 -06:00
Kevin Heifner c0c0659822 Fix merge conflicts 2023-03-06 17:53:03 -06:00
Jonathan Giszczak 70e23921de Github 2023-03-06 17:49:50 -06:00
Jonathan Giszczak b4fb60f1c9 Try uid rather than euid for Github environment. 2023-03-06 17:35:38 -06:00
Lin Huang 809d72e029 small cleanups in controller and producer_plugin 2023-03-06 18:32:51 -05:00
Kevin Heifner cfa3c11bd5 Merge pull request #781 from AntelopeIO/GH-768-logging-main
[3.2 -> main] Move subjective bill log to `all` level of `producer_plugin` logger.
2023-03-06 17:16:27 -06:00
jgiszczak f171585ae8 Merge branch 'main' into eosio-launcher-python-port 2023-03-06 16:59:29 -06:00
Jonathan Giszczak 2e896e3c5a Enable extracting stdout/stderr from CalledProcessError.
Minimum supported Python version now includes these properties.
2023-03-06 16:54:20 -06:00
Jonathan Giszczak 19bd633d07 Auto-detect running integration tests as root or not. 2023-03-06 16:47:14 -06:00
Kevin Heifner a08aeceaef Merge remote-tracking branch 'origin/main' into feature_prometheus_plugin 2023-03-06 15:57:08 -06:00
Gregory Popovitch 0da31eaa35 Merge pull request #738 from AntelopeIO/gh-451
http_plugin: add support for `Expect: 100-Continue' header.
2023-03-06 16:03:40 -05:00
greg7mdp 3e1f6cabe3 Add a comment. 2023-03-06 15:35:28 -05:00
Jonathan Giszczak 4c27d35bd0 Wait for trans in block for each group of protocol features, to ensure prerequisites complete. 2023-03-06 14:35:12 -06:00
Lin Huang 759291d018 Merge branch 'main' into parallel_readonly_trxs 2023-03-06 13:23:53 -05:00
Lin Huang 83de948f5d remove _ro_read_window_pct and use _ro_read_window_minimum_time_us instead, check _ro_read_window_time_us and _max_transaction_time_ms interaction, more conservative on EOS VM OC VM size, and several small enhancements 2023-03-06 13:02:48 -05:00
ClaytonCalabrese 0a5ea49da8 Merge pull request #778 from AntelopeIO/performance_harness_update_log_reader_tests
[PH] Update Log Reader Tests For scrapeBlockTrxDataLog
2023-03-06 11:16:17 -06:00
Huang-Ming Huang 5037c40a61 Merge pull request #744 from AntelopeIO/huangminghuang/auto-bp-peer
Add auto bp peering functionality
2023-03-06 10:59:45 -06:00
greg7mdp 6dc85d861a Address code review comments from @mikelik. 2023-03-06 11:29:23 -05:00
Huang-Ming Huang 71548a6425 Merge branch 'release/3.1' into huangminghuang/strike-rule 2023-03-06 09:37:22 -06:00
Huang-Ming Huang 72c5d299fe add reset time until back 2023-03-06 09:12:30 -06:00
Kevin Heifner 3ed53c2b3e Merge remote-tracking branch 'origin/release/3.2' into GH-768-logging-main 2023-03-06 09:01:51 -06:00
Kevin Heifner 258a06ab82 Merge pull request #779 from AntelopeIO/GH-768-logging-3.2
[3.1 -> 3.2] Move subjective bill log to `all` level of `producer_plugin` logger.
2023-03-06 08:59:36 -06:00
Huang-Ming Huang 5cf31c9929 address PR comment 2023-03-06 08:21:26 -06:00
Kevin Heifner a0ff189eab kick ci/cd 2023-03-06 08:01:08 -06:00
Huang-Ming Huang 6811be23de address PR comments 2023-03-06 07:59:56 -06:00
Kevin Heifner e9976d2ce0 Cleanup 2023-03-06 07:59:41 -06:00
Lin Huang c913c9e098 Assert no active read-only tasks when switching to write window; start read-only tasks before timer; several comment and format improvements 2023-03-06 08:42:35 -05:00
Kevin Heifner bd14a62314 Merge remote-tracking branch 'origin/main' into feature_prometheus_plugin 2023-03-06 06:53:45 -06:00
766C6164 d2aeeb7e3e Fixed pending snapshot test 2023-03-05 21:41:33 -05:00
Lin Huang 5b441a3d68 put _ro_trx_queue and its mutex into a struct, use std::atomic for _ro_num_active_trx_exec_tasks; use fc::microseconds for microsecond members 2023-03-05 21:13:47 -05:00
Vlad c4c448ea6c Merge branch 'main' into snapshot-api 2023-03-05 15:44:29 -05:00
Lin Huang 44af6d8532 use std::thread::id instead of boost::thread::id, combine start methods in thread_utils, and add override to init_thread_local_data in eosvmoc_runtime 2023-03-05 13:42:28 -05:00
Lin Huang fe49865132 Merge branch 'main' into parallel_readonly_trxs 2023-03-05 11:05:49 -05:00
Lin Huang 11c42ce651 Merge pull request #780 from AntelopeIO/fix_logconf
bump appbase version and fix logging.json not working problem
2023-03-05 11:05:17 -05:00
Lin Huang d010733bcf Merge branch 'main' into parallel_readonly_trxs 2023-03-05 10:54:37 -05:00
Kevin Heifner 5b0108f7a2 Merge pull request #774 from AntelopeIO/GH-772-head
Fix issue with reported fork head vs retrieval of block from fork db
2023-03-04 22:08:07 -06:00
Lin Huang 8f83e49f90 Merge branch 'main' into parallel_readonly_trxs 2023-03-04 21:10:16 -05:00
Lin Huang 111e4bd3e4 bump appbase version and fix logging.conf not working problem 2023-03-04 21:04:30 -05:00
Kevin Heifner 83307587a2 GH-768 Log non TRX_TRACE trx logging to all (trace) level logger of producer_plugin. 2023-03-04 14:01:23 -06:00
Kevin Heifner 0046163ad7 GH-768 Move fc_tlog to logger.hpp 2023-03-04 13:52:06 -06:00
Kevin Heifner f13bf0ab1b Merge remote-tracking branch 'origin/release/3.1' into GH-768-logging-3.2 2023-03-04 13:50:49 -06:00
Kevin Heifner 941b525093 Merge pull request #773 from AntelopeIO/GH-768-logging-3.1
[3.1] Move subjective bill log to `all` level of `producer_plugin` logger.
2023-03-04 13:42:53 -06:00
Kevin Heifner a2905e7472 Merge pull request #770 from AntelopeIO/GH-659-ship-test
Test: Add a test that verifies restart from genesis not allowed
2023-03-04 13:41:28 -06:00
Kevin Heifner cf07a4e629 GH-772 Additional cleanup 2023-03-04 13:14:11 -06:00
Kevin Heifner 61173fc332 GH-772 Remove unused variables 2023-03-04 09:11:40 -06:00
Jonathan Giszczak c5e2bcc983 Remove per-node configuration of nodeos version. 2023-03-03 17:41:11 -06:00
greg7mdp 401ece1a58 Forgot to stage this file after merging 2023-03-03 18:13:52 -05:00
greg7mdp 4c93d2fafb Merge branch 'main' of github.com:AntelopeIO/leap into gh-451 2023-03-03 18:05:37 -05:00
Gregory Popovitch 447fc3c722 Merge pull request #745 from AntelopeIO/gh-643
Remove HTTPS support from nodeos & keosd
2023-03-03 17:39:39 -05:00
Clayton Calabrese 60299d5cb5 rename file passed into log_reader_tests to a proper .gz suffix 2023-03-03 15:41:35 -06:00
Clayton Calabrese a631088f4d pass along nodeos version in performance test rather than calculating in multiple places 2023-03-03 15:23:38 -06:00
Clayton Calabrese cfeaa64b41 refactor log_reader use of nodeos version so it isn't recalculated multiple times during a test run 2023-03-03 15:00:41 -06:00
greg7mdp ef17c150ea Merge branch 'main' of github.com:AntelopeIO/leap into gh-643 2023-03-03 15:57:27 -05:00
Kevin Heifner 6444b2796d GH-772 Add a fork_db_head() to consolidate db_read_mode::IRREVERSIBLE check 2023-03-03 14:55:43 -06:00
greg7mdp 837b33ef33 Address PR comment - remove unused parameter. 2023-03-03 15:49:16 -05:00
Clayton Calabrese e6bfc9e214 Add new section to log_reader_tests to ensure 2.0 compatibility doesn't get broken by changes to scrapeBlockTrxDataLog in the future. 2023-03-03 14:27:21 -06:00
jgiszczak 9e5aaf8de9 Merge pull request #538 from AntelopeIO/eosio-launcher-launch-nodeos-unshared
Launch nodeos instances per configuration, unsharing the network first.  Python launcher now used for all tests in place of eosio-launcher.
2023-03-03 14:24:36 -06:00
Jonathan Giszczak e4c20c835c Removing exception in Node pollversion to tolerate the small number of tests which use relaunch or launchcmd. 2023-03-03 13:40:16 -06:00
Jonathan Giszczak e8797dfd4f Restore an increased ctest timeout for plugin_http_api_test. 2023-03-03 11:59:36 -06:00
Lin Huang 4d4e3606b5 Merge branch main to parallel_readonly_trxs 2023-03-03 11:54:20 -05:00
Lin Huang 130fbbf804 make names better to reflect the intentions and update comments 2023-03-03 10:43:48 -05:00
Lin Huang 7d9fd3b771 remove deprecated cleos option read-only for compute_transaction 2023-03-03 10:20:38 -05:00
Peter Oschwald 1e36c5123f Update StateHistoryPluginArgs for new arguments introduced on main. 2023-03-03 09:14:12 -06:00
Kevin Heifner 629aa81aeb GH-772 Simplify fetch_block_state_by_number by using controller fork_db_head_block_id() which checks db mode. 2023-03-03 09:11:14 -06:00
greg7mdp 4ad4135fc2 Update http_pluging API definitions with lambdas taking rvalues
as specified in url_handler.
2023-03-03 10:00:00 -05:00
Kevin Heifner a215b2cd12 GH-772 Simplify fork db head interface on controller. Fixes issue with net_plugin asking for a block that should be available but is not. 2023-03-03 08:49:48 -06:00
greg7mdp 84fa8238b5 update url_handler to take rvalues. 2023-03-03 09:41:36 -05:00
greg7mdp 5613660355 Merge branch 'main' of github.com:AntelopeIO/leap into gh-451 2023-03-03 09:36:14 -05:00
Kevin Heifner 6e7d98ea2c GH-772 Remove unused methods 2023-03-03 08:34:58 -06:00
Peter Oschwald 505b5d8b4a Merge branch 'main' into feature_performance_harness_stage_2 2023-03-03 08:18:16 -06:00
greg7mdp d2a91c9398 Cleanups from PR comments. Thanks @mikelik! 2023-03-03 08:24:14 -05:00
Kevin Heifner e377339f04 GH-768 Move subjective bill log to all level of producer_plugin logger. 2023-03-03 07:10:23 -06:00
766C6164 c7a2f6130e Made schedule_snapshot params optional 2023-03-02 23:49:54 -05:00
766C6164 4be2e1cd13 Removed debug message 2023-03-02 23:41:34 -05:00
766C6164 407e0ba5fe Multiple fixes: pendings, tests, namings 2023-03-02 23:22:52 -05:00
Jonathan Giszczak 27d1430af5 Raise TimeoutError if unable to determine nodeos version. 2023-03-02 17:24:07 -06:00
ClaytonCalabrese d74575396b Merge pull request #771 from AntelopeIO/performance_harness_fix_2_0_compatibility
[PH] Repair Nodeos 2.0 Compatibility with Performance Tests
2023-03-02 17:00:04 -06:00
Kevin Heifner 558f69064b Merge pull request #764 from AntelopeIO/GH-659-ship-rollback-main
[3.2 -> main] SHiP do not truncate logs when starting from genesis
2023-03-02 16:45:04 -06:00
Jonathan Giszczak cfc122d890 Fix merge error. 2023-03-02 16:37:42 -06:00
Jonathan Giszczak c1112fcd48 Remove timeout on plugin_http_api_test.
Have waitForHeadToAdvance sleep a block interval rather than 3s.
Fix an invalid assert syntax in transactions.
2023-03-02 16:36:51 -06:00
Clayton Calabrese 480eb31260 simplify version check for resource monitor plugin constructor in performance tests 2023-03-02 15:55:22 -06:00
Kevin Heifner 993bcbae73 GH-659 Fix indentation 2023-03-02 15:53:29 -06:00
Clayton Calabrese 3f007ba932 fix introduced compatibility issues for nodeos 2.0 in performance tests 2023-03-02 15:26:25 -06:00
Kevin Heifner 05d9c4bfe5 GH-659 Add a test that verifies restart from genesis not allowed 2023-03-02 15:11:05 -06:00
Kevin Heifner d5491960f0 GH-659 Fix merge issue 2023-03-02 15:05:21 -06:00
Kevin Heifner 42f3250826 Merge remote-tracking branch 'origin/main' into GH-659-ship-rollback-main 2023-03-02 14:52:11 -06:00
greg7mdp 5e59a1709a Merge branch 'main' of github.com:AntelopeIO/leap into gh-643 2023-03-02 15:42:41 -05:00
greg7mdp 19acc7d847 Merge branch 'main' of github.com:AntelopeIO/leap into gh-451 2023-03-02 15:42:07 -05:00
Kevin Heifner 4107e46348 Merge pull request #727 from AntelopeIO/GH-627-ship
SHiP move client handling off the main thread
2023-03-02 14:39:43 -06:00
Kevin Heifner e161d29bcf Merge remote-tracking branch 'origin/main' into GH-627-ship 2023-03-02 14:11:26 -06:00
ClaytonCalabrese 397293bd80 Merge pull request #769 from AntelopeIO/performance_harness_reduce_test_db_size
[PH] Reduce Performance Test Database Size Allocation
2023-03-02 13:49:29 -06:00
Huang-Ming Huang 44f8c70d45 Merge pull request #628 from AntelopeIO/GH-592-ship-crash-split-ship-log
Merge SHiP stability fixes & log splitting & memory usage improvements
2023-03-02 13:48:42 -06:00
Clayton Calabrese 9cf5ffe5c0 set cmake test runs of performance_test_basic to a lower value for chain-state-db-size-mb to reduce allocated space 2023-03-02 13:12:17 -06:00
Huang-Ming Huang ef96d952b9 remove unnecessary using 2023-03-02 11:48:13 -06:00
Jonathan Giszczak 19dd2520de Keep Node's self.cmd up to date if a node is relaunched. 2023-03-02 11:18:07 -06:00
Jonathan Giszczak 863360411b Restore lost raise_if_missing argument from bounce/down consolidation. 2023-03-02 11:10:52 -06:00
766C6164 9178e5ef3b Handle situation where mlock_spacing is not specified 2023-03-02 11:39:20 -05:00
Huang-Ming Huang 48a4d871db Merge pull request #758 from AntelopeIO/huangminghuang/gelf-logging
move gelf logging to another thread
2023-03-02 10:35:59 -06:00
766C6164 5819266db8 Addressing feedback 2023-03-02 10:24:21 -05:00
Lin Huang 4a85352462 remove max-read-only-transaction-time option which is not neccessary 2023-03-02 10:09:50 -05:00
Peter Oschwald 85eecb0961 Update ProducerPluginArgs for new arguments introduced on main. 2023-03-02 09:01:24 -06:00
Peter Oschwald 9de88d468b Merge branch 'main' into feature_performance_harness_stage_2 2023-03-02 08:36:30 -06:00
Peter Oschwald ce4f840bfa Merge pull request #766 from AntelopeIO/ph-handle-exception
[PH] Handle exceptions occurring during runTest.
2023-03-02 08:06:59 -06:00
greg7mdp 5530a26449 Merge branch 'main' of github.com:AntelopeIO/leap into gh-643 2023-03-02 09:03:46 -05:00
greg7mdp b71a10c21a Merge branch 'main' of github.com:AntelopeIO/leap into gh-451 2023-03-02 09:02:52 -05:00
Lin Huang f14f2b36e6 Merge branch send_read_only_trx into parallel_readonly_trxs 2023-03-02 08:53:32 -05:00
Lin Huang 3c0e506959 Merge pull request #558 from AntelopeIO/send_read_only_trx
introduce new read-only transaction RPC end point
2023-03-02 08:22:50 -05:00
Lin Huang 2ae98cb29c correct bad comments about dm logging and improve error message for scheduling/cacelling deferred transactions 2023-03-02 07:53:42 -05:00
Lin Huang 4a3b81cf9a set global_action_sequence and recv_sequence to 0 for read-only transactions 2023-03-01 22:21:43 -05:00
Lin Huang 5aecde251b correct add_pending_ram_usage's handling of deep-mind logging 2023-03-01 22:19:47 -05:00
766C6164 cd0d56ab7f Make sure snapshot state preserved 2023-03-01 22:01:21 -05:00
Lin Huang d0c8046edd do not allow state-changing readonly privilege, schedualing and canceling deferred transaction host functions 2023-03-01 21:40:26 -05:00
Kevin Heifner 6080511bbe GH-592 Add comment 2023-03-01 20:20:31 -06:00
766C6164 b14fc5a4b4 Addressing feedback (2/2 minus refactoring) 2023-03-01 21:15:11 -05:00
Huang-Ming Huang 6bc3df865d address PR comments 2023-03-01 19:18:57 -06:00
Jonathan Giszczak 837a5761f1 Restore nodeosVers to performance test ClusterConfig.
Migrate node-specific version-dependent config out of ClusterConfig into
Node.
Fix Cluster killall to use Python launcher.
2023-03-01 19:11:18 -06:00
Lin Huang a7df2e7d59 Merge branch 'main' into send_read_only_trx 2023-03-01 20:01:29 -05:00
Peter Oschwald 576ba161f2 Handle excpetions occurring during runTest. 2023-03-01 18:18:03 -06:00
ClaytonCalabrese c90430b316 Merge pull request #765 from AntelopeIO/test_harness_change_performance_test_defaults
[TH] Revert Unintentional Change to Performance Test Defaults
2023-03-01 17:50:17 -06:00
Clayton Calabrese d144ac5999 revert an unintentional change ot the defaults in performance test 2023-03-01 17:19:19 -06:00
Lin Huang 06cc38e9f7 For EOS-VM-OC, make sure the system has enough virtual memory for the number of read-only transaction execution threads 2023-03-01 18:01:47 -05:00
ClaytonCalabrese 08bd7b5941 Merge pull request #762 from AntelopeIO/performance_harness_performance_test_userTrxDataFile_fix
[PH] expose --user-trx-data-file to performance test
2023-03-01 16:31:33 -06:00
Peter Oschwald de7274be4e Merge pull request #761 from AntelopeIO/ph-update-calc-threads-min
[PH] update calc threads min to give to plugins to the plugin default.
2023-03-01 16:30:06 -06:00
Kevin Heifner d24cbb1509 Merge remote-tracking branch 'origin/release/3.2' into GH-659-ship-rollback-main 2023-03-01 16:23:25 -06:00
Kevin Heifner afd52cb105 Merge pull request #737 from AntelopeIO/GH-659-ship-rollback-3.2
[3.2] SHiP do not truncate logs when starting from genesis
2023-03-01 16:22:19 -06:00
Gregory Popovitch d42b860039 Merge pull request #763 from AntelopeIO/gh-513_main
[3.2 -> main] keosd - Exit program if keosd fails to aquire wallet lock (GH #513)
2023-03-01 17:07:02 -05:00
Clayton Calabrese b152475c8f also fix linearsearch test case for performance test. 2023-03-01 16:02:27 -06:00
greg7mdp 5bdf3fb20a Revert to using code unauthorized (see PR comment). 2023-03-01 16:54:04 -05:00
Clayton Calabrese ddd64861b0 remove unneeded arg in performPtbBinarySearch 2023-03-01 15:39:54 -06:00
greg7mdp 3ec5a36a75 Merge branch 'release/3.2' of github.com:AntelopeIO/leap into gh-513_main 2023-03-01 16:39:15 -05:00
greg7mdp b62ea2b878 Address PR Comments. Return code 417 when Expect fails. 2023-03-01 16:36:38 -05:00
Gregory Popovitch 9c7b0b721e Merge pull request #756 from AntelopeIO/gh-513_rel3.2
[3.1 -> 3.2] keosd - Exit program if keosd fails to aquire wallet lock (GH #513)
2023-03-01 16:28:59 -05:00
Clayton Calabrese bad5a9bc91 expose --user-trx-data-file to performance test 2023-03-01 15:27:55 -06:00
Peter Oschwald ec5db248b7 Update the min threads to start at when calculating number of threads to give to plugins to the plugin default. 2023-03-01 15:26:10 -06:00
Huang-Ming Huang e7a1572118 avoid join called from its own thread 2023-03-01 14:21:20 -06:00
Peter Oschwald 48022c93b6 Update ChainPluginArgs to capture arguments added to chain plugin. 2023-03-01 13:03:33 -06:00
766C6164 962f0a975d Addressing feedback comments 1/2 2023-03-01 13:49:55 -05:00
Lin Huang bc7d7e2c84 use an enum to indicate which queue to post; use write queue for default queue to post; and clean up use of app().post in producer_plugin 2023-03-01 13:41:56 -05:00
greg7mdp 8d524d965f Merge branch 'main' of github.com:AntelopeIO/leap into gh-451 2023-03-01 10:33:35 -05:00
greg7mdp 96fa497a43 Merge branch 'main' of github.com:AntelopeIO/leap into gh-643 2023-03-01 10:21:44 -05:00
Huang-Ming Huang fcbdb0ae98 subjective-account-max-failures-window-size 2023-03-01 06:13:02 -06:00
Huang-Ming Huang b1b7ae76ef fix mark_bp_connection 2023-02-28 20:02:23 -06:00
Huang-Ming Huang 95852be12e address PR comments 2023-03-02 14:02:25 -06:00
Huang-Ming Huang c13777a99c address some PR comments 2023-03-01 15:16:28 -06:00
Peter Oschwald 5531d0e978 Merge branch 'main' into feature_performance_harness_stage_2 2023-02-28 19:41:24 -06:00
Kevin Heifner 248ed21b54 Merge branch 'main' into GH-592-ship-crash-split-ship-log 2023-02-28 19:31:01 -06:00
ClaytonCalabrese e6b2a4ec7e Merge pull request #740 from AntelopeIO/performance_harness_nodeos_config_options
[PH] Expose various Nodeos Options in performance_test_basic
2023-02-28 18:58:53 -06:00
Jonathan Giszczak 4e9a7ec8ec Remove use of eosio-launcher in Cluster killall(). 2023-02-28 18:32:08 -06:00
Huang-Ming Huang a28e873134 Merge pull request #532 from AntelopeIO/huangminghuang/block_log
Add block log partition functionality
2023-02-28 17:57:34 -06:00
Jonathan Giszczak b84b293e08 Consolidate bounce and down implementations in launcher. 2023-02-28 17:33:26 -06:00
Jonathan Giszczak 7c009bb934 Spacing. 2023-02-28 17:32:56 -06:00
Clayton Calabrese 7075447265 add fix for duplicate transaction in transaction generators when resigning transactions 2023-02-28 17:28:03 -06:00
Clayton Calabrese 0fbdbfa4e0 merge from dev branch 2023-02-28 16:15:39 -06:00
766C6164 2eae5267eb Updated yaml formatting 2023-02-28 16:43:31 -05:00
Lin Huang 64aee92db8 make wasmif in controller and executor in eosvmoc_runtime as default member to allow multiple controllers in unittest 2023-02-28 16:22:27 -05:00
Huang-Ming Huang c5b6b0dcc2 More merge fix 2023-02-28 15:00:36 -06:00
Vlad ca1a8d3ad7 Merge branch 'main' into snapshot-api 2023-02-28 15:40:56 -05:00
Clayton Calabrese 0d30973b85 rename eos-vm-oc-enable in performance test to represent it only affecting non producer nodes. Resolve related test failure. 2023-02-28 14:39:06 -06:00
Huang-Ming Huang 76816a83aa address PR comments 2023-02-28 14:21:05 -06:00
Peter Oschwald a5adbda94f Merge pull request #734 from AntelopeIO/ph2-update-docs
[PH] Update docs
2023-02-28 14:06:12 -06:00
Kevin Heifner eddd8373b5 GH-659 Add additional comments 2023-02-28 13:51:08 -06:00
Peter Oschwald 078197250d Update reports in readme. 2023-02-28 13:36:13 -06:00
766C6164 21630d3a5c Added second snapshot request to test 2023-02-28 13:05:23 -05:00
Peter Oschwald cdc00a2385 Merge branch 'feature_performance_harness_stage_2' into ph2-update-docs 2023-02-28 11:09:45 -06:00
ClaytonCalabrese 62126c6482 Merge pull request #757 from AntelopeIO/performance_harness_resolve_duplicate_transaction_ids
[PH] Resolve Duplicate Transaction ID Generation in Transaction Generator
2023-02-28 10:36:28 -06:00
Peter Oschwald 2940d5aa92 Updates per peer review. 2023-02-28 10:18:19 -06:00
greg7mdp 715cd765df Remove reference to http_client_plugin page, which was removed. 2023-02-28 10:30:56 -05:00
Chris Gundlach a88bf8d9fd updates based on feedback from pr 2023-02-28 08:08:27 -06:00
greg7mdp dc66574b2d remove http_client_plugin doc (unneeded after https removal) 2023-02-28 08:59:56 -05:00
Huang-Ming Huang 3b2c22d240 address PR comments 2023-02-27 21:58:09 -06:00
Huang-Ming Huang f3b5c74cc8 more merge issue fix 2023-02-27 21:57:15 -06:00
Huang-Ming Huang 21d988d279 some more merge issue fix 2023-02-28 11:52:52 -06:00
Huang-Ming Huang c5010d9df3 fix merge problem 2023-02-28 11:44:17 -06:00
Huang-Ming Huang a6872c8e84 Merge branch 'main' into huangminghuang/block_log
# Conflicts:
#	libraries/appbase
#	libraries/chain/abi_serializer.cpp
#	libraries/chain/include/eosio/chain/abi_serializer.hpp
#	plugins/chain_plugin/chain_plugin.cpp
2023-02-28 10:10:34 -06:00
Lin Huang be0054bb3c do not enforce max_action_return_value_size for read-only transactions 2023-02-27 17:54:10 -05:00
Clayton Calabrese 1ce9036357 change enable args in performance_test_basic to be store_true instead of bools. Put eos-vm-oc-enable in ptb only onto non producer nodes. Remove duplicate choice in wasm-runtime 2023-02-27 16:36:38 -06:00
Jonathan Giszczak 021597ff7b Fix timing issue in compute_transaction_test. 2023-02-27 15:44:57 -06:00
Clayton Calabrese 6dfb66edaa resolve test failure for ram and cpu performance tests due to id collision 2023-02-27 15:44:53 -06:00
Lin Huang 655c1c58da move custom_appbase from under plugin to under libraries directory 2023-02-27 16:42:51 -05:00
Huang-Ming Huang 63de610175 remove unnecessary return 2023-02-27 15:24:01 -06:00
Huang-Ming Huang 5d0abaf7a2 move gelf logging to another thread 2023-02-27 15:11:35 -06:00
Lin Huang c6df34b1e1 make multi-threaded eos-vm-oc work 2023-02-27 16:08:26 -05:00
Lin Huang 4e04ff329c add an optional init function to be called when a thread is started 2023-02-27 16:06:14 -05:00
Jonathan Giszczak cac4714b9c Fix timing issue in cli_test. 2023-02-27 14:18:32 -06:00
Huang-Ming Huang 733c6057bb fix typo 2023-02-27 12:56:47 -06:00
Huang-Ming Huang e49e1a8909 revert catching fc::exception 2023-02-27 12:50:09 -06:00
Huang-Ming Huang 3617b438b6 address PR comments 2023-02-27 12:27:24 -06:00
Clayton Calabrese 93f7a50d1f add a sanity check for number of transactions scraped from trx gen 2023-02-27 11:57:59 -06:00
greg7mdp 9892f9abf7 Merge branch 'release/3.1' of github.com:AntelopeIO/leap into gh-513_rel3.2 2023-02-27 10:44:29 -05:00
Gregory Popovitch 4957dd5b63 Merge pull request #755 from AntelopeIO/gh-530_main
[3.2 -> main] Avoid logging errors when client disconnects after request (GH #530)
2023-02-27 10:39:47 -05:00
Gregory Popovitch ecc5c4ec11 Merge pull request #754 from AntelopeIO/gh-513_rel3.1
[3.1] keosd - Exit program if keosd fails to aquire wallet lock (GH #513)
2023-02-27 10:39:15 -05:00
Huang-Ming Huang e95ae9c239 address PR comments 2023-02-27 09:28:34 -06:00
Kevin Heifner 06a8032662 Merge pull request #752 from AntelopeIO/GH-659-log
Move initialization of logging before plugin_initialize
2023-02-27 08:05:53 -06:00
Lin Huang 4f9baf57c6 revert thread_ids() method 2023-02-27 09:04:47 -05:00
greg7mdp 91f689483f Merge branch 'release/3.2' of github.com:AntelopeIO/leap into gh-530_main 2023-02-25 19:30:06 -05:00
Alexander Molchevsky 34cda2a910 Merge pull request #751 from AntelopeIO/update_bios_boot_tutorial_main
[3.2 -> main] New protocol features activation was added to the bootstrap process
2023-02-26 00:49:32 +02:00
greg7mdp caa01ca443 main() should return if appbase initialization fails. 2023-02-25 14:39:25 -05:00
Kevin Heifner 9755a45304 GH-659 get_name() returns by value which removes the need for this comment. 2023-02-25 12:36:16 -06:00
Kevin Heifner 6e9e2edd59 GH-659 Change name() to get_name() that returns by value. This prevents accident use of returned const& after logger has been destroyed. 2023-02-25 12:35:50 -06:00
Kevin Heifner 9255393bac GH-659 resource monitor test assumes this is logged, but runs with info level logging. 2023-02-25 12:33:19 -06:00
Kevin Heifner 2c0b46f70f GH-659 Move initialization of logging before plugin_initialize so configured logging works as expected 2023-02-24 21:33:55 -06:00
Gregory Popovitch e226e464c3 Merge pull request #750 from AntelopeIO/gh-530-rel3.2
[3.2] Avoid logging errors when client disconnects after request (GH #530)
2023-02-24 21:52:33 -05:00
Lin Huang ba66693ace simplify thread data by using thread_local for timer and wasm_alloc 2023-02-24 17:52:56 -05:00
Alexander Molchevsky 3cc87ef0af Merge remote-tracking branch 'origin/release/3.2' into update_bios_boot_tutorial_main
Merge updates
2023-02-25 00:44:45 +02:00
Jonathan Giszczak 75caa12f25 Add dependency resolver for protocol features. 2023-02-24 16:30:24 -06:00
Gregory Popovitch 84cd370504 Merge branch 'release/3.2' into gh-530-rel3.2 2023-02-24 17:03:40 -05:00
Huang-Ming Huang aff761c7b4 address PR comment 2023-02-24 15:48:34 -06:00
greg7mdp 3b4c66ba50 Silently close connection upon receiving asio::error::connection_reset 2023-02-24 16:34:11 -05:00
Clayton Calabrese a13f48ba3c merge from main and rerun generate_nodeos_plugin_args 2023-02-24 13:17:55 -06:00
Clayton Calabrese 181fe40036 Merge branch 'main' into feature_performance_harness_stage_2 2023-02-24 11:33:57 -06:00
Alexander Molchevsky 1dea8a9e3d Merge pull request #748 from AntelopeIO/update_bios_boot_tutorial3.2
Backport to 3.2 of bootstrap new protocol features activation
2023-02-24 17:40:57 +02:00
Alexander Molchevsky a6c1e92aea Merge remote-tracking branch 'origin/release/3.1' into update_bios_boot_tutorial3.2
Merge updates
2023-02-24 17:00:54 +02:00
Huang-Ming Huang 90cdd6741f change file mode 2023-02-24 08:34:20 -06:00
Alexander Molchevsky 3e585d0f8a Merge pull request #747 from AntelopeIO/update_bios_boot_tutorial3.1
Backport to 3.1 of bootstrap new protocol features activation
2023-02-24 12:38:21 +02:00
Jonathan Giszczak cd40443f94 Get nodeos version in Node either on init or launch. 2023-02-23 19:32:54 -06:00
Alexander Molchevsky 967ab869e0 Backport to 3.1 of bootstrap new protocol features activation 2023-02-24 00:42:48 +02:00
greg7mdp d16743f120 fix test failure (keosd_auto_launch_test.py) 2023-02-23 17:05:40 -05:00
greg7mdp f65b2ec92b fixup! Update whitespace to avoid diff in PR. 2023-02-23 16:26:40 -05:00
greg7mdp 201793adb8 Update whitespace to avoid diff in PR. 2023-02-23 16:25:10 -05:00
greg7mdp b657fc6eb7 revert removal of OPENSSL_ROOT_DIR in top CMakeLists.txt. 2023-02-23 16:23:00 -05:00
greg7mdp e3c6016bd4 Merge branch 'main' of github.com:AntelopeIO/leap into gh-643 2023-02-23 16:05:05 -05:00
greg7mdp e88ccece3f remove https options from docs. 2023-02-23 16:03:20 -05:00
Clayton Calabrese 481811969e fix some README issues in performance test 2023-02-23 14:55:50 -06:00
Clayton Calabrese dcd8bc6df1 Restore accidentally removed config option. Added new option and updated README. Use choices for wasm-runtime. Add new options to the *Args constructors in both performance tests. 2023-02-23 14:52:42 -06:00
greg7mdp d2e38e2ef5 remove HTTPS support from libfc in http_client.
Also remove `OpenSSL::SSL` from libraries/libfc/CMakeLists.tx.
2023-02-23 15:51:54 -05:00
greg7mdp ad6a0969df remove HTTPS support from http_client_plugin 2023-02-23 15:19:51 -05:00
greg7mdp 43f6dca8f5 remove HTTPS support from http_plugin. 2023-02-23 15:17:37 -05:00
Huang-Ming Huang 150c18c34f rename auto-bp-peer to p2p-auto-bp-peer 2023-02-23 14:04:29 -06:00
Huang-Ming Huang 826cf9905b fix test 2023-02-23 13:40:17 -06:00
Huang-Ming Huang 1dc4ff8cd8 Merge branch 'main' into huangminghuang/auto-bp-peer 2023-02-23 13:05:38 -06:00
Kevin Heifner a3e0756474 Merge pull request #742 from AntelopeIO/GH-741-abi-serializer
Revert interface change of abi_serializer for tester
2023-02-23 11:23:12 -06:00
Lin Huang 36f89c71e1 add tests for parallelizing read-only thransaction execution 2023-02-23 12:15:09 -05:00
Lin Huang 88322f7d6b update test contract for read-only transaction testing 2023-02-23 12:14:19 -05:00
Lin Huang 23b5f27c3c main work of parallelizing read-only thransaction execution 2023-02-23 12:13:35 -05:00
Lin Huang d6947eff58 Make chainApis and NetApis safe to multithreaded read-only transactions 2023-02-23 12:11:47 -05:00
Lin Huang d181cacf46 add support to specify which execution queue to post an RPC API 2023-02-23 12:08:05 -05:00
Clayton Calabrese 2952699ebc Merge branch 'feature_performance_harness_stage_2' into performance_harness_nodeos_config_options 2023-02-23 11:07:38 -06:00
ClaytonCalabrese 8a0adc4b18 Merge pull request #713 from AntelopeIO/performance_harness_eos_mechanics
[PH] Use EOSMechanics contract with Performance Test
2023-02-23 11:06:45 -06:00
Lin Huang 02ddc0375e update to use new app().executor().post() 2023-02-23 12:03:57 -05:00
Lin Huang 5716438cea simplify execution window setting and checking APIs 2023-02-23 11:59:49 -05:00
Kevin Heifner e9b6c9ee21 GH-659 Allow truncate call when before begin_block otherwise rollback past prune does not work. Added additional test cases. 2023-02-23 10:30:57 -06:00
766C6164 82ae03985d Included light boost integration test 2023-02-23 09:39:49 -05:00
greg7mdp cbcad80c61 Update whitespace to the PR doesn't show a diff for CMakeLists.txt 2023-02-23 09:22:35 -05:00
greg7mdp ab7c555879 Remove boost warning suppression as requested by Matt in PR review 2023-02-23 09:20:43 -05:00
Kevin Heifner b4f18d5d20 GH-741 Don't std::move abi since it is used after. 2023-02-23 07:58:58 -06:00
Kevin Heifner f6d51f1989 GH-741 Reverted interface change to deprecated methods. Changed from rvalue reference to value so backward compatible for those using abi_serializer via tester. 2023-02-23 07:31:57 -06:00
Matt Witherspoon 505bae8ef3 Merge pull request #739 from AntelopeIO/remove_unused_boostbind_header
remove unused boost/bind.hpp include that generates a warning
2023-02-22 20:16:02 -05:00
Clayton Calabrese db73142095 Expose a number of nodeos options via the CLI in performance_test_basic. Also hardcode some others. 2023-02-22 18:24:25 -06:00
Matt Witherspoon dcbb111741 remove unused boost/bind.hpp include that generates a warning 2023-02-22 17:53:36 -05:00
Kevin Heifner 4b7e8274c7 GH-659 Skip writing to ship log if log already contains block 2023-02-22 16:14:59 -06:00
Clayton Calabrese b1ce2718b7 re-report the readme report due to changes, and update performance test to accomodate chanes 2023-02-22 15:40:31 -06:00
greg7mdp a5997fe0ee Complete basic unit tests.
This test exercises both basic http 1.0 protocol, and the Expect "100-continue" from http 1.1.
2023-02-22 16:30:32 -05:00
Lin Huang b46629b9d0 make controller threaded safe for read-only transaction execution 2023-02-22 16:24:54 -05:00
Lin Huang 33c09d385e add a missing custom_appbase change for unittests 2023-02-22 16:23:49 -05:00
Kevin Heifner 4dd5651a11 GH-659 Do not allow truncate back to genesis 2023-02-22 15:12:07 -06:00
Clayton Calabrese 97a8d1299f merge from feature branch 2023-02-22 14:29:47 -06:00
Clayton Calabrese fd0c702d18 remove unavailable options from README for performance test 2023-02-22 14:20:25 -06:00
Peter Oschwald 4f90bf6ff0 Update log directory structure example. 2023-02-22 14:18:16 -06:00
Kevin Heifner f6f93c0a0a Merge pull request #728 from AntelopeIO/GH-723-json-optimization
Optimize json parsing
2023-02-22 14:12:32 -06:00
Clayton Calabrese 3f191a9adc update transaction datafiles to match new eosio.mechanics directory layout 2023-02-22 14:11:03 -06:00
ClaytonCalabrese 5980ed3431 Merge pull request #731 from AntelopeIO/performance_harness_shutdown_trxgenlauncher
[PH] Add TransactionGeneratorLauncher to TestHelper Shutdown
2023-02-22 13:48:44 -06:00
Lin Huang 60bf50dc64 add thread_ids method to return thread IDs of the threads in a thread pool 2023-02-22 13:50:41 -05:00
Clayton Calabrese c15ed53794 remove unused import 2023-02-22 12:43:10 -06:00
Clayton Calabrese 1935103562 remove shutdown change from nodeos_startup_catchup 2023-02-22 12:42:38 -06:00
Clayton Calabrese 2fd6ad6057 Unwind shutdown changes as cluster killall will handle the transactiongeneratorlauncher now that it is set 2023-02-22 12:37:52 -06:00
Peter Oschwald 3fe0fdf357 Update docs for trx_generator README. 2023-02-22 12:19:51 -06:00
Lin Huang df2060fcca add read-only trx parallelization configuration options 2023-02-22 13:16:16 -05:00
766C6164 f1affa6b8e Hook snapshot generation to block_start 2023-02-22 12:48:16 -05:00
Peter Oschwald 97ed6b6118 Update test report examples in README. 2023-02-22 11:31:41 -06:00
Peter Oschwald fd4cdbd52c Update README for new command line arguments to Performance Harness scripts. 2023-02-22 11:18:14 -06:00
Kevin Heifner 8d13c2aae1 GH-723 Avoid potential temporary 2023-02-22 10:34:05 -06:00
Kevin Heifner 90e773a370 GH-723 Use using to make less verbose. 2023-02-22 10:03:18 -06:00
Lin Huang 0b1b2a26eb customize appbase to support two queue executor in Leap, add tests, update Leap to use the cusomized appbase 2023-02-22 10:18:12 -05:00
Kevin Heifner ba6b9a95db Merge pull request #729 from AntelopeIO/GH-721-test
Test: Provide a bit more time for the contract to be cached.
2023-02-22 07:54:41 -06:00
Huang-Ming Huang 08f614c121 Add auto bp peering functionality 2023-02-22 01:51:40 -06:00
Clayton Calabrese a2ee13ad39 rearrange shutdown arguments to accomodate the 20 or so tests using shutdown without keyword arguments 2023-02-21 20:40:44 -06:00
Jonathan Giszczak f759571449 Bring cluster bootstrap into line with bios_boot.sh.
Default to using cluster boostrap rather than shell script.
Tolerate dots in integration test names.
Relocate urllib support to queries.py, highest inheritance hierarchy
level it is used.
Miscellaneous code cleanup.
To enable heterogenous clusters:
-  Self-configure Node version per node.
-  Activate protocol features supported by lowest version node.
2023-02-21 18:49:30 -06:00
Lin Huang b160db9044 Merge branch 'main' into send_read_only_trx 2023-02-21 19:27:15 -05:00
Gregory Popovitch b8cb13ffdd Merge pull request #732 from AntelopeIO/appbase_executor
Update leap to use new appbase version.
2023-02-21 18:14:44 -05:00
greg7mdp 8d300377d5 update to the latest appbase version 2023-02-21 17:39:34 -05:00
Clayton Calabrese 1cf32d615d give ability to cleanup transaction generator in TestHelper shutdown 2023-02-21 15:42:48 -06:00
Clayton Calabrese 074471b413 address PR comment to make contracts folder consistent. 2023-02-21 15:40:45 -06:00
Kevin Heifner 94424bf5c3 GH-721 Provide a bit more time for the contract to be cached. 2023-02-21 13:59:00 -06:00
greg7mdp 9d737860c0 Fix issues when using new appbase 2023-02-21 14:30:17 -05:00
Kevin Heifner 7e22fed30d GH-627 Add const as request in peer review 2023-02-21 13:26:57 -06:00
Kevin Heifner ee77041529 GH-723 Optimize json parsing by using boost stream and std::string instead of std::stringstream 2023-02-21 13:06:26 -06:00
greg7mdp af23774f13 update http_plugin test to test the Expect 100-continue support 2023-02-21 14:00:00 -05:00
766C6164 34612f2dab Little refactoring 2023-02-21 11:05:27 -05:00
Kevin Heifner 5a94445f3f Merge branch 'GH-592-ship-crash-split-ship-log' into GH-627-ship 2023-02-21 09:53:34 -06:00
Kevin Heifner d12726c58f Merge branch 'huangminghuang/block_log' into GH-592-ship-crash-split-ship-log 2023-02-21 09:07:28 -06:00
Kevin Heifner a642ad3071 Create index on hard-replay 2023-02-21 08:36:07 -06:00
Lin Huang 251c2a31d9 Merge branch 'main' into send_read_only_trx 2023-02-21 09:35:33 -05:00
ClaytonCalabrese 6e5cb4a67c Merge pull request #720 from AntelopeIO/performance_harness_capture_arg_string
[PH] Capture Full Command Line Argument String in Report
2023-02-20 19:05:14 -06:00
Clayton Calabrese 8f75c30e2e add ram performance test. Rework how keys are put into contract account for performance test. revert the reversion of the setupWallet change 2023-02-20 16:14:05 -06:00
Chris Gundlach 86791fe7cc updated named_thread_pool usage 2023-02-20 15:34:34 -06:00
Kevin Heifner 0d497be7c5 Update tests for block_log not auto re-creating index file. 2023-02-20 15:02:55 -06:00
Kevin Heifner 051546bfc2 Update block_log to handle case of a block_log with no blocks 2023-02-20 15:02:14 -06:00
Kevin Heifner fa61e5c475 GH-627 Fix merge issue 2023-02-20 13:08:19 -06:00
Kevin Heifner 16c2a92432 Merge branch 'GH-592-ship-crash-split-ship-log' into GH-627-ship 2023-02-20 13:03:30 -06:00
Kevin Heifner bd664892b3 Merge branch 'huangminghuang/block_log' into GH-592-ship-crash-split-ship-log 2023-02-20 12:58:14 -06:00
Kevin Heifner 06b6d651b3 Merge remote-tracking branch 'origin/main' into huangminghuang/block_log 2023-02-20 12:48:25 -06:00
Kevin Heifner 707e72f8db GH-627 Additional cleanup 2023-02-20 12:43:24 -06:00
Kevin Heifner a79358fd61 GH-627 Add more than one client to get better test coverage 2023-02-20 12:42:59 -06:00
Chris Gundlach 4c6de84598 Merge branch 'main' into feature_prometheus_plugin 2023-02-20 10:33:43 -06:00
Christopher Gundlach 24d9998f55 Merge pull request #722 from AntelopeIO/prom_instrument_api
Added instrumentation for number of calls to api endpoint
2023-02-20 09:56:36 -06:00
Chris Gundlach 2282b7bac1 took out cmake dependencies on chain_plugin 2023-02-20 09:55:02 -06:00
766C6164 8301c6bd7b Improved data structures 2023-02-19 22:16:49 -05:00
Kevin Heifner f0b44752c4 GH-627 Add logging of connection info 2023-02-18 15:42:17 -06:00
Clayton Calabrese 726a0333e7 rerun test and update readme 2023-02-17 19:28:21 -06:00
Kevin Heifner 897e950c4b GH-627 Cleanup and optimization 2023-02-17 15:14:31 -06:00
Clayton Calabrese 270ea091f9 improve visibility of TypeErrors and still output JSON when one occurs 2023-02-17 14:44:10 -06:00
Clayton Calabrese e27ebfa1b8 revert a number of inadvertant whitespace changes due to removed code from merge. Fix printing of account type in json. 2023-02-17 13:49:15 -06:00
Kevin Heifner a2aecb3e23 GH-627 Refactor state_history_plugin to use a session_manager. The session_manager is used to coordinate sending since only one session can access the trace/delta log files at a time. 2023-02-17 10:55:09 -06:00
Kevin Heifner 4d31b149ff GH-627 Optimize empty() 2023-02-17 10:51:23 -06:00
Jonathan Giszczak 2dd3a18235 Add log messages, remove cruft and commented code. 2023-02-16 20:13:04 -06:00
greg7mdp 37f0b285b4 wip 2023-02-16 19:19:35 -05:00
greg7mdp 52cfbd8346 wip 2023-02-16 19:10:08 -05:00
greg7mdp 210b884ffe wip - http_plugin unit tests 2023-02-16 18:55:11 -05:00
Clayton Calabrese 5a67397e1c reduce size of specifiedContract through use of .account 2023-02-16 17:10:08 -06:00
Clayton Calabrese 724ba6cdae readd test-duration-sec to cpu performance test, remove lingering commas, set back assert in trx_generator main 2023-02-16 16:29:44 -06:00
Clayton Calabrese 96ae1ec49a revert some no longer necessary changes following merge and resolve test failures in doing so. 2023-02-16 15:48:43 -06:00
Huang-Ming Huang a7a401edb2 Merge pull request #724 from AntelopeIO/huangminghuang/update-bn256
merge bn256 submodule change
2023-02-16 15:29:13 -06:00
Huang-Ming Huang 71378b9b1a remove fix-irreversible_block option 2023-02-16 15:12:28 -06:00
Huang-Ming Huang 679b2053a0 merge bn256 submodule change 2023-02-16 13:10:49 -06:00
Clayton Calabrese 94d4b4be24 add missing cpuTrxData.json file 2023-02-16 11:03:18 -06:00
Chris Gundlach 8f84257950 added url to count metric 2023-02-16 10:22:37 -06:00
Chris Gundlach 12ec8ece1d added metrics tracking for api calls 2023-02-16 09:59:49 -06:00
mikelik 2f9903033a Merge pull request #718 from AntelopeIO/mikelik/valgrind_fix_low
Change INCBIN to INCTXT for abi in tests to fix invalid read
2023-02-16 16:55:19 +01:00
Kevin Heifner 9283b46856 Merge pull request #715 from AntelopeIO/GH-669-ship-main
[3.2 -> main] Fix SHiP stability
2023-02-16 07:04:34 -06:00
Michal Lesiak 3364a714a1 Change INCBIN to INCTXT for abi to add trailing null terminator and fix invalid read 2023-02-16 11:38:44 +01:00
Michal Lesiak fe98d62640 Increase vectors used in testing by 1 to fix invalid read 2023-02-16 11:38:44 +01:00
766C6164 46502e5814 Added execution handlers, several updates 2023-02-15 21:38:52 -05:00
Clayton Calabrese 1b77051987 improve reporting for command line in performance tests. Replace README output with new data. 2023-02-15 16:47:33 -06:00
Clayton Calabrese d00908e0f4 add variable to be saved in report which captures arg string in full 2023-02-15 16:18:44 -06:00
766C6164 2aad1dcaef Work in progress, moved things around 2023-02-15 16:47:26 -05:00
Kevin Heifner d8485297bb GH-627 WIP moving ship sending off main thread 2023-02-15 15:15:43 -06:00
Clayton Calabrese 06c418e813 merge from feature branch 2023-02-15 14:16:47 -06:00
greg7mdp 986dc8f388 Start implementing http_plugin unit tests 2023-02-15 13:23:20 -05:00
Kevin Heifner 077f4fbf93 GH-627 Add empty() method to sha256 2023-02-15 11:03:12 -06:00
greg7mdp 8bb930c87b Merge branch 'main' of github.com:AntelopeIO/leap into gh-451 2023-02-15 10:46:40 -05:00
Kevin Heifner 165e72ff95 GH-627 Update net_plugin to use new thread-safe block retrieval methods. 2023-02-15 09:17:37 -06:00
Kevin Heifner 84e8facc78 GH-627 Make get_block_id_from_num thread-safe. 2023-02-15 09:16:50 -06:00
Kevin Heifner dd59a99722 Merge pull request #696 from AntelopeIO/GH-677-get-block
Move get_block abi serialization off the main thread
2023-02-15 07:24:13 -06:00
Lin Huang 0dee765de8 Merge pull request #717 from AntelopeIO/bump_to_latest_appbase
bump appbase to the latest version for fixing test failures
2023-02-14 17:29:01 -05:00
Lin Huang 8adaef4cf0 bump appbase to the latest version for fixing test failures 2023-02-14 16:42:28 -05:00
Kevin Heifner 8a176e9ec5 GH-627 Make block_log thread safe 2023-02-14 15:35:13 -06:00
Jonathan Giszczak aaaa31184b Fix merge error. 2023-02-14 13:37:39 -06:00
Kevin Heifner f79b1a21c7 Merge remote-tracking branch 'origin/main' into GH-627-ship 2023-02-14 09:06:02 -06:00
766C6164 576143901a Added ut to a snapshot scheduler 2023-02-13 21:47:22 -05:00
Kevin Heifner 6f9ad52fbb Merge pull request #704 from AntelopeIO/GH-395-resource-monitor
Add absolute value threshold to resource monitor
2023-02-13 20:10:18 -06:00
Jonathan Giszczak e7a7f211a5 Fix merge errors.
Partially lost conversion to pathlib.
2023-02-13 17:01:23 -06:00
Jonathan Giszczak 3c78db6777 Stop using deprecated boost resolver overload.
Boost authors, in their infinite wisdom, have written different default
resolver flags across overloads which take the same parameters at
different layers in the API.
2023-02-13 16:35:08 -06:00
Clayton Calabrese d35b2f9515 merge from dev branch 2023-02-13 16:21:05 -06:00
Peter Oschwald 8a1fecd9a7 Merge pull request #702 from AntelopeIO/ph-gen-newaccounts
[PH] Transaction Generator support generating newaccount transactions
2023-02-13 16:02:08 -06:00
Peter Oschwald f25de1b5a8 Addressing peer review comments. 2023-02-13 15:34:21 -06:00
Peter Oschwald 239fa1fdc8 Addressing peer review comments. 2023-02-13 14:09:20 -06:00
greg7mdp c9df8e9f1b small cleanups 2023-02-13 13:25:24 -05:00
Jonathan Giszczak ac8002b2d1 nodeosLogPath still a string, not a pathlib Path. 2023-02-13 12:21:03 -06:00
greg7mdp 016183a467 Complete support for "100-continue" 2023-02-13 13:08:11 -05:00
Peter Oschwald 66fc7ddeec Correct the default priv keys to be valid key format. 2023-02-13 12:04:40 -06:00
Peter Oschwald 4384455481 Make private helper to protect usage. 2023-02-13 12:03:59 -06:00
Peter Oschwald 77ba8eacfe Fix typo in argument. 2023-02-13 11:42:34 -06:00
Peter Oschwald dd4fb9143f Add commentary and unit tests for account name generator. 2023-02-13 11:20:10 -06:00
Peter Oschwald 73105095a5 Merge pull request #712 from AntelopeIO/gh711-update-missing-python-dep
GH-711 Update dependencies to include numpy.
2023-02-13 08:51:14 -06:00
Kevin Heifner d0be3b93ef Merge remote-tracking branch 'origin/release/3.2' into GH-669-ship-main 2023-02-13 06:29:43 -06:00
Kevin Heifner 3ee279a10d Merge pull request #714 from AntelopeIO/GH-669-ship
[3.2] Fix SHiP stability
2023-02-13 06:29:04 -06:00
Kevin Heifner 8fa412616e Merge pull request #710 from AntelopeIO/GH-695-dirty-db-main
[3.2 -> main] Fix reporting of dirty db
2023-02-13 06:01:24 -06:00
Jonathan Giszczak ec5681d775 Enum class _generate_next_value can't be staticmethod on older Pythons 2023-02-13 01:24:03 -06:00
Jonathan Giszczak 9837593164 Omit typing not understood on most platforms. 2023-02-13 00:20:51 -06:00
766C6164 b1654c9763 wip schedule/unschedule to update json db 2023-02-12 20:46:41 -05:00
766C6164 5ee9f0f3d0 intermediate commit to sync changes 2023-02-12 01:03:44 -05:00
Kevin Heifner c42d216143 Merge branch 'release/3.2' into GH-669-ship 2023-02-11 19:17:40 -06:00
Clayton Calabrese 1ca46a897c add eosiomechanics cpu run to performance test basic 2023-02-10 19:13:48 -06:00
Jonathan Giszczak e0f14275f5 Implement support for generating logging.json.
Add support for --logging-level, --logging-level-map, is-nodeos_v2
Fix remaining merge error.
2023-02-10 18:58:50 -06:00
greg7mdp 2fda9e983e wip - fix issue with regular request 2023-02-10 18:04:04 -05:00
Huang-Ming Huang 86ba65b852 make split log safer 2023-02-10 16:37:55 -06:00
greg7mdp 9a1fd644ad wip - 100-continue works but not regular request. 2023-02-10 17:21:37 -05:00
Huang-Ming Huang 4fc996d0a0 remove memory mapped file 2023-02-10 15:56:19 -06:00
Peter Oschwald 56863d0f69 Address additional peer review comments. 2023-02-10 15:44:15 -06:00
Peter Oschwald 12868230fb Address peer review comment. Virtual destructor added. 2023-02-10 15:29:34 -06:00
Huang-Ming Huang 273a4a2fdf Merge branch 'huangminghuang/block_log' into GH-592-ship-crash-split-ship-log
# Conflicts:
#	libraries/chain/include/eosio/chain/log_catalog.hpp
#	libraries/chain/include/eosio/chain/log_data_base.hpp
#	libraries/chain/include/eosio/chain/log_index.hpp
2023-02-10 14:57:32 -06:00
Peter Oschwald d14493b75a GH-711 Update dependencies to include numpy.
Was already in unpinning build instructions but missing for pinned builds and overarching requirements in readme.
2023-02-10 14:31:49 -06:00
Peter Oschwald 24e376cf87 Additional peer review comments being addressed. 2023-02-10 13:51:14 -06:00
Huang-Ming Huang b2c8fb8f72 address some more PR comments 2023-02-10 13:20:55 -06:00
Peter Oschwald 1ad0888997 Address some peer review comments. 2023-02-10 13:19:45 -06:00
Peter Oschwald 0dc7b3ae58 Rename id to generator_id to be more specific. 2023-02-10 13:04:45 -06:00
Huang-Ming Huang 82bcada40a updated based on PR #628 2023-02-10 12:47:12 -06:00
Huang-Ming Huang 422878fb11 Merge branch 'main' into huangminghuang/block_log 2023-02-10 12:16:34 -06:00
Huang-Ming Huang 3edbfdda74 remove memory mapped file usage 2023-02-10 12:16:08 -06:00
Kevin Heifner 5eff003966 Merge remote-tracking branch 'origin/release/3.2' into GH-695-dirty-db-main 2023-02-10 09:54:55 -06:00
Kevin Heifner 91720b8f74 Merge pull request #708 from AntelopeIO/GH-695-dirty-db-3.2
[3.1 -> 3.2] Fix reporting of dirty db
2023-02-10 09:54:30 -06:00
Kevin Heifner 305f41b7c6 GH-395 Avoid overflow 2023-02-10 09:34:40 -06:00
Kevin Heifner d47c760921 GH-395 Log values in GiB instead of Bytes. Other misc minor cleanup. 2023-02-10 09:27:18 -06:00
Kevin Heifner 30e99e66c2 Merge remote-tracking branch 'origin/main' into GH-395-resource-monitor 2023-02-10 08:28:11 -06:00
Kevin Heifner 5169a113bd Merge remote-tracking branch 'origin/release/3.1' into GH-695-dirty-db-3.2 2023-02-10 08:17:37 -06:00
Kevin Heifner 0d977585ce Merge pull request #700 from AntelopeIO/GH-695-dirty-db-3.1
[3.1] Fix reporting of dirty db
2023-02-10 08:15:54 -06:00
Peter Oschwald 3c6bb070d0 Merge branch 'feature_performance_harness_stage_2' into ph-gen-newaccounts 2023-02-09 15:16:15 -06:00
Peter Oschwald 938d4abc53 Merge branch 'main' into feature_performance_harness_stage_2 2023-02-09 15:13:30 -06:00
Peter Oschwald f6f56e5c5d Fix logic in log_transactions.
Now that default contract is loaded to eosio again, it teased out a logic error here.  Should be 'or' not 'and'.
2023-02-09 14:31:13 -06:00
Peter Oschwald 299c9e9ee0 Fix Cluster's arguments for TransactionGeneratorsLauncher. 2023-02-09 10:53:00 -06:00
Peter Oschwald 310e6b8de7 Make actions data and auths const. 2023-02-09 10:52:39 -06:00
Lin Huang 424a0a7fe2 Merge pull request #705 from AntelopeIO/bump__to_latest_appbase
bump appbase to the latest for clang compile errors
2023-02-09 11:19:34 -05:00
Peter Oschwald 68fe107e1a Apply nonparallelizable_tests flag to new tests. 2023-02-09 10:08:32 -06:00
Lin Huang e9ef2026be bump appbase to the latest for clang compile errors 2023-02-09 10:45:00 -05:00
Peter Oschwald 7d250f6866 Merge branch 'feature_performance_harness_stage_2' into ph-gen-newaccounts 2023-02-09 09:30:14 -06:00
Peter Oschwald 3022c7c9f7 Fix validate_nodeos_plugin_args test by updating NetPlugingArgs default. 2023-02-09 09:21:19 -06:00
Kevin Heifner c91f3c6c45 GH-395 Combine all the unittests into one executable. Greatly improve run time for tests. Add new tests for resource-monitor-space-absolute-gb option. 2023-02-09 08:48:04 -06:00
Kevin Heifner def487d61b GH-395 Added resource-monitor-space-absolute-gb that overrides resource-monitor-space-threshold percentage option if specified. Also made sure file space warning is logged on exit when shutting down. 2023-02-09 08:46:08 -06:00
Peter Oschwald 5082223a01 Merge branch 'main' into feature_performance_harness_stage_2 2023-02-09 08:41:38 -06:00
Peter Oschwald 9a8d79212d Control test-duration-sec for these tests.
Default is 90 sec, don't need that long for these tests.
2023-02-09 08:07:44 -06:00
Peter Oschwald df12ef4835 Fix argument names. 2023-02-09 08:07:06 -06:00
Jonathan Giszczak 9aaac36e12 Fix merge error. 2023-02-08 19:00:04 -06:00
Jonathan Giszczak eba31b1187 Merge branch 'eosio-launcher-python-port' into eosio-launcher-launch-nodeos-unshared 2023-02-08 18:14:21 -06:00
Peter Oschwald d8d9fa3195 Expand transaction generator to support new account trx
Update user data transaction specification to support multiple actions and automatically generating an account namer per transaction to substitute into defined actions using the 'ACCT_PER_TRX' key word.

Removed arguments for action data pieces that have been moved into the larger transaction spec in the json files.

Added/Updated tests to exercise the new feature.
2023-02-08 17:35:47 -06:00
jgiszczak 9cbca20f81 Merge pull request #685 from AntelopeIO/launcher_merge_main_2_3
merge from main into launcher dev branch
2023-02-08 17:02:13 -06:00
Gregory Popovitch e302b74fd9 Merge pull request #636 from AntelopeIO/greg7mdp/gh-585
Update appbase/plugins to support multiple instances/exe
2023-02-08 16:21:50 -05:00
Clayton Calabrese 1ffa26a3df fix failure of performance test 2023-02-08 15:16:01 -06:00
Chris Gundlach 0bfc796926 added lambda for named thread pool start 2023-02-08 10:45:56 -06:00
Chris Gundlach e2e591fb54 mod to named_thread_pool construction 2023-02-08 10:25:52 -06:00
Chris Gundlach 3d2ad4de22 Merge branch 'main' into feature_prometheus_plugin 2023-02-08 09:47:36 -06:00
Kevin Heifner a357765c73 GH-695 Report dirty-db correctly 2023-02-08 08:07:14 -06:00
766C6164 280d799958 Added comment on why non-propagating system_error 2023-02-08 08:03:43 -06:00
766C6164 f694588f9f Propagate all exceptions minus system_error 2023-02-08 08:03:38 -06:00
Kevin Heifner 34baed929b GH-677 Revert unneeded explicit copy 2023-02-07 20:02:17 -06:00
Kevin Heifner 2eb0b43a65 GH-677 Use unnamed copy 2023-02-07 20:01:36 -06:00
Clayton Calabrese f44705d37d fixed performance test basic, the main pt is still failing 2023-02-07 18:28:38 -06:00
Kevin Heifner a10d6bc3be GH-677 Fix some uses of std::move 2023-02-07 16:22:24 -06:00
Kevin Heifner b1af6cf101 GH-677 Use unnamed copy 2023-02-07 15:58:50 -06:00
Kevin Heifner cd3aaf24c1 GH-677 Fix invalid move 2023-02-07 15:57:44 -06:00
Kevin Heifner ed2e91d68d GH-677 Constrain scope 2023-02-07 13:23:23 -06:00
Kevin Heifner eb0d3dc090 GH-677 Minor cleanup 2023-02-07 13:19:35 -06:00
Jonathan Giszczak 368fdd4ba9 Catch ProcessLookupError during terminate call and react appropriately 2023-02-07 12:36:52 -06:00
Kevin Heifner 62903c04ab GH-677 Use std::move for abi into abi_serializer to avoid string copies. 2023-02-07 11:58:41 -06:00
Kevin Heifner b7fdd1c884 GH-677 Refactor get_block into multiple methods for testing. Also fix issue with invalid abi should not throw exception. 2023-02-07 11:56:06 -06:00
Jonathan Giszczak 625662a2d2 Capture ProcessLookupError independently of OSError. 2023-02-07 10:59:41 -06:00
Huang-Ming Huang 26c03a57d3 Merge branch 'main' into huangminghuang/block_log 2023-02-07 10:53:38 -06:00
Huang-Ming Huang 54ff3feba9 Merge branch 'main' into GH-592-ship-crash-split-ship-log 2023-02-07 10:15:38 -06:00
Kevin Heifner 38f3988ac5 GH-677 Move abi serialization off the main thread for get_block 2023-02-07 08:34:33 -06:00
Jonathan Giszczak 2aa860d871 Fix typo. 2023-02-06 19:02:04 -06:00
Jonathan Giszczak b245ba43c2 Implement wait for terminating process on platforms without pidfd_open
Remove spurious whitespace change in Cluster.
2023-02-06 18:08:17 -06:00
Jonathan Giszczak 7eb38c4cd5 Remove nodeos_remote_test.
A test which doesn't test a feature we no longer support.
2023-02-06 14:21:38 -06:00
Huang-Ming Huang ffc8716284 update based on PR comment 2023-02-06 14:18:34 -06:00
Huang-Ming Huang 94cb1d6353 use block_num_t consistently 2023-02-06 12:15:52 -06:00
Huang-Ming Huang 89963f6fdc address some PR comments 2023-02-06 11:42:33 -06:00
Christopher Gundlach 34a45f8d92 Merge pull request #635 from AntelopeIO/prometheus_metrics_listener
First cut at a more message based interface between prometheus and instrumented plugins
2023-02-06 09:52:41 -06:00
Chris Gundlach a8022cdd1b used std::move() to update metrics map rather than copy 2023-02-06 09:23:34 -06:00
Chris Gundlach 3ac58ebd50 Merge branch 'feature_prometheus_plugin' into prometheus_metrics_listener 2023-02-06 09:14:44 -06:00
Chris Gundlach 754b2d81f9 minor cleanup 2023-02-06 09:10:27 -06:00
greg7mdp d13d06886c Merge branch 'main' of github.com:AntelopeIO/leap into greg7mdp/gh-585 2023-02-04 13:46:03 -05:00
greg7mdp 889de5b282 Update appbase to tip 2023-02-04 13:44:35 -05:00
Clayton Calabrese 6c5bc1e721 merge from main again 2023-02-03 16:07:20 -06:00
Clayton Calabrese 8d17b5cf40 merge from main 2023-02-03 15:59:15 -06:00
Kevin Heifner 7e1ef84c9b Merge remote-tracking branch 'origin/main' into GH-592-ship-crash-split-ship-log 2023-02-03 09:06:05 -06:00
Jonathan Giszczak 404e5a9372 Implement bounce argument.
Finish fixing down argument.
2023-02-03 01:03:58 -06:00
Lin Huang 717685c037 change contracts to test_contracts 2023-02-02 21:26:38 -05:00
Lin Huang 4365542bc4 add no_auth_table to new unittests/test_contracts.hpp.in due to change by merge from main 2023-02-02 20:56:33 -05:00
Lin Huang 1b18206a79 Merge branch 'main' into send_read_only_trx 2023-02-02 20:52:26 -05:00
Peter Oschwald b35c3d6fba Add ability to configure log level for cluster via cli arg. 2023-02-02 13:35:14 -06:00
greg7mdp 88cbbb5b71 Update appnbase to tip 2023-02-02 11:05:20 -05:00
greg7mdp 2914633fc3 Update appbase to tip. 2023-02-02 11:01:31 -05:00
greg7mdp febc1a1629 update appbase to tip 2023-02-01 16:03:25 -05:00
greg7mdp 2b6775334d Merge branch 'main' of github.com:AntelopeIO/leap into greg7mdp/gh-585 2023-02-01 13:39:44 -05:00
766C6164 d865960c07 Work in progress - requests scaffold, db 2023-02-01 13:39:00 -05:00
greg7mdp 165a5a575e Use scoped_app consistently in main programs. 2023-02-01 13:37:35 -05:00
Peter Oschwald f52beda0a2 Fix compiler warnings in tests. 2023-02-01 10:41:10 -06:00
Peter Oschwald caa8f41586 Refactoring. Moving functions into classes. 2023-02-01 10:35:45 -06:00
Peter Oschwald cfe83467aa Add way to specify auth acct when using json trx description.
Add support for actionAuthAcct and actionAuthPrivKey for more explicit control when specifying transaction directly.

Add actionAuthAcct to json transaction description

Add trx generator id to allow differentiation of trx generators for use in create accounts.

Factored out set_transaction_headers into own helper function.
2023-02-01 09:45:50 -06:00
Jonathan Giszczak 01bb0d406b Support more than 26 producers in launcher. 2023-01-31 19:15:15 -06:00
Jonathan Giszczak 04815fa968 Write start script when node isn't started by launcher. 2023-01-31 16:58:46 -06:00
greg7mdp 7f0b67f6b8 call register_plugin() as a static member, so that static variable initializers don't create an application instance before the program is started. 2023-01-31 16:53:43 -05:00
Chris Gundlach a6565005ff updates to prometheus_plugin to support message based updates 2023-01-31 13:47:15 -06:00
Kevin Heifner 24b533397a GH-592 Move files back as they are used by block log splitting as well 2023-01-31 13:35:25 -06:00
greg7mdp 8e7b6ec66b update appbase to tip 2023-01-31 13:51:41 -05:00
Peter Oschwald a4d6ecc40b Rename for generalization, not strictly for transfers. 2023-01-31 04:38:27 -06:00
Jonathan Giszczak 585dca0157 Temporarily remove some error suppression not yet ready for prime time. 2023-01-30 18:26:42 -06:00
Jonathan Giszczak 61969f6701 Honor unstarted nodes flag and validate total vs prod/unstarted.
Fix up --down implementation.
2023-01-30 18:06:21 -06:00
Jonathan Giszczak 5c5a37395e Tolerate empty specific extra nodeos args used by some tests as docs 2023-01-30 16:49:23 -06:00
Kevin Heifner c137951259 Merge branch 'GH-592-ship-crash-split-ship-log' of https://github.com/AntelopeIO/leap into GH-592-ship-crash-split-ship-log 2023-01-30 13:40:40 -06:00
Kevin Heifner ed420c2198 GH-592 Minor cleanup from peer review comments 2023-01-30 13:40:23 -06:00
Kevin Heifner 0e5cd164ed Merge branch 'main' into GH-592-ship-crash-split-ship-log 2023-01-30 11:47:32 -06:00
Peter Oschwald 96930a1616 Rename in prep to support additional trx desc files. 2023-01-30 11:29:56 -06:00
766C6164 e17e772e0c Updates to schema 2023-01-30 11:56:56 -05:00
Kevin Heifner 337b81122c GH-592 Add missing return 2023-01-30 10:51:33 -06:00
Kevin Heifner dc542bd122 GH-592 Increase to have more than one connection to ship 2023-01-30 10:51:16 -06:00
Kevin Heifner 6b708e375c GH-669 Do not reset socket_stream as it can still be in use. 2023-01-27 17:18:48 -06:00
ClaytonCalabrese ac1c5db6cc Merge pull request #647 from AntelopeIO/performance_harness_csv
[PH] Performance Harness csv improvements
2023-01-27 16:18:26 -06:00
Kevin Heifner 33656e3ee6 GH-592 Remove unneeded use of this-> 2023-01-27 15:32:51 -06:00
Kevin Heifner f149ce6af0 GH-592 Remove explicit close and just let websocket destructor take care of it 2023-01-27 15:19:10 -06:00
Kevin Heifner 34b8e11f2e GH-592 Fix shutdown issue with session_test 2023-01-27 15:18:25 -06:00
Clayton Calabrese de7c7b0e48 change csv variable names to something more proper 2023-01-27 14:35:05 -06:00
Jonathan Giszczak 2540fc16c8 Don't launch nodes when --output is specified.
Write and read topology file in nodeosLogPath.
Convert nodeosLogPath to pathlib.
Implement support for --down argument.
Add minor additional debugging output to Node.
2023-01-26 17:34:25 -06:00
Clayton Calabrese 5add73c439 change from .txt to .csv 2023-01-26 15:21:21 -06:00
Kevin Heifner 23089d6545 GH-592 Move log_* files only used by state_history into state_history library. 2023-01-26 13:10:49 -06:00
Clayton Calabrese 5f1770b58e rename csv 2023-01-26 11:13:46 -06:00
Kevin Heifner 0271a56e9a Merge remote-tracking branch 'origin/main' into GH-592-ship-crash-split-ship-log 2023-01-26 10:01:47 -06:00
Kevin Heifner 6fda64452c GH-592 Fix spelling 2023-01-26 10:01:32 -06:00
Kevin Heifner 93173ce827 Merge remote-tracking branch 'origin/main' into GH-592-ship-crash-split-ship-log 2023-01-25 16:30:07 -06:00
766C6164 e54032ab72 Added snapshot status to get_snapshots_requests 2023-01-25 14:30:16 -05:00
greg7mdp 2a904da020 Update appbase to tip. 2023-01-25 10:33:26 -05:00
Clayton Calabrese 8f32316705 add header to csv and filter out ungenerated transactions 2023-01-24 17:25:56 -06:00
Chris Gundlach b950953ae6 fixes based on peer review 2023-01-23 10:08:23 -06:00
greg7mdp 9cd3fc4271 Update appbase tip 2023-01-20 14:41:32 -05:00
greg7mdp f0196780b1 Update appbase to tip 2023-01-20 14:13:03 -05:00
Kevin Heifner 3ed8ac7eee Merge branch 'main' into GH-592-ship-crash-split-ship-log 2023-01-20 13:03:23 -06:00
greg7mdp 2ee7407eb5 Update appbase to tip 2023-01-20 13:07:32 -05:00
greg7mdp 7143ea4269 Update appbase to tip 2023-01-20 12:06:37 -05:00
greg7mdp b815f304aa update appbase to tip 2023-01-20 11:55:51 -05:00
Jonathan Giszczak 8e95e7c2c9 Add support for custom topologies and fix shell argument handling.
Remove broken nodes placeholder from Cluster.
2023-01-20 01:10:25 -06:00
Peter Oschwald 031f5959bb Merge branch 'main' into feature_performance_harness_stage_2 2023-01-19 12:07:12 -06:00
greg7mdp acb1bdb79e update appbase to tip 2023-01-19 11:06:11 -05:00
greg7mdp 2aad4aecd8 update appbase to tip 2023-01-19 10:56:23 -05:00
Kevin Heifner fe5e1f77c7 Merge branch 'main' into GH-592-ship-crash-split-ship-log 2023-01-18 18:36:50 -06:00
greg7mdp 62c426081f Update appbase to latest commit 2023-01-18 18:41:17 -05:00
Kevin Heifner 21bdaed5f2 GH-592 truncate/prune only called from other public methods that already have a lock 2023-01-18 16:54:24 -06:00
Kevin Heifner 9aa3ffc00a GH-592 Fix bad merge issue which was causing core dump 2023-01-18 16:01:12 -06:00
greg7mdp 922d4486fa Update to latest commit in appbase branch 2023-01-18 16:40:03 -05:00
greg7mdp 112702a870 fix test_trx_retry_db test so that it initializes appbase correctly. 2023-01-18 16:33:59 -05:00
Clayton Calabrese 9af6e9023d seperate out new csv file containing data and rework as necessary 2023-01-18 12:29:20 -06:00
Kevin Heifner b69a03f3dc GH-592 WIP Fixing threading issues with state_history_log and sessions 2023-01-18 12:11:42 -06:00
Chris Gundlach 8f62c272fb format fix 2023-01-18 09:45:57 -06:00
766C6164 7cb3a08ef3 Updates to swagger spec 2023-01-17 14:03:26 -05:00
Chris Gundlach ed72be42f7 made call to metrics async; using strands/named_thread_pool 2023-01-17 11:17:34 -06:00
Kevin Heifner 1381a0f19e GH-592 Remove unused methods 2023-01-16 12:58:33 -06:00
ClaytonCalabrese 4ca1528956 Merge pull request #633 from AntelopeIO/performance_harness_dropped_blocks_tracking
[PH] Log Dropped Blocks, Dropped Transactions, and Production Windows
2023-01-16 11:03:19 -06:00
Kevin Heifner ba0f16834c Merge remote-tracking branch 'origin/main' into GH-592-ship-crash-split-ship-log 2023-01-16 08:27:49 -06:00
greg7mdp 6c95e51b5a update submodules to same version as main 2023-01-13 17:51:55 -05:00
Gregory Popovitch e1320e7931 Merge branch 'main' into greg7mdp/gh-585 2023-01-13 17:26:29 -05:00
greg7mdp 0db18fc295 Update submodules 2023-01-13 17:25:03 -05:00
Clayton Calabrese da7dff2c39 refactor calcProductionWindows 2023-01-13 14:54:51 -06:00
Clayton Calabrese 031f5fe969 merge from feature branch and resolve conflicts 2023-01-13 13:43:35 -06:00
Clayton Calabrese f72b6fd047 redo generated report using single producer 2023-01-13 12:04:05 -06:00
Clayton Calabrese a70daf9c87 remove sorted keys and regenerate report for readme to reduce diff 2023-01-13 11:59:47 -06:00
Peter Oschwald 0743686658 Another fixup from Merge branch 'main' into feature_performance_harness_stage_2 2023-01-13 10:57:07 -06:00
Peter Oschwald 1334957ae5 Fixup from Merge branch 'main' into feature_performance_harness_stage_2 2023-01-13 10:13:55 -06:00
Peter Oschwald be375bf42e Merge branch 'main' into feature_performance_harness_stage_2 2023-01-13 09:40:33 -06:00
greg7mdp 9d2235b672 restore file deleted by mistake 2023-01-12 18:18:21 -05:00
greg7mdp fb12fe627f Update appbase/plugins to support multiple instances/exe 2023-01-12 18:05:16 -05:00
Clayton Calabrese bda0d82103 count first and last window as complete windows if containing 12 blocks, otherwise ignore them. 2023-01-12 17:04:07 -06:00
Clayton Calabrese 18d654f3bc commit print statement that was unsaved in past commit 2023-01-12 16:53:29 -06:00
Clayton Calabrese 3775f5050a undo unintentional default change. Inform users when adjusting lbto and lbcep from defaults. Add DroppedTransactions to report 2023-01-12 16:49:38 -06:00
Kevin Heifner baac068f92 GH-592 Remove unused code 2023-01-12 15:37:18 -06:00
Kevin Heifner f164461d6c GH-592 Start thread after listen 2023-01-12 15:36:59 -06:00
Peter Oschwald 02163a4519 Merge pull request #626 from AntelopeIO/ph-trx-gen-json
[PH] Support configuring transaction type to send in trx generator through JSON transaction description
2023-01-12 11:59:28 -06:00
Peter Oschwald 08746f0e55 Merge branch 'feature_performance_harness_stage_2' into ph-trx-gen-json 2023-01-12 11:29:39 -06:00
ClaytonCalabrese 92870e10d4 Merge pull request #598 from AntelopeIO/performance_harness_specifiy_contract
[PH] Add Ability to Specify Contract for Performance Tests
2023-01-12 10:59:26 -06:00
Chris Gundlach 2651eaf7d1 first cut at new interface between prometheus and other plugins 2023-01-12 10:12:30 -06:00
Peter Oschwald d86782461b Replace cout in favor of xlog statements. 2023-01-12 08:45:27 -06:00
Peter Oschwald 777d9d30bf Remove UserTrxData in favor of loading user data from json file.
Replace prev argument --user-trx-data with --user-trx-data-file.

Read user trx data in from file and use that directly in lieu of UserTrxData.

Update tests to exercise this path with sample userTrxData.json file.

Update report construction to support Paths.
2023-01-11 22:55:12 -06:00
Peter Oschwald 03750c994a Refactor common transaction generator code into base class.
Fix trx_expr to be fc::microseconds instead of int64_t
2023-01-11 21:24:17 -06:00
Peter Oschwald e290f59aef Refactor user defined trx data into easily modifiable dataclass UserTrxData.
Update performance_test_basic to support user specified transaction data through the use of the --user-trx-data command argument and the UserTrxData class.  Now supports creation of named accounts for use in user defined transactions.

Cluster supports populating wallet with named accounts.

Renamed command line argument for making use of user provided trx data to --user-trx-data.
2023-01-11 20:37:14 -06:00
Peter Oschwald 48174929b2 Rename for clarity as this is not a string. 2023-01-11 20:04:06 -06:00
Jonathan Giszczak 3fe6780a91 Honor launch = 'none' and delay arguments.
Fix arithmetic error calculating producers per node.
2023-01-11 18:01:50 -06:00
Jonathan Giszczak 292a0a3826 Python alias no present; use python3 alias. 2023-01-11 15:32:29 -06:00
Kevin Heifner 912cc20f24 Merge branch 'named-tp-except' into GH-592-ship-crash-split-ship-log 2023-01-11 15:21:33 -06:00
Clayton Calabrese c26432e9be more explicit constructor names 2023-01-11 14:21:05 -06:00
Clayton Calabrese 26f0b5a111 change production window size to constant 2023-01-11 14:07:02 -06:00
Jonathan Giszczak b0e950a660 Revise NP and LR tests with seccomp=unconfined instead of privileged 2023-01-11 13:41:09 -06:00
Clayton Calabrese 24ce5d97d8 merge and resolve conflicts from feature branch 2023-01-11 13:35:47 -06:00
Jonathan Giszczak f84884ccfa Try unconfined seccomp rather than --privileged test execution. 2023-01-11 13:24:21 -06:00
Clayton Calabrese 060be863a3 log production windows, dropped blocks, and dropped transactions in performance harness 2023-01-11 13:19:36 -06:00
jgiszczak 136262250a Merge pull request #629 from AntelopeIO/eosio-launcher-support-nodeos-path-args
Add support for specifying paths to nodeos in launcher.
2023-01-11 12:22:40 -06:00
766C6164 6da9928831 Updates to snapshot scheduling api 2023-01-11 12:05:19 -05:00
Clayton Calabrese eb8337adb1 use explicit names on constructor for specified contract 2023-01-10 12:06:13 -06:00
Jonathan Giszczak a3fcefbd3f Add support for specifying paths to nodeos in launcher.
Modify nodeos_run_test to exercise nodeos path specification.
2023-01-10 01:49:06 -06:00
Kevin Heifner 2970357110 GH-592 Debug log for request messages. 2023-01-09 17:17:35 -06:00
Kevin Heifner e75b2dda6a GH-592 Merge GH-624 changes into split-ship-log branch. 2023-01-09 17:08:55 -06:00
766C6164 9e32a10396 Added snapshot scheduling calls to schema 2023-01-09 16:18:28 -05:00
Peter Oschwald 00a552f1b0 Add action_name, action_data, and abi_file argument support. 2023-01-09 13:21:19 -06:00
Peter Oschwald 58fed8c512 Trx Generator config support for JSON transaction description
Add functionality to transaction generator to take input of abi from file, transaction action type, and action data from a string or file json description and generate transactions matching that description.

Rename handler_account to contract_owner_account for more accurate description.

Add integration test exercising the new functionality that builds transactions from abi, action type and action data.  Makes use of the performance_test_basic with new argument '--exercise-trx-specification', but generates the transfer transactions from the abi, action name and action description in the test.

Added unit test to exercise the new trx_generator constructor.
2023-01-09 13:02:48 -06:00
Lin Huang 654aadedda completely review deep mind logging to make sure no deep mind logging for dry-run or read-only transactions 2023-01-09 13:29:44 -05:00
ClaytonCalabrese 95ebafbcf1 Merge pull request #618 from AntelopeIO/performance_harness_log_forks
[PH] Performance harness Log Number of Forks and Forked Blocks
2023-01-09 11:10:17 -06:00
Christopher Gundlach 596487257d Merge pull request #617 from AntelopeIO/merge_main_into_prometheus
Merge main into prometheus
2023-01-06 11:35:56 -06:00
Lin Huang 5260e4c8a5 use single get_deep_mind_logger method from control and pass trx_is_transient directly to indicate doing deep mind logging or not 2023-01-06 12:18:14 -05:00
Lin Huang 0148c8d162 Merge branch 'main' into send_read_only_trx 2023-01-05 18:26:11 -05:00
Lin Huang 92f751d0d4 revert the trx_execution_mode changes 2023-01-05 16:48:35 -05:00
Lin Huang 9380de4812 rework to make sure deep-mind loggins is not generated for dry-run and read-only transactions 2023-01-05 15:27:18 -05:00
Clayton Calabrese 22b60a3ae3 add a +1 to how many forked blocks are logged 2023-01-05 12:07:43 -06:00
Clayton Calabrese 15061f94fb merge from feature branch 2023-01-05 12:03:40 -06:00
Clayton Calabrese 186a0b038e revert unintended change made to get logs for testing. 2023-01-05 12:00:38 -06:00
Clayton Calabrese fba333be4d report forks and forked blocks in performance harness 2023-01-05 11:58:00 -06:00
Chris Gundlach 6caa809804 Merge branch 'main' into merge_main_into_prometheus 2023-01-05 10:49:00 -06:00
Lin Huang e990619600 do not perform key recovery if there are no signatures 2023-01-04 21:57:48 -05:00
Lin Huang b646c92db3 improve max-read-only-transaction-time description, fix a comment typo, and do not use _max_read_only_transaction_time_ms as it is not thread-safe when called from net plugin 2023-01-04 19:09:38 -05:00
Jonathan Giszczak bb1943de18 Move --privileged to test runner command, from template.
Manually update index.mjs to match source.
2023-01-04 17:29:04 -06:00
Jonathan Giszczak 7a5d57b434 Run db_modes_test with verbose flag. 2023-01-04 16:58:06 -06:00
Clayton Calabrese 7ab1586970 merge from feature branch to resolve conflicts 2023-01-04 14:06:56 -06:00
Clayton Calabrese a8ea37a27c remove unnecessary new lines 2023-01-04 12:45:19 -06:00
ClaytonCalabrese 6dd154b4e0 Merge pull request #571 from AntelopeIO/performance_harness_replace_os_path
[PH] Replace usage of os.path with Path and PurePath
2023-01-04 12:35:55 -06:00
Clayton Calabrese 5cc242518e rework custom contract activation in performance harness 2023-01-04 12:32:06 -06:00
Jonathan Giszczak 20951f1ce0 Manually add --privileged flag to minified javascript. 2023-01-03 19:08:33 -06:00
ClaytonCalabrese 3fd598ba65 Merge pull request #611 from AntelopeIO/ph_merge_main_phase2_1_2
[PH] Ph merge main
2023-01-03 15:25:47 -06:00
Clayton Calabrese bd1bd7d573 Merge branch 'main' into ph_merge_main_phase2_1_2 2023-01-03 11:23:11 -06:00
Clayton Calabrese bbfe01eb34 update NodeosPluginArgs to match addition of --state-dir 2023-01-03 11:20:14 -06:00
Clayton Calabrese dc1575ba6b resolve failures for 2.0 following merge. 2023-01-02 15:27:07 -06:00
Clayton Calabrese 099bbe45fa merge from main 2023-01-02 14:55:19 -06:00
Lin Huang 5e5a2c60c4 add test for max_read_only_transaction_time deadline exception 2022-12-31 19:45:53 -05:00
Huang-Ming Huang a9cea07eca revert commit for threaded write 2022-12-29 14:21:05 -06:00
Huang-Ming Huang 7b2efb8ee7 remove ff 2022-12-29 11:54:12 -06:00
Huang-Ming Huang 65163a90d4 fix ship threaded write 2022-12-29 11:06:11 -06:00
Lin Huang eacc66da47 simplify and streamline deep-mind logging for dry-run and read-only transactions 2022-12-27 16:23:41 -05:00
Lin Huang 1c667f77be Add transaction execution mode to controller for better managing dry-run and read-only transactions 2022-12-27 16:06:47 -05:00
Huang-Ming Huang 9329fa3a62 fix issue #592 2022-12-26 14:54:16 -06:00
Lin Huang 2e9de779f9 Add configurable max-read-only-transaction-time; add node_configured_max_read_only_transaction_time for tx_cpu_usage_exceeded_reason 2022-12-26 15:02:29 -05:00
Huang-Ming Huang 068ac71968 fix truncate 2022-12-26 11:18:45 -06:00
Clayton Calabrese 1b1a191816 more changes to using specified contracts in performance tests. 2022-12-23 18:13:50 -06:00
Clayton Calabrese 99dd39dd8f more path to string changes 2022-12-23 17:11:07 -06:00
Clayton Calabrese 4a53c71ed0 replace repeated path calls with concatonated strings using / operator from path 2022-12-23 17:09:18 -06:00
Huang-Ming Huang 1d3bc44203 add ship log partition options
# Conflicts:
#	libraries/state_history/include/eosio/state_history/log.hpp
#	plugins/state_history_plugin/include/eosio/state_history_plugin/session.hpp
#	plugins/state_history_plugin/tests/session_test.cpp
2022-12-23 12:58:44 -06:00
Huang-Ming Huang ec3c5ed1dc add ro_stream_for_block overload 2022-12-23 12:58:44 -06:00
Huang-Ming Huang a33f61099a add log catalog files 2022-12-23 12:58:43 -06:00
Jonathan Giszczak e10013e9b9 Support nodeos-log_path argument and non-producing nodes. 2022-12-22 17:39:11 -06:00
Lin Huang 290fc7a04b Merge branch 'main' into send_read_only_trx 2022-12-22 17:26:47 -05:00
Jonathan Giszczak 7beadb0a2c Maybe fix YAML syntax. 2022-12-22 14:53:19 -06:00
Jonathan Giszczak 15300dc01b Maybe fix YAML syntax. 2022-12-22 14:08:23 -06:00
Jonathan Giszczak 0351d913b0 Maybe fix YAML syntax. 2022-12-22 13:52:55 -06:00
Lin Huang 842fa04bce honor block_deadline, set deadline_exception_code, and split a large if statement 2022-12-22 13:03:22 -05:00
Huang-Ming Huang afbb418cb5 move session.hpp 2022-12-22 11:45:07 -06:00
Huang-Ming Huang d9fd83b82b Merge branch 'huangminghuang/ship-memory' of https://github.com/antelopeio/leap into huangminghuang/ship-memory 2022-12-22 11:16:19 -06:00
Huang-Ming Huang fb4b5d5fab remove unused code 2022-12-22 11:15:53 -06:00
Huang-Ming Huang b90e937734 Merge branch 'main' into huangminghuang/ship-memory 2022-12-22 11:11:25 -06:00
Huang-Ming Huang e370adf3d7 address PR comments 2022-12-22 09:11:02 -06:00
Lin Huang 372005e8c1 Merge branch 'main' into send_read_only_trx 2022-12-21 21:41:16 -05:00
Jonathan Giszczak 726b56ec71 Maybe fix YAML syntax. 2022-12-21 19:22:59 -06:00
Jonathan Giszczak 8a43b014df Proliferate privileged option to more configurations. 2022-12-21 19:20:07 -06:00
Lin Huang 18f4ce2c75 remove duplicate code from merging, improve deadline calculation for read-only transactions 2022-12-21 19:14:18 -05:00
Jonathan Giszczak e084cce8f8 Maybe fix YAML syntax. 2022-12-21 17:25:43 -06:00
Jonathan Giszczak 827ffe89f3 Maybe fix YAML syntax. 2022-12-21 17:16:45 -06:00
Jonathan Giszczak 64f4c4b57e Merge branch 'eosio-launcher-launch-nodeos-unshared' of github.com:AntelopeIO/leap into eosio-launcher-launch-nodeos-unshared 2022-12-21 16:37:33 -06:00
Jonathan Giszczak 272d5f3afc Invoke launcher.py with generic python interpreter name.
Remove commented code.
2022-12-21 16:33:32 -06:00
jgiszczak 77f8a4a6d2 Merge branch 'eosio-launcher-python-port' into eosio-launcher-launch-nodeos-unshared 2022-12-21 16:09:35 -06:00
Jonathan Giszczak 4de10f5a45 Use launcher.py for tests.
Write bios_boot.sh script from Python launcher for the time being.
Relocate Python libc wrapper into TestHarness from tests.
Use unshare in Cluster instead of launcher.py.
Add --privileged flag to Github test container configuration.
2022-12-21 16:05:27 -06:00
Lin Huang 97b28b66b4 fix merge error, do not enforce block_cpu_limit or on-chain max_transaction_cpu_usage for read-only transactions 2022-12-21 15:52:03 -05:00
Clayton Calabrese 17ada31c33 remove more unused imports 2022-12-21 11:09:47 -06:00
Clayton Calabrese 54af028748 remove unused import 2022-12-21 11:07:20 -06:00
Clayton Calabrese 339d1c8624 convert log reader tests to use pathlike objects) 2022-12-21 11:06:23 -06:00
Huang-Ming Huang 914c0cb96c add 4GB test case 2022-12-21 08:52:51 -06:00
Lin Huang 789d077cde fix a merge from main error 2022-12-20 19:26:19 -05:00
Lin Huang 7adb00bc92 Merge branch 'main' into send_read_only_trx 2022-12-20 18:52:45 -05:00
Huang-Ming Huang e0aa788ce2 fix counter overflow problem 2022-12-20 17:11:29 -06:00
Huang-Ming Huang 2b6f6bb74c address PR comments 2022-12-20 15:38:18 -06:00
Clayton Calabrese bf1126db27 fix some problems with pathLike changes 2022-12-20 11:17:16 -06:00
Clayton Calabrese acfdfc53a6 convert additional string paths to pathLike objects 2022-12-20 10:56:49 -06:00
Peter Oschwald 39342990c3 Merge branch 'main' into feature_performance_harness_stage_2 2022-12-20 09:52:38 -06:00
Huang-Ming Huang ed08c5e8ab use regular mutex for prune mutex 2022-12-16 12:58:38 -06:00
Huang-Ming Huang 2fb428f796 Merge branch 'main' into huangminghuang/ship-memory 2022-12-16 10:53:17 -06:00
Huang-Ming Huang f7c341b74a Suport hole punching with lock 2022-12-16 10:48:15 -06:00
Christopher Gundlach 2fb3e06c60 Merge pull request #537 from AntelopeIO/instrument_producer_plugin
Instrument producer_plugin for Prometheus
2022-12-16 10:07:58 -06:00
Chris Gundlach a1f8820031 added base struct for plugin metrics 2022-12-16 09:56:57 -06:00
Lin Huang 525055fb9d bump chainbase version to main which contains final changes for read-only transactions support 2022-12-16 08:52:11 -05:00
Huang-Ming Huang 95d99fb643 reduce ship memory usage 2022-12-15 15:51:22 -06:00
Chris Gundlach bd017586b6 added enabled for metrics 2022-12-14 10:43:06 -06:00
Clayton Calabrese e095f2b154 replace use of os.path with pathlib's Path and PurePath 2022-12-13 17:34:07 -06:00
Lin Huang 79e387ea76 use is_transient in producer_plugin; refine unit tests 2022-12-13 13:45:09 -05:00
Chris Gundlach b7bf037e4c code reformat / added bool for collecting of metrics 2022-12-13 10:49:52 -06:00
Lin Huang 864e31e798 finish changeing is_read_only() to is_transient() for deep-mind logging 2022-12-13 10:34:25 -05:00
Jonathan Giszczak 75994a38c1 Use kernel call directly to bring up namespaced loopback interface 2022-12-12 16:55:00 -06:00
Chris Gundlach 525a454414 cleanup in chain an net plugins based on changes in producer plugin 2022-12-12 14:41:23 -06:00
Chris Gundlach 0d5f7ddad8 changed to use const refs and other pr changes 2022-12-12 13:20:47 -06:00
ClaytonCalabrese d444a1a616 Merge pull request #467 from AntelopeIO/test_harness_var_lib_replacement
[TH] Replace hardcoded use of var/lib in tests
2022-12-12 10:58:56 -06:00
Lin Huang bf92e33c5b use make_scoped_exit to protect chainbase from being stuck in read_only_mode 2022-12-12 11:52:10 -05:00
Lin Huang 30e77a1db1 revert the changes for elpased and net_usage for non-read-only transactions; add tests for elpased and net_usage for read-only transactions 2022-12-12 10:33:54 -05:00
Lin Huang 53caa49d80 Do not undo_session for read-only transaction, prevent chainbase read_only_mode from stuck, add more unit tests 2022-12-10 17:24:44 -05:00
Lin Huang 059330e9ac restructure transaction init and finalize; add is_transient() to simplify code, do not allow non-zero delay_sec; do not do validate_expiration and validate_tapo; add back elapsed and net_usage to trace 2022-12-10 16:10:35 -05:00
Lin Huang f5ac3f77bc do not check authorization for read-only transactions; do not allow canceldelay 2022-12-10 14:54:18 -05:00
Lin Huang 110303d87d Refactor cleos main and chain_plugin to remove duplicate code 2022-12-10 14:28:04 -05:00
Jonathan Giszczak 39464f00ad Find loopback interface and bring it up in the launch namespace 2022-12-09 19:09:43 -06:00
Lin Huang 367123bdea restructure unit tests so they are modularized 2022-12-08 20:19:35 -05:00
Lin Huang 598a2c8086 Merge branch 'main' into send_read_only_trx 2022-12-08 19:13:21 -05:00
Lin Huang 817f9f1ccf Fix a compile error on Ubuntu 22, do not use designated initializers on non-aggregate types 2022-12-08 17:17:19 -05:00
Clayton Calabrese 19ff2d0f89 Remove hardcoded test names in favor of __file__. Remove .py from path. 2022-12-08 14:58:22 -06:00
Lin Huang 4091091b2e check in missing read_only_trx_tests.cpp 2022-12-08 15:50:54 -05:00
Lin Huang 08e7e1c103 check in missing read_only_trx_test.py 2022-12-08 15:44:53 -05:00
Lin Huang 4e5a2cc197 implement read-only transaction 2022-12-08 15:05:20 -05:00
Peter Oschwald 54b1c4f8af Merge pull request #546 from AntelopeIO/ph-nodeos-defaults
[PH] Provide *PluginArgs dataclasses to capture and validate nodeos config options
2022-12-07 15:53:21 -06:00
jgiszczak 45c6376270 Fix typos and formatting. 2022-12-07 15:11:11 -06:00
Peter Oschwald 2e4495e651 Add suggestion to regen classes if test fails due to updated nodeos config options. 2022-12-07 14:58:44 -06:00
Peter Oschwald 792a0f8559 Add purpose and limitations statement to generation script.
Also add note to each generated class calling out that it was generated.
2022-12-07 14:50:31 -06:00
Peter Oschwald 52b7903d92 Remove redundant paths in CMake files. 2022-12-07 14:17:54 -06:00
Peter Oschwald cc6879c467 Fix module name. 2022-12-07 12:11:16 -06:00
Peter Oschwald bea0ec0195 Fix imports. 2022-12-07 11:53:23 -06:00
Peter Oschwald cdb1342fc8 Create NodeosPluginArgs python package 2022-12-07 11:19:44 -06:00
Peter Oschwald 7703c6ef08 Remove cruft. 2022-12-07 08:49:27 -06:00
Peter Oschwald d1d717d8b0 Remove threads setter function and use setattr instead. 2022-12-07 08:46:58 -06:00
Peter Oschwald 0cd997ff6e Provide BasePluginArgs base class.
BasePluginArgs provides generic implementations of __str__ and supportedNodeosArgs functions for use in each *PluginArgs classes.

Update generation script to no longer generate base class functions, but to inherit from base class.
2022-12-07 08:45:28 -06:00
Peter Oschwald d23ae4cde9 Merge branch 'feature_performance_harness' into feature_performance_harness_stage_2 2022-12-06 19:57:07 -06:00
Peter Oschwald 7dc7133cd0 Fixup generator for proper quote detection and selection. 2022-12-06 19:48:07 -06:00
Peter Oschwald 6936b4144f Fixup invalid syntax error. 2022-12-06 19:45:12 -06:00
Peter Oschwald 8655e4dca1 Script that generates *PluginArgs.py dataclass files from nodeos --help output. 2022-12-06 17:52:28 -06:00
Peter Oschwald 23aea602b1 Fixup some of the config options. 2022-12-06 17:50:58 -06:00
Clayton Calabrese 44d9bb75c0 fix nodeos_run_remote_test failing on nodeos_run_test log check step 2022-12-06 16:40:24 -06:00
Peter Oschwald cf4097217f Provide *PluginArgs dataclasses to capture and validate nodeos config options.
Each *PluginArgs dataclass captures the command line argument and default for each option as specificed in nodeos.

New test validate_nodeos_plugin_args uses nodeos's --help command to parse out each plugin's available options and defaults to validate current status vs. the *PluginArgs classes.  Any addition, removal, update will cause a test failure with note of what has changed.  This will allow easy maintenance going forward.
2022-12-06 16:19:10 -06:00
Huang-Ming Huang 2bda949c35 add split-blocks and merge blocks option to leap-util 2022-12-06 11:45:25 -06:00
Christopher Gundlach b745639b0a Merge pull request #468 from AntelopeIO/http_plugin_text_plain
Add text/plain content type to http_plugin
2022-12-05 15:38:46 -06:00
Jonathan Giszczak b805a8802c Launch nodeos instances per configuration, unsharing the network first. 2022-12-05 10:40:04 -06:00
Chris Gundlach de6fe8c595 added base metrics for producer_plugin 2022-12-05 10:31:58 -06:00
Huang-Ming Huang d4fa489e80 Merge branch 'main' into huangminghuang/block_log 2022-12-05 08:45:50 -06:00
Huang-Ming Huang 2954299bd8 bug fixes 2022-12-02 15:50:54 -06:00
Huang-Ming Huang 6ad0eb7668 refactor block_log_impl 2022-12-02 14:28:59 -06:00
Chris Gundlach c15e275e38 fixes based on pr comments 2022-12-02 10:54:13 -06:00
Clayton Calabrese 6eabf64f74 address pr comment regarding github actions log path 2022-12-01 10:59:21 -06:00
Peter Oschwald 7861f772f5 Merge branch 'feature_performance_harness' into feature_performance_harness_stage_2 2022-12-01 10:31:02 -06:00
Clayton Calabrese 0c2e0e61e7 fix incorrect list in github actions 2022-12-01 10:29:37 -06:00
Chris Gundlach ecea4c38ff changes based on pr comments 2022-12-01 10:24:57 -06:00
Peter Oschwald 811817f60c Merge branch 'feature_performance_harness' into feature_performance_harness_stage_2 2022-12-01 05:28:35 -06:00
Clayton Calabrese ffffe77a96 resolve test failures due to use of var 2022-11-30 17:35:11 -06:00
Peter Oschwald 118a2a0b1b Merge pull request #518 from AntelopeIO/ph-argparse
[PH] argparse.ArgumentParser usage updates
2022-11-30 15:11:27 -06:00
Peter Oschwald dc76de1576 Merge pull request #510 from AntelopeIO/ph-thread-count-tests
[PH] thread count recommendation tests
2022-11-30 15:11:08 -06:00
Peter Oschwald c175d6be97 Resuse encoder from log_reader. 2022-11-30 14:43:26 -06:00
Peter Oschwald 33b94ba2a4 Remove redundant calls to close when using with statement. 2022-11-30 14:43:02 -06:00
Peter Oschwald d291e17022 Use encoder to handle datetime and None type conversions for reporting. 2022-11-30 11:12:12 -06:00
Peter Oschwald 0d5980d2da Use Python introspection to simplify. 2022-11-30 10:29:33 -06:00
Peter Oschwald 8bfa573dfc Merge pull request #520 from AntelopeIO/ph2-merge-feature-br
[PH] Ph2 merge feature br
2022-11-29 11:33:52 -06:00
Peter Oschwald f1d78e2be2 Merge branch 'feature_performance_harness' into ph2-merge-feature-br 2022-11-29 11:04:45 -06:00
Clayton Calabrese c1bbfe226d add new paths for GHA error logs 2022-11-29 10:21:46 -06:00
Clayton Calabrese d32cc2066f Merge branch 'eosio-launcher-python-port' into test_harness_var_lib_replacement 2022-11-29 10:06:10 -06:00
ClaytonCalabrese 119dd4dce8 Merge pull request #516 from AntelopeIO/test_harness_master_merge_11_28
[TH] Merge main into test harness
2022-11-29 09:53:39 -06:00
Peter Oschwald bd4a525f2f Fix performance_test_basic.py parser. 2022-11-29 09:38:24 -06:00
Peter Oschwald b6b6bcf767 Clarify TPS Test Config is part of Performance Harness. 2022-11-29 09:11:01 -06:00
Peter Oschwald ee1795570d Don't print Application Specific Arguments group if there are none. 2022-11-29 09:09:07 -06:00
Peter Oschwald ed975c6425 Make use of ArgumentParser parents and groups.
This will greatly reduce work to bubble up arguments between scripts/modules.  Also brings clarity and grouping of arguments by use with group titles and descriptions.

Test Helper arguments can now be bubbled up to user scripts via direct access to the ArgumentParser.  Performance Test Basic makes use of Test Helper arguments.  Perfomance Test makes use of both Performance Test Basic and Test Helper arguments as well.
2022-11-29 09:04:29 -06:00
Clayton Calabrese 452b719504 update main and merge 2022-11-28 16:10:20 -06:00
Clayton Calabrese 8e2da33d08 merge from main 2022-11-28 16:07:25 -06:00
Clayton Calabrese 577b088713 resolve collision in test path for tests which are run multiple times 2022-11-28 14:31:23 -06:00
Peter Oschwald 84b11790c4 Fix reference before assignment error on results objects when not configured to run tests. 2022-11-28 11:41:06 -06:00
Peter Oschwald 1db0e6c7c3 Fix check for thread calc being 'none' 2022-11-28 11:14:06 -06:00
Peter Oschwald 2ca2eb9d44 Fix typo. 2022-11-23 13:17:53 -06:00
Peter Oschwald 92fa92a1b2 Update defaults for producer threads to 6 and chain threads to 3 based on performance run calculations. 2022-11-23 12:44:38 -06:00
Peter Oschwald 7ba252b71c Add options to calculate recommended producer, chain, and net worker thread pool size.
Each plugin's option determines whether to calculate number of worker threads to use in the thread pool with options of: 'none', 'lmax', or 'full'. In 'none' mode, the default, no calculation will be attempted and default configured thread count will be used. In 'lmax' mode, thread count will incrementally be tested until the performance rate ceases to increase with the addition of subsequent threads. In 'full' mode thread count will incrementally be tested from 2..num logical processors, recording each performance and choosing the local max performance (same value as would be discovered in 'lmax' mode). Useful for graphing the full performance impact of each available thread.

Added log directory to collect results of thread optimization calculations.

Added option to opt out of running the tps test.

Updated README for new options and to show the updates to the result reports.
2022-11-23 12:33:34 -06:00
Peter Oschwald 22b0118aae Factor PerformanceTest out into its own class.
Break out config and logging classes.

Update documentation.
2022-11-21 16:36:14 -06:00
Chris Gundlach c7f962836a added support for metric_type 2022-11-21 10:38:58 -06:00
Chris Gundlach 40a0507b3b added producer_plugin metrics 2022-11-21 10:38:22 -06:00
Chris Gundlach ae8eee9824 added metric types to metrics 2022-11-21 10:37:53 -06:00
Chris Gundlach be41cdbdf4 added chain_plugin metrics 2022-11-21 10:36:06 -06:00
Chris Gundlach 56a11f1874 added metric_type 2022-11-21 10:35:12 -06:00
Peter Oschwald d4b31f341c Factor out test params into PtbConfig and LoggingConfig objects.
Using PtbConfig and LoggingConfig objects simplifies test initializer params and encapsulates related config items into an object describing their use. It also allows easy reporting of test configuration in test report and will allow reporting to come for free if additional config arguments are added.

Some renaming for efficiency and clarity.
2022-11-18 16:58:47 -06:00
Peter Oschwald d35b65c863 Rename to PerformanceTestBasic to better align with script names.
Also renaming to use Ptb abbreviation in light of the name change.
2022-11-18 14:22:39 -06:00
Peter Oschwald 3fe37f3b92 Merge pull request #484 from AntelopeIO/ph-log-dir-add-tps-target
[PH] log dir add tps target
2022-11-18 08:35:56 -06:00
Peter Oschwald f7a486f88f Merge branch 'feature_performance_harness_stage_2' into ph-log-dir-add-tps-target 2022-11-17 16:26:28 -06:00
Peter Oschwald f09a1becd0 Merge branch 'feature_performance_harness' into feature_performance_harness_stage_2 2022-11-17 16:24:49 -06:00
Peter Oschwald bda146d96e Add target tps number to test log dir name for ease of locating specific run. 2022-11-17 11:45:07 -06:00
Peter Oschwald 841011b13e Merge branch 'feature_performance_harness' into feature_performance_harness_stage_2 2022-11-17 10:52:45 -06:00
Peter Oschwald f7c008ad72 Merge pull request #481 from AntelopeIO/ph-db-map-mode
[PH] add database map mode
2022-11-17 10:32:10 -06:00
Peter Oschwald 90a1cbd5e8 Add cpu count to top level report. 2022-11-17 09:27:30 -06:00
Peter Oschwald 20f7ccf399 Update docs for new argument 2022-11-16 17:08:17 -06:00
Peter Oschwald f852de1a13 Add argument to configure --database-map-mode.
Use namespace alias to simplify and make easier to read. Rename some variables for brevity.
2022-11-16 17:06:24 -06:00
Peter Oschwald e3e688ad51 Refactor to use __str__ function override. 2022-11-16 15:44:42 -06:00
Peter Oschwald 4dd551f00f Rename to simplify and shorten plugin argument classes. 2022-11-16 15:30:41 -06:00
Peter Oschwald b7bc0fece0 Merge pull request #475 from AntelopeIO/ph-thread-configs
[PH] Update docs for new arguments.
2022-11-16 10:00:08 -06:00
Peter Oschwald 8fd065c0cf Update docs for new arguments. 2022-11-16 08:34:12 -06:00
Peter Oschwald 9f59b5ea4c Merge pull request #469 from AntelopeIO/ph-thread-configs
[PH] Add support for thread configs
2022-11-16 08:23:08 -06:00
Peter Oschwald 2afac0031c Add support for configuring number of worker threads in producer thread pool (--producer-threads). 2022-11-15 16:11:24 -06:00
Peter Oschwald 138fb0e096 Add support for configuring number of worker threads in net_plugin thread pool (--net-threads). 2022-11-15 15:43:23 -06:00
Peter Oschwald 9986399867 Add support for configuring number of worker threads in controller thread pool (--chain-threads). 2022-11-15 15:16:00 -06:00
Chris Gundlach 0780d77b60 changed url from /scrape to /metrics, which is default for prometheus 2022-11-15 13:00:57 -06:00
Chris Gundlach 722508e86e took out unnecessary content_type_ member 2022-11-15 12:52:43 -06:00
Chris Gundlach 0ef5a84596 set content type for prometheus_plugin to plain text 2022-11-15 11:25:16 -06:00
Chris Gundlach 7417565481 added ability to set content type on api 2022-11-15 11:24:31 -06:00
Clayton Calabrese 5ae2aef2ed convert hardcoded use of var lib to a dynamic one based off test name. 2022-11-15 11:22:47 -06:00
Chris Gundlach 4b17541372 Merge branch 'main' into feature_prometheus_plugin 2022-11-14 10:10:23 -06:00
Christopher Gundlach 6be258e1aa Merge pull request #436 from AntelopeIO/prometheus_metric_updates
Updates to runtime_metrics / interface between instrumented plugins and prometheus plugin
2022-11-11 10:22:28 -06:00
jgiszczak c0edf6c3ef Merge pull request #459 from AntelopeIO/eosio-launcher-create-queries-class
Migrate chain queries out of Node.py into their own class
2022-11-10 18:23:12 -06:00
Jonathan Giszczak 96a377cdcf Move wait methods back to Node. 2022-11-10 18:08:58 -06:00
Jonathan Giszczak 5f857313ac Redirect naughty usage of Python 'private' method in cli_test 2022-11-10 17:47:04 -06:00
Jonathan Giszczak 91e96d01b8 Move chain transactions API out of Node into its own class.
Still avoiding modifying tests for the time being.
2022-11-10 15:09:14 -06:00
Jonathan Giszczak d5e9dcdc86 Add missing imports. 2022-11-10 14:40:18 -06:00
Jonathan Giszczak 4a52633f5d Migrate chain queries out of Node.py into their own class
Node inherits from new Queries class to avoid intrusive changes to tests
processCurlCommand is left in Node to avoid merge conflicts with #442
2022-11-09 18:01:33 -06:00
jgiszczak 1a7212c931 Merge pull request #331 from AntelopeIO/eosio-launcher-data-and-topology
Add data classes, populators, and topology generators
2022-11-07 14:02:36 -06:00
Chris Gundlach 1557592bd5 added dropped trxs metric 2022-11-07 10:59:48 -06:00
Chris Gundlach a370d138a0 changed to use references rather than pointers 2022-11-07 10:30:11 -06:00
Chris Gundlach 4cb2657ac8 updated to net_plugin to return a struct rather than a vector of pointers 2022-11-07 10:21:25 -06:00
Jonathan Giszczak 58c9879d69 Use cleos to generate unique producer keys for non-bios producer nodes 2022-11-04 18:33:04 -05:00
Jonathan Giszczak 6eabcab35e Merge branch 'eosio-launcher-data-and-topology' of github.com:AntelopeIO/leap into eosio-launcher-data-and-topology 2022-11-04 17:48:59 -05:00
Jonathan Giszczak 8034303068 Move launcher.py out of TestHarness. 2022-11-04 17:43:48 -05:00
jgiszczak 760ddde988 Merge pull request #432 from AntelopeIO/eosio-launcher-write-genesis-file
Write a genesis file for each node.
2022-11-04 16:35:58 -05:00
Jonathan Giszczak 8e6242da0f Support using an existing genesis.json file. 2022-11-04 16:09:43 -05:00
Chris Gundlach 3c699a43ec used new alias 2022-11-02 11:07:03 -05:00
Chris Gundlach a084e2e001 update runtime_metric to int64_t; added aliases 2022-11-02 10:51:01 -05:00
Chris Gundlach 3b4fa6f59c added num_clients/num_peers metrics 2022-11-01 18:03:18 -05:00
Chris Gundlach 811ac8aab8 added handling of runtime_metrics from net plugin 2022-11-01 18:02:46 -05:00
Chris Gundlach 50859e7b81 added definition for runtime_metrics 2022-11-01 18:01:45 -05:00
Jonathan Giszczak bab3b16795 Support max-[block,transaction]-cpu-usage when writing genesis.json 2022-11-01 14:50:29 -05:00
Jonathan Giszczak 590dfce426 Write a genesis file for each node. 2022-11-01 14:39:38 -05:00
Jonathan Giszczak 70bc518bb8 Fix mesh topology generator and eliminate redundant links.
Per original C++, peera->peerb and peerb->peera are both configured.
2022-10-27 17:57:38 -05:00
Christopher Gundlach 3aefcbbe8c Merge pull request #333 from AntelopeIO/prometheus_pull
Add pull functionality
2022-10-27 10:21:33 -05:00
Jonathan Giszczak fbefdd1490 Interpret total nodes as per C++ version.
Revise graphviz labels for utility and readability.
Fix off-by-one error in star topology and add missing loop increment.
Prevent self-peers in star topology.
2022-10-26 18:59:08 -05:00
Jonathan Giszczak cf28213223 Add bind nodes to new Pythonic make_line()
Make a ring of nodes 00 through nn rather than bios through nn.
2022-10-26 14:28:50 -05:00
Jonathan Giszczak f2aae03434 Assign network port numbers correctly.
Start using the config directory.
Prefer pathlib rather than os.path.
Replace port of C++ version of make_line with Pythonic make_line.
2022-10-26 01:01:58 -05:00
Jonathan Giszczak 122a7ae43b Add additional command line arguments to support custom config dir
Add some default values.
Calculated p2p and http port sequence not working right still.
2022-10-24 10:47:59 -05:00
Chris Gundlach 81495ef1fd fix problem where empty string was returned; made stats its own struct 2022-10-21 12:56:03 -05:00
Chris Gundlach 1735247897 refactored based on review comments 2022-10-21 10:55:14 -05:00
Jonathan Giszczak 21e342fc80 Revert to generic python3 in shebang.
Make sure nodeDefinition name is initialized.
Use sensible default values that align with minimum network topology.
Default make_line to making a ring to match original behavior.
Remove extraneous line.
2022-10-17 16:34:14 -05:00
Chris Gundlach b6e93df693 added pull functionality 2022-10-17 09:09:04 -05:00
Jonathan Giszczak 5ec19e70dc Add data classes, populators, and topology generators 2022-10-17 01:50:33 -05:00
Christopher Gundlach bb86490614 Merge pull request #311 from AntelopeIO/prometheus_cpp_submodule
Add prometheus-cpp as a submodule
2022-10-11 10:10:15 -05:00
Chris Gundlach cc81f9e137 updated prometheus_plugin not to use submodule library version 2022-10-10 15:46:38 -05:00
Chris Gundlach cf1ca0678b added prometheus-cpp files to prometheus-core lib 2022-10-10 15:25:21 -05:00
Chris Gundlach 3c5561dd70 removed ported files 2022-10-10 15:18:01 -05:00
Chris Gundlach 0881ece722 added prometheus-cpp as submodule 2022-10-10 15:10:00 -05:00
Chris Gundlach 30f69ec758 Merge branch 'feature_prometheus_plugin' of https://github.com/AntelopeIO/leap into feature_prometheus_plugin 2022-10-06 10:28:32 -05:00
Chris Gundlach c673e984b0 Merge branch 'main' into feature_prometheus_plugin 2022-10-06 10:26:07 -05:00
Christopher Gundlach 26b8e59066 Merge pull request #258 from AntelopeIO/add_prometheus_library
Add Prometheus Library
2022-09-29 14:57:33 -05:00
Chris Gundlach b8b0e75513 removed PROMETHEUS_INSTALL_COMPONENT 2022-09-29 12:05:43 -05:00
Chris Gundlach 472ccc3929 took out cmake cruft 2022-09-29 12:01:36 -05:00
Chris Gundlach b16ed1de3b Merge branch 'main' into feature_prometheus_plugin 2022-09-29 10:22:19 -05:00
Chris Gundlach 167f9216be updated prometheus_plugin to be dependent on prometheus library 2022-09-29 10:14:14 -05:00
Chris Gundlach 1a9de428cb added prometheus library 2022-09-29 10:13:13 -05:00
Chris Gundlach eaeaf4ab3d Merge branch 'main' into feature_prometheus_plugin 2022-09-27 09:26:53 -05:00
Christopher Gundlach cf24fe9cbf Merge pull request #190 from AntelopeIO/add_prometheus_plugin
Add Prometheus Plugin
2022-09-20 14:10:21 -05:00
Chris Gundlach d351840a70 changed to make building prometheus plugin mandatory 2022-09-20 09:16:40 -05:00
Jonathan Giszczak 3b71f2a74a Port eosio-launcher to Python - initial commit with command line parsing 2022-09-19 17:14:02 -05:00
Chris Gundlach 78c6c77c00 took out unecessary includes/dependencies 2022-09-19 14:58:20 -05:00
Chris Gundlach 46582601ea took out unnecessary include/lib paths 2022-09-19 14:57:53 -05:00
Chris Gundlach cdb4156702 added prometheus plugin skeleton code 2022-09-19 14:22:21 -05:00
Chris Gundlach 642653a37f cmake changes to add prometheus plugin 2022-09-19 14:21:08 -05:00
334 changed files with 18774 additions and 10732 deletions
File diff suppressed because one or more lines are too long
@@ -28,7 +28,7 @@ try {
let subprocesses = [];
tests.forEach(t => {
subprocesses.push(new Promise(resolve => {
child_process.spawn("docker", ["run", "--name", t, "--init", "baseimage", "bash", "-c", `cd build; ctest --output-on-failure -R '^${t}$'`], {stdio:"inherit"}).on('close', code => resolve(code));
child_process.spawn("docker", ["run", "--security-opt", "seccomp=unconfined", "-e", "GITHUB_ACTIONS=True", "--name", t, "--init", "baseimage", "bash", "-c", `cd build; ctest --output-on-failure -R '^${t}$'`], {stdio:"inherit"}).on('close', code => resolve(code));
}));
});
+5 -3
View File
@@ -120,7 +120,9 @@ jobs:
matrix:
platform: [ubuntu20, ubuntu22]
runs-on: ["self-hosted", "enf-x86-hightier"]
container: ${{fromJSON(needs.d.outputs.p)[matrix.platform].image}}
container:
image: ${{fromJSON(needs.d.outputs.p)[matrix.platform].image}}
options: --security-opt seccomp=unconfined
steps:
- uses: actions/checkout@v3
- name: Download builddir
@@ -157,7 +159,7 @@ jobs:
uses: ./.github/actions/parallel-ctest-containers
with:
container: ${{fromJSON(needs.d.outputs.p)[matrix.platform].image}}
error-log-paths: '["build/etc", "build/var", "build/leap-ignition-wd"]'
error-log-paths: '["build/etc", "build/var", "build/leap-ignition-wd", "build/TestLogs"]'
log-tarball-prefix: ${{matrix.platform}}
tests-label: nonparallelizable_tests
- name: Upload logs from failed tests
@@ -186,7 +188,7 @@ jobs:
uses: ./.github/actions/parallel-ctest-containers
with:
container: ${{fromJSON(needs.d.outputs.p)[matrix.platform].image}}
error-log-paths: '["build/etc", "build/var", "build/leap-ignition-wd"]'
error-log-paths: '["build/etc", "build/var", "build/leap-ignition-wd", "build/TestLogs"]'
log-tarball-prefix: ${{matrix.platform}}
tests-label: long_running_tests
- name: Upload logs from failed tests
+1 -1
View File
@@ -82,7 +82,7 @@ deps/*
dependencies/*
etc/eosio/node_*
var/lib/node_*
TestLogs*
.vscode
.idea/
*.iws
+3
View File
@@ -22,6 +22,9 @@
[submodule "libraries/libfc/secp256k1/secp256k1"]
path = libraries/libfc/secp256k1/secp256k1
url = https://github.com/bitcoin-core/secp256k1
[submodule "libraries/prometheus/prometheus-cpp"]
path = libraries/prometheus/prometheus-cpp
url = https://github.com/jupp0r/prometheus-cpp.git
[submodule "libraries/libfc/libraries/bn256"]
path = libraries/libfc/libraries/bn256
url = https://github.com/AntelopeIO/bn256
+49 -4
View File
@@ -14,7 +14,7 @@ set( CMAKE_CXX_EXTENSIONS ON )
set( CXX_STANDARD_REQUIRED ON)
set(VERSION_MAJOR 4)
set(VERSION_MINOR 0)
set(VERSION_MINOR 1)
set(VERSION_PATCH 0)
set(VERSION_SUFFIX dev)
@@ -200,9 +200,6 @@ add_subdirectory( benchmark )
option(DISABLE_WASM_SPEC_TESTS "disable building of wasm spec unit tests" OFF)
install(FILES testnet.template DESTINATION ${CMAKE_INSTALL_FULL_SYSCONFDIR}/eosio/launcher COMPONENT dev EXCLUDE_FROM_ALL)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/testnet.template ${CMAKE_CURRENT_BINARY_DIR}/etc/eosio/launcher/testnet.template COPYONLY)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/eosio.version.in ${CMAKE_CURRENT_BINARY_DIR}/eosio.version.hpp)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/eosio.version.hpp DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR} COMPONENT dev EXCLUDE_FROM_ALL)
@@ -235,10 +232,58 @@ configure_file(libraries/wasm-jit/LICENSE licen
configure_file(libraries/libfc/secp256k1/secp256k1/COPYING licenses/leap/LICENSE.secp256k1 COPYONLY)
configure_file(libraries/libfc/include/fc/crypto/webauthn_json/license.txt licenses/leap/LICENSE.rapidjson COPYONLY)
configure_file(libraries/eos-vm/LICENSE licenses/leap/LICENSE.eos-vm COPYONLY)
configure_file(libraries/prometheus/prometheus-cpp/LICENSE licenses/leap/LICENSE.prom COPYONLY)
configure_file(programs/cleos/LICENSE.CLI11 licenses/leap/LICENSE.CLI11 COPYONLY)
install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/licenses/leap" DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/licenses/" COMPONENT base)
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/libraries/testing/contracts DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/leap_testing/libraries/testing COMPONENT dev EXCLUDE_FROM_ALL
PATTERN "CMakeFiles" EXCLUDE
PATTERN "*.cmake" EXCLUDE
PATTERN "Makefile" EXCLUDE)
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/unittests/contracts DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/leap_testing/unittests COMPONENT dev EXCLUDE_FROM_ALL
PATTERN "CMakeFiles" EXCLUDE
PATTERN "*.cmake" EXCLUDE
PATTERN "Makefile" EXCLUDE)
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/tests/TestHarness DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/leap_testing/tests COMPONENT dev EXCLUDE_FROM_ALL
FILES_MATCHING
PATTERN "*.py"
PATTERN "*.json"
PATTERN "__pycache__" EXCLUDE
PATTERN "CMakeFiles" EXCLUDE)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/tests/launcher.py DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/leap_testing/tests COMPONENT dev EXCLUDE_FROM_ALL)
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.21)
# Cmake versions < 3.21 did not support installing symbolic links to a directory via install(FILES ...)
# Cmake 3.21 fixed this (https://gitlab.kitware.com/cmake/cmake/-/commit/d71a7cc19d6e03f89581efdaa8d63db216184d40)
# If/when the lowest cmake version supported becomes >= 3.21, the else block as well as the postinit and prerm scripts
# would be a good option to remove in favor of using the facilities in cmake / cpack directly.
add_custom_target(link_target ALL
COMMAND ${CMAKE_COMMAND} -E make_directory lib/python3/dist-packages
COMMAND ${CMAKE_COMMAND} -E create_symlink ../../../share/leap_testing/tests/TestHarness lib/python3/dist-packages/TestHarness
COMMAND ${CMAKE_COMMAND} -E make_directory share/leap_testing
COMMAND ${CMAKE_COMMAND} -E create_symlink ../../bin share/leap_testing/bin)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/lib/python3/dist-packages/TestHarness DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}/python3/dist-packages COMPONENT dev EXCLUDE_FROM_ALL)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/share/leap_testing/bin DESTINATION ${CMAKE_INSTALL_FULL_DATAROOTDIR}/leap_testing COMPONENT dev EXCLUDE_FROM_ALL)
else()
# The following install(CODE ...) steps are necessary for `make dev-install` to work on cmake versions < 3.21.
# However, it can flag as an error if using `make package` instead of `make dev-install` for installation.
# This is due to those directories and symbolic links being created in the postinit script during the package install instead.
# Note If/when doing `make package`, it is not a true error if you see:
# Error creating directory "/<leap_install_dir>/lib/python3/dist-packages".
# CMake Error: failed to create symbolic link '/<leap_install_dir>/lib/python3/dist-packages/TestHarness': no such file or directory
# CMake Error: failed to create symbolic link '/<leap_install_dir>/share/leap_testing/bin': no such file or directory
install(CODE "execute_process( COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_INSTALL_FULL_LIBDIR}/python3/dist-packages)" COMPONENT dev EXCLUDE_FROM_ALL)
install(CODE "execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink ../../../share/leap_testing/tests/TestHarness ${CMAKE_INSTALL_FULL_LIBDIR}/python3/dist-packages/TestHarness)" COMPONENT dev EXCLUDE_FROM_ALL)
install(CODE "execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink ../../bin ${CMAKE_INSTALL_FULL_DATAROOTDIR}/leap_testing/bin)" COMPONENT dev EXCLUDE_FROM_ALL)
# The `make package` installation of symlinks happens via the `postinst` script installed in cmake.package via the line below
endif()
configure_file(${CMAKE_SOURCE_DIR}/libraries/cli11/bash-completion/completions/leap-util
${CMAKE_BINARY_DIR}/programs/leap-util/bash-completion/completions/leap-util COPYONLY)
configure_file(${CMAKE_SOURCE_DIR}/libraries/cli11/bash-completion/completions/cleos
+12 -9
View File
@@ -55,6 +55,7 @@ Requirements to build:
- git
- GMP
- Python 3
- python3-numpy
- zlib
### Step 1 - Clone
@@ -71,7 +72,7 @@ git clone --recursive https://github.com/AntelopeIO/leap.git
git clone --recursive git@github.com:AntelopeIO/leap.git
```
> ️ **HTTPS vs. SSH Clone**
> ️ **HTTPS vs. SSH Clone**
Both an HTTPS or SSH git clone will yield the same result - a folder named `leap` containing our source code. It doesn't matter which type you use.
Navigate into that folder:
@@ -95,13 +96,13 @@ git submodule update --init --recursive
### Step 3 - Build
Select build instructions below for a [pinned build](#pinned-build) (preferred) or an [unpinned build](#unpinned-build).
> ️ **Pinned vs. Unpinned Build**
> ️ **Pinned vs. Unpinned Build**
We have two types of builds for Leap: "pinned" and "unpinned." The only difference is that pinned builds use specific versions for some dependencies hand-picked by the Leap engineers - they are "pinned" to those versions. In contrast, unpinned builds use the default dependency versions available on the build system at the time. We recommend performing a "pinned" build to ensure the compiler and boost versions remain the same between builds of different Leap versions. Leap requires these versions to remain the same, otherwise its state might need to be recovered from a portable snapshot or the chain needs to be replayed.
> ⚠️ **A Warning On Parallel Compilation Jobs (`-j` flag)** ⚠️
> ⚠️ **A Warning On Parallel Compilation Jobs (`-j` flag)** ⚠️
When building C/C++ software, often the build is performed in parallel via a command such as `make -j "$(nproc)"` which uses all available CPU threads. However, be aware that some compilation units (`*.cpp` files) in Leap will consume nearly 4GB of memory. Failures due to memory exhaustion will typically, but not always, manifest as compiler crashes. Using all available CPU threads may also prevent you from doing other things on your computer during compilation. For these reasons, consider reducing this value.
> 🐋 **Docker and `sudo`** 🐋
> 🐋 **Docker and `sudo`** 🐋
If you are in an Ubuntu docker container, omit `sudo` from all commands because you run as `root` by default. Most other docker containers also exclude `sudo`, especially Debian-family containers. If your shell prompt is a hash tag (`#`), omit `sudo`.
#### Pinned Build
@@ -110,12 +111,14 @@ Make sure you are in the root of the `leap` repo, then run the `install_depts.sh
sudo scripts/install_deps.sh
```
Next, run the pinned build script. You have to give it three arguments, in the following order:
- A temporary folder, for all dependencies that need to be built from source.
- A build folder, where the binaries you need to install will be built to.
- The number of jobs or CPU cores/threads to use (note the [jobs flag](#step-3---build) warning above).
Next, run the pinned build script. You have to give it three arguments in the following order:
1. A temporary folder, for all dependencies that need to be built from source.
1. A build folder, where the binaries you need to install will be built to.
1. The number of jobs or CPU cores/threads to use (note the [jobs flag](#step-3---build) warning above).
The following command runs the `pinned_build.sh` script, specifies a `deps` and `build` folder in the root of the Leap repo for the first two arguments, then builds the packages using all of your computer's CPU threads (Note: you don't need `sudo` for this command):
> 🔒 You do not need to run this script with `sudo` or as root.
For example, the following command runs the `pinned_build.sh` script, specifies a `deps` and `build` folder in the root of the Leap repo for the first two arguments, then builds the packages using all of your computer's CPU threads:
```bash
scripts/pinned_build.sh deps build "$(nproc)"
```
@@ -143,7 +143,7 @@ We now have an account that is available to have a contract assigned to it, enab
In the fourth terminal window, start a second `nodeos` instance. Notice that this command line is substantially longer than the one we used above to create the first producer. This is necessary to avoid collisions with the first `nodeos` instance. Fortunately, you can just cut and paste this command line and adjust the keys:
```sh
nodeos --producer-name inita --plugin eosio::chain_api_plugin --plugin eosio::net_api_plugin --http-server-address 127.0.0.1:8889 --p2p-listen-endpoint 127.0.0.1:9877 --p2p-peer-address 127.0.0.1:9876 --config-dir node2 --data-dir node2 --private-key [\"EOS6hMjoWRF2L8x9YpeqtUEcsDKAyxSuM1APicxgRU1E3oyV5sDEg\",\"5JgbL2ZnoEAhTudReWH1RnMuQS6DBeLZt4ucV6t8aymVEuYg7sr\"]
nodeos --producer-name inita --plugin eosio::chain_api_plugin --plugin eosio::net_api_plugin --http-server-address 127.0.0.1:8889 --p2p-listen-endpoint 127.0.0.1:9877 --p2p-peer-address 127.0.0.1:9876 --config-dir node2 --data-dir node2 --signature-provider EOS6hMjoWRF2L8x9YpeqtUEcsDKAyxSuM1APicxgRU1E3oyV5sDEg=KEY:5JgbL2ZnoEAhTudReWH1RnMuQS6DBeLZt4ucV6t8aymVEuYg7sr
```
The output from this new node will show a little activity but will stop reporting until the last step in this tutorial, when the `inita` account is registered as a producer account and activated. Here is some example output from a newly started node. Your output might look a little different, depending on how much time you took entering each of these commands. Furthermore, this example is only the last few lines of output:
@@ -1,39 +0,0 @@
## Description
The `http_client_plugin` is an internal utility plugin, providing the `producer_plugin` the ability to use securely an external `keosd` instance as its block signer. It can only be used when the `producer_plugin` is configured to produce blocks.
## Usage
```console
# config.ini
plugin = eosio::http_client_plugin
https-client-root-cert = "path/to/my/certificate.pem"
https-client-validate-peers = 1
```
```sh
# command-line
nodeos ... --plugin eosio::http_client_plugin \
--https-client-root-cert "path/to/my/certificate.pem" \
--https-client-validate-peers 1
```
## Options
These can be specified from both the `nodeos` command-line or the `config.ini` file:
```console
Config Options for eosio::http_client_plugin:
--https-client-root-cert arg PEM encoded trusted root certificate
(or path to file containing one) used
to validate any TLS connections made.
(may specify multiple times)
--https-client-validate-peers arg (=1)
true: validate that the peer
certificates are valid and trusted,
false: ignore cert errors
```
## Dependencies
* [`producer_plugin`](../producer_plugin/index.md)
@@ -29,16 +29,6 @@ Config Options for eosio::http_plugin:
The local IP and port to listen for
incoming http connections; set blank to
disable.
--https-server-address arg The local IP and port to listen for
incoming https connections; leave blank
to disable.
--https-certificate-chain-file arg Filename with the certificate chain to
present on https connections. PEM
format. Required for https.
--https-private-key-file arg Filename with https private key in PEM
format. Required for https
--https-ecdh-curve arg (=secp384r1) Configure https ECDH curve to use:
secp384r1 or prime256v1
--access-control-allow-origin arg Specify the Access-Control-Allow-Origin
to be returned on each request
--access-control-allow-headers arg Specify the Access-Control-Allow-Header
-1
View File
@@ -11,7 +11,6 @@ For information on specific plugins, just select from the list below:
* [`chain_api_plugin`](chain_api_plugin/index.md)
* [`chain_plugin`](chain_plugin/index.md)
* [`db_size_api_plugin`](db_size_api_plugin/index.md)
* [`http_client_plugin`](http_client_plugin/index.md)
* [`http_plugin`](http_plugin/index.md)
* [`net_api_plugin`](net_api_plugin/index.md)
* [`net_plugin`](net_plugin/index.md)
@@ -39,10 +39,6 @@ Config Options for eosio::producer_plugin:
-p [ --producer-name ] arg ID of producer controlled by this node
(e.g. inita; may specify multiple
times)
--private-key arg (DEPRECATED - Use signature-provider
instead) Tuple of [public key, WIF
private key] (may specify multiple
times)
--signature-provider arg (=EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3)
Key=Value pairs in the form
<public-key>=<provider-spec>
@@ -81,7 +81,7 @@ Sample `logging.json`:
- Answers the question: is this useful information for a user that is monitoring the log output. Care should be taken not to create excessive log output; similar to `info` level logging.
- Enabling `debug` level logging should provide greater insight into behavior without overwhelming the output with log entries.
- `debug` level should not be used for *trace* level logging; to that end, use `all` (see below).
- Like `info`, no `debug` level logging should be produced for every transaction. There are specific transaction level loggers dedicated to transaction level logging: `transaction`, `transaction_trace_failure`, `transaction_trace_success`, `transaction_failure_tracing`, `transaction_success_tracing`.
- Like `info`, no `debug` level logging should be produced for every transaction. There are specific transaction level loggers dedicated to transaction level logging: `transaction`, `transaction_trace_failure`, `transaction_trace_success`, `transaction_failure_tracing`, `transaction_success_tracing`, `transient_trx_success_tracing`, `transient_trx_failure_tracing`.
* `all` (trace) - For logging that would be overwhelming if `debug` level logging were used.
- Can be used for trace level logging. Only used in a few places and not completely supported.
- *Note*: In the future a different logging library may provide better trace level logging support. The current logging framework is not performant enough to enable excess trace level output.
-10
View File
@@ -44,16 +44,6 @@ Config Options for eosio::http_plugin:
--http-server-address arg The local IP and port to listen for
incoming http connections; leave blank
to disable.
--https-server-address arg The local IP and port to listen for
incoming https connections; leave blank
to disable.
--https-certificate-chain-file arg Filename with the certificate chain to
present on https connections. PEM
format. Required for https.
--https-private-key-file arg Filename with https private key in PEM
format. Required for https
--https-ecdh-curve arg (=secp384r1) Configure https ECDH curve to use:
secp384r1 or prime256v1
--access-control-allow-origin arg Specify the Access-Control-Allow-Origin
to be returned on each request.
--access-control-allow-headers arg Specify the Access-Control-Allow-Header
-38
View File
@@ -1,38 +0,0 @@
---
content_title: eosio-blocklog
link_text: eosio-blocklog
---
`eosio-blocklog` is a command-line interface (CLI) utility that allows node operators to perform low-level tasks on the block logs created by a `nodeos` instance. `eosio-blocklog` can perform one of the following operations:
* Convert a range of blocks to JSON format, as single objects or array.
* Generate `blocks.index` from `blocks.log` in blocks directory.
* Trim `blocks.log` and `blocks.index` between a range of blocks.
* Perform consistency test between `blocks.log` and `blocks.index`.
* Output the results of the operation to a file or `stdout` (default).
## Usage
```sh
eosio-blocklog <options> ...
```
## Options
Option (=default) | Description
-|-
`--blocks-dir arg (="blocks")` | The location of the blocks directory (absolute path or relative to the current directory)
`-o [ --output-file ] arg` | The file to write the generated output to (absolute or relative path). If not specified then output is to `stdout`
`-f [ --first ] arg (=0)` | The first block number to log or the first block to keep if `trim-blocklog` specified
`-l [ --last ] arg (=4294967295)` | the last block number to log or the last block to keep if `trim-blocklog` specified
`--no-pretty-print` | Do not pretty print the output. Useful if piping to `jq` to improve performance
`--as-json-array` | Print out JSON blocks wrapped in JSON array (otherwise the output is free-standing JSON objects)
`--make-index` | Create `blocks.index` from `blocks.log`. Must give `blocks-dir` location. Give `output-file` relative to current directory or absolute path (default is `<blocks-dir>/blocks.index`)
`--trim-blocklog` | Trim `blocks.log` and `blocks.index`. Must give `blocks-dir` and `first` and/or `last` options.
`--smoke-test` | Quick test that `blocks.log` and `blocks.index` are well formed and agree with each other
`-h [ --help ]` | Print this help message and exit
## Remarks
When `eosio-blocklog` is launched, the utility attempts to perform the specified operation, then yields the following possible outcomes:
* If successful, the selected operation is performed and the utility terminates with a zero error code (no error).
* If unsuccessful, the utility outputs an error to `stderr` and terminates with a non-zero error code (indicating an error).
-1
View File
@@ -5,5 +5,4 @@ link_text: Antelope Utilities
This section contains documentation for additional utilities that complement or extend `nodeos` and potentially other Antelope software:
* [eosio-blocklog](eosio-blocklog.md) - Low-level utility for node operators to interact with block log files.
* [trace_api_util](trace_api_util.md) - Low-level utility for performing tasks associated with the [Trace API](../01_nodeos/03_plugins/trace_api_plugin/index.md).
+2
View File
@@ -12,6 +12,7 @@ add_subdirectory( wasm-jit )
add_subdirectory( chainbase )
set(APPBASE_ENABLE_AUTO_VERSION OFF CACHE BOOL "enable automatic discovery of version via 'git describe'")
add_subdirectory( appbase )
add_subdirectory( custom_appbase )
add_subdirectory( chain )
add_subdirectory( testing )
add_subdirectory( version )
@@ -27,3 +28,4 @@ set(ENABLE_PROFILE OFF CACHE BOOL "Enable for profile builds")
if(eos-vm IN_LIST EOSIO_WASM_RUNTIMES OR eos-vm-jit IN_LIST EOSIO_WASM_RUNTIMES)
add_subdirectory( eos-vm )
endif()
add_subdirectory( prometheus )
+32 -24
View File
@@ -70,9 +70,9 @@ namespace eosio { namespace chain {
);
}
abi_serializer::abi_serializer( const abi_def& abi, const yield_function_t& yield ) {
abi_serializer::abi_serializer( abi_def abi, const yield_function_t& yield ) {
configure_built_in_types();
set_abi(abi, yield);
set_abi(std::move(abi), yield);
}
abi_serializer::abi_serializer( const abi_def& abi, const fc::microseconds& max_serialization_time) {
@@ -128,11 +128,19 @@ namespace eosio { namespace chain {
built_in_types.emplace("extended_asset", pack_unpack<extended_asset>());
}
void abi_serializer::set_abi(const abi_def& abi, const yield_function_t& yield) {
void abi_serializer::set_abi(abi_def abi, const yield_function_t& yield) {
impl::abi_traverse_context ctx(yield);
EOS_ASSERT(starts_with(abi.version, "eosio::abi/1."), unsupported_abi_version_exception, "ABI has an unsupported version");
size_t types_size = abi.types.size();
size_t structs_size = abi.structs.size();
size_t actions_size = abi.actions.size();
size_t tables_size = abi.tables.size();
size_t error_messages_size = abi.error_messages.size();
size_t variants_size = abi.variants.value.size();
size_t action_results_size = abi.action_results.value.size();
typedefs.clear();
structs.clear();
actions.clear();
@@ -141,41 +149,41 @@ namespace eosio { namespace chain {
variants.clear();
action_results.clear();
for( const auto& st : abi.structs )
structs[st.name] = st;
for( auto& st : abi.structs )
structs[st.name] = std::move(st);
for( const auto& td : abi.types ) {
for( auto& td : abi.types ) {
EOS_ASSERT(!_is_type(td.new_type_name, ctx), duplicate_abi_type_def_exception,
"type already exists", ("new_type_name",impl::limit_size(td.new_type_name)));
typedefs[td.new_type_name] = td.type;
typedefs[std::move(td.new_type_name)] = std::move(td.type);
}
for( const auto& a : abi.actions )
actions[a.name] = a.type;
for( auto& a : abi.actions )
actions[std::move(a.name)] = std::move(a.type);
for( const auto& t : abi.tables )
tables[t.name] = t.type;
for( auto& t : abi.tables )
tables[std::move(t.name)] = std::move(t.type);
for( const auto& e : abi.error_messages )
error_messages[e.error_code] = e.error_msg;
for( auto& e : abi.error_messages )
error_messages[std::move(e.error_code)] = std::move(e.error_msg);
for( const auto& v : abi.variants.value )
variants[v.name] = v;
for( auto& v : abi.variants.value )
variants[v.name] = std::move(v);
for( const auto& r : abi.action_results.value )
action_results[r.name] = r.result_type;
for( auto& r : abi.action_results.value )
action_results[std::move(r.name)] = std::move(r.result_type);
/**
* The ABI vector may contain duplicates which would make it
* an invalid ABI
*/
EOS_ASSERT( typedefs.size() == abi.types.size(), duplicate_abi_type_def_exception, "duplicate type definition detected" );
EOS_ASSERT( structs.size() == abi.structs.size(), duplicate_abi_struct_def_exception, "duplicate struct definition detected" );
EOS_ASSERT( actions.size() == abi.actions.size(), duplicate_abi_action_def_exception, "duplicate action definition detected" );
EOS_ASSERT( tables.size() == abi.tables.size(), duplicate_abi_table_def_exception, "duplicate table definition detected" );
EOS_ASSERT( error_messages.size() == abi.error_messages.size(), duplicate_abi_err_msg_def_exception, "duplicate error message definition detected" );
EOS_ASSERT( variants.size() == abi.variants.value.size(), duplicate_abi_variant_def_exception, "duplicate variant definition detected" );
EOS_ASSERT( action_results.size() == abi.action_results.value.size(), duplicate_abi_action_results_def_exception, "duplicate action results definition detected" );
EOS_ASSERT( typedefs.size() == types_size, duplicate_abi_type_def_exception, "duplicate type definition detected" );
EOS_ASSERT( structs.size() == structs_size, duplicate_abi_struct_def_exception, "duplicate struct definition detected" );
EOS_ASSERT( actions.size() == actions_size, duplicate_abi_action_def_exception, "duplicate action definition detected" );
EOS_ASSERT( tables.size() == tables_size, duplicate_abi_table_def_exception, "duplicate table definition detected" );
EOS_ASSERT( error_messages.size() == error_messages_size, duplicate_abi_err_msg_def_exception, "duplicate error message definition detected" );
EOS_ASSERT( variants.size() == variants_size, duplicate_abi_variant_def_exception, "duplicate variant definition detected" );
EOS_ASSERT( action_results.size() == action_results_size, duplicate_abi_action_results_def_exception, "duplicate action results definition detected" );
validate(ctx);
}
+48 -32
View File
@@ -182,7 +182,7 @@ void apply_context::exec_one()
print_debug(receiver, trace);
}
if (auto dm_logger = control.get_deep_mind_logger())
if (auto dm_logger = control.get_deep_mind_logger(trx_context.is_transient()))
{
dm_logger->on_end_action();
}
@@ -289,7 +289,7 @@ void apply_context::require_recipient( account_name recipient ) {
schedule_action( action_ordinal, recipient, false )
);
if (auto dm_logger = control.get_deep_mind_logger()) {
if (auto dm_logger = control.get_deep_mind_logger(trx_context.is_transient())) {
dm_logger->on_require_recipient();
}
}
@@ -354,7 +354,7 @@ void apply_context::execute_inline( action&& a ) {
"inline action too big for nonprivileged account ${account}", ("account", a.account));
}
// No need to check authorization if replaying irreversible blocks or contract is privileged
if( !control.skip_auth_check() && !privileged ) {
if( !control.skip_auth_check() && !privileged && !trx_context.is_read_only() ) {
try {
control.get_authorization_manager()
.check_authorization( {a},
@@ -363,7 +363,7 @@ void apply_context::execute_inline( action&& a ) {
control.pending_block_time() - trx_context.published,
std::bind(&transaction_context::checktime, &this->trx_context),
false,
trx_context.is_dry_run(),
trx_context.is_dry_run(), // check_but_dont_fail
inherited_authorizations
);
@@ -394,7 +394,7 @@ void apply_context::execute_inline( action&& a ) {
schedule_action( std::move(a), inline_receiver, false )
);
if (auto dm_logger = control.get_deep_mind_logger()) {
if (auto dm_logger = control.get_deep_mind_logger(trx_context.is_transient())) {
dm_logger->on_send_inline();
}
}
@@ -419,13 +419,14 @@ void apply_context::execute_context_free_inline( action&& a ) {
schedule_action( std::move(a), inline_receiver, true )
);
if (auto dm_logger = control.get_deep_mind_logger()) {
if (auto dm_logger = control.get_deep_mind_logger(trx_context.is_transient())) {
dm_logger->on_send_context_free_inline();
}
}
void apply_context::schedule_deferred_transaction( const uint128_t& sender_id, account_name payer, transaction&& trx, bool replace_existing ) {
EOS_ASSERT( !trx_context.is_read_only(), transaction_exception, "cannot schedule a deferred transaction from within a readonly transaction" );
EOS_ASSERT( trx.context_free_actions.size() == 0, cfa_inside_generated_tx, "context free actions are not currently allowed in generated transactions" );
bool enforce_actor_whitelist_blacklist = trx_context.enforce_whiteblacklist && control.is_speculative_block()
@@ -557,7 +558,7 @@ void apply_context::schedule_deferred_transaction( const uint128_t& sender_id, a
subjective_block_production_exception,
"Replacing a deferred transaction is temporarily disabled." );
if (auto dm_logger = control.get_deep_mind_logger()) {
if (auto dm_logger = control.get_deep_mind_logger(trx_context.is_transient())) {
dm_logger->on_ram_trace(RAM_EVENT_ID("${id}", ("id", ptr->id)), "deferred_trx", "cancel", "deferred_trx_cancel");
}
@@ -575,7 +576,7 @@ void apply_context::schedule_deferred_transaction( const uint128_t& sender_id, a
trx_id_for_new_obj = ptr->trx_id;
}
if (auto dm_logger = control.get_deep_mind_logger()) {
if (auto dm_logger = control.get_deep_mind_logger(trx_context.is_transient())) {
dm_logger->on_cancel_deferred(deep_mind_handler::operation_qualifier::modify, *ptr);
}
@@ -592,7 +593,7 @@ void apply_context::schedule_deferred_transaction( const uint128_t& sender_id, a
trx_size = gtx.set( trx );
if (auto dm_logger = control.get_deep_mind_logger()) {
if (auto dm_logger = control.get_deep_mind_logger(trx_context.is_transient())) {
dm_logger->on_send_deferred(deep_mind_handler::operation_qualifier::modify, gtx);
dm_logger->on_ram_trace(RAM_EVENT_ID("${id}", ("id", gtx.id)), "deferred_trx", "update", "deferred_trx_add");
}
@@ -609,7 +610,7 @@ void apply_context::schedule_deferred_transaction( const uint128_t& sender_id, a
trx_size = gtx.set( trx );
if (auto dm_logger = control.get_deep_mind_logger()) {
if (auto dm_logger = control.get_deep_mind_logger(trx_context.is_transient())) {
dm_logger->on_send_deferred(deep_mind_handler::operation_qualifier::none, gtx);
dm_logger->on_ram_trace(RAM_EVENT_ID("${id}", ("id", gtx.id)), "deferred_trx", "add", "deferred_trx_add");
}
@@ -626,10 +627,11 @@ void apply_context::schedule_deferred_transaction( const uint128_t& sender_id, a
}
bool apply_context::cancel_deferred_transaction( const uint128_t& sender_id, account_name sender ) {
EOS_ASSERT( !trx_context.is_read_only(), transaction_exception, "cannot cancel a deferred transaction from within a readonly transaction" );
auto& generated_transaction_idx = db.get_mutable_index<generated_transaction_multi_index>();
const auto* gto = db.find<generated_transaction_object,by_sender_id>(boost::make_tuple(sender, sender_id));
if ( gto ) {
if (auto dm_logger = control.get_deep_mind_logger()) {
if (auto dm_logger = control.get_deep_mind_logger(trx_context.is_transient())) {
dm_logger->on_cancel_deferred(deep_mind_handler::operation_qualifier::none, *gto);
dm_logger->on_ram_trace(RAM_EVENT_ID("${id}", ("id", gto->id)), "deferred_trx", "cancel", "deferred_trx_cancel");
}
@@ -670,7 +672,7 @@ const table_id_object& apply_context::find_or_create_table( name code, name scop
return *existing_tid;
}
if (auto dm_logger = control.get_deep_mind_logger()) {
if (auto dm_logger = control.get_deep_mind_logger(trx_context.is_transient())) {
std::string event_id = RAM_EVENT_ID("${code}:${scope}:${table}",
("code", code)
("scope", scope)
@@ -687,14 +689,14 @@ const table_id_object& apply_context::find_or_create_table( name code, name scop
t_id.table = table;
t_id.payer = payer;
if (auto dm_logger = control.get_deep_mind_logger()) {
if (auto dm_logger = control.get_deep_mind_logger(trx_context.is_transient())) {
dm_logger->on_create_table(t_id);
}
});
}
void apply_context::remove_table( const table_id_object& tid ) {
if (auto dm_logger = control.get_deep_mind_logger()) {
if (auto dm_logger = control.get_deep_mind_logger(trx_context.is_transient())) {
std::string event_id = RAM_EVENT_ID("${code}:${scope}:${table}",
("code", tid.code)
("scope", tid.scope)
@@ -705,7 +707,7 @@ void apply_context::remove_table( const table_id_object& tid ) {
update_db_usage(tid.payer, - config::billable_size_v<table_id_object>);
if (auto dm_logger = control.get_deep_mind_logger()) {
if (auto dm_logger = control.get_deep_mind_logger(trx_context.is_transient())) {
dm_logger->on_remove_table(tid);
}
@@ -778,11 +780,13 @@ int apply_context::get_context_free_data( uint32_t index, char* buffer, size_t b
}
int apply_context::db_store_i64( name scope, name table, const account_name& payer, uint64_t id, const char* buffer, size_t buffer_size ) {
EOS_ASSERT( !trx_context.is_read_only(), table_operation_not_permitted, "cannot store a db record when executing a readonly transaction" );
return db_store_i64( receiver, scope, table, payer, id, buffer, buffer_size);
}
int apply_context::db_store_i64( name code, name scope, name table, const account_name& payer, uint64_t id, const char* buffer, size_t buffer_size ) {
// require_write_lock( scope );
EOS_ASSERT( !trx_context.is_read_only(), table_operation_not_permitted, "cannot store a db record when executing a readonly transaction" );
const auto& tab = find_or_create_table( code, scope, table, payer );
auto tableid = tab.id;
@@ -801,7 +805,7 @@ int apply_context::db_store_i64( name code, name scope, name table, const accoun
int64_t billable_size = (int64_t)(buffer_size + config::billable_size_v<key_value_object>);
if (auto dm_logger = control.get_deep_mind_logger()) {
if (auto dm_logger = control.get_deep_mind_logger(trx_context.is_transient())) {
std::string event_id = RAM_EVENT_ID("${table_code}:${scope}:${table_name}:${primkey}",
("table_code", tab.code)
("scope", tab.scope)
@@ -813,7 +817,7 @@ int apply_context::db_store_i64( name code, name scope, name table, const accoun
update_db_usage( payer, billable_size);
if (auto dm_logger = control.get_deep_mind_logger()) {
if (auto dm_logger = control.get_deep_mind_logger(trx_context.is_transient())) {
dm_logger->on_db_store_i64(tab, obj);
}
@@ -822,6 +826,7 @@ int apply_context::db_store_i64( name code, name scope, name table, const accoun
}
void apply_context::db_update_i64( int iterator, account_name payer, const char* buffer, size_t buffer_size ) {
EOS_ASSERT( !trx_context.is_read_only(), table_operation_not_permitted, "cannot update a db record when executing a readonly transaction" );
const key_value_object& obj = keyval_cache.get( iterator );
const auto& table_obj = keyval_cache.get_table( obj.t_id );
@@ -836,7 +841,7 @@ void apply_context::db_update_i64( int iterator, account_name payer, const char*
if( payer == account_name() ) payer = obj.payer;
std::string event_id;
if (control.get_deep_mind_logger() != nullptr) {
if (control.get_deep_mind_logger(trx_context.is_transient()) != nullptr) {
event_id = RAM_EVENT_ID("${table_code}:${scope}:${table_name}:${primkey}",
("table_code", table_obj.code)
("scope", table_obj.scope)
@@ -847,27 +852,27 @@ void apply_context::db_update_i64( int iterator, account_name payer, const char*
if( account_name(obj.payer) != payer ) {
// refund the existing payer
if (auto dm_logger = control.get_deep_mind_logger())
if (auto dm_logger = control.get_deep_mind_logger(trx_context.is_transient()))
{
dm_logger->on_ram_trace(std::string(event_id), "table_row", "remove", "primary_index_update_remove_old_payer");
}
update_db_usage( obj.payer, -(old_size) );
// charge the new payer
if (auto dm_logger = control.get_deep_mind_logger())
if (auto dm_logger = control.get_deep_mind_logger(trx_context.is_transient()))
{
dm_logger->on_ram_trace(std::move(event_id), "table_row", "add", "primary_index_update_add_new_payer");
}
update_db_usage( payer, (new_size));
} else if(old_size != new_size) {
// charge/refund the existing payer the difference
if (auto dm_logger = control.get_deep_mind_logger())
if (auto dm_logger = control.get_deep_mind_logger(trx_context.is_transient()))
{
dm_logger->on_ram_trace(std::move(event_id) , "table_row", "update", "primary_index_update");
}
update_db_usage( obj.payer, new_size - old_size);
}
if (auto dm_logger = control.get_deep_mind_logger()) {
if (auto dm_logger = control.get_deep_mind_logger(trx_context.is_transient())) {
dm_logger->on_db_update_i64(table_obj, obj, payer, buffer, buffer_size);
}
@@ -878,6 +883,7 @@ void apply_context::db_update_i64( int iterator, account_name payer, const char*
}
void apply_context::db_remove_i64( int iterator ) {
EOS_ASSERT( !trx_context.is_read_only(), table_operation_not_permitted, "cannot remove a db record when executing a readonly transaction" );
const key_value_object& obj = keyval_cache.get( iterator );
const auto& table_obj = keyval_cache.get_table( obj.t_id );
@@ -885,7 +891,7 @@ void apply_context::db_remove_i64( int iterator ) {
// require_write_lock( table_obj.scope );
if (auto dm_logger = control.get_deep_mind_logger()) {
if (auto dm_logger = control.get_deep_mind_logger(trx_context.is_transient())) {
std::string event_id = RAM_EVENT_ID("${table_code}:${scope}:${table_name}:${primkey}",
("table_code", table_obj.code)
("scope", table_obj.scope)
@@ -897,7 +903,7 @@ void apply_context::db_remove_i64( int iterator ) {
update_db_usage( obj.payer, -(obj.value.size() + config::billable_size_v<key_value_object>) );
if (auto dm_logger = control.get_deep_mind_logger()) {
if (auto dm_logger = control.get_deep_mind_logger(trx_context.is_transient())) {
dm_logger->on_db_remove_i64(table_obj, obj);
}
@@ -1029,17 +1035,27 @@ int apply_context::db_end_i64( name code, name scope, name table ) {
uint64_t apply_context::next_global_sequence() {
const auto& p = control.get_dynamic_global_properties();
db.modify( p, [&]( auto& dgp ) {
++dgp.global_action_sequence;
});
return p.global_action_sequence;
if ( trx_context.is_read_only() ) {
// To avoid confusion of duplicated global sequence number, hard code to be 0.
return 0;
} else {
db.modify( p, [&]( auto& dgp ) {
++dgp.global_action_sequence;
});
return p.global_action_sequence;
}
}
uint64_t apply_context::next_recv_sequence( const account_metadata_object& receiver_account ) {
db.modify( receiver_account, [&]( auto& ra ) {
++ra.recv_sequence;
});
return receiver_account.recv_sequence;
if ( trx_context.is_read_only() ) {
// To avoid confusion of duplicated receive sequence number, hard code to be 0.
return 0;
} else {
db.modify( receiver_account, [&]( auto& ra ) {
++ra.recv_sequence;
});
return receiver_account.recv_sequence;
}
}
uint64_t apply_context::next_auth_sequence( account_name actor ) {
const auto& amo = db.get<account_metadata_object,by_name>( actor );
+9 -7
View File
@@ -134,6 +134,7 @@ namespace eosio { namespace chain {
permission_name name,
permission_id_type parent,
const authority& auth,
bool is_trx_transient,
time_point initial_creation_time
)
{
@@ -158,7 +159,7 @@ namespace eosio { namespace chain {
p.last_updated = creation_time;
p.auth = auth;
if (auto dm_logger = _control.get_deep_mind_logger()) {
if (auto dm_logger = _control.get_deep_mind_logger(is_trx_transient)) {
dm_logger->on_create_permission(p);
}
});
@@ -169,6 +170,7 @@ namespace eosio { namespace chain {
permission_name name,
permission_id_type parent,
authority&& auth,
bool is_trx_transient,
time_point initial_creation_time
)
{
@@ -193,20 +195,20 @@ namespace eosio { namespace chain {
p.last_updated = creation_time;
p.auth = std::move(auth);
if (auto dm_logger = _control.get_deep_mind_logger()) {
if (auto dm_logger = _control.get_deep_mind_logger(is_trx_transient)) {
dm_logger->on_create_permission(p);
}
});
return perm;
}
void authorization_manager::modify_permission( const permission_object& permission, const authority& auth ) {
void authorization_manager::modify_permission( const permission_object& permission, const authority& auth, bool is_trx_transient ) {
for(const key_weight& k: auth.keys)
EOS_ASSERT(k.key.which() < _db.get<protocol_state_object>().num_supported_key_types, unactivated_key_type,
"Unactivated key type used when modifying permission");
_db.modify( permission, [&](permission_object& po) {
auto dm_logger = _control.get_deep_mind_logger();
auto dm_logger = _control.get_deep_mind_logger(is_trx_transient);
std::optional<permission_object> old_permission;
if (dm_logger) {
@@ -216,13 +218,13 @@ namespace eosio { namespace chain {
po.auth = auth;
po.last_updated = _control.pending_block_time();
if (auto dm_logger = _control.get_deep_mind_logger()) {
if (auto dm_logger = _control.get_deep_mind_logger(is_trx_transient)) {
dm_logger->on_modify_permission(*old_permission, po);
}
});
}
void authorization_manager::remove_permission( const permission_object& permission ) {
void authorization_manager::remove_permission( const permission_object& permission, bool is_trx_transient ) {
const auto& index = _db.template get_index<permission_index, by_parent>();
auto range = index.equal_range(permission.id);
EOS_ASSERT( range.first == range.second, action_validate_exception,
@@ -230,7 +232,7 @@ namespace eosio { namespace chain {
_db.get_mutable_index<permission_usage_index>().remove_object( permission.usage_id._id );
if (auto dm_logger = _control.get_deep_mind_logger()) {
if (auto dm_logger = _control.get_deep_mind_logger(is_trx_transient)) {
dm_logger->on_remove_permission(permission);
}
+1512 -1356
View File
File diff suppressed because it is too large Load Diff
+198 -121
View File
@@ -34,6 +34,7 @@
#include <fc/variant_object.hpp>
#include <new>
#include <shared_mutex>
namespace eosio { namespace chain {
@@ -224,7 +225,6 @@ struct controller_impl {
std::optional<pending_state> pending;
block_state_ptr head;
fork_database fork_db;
wasm_interface wasmif;
resource_limits_manager resource_limits;
authorization_manager authorization;
protocol_feature_manager protocol_features;
@@ -238,17 +238,25 @@ struct controller_impl {
uint32_t snapshot_head_block = 0;
struct chain; // chain is a namespace so use an embedded type for the named_thread_pool tag
named_thread_pool<chain> thread_pool;
platform_timer timer;
deep_mind_handler* deep_mind_logger = nullptr;
bool okay_to_print_integrity_hash_on_stop = false;
std::thread::id main_thread_id;
thread_local static platform_timer timer; // a copy for main thread and each read-only thread
#if defined(EOSIO_EOS_VM_RUNTIME_ENABLED) || defined(EOSIO_EOS_VM_JIT_RUNTIME_ENABLED)
vm::wasm_allocator wasm_alloc;
thread_local static vm::wasm_allocator wasm_alloc; // a copy for main thread and each read-only thread
#endif
// Ideally wasmif should be thread_local which must be a static.
// Unittests can create multiple controller objects (testers) at the same time,
// which overwrites the same static wasmif, is used for eosvmoc too.
wasm_interface wasmif; // used by main thread and all threads for EOSVMOC
thread_local static std::unique_ptr<wasm_interface> wasmif_thread_local; // a copy for each read-only thread, used by eos-vm and eos-vm-jit
typedef pair<scope_name,action_name> handler_key;
map< account_name, map<handler_key, apply_handler> > apply_handlers;
unordered_map< builtin_protocol_feature_t, std::function<void(controller_impl&)>, enum_hash<builtin_protocol_feature_t> > protocol_feature_activation_handlers;
void pop_block() {
auto prev = fork_db.get_block( head->header.previous );
@@ -293,16 +301,17 @@ struct controller_impl {
db( cfg.state_dir,
cfg.read_only ? database::read_only : database::read_write,
cfg.state_size, false, cfg.db_map_mode ),
blog( cfg.blocks_dir, cfg.prune_config ),
blog( cfg.blocks_dir, cfg.blog ),
fork_db( cfg.blocks_dir / config::reversible_blocks_dir_name ),
wasmif( cfg.wasm_runtime, cfg.eosvmoc_tierup, db, cfg.state_dir, cfg.eosvmoc_config, !cfg.profile_accounts.empty() ),
resource_limits( db, [&s]() { return s.get_deep_mind_logger(); }),
resource_limits( db, [&s](bool is_trx_transient) { return s.get_deep_mind_logger(is_trx_transient); }),
authorization( s, db ),
protocol_features( std::move(pfs), [&s]() { return s.get_deep_mind_logger(); } ),
protocol_features( std::move(pfs), [&s](bool is_trx_transient) { return s.get_deep_mind_logger(is_trx_transient); } ),
conf( cfg ),
chain_id( chain_id ),
read_mode( cfg.read_mode ),
thread_pool()
thread_pool(),
main_thread_id( std::this_thread::get_id() ),
wasmif( conf.wasm_runtime, conf.eosvmoc_tierup, db, conf.state_dir, conf.eosvmoc_config, !conf.profile_accounts.empty() )
{
fork_db.open( [this]( block_timestamp_type timestamp,
const flat_set<digest_type>& cur_features,
@@ -328,7 +337,7 @@ struct controller_impl {
set_activation_handler<builtin_protocol_feature_t::crypto_primitives>();
self.irreversible_block.connect([this](const block_state_ptr& bsp) {
wasmif.current_lib(bsp->block_num);
get_wasm_interface().current_lib(bsp->block_num);
});
@@ -384,7 +393,10 @@ struct controller_impl {
}
void dmlog_applied_transaction(const transaction_trace_ptr& t) {
if (auto dm_logger = get_deep_mind_logger()) {
// dmlog_applied_transaction is called by push_scheduled_transaction
// where transient transactions are not possible, and by push_transaction
// only when the transaction is not transient
if (auto dm_logger = get_deep_mind_logger(false)) {
dm_logger->on_applied_transaction(self.head_block_num() + 1, t);
}
}
@@ -392,20 +404,21 @@ struct controller_impl {
void log_irreversible() {
EOS_ASSERT( fork_db.root(), fork_database_exception, "fork database not properly initialized" );
const auto& log_head = blog.head();
const block_id_type log_head_id = blog.head_id();
const bool valid_log_head = !log_head_id.empty();
auto lib_num = log_head ? log_head->block_num() : (blog.first_block_num() - 1);
const auto lib_num = valid_log_head ? block_header::num_from_id(log_head_id) : (blog.first_block_num() - 1);
auto root_id = fork_db.root()->id;
if( log_head ) {
EOS_ASSERT( root_id == blog.head_id(), fork_database_exception, "fork database root does not match block log head" );
if( valid_log_head ) {
EOS_ASSERT( root_id == log_head_id, fork_database_exception, "fork database root does not match block log head" );
} else {
EOS_ASSERT( fork_db.root()->block_num == lib_num, fork_database_exception,
"empty block log expects the first appended block to build off a block that is not the fork database root. root block number: ${block_num}, lib: ${lib_num}", ("block_num", fork_db.root()->block_num) ("lib_num", lib_num) );
}
auto fork_head = (read_mode == db_read_mode::IRREVERSIBLE) ? fork_db.pending_head() : fork_db.head();
const auto fork_head = fork_db_head();
if( fork_head->dpos_irreversible_blocknum <= lib_num )
return;
@@ -483,12 +496,12 @@ struct controller_impl {
}
void replay(std::function<bool()> check_shutdown) {
if( !blog.head() && !fork_db.root() ) {
auto blog_head = blog.head();
if( !blog_head && !fork_db.root() ) {
fork_db.reset( *head );
return;
}
auto blog_head = blog.head();
replaying = true;
auto start_block_num = head->block_num + 1;
auto start = fc::time_point::now();
@@ -570,8 +583,8 @@ struct controller_impl {
ilog( "Starting initialization from snapshot, this may take a significant amount of time" );
try {
snapshot->validate();
if( blog.head() ) {
read_from_snapshot( snapshot, blog.first_block_num(), blog.head()->block_num() );
if( auto blog_head = blog.head() ) {
read_from_snapshot( snapshot, blog.first_block_num(), blog_head->block_num() );
} else {
read_from_snapshot( snapshot, 0, std::numeric_limits<uint32_t>::max() );
const uint32_t lib_num = head->block_num;
@@ -587,10 +600,6 @@ struct controller_impl {
elog( "Failed initialization from snapshot - db storage not configured to have enough storage for the provided snapshot, please increase and retry snapshot" );
shutdown();
}
if (conf.prune_config && conf.prune_config->prune_blocks == 0) {
blog.remove();
}
}
void startup(std::function<void()> shutdown, std::function<bool()> check_shutdown, const genesis_state& genesis) {
@@ -624,10 +633,6 @@ struct controller_impl {
blog.reset( genesis, head->block );
}
init(check_shutdown);
if (conf.prune_config && conf.prune_config->prune_blocks == 0) {
blog.remove();
}
}
void startup(std::function<void()> shutdown, std::function<bool()> check_shutdown) {
@@ -637,15 +642,15 @@ struct controller_impl {
this->shutdown = shutdown;
uint32_t lib_num = fork_db.root()->block_num;
auto first_block_num = blog.first_block_num();
if( blog.head() ) {
EOS_ASSERT( first_block_num <= lib_num && lib_num <= blog.head()->block_num(),
if( auto blog_head = blog.head() ) {
EOS_ASSERT( first_block_num <= lib_num && lib_num <= blog_head->block_num(),
block_log_exception,
"block log (ranging from ${block_log_first_num} to ${block_log_last_num}) does not contain the last irreversible block (${fork_db_lib})",
("block_log_first_num", first_block_num)
("block_log_last_num", blog.head()->block_num())
("block_log_last_num", blog_head->block_num())
("fork_db_lib", lib_num)
);
lib_num = blog.head()->block_num();
lib_num = blog_head->block_num();
} else {
if( first_block_num != (lib_num + 1) ) {
blog.reset( chain_id, lib_num + 1 );
@@ -658,10 +663,6 @@ struct controller_impl {
head = fork_db.head();
init(check_shutdown);
if (conf.prune_config && conf.prune_config->prune_blocks == 0) {
blog.remove();
}
}
@@ -712,7 +713,8 @@ struct controller_impl {
protocol_features.init( db );
if (auto dm_logger = get_deep_mind_logger()) {
// At startup, no transaction specific logging is possible
if (auto dm_logger = get_deep_mind_logger(false)) {
dm_logger->on_startup(db, head->block_num);
}
@@ -1028,22 +1030,23 @@ struct controller_impl {
});
const auto& owner_permission = authorization.create_permission(name, config::owner_name, 0,
owner, initial_timestamp );
owner, false, initial_timestamp );
const auto& active_permission = authorization.create_permission(name, config::active_name, owner_permission.id,
active, initial_timestamp );
active, false, initial_timestamp );
resource_limits.initialize_account(name);
resource_limits.initialize_account(name, false);
int64_t ram_delta = config::overhead_per_account_ram_bytes;
ram_delta += 2*config::billable_size_v<permission_object>;
ram_delta += owner_permission.auth.get_billable_size();
ram_delta += active_permission.auth.get_billable_size();
if (auto dm_logger = get_deep_mind_logger()) {
// This is only called at startup, no transaction specific logging is possible
if (auto dm_logger = get_deep_mind_logger(false)) {
dm_logger->on_ram_trace(RAM_EVENT_ID("${name}", ("name", name)), "account", "add", "newaccount");
}
resource_limits.add_pending_ram_usage(name, ram_delta);
resource_limits.add_pending_ram_usage(name, ram_delta, false); // false for doing dm logging
resource_limits.verify_account_ram_usage(name);
}
@@ -1096,17 +1099,24 @@ struct controller_impl {
config::majority_producers_permission_name,
active_permission.id,
active_producers_authority,
false,
genesis.initial_timestamp );
authorization.create_permission( config::producers_account_name,
config::minority_producers_permission_name,
majority_permission.id,
active_producers_authority,
false,
genesis.initial_timestamp );
}
// The returned scoped_exit should not exceed the lifetime of the pending which existed when make_block_restore_point was called.
fc::scoped_exit<std::function<void()>> make_block_restore_point() {
fc::scoped_exit<std::function<void()>> make_block_restore_point( bool is_read_only = false ) {
if ( is_read_only ) {
std::function<void()> callback = []() { };
return fc::make_scoped_exit( std::move(callback) );
}
auto& bb = std::get<building_block>(pending->_block_stage);
auto orig_trx_receipts_size = bb._pending_trx_receipts.size();
auto orig_trx_metas_size = bb._pending_trx_metas.size();
@@ -1153,14 +1163,14 @@ struct controller_impl {
etrx.set_reference_block( self.head_block_id() );
}
if (auto dm_logger = get_deep_mind_logger()) {
dm_logger->on_onerror(etrx);
}
transaction_checktime_timer trx_timer(timer);
const packed_transaction trx( std::move( etrx ) );
transaction_context trx_context( self, trx, std::move(trx_timer), start );
if (auto dm_logger = get_deep_mind_logger(trx_context.is_transient())) {
dm_logger->on_onerror(etrx);
}
trx_context.block_deadline = block_deadline;
trx_context.max_transaction_time_subjective = max_transaction_time;
trx_context.explicit_billed_cpu_time = explicit_billed_cpu_time;
@@ -1209,12 +1219,13 @@ struct controller_impl {
}
int64_t remove_scheduled_transaction( const generated_transaction_object& gto ) {
if (auto dm_logger = get_deep_mind_logger()) {
// deferred transactions cannot be transient.
if (auto dm_logger = get_deep_mind_logger(false)) {
dm_logger->on_ram_trace(RAM_EVENT_ID("${id}", ("id", gto.id)), "deferred_trx", "remove", "deferred_trx_removed");
}
int64_t ram_delta = -(config::billable_size_v<generated_transaction_object> + gto.packed_trx.size());
resource_limits.add_pending_ram_usage( gto.payer, ram_delta );
resource_limits.add_pending_ram_usage( gto.payer, ram_delta, false ); // false for doing dm logging
// No need to verify_account_ram_usage since we are only reducing memory
db.remove( gto );
@@ -1319,7 +1330,7 @@ struct controller_impl {
uint32_t cpu_time_to_bill_us = billed_cpu_time_us;
transaction_checktime_timer trx_timer(timer);
transaction_checktime_timer trx_timer( timer );
transaction_context trx_context( self, *trx->packed_trx(), std::move(trx_timer) );
trx_context.leeway = fc::microseconds(0); // avoid stealing cpu resource
trx_context.block_deadline = block_deadline;
@@ -1337,7 +1348,8 @@ struct controller_impl {
trace->except_ptr = std::current_exception();
trace->elapsed = fc::time_point::now() - start;
if (auto dm_logger = get_deep_mind_logger()) {
// deferred transactions cannot be transient
if (auto dm_logger = get_deep_mind_logger(false)) {
dm_logger->on_fail_deferred();
}
};
@@ -1518,7 +1530,7 @@ struct controller_impl {
transaction_trace_ptr trace;
try {
auto start = fc::time_point::now();
const bool check_auth = !self.skip_auth_check() && !trx->implicit();
const bool check_auth = !self.skip_auth_check() && !trx->implicit() && !trx->is_read_only();
const fc::microseconds sig_cpu_usage = trx->signature_cpu_usage();
if( !explicit_billed_cpu_time ) {
@@ -1577,14 +1589,14 @@ struct controller_impl {
trx_context.exec();
trx_context.finalize(); // Automatically rounds up network and CPU usage in trace and bills payers if successful
auto restore = make_block_restore_point();
auto restore = make_block_restore_point( trx->is_read_only() );
if (!trx->implicit()) {
trx->billed_cpu_time_us = trx_context.billed_cpu_time_us;
if (!trx->implicit() && !trx->is_read_only()) {
transaction_receipt::status_enum s = (trx_context.delay == fc::seconds(0))
? transaction_receipt::executed
: transaction_receipt::delayed;
trace->receipt = push_receipt(*trx->packed_trx(), s, trx_context.billed_cpu_time_us, trace->net_usage);
trx->billed_cpu_time_us = trx_context.billed_cpu_time_us;
std::get<building_block>(pending->_block_stage)._pending_trx_metas.emplace_back(trx);
} else {
transaction_receipt_header r;
@@ -1594,22 +1606,22 @@ struct controller_impl {
trace->receipt = r;
}
fc::move_append( std::get<building_block>(pending->_block_stage)._action_receipt_digests,
std::move(trx_context.executed_action_receipt_digests) );
if ( !trx->is_read_only() ) {
fc::move_append( std::get<building_block>(pending->_block_stage)._action_receipt_digests,
std::move(trx_context.executed_action_receipt_digests) );
if ( !trx->is_dry_run() ) {
// call the accept signal but only once for this transaction
if (!trx->accepted) {
trx->accepted = true;
emit(self.accepted_transaction, trx);
}
// call the accept signal but only once for this transaction
if (!trx->is_dry_run()) {
if (!trx->accepted) {
trx->accepted = true;
emit(self.accepted_transaction, trx);
dmlog_applied_transaction(trace);
emit(self.applied_transaction, std::tie(trace, trx->packed_trx()));
}
dmlog_applied_transaction(trace);
emit(self.applied_transaction, std::tie(trace, trx->packed_trx()));
}
if ( trx->is_dry_run() ) {
if ( trx->is_transient() ) {
// remove trx from pending block by not canceling 'restore'
trx_context.undo(); // this will happen automatically in destructor, but make it more explicit
} else if ( pending->_block_status == controller::block_status::ephemeral ) {
@@ -1624,7 +1636,7 @@ struct controller_impl {
trx_context.squash();
}
if( !trx->is_dry_run() ) {
if( !trx->is_transient() ) {
pending->_block_report.total_net_usage += trace->net_usage;
pending->_block_report.total_cpu_usage_us += trace->receipt->cpu_usage_us;
pending->_block_report.total_elapsed_time += trace->elapsed;
@@ -1647,7 +1659,7 @@ struct controller_impl {
handle_exception(wrapper);
}
if (!trx->is_dry_run()) {
if (!trx->is_transient()) {
emit(self.accepted_transaction, trx);
dmlog_applied_transaction(trace);
emit(self.applied_transaction, std::tie(trace, trx->packed_trx()));
@@ -1673,7 +1685,8 @@ struct controller_impl {
emit( self.block_start, head->block_num + 1 );
if (auto dm_logger = get_deep_mind_logger()) {
// at block level, no transaction specific logging is possible
if (auto dm_logger = get_deep_mind_logger(false)) {
// The head block represents the block just before this one that is about to start, so add 1 to get this block num
dm_logger->on_start_block(head->block_num + 1);
}
@@ -1925,7 +1938,8 @@ struct controller_impl {
EOS_ASSERT( bsp == head, fork_database_exception, "committed block did not become the new head in fork database");
}
if (auto dm_logger = get_deep_mind_logger()) {
// at block level, no transaction specific logging is possible
if (auto dm_logger = get_deep_mind_logger(false)) {
dm_logger->on_accepted_block(bsp);
}
@@ -2320,7 +2334,8 @@ struct controller_impl {
ilog("switching forks from ${current_head_id} (block number ${current_head_num}) to ${new_head_id} (block number ${new_head_num})",
("current_head_id", head->id)("current_head_num", head->block_num)("new_head_id", new_head->id)("new_head_num", new_head->block_num) );
if (auto dm_logger = get_deep_mind_logger()) {
// not possible to log transaction specific infor when switching forks
if (auto dm_logger = get_deep_mind_logger(false)) {
dm_logger->on_switch_forks(head->id, new_head->id);
}
@@ -2639,23 +2654,65 @@ struct controller_impl {
trx.set_reference_block( self.head_block_id() );
}
if (auto dm_logger = get_deep_mind_logger()) {
// onblock transaction cannot be transient
if (auto dm_logger = get_deep_mind_logger(false)) {
dm_logger->on_onblock(trx);
}
return trx;
}
inline deep_mind_handler* get_deep_mind_logger() const {
return deep_mind_logger;
inline deep_mind_handler* get_deep_mind_logger(bool is_trx_transient) const {
// do not perform deep mind logging for read-only and dry-run transactions
return is_trx_transient ? nullptr : deep_mind_logger;
}
uint32_t earliest_available_block_num() const {
return (blog.first_block_num() != 0) ? blog.first_block_num() : fork_db.root()->block_num;
}
#ifdef EOSIO_EOS_VM_OC_RUNTIME_ENABLED
bool is_eos_vm_oc_enabled() const {
return ( conf.eosvmoc_tierup || conf.wasm_runtime == wasm_interface::vm_type::eos_vm_oc );
}
#endif
// only called from non-main threads (read-only trx execution threads)
// when producer_plugin starts them
void init_thread_local_data() {
EOS_ASSERT( !is_main_thread(), misc_exception, "init_thread_local_data called on the main thread");
#ifdef EOSIO_EOS_VM_OC_RUNTIME_ENABLED
if ( is_eos_vm_oc_enabled() )
// EOSVMOC needs further initialization of its thread local data
wasmif.init_thread_local_data();
else
#endif
// Non-EOSVMOC needs a wasmif per thread
wasmif_thread_local = std::make_unique<wasm_interface>( conf.wasm_runtime, conf.eosvmoc_tierup, db, conf.state_dir, conf.eosvmoc_config, !conf.profile_accounts.empty());
}
bool is_main_thread() { return main_thread_id == std::this_thread::get_id(); };
wasm_interface& get_wasm_interface() {
if ( is_main_thread()
#ifdef EOSIO_EOS_VM_OC_RUNTIME_ENABLED
|| is_eos_vm_oc_enabled()
#endif
)
return wasmif;
else
return *wasmif_thread_local;
}
block_state_ptr fork_db_head() const;
}; /// controller_impl
thread_local platform_timer controller_impl::timer;
#if defined(EOSIO_EOS_VM_RUNTIME_ENABLED) || defined(EOSIO_EOS_VM_JIT_RUNTIME_ENABLED)
thread_local eosio::vm::wasm_allocator controller_impl::wasm_alloc;
#endif
thread_local std::unique_ptr<wasm_interface> controller_impl::wasmif_thread_local;
const resource_limits_manager& controller::get_resource_limits_manager()const
{
return my->resource_limits;
@@ -2726,7 +2783,7 @@ chainbase::database& controller::mutable_db()const { return my->db; }
const fork_database& controller::fork_db()const { return my->fork_db; }
void controller::preactivate_feature( const digest_type& feature_digest ) {
void controller::preactivate_feature( const digest_type& feature_digest, bool is_trx_transient ) {
const auto& pfs = my->protocol_features.get_protocol_feature_set();
auto cur_time = pending_block_time();
@@ -2823,7 +2880,7 @@ void controller::preactivate_feature( const digest_type& feature_digest ) {
("digest", feature_digest)
);
if (auto dm_logger = get_deep_mind_logger()) {
if (auto dm_logger = get_deep_mind_logger(is_trx_transient)) {
const auto feature = pfs.get_protocol_feature(feature_digest);
dm_logger->on_preactivate_feature(feature);
@@ -3008,36 +3065,23 @@ block_state_ptr controller::head_block_state()const {
return my->head;
}
block_state_ptr controller_impl::fork_db_head() const {
if( read_mode == db_read_mode::IRREVERSIBLE ) {
// When in IRREVERSIBLE mode fork_db blocks are marked valid when they become irreversible so that
// fork_db.head() returns irreversible block
// Use pending_head since this method should return the chain head and not last irreversible.
return fork_db.pending_head();
} else {
return fork_db.head();
}
}
uint32_t controller::fork_db_head_block_num()const {
return my->fork_db.head()->block_num;
return my->fork_db_head()->block_num;
}
block_id_type controller::fork_db_head_block_id()const {
return my->fork_db.head()->id;
}
time_point controller::fork_db_head_block_time()const {
return my->fork_db.head()->header.timestamp;
}
account_name controller::fork_db_head_block_producer()const {
return my->fork_db.head()->header.producer;
}
uint32_t controller::fork_db_pending_head_block_num()const {
return my->fork_db.pending_head()->block_num;
}
block_id_type controller::fork_db_pending_head_block_id()const {
return my->fork_db.pending_head()->id;
}
time_point controller::fork_db_pending_head_block_time()const {
return my->fork_db.pending_head()->header.timestamp;
}
account_name controller::fork_db_pending_head_block_producer()const {
return my->fork_db.pending_head()->header.producer;
return my->fork_db_head()->id;
}
time_point controller::pending_block_time()const {
@@ -3101,7 +3145,7 @@ const global_property_object& controller::get_global_properties()const {
return my->db.get<global_property_object>();
}
signed_block_ptr controller::fetch_block_by_id( block_id_type id )const {
signed_block_ptr controller::fetch_block_by_id( const block_id_type& id )const {
auto state = my->fork_db.get_block(id);
if( state && state->block ) return state->block;
auto bptr = my->blog.read_block_by_num( block_header::num_from_id(id) );
@@ -3109,6 +3153,14 @@ signed_block_ptr controller::fetch_block_by_id( block_id_type id )const {
return signed_block_ptr();
}
std::optional<signed_block_header> controller::fetch_block_header_by_id( const block_id_type& id )const {
auto state = my->fork_db.get_block(id);
if( state && state->block ) return state->header;
auto result = my->blog.read_block_header_by_num( block_header::num_from_id(id) );
if( result && result->calculate_id() == id ) return result;
return {};
}
signed_block_ptr controller::fetch_block_by_number( uint32_t block_num )const { try {
auto blk_state = fetch_block_state_by_number( block_num );
if( blk_state ) {
@@ -3118,25 +3170,25 @@ signed_block_ptr controller::fetch_block_by_number( uint32_t block_num )const {
return my->blog.read_block_by_num(block_num);
} FC_CAPTURE_AND_RETHROW( (block_num) ) }
std::optional<signed_block_header> controller::fetch_block_header_by_number( uint32_t block_num )const { try {
auto blk_state = fetch_block_state_by_number( block_num );
if( blk_state ) {
return blk_state->header;
}
return my->blog.read_block_header_by_num(block_num);
} FC_CAPTURE_AND_RETHROW( (block_num) ) }
block_state_ptr controller::fetch_block_state_by_id( block_id_type id )const {
auto state = my->fork_db.get_block(id);
return state;
}
block_state_ptr controller::fetch_block_state_by_number( uint32_t block_num )const { try {
if( my->read_mode == db_read_mode::IRREVERSIBLE ) {
return my->fork_db.search_on_branch( my->fork_db.pending_head()->id, block_num );
} else {
return my->fork_db.search_on_branch( my->fork_db.head()->id, block_num );
}
return my->fork_db.search_on_branch( fork_db_head_block_id(), block_num );
} FC_CAPTURE_AND_RETHROW( (block_num) ) }
block_id_type controller::get_block_id_for_num( uint32_t block_num )const { try {
const auto& tapos_block_summary = db().get<block_summary_object>((uint16_t)block_num);
if( block_header::num_from_id(tapos_block_summary.block_id) == block_num )
return tapos_block_summary.block_id;
const auto& blog_head = my->blog.head();
bool find_in_blog = (blog_head && block_num <= blog_head->block_num());
@@ -3335,7 +3387,7 @@ const apply_handler* controller::find_apply_handler( account_name receiver, acco
return nullptr;
}
wasm_interface& controller::get_wasm_interface() {
return my->wasmif;
return my->get_wasm_interface();
}
const account_object& controller::get_account( account_name name )const
@@ -3486,7 +3538,9 @@ void controller::add_to_ram_correction( account_name account, uint64_t ram_bytes
} );
}
if (auto dm_logger = get_deep_mind_logger()) {
// on_add_ram_correction is only called for deferred transaction
// (in apply_context::schedule_deferred_transaction)
if (auto dm_logger = get_deep_mind_logger(false)) {
dm_logger->on_add_ram_correction(*ptr, ram_bytes);
}
}
@@ -3495,8 +3549,8 @@ bool controller::all_subjective_mitigations_disabled()const {
return my->conf.disable_all_subjective_mitigations;
}
deep_mind_handler* controller::get_deep_mind_logger()const {
return my->get_deep_mind_logger();
deep_mind_handler* controller::get_deep_mind_logger(bool is_trx_transient)const {
return my->get_deep_mind_logger(is_trx_transient);
}
void controller::enable_deep_mind(deep_mind_handler* logger) {
@@ -3513,6 +3567,12 @@ vm::wasm_allocator& controller::get_wasm_allocator() {
}
#endif
#ifdef EOSIO_EOS_VM_OC_RUNTIME_ENABLED
bool controller::is_eos_vm_oc_enabled() const {
return my->is_eos_vm_oc_enabled();
}
#endif
std::optional<uint64_t> controller::convert_exception_to_error_code( const fc::exception& e ) {
const chain_exception* e_ptr = dynamic_cast<const chain_exception*>( &e );
@@ -3572,7 +3632,11 @@ std::optional<chain_id_type> controller::extract_chain_id_from_db( const path& s
if (gpo==nullptr) return {};
return gpo->chain_id;
} catch (std::system_error &) {} // do not propagate db_error_code::not_found" for absent db, so it will be created
} catch( const std::system_error& e ) {
// do not propagate db_error_code::not_found for absent db, so it will be created
if( e.code().value() != chainbase::db_error_code::not_found )
throw;
}
return {};
}
@@ -3606,10 +3670,22 @@ void controller::replace_account_keys( name account, name permission, const publ
p.auth = authority(key);
});
int64_t new_size = (int64_t)(chain::config::billable_size_v<permission_object> + perm->auth.get_billable_size());
rlm.add_pending_ram_usage(account, new_size - old_size);
rlm.add_pending_ram_usage(account, new_size - old_size, false); // false for doing dm logging
rlm.verify_account_ram_usage(account);
}
void controller::set_db_read_only_mode() {
mutable_db().set_read_only_mode();
}
void controller::unset_db_read_only_mode() {
mutable_db().unset_read_only_mode();
}
void controller::init_thread_local_data() {
my->init_thread_local_data();
}
/// Protocol feature activation handlers:
template<>
@@ -3639,11 +3715,12 @@ void controller_impl::on_activation<builtin_protocol_feature_t::replace_deferred
("name", itr->name)("adjust", itr->ram_correction)("current", current_ram_usage) );
}
if (auto dm_logger = get_deep_mind_logger()) {
// This method is only called for deferred transaction
if (auto dm_logger = get_deep_mind_logger(false)) {
dm_logger->on_ram_trace(RAM_EVENT_ID("${id}", ("id", itr->id._id)), "deferred_trx", "correction", "deferred_trx_ram_correction");
}
resource_limits.add_pending_ram_usage( itr->name, ram_delta );
resource_limits.add_pending_ram_usage( itr->name, ram_delta, false ); // false for doing dm logging
db.remove( *itr );
}
}
+25 -14
View File
@@ -65,6 +65,7 @@ void validate_authority_precondition( const apply_context& context, const author
* This method is called assuming precondition_system_newaccount succeeds a
*/
void apply_eosio_newaccount(apply_context& context) {
EOS_ASSERT( !context.trx_context.is_read_only(), action_validate_exception, "newaccount not allowed in read-only transaction" );
auto create = context.get_action().data_as<newaccount>();
try {
context.require_authorization(create.creator);
@@ -107,18 +108,18 @@ void apply_eosio_newaccount(apply_context& context) {
}
const auto& owner_permission = authorization.create_permission( create.name, config::owner_name, 0,
std::move(create.owner) );
std::move(create.owner), context.trx_context.is_transient() );
const auto& active_permission = authorization.create_permission( create.name, config::active_name, owner_permission.id,
std::move(create.active) );
std::move(create.active), context.trx_context.is_transient() );
context.control.get_mutable_resource_limits_manager().initialize_account(create.name);
context.control.get_mutable_resource_limits_manager().initialize_account(create.name, context.trx_context.is_transient());
int64_t ram_delta = config::overhead_per_account_ram_bytes;
ram_delta += 2*config::billable_size_v<permission_object>;
ram_delta += owner_permission.auth.get_billable_size();
ram_delta += active_permission.auth.get_billable_size();
if (auto dm_logger = context.control.get_deep_mind_logger()) {
if (auto dm_logger = context.control.get_deep_mind_logger(context.trx_context.is_transient())) {
dm_logger->on_ram_trace(RAM_EVENT_ID("${name}", ("name", create.name)), "account", "add", "newaccount");
}
@@ -127,6 +128,7 @@ void apply_eosio_newaccount(apply_context& context) {
} FC_CAPTURE_AND_RETHROW( (create) ) }
void apply_eosio_setcode(apply_context& context) {
EOS_ASSERT( !context.trx_context.is_read_only(), action_validate_exception, "setcode not allowed in read-only transaction" );
auto& db = context.db;
auto act = context.get_action().data_as<setcode>();
context.require_authorization(act.account);
@@ -194,7 +196,7 @@ void apply_eosio_setcode(apply_context& context) {
});
if (new_size != old_size) {
if (auto dm_logger = context.control.get_deep_mind_logger()) {
if (auto dm_logger = context.control.get_deep_mind_logger(context.trx_context.is_transient())) {
const char* operation = "update";
if (old_size <= 0) {
operation = "add";
@@ -210,6 +212,7 @@ void apply_eosio_setcode(apply_context& context) {
}
void apply_eosio_setabi(apply_context& context) {
EOS_ASSERT( !context.trx_context.is_read_only(), action_validate_exception, "setabi ot allowed in read-only transaction" );
auto& db = context.db;
auto act = context.get_action().data_as<setabi>();
@@ -232,7 +235,7 @@ void apply_eosio_setabi(apply_context& context) {
});
if (new_size != old_size) {
if (auto dm_logger = context.control.get_deep_mind_logger()) {
if (auto dm_logger = context.control.get_deep_mind_logger(context.trx_context.is_transient())) {
const char* operation = "update";
if (old_size <= 0) {
operation = "add";
@@ -248,6 +251,7 @@ void apply_eosio_setabi(apply_context& context) {
}
void apply_eosio_updateauth(apply_context& context) {
EOS_ASSERT( !context.trx_context.is_read_only(), action_validate_exception, "updateauth not allowed in read-only transaction" );
auto update = context.get_action().data_as<updateauth>();
context.require_authorization(update.account); // only here to mark the single authority on this action as used
@@ -297,21 +301,21 @@ void apply_eosio_updateauth(apply_context& context) {
int64_t old_size = (int64_t)(config::billable_size_v<permission_object> + permission->auth.get_billable_size());
authorization.modify_permission( *permission, update.auth );
authorization.modify_permission( *permission, update.auth, context.trx_context.is_transient() );
int64_t new_size = (int64_t)(config::billable_size_v<permission_object> + permission->auth.get_billable_size());
if (auto dm_logger = context.control.get_deep_mind_logger()) {
if (auto dm_logger = context.control.get_deep_mind_logger(context.trx_context.is_transient())) {
dm_logger->on_ram_trace(RAM_EVENT_ID("${id}", ("id", permission->id)), "auth", "update", "updateauth_update");
}
context.add_ram_usage( permission->owner, new_size - old_size );
} else {
const auto& p = authorization.create_permission( update.account, update.permission, parent_id, update.auth );
const auto& p = authorization.create_permission( update.account, update.permission, parent_id, update.auth, context.trx_context.is_transient() );
int64_t new_size = (int64_t)(config::billable_size_v<permission_object> + p.auth.get_billable_size());
if (auto dm_logger = context.control.get_deep_mind_logger()) {
if (auto dm_logger = context.control.get_deep_mind_logger(context.trx_context.is_transient())) {
dm_logger->on_ram_trace(RAM_EVENT_ID("${id}", ("id", p.id)), "auth", "add", "updateauth_create");
}
@@ -322,6 +326,8 @@ void apply_eosio_updateauth(apply_context& context) {
void apply_eosio_deleteauth(apply_context& context) {
// context.require_write_lock( config::eosio_auth_scope );
EOS_ASSERT( !context.trx_context.is_read_only(), action_validate_exception, "deleteauth not allowed in read-only transaction" );
auto remove = context.get_action().data_as<deleteauth>();
context.require_authorization(remove.account); // only here to mark the single authority on this action as used
@@ -344,11 +350,11 @@ void apply_eosio_deleteauth(apply_context& context) {
const auto& permission = authorization.get_permission({remove.account, remove.permission});
int64_t old_size = config::billable_size_v<permission_object> + permission.auth.get_billable_size();
if (auto dm_logger = context.control.get_deep_mind_logger()) {
if (auto dm_logger = context.control.get_deep_mind_logger(context.trx_context.is_transient())) {
dm_logger->on_ram_trace(RAM_EVENT_ID("${id}", ("id", permission.id)), "auth", "remove", "deleteauth");
}
authorization.remove_permission( permission );
authorization.remove_permission( permission, context.trx_context.is_transient() );
context.add_ram_usage( remove.account, -old_size );
@@ -357,6 +363,8 @@ void apply_eosio_deleteauth(apply_context& context) {
void apply_eosio_linkauth(apply_context& context) {
// context.require_write_lock( config::eosio_auth_scope );
EOS_ASSERT( !context.trx_context.is_read_only(), action_validate_exception, "linkauth not allowed in read-only transaction" );
auto requirement = context.get_action().data_as<linkauth>();
try {
EOS_ASSERT(!requirement.requirement.empty(), action_validate_exception, "Required permission cannot be empty");
@@ -401,7 +409,7 @@ void apply_eosio_linkauth(apply_context& context) {
link.required_permission = requirement.requirement;
});
if (auto dm_logger = context.control.get_deep_mind_logger()) {
if (auto dm_logger = context.control.get_deep_mind_logger(context.trx_context.is_transient())) {
dm_logger->on_ram_trace(RAM_EVENT_ID("${id}", ("id", l.id)), "auth_link", "add", "linkauth");
}
@@ -417,6 +425,8 @@ void apply_eosio_linkauth(apply_context& context) {
void apply_eosio_unlinkauth(apply_context& context) {
// context.require_write_lock( config::eosio_auth_scope );
EOS_ASSERT( !context.trx_context.is_read_only(), action_validate_exception, "unlinkauth not allowed in read-only transaction" );
auto& db = context.db;
auto unlink = context.get_action().data_as<unlinkauth>();
@@ -426,7 +436,7 @@ void apply_eosio_unlinkauth(apply_context& context) {
auto link = db.find<permission_link_object, by_action_name>(link_key);
EOS_ASSERT(link != nullptr, action_validate_exception, "Attempting to unlink authority, but no link found");
if (auto dm_logger = context.control.get_deep_mind_logger()) {
if (auto dm_logger = context.control.get_deep_mind_logger(context.trx_context.is_transient())) {
dm_logger->on_ram_trace(RAM_EVENT_ID("${id}", ("id", link->id)), "auth_link", "remove", "unlinkauth");
}
@@ -439,6 +449,7 @@ void apply_eosio_unlinkauth(apply_context& context) {
}
void apply_eosio_canceldelay(apply_context& context) {
EOS_ASSERT( !context.trx_context.is_read_only(), action_validate_exception, "canceldelay not allowed in read-only transaction" );
auto cancel = context.get_action().data_as<canceldelay>();
context.require_authorization(cancel.canceling_auth.actor); // only here to mark the single authority on this action as used
@@ -35,10 +35,10 @@ struct abi_serializer {
using yield_function_t = fc::optional_delegate<void(size_t)>;
abi_serializer(){ configure_built_in_types(); }
abi_serializer( const abi_def& abi, const yield_function_t& yield );
abi_serializer( abi_def abi, const yield_function_t& yield );
[[deprecated("use the overload with yield_function_t[=create_yield_function(max_serialization_time)]")]]
abi_serializer( const abi_def& abi, const fc::microseconds& max_serialization_time );
void set_abi( const abi_def& abi, const yield_function_t& yield );
void set_abi( abi_def abi, const yield_function_t& yield );
[[deprecated("use the overload with yield_function_t[=create_yield_function(max_serialization_time)]")]]
void set_abi(const abi_def& abi, const fc::microseconds& max_serialization_time);
@@ -1,6 +1,7 @@
#pragma once
#include <eosio/chain/controller.hpp>
#include <eosio/chain/transaction.hpp>
#include <eosio/chain/transaction_context.hpp>
#include <eosio/chain/contract_table_objects.hpp>
#include <eosio/chain/deep_mind.hpp>
#include <fc/utility.hpp>
@@ -13,7 +14,6 @@ namespace chainbase { class database; }
namespace eosio { namespace chain {
class controller;
class transaction_context;
class apply_context {
private:
@@ -177,6 +177,7 @@ class apply_context {
int store( uint64_t scope, uint64_t table, const account_name& payer,
uint64_t id, secondary_key_proxy_const_type value )
{
EOS_ASSERT( !context.trx_context.is_read_only(), table_operation_not_permitted, "cannot store a db record when executing a readonly transaction" );
EOS_ASSERT( payer != account_name(), invalid_table_payer, "must specify a valid account to pay for new record" );
// context.require_write_lock( scope );
@@ -193,7 +194,7 @@ class apply_context {
context.db.modify( tab, [&]( auto& t ) {
++t.count;
if (auto dm_logger = context.control.get_deep_mind_logger()) {
if (auto dm_logger = context.control.get_deep_mind_logger(context.trx_context.is_transient())) {
std::string event_id = RAM_EVENT_ID("${code}:${scope}:${table}:${index_name}",
("code", t.code)
("scope", t.scope)
@@ -211,12 +212,13 @@ class apply_context {
}
void remove( int iterator ) {
EOS_ASSERT( !context.trx_context.is_read_only(), table_operation_not_permitted, "cannot remove a db record when executing a readonly transaction" );
const auto& obj = itr_cache.get( iterator );
const auto& table_obj = itr_cache.get_table( obj.t_id );
EOS_ASSERT( table_obj.code == context.receiver, table_access_violation, "db access violation" );
if (auto dm_logger = context.control.get_deep_mind_logger()) {
if (auto dm_logger = context.control.get_deep_mind_logger(context.trx_context.is_transient())) {
std::string event_id = RAM_EVENT_ID("${code}:${scope}:${table}:${index_name}",
("code", table_obj.code)
("scope", table_obj.scope)
@@ -243,6 +245,7 @@ class apply_context {
}
void update( int iterator, account_name payer, secondary_key_proxy_const_type secondary ) {
EOS_ASSERT( !context.trx_context.is_read_only(), table_operation_not_permitted, "cannot update a db record when executing a readonly transaction" );
const auto& obj = itr_cache.get( iterator );
const auto& table_obj = itr_cache.get_table( obj.t_id );
@@ -255,7 +258,7 @@ class apply_context {
int64_t billing_size = config::billable_size_v<ObjectType>;
std::string event_id;
if (context.control.get_deep_mind_logger() != nullptr) {
if (context.control.get_deep_mind_logger(context.trx_context.is_transient()) != nullptr) {
event_id = RAM_EVENT_ID("${code}:${scope}:${table}:${index_name}",
("code", table_obj.code)
("scope", table_obj.scope)
@@ -265,12 +268,12 @@ class apply_context {
}
if( obj.payer != payer ) {
if (auto dm_logger = context.control.get_deep_mind_logger())
if (auto dm_logger = context.control.get_deep_mind_logger(context.trx_context.is_transient()))
{
dm_logger->on_ram_trace(std::string(event_id), "secondary_index", "remove", "secondary_index_remove");
}
context.update_db_usage( obj.payer, -(billing_size) );
if (auto dm_logger = context.control.get_deep_mind_logger())
if (auto dm_logger = context.control.get_deep_mind_logger(context.trx_context.is_transient()))
{
dm_logger->on_ram_trace(std::move(event_id), "secondary_index", "add", "secondary_index_update_add_new_payer");
}
@@ -31,6 +31,7 @@ namespace eosio { namespace chain {
permission_name name,
permission_id_type parent,
const authority& auth,
bool is_trx_transient,
time_point initial_creation_time = time_point()
);
@@ -38,12 +39,13 @@ namespace eosio { namespace chain {
permission_name name,
permission_id_type parent,
authority&& auth,
bool is_trx_transient,
time_point initial_creation_time = time_point()
);
void modify_permission( const permission_object& permission, const authority& auth );
void modify_permission( const permission_object& permission, const authority& auth, bool is_trx_transient );
void remove_permission( const permission_object& permission );
void remove_permission( const permission_object& permission, bool is_trx_transient );
void update_permission_usage( const permission_object& permission );
@@ -2,10 +2,11 @@
#include <fc/filesystem.hpp>
#include <eosio/chain/block.hpp>
#include <eosio/chain/genesis_state.hpp>
#include <eosio/chain/block_log_config.hpp>
namespace eosio { namespace chain {
namespace detail { class block_log_impl; }
namespace detail { struct block_log_impl; }
/* The block log is an external append only log of the blocks with a header. Blocks should only
* be written to the log after they irreverisble as the log is append only. The log is a doubly
@@ -34,18 +35,15 @@ namespace eosio { namespace chain {
* An optional "pruned" mode can be activated which stores a 4 byte trailer on the log file indicating
* how many blocks at the end of the log are valid. Any earlier blocks in the log are assumed destroyed
* and unreadable due to reclamation for purposes of saving space.
*
* Object thread-safe. Not safe to have multiple block_log objects to same data_dir.
*/
struct block_log_prune_config {
uint32_t prune_blocks; //number of blocks to prune to when doing a prune
size_t prune_threshold = 4*1024*1024; //(approximately) how many bytes need to be added before a prune is performed
std::optional<size_t> vacuum_on_close; //when set, a vacuum is performed on dtor if log contains less than this many live bytes
};
class block_log {
public:
block_log(const fc::path& data_dir, std::optional<block_log_prune_config> prune_config);
block_log(block_log&& other);
explicit block_log(const fc::path& data_dir, const block_log_config& config = block_log_config{});
block_log(block_log&& other) noexcept;
~block_log();
void append(const signed_block_ptr& b, const block_id_type& id);
@@ -54,12 +52,11 @@ namespace eosio { namespace chain {
void flush();
void reset( const genesis_state& gs, const signed_block_ptr& genesis_block );
void reset( const chain_id_type& chain_id, uint32_t first_block_num );
void remove(); // remove blocks.log and blocks.index
signed_block_ptr read_block(uint64_t file_pos)const;
void read_block_header(block_header& bh, uint64_t file_pos)const;
signed_block_ptr read_block_by_num(uint32_t block_num)const;
std::optional<signed_block_header> read_block_header_by_num(uint32_t block_num)const;
block_id_type read_block_id_by_num(uint32_t block_num)const;
signed_block_ptr read_block_by_id(const block_id_type& id)const {
return read_block_by_num(block_header::num_from_id(id));
}
@@ -67,10 +64,11 @@ namespace eosio { namespace chain {
/**
* Return offset of block in file, or block_log::npos if it does not exist.
*/
uint64_t get_block_pos(uint32_t block_num) const;
signed_block_ptr read_head()const;
const signed_block_ptr& head()const;
const block_id_type& head_id()const;
signed_block_ptr read_head()const; //use blocklog
signed_block_ptr head()const;
block_id_type head_id()const;
uint32_t first_block_num() const;
static const uint64_t npos = std::numeric_limits<uint64_t>::max();
@@ -78,6 +76,10 @@ namespace eosio { namespace chain {
static const uint32_t min_supported_version;
static const uint32_t max_supported_version;
/**
* All static methods expected to be called on quiescent block log
*/
static fc::path repair_log( const fc::path& data_dir, uint32_t truncate_at_block = 0, const char* reversible_block_dir_name="" );
static std::optional<genesis_state> extract_genesis_state( const fc::path& data_dir );
@@ -94,37 +96,24 @@ namespace eosio { namespace chain {
static bool is_pruned_log(const fc::path& data_dir);
static bool extract_block_range(const fc::path& block_dir, const fc::path&output_dir, block_num_type& start, block_num_type& end, bool rename_input=false);
static void extract_block_range(const fc::path& block_dir, const fc::path&output_dir, block_num_type start, block_num_type end);
static bool trim_blocklog_front(const fc::path& block_dir, const fc::path& temp_dir, uint32_t truncate_at_block);
static int trim_blocklog_end(const fc::path& block_dir, uint32_t n);
// used for unit test to generate older version blocklog
static void set_initial_version(uint32_t);
uint32_t version() const;
uint64_t get_block_pos(uint32_t block_num) const;
/**
* @param n Only test 1 block out of every n blocks. If n is 0, the interval is adjusted so that at most 8 blocks are tested.
*/
static void smoke_test(const fc::path& block_dir, uint32_t n);
static void split_blocklog(const fc::path& block_dir, const fc::path& dest_dir, uint32_t stride);
static void merge_blocklogs(const fc::path& block_dir, const fc::path& dest_dir);
private:
void open(const fc::path& data_dir);
void construct_index();
std::unique_ptr<detail::block_log_impl> my;
};
//to derive blknum_offset==14 see block_header.hpp and note on disk struct is packed
// block_timestamp_type timestamp; //bytes 0:3
// account_name producer; //bytes 4:11
// uint16_t confirmed; //bytes 12:13
// block_id_type previous; //bytes 14:45, low 4 bytes is big endian block number of previous block
struct trim_data { //used by trim_blocklog_front(), trim_blocklog_end(), and smoke_test()
trim_data(fc::path block_dir);
~trim_data();
uint64_t block_index(uint32_t n) const;
uint64_t block_pos(uint32_t n);
fc::path block_file_name, index_file_name; //full pathname for blocks.log and blocks.index
uint32_t version = 0; //blocklog version
uint32_t first_block = 0; //first block in blocks.log
uint32_t last_block = 0; //last block in blocks.log
FILE* blk_in = nullptr; //C style files for reading blocks.log and blocks.index
FILE* ind_in = nullptr; //C style files for reading blocks.log and blocks.index
//we use low level file IO because it is distinctly faster than C++ filebuf or iostream
uint64_t first_block_pos = 0; //file position in blocks.log for the first block in the log
genesis_state gs;
chain_id_type chain_id;
static constexpr int blknum_offset{14}; //offset from start of block to 4 byte block number, valid for the only allowed versions
};
} }
@@ -0,0 +1,31 @@
#pragma once
#include <boost/filesystem/path.hpp>
#include <variant>
namespace eosio { namespace chain {
namespace bfs = boost::filesystem;
struct basic_blocklog_config {};
struct empty_blocklog_config {};
struct partitioned_blocklog_config {
bfs::path retained_dir;
bfs::path archive_dir;
uint32_t stride = UINT32_MAX;
uint32_t max_retained_files = UINT32_MAX;
};
struct prune_blocklog_config {
uint32_t prune_blocks; // number of blocks to prune to when doing a prune
size_t prune_threshold =
4 * 1024 * 1024; //(approximately) how many bytes need to be added before a prune is performed
std::optional<size_t>
vacuum_on_close; // when set, a vacuum is performed on dtor if log contains less than this many live bytes
};
using block_log_config =
std::variant<basic_blocklog_config, empty_blocklog_config, partitioned_blocklog_config, prune_blocklog_config>;
}} // namespace eosio::chain
@@ -37,6 +37,10 @@ namespace chain {
void reflector_init()const;
static chain_id_type empty_chain_id() {
return {};
}
private:
chain_id_type() = default;
@@ -68,7 +68,7 @@ namespace eosio { namespace chain {
flat_set< pair<account_name, action_name> > action_blacklist;
flat_set<public_key_type> key_blacklist;
path blocks_dir = chain::config::default_blocks_dir_name;
std::optional<block_log_prune_config> prune_config;
block_log_config blog;
path state_dir = chain::config::default_state_dir_name;
uint64_t state_size = chain::config::default_state_size;
uint64_t state_guard_size = chain::config::default_state_guard_size;
@@ -119,7 +119,7 @@ namespace eosio { namespace chain {
void startup( std::function<void()> shutdown, std::function<bool()> check_shutdown, const genesis_state& genesis);
void startup( std::function<void()> shutdown, std::function<bool()> check_shutdown);
void preactivate_feature( const digest_type& feature_digest );
void preactivate_feature( const digest_type& feature_digest, bool is_trx_transient );
vector<digest_type> get_preactivated_protocol_features()const;
@@ -221,13 +221,6 @@ namespace eosio { namespace chain {
uint32_t fork_db_head_block_num()const;
block_id_type fork_db_head_block_id()const;
time_point fork_db_head_block_time()const;
account_name fork_db_head_block_producer()const;
uint32_t fork_db_pending_head_block_num()const;
block_id_type fork_db_pending_head_block_id()const;
time_point fork_db_pending_head_block_time()const;
account_name fork_db_pending_head_block_producer()const;
time_point pending_block_time()const;
account_name pending_block_producer()const;
@@ -243,13 +236,19 @@ namespace eosio { namespace chain {
block_id_type last_irreversible_block_id() const;
time_point last_irreversible_block_time() const;
// thread-safe
signed_block_ptr fetch_block_by_number( uint32_t block_num )const;
signed_block_ptr fetch_block_by_id( block_id_type id )const;
// thread-safe
signed_block_ptr fetch_block_by_id( const block_id_type& id )const;
// thread-safe
std::optional<signed_block_header> fetch_block_header_by_number( uint32_t block_num )const;
// thread-safe
std::optional<signed_block_header> fetch_block_header_by_id( const block_id_type& id )const;
// return block_state from forkdb, thread-safe
block_state_ptr fetch_block_state_by_number( uint32_t block_num )const;
// return block_state from forkdb, thread-safe
block_state_ptr fetch_block_state_by_id( block_id_type id )const;
// thread-safe
block_id_type get_block_id_for_num( uint32_t block_num )const;
sha256 calculate_integrity_hash();
@@ -311,12 +310,13 @@ namespace eosio { namespace chain {
void add_to_ram_correction( account_name account, uint64_t ram_bytes );
bool all_subjective_mitigations_disabled()const;
deep_mind_handler* get_deep_mind_logger() const;
deep_mind_handler* get_deep_mind_logger(bool is_trx_transient) const;
void enable_deep_mind( deep_mind_handler* logger );
uint32_t earliest_available_block_num() const;
#if defined(EOSIO_EOS_VM_RUNTIME_ENABLED) || defined(EOSIO_EOS_VM_JIT_RUNTIME_ENABLED)
vm::wasm_allocator& get_wasm_allocator();
bool is_eos_vm_oc_enabled() const;
#endif
static std::optional<uint64_t> convert_exception_to_error_code( const fc::exception& e );
@@ -348,9 +348,8 @@ namespace eosio { namespace chain {
if( n.good() ) {
try {
const auto& a = get_account( n );
abi_def abi;
if( abi_serializer::to_abi( a.abi, abi ))
return abi_serializer( abi, yield );
if( abi_def abi; abi_serializer::to_abi( a.abi, abi ))
return abi_serializer( std::move(abi), yield );
} FC_CAPTURE_AND_LOG((n))
}
return std::optional<abi_serializer>();
@@ -371,6 +370,10 @@ namespace eosio { namespace chain {
void replace_producer_keys( const public_key_type& key );
void replace_account_keys( name account, name permission, const public_key_type& key );
void set_db_read_only_mode();
void unset_db_read_only_mode();
void init_thread_local_data();
private:
friend class apply_context;
friend class transaction_context;
@@ -573,6 +573,12 @@ namespace eosio { namespace chain {
3170011, "The signer returned no valid block signatures" )
FC_DECLARE_DERIVED_EXCEPTION( unsupported_multiple_block_signatures, producer_exception,
3170012, "The signer returned multiple signatures but that is not supported" )
FC_DECLARE_DERIVED_EXCEPTION( duplicate_snapshot_request, producer_exception,
3170013, "Snapshot has been already scheduled with specified parameters" )
FC_DECLARE_DERIVED_EXCEPTION( snapshot_request_not_found, producer_exception,
3170014, "Snapshot request not found" )
FC_DECLARE_DERIVED_EXCEPTION( invalid_snapshot_request, producer_exception,
3170015, "Invalid snapshot request" )
FC_DECLARE_DERIVED_EXCEPTION( reversible_blocks_exception, chain_exception,
3180000, "Reversible Blocks exception" )
@@ -0,0 +1,280 @@
#pragma once
#include <boost/container/flat_map.hpp>
#include <boost/filesystem/path.hpp>
#include <boost/iostreams/device/mapped_file.hpp>
#include <fc/io/cfile.hpp>
#include <fc/io/datastream.hpp>
#include <regex>
namespace eosio {
namespace chain {
namespace bfs = boost::filesystem;
template <typename Lambda>
void for_each_file_in_dir_matches(const bfs::path& dir, std::string pattern, Lambda&& lambda) {
const std::regex my_filter(pattern);
std::smatch what;
bfs::directory_iterator end_itr; // Default ctor yields past-the-end
for (bfs::directory_iterator p(dir); p != end_itr; ++p) {
// Skip if not a file
if (!bfs::is_regular_file(p->status()))
continue;
// skip if it does not match the pattern
if (!std::regex_match(p->path().filename().string(), what, my_filter))
continue;
lambda(p->path());
}
}
struct null_verifier {
template <typename LogData>
void verify(const LogData&, const bfs::path&) {}
};
template <typename LogData, typename LogIndex, typename LogVerifier = null_verifier>
struct log_catalog {
using block_num_t = uint32_t;
struct mapped_type {
block_num_t last_block_num;
bfs::path filename_base;
};
using collection_t = boost::container::flat_map<block_num_t, mapped_type>;
using size_type = typename collection_t::size_type;
static constexpr size_type npos = std::numeric_limits<size_type>::max();
bfs::path retained_dir;
bfs::path archive_dir;
size_type max_retained_files = std::numeric_limits<size_type>::max();
collection_t collection;
size_type active_index = npos;
LogData log_data;
LogIndex log_index;
LogVerifier verifier;
bool empty() const { return collection.empty(); }
block_num_t first_block_num() const {
if (empty())
return std::numeric_limits<block_num_t>::max();
return collection.begin()->first;
}
block_num_t last_block_num() const {
if (empty())
return std::numeric_limits<block_num_t>::min();
return collection.rbegin()->second.last_block_num;
}
static bfs::path make_absolute_dir(const bfs::path& base_dir, bfs::path new_dir) {
if (new_dir.is_relative())
new_dir = base_dir / new_dir;
if (!bfs::is_directory(new_dir))
bfs::create_directories(new_dir);
return new_dir;
}
void open(const bfs::path& log_dir, const bfs::path& retained_path, const bfs::path& archive_path, const char* name,
const char* suffix_pattern = R"(-\d+-\d+\.log)") {
retained_dir = make_absolute_dir(log_dir, retained_path.empty() ? log_dir : retained_path);
if (!archive_path.empty()) {
archive_dir = make_absolute_dir(log_dir, archive_path);
}
for_each_file_in_dir_matches(retained_dir, std::string(name) + suffix_pattern, [this](bfs::path path) {
auto log_path = path;
auto index_path = path.replace_extension("index");
auto path_without_extension = log_path.parent_path() / log_path.stem().string();
LogData log(log_path);
verifier.verify(log, log_path);
// check if index file matches the log file
if (!index_matches_data(index_path, log))
log.construct_index(index_path);
auto existing_itr = collection.find(log.first_block_num());
if (existing_itr != collection.end()) {
if (log.last_block_num() <= existing_itr->second.last_block_num) {
wlog("${log_path} contains the overlapping range with ${existing_path}.log, dropping ${log_path} "
"from catalog",
("log_path", log_path.string())("existing_path", existing_itr->second.filename_base.string()));
return;
} else {
wlog(
"${log_path} contains the overlapping range with ${existing_path}.log, droping ${existing_path}.log "
"from catelog",
("log_path", log_path.string())("existing_path", existing_itr->second.filename_base.string()));
}
}
collection.insert_or_assign(log.first_block_num(), mapped_type{log.last_block_num(), path_without_extension});
});
}
bool index_matches_data(const bfs::path& index_path, LogData& log) const {
if (!bfs::exists(index_path))
return false;
auto num_blocks_in_index = bfs::file_size(index_path) / sizeof(uint64_t);
if (num_blocks_in_index != log.num_blocks())
return false;
// make sure the last 8 bytes of index and log matches
fc::cfile index_file;
index_file.set_file_path(index_path);
index_file.open("r");
index_file.seek_end(-sizeof(uint64_t));
uint64_t pos;
index_file.read(reinterpret_cast<char*>(&pos), sizeof(pos));
return pos == log.last_block_position();
}
std::optional<uint64_t> get_block_position(uint32_t block_num) {
try {
if (active_index != npos) {
auto active_item = collection.nth(active_index);
if (active_item->first <= block_num && block_num <= active_item->second.last_block_num) {
return log_index.nth_block_position(block_num - log_data.first_block_num());
}
}
if (block_num < first_block_num())
return {};
auto it = --collection.upper_bound(block_num);
if (block_num <= it->second.last_block_num) {
auto name = it->second.filename_base;
log_data.open(name.replace_extension("log"));
log_index.open(name.replace_extension("index"));
active_index = collection.index_of(it);
return log_index.nth_block_position(block_num - log_data.first_block_num());
}
return {};
} catch (...) {
active_index = npos;
return {};
}
}
fc::datastream<fc::cfile>* ro_stream_for_block(uint32_t block_num) {
auto pos = get_block_position(block_num);
if (pos) {
return &log_data.ro_stream_at(*pos);
}
return nullptr;
}
template <typename ...Rest>
auto ro_stream_for_block(uint32_t block_num, Rest&& ...rest) -> std::optional<decltype( std::declval<LogData>().ro_stream_at(0, std::forward<Rest&&>(rest)...))> {
auto pos = get_block_position(block_num);
if (pos) {
return log_data.ro_stream_at(*pos, std::forward<Rest&&>(rest)...);
}
return {};
}
std::optional<block_id_type> id_for_block(uint32_t block_num) {
auto pos = get_block_position(block_num);
if (pos) {
return log_data.block_id_at(*pos);
}
return {};
}
static void rename_if_not_exists(bfs::path old_name, bfs::path new_name) {
if (!bfs::exists(new_name)) {
bfs::rename(old_name, new_name);
} else {
bfs::remove(old_name);
wlog("${new_name} already exists, just removing ${old_name}",
("old_name", old_name.string())("new_name", new_name.string()));
}
}
static void rename_bundle(bfs::path orig_path, bfs::path new_path) {
rename_if_not_exists(orig_path.replace_extension(".log"), new_path.replace_extension(".log"));
rename_if_not_exists(orig_path.replace_extension(".index"), new_path.replace_extension(".index"));
}
/// Add a new entry into the catalog.
///
/// Notice that \c start_block_num must be monotonically increasing between the invocations of this function
/// so that the new entry would be inserted at the end of the flat_map; otherwise, \c active_index would be
/// invalidated and the mapping between the log data their block range would be wrong. This function is only used
/// during the splitting of block log. Using this function for other purpose should make sure if the monotonically
/// increasing block num guarantee can be met.
void add(uint32_t start_block_num, uint32_t end_block_num, const bfs::path& dir, const char* name) {
const int bufsize = 64;
char buf[bufsize];
snprintf(buf, bufsize, "%s-%u-%u", name, start_block_num, end_block_num);
bfs::path new_path = retained_dir / buf;
rename_bundle(dir / name, new_path);
size_type items_to_erase = 0;
collection.emplace(start_block_num, mapped_type{end_block_num, new_path});
if (collection.size() >= max_retained_files) {
items_to_erase =
max_retained_files > 0 ? collection.size() - max_retained_files : collection.size();
for (auto it = collection.begin(); it < collection.begin() + items_to_erase; ++it) {
auto orig_name = it->second.filename_base;
if (archive_dir.empty()) {
// delete the old files when no backup dir is specified
bfs::remove(orig_name.replace_extension("log"));
bfs::remove(orig_name.replace_extension("index"));
} else {
// move the the archive dir
rename_bundle(orig_name, archive_dir / orig_name.filename());
}
}
collection.erase(collection.begin(), collection.begin() + items_to_erase);
active_index = active_index == npos || active_index < items_to_erase
? npos
: active_index - items_to_erase;
}
}
/// Truncate the catalog so that the log/index bundle containing the block with \c block_num
/// would be rename to \c new_name; the log/index bundles with blocks strictly higher
/// than \c block_num would be deleted, and all the renamed/removed entries would be erased
/// from the catalog.
///
/// \return if nonzero, it's the starting block number for the log/index bundle being renamed.
uint32_t truncate(uint32_t block_num, bfs::path new_name) {
if (collection.empty())
return 0;
auto remove_files = [](typename collection_t::const_reference v) {
auto name = v.second.filename_base;
bfs::remove(name.replace_extension("log"));
bfs::remove(name.replace_extension("index"));
};
active_index = npos;
auto it = collection.upper_bound(block_num);
if (it == collection.begin() || block_num > (it - 1)->second.last_block_num) {
std::for_each(it, collection.end(), remove_files);
collection.erase(it, collection.end());
return 0;
} else {
auto truncate_it = --it;
auto name = truncate_it->second.filename_base;
bfs::rename(name.replace_extension("log"), new_name.replace_extension("log"));
bfs::rename(name.replace_extension("index"), new_name.replace_extension("index"));
std::for_each(truncate_it + 1, collection.end(), remove_files);
auto result = truncate_it->first;
collection.erase(truncate_it, collection.end());
return result;
}
}
};
} // namespace chain
} // namespace eosio
@@ -0,0 +1,49 @@
#pragma once
#include <fc/io/cfile.hpp>
namespace eosio {
namespace chain {
template <typename T>
T read_data_at(fc::datastream<fc::cfile>& file, std::size_t offset) {
file.seek(offset);
T value;
fc::raw::unpack(file, value);
return value;
}
template <typename Derived>
class log_data_base {
protected:
fc::datastream<fc::cfile> file;
Derived* self() { return static_cast<Derived*>(this); }
const Derived* self() const { return static_cast<const Derived*>(this); }
public:
log_data_base() = default;
void close() { file.close(); }
bool is_open() const { return file.is_open(); }
uint64_t size() const { return self()->size(); }
uint32_t last_block_num() { return self()->block_num_at(last_block_position()); }
uint64_t last_block_position() {
uint32_t offset = sizeof(uint64_t);
if (self()->is_currently_pruned())
offset += sizeof(uint32_t);
return read_data_at<uint64_t>(file, size() - offset);
}
uint32_t num_blocks() {
if (self()->first_block_position() == size())
return 0;
else if (self()->is_currently_pruned())
return read_data_at<uint32_t>(file, size() - sizeof(uint32_t));
return last_block_num() - self()->first_block_num() + 1;
}
};
} // namespace chain
} // namespace eosio
@@ -0,0 +1,51 @@
#pragma once
#include <boost/filesystem/path.hpp>
#include <fc/io/cfile.hpp>
namespace eosio {
namespace chain {
/// copy up to n bytes from the current position of src to dest
void copy_file_content(fc::cfile& src, fc::cfile& dest, uint64_t n = UINT64_MAX);
template <typename Exception>
class log_index {
fc::cfile file_;
std::size_t num_blocks_ = 0;
public:
log_index() = default;
log_index(const boost::filesystem::path& path) {
open(path);
}
void open(const boost::filesystem::path& path) {
if (file_.is_open())
file_.close();
file_.set_file_path(path);
file_.open("rb");
file_.seek_end(0);
num_blocks_ = file_.tellp()/ sizeof(uint64_t);
EOS_ASSERT(file_.tellp() % sizeof(uint64_t) == 0, Exception,
"The size of ${file} is not a multiple of sizeof(uint64_t)", ("file", path.generic_string()));
}
bool is_open() const { return file_.is_open(); }
uint64_t back() { return nth_block_position(num_blocks()-1); }
unsigned num_blocks() const { return num_blocks_; }
uint64_t nth_block_position(uint32_t n) {
file_.seek(n*sizeof(uint64_t));
uint64_t r;
file_.read((char*)&r, sizeof(r));
return r;
}
void copy_to(fc::cfile& dest, uint64_t nbytes) {
file_.seek(0);
copy_file_content(file_, dest, nbytes);
}
};
} // namespace chain
} // namespace eosio
@@ -335,4 +335,3 @@ FC_REFLECT_DERIVED( eosio::chain::producer_schedule_change_extension, (eosio::ch
FC_REFLECT( eosio::chain::shared_block_signing_authority_v0, (threshold)(keys))
FC_REFLECT( eosio::chain::shared_producer_authority, (producer_name)(authority) )
FC_REFLECT( eosio::chain::shared_producer_authority_schedule, (version)(producers) )
@@ -264,7 +264,7 @@ protected:
class protocol_feature_manager {
public:
protocol_feature_manager( protocol_feature_set&& pfs, std::function<deep_mind_handler*()> get_deep_mind_logger );
protocol_feature_manager( protocol_feature_set&& pfs, std::function<deep_mind_handler*(bool is_trx_transient)> get_deep_mind_logger );
class const_iterator {
public:
@@ -393,7 +393,7 @@ protected:
bool _initialized = false;
private:
std::function<deep_mind_handler*()> _get_deep_mind_logger;
std::function<deep_mind_handler*(bool is_trx_transient)> _get_deep_mind_logger;
};
std::optional<builtin_protocol_feature> read_builtin_protocol_feature( const fc::path& p );
@@ -64,7 +64,7 @@ namespace eosio { namespace chain {
class resource_limits_manager {
public:
explicit resource_limits_manager(chainbase::database& db, std::function<deep_mind_handler*()> get_deep_mind_logger)
explicit resource_limits_manager(chainbase::database& db, std::function<deep_mind_handler*(bool is_trx_transient)> get_deep_mind_logger)
:_db(db),_get_deep_mind_logger(get_deep_mind_logger)
{
}
@@ -74,17 +74,17 @@ namespace eosio { namespace chain {
void add_to_snapshot( const snapshot_writer_ptr& snapshot ) const;
void read_from_snapshot( const snapshot_reader_ptr& snapshot );
void initialize_account( const account_name& account );
void initialize_account( const account_name& account, bool is_trx_transient );
void set_block_parameters( const elastic_limit_parameters& cpu_limit_parameters, const elastic_limit_parameters& net_limit_parameters );
void update_account_usage( const flat_set<account_name>& accounts, uint32_t ordinal );
void add_transaction_usage( const flat_set<account_name>& accounts, uint64_t cpu_usage, uint64_t net_usage, uint32_t ordinal );
void add_transaction_usage( const flat_set<account_name>& accounts, uint64_t cpu_usage, uint64_t net_usage, uint32_t ordinal, bool is_trx_transient = false );
void add_pending_ram_usage( const account_name account, int64_t ram_delta );
void add_pending_ram_usage( const account_name account, int64_t ram_delta, bool is_trx_transient = false );
void verify_account_ram_usage( const account_name accunt )const;
/// set_account_limits returns true if new ram_bytes limit is more restrictive than the previously set one
bool set_account_limits( const account_name& account, int64_t ram_bytes, int64_t net_weight, int64_t cpu_weight);
bool set_account_limits( const account_name& account, int64_t ram_bytes, int64_t net_weight, int64_t cpu_weight, bool is_trx_transient);
void get_account_limits( const account_name& account, int64_t& ram_bytes, int64_t& net_weight, int64_t& cpu_weight) const;
bool is_unlimited_cpu( const account_name& account ) const;
@@ -114,7 +114,7 @@ namespace eosio { namespace chain {
private:
chainbase::database& _db;
std::function<deep_mind_handler*()> _get_deep_mind_logger;
std::function<deep_mind_handler*(bool is_trx_transient)> _get_deep_mind_logger;
};
} } } /// eosio::chain
@@ -25,6 +25,7 @@ namespace eosio { namespace chain {
class named_thread_pool {
public:
using on_except_t = std::function<void(const fc::exception& e)>;
using init_t = std::function<void()>;
named_thread_pool() = default;
@@ -39,14 +40,15 @@ namespace eosio { namespace chain {
/// @param num_threads is number of threads spawned
/// @param on_except is the function to call if io_context throws an exception, is called from thread pool thread.
/// if an empty function then logs and rethrows exception on thread which will terminate.
/// @param init is an optional function to call at startup to initialize any data.
/// @throw assert_exception if already started and not stopped.
void start( size_t num_threads, on_except_t on_except ) {
void start( size_t num_threads, on_except_t on_except, init_t init = {} ) {
FC_ASSERT( !_ioc_work, "Thread pool already started" );
_ioc_work.emplace( boost::asio::make_work_guard( _ioc ) );
_ioc.restart();
_thread_pool.reserve( num_threads );
for( size_t i = 0; i < num_threads; ++i ) {
_thread_pool.emplace_back( std::thread( &named_thread_pool::run_thread, this, i, on_except ) );
_thread_pool.emplace_back( std::thread( &named_thread_pool::run_thread, this, i, on_except, init ) );
}
}
@@ -61,7 +63,7 @@ namespace eosio { namespace chain {
}
private:
void run_thread( size_t i, const on_except_t& on_except ) {
void run_thread( size_t i, const on_except_t& on_except, const init_t& init ) {
std::string tn = boost::core::demangle(typeid(this).name());
auto offset = tn.rfind("::");
if (offset != std::string::npos)
@@ -69,6 +71,8 @@ namespace eosio { namespace chain {
tn = tn.substr(0, tn.find('>')) + "-" + std::to_string( i );
try {
fc::set_os_thread_name( tn );
if ( init )
init();
_ioc.run();
} catch( const fc::exception& e ) {
if( on_except ) {
@@ -84,6 +84,8 @@ namespace eosio { namespace chain {
void validate_referenced_accounts( const transaction& trx, bool enforce_actor_whitelist_blacklist )const;
bool is_dry_run()const { return trx_type == transaction_metadata::trx_type::dry_run; };
bool is_read_only()const { return trx_type == transaction_metadata::trx_type::read_only; };
bool is_transient()const { return trx_type == transaction_metadata::trx_type::read_only || trx_type == transaction_metadata::trx_type::dry_run; };
private:
@@ -24,7 +24,8 @@ class transaction_metadata {
input,
implicit,
scheduled,
dry_run
dry_run,
read_only
};
private:
@@ -73,6 +74,8 @@ class transaction_metadata {
bool implicit() const { return _trx_type == trx_type::implicit; };
bool scheduled() const { return _trx_type == trx_type::scheduled; };
bool is_dry_run() const { return _trx_type == trx_type::dry_run; };
bool is_read_only() const { return _trx_type == trx_type::read_only; };
bool is_transient() const { return _trx_type == trx_type::read_only || _trx_type == trx_type::dry_run; };
/// Thread safe.
/// @returns transaction_metadata_ptr or exception via future
@@ -45,6 +45,9 @@ namespace eosio { namespace chain {
wasm_interface(vm_type vm, bool eosvmoc_tierup, const chainbase::database& d, const boost::filesystem::path data_dir, const eosvmoc::config& eosvmoc_config, bool profile);
~wasm_interface();
// initialize exec per thread
void init_thread_local_data();
//call before dtor to skip what can be minutes of dtor overhead with some runtimes; can cause leaks
void indicate_shutting_down();
@@ -72,6 +75,7 @@ namespace eosio { namespace chain {
const digest_type& code_hash, uint8_t vm_type, uint8_t vm_version, apply_context& context)> substitute_apply;
private:
unique_ptr<struct wasm_interface_impl> my;
vm_type vm;
};
} } // eosio::chain
@@ -50,11 +50,21 @@ namespace eosio { namespace chain {
#ifdef EOSIO_EOS_VM_OC_RUNTIME_ENABLED
struct eosvmoc_tier {
eosvmoc_tier(const boost::filesystem::path& d, const eosvmoc::config& c, const chainbase::database& db)
: cc(d, c, db), exec(cc),
mem(wasm_constraints::maximum_linear_memory/wasm_constraints::wasm_page_size) {}
: cc(d, c, db) {
// construct exec for the main thread
init_thread_local_data();
}
// Support multi-threaded execution.
void init_thread_local_data() {
exec = std::make_unique<eosvmoc::executor>(cc);
}
eosvmoc::code_cache_async cc;
eosvmoc::executor exec;
eosvmoc::memory mem;
// Each thread requires its own exec and mem. Defined in wasm_interface.cpp
thread_local static std::unique_ptr<eosvmoc::executor> exec;
thread_local static eosvmoc::memory mem;
};
#endif
@@ -34,11 +34,16 @@ class eosvmoc_runtime : public eosio::chain::wasm_runtime_interface {
const digest_type& code_hash, const uint8_t& vm_type, const uint8_t& vm_version) override;
void immediately_exit_currently_running_module() override;
void init_thread_local_data() override;
friend eosvmoc_instantiated_module;
eosvmoc::code_cache_sync cc;
eosvmoc::executor exec;
eosvmoc::memory mem;
// Defined in eos-vm-oc.cpp. Used for non-main thread in multi-threaded execution
thread_local static std::unique_ptr<eosvmoc::executor> exec_thread_local;
thread_local static eosvmoc::memory mem_thread_local;
};
/**
@@ -15,6 +15,7 @@
#include <thread>
#include <shared_mutex>
namespace std {
template<> struct hash<eosio::chain::eosvmoc::code_tuple> {
@@ -84,6 +85,9 @@ class code_cache_base {
template <typename T>
void serialize_cache_index(fc::datastream<T>& ds);
std::thread::id _main_thread_id;
bool is_main_thread() const;
};
class code_cache_async : public code_cache_base {
@@ -114,4 +118,4 @@ class code_cache_sync : public code_cache_base {
const code_descriptor* const get_descriptor_for_code_sync(const digest_type& code_id, const uint8_t& vm_version);
};
}}}
}}}
@@ -27,6 +27,9 @@ class wasm_runtime_interface {
virtual void immediately_exit_currently_running_module() = 0;
virtual ~wasm_runtime_interface();
// eosvmoc_runtime needs this
virtual void init_thread_local_data() {};
};
}}
+3 -2
View File
@@ -569,7 +569,7 @@ Enables new `get_block_num` intrinsic which returns the current block number.
protocol_feature_manager::protocol_feature_manager(
protocol_feature_set&& pfs,
std::function<deep_mind_handler*()> get_deep_mind_logger
std::function<deep_mind_handler*(bool is_trx_transient)> get_deep_mind_logger
):_protocol_feature_set( std::move(pfs) ), _get_deep_mind_logger(get_deep_mind_logger)
{
_builtin_protocol_features.resize( _protocol_feature_set._recognized_builtin_protocol_features.size() );
@@ -750,7 +750,8 @@ Enables new `get_block_num` intrinsic which returns the current block number.
("digest", feature_digest)
);
if (auto dm_logger = _get_deep_mind_logger()) {
// activate_feature is called by init. no transaction specific logging is possible
if (auto dm_logger = _get_deep_mind_logger(false)) {
dm_logger->on_activate_feature(*itr);
}
+19 -12
View File
@@ -65,7 +65,8 @@ void resource_limits_manager::initialize_database() {
state.virtual_net_limit = config.net_limit_parameters.max;
});
if (auto dm_logger = _get_deep_mind_logger()) {
// At startup, no transaction specific logging is possible
if (auto dm_logger = _get_deep_mind_logger(false)) {
dm_logger->on_init_resource_limits(config, state);
}
}
@@ -93,7 +94,7 @@ void resource_limits_manager::read_from_snapshot( const snapshot_reader_ptr& sna
});
}
void resource_limits_manager::initialize_account(const account_name& account) {
void resource_limits_manager::initialize_account(const account_name& account, bool is_trx_transient) {
const auto& limits = _db.create<resource_limits_object>([&]( resource_limits_object& bl ) {
bl.owner = account;
});
@@ -101,7 +102,7 @@ void resource_limits_manager::initialize_account(const account_name& account) {
const auto& usage = _db.create<resource_usage_object>([&]( resource_usage_object& bu ) {
bu.owner = account;
});
if (auto dm_logger = _get_deep_mind_logger()) {
if (auto dm_logger = _get_deep_mind_logger(is_trx_transient)) {
dm_logger->on_newaccount_resource_limits(limits, usage);
}
}
@@ -116,7 +117,9 @@ void resource_limits_manager::set_block_parameters(const elastic_limit_parameter
c.cpu_limit_parameters = cpu_limit_parameters;
c.net_limit_parameters = net_limit_parameters;
if (auto dm_logger = _get_deep_mind_logger()) {
// set_block_parameters is called by controller::finalize_block,
// where transaction specific logging is not possible
if (auto dm_logger = _get_deep_mind_logger(false)) {
dm_logger->on_update_resource_limits_config(c);
}
});
@@ -133,7 +136,7 @@ void resource_limits_manager::update_account_usage(const flat_set<account_name>&
}
}
void resource_limits_manager::add_transaction_usage(const flat_set<account_name>& accounts, uint64_t cpu_usage, uint64_t net_usage, uint32_t time_slot ) {
void resource_limits_manager::add_transaction_usage(const flat_set<account_name>& accounts, uint64_t cpu_usage, uint64_t net_usage, uint32_t time_slot, bool is_trx_transient ) {
const auto& state = _db.get<resource_limits_state_object>();
const auto& config = _db.get<resource_limits_config_object>();
@@ -149,7 +152,7 @@ void resource_limits_manager::add_transaction_usage(const flat_set<account_name>
bu.net_usage.add( net_usage, time_slot, config.account_net_usage_average_window );
bu.cpu_usage.add( cpu_usage, time_slot, config.account_cpu_usage_average_window );
if (auto dm_logger = _get_deep_mind_logger()) {
if (auto dm_logger = _get_deep_mind_logger(is_trx_transient)) {
dm_logger->on_update_account_usage(bu);
}
});
@@ -205,7 +208,7 @@ void resource_limits_manager::add_transaction_usage(const flat_set<account_name>
EOS_ASSERT( state.pending_net_usage <= config.net_limit_parameters.max, block_resource_exhausted, "Block has insufficient net resources" );
}
void resource_limits_manager::add_pending_ram_usage( const account_name account, int64_t ram_delta ) {
void resource_limits_manager::add_pending_ram_usage( const account_name account, int64_t ram_delta, bool is_trx_transient ) {
if (ram_delta == 0) {
return;
}
@@ -220,7 +223,7 @@ void resource_limits_manager::add_pending_ram_usage( const account_name account,
_db.modify( usage, [&]( auto& u ) {
u.ram_usage += ram_delta;
if (auto dm_logger = _get_deep_mind_logger()) {
if (auto dm_logger = _get_deep_mind_logger(is_trx_transient)) {
dm_logger->on_ram_event(account, u.ram_usage, ram_delta);
}
});
@@ -243,7 +246,7 @@ int64_t resource_limits_manager::get_account_ram_usage( const account_name& name
}
bool resource_limits_manager::set_account_limits( const account_name& account, int64_t ram_bytes, int64_t net_weight, int64_t cpu_weight) {
bool resource_limits_manager::set_account_limits( const account_name& account, int64_t ram_bytes, int64_t net_weight, int64_t cpu_weight, bool is_trx_transient) {
//const auto& usage = _db.get<resource_usage_object,by_owner>( account );
/*
* Since we need to delay these until the next resource limiting boundary, these are created in a "pending"
@@ -289,7 +292,7 @@ bool resource_limits_manager::set_account_limits( const account_name& account, i
pending_limits.net_weight = net_weight;
pending_limits.cpu_weight = cpu_weight;
if (auto dm_logger = _get_deep_mind_logger()) {
if (auto dm_logger = _get_deep_mind_logger(is_trx_transient)) {
dm_logger->on_set_account_limits(pending_limits);
}
});
@@ -356,7 +359,9 @@ void resource_limits_manager::process_account_limit_updates() {
multi_index.remove(*itr);
}
if (auto dm_logger = _get_deep_mind_logger()) {
// process_account_limit_updates is called by controller::finalize_block,
// where transaction specific logging is not possible
if (auto dm_logger = _get_deep_mind_logger(false)) {
dm_logger->on_update_resource_limits_state(state);
}
});
@@ -376,7 +381,9 @@ void resource_limits_manager::process_block_usage(uint32_t block_num) {
state.update_virtual_net_limit(config);
state.pending_net_usage = 0;
if (auto dm_logger = _get_deep_mind_logger()) {
// process_block_usage is called by controller::finalize_block,
// where transaction specific logging is not possible
if (auto dm_logger = _get_deep_mind_logger(false)) {
dm_logger->on_update_resource_limits_state(state);
}
});
+12 -9
View File
@@ -62,16 +62,19 @@ fc::microseconds transaction::get_signature_keys( const vector<signature_type>&
{ try {
auto start = fc::time_point::now();
recovered_pub_keys.clear();
const digest_type digest = sig_digest(chain_id, cfd);
for(const signature_type& sig : signatures) {
auto now = fc::time_point::now();
EOS_ASSERT( now < deadline, tx_cpu_usage_exceeded, "transaction signature verification executed for too long ${time}us",
("time", now - start)("now", now)("deadline", deadline)("start", start) );
auto[ itr, successful_insertion ] = recovered_pub_keys.emplace( sig, digest );
EOS_ASSERT( allow_duplicate_keys || successful_insertion, tx_duplicate_sig,
"transaction includes more than one signature signed using the same key associated with public key: ${key}",
("key", *itr ) );
if ( !signatures.empty() ) {
const digest_type digest = sig_digest(chain_id, cfd);
for(const signature_type& sig : signatures) {
auto now = fc::time_point::now();
EOS_ASSERT( now < deadline, tx_cpu_usage_exceeded, "transaction signature verification executed for too long ${time}us",
("time", now - start)("now", now)("deadline", deadline)("start", start) );
auto[ itr, successful_insertion ] = recovered_pub_keys.emplace( sig, digest );
EOS_ASSERT( allow_duplicate_keys || successful_insertion, tx_duplicate_sig,
"transaction includes more than one signature signed using the same key associated with public key: ${key}",
("key", *itr ) );
}
}
return fc::time_point::now() - start;
+88 -63
View File
@@ -59,7 +59,7 @@ namespace eosio { namespace chain {
,net_usage(trace->net_usage)
,pseudo_start(s)
{
if (!c.skip_db_sessions()) {
if (!c.skip_db_sessions() && !is_read_only()) {
undo_session.emplace(c.mutable_db().start_undo_session(true));
}
trace->id = packed_trx.id();
@@ -67,7 +67,7 @@ namespace eosio { namespace chain {
trace->block_time = c.pending_block_time();
trace->producer_block_id = c.pending_producer_block_id();
if(auto dm_logger = control.get_deep_mind_logger())
if(auto dm_logger = c.get_deep_mind_logger(is_transient()))
{
dm_logger->on_start_transaction();
}
@@ -75,7 +75,7 @@ namespace eosio { namespace chain {
transaction_context::~transaction_context()
{
if(auto dm_logger = control.get_deep_mind_logger())
if(auto dm_logger = control.get_deep_mind_logger(is_transient()))
{
dm_logger->on_end_transaction();
}
@@ -105,13 +105,13 @@ namespace eosio { namespace chain {
_deadline = start + objective_duration_limit;
// Possibly lower net_limit to the maximum net usage a transaction is allowed to be billed
if( cfg.max_transaction_net_usage <= net_limit ) {
if( cfg.max_transaction_net_usage <= net_limit && !is_read_only() ) {
net_limit = cfg.max_transaction_net_usage;
net_limit_due_to_block = false;
}
// Possibly lower objective_duration_limit to the maximum cpu usage a transaction is allowed to be billed
if( cfg.max_transaction_cpu_usage <= objective_duration_limit.count() ) {
if( cfg.max_transaction_cpu_usage <= objective_duration_limit.count() && !is_read_only() ) {
objective_duration_limit = fc::microseconds(cfg.max_transaction_cpu_usage);
billing_timer_exception_code = tx_cpu_usage_exceeded::code_value;
tx_cpu_usage_reason = tx_cpu_usage_exceeded_reason::on_chain_consensus_max_transaction_cpu_usage;
@@ -138,53 +138,57 @@ namespace eosio { namespace chain {
}
initial_objective_duration_limit = objective_duration_limit;
if( explicit_billed_cpu_time )
validate_cpu_usage_to_bill( billed_cpu_time_us, std::numeric_limits<int64_t>::max(), false, subjective_cpu_bill_us); // Fail early if the amount to be billed is too high
// Record accounts to be billed for network and CPU usage
if( control.is_builtin_activated(builtin_protocol_feature_t::only_bill_first_authorizer) ) {
bill_to_accounts.insert( trx.first_authorizer() );
} else {
for( const auto& act : trx.actions ) {
for( const auto& auth : act.authorization ) {
bill_to_accounts.insert( auth.actor );
}
}
}
validate_ram_usage.reserve( bill_to_accounts.size() );
// Update usage values of accounts to reflect new time
rl.update_account_usage( bill_to_accounts, block_timestamp_type(control.pending_block_time()).slot );
// Calculate the highest network usage and CPU time that all of the billed accounts can afford to be billed
int64_t account_net_limit = 0;
int64_t account_cpu_limit = 0;
bool greylisted_net = false, greylisted_cpu = false;
std::tie( account_net_limit, account_cpu_limit, greylisted_net, greylisted_cpu) = max_bandwidth_billed_accounts_can_pay();
net_limit_due_to_greylist |= greylisted_net;
cpu_limit_due_to_greylist |= greylisted_cpu;
if ( !is_read_only() ) {
if( explicit_billed_cpu_time )
validate_cpu_usage_to_bill( billed_cpu_time_us, std::numeric_limits<int64_t>::max(), false, subjective_cpu_bill_us); // Fail early if the amount to be billed is too high
// Record accounts to be billed for network and CPU usage
if( control.is_builtin_activated(builtin_protocol_feature_t::only_bill_first_authorizer) ) {
bill_to_accounts.insert( trx.first_authorizer() );
} else {
for( const auto& act : trx.actions ) {
for( const auto& auth : act.authorization ) {
bill_to_accounts.insert( auth.actor );
}
}
}
validate_ram_usage.reserve( bill_to_accounts.size() );
// Update usage values of accounts to reflect new time
rl.update_account_usage( bill_to_accounts, block_timestamp_type(control.pending_block_time()).slot );
// Calculate the highest network usage and CPU time that all of the billed accounts can afford to be billed
bool greylisted_net = false, greylisted_cpu = false;
std::tie( account_net_limit, account_cpu_limit, greylisted_net, greylisted_cpu) = max_bandwidth_billed_accounts_can_pay();
net_limit_due_to_greylist |= greylisted_net;
cpu_limit_due_to_greylist |= greylisted_cpu;
}
eager_net_limit = net_limit;
// Possibly lower eager_net_limit to what the billed accounts can pay plus some (objective) leeway
auto new_eager_net_limit = std::min( eager_net_limit, static_cast<uint64_t>(account_net_limit + cfg.net_usage_leeway) );
if( new_eager_net_limit < eager_net_limit ) {
eager_net_limit = new_eager_net_limit;
net_limit_due_to_block = false;
}
if ( !is_read_only() ) {
// Possibly lower eager_net_limit to what the billed accounts can pay plus some (objective) leeway
auto new_eager_net_limit = std::min( eager_net_limit, static_cast<uint64_t>(account_net_limit + cfg.net_usage_leeway) );
if( new_eager_net_limit < eager_net_limit ) {
eager_net_limit = new_eager_net_limit;
net_limit_due_to_block = false;
}
// Possibly limit deadline if the duration accounts can be billed for (+ a subjective leeway) does not exceed current delta
if( (fc::microseconds(account_cpu_limit) + leeway) <= (_deadline - start) ) {
_deadline = start + fc::microseconds(account_cpu_limit) + leeway;
billing_timer_exception_code = leeway_deadline_exception::code_value;
// Possibly limit deadline if the duration accounts can be billed for (+ a subjective leeway) does not exceed current delta
if( (fc::microseconds(account_cpu_limit) + leeway) <= (_deadline - start) ) {
_deadline = start + fc::microseconds(account_cpu_limit) + leeway;
billing_timer_exception_code = leeway_deadline_exception::code_value;
}
}
// Possibly limit deadline to subjective max_transaction_time
if( max_transaction_time_subjective != fc::microseconds::maximum() && (start + max_transaction_time_subjective) <= _deadline ) {
_deadline = start + max_transaction_time_subjective;
tx_cpu_usage_reason = billed_cpu_time_us > 0 ? tx_cpu_usage_exceeded_reason::speculative_executed_adjusted_max_transaction_time :
tx_cpu_usage_exceeded_reason::node_configured_max_transaction_time;
tx_cpu_usage_reason = billed_cpu_time_us > 0 ?
tx_cpu_usage_exceeded_reason::speculative_executed_adjusted_max_transaction_time : tx_cpu_usage_exceeded_reason::node_configured_max_transaction_time;
billing_timer_exception_code = tx_cpu_usage_exceeded::code_value;
}
@@ -194,20 +198,22 @@ namespace eosio { namespace chain {
billing_timer_exception_code = deadline_exception::code_value;
}
if( !explicit_billed_cpu_time ) {
int64_t validate_account_cpu_limit = account_cpu_limit - subjective_cpu_bill_us + leeway.count(); // Add leeway to allow powerup
// Possibly limit deadline to account subjective cpu left
if( subjective_cpu_bill_us > 0 && (start + fc::microseconds(validate_account_cpu_limit) < _deadline) ) {
_deadline = start + fc::microseconds(validate_account_cpu_limit);
billing_timer_exception_code = tx_cpu_usage_exceeded::code_value;
tx_cpu_usage_reason = tx_cpu_usage_exceeded_reason::account_cpu_limit;
}
if ( !is_read_only() ) {
if( !explicit_billed_cpu_time ) {
int64_t validate_account_cpu_limit = account_cpu_limit - subjective_cpu_bill_us + leeway.count(); // Add leeway to allow powerup
// Possibly limit deadline to account subjective cpu left
if( subjective_cpu_bill_us > 0 && (start + fc::microseconds(validate_account_cpu_limit) < _deadline) ) {
_deadline = start + fc::microseconds(validate_account_cpu_limit);
billing_timer_exception_code = tx_cpu_usage_exceeded::code_value;
tx_cpu_usage_reason = tx_cpu_usage_exceeded_reason::account_cpu_limit;
}
// Fail early if amount of the previous speculative execution is within 10% of remaining account cpu available
if( validate_account_cpu_limit > 0 )
validate_account_cpu_limit -= EOS_PERCENT( validate_account_cpu_limit, 10 * config::percent_1 );
if( validate_account_cpu_limit < 0 ) validate_account_cpu_limit = 0;
validate_account_cpu_usage_estimate( billed_cpu_time_us, validate_account_cpu_limit, subjective_cpu_bill_us );
// Fail early if amount of the previous speculative execution is within 10% of remaining account cpu available
if( validate_account_cpu_limit > 0 )
validate_account_cpu_limit -= EOS_PERCENT( validate_account_cpu_limit, 10 * config::percent_1 );
if( validate_account_cpu_limit < 0 ) validate_account_cpu_limit = 0;
validate_account_cpu_usage_estimate( billed_cpu_time_us, validate_account_cpu_limit, subjective_cpu_bill_us );
}
}
// Explicit billed_cpu_time_us should be used, block_deadline will be maximum unless in test code
@@ -248,6 +254,9 @@ namespace eosio { namespace chain {
uint64_t packed_trx_prunable_size )
{
const transaction& trx = packed_trx.get_transaction();
if ( is_transient() ) {
EOS_ASSERT( trx.delay_sec.value == 0, transaction_exception, "dry-run or read-only transaction cannot be delayed" );
}
if( trx.transaction_extensions.size() > 0 ) {
disallow_transaction_extensions( "no transaction extensions supported yet for input transactions" );
}
@@ -277,12 +286,17 @@ namespace eosio { namespace chain {
published = control.pending_block_time();
is_input = true;
if (!control.skip_trx_checks()) {
control.validate_expiration(trx);
control.validate_tapos(trx);
if ( !is_read_only() ) {
control.validate_expiration(trx);
control.validate_tapos(trx);
}
validate_referenced_accounts( trx, enforce_whiteblacklist && control.is_speculative_block() );
}
init( initial_net_usage);
record_transaction( packed_trx.id(), trx.expiration ); /// checks for dupes
init( initial_net_usage );
if ( !is_read_only() ) {
record_transaction( packed_trx.id(), trx.expiration );
}
}
void transaction_context::init_for_deferred_trx( fc::time_point p )
@@ -332,6 +346,13 @@ namespace eosio { namespace chain {
void transaction_context::finalize() {
EOS_ASSERT( is_initialized, transaction_exception, "must first initialize" );
// read-only transactions only need net_usage and elapsed in the trace
if ( is_read_only() ) {
net_usage = ((net_usage + 7)/8)*8; // Round up to nearest multiple of word size (8 bytes)
trace->elapsed = fc::time_point::now() - start;
return;
}
if( is_input ) {
const transaction& trx = packed_trx.get_transaction();
auto& am = control.get_mutable_authorization_manager();
@@ -383,7 +404,7 @@ namespace eosio { namespace chain {
validate_cpu_usage_to_bill( billed_cpu_time_us, account_cpu_limit, true, subjective_cpu_bill_us );
rl.add_transaction_usage( bill_to_accounts, static_cast<uint64_t>(billed_cpu_time_us), net_usage,
block_timestamp_type(control.pending_block_time()).slot ); // Should never fail
block_timestamp_type(control.pending_block_time()).slot, is_transient() ); // Should never fail
}
void transaction_context::squash() {
@@ -588,7 +609,7 @@ namespace eosio { namespace chain {
void transaction_context::add_ram_usage( account_name account, int64_t ram_delta ) {
auto& rl = control.get_mutable_resource_limits_manager();
rl.add_pending_ram_usage( account, ram_delta );
rl.add_pending_ram_usage( account, ram_delta, is_transient() );
if( ram_delta > 0 ) {
validate_ram_usage.insert( account );
}
@@ -709,7 +730,7 @@ namespace eosio { namespace chain {
apply_context acontext( control, *this, action_ordinal, recurse_depth );
if (recurse_depth == 0) {
if (auto dm_logger = control.get_deep_mind_logger()) {
if (auto dm_logger = control.get_deep_mind_logger(is_transient())) {
dm_logger->on_input_action();
}
}
@@ -741,7 +762,7 @@ namespace eosio { namespace chain {
gto.expiration = gto.delay_until + fc::seconds(control.get_global_properties().configuration.deferred_trx_expiration_window);
trx_size = gto.set( trx );
if (auto dm_logger = control.get_deep_mind_logger()) {
if (auto dm_logger = control.get_deep_mind_logger(is_transient())) {
std::string event_id = RAM_EVENT_ID("${id}", ("id", gto.id));
dm_logger->on_create_deferred(deep_mind_handler::operation_qualifier::push, gto, packed_trx);
@@ -789,6 +810,10 @@ namespace eosio { namespace chain {
auto* code = db.find<account_object, by_name>(a.account);
EOS_ASSERT( code != nullptr, transaction_exception,
"action's code account '${account}' does not exist", ("account", a.account) );
if ( is_read_only() ) {
EOS_ASSERT( a.authorization.size() == 0, transaction_exception,
"read-only action '${name}' cannot have authorizations", ("name", a.name) );
}
for( const auto& auth : a.authorization ) {
one_auth = true;
auto* actor = db.find<account_object, by_name>(auth.actor);
@@ -801,7 +826,7 @@ namespace eosio { namespace chain {
actors.insert( auth.actor );
}
}
EOS_ASSERT( one_auth || is_dry_run(), tx_no_auths, "transaction must have at least one authorization" );
EOS_ASSERT( one_auth || is_transient(), tx_no_auths, "transaction must have at least one authorization" );
if( enforce_actor_whitelist_blacklist ) {
control.check_actor_list( actors );
+16 -3
View File
@@ -23,7 +23,6 @@
#include <softfloat.hpp>
#include <compiler_builtins.hpp>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <fstream>
#include <string.h>
@@ -34,10 +33,19 @@
namespace eosio { namespace chain {
wasm_interface::wasm_interface(vm_type vm, bool eosvmoc_tierup, const chainbase::database& d, const boost::filesystem::path data_dir, const eosvmoc::config& eosvmoc_config, bool profile)
: my( new wasm_interface_impl(vm, eosvmoc_tierup, d, data_dir, eosvmoc_config, profile) ) {}
: my( new wasm_interface_impl(vm, eosvmoc_tierup, d, data_dir, eosvmoc_config, profile) ), vm( vm ) {}
wasm_interface::~wasm_interface() {}
#ifdef EOSIO_EOS_VM_OC_RUNTIME_ENABLED
void wasm_interface::init_thread_local_data() {
if (my->eosvmoc)
my->eosvmoc->init_thread_local_data();
else if (vm == wasm_interface::vm_type::eos_vm_oc && my->runtime_interface)
my->runtime_interface->init_thread_local_data();
}
#endif
void wasm_interface::validate(const controller& control, const bytes& code) {
const auto& pso = control.db().get<protocol_state_object>();
@@ -96,7 +104,7 @@ namespace eosio { namespace chain {
once_is_enough = true;
}
if(cd) {
my->eosvmoc->exec.execute(*cd, my->eosvmoc->mem, context);
my->eosvmoc->exec->execute(*cd, my->eosvmoc->mem, context);
return;
}
}
@@ -115,6 +123,11 @@ namespace eosio { namespace chain {
wasm_instantiated_module_interface::~wasm_instantiated_module_interface() {}
wasm_runtime_interface::~wasm_runtime_interface() {}
#ifdef EOSIO_EOS_VM_OC_RUNTIME_ENABLED
thread_local std::unique_ptr<eosvmoc::executor> wasm_interface_impl::eosvmoc_tier::exec {};
thread_local eosvmoc::memory wasm_interface_impl::eosvmoc_tier::mem{ wasm_constraints::maximum_linear_memory/wasm_constraints::wasm_page_size };
#endif
std::istream& operator>>(std::istream& in, wasm_interface::vm_type& runtime) {
std::string s;
in >> s;
+4 -3
View File
@@ -24,9 +24,10 @@ namespace eosio { namespace chain { namespace webassembly {
void interface::set_action_return_value( span<const char> packed_blob ) {
auto max_action_return_value_size =
context.control.get_global_properties().configuration.max_action_return_value_size;
EOS_ASSERT(packed_blob.size() <= max_action_return_value_size,
action_return_value_exception,
"action return value size must be less or equal to ${s} bytes", ("s", max_action_return_value_size));
if( !context.trx_context.is_read_only() )
EOS_ASSERT(packed_blob.size() <= max_action_return_value_size,
action_return_value_exception,
"action return value size must be less or equal to ${s} bytes", ("s", max_action_return_value_size));
context.action_return_value.assign( packed_blob.data(), packed_blob.data() + packed_blob.size() );
}
}}} // ns eosio::chain::webassembly
+10 -2
View File
@@ -17,14 +17,16 @@ namespace eosio { namespace chain { namespace webassembly {
}
void interface::preactivate_feature( legacy_ptr<const digest_type> feature_digest ) {
context.control.preactivate_feature( *feature_digest );
EOS_ASSERT(!context.trx_context.is_read_only(), wasm_execution_error, "preactivate_feature not allowed in a readonly transaction");
context.control.preactivate_feature( *feature_digest, context.trx_context.is_transient() );
}
void interface::set_resource_limits( account_name account, int64_t ram_bytes, int64_t net_weight, int64_t cpu_weight ) {
EOS_ASSERT(!context.trx_context.is_read_only(), wasm_execution_error, "set_resource_limits not allowed in a readonly transaction");
EOS_ASSERT(ram_bytes >= -1, wasm_execution_error, "invalid value for ram resource limit expected [-1,INT64_MAX]");
EOS_ASSERT(net_weight >= -1, wasm_execution_error, "invalid value for net resource weight expected [-1,INT64_MAX]");
EOS_ASSERT(cpu_weight >= -1, wasm_execution_error, "invalid value for cpu resource weight expected [-1,INT64_MAX]");
if( context.control.get_mutable_resource_limits_manager().set_account_limits(account, ram_bytes, net_weight, cpu_weight) ) {
if( context.control.get_mutable_resource_limits_manager().set_account_limits(account, ram_bytes, net_weight, cpu_weight, context.trx_context.is_transient()) ) {
context.trx_context.validate_ram_usage.insert( account );
}
}
@@ -99,6 +101,7 @@ namespace eosio { namespace chain { namespace webassembly {
return s;
}
void interface::set_wasm_parameters_packed( span<const char> packed_parameters ) {
EOS_ASSERT(!context.trx_context.is_read_only(), wasm_execution_error, "set_wasm_parameters_packed not allowed in a readonly transaction");
datastream<const char*> ds( packed_parameters.data(), packed_parameters.size() );
uint32_t version;
chain::wasm_config cfg;
@@ -113,6 +116,7 @@ namespace eosio { namespace chain { namespace webassembly {
);
}
int64_t interface::set_proposed_producers( legacy_span<const char> packed_producer_schedule) {
EOS_ASSERT(!context.trx_context.is_read_only(), wasm_execution_error, "set_proposed_producers not allowed in a readonly transaction");
datastream<const char*> ds( packed_producer_schedule.data(), packed_producer_schedule.size() );
std::vector<producer_authority> producers;
std::vector<legacy::producer_key> old_version;
@@ -129,6 +133,7 @@ namespace eosio { namespace chain { namespace webassembly {
}
int64_t interface::set_proposed_producers_ex( uint64_t packed_producer_format, legacy_span<const char> packed_producer_schedule) {
EOS_ASSERT(!context.trx_context.is_read_only(), wasm_execution_error, "set_proposed_producers_ex not allowed in a readonly transaction");
if (packed_producer_format == 0) {
return set_proposed_producers(std::move(packed_producer_schedule));
} else if (packed_producer_format == 1) {
@@ -157,6 +162,7 @@ namespace eosio { namespace chain { namespace webassembly {
}
void interface::set_blockchain_parameters_packed( legacy_span<const char> packed_blockchain_parameters ) {
EOS_ASSERT(!context.trx_context.is_read_only(), wasm_execution_error, "set_blockchain_parameters_packed not allowed in a readonly transaction");
datastream<const char*> ds( packed_blockchain_parameters.data(), packed_blockchain_parameters.size() );
chain::chain_config_v0 cfg;
fc::raw::unpack(ds, cfg);
@@ -188,6 +194,7 @@ namespace eosio { namespace chain { namespace webassembly {
}
void interface::set_parameters_packed( span<const char> packed_parameters ){
EOS_ASSERT(!context.trx_context.is_read_only(), wasm_execution_error, "set_parameters_packed not allowed in a readonly transaction");
datastream<const char*> ds( packed_parameters.data(), packed_parameters.size() );
chain::chain_config cfg = context.control.get_global_properties().configuration;
@@ -207,6 +214,7 @@ namespace eosio { namespace chain { namespace webassembly {
}
void interface::set_privileged( account_name n, bool is_priv ) {
EOS_ASSERT(!context.trx_context.is_read_only(), wasm_execution_error, "set_privileged not allowed in a readonly transaction");
const auto& a = context.db.get<account_metadata_object, by_name>( n );
context.db.modify( a, [&]( auto& ma ){
ma.set_privileged( is_priv );
@@ -15,7 +15,8 @@ class eosvmoc_instantiated_module : public wasm_instantiated_module_interface {
eosvmoc_instantiated_module(const digest_type& code_hash, const uint8_t& vm_version, eosvmoc_runtime& wr) :
_code_hash(code_hash),
_vm_version(vm_version),
_eosvmoc_runtime(wr)
_eosvmoc_runtime(wr),
_main_thread_id(std::this_thread::get_id())
{
}
@@ -24,16 +25,22 @@ class eosvmoc_instantiated_module : public wasm_instantiated_module_interface {
_eosvmoc_runtime.cc.free_code(_code_hash, _vm_version);
}
bool is_main_thread() { return _main_thread_id == std::this_thread::get_id(); };
void apply(apply_context& context) override {
const code_descriptor* const cd = _eosvmoc_runtime.cc.get_descriptor_for_code_sync(_code_hash, _vm_version);
EOS_ASSERT(cd, wasm_execution_error, "EOS VM OC instantiation failed");
_eosvmoc_runtime.exec.execute(*cd, _eosvmoc_runtime.mem, context);
if ( is_main_thread() )
_eosvmoc_runtime.exec.execute(*cd, _eosvmoc_runtime.mem, context);
else
_eosvmoc_runtime.exec_thread_local->execute(*cd, _eosvmoc_runtime.mem_thread_local, context);
}
const digest_type _code_hash;
const uint8_t _vm_version;
eosvmoc_runtime& _eosvmoc_runtime;
std::thread::id _main_thread_id;
};
eosvmoc_runtime::eosvmoc_runtime(const boost::filesystem::path data_dir, const eosvmoc::config& eosvmoc_config, const chainbase::database& db)
@@ -45,11 +52,17 @@ eosvmoc_runtime::~eosvmoc_runtime() {
std::unique_ptr<wasm_instantiated_module_interface> eosvmoc_runtime::instantiate_module(const char* code_bytes, size_t code_size, std::vector<uint8_t> initial_memory,
const digest_type& code_hash, const uint8_t& vm_type, const uint8_t& vm_version) {
return std::make_unique<eosvmoc_instantiated_module>(code_hash, vm_type, *this);
}
//never called. EOS VM OC overrides eosio_exit to its own implementation
void eosvmoc_runtime::immediately_exit_currently_running_module() {}
void eosvmoc_runtime::init_thread_local_data() {
exec_thread_local = std::make_unique<eosvmoc::executor>(cc);
}
thread_local std::unique_ptr<eosvmoc::executor> eosvmoc_runtime::exec_thread_local {};
thread_local eosvmoc::memory eosvmoc_runtime::mem_thread_local{ wasm_constraints::maximum_linear_memory/wasm_constraints::wasm_page_size };
}}}}
@@ -106,9 +106,11 @@ std::tuple<size_t, size_t> code_cache_async::consume_compile_thread_queue() {
return {gotsome, bytes_remaining};
}
const code_descriptor* const code_cache_async::get_descriptor_for_code(const digest_type& code_id, const uint8_t& vm_version) {
//if there are any outstanding compiles, process the result queue now
if(_outstanding_compiles_and_poison.size()) {
//do this only on main thread (which is in single threaded write window)
if(is_main_thread() && _outstanding_compiles_and_poison.size()) {
auto [count_processed, bytes_remaining] = consume_compile_thread_queue();
if(count_processed)
@@ -134,9 +136,12 @@ const code_descriptor* const code_cache_async::get_descriptor_for_code(const dig
//check for entry in cache
code_cache_index::index<by_hash>::type::iterator it = _cache_index.get<by_hash>().find(boost::make_tuple(code_id, vm_version));
if(it != _cache_index.get<by_hash>().end()) {
_cache_index.relocate(_cache_index.begin(), _cache_index.project<0>(it));
if (is_main_thread())
_cache_index.relocate(_cache_index.begin(), _cache_index.project<0>(it));
return &*it;
}
if(!is_main_thread()) // on read-only thread
return nullptr;
const code_tuple ct = code_tuple{code_id, vm_version};
@@ -178,9 +183,12 @@ const code_descriptor* const code_cache_sync::get_descriptor_for_code_sync(const
//check for entry in cache
code_cache_index::index<by_hash>::type::iterator it = _cache_index.get<by_hash>().find(boost::make_tuple(code_id, vm_version));
if(it != _cache_index.get<by_hash>().end()) {
_cache_index.relocate(_cache_index.begin(), _cache_index.project<0>(it));
if (is_main_thread())
_cache_index.relocate(_cache_index.begin(), _cache_index.project<0>(it));
return &*it;
}
if(!is_main_thread())
return nullptr;
const code_object* const codeobject = _db.find<code_object,by_code_hash>(boost::make_tuple(code_id, 0, vm_version));
if(!codeobject) //should be impossible right?
@@ -204,7 +212,8 @@ const code_descriptor* const code_cache_sync::get_descriptor_for_code_sync(const
code_cache_base::code_cache_base(const boost::filesystem::path data_dir, const eosvmoc::config& eosvmoc_config, const chainbase::database& db) :
_db(db),
_cache_file_path(data_dir/"code_cache.bin")
_cache_file_path(data_dir/"code_cache.bin"),
_main_thread_id(std::this_thread::get_id())
{
static_assert(sizeof(allocator_t) <= header_offset, "header offset intersects with allocator");
@@ -382,4 +391,7 @@ void code_cache_base::check_eviction_threshold(size_t free_bytes) {
run_eviction_round();
}
bool code_cache_base::is_main_thread() const {
return _main_thread_id == std::this_thread::get_id();
}
}}}
+5
View File
@@ -0,0 +1,5 @@
add_library(custom_appbase INTERFACE)
target_include_directories(custom_appbase INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include")
target_link_libraries(custom_appbase INTERFACE appbase)
add_subdirectory(tests)
@@ -0,0 +1,111 @@
#pragma once
#include <appbase/application_base.hpp>
#include <appbase/execution_priority_queue.hpp>
/*
* Custmomize appbase to support two-queue exector.
*/
namespace appbase {
enum class exec_window {
read, // the window during which operations from read_only_trx_safe queue
// can be executed in app thread in parallel with read-only transactions
// in read-only transaction excuting threads.
write, // the window during which operations from both general and
// read_only_trx_safe queues can be executed in app thread,
// while read-only transactions are not executed in read-only
// transaction excuting threads.
};
enum class exec_queue {
read_only_trx_safe, // the queue storing operations which are safe to execute
// on app thread in parallel with read-only transactions
// in read-only transaction excuting threads.
general // the queue storing operations which can be only executed
// on the app thread while read-only transactions are
// not being executed in read-only threads
};
class two_queue_executor {
public:
template <typename Func>
auto post( int priority, exec_queue q, Func&& func ) {
if ( q == exec_queue::general )
return boost::asio::post(io_serv_, general_queue_.wrap(priority, --order_, std::forward<Func>(func)));
else
return boost::asio::post(io_serv_, read_only_trx_safe_queue_.wrap(priority, --order_, std::forward<Func>(func)));
}
// Legacy and deprecated. To be removed after cleaning up its uses in base appbase
template <typename Func>
auto post( int priority, Func&& func ) {
// safer to use general queue for unknown type of operation since operations
// from general queue are not executed in parallel with read-only transactions
return boost::asio::post(io_serv_, general_queue_.wrap(priority, --order_, std::forward<Func>(func)));
}
boost::asio::io_service& get_io_service() { return io_serv_; }
bool execute_highest() {
if ( exec_window_ == exec_window::write ) {
if( !general_queue_.empty() && ( read_only_trx_safe_queue_.empty() || *read_only_trx_safe_queue_.top() < *general_queue_.top()) ) {
// general_queue_'s top function's priority greater than read_only_trx_safe_queue_'s top function's, or general_queue_ empty
general_queue_.execute_highest();
} else if( !read_only_trx_safe_queue_.empty() ) {
read_only_trx_safe_queue_.execute_highest();
}
return !read_only_trx_safe_queue_.empty() || !general_queue_.empty();
} else {
return read_only_trx_safe_queue_.execute_highest();
}
}
template <typename Function>
boost::asio::executor_binder<Function, appbase::execution_priority_queue::executor>
wrap(int priority, exec_queue q, Function&& func ) {
if ( q == exec_queue::general )
return general_queue_.wrap(priority, --order_, std::forward<Function>(func));
else
return read_only_trx_safe_queue_.wrap(priority, --order_, std::forward<Function>(func));
}
void clear() {
read_only_trx_safe_queue_.clear();
general_queue_.clear();
}
void set_to_read_window() {
exec_window_ = exec_window::read;
}
void set_to_write_window() {
exec_window_ = exec_window::write;
}
bool is_read_window() const {
return exec_window_ == exec_window::read;
}
bool is_write_window() const {
return exec_window_ == exec_window::write;
}
auto& read_only_trx_safe_queue() { return read_only_trx_safe_queue_; }
auto& general_queue() { return general_queue_; }
// members are ordered taking into account that the last one is destructed first
private:
boost::asio::io_service io_serv_;
appbase::execution_priority_queue read_only_trx_safe_queue_;
appbase::execution_priority_queue general_queue_;
std::atomic<std::size_t> order_ { std::numeric_limits<size_t>::max() }; // to maintain FIFO ordering in both queues within priority
exec_window exec_window_ { exec_window::write };
};
using application = application_t<two_queue_executor>;
}
#include <appbase/application_instance.hpp>
@@ -0,0 +1,13 @@
if(CMAKE_CXX_STANDARD EQUAL 98 OR CMAKE_CXX_STANDARD LESS 17)
message(FATAL_ERROR "appbase requires c++17 or newer")
elseif(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
endif()
file(GLOB UNIT_TESTS "*.cpp")
add_executable( custom_appbase_test ${UNIT_TESTS} )
target_link_libraries( custom_appbase_test appbase ${CMAKE_DL_LIBS} ${PLATFORM_SPECIFIC_LIBS} )
target_include_directories( custom_appbase_test PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../include" "${CMAKE_CURRENT_SOURCE_DIR}/../../appbase/include" )
add_test( custom_appbase_test custom_appbase_test )
@@ -0,0 +1,215 @@
#define BOOST_TEST_MODULE custom_appbase_tests
#include <boost/test/included/unit_test.hpp>
#include <thread>
#include <iostream>
#include <eosio/chain/application.hpp>
using namespace appbase;
BOOST_AUTO_TEST_SUITE(custom_appbase_tests)
std::thread start_app_thread(appbase::scoped_app& app) {
const char* argv[] = { boost::unit_test::framework::current_test_case().p_name->c_str() };
BOOST_CHECK(app->initialize(sizeof(argv) / sizeof(char*), const_cast<char**>(argv)));
app->startup();
std::thread app_thread( [&]() {
app->exec();
} );
return app_thread;
}
// verify functions from both queues are executed when execution window is not explictly set
BOOST_AUTO_TEST_CASE( default_exec_window ) {
appbase::scoped_app app;
auto app_thread = start_app_thread(app);
// post functions
std::map<int, int> rslts {};
int seq_num = 0;
app->executor().post( priority::medium, exec_queue::read_only_trx_safe, [&]() { rslts[0]=seq_num; ++seq_num; } );
app->executor().post( priority::medium, exec_queue::general, [&]() { rslts[1]=seq_num; ++seq_num; } );
app->executor().post( priority::high, exec_queue::general, [&]() { rslts[2]=seq_num; ++seq_num; } );
app->executor().post( priority::high, exec_queue::read_only_trx_safe, [&]() { rslts[3]=seq_num; ++seq_num; } );
app->executor().post( priority::low, exec_queue::read_only_trx_safe, [&]() { rslts[4]=seq_num; ++seq_num; } );
app->executor().post( priority::low, exec_queue::general, [&]() { rslts[5]=seq_num; ++seq_num; } );
app->executor().post( priority::highest,exec_queue::read_only_trx_safe, [&]() { rslts[6]=seq_num; ++seq_num; } );
app->executor().post( priority::high, exec_queue::general, [&]() { rslts[7]=seq_num; ++seq_num; } );
// Stop app. Use the lowest priority to make sure this function to execute the last
app->executor().post( priority::lowest, exec_queue::read_only_trx_safe, [&]() {
// read_only_trx_safe_queue should only contain the current lambda function,
// and general_queue should have execute all its functions
BOOST_REQUIRE_EQUAL( app->executor().read_only_trx_safe_queue().size(), 1);
BOOST_REQUIRE_EQUAL( app->executor().general_queue().size(), 0 );
app->quit();
} );
app_thread.join();
// both queues are cleared after execution
BOOST_REQUIRE_EQUAL( app->executor().read_only_trx_safe_queue().empty(), true);
BOOST_REQUIRE_EQUAL( app->executor().general_queue().empty(), true);
// exactly number of both queues' functions processed
BOOST_REQUIRE_EQUAL( rslts.size(), 8 );
// same priority of functions executed by the post order
BOOST_CHECK_LT( rslts[0], rslts[1] ); // medium
BOOST_CHECK_LT( rslts[2], rslts[3] ); // high
BOOST_CHECK_LT( rslts[3], rslts[7] ); // high
BOOST_CHECK_LT( rslts[4], rslts[5] ); // low
// higher priority posted earlier executed earlier
BOOST_CHECK_LT( rslts[3], rslts[4] );
BOOST_CHECK_LT( rslts[6], rslts[7] );
}
// verify functions only from read_only_trx_safe queue are processed during read window
BOOST_AUTO_TEST_CASE( execute_from_read_queue ) {
appbase::scoped_app app;
auto app_thread = start_app_thread(app);
// set to run functions from read_only_trx_safe queue only
app->executor().set_to_read_window();
// post functions
std::map<int, int> rslts {};
int seq_num = 0;
app->executor().post( priority::medium, exec_queue::general, [&]() { rslts[0]=seq_num; ++seq_num; } );
app->executor().post( priority::high, exec_queue::read_only_trx_safe, [&]() { rslts[1]=seq_num; ++seq_num; } );
app->executor().post( priority::high, exec_queue::general, [&]() { rslts[2]=seq_num; ++seq_num; } );
app->executor().post( priority::high, exec_queue::read_only_trx_safe, [&]() { rslts[3]=seq_num; ++seq_num; } );
app->executor().post( priority::low, exec_queue::read_only_trx_safe, [&]() { rslts[4]=seq_num; ++seq_num; } );
app->executor().post( priority::low, exec_queue::general, [&]() { rslts[5]=seq_num; ++seq_num; } );
app->executor().post( priority::highest,exec_queue::read_only_trx_safe, [&]() { rslts[6]=seq_num; ++seq_num; } );
app->executor().post( priority::highest,exec_queue::read_only_trx_safe, [&]() { rslts[7]=seq_num; ++seq_num; } );
app->executor().post( priority::high, exec_queue::read_only_trx_safe, [&]() { rslts[8]=seq_num; ++seq_num; } );
app->executor().post( priority::high, exec_queue::general, [&]() { rslts[9]=seq_num; ++seq_num; } );
// stop application. Use lowest at the end to make sure this executes the last
app->executor().post( priority::lowest, exec_queue::read_only_trx_safe, [&]() {
// read_queue should have current function and write_queue should have all its functions
BOOST_REQUIRE_EQUAL( app->executor().read_only_trx_safe_queue().size(), 1);
BOOST_REQUIRE_EQUAL( app->executor().general_queue().size(), 4 );
app->quit();
} );
app_thread.join();
// both queues are cleared after execution
BOOST_REQUIRE_EQUAL( app->executor().read_only_trx_safe_queue().empty(), true);
BOOST_REQUIRE_EQUAL( app->executor().general_queue().empty(), true);
// exactly number of posts processed
BOOST_REQUIRE_EQUAL( rslts.size(), 6 );
// same priority (high) of functions in read_queue executed by the post order
BOOST_CHECK_LT( rslts[1], rslts[3] );
// higher priority posted earlier in read_queue executed earlier
BOOST_CHECK_LT( rslts[3], rslts[4] );
}
// verify no functions are executed during read window if read_only_trx_safe queue is empty
BOOST_AUTO_TEST_CASE( execute_from_empty_read_queue ) {
appbase::scoped_app app;
auto app_thread = start_app_thread(app);
// set to run functions from read_only_trx_safe queue only
app->executor().set_to_read_window();
// post functions
std::map<int, int> rslts {};
int seq_num = 0;
app->executor().post( priority::medium, exec_queue::general, [&]() { rslts[0]=seq_num; ++seq_num; } );
app->executor().post( priority::high, exec_queue::general, [&]() { rslts[1]=seq_num; ++seq_num; } );
app->executor().post( priority::high, exec_queue::general, [&]() { rslts[2]=seq_num; ++seq_num; } );
app->executor().post( priority::high, exec_queue::general, [&]() { rslts[3]=seq_num; ++seq_num; } );
app->executor().post( priority::low, exec_queue::general, [&]() { rslts[4]=seq_num; ++seq_num; } );
app->executor().post( priority::low, exec_queue::general, [&]() { rslts[5]=seq_num; ++seq_num; } );
app->executor().post( priority::highest,exec_queue::general, [&]() { rslts[6]=seq_num; ++seq_num; } );
app->executor().post( priority::highest,exec_queue::general, [&]() { rslts[7]=seq_num; ++seq_num; } );
app->executor().post( priority::high, exec_queue::general, [&]() { rslts[8]=seq_num; ++seq_num; } );
app->executor().post( priority::high, exec_queue::general, [&]() { rslts[9]=seq_num; ++seq_num; } );
// Stop application. Use lowest at the end to make sure this executes the last
app->executor().post( priority::lowest, exec_queue::read_only_trx_safe, [&]() {
// read_queue should have current function and write_queue should have all its functions
BOOST_REQUIRE_EQUAL( app->executor().read_only_trx_safe_queue().size(), 1);
BOOST_REQUIRE_EQUAL( app->executor().general_queue().size(), 10 );
app->quit();
} );
app_thread.join();
// both queues are cleared after execution
BOOST_REQUIRE_EQUAL( app->executor().read_only_trx_safe_queue().empty(), true);
BOOST_REQUIRE_EQUAL( app->executor().general_queue().empty(), true);
// no results
BOOST_REQUIRE_EQUAL( rslts.size(), 0 );
}
// verify functions from both queues are processed in write window
BOOST_AUTO_TEST_CASE( execute_from_both_queues ) {
appbase::scoped_app app;
auto app_thread = start_app_thread(app);
// set to run functions from both queues
app->executor().is_write_window();
// post functions
std::map<int, int> rslts {};
int seq_num = 0;
app->executor().post( priority::medium, exec_queue::read_only_trx_safe, [&]() { rslts[0]=seq_num; ++seq_num; } );
app->executor().post( priority::medium, exec_queue::general, [&]() { rslts[1]=seq_num; ++seq_num; } );
app->executor().post( priority::high, exec_queue::general, [&]() { rslts[2]=seq_num; ++seq_num; } );
app->executor().post( priority::lowest, exec_queue::read_only_trx_safe, [&]() { rslts[3]=seq_num; ++seq_num; } );
app->executor().post( priority::low, exec_queue::read_only_trx_safe, [&]() { rslts[4]=seq_num; ++seq_num; } );
app->executor().post( priority::low, exec_queue::general, [&]() { rslts[5]=seq_num; ++seq_num; } );
app->executor().post( priority::highest,exec_queue::read_only_trx_safe, [&]() { rslts[6]=seq_num; ++seq_num; } );
app->executor().post( priority::low, exec_queue::general, [&]() { rslts[7]=seq_num; ++seq_num; } );
app->executor().post( priority::lowest, exec_queue::read_only_trx_safe, [&]() { rslts[8]=seq_num; ++seq_num; } );
app->executor().post( priority::lowest, exec_queue::read_only_trx_safe, [&]() { rslts[9]=seq_num; ++seq_num; } );
app->executor().post( priority::low, exec_queue::general, [&]() { rslts[10]=seq_num; ++seq_num; } );
app->executor().post( priority::medium, exec_queue::general, [&]() { rslts[11]=seq_num; ++seq_num; } );
// stop application. Use lowest at the end to make sure this executes the last
app->executor().post( priority::lowest, exec_queue::read_only_trx_safe, [&]() {
// read_queue should have current function and write_queue's functions are all executed
BOOST_REQUIRE_EQUAL( app->executor().read_only_trx_safe_queue().size(), 1);
BOOST_REQUIRE_EQUAL( app->executor().general_queue().size(), 0 );
app->quit();
} );
app_thread.join();
// queues are emptied after quit
BOOST_REQUIRE_EQUAL( app->executor().read_only_trx_safe_queue().empty(), true);
BOOST_REQUIRE_EQUAL( app->executor().general_queue().empty(), true);
// exactly number of posts processed
BOOST_REQUIRE_EQUAL( rslts.size(), 12 );
// all low must be processed the in order of posting
BOOST_CHECK_LT( rslts[4], rslts[5] );
BOOST_CHECK_LT( rslts[5], rslts[7] );
BOOST_CHECK_LT( rslts[7], rslts[10] );
// all medium must be processed the in order of posting
BOOST_CHECK_LT( rslts[0], rslts[1] );
BOOST_CHECK_LT( rslts[1], rslts[11] );
// all functions posted after high before highest must be processed after high
BOOST_CHECK_LT( rslts[2], rslts[3] );
BOOST_CHECK_LT( rslts[2], rslts[4] );
BOOST_CHECK_LT( rslts[2], rslts[5] );
// all functions posted after highest must be processed after it
BOOST_CHECK_LT( rslts[6], rslts[7] );
BOOST_CHECK_LT( rslts[6], rslts[8] );
BOOST_CHECK_LT( rslts[6], rslts[9] );
BOOST_CHECK_LT( rslts[6], rslts[10] );
BOOST_CHECK_LT( rslts[6], rslts[11] );
BOOST_CHECK_LT( rslts[6], rslts[11] );
}
BOOST_AUTO_TEST_SUITE_END()
+1 -1
View File
@@ -140,7 +140,7 @@ if(APPLE)
find_library(corefoundation_framework CoreFoundation)
endif()
target_link_libraries( fc PUBLIC Boost::date_time Boost::filesystem Boost::chrono Boost::iostreams Threads::Threads
OpenSSL::Crypto OpenSSL::SSL ZLIB::ZLIB ${PLATFORM_SPECIFIC_LIBS} ${CMAKE_DL_LIBS} secp256k1 ${security_framework} ${corefoundation_framework})
OpenSSL::Crypto ZLIB::ZLIB ${PLATFORM_SPECIFIC_LIBS} ${CMAKE_DL_LIBS} secp256k1 ${security_framework} ${corefoundation_framework})
# Critically, this ensures that OpenSSL 1.1 & 3.0 both have a variant of BN_zero() with void return value. But it also allows access
# to some obsoleted AES functions in 3.0 too, since 3.0's API_COMPAT is effectively 3.0 by default
@@ -22,6 +22,10 @@ class sha256
char* data();
size_t data_size() const { return 256 / 8; }
bool empty()const {
return (_hash[0] | _hash[1] | _hash[2] | _hash[3]) == 0;
}
static sha256 hash( const char* d, uint32_t dlen );
static sha256 hash( const string& );
static sha256 hash( const sha256& );
+16 -2
View File
@@ -190,8 +190,8 @@ public:
bool eof() const { return feof(_file.get()) != 0; }
int getc() {
int ret = fgetc(_file.get());
int getc() {
int ret = fgetc(_file.get());
if (ret == EOF) {
throw std::ios_base::failure( "cfile: " + _file_path.generic_string() +
" unable to read 1 byte");
@@ -210,6 +210,15 @@ public:
cfile_datastream create_datastream();
friend void swap(cfile& lhs, cfile& rhs) {
using std::swap;
swap(lhs._open, rhs._open);
swap(lhs._file_path, rhs._file_path);
swap(lhs._file_blk_size, rhs._file_blk_size);
swap(lhs._file, rhs._file);
}
private:
bool _open = false;
fc::path _file_path;
@@ -264,6 +273,11 @@ class datastream<fc::cfile, void> : public fc::cfile {
fc::cfile& storage() { return *this; }
const fc::cfile& storage() const { return *this; }
friend void swap(datastream<fc::cfile, void>& lhs, datastream<fc::cfile, void>& rhs) {
using std::swap;
swap(static_cast<fc::cfile&>(lhs), static_cast<fc::cfile&>(rhs));
}
};
+5 -3
View File
@@ -97,10 +97,12 @@ class datastream<size_t, void> {
};
template <typename Streambuf>
class datastream<Streambuf, typename std::enable_if_t<std::is_base_of_v<std::streambuf, Streambuf>>> {
class datastream<Streambuf, typename std::enable_if_t<std::is_base_of_v<std::streambuf, std::remove_reference_t<Streambuf>>>> {
private:
Streambuf buf;
using reference_type = std::add_lvalue_reference_t<Streambuf>;
public:
template <typename... Args>
datastream(Args&&... args)
@@ -120,8 +122,8 @@ class datastream<Streambuf, typename std::enable_if_t<std::is_base_of_v<std::str
}
bool remaining() { return buf.in_avail(); }
Streambuf& storage() { return buf; }
const Streambuf& storage() const { return buf; }
reference_type storage() { return buf; }
const reference_type storage() const { return buf; }
};
template <typename Container>
-1
View File
@@ -35,7 +35,6 @@ namespace fc
static constexpr uint64_t max_length_limit = std::numeric_limits<uint64_t>::max();
static constexpr size_t escape_string_yield_check_count = 128;
static variant from_string( const string& utf8_str, const parse_type ptype = parse_type::legacy_parser, uint32_t max_depth = DEFAULT_MAX_RECURSION_DEPTH );
static variants variants_from_string( const string& utf8_str, const parse_type ptype = parse_type::legacy_parser, uint32_t max_depth = DEFAULT_MAX_RECURSION_DEPTH );
static string to_string( const variant& v, const yield_function_t& yield, const output_formatting format = output_formatting::stringify_large_ints_and_doubles);
static string to_pretty_string( const variant& v, const yield_function_t& yield, const output_formatting format = output_formatting::stringify_large_ints_and_doubles );
+1 -1
View File
@@ -36,7 +36,7 @@ namespace fc {
public:
typedef std::shared_ptr<appender> ptr;
virtual void initialize( boost::asio::io_service& io_service ) = 0;
virtual void initialize() = 0;
virtual void log( const log_message& m ) = 0;
};
}
@@ -3,12 +3,12 @@
#include <fc/log/logger.hpp>
#include <vector>
namespace fc
namespace fc
{
class console_appender final : public appender
class console_appender final : public appender
{
public:
struct color
struct color
{
enum type {
red,
@@ -24,9 +24,9 @@ namespace fc
struct stream { enum type { std_out, std_error }; };
struct level_color
struct level_color
{
level_color( log_level l=log_level::all,
level_color( log_level l=log_level::all,
color::type c=color::console_default )
:level(l),color(c){}
@@ -34,7 +34,7 @@ namespace fc
console_appender::color::type color;
};
struct config
struct config
{
config()
:format( "${timestamp} ${thread_name} ${context} ${file}:${line} ${method} ${level}] ${message}" ),
@@ -52,10 +52,10 @@ namespace fc
console_appender();
~console_appender();
void initialize( boost::asio::io_service& io_service ) {}
virtual void log( const log_message& m );
void print( const std::string& text_to_print,
void initialize() override {}
virtual void log( const log_message& m ) override;
void print( const std::string& text_to_print,
color::type text_color = color::console_default );
void configure( const config& cfg );
@@ -20,7 +20,7 @@ namespace fc {
explicit dmlog_appender( const std::optional<config>& args) ;
virtual ~dmlog_appender();
virtual void initialize( boost::asio::io_service& io_service ) override;
virtual void initialize() override;
virtual void log( const log_message& m ) override;
@@ -6,14 +6,14 @@
#include <regex>
namespace fc
namespace fc
{
// Log appender that sends log messages in JSON format over UDP
// https://www.graylog2.org/resources/gelf/specification
class gelf_appender final : public appender
class gelf_appender final : public appender
{
public:
struct config
struct config
{
static const std::vector<std::string> reserved_field_names;
static const std::regex user_field_name_pattern;
@@ -31,11 +31,11 @@ namespace fc
* In a single-threaded world with a boost::io_service that's not owned
* by this library, ugly things are required. Tough.
*/
void initialize(boost::asio::io_service& io_service) override;
void initialize() override;
virtual void log(const log_message& m) override;
private:
class impl;
private:
std::shared_ptr<impl> my;
};
} // namespace fc
+18 -6
View File
@@ -1,7 +1,7 @@
#pragma once
#include <fc/string.hpp>
#include <fc/time.hpp>
#include <fc/log/log_message.hpp>
#include <string>
#ifndef DEFAULT_LOGGER
#define DEFAULT_LOGGER "default"
@@ -25,11 +25,11 @@ namespace fc
class logger
{
public:
static logger get( const fc::string& name = DEFAULT_LOGGER );
static void update( const fc::string& name, logger& log );
static logger get( const std::string& name = DEFAULT_LOGGER );
static void update( const std::string& name, logger& log );
logger();
logger( const string& name, const logger& parent = nullptr );
logger( const std::string& name, const logger& parent = nullptr );
logger( std::nullptr_t );
logger( const logger& c );
logger( logger&& c );
@@ -44,8 +44,8 @@ namespace fc
logger& set_parent( const logger& l );
logger get_parent()const;
void set_name( const fc::string& n );
const fc::string& name()const;
void set_name( const std::string& n );
std::string get_name()const;
bool is_enabled( log_level e )const;
void log( log_message m );
@@ -74,6 +74,12 @@ namespace fc
# define FC_MULTILINE_MACRO_END } while (0)
#endif
#define fc_tlog( LOGGER, FORMAT, ... ) \
FC_MULTILINE_MACRO_BEGIN \
if( (LOGGER).is_enabled( fc::log_level::all ) ) \
(LOGGER).log( FC_LOG_MESSAGE( all, FORMAT, __VA_ARGS__ ) ); \
FC_MULTILINE_MACRO_END
#define fc_dlog( LOGGER, FORMAT, ... ) \
FC_MULTILINE_MACRO_BEGIN \
if( (LOGGER).is_enabled( fc::log_level::debug ) ) \
@@ -98,6 +104,12 @@ namespace fc
(LOGGER).log( FC_LOG_MESSAGE( error, FORMAT, __VA_ARGS__ ) ); \
FC_MULTILINE_MACRO_END
#define tlog( FORMAT, ... ) \
FC_MULTILINE_MACRO_BEGIN \
if( (fc::logger::get(DEFAULT_LOGGER)).is_enabled( fc::log_level::all ) ) \
(fc::logger::get(DEFAULT_LOGGER)).log( FC_LOG_MESSAGE( all, FORMAT, __VA_ARGS__ ) ); \
FC_MULTILINE_MACRO_END
#define dlog( FORMAT, ... ) \
FC_MULTILINE_MACRO_BEGIN \
if( (fc::logger::get(DEFAULT_LOGGER)).is_enabled( fc::log_level::debug ) ) \
@@ -54,7 +54,7 @@ namespace fc {
static logger get_logger( const fc::string& name );
static void update_logger( const fc::string& name, logger& log );
static void initialize_appenders( boost::asio::io_service& ios );
static void initialize_appenders();
static bool configure_logging( const logging_config& l );
+35 -59
View File
@@ -9,6 +9,8 @@
#include <sstream>
#include <boost/filesystem/fstream.hpp>
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/stream.hpp>
namespace fc
{
@@ -88,7 +90,7 @@ namespace fc
template<typename T>
std::string stringFromStream( T& in )
{
std::stringstream token;
std::string token;
try
{
char c = in.peek();
@@ -103,28 +105,29 @@ namespace fc
switch( c = in.peek() )
{
case '\\':
token << parseEscape( in );
token += parseEscape( in );
break;
case 0x04:
FC_THROW_EXCEPTION( parse_error_exception, "EOF before closing '\"' in string '${token}'",
("token", token.str() ) );
("token", token ) );
case '"':
in.get();
return token.str();
return token;
default:
token << c;
token += c;
in.get();
}
}
FC_THROW_EXCEPTION( parse_error_exception, "EOF before closing '\"' in string '${token}'",
("token", token.str() ) );
("token", token ) );
} FC_RETHROW_EXCEPTIONS( warn, "while parsing token '${token}'",
("token", token.str() ) );
("token", token ) );
}
template<typename T>
std::string stringFromToken( T& in )
{
std::stringstream token;
std::string token;
try
{
char c = in.peek();
@@ -134,37 +137,36 @@ namespace fc
switch( c = in.peek() )
{
case '\\':
token << parseEscape( in );
token += parseEscape( in );
break;
case '\t':
case ' ':
case '\n':
in.get();
return token.str();
return token;
case '\0':
FC_THROW_EXCEPTION( eof_exception, "unexpected end of file" );
default:
if( isalnum( c ) || c == '_' || c == '-' || c == '.' || c == ':' || c == '/' )
{
token << c;
token += c;
in.get();
}
else return token.str();
else return token;
}
}
return token.str();
return token;
}
catch( const fc::eof_exception& eof )
{
return token.str();
return token;
}
catch (const std::ios_base::failure&)
{
return token.str();
return token;
}
FC_RETHROW_EXCEPTIONS( warn, "while parsing token '${token}'",
("token", token.str() ) );
FC_RETHROW_EXCEPTIONS( warn, "while parsing token '${token}'", ("token", token) );
}
template<typename T, json::parse_type parser_type>
@@ -252,14 +254,14 @@ namespace fc
template<typename T, json::parse_type parser_type>
variant number_from_stream( T& in )
{
std::stringstream ss;
std::string s;
bool dot = false;
bool neg = false;
if( in.peek() == '-')
{
neg = true;
ss.put( in.get() );
s += in.get();
}
bool done = false;
@@ -284,14 +286,15 @@ namespace fc
case '7':
case '8':
case '9':
ss.put( in.get() );
s += in.get();
break;
case '\0':
FC_THROW_EXCEPTION( eof_exception, "unexpected end of file" );
default:
if( isalnum( c ) )
{
return ss.str() + stringFromToken( in );
s += stringFromToken( in );
return s;
}
done = true;
break;
@@ -304,7 +307,7 @@ namespace fc
catch (const std::ios_base::failure&)
{
}
std::string str = ss.str();
const std::string& str = s;
if (str == "-." || str == "." || str == "-") // check the obviously wrong things we could have encountered
FC_THROW_EXCEPTION(parse_error_exception, "Can't parse token \"${token}\" as a JSON numeric constant", ("token", str));
if( dot )
@@ -313,11 +316,11 @@ namespace fc
return to_int64(str);
return to_uint64(str);
}
template<typename T>
variant token_from_stream( T& in )
{
std::stringstream ss;
ss.exceptions( std::ifstream::badbit );
std::string s;
bool received_eof = false;
bool done = false;
@@ -337,7 +340,7 @@ namespace fc
case 'f':
case 'a':
case 's':
ss.put( in.get() );
s += in.get();
break;
default:
done = true;
@@ -356,7 +359,7 @@ namespace fc
// we can get here either by processing a delimiter as in "null,"
// an EOF like "null<EOF>", or an invalid token like "nullZ"
std::string str = ss.str();
const std::string& str = s;
if( str == "null" )
return variant();
if( str == "true" )
@@ -441,50 +444,23 @@ namespace fc
variant json::from_string( const std::string& utf8_str, const json::parse_type ptype, const uint32_t max_depth )
{ try {
std::stringstream in( utf8_str );
//in.exceptions( std::ifstream::eofbit );
using stream_t = boost::iostreams::stream<boost::iostreams::array_source>;
stream_t in(utf8_str.c_str(), utf8_str.size());
switch( ptype )
{
case parse_type::legacy_parser:
return variant_from_stream<std::stringstream, json::parse_type::legacy_parser>( in, max_depth );
return variant_from_stream<stream_t, json::parse_type::legacy_parser>( in, max_depth );
case parse_type::legacy_parser_with_string_doubles:
return variant_from_stream<std::stringstream, json::parse_type::legacy_parser_with_string_doubles>( in, max_depth );
return variant_from_stream<stream_t, json::parse_type::legacy_parser_with_string_doubles>( in, max_depth );
case parse_type::strict_parser:
return json_relaxed::variant_from_stream<std::stringstream, true>( in, max_depth );
return json_relaxed::variant_from_stream<stream_t, true>( in, max_depth );
case parse_type::relaxed_parser:
return json_relaxed::variant_from_stream<std::stringstream, false>( in, max_depth );
return json_relaxed::variant_from_stream<stream_t, false>( in, max_depth );
default:
FC_ASSERT( false, "Unknown JSON parser type {ptype}", ("ptype", static_cast<int>(ptype)) );
}
} FC_RETHROW_EXCEPTIONS( warn, "", ("str",utf8_str) ) }
variants json::variants_from_string( const std::string& utf8_str, const json::parse_type ptype, const uint32_t max_depth )
{ try {
variants result;
std::stringstream in( utf8_str );
//in.exceptions( std::ifstream::eofbit );
try {
while( true )
{
// result.push_back( variant_from_stream( in ));
result.push_back(json_relaxed::variant_from_stream<std::stringstream, false>( in, max_depth ));
}
} catch ( const fc::eof_exception& ){}
return result;
} FC_RETHROW_EXCEPTIONS( warn, "", ("str",utf8_str) ) }
/*
void toUTF8( const char str, std::ostream& os )
{
// validate str == valid utf8
utf8::replace_invalid( &str, &str + 1, std::ostream_iterator<char>(os) );
}
void toUTF8( const wchar_t c, std::ostream& os )
{
utf8::utf16to8( &c, (&c)+1, std::ostream_iterator<char>(os) );
}
*/
/**
* Convert '\t', '\r', '\n', '\\' and '"' to "\t\r\n\\\"" if escape_control_chars == true
* Convert all other < 32 & 127 ascii to escaped unicode "\u00xx"
+1 -1
View File
@@ -56,7 +56,7 @@ namespace fc {
}
}
void dmlog_appender::initialize( boost::asio::io_service& io_service ) {}
void dmlog_appender::initialize() {}
void dmlog_appender::log( const log_message& m ) {
FILE* out = my->out;
+48 -11
View File
@@ -8,6 +8,7 @@
#include <fc/io/json.hpp>
#include <fc/crypto/city.hpp>
#include <fc/compress/zlib.hpp>
#include <fc/log/logger_config.hpp>
#include <boost/lexical_cast.hpp>
#include <iomanip>
@@ -42,10 +43,15 @@ namespace fc
class gelf_appender::impl
{
public:
using work_guard_t = boost::asio::executor_work_guard<boost::asio::io_context::executor_type>;
config cfg;
std::optional<boost::asio::ip::udp::endpoint> gelf_endpoint;
std::thread thread;
boost::asio::io_context io_context;
work_guard_t work_guard = boost::asio::make_work_guard(io_context);
udp_socket gelf_socket;
impl(const variant& c)
{
mutable_variant_object mvo;
@@ -73,6 +79,10 @@ namespace fc
~impl()
{
if (thread.joinable()) {
work_guard.reset();
thread.join();
}
}
};
@@ -81,7 +91,7 @@ namespace fc
{
}
void gelf_appender::initialize(boost::asio::io_service &io_service)
void gelf_appender::initialize()
{
try
{
@@ -100,14 +110,19 @@ namespace fc
string::size_type colon_pos = my->cfg.endpoint.find(':');
try
{
uint16_t port = boost::lexical_cast<uint16_t>(my->cfg.endpoint.substr(colon_pos + 1, my->cfg.endpoint.size()));
FC_ASSERT(colon_pos != std::string::npos, "The logging destination port is not specified");
string port = my->cfg.endpoint.substr(colon_pos + 1);
string hostname = my->cfg.endpoint.substr( 0, colon_pos );
auto endpoints = resolve(io_service, hostname, port);
boost::asio::ip::udp::resolver resolver{ my->io_context };
auto endpoints = resolver.resolve(hostname, port);
if (endpoints.empty())
FC_THROW_EXCEPTION(unknown_host_exception, "The logging destination host name can not be resolved: ${hostname}",
("hostname", hostname));
my->gelf_endpoint = endpoints.back();
my->gelf_endpoint = *endpoints.begin();
}
catch (const boost::bad_lexical_cast&)
{
@@ -117,9 +132,20 @@ namespace fc
if (my->gelf_endpoint)
{
my->gelf_socket.initialize(io_service);
my->gelf_socket.initialize(my->io_context);
my->gelf_socket.open();
std::cerr << "opened GELF socket to endpoint " << my->cfg.endpoint << "\n";
my->thread = std::thread([this] {
try {
fc::set_os_thread_name("gelf");
my->io_context.run();
} catch (std::exception& ex) {
fprintf(stderr, "GELF logger caught exception at %s:%d : %s\n", __FILE__, __LINE__, ex.what());
} catch (...) {
fprintf(stderr, "GELF logger caught exception unknown exception %s:%d\n", __FILE__, __LINE__);
}
});
}
}
catch (...)
@@ -131,11 +157,8 @@ namespace fc
gelf_appender::~gelf_appender()
{}
void gelf_appender::log(const log_message& message)
void do_log(gelf_appender::impl* my, uint64_t time_ns, const log_message& message)
{
if (!my->gelf_endpoint)
return;
log_context context = message.get_context();
mutable_variant_object gelf_message;
@@ -143,8 +166,6 @@ namespace fc
gelf_message["host"] = my->cfg.host;
gelf_message["short_message"] = format_string(message.get_format(), message.get_data(), true);
// use now() instead of context.get_timestamp() because log_message construction can include user provided long running calls
const auto time_ns = time_point::now().time_since_epoch().count();
gelf_message["timestamp"] = time_ns / 1000000.;
gelf_message["_timestamp_ns"] = time_ns;
@@ -248,4 +269,20 @@ namespace fc
FC_ASSERT(number_of_packets_sent == total_number_of_packets);
}
}
void gelf_appender::log(const log_message& message) {
if (!my->gelf_endpoint)
return;
// use now() instead of context.get_timestamp() because log_message construction can include user provided long running calls
boost::asio::post(my->io_context, [impl = my.get(), time_ns = time_point::now().time_since_epoch().count(), message] () {
try {
do_log(impl, time_ns, message);
} catch (std::exception& ex) {
fprintf(stderr, "GELF logger caught exception at %s:%d : %s\n", __FILE__, __LINE__, ex.what());
} catch (...) {
fprintf(stderr, "GELF logger caught exception unknown exception %s:%d\n", __FILE__, __LINE__);
}
});
}
} // fc
+8 -9
View File
@@ -3,9 +3,8 @@
#include <fc/log/appender.hpp>
#include <fc/exception/exception.hpp>
#include <fc/filesystem.hpp>
#include <unordered_map>
#include <string>
#include <fc/log/logger_config.hpp>
#include <unordered_map>
namespace fc {
@@ -13,7 +12,7 @@ namespace fc {
public:
impl()
:_parent(nullptr),_enabled(true),_additivity(false),_level(log_level::warn){}
fc::string _name;
std::string _name;
logger _parent;
bool _enabled;
bool _additivity;
@@ -28,7 +27,7 @@ namespace fc {
logger::logger(nullptr_t){}
logger::logger( const string& name, const logger& parent )
logger::logger( const std::string& name, const logger& parent )
:my( new impl() )
{
my->_name = name;
@@ -40,7 +39,7 @@ namespace fc {
:my(l.my){}
logger::logger( logger&& l )
:my(fc::move(l.my)){}
:my(std::move(l.my)){}
logger::~logger(){}
@@ -82,14 +81,14 @@ namespace fc {
}
}
void logger::set_name( const fc::string& n ) { my->_name = n; }
const fc::string& logger::name()const { return my->_name; }
void logger::set_name( const std::string& n ) { my->_name = n; }
std::string logger::get_name()const { return my->_name; }
logger logger::get( const fc::string& s ) {
logger logger::get( const std::string& s ) {
return log_config::get_logger( s );
}
void logger::update( const fc::string& name, logger& log ) {
void logger::update( const std::string& name, logger& log ) {
log_config::update_logger( name, log );
}
+2 -2
View File
@@ -43,10 +43,10 @@ namespace fc {
}
}
void log_config::initialize_appenders( boost::asio::io_service& ios ) {
void log_config::initialize_appenders() {
std::lock_guard g( log_config::get().log_mutex );
for( auto& iter : log_config::get().appender_map )
iter.second->initialize( ios );
iter.second->initialize();
}
void configure_logging( const fc::path& lc ) {
@@ -8,15 +8,12 @@
#include <boost/beast/version.hpp>
#include <boost/asio/connect.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/ssl/error.hpp>
#include <boost/asio/ssl/stream.hpp>
#include <boost/asio/deadline_timer.hpp>
#include <boost/asio/local/stream_protocol.hpp>
#include <boost/asio/ssl/rfc2818_verification.hpp>
#include <boost/filesystem.hpp>
using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
namespace http = boost::beast::http; // from <boost/beast/http.hpp>
namespace ssl = boost::asio::ssl; // from <boost/asio/ssl.hpp>
namespace local = boost::asio::local;
namespace fc {
@@ -25,17 +22,15 @@ namespace fc {
* mapping of protocols to their standard ports
*/
static const std::map<string,uint16_t> default_proto_ports = {
{"http", 80},
{"https", 443}
{"http", 80}
};
class http_client_impl {
public:
using host_key = std::tuple<std::string, std::string, uint16_t>;
using raw_socket_ptr = std::unique_ptr<tcp::socket>;
using ssl_socket_ptr = std::unique_ptr<ssl::stream<tcp::socket>>;
using unix_socket_ptr = std::unique_ptr<local::stream_protocol::socket>;
using connection = std::variant<raw_socket_ptr, ssl_socket_ptr, unix_socket_ptr>;
using connection = std::variant<raw_socket_ptr, unix_socket_ptr>;
using connection_map = std::map<host_key, connection>;
using unix_url_split_map = std::map<string, fc::url>;
using error_code = boost::system::error_code;
@@ -43,24 +38,13 @@ public:
http_client_impl()
:_ioc()
,_sslc(ssl::context::sslv23_client)
{
set_verify_peers(true);
}
void add_cert(const std::string& cert_pem_string) {
error_code ec;
_sslc.add_certificate_authority(boost::asio::buffer(cert_pem_string.data(), cert_pem_string.size()), ec);
FC_ASSERT(!ec, "Failed to add cert: ${msg}", ("msg", ec.message()));
}
void add_cert(const std::string& cert_pem_string) {}
void set_verify_peers(bool enabled) {
if (enabled) {
_sslc.set_verify_mode(ssl::verify_peer);
} else {
_sslc.set_verify_mode(ssl::verify_none);
}
}
void set_verify_peers(bool enabled) {}
template<typename SyncReadStream, typename Fn, typename CancelFn>
error_code sync_do_with_deadline( SyncReadStream& s, deadline_type deadline, Fn f, CancelFn cf ) {
@@ -189,41 +173,9 @@ public:
return res.first;
}
connection_map::iterator create_ssl_connection( const url& dest, const deadline_type& deadline ) {
auto key = url_to_host_key(dest);
auto ssl_socket = std::make_unique<ssl::stream<tcp::socket>>(_ioc, _sslc);
// Set SNI Hostname (many hosts need this to handshake successfully)
if(!SSL_set_tlsext_host_name(ssl_socket->native_handle(), dest.host()->c_str()))
{
error_code ec{static_cast<int>(::ERR_get_error()), boost::asio::error::get_ssl_category()};
FC_THROW("Unable to set SNI Host Name: ${msg}", ("msg", ec.message()));
}
ssl_socket->set_verify_callback(boost::asio::ssl::rfc2818_verification(*dest.host()));
error_code ec = sync_connect_with_timeout(ssl_socket->next_layer(), *dest.host(), dest.port() ? std::to_string(*dest.port()) : "443", deadline);
if (!ec) {
ec = sync_do_with_deadline(ssl_socket->next_layer(), deadline, [&ssl_socket](std::optional<error_code>& final_ec) {
ssl_socket->async_handshake(ssl::stream_base::client, [&final_ec](const error_code& ec) {
final_ec.emplace(ec);
});
});
}
FC_ASSERT(!ec, "Failed to connect: ${message}", ("message",ec.message()));
auto res = _connections.emplace(std::piecewise_construct,
std::forward_as_tuple(key),
std::forward_as_tuple(std::move(ssl_socket)));
return res.first;
}
connection_map::iterator create_connection( const url& dest, const deadline_type& deadline ) {
if (dest.proto() == "http") {
return create_raw_connection(dest, deadline);
} else if (dest.proto() == "https") {
return create_ssl_connection(dest, deadline);
} else if (dest.proto() == "unix") {
return create_unix_connection(dest, deadline);
} else {
@@ -236,10 +188,6 @@ public:
return !ptr->is_open();
}
bool operator() ( const ssl_socket_ptr& ptr ) const {
return !ptr->lowest_layer().is_open();
}
bool operator() ( const unix_socket_ptr& ptr) const {
return !ptr->is_open();
}
@@ -420,7 +368,6 @@ public:
}
boost::asio::io_context _ioc;
ssl::context _sslc;
connection_map _connections;
unix_url_split_map _unix_url_paths;
};
+20
View File
@@ -0,0 +1,20 @@
add_library(prometheus-core
prometheus-cpp/core/src/check_names.cc
prometheus-cpp/core/src/counter.cc
prometheus-cpp/core/src/detail/builder.cc
prometheus-cpp/core/src/detail/ckms_quantiles.cc
prometheus-cpp/core/src/detail/time_window_quantiles.cc
prometheus-cpp/core/src/detail/utils.cc
prometheus-cpp/core/src/family.cc
prometheus-cpp/core/src/gauge.cc
prometheus-cpp/core/src/histogram.cc
prometheus-cpp/core/src/info.cc
prometheus-cpp/core/src/registry.cc
prometheus-cpp/core/src/serializer.cc
prometheus-cpp/core/src/summary.cc
prometheus-cpp/core/src/text_serializer.cc
)
target_include_directories( prometheus-core PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/prometheus-cpp/core/include)
@@ -0,0 +1,10 @@
#pragma once
// For prometheus-cpp library, this normally a generated file. we aren't following their process, so
// we have it here. The macros are used in prometheus-cpp in relation to shared libraries, which isn't
// relevant for us.
#define PROMETHEUS_CPP_CORE_EXPORT
#define PROMETHEUS_CPP_CORE_NO_EXPORT
+4 -2
View File
@@ -18,15 +18,17 @@ bytes zlib_compress_bytes(const bytes& in) {
return out;
}
bytes zlib_decompress(const bytes& in) {
bytes zlib_decompress(std::string_view data) {
bytes out;
bio::filtering_ostream decomp;
decomp.push(bio::zlib_decompressor());
decomp.push(bio::back_inserter(out));
bio::write(decomp, in.data(), in.size());
bio::write(decomp, data.data(), data.size());
bio::close(decomp);
return out;
}
} // namespace state_history
} // namespace eosio
+96 -48
View File
@@ -57,8 +57,10 @@ bool include_delta(const chain::protocol_state_object& old, const chain::protoco
return old.activated_protocol_features != curr.activated_protocol_features;
}
std::vector<table_delta> create_deltas(const chainbase::database& db, bool full_snapshot) {
std::vector<table_delta> deltas;
void pack_deltas(boost::iostreams::filtering_ostreambuf& obuf, const chainbase::database& db, bool full_snapshot) {
fc::datastream<boost::iostreams::filtering_ostreambuf&> ds{obuf};
const auto& table_id_index = db.get_index<chain::table_id_multi_index>();
std::map<uint64_t, const chain::table_id_object*> removed_table_id;
for (auto& rem : table_id_index.last_undo_session().removed_values)
@@ -73,72 +75,118 @@ std::vector<table_delta> create_deltas(const chainbase::database& db, bool full_
return *it->second;
};
auto pack_row = [&](auto& row) { return fc::raw::pack(make_history_serial_wrapper(db, row)); };
auto pack_contract_row = [&](auto& row) {
return fc::raw::pack(make_history_context_wrapper(db, get_table_id(row.t_id._id), row));
auto pack_row = [&](auto& ds, auto& row) { fc::raw::pack(ds, make_history_serial_wrapper(db, row)); };
auto pack_contract_row = [&](auto& ds, auto& row) {
fc::raw::pack(ds, make_history_context_wrapper(db, get_table_id(row.t_id._id), row));
};
auto process_table = [&](auto* name, auto& index, auto& pack_row) {
auto process_table = [&](auto& ds, auto* name, auto& index, auto& pack_row) {
auto pack_row_v0 = [&](auto& ds, bool present, auto& row) {
fc::raw::pack(ds, present);
fc::datastream<size_t> ps;
pack_row(ps, row);
fc::raw::pack(ds, fc::unsigned_int(ps.tellp()));
pack_row(ds, row);
};
if (full_snapshot) {
if (index.indices().empty())
return;
deltas.push_back({});
auto& delta = deltas.back();
delta.name = name;
for (auto& row : index.indices())
delta.rows.obj.emplace_back(true, pack_row(row));
fc::raw::pack(ds, fc::unsigned_int(0)); // table_delta = std::variant<table_delta_v0> and fc::unsigned_int struct_version
fc::raw::pack(ds, name);
fc::raw::pack(ds, fc::unsigned_int(index.indices().size()));
for (auto& row : index.indices()) {
pack_row_v0(ds, true, row);
}
} else {
auto undo = index.last_undo_session();
if (undo.old_values.empty() && undo.new_values.empty() && undo.removed_values.empty())
return;
deltas.push_back({});
auto& delta = deltas.back();
delta.name = name;
for (auto& old : undo.old_values) {
auto& row = index.get(old.id);
if (include_delta(old, row))
delta.rows.obj.emplace_back(true, pack_row(row));
}
for (auto& old : undo.removed_values)
delta.rows.obj.emplace_back(false, pack_row(old));
for (auto& row : undo.new_values) {
delta.rows.obj.emplace_back(true, pack_row(row));
}
if(delta.rows.obj.empty()) {
deltas.pop_back();
size_t num_entries =
std::count_if(undo.old_values.begin(), undo.old_values.end(),
[&index](const auto& old) { return include_delta(old, index.get(old.id)); }) +
std::distance(undo.removed_values.begin(), undo.removed_values.end()) +
std::distance(undo.new_values.begin(), undo.new_values.end());
if (num_entries) {
fc::raw::pack(ds, fc::unsigned_int(0)); // table_delta = std::variant<table_delta_v0> and fc::unsigned_int struct_version
fc::raw::pack(ds, name);
fc::raw::pack(ds, fc::unsigned_int((uint32_t)num_entries));
for (auto& old : undo.old_values) {
auto& row = index.get(old.id);
if (include_delta(old, row)) {
pack_row_v0(ds, true, row);
}
}
for (auto& old : undo.removed_values) {
pack_row_v0(ds, false, old);
}
for (auto& row : undo.new_values) {
pack_row_v0(ds, true, row);
}
}
}
};
process_table("account", db.get_index<chain::account_index>(), pack_row);
process_table("account_metadata", db.get_index<chain::account_metadata_index>(), pack_row);
process_table("code", db.get_index<chain::code_index>(), pack_row);
auto has_table = [&](auto x) -> int {
auto& index = db.get_index<std::remove_pointer_t<decltype(x)>>();
if (full_snapshot) {
return !index.indices().empty();
} else {
auto undo = index.last_undo_session();
return std::find_if(undo.old_values.begin(), undo.old_values.end(),
[&index](const auto& old) { return include_delta(old, index.get(old.id)); }) != undo.old_values.end() ||
!undo.removed_values.empty() || !undo.new_values.empty();
}
};
process_table("contract_table", db.get_index<chain::table_id_multi_index>(), pack_row);
process_table("contract_row", db.get_index<chain::key_value_index>(), pack_contract_row);
process_table("contract_index64", db.get_index<chain::index64_index>(), pack_contract_row);
process_table("contract_index128", db.get_index<chain::index128_index>(), pack_contract_row);
process_table("contract_index256", db.get_index<chain::index256_index>(), pack_contract_row);
process_table("contract_index_double", db.get_index<chain::index_double_index>(), pack_contract_row);
process_table("contract_index_long_double", db.get_index<chain::index_long_double_index>(), pack_contract_row);
int num_tables = std::apply(
[&has_table](auto... args) { return (has_table(args) + ... ); },
std::tuple<chain::account_index*, chain::account_metadata_index*, chain::code_index*,
chain::table_id_multi_index*, chain::key_value_index*, chain::index64_index*, chain::index128_index*,
chain::index256_index*, chain::index_double_index*, chain::index_long_double_index*,
chain::global_property_multi_index*, chain::generated_transaction_multi_index*,
chain::protocol_state_multi_index*, chain::permission_index*, chain::permission_link_index*,
chain::resource_limits::resource_limits_index*, chain::resource_limits::resource_usage_index*,
chain::resource_limits::resource_limits_state_index*,
chain::resource_limits::resource_limits_config_index*>());
process_table("global_property", db.get_index<chain::global_property_multi_index>(), pack_row);
process_table("generated_transaction", db.get_index<chain::generated_transaction_multi_index>(), pack_row);
process_table("protocol_state", db.get_index<chain::protocol_state_multi_index>(), pack_row);
fc::raw::pack(ds, fc::unsigned_int(num_tables));
process_table("permission", db.get_index<chain::permission_index>(), pack_row);
process_table("permission_link", db.get_index<chain::permission_link_index>(), pack_row);
process_table(ds, "account", db.get_index<chain::account_index>(), pack_row);
process_table(ds, "account_metadata", db.get_index<chain::account_metadata_index>(), pack_row);
process_table(ds, "code", db.get_index<chain::code_index>(), pack_row);
process_table("resource_limits", db.get_index<chain::resource_limits::resource_limits_index>(), pack_row);
process_table("resource_usage", db.get_index<chain::resource_limits::resource_usage_index>(), pack_row);
process_table("resource_limits_state", db.get_index<chain::resource_limits::resource_limits_state_index>(),
process_table(ds, "contract_table", db.get_index<chain::table_id_multi_index>(), pack_row);
process_table(ds, "contract_row", db.get_index<chain::key_value_index>(), pack_contract_row);
process_table(ds, "contract_index64", db.get_index<chain::index64_index>(), pack_contract_row);
process_table(ds, "contract_index128", db.get_index<chain::index128_index>(), pack_contract_row);
process_table(ds, "contract_index256", db.get_index<chain::index256_index>(), pack_contract_row);
process_table(ds, "contract_index_double", db.get_index<chain::index_double_index>(), pack_contract_row);
process_table(ds, "contract_index_long_double", db.get_index<chain::index_long_double_index>(), pack_contract_row);
process_table(ds, "global_property", db.get_index<chain::global_property_multi_index>(), pack_row);
process_table(ds, "generated_transaction", db.get_index<chain::generated_transaction_multi_index>(), pack_row);
process_table(ds, "protocol_state", db.get_index<chain::protocol_state_multi_index>(), pack_row);
process_table(ds, "permission", db.get_index<chain::permission_index>(), pack_row);
process_table(ds, "permission_link", db.get_index<chain::permission_link_index>(), pack_row);
process_table(ds, "resource_limits", db.get_index<chain::resource_limits::resource_limits_index>(), pack_row);
process_table(ds, "resource_usage", db.get_index<chain::resource_limits::resource_usage_index>(), pack_row);
process_table(ds, "resource_limits_state", db.get_index<chain::resource_limits::resource_limits_state_index>(),
pack_row);
process_table("resource_limits_config", db.get_index<chain::resource_limits::resource_limits_config_index>(),
process_table(ds, "resource_limits_config", db.get_index<chain::resource_limits::resource_limits_config_index>(),
pack_row);
return deltas;
obuf.pubsync();
}
} // namespace state_history
} // namespace eosio
@@ -8,7 +8,7 @@ namespace state_history {
using chain::bytes;
bytes zlib_compress_bytes(const bytes& in);
bytes zlib_decompress(const bytes& in);
bytes zlib_decompress(std::string_view);
} // namespace state_history
} // namespace eosio
@@ -1,11 +1,13 @@
#pragma once
#include <eosio/state_history/types.hpp>
#include <boost/iostreams/filtering_streambuf.hpp>
namespace eosio {
namespace state_history {
std::vector<table_delta> create_deltas(const chainbase::database& db, bool full_snapshot);
void pack_deltas(boost::iostreams::filtering_ostreambuf& ds, const chainbase::database& db, bool full_snapshot);
} // namespace state_history
} // namespace eosio
@@ -1,19 +1,34 @@
#pragma once
#include <boost/filesystem.hpp>
#include <fstream>
#include <stdint.h>
#include <boost/asio.hpp>
#include <eosio/state_history/compression.hpp>
#include <eosio/chain/block_header.hpp>
#include <eosio/chain/exceptions.hpp>
#include <eosio/chain/types.hpp>
#include <eosio/chain/log_catalog.hpp>
#include <eosio/chain/log_data_base.hpp>
#include <eosio/chain/log_index.hpp>
#include <fc/io/cfile.hpp>
#include <fc/log/logger.hpp>
#include <fc/log/logger_config.hpp> //set_thread_name
#include <fc/bitutil.hpp>
#include <boost/asio.hpp>
#include <boost/filesystem.hpp>
#include <boost/iostreams/device/file.hpp>
#include <boost/iostreams/device/file_descriptor.hpp>
#include <boost/iostreams/filter/zlib.hpp>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/restrict.hpp>
#include <fstream>
#include <cstdint>
struct state_history_test_fixture;
namespace eosio {
namespace bio = boost::iostreams;
/*
* *.log:
@@ -62,18 +77,216 @@ struct state_history_log_header {
static const int state_history_log_header_serial_size = sizeof(state_history_log_header::magic) +
sizeof(state_history_log_header::block_id) +
sizeof(state_history_log_header::payload_size);
struct state_history_log_prune_config {
uint32_t prune_blocks; //number of blocks to prune to when doing a prune
size_t prune_threshold = 4*1024*1024; //(approximately) how many bytes need to be added before a prune is performed
std::optional<size_t> vacuum_on_close; //when set, a vacuum is performed on dtor if log contains less than this many bytes
namespace state_history {
struct prune_config {
uint32_t prune_blocks; //number of blocks to prune to when doing a prune
size_t prune_threshold = 4*1024*1024; //(approximately) how many bytes need to be added before a prune is performed
std::optional<size_t> vacuum_on_close; //when set, a vacuum is performed on dtor if log contains less than this many bytes
};
struct partition_config {
fc::path retained_dir = "retained";
fc::path archive_dir = "archive";
uint32_t stride = 1000000;
uint32_t max_retained_files = 10;
};
} // namespace state_history
using state_history_log_config = std::variant<std::monostate, state_history::prune_config, state_history::partition_config>;
struct locked_decompress_stream {
std::unique_lock<std::mutex> lock; // state_history_log mutex
std::variant<std::vector<char>, std::unique_ptr<bio::filtering_istreambuf>> buf;
locked_decompress_stream() = delete;
locked_decompress_stream(locked_decompress_stream&&) = default;
explicit locked_decompress_stream(std::unique_lock<std::mutex> l)
: lock(std::move(l)) {};
template <typename StateHistoryLog>
void init(StateHistoryLog&& log, fc::cfile& stream, uint64_t compressed_size) {
auto istream = std::make_unique<bio::filtering_istreambuf>();
istream->push(bio::zlib_decompressor());
istream->push(bio::restrict(bio::file_source(stream.get_file_path().string()), stream.tellp(), compressed_size));
buf = std::move(istream);
}
template <typename LogData>
void init(LogData&& log, fc::datastream<const char*>& stream, uint64_t compressed_size) {
auto istream = std::make_unique<bio::filtering_istreambuf>();
istream->push(bio::zlib_decompressor());
istream->push(bio::restrict(bio::file_source(log.filename), stream.pos() - log.data(), compressed_size));
buf = std::move(istream);
}
size_t init(std::vector<char> cbuf) {
buf.emplace<std::vector<char>>( std::move(cbuf) );
return std::get<std::vector<char>>(buf).size();
}
};
namespace detail {
std::vector<char> zlib_decompress(fc::cfile& file, uint64_t compressed_size) {
if (compressed_size) {
std::vector<char> compressed(compressed_size);
file.read(compressed.data(), compressed_size);
return state_history::zlib_decompress({compressed.data(), compressed_size});
}
return {};
}
std::vector<char> zlib_decompress(fc::datastream<const char*>& strm, uint64_t compressed_size) {
if (compressed_size) {
return state_history::zlib_decompress({strm.pos(), compressed_size});
}
return {};
}
template <typename Log, typename Stream>
uint64_t read_unpacked_entry(Log&& log, Stream& stream, uint64_t payload_size, locked_decompress_stream& result) {
// result has state_history_log mutex locked
uint32_t s;
stream.read((char*)&s, sizeof(s));
if (s == 1 && payload_size > (s + sizeof(uint32_t))) {
uint64_t compressed_size = payload_size - sizeof(uint32_t) - sizeof(uint64_t);
uint64_t decompressed_size;
stream.read((char*)&decompressed_size, sizeof(decompressed_size));
result.init(log, stream, compressed_size);
return decompressed_size;
} else {
// Compressed deltas now exceeds 4GB on one of the public chains. This length prefix
// was intended to support adding additional fields in the future after the
// packed deltas or packed traces. For now we're going to ignore on read.
uint64_t compressed_size = payload_size - sizeof(uint32_t);
return result.init( zlib_decompress(stream, compressed_size) );
}
}
class state_history_log_data : public chain::log_data_base<state_history_log_data> {
uint32_t version_;
bool is_currently_pruned_;
uint64_t size_;
public:
state_history_log_data() = default;
explicit state_history_log_data(const fc::path& path) { open(path); }
void open(const fc::path& path) {
if (file.is_open())
file.close();
file.set_file_path(path);
file.open("rb");
uint64_t v = chain::read_data_at<uint64_t>(file, 0);
version_ = get_ship_version(v);
is_currently_pruned_ = is_ship_log_pruned(v);
file.seek_end(0);
size_ = file.tellp();
}
uint64_t size() const { return size_; }
uint32_t version() const { return version_; }
uint32_t first_block_num() { return block_num_at(0); }
uint32_t first_block_position() const { return 0; }
bool is_currently_pruned() const { return is_currently_pruned_; }
uint64_t ro_stream_at(uint64_t pos, locked_decompress_stream& result) {
uint64_t payload_size = payload_size_at(pos);
file.seek(pos + sizeof(state_history_log_header));
// fc::datastream<const char*> stream(file.const_data() + pos + sizeof(state_history_log_header), payload_size);
return read_unpacked_entry(*this, file, payload_size, result);
}
uint32_t block_num_at(uint64_t position) {
return fc::endian_reverse_u32(
chain::read_data_at<uint32_t>(file, position + offsetof(state_history_log_header, block_id)));
}
chain::block_id_type block_id_at(uint64_t position) {
return chain::read_data_at<chain::block_id_type>(file, position +
offsetof(state_history_log_header, block_id));
}
uint64_t payload_size_at(uint64_t pos) {
std::string filename = file.get_file_path().generic_string();
EOS_ASSERT(size() >= pos + sizeof(state_history_log_header), chain::plugin_exception,
"corrupt ${name}: invalid entry size at at position ${pos}", ("name", filename)("pos", pos));
state_history_log_header header = chain::read_data_at<state_history_log_header>(file, pos);
EOS_ASSERT(is_ship(header.magic) && is_ship_supported_version(header.magic), chain::plugin_exception,
"corrupt ${name}: invalid header for entry at position ${pos}", ("name", filename)("pos", pos));
EOS_ASSERT(size() >= pos + sizeof(state_history_log_header) + header.payload_size, chain::plugin_exception,
"corrupt ${name}: invalid payload size for entry at position ${pos}", ("name", filename)("pos", pos));
return header.payload_size;
}
void construct_index(const fc::path& index_file_name) {
fc::cfile index_file;
index_file.set_file_path(index_file_name);
index_file.open("w+b");
uint64_t pos = 0;
while (pos < size()) {
uint64_t payload_size = payload_size_at(pos);
index_file.write(reinterpret_cast<const char*>(&pos), sizeof(pos));
pos += (sizeof(state_history_log_header) + payload_size + sizeof(uint64_t));
}
}
};
// directly adapt from boost/iostreams/filter/counter.hpp and change the type of chars_ to uint64_t.
class counter {
public:
typedef char char_type;
struct category
: bio::dual_use,
bio::filter_tag,
bio::multichar_tag,
bio::optimally_buffered_tag
{ };
explicit counter(uint64_t first_char = 0)
: chars_(first_char)
{ }
uint64_t characters() const { return chars_; }
std::streamsize optimal_buffer_size() const { return 0; }
template<typename Source>
std::streamsize read(Source& src, char_type* s, std::streamsize n)
{
std::streamsize result = bio::read(src, s, n);
if (result == -1)
return -1;
chars_ += result;
return result;
}
template<typename Sink>
std::streamsize write(Sink& snk, const char_type* s, std::streamsize n)
{
std::streamsize result = bio::write(snk, s, n);
chars_ += result;
return result;
}
private:
uint64_t chars_;
};
} // namespace detail
class state_history_log {
private:
const char* const name = "";
std::string log_filename;
std::string index_filename;
std::optional<state_history_log_prune_config> prune_config; //is set, log is in pruned mode
state_history_log_config config;
// provide exclusive access to all data of this object since accessed from the main thread and the ship thread
mutable std::mutex _mx;
fc::cfile log;
fc::cfile index;
uint32_t _begin_block = 0; //always tracks the first block available even after pruning
@@ -81,31 +294,40 @@ class state_history_log {
uint32_t _end_block = 0;
chain::block_id_type last_block_id;
std::thread thr;
std::atomic<bool> write_thread_has_exception = false;
std::exception_ptr eptr;
boost::asio::io_context ctx;
boost::asio::io_context::strand work_strand{ctx};
boost::asio::executor_work_guard<boost::asio::io_context::executor_type> work_guard =
boost::asio::make_work_guard(ctx);
std::recursive_mutex mx;
using catalog_t = chain::log_catalog<detail::state_history_log_data, chain::log_index<chain::plugin_exception>>;
catalog_t catalog;
public:
state_history_log(const char* const name, std::string log_filename, std::string index_filename,
std::optional<state_history_log_prune_config> prune_conf = std::optional<state_history_log_prune_config>())
friend struct ::state_history_test_fixture;
state_history_log( const state_history_log&) = delete;
state_history_log(const char* name, const fc::path& log_dir,
state_history_log_config conf = {})
: name(name)
, log_filename(std::move(log_filename))
, index_filename(std::move(index_filename))
, prune_config(prune_conf) {
, config(std::move(conf)) {
log.set_file_path(log_dir/(std::string(name) + ".log"));
index.set_file_path(log_dir/(std::string(name) + ".index"));
open_log();
open_index();
if(prune_config) {
EOS_ASSERT(prune_config->prune_blocks, chain::plugin_exception, "state history log prune configuration requires at least one block");
EOS_ASSERT(__builtin_popcount(prune_config->prune_threshold) == 1, chain::plugin_exception, "state history prune threshold must be power of 2");
//switch this over to the mask that will be used
prune_config->prune_threshold = ~(prune_config->prune_threshold-1);
}
std::visit(eosio::chain::overloaded{
[](std::monostate&) {},
[](state_history::prune_config& conf) {
EOS_ASSERT(conf.prune_blocks, chain::plugin_exception, "state history log prune configuration requires at least one block");
EOS_ASSERT(__builtin_popcount(conf.prune_threshold) == 1, chain::plugin_exception, "state history prune threshold must be power of 2");
//switch this over to the mask that will be used
conf.prune_threshold = ~(conf.prune_threshold-1);
}, [name, log_dir, this](state_history::partition_config& conf) {
catalog.open(log_dir, conf.retained_dir, conf.archive_dir, name);
catalog.max_retained_files = conf.max_retained_files;
if (_end_block == 0) {
_begin_block = _end_block = catalog.last_block_num() +1;
}
}
}, config);
//check for conversions to/from pruned log, as long as log contains something
if(_begin_block != _end_block) {
@@ -113,6 +335,8 @@ class state_history_log {
log.seek(0);
read_header(first_header);
auto prune_config = std::get_if<state_history::prune_config>(&config);
if((is_ship_log_pruned(first_header.magic) == false) && prune_config) {
//need to convert non-pruned to pruned; first prune any ranges we can (might be none)
prune(fc::log_level::info);
@@ -131,36 +355,14 @@ class state_history_log {
vacuum();
}
}
thr = std::thread([this] {
try {
fc::set_os_thread_name(this->name);
this->ctx.run();
} catch (...) {
elog("catched exception from ${name} write thread", ("name", this->name));
eptr = std::current_exception();
write_thread_has_exception = true;
}
});
}
void stop() {
if (thr.joinable()) {
work_guard.reset();
thr.join();
}
}
~state_history_log() {
// complete execution before possible vacuuming
if (thr.joinable()) {
work_guard.reset();
thr.join();
}
//nothing to do if log is empty or we aren't pruning
if(_begin_block == _end_block)
return;
auto prune_config = std::get_if<state_history::prune_config>(&config);
if(!prune_config || !prune_config->vacuum_on_close)
return;
@@ -170,8 +372,96 @@ class state_history_log {
vacuum();
}
uint32_t begin_block() const { return _begin_block; }
uint32_t end_block() const { return _end_block; }
// begin end
std::pair<uint32_t, uint32_t> block_range() const {
std::lock_guard g(_mx);
return { std::min(catalog.first_block_num(), _begin_block), _end_block };
}
bool empty() const {
auto r = block_range();
return r.first == r.second;
}
locked_decompress_stream create_locked_decompress_stream() {
return locked_decompress_stream{ std::unique_lock<std::mutex>( _mx ) };
}
/// @return the decompressed entry size
uint64_t get_unpacked_entry(uint32_t block_num, locked_decompress_stream& result) {
// result has mx locked
auto opt_decompressed_size = catalog.ro_stream_for_block(block_num, result);
if (opt_decompressed_size)
return *opt_decompressed_size;
if (block_num < _begin_block || block_num >= _end_block)
return 0;
state_history_log_header header;
log.seek(get_pos(block_num));
read_header(header);
return detail::read_unpacked_entry(*this, log, header.payload_size, result);
}
template <typename F>
void pack_and_write_entry(state_history_log_header header, const chain::block_id_type& prev_id, F&& pack_to) {
std::lock_guard g(_mx);
write_entry(header, prev_id, [&, pack_to = std::forward<F>(pack_to)](auto& stream) {
size_t payload_pos = stream.tellp();
// In order to conserve memory usage for reading the chain state later, we need to
// encode the uncompressed data size to the disk so that the reader can send the
// decompressed data size before decompressing data. Here we use the number
// 1 indicates the format contains a 64 bits unsigned integer for decompressed data
// size and then the actually compressed data. The compressed data size can be
// computed from the payload size in the header minus sizeof(uint32_t) + sizeof(uint64_t).
uint32_t s = 1;
stream.write((char*)&s, sizeof(s));
uint64_t uncompressioned_size = 0;
stream.skip(sizeof(uncompressioned_size));
namespace bio = boost::iostreams;
detail::counter cnt;
{
bio::filtering_ostreambuf buf;
buf.push(boost::ref(cnt));
buf.push(bio::zlib_compressor());
buf.push(bio::file_descriptor_sink(stream.fileno(), bio::never_close_handle));
pack_to(buf);
}
// calculate the payload size and rewind back to header to write the payload size
stream.seek_end(0);
size_t end_payload_pos = stream.tellp();
uint64_t payload_size = end_payload_pos - payload_pos;
stream.seek(payload_pos - sizeof(uint64_t));
stream.write((char*)&payload_size, sizeof(payload_size));
// write the uncompressed data size
stream.skip(sizeof(s));
uncompressioned_size = cnt.characters();
stream.write((char*)&uncompressioned_size, sizeof(uncompressioned_size));
// make sure we reset the file position to end_payload_pos to preserve API behavior
stream.seek(end_payload_pos);
});
}
std::optional<chain::block_id_type> get_block_id(uint32_t block_num) {
std::lock_guard g(_mx);
return get_block_id_i(block_num);
}
#ifdef BOOST_TEST_MODULE
fc::cfile& get_log_file() { return log;}
#endif
private:
void read_header(state_history_log_header& header, bool assert_version = true) {
char bytes[state_history_log_header_serial_size];
@@ -194,12 +484,6 @@ class state_history_log {
template <typename F>
void write_entry(state_history_log_header header, const chain::block_id_type& prev_id, F write_payload) {
if (write_thread_has_exception) {
std::rethrow_exception(eptr);
}
std::unique_lock<std::recursive_mutex> lock(mx);
auto block_num = chain::block_header::num_from_id(header.block_id);
EOS_ASSERT(_begin_block == _end_block || block_num <= _end_block, chain::plugin_exception,
"missed a block in ${name}.log", ("name", name));
@@ -216,24 +500,40 @@ class state_history_log {
}
}
if (block_num < _end_block)
truncate(block_num); //truncate is expected to always leave file pointer at the end
else if (!prune_config)
auto prune_config = std::get_if<state_history::prune_config>(&config);
if (block_num < _end_block) {
// This is typically because of a fork, and we need to truncate the log back to the beginning of the fork.
static uint32_t start_block_num = block_num;
// Guard agaisnt accidently starting a fresh chain with an existing ship log, require manual removal of ship logs.
EOS_ASSERT( block_num > 2, chain::plugin_exception, "Existing ship log with ${eb} blocks when starting from genesis block ${b}",
("eb", _end_block)("b", block_num) );
// block_num < _begin_block = pruned log, need to call truncate() to reset
// get_block_id_i check is an optimization to avoid writing a block that is already in the log (snapshot or replay)
if ( block_num < _begin_block || get_block_id_i(block_num) != header.block_id ) {
truncate(block_num); //truncate is expected to always leave file pointer at the end
} else {
if (start_block_num == block_num || block_num % 1000 == 0 )
ilog("log ${name}.log already contains block ${b}, end block ${eb}", ("name", name)("b", block_num)("eb", _end_block));
return;
}
} else if (!prune_config) {
log.seek_end(0);
else if (prune_config && _begin_block != _end_block)
} else if (prune_config && _begin_block != _end_block) {
log.seek_end(-sizeof(uint32_t)); //overwrite the trailing block count marker on this write
}
//if we're operating on a pruned block log and this is the first entry in the log, make note of the feature in the header
if(prune_config && _begin_block == _end_block)
header.magic = ship_magic(get_ship_version(header.magic), ship_feature_pruned_log);
uint64_t pos = log.tellp();
write_header(header);
write_payload(log);
EOS_ASSERT(log.tellp() == pos + state_history_log_header_serial_size + header.payload_size, chain::plugin_exception,
"wrote payload with incorrect size to ${name}.log", ("name", name));
if (header.payload_size != 0)
EOS_ASSERT(log.tellp() == pos + state_history_log_header_serial_size + header.payload_size, chain::plugin_exception,
"wrote payload with incorrect size to ${name}.log", ("name", name));
fc::raw::pack(log, pos);
fc::raw::pack(index, pos);
@@ -249,28 +549,36 @@ class state_history_log {
const uint32_t num_blocks_in_log = _end_block - _begin_block;
fc::raw::pack(log, num_blocks_in_log);
}
auto partition_config = std::get_if<state_history::partition_config>(&config);
if (partition_config && block_num % partition_config->stride == 0) {
split_log();
}
}
// returns cfile positioned at payload
fc::cfile& get_entry(uint32_t block_num, state_history_log_header& header) {
EOS_ASSERT(block_num >= _begin_block && block_num < _end_block, chain::plugin_exception,
"read non-existing block in ${name}.log", ("name", name));
std::lock_guard lock(mx);
log.seek(get_pos(block_num));
read_header(header);
return log;
}
chain::block_id_type get_block_id(uint32_t block_num) {
std::lock_guard lock(mx);
state_history_log_header header;
get_entry(block_num, header);
return header.block_id;
std::optional<chain::block_id_type> get_block_id_i(uint32_t block_num) {
auto result = catalog.id_for_block(block_num);
if (!result) {
if (block_num >= _begin_block && block_num < _end_block) {
state_history_log_header header;
get_entry(block_num, header);
return header.block_id;
}
return {};
}
return result;
}
private:
//file position must be at start of last block's suffix (back pointer)
//called from open_log / ctor
//called from open_log / ctor
bool get_last_block() {
state_history_log_header header;
uint64_t suffix;
@@ -298,6 +606,8 @@ class state_history_log {
}
void prune(const fc::log_level& loglevel) {
auto prune_config = std::get_if<state_history::prune_config>(&config);
if(!prune_config)
return;
if(_end_block - _begin_block <= prune_config->prune_blocks)
@@ -347,7 +657,7 @@ class state_history_log {
}
}
log.flush();
boost::filesystem::resize_file(log_filename, pos);
boost::filesystem::resize_file(log.get_file_path().string(), pos);
log.flush();
log.seek_end(-sizeof(pos));
@@ -356,13 +666,12 @@ class state_history_log {
// only called from constructor
void open_log() {
log.set_file_path(log_filename);
log.open("a+b");
log.open(fc::cfile::create_or_update_rw_mode);
log.seek_end(0);
uint64_t size = log.tellp();
log.close();
log.open("r+b");
log.open(fc::cfile::update_rw_mode);
if (size >= state_history_log_header_serial_size) {
state_history_log_header header;
log.seek(0);
@@ -403,8 +712,7 @@ class state_history_log {
// only called from constructor
void open_index() {
index.set_file_path(index_filename);
index.open("a+b");
index.open(fc::cfile::create_or_update_rw_mode);
index.seek_end(0);
if (index.tellp() == (static_cast<int>(_end_block) - _index_begin_block) * sizeof(uint64_t))
return;
@@ -444,7 +752,7 @@ class state_history_log {
}
index.close();
index.open("a+b");
index.open(fc::cfile::create_or_update_rw_mode);
}
uint64_t get_pos(uint32_t block_num) {
@@ -455,27 +763,48 @@ class state_history_log {
}
void truncate(uint32_t block_num) {
log.flush();
index.flush();
uint64_t num_removed = 0;
log.close();
index.close();
auto first_block_num = catalog.empty() ? _begin_block : catalog.first_block_num();
auto new_begin_block_num = catalog.truncate(block_num, log.get_file_path());
// notice that catalog.truncate() can replace existing log and index files, so we have to
// close the files and reopen them again; otherwise we might operate on the obsolete files instead.
if (new_begin_block_num > 0) {
_begin_block = new_begin_block_num;
_index_begin_block = new_begin_block_num;
}
uint32_t num_removed;
if (block_num <= _begin_block) {
num_removed = _end_block - _begin_block;
log.seek(0);
boost::filesystem::resize_file(log_filename, 0);
boost::filesystem::resize_file(index_filename, 0);
_begin_block = _end_block = 0;
num_removed = _end_block - first_block_num;
boost::filesystem::resize_file(log.get_file_path().string(), 0);
boost::filesystem::resize_file(index.get_file_path().string(), 0);
_begin_block = _end_block = block_num;
} else {
num_removed = _end_block - block_num;
index.open("rb");
uint64_t pos = get_pos(block_num);
log.seek(0);
boost::filesystem::resize_file(log_filename, pos);
boost::filesystem::resize_file(index_filename, (block_num - _index_begin_block) * sizeof(uint64_t));
index.close();
auto path = log.get_file_path().string();
boost::filesystem::resize_file(log.get_file_path().string(), pos);
boost::filesystem::resize_file(index.get_file_path().string(), (block_num - _index_begin_block) * sizeof(uint64_t));
_end_block = block_num;
//this will leave the end of the log with the last block's suffix no matter if the log is operating in pruned
// mode or not. The assumption is truncate() is always immediately followed up with an append to the log thus
// restoring the prune trailer if required
}
log.open(fc::cfile::update_rw_mode);
log.seek_end(0);
index.open(fc::cfile::create_or_update_rw_mode);
ilog("fork or replay: removed ${n} blocks from ${name}.log", ("n", num_removed)("name", name));
}
@@ -557,6 +886,50 @@ class state_history_log {
_index_begin_block = _begin_block;
ilog("Vacuum of pruned log ${n} complete",("n", name));
}
void split_log() {
fc::path log_file_path = log.get_file_path();
fc::path index_file_path = index.get_file_path();
fc::datastream<fc::cfile> new_log_file;
fc::datastream<fc::cfile> new_index_file;
fc::path tmp_log_file_path = log_file_path;
tmp_log_file_path.replace_extension("log.tmp");
fc::path tmp_index_file_path = index_file_path;
tmp_index_file_path.replace_extension("index.tmp");
new_log_file.set_file_path(tmp_log_file_path);
new_index_file.set_file_path(tmp_index_file_path);
try {
new_log_file.open(fc::cfile::truncate_rw_mode);
new_index_file.open(fc::cfile::truncate_rw_mode);
} catch (...) {
wlog("Unable to open new state history log or index file for writing during log spliting, "
"continue writing to existing block log file\n");
return;
}
index.close();
log.close();
catalog.add(_begin_block, _end_block - 1, log.get_file_path().parent_path(), name);
_begin_block = _end_block;
using std::swap;
swap(new_log_file, log);
swap(new_index_file, index);
fc::rename(tmp_log_file_path, log_file_path);
fc::rename(tmp_index_file_path, index_file_path);
log.set_file_path(log_file_path);
index.set_file_path(index_file_path);
}
}; // state_history_log
} // namespace eosio
@@ -715,4 +715,15 @@ datastream<ST>& operator<<(datastream<ST>& ds, const eosio::state_history::get_b
return ds;
}
template <typename ST>
datastream<ST>& operator<<(datastream<ST>& ds, const eosio::state_history::get_blocks_result_base& obj) {
fc::raw::pack(ds, obj.head);
fc::raw::pack(ds, obj.last_irreversible);
fc::raw::pack(ds, obj.this_block);
fc::raw::pack(ds, obj.prev_block);
history_pack_big_bytes(ds, obj.block);
return ds;
}
} // namespace fc
@@ -2,6 +2,7 @@
#include <eosio/chain/block_state.hpp>
#include <eosio/state_history/types.hpp>
#include <boost/iostreams/filtering_streambuf.hpp>
namespace eosio {
namespace state_history {
@@ -13,8 +14,8 @@ struct trace_converter {
std::map<transaction_id_type, augmented_transaction_trace> cached_traces;
std::optional<augmented_transaction_trace> onblock_trace;
void add_transaction(const transaction_trace_ptr& trace, const chain::packed_transaction_ptr& transaction);
bytes pack(const chainbase::database& db, bool trace_debug_mode, const block_state_ptr& block_state);
void add_transaction(const transaction_trace_ptr& trace, const chain::packed_transaction_ptr& transaction);
void pack(boost::iostreams::filtering_ostreambuf& ds, const chainbase::database& db, bool trace_debug_mode, const block_state_ptr& block_state);
};
} // namespace state_history
@@ -101,12 +101,15 @@ struct get_blocks_ack_request_v0 {
uint32_t num_messages = 0;
};
struct get_blocks_result_v0 {
struct get_blocks_result_base {
block_position head;
block_position last_irreversible;
std::optional<block_position> this_block;
std::optional<block_position> prev_block;
std::optional<bytes> block;
};
struct get_blocks_result_v0 : get_blocks_result_base {
std::optional<bytes> traces;
std::optional<bytes> deltas;
};
+3 -2
View File
@@ -15,7 +15,7 @@ void trace_converter::add_transaction(const transaction_trace_ptr& trace, const
}
}
bytes trace_converter::pack(const chainbase::database& db, bool trace_debug_mode, const block_state_ptr& block_state) {
void trace_converter::pack(boost::iostreams::filtering_ostreambuf& obuf, const chainbase::database& db, bool trace_debug_mode, const block_state_ptr& block_state) {
std::vector<augmented_transaction_trace> traces;
if (onblock_trace)
traces.push_back(*onblock_trace);
@@ -33,7 +33,8 @@ bytes trace_converter::pack(const chainbase::database& db, bool trace_debug_mode
cached_traces.clear();
onblock_trace.reset();
return fc::raw::pack(make_history_context_wrapper(db, trace_debug_mode, traces));
fc::datastream<boost::iostreams::filtering_ostreambuf&> ds{obuf};
return fc::raw::pack(ds, make_history_context_wrapper(db, trace_debug_mode, traces));
}
} // namespace state_history
+1 -1
View File
@@ -8,7 +8,7 @@
#define MAKE_EMBEDDED_WASM_ABI(CN,C, D) \
INCBIN(eosio_testing_contract_ ## CN ## _wasm, "${CMAKE_BINARY_DIR}/libraries/testing/" #D "/" #C "/" #C ".wasm"); \
INCBIN(eosio_testing_contract_ ## CN ## _abi, "${CMAKE_BINARY_DIR}/libraries/testing/" #D "/" #C "/" #C ".abi"); \
INCTXT(eosio_testing_contract_ ## CN ## _abi, "${CMAKE_BINARY_DIR}/libraries/testing/" #D "/" #C "/" #C ".abi"); \
\
namespace eosio::testing { \
std::vector<std::uint8_t> contracts:: CN ## _wasm() { \
@@ -198,7 +198,7 @@ namespace eosio { namespace testing {
unapplied_transaction_queue& get_unapplied_transaction_queue() { return unapplied_transactions; }
transaction_trace_ptr push_transaction( packed_transaction& trx, fc::time_point deadline = fc::time_point::maximum(), uint32_t billed_cpu_time_us = DEFAULT_BILLED_CPU_TIME_US );
transaction_trace_ptr push_transaction( signed_transaction& trx, fc::time_point deadline = fc::time_point::maximum(), uint32_t billed_cpu_time_us = DEFAULT_BILLED_CPU_TIME_US, bool no_throw = false );
transaction_trace_ptr push_transaction( signed_transaction& trx, fc::time_point deadline = fc::time_point::maximum(), uint32_t billed_cpu_time_us = DEFAULT_BILLED_CPU_TIME_US, bool no_throw = false, transaction_metadata::trx_type trx_type = transaction_metadata::trx_type::input );
[[nodiscard]]
action_result push_action(action&& cert_act, uint64_t authorizer); // TODO/QUESTION: Is this needed?
@@ -341,9 +341,8 @@ namespace eosio { namespace testing {
return [this]( const account_name& name ) -> std::optional<abi_serializer> {
try {
const auto& accnt = control->db().get<account_object, by_name>( name );
abi_def abi;
if( abi_serializer::to_abi( accnt.abi, abi )) {
return abi_serializer( abi, abi_serializer::create_yield_function( abi_serializer_max_time ) );
if( abi_def abi; abi_serializer::to_abi( accnt.abi, abi )) {
return abi_serializer( std::move(abi), abi_serializer::create_yield_function( abi_serializer_max_time ) );
}
return std::optional<abi_serializer>();
} FC_RETHROW_EXCEPTIONS( error, "Failed to find or parse ABI for ${name}", ("name", name))
@@ -490,6 +489,9 @@ namespace eosio { namespace testing {
}
}
tester(const std::function<void(controller&)>& control_setup, setup_policy policy = setup_policy::full,
db_read_mode read_mode = db_read_mode::HEAD);
using base_tester::produce_block;
signed_block_ptr produce_block( fc::microseconds skip_time = fc::milliseconds(config::block_interval_ms) )override {
+18 -3
View File
@@ -582,7 +582,8 @@ namespace eosio { namespace testing {
transaction_trace_ptr base_tester::push_transaction( signed_transaction& trx,
fc::time_point deadline,
uint32_t billed_cpu_time_us,
bool no_throw
bool no_throw,
transaction_metadata::trx_type trx_type
)
{ try {
if( !control->is_building_block() )
@@ -597,7 +598,7 @@ namespace eosio { namespace testing {
fc::microseconds::maximum() :
fc::microseconds( deadline - fc::time_point::now() );
auto ptrx = std::make_shared<packed_transaction>( trx, c );
auto fut = transaction_metadata::start_recover_keys( ptrx, control->get_thread_pool(), control->get_chain_id(), time_limit, transaction_metadata::trx_type::input );
auto fut = transaction_metadata::start_recover_keys( ptrx, control->get_thread_pool(), control->get_chain_id(), time_limit, trx_type );
auto r = control->push_transaction( fut.get(), deadline, fc::microseconds::maximum(), billed_cpu_time_us, billed_cpu_time_us > 0, 0 );
if (no_throw) return r;
if( r->except_ptr ) std::rethrow_exception( r->except_ptr );
@@ -682,7 +683,7 @@ namespace eosio { namespace testing {
const variant_object& data )const { try {
const auto& acnt = control->get_account(code);
auto abi = acnt.get_abi();
chain::abi_serializer abis(abi, abi_serializer::create_yield_function( abi_serializer_max_time ));
chain::abi_serializer abis(std::move(abi), abi_serializer::create_yield_function( abi_serializer_max_time ));
string action_type_name = abis.get_action_type(acttype);
FC_ASSERT( action_type_name != string(), "unknown action type ${a}", ("a",acttype) );
@@ -1206,6 +1207,20 @@ namespace eosio { namespace testing {
preactivate_protocol_features( preactivations );
}
tester::tester(const std::function<void(controller&)>& control_setup, setup_policy policy, db_read_mode read_mode) {
auto def_conf = default_config(tempdir);
def_conf.first.read_mode = read_mode;
cfg = def_conf.first;
base_tester::open(make_protocol_feature_set(), def_conf.second.compute_chain_id(),
[&genesis = def_conf.second, &control = this->control, &control_setup]() {
control_setup(*control);
control->startup([]() {}, []() { return false; }, genesis);
});
execute_setup_policy(policy);
}
bool fc_exception_message_is::operator()( const fc::exception& ex ) {
auto message = ex.get_log().at( 0 ).get_message();
bool match = (message == expected);
+18 -2
View File
@@ -12,10 +12,11 @@ namespace IR
struct NoImm {};
struct MemoryImm {};
PACKED_STRUCT(
struct ControlStructureImm
{
ResultType resultType{};
};
});
struct BranchImm
{
@@ -675,4 +676,19 @@ namespace IR
};
IR_API const char* getOpcodeName(Opcode opcode);
}
}
//paranoia for future platforms
static_assert(sizeof(IR::OpcodeAndImm<IR::NoImm>) == 2);
static_assert(sizeof(IR::OpcodeAndImm<IR::MemoryImm>) == 2);
static_assert(sizeof(IR::OpcodeAndImm<IR::ControlStructureImm>) == 3);
static_assert(sizeof(IR::OpcodeAndImm<IR::BranchImm>) == 6);
static_assert(sizeof(IR::OpcodeAndImm<IR::BranchTableImm>) == 18);
static_assert(sizeof(IR::OpcodeAndImm<IR::LiteralImm<I32>>) == 6);
static_assert(sizeof(IR::OpcodeAndImm<IR::LiteralImm<I64>>) == 10);
static_assert(sizeof(IR::OpcodeAndImm<IR::LiteralImm<F32>>) == 6);
static_assert(sizeof(IR::OpcodeAndImm<IR::LiteralImm<F64>>) == 10);
static_assert(sizeof(IR::OpcodeAndImm<IR::GetOrSetVariableImm<false>>) == 6);
static_assert(sizeof(IR::OpcodeAndImm<IR::CallImm>) == 6);
static_assert(sizeof(IR::OpcodeAndImm<IR::CallIndirectImm>) == 6);
static_assert(sizeof(IR::OpcodeAndImm<IR::LoadOrStoreImm<0>>) == 10);
+2 -1
View File
@@ -61,7 +61,7 @@ set(CPACK_DEBIAN_BASE_FILE_NAME "${CPACK_DEBIAN_FILE_NAME}.deb")
string(REGEX REPLACE "^(${CMAKE_PROJECT_NAME})" "\\1-dev" CPACK_DEBIAN_DEV_FILE_NAME "${CPACK_DEBIAN_BASE_FILE_NAME}")
#deb package tooling will be unable to detect deps for the dev package. llvm is tricky since we don't know what package could have been used; try to figure it out
set(CPACK_DEBIAN_DEV_PACKAGE_DEPENDS "libboost-all-dev, libssl-dev, libgmp-dev")
set(CPACK_DEBIAN_DEV_PACKAGE_DEPENDS "libboost-all-dev, libssl-dev, libgmp-dev, python3-numpy")
find_program(DPKG_QUERY "dpkg-query")
if(DPKG_QUERY AND OS_RELEASE MATCHES "\n?ID=\"?ubuntu" AND LLVM_CMAKE_DIR)
execute_process(COMMAND "${DPKG_QUERY}" -S "${LLVM_CMAKE_DIR}" COMMAND cut -d: -f1 RESULT_VARIABLE LLVM_PKG_FIND_RESULT OUTPUT_VARIABLE LLVM_PKG_FIND_OUTPUT)
@@ -70,6 +70,7 @@ if(DPKG_QUERY AND OS_RELEASE MATCHES "\n?ID=\"?ubuntu" AND LLVM_CMAKE_DIR)
string(APPEND CPACK_DEBIAN_DEV_PACKAGE_DEPENDS ", ${LLVM_PKG_FIND_OUTPUT}")
endif()
endif()
set(CPACK_DEBIAN_DEV_PACKAGE_CONTROL_EXTRA "${CMAKE_BINARY_DIR}/scripts/postinst;${CMAKE_BINARY_DIR}/scripts/prerm")
#since rpm packages aren't component based, make sure description picks up more detailed description instead of just summary
set(CPACK_RPM_PACKAGE_DESCRIPTION "${CPACK_COMPONENT_BASE_DESCRIPTION}")
+1
View File
@@ -15,3 +15,4 @@ add_subdirectory(wallet_api_plugin)
add_subdirectory(db_size_api_plugin)
add_subdirectory(test_control_plugin)
add_subdirectory(test_control_api_plugin)
add_subdirectory(prometheus_plugin)
-161
View File
@@ -548,68 +548,6 @@ paths:
type: array
items: {}
/abi_json_to_bin:
post:
description: Returns an object containing the serialized action data.
operationId: abi_json_to_bin
requestBody:
content:
application/json:
schema:
type: object
title: AbiJsonToBinRequest
- code
- action
- args
properties:
code:
$ref: "https://docs.eosnetwork.com/openapi/v2.0/Name.yaml"
action:
$ref: "https://docs.eosnetwork.com/openapi/v2.0/Name.yaml"
args:
type: object
description: json object of the action parameters that will be serialized.
responses:
"200":
description: OK
content:
application/json:
schema:
type: object
properties:
binargs:
$ref: "https://docs.eosnetwork.com/openapi/v2.0/Hex.yaml"
/abi_bin_to_json:
post:
description: Returns an object containing the deserialized action data.
operationId: abi_bin_to_json
requestBody:
content:
application/json:
schema:
type: object
title: AbiBinToJsonRequest
required:
- code
- action
- binargs
properties:
code:
$ref: "https://docs.eosnetwork.com/openapi/v2.0/Name.yaml"
action:
$ref: "https://docs.eosnetwork.com/openapi/v2.0/Name.yaml"
binargs:
$ref: "https://docs.eosnetwork.com/openapi/v2.0/Hex.yaml"
responses:
"200":
description: OK
content:
application/json:
schema:
type: string
/get_code:
post:
description: Returns an object containing the smart contract WASM code.
@@ -786,102 +724,3 @@ paths:
threshold:
type: "integer"
description: the sum of weights that must be met or exceeded to satisfy the permission
/send_transaction2:
post:
description: This method expects a transaction in JSON format and will attempt to apply it to the blockchain.
operationId: send_transaction2
requestBody:
content:
application/json:
schema:
type: object
properties:
signatures:
type: array
description: array of signatures required to authorize transaction
items:
$ref: "https://docs.eosnetwork.com/openapi/v2.0/Signature.yaml"
compression:
type: boolean
description: Compression used, usually false
packed_context_free_data:
type: string
description: json to hex
packed_trx:
type: string
description: Transaction object json to hex
responses:
"200":
description: OK
content:
application/json:
schema:
description: Returns Nothing
/get_transaction_status:
post:
description: This method expects a transaction in JSON format and will attempt to apply it to the blockchain.
operationId: get_transaction_status
requestBody:
content:
application/json:
schema:
type: object
properties:
signatures:
type: array
description: array of signatures required to authorize transaction
items:
$ref: "https://docs.eosnetwork.com/openapi/v2.0/Signature.yaml"
compression:
type: boolean
description: Compression used, usually false
packed_context_free_data:
type: string
description: json to hex
packed_trx:
type: string
description: Transaction object json to hex
responses:
"200":
description: OK
content:
application/json:
schema:
description: Returns Nothing
/compute_transaction:
post:
description: This method expects a transaction in JSON format and will attempt to apply it to the blockchain.
operationId: compute_transaction
requestBody:
content:
application/json:
schema:
type: object
properties:
signatures:
type: array
description: array of signatures required to authorize transaction
items:
$ref: "https://docs.eosnetwork.com/openapi/v2.0/Signature.yaml"
compression:
type: boolean
description: Compression used, usually false
packed_context_free_data:
type: string
description: json to hex
packed_trx:
type: string
description: Transaction object json to hex
responses:
"200":
description: OK
content:
application/json:
schema:
description: Returns Nothing
+57 -47
View File
@@ -1,11 +1,11 @@
#include <eosio/chain_api_plugin/chain_api_plugin.hpp>
#include <eosio/chain/exceptions.hpp>
#include <eosio/http_plugin/macros.hpp>
#include <fc/io/json.hpp>
namespace eosio {
static appbase::abstract_plugin& _chain_api_plugin = app().register_plugin<chain_api_plugin>();
static auto _chain_api_plugin = application::register_plugin<chain_api_plugin>();
using namespace eosio;
@@ -24,13 +24,6 @@ chain_api_plugin::~chain_api_plugin(){}
void chain_api_plugin::set_program_options(options_description&, options_description&) {}
void chain_api_plugin::plugin_initialize(const variables_map&) {}
struct async_result_visitor : public fc::visitor<fc::variant> {
template<typename T>
fc::variant operator()(const T& v) const {
return fc::variant(v);
}
};
// Only want a simple 'Invalid transaction id' if unable to parse the body
template<>
chain_apis::read_only::get_transaction_status_params
@@ -50,7 +43,7 @@ parse_params<chain_apis::read_only::get_transaction_status_params, http_params_t
#define CALL_WITH_400(api_name, api_handle, api_namespace, call_name, http_response_code, params_type) \
{std::string("/v1/" #api_name "/" #call_name), \
[api_handle](string, string body, url_response_callback cb) mutable { \
[api_handle](string&&, string&& body, url_response_callback&& cb) mutable { \
auto deadline = api_handle.start(); \
try { \
auto params = parse_params<api_namespace::call_name ## _params, params_type>(body);\
@@ -62,31 +55,6 @@ parse_params<chain_apis::read_only::get_transaction_status_params, http_params_t
} \
}}
#define CALL_ASYNC_WITH_400(api_name, api_handle, api_namespace, call_name, call_result, http_response_code, params_type) \
{std::string("/v1/" #api_name "/" #call_name), \
[api_handle](string, string body, url_response_callback cb) mutable { \
auto deadline = api_handle.start(); \
try { \
auto params = parse_params<api_namespace::call_name ## _params, params_type>(body);\
FC_CHECK_DEADLINE(deadline);\
api_handle.call_name( std::move(params), \
[cb, body](const std::variant<fc::exception_ptr, call_result>& result){\
if (std::holds_alternative<fc::exception_ptr>(result)) {\
try {\
std::get<fc::exception_ptr>(result)->dynamic_rethrow_exception();\
} catch (...) {\
http_plugin::handle_exception(#api_name, #call_name, body, cb);\
}\
} else {\
cb(http_response_code, fc::time_point::maximum(), std::visit(async_result_visitor(), result));\
}\
});\
} catch (...) { \
http_plugin::handle_exception(#api_name, #call_name, body, cb); \
} \
}\
}
#define CHAIN_RO_CALL(call_name, http_response_code, params_type) CALL_WITH_400(chain, ro_api, chain_apis::read_only, call_name, http_response_code, params_type)
#define CHAIN_RW_CALL(call_name, http_response_code, params_type) CALL_WITH_400(chain, rw_api, chain_apis::read_write, call_name, http_response_code, params_type)
#define CHAIN_RO_CALL_ASYNC(call_name, call_result, http_response_code, params_type) CALL_ASYNC_WITH_400(chain, ro_api, chain_apis::read_only, call_name, call_result, http_response_code, params_type)
@@ -98,25 +66,24 @@ void chain_api_plugin::plugin_startup() {
ilog( "starting chain_api_plugin" );
my.reset(new chain_api_plugin_impl(app().get_plugin<chain_plugin>().chain()));
auto& chain = app().get_plugin<chain_plugin>();
auto& http = app().get_plugin<http_plugin>();
fc::microseconds max_response_time = http.get_max_response_time();
auto& _http_plugin = app().get_plugin<http_plugin>();
fc::microseconds max_response_time = _http_plugin.get_max_response_time();
auto ro_api = chain.get_read_only_api(max_response_time);
auto rw_api = chain.get_read_write_api(max_response_time);
auto& _http_plugin = app().get_plugin<http_plugin>();
ro_api.set_shorten_abi_errors( !http_plugin::verbose_errors() );
_http_plugin.add_api( {
CHAIN_RO_CALL(get_info, 200, http_params_types::no_params)}, appbase::priority::medium_high);
CHAIN_RO_CALL(get_info, 200, http_params_types::no_params)}, appbase::exec_queue::read_only_trx_safe, appbase::priority::medium_high);
_http_plugin.add_api({
CHAIN_RO_CALL(get_activated_protocol_features, 200, http_params_types::possible_no_params),
CHAIN_RO_CALL(get_block, 200, http_params_types::params_required),
CHAIN_RO_CALL(get_block_info, 200, http_params_types::params_required),
CHAIN_RO_CALL(get_block_header_state, 200, http_params_types::params_required),
CHAIN_RO_CALL(get_account, 200, http_params_types::params_required),
CHAIN_RO_CALL(get_code, 200, http_params_types::params_required),
CHAIN_RO_CALL(get_code_hash, 200, http_params_types::params_required),
CHAIN_RO_CALL(get_consensus_parameters, 200, http_params_types::no_params),
CHAIN_RO_CALL(get_abi, 200, http_params_types::params_required),
CHAIN_RO_CALL(get_raw_code_and_abi, 200, http_params_types::params_required),
CHAIN_RO_CALL(get_raw_abi, 200, http_params_types::params_required),
@@ -127,18 +94,21 @@ void chain_api_plugin::plugin_startup() {
CHAIN_RO_CALL(get_producers, 200, http_params_types::params_required),
CHAIN_RO_CALL(get_producer_schedule, 200, http_params_types::no_params),
CHAIN_RO_CALL(get_scheduled_transactions, 200, http_params_types::params_required),
CHAIN_RO_CALL(abi_json_to_bin, 200, http_params_types::params_required),
CHAIN_RO_CALL(abi_bin_to_json, 200, http_params_types::params_required),
CHAIN_RO_CALL(get_required_keys, 200, http_params_types::params_required),
CHAIN_RO_CALL(get_transaction_id, 200, http_params_types::params_required),
CHAIN_RO_CALL_ASYNC(send_read_only_transaction, chain_apis::read_only::send_read_only_transaction_results, 200, http_params_types::params_required),
CHAIN_RO_CALL_ASYNC(compute_transaction, chain_apis::read_only::compute_transaction_results, 200, http_params_types::params_required),
CHAIN_RW_CALL_ASYNC(push_block, chain_apis::read_write::push_block_results, 202, http_params_types::params_required),
// transaction related APIs will be posted to general queue after keys are recovered
CHAIN_RW_CALL_ASYNC(push_transaction, chain_apis::read_write::push_transaction_results, 202, http_params_types::params_required),
CHAIN_RW_CALL_ASYNC(push_transactions, chain_apis::read_write::push_transactions_results, 202, http_params_types::params_required),
CHAIN_RW_CALL_ASYNC(send_transaction, chain_apis::read_write::send_transaction_results, 202, http_params_types::params_required),
CHAIN_RW_CALL_ASYNC(send_transaction2, chain_apis::read_write::send_transaction_results, 202, http_params_types::params_required),
CHAIN_RO_CALL(get_consensus_parameters, 200, http_params_types::no_params)
});
CHAIN_RW_CALL_ASYNC(send_transaction2, chain_apis::read_write::send_transaction_results, 202, http_params_types::params_required)
}, appbase::exec_queue::read_only_trx_safe);
// Not safe to run in parallel with read-only transactions
_http_plugin.add_api({
CHAIN_RW_CALL_ASYNC(push_block, chain_apis::read_write::push_block_results, 202, http_params_types::params_required)
}, appbase::exec_queue::general, appbase::priority::medium_low );
if (chain.account_queries_enabled()) {
_http_plugin.add_async_api({
@@ -146,11 +116,51 @@ void chain_api_plugin::plugin_startup() {
});
}
_http_plugin.add_async_api({
CHAIN_RO_CALL_WITH_400(get_raw_block, 200, http_params_types::params_required),
CHAIN_RO_CALL_WITH_400(get_block_header, 200, http_params_types::params_required)
});
if (chain.transaction_finality_status_enabled()) {
_http_plugin.add_api({
CHAIN_RO_CALL_WITH_400(get_transaction_status, 200, http_params_types::params_required),
});
}, appbase::exec_queue::read_only_trx_safe);
}
_http_plugin.add_api({
{ std::string("/v1/chain/get_block"),
[ro_api, &_http_plugin, max_time=std::min(chain.get_abi_serializer_max_time(),max_response_time)]
( string&&, string&& body, url_response_callback&& cb ) mutable {
auto deadline = ro_api.start();
try {
auto start = fc::time_point::now();
auto params = parse_params<chain_apis::read_only::get_raw_block_params, http_params_types::params_required>(body);
FC_CHECK_DEADLINE( deadline );
chain::signed_block_ptr block = ro_api.get_raw_block( params, deadline );
auto abi_cache = ro_api.get_block_serializers( block, max_time );
FC_CHECK_DEADLINE( deadline );
auto post_time = fc::time_point::now();
auto remaining_time = max_time - (post_time - start);
_http_plugin.post_http_thread_pool(
[ro_api, cb, deadline, post_time, remaining_time, abi_cache{std::move(abi_cache)}, block{std::move( block )}]() mutable {
try {
auto new_deadline = deadline + (fc::time_point::now() - post_time);
fc::variant result = ro_api.convert_block( block, std::move(abi_cache), remaining_time );
cb( 200, new_deadline, std::move( result ) );
} catch( ... ) {
http_plugin::handle_exception( "chain", "get_block", "", cb );
}
} );
} catch( ... ) {
http_plugin::handle_exception("chain", "get_block", body, cb);
}
}
}
}, appbase::exec_queue::read_only_trx_safe);
}
void chain_api_plugin::plugin_shutdown() {}
@@ -2,7 +2,7 @@
#include <eosio/chain_plugin/chain_plugin.hpp>
#include <eosio/http_plugin/http_plugin.hpp>
#include <appbase/application.hpp>
#include <eosio/chain/application.hpp>
#include <eosio/chain/controller.hpp>
namespace eosio {
@@ -0,0 +1,62 @@
#pragma once
#include <fc/time.hpp>
#include <functional>
#include <string>
#include <vector>
namespace eosio::chain::plugin_interface {
//
// prometheus metrics
//
enum class metric_type {
gauge = 1,
counter = 2
};
struct runtime_metric {
metric_type type = metric_type::gauge;
std::string family;
std::string label;
int64_t value = 0;
};
using metrics_listener = std::function<void(std::vector<runtime_metric>)>;
struct plugin_metrics {
virtual ~plugin_metrics() = default;
virtual std::vector<runtime_metric> metrics()=0;
bool should_post() {
return (_listener && (fc::time_point::now() > (_last_post + _min_post_interval_us)));
}
bool post_metrics() {
if (should_post()){
_listener(metrics());
_last_post = fc::time_point::now();
return true;
}
return false;
}
void register_listener(metrics_listener listener) {
_listener = std::move(listener);
}
explicit plugin_metrics(fc::microseconds min_post_interval_us = fc::milliseconds(250))
: _min_post_interval_us(min_post_interval_us)
, _listener(nullptr) {}
private:
fc::microseconds _min_post_interval_us;
metrics_listener _listener;
fc::time_point _last_post;
};
}

Some files were not shown because too many files have changed in this diff Show More