Skip to content

Commit e201622

Browse files
feat: enable SO_REUSEPORT on the listener for tests
This could potentially help with port binding issues on the CI server. Creates a socket2 with SO_REUSEPORT enabled.
1 parent 1f1125c commit e201622

File tree

5 files changed

+35
-5
lines changed

5 files changed

+35
-5
lines changed

Cargo.lock

+2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ serde_urlencoded = "0.7.0"
9999
serde_with = "3.8.1"
100100
sha2 = "0.10.8"
101101
snap = "1.0.0"
102+
socket2 = "0.5.7"
102103
sqlparser = "0.48.0"
103104
sysinfo = "0.30.8"
104105
test-log = { version = "0.2.16", features = ["trace"] }

influxdb3/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ uuid.workspace = true
5656

5757
# Optional Dependencies
5858
console-subscriber = { version = "0.1.10", optional = true, features = ["parking_lot"] }
59+
socket2 = "0.5.7"
5960

6061
[features]
6162
default = ["jemalloc_replacing_malloc", "azure", "gcp", "aws"]

influxdb3/src/commands/serve.rs

+30-5
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,11 @@ use object_store::ObjectStore;
3030
use observability_deps::tracing::*;
3131
use panic_logging::SendPanicsToTracing;
3232
use parquet_file::storage::{ParquetStorage, StorageId};
33+
use socket2::{Domain, Type};
3334
use std::{collections::HashMap, path::Path, str::FromStr};
3435
use std::{num::NonZeroUsize, sync::Arc};
3536
use thiserror::Error;
36-
use tokio::net::TcpListener;
37+
use tokio::net::TcpListener as TokioTcpListener;
3738
use tokio_util::sync::CancellationToken;
3839
use trace_exporters::TracingConfig;
3940
use trace_http::ctx::TraceHeaderParser;
@@ -460,6 +461,10 @@ pub async fn command(config: Config) -> Result<()> {
460461
Arc::clone(&telemetry_store),
461462
)?;
462463

464+
let sock_addr: std::net::SocketAddr = *config.http_bind_address;
465+
466+
let listener = setup_tokio_tcp_listener(sock_addr)?;
467+
463468
let query_executor = Arc::new(QueryExecutorImpl::new(
464469
write_buffer.catalog(),
465470
Arc::clone(&write_buffer),
@@ -471,10 +476,6 @@ pub async fn command(config: Config) -> Result<()> {
471476
Arc::clone(&telemetry_store),
472477
));
473478

474-
let listener = TcpListener::bind(*config.http_bind_address)
475-
.await
476-
.map_err(Error::BindAddress)?;
477-
478479
let builder = ServerBuilder::new(common_state)
479480
.max_request_size(config.max_http_request_size)
480481
.write_buffer(write_buffer)
@@ -552,3 +553,27 @@ fn parse_datafusion_config(
552553

553554
Ok(out)
554555
}
556+
557+
#[cfg(windows)]
558+
fn setup_tokio_tcp_listener(sock_addr: std::net::SocketAddr) -> Result<TokioTcpListener> {
559+
let socket = socket2::Socket::new(Domain::IPV4, Type::STREAM, None).expect("create socket");
560+
socket.bind(&sock_addr.into()).expect("bind socket");
561+
socket.listen(1).expect("listening on socket");
562+
563+
let listener: std::net::TcpListener = socket.into();
564+
let listener = TokioTcpListener::from_std(listener);
565+
listener.map_err(Error::BindAddress)
566+
}
567+
568+
#[cfg(not(windows))]
569+
fn setup_tokio_tcp_listener(sock_addr: std::net::SocketAddr) -> Result<TokioTcpListener> {
570+
let socket = socket2::Socket::new(Domain::IPV4, Type::STREAM, None).expect("create socket");
571+
socket.bind(&sock_addr.into()).expect("bind socket");
572+
socket.set_reuse_address(true).expect("setup reuse addr");
573+
socket.set_reuse_port(true).expect("setup reuse port");
574+
socket.listen(1).expect("listening on socket");
575+
576+
let listener: std::net::TcpListener = socket.into();
577+
let listener = TokioTcpListener::from_std(listener);
578+
listener.map_err(Error::BindAddress)
579+
}

influxdb3_server/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ serde.workspace = true
6565
serde_json.workspace = true
6666
serde_urlencoded.workspace = true
6767
sha2.workspace = true
68+
socket2.workspace = true
6869
thiserror.workspace = true
6970
tokio.workspace = true
7071
tokio-util.workspace = true

0 commit comments

Comments
 (0)