mirror of
https://github.com/neondatabase/neon.git
synced 2026-02-01 17:50:38 +00:00
Compare commits
9 Commits
hack/compu
...
hack/compu
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
32d4e4914a | ||
|
|
d4d577e7ff | ||
|
|
f552aa05fa | ||
|
|
779badb7c5 | ||
|
|
e6eb548491 | ||
|
|
16e9eb2832 | ||
|
|
042686183b | ||
|
|
0c243faf96 | ||
|
|
d0a842a509 |
5
.github/workflows/build_and_test.yml
vendored
5
.github/workflows/build_and_test.yml
vendored
@@ -852,7 +852,7 @@ jobs:
|
|||||||
run:
|
run:
|
||||||
shell: sh -eu {0}
|
shell: sh -eu {0}
|
||||||
env:
|
env:
|
||||||
VM_BUILDER_VERSION: v0.18.5
|
VM_BUILDER_VERSION: v0.19.0
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
@@ -874,8 +874,7 @@ jobs:
|
|||||||
- name: Build vm image
|
- name: Build vm image
|
||||||
run: |
|
run: |
|
||||||
./vm-builder \
|
./vm-builder \
|
||||||
-enable-file-cache \
|
-spec=vm-image-spec.yaml \
|
||||||
-cgroup-uid=postgres \
|
|
||||||
-src=369495373322.dkr.ecr.eu-central-1.amazonaws.com/compute-node-${{ matrix.version }}:${{needs.tag.outputs.build-tag}} \
|
-src=369495373322.dkr.ecr.eu-central-1.amazonaws.com/compute-node-${{ matrix.version }}:${{needs.tag.outputs.build-tag}} \
|
||||||
-dst=369495373322.dkr.ecr.eu-central-1.amazonaws.com/vm-compute-node-${{ matrix.version }}:${{needs.tag.outputs.build-tag}}
|
-dst=369495373322.dkr.ecr.eu-central-1.amazonaws.com/vm-compute-node-${{ matrix.version }}:${{needs.tag.outputs.build-tag}}
|
||||||
|
|
||||||
|
|||||||
10
Cargo.lock
generated
10
Cargo.lock
generated
@@ -3221,7 +3221,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "postgres"
|
name = "postgres"
|
||||||
version = "0.19.4"
|
version = "0.19.4"
|
||||||
source = "git+https://github.com/neondatabase/rust-postgres.git?rev=ce7260db5998fe27167da42503905a12e7ad9048#ce7260db5998fe27167da42503905a12e7ad9048"
|
source = "git+https://github.com/neondatabase/rust-postgres.git?rev=6ce32f791526e27533cab0232a6bb243b2c32584#6ce32f791526e27533cab0232a6bb243b2c32584"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes",
|
"bytes",
|
||||||
"fallible-iterator",
|
"fallible-iterator",
|
||||||
@@ -3234,7 +3234,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "postgres-native-tls"
|
name = "postgres-native-tls"
|
||||||
version = "0.5.0"
|
version = "0.5.0"
|
||||||
source = "git+https://github.com/neondatabase/rust-postgres.git?rev=ce7260db5998fe27167da42503905a12e7ad9048#ce7260db5998fe27167da42503905a12e7ad9048"
|
source = "git+https://github.com/neondatabase/rust-postgres.git?rev=6ce32f791526e27533cab0232a6bb243b2c32584#6ce32f791526e27533cab0232a6bb243b2c32584"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"native-tls",
|
"native-tls",
|
||||||
"tokio",
|
"tokio",
|
||||||
@@ -3245,7 +3245,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "postgres-protocol"
|
name = "postgres-protocol"
|
||||||
version = "0.6.4"
|
version = "0.6.4"
|
||||||
source = "git+https://github.com/neondatabase/rust-postgres.git?rev=ce7260db5998fe27167da42503905a12e7ad9048#ce7260db5998fe27167da42503905a12e7ad9048"
|
source = "git+https://github.com/neondatabase/rust-postgres.git?rev=6ce32f791526e27533cab0232a6bb243b2c32584#6ce32f791526e27533cab0232a6bb243b2c32584"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64 0.20.0",
|
"base64 0.20.0",
|
||||||
"byteorder",
|
"byteorder",
|
||||||
@@ -3263,7 +3263,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "postgres-types"
|
name = "postgres-types"
|
||||||
version = "0.2.4"
|
version = "0.2.4"
|
||||||
source = "git+https://github.com/neondatabase/rust-postgres.git?rev=ce7260db5998fe27167da42503905a12e7ad9048#ce7260db5998fe27167da42503905a12e7ad9048"
|
source = "git+https://github.com/neondatabase/rust-postgres.git?rev=6ce32f791526e27533cab0232a6bb243b2c32584#6ce32f791526e27533cab0232a6bb243b2c32584"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes",
|
"bytes",
|
||||||
"fallible-iterator",
|
"fallible-iterator",
|
||||||
@@ -4933,7 +4933,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "tokio-postgres"
|
name = "tokio-postgres"
|
||||||
version = "0.7.7"
|
version = "0.7.7"
|
||||||
source = "git+https://github.com/neondatabase/rust-postgres.git?rev=ce7260db5998fe27167da42503905a12e7ad9048#ce7260db5998fe27167da42503905a12e7ad9048"
|
source = "git+https://github.com/neondatabase/rust-postgres.git?rev=6ce32f791526e27533cab0232a6bb243b2c32584#6ce32f791526e27533cab0232a6bb243b2c32584"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"byteorder",
|
"byteorder",
|
||||||
|
|||||||
12
Cargo.toml
12
Cargo.toml
@@ -165,11 +165,11 @@ env_logger = "0.10"
|
|||||||
log = "0.4"
|
log = "0.4"
|
||||||
|
|
||||||
## Libraries from neondatabase/ git forks, ideally with changes to be upstreamed
|
## Libraries from neondatabase/ git forks, ideally with changes to be upstreamed
|
||||||
postgres = { git = "https://github.com/neondatabase/rust-postgres.git", rev="ce7260db5998fe27167da42503905a12e7ad9048" }
|
postgres = { git = "https://github.com/neondatabase/rust-postgres.git", rev="6ce32f791526e27533cab0232a6bb243b2c32584" }
|
||||||
postgres-native-tls = { git = "https://github.com/neondatabase/rust-postgres.git", rev="ce7260db5998fe27167da42503905a12e7ad9048" }
|
postgres-native-tls = { git = "https://github.com/neondatabase/rust-postgres.git", rev="6ce32f791526e27533cab0232a6bb243b2c32584" }
|
||||||
postgres-protocol = { git = "https://github.com/neondatabase/rust-postgres.git", rev="ce7260db5998fe27167da42503905a12e7ad9048" }
|
postgres-protocol = { git = "https://github.com/neondatabase/rust-postgres.git", rev="6ce32f791526e27533cab0232a6bb243b2c32584" }
|
||||||
postgres-types = { git = "https://github.com/neondatabase/rust-postgres.git", rev="ce7260db5998fe27167da42503905a12e7ad9048" }
|
postgres-types = { git = "https://github.com/neondatabase/rust-postgres.git", rev="6ce32f791526e27533cab0232a6bb243b2c32584" }
|
||||||
tokio-postgres = { git = "https://github.com/neondatabase/rust-postgres.git", rev="ce7260db5998fe27167da42503905a12e7ad9048" }
|
tokio-postgres = { git = "https://github.com/neondatabase/rust-postgres.git", rev="6ce32f791526e27533cab0232a6bb243b2c32584" }
|
||||||
|
|
||||||
## Other git libraries
|
## Other git libraries
|
||||||
heapless = { default-features=false, features=[], git = "https://github.com/japaric/heapless.git", rev = "644653bf3b831c6bb4963be2de24804acf5e5001" } # upstream release pending
|
heapless = { default-features=false, features=[], git = "https://github.com/japaric/heapless.git", rev = "644653bf3b831c6bb4963be2de24804acf5e5001" } # upstream release pending
|
||||||
@@ -206,7 +206,7 @@ tonic-build = "0.9"
|
|||||||
|
|
||||||
# This is only needed for proxy's tests.
|
# This is only needed for proxy's tests.
|
||||||
# TODO: we should probably fork `tokio-postgres-rustls` instead.
|
# TODO: we should probably fork `tokio-postgres-rustls` instead.
|
||||||
tokio-postgres = { git = "https://github.com/neondatabase/rust-postgres.git", rev="ce7260db5998fe27167da42503905a12e7ad9048" }
|
tokio-postgres = { git = "https://github.com/neondatabase/rust-postgres.git", rev="6ce32f791526e27533cab0232a6bb243b2c32584" }
|
||||||
|
|
||||||
################# Binary contents sections
|
################# Binary contents sections
|
||||||
|
|
||||||
|
|||||||
@@ -714,6 +714,23 @@ RUN wget https://github.com/pksunkara/pgx_ulid/archive/refs/tags/v0.1.3.tar.gz -
|
|||||||
cargo pgrx install --release && \
|
cargo pgrx install --release && \
|
||||||
echo "trusted = true" >> /usr/local/pgsql/share/extension/ulid.control
|
echo "trusted = true" >> /usr/local/pgsql/share/extension/ulid.control
|
||||||
|
|
||||||
|
#########################################################################################
|
||||||
|
#
|
||||||
|
# Layer "pg-wait-sampling-pg-build"
|
||||||
|
# compile pg_wait_sampling extension
|
||||||
|
#
|
||||||
|
#########################################################################################
|
||||||
|
FROM build-deps AS pg-wait-sampling-pg-build
|
||||||
|
COPY --from=pg-build /usr/local/pgsql/ /usr/local/pgsql/
|
||||||
|
|
||||||
|
ENV PATH "/usr/local/pgsql/bin/:$PATH"
|
||||||
|
RUN wget https://github.com/postgrespro/pg_wait_sampling/archive/refs/tags/v1.1.5.tar.gz -O pg_wait_sampling.tar.gz && \
|
||||||
|
echo 'a03da6a413f5652ce470a3635ed6ebba528c74cb26aa4cfced8aff8a8441f81ec6dd657ff62cd6ce96a4e6ce02cad9f2519ae9525367ece60497aa20faafde5c pg_wait_sampling.tar.gz' | sha512sum -c && \
|
||||||
|
mkdir pg_wait_sampling-src && cd pg_wait_sampling-src && tar xvzf ../pg_wait_sampling.tar.gz --strip-components=1 -C . && \
|
||||||
|
make USE_PGXS=1 -j $(getconf _NPROCESSORS_ONLN) && \
|
||||||
|
make USE_PGXS=1 -j $(getconf _NPROCESSORS_ONLN) install && \
|
||||||
|
echo 'trusted = true' >> /usr/local/pgsql/share/extension/pg_wait_sampling.control
|
||||||
|
|
||||||
#########################################################################################
|
#########################################################################################
|
||||||
#
|
#
|
||||||
# Layer "neon-pg-ext-build"
|
# Layer "neon-pg-ext-build"
|
||||||
@@ -750,6 +767,7 @@ COPY --from=rdkit-pg-build /usr/local/pgsql/ /usr/local/pgsql/
|
|||||||
COPY --from=pg-uuidv7-pg-build /usr/local/pgsql/ /usr/local/pgsql/
|
COPY --from=pg-uuidv7-pg-build /usr/local/pgsql/ /usr/local/pgsql/
|
||||||
COPY --from=pg-roaringbitmap-pg-build /usr/local/pgsql/ /usr/local/pgsql/
|
COPY --from=pg-roaringbitmap-pg-build /usr/local/pgsql/ /usr/local/pgsql/
|
||||||
COPY --from=pg-embedding-pg-build /usr/local/pgsql/ /usr/local/pgsql/
|
COPY --from=pg-embedding-pg-build /usr/local/pgsql/ /usr/local/pgsql/
|
||||||
|
COPY --from=pg-wait-sampling-pg-build /usr/local/pgsql/ /usr/local/pgsql/
|
||||||
COPY pgxn/ pgxn/
|
COPY pgxn/ pgxn/
|
||||||
|
|
||||||
RUN make -j $(getconf _NPROCESSORS_ONLN) \
|
RUN make -j $(getconf _NPROCESSORS_ONLN) \
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ use std::collections::HashMap;
|
|||||||
use std::env;
|
use std::env;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::io::BufRead;
|
use std::io::BufRead;
|
||||||
|
use std::io::Write;
|
||||||
use std::os::unix::fs::PermissionsExt;
|
use std::os::unix::fs::PermissionsExt;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::process::{Command, Stdio};
|
use std::process::{Command, Stdio};
|
||||||
@@ -14,6 +15,7 @@ use chrono::{DateTime, Utc};
|
|||||||
use futures::future::join_all;
|
use futures::future::join_all;
|
||||||
use futures::stream::FuturesUnordered;
|
use futures::stream::FuturesUnordered;
|
||||||
use futures::StreamExt;
|
use futures::StreamExt;
|
||||||
|
use notify::event;
|
||||||
use postgres::{Client, NoTls};
|
use postgres::{Client, NoTls};
|
||||||
use tokio;
|
use tokio;
|
||||||
use tokio_postgres;
|
use tokio_postgres;
|
||||||
@@ -644,9 +646,30 @@ impl ComputeNode {
|
|||||||
} else {
|
} else {
|
||||||
vec![]
|
vec![]
|
||||||
})
|
})
|
||||||
|
.stderr(Stdio::piped())
|
||||||
.spawn()
|
.spawn()
|
||||||
.expect("cannot start postgres process");
|
.expect("cannot start postgres process");
|
||||||
|
|
||||||
|
let stderr = pg.stderr.take().unwrap();
|
||||||
|
std::thread::spawn(move || {
|
||||||
|
let reader = std::io::BufReader::new(stderr);
|
||||||
|
let mut last_lines = vec![];
|
||||||
|
for line in reader.lines() {
|
||||||
|
if let Ok(line) = line {
|
||||||
|
if line.starts_with("2023-") {
|
||||||
|
// print all lines from the previous postgres instance
|
||||||
|
let combined = format!("PG:{}\n", last_lines.join("\u{200B}"));
|
||||||
|
let res = std::io::stderr().lock().write_all(combined.as_bytes());
|
||||||
|
if let Err(e) = res {
|
||||||
|
error!("failed to write to stderr: {}", e);
|
||||||
|
}
|
||||||
|
last_lines.clear();
|
||||||
|
}
|
||||||
|
last_lines.push(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
wait_for_postgres(&mut pg, pgdata_path)?;
|
wait_for_postgres(&mut pg, pgdata_path)?;
|
||||||
|
|
||||||
Ok(pg)
|
Ok(pg)
|
||||||
|
|||||||
@@ -670,6 +670,12 @@ pub fn handle_extensions(spec: &ComputeSpec, client: &mut Client) -> Result<()>
|
|||||||
info!("creating system extensions with query: {}", query);
|
info!("creating system extensions with query: {}", query);
|
||||||
client.simple_query(query)?;
|
client.simple_query(query)?;
|
||||||
}
|
}
|
||||||
|
if libs.contains("pg_wait_sampling") {
|
||||||
|
// Create extension only if this compute really needs it
|
||||||
|
let query = "CREATE EXTENSION IF NOT EXISTS pg_wait_sampling";
|
||||||
|
info!("creating system extensions with query: {}", query);
|
||||||
|
client.simple_query(query)?;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
@@ -248,6 +248,7 @@ impl ConnCfg {
|
|||||||
|
|
||||||
// connect_raw() will not use TLS if sslmode is "disable"
|
// connect_raw() will not use TLS if sslmode is "disable"
|
||||||
let (client, connection) = self.0.connect_raw(stream, tls).await?;
|
let (client, connection) = self.0.connect_raw(stream, tls).await?;
|
||||||
|
tracing::Span::current().record("pid", &tracing::field::display(client.get_process_id()));
|
||||||
let stream = connection.stream.into_inner();
|
let stream = connection.stream.into_inner();
|
||||||
|
|
||||||
info!(
|
info!(
|
||||||
|
|||||||
@@ -514,7 +514,7 @@ pub fn invalidate_cache(node_info: console::CachedNodeInfo) -> compute::ConnCfg
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Try to connect to the compute node once.
|
/// Try to connect to the compute node once.
|
||||||
#[tracing::instrument(name = "connect_once", skip_all)]
|
#[tracing::instrument(name = "connect_once", fields(pid = tracing::field::Empty), skip_all)]
|
||||||
async fn connect_to_compute_once(
|
async fn connect_to_compute_once(
|
||||||
node_info: &console::CachedNodeInfo,
|
node_info: &console::CachedNodeInfo,
|
||||||
timeout: time::Duration,
|
timeout: time::Duration,
|
||||||
|
|||||||
@@ -208,14 +208,13 @@ impl GlobalConnPool {
|
|||||||
} else {
|
} else {
|
||||||
info!("pool: reusing connection '{conn_info}'");
|
info!("pool: reusing connection '{conn_info}'");
|
||||||
client.session.send(session_id)?;
|
client.session.send(session_id)?;
|
||||||
|
tracing::Span::current().record(
|
||||||
|
"pid",
|
||||||
|
&tracing::field::display(client.inner.get_process_id()),
|
||||||
|
);
|
||||||
latency_timer.pool_hit();
|
latency_timer.pool_hit();
|
||||||
latency_timer.success();
|
latency_timer.success();
|
||||||
return Ok(Client {
|
return Ok(Client::new(client, pool).await);
|
||||||
conn_id: client.conn_id,
|
|
||||||
inner: Some(client),
|
|
||||||
span: Span::current(),
|
|
||||||
pool,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let conn_id = uuid::Uuid::new_v4();
|
let conn_id = uuid::Uuid::new_v4();
|
||||||
@@ -229,6 +228,12 @@ impl GlobalConnPool {
|
|||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
};
|
};
|
||||||
|
if let Ok(client) = &new_client {
|
||||||
|
tracing::Span::current().record(
|
||||||
|
"pid",
|
||||||
|
&tracing::field::display(client.inner.get_process_id()),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
match &new_client {
|
match &new_client {
|
||||||
// clear the hash. it's no longer valid
|
// clear the hash. it's no longer valid
|
||||||
@@ -262,13 +267,8 @@ impl GlobalConnPool {
|
|||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
let new_client = new_client?;
|
||||||
new_client.map(|inner| Client {
|
Ok(Client::new(new_client, pool).await)
|
||||||
conn_id: inner.conn_id,
|
|
||||||
inner: Some(inner),
|
|
||||||
span: Span::current(),
|
|
||||||
pool,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn put(&self, conn_info: &ConnInfo, client: ClientInner) -> anyhow::Result<()> {
|
fn put(&self, conn_info: &ConnInfo, client: ClientInner) -> anyhow::Result<()> {
|
||||||
@@ -394,7 +394,7 @@ impl ConnectMechanism for TokioMechanism<'_> {
|
|||||||
// Wake up the destination if needed. Code here is a bit involved because
|
// Wake up the destination if needed. Code here is a bit involved because
|
||||||
// we reuse the code from the usual proxy and we need to prepare few structures
|
// we reuse the code from the usual proxy and we need to prepare few structures
|
||||||
// that this code expects.
|
// that this code expects.
|
||||||
#[tracing::instrument(skip_all)]
|
#[tracing::instrument(fields(pid = tracing::field::Empty), skip_all)]
|
||||||
async fn connect_to_compute(
|
async fn connect_to_compute(
|
||||||
config: &config::ProxyConfig,
|
config: &config::ProxyConfig,
|
||||||
conn_info: &ConnInfo,
|
conn_info: &ConnInfo,
|
||||||
@@ -461,6 +461,7 @@ async fn connect_to_compute_once(
|
|||||||
.connect_timeout(timeout)
|
.connect_timeout(timeout)
|
||||||
.connect(tokio_postgres::NoTls)
|
.connect(tokio_postgres::NoTls)
|
||||||
.await?;
|
.await?;
|
||||||
|
tracing::Span::current().record("pid", &tracing::field::display(client.get_process_id()));
|
||||||
|
|
||||||
let (tx, mut rx) = tokio::sync::watch::channel(session);
|
let (tx, mut rx) = tokio::sync::watch::channel(session);
|
||||||
|
|
||||||
@@ -547,6 +548,17 @@ pub struct Discard<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Client {
|
impl Client {
|
||||||
|
pub(self) async fn new(
|
||||||
|
inner: ClientInner,
|
||||||
|
pool: Option<(ConnInfo, Arc<GlobalConnPool>)>,
|
||||||
|
) -> Self {
|
||||||
|
Self {
|
||||||
|
conn_id: inner.conn_id,
|
||||||
|
inner: Some(inner),
|
||||||
|
span: Span::current(),
|
||||||
|
pool,
|
||||||
|
}
|
||||||
|
}
|
||||||
pub fn inner(&mut self) -> (&mut tokio_postgres::Client, Discard<'_>) {
|
pub fn inner(&mut self) -> (&mut tokio_postgres::Client, Discard<'_>) {
|
||||||
let Self {
|
let Self {
|
||||||
inner,
|
inner,
|
||||||
|
|||||||
@@ -250,7 +250,7 @@ pub async fn handle(
|
|||||||
Ok(response)
|
Ok(response)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[instrument(name = "sql-over-http", skip_all)]
|
#[instrument(name = "sql-over-http", fields(pid = tracing::field::Empty), skip_all)]
|
||||||
async fn handle_inner(
|
async fn handle_inner(
|
||||||
request: Request<Body>,
|
request: Request<Body>,
|
||||||
sni_hostname: Option<String>,
|
sni_hostname: Option<String>,
|
||||||
|
|||||||
@@ -6,12 +6,14 @@ from fixtures.pageserver.http import PageserverHttpClient
|
|||||||
|
|
||||||
def check_tenant(env: NeonEnv, pageserver_http: PageserverHttpClient):
|
def check_tenant(env: NeonEnv, pageserver_http: PageserverHttpClient):
|
||||||
tenant_id, timeline_id = env.neon_cli.create_tenant()
|
tenant_id, timeline_id = env.neon_cli.create_tenant()
|
||||||
endpoint = env.endpoints.create_start("main", tenant_id=tenant_id)
|
endpoint = env.endpoints.create_start("main", tenant_id=tenant_id, config_lines=[
|
||||||
|
"log_statement=all",
|
||||||
|
],)
|
||||||
# we rely upon autocommit after each statement
|
# we rely upon autocommit after each statement
|
||||||
res_1 = endpoint.safe_psql_many(
|
res_1 = endpoint.safe_psql_many(
|
||||||
queries=[
|
queries=[
|
||||||
"CREATE TABLE t(key int primary key, value text)",
|
"CREATE TABLE \nt(key int primary key, value text)",
|
||||||
"INSERT INTO t SELECT generate_series(1,100000), 'payload'",
|
"INSERT INTO \n\nt SELECT generate_series(1,100000), 'payload'",
|
||||||
"SELECT sum(key) FROM t",
|
"SELECT sum(key) FROM t",
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|||||||
152
vm-image-spec.yaml
Normal file
152
vm-image-spec.yaml
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
# Supplemental file for neondatabase/autoscaling's vm-builder, for producing the VM compute image.
|
||||||
|
---
|
||||||
|
commands:
|
||||||
|
- name: cgconfigparser
|
||||||
|
user: root
|
||||||
|
sysvInitAction: sysinit
|
||||||
|
shell: "cgconfigparser -l /etc/cgconfig.conf -s 1664"
|
||||||
|
- name: pgbouncer
|
||||||
|
user: nobody
|
||||||
|
sysvInitAction: respawn
|
||||||
|
shell: "/usr/local/bin/pgbouncer /etc/pgbouncer.ini"
|
||||||
|
- name: postgres-exporter
|
||||||
|
user: nobody
|
||||||
|
sysvInitAction: respawn
|
||||||
|
shell: 'DATA_SOURCE_NAME="user=cloud_admin sslmode=disable dbname=postgres" /bin/postgres_exporter --extend.query-path /etc/postgres_exporter_queries.yml'
|
||||||
|
shutdownHook: |
|
||||||
|
su -p postgres --session-command '/usr/local/bin/pg_ctl stop -D /var/db/postgres/compute/pgdata -m fast --wait -t 10'
|
||||||
|
files:
|
||||||
|
- filename: pgbouncer.ini
|
||||||
|
content: |
|
||||||
|
[databases]
|
||||||
|
*=host=localhost port=5432 auth_user=cloud_admin
|
||||||
|
[pgbouncer]
|
||||||
|
listen_port=6432
|
||||||
|
listen_addr=0.0.0.0
|
||||||
|
auth_type=scram-sha-256
|
||||||
|
auth_user=cloud_admin
|
||||||
|
auth_dbname=postgres
|
||||||
|
client_tls_sslmode=disable
|
||||||
|
server_tls_sslmode=disable
|
||||||
|
pool_mode=transaction
|
||||||
|
max_client_conn=10000
|
||||||
|
default_pool_size=16
|
||||||
|
max_prepared_statements=0
|
||||||
|
- filename: cgconfig.conf
|
||||||
|
content: |
|
||||||
|
# Configuration for cgroups in VM compute nodes
|
||||||
|
group neon-postgres {
|
||||||
|
perm {
|
||||||
|
admin {
|
||||||
|
uid = postgres;
|
||||||
|
}
|
||||||
|
task {
|
||||||
|
gid = users;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memory {}
|
||||||
|
}
|
||||||
|
- filename: postgres_exporter_queries.yml
|
||||||
|
content: |
|
||||||
|
pg_wait_sampling:
|
||||||
|
query: "select pid, event_type, event, w.queryid as queryid, query, count from pg_wait_sampling_profile w left join pg_stat_statements s on w.queryid = s.queryid;"
|
||||||
|
cache_seconds: 30
|
||||||
|
metrics:
|
||||||
|
- pid:
|
||||||
|
usage: "LABEL"
|
||||||
|
description: "backend pid"
|
||||||
|
- event_type:
|
||||||
|
usage: "LABEL"
|
||||||
|
description: "event type"
|
||||||
|
- event:
|
||||||
|
usage: "LABEL"
|
||||||
|
description: "event"
|
||||||
|
- queryid:
|
||||||
|
usage: "LABEL"
|
||||||
|
description: "queryid"
|
||||||
|
- query:
|
||||||
|
usage: "LABEL"
|
||||||
|
description: "query"
|
||||||
|
- count:
|
||||||
|
usage: "GAUGE"
|
||||||
|
description: "count"
|
||||||
|
build: |
|
||||||
|
# Build cgroup-tools
|
||||||
|
#
|
||||||
|
# At time of writing (2023-03-14), debian bullseye has a version of cgroup-tools (technically
|
||||||
|
# libcgroup) that doesn't support cgroup v2 (version 0.41-11). Unfortunately, the vm-monitor
|
||||||
|
# requires cgroup v2, so we'll build cgroup-tools ourselves.
|
||||||
|
FROM debian:bullseye-slim as libcgroup-builder
|
||||||
|
ENV LIBCGROUP_VERSION v2.0.3
|
||||||
|
|
||||||
|
RUN set -exu \
|
||||||
|
&& apt update \
|
||||||
|
&& apt install --no-install-recommends -y \
|
||||||
|
git \
|
||||||
|
ca-certificates \
|
||||||
|
automake \
|
||||||
|
cmake \
|
||||||
|
make \
|
||||||
|
gcc \
|
||||||
|
byacc \
|
||||||
|
flex \
|
||||||
|
libtool \
|
||||||
|
libpam0g-dev \
|
||||||
|
&& git clone --depth 1 -b $LIBCGROUP_VERSION https://github.com/libcgroup/libcgroup \
|
||||||
|
&& INSTALL_DIR="/libcgroup-install" \
|
||||||
|
&& mkdir -p "$INSTALL_DIR/bin" "$INSTALL_DIR/include" \
|
||||||
|
&& cd libcgroup \
|
||||||
|
# extracted from bootstrap.sh, with modified flags:
|
||||||
|
&& (test -d m4 || mkdir m4) \
|
||||||
|
&& autoreconf -fi \
|
||||||
|
&& rm -rf autom4te.cache \
|
||||||
|
&& CFLAGS="-O3" ./configure --prefix="$INSTALL_DIR" --sysconfdir=/etc --localstatedir=/var --enable-opaque-hierarchy="name=systemd" \
|
||||||
|
# actually build the thing...
|
||||||
|
&& make install
|
||||||
|
|
||||||
|
FROM quay.io/prometheuscommunity/postgres-exporter:v0.12.0 AS postgres-exporter
|
||||||
|
|
||||||
|
# Build pgbouncer
|
||||||
|
#
|
||||||
|
FROM debian:bullseye-slim AS pgbouncer
|
||||||
|
RUN set -e \
|
||||||
|
&& apt-get update \
|
||||||
|
&& apt-get install -y \
|
||||||
|
curl \
|
||||||
|
build-essential \
|
||||||
|
pkg-config \
|
||||||
|
libevent-dev \
|
||||||
|
libssl-dev
|
||||||
|
|
||||||
|
ENV PGBOUNCER_VERSION 1.21.0
|
||||||
|
ENV PGBOUNCER_GITPATH 1_21_0
|
||||||
|
RUN set -e \
|
||||||
|
&& curl -sfSL https://github.com/pgbouncer/pgbouncer/releases/download/pgbouncer_${PGBOUNCER_GITPATH}/pgbouncer-${PGBOUNCER_VERSION}.tar.gz -o pgbouncer-${PGBOUNCER_VERSION}.tar.gz \
|
||||||
|
&& tar xzvf pgbouncer-${PGBOUNCER_VERSION}.tar.gz \
|
||||||
|
&& cd pgbouncer-${PGBOUNCER_VERSION} \
|
||||||
|
&& LDFLAGS=-static ./configure --prefix=/usr/local/pgbouncer --without-openssl \
|
||||||
|
&& make -j $(nproc) \
|
||||||
|
&& make install
|
||||||
|
merge: |
|
||||||
|
# tweak nofile limits
|
||||||
|
RUN set -e \
|
||||||
|
&& echo 'fs.file-max = 1048576' >>/etc/sysctl.conf \
|
||||||
|
&& test ! -e /etc/security || ( \
|
||||||
|
echo '* - nofile 1048576' >>/etc/security/limits.conf \
|
||||||
|
&& echo 'root - nofile 1048576' >>/etc/security/limits.conf \
|
||||||
|
)
|
||||||
|
|
||||||
|
COPY cgconfig.conf /etc/cgconfig.conf
|
||||||
|
COPY pgbouncer.ini /etc/pgbouncer.ini
|
||||||
|
COPY postgres_exporter_queries.yml /etc/postgres_exporter_queries.yml
|
||||||
|
RUN set -e \
|
||||||
|
&& chown postgres:postgres /etc/pgbouncer.ini \
|
||||||
|
&& chmod 0644 /etc/pgbouncer.ini \
|
||||||
|
&& chmod 0644 /etc/cgconfig.conf \
|
||||||
|
&& chmod 0644 /etc/postgres_exporter_queries.yml
|
||||||
|
|
||||||
|
COPY --from=libcgroup-builder /libcgroup-install/bin/* /usr/bin/
|
||||||
|
COPY --from=libcgroup-builder /libcgroup-install/lib/* /usr/lib/
|
||||||
|
COPY --from=libcgroup-builder /libcgroup-install/sbin/* /usr/sbin/
|
||||||
|
COPY --from=postgres-exporter /bin/postgres_exporter /bin/postgres_exporter
|
||||||
|
COPY --from=pgbouncer /usr/local/pgbouncer/bin/pgbouncer /usr/local/bin/pgbouncer
|
||||||
Reference in New Issue
Block a user