* [pbs-devel] [PATCH xtermjs 0/3] update to mio 0.7 (part of tokio 1.0) @ 2021-02-01 7:55 Dominik Csapak 2021-02-01 7:55 ` [pbs-devel] [PATCH xtermjs 1/3] Cargo.toml: update mio to 0.7 and proxmox to 0.10 Dominik Csapak ` (3 more replies) 0 siblings, 4 replies; 5+ messages in thread From: Dominik Csapak @ 2021-02-01 7:55 UTC (permalink / raw) To: pbs-devel some small changes, nothing too heavy Dominik Csapak (3): Cargo.toml: update mio to 0.7 and proxmox to 0.10 update to mio 0.7 termproxy: rewrite read_ticket_line Cargo.toml | 4 +-- src/main.rs | 91 ++++++++++++++++++++++++++++++----------------------- 2 files changed, 54 insertions(+), 41 deletions(-) -- 2.20.1 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [pbs-devel] [PATCH xtermjs 1/3] Cargo.toml: update mio to 0.7 and proxmox to 0.10 2021-02-01 7:55 [pbs-devel] [PATCH xtermjs 0/3] update to mio 0.7 (part of tokio 1.0) Dominik Csapak @ 2021-02-01 7:55 ` Dominik Csapak 2021-02-01 7:55 ` [pbs-devel] [PATCH xtermjs 2/3] update to mio 0.7 Dominik Csapak ` (2 subsequent siblings) 3 siblings, 0 replies; 5+ messages in thread From: Dominik Csapak @ 2021-02-01 7:55 UTC (permalink / raw) To: pbs-devel Signed-off-by: Dominik Csapak <d.csapak@proxmox.com> --- Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index baaa075..8b28453 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ license = "AGPL-3" exclude = [ "build", "debian" ] [dependencies] -mio = "0.6" +mio = { version = "0.7", features = [ "net", "os-ext" ] } curl = "0.4" clap = "2.33" -proxmox = { version = "0.8.0", default-features = false } +proxmox = { version = "0.10.0", default-features = false } -- 2.20.1 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [pbs-devel] [PATCH xtermjs 2/3] update to mio 0.7 2021-02-01 7:55 [pbs-devel] [PATCH xtermjs 0/3] update to mio 0.7 (part of tokio 1.0) Dominik Csapak 2021-02-01 7:55 ` [pbs-devel] [PATCH xtermjs 1/3] Cargo.toml: update mio to 0.7 and proxmox to 0.10 Dominik Csapak @ 2021-02-01 7:55 ` Dominik Csapak 2021-02-01 7:55 ` [pbs-devel] [PATCH xtermjs 3/3] termproxy: rewrite read_ticket_line Dominik Csapak 2021-02-02 12:10 ` [pbs-devel] applied-series: [PATCH xtermjs 0/3] update to mio 0.7 (part of tokio 1.0) Fabian Grünbichler 3 siblings, 0 replies; 5+ messages in thread From: Dominik Csapak @ 2021-02-01 7:55 UTC (permalink / raw) To: pbs-devel notable changes: * all polls in mio are now edge triggered, so no need for PollOpt, etc. * functionality of UnixReady is now in the mio::Event directly (UnixReady::is_hup -> event.is_read_closed()) * TcpListener::from_std() is not a result anymore * EventedFd -> SourceFd * mio::net::TcpListener cannot accept_std anymore, so convert everywhere to mio::net::TcpStream, drop set_read_timeout (this warrants another patch) Signed-off-by: Dominik Csapak <d.csapak@proxmox.com> --- src/main.rs | 48 ++++++++++++++++++++---------------------------- 1 file changed, 20 insertions(+), 28 deletions(-) diff --git a/src/main.rs b/src/main.rs index 12e70bc..07fa1a8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,7 +2,6 @@ use std::cmp::min; use std::collections::HashMap; use std::ffi::{OsStr, OsString}; use std::io::{ErrorKind, Result, Write}; -use std::net::TcpStream; use std::os::unix::io::{AsRawFd, FromRawFd}; use std::os::unix::process::CommandExt; use std::process::Command; @@ -10,9 +9,9 @@ use std::time::{Duration, Instant}; use clap::{App, AppSettings, Arg}; use curl::easy::Easy; -use mio::net::TcpListener; -use mio::unix::{EventedFd, UnixReady}; -use mio::{Events, Poll, PollOpt, Ready, Token}; +use mio::net::{TcpListener, TcpStream}; +use mio::{Events, Poll, Token, Interest}; +use mio::unix::SourceFd; use proxmox::sys::error::io_err_other; use proxmox::sys::linux::pty::{make_controlling_terminal, PTY}; @@ -98,7 +97,6 @@ fn read_ticket_line( if buf.is_full() || now.elapsed() >= timeout { io_bail!("authentication data is incomplete: {:?}", &buf[..]); } - stream.set_read_timeout(Some(Duration::new(1, 0)))?; match buf.read_from(stream) { Ok(n) => { if n == 0 { @@ -110,7 +108,6 @@ fn read_ticket_line( } } - stream.set_read_timeout(None)?; let newline_idx = &buf[..].iter().position(|&x| x == b'\n').unwrap(); let line = buf.remove_data(*newline_idx); @@ -182,10 +179,10 @@ fn listen_and_accept( std::net::TcpListener::bind((hostname, port as u16))? }; let port = listener.local_addr()?.port(); - let listener = TcpListener::from_std(listener)?; - let poll = Poll::new()?; + let mut listener = TcpListener::from_std(listener); + let mut poll = Poll::new()?; - poll.register(&listener, Token(0), Ready::readable(), PollOpt::edge())?; + poll.registry().register(&mut listener, Token(0), Interest::READABLE)?; let mut events = Events::with_capacity(1); @@ -195,7 +192,7 @@ fn listen_and_accept( poll.poll(&mut events, Some(timeout))?; let elapsed = now.elapsed(); if !events.is_empty() { - let (stream, client) = listener.accept_std()?; + let (stream, client) = listener.accept()?; println!("client connection: {:?}", client); return Ok((stream, port)); } @@ -287,34 +284,30 @@ fn do_main() -> Result<()> { return Err(io_format_err!("Invalid FD number")); } - let (mut stream, port) = + let (mut tcp_handle, port) = listen_and_accept("localhost", port, use_port_as_fd, Duration::new(10, 0)) .map_err(|err| io_format_err!("failed waiting for client: {}", err))?; - let (username, ticket) = read_ticket_line(&mut stream, &mut pty_buf, Duration::new(10, 0)) + let (username, ticket) = read_ticket_line(&mut tcp_handle, &mut pty_buf, Duration::new(10, 0)) .map_err(|err| io_format_err!("failed reading ticket: {}", err))?; let port = if use_port_as_fd { Some(port) } else { None }; authenticate(&username, &ticket, path, perm, authport, port)?; - stream.write_all(b"OK").expect("error writing response"); + tcp_handle.write_all(b"OK").expect("error writing response"); - let mut tcp_handle = mio::net::TcpStream::from_stream(stream)?; - - let poll = Poll::new()?; + let mut poll = Poll::new()?; let mut events = Events::with_capacity(128); let mut pty = run_pty(cmd, cmdparams)?; - poll.register( - &tcp_handle, + poll.registry().register( + &mut tcp_handle, TCP, - Ready::readable() | Ready::writable() | UnixReady::hup(), - PollOpt::edge(), + Interest::READABLE.add(Interest::WRITABLE) )?; - poll.register( - &EventedFd(&pty.as_raw_fd()), + poll.registry().register( + &mut SourceFd(&pty.as_raw_fd()), PTY, - Ready::readable() | Ready::writable() | UnixReady::hup(), - PollOpt::edge(), + Interest::READABLE.add(Interest::WRITABLE) )?; let mut tcp_writable = true; @@ -332,10 +325,9 @@ fn do_main() -> Result<()> { } for event in &events { - let readiness = event.readiness(); - let writable = readiness.is_writable(); - let readable = readiness.is_readable(); - if UnixReady::from(readiness).is_hup() { + let writable = event.is_writable(); + let readable = event.is_readable(); + if event.is_read_closed() { finished = true; } match event.token() { -- 2.20.1 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [pbs-devel] [PATCH xtermjs 3/3] termproxy: rewrite read_ticket_line 2021-02-01 7:55 [pbs-devel] [PATCH xtermjs 0/3] update to mio 0.7 (part of tokio 1.0) Dominik Csapak 2021-02-01 7:55 ` [pbs-devel] [PATCH xtermjs 1/3] Cargo.toml: update mio to 0.7 and proxmox to 0.10 Dominik Csapak 2021-02-01 7:55 ` [pbs-devel] [PATCH xtermjs 2/3] update to mio 0.7 Dominik Csapak @ 2021-02-01 7:55 ` Dominik Csapak 2021-02-02 12:10 ` [pbs-devel] applied-series: [PATCH xtermjs 0/3] update to mio 0.7 (part of tokio 1.0) Fabian Grünbichler 3 siblings, 0 replies; 5+ messages in thread From: Dominik Csapak @ 2021-02-01 7:55 UTC (permalink / raw) To: pbs-devel since we cannot accept a std TcpStream from a mio::net::TcpListener anymore, we cannot use set_read_timeout here instead implement the readloop as a mio poll loop similar to listen_and_accept, otherwise termproxy will busy loop and consume 100% of a single core during authentication Signed-off-by: Dominik Csapak <d.csapak@proxmox.com> --- src/main.rs | 43 ++++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/src/main.rs b/src/main.rs index 07fa1a8..21bd066 100644 --- a/src/main.rs +++ b/src/main.rs @@ -92,19 +92,40 @@ fn read_ticket_line( buf: &mut ByteBuffer, timeout: Duration, ) -> TicketResult { - let now = Instant::now(); - while !&buf[..].contains(&b'\n') { - if buf.is_full() || now.elapsed() >= timeout { - io_bail!("authentication data is incomplete: {:?}", &buf[..]); - } - match buf.read_from(stream) { - Ok(n) => { - if n == 0 { - io_bail!("connection closed before authentication"); + + let mut poll = Poll::new()?; + poll.registry().register(stream, Token(0), Interest::READABLE)?; + let mut events = Events::with_capacity(1); + let mut timeout = timeout; + + loop { + let now = Instant::now(); + poll.poll(&mut events, Some(timeout))?; + let elapsed = now.elapsed(); + if !events.is_empty() { + match buf.read_from(stream) { + Ok(n) => { + if n == 0 { + io_bail!("connection closed before authentication"); + } } + Err(err) if err.kind() == ErrorKind::WouldBlock => {} + Err(err) => return Err(err), } - Err(err) if err.kind() == ErrorKind::WouldBlock => {} - Err(err) => return Err(err), + + if buf[..].contains(&b'\n') { + break; + } + + if buf.is_full() { + io_bail!("authentication data is incomplete: {:?}", &buf[..]); + } + } + + if timeout >= elapsed { + timeout -= elapsed; + } else { + io_bail!("timed out"); } } -- 2.20.1 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [pbs-devel] applied-series: [PATCH xtermjs 0/3] update to mio 0.7 (part of tokio 1.0) 2021-02-01 7:55 [pbs-devel] [PATCH xtermjs 0/3] update to mio 0.7 (part of tokio 1.0) Dominik Csapak ` (2 preceding siblings ...) 2021-02-01 7:55 ` [pbs-devel] [PATCH xtermjs 3/3] termproxy: rewrite read_ticket_line Dominik Csapak @ 2021-02-02 12:10 ` Fabian Grünbichler 3 siblings, 0 replies; 5+ messages in thread From: Fabian Grünbichler @ 2021-02-02 12:10 UTC (permalink / raw) To: Proxmox Backup Server development discussion with a small followup regrading timeout handling for accept and auth, as well as a little style/formatting. On February 1, 2021 8:55 am, Dominik Csapak wrote: > some small changes, nothing too heavy > > Dominik Csapak (3): > Cargo.toml: update mio to 0.7 and proxmox to 0.10 > update to mio 0.7 > termproxy: rewrite read_ticket_line > > Cargo.toml | 4 +-- > src/main.rs | 91 ++++++++++++++++++++++++++++++----------------------- > 2 files changed, 54 insertions(+), 41 deletions(-) > > -- > 2.20.1 > > > > _______________________________________________ > pbs-devel mailing list > pbs-devel@lists.proxmox.com > https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel > > > ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2021-02-02 12:10 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-02-01 7:55 [pbs-devel] [PATCH xtermjs 0/3] update to mio 0.7 (part of tokio 1.0) Dominik Csapak 2021-02-01 7:55 ` [pbs-devel] [PATCH xtermjs 1/3] Cargo.toml: update mio to 0.7 and proxmox to 0.10 Dominik Csapak 2021-02-01 7:55 ` [pbs-devel] [PATCH xtermjs 2/3] update to mio 0.7 Dominik Csapak 2021-02-01 7:55 ` [pbs-devel] [PATCH xtermjs 3/3] termproxy: rewrite read_ticket_line Dominik Csapak 2021-02-02 12:10 ` [pbs-devel] applied-series: [PATCH xtermjs 0/3] update to mio 0.7 (part of tokio 1.0) Fabian Grünbichler
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.Service provided by Proxmox Server Solutions GmbH | Privacy | Legal