Install the runtime if needed, initialize the cluster, and start serving.
(self)
| 313 | |
| 314 | /// Install the runtime if needed, initialize the cluster, and start serving. |
| 315 | pub fn start(self) -> Result<PgliteServer> { |
| 316 | self.postgres_config.validate()?; |
| 317 | self.startup_config.validate()?; |
| 318 | #[cfg(feature = "extensions")] |
| 319 | let extensions = resolve_extension_set(&self.extensions)?; |
| 320 | let postgres_config = self.postgres_config.clone(); |
| 321 | let startup_config = self.startup_config.clone(); |
| 322 | |
| 323 | let prepared_root = { |
| 324 | let _phase = timing::phase("server.root_prepare"); |
| 325 | match self.root { |
| 326 | ServerRoot::Path(root) => { |
| 327 | let _phase = timing::phase("server.root_prepare.path"); |
| 328 | let plan = RootPlan::new(RootTarget::Path(root), RootSource::Template); |
| 329 | #[cfg(feature = "extensions")] |
| 330 | let plan = plan.with_extensions(extensions.clone(), postgres_config.clone()); |
| 331 | prepare_root(plan)? |
| 332 | } |
| 333 | ServerRoot::Temporary { template_cache } => { |
| 334 | let source = if template_cache { |
| 335 | RootSource::Template |
| 336 | } else { |
| 337 | RootSource::FreshInitdb |
| 338 | }; |
| 339 | let phase = if template_cache { |
| 340 | "server.root_prepare.temporary_cached" |
| 341 | } else { |
| 342 | "server.root_prepare.temporary_fresh" |
| 343 | }; |
| 344 | let _phase = timing::phase(phase); |
| 345 | let plan = RootPlan::new(RootTarget::Temporary, source); |
| 346 | #[cfg(feature = "extensions")] |
| 347 | let plan = plan.with_extensions(extensions.clone(), postgres_config.clone()); |
| 348 | run_blocking("pglite-template-cache", move || prepare_root(plan))? |
| 349 | } |
| 350 | } |
| 351 | }; |
| 352 | let PreparedRoot { |
| 353 | root, |
| 354 | temp_dir, |
| 355 | root_lock, |
| 356 | outcome, |
| 357 | } = prepared_root; |
| 358 | |
| 359 | let shutdown = Arc::new(AtomicBool::new(false)); |
| 360 | let proxy = { |
| 361 | let _phase = timing::phase("server.proxy_create"); |
| 362 | PgliteProxy::new(root.clone()).with_prepared_root(outcome) |
| 363 | }; |
| 364 | let proxy = proxy |
| 365 | .with_postgres_config(postgres_config) |
| 366 | .with_startup_config(startup_config.clone()); |
| 367 | #[cfg(feature = "extensions")] |
| 368 | let proxy = proxy.with_extensions(extensions); |
| 369 | |
| 370 | let (endpoint, handle) = match self.endpoint { |
| 371 | ServerEndpointConfig::Tcp(addr) => start_tcp(proxy, addr, shutdown.clone())?, |
| 372 | #[cfg(unix)] |