pingora
pingora copied to clipboard
rwlock is locked in lb
What is the problem your feature solves, or the need it fulfills?
Rwlock is locked in lb, and I not sure it's a bug or designed.
Describe the solution you'd like
Rwlock is free in request_filter.
Additional context
pub(crate) struct LB {
pub(crate) service_book: Arc<RwLock<ServiceBook>>,
}
#[async_trait]
impl ProxyHttp for LB {
type CTX = LBContext;
fn new_ctx(&self) -> Self::CTX {
Default::default()
}
...
async fn request_filter(
&self,
session: &mut Session,
ctx: &mut Self::CTX,
) -> pingora::Result<bool>
where
Self::CTX: Send + Sync,
{
let path = session.req_header().uri.path().to_string();
// self.service_book.read().await is locked
match self.service_book.read().await.choose_service(path) {
None => {
println!("service not found");
return Ok(false);
}
Some(service) => {
service.url_rewrite(session.req_header_mut());
ctx.service_addr = Some(service.get_url());
Ok(true)
}
}
}
}
Is it really necessary to use rwlock? My project supports find a HttpPeer
and rewrite the request path without lock.
https://github.com/vicanso/pingap/blob/main/src/proxy/server.rs#L375
I'm not sure if this is relevant to the Pingora framework. This is a user defined lock. Only you can lock it. Where is write()
called for the lock?
This question has been stale for a week. It will be closed in an additional day if not updated.
This issue has been closed because it has been stalled with no activity.