tikv / raft-rs

Raft distributed consensus algorithm implemented in Rust.
Apache License 2.0
2.86k stars 391 forks source link

Apple M1 support #535

Open fade2black opened 6 months ago

fade2black commented 6 months ago

My MacOS is Apple M1 chipset, with Sonoma 14.2

I installed protobuf using brew install protobuf and tried to compile to compile an empty hello, world! project with raft crate included. The compilation failed with

   Compiling raft-proto v0.7.0
error: failed to run custom build command for `raft-proto v0.7.0`

Caused by:
  process didn't exit successfully: `/Users/bayram/Projects/Rust/hello-raft/target/debug/build/raft-proto-c2bff7cf48736de7/build-script-build` (exit status: 101)
  --- stdout
  The system `protoc` version mismatch, require >= 3.1.0, got 25.1.x, fallback to the bundled `protoc`

  --- stderr
  thread 'main' panicked at /Users/bayram/.cargo/registry/src/index.crates.io-6f17d22bba15001f/protobuf-build-0.14.1/src/protobuf_impl.rs:35:14:
  No suitable `protoc` (>= 3.1.0) found in PATH
  note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

I guess it is related to these lines inside protobuf_impl.rs

let protoc_bin_name = match (env::consts::OS, env::consts::ARCH) {
        ("linux", "x86") => "protoc-linux-x86_32",
        ("linux", "x86_64") => "protoc-linux-x86_64",
        ("linux", "aarch64") => "protoc-linux-aarch_64",
        ("linux", "powerpc64") => "protoc-linux-ppcle_64",
        ("macos", "x86_64") => "protoc-osx-x86_64",
        ("windows", _) => "protoc-win32.exe",
        _ => panic!("No suitable `protoc` (>= 3.1.0) found in PATH"),
    };

Or does it support M1 chipset and am I missing something?

BusyJay commented 6 months ago

It's just having problem recognizing version "25.1.x". As a workaround, you can put an outdated protoc in PATH.

fade2black commented 6 months ago

@BusyJay Successfully built. Thank you.

fade2black commented 6 months ago

@BusyJay I managed to compile and run the example with a single node, however with 5 nodes it fails with:

Compiling hello-raft v0.1.0 (/Users/bayram/Projects/Rust/hello-raft)
error[E0599]: no method named `merge_from_bytes` found for struct `raft::prelude::ConfChange` in the current scope
   --> src/main.rs:291:24
    |
291 |                     cc.merge_from_bytes(&entry.data).unwrap();
    |                        ^^^^^^^^^^^^^^^^ method not found in `ConfChange`
    |
   ::: /Users/bayram/.cargo/registry/src/index.crates.io-6f17d22bba15001f/protobuf-2.28.0/src/message.rs:94:8
    |
94  |     fn merge_from_bytes(&mut self, bytes: &[u8]) -> ProtobufResult<()> {
    |        ---------------- the method is available for `raft::prelude::ConfChange` here
    |
    = help: items from traits can only be used if the trait is in scope
help: the following trait is implemented but not in scope; perhaps add a `use` for it:
    |
7   + use protobuf::message::Message;
    |

warning: unused import: `protobuf::Message`
  --> src/main.rs:14:5
   |
14 | use protobuf::Message as PbMessage;
   |     ^^^^^^^^^^^^^^^^^
   |
   = note: `#[warn(unused_imports)]` on by default

For more information about this error, try `rustc --explain E0599`.
warning: `hello-raft` (bin "hello-raft") generated 1 warning
error: could not compile `hello-raft` (bin "hello-raft") due to previous error; 1 warning emitted

This is my Cargo.toml

[package]
name = "hello-raft"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
bytes = "1.5.0"
protobuf = "3.3.0"
raft = "0.7.0"
raft-proto = "0.7.0"
regex = "1.10.2"
slog = "2.7.0"
slog-async = "2.8.0"
slog-envlogger = "2.2.0"
slog-stdlog = "4.1.1"
slog-term = "2.9.0"

Any idea how to fix it?

BusyJay commented 6 months ago

Currently, raft-rs uses protobuf 2.x.

fade2black commented 6 months ago

@BusyJay Thank you. Worked.

fade2black commented 6 months ago

@BusyJay I want to play around with the crate. Do you have sort of community or a place where I could ask questions if I have ones regarding usage of the crate or internals of the crate?

BusyJay commented 6 months ago

Both issues and github discussions are OK.