log the actual time of requests

This commit is contained in:
Aleksey Kladov 2019-05-29 14:59:01 +03:00
parent 118a2113c1
commit e45c350a3b

View file

@ -1,7 +1,7 @@
mod handlers; mod handlers;
mod subscriptions; mod subscriptions;
use std::{fmt, path::PathBuf, sync::Arc}; use std::{fmt, path::PathBuf, sync::Arc, time::Instant};
use crossbeam_channel::{select, unbounded, Receiver, RecvError, Sender}; use crossbeam_channel::{select, unbounded, Receiver, RecvError, Sender};
use failure::{bail, format_err}; use failure::{bail, format_err};
@ -12,7 +12,7 @@ use gen_lsp_server::{
use lsp_types::NumberOrString; use lsp_types::NumberOrString;
use ra_ide_api::{Canceled, FileId, LibraryData}; use ra_ide_api::{Canceled, FileId, LibraryData};
use ra_vfs::VfsTask; use ra_vfs::VfsTask;
use rustc_hash::FxHashSet; use rustc_hash::FxHashMap;
use serde::{de::DeserializeOwned, Serialize}; use serde::{de::DeserializeOwned, Serialize};
use threadpool::ThreadPool; use threadpool::ThreadPool;
@ -82,7 +82,7 @@ pub fn main_loop(
log::info!("server initialized, serving requests"); log::info!("server initialized, serving requests");
let mut pending_requests = FxHashSet::default(); let mut pending_requests = FxHashMap::default();
let mut subs = Subscriptions::new(); let mut subs = Subscriptions::new();
let main_res = main_loop_inner( let main_res = main_loop_inner(
options, options,
@ -159,7 +159,7 @@ fn main_loop_inner(
task_sender: Sender<Task>, task_sender: Sender<Task>,
task_receiver: Receiver<Task>, task_receiver: Receiver<Task>,
state: &mut ServerWorldState, state: &mut ServerWorldState,
pending_requests: &mut FxHashSet<u64>, pending_requests: &mut FxHashMap<u64, Instant>,
subs: &mut Subscriptions, subs: &mut Subscriptions,
) -> Result<()> { ) -> Result<()> {
// We try not to index more than THREADPOOL_SIZE - 3 libraries at the same // We try not to index more than THREADPOOL_SIZE - 3 libraries at the same
@ -170,8 +170,6 @@ fn main_loop_inner(
let (libdata_sender, libdata_receiver) = unbounded(); let (libdata_sender, libdata_receiver) = unbounded();
loop { loop {
let _p = profile("loop_turn");
log::trace!("selecting"); log::trace!("selecting");
let event = select! { let event = select! {
recv(msg_receiver) -> msg => match msg { recv(msg_receiver) -> msg => match msg {
@ -185,6 +183,10 @@ fn main_loop_inner(
}, },
recv(libdata_receiver) -> data => Event::Lib(data.unwrap()) recv(libdata_receiver) -> data => Event::Lib(data.unwrap())
}; };
// NOTE: don't count blocking select! call as a loop-turn time
let _p = profile("main_loop_inner/loop-turn");
let loop_start = Instant::now();
log::info!("loop turn = {:?}", event); log::info!("loop turn = {:?}", event);
let queue_count = pool.queued_count(); let queue_count = pool.queued_count();
if queue_count > 0 { if queue_count > 0 {
@ -218,7 +220,14 @@ fn main_loop_inner(
msg_sender.send(resp.into()).unwrap() msg_sender.send(resp.into()).unwrap()
} }
Err(req) => { Err(req) => {
match on_request(state, pending_requests, pool, &task_sender, req)? { match on_request(
state,
pending_requests,
pool,
&task_sender,
loop_start,
req,
)? {
None => (), None => (),
Some(req) => { Some(req) => {
log::error!("unknown request: {:?}", req); log::error!("unknown request: {:?}", req);
@ -280,10 +289,15 @@ fn main_loop_inner(
} }
} }
fn on_task(task: Task, msg_sender: &Sender<RawMessage>, pending_requests: &mut FxHashSet<u64>) { fn on_task(
task: Task,
msg_sender: &Sender<RawMessage>,
pending_requests: &mut FxHashMap<u64, Instant>,
) {
match task { match task {
Task::Respond(response) => { Task::Respond(response) => {
if pending_requests.remove(&response.id) { if let Some(request_received) = pending_requests.remove(&response.id) {
log::info!("handled req#{} in {:?}", response.id, request_received.elapsed());
msg_sender.send(response.into()).unwrap(); msg_sender.send(response.into()).unwrap();
} }
} }
@ -295,9 +309,10 @@ fn on_task(task: Task, msg_sender: &Sender<RawMessage>, pending_requests: &mut F
fn on_request( fn on_request(
world: &mut ServerWorldState, world: &mut ServerWorldState,
pending_requests: &mut FxHashSet<u64>, pending_requests: &mut FxHashMap<u64, Instant>,
pool: &ThreadPool, pool: &ThreadPool,
sender: &Sender<Task>, sender: &Sender<Task>,
request_received: Instant,
req: RawRequest, req: RawRequest,
) -> Result<Option<RawRequest>> { ) -> Result<Option<RawRequest>> {
let mut pool_dispatcher = PoolDispatcher { req: Some(req), res: None, pool, world, sender }; let mut pool_dispatcher = PoolDispatcher { req: Some(req), res: None, pool, world, sender };
@ -333,8 +348,8 @@ fn on_request(
.finish(); .finish();
match req { match req {
Ok(id) => { Ok(id) => {
let inserted = pending_requests.insert(id); let prev = pending_requests.insert(id, request_received);
assert!(inserted, "duplicate request: {}", id); assert!(prev.is_none(), "duplicate request: {}", id);
Ok(None) Ok(None)
} }
Err(req) => Ok(Some(req)), Err(req) => Ok(Some(req)),
@ -344,7 +359,7 @@ fn on_request(
fn on_notification( fn on_notification(
msg_sender: &Sender<RawMessage>, msg_sender: &Sender<RawMessage>,
state: &mut ServerWorldState, state: &mut ServerWorldState,
pending_requests: &mut FxHashSet<u64>, pending_requests: &mut FxHashMap<u64, Instant>,
subs: &mut Subscriptions, subs: &mut Subscriptions,
not: RawNotification, not: RawNotification,
) -> Result<()> { ) -> Result<()> {
@ -356,7 +371,7 @@ fn on_notification(
panic!("string id's not supported: {:?}", id); panic!("string id's not supported: {:?}", id);
} }
}; };
if pending_requests.remove(&id) { if pending_requests.remove(&id).is_some() {
let response = RawResponse::err( let response = RawResponse::err(
id, id,
ErrorCode::RequestCanceled as i32, ErrorCode::RequestCanceled as i32,
@ -434,7 +449,7 @@ impl<'a> PoolDispatcher<'a> {
let world = self.world.snapshot(); let world = self.world.snapshot();
let sender = self.sender.clone(); let sender = self.sender.clone();
self.pool.execute(move || { self.pool.execute(move || {
let resp = match f(world, params) { let response = match f(world, params) {
Ok(resp) => RawResponse::ok::<R>(id, &resp), Ok(resp) => RawResponse::ok::<R>(id, &resp),
Err(e) => match e.downcast::<LspError>() { Err(e) => match e.downcast::<LspError>() {
Ok(lsp_error) => { Ok(lsp_error) => {
@ -466,7 +481,7 @@ impl<'a> PoolDispatcher<'a> {
} }
}, },
}; };
let task = Task::Respond(resp); let task = Task::Respond(response);
sender.send(task).unwrap(); sender.send(task).unwrap();
}); });
self.res = Some(id); self.res = Some(id);