From 8198e87686eff396602051300e6b7b8637367abb Mon Sep 17 00:00:00 2001 From: Dmitry Simonenko Date: Wed, 9 Nov 2016 14:42:52 +0300 Subject: [PATCH] odissey: add connection pooler object --- core/od.c | 13 ++++++++++--- core/od.h | 1 - core/od_pooler.c | 26 ++++++++++++++++++++++++-- core/od_pooler.h | 12 +++++++++++- 4 files changed, 45 insertions(+), 7 deletions(-) diff --git a/core/od.c b/core/od.c index 54cbb682..a776943c 100644 --- a/core/od.c +++ b/core/od.c @@ -28,12 +28,10 @@ void od_init(od_t *od) od_loginit(&od->log); od_schemeinit(&od->scheme); od_configinit(&od->config, &od->log, &od->scheme); - od_poolinit(&od->pool); } void od_free(od_t *od) { - od_poolfree(&od->pool); od_schemefree(&od->scheme); od_configclose(&od->config); od_logclose(&od->log); @@ -48,6 +46,7 @@ od_usage(od_t *od, char *path) int od_main(od_t *od, int argc, char **argv) { + /* validate command line options */ if (argc != 2) { od_usage(od, argv[0]); return 1; @@ -65,6 +64,7 @@ int od_main(od_t *od, int argc, char **argv) } config_file = argv[1]; } + /* config file */ int rc; rc = od_configopen(&od->config, config_file); if (rc == -1) @@ -75,17 +75,24 @@ int od_main(od_t *od, int argc, char **argv) od_log(&od->log, "odissey."); od_log(&od->log, ""); od_schemeprint(&od->scheme, &od->log); + /* reopen log file after config parsing */ if (od->scheme.log_file) { rc = od_logopen(&od->log, od->scheme.log_file); if (rc == -1) return 1; } od_log(&od->log, ""); + /* validate configuration scheme */ rc = od_schemevalidate(&od->scheme, &od->log); if (rc == -1) return 1; od_log(&od->log, "ready."); - rc = od_pooler(od); + /* run connection pooler */ + odpooler_t pooler; + rc = od_pooler_init(&pooler, od); + if (rc == -1) + return 1; + rc = od_pooler_start(&pooler); if (rc == -1) return 1; return 0; diff --git a/core/od.h b/core/od.h index 6eda4ecd..63e29209 100644 --- a/core/od.h +++ b/core/od.h @@ -13,7 +13,6 @@ struct od_t { odlog_t log; odconfig_t config; odscheme_t scheme; - odpool_t pool; }; void od_init(od_t*); diff --git a/core/od_pooler.c b/core/od_pooler.c index 1c6bbf62..cb5a14f0 100644 --- a/core/od_pooler.c +++ b/core/od_pooler.c @@ -23,8 +23,30 @@ #include "od.h" #include "od_pooler.h" -int od_pooler(od_t *od) +static inline void +od_pooler(void *arg) { - (void)od; + (void)arg; +} + +int od_pooler_init(odpooler_t *p, od_t *od) +{ + p->env = ft_new(); + if (p->env == NULL) + return -1; + p->server = ft_io_new(p->env); + if (p->server == NULL) { + ft_free(p->env); + return -1; + } + p->od = od; + od_poolinit(&p->pool); + return 0; +} + +int od_pooler_start(odpooler_t *p) +{ + ft_create(p->env, od_pooler, p); + ft_start(p->env); return 0; } diff --git a/core/od_pooler.h b/core/od_pooler.h index 34735bf1..ebead82b 100644 --- a/core/od_pooler.h +++ b/core/od_pooler.h @@ -7,6 +7,16 @@ * PostgreSQL connection pooler and request router. */ -int od_pooler(od_t*); +typedef struct odpooler_t odpooler_t; + +struct odpooler_t { + ft_t env; + ftio_t server; + odpool_t pool; + od_t *od; +}; + +int od_pooler_init(odpooler_t*, od_t*); +int od_pooler_start(odpooler_t*); #endif