Skip to content

Commit

Permalink
now create_session uses the internal slab instance
Browse files Browse the repository at this point in the history
  • Loading branch information
Geal authored and FlorentinDUBOIS committed Jul 13, 2022
1 parent 3e6ee85 commit 72ccfe9
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 56 deletions.
11 changes: 8 additions & 3 deletions lib/src/http.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1592,16 +1592,19 @@ impl ProxyConfiguration<Session> for Proxy {
&mut self,
frontend_sock: TcpStream,
listen_token: ListenToken,
session_token: Token,
wait_time: Duration,
) -> Result<(Rc<RefCell<Session>>, bool), AcceptError> {
) -> Result<(Token, bool), AcceptError> {
if let Some(ref listener) = self.listeners.get(&Token(listen_token.0)) {
if let Err(e) = frontend_sock.set_nodelay(true) {
error!(
"error setting nodelay on front socket({:?}): {:?}",
frontend_sock, e
);
}
let mut s = self.sessions.borrow_mut();
let entry = s.vacant_entry();
let session_token = Token(entry.key());

if let Some(mut c) = Session::new(
frontend_sock,
session_token,
Expand Down Expand Up @@ -1631,7 +1634,9 @@ impl ProxyConfiguration<Session> for Proxy {
);
}

Ok((Rc::new(RefCell::new(c)), false))
let s = Rc::new(RefCell::new(c));
entry.insert(s);
Ok((session_token, false))
} else {
Err(AcceptError::TooManySessions)
}
Expand Down
11 changes: 8 additions & 3 deletions lib/src/https_openssl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1845,9 +1845,8 @@ impl ProxyConfiguration<Session> for Proxy {
&mut self,
mut frontend_sock: TcpStream,
token: ListenToken,
session_token: Token,
wait_time: Duration,
) -> Result<(Rc<RefCell<Session>>, bool), AcceptError> {
) -> Result<(Token, bool), AcceptError> {
if let Some(ref listener) = self.listeners.get(&Token(token.0)) {
if let Err(e) = frontend_sock.set_nodelay(true) {
error!(
Expand All @@ -1856,6 +1855,10 @@ impl ProxyConfiguration<Session> for Proxy {
);
}
if let Ok(ssl) = Ssl::new(&listener.default_context) {
let mut s = self.sessions.borrow_mut();
let entry = s.vacant_entry();
let session_token = Token(entry.key());

if let Err(e) = self.registry.register(
&mut frontend_sock,
session_token,
Expand Down Expand Up @@ -1886,7 +1889,9 @@ impl ProxyConfiguration<Session> for Proxy {
Duration::seconds(listener.config.request_timeout as i64),
);

Ok((Rc::new(RefCell::new(c)), false))
let s = Rc::new(RefCell::new(c));
entry.insert(s);
Ok((session_token, false))
} else {
error!("could not create ssl context");
Err(AcceptError::IoError)
Expand Down
11 changes: 8 additions & 3 deletions lib/src/https_rustls/configuration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -495,9 +495,8 @@ impl ProxyConfiguration<Session> for Proxy {
&mut self,
mut frontend_sock: TcpStream,
token: ListenToken,
session_token: Token,
wait_time: Duration,
) -> Result<(Rc<RefCell<Session>>, bool), AcceptError> {
) -> Result<(Token, bool), AcceptError> {
if let Some(ref listener) = self.listeners.get(&Token(token.0)) {
if let Err(e) = frontend_sock.set_nodelay(true) {
error!(
Expand All @@ -506,6 +505,10 @@ impl ProxyConfiguration<Session> for Proxy {
);
}

let mut s = self.sessions.borrow_mut();
let entry = s.vacant_entry();
let session_token = Token(entry.key());

if let Err(e) = self.registry.register(
&mut frontend_sock,
session_token,
Expand Down Expand Up @@ -537,7 +540,9 @@ impl ProxyConfiguration<Session> for Proxy {
Duration::seconds(listener.config.request_timeout as i64),
);

Ok((Rc::new(RefCell::new(c)), false))
let s = Rc::new(RefCell::new(c));
entry.insert(s);
Ok((session_token, false))
} else {
//FIXME
Err(AcceptError::IoError)
Expand Down
5 changes: 1 addition & 4 deletions lib/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -210,10 +210,8 @@ pub mod https_rustls;

use mio::net::TcpStream;
use mio::{Registry, Token};
use std::cell::RefCell;
use std::fmt;
use std::net::SocketAddr;
use std::rc::Rc;
use std::str;
use time::{Duration, Instant};

Expand Down Expand Up @@ -319,9 +317,8 @@ pub trait ProxyConfiguration<Session> {
&mut self,
socket: TcpStream,
token: ListenToken,
session_token: Token,
wait_time: Duration,
) -> Result<(Rc<RefCell<Session>>, bool), AcceptError>;
) -> Result<(Token, bool), AcceptError>;
}

#[derive(Debug, PartialEq, Eq)]
Expand Down
56 changes: 16 additions & 40 deletions lib/src/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1429,22 +1429,14 @@ impl Server {

//FIXME: we must handle separately the session limit since the sessions slab also has entries for listeners and backends
let index = {
let mut s = self.sessions.borrow_mut();
let entry = s.vacant_entry();
let session_token = Token(entry.key());
let index = entry.key();
match self
.tcp
.create_session(socket, token, session_token, wait_time)
{
Ok((session, should_connect)) => {
entry.insert(session);
match self.tcp.create_session(socket, token, wait_time) {
Ok((session_token, should_connect)) => {
self.nb_connections += 1;
assert!(self.nb_connections <= self.max_connections);
gauge!("client.connections", self.nb_connections);

if should_connect {
index
session_token.0
} else {
return true;
}
Expand Down Expand Up @@ -1495,15 +1487,8 @@ impl Server {
return false;
}

let mut s = self.sessions.borrow_mut();
let entry = s.vacant_entry();
let session_token = Token(entry.key());
match self
.http
.create_session(socket, token, session_token, wait_time)
{
Ok((session, _)) => {
entry.insert(session);
match self.http.create_session(socket, token, wait_time) {
Ok(_) => {
self.nb_connections += 1;
assert!(self.nb_connections <= self.max_connections);
gauge!("client.connections", self.nb_connections);
Expand Down Expand Up @@ -1551,15 +1536,8 @@ impl Server {
return false;
}

let mut s = self.sessions.borrow_mut();
let entry = s.vacant_entry();
let session_token = Token(entry.key());
match self
.https
.create_session(socket, token, session_token, wait_time)
{
Ok((session, _)) => {
entry.insert(session);
match self.https.create_session(socket, token, wait_time) {
Ok(_) => {
self.nb_connections += 1;
assert!(self.nb_connections <= self.max_connections);
gauge!("client.connections", self.nb_connections);
Expand Down Expand Up @@ -2045,16 +2023,15 @@ impl HttpsProvider {
&mut self,
frontend_sock: TcpStream,
token: ListenToken,
session_token: Token,
wait_time: Duration,
) -> Result<(Rc<RefCell<dyn ProxySessionCast>>, bool), AcceptError> {
) -> Result<(Token, bool), AcceptError> {
match self {
&mut HttpsProvider::Rustls(ref mut rustls) => rustls
.create_session(frontend_sock, token, session_token, wait_time)
.map(|(r, b)| (r as Rc<RefCell<dyn ProxySessionCast>>, b)),
&mut HttpsProvider::Openssl(ref mut openssl) => openssl
.create_session(frontend_sock, token, session_token, wait_time)
.map(|(r, b)| (r as Rc<RefCell<dyn ProxySessionCast>>, b)),
&mut HttpsProvider::Rustls(ref mut rustls) => {
rustls.create_session(frontend_sock, token, wait_time)
}
&mut HttpsProvider::Openssl(ref mut openssl) => {
openssl.create_session(frontend_sock, token, wait_time)
}
}
}

Expand Down Expand Up @@ -2138,11 +2115,10 @@ impl HttpsProvider {
&mut self,
frontend_sock: TcpStream,
token: ListenToken,
session_token: Token,
wait_time: Duration,
) -> Result<(Rc<RefCell<Session>>, bool), AcceptError> {
) -> Result<(Token, bool), AcceptError> {
let &mut HttpsProvider::Rustls(ref mut rustls) = self;
rustls.create_session(frontend_sock, token, session_token, wait_time)
rustls.create_session(frontend_sock, token, wait_time)
}

pub fn connect_to_backend(
Expand Down
12 changes: 9 additions & 3 deletions lib/src/tcp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1282,9 +1282,12 @@ impl ProxyConfiguration<Session> for Proxy {
&mut self,
frontend_sock: TcpStream,
token: ListenToken,
session_token: Token,
wait_time: Duration,
) -> Result<(Rc<RefCell<Session>>, bool), AcceptError> {
) -> Result<(Token, bool), AcceptError> {
let mut s = self.sessions.borrow_mut();
let entry = s.vacant_entry();
let session_token = Token(entry.key());

let internal_token = Token(token.0);
if let Some(listener) = self.listeners.get_mut(&internal_token) {
let mut p = (*listener.pool).borrow_mut();
Expand Down Expand Up @@ -1338,7 +1341,10 @@ impl ProxyConfiguration<Session> for Proxy {

let should_connect_backend =
proxy_protocol != Some(ProxyProtocolConfig::ExpectHeader);
Ok((Rc::new(RefCell::new(c)), should_connect_backend))

let s = Rc::new(RefCell::new(c));
entry.insert(s);
Ok((session_token, should_connect_backend))
} else {
error!("could not get buffers from pool");
Err(AcceptError::TooManySessions)
Expand Down

0 comments on commit 72ccfe9

Please sign in to comment.