servers/postgres/
server.rs1use std::any::Any;
16use std::future::Future;
17use std::net::SocketAddr;
18use std::sync::Arc;
19
20use ::auth::UserProviderRef;
21use async_trait::async_trait;
22use catalog::process_manager::ProcessManagerRef;
23use common_runtime::Runtime;
24use common_runtime::runtime::RuntimeTrait;
25use common_telemetry::{debug, warn};
26use futures::StreamExt;
27use pgwire::tokio::process_socket;
28use tokio_rustls::TlsAcceptor;
29
30use crate::error::Result;
31use crate::postgres::{MakePostgresServerHandler, MakePostgresServerHandlerBuilder};
32use crate::query_handler::sql::ServerSqlQueryHandlerRef;
33use crate::server::{AbortableStream, BaseTcpServer, Server};
34use crate::tls::ReloadableTlsServerConfig;
35
36pub struct PostgresServer {
37 base_server: BaseTcpServer,
38 make_handler: Arc<MakePostgresServerHandler>,
39 tls_server_config: Arc<ReloadableTlsServerConfig>,
40 keep_alive_secs: u64,
41 batching_enabled: bool,
42 bind_addr: Option<SocketAddr>,
43 process_manager: Option<ProcessManagerRef>,
44}
45
46impl PostgresServer {
47 pub fn new(
49 query_handler: ServerSqlQueryHandlerRef,
50 force_tls: bool,
51 tls_server_config: Arc<ReloadableTlsServerConfig>,
52 keep_alive_secs: u64,
53 io_runtime: Runtime,
54 user_provider: Option<UserProviderRef>,
55 process_manager: Option<ProcessManagerRef>,
56 ) -> PostgresServer {
57 let make_handler = Arc::new(
58 MakePostgresServerHandlerBuilder::default()
59 .query_handler(query_handler.clone())
60 .user_provider(user_provider.clone())
61 .force_tls(force_tls)
62 .build()
63 .unwrap(),
64 );
65 PostgresServer {
66 base_server: BaseTcpServer::create_server("Postgres", io_runtime),
67 make_handler,
68 tls_server_config,
69 keep_alive_secs,
70 batching_enabled: false,
71 bind_addr: None,
72 process_manager,
73 }
74 }
75
76 pub fn with_batching_enabled(mut self, enabled: bool) -> Self {
78 self.batching_enabled = enabled;
79 self
80 }
81
82 fn accept(
83 &self,
84 io_runtime: Runtime,
85 accepting_stream: AbortableStream,
86 ) -> impl Future<Output = ()> + use<> {
87 let handler_maker = self.make_handler.clone();
88 let batching_enabled = self.batching_enabled;
89 let tls_server_config = self.tls_server_config.clone();
90 let process_manager = self.process_manager.clone();
91 accepting_stream.for_each(move |tcp_stream| {
92 let io_runtime = io_runtime.clone();
93 let tls_acceptor = tls_server_config.get_config().map(TlsAcceptor::from);
94 let handler_maker = handler_maker.clone();
95 let process_id = process_manager.as_ref().map(|p| p.next_id()).unwrap_or(0);
96
97 async move {
98 match tcp_stream {
99 Err(error) => debug!("Broken pipe: {}", error), Ok(io_stream) => {
101 let addr = match io_stream.peer_addr() {
102 Ok(addr) => {
103 debug!("PostgreSQL client coming from {}", addr);
104 Some(addr)
105 }
106 Err(e) => {
107 warn!(e; "Failed to get PostgreSQL client addr");
108 None
109 }
110 };
111
112 let _handle = io_runtime.spawn(async move {
113 crate::metrics::METRIC_POSTGRES_CONNECTIONS.inc();
114 let pg_handler =
115 Arc::new(handler_maker.make(addr, process_id, batching_enabled));
116 let r =
117 process_socket(io_stream, tls_acceptor.clone(), pg_handler).await;
118 crate::metrics::METRIC_POSTGRES_CONNECTIONS.dec();
119 r
120 });
121 }
122 };
123 }
124 })
125 }
126}
127
128pub const POSTGRES_SERVER: &str = "POSTGRES_SERVER";
129
130#[async_trait]
131impl Server for PostgresServer {
132 async fn shutdown(&self) -> Result<()> {
133 self.base_server.shutdown().await
134 }
135
136 async fn start(&mut self, listening: SocketAddr) -> Result<()> {
137 let (stream, addr) = self
138 .base_server
139 .bind(listening, self.keep_alive_secs)
140 .await?;
141
142 let io_runtime = self.base_server.io_runtime();
143 let join_handle = common_runtime::spawn_global(self.accept(io_runtime, stream));
144
145 self.base_server.start_with(join_handle).await?;
146
147 self.bind_addr = Some(addr);
148 Ok(())
149 }
150
151 fn name(&self) -> &str {
152 POSTGRES_SERVER
153 }
154
155 fn bind_addr(&self) -> Option<SocketAddr> {
156 self.bind_addr
157 }
158
159 fn as_any(&self) -> &dyn Any {
160 self
161 }
162}