我正在使用
tikv/raft-rs
用于实现共识系统的库。这个图书馆有
RawNode
对象是线程不安全的对象。我们必须定期对此对象执行一些函数(
example
),因此我使用一个新线程来执行。
以下是限制条件:
-
我需要在主线程上有这个对象,但没有这个对象来访问它的一些内部状态。(例如:
raw_node.is_leader
)
-
必须在工作线程上访问此对象。
由于这些限制,这似乎是不可能的,因为:
-
如果我创建了这个对象,并移动到新线程,主线程将无法调用其状态。
-
如果我将此对象保留在主线程对象上,则无法使用
Arc<Mutex<>>
因为这个对象没有实现
Copy
方法。
这是我的代码:
use std::thread::JoinHandle;
use std::sync::{Arc, Mutex, mpsc};
use std::collections::{VecDeque, HashMap};
use raft::RawNode;
use std::sync::mpsc::{Receiver, Sender, TryRecvError};
use protobuf::Message as PbMessage;
use raft::eraftpb::ConfState;
use raft::storage::MemStorage;
use raft::{prelude::*, StateRole};
use regex::Regex;
use crate::proposal::Proposal;
use crate::{proposal, batch};
use std::{str, thread};
use std::time::{Instant, Duration};
use crate::batch::Mailbox;
pub struct Node {
core: Arc<Mutex<CoreNode>>
}
#[derive(Copy)]
struct CoreNode {
raft_group: RawNode<MemStorage>,
}
impl Node {
pub fn new() -> Self {
let cfg = Config {
election_tick: 10,
heartbeat_tick: 3,
..Default::default()
};
let storage = MemStorage::new();
let core = Arc::new(Mutex::new(CoreNode {
raft_group: RawNode::new(&cfg, storage).unwrap()
}));
thread::spawn(move || {
core.lock().unwrap().run();
return;
});
Node { core: core.clone() }
}
pub fn is_leader(&self) -> bool {
return self.core.lock().unwrap().raft_group.raft.state == StateRole::Leader;
}
}
impl CoreNode {
pub fn run(mut self) {}
}
编译时,出现以下错误:
22 | #[derive(Copy)]
| ^^^^
23 | struct CoreNode {
24 | raft_group: RawNode<MemStorage>,
| ------------------------------- this field does not implement `Copy`
|
我的问题是:我如何围绕这个问题进行设计。