From 17e74c0c8ba1b6dd157fb64ba1e713572aedb823 Mon Sep 17 00:00:00 2001 From: Jacek Sieka Date: Sat, 24 Jun 2023 16:14:28 +0200 Subject: [PATCH 1/3] don't check legacy tables for pruning (#5116) These tables can't be deleted from (read-only) and would be too slow to delete from anyway due to the inefficient storage format in use. * slow down startup clearing too * remove unused del function --- beacon_chain/beacon_chain_db.nim | 15 ++++--------- .../consensus_object_pools/blockchain_dag.nim | 21 ++++++++++++------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/beacon_chain/beacon_chain_db.nim b/beacon_chain/beacon_chain_db.nim index 9652bbb03..97b913f48 100644 --- a/beacon_chain/beacon_chain_db.nim +++ b/beacon_chain/beacon_chain_db.nim @@ -885,18 +885,11 @@ proc delBlock*(db: BeaconChainDB, fork: ConsensusFork, key: Eth2Digest): bool = proc delState*(db: BeaconChainDB, fork: ConsensusFork, key: Eth2Digest) = discard db.statesNoVal[fork].del(key.data).expectDb() -proc clearBlocks*(db: BeaconChainDB, fork: ConsensusFork) = - discard db.blocks[fork].clear().expectDb() +proc clearBlocks*(db: BeaconChainDB, fork: ConsensusFork): bool = + db.blocks[fork].clear().expectDb() -proc clearStates*(db: BeaconChainDB, fork: ConsensusFork) = - discard db.statesNoVal[fork].clear().expectDb() - -proc delKeyValue*(db: BeaconChainDB, key: array[1, byte]) = - discard db.keyValues.del(key).expectDb() - discard db.v0.backend.del(key).expectDb() - -proc delKeyValue*(db: BeaconChainDB, key: DbKeyKind) = - db.delKeyValue(subkey(key)) +proc clearStates*(db: BeaconChainDB, fork: ConsensusFork): bool = + db.statesNoVal[fork].clear().expectDb() proc delStateRoot*(db: BeaconChainDB, root: Eth2Digest, slot: Slot) = discard db.stateRoots.del(stateRootKey(root, slot)).expectDb() diff --git a/beacon_chain/consensus_object_pools/blockchain_dag.nim b/beacon_chain/consensus_object_pools/blockchain_dag.nim index 9b2081f40..7d8f89639 100644 --- a/beacon_chain/consensus_object_pools/blockchain_dag.nim +++ b/beacon_chain/consensus_object_pools/blockchain_dag.nim @@ -683,13 +683,13 @@ proc getState( proc containsState*( db: BeaconChainDB, cfg: RuntimeConfig, block_root: Eth2Digest, - slots: Slice[Slot]): bool = + slots: Slice[Slot], legacy = true): bool = var slot = slots.b while slot >= slots.a: let state_root = db.getStateRoot(block_root, slot) if state_root.isSome() and db.containsState( - cfg.consensusForkAtEpoch(slot.epoch), state_root.get()): + cfg.consensusForkAtEpoch(slot.epoch), state_root.get(), legacy): return true if slot == slots.a: # avoid underflow at genesis @@ -2192,7 +2192,10 @@ proc pruneHistory*(dag: ChainDAGRef, startup = false) = var first = true while cur.isSome(): let bs = cur.get() - if dag.db.containsState(dag.cfg, bs.bid.root, bs.slot..bs.slot): + # We don't delete legacy states because the legacy database is openend + # in read-only and slow to delete from due to its sub-optimal structure + if dag.db.containsState( + dag.cfg, bs.bid.root, bs.slot..bs.slot, legacy = first): if first: # We leave the state on the prune horizon intact and update the tail # to point to this state, indicating the new point in time from @@ -2252,17 +2255,21 @@ proc pruneHistory*(dag: ChainDAGRef, startup = false) = # Once during start, we'll clear all "old fork" data - this ensures we get # rid of any leftover junk in the tables - we do so after linear pruning # so as to "mostly" clean up the phase0 tables as well (which cannot be - # pruned easily by fork) + # pruned easily by fork) - one fork at a time, so as not to take too long let stateFork = dag.cfg.consensusForkAtEpoch(dag.tail.slot.epoch) + var clearedStates = false if stateFork > ConsensusFork.Phase0: for fork in ConsensusFork.Phase0.. ConsensusFork.Phase0: + if not clearedStates and blockFork > ConsensusFork.Phase0: for fork in ConsensusFork.Phase0.. Date: Mon, 26 Jun 2023 19:53:35 +0300 Subject: [PATCH 2/3] Re-enable the ARM packaging --- .github/workflows/release.yml | 92 ++++++++++++++++++++++++++++++++++- docker/dist/entry_point.sh | 7 --- 2 files changed, 91 insertions(+), 8 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e66676dfe..dc0a4a525 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -155,6 +155,85 @@ jobs: ./dist/*.deb ./dist/*.rpm retention-days: 2 + build-arm: + name: Linux ARM release asset + runs-on: ubuntu-latest + steps: + - name: Install packages + env: + DEBIAN_FRONTEND: "noninteractive" + TZ: "Etc/UTC" + run: | + sudo apt-get -qq update + sudo apt-get -qq -y install binfmt-support qemu-user-static + - name: Checkout code + uses: actions/checkout@v2 + - name: Build project + id: make_dist + run: | + make dist-arm + cd dist + ARCHIVE=$(echo nimbus-eth2_Linux_arm32v7_*.tar.gz) + echo "::set-output name=archive::"${ARCHIVE} + echo "::set-output name=archive_dir::"${ARCHIVE%.tar.gz} + tar -xzf ${ARCHIVE} ${ARCHIVE%.tar.gz}/build/nimbus_beacon_node.sha512sum + tar -xzf ${ARCHIVE} ${ARCHIVE%.tar.gz}/build/nimbus_validator_client.sha512sum + - name: Upload archive artefact + uses: actions/upload-artifact@v2 + with: + name: Linux_arm_archive + path: ./dist/${{ steps.make_dist.outputs.archive }} + retention-days: 2 + - name: Upload BN checksum artefact + uses: actions/upload-artifact@v2 + with: + name: Linux_arm_checksum + path: ./dist/${{ steps.make_dist.outputs.archive_dir }}/build/nimbus_beacon_node.sha512sum + retention-days: 2 + - name: Upload VC checksum artefact + uses: actions/upload-artifact@v2 + with: + name: Linux_arm_checksum + path: ./dist/${{ steps.make_dist.outputs.archive_dir }}/build/nimbus_validator_client.sha512sum + retention-days: 2 + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push a Docker images for end users + run: | + cd dist + tar -xzf ${{ steps.make_dist.outputs.archive }} + mv ${{ steps.make_dist.outputs.archive_dir }} ../docker/dist/binaries/nimbus-eth2 + cd ../docker/dist/binaries + REFNAME="${{ github.ref }}" + TAG="${REFNAME#refs/tags/}" + cp -a /usr/bin/qemu-arm-static . + DOCKER_BUILDKIT=1 docker build -f Dockerfile.bn.arm -t statusim/nimbus-eth2:arm-${TAG} -t statusim/nimbus-eth2:arm-latest . + docker push statusim/nimbus-eth2:arm-${TAG} + docker push statusim/nimbus-eth2:arm-latest + + DOCKER_BUILDKIT=1 docker build -f Dockerfile.vc.arm -t statusim/nimbus-validator-client:arm-${TAG} -t statusim/nimbus-validator-client:arm-latest . + docker push statusim/nimbus-validator-client:arm-${TAG} + docker push statusim/nimbus-validator-client:arm-latest + + - name: Setup ruby # Needed for fpm + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.1' # Not needed with a .ruby-version file + - name: Create RPM/DEB + run: | + scripts/make_packages.sh -b nimbus_beacon_node -t dist/*.tar.gz --install-fpm + scripts/make_packages.sh -b nimbus_validator_client -t dist/*.tar.gz --install-fpm + - name: Upload DEB + uses: actions/upload-artifact@v3 + with: + name: Linux_arm_packages + path: | + ./dist/*.deb + ./dist/*.rpm + retention-days: 2 build-win64: name: Windows AMD64 release asset runs-on: ubuntu-latest @@ -259,7 +338,7 @@ jobs: retention-days: 2 prepare-release: name: Prepare release draft - needs: [build-amd64, build-arm64, build-win64, build-macos-amd64, build-macos-arm64] + needs: [build-amd64, build-arm64, build-arm, build-win64, build-macos-amd64, build-macos-arm64] runs-on: ubuntu-latest steps: - name: Download artefacts @@ -285,6 +364,8 @@ jobs: cat Linux_amd64_checksum/* >> release_notes.md echo '# Linux ARM64' >> release_notes.md cat Linux_arm64_checksum/* >> release_notes.md + echo '# Linux ARM' >> release_notes.md + cat Linux_arm_checksum/* >> release_notes.md echo '# Windows AMD64' >> release_notes.md cat Windows_amd64_checksum/* >> release_notes.md echo '# macOS AMD64' >> release_notes.md @@ -306,6 +387,8 @@ jobs: Linux_amd64_packages/* Linux_arm64_archive/* Linux_arm64_packages/* + Linux_arm_archive/* + Linux_arm_packages/* Windows_amd64_archive/* macOS_amd64_archive/* macOS_arm64_archive/* @@ -320,6 +403,9 @@ jobs: Linux_arm64_archive Linux_arm64_checksum Linux_arm64_packages + Linux_arm_archive + Linux_arm_checksum + Linux_arm_packages Windows_amd64_archive Windows_amd64_checksum macOS_amd64_archive @@ -341,19 +427,23 @@ jobs: statusim/nimbus-eth2:multiarch-${TAG} \ --amend statusim/nimbus-eth2:amd64-${TAG} \ --amend statusim/nimbus-eth2:arm64-${TAG} \ + --amend statusim/nimbus-eth2:arm-${TAG} docker manifest push statusim/nimbus-eth2:multiarch-${TAG} docker manifest create \ statusim/nimbus-eth2:multiarch-latest \ --amend statusim/nimbus-eth2:amd64-latest \ --amend statusim/nimbus-eth2:arm64-latest \ + --amend statusim/nimbus-eth2:arm-latest docker manifest push statusim/nimbus-eth2:multiarch-latest docker manifest create \ statusim/nimbus-validator-client:multiarch-${TAG} \ --amend statusim/nimbus-validator-client:amd64-${TAG} \ --amend statusim/nimbus-validator-client:arm64-${TAG} \ + --amend statusim/nimbus-validator-client:arm-${TAG} docker manifest push statusim/nimbus-validator-client:multiarch-${TAG} docker manifest create \ statusim/nimbus-validator-client:multiarch-latest \ --amend statusim/nimbus-validator-client:amd64-latest \ --amend statusim/nimbus-validator-client:arm64-latest \ + --amend statusim/nimbus-validator-client:arm-latest docker manifest push statusim/nimbus-validator-client:multiarch-latest diff --git a/docker/dist/entry_point.sh b/docker/dist/entry_point.sh index c196544c8..d6ee7b89e 100755 --- a/docker/dist/entry_point.sh +++ b/docker/dist/entry_point.sh @@ -75,7 +75,6 @@ if [[ "${PLATFORM}" == "Windows_amd64" ]]; then # nim-blscurve's Windows SSSE3 detection doesn't work when cross-compiling, # so we enable it here. make \ - -j$(nproc) \ CC="${CC}" \ CXX="${CXX}" \ CXXFLAGS="${CXXFLAGS} -D__STDC_FORMAT_MACROS -D_WIN32_WINNT=0x0600" \ @@ -94,7 +93,6 @@ elif [[ "${PLATFORM}" == "Linux_arm32v7" ]]; then QUICK_AND_DIRTY_COMPILER=1 \ deps-common build/generate_makefile make \ - -j$(nproc) \ LOG_LEVEL="TRACE" \ CC="${CC}" \ NIMFLAGS="${NIMFLAGS_COMMON} --cpu:arm --gcc.exe=${CC} --gcc.linkerexe=${CC}" \ @@ -111,7 +109,6 @@ elif [[ "${PLATFORM}" == "Linux_arm64v8" ]]; then QUICK_AND_DIRTY_COMPILER=1 \ deps-common build/generate_makefile make \ - -j$(nproc) \ LOG_LEVEL="TRACE" \ CC="${CC}" \ NIMFLAGS="${NIMFLAGS_COMMON} --cpu:arm64 --gcc.exe=${CC} --gcc.linkerexe=${CC}" \ @@ -139,7 +136,6 @@ elif [[ "${PLATFORM}" == "macOS_amd64" ]]; then NIMFLAGS="${NIMFLAGS_COMMON} --os:macosx --clang.exe=${CC}" \ nat-libs make \ - -j$(nproc) \ LOG_LEVEL="TRACE" \ CC="${CC}" \ AR="x86_64-apple-darwin${DARWIN_VER}-ar" \ @@ -172,7 +168,6 @@ elif [[ "${PLATFORM}" == "macOS_arm64" ]]; then NIMFLAGS="${NIMFLAGS_COMMON} --os:macosx --cpu:arm64 --passC:'-mcpu=apple-a13' --clang.exe=${CC}" \ nat-libs make \ - -j$(nproc) \ LOG_LEVEL="TRACE" \ CC="${CC}" \ AR="arm64-apple-darwin${DARWIN_VER}-ar" \ @@ -188,7 +183,6 @@ elif [[ "${PLATFORM}" == "Linux_amd64_opt" ]]; then echo make \ - -j$(nproc) \ LOG_LEVEL="TRACE" \ NIMFLAGS="${NIMFLAGS_COMMON} -d:marchOptimized" \ PARTIAL_STATIC_LINKING=1 \ @@ -200,7 +194,6 @@ else echo make \ - -j$(nproc) \ LOG_LEVEL="TRACE" \ NIMFLAGS="${NIMFLAGS_COMMON}" \ PARTIAL_STATIC_LINKING=1 \ From 187e1a06335e36bbc508fff38729833d154edbaa Mon Sep 17 00:00:00 2001 From: Zahary Karadjov Date: Mon, 26 Jun 2023 19:54:26 +0300 Subject: [PATCH 3/3] Version 23.6.1 --- CHANGELOG.md | 11 +++++++++++ beacon_chain/version.nim | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f477bbb52..2d23bbdb2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +2023-06-26 v23.6.1 +================== + +Nimbus `v23.6.1` is a `low-urgency` point release significantly improving the performance of database pruning on Nimbus instances that have accumulated history prior to April 2021 (Nimbus 1.1.0). Affected users are advised to upgrade as soon as possible in order to reduce the risk of missed attestations and blocks. + +Fixes: + +* The legacy Nimbus database is not subjected to pruning due to the high I/O cost of the operations: + https://github.com/status-im/nimbus-eth2/pull/5116 + + 2023-06-20 v23.6.0 ================== diff --git a/beacon_chain/version.nim b/beacon_chain/version.nim index 3560d0561..0dddccfaf 100644 --- a/beacon_chain/version.nim +++ b/beacon_chain/version.nim @@ -18,7 +18,7 @@ const versionMajor* = 23 versionMinor* = 6 - versionBuild* = 0 + versionBuild* = 1 versionBlob* = "stateofus" # Single word - ends up in the default graffiti