mirror of
https://github.com/neondatabase/neon.git
synced 2025-12-22 21:59:59 +00:00
Upgrade proxy crates to edition 2024 (#10942)
This upgrades the `proxy/` crate as well as the forked libraries in `libs/proxy/` to edition 2024. Also reformats the imports of those forked libraries via: ``` cargo +nightly fmt -p proxy -p postgres-protocol2 -p postgres-types2 -p tokio-postgres2 -- -l --config imports_granularity=Module,group_imports=StdExternalCrate,reorder_imports=true ``` It can be read commit-by-commit: the first commit has no formatting changes, only changes to accomodate the new edition. Part of #10918
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "postgres-protocol2"
|
name = "postgres-protocol2"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2024"
|
||||||
license = "MIT/Apache-2.0"
|
license = "MIT/Apache-2.0"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|||||||
@@ -1,14 +1,12 @@
|
|||||||
//! SASL-based authentication support.
|
//! SASL-based authentication support.
|
||||||
|
|
||||||
|
use std::fmt::Write;
|
||||||
|
use std::{io, iter, mem, str};
|
||||||
|
|
||||||
use hmac::{Hmac, Mac};
|
use hmac::{Hmac, Mac};
|
||||||
use rand::{self, Rng};
|
use rand::{self, Rng};
|
||||||
use sha2::digest::FixedOutput;
|
use sha2::digest::FixedOutput;
|
||||||
use sha2::{Digest, Sha256};
|
use sha2::{Digest, Sha256};
|
||||||
use std::fmt::Write;
|
|
||||||
use std::io;
|
|
||||||
use std::iter;
|
|
||||||
use std::mem;
|
|
||||||
use std::str;
|
|
||||||
use tokio::task::yield_now;
|
use tokio::task::yield_now;
|
||||||
|
|
||||||
const NONCE_LENGTH: usize = 24;
|
const NONCE_LENGTH: usize = 24;
|
||||||
@@ -493,11 +491,9 @@ mod test {
|
|||||||
let nonce = "9IZ2O01zb9IgiIZ1WJ/zgpJB";
|
let nonce = "9IZ2O01zb9IgiIZ1WJ/zgpJB";
|
||||||
|
|
||||||
let client_first = "n,,n=,r=9IZ2O01zb9IgiIZ1WJ/zgpJB";
|
let client_first = "n,,n=,r=9IZ2O01zb9IgiIZ1WJ/zgpJB";
|
||||||
let server_first =
|
let server_first = "r=9IZ2O01zb9IgiIZ1WJ/zgpJBjx/oIRLs02gGSHcw1KEty3eY,s=fs3IXBy7U7+IvVjZ,i\
|
||||||
"r=9IZ2O01zb9IgiIZ1WJ/zgpJBjx/oIRLs02gGSHcw1KEty3eY,s=fs3IXBy7U7+IvVjZ,i\
|
|
||||||
=4096";
|
=4096";
|
||||||
let client_final =
|
let client_final = "c=biws,r=9IZ2O01zb9IgiIZ1WJ/zgpJBjx/oIRLs02gGSHcw1KEty3eY,p=AmNKosjJzS3\
|
||||||
"c=biws,r=9IZ2O01zb9IgiIZ1WJ/zgpJBjx/oIRLs02gGSHcw1KEty3eY,p=AmNKosjJzS3\
|
|
||||||
1NTlQYNs5BTeQjdHdk7lOflDo5re2an8=";
|
1NTlQYNs5BTeQjdHdk7lOflDo5re2an8=";
|
||||||
let server_final = "v=U+ppxD5XUKtradnv8e2MkeupiA8FU87Sg8CXzXHDAzw=";
|
let server_final = "v=U+ppxD5XUKtradnv8e2MkeupiA8FU87Sg8CXzXHDAzw=";
|
||||||
|
|
||||||
|
|||||||
@@ -11,9 +11,10 @@
|
|||||||
//! set to `UTF8`. It will most likely not behave properly if that is not the case.
|
//! set to `UTF8`. It will most likely not behave properly if that is not the case.
|
||||||
#![warn(missing_docs, clippy::all)]
|
#![warn(missing_docs, clippy::all)]
|
||||||
|
|
||||||
|
use std::io;
|
||||||
|
|
||||||
use byteorder::{BigEndian, ByteOrder};
|
use byteorder::{BigEndian, ByteOrder};
|
||||||
use bytes::{BufMut, BytesMut};
|
use bytes::{BufMut, BytesMut};
|
||||||
use std::io;
|
|
||||||
|
|
||||||
pub mod authentication;
|
pub mod authentication;
|
||||||
pub mod escape;
|
pub mod escape;
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
#![allow(missing_docs)]
|
#![allow(missing_docs)]
|
||||||
|
|
||||||
|
use std::io::{self, Read};
|
||||||
|
use std::ops::Range;
|
||||||
|
use std::{cmp, str};
|
||||||
|
|
||||||
use byteorder::{BigEndian, ByteOrder, ReadBytesExt};
|
use byteorder::{BigEndian, ByteOrder, ReadBytesExt};
|
||||||
use bytes::{Bytes, BytesMut};
|
use bytes::{Bytes, BytesMut};
|
||||||
use fallible_iterator::FallibleIterator;
|
use fallible_iterator::FallibleIterator;
|
||||||
use memchr::memchr;
|
use memchr::memchr;
|
||||||
use std::cmp;
|
|
||||||
use std::io::{self, Read};
|
|
||||||
use std::ops::Range;
|
|
||||||
use std::str;
|
|
||||||
|
|
||||||
use crate::Oid;
|
use crate::Oid;
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
//! Frontend message serialization.
|
//! Frontend message serialization.
|
||||||
#![allow(missing_docs)]
|
#![allow(missing_docs)]
|
||||||
|
|
||||||
|
use std::error::Error;
|
||||||
|
use std::{io, marker};
|
||||||
|
|
||||||
use byteorder::{BigEndian, ByteOrder};
|
use byteorder::{BigEndian, ByteOrder};
|
||||||
use bytes::{Buf, BufMut, BytesMut};
|
use bytes::{Buf, BufMut, BytesMut};
|
||||||
use std::error::Error;
|
|
||||||
use std::io;
|
|
||||||
use std::marker;
|
|
||||||
|
|
||||||
use crate::{write_nullable, FromUsize, IsNull, Oid};
|
use crate::{FromUsize, IsNull, Oid, write_nullable};
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn write_body<F, E>(buf: &mut BytesMut, f: F) -> Result<(), E>
|
fn write_body<F, E>(buf: &mut BytesMut, f: F) -> Result<(), E>
|
||||||
|
|||||||
@@ -6,12 +6,13 @@
|
|||||||
//! side. This is good because it ensures the cleartext password won't
|
//! side. This is good because it ensures the cleartext password won't
|
||||||
//! end up in logs pg_stat displays, etc.
|
//! end up in logs pg_stat displays, etc.
|
||||||
|
|
||||||
use crate::authentication::sasl;
|
|
||||||
use hmac::{Hmac, Mac};
|
use hmac::{Hmac, Mac};
|
||||||
use rand::RngCore;
|
use rand::RngCore;
|
||||||
use sha2::digest::FixedOutput;
|
use sha2::digest::FixedOutput;
|
||||||
use sha2::{Digest, Sha256};
|
use sha2::{Digest, Sha256};
|
||||||
|
|
||||||
|
use crate::authentication::sasl;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test;
|
mod test;
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
//! Conversions to and from Postgres's binary format for various types.
|
//! Conversions to and from Postgres's binary format for various types.
|
||||||
use byteorder::{BigEndian, ReadBytesExt};
|
|
||||||
use bytes::{BufMut, BytesMut};
|
|
||||||
use fallible_iterator::FallibleIterator;
|
|
||||||
use std::boxed::Box as StdBox;
|
use std::boxed::Box as StdBox;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::str;
|
use std::str;
|
||||||
|
|
||||||
|
use byteorder::{BigEndian, ReadBytesExt};
|
||||||
|
use bytes::{BufMut, BytesMut};
|
||||||
|
use fallible_iterator::FallibleIterator;
|
||||||
|
|
||||||
use crate::Oid;
|
use crate::Oid;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "postgres-types2"
|
name = "postgres-types2"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2024"
|
||||||
license = "MIT/Apache-2.0"
|
license = "MIT/Apache-2.0"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|||||||
@@ -4,19 +4,18 @@
|
|||||||
//! unless you want to define your own `ToSql` or `FromSql` definitions.
|
//! unless you want to define your own `ToSql` or `FromSql` definitions.
|
||||||
#![warn(clippy::all, missing_docs)]
|
#![warn(clippy::all, missing_docs)]
|
||||||
|
|
||||||
use fallible_iterator::FallibleIterator;
|
|
||||||
use postgres_protocol2::types;
|
|
||||||
use std::any::type_name;
|
use std::any::type_name;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use crate::type_gen::{Inner, Other};
|
use bytes::BytesMut;
|
||||||
|
use fallible_iterator::FallibleIterator;
|
||||||
#[doc(inline)]
|
#[doc(inline)]
|
||||||
pub use postgres_protocol2::Oid;
|
pub use postgres_protocol2::Oid;
|
||||||
|
use postgres_protocol2::types;
|
||||||
|
|
||||||
use bytes::BytesMut;
|
use crate::type_gen::{Inner, Other};
|
||||||
|
|
||||||
/// Generates a simple implementation of `ToSql::accepts` which accepts the
|
/// Generates a simple implementation of `ToSql::accepts` which accepts the
|
||||||
/// types passed to it.
|
/// types passed to it.
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
use crate::{FromSql, Type};
|
|
||||||
pub use bytes::BytesMut;
|
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
|
|
||||||
|
pub use bytes::BytesMut;
|
||||||
|
|
||||||
|
use crate::{FromSql, Type};
|
||||||
|
|
||||||
pub fn read_be_i32(buf: &mut &[u8]) -> Result<i32, Box<dyn Error + Sync + Send>> {
|
pub fn read_be_i32(buf: &mut &[u8]) -> Result<i32, Box<dyn Error + Sync + Send>> {
|
||||||
if buf.len() < 4 {
|
if buf.len() < 4 {
|
||||||
return Err("invalid buffer size".into());
|
return Err("invalid buffer size".into());
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "tokio-postgres2"
|
name = "tokio-postgres2"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2024"
|
||||||
license = "MIT/Apache-2.0"
|
license = "MIT/Apache-2.0"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
|
use std::io;
|
||||||
|
|
||||||
use tokio::net::TcpStream;
|
use tokio::net::TcpStream;
|
||||||
|
|
||||||
use crate::client::SocketConfig;
|
use crate::client::SocketConfig;
|
||||||
use crate::config::{Host, SslMode};
|
use crate::config::{Host, SslMode};
|
||||||
use crate::tls::MakeTlsConnect;
|
use crate::tls::MakeTlsConnect;
|
||||||
use crate::{cancel_query_raw, connect_socket, Error};
|
use crate::{Error, cancel_query_raw, connect_socket};
|
||||||
use std::io;
|
|
||||||
|
|
||||||
pub(crate) async fn cancel_query<T>(
|
pub(crate) async fn cancel_query<T>(
|
||||||
config: Option<SocketConfig>,
|
config: Option<SocketConfig>,
|
||||||
@@ -22,7 +23,7 @@ where
|
|||||||
return Err(Error::connect(io::Error::new(
|
return Err(Error::connect(io::Error::new(
|
||||||
io::ErrorKind::InvalidInput,
|
io::ErrorKind::InvalidInput,
|
||||||
"unknown host",
|
"unknown host",
|
||||||
)))
|
)));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
use crate::config::SslMode;
|
|
||||||
use crate::tls::TlsConnect;
|
|
||||||
use crate::{connect_tls, Error};
|
|
||||||
use bytes::BytesMut;
|
use bytes::BytesMut;
|
||||||
use postgres_protocol2::message::frontend;
|
use postgres_protocol2::message::frontend;
|
||||||
use tokio::io::{AsyncRead, AsyncWrite, AsyncWriteExt};
|
use tokio::io::{AsyncRead, AsyncWrite, AsyncWriteExt};
|
||||||
|
|
||||||
|
use crate::config::SslMode;
|
||||||
|
use crate::tls::TlsConnect;
|
||||||
|
use crate::{Error, connect_tls};
|
||||||
|
|
||||||
pub async fn cancel_query_raw<S, T>(
|
pub async fn cancel_query_raw<S, T>(
|
||||||
stream: S,
|
stream: S,
|
||||||
mode: SslMode,
|
mode: SslMode,
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
use crate::config::SslMode;
|
|
||||||
use crate::tls::TlsConnect;
|
|
||||||
|
|
||||||
use crate::{cancel_query, client::SocketConfig, tls::MakeTlsConnect};
|
|
||||||
use crate::{cancel_query_raw, Error};
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use tokio::io::{AsyncRead, AsyncWrite};
|
use tokio::io::{AsyncRead, AsyncWrite};
|
||||||
use tokio::net::TcpStream;
|
use tokio::net::TcpStream;
|
||||||
|
|
||||||
|
use crate::client::SocketConfig;
|
||||||
|
use crate::config::SslMode;
|
||||||
|
use crate::tls::{MakeTlsConnect, TlsConnect};
|
||||||
|
use crate::{Error, cancel_query, cancel_query_raw};
|
||||||
|
|
||||||
/// The capability to request cancellation of in-progress queries on a
|
/// The capability to request cancellation of in-progress queries on a
|
||||||
/// connection.
|
/// connection.
|
||||||
#[derive(Clone, Serialize, Deserialize)]
|
#[derive(Clone, Serialize, Deserialize)]
|
||||||
|
|||||||
@@ -1,31 +1,28 @@
|
|||||||
use crate::codec::{BackendMessages, FrontendMessage};
|
|
||||||
|
|
||||||
use crate::config::Host;
|
|
||||||
use crate::config::SslMode;
|
|
||||||
use crate::connection::{Request, RequestMessages};
|
|
||||||
|
|
||||||
use crate::query::RowStream;
|
|
||||||
use crate::simple_query::SimpleQueryStream;
|
|
||||||
|
|
||||||
use crate::types::{Oid, ToSql, Type};
|
|
||||||
|
|
||||||
use crate::{
|
|
||||||
query, simple_query, slice_iter, CancelToken, Error, ReadyForQueryStatus, Row,
|
|
||||||
SimpleQueryMessage, Statement, Transaction, TransactionBuilder,
|
|
||||||
};
|
|
||||||
use bytes::BytesMut;
|
|
||||||
use fallible_iterator::FallibleIterator;
|
|
||||||
use futures_util::{future, ready, TryStreamExt};
|
|
||||||
use parking_lot::Mutex;
|
|
||||||
use postgres_protocol2::message::{backend::Message, frontend};
|
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::task::{Context, Poll};
|
use std::task::{Context, Poll};
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
use bytes::BytesMut;
|
||||||
|
use fallible_iterator::FallibleIterator;
|
||||||
|
use futures_util::{TryStreamExt, future, ready};
|
||||||
|
use parking_lot::Mutex;
|
||||||
|
use postgres_protocol2::message::backend::Message;
|
||||||
|
use postgres_protocol2::message::frontend;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
use tokio::sync::mpsc;
|
use tokio::sync::mpsc;
|
||||||
|
|
||||||
use std::time::Duration;
|
use crate::codec::{BackendMessages, FrontendMessage};
|
||||||
|
use crate::config::{Host, SslMode};
|
||||||
|
use crate::connection::{Request, RequestMessages};
|
||||||
|
use crate::query::RowStream;
|
||||||
|
use crate::simple_query::SimpleQueryStream;
|
||||||
|
use crate::types::{Oid, ToSql, Type};
|
||||||
|
use crate::{
|
||||||
|
CancelToken, Error, ReadyForQueryStatus, Row, SimpleQueryMessage, Statement, Transaction,
|
||||||
|
TransactionBuilder, query, simple_query, slice_iter,
|
||||||
|
};
|
||||||
|
|
||||||
pub struct Responses {
|
pub struct Responses {
|
||||||
receiver: mpsc::Receiver<BackendMessages>,
|
receiver: mpsc::Receiver<BackendMessages>,
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
|
use std::io;
|
||||||
|
|
||||||
use bytes::{Buf, Bytes, BytesMut};
|
use bytes::{Buf, Bytes, BytesMut};
|
||||||
use fallible_iterator::FallibleIterator;
|
use fallible_iterator::FallibleIterator;
|
||||||
use postgres_protocol2::message::backend;
|
use postgres_protocol2::message::backend;
|
||||||
use postgres_protocol2::message::frontend::CopyData;
|
use postgres_protocol2::message::frontend::CopyData;
|
||||||
use std::io;
|
|
||||||
use tokio_util::codec::{Decoder, Encoder};
|
use tokio_util::codec::{Decoder, Encoder};
|
||||||
|
|
||||||
pub enum FrontendMessage {
|
pub enum FrontendMessage {
|
||||||
|
|||||||
@@ -1,21 +1,19 @@
|
|||||||
//! Connection configuration.
|
//! Connection configuration.
|
||||||
|
|
||||||
use crate::connect::connect;
|
|
||||||
use crate::connect_raw::connect_raw;
|
|
||||||
use crate::connect_raw::RawConnection;
|
|
||||||
use crate::tls::MakeTlsConnect;
|
|
||||||
use crate::tls::TlsConnect;
|
|
||||||
use crate::{Client, Connection, Error};
|
|
||||||
use postgres_protocol2::message::frontend::StartupMessageParams;
|
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
use std::fmt;
|
|
||||||
use std::str;
|
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use tokio::io::{AsyncRead, AsyncWrite};
|
use std::{fmt, str};
|
||||||
|
|
||||||
pub use postgres_protocol2::authentication::sasl::ScramKeys;
|
pub use postgres_protocol2::authentication::sasl::ScramKeys;
|
||||||
|
use postgres_protocol2::message::frontend::StartupMessageParams;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use tokio::io::{AsyncRead, AsyncWrite};
|
||||||
use tokio::net::TcpStream;
|
use tokio::net::TcpStream;
|
||||||
|
|
||||||
|
use crate::connect::connect;
|
||||||
|
use crate::connect_raw::{RawConnection, connect_raw};
|
||||||
|
use crate::tls::{MakeTlsConnect, TlsConnect};
|
||||||
|
use crate::{Client, Connection, Error};
|
||||||
|
|
||||||
/// TLS configuration.
|
/// TLS configuration.
|
||||||
#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
#[non_exhaustive]
|
#[non_exhaustive]
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
use postgres_protocol2::message::backend::Message;
|
||||||
|
use tokio::net::TcpStream;
|
||||||
|
use tokio::sync::mpsc;
|
||||||
|
|
||||||
use crate::client::SocketConfig;
|
use crate::client::SocketConfig;
|
||||||
use crate::codec::BackendMessage;
|
use crate::codec::BackendMessage;
|
||||||
use crate::config::Host;
|
use crate::config::Host;
|
||||||
@@ -5,9 +9,6 @@ use crate::connect_raw::connect_raw;
|
|||||||
use crate::connect_socket::connect_socket;
|
use crate::connect_socket::connect_socket;
|
||||||
use crate::tls::{MakeTlsConnect, TlsConnect};
|
use crate::tls::{MakeTlsConnect, TlsConnect};
|
||||||
use crate::{Client, Config, Connection, Error, RawConnection};
|
use crate::{Client, Config, Connection, Error, RawConnection};
|
||||||
use postgres_protocol2::message::backend::Message;
|
|
||||||
use tokio::net::TcpStream;
|
|
||||||
use tokio::sync::mpsc;
|
|
||||||
|
|
||||||
pub async fn connect<T>(
|
pub async fn connect<T>(
|
||||||
mut tls: T,
|
mut tls: T,
|
||||||
|
|||||||
@@ -1,22 +1,24 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
use std::io;
|
||||||
|
use std::pin::Pin;
|
||||||
|
use std::task::{Context, Poll};
|
||||||
|
|
||||||
|
use bytes::BytesMut;
|
||||||
|
use fallible_iterator::FallibleIterator;
|
||||||
|
use futures_util::{Sink, SinkExt, Stream, TryStreamExt, ready};
|
||||||
|
use postgres_protocol2::authentication::sasl;
|
||||||
|
use postgres_protocol2::authentication::sasl::ScramSha256;
|
||||||
|
use postgres_protocol2::message::backend::{AuthenticationSaslBody, Message, NoticeResponseBody};
|
||||||
|
use postgres_protocol2::message::frontend;
|
||||||
|
use tokio::io::{AsyncRead, AsyncWrite};
|
||||||
|
use tokio_util::codec::Framed;
|
||||||
|
|
||||||
|
use crate::Error;
|
||||||
use crate::codec::{BackendMessage, BackendMessages, FrontendMessage, PostgresCodec};
|
use crate::codec::{BackendMessage, BackendMessages, FrontendMessage, PostgresCodec};
|
||||||
use crate::config::{self, AuthKeys, Config};
|
use crate::config::{self, AuthKeys, Config};
|
||||||
use crate::connect_tls::connect_tls;
|
use crate::connect_tls::connect_tls;
|
||||||
use crate::maybe_tls_stream::MaybeTlsStream;
|
use crate::maybe_tls_stream::MaybeTlsStream;
|
||||||
use crate::tls::{TlsConnect, TlsStream};
|
use crate::tls::{TlsConnect, TlsStream};
|
||||||
use crate::Error;
|
|
||||||
use bytes::BytesMut;
|
|
||||||
use fallible_iterator::FallibleIterator;
|
|
||||||
use futures_util::{ready, Sink, SinkExt, Stream, TryStreamExt};
|
|
||||||
use postgres_protocol2::authentication::sasl;
|
|
||||||
use postgres_protocol2::authentication::sasl::ScramSha256;
|
|
||||||
use postgres_protocol2::message::backend::{AuthenticationSaslBody, Message, NoticeResponseBody};
|
|
||||||
use postgres_protocol2::message::frontend;
|
|
||||||
use std::collections::HashMap;
|
|
||||||
use std::io;
|
|
||||||
use std::pin::Pin;
|
|
||||||
use std::task::{Context, Poll};
|
|
||||||
use tokio::io::{AsyncRead, AsyncWrite};
|
|
||||||
use tokio_util::codec::Framed;
|
|
||||||
|
|
||||||
pub struct StartupStream<S, T> {
|
pub struct StartupStream<S, T> {
|
||||||
inner: Framed<MaybeTlsStream<S, T>, PostgresCodec>,
|
inner: Framed<MaybeTlsStream<S, T>, PostgresCodec>,
|
||||||
@@ -158,7 +160,7 @@ where
|
|||||||
| Some(Message::AuthenticationSspi) => {
|
| Some(Message::AuthenticationSspi) => {
|
||||||
return Err(Error::authentication(
|
return Err(Error::authentication(
|
||||||
"unsupported authentication method".into(),
|
"unsupported authentication method".into(),
|
||||||
))
|
));
|
||||||
}
|
}
|
||||||
Some(Message::ErrorResponse(body)) => return Err(Error::db(body)),
|
Some(Message::ErrorResponse(body)) => return Err(Error::db(body)),
|
||||||
Some(_) => return Err(Error::unexpected_message()),
|
Some(_) => return Err(Error::unexpected_message()),
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
use crate::config::Host;
|
|
||||||
use crate::Error;
|
|
||||||
use std::future::Future;
|
use std::future::Future;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use tokio::net::{self, TcpStream};
|
use tokio::net::{self, TcpStream};
|
||||||
use tokio::time;
|
use tokio::time;
|
||||||
|
|
||||||
|
use crate::Error;
|
||||||
|
use crate::config::Host;
|
||||||
|
|
||||||
pub(crate) async fn connect_socket(
|
pub(crate) async fn connect_socket(
|
||||||
host: &Host,
|
host: &Host,
|
||||||
port: u16,
|
port: u16,
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
use crate::config::SslMode;
|
|
||||||
use crate::maybe_tls_stream::MaybeTlsStream;
|
|
||||||
use crate::tls::private::ForcePrivateApi;
|
|
||||||
use crate::tls::TlsConnect;
|
|
||||||
use crate::Error;
|
|
||||||
use bytes::BytesMut;
|
use bytes::BytesMut;
|
||||||
use postgres_protocol2::message::frontend;
|
use postgres_protocol2::message::frontend;
|
||||||
use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt};
|
use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt};
|
||||||
|
|
||||||
|
use crate::Error;
|
||||||
|
use crate::config::SslMode;
|
||||||
|
use crate::maybe_tls_stream::MaybeTlsStream;
|
||||||
|
use crate::tls::TlsConnect;
|
||||||
|
use crate::tls::private::ForcePrivateApi;
|
||||||
|
|
||||||
pub async fn connect_tls<S, T>(
|
pub async fn connect_tls<S, T>(
|
||||||
mut stream: S,
|
mut stream: S,
|
||||||
mode: SslMode,
|
mode: SslMode,
|
||||||
@@ -19,7 +20,7 @@ where
|
|||||||
match mode {
|
match mode {
|
||||||
SslMode::Disable => return Ok(MaybeTlsStream::Raw(stream)),
|
SslMode::Disable => return Ok(MaybeTlsStream::Raw(stream)),
|
||||||
SslMode::Prefer if !tls.can_connect(ForcePrivateApi) => {
|
SslMode::Prefer if !tls.can_connect(ForcePrivateApi) => {
|
||||||
return Ok(MaybeTlsStream::Raw(stream))
|
return Ok(MaybeTlsStream::Raw(stream));
|
||||||
}
|
}
|
||||||
SslMode::Prefer | SslMode::Require => {}
|
SslMode::Prefer | SslMode::Require => {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,24 @@
|
|||||||
use crate::codec::{BackendMessage, BackendMessages, FrontendMessage, PostgresCodec};
|
|
||||||
use crate::error::DbError;
|
|
||||||
use crate::maybe_tls_stream::MaybeTlsStream;
|
|
||||||
use crate::{AsyncMessage, Error, Notification};
|
|
||||||
use bytes::BytesMut;
|
|
||||||
use fallible_iterator::FallibleIterator;
|
|
||||||
use futures_util::{ready, Sink, Stream};
|
|
||||||
use log::{info, trace};
|
|
||||||
use postgres_protocol2::message::backend::Message;
|
|
||||||
use postgres_protocol2::message::frontend;
|
|
||||||
use std::collections::{HashMap, VecDeque};
|
use std::collections::{HashMap, VecDeque};
|
||||||
use std::future::Future;
|
use std::future::Future;
|
||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
use std::task::{Context, Poll};
|
use std::task::{Context, Poll};
|
||||||
|
|
||||||
|
use bytes::BytesMut;
|
||||||
|
use fallible_iterator::FallibleIterator;
|
||||||
|
use futures_util::{Sink, Stream, ready};
|
||||||
|
use log::{info, trace};
|
||||||
|
use postgres_protocol2::message::backend::Message;
|
||||||
|
use postgres_protocol2::message::frontend;
|
||||||
use tokio::io::{AsyncRead, AsyncWrite};
|
use tokio::io::{AsyncRead, AsyncWrite};
|
||||||
use tokio::sync::mpsc;
|
use tokio::sync::mpsc;
|
||||||
use tokio_util::codec::Framed;
|
use tokio_util::codec::Framed;
|
||||||
use tokio_util::sync::PollSender;
|
use tokio_util::sync::PollSender;
|
||||||
|
|
||||||
|
use crate::codec::{BackendMessage, BackendMessages, FrontendMessage, PostgresCodec};
|
||||||
|
use crate::error::DbError;
|
||||||
|
use crate::maybe_tls_stream::MaybeTlsStream;
|
||||||
|
use crate::{AsyncMessage, Error, Notification};
|
||||||
|
|
||||||
pub enum RequestMessages {
|
pub enum RequestMessages {
|
||||||
Single(FrontendMessage),
|
Single(FrontendMessage),
|
||||||
}
|
}
|
||||||
@@ -139,7 +141,7 @@ where
|
|||||||
Some(response) => response,
|
Some(response) => response,
|
||||||
None => match messages.next().map_err(Error::parse)? {
|
None => match messages.next().map_err(Error::parse)? {
|
||||||
Some(Message::ErrorResponse(error)) => {
|
Some(Message::ErrorResponse(error)) => {
|
||||||
return Poll::Ready(Err(Error::db(error)))
|
return Poll::Ready(Err(Error::db(error)));
|
||||||
}
|
}
|
||||||
_ => return Poll::Ready(Err(Error::unexpected_message())),
|
_ => return Poll::Ready(Err(Error::unexpected_message())),
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
//! Errors.
|
//! Errors.
|
||||||
|
|
||||||
|
use std::error::{self, Error as _Error};
|
||||||
|
use std::{fmt, io};
|
||||||
|
|
||||||
use fallible_iterator::FallibleIterator;
|
use fallible_iterator::FallibleIterator;
|
||||||
use postgres_protocol2::message::backend::{ErrorFields, ErrorResponseBody};
|
use postgres_protocol2::message::backend::{ErrorFields, ErrorResponseBody};
|
||||||
use std::error::{self, Error as _Error};
|
|
||||||
use std::fmt;
|
|
||||||
use std::io;
|
|
||||||
|
|
||||||
pub use self::sqlstate::*;
|
pub use self::sqlstate::*;
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
#![allow(async_fn_in_trait)]
|
#![allow(async_fn_in_trait)]
|
||||||
|
|
||||||
|
use postgres_protocol2::Oid;
|
||||||
|
|
||||||
use crate::query::RowStream;
|
use crate::query::RowStream;
|
||||||
use crate::types::Type;
|
use crate::types::Type;
|
||||||
use crate::{Client, Error, Transaction};
|
use crate::{Client, Error, Transaction};
|
||||||
use postgres_protocol2::Oid;
|
|
||||||
|
|
||||||
mod private {
|
mod private {
|
||||||
pub trait Sealed {}
|
pub trait Sealed {}
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
//! An asynchronous, pipelined, PostgreSQL client.
|
//! An asynchronous, pipelined, PostgreSQL client.
|
||||||
#![warn(clippy::all)]
|
#![warn(clippy::all)]
|
||||||
|
|
||||||
|
use postgres_protocol2::message::backend::ReadyForQueryBody;
|
||||||
|
|
||||||
pub use crate::cancel_token::CancelToken;
|
pub use crate::cancel_token::CancelToken;
|
||||||
pub use crate::client::{Client, SocketConfig};
|
pub use crate::client::{Client, SocketConfig};
|
||||||
pub use crate::config::Config;
|
pub use crate::config::Config;
|
||||||
@@ -17,7 +19,6 @@ pub use crate::tls::NoTls;
|
|||||||
pub use crate::transaction::Transaction;
|
pub use crate::transaction::Transaction;
|
||||||
pub use crate::transaction_builder::{IsolationLevel, TransactionBuilder};
|
pub use crate::transaction_builder::{IsolationLevel, TransactionBuilder};
|
||||||
use crate::types::ToSql;
|
use crate::types::ToSql;
|
||||||
use postgres_protocol2::message::backend::ReadyForQueryBody;
|
|
||||||
|
|
||||||
/// After executing a query, the connection will be in one of these states
|
/// After executing a query, the connection will be in one of these states
|
||||||
#[derive(Clone, Copy, Debug, PartialEq)]
|
#[derive(Clone, Copy, Debug, PartialEq)]
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
//! MaybeTlsStream.
|
//! MaybeTlsStream.
|
||||||
//!
|
//!
|
||||||
//! Represents a stream that may or may not be encrypted with TLS.
|
//! Represents a stream that may or may not be encrypted with TLS.
|
||||||
use crate::tls::{ChannelBinding, TlsStream};
|
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
use std::task::{Context, Poll};
|
use std::task::{Context, Poll};
|
||||||
|
|
||||||
use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
|
use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
|
||||||
|
|
||||||
|
use crate::tls::{ChannelBinding, TlsStream};
|
||||||
|
|
||||||
/// A stream that may or may not be encrypted with TLS.
|
/// A stream that may or may not be encrypted with TLS.
|
||||||
pub enum MaybeTlsStream<S, T> {
|
pub enum MaybeTlsStream<S, T> {
|
||||||
/// An unencrypted stream.
|
/// An unencrypted stream.
|
||||||
|
|||||||
@@ -1,18 +1,19 @@
|
|||||||
|
use std::future::Future;
|
||||||
|
use std::pin::Pin;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use bytes::Bytes;
|
||||||
|
use fallible_iterator::FallibleIterator;
|
||||||
|
use futures_util::{TryStreamExt, pin_mut};
|
||||||
|
use log::debug;
|
||||||
|
use postgres_protocol2::message::backend::Message;
|
||||||
|
use postgres_protocol2::message::frontend;
|
||||||
|
|
||||||
use crate::client::InnerClient;
|
use crate::client::InnerClient;
|
||||||
use crate::codec::FrontendMessage;
|
use crate::codec::FrontendMessage;
|
||||||
use crate::connection::RequestMessages;
|
use crate::connection::RequestMessages;
|
||||||
use crate::types::{Field, Kind, Oid, Type};
|
use crate::types::{Field, Kind, Oid, Type};
|
||||||
use crate::{query, slice_iter};
|
use crate::{Column, Error, Statement, query, slice_iter};
|
||||||
use crate::{Column, Error, Statement};
|
|
||||||
use bytes::Bytes;
|
|
||||||
use fallible_iterator::FallibleIterator;
|
|
||||||
use futures_util::{pin_mut, TryStreamExt};
|
|
||||||
use log::debug;
|
|
||||||
use postgres_protocol2::message::backend::Message;
|
|
||||||
use postgres_protocol2::message::frontend;
|
|
||||||
use std::future::Future;
|
|
||||||
use std::pin::Pin;
|
|
||||||
use std::sync::Arc;
|
|
||||||
|
|
||||||
pub(crate) const TYPEINFO_QUERY: &str = "\
|
pub(crate) const TYPEINFO_QUERY: &str = "\
|
||||||
SELECT t.typname, t.typtype, t.typelem, r.rngsubtype, t.typbasetype, n.nspname, t.typrelid
|
SELECT t.typname, t.typtype, t.typelem, r.rngsubtype, t.typbasetype, n.nspname, t.typrelid
|
||||||
|
|||||||
@@ -1,22 +1,24 @@
|
|||||||
use crate::client::{InnerClient, Responses};
|
|
||||||
use crate::codec::FrontendMessage;
|
|
||||||
use crate::connection::RequestMessages;
|
|
||||||
use crate::types::IsNull;
|
|
||||||
use crate::{Column, Error, ReadyForQueryStatus, Row, Statement};
|
|
||||||
use bytes::{BufMut, Bytes, BytesMut};
|
|
||||||
use fallible_iterator::FallibleIterator;
|
|
||||||
use futures_util::{ready, Stream};
|
|
||||||
use log::{debug, log_enabled, Level};
|
|
||||||
use pin_project_lite::pin_project;
|
|
||||||
use postgres_protocol2::message::backend::Message;
|
|
||||||
use postgres_protocol2::message::frontend;
|
|
||||||
use postgres_types2::{Format, ToSql, Type};
|
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::marker::PhantomPinned;
|
use std::marker::PhantomPinned;
|
||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::task::{Context, Poll};
|
use std::task::{Context, Poll};
|
||||||
|
|
||||||
|
use bytes::{BufMut, Bytes, BytesMut};
|
||||||
|
use fallible_iterator::FallibleIterator;
|
||||||
|
use futures_util::{Stream, ready};
|
||||||
|
use log::{Level, debug, log_enabled};
|
||||||
|
use pin_project_lite::pin_project;
|
||||||
|
use postgres_protocol2::message::backend::Message;
|
||||||
|
use postgres_protocol2::message::frontend;
|
||||||
|
use postgres_types2::{Format, ToSql, Type};
|
||||||
|
|
||||||
|
use crate::client::{InnerClient, Responses};
|
||||||
|
use crate::codec::FrontendMessage;
|
||||||
|
use crate::connection::RequestMessages;
|
||||||
|
use crate::types::IsNull;
|
||||||
|
use crate::{Column, Error, ReadyForQueryStatus, Row, Statement};
|
||||||
|
|
||||||
struct BorrowToSqlParamsDebug<'a>(&'a [&'a (dyn ToSql + Sync)]);
|
struct BorrowToSqlParamsDebug<'a>(&'a [&'a (dyn ToSql + Sync)]);
|
||||||
|
|
||||||
impl fmt::Debug for BorrowToSqlParamsDebug<'_> {
|
impl fmt::Debug for BorrowToSqlParamsDebug<'_> {
|
||||||
@@ -257,7 +259,7 @@ impl Stream for RowStream {
|
|||||||
this.statement.clone(),
|
this.statement.clone(),
|
||||||
body,
|
body,
|
||||||
*this.output_format,
|
*this.output_format,
|
||||||
)?)))
|
)?)));
|
||||||
}
|
}
|
||||||
Message::EmptyQueryResponse | Message::PortalSuspended => {}
|
Message::EmptyQueryResponse | Message::PortalSuspended => {}
|
||||||
Message::CommandComplete(body) => {
|
Message::CommandComplete(body) => {
|
||||||
|
|||||||
@@ -1,17 +1,18 @@
|
|||||||
//! Rows.
|
//! Rows.
|
||||||
|
|
||||||
|
use std::ops::Range;
|
||||||
|
use std::sync::Arc;
|
||||||
|
use std::{fmt, str};
|
||||||
|
|
||||||
|
use fallible_iterator::FallibleIterator;
|
||||||
|
use postgres_protocol2::message::backend::DataRowBody;
|
||||||
|
use postgres_types2::{Format, WrongFormat};
|
||||||
|
|
||||||
use crate::row::sealed::{AsName, Sealed};
|
use crate::row::sealed::{AsName, Sealed};
|
||||||
use crate::simple_query::SimpleColumn;
|
use crate::simple_query::SimpleColumn;
|
||||||
use crate::statement::Column;
|
use crate::statement::Column;
|
||||||
use crate::types::{FromSql, Type, WrongType};
|
use crate::types::{FromSql, Type, WrongType};
|
||||||
use crate::{Error, Statement};
|
use crate::{Error, Statement};
|
||||||
use fallible_iterator::FallibleIterator;
|
|
||||||
use postgres_protocol2::message::backend::DataRowBody;
|
|
||||||
use postgres_types2::{Format, WrongFormat};
|
|
||||||
use std::fmt;
|
|
||||||
use std::ops::Range;
|
|
||||||
use std::str;
|
|
||||||
use std::sync::Arc;
|
|
||||||
|
|
||||||
mod sealed {
|
mod sealed {
|
||||||
pub trait Sealed {}
|
pub trait Sealed {}
|
||||||
|
|||||||
@@ -1,19 +1,21 @@
|
|||||||
use crate::client::{InnerClient, Responses};
|
|
||||||
use crate::codec::FrontendMessage;
|
|
||||||
use crate::connection::RequestMessages;
|
|
||||||
use crate::{Error, ReadyForQueryStatus, SimpleQueryMessage, SimpleQueryRow};
|
|
||||||
use bytes::Bytes;
|
|
||||||
use fallible_iterator::FallibleIterator;
|
|
||||||
use futures_util::{ready, Stream};
|
|
||||||
use log::debug;
|
|
||||||
use pin_project_lite::pin_project;
|
|
||||||
use postgres_protocol2::message::backend::Message;
|
|
||||||
use postgres_protocol2::message::frontend;
|
|
||||||
use std::marker::PhantomPinned;
|
use std::marker::PhantomPinned;
|
||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::task::{Context, Poll};
|
use std::task::{Context, Poll};
|
||||||
|
|
||||||
|
use bytes::Bytes;
|
||||||
|
use fallible_iterator::FallibleIterator;
|
||||||
|
use futures_util::{Stream, ready};
|
||||||
|
use log::debug;
|
||||||
|
use pin_project_lite::pin_project;
|
||||||
|
use postgres_protocol2::message::backend::Message;
|
||||||
|
use postgres_protocol2::message::frontend;
|
||||||
|
|
||||||
|
use crate::client::{InnerClient, Responses};
|
||||||
|
use crate::codec::FrontendMessage;
|
||||||
|
use crate::connection::RequestMessages;
|
||||||
|
use crate::{Error, ReadyForQueryStatus, SimpleQueryMessage, SimpleQueryRow};
|
||||||
|
|
||||||
/// Information about a column of a single query row.
|
/// Information about a column of a single query row.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct SimpleColumn {
|
pub struct SimpleColumn {
|
||||||
|
|||||||
@@ -1,15 +1,14 @@
|
|||||||
|
use std::fmt;
|
||||||
|
use std::sync::{Arc, Weak};
|
||||||
|
|
||||||
|
use postgres_protocol2::Oid;
|
||||||
|
use postgres_protocol2::message::backend::Field;
|
||||||
|
use postgres_protocol2::message::frontend;
|
||||||
|
|
||||||
use crate::client::InnerClient;
|
use crate::client::InnerClient;
|
||||||
use crate::codec::FrontendMessage;
|
use crate::codec::FrontendMessage;
|
||||||
use crate::connection::RequestMessages;
|
use crate::connection::RequestMessages;
|
||||||
use crate::types::Type;
|
use crate::types::Type;
|
||||||
use postgres_protocol2::{
|
|
||||||
message::{backend::Field, frontend},
|
|
||||||
Oid,
|
|
||||||
};
|
|
||||||
use std::{
|
|
||||||
fmt,
|
|
||||||
sync::{Arc, Weak},
|
|
||||||
};
|
|
||||||
|
|
||||||
struct StatementInner {
|
struct StatementInner {
|
||||||
client: Weak<InnerClient>,
|
client: Weak<InnerClient>,
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ use std::future::Future;
|
|||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
use std::task::{Context, Poll};
|
use std::task::{Context, Poll};
|
||||||
use std::{fmt, io};
|
use std::{fmt, io};
|
||||||
|
|
||||||
use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
|
use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
|
||||||
|
|
||||||
pub(crate) mod private {
|
pub(crate) mod private {
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
|
use postgres_protocol2::message::frontend;
|
||||||
|
|
||||||
use crate::codec::FrontendMessage;
|
use crate::codec::FrontendMessage;
|
||||||
use crate::connection::RequestMessages;
|
use crate::connection::RequestMessages;
|
||||||
use crate::query::RowStream;
|
use crate::query::RowStream;
|
||||||
use crate::{CancelToken, Client, Error, ReadyForQueryStatus};
|
use crate::{CancelToken, Client, Error, ReadyForQueryStatus};
|
||||||
use postgres_protocol2::message::frontend;
|
|
||||||
|
|
||||||
/// A representation of a PostgreSQL database transaction.
|
/// A representation of a PostgreSQL database transaction.
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "proxy"
|
name = "proxy"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition.workspace = true
|
edition = "2024"
|
||||||
license.workspace = true
|
license.workspace = true
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
|
|||||||
@@ -8,16 +8,16 @@ use tokio::io::{AsyncRead, AsyncWrite};
|
|||||||
use tracing::{info, info_span};
|
use tracing::{info, info_span};
|
||||||
|
|
||||||
use super::ComputeCredentialKeys;
|
use super::ComputeCredentialKeys;
|
||||||
use crate::auth::backend::ComputeUserInfo;
|
|
||||||
use crate::auth::IpPattern;
|
use crate::auth::IpPattern;
|
||||||
|
use crate::auth::backend::ComputeUserInfo;
|
||||||
use crate::cache::Cached;
|
use crate::cache::Cached;
|
||||||
use crate::config::AuthenticationConfig;
|
use crate::config::AuthenticationConfig;
|
||||||
use crate::context::RequestContext;
|
use crate::context::RequestContext;
|
||||||
use crate::control_plane::client::cplane_proxy_v1;
|
use crate::control_plane::client::cplane_proxy_v1;
|
||||||
use crate::control_plane::{self, CachedNodeInfo, NodeInfo};
|
use crate::control_plane::{self, CachedNodeInfo, NodeInfo};
|
||||||
use crate::error::{ReportableError, UserFacingError};
|
use crate::error::{ReportableError, UserFacingError};
|
||||||
use crate::proxy::connect_compute::ComputeConnectBackend;
|
|
||||||
use crate::proxy::NeonOptions;
|
use crate::proxy::NeonOptions;
|
||||||
|
use crate::proxy::connect_compute::ComputeConnectBackend;
|
||||||
use crate::stream::PqStream;
|
use crate::stream::PqStream;
|
||||||
use crate::types::RoleName;
|
use crate::types::RoleName;
|
||||||
use crate::{auth, compute, waiters};
|
use crate::{auth, compute, waiters};
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ use std::time::{Duration, SystemTime};
|
|||||||
use arc_swap::ArcSwapOption;
|
use arc_swap::ArcSwapOption;
|
||||||
use clashmap::ClashMap;
|
use clashmap::ClashMap;
|
||||||
use jose_jwk::crypto::KeyInfo;
|
use jose_jwk::crypto::KeyInfo;
|
||||||
use reqwest::{redirect, Client};
|
use reqwest::{Client, redirect};
|
||||||
use reqwest_retry::policies::ExponentialBackoff;
|
|
||||||
use reqwest_retry::RetryTransientMiddleware;
|
use reqwest_retry::RetryTransientMiddleware;
|
||||||
|
use reqwest_retry::policies::ExponentialBackoff;
|
||||||
use serde::de::Visitor;
|
use serde::de::Visitor;
|
||||||
use serde::{Deserialize, Deserializer};
|
use serde::{Deserialize, Deserializer};
|
||||||
use serde_json::value::RawValue;
|
use serde_json::value::RawValue;
|
||||||
@@ -498,8 +498,8 @@ fn verify_rsa_signature(
|
|||||||
alg: &jose_jwa::Algorithm,
|
alg: &jose_jwa::Algorithm,
|
||||||
) -> Result<(), JwtError> {
|
) -> Result<(), JwtError> {
|
||||||
use jose_jwa::{Algorithm, Signing};
|
use jose_jwa::{Algorithm, Signing};
|
||||||
use rsa::pkcs1v15::{Signature, VerifyingKey};
|
|
||||||
use rsa::RsaPublicKey;
|
use rsa::RsaPublicKey;
|
||||||
|
use rsa::pkcs1v15::{Signature, VerifyingKey};
|
||||||
|
|
||||||
let key = RsaPublicKey::try_from(key).map_err(JwtError::InvalidRsaKey)?;
|
let key = RsaPublicKey::try_from(key).map_err(JwtError::InvalidRsaKey)?;
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ use crate::auth::backend::jwt::FetchAuthRulesError;
|
|||||||
use crate::compute::ConnCfg;
|
use crate::compute::ConnCfg;
|
||||||
use crate::compute_ctl::ComputeCtlApi;
|
use crate::compute_ctl::ComputeCtlApi;
|
||||||
use crate::context::RequestContext;
|
use crate::context::RequestContext;
|
||||||
use crate::control_plane::messages::{ColdStartInfo, EndpointJwksResponse, MetricsAuxInfo};
|
|
||||||
use crate::control_plane::NodeInfo;
|
use crate::control_plane::NodeInfo;
|
||||||
|
use crate::control_plane::messages::{ColdStartInfo, EndpointJwksResponse, MetricsAuxInfo};
|
||||||
use crate::http;
|
use crate::http;
|
||||||
use crate::intern::{BranchIdTag, EndpointIdTag, InternId, ProjectIdTag};
|
use crate::intern::{BranchIdTag, EndpointIdTag, InternId, ProjectIdTag};
|
||||||
use crate::types::EndpointId;
|
use crate::types::EndpointId;
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ use tracing::{debug, info, warn};
|
|||||||
|
|
||||||
use crate::auth::credentials::check_peer_addr_is_in_list;
|
use crate::auth::credentials::check_peer_addr_is_in_list;
|
||||||
use crate::auth::{
|
use crate::auth::{
|
||||||
self, validate_password_and_exchange, AuthError, ComputeUserInfoMaybeEndpoint, IpPattern,
|
self, AuthError, ComputeUserInfoMaybeEndpoint, IpPattern, validate_password_and_exchange,
|
||||||
};
|
};
|
||||||
use crate::cache::Cached;
|
use crate::cache::Cached;
|
||||||
use crate::config::AuthenticationConfig;
|
use crate::config::AuthenticationConfig;
|
||||||
@@ -32,8 +32,8 @@ use crate::control_plane::{
|
|||||||
use crate::intern::EndpointIdInt;
|
use crate::intern::EndpointIdInt;
|
||||||
use crate::metrics::Metrics;
|
use crate::metrics::Metrics;
|
||||||
use crate::protocol2::ConnectionInfoExtra;
|
use crate::protocol2::ConnectionInfoExtra;
|
||||||
use crate::proxy::connect_compute::ComputeConnectBackend;
|
|
||||||
use crate::proxy::NeonOptions;
|
use crate::proxy::NeonOptions;
|
||||||
|
use crate::proxy::connect_compute::ComputeConnectBackend;
|
||||||
use crate::rate_limiter::{BucketRateLimiter, EndpointRateLimiter};
|
use crate::rate_limiter::{BucketRateLimiter, EndpointRateLimiter};
|
||||||
use crate::stream::Stream;
|
use crate::stream::Stream;
|
||||||
use crate::types::{EndpointCacheKey, EndpointId, RoleName};
|
use crate::types::{EndpointCacheKey, EndpointId, RoleName};
|
||||||
@@ -542,7 +542,7 @@ mod tests {
|
|||||||
use tokio::io::{AsyncRead, AsyncReadExt, AsyncWriteExt};
|
use tokio::io::{AsyncRead, AsyncReadExt, AsyncWriteExt};
|
||||||
|
|
||||||
use super::jwt::JwkCache;
|
use super::jwt::JwkCache;
|
||||||
use super::{auth_quirks, AuthRateLimiter};
|
use super::{AuthRateLimiter, auth_quirks};
|
||||||
use crate::auth::backend::MaskedIp;
|
use crate::auth::backend::MaskedIp;
|
||||||
use crate::auth::{ComputeUserInfoMaybeEndpoint, IpPattern};
|
use crate::auth::{ComputeUserInfoMaybeEndpoint, IpPattern};
|
||||||
use crate::config::AuthenticationConfig;
|
use crate::config::AuthenticationConfig;
|
||||||
@@ -553,8 +553,8 @@ mod tests {
|
|||||||
};
|
};
|
||||||
use crate::proxy::NeonOptions;
|
use crate::proxy::NeonOptions;
|
||||||
use crate::rate_limiter::{EndpointRateLimiter, RateBucketInfo};
|
use crate::rate_limiter::{EndpointRateLimiter, RateBucketInfo};
|
||||||
use crate::scram::threadpool::ThreadPool;
|
|
||||||
use crate::scram::ServerSecret;
|
use crate::scram::ServerSecret;
|
||||||
|
use crate::scram::threadpool::ThreadPool;
|
||||||
use crate::stream::{PqStream, Stream};
|
use crate::stream::{PqStream, Stream};
|
||||||
|
|
||||||
struct Auth {
|
struct Auth {
|
||||||
|
|||||||
@@ -197,7 +197,10 @@ impl<'de> serde::de::Deserialize<'de> for IpPattern {
|
|||||||
type Value = IpPattern;
|
type Value = IpPattern;
|
||||||
|
|
||||||
fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
write!(formatter, "comma separated list with ip address, ip address range, or ip address subnet mask")
|
write!(
|
||||||
|
formatter,
|
||||||
|
"comma separated list with ip address, ip address range, or ip address subnet mask"
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
|
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
|
||||||
@@ -252,8 +255,8 @@ fn project_name_valid(name: &str) -> bool {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
#[expect(clippy::unwrap_used)]
|
#[expect(clippy::unwrap_used)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use serde_json::json;
|
|
||||||
use ComputeUserInfoParseError::*;
|
use ComputeUserInfoParseError::*;
|
||||||
|
use serde_json::json;
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
|||||||
@@ -5,13 +5,13 @@ pub use backend::Backend;
|
|||||||
|
|
||||||
mod credentials;
|
mod credentials;
|
||||||
pub(crate) use credentials::{
|
pub(crate) use credentials::{
|
||||||
check_peer_addr_is_in_list, endpoint_sni, ComputeUserInfoMaybeEndpoint,
|
ComputeUserInfoMaybeEndpoint, ComputeUserInfoParseError, IpPattern, check_peer_addr_is_in_list,
|
||||||
ComputeUserInfoParseError, IpPattern,
|
endpoint_sni,
|
||||||
};
|
};
|
||||||
|
|
||||||
mod password_hack;
|
mod password_hack;
|
||||||
pub(crate) use password_hack::parse_endpoint_param;
|
|
||||||
use password_hack::PasswordHackPayload;
|
use password_hack::PasswordHackPayload;
|
||||||
|
pub(crate) use password_hack::parse_endpoint_param;
|
||||||
|
|
||||||
mod flow;
|
mod flow;
|
||||||
use std::io;
|
use std::io;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ use std::str::FromStr;
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use anyhow::{bail, ensure, Context};
|
use anyhow::{Context, bail, ensure};
|
||||||
use camino::{Utf8Path, Utf8PathBuf};
|
use camino::{Utf8Path, Utf8PathBuf};
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use compute_api::spec::LocalProxySpec;
|
use compute_api::spec::LocalProxySpec;
|
||||||
@@ -19,7 +19,7 @@ use utils::sentry_init::init_sentry;
|
|||||||
use utils::{pid_file, project_build_tag, project_git_version};
|
use utils::{pid_file, project_build_tag, project_git_version};
|
||||||
|
|
||||||
use crate::auth::backend::jwt::JwkCache;
|
use crate::auth::backend::jwt::JwkCache;
|
||||||
use crate::auth::backend::local::{LocalBackend, JWKS_ROLE_MAP};
|
use crate::auth::backend::local::{JWKS_ROLE_MAP, LocalBackend};
|
||||||
use crate::auth::{self};
|
use crate::auth::{self};
|
||||||
use crate::cancellation::CancellationHandler;
|
use crate::cancellation::CancellationHandler;
|
||||||
use crate::config::{
|
use crate::config::{
|
||||||
|
|||||||
@@ -5,24 +5,24 @@
|
|||||||
/// the outside. Similar to an ingress controller for HTTPS.
|
/// the outside. Similar to an ingress controller for HTTPS.
|
||||||
use std::{net::SocketAddr, sync::Arc};
|
use std::{net::SocketAddr, sync::Arc};
|
||||||
|
|
||||||
use anyhow::{anyhow, bail, ensure, Context};
|
use anyhow::{Context, anyhow, bail, ensure};
|
||||||
use clap::Arg;
|
use clap::Arg;
|
||||||
use futures::future::Either;
|
|
||||||
use futures::TryFutureExt;
|
use futures::TryFutureExt;
|
||||||
|
use futures::future::Either;
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use rustls::crypto::ring;
|
use rustls::crypto::ring;
|
||||||
use rustls::pki_types::PrivateKeyDer;
|
use rustls::pki_types::PrivateKeyDer;
|
||||||
use tokio::io::{AsyncRead, AsyncWrite};
|
use tokio::io::{AsyncRead, AsyncWrite};
|
||||||
use tokio::net::TcpListener;
|
use tokio::net::TcpListener;
|
||||||
use tokio_util::sync::CancellationToken;
|
use tokio_util::sync::CancellationToken;
|
||||||
use tracing::{error, info, Instrument};
|
use tracing::{Instrument, error, info};
|
||||||
use utils::project_git_version;
|
use utils::project_git_version;
|
||||||
use utils::sentry_init::init_sentry;
|
use utils::sentry_init::init_sentry;
|
||||||
|
|
||||||
use crate::context::RequestContext;
|
use crate::context::RequestContext;
|
||||||
use crate::metrics::{Metrics, ThreadPoolMetrics};
|
use crate::metrics::{Metrics, ThreadPoolMetrics};
|
||||||
use crate::protocol2::ConnectionInfo;
|
use crate::protocol2::ConnectionInfo;
|
||||||
use crate::proxy::{copy_bidirectional_client_compute, run_until_cancelled, ErrorSource};
|
use crate::proxy::{ErrorSource, copy_bidirectional_client_compute, run_until_cancelled};
|
||||||
use crate::stream::{PqStream, Stream};
|
use crate::stream::{PqStream, Stream};
|
||||||
use crate::tls::TlsServerEndPoint;
|
use crate::tls::TlsServerEndPoint;
|
||||||
|
|
||||||
|
|||||||
@@ -9,16 +9,16 @@ use remote_storage::RemoteStorageConfig;
|
|||||||
use tokio::net::TcpListener;
|
use tokio::net::TcpListener;
|
||||||
use tokio::task::JoinSet;
|
use tokio::task::JoinSet;
|
||||||
use tokio_util::sync::CancellationToken;
|
use tokio_util::sync::CancellationToken;
|
||||||
use tracing::{info, warn, Instrument};
|
use tracing::{Instrument, info, warn};
|
||||||
use utils::sentry_init::init_sentry;
|
use utils::sentry_init::init_sentry;
|
||||||
use utils::{project_build_tag, project_git_version};
|
use utils::{project_build_tag, project_git_version};
|
||||||
|
|
||||||
use crate::auth::backend::jwt::JwkCache;
|
use crate::auth::backend::jwt::JwkCache;
|
||||||
use crate::auth::backend::{AuthRateLimiter, ConsoleRedirectBackend, MaybeOwned};
|
use crate::auth::backend::{AuthRateLimiter, ConsoleRedirectBackend, MaybeOwned};
|
||||||
use crate::cancellation::{handle_cancel_messages, CancellationHandler};
|
use crate::cancellation::{CancellationHandler, handle_cancel_messages};
|
||||||
use crate::config::{
|
use crate::config::{
|
||||||
self, remote_storage_from_toml, AuthenticationConfig, CacheOptions, ComputeConfig, HttpConfig,
|
self, AuthenticationConfig, CacheOptions, ComputeConfig, HttpConfig, ProjectInfoCacheOptions,
|
||||||
ProjectInfoCacheOptions, ProxyConfig, ProxyProtocolV2,
|
ProxyConfig, ProxyProtocolV2, remote_storage_from_toml,
|
||||||
};
|
};
|
||||||
use crate::context::parquet::ParquetUploadArgs;
|
use crate::context::parquet::ParquetUploadArgs;
|
||||||
use crate::http::health_server::AppMetrics;
|
use crate::http::health_server::AppMetrics;
|
||||||
@@ -30,8 +30,8 @@ use crate::redis::connection_with_credentials_provider::ConnectionWithCredential
|
|||||||
use crate::redis::kv_ops::RedisKVClient;
|
use crate::redis::kv_ops::RedisKVClient;
|
||||||
use crate::redis::{elasticache, notifications};
|
use crate::redis::{elasticache, notifications};
|
||||||
use crate::scram::threadpool::ThreadPool;
|
use crate::scram::threadpool::ThreadPool;
|
||||||
use crate::serverless::cancel_set::CancelSet;
|
|
||||||
use crate::serverless::GlobalConnPoolOptions;
|
use crate::serverless::GlobalConnPoolOptions;
|
||||||
|
use crate::serverless::cancel_set::CancelSet;
|
||||||
use crate::tls::client_config::compute_client_config_with_root_certs;
|
use crate::tls::client_config::compute_client_config_with_root_certs;
|
||||||
use crate::{auth, control_plane, http, serverless, usage_metrics};
|
use crate::{auth, control_plane, http, serverless, usage_metrics};
|
||||||
|
|
||||||
@@ -331,7 +331,9 @@ pub async fn run() -> anyhow::Result<()> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
(None, None) => {
|
(None, None) => {
|
||||||
warn!("irsa auth requires redis-host and redis-port to be set, continuing without regional_redis_client");
|
warn!(
|
||||||
|
"irsa auth requires redis-host and redis-port to be set, continuing without regional_redis_client"
|
||||||
|
);
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
|
|||||||
4
proxy/src/cache/project_info.rs
vendored
4
proxy/src/cache/project_info.rs
vendored
@@ -1,12 +1,12 @@
|
|||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
use std::convert::Infallible;
|
use std::convert::Infallible;
|
||||||
use std::sync::atomic::AtomicU64;
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use std::sync::atomic::AtomicU64;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use clashmap::ClashMap;
|
use clashmap::ClashMap;
|
||||||
use rand::{thread_rng, Rng};
|
use rand::{Rng, thread_rng};
|
||||||
use smol_str::SmolStr;
|
use smol_str::SmolStr;
|
||||||
use tokio::sync::Mutex;
|
use tokio::sync::Mutex;
|
||||||
use tokio::time::Instant;
|
use tokio::time::Instant;
|
||||||
|
|||||||
4
proxy/src/cache/timed_lru.rs
vendored
4
proxy/src/cache/timed_lru.rs
vendored
@@ -11,11 +11,11 @@ use std::time::{Duration, Instant};
|
|||||||
// This severely hinders its usage both in terms of creating wrappers and supported key types.
|
// This severely hinders its usage both in terms of creating wrappers and supported key types.
|
||||||
//
|
//
|
||||||
// On the other hand, `hashlink` has good download stats and appears to be maintained.
|
// On the other hand, `hashlink` has good download stats and appears to be maintained.
|
||||||
use hashlink::{linked_hash_map::RawEntryMut, LruCache};
|
use hashlink::{LruCache, linked_hash_map::RawEntryMut};
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
|
||||||
use super::common::Cached;
|
use super::common::Cached;
|
||||||
use super::{timed_lru, Cache};
|
use super::{Cache, timed_lru};
|
||||||
|
|
||||||
/// An implementation of timed LRU cache with fixed capacity.
|
/// An implementation of timed LRU cache with fixed capacity.
|
||||||
/// Key properties:
|
/// Key properties:
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ use std::net::{IpAddr, SocketAddr};
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use ipnet::{IpNet, Ipv4Net, Ipv6Net};
|
use ipnet::{IpNet, Ipv4Net, Ipv6Net};
|
||||||
use postgres_client::tls::MakeTlsConnect;
|
|
||||||
use postgres_client::CancelToken;
|
use postgres_client::CancelToken;
|
||||||
|
use postgres_client::tls::MakeTlsConnect;
|
||||||
use pq_proto::CancelKeyData;
|
use pq_proto::CancelKeyData;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
@@ -13,7 +13,7 @@ use tokio::sync::{mpsc, oneshot};
|
|||||||
use tracing::{debug, info};
|
use tracing::{debug, info};
|
||||||
|
|
||||||
use crate::auth::backend::ComputeUserInfo;
|
use crate::auth::backend::ComputeUserInfo;
|
||||||
use crate::auth::{check_peer_addr_is_in_list, AuthError};
|
use crate::auth::{AuthError, check_peer_addr_is_in_list};
|
||||||
use crate::config::ComputeConfig;
|
use crate::config::ComputeConfig;
|
||||||
use crate::context::RequestContext;
|
use crate::context::RequestContext;
|
||||||
use crate::control_plane::ControlPlaneApi;
|
use crate::control_plane::ControlPlaneApi;
|
||||||
|
|||||||
@@ -2,18 +2,18 @@ use std::str::FromStr;
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use anyhow::{bail, ensure, Context, Ok};
|
use anyhow::{Context, Ok, bail, ensure};
|
||||||
use clap::ValueEnum;
|
use clap::ValueEnum;
|
||||||
use remote_storage::RemoteStorageConfig;
|
use remote_storage::RemoteStorageConfig;
|
||||||
|
|
||||||
use crate::auth::backend::jwt::JwkCache;
|
|
||||||
use crate::auth::backend::AuthRateLimiter;
|
use crate::auth::backend::AuthRateLimiter;
|
||||||
|
use crate::auth::backend::jwt::JwkCache;
|
||||||
use crate::control_plane::locks::ApiLocks;
|
use crate::control_plane::locks::ApiLocks;
|
||||||
use crate::rate_limiter::{RateBucketInfo, RateLimitAlgorithm, RateLimiterConfig};
|
use crate::rate_limiter::{RateBucketInfo, RateLimitAlgorithm, RateLimiterConfig};
|
||||||
use crate::scram::threadpool::ThreadPool;
|
use crate::scram::threadpool::ThreadPool;
|
||||||
use crate::serverless::cancel_set::CancelSet;
|
|
||||||
use crate::serverless::GlobalConnPoolOptions;
|
use crate::serverless::GlobalConnPoolOptions;
|
||||||
pub use crate::tls::server_config::{configure_tls, TlsConfig};
|
use crate::serverless::cancel_set::CancelSet;
|
||||||
|
pub use crate::tls::server_config::{TlsConfig, configure_tls};
|
||||||
use crate::types::Host;
|
use crate::types::Host;
|
||||||
|
|
||||||
pub struct ProxyConfig {
|
pub struct ProxyConfig {
|
||||||
@@ -97,8 +97,7 @@ pub struct EndpointCacheConfig {
|
|||||||
impl EndpointCacheConfig {
|
impl EndpointCacheConfig {
|
||||||
/// Default options for [`crate::control_plane::NodeInfoCache`].
|
/// Default options for [`crate::control_plane::NodeInfoCache`].
|
||||||
/// Notice that by default the limiter is empty, which means that cache is disabled.
|
/// Notice that by default the limiter is empty, which means that cache is disabled.
|
||||||
pub const CACHE_DEFAULT_OPTIONS: &'static str =
|
pub const CACHE_DEFAULT_OPTIONS: &'static str = "initial_batch_size=1000,default_batch_size=10,xread_timeout=5m,stream_name=controlPlane,disable_cache=true,limiter_info=1000@1s,retry_interval=1s";
|
||||||
"initial_batch_size=1000,default_batch_size=10,xread_timeout=5m,stream_name=controlPlane,disable_cache=true,limiter_info=1000@1s,retry_interval=1s";
|
|
||||||
|
|
||||||
/// Parse cache options passed via cmdline.
|
/// Parse cache options passed via cmdline.
|
||||||
/// Example: [`Self::CACHE_DEFAULT_OPTIONS`].
|
/// Example: [`Self::CACHE_DEFAULT_OPTIONS`].
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ use std::sync::Arc;
|
|||||||
use futures::{FutureExt, TryFutureExt};
|
use futures::{FutureExt, TryFutureExt};
|
||||||
use tokio::io::{AsyncRead, AsyncWrite, AsyncWriteExt};
|
use tokio::io::{AsyncRead, AsyncWrite, AsyncWriteExt};
|
||||||
use tokio_util::sync::CancellationToken;
|
use tokio_util::sync::CancellationToken;
|
||||||
use tracing::{debug, error, info, Instrument};
|
use tracing::{Instrument, debug, error, info};
|
||||||
|
|
||||||
use crate::auth::backend::ConsoleRedirectBackend;
|
use crate::auth::backend::ConsoleRedirectBackend;
|
||||||
use crate::cancellation::CancellationHandler;
|
use crate::cancellation::CancellationHandler;
|
||||||
@@ -11,12 +11,12 @@ use crate::config::{ProxyConfig, ProxyProtocolV2};
|
|||||||
use crate::context::RequestContext;
|
use crate::context::RequestContext;
|
||||||
use crate::error::ReportableError;
|
use crate::error::ReportableError;
|
||||||
use crate::metrics::{Metrics, NumClientConnectionsGuard};
|
use crate::metrics::{Metrics, NumClientConnectionsGuard};
|
||||||
use crate::protocol2::{read_proxy_protocol, ConnectHeader, ConnectionInfo};
|
use crate::protocol2::{ConnectHeader, ConnectionInfo, read_proxy_protocol};
|
||||||
use crate::proxy::connect_compute::{connect_to_compute, TcpMechanism};
|
use crate::proxy::connect_compute::{TcpMechanism, connect_to_compute};
|
||||||
use crate::proxy::handshake::{handshake, HandshakeData};
|
use crate::proxy::handshake::{HandshakeData, handshake};
|
||||||
use crate::proxy::passthrough::ProxyPassthrough;
|
use crate::proxy::passthrough::ProxyPassthrough;
|
||||||
use crate::proxy::{
|
use crate::proxy::{
|
||||||
prepare_client_connection, run_until_cancelled, ClientRequestError, ErrorSource,
|
ClientRequestError, ErrorSource, prepare_client_connection, run_until_cancelled,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub async fn task_main(
|
pub async fn task_main(
|
||||||
@@ -64,22 +64,34 @@ pub async fn task_main(
|
|||||||
debug!("healthcheck received");
|
debug!("healthcheck received");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Ok((_socket, ConnectHeader::Missing)) if config.proxy_protocol_v2 == ProxyProtocolV2::Required => {
|
Ok((_socket, ConnectHeader::Missing))
|
||||||
|
if config.proxy_protocol_v2 == ProxyProtocolV2::Required =>
|
||||||
|
{
|
||||||
error!("missing required proxy protocol header");
|
error!("missing required proxy protocol header");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Ok((_socket, ConnectHeader::Proxy(_))) if config.proxy_protocol_v2 == ProxyProtocolV2::Rejected => {
|
Ok((_socket, ConnectHeader::Proxy(_)))
|
||||||
|
if config.proxy_protocol_v2 == ProxyProtocolV2::Rejected =>
|
||||||
|
{
|
||||||
error!("proxy protocol header not supported");
|
error!("proxy protocol header not supported");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Ok((socket, ConnectHeader::Proxy(info))) => (socket, info),
|
Ok((socket, ConnectHeader::Proxy(info))) => (socket, info),
|
||||||
Ok((socket, ConnectHeader::Missing)) => (socket, ConnectionInfo{ addr: peer_addr, extra: None }),
|
Ok((socket, ConnectHeader::Missing)) => (
|
||||||
|
socket,
|
||||||
|
ConnectionInfo {
|
||||||
|
addr: peer_addr,
|
||||||
|
extra: None,
|
||||||
|
},
|
||||||
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
match socket.inner.set_nodelay(true) {
|
match socket.inner.set_nodelay(true) {
|
||||||
Ok(()) => {}
|
Ok(()) => {}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
error!("per-client task finished with an error: failed to set socket option: {e:#}");
|
error!(
|
||||||
|
"per-client task finished with an error: failed to set socket option: {e:#}"
|
||||||
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -118,10 +130,16 @@ pub async fn task_main(
|
|||||||
match p.proxy_pass(&config.connect_to_compute).await {
|
match p.proxy_pass(&config.connect_to_compute).await {
|
||||||
Ok(()) => {}
|
Ok(()) => {}
|
||||||
Err(ErrorSource::Client(e)) => {
|
Err(ErrorSource::Client(e)) => {
|
||||||
error!(?session_id, "per-client task finished with an IO error from the client: {e:#}");
|
error!(
|
||||||
|
?session_id,
|
||||||
|
"per-client task finished with an IO error from the client: {e:#}"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
Err(ErrorSource::Compute(e)) => {
|
Err(ErrorSource::Compute(e)) => {
|
||||||
error!(?session_id, "per-client task finished with an IO error from the compute: {e:#}");
|
error!(
|
||||||
|
?session_id,
|
||||||
|
"per-client task finished with an IO error from the compute: {e:#}"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ use pq_proto::StartupMessageParams;
|
|||||||
use smol_str::SmolStr;
|
use smol_str::SmolStr;
|
||||||
use tokio::sync::mpsc;
|
use tokio::sync::mpsc;
|
||||||
use tracing::field::display;
|
use tracing::field::display;
|
||||||
use tracing::{debug, error, info_span, Span};
|
use tracing::{Span, debug, error, info_span};
|
||||||
use try_lock::TryLock;
|
use try_lock::TryLock;
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ use chrono::{Datelike, Timelike};
|
|||||||
use futures::{Stream, StreamExt};
|
use futures::{Stream, StreamExt};
|
||||||
use parquet::basic::Compression;
|
use parquet::basic::Compression;
|
||||||
use parquet::file::metadata::RowGroupMetaDataPtr;
|
use parquet::file::metadata::RowGroupMetaDataPtr;
|
||||||
use parquet::file::properties::{WriterProperties, WriterPropertiesPtr, DEFAULT_PAGE_SIZE};
|
use parquet::file::properties::{DEFAULT_PAGE_SIZE, WriterProperties, WriterPropertiesPtr};
|
||||||
use parquet::file::writer::SerializedFileWriter;
|
use parquet::file::writer::SerializedFileWriter;
|
||||||
use parquet::record::RecordWriter;
|
use parquet::record::RecordWriter;
|
||||||
use pq_proto::StartupMessageParams;
|
use pq_proto::StartupMessageParams;
|
||||||
@@ -17,10 +17,10 @@ use serde::ser::SerializeMap;
|
|||||||
use tokio::sync::mpsc;
|
use tokio::sync::mpsc;
|
||||||
use tokio::time;
|
use tokio::time;
|
||||||
use tokio_util::sync::CancellationToken;
|
use tokio_util::sync::CancellationToken;
|
||||||
use tracing::{debug, info, Span};
|
use tracing::{Span, debug, info};
|
||||||
use utils::backoff;
|
use utils::backoff;
|
||||||
|
|
||||||
use super::{RequestContextInner, LOG_CHAN};
|
use super::{LOG_CHAN, RequestContextInner};
|
||||||
use crate::config::remote_storage_from_toml;
|
use crate::config::remote_storage_from_toml;
|
||||||
use crate::context::LOG_CHAN_DISCONNECT;
|
use crate::context::LOG_CHAN_DISCONNECT;
|
||||||
use crate::ext::TaskExt;
|
use crate::ext::TaskExt;
|
||||||
@@ -425,20 +425,20 @@ mod tests {
|
|||||||
use futures::{Stream, StreamExt};
|
use futures::{Stream, StreamExt};
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use parquet::basic::{Compression, ZstdLevel};
|
use parquet::basic::{Compression, ZstdLevel};
|
||||||
use parquet::file::properties::{WriterProperties, DEFAULT_PAGE_SIZE};
|
use parquet::file::properties::{DEFAULT_PAGE_SIZE, WriterProperties};
|
||||||
use parquet::file::reader::FileReader;
|
use parquet::file::reader::FileReader;
|
||||||
use parquet::file::serialized_reader::SerializedFileReader;
|
use parquet::file::serialized_reader::SerializedFileReader;
|
||||||
use rand::rngs::StdRng;
|
use rand::rngs::StdRng;
|
||||||
use rand::{Rng, SeedableRng};
|
use rand::{Rng, SeedableRng};
|
||||||
use remote_storage::{
|
use remote_storage::{
|
||||||
GenericRemoteStorage, RemoteStorageConfig, RemoteStorageKind, S3Config,
|
|
||||||
DEFAULT_MAX_KEYS_PER_LIST_RESPONSE, DEFAULT_REMOTE_STORAGE_S3_CONCURRENCY_LIMIT,
|
DEFAULT_MAX_KEYS_PER_LIST_RESPONSE, DEFAULT_REMOTE_STORAGE_S3_CONCURRENCY_LIMIT,
|
||||||
|
GenericRemoteStorage, RemoteStorageConfig, RemoteStorageKind, S3Config,
|
||||||
};
|
};
|
||||||
use tokio::sync::mpsc;
|
use tokio::sync::mpsc;
|
||||||
use tokio::time;
|
use tokio::time;
|
||||||
use walkdir::WalkDir;
|
use walkdir::WalkDir;
|
||||||
|
|
||||||
use super::{worker_inner, ParquetConfig, ParquetUploadArgs, RequestData};
|
use super::{ParquetConfig, ParquetUploadArgs, RequestData, worker_inner};
|
||||||
|
|
||||||
#[derive(Parser)]
|
#[derive(Parser)]
|
||||||
struct ProxyCliArgs {
|
struct ProxyCliArgs {
|
||||||
@@ -514,26 +514,26 @@ mod tests {
|
|||||||
|
|
||||||
fn generate_request_data(rng: &mut impl Rng) -> RequestData {
|
fn generate_request_data(rng: &mut impl Rng) -> RequestData {
|
||||||
RequestData {
|
RequestData {
|
||||||
session_id: uuid::Builder::from_random_bytes(rng.gen()).into_uuid(),
|
session_id: uuid::Builder::from_random_bytes(rng.r#gen()).into_uuid(),
|
||||||
peer_addr: Ipv4Addr::from(rng.gen::<[u8; 4]>()).to_string(),
|
peer_addr: Ipv4Addr::from(rng.r#gen::<[u8; 4]>()).to_string(),
|
||||||
timestamp: chrono::DateTime::from_timestamp_millis(
|
timestamp: chrono::DateTime::from_timestamp_millis(
|
||||||
rng.gen_range(1703862754..1803862754),
|
rng.gen_range(1703862754..1803862754),
|
||||||
)
|
)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.naive_utc(),
|
.naive_utc(),
|
||||||
application_name: Some("test".to_owned()),
|
application_name: Some("test".to_owned()),
|
||||||
username: Some(hex::encode(rng.gen::<[u8; 4]>())),
|
username: Some(hex::encode(rng.r#gen::<[u8; 4]>())),
|
||||||
endpoint_id: Some(hex::encode(rng.gen::<[u8; 16]>())),
|
endpoint_id: Some(hex::encode(rng.r#gen::<[u8; 16]>())),
|
||||||
database: Some(hex::encode(rng.gen::<[u8; 16]>())),
|
database: Some(hex::encode(rng.r#gen::<[u8; 16]>())),
|
||||||
project: Some(hex::encode(rng.gen::<[u8; 16]>())),
|
project: Some(hex::encode(rng.r#gen::<[u8; 16]>())),
|
||||||
branch: Some(hex::encode(rng.gen::<[u8; 16]>())),
|
branch: Some(hex::encode(rng.r#gen::<[u8; 16]>())),
|
||||||
pg_options: None,
|
pg_options: None,
|
||||||
auth_method: None,
|
auth_method: None,
|
||||||
jwt_issuer: None,
|
jwt_issuer: None,
|
||||||
protocol: ["tcp", "ws", "http"][rng.gen_range(0..3)],
|
protocol: ["tcp", "ws", "http"][rng.gen_range(0..3)],
|
||||||
region: "us-east-1",
|
region: "us-east-1",
|
||||||
error: None,
|
error: None,
|
||||||
success: rng.gen(),
|
success: rng.r#gen(),
|
||||||
cold_start_info: "no",
|
cold_start_info: "no",
|
||||||
duration_us: rng.gen_range(0..30_000_000),
|
duration_us: rng.gen_range(0..30_000_000),
|
||||||
disconnect_timestamp: None,
|
disconnect_timestamp: None,
|
||||||
|
|||||||
@@ -3,16 +3,16 @@
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use ::http::header::AUTHORIZATION;
|
|
||||||
use ::http::HeaderName;
|
use ::http::HeaderName;
|
||||||
|
use ::http::header::AUTHORIZATION;
|
||||||
use futures::TryFutureExt;
|
use futures::TryFutureExt;
|
||||||
use postgres_client::config::SslMode;
|
use postgres_client::config::SslMode;
|
||||||
use tokio::time::Instant;
|
use tokio::time::Instant;
|
||||||
use tracing::{debug, info, info_span, warn, Instrument};
|
use tracing::{Instrument, debug, info, info_span, warn};
|
||||||
|
|
||||||
use super::super::messages::{ControlPlaneErrorMessage, GetEndpointAccessControl, WakeCompute};
|
use super::super::messages::{ControlPlaneErrorMessage, GetEndpointAccessControl, WakeCompute};
|
||||||
use crate::auth::backend::jwt::AuthRule;
|
|
||||||
use crate::auth::backend::ComputeUserInfo;
|
use crate::auth::backend::ComputeUserInfo;
|
||||||
|
use crate::auth::backend::jwt::AuthRule;
|
||||||
use crate::cache::Cached;
|
use crate::cache::Cached;
|
||||||
use crate::context::RequestContext;
|
use crate::context::RequestContext;
|
||||||
use crate::control_plane::caches::ApiCaches;
|
use crate::control_plane::caches::ApiCaches;
|
||||||
|
|||||||
@@ -6,11 +6,11 @@ use std::sync::Arc;
|
|||||||
use futures::TryFutureExt;
|
use futures::TryFutureExt;
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
use tokio_postgres::Client;
|
use tokio_postgres::Client;
|
||||||
use tracing::{error, info, info_span, warn, Instrument};
|
use tracing::{Instrument, error, info, info_span, warn};
|
||||||
|
|
||||||
use crate::auth::backend::jwt::AuthRule;
|
|
||||||
use crate::auth::backend::ComputeUserInfo;
|
|
||||||
use crate::auth::IpPattern;
|
use crate::auth::IpPattern;
|
||||||
|
use crate::auth::backend::ComputeUserInfo;
|
||||||
|
use crate::auth::backend::jwt::AuthRule;
|
||||||
use crate::cache::Cached;
|
use crate::cache::Cached;
|
||||||
use crate::context::RequestContext;
|
use crate::context::RequestContext;
|
||||||
use crate::control_plane::client::{
|
use crate::control_plane::client::{
|
||||||
|
|||||||
@@ -10,15 +10,15 @@ use clashmap::ClashMap;
|
|||||||
use tokio::time::Instant;
|
use tokio::time::Instant;
|
||||||
use tracing::{debug, info};
|
use tracing::{debug, info};
|
||||||
|
|
||||||
use crate::auth::backend::jwt::{AuthRule, FetchAuthRules, FetchAuthRulesError};
|
|
||||||
use crate::auth::backend::ComputeUserInfo;
|
use crate::auth::backend::ComputeUserInfo;
|
||||||
|
use crate::auth::backend::jwt::{AuthRule, FetchAuthRules, FetchAuthRulesError};
|
||||||
use crate::cache::endpoints::EndpointsCache;
|
use crate::cache::endpoints::EndpointsCache;
|
||||||
use crate::cache::project_info::ProjectInfoCacheImpl;
|
use crate::cache::project_info::ProjectInfoCacheImpl;
|
||||||
use crate::config::{CacheOptions, EndpointCacheConfig, ProjectInfoCacheOptions};
|
use crate::config::{CacheOptions, EndpointCacheConfig, ProjectInfoCacheOptions};
|
||||||
use crate::context::RequestContext;
|
use crate::context::RequestContext;
|
||||||
use crate::control_plane::{
|
use crate::control_plane::{
|
||||||
errors, CachedAccessBlockerFlags, CachedAllowedIps, CachedAllowedVpcEndpointIds,
|
CachedAccessBlockerFlags, CachedAllowedIps, CachedAllowedVpcEndpointIds, CachedNodeInfo,
|
||||||
CachedNodeInfo, CachedRoleSecret, ControlPlaneApi, NodeInfoCache,
|
CachedRoleSecret, ControlPlaneApi, NodeInfoCache, errors,
|
||||||
};
|
};
|
||||||
use crate::error::ReportableError;
|
use crate::error::ReportableError;
|
||||||
use crate::metrics::ApiLockMetrics;
|
use crate::metrics::ApiLockMetrics;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ use thiserror::Error;
|
|||||||
|
|
||||||
use crate::control_plane::client::ApiLockError;
|
use crate::control_plane::client::ApiLockError;
|
||||||
use crate::control_plane::messages::{self, ControlPlaneErrorMessage, Reason};
|
use crate::control_plane::messages::{self, ControlPlaneErrorMessage, Reason};
|
||||||
use crate::error::{io_error, ErrorKind, ReportableError, UserFacingError};
|
use crate::error::{ErrorKind, ReportableError, UserFacingError, io_error};
|
||||||
use crate::proxy::retry::CouldRetry;
|
use crate::proxy::retry::CouldRetry;
|
||||||
|
|
||||||
/// A go-to error message which doesn't leak any detail.
|
/// A go-to error message which doesn't leak any detail.
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ use postgres_backend::{AuthType, PostgresBackend, PostgresBackendTCP, QueryError
|
|||||||
use pq_proto::{BeMessage, SINGLE_COL_ROWDESC};
|
use pq_proto::{BeMessage, SINGLE_COL_ROWDESC};
|
||||||
use tokio::net::{TcpListener, TcpStream};
|
use tokio::net::{TcpListener, TcpStream};
|
||||||
use tokio_util::sync::CancellationToken;
|
use tokio_util::sync::CancellationToken;
|
||||||
use tracing::{error, info, info_span, Instrument};
|
use tracing::{Instrument, error, info, info_span};
|
||||||
|
|
||||||
use crate::control_plane::messages::{DatabaseInfo, KickSession};
|
use crate::control_plane::messages::{DatabaseInfo, KickSession};
|
||||||
use crate::waiters::{self, Waiter, Waiters};
|
use crate::waiters::{self, Waiter, Waiters};
|
||||||
|
|||||||
@@ -11,9 +11,9 @@ pub(crate) mod errors;
|
|||||||
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use crate::auth::IpPattern;
|
||||||
use crate::auth::backend::jwt::AuthRule;
|
use crate::auth::backend::jwt::AuthRule;
|
||||||
use crate::auth::backend::{ComputeCredentialKeys, ComputeUserInfo};
|
use crate::auth::backend::{ComputeCredentialKeys, ComputeUserInfo};
|
||||||
use crate::auth::IpPattern;
|
|
||||||
use crate::cache::project_info::ProjectInfoCacheImpl;
|
use crate::cache::project_info::ProjectInfoCacheImpl;
|
||||||
use crate::cache::{Cached, TimedLru};
|
use crate::cache::{Cached, TimedLru};
|
||||||
use crate::config::ComputeConfig;
|
use crate::config::ComputeConfig;
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ use http_utils::json::json_response;
|
|||||||
use http_utils::{RouterBuilder, RouterService};
|
use http_utils::{RouterBuilder, RouterService};
|
||||||
use hyper0::header::CONTENT_TYPE;
|
use hyper0::header::CONTENT_TYPE;
|
||||||
use hyper0::{Body, Request, Response, StatusCode};
|
use hyper0::{Body, Request, Response, StatusCode};
|
||||||
use measured::text::BufferedTextEncoder;
|
|
||||||
use measured::MetricGroup;
|
use measured::MetricGroup;
|
||||||
|
use measured::text::BufferedTextEncoder;
|
||||||
use metrics::NeonMetrics;
|
use metrics::NeonMetrics;
|
||||||
use tracing::{info, info_span};
|
use tracing::{info, info_span};
|
||||||
|
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ use hyper::body::Body;
|
|||||||
pub(crate) use reqwest::{Request, Response};
|
pub(crate) use reqwest::{Request, Response};
|
||||||
use reqwest_middleware::RequestBuilder;
|
use reqwest_middleware::RequestBuilder;
|
||||||
pub(crate) use reqwest_middleware::{ClientWithMiddleware, Error};
|
pub(crate) use reqwest_middleware::{ClientWithMiddleware, Error};
|
||||||
pub(crate) use reqwest_retry::policies::ExponentialBackoff;
|
|
||||||
pub(crate) use reqwest_retry::RetryTransientMiddleware;
|
pub(crate) use reqwest_retry::RetryTransientMiddleware;
|
||||||
|
pub(crate) use reqwest_retry::policies::ExponentialBackoff;
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
use crate::metrics::{ConsoleRequest, Metrics};
|
use crate::metrics::{ConsoleRequest, Metrics};
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ use opentelemetry::trace::TraceContextExt;
|
|||||||
use scopeguard::defer;
|
use scopeguard::defer;
|
||||||
use serde::ser::{SerializeMap, Serializer};
|
use serde::ser::{SerializeMap, Serializer};
|
||||||
use tracing::subscriber::Interest;
|
use tracing::subscriber::Interest;
|
||||||
use tracing::{callsite, span, Event, Metadata, Span, Subscriber};
|
use tracing::{Event, Metadata, Span, Subscriber, callsite, span};
|
||||||
use tracing_opentelemetry::OpenTelemetrySpanExt;
|
use tracing_opentelemetry::OpenTelemetrySpanExt;
|
||||||
use tracing_subscriber::filter::{EnvFilter, LevelFilter};
|
use tracing_subscriber::filter::{EnvFilter, LevelFilter};
|
||||||
use tracing_subscriber::fmt::format::{Format, Full};
|
use tracing_subscriber::fmt::format::{Format, Full};
|
||||||
|
|||||||
@@ -543,11 +543,7 @@ impl Drop for LatencyTimer {
|
|||||||
|
|
||||||
impl From<bool> for Bool {
|
impl From<bool> for Bool {
|
||||||
fn from(value: bool) -> Self {
|
fn from(value: bool) -> Self {
|
||||||
if value {
|
if value { Bool::True } else { Bool::False }
|
||||||
Bool::True
|
|
||||||
} else {
|
|
||||||
Bool::False
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -407,7 +407,7 @@ mod tests {
|
|||||||
use tokio::io::AsyncReadExt;
|
use tokio::io::AsyncReadExt;
|
||||||
|
|
||||||
use crate::protocol2::{
|
use crate::protocol2::{
|
||||||
read_proxy_protocol, ConnectHeader, LOCAL_V2, PROXY_V2, TCP_OVER_IPV4, UDP_OVER_IPV6,
|
ConnectHeader, LOCAL_V2, PROXY_V2, TCP_OVER_IPV4, UDP_OVER_IPV6, read_proxy_protocol,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ use tracing::{debug, info, warn};
|
|||||||
|
|
||||||
use super::retry::ShouldRetryWakeCompute;
|
use super::retry::ShouldRetryWakeCompute;
|
||||||
use crate::auth::backend::{ComputeCredentialKeys, ComputeUserInfo};
|
use crate::auth::backend::{ComputeCredentialKeys, ComputeUserInfo};
|
||||||
use crate::compute::{self, PostgresConnection, COULD_NOT_CONNECT};
|
use crate::compute::{self, COULD_NOT_CONNECT, PostgresConnection};
|
||||||
use crate::config::{ComputeConfig, RetryConfig};
|
use crate::config::{ComputeConfig, RetryConfig};
|
||||||
use crate::context::RequestContext;
|
use crate::context::RequestContext;
|
||||||
use crate::control_plane::errors::WakeComputeError;
|
use crate::control_plane::errors::WakeComputeError;
|
||||||
@@ -15,7 +15,7 @@ use crate::error::ReportableError;
|
|||||||
use crate::metrics::{
|
use crate::metrics::{
|
||||||
ConnectOutcome, ConnectionFailureKind, Metrics, RetriesMetricGroup, RetryType,
|
ConnectOutcome, ConnectionFailureKind, Metrics, RetriesMetricGroup, RetryType,
|
||||||
};
|
};
|
||||||
use crate::proxy::retry::{retry_after, should_retry, CouldRetry};
|
use crate::proxy::retry::{CouldRetry, retry_after, should_retry};
|
||||||
use crate::proxy::wake_compute::wake_compute;
|
use crate::proxy::wake_compute::wake_compute;
|
||||||
use crate::types::Host;
|
use crate::types::Host;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use std::future::poll_fn;
|
use std::future::poll_fn;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
use std::task::{ready, Context, Poll};
|
use std::task::{Context, Poll, ready};
|
||||||
|
|
||||||
use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
|
use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
|
||||||
use tracing::info;
|
use tracing::info;
|
||||||
|
|||||||
@@ -9,28 +9,28 @@ pub(crate) mod retry;
|
|||||||
pub(crate) mod wake_compute;
|
pub(crate) mod wake_compute;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
pub use copy_bidirectional::{copy_bidirectional_client_compute, ErrorSource};
|
pub use copy_bidirectional::{ErrorSource, copy_bidirectional_client_compute};
|
||||||
use futures::{FutureExt, TryFutureExt};
|
use futures::{FutureExt, TryFutureExt};
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use once_cell::sync::OnceCell;
|
use once_cell::sync::OnceCell;
|
||||||
use pq_proto::{BeMessage as Be, CancelKeyData, StartupMessageParams};
|
use pq_proto::{BeMessage as Be, CancelKeyData, StartupMessageParams};
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use smol_str::{format_smolstr, SmolStr, ToSmolStr};
|
use smol_str::{SmolStr, ToSmolStr, format_smolstr};
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
use tokio::io::{AsyncRead, AsyncWrite, AsyncWriteExt};
|
use tokio::io::{AsyncRead, AsyncWrite, AsyncWriteExt};
|
||||||
use tokio_util::sync::CancellationToken;
|
use tokio_util::sync::CancellationToken;
|
||||||
use tracing::{debug, error, info, warn, Instrument};
|
use tracing::{Instrument, debug, error, info, warn};
|
||||||
|
|
||||||
use self::connect_compute::{connect_to_compute, TcpMechanism};
|
use self::connect_compute::{TcpMechanism, connect_to_compute};
|
||||||
use self::passthrough::ProxyPassthrough;
|
use self::passthrough::ProxyPassthrough;
|
||||||
use crate::cancellation::{self, CancellationHandler};
|
use crate::cancellation::{self, CancellationHandler};
|
||||||
use crate::config::{ProxyConfig, ProxyProtocolV2, TlsConfig};
|
use crate::config::{ProxyConfig, ProxyProtocolV2, TlsConfig};
|
||||||
use crate::context::RequestContext;
|
use crate::context::RequestContext;
|
||||||
use crate::error::ReportableError;
|
use crate::error::ReportableError;
|
||||||
use crate::metrics::{Metrics, NumClientConnectionsGuard};
|
use crate::metrics::{Metrics, NumClientConnectionsGuard};
|
||||||
use crate::protocol2::{read_proxy_protocol, ConnectHeader, ConnectionInfo, ConnectionInfoExtra};
|
use crate::protocol2::{ConnectHeader, ConnectionInfo, ConnectionInfoExtra, read_proxy_protocol};
|
||||||
use crate::proxy::handshake::{handshake, HandshakeData};
|
use crate::proxy::handshake::{HandshakeData, handshake};
|
||||||
use crate::rate_limiter::EndpointRateLimiter;
|
use crate::rate_limiter::EndpointRateLimiter;
|
||||||
use crate::stream::{PqStream, Stream};
|
use crate::stream::{PqStream, Stream};
|
||||||
use crate::types::EndpointCacheKey;
|
use crate::types::EndpointCacheKey;
|
||||||
|
|||||||
@@ -5,12 +5,12 @@ mod mitm;
|
|||||||
|
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use anyhow::{bail, Context};
|
use anyhow::{Context, bail};
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use http::StatusCode;
|
use http::StatusCode;
|
||||||
use postgres_client::config::SslMode;
|
use postgres_client::config::SslMode;
|
||||||
use postgres_client::tls::{MakeTlsConnect, NoTls};
|
use postgres_client::tls::{MakeTlsConnect, NoTls};
|
||||||
use retry::{retry_after, ShouldRetryWakeCompute};
|
use retry::{ShouldRetryWakeCompute, retry_after};
|
||||||
use rstest::rstest;
|
use rstest::rstest;
|
||||||
use rustls::crypto::ring;
|
use rustls::crypto::ring;
|
||||||
use rustls::pki_types;
|
use rustls::pki_types;
|
||||||
@@ -334,8 +334,8 @@ async fn scram_auth_mock() -> anyhow::Result<()> {
|
|||||||
generate_tls_config("generic-project-name.localhost", "localhost")?;
|
generate_tls_config("generic-project-name.localhost", "localhost")?;
|
||||||
let proxy = tokio::spawn(dummy_proxy(client, Some(server_config), Scram::mock()));
|
let proxy = tokio::spawn(dummy_proxy(client, Some(server_config), Scram::mock()));
|
||||||
|
|
||||||
use rand::distributions::Alphanumeric;
|
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
|
use rand::distributions::Alphanumeric;
|
||||||
let password: String = rand::thread_rng()
|
let password: String = rand::thread_rng()
|
||||||
.sample_iter(&Alphanumeric)
|
.sample_iter(&Alphanumeric)
|
||||||
.take(rand::random::<u8>() as usize)
|
.take(rand::random::<u8>() as usize)
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ use tracing::{error, info};
|
|||||||
use super::connect_compute::ComputeConnectBackend;
|
use super::connect_compute::ComputeConnectBackend;
|
||||||
use crate::config::RetryConfig;
|
use crate::config::RetryConfig;
|
||||||
use crate::context::RequestContext;
|
use crate::context::RequestContext;
|
||||||
use crate::control_plane::errors::{ControlPlaneError, WakeComputeError};
|
|
||||||
use crate::control_plane::CachedNodeInfo;
|
use crate::control_plane::CachedNodeInfo;
|
||||||
|
use crate::control_plane::errors::{ControlPlaneError, WakeComputeError};
|
||||||
use crate::error::ReportableError;
|
use crate::error::ReportableError;
|
||||||
use crate::metrics::{
|
use crate::metrics::{
|
||||||
ConnectOutcome, ConnectionFailuresBreakdownGroup, Metrics, RetriesMetricGroup, RetryType,
|
ConnectOutcome, ConnectionFailuresBreakdownGroup, Metrics, RetriesMetricGroup, RetryType,
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ use std::sync::atomic::{AtomicUsize, Ordering};
|
|||||||
|
|
||||||
use ahash::RandomState;
|
use ahash::RandomState;
|
||||||
use clashmap::ClashMap;
|
use clashmap::ClashMap;
|
||||||
use rand::{thread_rng, Rng};
|
use rand::{Rng, thread_rng};
|
||||||
use tokio::time::Instant;
|
use tokio::time::Instant;
|
||||||
use tracing::info;
|
use tracing::info;
|
||||||
use utils::leaky_bucket::LeakyBucketState;
|
use utils::leaky_bucket::LeakyBucketState;
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ use std::time::Duration;
|
|||||||
|
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
use tokio::sync::Notify;
|
use tokio::sync::Notify;
|
||||||
use tokio::time::error::Elapsed;
|
|
||||||
use tokio::time::Instant;
|
use tokio::time::Instant;
|
||||||
|
use tokio::time::error::Elapsed;
|
||||||
|
|
||||||
use self::aimd::Aimd;
|
use self::aimd::Aimd;
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
use std::collections::hash_map::RandomState;
|
use std::collections::hash_map::RandomState;
|
||||||
use std::hash::{BuildHasher, Hash};
|
use std::hash::{BuildHasher, Hash};
|
||||||
use std::sync::atomic::{AtomicUsize, Ordering};
|
|
||||||
use std::sync::Mutex;
|
use std::sync::Mutex;
|
||||||
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||||
|
|
||||||
use anyhow::bail;
|
use anyhow::bail;
|
||||||
use clashmap::ClashMap;
|
use clashmap::ClashMap;
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::{Duration, SystemTime};
|
use std::time::{Duration, SystemTime};
|
||||||
|
|
||||||
|
use aws_config::Region;
|
||||||
use aws_config::environment::EnvironmentVariableCredentialsProvider;
|
use aws_config::environment::EnvironmentVariableCredentialsProvider;
|
||||||
use aws_config::imds::credentials::ImdsCredentialsProvider;
|
use aws_config::imds::credentials::ImdsCredentialsProvider;
|
||||||
use aws_config::meta::credentials::CredentialsProviderChain;
|
use aws_config::meta::credentials::CredentialsProviderChain;
|
||||||
@@ -8,7 +9,6 @@ use aws_config::meta::region::RegionProviderChain;
|
|||||||
use aws_config::profile::ProfileFileCredentialsProvider;
|
use aws_config::profile::ProfileFileCredentialsProvider;
|
||||||
use aws_config::provider_config::ProviderConfig;
|
use aws_config::provider_config::ProviderConfig;
|
||||||
use aws_config::web_identity_token::WebIdentityTokenCredentialsProvider;
|
use aws_config::web_identity_token::WebIdentityTokenCredentialsProvider;
|
||||||
use aws_config::Region;
|
|
||||||
use aws_sdk_iam::config::ProvideCredentials;
|
use aws_sdk_iam::config::ProvideCredentials;
|
||||||
use aws_sigv4::http_request::{
|
use aws_sigv4::http_request::{
|
||||||
self, SignableBody, SignableRequest, SignatureLocation, SigningSettings,
|
self, SignableBody, SignableRequest, SignatureLocation, SigningSettings,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use std::io::ErrorKind;
|
use std::io::ErrorKind;
|
||||||
|
|
||||||
use anyhow::Ok;
|
use anyhow::Ok;
|
||||||
use pq_proto::{id_to_cancel_key, CancelKeyData};
|
use pq_proto::{CancelKeyData, id_to_cancel_key};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
pub mod keyspace {
|
pub mod keyspace {
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ use std::io;
|
|||||||
use tokio::io::{AsyncRead, AsyncWrite};
|
use tokio::io::{AsyncRead, AsyncWrite};
|
||||||
use tracing::info;
|
use tracing::info;
|
||||||
|
|
||||||
use super::messages::ServerMessage;
|
|
||||||
use super::Mechanism;
|
use super::Mechanism;
|
||||||
|
use super::messages::ServerMessage;
|
||||||
use crate::stream::PqStream;
|
use crate::stream::PqStream;
|
||||||
|
|
||||||
/// Abstracts away all peculiarities of the libpq's protocol.
|
/// Abstracts away all peculiarities of the libpq's protocol.
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ mod tests {
|
|||||||
// number of insert operations
|
// number of insert operations
|
||||||
let m = rng.gen_range(1..100);
|
let m = rng.gen_range(1..100);
|
||||||
|
|
||||||
let id = uuid::Builder::from_random_bytes(rng.gen()).into_uuid();
|
let id = uuid::Builder::from_random_bytes(rng.r#gen()).into_uuid();
|
||||||
ids.push((id, n, m));
|
ids.push((id, n, m));
|
||||||
|
|
||||||
// N = sum(actual)
|
// N = sum(actual)
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ use std::convert::Infallible;
|
|||||||
use hmac::{Hmac, Mac};
|
use hmac::{Hmac, Mac};
|
||||||
use sha2::Sha256;
|
use sha2::Sha256;
|
||||||
|
|
||||||
|
use super::ScramKey;
|
||||||
use super::messages::{
|
use super::messages::{
|
||||||
ClientFinalMessage, ClientFirstMessage, OwnedServerFirstMessage, SCRAM_RAW_NONCE_LEN,
|
ClientFinalMessage, ClientFirstMessage, OwnedServerFirstMessage, SCRAM_RAW_NONCE_LEN,
|
||||||
};
|
};
|
||||||
@@ -12,7 +13,6 @@ use super::pbkdf2::Pbkdf2;
|
|||||||
use super::secret::ServerSecret;
|
use super::secret::ServerSecret;
|
||||||
use super::signature::SignatureBuilder;
|
use super::signature::SignatureBuilder;
|
||||||
use super::threadpool::ThreadPool;
|
use super::threadpool::ThreadPool;
|
||||||
use super::ScramKey;
|
|
||||||
use crate::intern::EndpointIdInt;
|
use crate::intern::EndpointIdInt;
|
||||||
use crate::sasl::{self, ChannelBinding, Error as SaslError};
|
use crate::sasl::{self, ChannelBinding, Error as SaslError};
|
||||||
|
|
||||||
@@ -208,8 +208,8 @@ impl sasl::Mechanism for Exchange<'_> {
|
|||||||
type Output = super::ScramKey;
|
type Output = super::ScramKey;
|
||||||
|
|
||||||
fn exchange(mut self, input: &str) -> sasl::Result<sasl::Step<Self, Self::Output>> {
|
fn exchange(mut self, input: &str) -> sasl::Result<sasl::Step<Self, Self::Output>> {
|
||||||
use sasl::Step;
|
|
||||||
use ExchangeState;
|
use ExchangeState;
|
||||||
|
use sasl::Step;
|
||||||
match &self.state {
|
match &self.state {
|
||||||
ExchangeState::Initial(init) => {
|
ExchangeState::Initial(init) => {
|
||||||
match init.transition(self.secret, &self.tls_server_end_point, input)? {
|
match init.transition(self.secret, &self.tls_server_end_point, input)? {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ use std::fmt;
|
|||||||
use std::ops::Range;
|
use std::ops::Range;
|
||||||
|
|
||||||
use super::base64_decode_array;
|
use super::base64_decode_array;
|
||||||
use super::key::{ScramKey, SCRAM_KEY_LEN};
|
use super::key::{SCRAM_KEY_LEN, ScramKey};
|
||||||
use super::signature::SignatureBuilder;
|
use super::signature::SignatureBuilder;
|
||||||
use crate::sasl::ChannelBinding;
|
use crate::sasl::ChannelBinding;
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ mod secret;
|
|||||||
mod signature;
|
mod signature;
|
||||||
pub mod threadpool;
|
pub mod threadpool;
|
||||||
|
|
||||||
pub(crate) use exchange::{exchange, Exchange};
|
pub(crate) use exchange::{Exchange, exchange};
|
||||||
use hmac::{Hmac, Mac};
|
use hmac::{Hmac, Mac};
|
||||||
pub(crate) use key::ScramKey;
|
pub(crate) use key::ScramKey;
|
||||||
pub(crate) use secret::ServerSecret;
|
pub(crate) use secret::ServerSecret;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
//! Tools for client/server signature management.
|
//! Tools for client/server signature management.
|
||||||
|
|
||||||
use super::key::{ScramKey, SCRAM_KEY_LEN};
|
use super::key::{SCRAM_KEY_LEN, ScramKey};
|
||||||
|
|
||||||
/// A collection of message parts needed to derive the client's signature.
|
/// A collection of message parts needed to derive the client's signature.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|||||||
@@ -7,27 +7,27 @@ use ed25519_dalek::SigningKey;
|
|||||||
use hyper_util::rt::{TokioExecutor, TokioIo, TokioTimer};
|
use hyper_util::rt::{TokioExecutor, TokioIo, TokioTimer};
|
||||||
use jose_jwk::jose_b64;
|
use jose_jwk::jose_b64;
|
||||||
use rand::rngs::OsRng;
|
use rand::rngs::OsRng;
|
||||||
use tokio::net::{lookup_host, TcpStream};
|
use tokio::net::{TcpStream, lookup_host};
|
||||||
use tracing::field::display;
|
use tracing::field::display;
|
||||||
use tracing::{debug, info};
|
use tracing::{debug, info};
|
||||||
|
|
||||||
use super::conn_pool::poll_client;
|
use super::conn_pool::poll_client;
|
||||||
use super::conn_pool_lib::{Client, ConnInfo, EndpointConnPool, GlobalConnPool};
|
use super::conn_pool_lib::{Client, ConnInfo, EndpointConnPool, GlobalConnPool};
|
||||||
use super::http_conn_pool::{self, poll_http2_client, HttpConnPool, Send};
|
use super::http_conn_pool::{self, HttpConnPool, Send, poll_http2_client};
|
||||||
use super::local_conn_pool::{self, LocalConnPool, EXT_NAME, EXT_SCHEMA, EXT_VERSION};
|
use super::local_conn_pool::{self, EXT_NAME, EXT_SCHEMA, EXT_VERSION, LocalConnPool};
|
||||||
use crate::auth::backend::local::StaticAuthRules;
|
use crate::auth::backend::local::StaticAuthRules;
|
||||||
use crate::auth::backend::{ComputeCredentials, ComputeUserInfo};
|
use crate::auth::backend::{ComputeCredentials, ComputeUserInfo};
|
||||||
use crate::auth::{self, check_peer_addr_is_in_list, AuthError};
|
use crate::auth::{self, AuthError, check_peer_addr_is_in_list};
|
||||||
use crate::compute;
|
use crate::compute;
|
||||||
use crate::compute_ctl::{
|
use crate::compute_ctl::{
|
||||||
ComputeCtlError, ExtensionInstallRequest, Privilege, SetRoleGrantsRequest,
|
ComputeCtlError, ExtensionInstallRequest, Privilege, SetRoleGrantsRequest,
|
||||||
};
|
};
|
||||||
use crate::config::{ComputeConfig, ProxyConfig};
|
use crate::config::{ComputeConfig, ProxyConfig};
|
||||||
use crate::context::RequestContext;
|
use crate::context::RequestContext;
|
||||||
|
use crate::control_plane::CachedNodeInfo;
|
||||||
use crate::control_plane::client::ApiLockError;
|
use crate::control_plane::client::ApiLockError;
|
||||||
use crate::control_plane::errors::{GetAuthInfoError, WakeComputeError};
|
use crate::control_plane::errors::{GetAuthInfoError, WakeComputeError};
|
||||||
use crate::control_plane::locks::ApiLocks;
|
use crate::control_plane::locks::ApiLocks;
|
||||||
use crate::control_plane::CachedNodeInfo;
|
|
||||||
use crate::error::{ErrorKind, ReportableError, UserFacingError};
|
use crate::error::{ErrorKind, ReportableError, UserFacingError};
|
||||||
use crate::intern::EndpointIdInt;
|
use crate::intern::EndpointIdInt;
|
||||||
use crate::protocol2::ConnectionInfoExtra;
|
use crate::protocol2::ConnectionInfoExtra;
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ use std::time::Duration;
|
|||||||
|
|
||||||
use indexmap::IndexMap;
|
use indexmap::IndexMap;
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
use rand::{thread_rng, Rng};
|
use rand::{Rng, thread_rng};
|
||||||
use rustc_hash::FxHasher;
|
use rustc_hash::FxHasher;
|
||||||
use tokio::time::Instant;
|
use tokio::time::Instant;
|
||||||
use tokio_util::sync::CancellationToken;
|
use tokio_util::sync::CancellationToken;
|
||||||
@@ -40,7 +40,7 @@ impl CancelSet {
|
|||||||
|
|
||||||
pub(crate) fn take(&self) -> Option<CancellationToken> {
|
pub(crate) fn take(&self) -> Option<CancellationToken> {
|
||||||
for _ in 0..4 {
|
for _ in 0..4 {
|
||||||
if let Some(token) = self.take_raw(thread_rng().gen()) {
|
if let Some(token) = self.take_raw(thread_rng().r#gen()) {
|
||||||
return Some(token);
|
return Some(token);
|
||||||
}
|
}
|
||||||
tracing::trace!("failed to get cancel token");
|
tracing::trace!("failed to get cancel token");
|
||||||
@@ -68,7 +68,7 @@ impl CancelShard {
|
|||||||
fn take(&mut self, rng: usize) -> Option<CancellationToken> {
|
fn take(&mut self, rng: usize) -> Option<CancellationToken> {
|
||||||
NonZeroUsize::new(self.tokens.len()).and_then(|len| {
|
NonZeroUsize::new(self.tokens.len()).and_then(|len| {
|
||||||
// 10 second grace period so we don't cancel new connections
|
// 10 second grace period so we don't cancel new connections
|
||||||
if self.tokens.get_index(rng % len)?.1 .0.elapsed() < Duration::from_secs(10) {
|
if self.tokens.get_index(rng % len)?.1.0.elapsed() < Duration::from_secs(10) {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::pin::pin;
|
use std::pin::pin;
|
||||||
use std::sync::{Arc, Weak};
|
use std::sync::{Arc, Weak};
|
||||||
use std::task::{ready, Poll};
|
use std::task::{Poll, ready};
|
||||||
|
|
||||||
use futures::future::poll_fn;
|
|
||||||
use futures::Future;
|
use futures::Future;
|
||||||
use postgres_client::tls::NoTlsStream;
|
use futures::future::poll_fn;
|
||||||
use postgres_client::AsyncMessage;
|
use postgres_client::AsyncMessage;
|
||||||
|
use postgres_client::tls::NoTlsStream;
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
use tokio::net::TcpStream;
|
use tokio::net::TcpStream;
|
||||||
use tokio::time::Instant;
|
use tokio::time::Instant;
|
||||||
use tokio_util::sync::CancellationToken;
|
use tokio_util::sync::CancellationToken;
|
||||||
use tracing::{error, info, info_span, warn, Instrument};
|
use tracing::{Instrument, error, info, info_span, warn};
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
use {
|
use {
|
||||||
super::conn_pool_lib::GlobalConnPoolOptions,
|
super::conn_pool_lib::GlobalConnPoolOptions,
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ use parking_lot::RwLock;
|
|||||||
use postgres_client::ReadyForQueryStatus;
|
use postgres_client::ReadyForQueryStatus;
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
use smol_str::ToSmolStr;
|
use smol_str::ToSmolStr;
|
||||||
use tracing::{debug, info, Span};
|
use tracing::{Span, debug, info};
|
||||||
|
|
||||||
use super::backend::HttpConnError;
|
use super::backend::HttpConnError;
|
||||||
use super::conn_pool::ClientDataRemote;
|
use super::conn_pool::ClientDataRemote;
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ use hyper_util::rt::{TokioExecutor, TokioIo};
|
|||||||
use parking_lot::RwLock;
|
use parking_lot::RwLock;
|
||||||
use smol_str::ToSmolStr;
|
use smol_str::ToSmolStr;
|
||||||
use tokio::net::TcpStream;
|
use tokio::net::TcpStream;
|
||||||
use tracing::{debug, error, info, info_span, Instrument};
|
use tracing::{Instrument, debug, error, info, info_span};
|
||||||
|
|
||||||
use super::backend::HttpConnError;
|
use super::backend::HttpConnError;
|
||||||
use super::conn_pool_lib::{
|
use super::conn_pool_lib::{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
use postgres_client::types::{Kind, Type};
|
|
||||||
use postgres_client::Row;
|
use postgres_client::Row;
|
||||||
|
use postgres_client::types::{Kind, Type};
|
||||||
use serde_json::{Map, Value};
|
use serde_json::{Map, Value};
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -11,24 +11,24 @@
|
|||||||
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::pin::pin;
|
use std::pin::pin;
|
||||||
use std::sync::atomic::AtomicUsize;
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::task::{ready, Poll};
|
use std::sync::atomic::AtomicUsize;
|
||||||
|
use std::task::{Poll, ready};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use ed25519_dalek::{Signature, Signer, SigningKey};
|
use ed25519_dalek::{Signature, Signer, SigningKey};
|
||||||
use futures::future::poll_fn;
|
|
||||||
use futures::Future;
|
use futures::Future;
|
||||||
|
use futures::future::poll_fn;
|
||||||
use indexmap::IndexMap;
|
use indexmap::IndexMap;
|
||||||
use jose_jwk::jose_b64::base64ct::{Base64UrlUnpadded, Encoding};
|
use jose_jwk::jose_b64::base64ct::{Base64UrlUnpadded, Encoding};
|
||||||
use parking_lot::RwLock;
|
use parking_lot::RwLock;
|
||||||
use postgres_client::tls::NoTlsStream;
|
|
||||||
use postgres_client::AsyncMessage;
|
use postgres_client::AsyncMessage;
|
||||||
|
use postgres_client::tls::NoTlsStream;
|
||||||
use serde_json::value::RawValue;
|
use serde_json::value::RawValue;
|
||||||
use tokio::net::TcpStream;
|
use tokio::net::TcpStream;
|
||||||
use tokio::time::Instant;
|
use tokio::time::Instant;
|
||||||
use tokio_util::sync::CancellationToken;
|
use tokio_util::sync::CancellationToken;
|
||||||
use tracing::{debug, error, info, info_span, warn, Instrument};
|
use tracing::{Instrument, debug, error, info, info_span, warn};
|
||||||
|
|
||||||
use super::backend::HttpConnError;
|
use super::backend::HttpConnError;
|
||||||
use super::conn_pool_lib::{
|
use super::conn_pool_lib::{
|
||||||
@@ -389,6 +389,9 @@ mod tests {
|
|||||||
// });
|
// });
|
||||||
// println!("{}", serde_json::to_string(&jwk).unwrap());
|
// println!("{}", serde_json::to_string(&jwk).unwrap());
|
||||||
|
|
||||||
assert_eq!(jwt, "eyJhbGciOiJFZERTQSJ9.eyJmb28iOiJiYXIiLCJqdGkiOjIsIm5lc3RlZCI6eyJqdGkiOiJ0cmlja3kgbmVzdGluZyJ9fQ.Cvyc2By33KI0f0obystwdy8PN111L3Sc9_Mr2CU3XshtSqSdxuRxNEZGbb_RvyJf2IzheC_s7aBZ-jLeQ9N0Bg");
|
assert_eq!(
|
||||||
|
jwt,
|
||||||
|
"eyJhbGciOiJFZERTQSJ9.eyJmb28iOiJiYXIiLCJqdGkiOjIsIm5lc3RlZCI6eyJqdGkiOiJ0cmlja3kgbmVzdGluZyJ9fQ.Cvyc2By33KI0f0obystwdy8PN111L3Sc9_Mr2CU3XshtSqSdxuRxNEZGbb_RvyJf2IzheC_s7aBZ-jLeQ9N0Bg"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ mod sql_over_http;
|
|||||||
mod websocket;
|
mod websocket;
|
||||||
|
|
||||||
use std::net::{IpAddr, SocketAddr};
|
use std::net::{IpAddr, SocketAddr};
|
||||||
use std::pin::{pin, Pin};
|
use std::pin::{Pin, pin};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use anyhow::Context;
|
use anyhow::Context;
|
||||||
@@ -23,8 +23,8 @@ use async_trait::async_trait;
|
|||||||
use atomic_take::AtomicTake;
|
use atomic_take::AtomicTake;
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
pub use conn_pool_lib::GlobalConnPoolOptions;
|
pub use conn_pool_lib::GlobalConnPoolOptions;
|
||||||
use futures::future::{select, Either};
|
|
||||||
use futures::TryFutureExt;
|
use futures::TryFutureExt;
|
||||||
|
use futures::future::{Either, select};
|
||||||
use http::{Method, Response, StatusCode};
|
use http::{Method, Response, StatusCode};
|
||||||
use http_body_util::combinators::BoxBody;
|
use http_body_util::combinators::BoxBody;
|
||||||
use http_body_util::{BodyExt, Empty};
|
use http_body_util::{BodyExt, Empty};
|
||||||
@@ -32,23 +32,23 @@ use http_utils::error::ApiError;
|
|||||||
use hyper::body::Incoming;
|
use hyper::body::Incoming;
|
||||||
use hyper_util::rt::TokioExecutor;
|
use hyper_util::rt::TokioExecutor;
|
||||||
use hyper_util::server::conn::auto::Builder;
|
use hyper_util::server::conn::auto::Builder;
|
||||||
use rand::rngs::StdRng;
|
|
||||||
use rand::SeedableRng;
|
use rand::SeedableRng;
|
||||||
use sql_over_http::{uuid_to_header_value, NEON_REQUEST_ID};
|
use rand::rngs::StdRng;
|
||||||
|
use sql_over_http::{NEON_REQUEST_ID, uuid_to_header_value};
|
||||||
use tokio::io::{AsyncRead, AsyncWrite};
|
use tokio::io::{AsyncRead, AsyncWrite};
|
||||||
use tokio::net::{TcpListener, TcpStream};
|
use tokio::net::{TcpListener, TcpStream};
|
||||||
use tokio::time::timeout;
|
use tokio::time::timeout;
|
||||||
use tokio_rustls::TlsAcceptor;
|
use tokio_rustls::TlsAcceptor;
|
||||||
use tokio_util::sync::CancellationToken;
|
use tokio_util::sync::CancellationToken;
|
||||||
use tokio_util::task::TaskTracker;
|
use tokio_util::task::TaskTracker;
|
||||||
use tracing::{info, warn, Instrument};
|
use tracing::{Instrument, info, warn};
|
||||||
|
|
||||||
use crate::cancellation::CancellationHandler;
|
use crate::cancellation::CancellationHandler;
|
||||||
use crate::config::{ProxyConfig, ProxyProtocolV2};
|
use crate::config::{ProxyConfig, ProxyProtocolV2};
|
||||||
use crate::context::RequestContext;
|
use crate::context::RequestContext;
|
||||||
use crate::ext::TaskExt;
|
use crate::ext::TaskExt;
|
||||||
use crate::metrics::Metrics;
|
use crate::metrics::Metrics;
|
||||||
use crate::protocol2::{read_proxy_protocol, ChainRW, ConnectHeader, ConnectionInfo};
|
use crate::protocol2::{ChainRW, ConnectHeader, ConnectionInfo, read_proxy_protocol};
|
||||||
use crate::proxy::run_until_cancelled;
|
use crate::proxy::run_until_cancelled;
|
||||||
use crate::rate_limiter::EndpointRateLimiter;
|
use crate::rate_limiter::EndpointRateLimiter;
|
||||||
use crate::serverless::backend::PoolingBackend;
|
use crate::serverless::backend::PoolingBackend;
|
||||||
|
|||||||
@@ -2,23 +2,23 @@ use std::pin::pin;
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use futures::future::{select, try_join, Either};
|
use futures::future::{Either, select, try_join};
|
||||||
use futures::{StreamExt, TryFutureExt};
|
use futures::{StreamExt, TryFutureExt};
|
||||||
use http::header::AUTHORIZATION;
|
|
||||||
use http::Method;
|
use http::Method;
|
||||||
|
use http::header::AUTHORIZATION;
|
||||||
use http_body_util::combinators::BoxBody;
|
use http_body_util::combinators::BoxBody;
|
||||||
use http_body_util::{BodyExt, Full};
|
use http_body_util::{BodyExt, Full};
|
||||||
use http_utils::error::ApiError;
|
use http_utils::error::ApiError;
|
||||||
use hyper::body::Incoming;
|
use hyper::body::Incoming;
|
||||||
use hyper::http::{HeaderName, HeaderValue};
|
use hyper::http::{HeaderName, HeaderValue};
|
||||||
use hyper::{header, HeaderMap, Request, Response, StatusCode};
|
use hyper::{HeaderMap, Request, Response, StatusCode, header};
|
||||||
use indexmap::IndexMap;
|
use indexmap::IndexMap;
|
||||||
use postgres_client::error::{DbError, ErrorPosition, SqlState};
|
use postgres_client::error::{DbError, ErrorPosition, SqlState};
|
||||||
use postgres_client::{GenericClient, IsolationLevel, NoTls, ReadyForQueryStatus, Transaction};
|
use postgres_client::{GenericClient, IsolationLevel, NoTls, ReadyForQueryStatus, Transaction};
|
||||||
use pq_proto::StartupMessageParamsBuilder;
|
use pq_proto::StartupMessageParamsBuilder;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use serde_json::value::RawValue;
|
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
|
use serde_json::value::RawValue;
|
||||||
use tokio::time::{self, Instant};
|
use tokio::time::{self, Instant};
|
||||||
use tokio_util::sync::CancellationToken;
|
use tokio_util::sync::CancellationToken;
|
||||||
use tracing::{debug, error, info};
|
use tracing::{debug, error, info};
|
||||||
@@ -31,15 +31,15 @@ use super::conn_pool::{AuthData, ConnInfoWithAuth};
|
|||||||
use super::conn_pool_lib::{self, ConnInfo};
|
use super::conn_pool_lib::{self, ConnInfo};
|
||||||
use super::error::HttpCodeError;
|
use super::error::HttpCodeError;
|
||||||
use super::http_util::json_response;
|
use super::http_util::json_response;
|
||||||
use super::json::{json_to_pg_text, pg_text_row_to_json, JsonConversionError};
|
use super::json::{JsonConversionError, json_to_pg_text, pg_text_row_to_json};
|
||||||
use crate::auth::backend::{ComputeCredentialKeys, ComputeUserInfo};
|
use crate::auth::backend::{ComputeCredentialKeys, ComputeUserInfo};
|
||||||
use crate::auth::{endpoint_sni, ComputeUserInfoParseError};
|
use crate::auth::{ComputeUserInfoParseError, endpoint_sni};
|
||||||
use crate::config::{AuthenticationConfig, HttpConfig, ProxyConfig, TlsConfig};
|
use crate::config::{AuthenticationConfig, HttpConfig, ProxyConfig, TlsConfig};
|
||||||
use crate::context::RequestContext;
|
use crate::context::RequestContext;
|
||||||
use crate::error::{ErrorKind, ReportableError, UserFacingError};
|
use crate::error::{ErrorKind, ReportableError, UserFacingError};
|
||||||
use crate::http::{read_body_with_limit, ReadBodyError};
|
use crate::http::{ReadBodyError, read_body_with_limit};
|
||||||
use crate::metrics::{HttpDirection, Metrics};
|
use crate::metrics::{HttpDirection, Metrics};
|
||||||
use crate::proxy::{run_until_cancelled, NeonOptions};
|
use crate::proxy::{NeonOptions, run_until_cancelled};
|
||||||
use crate::serverless::backend::HttpConnError;
|
use crate::serverless::backend::HttpConnError;
|
||||||
use crate::types::{DbName, RoleName};
|
use crate::types::{DbName, RoleName};
|
||||||
use crate::usage_metrics::{MetricCounter, MetricCounterRecorder, TrafficDirection};
|
use crate::usage_metrics::{MetricCounter, MetricCounterRecorder, TrafficDirection};
|
||||||
@@ -1021,7 +1021,7 @@ async fn query_to_json<T: GenericClient>(
|
|||||||
data: QueryData,
|
data: QueryData,
|
||||||
current_size: &mut usize,
|
current_size: &mut usize,
|
||||||
parsed_headers: HttpHeaders,
|
parsed_headers: HttpHeaders,
|
||||||
) -> Result<(ReadyForQueryStatus, impl Serialize), SqlOverHttpError> {
|
) -> Result<(ReadyForQueryStatus, impl Serialize + use<T>), SqlOverHttpError> {
|
||||||
let query_start = Instant::now();
|
let query_start = Instant::now();
|
||||||
|
|
||||||
let query_params = data.params;
|
let query_params = data.params;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::task::{ready, Context, Poll};
|
use std::task::{Context, Poll, ready};
|
||||||
|
|
||||||
use anyhow::Context as _;
|
use anyhow::Context as _;
|
||||||
use bytes::{Buf, BufMut, Bytes, BytesMut};
|
use bytes::{Buf, BufMut, Bytes, BytesMut};
|
||||||
@@ -15,9 +15,9 @@ use tracing::warn;
|
|||||||
use crate::cancellation::CancellationHandler;
|
use crate::cancellation::CancellationHandler;
|
||||||
use crate::config::ProxyConfig;
|
use crate::config::ProxyConfig;
|
||||||
use crate::context::RequestContext;
|
use crate::context::RequestContext;
|
||||||
use crate::error::{io_error, ReportableError};
|
use crate::error::{ReportableError, io_error};
|
||||||
use crate::metrics::Metrics;
|
use crate::metrics::Metrics;
|
||||||
use crate::proxy::{handle_client, ClientMode, ErrorSource};
|
use crate::proxy::{ClientMode, ErrorSource, handle_client};
|
||||||
use crate::rate_limiter::EndpointRateLimiter;
|
use crate::rate_limiter::EndpointRateLimiter;
|
||||||
|
|
||||||
pin_project! {
|
pin_project! {
|
||||||
@@ -184,11 +184,11 @@ mod tests {
|
|||||||
|
|
||||||
use framed_websockets::WebSocketServer;
|
use framed_websockets::WebSocketServer;
|
||||||
use futures::{SinkExt, StreamExt};
|
use futures::{SinkExt, StreamExt};
|
||||||
use tokio::io::{duplex, AsyncReadExt, AsyncWriteExt};
|
use tokio::io::{AsyncReadExt, AsyncWriteExt, duplex};
|
||||||
use tokio::task::JoinSet;
|
use tokio::task::JoinSet;
|
||||||
use tokio_tungstenite::tungstenite::protocol::Role;
|
|
||||||
use tokio_tungstenite::tungstenite::Message;
|
|
||||||
use tokio_tungstenite::WebSocketStream;
|
use tokio_tungstenite::WebSocketStream;
|
||||||
|
use tokio_tungstenite::tungstenite::Message;
|
||||||
|
use tokio_tungstenite::tungstenite::protocol::Role;
|
||||||
|
|
||||||
use super::WebSocketRw;
|
use super::WebSocketRw;
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ pub async fn handle<F>(
|
|||||||
where
|
where
|
||||||
F: FnMut(),
|
F: FnMut(),
|
||||||
{
|
{
|
||||||
use tokio::signal::unix::{signal, SignalKind};
|
use tokio::signal::unix::{SignalKind, signal};
|
||||||
|
|
||||||
let mut hangup = signal(SignalKind::hangup())?;
|
let mut hangup = signal(SignalKind::hangup())?;
|
||||||
let mut interrupt = signal(SignalKind::interrupt())?;
|
let mut interrupt = signal(SignalKind::interrupt())?;
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ use std::convert::TryFrom;
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use postgres_client::tls::MakeTlsConnect;
|
use postgres_client::tls::MakeTlsConnect;
|
||||||
use rustls::pki_types::ServerName;
|
|
||||||
use rustls::ClientConfig;
|
use rustls::ClientConfig;
|
||||||
|
use rustls::pki_types::ServerName;
|
||||||
use tokio::io::{AsyncRead, AsyncWrite};
|
use tokio::io::{AsyncRead, AsyncWrite};
|
||||||
|
|
||||||
mod private {
|
mod private {
|
||||||
@@ -15,8 +15,8 @@ mod private {
|
|||||||
use postgres_client::tls::{ChannelBinding, TlsConnect};
|
use postgres_client::tls::{ChannelBinding, TlsConnect};
|
||||||
use rustls::pki_types::ServerName;
|
use rustls::pki_types::ServerName;
|
||||||
use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
|
use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
|
||||||
use tokio_rustls::client::TlsStream;
|
|
||||||
use tokio_rustls::TlsConnector;
|
use tokio_rustls::TlsConnector;
|
||||||
|
use tokio_rustls::client::TlsStream;
|
||||||
|
|
||||||
use crate::tls::TlsServerEndPoint;
|
use crate::tls::TlsServerEndPoint;
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
use std::collections::{HashMap, HashSet};
|
use std::collections::{HashMap, HashSet};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use anyhow::{bail, Context};
|
use anyhow::{Context, bail};
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use rustls::crypto::ring::{self, sign};
|
use rustls::crypto::ring::{self, sign};
|
||||||
use rustls::pki_types::{CertificateDer, PrivateKeyDer};
|
use rustls::pki_types::{CertificateDer, PrivateKeyDer};
|
||||||
|
|
||||||
use super::{TlsServerEndPoint, PG_ALPN_PROTOCOL};
|
use super::{PG_ALPN_PROTOCOL, TlsServerEndPoint};
|
||||||
|
|
||||||
pub struct TlsConfig {
|
pub struct TlsConfig {
|
||||||
pub config: Arc<rustls::ServerConfig>,
|
pub config: Arc<rustls::ServerConfig>,
|
||||||
|
|||||||
@@ -2,17 +2,17 @@
|
|||||||
//! and push them to a HTTP endpoint.
|
//! and push them to a HTTP endpoint.
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
use std::convert::Infallible;
|
use std::convert::Infallible;
|
||||||
use std::sync::atomic::{AtomicU64, AtomicUsize, Ordering};
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use std::sync::atomic::{AtomicU64, AtomicUsize, Ordering};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use anyhow::{bail, Context};
|
use anyhow::{Context, bail};
|
||||||
use async_compression::tokio::write::GzipEncoder;
|
use async_compression::tokio::write::GzipEncoder;
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use chrono::{DateTime, Datelike, Timelike, Utc};
|
use chrono::{DateTime, Datelike, Timelike, Utc};
|
||||||
use clashmap::mapref::entry::Entry;
|
|
||||||
use clashmap::ClashMap;
|
use clashmap::ClashMap;
|
||||||
use consumption_metrics::{idempotency_key, Event, EventChunk, EventType, CHUNK_SIZE};
|
use clashmap::mapref::entry::Entry;
|
||||||
|
use consumption_metrics::{CHUNK_SIZE, Event, EventChunk, EventType, idempotency_key};
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
use remote_storage::{GenericRemoteStorage, RemotePath, TimeoutOrCancel};
|
use remote_storage::{GenericRemoteStorage, RemotePath, TimeoutOrCancel};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
@@ -62,11 +62,7 @@ mod none_as_empty_string {
|
|||||||
d: D,
|
d: D,
|
||||||
) -> Result<Option<SmolStr>, D::Error> {
|
) -> Result<Option<SmolStr>, D::Error> {
|
||||||
let s = SmolStr::deserialize(d)?;
|
let s = SmolStr::deserialize(d)?;
|
||||||
if s.is_empty() {
|
if s.is_empty() { Ok(None) } else { Ok(Some(s)) }
|
||||||
Ok(None)
|
|
||||||
} else {
|
|
||||||
Ok(Some(s))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user