From c4260fb9506005425df3556a860a7ebebc68a6dc Mon Sep 17 00:00:00 2001 From: David Morra Date: Tue, 17 Mar 2026 14:20:06 -0400 Subject: [PATCH 01/15] add mac + linux test runners --- .github/workflows/ci.yml | 54 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..4227798b --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,54 @@ +name: CI + +on: [push, pull_request] + +jobs: + test: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + # os: [ubuntu-latest, macos-latest] + include: + - os: ubuntu-latest + - os: macos-latest + bazel_flags: --config=apple_silicon + + env: + # These flags apply to all bazel build and test commands. + COMMON_BASE_FLAGS: --verbose_failures ${{ matrix.bazel_flags }} + # These flags apply to all bazel test commands. + COMMON_TEST_FLAGS: --test_output=errors --test_summary=detailed ${COMMON_BASE_FLAGS} + + steps: + - name: Checkout code + uses: actions/checkout@v6 + + - name: Install Bazel + uses: bazel-contrib/setup-bazel@0.18.0 + with: + # Avoid downloading Bazel every time. + bazelisk-cache: true + # Store build cache per workflow. + disk-cache: ${{ github.workflow }}-${{ matrix.os }} + # Share repository cache between workflows. + repository-cache: true + + - name: Build all targets + run: | + bazel build //... \ + ${COMMON_BASE_FLAGS} + + - name: Run tests (excluding large) + run: | + bazel test //... \ + --test_tag_filters=-large \ + ${COMMON_TEST_FLAGS} + + # Just separate these out so they don't run if some smaller tests fail. + - name: Run large tests + run: | + bazel test //... \ + --test_tag_filters=large \ + ${COMMON_TEST_FLAGS} + From 1efb97ac3e617e16e33554f7de3577d9b3578a15 Mon Sep 17 00:00:00 2001 From: David Morra Date: Tue, 17 Mar 2026 14:41:02 -0400 Subject: [PATCH 02/15] fix env expansion --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4227798b..46458f0e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: # These flags apply to all bazel build and test commands. COMMON_BASE_FLAGS: --verbose_failures ${{ matrix.bazel_flags }} # These flags apply to all bazel test commands. - COMMON_TEST_FLAGS: --test_output=errors --test_summary=detailed ${COMMON_BASE_FLAGS} + COMMON_TEST_FLAGS: --test_output=errors --test_summary=detailed ${{ env.COMMON_BASE_FLAGS }} steps: - name: Checkout code @@ -37,18 +37,18 @@ jobs: - name: Build all targets run: | bazel build //... \ - ${COMMON_BASE_FLAGS} + $COMMON_BASE_FLAGS - name: Run tests (excluding large) run: | bazel test //... \ --test_tag_filters=-large \ - ${COMMON_TEST_FLAGS} + $COMMON_TEST_FLAGS # Just separate these out so they don't run if some smaller tests fail. - name: Run large tests run: | bazel test //... \ --test_tag_filters=large \ - ${COMMON_TEST_FLAGS} + $COMMON_TEST_FLAGS From edcb6ff2f4d91e8ea6303efb16891ab5e0b9efee Mon Sep 17 00:00:00 2001 From: David Morra Date: Tue, 17 Mar 2026 16:34:41 -0400 Subject: [PATCH 03/15] fix env expansion again --- .github/workflows/ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 46458f0e..920902ad 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: # These flags apply to all bazel build and test commands. COMMON_BASE_FLAGS: --verbose_failures ${{ matrix.bazel_flags }} # These flags apply to all bazel test commands. - COMMON_TEST_FLAGS: --test_output=errors --test_summary=detailed ${{ env.COMMON_BASE_FLAGS }} + COMMON_TEST_FLAGS: --test_output=errors --test_summary=detailed steps: - name: Checkout code @@ -43,6 +43,7 @@ jobs: run: | bazel test //... \ --test_tag_filters=-large \ + $COMMON_BASE_FLAGS $COMMON_TEST_FLAGS # Just separate these out so they don't run if some smaller tests fail. @@ -50,5 +51,6 @@ jobs: run: | bazel test //... \ --test_tag_filters=large \ + $COMMON_BASE_FLAGS \ $COMMON_TEST_FLAGS From 1b6a055a7719cac0cf0e01dbabfc9f80a95e916d Mon Sep 17 00:00:00 2001 From: David Morra Date: Tue, 17 Mar 2026 21:40:29 -0400 Subject: [PATCH 04/15] just be explicit about args --- .github/workflows/ci.yml | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 920902ad..ecbe635e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,17 +8,10 @@ jobs: strategy: fail-fast: false matrix: - # os: [ubuntu-latest, macos-latest] include: - os: ubuntu-latest - os: macos-latest bazel_flags: --config=apple_silicon - - env: - # These flags apply to all bazel build and test commands. - COMMON_BASE_FLAGS: --verbose_failures ${{ matrix.bazel_flags }} - # These flags apply to all bazel test commands. - COMMON_TEST_FLAGS: --test_output=errors --test_summary=detailed steps: - name: Checkout code @@ -37,20 +30,22 @@ jobs: - name: Build all targets run: | bazel build //... \ - $COMMON_BASE_FLAGS + --verbose_failures \ + ${{ matrix.bazel_flags }} - name: Run tests (excluding large) run: | bazel test //... \ --test_tag_filters=-large \ - $COMMON_BASE_FLAGS - $COMMON_TEST_FLAGS + --verbose_failures \ + ${{ matrix.bazel_flags }} + --test_output=errors # Just separate these out so they don't run if some smaller tests fail. - name: Run large tests run: | bazel test //... \ --test_tag_filters=large \ - $COMMON_BASE_FLAGS \ - $COMMON_TEST_FLAGS - + --verbose_failures \ + ${{ matrix.bazel_flags }} \ + --test_output=errors From 909ea90252fb42abbc9473b435effbecc9b34d19 Mon Sep 17 00:00:00 2001 From: David Morra Date: Tue, 17 Mar 2026 22:23:16 -0400 Subject: [PATCH 05/15] some tests weren't tests --- client/BUILD.bazel | 2 +- rpc/example/BUILD.bazel | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/BUILD.bazel b/client/BUILD.bazel index d4ed0fb1..4c5b6bac 100644 --- a/client/BUILD.bazel +++ b/client/BUILD.bazel @@ -66,7 +66,7 @@ cc_test( cc_test( name = "latency_test", - size = "small", + size = "large", srcs = ["latency_test.cc"], data = [ "//server:subspace_server", diff --git a/rpc/example/BUILD.bazel b/rpc/example/BUILD.bazel index 759c3e6a..63c2c7a5 100644 --- a/rpc/example/BUILD.bazel +++ b/rpc/example/BUILD.bazel @@ -1,8 +1,8 @@ package(default_visibility = ["//visibility:public"]) -load("@rules_cc//cc:defs.bzl", "cc_test") +load("@rules_cc//cc:defs.bzl", "cc_binary") -cc_test( +cc_binary( name = "server", srcs = ["server.cc"], data = [ @@ -18,7 +18,7 @@ cc_test( ], ) -cc_test( +cc_binary( name = "client", srcs = ["client.cc"], data = [ From 756e7604c02c8548cc398fcb61cf74fdf833ac77 Mon Sep 17 00:00:00 2001 From: David Morra Date: Tue, 17 Mar 2026 22:30:18 -0400 Subject: [PATCH 06/15] upload logs on test failure --- .github/workflows/ci.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ecbe635e..fa009ec0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -49,3 +49,10 @@ jobs: --verbose_failures \ ${{ matrix.bazel_flags }} \ --test_output=errors + + - name: Upload Bazel test logs + uses: actions/upload-artifact@v7 + if: always() # Upload artifacts even if the previous step failed + with: + name: bazel-test-logs + path: bazel-testlogs From 59943a90947c83f1937b9f5cb2172d9454b19df4 Mon Sep 17 00:00:00 2001 From: David Morra Date: Tue, 17 Mar 2026 22:36:02 -0400 Subject: [PATCH 07/15] only upload logs if a test fails --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fa009ec0..79835238 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,8 +38,8 @@ jobs: bazel test //... \ --test_tag_filters=-large \ --verbose_failures \ + --test_output=errors \ ${{ matrix.bazel_flags }} - --test_output=errors # Just separate these out so they don't run if some smaller tests fail. - name: Run large tests @@ -47,12 +47,12 @@ jobs: bazel test //... \ --test_tag_filters=large \ --verbose_failures \ + --test_output=errors \ ${{ matrix.bazel_flags }} \ - --test_output=errors - name: Upload Bazel test logs uses: actions/upload-artifact@v7 - if: always() # Upload artifacts even if the previous step failed + if: failure() # Upload artifacts only if a step failed with: name: bazel-test-logs path: bazel-testlogs From 390519aefd0c046456a630e090bca0621e728145 Mon Sep 17 00:00:00 2001 From: David Morra Date: Sat, 21 Mar 2026 23:36:17 -0400 Subject: [PATCH 08/15] rm large test filter --- .github/workflows/ci.yml | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 79835238..20feac43 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,23 +33,13 @@ jobs: --verbose_failures \ ${{ matrix.bazel_flags }} - - name: Run tests (excluding large) + - name: Run tests run: | bazel test //... \ - --test_tag_filters=-large \ --verbose_failures \ --test_output=errors \ ${{ matrix.bazel_flags }} - # Just separate these out so they don't run if some smaller tests fail. - - name: Run large tests - run: | - bazel test //... \ - --test_tag_filters=large \ - --verbose_failures \ - --test_output=errors \ - ${{ matrix.bazel_flags }} \ - - name: Upload Bazel test logs uses: actions/upload-artifact@v7 if: failure() # Upload artifacts only if a step failed From be7763da002ee56dc71eb7030defdf2f11b1adbf Mon Sep 17 00:00:00 2001 From: David Morra Date: Sat, 21 Mar 2026 23:55:35 -0400 Subject: [PATCH 09/15] fix mac builds --- common/syscall_shim.cc | 8 +++++++- common/syscall_shim.h | 2 +- rust_client/Cargo.lock | 1 + rust_client/Cargo.toml | 1 + rust_client/src/syscall_shim.rs | 4 ++-- rust_client/tests/syscall_failure_test.rs | 12 ++++++------ 6 files changed, 18 insertions(+), 10 deletions(-) diff --git a/common/syscall_shim.cc b/common/syscall_shim.cc index a5accd51..8ffcb1ee 100644 --- a/common/syscall_shim.cc +++ b/common/syscall_shim.cc @@ -12,7 +12,13 @@ static int RealOpen(const char *path, int flags, mode_t mode) { return ::open(path, flags, mode); } -SyscallShim::SyscallShim() : open_fn(RealOpen) {} +// Wrapper for ::shm_open which on Linux is variadic (int shm_open(const char*, +// int, ...)) and cannot be stored directly as a typed 3-param function pointer. +static int RealShmOpen(const char *name, int oflag, mode_t mode) { + return ::shm_open(name, oflag, mode); +} + +SyscallShim::SyscallShim() : open_fn(RealOpen), shm_open_fn(RealShmOpen) {} static SyscallShim default_shim; static thread_local SyscallShim *active_shim = &default_shim; diff --git a/common/syscall_shim.h b/common/syscall_shim.h index 7c3c9710..40ae117d 100644 --- a/common/syscall_shim.h +++ b/common/syscall_shim.h @@ -26,7 +26,7 @@ struct SyscallShim { int (*open_fn)(const char *, int, mode_t) = nullptr; int (*close_fn)(int) = ::close; int (*ftruncate_fn)(int, off_t) = ::ftruncate; - int (*shm_open_fn)(const char *, int, mode_t) = ::shm_open; + int (*shm_open_fn)(const char *, int, mode_t) = nullptr; int (*shm_unlink_fn)(const char *) = ::shm_unlink; int (*poll_fn)(struct pollfd *, nfds_t, int) = ::poll; int (*stat_fn)(const char *, struct stat *) = ::stat; diff --git a/rust_client/Cargo.lock b/rust_client/Cargo.lock index aae3132f..66d8b11e 100644 --- a/rust_client/Cargo.lock +++ b/rust_client/Cargo.lock @@ -408,6 +408,7 @@ dependencies = [ name = "subspace-client" version = "2.2.0" dependencies = [ + "errno", "libc", "log", "nix", diff --git a/rust_client/Cargo.toml b/rust_client/Cargo.toml index aa8c56d2..7e1174ba 100644 --- a/rust_client/Cargo.toml +++ b/rust_client/Cargo.toml @@ -12,6 +12,7 @@ prost-types = "0.13" thiserror = "2" log = "0.4" libc = "0.2" +errno = "0.3" [build-dependencies] prost-build = "0.13" diff --git a/rust_client/src/syscall_shim.rs b/rust_client/src/syscall_shim.rs index 2fd09364..ec36ef05 100644 --- a/rust_client/src/syscall_shim.rs +++ b/rust_client/src/syscall_shim.rs @@ -15,7 +15,7 @@ use std::ptr::NonNull; // `libc::open` is variadic and cannot be stored as a function pointer. unsafe extern "C" fn real_open(path: *const libc::c_char, flags: libc::c_int, mode: libc::mode_t) -> libc::c_int { - libc::open(path, flags, mode) + libc::open(path, flags, mode as libc::c_uint) } pub type MmapFn = @@ -230,7 +230,7 @@ pub fn shim_shm_open( // shm_open on macOS/BSD uses a name that starts with '/'. // We call through libc directly here since shm_open is not variadic. let c_name = std::ffi::CString::new(name).map_err(|_| nix::Error::EINVAL)?; - let ret = unsafe { libc::shm_open(c_name.as_ptr(), oflag.bits(), mode.bits()) }; + let ret = unsafe { libc::shm_open(c_name.as_ptr(), oflag.bits(), mode.bits() as libc::c_uint) }; if ret < 0 { Err(nix::Error::last()) } else { diff --git a/rust_client/tests/syscall_failure_test.rs b/rust_client/tests/syscall_failure_test.rs index bf1dcf06..f66c947d 100644 --- a/rust_client/tests/syscall_failure_test.rs +++ b/rust_client/tests/syscall_failure_test.rs @@ -55,7 +55,7 @@ unsafe extern "C" fn failing_mmap( ) -> *mut libc::c_void { MMAP_CALL_COUNT.fetch_add(1, Ordering::SeqCst); if should_fail(&MMAP_COUNTDOWN) { - *libc::__errno_location() = libc::ENOMEM; + errno::set_errno(errno::Errno(libc::ENOMEM)); return libc::MAP_FAILED; } libc::mmap(addr, len, prot, flags, fd, offset) @@ -67,10 +67,10 @@ unsafe extern "C" fn failing_open( mode: libc::mode_t, ) -> libc::c_int { if should_fail(&OPEN_COUNTDOWN) { - *libc::__errno_location() = libc::EACCES; + errno::set_errno(errno::Errno(libc::EACCES)); return -1; } - libc::open(path, flags, mode) + libc::open(path, flags, mode as libc::c_uint) } unsafe extern "C" fn failing_ftruncate( @@ -78,7 +78,7 @@ unsafe extern "C" fn failing_ftruncate( length: libc::off_t, ) -> libc::c_int { if should_fail(&FTRUNCATE_COUNTDOWN) { - *libc::__errno_location() = libc::ENOSPC; + errno::set_errno(errno::Errno(libc::ENOSPC)); return -1; } libc::ftruncate(fd, length) @@ -89,7 +89,7 @@ unsafe extern "C" fn failing_fstat( buf: *mut libc::stat, ) -> libc::c_int { if should_fail(&FSTAT_COUNTDOWN) { - *libc::__errno_location() = libc::EBADF; + errno::set_errno(errno::Errno(libc::EBADF)); return -1; } libc::fstat(fd, buf) @@ -101,7 +101,7 @@ unsafe extern "C" fn failing_poll( timeout: libc::c_int, ) -> libc::c_int { if should_fail(&POLL_COUNTDOWN) { - *libc::__errno_location() = libc::EINTR; + errno::set_errno(errno::Errno(libc::EINTR)); return -1; } libc::poll(fds, nfds, timeout) From 5e7a34a4edac5d0fd2437874d9ea418deb7cd4a7 Mon Sep 17 00:00:00 2001 From: David Morra Date: Sun, 22 Mar 2026 00:13:47 -0400 Subject: [PATCH 10/15] fix more cross-platform test issues --- client/syscall_failure_test.cc | 8 +++-- rust_client/tests/syscall_failure_test.rs | 36 ++++++++++++++++++----- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/client/syscall_failure_test.cc b/client/syscall_failure_test.cc index d11f4e03..6f162144 100644 --- a/client/syscall_failure_test.cc +++ b/client/syscall_failure_test.cc @@ -118,8 +118,12 @@ TEST_F(SyscallFailureTest, FtruncateFailAfterShmOpen) { auto pub = client->CreatePublisher("/ftrunc_test", {.slot_size = 64, .num_slots = 4}); ASSERT_FALSE(pub.ok()); - EXPECT_THAT(pub.status().message(), - ::testing::HasSubstr("Failed to set length of shared memory")); + // On Linux ftruncate is on the shm fd; on POSIX/macOS it's on the shadow file. + EXPECT_THAT( + pub.status().message(), + ::testing::AnyOf( + ::testing::HasSubstr("Failed to set length of shared memory"), + ::testing::HasSubstr("Failed to truncate shadow file"))); } // --------------------------------------------------------------------------- diff --git a/rust_client/tests/syscall_failure_test.rs b/rust_client/tests/syscall_failure_test.rs index f66c947d..aaee8215 100644 --- a/rust_client/tests/syscall_failure_test.rs +++ b/rust_client/tests/syscall_failure_test.rs @@ -21,6 +21,7 @@ static MMAP_CALL_COUNT: AtomicI32 = AtomicI32::new(0); static OPEN_COUNTDOWN: AtomicI32 = AtomicI32::new(-1); static FTRUNCATE_COUNTDOWN: AtomicI32 = AtomicI32::new(-1); static FSTAT_COUNTDOWN: AtomicI32 = AtomicI32::new(-1); +static STAT_COUNTDOWN: AtomicI32 = AtomicI32::new(-1); static POLL_COUNTDOWN: AtomicI32 = AtomicI32::new(-1); fn should_fail(countdown: &AtomicI32) -> bool { @@ -42,6 +43,7 @@ fn reset_counters() { OPEN_COUNTDOWN.store(-1, Ordering::SeqCst); FTRUNCATE_COUNTDOWN.store(-1, Ordering::SeqCst); FSTAT_COUNTDOWN.store(-1, Ordering::SeqCst); + STAT_COUNTDOWN.store(-1, Ordering::SeqCst); POLL_COUNTDOWN.store(-1, Ordering::SeqCst); } @@ -95,6 +97,17 @@ unsafe extern "C" fn failing_fstat( libc::fstat(fd, buf) } +unsafe extern "C" fn failing_stat( + path: *const libc::c_char, + buf: *mut libc::stat, +) -> libc::c_int { + if should_fail(&STAT_COUNTDOWN) { + errno::set_errno(errno::Errno(libc::EACCES)); + return -1; + } + libc::stat(path, buf) +} + unsafe extern "C" fn failing_poll( fds: *mut libc::pollfd, nfds: libc::nfds_t, @@ -113,6 +126,7 @@ fn make_failing_shim() -> SyscallShim { open_fn: failing_open, ftruncate_fn: failing_ftruncate, fstat_fn: failing_fstat, + stat_fn: failing_stat, poll_fn: failing_poll, ..SyscallShim::default() } @@ -459,16 +473,24 @@ fn shim_countdown_decrements() { } #[test] -fn fstat_fail_on_subscriber_attach() { +fn fstat_or_stat_fail_on_subscriber_attach() { reset_counters(); - let client = new_client("fstat_sub"); + let client = new_client("get_shm_size_sub"); let opts = PublisherOptions::new().set_slot_size(64).set_num_slots(16); - let _pub = client.create_publisher("sf_fstat_sub", &opts).unwrap(); + let _pub = client.create_publisher("sf_get_shm_size_sub", &opts).unwrap(); let _guard = ScopedShim::install(); - // fstat is called during subscriber buffer attachment (get_shm_size on Linux). - FSTAT_COUNTDOWN.store(0, Ordering::SeqCst); + // get_shm_size is called during subscriber buffer attachment. + // On Linux it uses fstat; on macOS it uses stat on the shadow file. + if cfg!(target_os = "linux") { + FSTAT_COUNTDOWN.store(0, Ordering::SeqCst); + } else { + STAT_COUNTDOWN.store(0, Ordering::SeqCst); + } let sub_opts = SubscriberOptions::new(); - let result = client.create_subscriber("sf_fstat_sub", &sub_opts); - assert!(result.is_err(), "expected fstat failure during subscriber attach"); + let result = client.create_subscriber("sf_get_shm_size_sub", &sub_opts); + assert!( + result.is_err(), + "expected get_shm_size (fstat/stat) failure during subscriber attach" + ); } From d804cc888203d392018662537b8b5bea3d0c4865 Mon Sep 17 00:00:00 2001 From: David Morra Date: Sun, 22 Mar 2026 00:21:50 -0400 Subject: [PATCH 11/15] disable flaky test --- client/BUILD.bazel | 1 + 1 file changed, 1 insertion(+) diff --git a/client/BUILD.bazel b/client/BUILD.bazel index a443a4bd..359ec279 100644 --- a/client/BUILD.bazel +++ b/client/BUILD.bazel @@ -150,6 +150,7 @@ cc_test( data = [ "//server:subspace_server", ], + tags = ["manual"], # Seems to have a ~50% flake rate. deps = [ ":subspace_client", "//server", From ba6f587ebf7db68a3935c6e2ca39b224d24f6fbf Mon Sep 17 00:00:00 2001 From: David Morra Date: Sun, 22 Mar 2026 00:25:44 -0400 Subject: [PATCH 12/15] test on arm linux too --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 20feac43..ee5d1eb2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,6 +10,7 @@ jobs: matrix: include: - os: ubuntu-latest + - os: ubuntu-arm - os: macos-latest bazel_flags: --config=apple_silicon From 7d2a1fe10914141e9d84f0269e66acb79fd4cf4c Mon Sep 17 00:00:00 2001 From: David Morra Date: Sun, 22 Mar 2026 00:27:59 -0400 Subject: [PATCH 13/15] fix os tag name --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ee5d1eb2..ed52433e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: matrix: include: - os: ubuntu-latest - - os: ubuntu-arm + - os: ubuntu-24.04-arm - os: macos-latest bazel_flags: --config=apple_silicon From 6fbe99084adb7317e8a5acd96d4191c6e16348b0 Mon Sep 17 00:00:00 2001 From: David Morra Date: Sun, 22 Mar 2026 22:50:39 -0400 Subject: [PATCH 14/15] fix merge --- rust_client/Cargo.lock | 1 - rust_client/Cargo.toml | 1 - 2 files changed, 2 deletions(-) diff --git a/rust_client/Cargo.lock b/rust_client/Cargo.lock index 66d8b11e..aae3132f 100644 --- a/rust_client/Cargo.lock +++ b/rust_client/Cargo.lock @@ -408,7 +408,6 @@ dependencies = [ name = "subspace-client" version = "2.2.0" dependencies = [ - "errno", "libc", "log", "nix", diff --git a/rust_client/Cargo.toml b/rust_client/Cargo.toml index 7e1174ba..aa8c56d2 100644 --- a/rust_client/Cargo.toml +++ b/rust_client/Cargo.toml @@ -12,7 +12,6 @@ prost-types = "0.13" thiserror = "2" log = "0.4" libc = "0.2" -errno = "0.3" [build-dependencies] prost-build = "0.13" From 09f81385521d9e2d8a748c3f7aac25b82359d976 Mon Sep 17 00:00:00 2001 From: David Morra Date: Mon, 23 Mar 2026 20:41:36 -0400 Subject: [PATCH 15/15] comments from review --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ed52433e..b753afbc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,6 +5,7 @@ on: [push, pull_request] jobs: test: runs-on: ${{ matrix.os }} + timeout-minutes: 60 # liberal upper bound to protect against tests stalling strategy: fail-fast: false matrix: @@ -45,5 +46,5 @@ jobs: uses: actions/upload-artifact@v7 if: failure() # Upload artifacts only if a step failed with: - name: bazel-test-logs + name: bazel-test-logs-${{ matrix.os }} path: bazel-testlogs