Compare commits

..

2 Commits

Author SHA1 Message Date
Niq Dudfield
f3c69ae34e Merge branch 'dev' into fix-ips-fixed 2025-11-27 19:46:22 +07:00
Nicholas Dudfield
aee8087042 fix: restore [ips_fixed] to use addFixedPeer instead of addFallbackStrings
Commit c65a0332bc refactored IP handling but accidentally broke [ips_fixed]
by treating fixed peers as regular bootstrap sources. This caused fixed
peers to not bypass slot limits, breaking connectivity for nodes with low
peers_max values.

This fix does NOT restore:
- The fallback behavior where [ips_fixed] was used as bootstrap when [ips]
  was empty (added in 98bdb9de68, 2015)
- Any hardcoded default bootstrap IPs

These are unnecessary because addFixedPeer actively maintains connections
to fixed peers regardless of the bootstrap mechanism. Nodes with only
[ips_fixed] configured will still connect and discover peers through
their fixed connections.

Closes #636
2025-11-26 09:29:26 +07:00
5 changed files with 57 additions and 82 deletions

View File

@@ -28,10 +28,6 @@ inputs:
description: 'Cache version for invalidation' description: 'Cache version for invalidation'
required: false required: false
default: '1' default: '1'
cache_enabled:
description: 'Whether to use cache'
required: false
default: 'true'
ccache_enabled: ccache_enabled:
description: 'Whether to use ccache' description: 'Whether to use ccache'
required: false required: false
@@ -76,7 +72,7 @@ runs:
echo "name=${SAFE_BRANCH}" >> $GITHUB_OUTPUT echo "name=${SAFE_BRANCH}" >> $GITHUB_OUTPUT
- name: Restore ccache directory for main branch - name: Restore ccache directory for main branch
if: inputs.cache_enabled == 'true' && inputs.ccache_enabled == 'true' if: inputs.ccache_enabled == 'true'
id: ccache-restore id: ccache-restore
uses: ./.github/actions/xahau-ga-cache-restore uses: ./.github/actions/xahau-ga-cache-restore
with: with:
@@ -88,7 +84,7 @@ runs:
cache-type: ccache-main cache-type: ccache-main
- name: Restore ccache directory for current branch - name: Restore ccache directory for current branch
if: inputs.cache_enabled == 'true' && inputs.ccache_enabled == 'true' && steps.safe-branch.outputs.name != inputs.main_branch if: inputs.ccache_enabled == 'true' && steps.safe-branch.outputs.name != inputs.main_branch
id: ccache-restore-current-branch id: ccache-restore-current-branch
uses: ./.github/actions/xahau-ga-cache-restore uses: ./.github/actions/xahau-ga-cache-restore
with: with:
@@ -107,11 +103,6 @@ runs:
# Create cache directories # Create cache directories
mkdir -p ~/.ccache-main ~/.ccache-current mkdir -p ~/.ccache-main ~/.ccache-current
# Keep config separate from cache_dir so configs aren't swapped when CCACHE_DIR changes between steps
mkdir -p ~/.config/ccache
export CCACHE_CONFIGPATH="$HOME/.config/ccache/ccache.conf"
echo "CCACHE_CONFIGPATH=$CCACHE_CONFIGPATH" >> $GITHUB_ENV
# Configure ccache settings AFTER cache restore (prevents stale cached config) # Configure ccache settings AFTER cache restore (prevents stale cached config)
ccache --set-config=max_size=${{ inputs.ccache_max_size }} ccache --set-config=max_size=${{ inputs.ccache_max_size }}
ccache --set-config=hash_dir=${{ inputs.ccache_hash_dir }} ccache --set-config=hash_dir=${{ inputs.ccache_hash_dir }}
@@ -246,14 +237,14 @@ runs:
run: ccache -s run: ccache -s
- name: Save ccache directory for main branch - name: Save ccache directory for main branch
if: success() && inputs.cache_enabled == 'true' && inputs.ccache_enabled == 'true' && steps.safe-branch.outputs.name == inputs.main_branch if: success() && inputs.ccache_enabled == 'true' && steps.safe-branch.outputs.name == inputs.main_branch
uses: actions/cache/save@v4 uses: actions/cache/save@v4
with: with:
path: ~/.ccache-main path: ~/.ccache-main
key: ${{ steps.ccache-restore.outputs.cache-primary-key }} key: ${{ steps.ccache-restore.outputs.cache-primary-key }}
- name: Save ccache directory for current branch - name: Save ccache directory for current branch
if: success() && inputs.cache_enabled == 'true' && inputs.ccache_enabled == 'true' && steps.safe-branch.outputs.name != inputs.main_branch if: success() && inputs.ccache_enabled == 'true' && steps.safe-branch.outputs.name != inputs.main_branch
uses: actions/cache/save@v4 uses: actions/cache/save@v4
with: with:
path: ~/.ccache-current path: ~/.ccache-current

View File

@@ -76,17 +76,6 @@ runs:
${{ runner.os }}-conan-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}- ${{ runner.os }}-conan-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}-
cache-type: Conan cache-type: Conan
- name: Configure Conan cache paths
if: inputs.cache_enabled == 'false'
shell: bash
# For self-hosted runners, register cache paths to be used as volumes
# This allows the cache to be shared between containers
run: |
mkdir -p /.conan-cache/conan2 /.conan-cache/conan2_download /.conan-cache/conan2_sources
echo 'core.cache:storage_path=/.conan-cache/conan2' > ~/.conan2/global.conf
echo 'core.download:download_cache=/.conan-cache/conan2_download' >> ~/.conan2/global.conf
echo 'core.sources:download_cache=/.conan-cache/conan2_sources' >> ~/.conan2/global.conf
- name: Configure Conan - name: Configure Conan
shell: bash shell: bash
run: | run: |

View File

@@ -33,7 +33,7 @@ jobs:
fetch-depth: 2 # Only get the last 2 commits, to avoid fetching all history fetch-depth: 2 # Only get the last 2 commits, to avoid fetching all history
build: build:
runs-on: [self-hosted, xahaud-build] runs-on: [self-hosted, vanity]
needs: [checkout] needs: [checkout]
defaults: defaults:
run: run:
@@ -74,7 +74,7 @@ jobs:
fi fi
tests: tests:
runs-on: [self-hosted, xahaud-build] runs-on: [self-hosted, vanity]
needs: [build, checkout] needs: [build, checkout]
defaults: defaults:
run: run:
@@ -84,7 +84,7 @@ jobs:
run: /bin/bash docker-unit-tests.sh run: /bin/bash docker-unit-tests.sh
cleanup: cleanup:
runs-on: [self-hosted, xahaud-build] runs-on: [self-hosted, vanity]
needs: [tests, checkout] needs: [tests, checkout]
if: always() if: always()
steps: steps:

View File

@@ -14,7 +14,7 @@ concurrency:
jobs: jobs:
matrix-setup: matrix-setup:
runs-on: [self-hosted, generic, 20.04] runs-on: ubuntu-latest
container: python:3-slim container: python:3-slim
outputs: outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }} matrix: ${{ steps.set-matrix.outputs.matrix }}
@@ -176,18 +176,7 @@ jobs:
build: build:
needs: matrix-setup needs: matrix-setup
runs-on: [self-hosted, generic, 20.04] runs-on: ubuntu-latest
container:
image: ubuntu:24.04
volumes:
- /home/runner/.conan-cache:/.conan-cache
- /home/runner/.ccache-main:/github/home/.ccache-main
- /home/runner/.ccache-current:/github/home/.ccache-current
options: >-
--privileged
defaults:
run:
shell: bash
outputs: outputs:
artifact_name: ${{ steps.set-artifact-name.outputs.artifact_name }} artifact_name: ${{ steps.set-artifact-name.outputs.artifact_name }}
strategy: strategy:
@@ -202,22 +191,23 @@ jobs:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Get commit message
id: get-commit-message
uses: ./.github/actions/xahau-ga-get-commit-message
with:
event-name: ${{ github.event_name }}
head-commit-message: ${{ github.event.head_commit.message }}
pr-head-sha: ${{ github.event.pull_request.head.sha }}
- name: Install build dependencies - name: Install build dependencies
run: | run: |
apt-get update sudo apt-get update
apt-get install -y software-properties-common sudo apt-get install -y ninja-build ${{ matrix.cc }} ${{ matrix.cxx }} ccache
add-apt-repository ppa:ubuntu-toolchain-r/test -y
apt-get update
apt-get install -y python3 python-is-python3 pipx
pipx ensurepath
apt-get install -y cmake ninja-build ${{ matrix.cc }} ${{ matrix.cxx }} ccache
apt-get install -y perl # for openssl build
apt-get install -y libsqlite3-dev # for xahaud build
# Install the specific GCC version needed for Clang # Install the specific GCC version needed for Clang
if [ -n "${{ matrix.clang_gcc_toolchain }}" ]; then if [ -n "${{ matrix.clang_gcc_toolchain }}" ]; then
echo "=== Installing GCC ${{ matrix.clang_gcc_toolchain }} for Clang ===" echo "=== Installing GCC ${{ matrix.clang_gcc_toolchain }} for Clang ==="
apt-get install -y gcc-${{ matrix.clang_gcc_toolchain }} g++-${{ matrix.clang_gcc_toolchain }} libstdc++-${{ matrix.clang_gcc_toolchain }}-dev sudo apt-get install -y gcc-${{ matrix.clang_gcc_toolchain }} g++-${{ matrix.clang_gcc_toolchain }} libstdc++-${{ matrix.clang_gcc_toolchain }}-dev
echo "=== GCC versions available after installation ===" echo "=== GCC versions available after installation ==="
ls -la /usr/lib/gcc/x86_64-linux-gnu/ | grep -E "^d" ls -la /usr/lib/gcc/x86_64-linux-gnu/ | grep -E "^d"
@@ -248,7 +238,7 @@ jobs:
echo "Hiding GCC $version -> renaming to $counter (will be seen as GCC version $counter)" echo "Hiding GCC $version -> renaming to $counter (will be seen as GCC version $counter)"
# Safety check: ensure target doesn't already exist # Safety check: ensure target doesn't already exist
if [ ! -e "/usr/lib/gcc/x86_64-linux-gnu/$counter" ]; then if [ ! -e "/usr/lib/gcc/x86_64-linux-gnu/$counter" ]; then
mv "$dir" "/usr/lib/gcc/x86_64-linux-gnu/$counter" sudo mv "$dir" "/usr/lib/gcc/x86_64-linux-gnu/$counter"
else else
echo "ERROR: Cannot rename GCC $version - /usr/lib/gcc/x86_64-linux-gnu/$counter already exists" echo "ERROR: Cannot rename GCC $version - /usr/lib/gcc/x86_64-linux-gnu/$counter already exists"
exit 1 exit 1
@@ -272,12 +262,11 @@ jobs:
# Install libc++ dev packages if using libc++ (not needed for libstdc++) # Install libc++ dev packages if using libc++ (not needed for libstdc++)
if [ "${{ matrix.stdlib }}" = "libcxx" ]; then if [ "${{ matrix.stdlib }}" = "libcxx" ]; then
apt-get install -y libc++-${{ matrix.compiler_version }}-dev libc++abi-${{ matrix.compiler_version }}-dev sudo apt-get install -y libc++-${{ matrix.compiler_version }}-dev libc++abi-${{ matrix.compiler_version }}-dev
fi fi
# Install Conan 2 # Install Conan 2
pipx install "conan>=2.0,<3" pip install --upgrade "conan>=2.0,<3"
echo "$HOME/.local/bin" >> $GITHUB_PATH
- name: Check environment - name: Check environment
run: | run: |
@@ -291,14 +280,6 @@ jobs:
echo "---- Full Environment ----" echo "---- Full Environment ----"
env env
- name: Get commit message
id: get-commit-message
uses: ./.github/actions/xahau-ga-get-commit-message
with:
event-name: ${{ github.event_name }}
head-commit-message: ${{ github.event.head_commit.message }}
pr-head-sha: ${{ github.event.pull_request.head.sha }}
- name: Install dependencies - name: Install dependencies
uses: ./.github/actions/xahau-ga-dependencies uses: ./.github/actions/xahau-ga-dependencies
with: with:
@@ -312,7 +293,6 @@ jobs:
cc: ${{ matrix.cc }} cc: ${{ matrix.cc }}
cxx: ${{ matrix.cxx }} cxx: ${{ matrix.cxx }}
stdlib: ${{ matrix.stdlib }} stdlib: ${{ matrix.stdlib }}
cache_enabled: 'false' # Disable caching for self hosted runner
- name: Build - name: Build
uses: ./.github/actions/xahau-ga-build uses: ./.github/actions/xahau-ga-build
@@ -327,8 +307,6 @@ jobs:
main_branch: ${{ env.MAIN_BRANCH_NAME }} main_branch: ${{ env.MAIN_BRANCH_NAME }}
stdlib: ${{ matrix.stdlib }} stdlib: ${{ matrix.stdlib }}
clang_gcc_toolchain: ${{ matrix.clang_gcc_toolchain || '' }} clang_gcc_toolchain: ${{ matrix.clang_gcc_toolchain || '' }}
cache_enabled: 'false' # Disable caching for self hosted runner
ccache_max_size: '100G'
- name: Set artifact name - name: Set artifact name
id: set-artifact-name id: set-artifact-name

View File

@@ -484,44 +484,61 @@ OverlayImpl::start()
m_peerFinder->setConfig(config); m_peerFinder->setConfig(config);
m_peerFinder->start(); m_peerFinder->start();
auto addIps = [&](std::vector<std::string> bootstrapIps) -> void { auto addIps = [this](std::vector<std::string> ips, bool fixed) {
beast::Journal const& j = app_.journal("Overlay"); beast::Journal const& j = app_.journal("Overlay");
for (auto& ip : bootstrapIps) for (auto& ip : ips)
{ {
std::size_t pos = ip.find('#'); std::size_t pos = ip.find('#');
if (pos != std::string::npos) if (pos != std::string::npos)
ip.erase(pos); ip.erase(pos);
JLOG(j.trace()) << "Found boostrap IP: " << ip; JLOG(j.trace())
<< "Found " << (fixed ? "fixed" : "bootstrap") << " IP: " << ip;
} }
m_resolver.resolve( m_resolver.resolve(
bootstrapIps, ips,
[&](std::string const& name, [this, fixed](
std::string const& name,
std::vector<beast::IP::Endpoint> const& addresses) { std::vector<beast::IP::Endpoint> const& addresses) {
std::vector<std::string> ips;
ips.reserve(addresses.size());
beast::Journal const& j = app_.journal("Overlay"); beast::Journal const& j = app_.journal("Overlay");
std::string const base("config: ");
std::vector<beast::IP::Endpoint> eps;
eps.reserve(addresses.size());
for (auto const& addr : addresses) for (auto const& addr : addresses)
{ {
std::string addrStr = addr.port() == 0 auto ep = addr.port() == 0 ? addr.at_port(DEFAULT_PEER_PORT)
? to_string(addr.at_port(DEFAULT_PEER_PORT)) : addr;
: to_string(addr); JLOG(j.trace())
JLOG(j.trace()) << "Parsed boostrap IP: " << addrStr; << "Parsed " << (fixed ? "fixed" : "bootstrap")
ips.push_back(addrStr); << " IP: " << ep;
eps.push_back(ep);
} }
std::string const base("config: "); if (eps.empty())
if (!ips.empty()) return;
m_peerFinder->addFallbackStrings(base + name, ips);
if (fixed)
{
m_peerFinder->addFixedPeer(base + name, eps);
}
else
{
std::vector<std::string> strs;
strs.reserve(eps.size());
for (auto const& ep : eps)
strs.push_back(to_string(ep));
m_peerFinder->addFallbackStrings(base + name, strs);
}
}); });
}; };
if (!app_.config().IPS.empty()) if (!app_.config().IPS.empty())
addIps(app_.config().IPS); addIps(app_.config().IPS, false);
if (!app_.config().IPS_FIXED.empty()) if (!app_.config().IPS_FIXED.empty())
addIps(app_.config().IPS_FIXED); addIps(app_.config().IPS_FIXED, true);
auto const timer = std::make_shared<Timer>(*this); auto const timer = std::make_shared<Timer>(*this);
std::lock_guard lock(mutex_); std::lock_guard lock(mutex_);