From 868347f6063a268ef4fda0f3fc1228cdb2f8cd60 Mon Sep 17 00:00:00 2001 From: POPPIN-FUMI Date: Sat, 6 Jun 2026 19:07:33 +0900 Subject: [PATCH 1/3] fix(firedancer): network-aware version, SBF install conflict, fdctl symlink Three recipe bugs hit while updating a live devnet Firedancer RPC: 1. update_firedancer / setup_firedancer hardcoded `v{{ mainnet_validators.version_firedancer }}`, so updating a testnet/ devnet Firedancer node forced you to overwrite the *mainnet* version field. Now resolves the target host's own inventory group: `vars[group_names | difference(['all','ungrouped']) | first].version_firedancer` with a `mainnet_validators.version_firedancer` fallback (no regression). 2. install_jito's `cargo-install-all.sh` aborts with "binary cargo-build-sbf already exists in destination" when a prior build left binaries in `/bin`. Add a cleanup task that removes the stale cargo-build-sbf / cargo-test-sbf before the build. 3. The fdctl symlink task (state: link) refused to overwrite an existing regular file at /usr/local/bin/fdctl ("refusing to convert from file to symlink"). Add `force: yes`. Co-Authored-By: Claude Opus 4.8 (1M context) --- template/2026.6.6.1502/ansible/cmn/update_firedancer.yml | 3 ++- .../2026.6.6.1502/ansible/devnet-rpc/install_jito.yml | 9 +++++++++ .../ansible/devnet-rpc/setup_firedancer.yml | 1 + .../2026.6.6.1502/ansible/mainnet-rpc/install_jito.yml | 9 +++++++++ .../ansible/mainnet-rpc/setup_firedancer.yml | 3 ++- .../ansible/mainnet-validator/install_jito.yml | 9 +++++++++ .../ansible/mainnet-validator/setup_firedancer.yml | 3 ++- .../ansible/mainnet-validator/update_firedancer.yml | 3 ++- .../2026.6.6.1502/ansible/testnet-rpc/install_jito.yml | 9 +++++++++ .../ansible/testnet-rpc/setup_firedancer.yml | 1 + .../ansible/testnet-rpc/update_firedancer.yml | 3 ++- .../ansible/testnet-validator/install_jito.yml | 9 +++++++++ .../ansible/testnet-validator/setup_firedancer_agave.yml | 1 + .../ansible/testnet-validator/setup_firedancer_jito.yml | 1 + .../ansible/testnet-validator/update_firedancer.yml | 3 ++- 15 files changed, 61 insertions(+), 6 deletions(-) diff --git a/template/2026.6.6.1502/ansible/cmn/update_firedancer.yml b/template/2026.6.6.1502/ansible/cmn/update_firedancer.yml index 77010754..45d66045 100644 --- a/template/2026.6.6.1502/ansible/cmn/update_firedancer.yml +++ b/template/2026.6.6.1502/ansible/cmn/update_firedancer.yml @@ -12,7 +12,7 @@ dest: /home/solv/firedancer update: yes force: yes - version: v{{ mainnet_validators.version_firedancer }} + version: "v{{ vars[group_names | difference(['all', 'ungrouped']) | first].version_firedancer | default(mainnet_validators.version_firedancer) }}" - name: Initialize git submodules command: git submodule update --init --recursive @@ -51,6 +51,7 @@ src: /home/solv/firedancer/build/native/gcc/bin/fdctl dest: /usr/local/bin/fdctl state: link + force: yes become: yes become_user: root diff --git a/template/2026.6.6.1502/ansible/devnet-rpc/install_jito.yml b/template/2026.6.6.1502/ansible/devnet-rpc/install_jito.yml index 896e023a..caeacdca 100644 --- a/template/2026.6.6.1502/ansible/devnet-rpc/install_jito.yml +++ b/template/2026.6.6.1502/ansible/devnet-rpc/install_jito.yml @@ -61,6 +61,15 @@ version: '{{ jito_version_resolved }}' force: yes + - name: Remove stale cargo-build-sbf/cargo-test-sbf (avoid cargo-install conflict) + become: no + file: + path: '{{ jito_install_dir }}/bin/{{ item }}' + state: absent + loop: + - cargo-build-sbf + - cargo-test-sbf + - name: Build Jito Solana (cargo-install-all) become: no shell: | diff --git a/template/2026.6.6.1502/ansible/devnet-rpc/setup_firedancer.yml b/template/2026.6.6.1502/ansible/devnet-rpc/setup_firedancer.yml index 02b349b6..4713e4ef 100644 --- a/template/2026.6.6.1502/ansible/devnet-rpc/setup_firedancer.yml +++ b/template/2026.6.6.1502/ansible/devnet-rpc/setup_firedancer.yml @@ -53,6 +53,7 @@ src: /home/solv/firedancer/build/native/gcc/bin/fdctl dest: /usr/local/bin/fdctl state: link + force: yes become: yes become_user: root diff --git a/template/2026.6.6.1502/ansible/mainnet-rpc/install_jito.yml b/template/2026.6.6.1502/ansible/mainnet-rpc/install_jito.yml index 9b22902a..4bf8adfe 100644 --- a/template/2026.6.6.1502/ansible/mainnet-rpc/install_jito.yml +++ b/template/2026.6.6.1502/ansible/mainnet-rpc/install_jito.yml @@ -61,6 +61,15 @@ version: '{{ jito_version_resolved }}' force: yes + - name: Remove stale cargo-build-sbf/cargo-test-sbf (avoid cargo-install conflict) + become: no + file: + path: '{{ jito_install_dir }}/bin/{{ item }}' + state: absent + loop: + - cargo-build-sbf + - cargo-test-sbf + - name: Build Jito Solana (cargo-install-all) become: no shell: | diff --git a/template/2026.6.6.1502/ansible/mainnet-rpc/setup_firedancer.yml b/template/2026.6.6.1502/ansible/mainnet-rpc/setup_firedancer.yml index 1b28ae39..158faeb6 100644 --- a/template/2026.6.6.1502/ansible/mainnet-rpc/setup_firedancer.yml +++ b/template/2026.6.6.1502/ansible/mainnet-rpc/setup_firedancer.yml @@ -14,7 +14,7 @@ dest: /home/solv/firedancer update: yes force: yes - version: v{{ mainnet_validators.version_firedancer }} + version: "v{{ vars[group_names | difference(['all', 'ungrouped']) | first].version_firedancer | default(mainnet_validators.version_firedancer) }}" - name: Initialize git submodules command: git submodule update --init --recursive @@ -53,6 +53,7 @@ src: /home/solv/firedancer/build/native/gcc/bin/fdctl dest: /usr/local/bin/fdctl state: link + force: yes become: yes become_user: root diff --git a/template/2026.6.6.1502/ansible/mainnet-validator/install_jito.yml b/template/2026.6.6.1502/ansible/mainnet-validator/install_jito.yml index f7a41853..268be99a 100644 --- a/template/2026.6.6.1502/ansible/mainnet-validator/install_jito.yml +++ b/template/2026.6.6.1502/ansible/mainnet-validator/install_jito.yml @@ -52,6 +52,15 @@ version: '{{ jito_version }}' force: yes + - name: Remove stale cargo-build-sbf/cargo-test-sbf (avoid cargo-install conflict) + become: no + file: + path: '{{ jito_install_dir }}/bin/{{ item }}' + state: absent + loop: + - cargo-build-sbf + - cargo-test-sbf + - name: Build Jito Solana (cargo-install-all) become: no shell: | diff --git a/template/2026.6.6.1502/ansible/mainnet-validator/setup_firedancer.yml b/template/2026.6.6.1502/ansible/mainnet-validator/setup_firedancer.yml index 150d703a..56609e99 100644 --- a/template/2026.6.6.1502/ansible/mainnet-validator/setup_firedancer.yml +++ b/template/2026.6.6.1502/ansible/mainnet-validator/setup_firedancer.yml @@ -19,7 +19,7 @@ dest: /home/solv/firedancer update: yes force: yes - version: v{{ mainnet_validators.version_firedancer }} + version: "v{{ vars[group_names | difference(['all', 'ungrouped']) | first].version_firedancer | default(mainnet_validators.version_firedancer) }}" - name: Initialize git submodules command: git submodule update --init --recursive @@ -58,6 +58,7 @@ src: /home/solv/firedancer/build/native/gcc/bin/fdctl dest: /usr/local/bin/fdctl state: link + force: yes become: yes become_user: root diff --git a/template/2026.6.6.1502/ansible/mainnet-validator/update_firedancer.yml b/template/2026.6.6.1502/ansible/mainnet-validator/update_firedancer.yml index 77010754..45d66045 100644 --- a/template/2026.6.6.1502/ansible/mainnet-validator/update_firedancer.yml +++ b/template/2026.6.6.1502/ansible/mainnet-validator/update_firedancer.yml @@ -12,7 +12,7 @@ dest: /home/solv/firedancer update: yes force: yes - version: v{{ mainnet_validators.version_firedancer }} + version: "v{{ vars[group_names | difference(['all', 'ungrouped']) | first].version_firedancer | default(mainnet_validators.version_firedancer) }}" - name: Initialize git submodules command: git submodule update --init --recursive @@ -51,6 +51,7 @@ src: /home/solv/firedancer/build/native/gcc/bin/fdctl dest: /usr/local/bin/fdctl state: link + force: yes become: yes become_user: root diff --git a/template/2026.6.6.1502/ansible/testnet-rpc/install_jito.yml b/template/2026.6.6.1502/ansible/testnet-rpc/install_jito.yml index 7d24ee09..f18297c3 100644 --- a/template/2026.6.6.1502/ansible/testnet-rpc/install_jito.yml +++ b/template/2026.6.6.1502/ansible/testnet-rpc/install_jito.yml @@ -61,6 +61,15 @@ version: '{{ jito_version_resolved }}' force: yes + - name: Remove stale cargo-build-sbf/cargo-test-sbf (avoid cargo-install conflict) + become: no + file: + path: '{{ jito_install_dir }}/bin/{{ item }}' + state: absent + loop: + - cargo-build-sbf + - cargo-test-sbf + - name: Build Jito Solana (cargo-install-all) become: no shell: | diff --git a/template/2026.6.6.1502/ansible/testnet-rpc/setup_firedancer.yml b/template/2026.6.6.1502/ansible/testnet-rpc/setup_firedancer.yml index c0ee2f74..e86cc521 100644 --- a/template/2026.6.6.1502/ansible/testnet-rpc/setup_firedancer.yml +++ b/template/2026.6.6.1502/ansible/testnet-rpc/setup_firedancer.yml @@ -53,6 +53,7 @@ src: /home/solv/firedancer/build/native/gcc/bin/fdctl dest: /usr/local/bin/fdctl state: link + force: yes become: yes become_user: root diff --git a/template/2026.6.6.1502/ansible/testnet-rpc/update_firedancer.yml b/template/2026.6.6.1502/ansible/testnet-rpc/update_firedancer.yml index 77010754..45d66045 100644 --- a/template/2026.6.6.1502/ansible/testnet-rpc/update_firedancer.yml +++ b/template/2026.6.6.1502/ansible/testnet-rpc/update_firedancer.yml @@ -12,7 +12,7 @@ dest: /home/solv/firedancer update: yes force: yes - version: v{{ mainnet_validators.version_firedancer }} + version: "v{{ vars[group_names | difference(['all', 'ungrouped']) | first].version_firedancer | default(mainnet_validators.version_firedancer) }}" - name: Initialize git submodules command: git submodule update --init --recursive @@ -51,6 +51,7 @@ src: /home/solv/firedancer/build/native/gcc/bin/fdctl dest: /usr/local/bin/fdctl state: link + force: yes become: yes become_user: root diff --git a/template/2026.6.6.1502/ansible/testnet-validator/install_jito.yml b/template/2026.6.6.1502/ansible/testnet-validator/install_jito.yml index fb2d8d0f..cc055c64 100644 --- a/template/2026.6.6.1502/ansible/testnet-validator/install_jito.yml +++ b/template/2026.6.6.1502/ansible/testnet-validator/install_jito.yml @@ -52,6 +52,15 @@ version: '{{ jito_version }}' force: yes + - name: Remove stale cargo-build-sbf/cargo-test-sbf (avoid cargo-install conflict) + become: no + file: + path: '{{ jito_install_dir }}/bin/{{ item }}' + state: absent + loop: + - cargo-build-sbf + - cargo-test-sbf + - name: Build Jito Solana (cargo-install-all) become: no shell: | diff --git a/template/2026.6.6.1502/ansible/testnet-validator/setup_firedancer_agave.yml b/template/2026.6.6.1502/ansible/testnet-validator/setup_firedancer_agave.yml index 82ba967d..5a172e29 100644 --- a/template/2026.6.6.1502/ansible/testnet-validator/setup_firedancer_agave.yml +++ b/template/2026.6.6.1502/ansible/testnet-validator/setup_firedancer_agave.yml @@ -56,6 +56,7 @@ src: /home/solv/firedancer/build/native/gcc/bin/fdctl dest: /usr/local/bin/fdctl state: link + force: yes become: yes become_user: root diff --git a/template/2026.6.6.1502/ansible/testnet-validator/setup_firedancer_jito.yml b/template/2026.6.6.1502/ansible/testnet-validator/setup_firedancer_jito.yml index fd273a80..90dd23fe 100644 --- a/template/2026.6.6.1502/ansible/testnet-validator/setup_firedancer_jito.yml +++ b/template/2026.6.6.1502/ansible/testnet-validator/setup_firedancer_jito.yml @@ -56,6 +56,7 @@ src: /home/solv/firedancer/build/native/gcc/bin/fdctl dest: /usr/local/bin/fdctl state: link + force: yes become: yes become_user: root diff --git a/template/2026.6.6.1502/ansible/testnet-validator/update_firedancer.yml b/template/2026.6.6.1502/ansible/testnet-validator/update_firedancer.yml index 77010754..45d66045 100644 --- a/template/2026.6.6.1502/ansible/testnet-validator/update_firedancer.yml +++ b/template/2026.6.6.1502/ansible/testnet-validator/update_firedancer.yml @@ -12,7 +12,7 @@ dest: /home/solv/firedancer update: yes force: yes - version: v{{ mainnet_validators.version_firedancer }} + version: "v{{ vars[group_names | difference(['all', 'ungrouped']) | first].version_firedancer | default(mainnet_validators.version_firedancer) }}" - name: Initialize git submodules command: git submodule update --init --recursive @@ -51,6 +51,7 @@ src: /home/solv/firedancer/build/native/gcc/bin/fdctl dest: /usr/local/bin/fdctl state: link + force: yes become: yes become_user: root From 0184307b74a919ab473f28b9d8f2b857f123c057 Mon Sep 17 00:00:00 2001 From: POPPIN-FUMI Date: Sat, 6 Jun 2026 19:14:27 +0900 Subject: [PATCH 2/3] refactor(firedancer): use static per-network version key except shared cmn Review follow-up: only cmn/update_firedancer.yml (invoked for every network by `slv r update:firedancer`) needs the dynamic group-based lookup. The network-specific playbooks now use their own static version key (testnet_validators / testnet_rpcs / mainnet_rpcs / mainnet_validators), matching the existing setup_firedancer*.yml convention and removing the group_names ordering foot-gun for any host that is ever in more than one version-key group. Co-Authored-By: Claude Opus 4.8 (1M context) --- template/2026.6.6.1502/ansible/mainnet-rpc/setup_firedancer.yml | 2 +- .../ansible/mainnet-validator/setup_firedancer.yml | 2 +- .../ansible/mainnet-validator/update_firedancer.yml | 2 +- .../2026.6.6.1502/ansible/testnet-rpc/update_firedancer.yml | 2 +- .../ansible/testnet-validator/update_firedancer.yml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/template/2026.6.6.1502/ansible/mainnet-rpc/setup_firedancer.yml b/template/2026.6.6.1502/ansible/mainnet-rpc/setup_firedancer.yml index 158faeb6..6bf8ac39 100644 --- a/template/2026.6.6.1502/ansible/mainnet-rpc/setup_firedancer.yml +++ b/template/2026.6.6.1502/ansible/mainnet-rpc/setup_firedancer.yml @@ -14,7 +14,7 @@ dest: /home/solv/firedancer update: yes force: yes - version: "v{{ vars[group_names | difference(['all', 'ungrouped']) | first].version_firedancer | default(mainnet_validators.version_firedancer) }}" + version: v{{ mainnet_rpcs.version_firedancer }} - name: Initialize git submodules command: git submodule update --init --recursive diff --git a/template/2026.6.6.1502/ansible/mainnet-validator/setup_firedancer.yml b/template/2026.6.6.1502/ansible/mainnet-validator/setup_firedancer.yml index 56609e99..228a7c12 100644 --- a/template/2026.6.6.1502/ansible/mainnet-validator/setup_firedancer.yml +++ b/template/2026.6.6.1502/ansible/mainnet-validator/setup_firedancer.yml @@ -19,7 +19,7 @@ dest: /home/solv/firedancer update: yes force: yes - version: "v{{ vars[group_names | difference(['all', 'ungrouped']) | first].version_firedancer | default(mainnet_validators.version_firedancer) }}" + version: v{{ mainnet_validators.version_firedancer }} - name: Initialize git submodules command: git submodule update --init --recursive diff --git a/template/2026.6.6.1502/ansible/mainnet-validator/update_firedancer.yml b/template/2026.6.6.1502/ansible/mainnet-validator/update_firedancer.yml index 45d66045..5d339bee 100644 --- a/template/2026.6.6.1502/ansible/mainnet-validator/update_firedancer.yml +++ b/template/2026.6.6.1502/ansible/mainnet-validator/update_firedancer.yml @@ -12,7 +12,7 @@ dest: /home/solv/firedancer update: yes force: yes - version: "v{{ vars[group_names | difference(['all', 'ungrouped']) | first].version_firedancer | default(mainnet_validators.version_firedancer) }}" + version: v{{ mainnet_validators.version_firedancer }} - name: Initialize git submodules command: git submodule update --init --recursive diff --git a/template/2026.6.6.1502/ansible/testnet-rpc/update_firedancer.yml b/template/2026.6.6.1502/ansible/testnet-rpc/update_firedancer.yml index 45d66045..a1bc4381 100644 --- a/template/2026.6.6.1502/ansible/testnet-rpc/update_firedancer.yml +++ b/template/2026.6.6.1502/ansible/testnet-rpc/update_firedancer.yml @@ -12,7 +12,7 @@ dest: /home/solv/firedancer update: yes force: yes - version: "v{{ vars[group_names | difference(['all', 'ungrouped']) | first].version_firedancer | default(mainnet_validators.version_firedancer) }}" + version: v{{ testnet_rpcs.version_firedancer }} - name: Initialize git submodules command: git submodule update --init --recursive diff --git a/template/2026.6.6.1502/ansible/testnet-validator/update_firedancer.yml b/template/2026.6.6.1502/ansible/testnet-validator/update_firedancer.yml index 45d66045..e55fb7fc 100644 --- a/template/2026.6.6.1502/ansible/testnet-validator/update_firedancer.yml +++ b/template/2026.6.6.1502/ansible/testnet-validator/update_firedancer.yml @@ -12,7 +12,7 @@ dest: /home/solv/firedancer update: yes force: yes - version: "v{{ vars[group_names | difference(['all', 'ungrouped']) | first].version_firedancer | default(mainnet_validators.version_firedancer) }}" + version: v{{ testnet_validators.version_firedancer }} - name: Initialize git submodules command: git submodule update --init --recursive From 27bc3aec64c7341506d9edb6ee38cdbc3d28ed56 Mon Sep 17 00:00:00 2001 From: POPPIN-FUMI Date: Sat, 6 Jun 2026 19:19:50 +0900 Subject: [PATCH 3/3] fix(testnet-rpc): repair jito start-script (--no-port-check glued to --shred-receiver-address) For a testnet Index/SendTx RPC with validator_type=jito (non-geyser), the template rendered `--no-port-check--shred-receiver-address ...` on one line with no space or line-continuation, so agave-validator failed to start. Give --no-port-check its own trailing backslash and put the geyser/jito flag blocks on their own gated lines (bash tolerates the final trailing backslash). Co-Authored-By: Claude Opus 4.8 (1M context) --- .../2026.6.6.1502/jinja/testnet-rpc/start-validator.sh.j2 | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/template/2026.6.6.1502/jinja/testnet-rpc/start-validator.sh.j2 b/template/2026.6.6.1502/jinja/testnet-rpc/start-validator.sh.j2 index b8eb7273..e02691e2 100644 --- a/template/2026.6.6.1502/jinja/testnet-rpc/start-validator.sh.j2 +++ b/template/2026.6.6.1502/jinja/testnet-rpc/start-validator.sh.j2 @@ -50,9 +50,11 @@ exec agave-validator \ --rpc-send-transaction-also-leader \ {% endif %} {% endif %} ---no-port-check{% if rpc_type == 'Geyser gRPC' or rpc_type == 'Index RPC + gRPC' %} \ +--no-port-check \ +{% if rpc_type == 'Geyser gRPC' or rpc_type == 'Index RPC + gRPC' %} --rpc-pubsub-enable-block-subscription \ --rpc-pubsub-enable-vote-subscription \ -{% endif %}{% if validator_type == 'jito' %} ---shred-receiver-address {{ shred_receiver_address | default("64.130.35.224:1002") }} +{% endif %} +{% if validator_type == 'jito' %} +--shred-receiver-address {{ shred_receiver_address | default("64.130.35.224:1002") }} \ {% endif %} \ No newline at end of file