Skip to content

Commit 1d9e2b8

Browse files
committed
test: 🧪 migration stackoverflow
1 parent b59d49b commit 1d9e2b8

File tree

5 files changed

+43
-44
lines changed

5 files changed

+43
-44
lines changed

backend/Cargo.lock

Lines changed: 17 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

backend/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ entity = { path = "./entity" }
1818
chrono = "0.4.26"
1919
thiserror = "1.0.44"
2020
ring = "^0.17"
21-
lockfree = "0.5.1"
2221
derive_builder = "0.12.0"
2322
futures = "0.3.29"
2423
bincode = "1.3.3"
@@ -28,6 +27,8 @@ tonic-web = "0.10.2"
2827
quick_cache = "0.4.0"
2928
leaky-bucket = "1.0.1"
3029
hickory-resolver = "0.24.0"
30+
crossbeam-queue = "0.3.8"
31+
dashmap = "5.5.3"
3132

3233
[dependencies.tokio-stream]
3334
version = "0.1.14"

backend/src/controller/judger/route/mod.rs

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ pub mod swarm;
33

44
use super::Error;
55
use std::{
6-
collections::VecDeque,
7-
mem::MaybeUninit,
86
ops::DerefMut,
97
sync::{
108
atomic::{AtomicIsize, Ordering},
@@ -13,8 +11,8 @@ use std::{
1311
time::Duration,
1412
};
1513

16-
use lockfree::{map::Map, queue::Queue, set::Set};
17-
use spin::Mutex;
14+
use crossbeam_queue::SegQueue;
15+
use dashmap::{DashMap, DashSet};
1816
use tonic::{service::Interceptor, *};
1917
use uuid::Uuid;
2018

@@ -24,7 +22,9 @@ use crate::{
2422
};
2523

2624
// introduce routing layer error
27-
25+
// type Map<K, V> = Mutex<HashMap<K, V>>;
26+
// type Queue<V> = Mutex<VecDeque<V>>;
27+
// type Set<V> = Mutex<HashSet<V>>;
2828
const HEALTHY_THRESHOLD: isize = 100;
2929
type JudgerIntercept = JudgerClient<
3030
service::interceptor::InterceptedService<transport::Channel, BasicAuthInterceptor>,
@@ -98,7 +98,9 @@ impl std::ops::Deref for ConnGuard {
9898
impl Drop for ConnGuard {
9999
fn drop(&mut self) {
100100
self.upstream.healthy.fetch_add(-2, Ordering::Acquire);
101-
self.upstream.clients.push(self.conn.take().unwrap());
101+
self.upstream
102+
.clients
103+
.push(self.conn.take().unwrap());
102104
}
103105
}
104106

@@ -117,11 +119,11 @@ async fn discover<I: Routable + Send>(
117119
};
118120
let (upstream, langs) = Upstream::new(detail).await?;
119121
for (uuid, lang) in langs.into_iter() {
120-
router.langs.insert(lang).ok();
122+
router.langs.insert(lang);
121123
loop {
122124
match router.routing_table.get(&uuid) {
123125
Some(x) => {
124-
x.1.lock().push_back(upstream.clone());
126+
x.push(upstream.clone());
125127
break;
126128
}
127129
None => {
@@ -139,17 +141,17 @@ async fn discover<I: Routable + Send>(
139141
}
140142

141143
pub struct Router {
142-
routing_table: Map<Uuid, Mutex<VecDeque<Arc<Upstream>>>>,
143-
pub langs: Set<LangInfo>,
144+
routing_table: DashMap<Uuid, SegQueue<Arc<Upstream>>>,
145+
pub langs: DashSet<LangInfo>,
144146
}
145147

146148
impl Router {
147149
// skip because config contain basic auth secret
148150
#[tracing::instrument(level = "debug", skip_all)]
149151
pub async fn new(config: Vec<JudgerConfig>) -> Result<Arc<Self>, Error> {
150152
let self_ = Arc::new(Self {
151-
routing_table: Map::new(),
152-
langs: Set::new(),
153+
routing_table: DashMap::default(),
154+
langs: DashSet::default(),
153155
});
154156
for config in config.into_iter() {
155157
match config.judger_type {
@@ -170,25 +172,19 @@ impl Router {
170172
Ok(self_)
171173
}
172174
pub async fn get(&self, lang: &Uuid) -> Result<ConnGuard, Error> {
173-
let queue = self
174-
.routing_table
175-
.get(lang)
176-
.ok_or(Error::BadArgument("lang"))?;
177-
let (uuid, queue) = queue.as_ref();
178175

179-
let mut queue = queue.lock();
176+
let queue = self.routing_table.get(lang).ok_or(Error::BadArgument("lang"))?;
180177

181178
loop {
182-
match queue.pop_front() {
179+
match queue.pop() {
183180
Some(upstream) => {
184181
if upstream.is_healthy() {
185-
queue.push_back(upstream.clone());
186-
drop(queue);
182+
queue.push(upstream.clone());
187183
return upstream.get().await;
188184
}
189185
}
190186
None => {
191-
self.routing_table.remove(uuid);
187+
self.routing_table.remove(lang);
192188
return Err(Error::BadArgument("lang"));
193189
}
194190
}
@@ -199,7 +195,7 @@ impl Router {
199195
// abstraction for pipelining
200196
pub struct Upstream {
201197
healthy: AtomicIsize,
202-
clients: Queue<JudgerIntercept>,
198+
clients: SegQueue<JudgerIntercept>,
203199
connection: ConnectionDetail,
204200
}
205201

@@ -221,9 +217,9 @@ impl Upstream {
221217
result.push((uuid, lang));
222218
}
223219

224-
let clients = Queue::new();
220+
let clients = SegQueue::default();
225221
clients.push(client);
226-
222+
227223
Ok((
228224
Arc::new(Self {
229225
healthy: AtomicIsize::new(HEALTHY_THRESHOLD),

backend/src/init/db.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,15 @@ where
5757
.if_not_exists(),
5858
);
5959

60+
log::info!("Creating table: {}",entity.table_name());
6061
match db.execute(stmt).await {
6162
Ok(_) => log::info!("Migrated {}", entity.table_name()),
6263
Err(e) => log::info!("Error: {}", e),
6364
}
6465
}
6566

6667
pub async fn first_migration(config: &GlobalConfig, db: &DatabaseConnection) {
68+
log::info!("Start migration");
6769
// create tables
6870
create_table(db, entity::user::Entity).await;
6971
create_table(db, entity::token::Entity).await;

backend/src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ pub mod server;
88
#[tokio::main]
99
async fn main() {
1010
init::new().await;
11+
log::info!("starting server");
1112
server::Server::start().await;
1213
}

0 commit comments

Comments
 (0)