Skip to content

Commit e8d1917

Browse files
authored
fix: ensure config is TOML-serializable (#707)
Makes sure default values in the config are only as large as the largest TOML value, so it's serializable.
1 parent 4a195df commit e8d1917

File tree

2 files changed

+51
-6
lines changed

2 files changed

+51
-6
lines changed

pgdog-config/src/general.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -368,19 +368,22 @@ impl General {
368368
fn default_client_idle_timeout() -> u64 {
369369
Self::env_or_default(
370370
"PGDOG_CLIENT_IDLE_TIMEOUT",
371-
Duration::MAX.as_millis() as u64,
371+
crate::MAX_DURATION.as_millis() as u64,
372372
)
373373
}
374374

375375
fn default_client_idle_in_transaction_timeout() -> u64 {
376376
Self::env_or_default(
377377
"PGDOG_CLIENT_IDLE_IN_TRANSACTION_TIMEOUT",
378-
Duration::MAX.as_millis() as u64,
378+
crate::MAX_DURATION.as_millis() as u64,
379379
)
380380
}
381381

382382
fn default_query_timeout() -> u64 {
383-
Self::env_or_default("PGDOG_QUERY_TIMEOUT", Duration::MAX.as_millis() as u64)
383+
Self::env_or_default(
384+
"PGDOG_QUERY_TIMEOUT",
385+
crate::MAX_DURATION.as_millis() as u64,
386+
)
384387
}
385388

386389
pub fn query_timeout(&self) -> Duration {
@@ -447,7 +450,10 @@ impl General {
447450
}
448451

449452
fn lsn_check_delay() -> u64 {
450-
Self::env_or_default("PGDOG_LSN_CHECK_DELAY", Duration::MAX.as_millis() as u64)
453+
Self::env_or_default(
454+
"PGDOG_LSN_CHECK_DELAY",
455+
crate::MAX_DURATION.as_millis() as u64,
456+
)
451457
}
452458

453459
fn read_write_strategy() -> ReadWriteStrategy {
@@ -541,7 +547,7 @@ impl General {
541547
}
542548

543549
pub fn prepared_statements_limit() -> usize {
544-
Self::env_or_default("PGDOG_PREPARED_STATEMENTS_LIMIT", usize::MAX)
550+
Self::env_or_default("PGDOG_PREPARED_STATEMENTS_LIMIT", i64::MAX as usize)
545551
}
546552

547553
pub fn query_cache_limit() -> usize {
@@ -873,7 +879,7 @@ mod tests {
873879

874880
assert_eq!(General::broadcast_port(), General::port() + 1);
875881
assert_eq!(General::openmetrics_port(), None);
876-
assert_eq!(General::prepared_statements_limit(), usize::MAX);
882+
assert_eq!(General::prepared_statements_limit(), i64::MAX as usize);
877883
assert_eq!(General::query_cache_limit(), 50_000);
878884
assert_eq!(General::connect_attempts(), 1);
879885
assert_eq!(General::mirror_queue(), 128);

pgdog-config/src/lib.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,42 @@ pub use replication::*;
3232
pub use rewrite::{Rewrite, RewriteMode};
3333
pub use sharding::*;
3434
pub use users::{Admin, Plugin, User, Users};
35+
36+
use std::time::Duration;
37+
38+
// Make sure all duration fields
39+
// are at least TOML-serializable.
40+
pub const MAX_DURATION: Duration = Duration::from_millis(i64::MAX as u64);
41+
42+
#[cfg(test)]
43+
mod test {
44+
use std::time::Duration;
45+
46+
use serde::Serialize;
47+
48+
use crate::{ConfigAndUsers, MAX_DURATION};
49+
50+
#[test]
51+
fn test_max_duration() {
52+
assert!(MAX_DURATION > Duration::from_hours(24 * 7 * 52 * 100)); // 100 years
53+
assert_eq!(MAX_DURATION.as_millis() as i64, i64::MAX);
54+
55+
#[derive(Serialize)]
56+
struct SerTest {
57+
value: u64,
58+
}
59+
60+
let instance = SerTest {
61+
value: MAX_DURATION.as_millis() as u64,
62+
};
63+
64+
toml::to_string(&instance).unwrap();
65+
}
66+
67+
#[test]
68+
fn test_default_config_serializable() {
69+
let config = ConfigAndUsers::default();
70+
toml::to_string(&config.config).unwrap();
71+
toml::to_string(&config.users).unwrap();
72+
}
73+
}

0 commit comments

Comments
 (0)