From 95a4adc1e8332d61e8ef3cdc6975f192eda05262 Mon Sep 17 00:00:00 2001 From: Jacek Sieka Date: Tue, 4 Jun 2024 18:15:33 +0200 Subject: [PATCH] use statically linked rocksdb on linux/mac, dll on windows (#2291) The `rocksdb` version shipped with distributions is typically old and therefore often lacks features we use - it also doesn't match the one assumed by nim-rocksdb leading to ABI mismatch risks. Instead of depending on the system rocksdb, we'll now use the rocksdb version assumed by nim-rocksdb and locked in its vendor folder by always building it together with nimbus. This avoids the problem of unknown rocksdb versions at a (small) cost to build time. CI caching and full windows support for building from source [remains TODO](https://github.com/status-im/nim-rocksdb/issues/44). --- .github/workflows/ci.yml | 34 +---------------------- .github/workflows/simulators.yml | 22 +-------------- Makefile | 28 +++++++++++-------- config.nims | 12 ++++---- nimbus/db/aristo/aristo_init/rocks_db.nim | 1 - nimbus/db/kvt/kvt_init/rocks_db.nim | 1 - vendor/nim-rocksdb | 2 +- vendor/nimbus-build-system | 2 +- 8 files changed, 26 insertions(+), 76 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index faecdda6b..1c5cc59a2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -115,29 +115,6 @@ jobs: HOMEBREW_NO_INSTALL_CLEANUP=1 brew install gnu-getopt brew link --force gnu-getopt - - name: Restore rocksdb from cache (Macos/Linux) - if: runner.os != 'Windows' - id: rocksdb-cache - uses: actions/cache@v4 - with: - path: rocks-db-cache-${{ matrix.target.cpu }} - key: 'rocksdb-v2-${{ matrix.target.os }}-${{ matrix.target.cpu }}' - - - name: Install rocksdb (Linux amd64) - # mysterious illegal instruction error if we build our own librocksdb - if: runner.os == 'Linux' && matrix.target.cpu == 'amd64' - run: | - sudo apt-get -q update - sudo apt-get install -y librocksdb-dev libpcre3-dev - - - name: Build and install rocksdb (Macos) - if: runner.os == 'Macos' - run: | - HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_INSTALL_CLEANUP=1 brew install ccache - echo "/usr/local/opt/ccache/libexec" >> ${GITHUB_PATH} - curl -O -L -s -S https://raw.githubusercontent.com/status-im/nimbus-build-system/master/scripts/build_rocksdb.sh - bash build_rocksdb.sh rocks-db-cache-${{ matrix.target.cpu }} - - name: Restore llvm-mingw (Windows) from cache if: runner.os == 'Windows' id: windows-mingw-cache @@ -154,7 +131,7 @@ jobs: path: external/dlls-${{ matrix.target.cpu }} # according to docu, idle caches are kept for up to 7 days # so change dlls# to force new cache contents (for some number #) - key: dlls0-${{ matrix.target.cpu }} + key: dlls1-${{ matrix.target.cpu }} - name: Install llvm-mingw dependency (Windows) if: > @@ -179,19 +156,10 @@ jobs: steps.windows-dlls-cache.outputs.cache-hit != 'true' && runner.os == 'Windows' run: | - if [[ '${{ matrix.target.cpu }}' == 'amd64' ]]; then - ROCKSDBSUB=x64 - else - ROCKSDBSUB=x86 - fi DLLPATH=external/dlls-${{ matrix.target.cpu }} mkdir -p external curl -L "https://nim-lang.org/download/windeps.zip" -o external/windeps.zip 7z x -y external/windeps.zip -o"$DLLPATH" - # ROCKSDB - curl -L "https://github.com/status-im/nimbus-deps/releases/download/nimbus-deps/nimbus-deps.zip" -o external/nimbus-deps.zip - 7z x -y external/nimbus-deps.zip - cp "./$ROCKSDBSUB/librocksdb.dll" "$DLLPATH/librocksdb.dll" - name: Path to cached dependencies (Windows) if: > diff --git a/.github/workflows/simulators.yml b/.github/workflows/simulators.yml index f561dfb08..2c8914db9 100644 --- a/.github/workflows/simulators.yml +++ b/.github/workflows/simulators.yml @@ -27,7 +27,6 @@ jobs: id: versions run: | sudo apt-get -q update - sudo apt-get install -y librocksdb-dev libpcre3-dev getHash() { git ls-remote "https://github.com/$1" "${2:-HEAD}" | cut -f 1 } @@ -66,20 +65,6 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - name: Restore rocksdb from cache - id: rocksdb-cache - uses: actions/cache@v4 - with: - path: rocks-db-cache - key: 'rocksdb-v2' - - - name: Build and install rocksdb - run: | - HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_INSTALL_CLEANUP=1 brew install ccache - echo "/usr/local/opt/ccache/libexec" >> ${GITHUB_PATH} - curl -O -L -s -S https://raw.githubusercontent.com/status-im/nimbus-build-system/master/scripts/build_rocksdb.sh - bash build_rocksdb.sh rocks-db-cache - - name: Get latest nimbus-build-system commit hash id: versions run: | @@ -131,20 +116,15 @@ jobs: path: external/dlls # according to docu, idle caches are kept for up to 7 days # so change dlls# to force new cache contents (for some number #) - key: dlls0 + key: dlls1 - name: Install DLLs dependencies if: steps.windows-dlls-cache.outputs.cache-hit != 'true' run: | - ROCKSDBSUB=x64 DLLPATH=external/dlls mkdir -p external curl -L "https://nim-lang.org/download/windeps.zip" -o external/windeps.zip 7z x -y external/windeps.zip -o"$DLLPATH" - # ROCKSDB - curl -L "https://github.com/status-im/nimbus-deps/releases/download/nimbus-deps/nimbus-deps.zip" -o external/nimbus-deps.zip - 7z x -y external/nimbus-deps.zip - cp "./$ROCKSDBSUB/librocksdb.dll" "$DLLPATH/librocksdb.dll" - name: Restore llvm-mingw from cache id: windows-mingw-cache diff --git a/Makefile b/Makefile index 4759126af..2a8725063 100644 --- a/Makefile +++ b/Makefile @@ -203,21 +203,16 @@ update-from-ci: | sanity-checks update-test + "$(MAKE)" --no-print-directory deps-common # builds the tools, wherever they are -$(TOOLS): | build deps +$(TOOLS): | build deps rocksdb for D in $(TOOLS_DIRS); do [ -e "$${D}/$@.nim" ] && TOOL_DIR="$${D}" && break; done && \ echo -e $(BUILD_MSG) "build/$@" && \ $(ENV_SCRIPT) nim c $(NIM_PARAMS) -o:build/$@ "$${TOOL_DIR}/$@.nim" # a phony target, because teaching `make` how to do conditional recompilation of Nim projects is too complicated -nimbus: | build deps +nimbus: | build deps rocksdb echo -e $(BUILD_MSG) "build/$@" && \ $(ENV_SCRIPT) nim c $(NIM_PARAMS) -d:chronicles_log_level=TRACE -o:build/$@ "nimbus/$@.nim" -nimbus_rocksdb_static: | build deps rocksdb_static_deps - echo -e $(BUILD_MSG) "build/$@" && \ - $(ENV_SCRIPT) nim c $(NIM_PARAMS) -d:enable_rocksdb_static_linking -d:chronicles_log_level=TRACE \ - -o:build/$@ "nimbus/nimbus.nim" - # symlink nimbus.nims: ln -s nimbus.nimble $@ @@ -226,17 +221,26 @@ nimbus.nims: libbacktrace: + $(MAKE) -C vendor/nim-libbacktrace --no-print-directory BUILD_CXX_LIB=0 -# nim-rocksdb static dependencies -rocksdb_static_deps: +# nim-rocksdb + +ifneq ($(USE_SYSTEM_ROCKSDB), 0) +ifeq ($(OS), Windows_NT) +rocksdb: fetch-dlls +else +rocksdb: + vendor/nim-rocksdb/scripts/build_static_deps.sh +endif +else +rocksdb: +endif # builds and runs the nimbus test suite -test: | build deps +test: | build deps rocksdb $(ENV_SCRIPT) nim test_rocksdb $(NIM_PARAMS) nimbus.nims $(ENV_SCRIPT) nim test $(NIM_PARAMS) nimbus.nims # builds and runs an EVM-related subset of the nimbus test suite -test-evm: | build deps +test-evm: | build deps rocksdb $(ENV_SCRIPT) nim test_evm $(NIM_PARAMS) nimbus.nims # Primitive reproducibility test. @@ -334,7 +338,7 @@ t8n_test: | build deps t8n $(ENV_SCRIPT) nim c -r $(NIM_PARAMS) -d:chronicles_default_output_device=stderr "tools/t8n/$@.nim" # builds evm state test tool -evmstate: | build deps +evmstate: | build deps rocksdb $(ENV_SCRIPT) nim c $(NIM_PARAMS) "tools/evmstate/$@.nim" # builds and runs evm state tool test suite diff --git a/config.nims b/config.nims index e41cfa341..fb3d57271 100644 --- a/config.nims +++ b/config.nims @@ -156,12 +156,9 @@ switch("warning", "LockLevel:off") # disable nim-kzg's blst switch("define", "kzgExternalBlst") -# RocksDB static linking is disabled by default -when defined(enable_rocksdb_static_linking): - - when defined(windows): - {.fatal: "RocksDB static linking is not supported on Windows".} - +# We lock down rocksdb to a particular version +# TODO self-build rocksdb dll on windows +when not defined(use_system_rocksdb) and not defined(windows): switch("define", "rocksdb_static_linking") # use the C++ linker profile because it's a C++ library @@ -173,3 +170,6 @@ when defined(enable_rocksdb_static_linking): switch("dynlibOverride", "rocksdb") switch("dynlibOverride", "lz4") switch("dynlibOverride", "zstd") + +when defined(gcc): + switch("passc", "-Wno-error=incompatible-pointer-types") \ No newline at end of file diff --git a/nimbus/db/aristo/aristo_init/rocks_db.nim b/nimbus/db/aristo/aristo_init/rocks_db.nim index 683570a25..f24adec5a 100644 --- a/nimbus/db/aristo/aristo_init/rocks_db.nim +++ b/nimbus/db/aristo/aristo_init/rocks_db.nim @@ -25,7 +25,6 @@ ## ... ## {.push raises: [].} -{.warning: "*** importing rocks DB which needs a linker library".} import eth/common, diff --git a/nimbus/db/kvt/kvt_init/rocks_db.nim b/nimbus/db/kvt/kvt_init/rocks_db.nim index de242b029..bcc5b88f0 100644 --- a/nimbus/db/kvt/kvt_init/rocks_db.nim +++ b/nimbus/db/kvt/kvt_init/rocks_db.nim @@ -25,7 +25,6 @@ ## ... ## {.push raises: [].} -{.warning: "*** importing rocks DB which needs a linker library".} import eth/common, diff --git a/vendor/nim-rocksdb b/vendor/nim-rocksdb index eb594e33b..e34c8e825 160000 --- a/vendor/nim-rocksdb +++ b/vendor/nim-rocksdb @@ -1 +1 @@ -Subproject commit eb594e33b29d1475d8f1ba7819bfb7ac5fa48ea3 +Subproject commit e34c8e825cf0d9b3dfdb9bec64b7e8b05de69a24 diff --git a/vendor/nimbus-build-system b/vendor/nimbus-build-system index cf0c9cfa4..8cdaec502 160000 --- a/vendor/nimbus-build-system +++ b/vendor/nimbus-build-system @@ -1 +1 @@ -Subproject commit cf0c9cfa408189c6d428799bf2e9da8d0c0f7f08 +Subproject commit 8cdaec502b5a48f2514e11209f0d81a001d2a2b1