Skip to content

Commit

Permalink
feat(schedule): add straw2 algo
Browse files Browse the repository at this point in the history
Signed-off-by: NaturalSelect <[email protected]>
  • Loading branch information
NaturalSelect committed Dec 12, 2023
1 parent 845b3c9 commit e9fc182
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 1 deletion.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
qp2p = "0.36.4" #{ path = "qp2p" }
qp2p = "0.36.4" #{ path = "qp2p" }
tokio = { version = "1.32.0", features = ["full"] }
thiserror = "1.0.50"
async-trait = "0.1.74"
Expand Down Expand Up @@ -39,6 +39,7 @@ wasmedge-sdk = { version = "0.10.1" }
async-channel = "2.1.0"
sysinfo = "0.29.10"
ssh2 = "0.9.4"
rand = "0.8.5"

# slog-envlogger = { version = "2.1.0", optional = true }

Expand Down
39 changes: 39 additions & 0 deletions src/schedule/master.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
use std::{collections::hash_map::DefaultHasher, hash::Hasher};

use async_raft::NodeId;
use async_trait::async_trait;
use axum::{
http::StatusCode,
response::{IntoResponse, Redirect, Response},
};
use rand::rngs::ThreadRng;
use ws_derive::LogicalModule;
// use

use super::{executor::Executor, http_handler::RequestHandler};
use crate::{
Expand All @@ -24,6 +27,42 @@ pub struct ScheMaster {
// view: ScheMasterView,
}

trait NodeWeighteFetcher {
// NOTE: get weight return node weight
// larger is better
fn get_node_weight(id:NodeId) -> f64;
}

struct StrawNodeSelector {
weight_fetcher:Box<dyn NodeWeighteFetcher>,
rng:ThreadRng
}

impl StrawNodeSelector {
fn new(weight_fetcher: Box<dyn NodeWeighteFetcher>) -> Self { Self { weight_fetcher,rng:rand::thread_rng() } }
}

// NOTE: Straw2 algorithm
impl NodeSelector for StrawNodeSelector {
fn select_node(&self, all_node_cnt: usize, fn_name: &str) -> NodeID {
// NOTE: 1 is an impossible value for straw
let mut max_straw:f64 = 1;
let mut node_id:NodeID = 1;
let range = Uniform::new(0, 65536);
// NOTE: node id is [1,all_node_cnt]
for i in 1..all_node_cnt+1 {
let weight = self.weight_fetcher.get_node_weight(i);
let mut straw:f64 = range.sample(&mut self.rng);
straw = (straw / 65536).ln() / weight;
if max_straw == 1 || max_straw < straw {
max_straw = straw;
node_id = i;
}
}
return node_id;
}
}

trait NodeSelector: Send + Sync + 'static {
fn select_node(&self, all_node_cnt: usize, fn_name: &str) -> NodeID;
}
Expand Down

0 comments on commit e9fc182

Please sign in to comment.