@@ -181,7 +181,9 @@ pub struct User {
181
181
pub server_username : Option < String > ,
182
182
pub server_password : Option < String > ,
183
183
pub pool_size : u32 ,
184
+ pub min_pool_size : Option < u32 > ,
184
185
pub pool_mode : Option < PoolMode > ,
186
+ pub server_lifetime : Option < u64 > ,
185
187
#[ serde( default ) ] // 0
186
188
pub statement_timeout : u64 ,
187
189
}
@@ -194,12 +196,34 @@ impl Default for User {
194
196
server_username : None ,
195
197
server_password : None ,
196
198
pool_size : 15 ,
199
+ min_pool_size : None ,
197
200
statement_timeout : 0 ,
198
201
pool_mode : None ,
202
+ server_lifetime : None ,
199
203
}
200
204
}
201
205
}
202
206
207
+ impl User {
208
+ fn validate ( & self ) -> Result < ( ) , Error > {
209
+ match self . min_pool_size {
210
+ Some ( min_pool_size) => {
211
+ if min_pool_size > self . pool_size {
212
+ error ! (
213
+ "min_pool_size of {} cannot be larger than pool_size of {}" ,
214
+ min_pool_size, self . pool_size
215
+ ) ;
216
+ return Err ( Error :: BadConfig ) ;
217
+ }
218
+ }
219
+
220
+ None => ( ) ,
221
+ } ;
222
+
223
+ Ok ( ( ) )
224
+ }
225
+ }
226
+
203
227
/// General configuration.
204
228
#[ derive( Serialize , Deserialize , Debug , Clone , PartialEq ) ]
205
229
pub struct General {
@@ -246,6 +270,9 @@ pub struct General {
246
270
#[ serde( default = "General::default_idle_client_in_transaction_timeout" ) ]
247
271
pub idle_client_in_transaction_timeout : u64 ,
248
272
273
+ #[ serde( default = "General::default_server_lifetime" ) ]
274
+ pub server_lifetime : u64 ,
275
+
249
276
#[ serde( default = "General::default_worker_threads" ) ]
250
277
pub worker_threads : usize ,
251
278
@@ -271,6 +298,10 @@ impl General {
271
298
5432
272
299
}
273
300
301
+ pub fn default_server_lifetime ( ) -> u64 {
302
+ 1000 * 60 * 60 * 24 // 24 hours
303
+ }
304
+
274
305
pub fn default_connect_timeout ( ) -> u64 {
275
306
1000
276
307
}
@@ -347,6 +378,7 @@ impl Default for General {
347
378
auth_query : None ,
348
379
auth_query_user : None ,
349
380
auth_query_password : None ,
381
+ server_lifetime : 1000 * 3600 * 24 , // 24 hours,
350
382
}
351
383
}
352
384
}
@@ -411,6 +443,8 @@ pub struct Pool {
411
443
412
444
pub idle_timeout : Option < u64 > ,
413
445
446
+ pub server_lifetime : Option < u64 > ,
447
+
414
448
pub sharding_function : ShardingFunction ,
415
449
416
450
#[ serde( default = "Pool::default_automatic_sharding_key" ) ]
@@ -515,6 +549,10 @@ impl Pool {
515
549
None => None ,
516
550
} ;
517
551
552
+ for ( _, user) in & self . users {
553
+ user. validate ( ) ?;
554
+ }
555
+
518
556
Ok ( ( ) )
519
557
}
520
558
}
@@ -539,6 +577,7 @@ impl Default for Pool {
539
577
auth_query : None ,
540
578
auth_query_user : None ,
541
579
auth_query_password : None ,
580
+ server_lifetime : None ,
542
581
}
543
582
}
544
583
}
@@ -791,6 +830,10 @@ impl Config {
791
830
) ;
792
831
info ! ( "Shutdown timeout: {}ms" , self . general. shutdown_timeout) ;
793
832
info ! ( "Healthcheck delay: {}ms" , self . general. healthcheck_delay) ;
833
+ info ! (
834
+ "Default max server lifetime: {}ms" ,
835
+ self . general. server_lifetime
836
+ ) ;
794
837
match self . general . tls_certificate . clone ( ) {
795
838
Some ( tls_certificate) => {
796
839
info ! ( "TLS certificate: {}" , tls_certificate) ;
@@ -867,12 +910,26 @@ impl Config {
867
910
pool_name,
868
911
pool_config. users. len( )
869
912
) ;
913
+ info ! (
914
+ "[pool: {}] Max server lifetime: {}" ,
915
+ pool_name,
916
+ match pool_config. server_lifetime {
917
+ Some ( server_lifetime) => format!( "{}ms" , server_lifetime) ,
918
+ None => "default" . to_string( ) ,
919
+ }
920
+ ) ;
870
921
871
922
for user in & pool_config. users {
872
923
info ! (
873
924
"[pool: {}][user: {}] Pool size: {}" ,
874
925
pool_name, user. 1 . username, user. 1 . pool_size,
875
926
) ;
927
+ info ! (
928
+ "[pool: {}][user: {}] Minimum pool size: {}" ,
929
+ pool_name,
930
+ user. 1 . username,
931
+ user. 1 . min_pool_size. unwrap_or( 0 )
932
+ ) ;
876
933
info ! (
877
934
"[pool: {}][user: {}] Statement timeout: {}" ,
878
935
pool_name, user. 1 . username, user. 1 . statement_timeout
@@ -886,6 +943,15 @@ impl Config {
886
943
None => pool_config. pool_mode. to_string( ) ,
887
944
}
888
945
) ;
946
+ info ! (
947
+ "[pool: {}][user: {}] Max server lifetime: {}" ,
948
+ pool_name,
949
+ user. 1 . username,
950
+ match user. 1 . server_lifetime {
951
+ Some ( server_lifetime) => format!( "{}ms" , server_lifetime) ,
952
+ None => "default" . to_string( ) ,
953
+ }
954
+ ) ;
889
955
}
890
956
}
891
957
}
@@ -896,15 +962,28 @@ impl Config {
896
962
&& ( self . general . auth_query_user . is_none ( )
897
963
|| self . general . auth_query_password . is_none ( ) )
898
964
{
899
- error ! ( "If auth_query is specified, you need to provide a value for `auth_query_user`, `auth_query_password`" ) ;
965
+ error ! (
966
+ "If auth_query is specified, \
967
+ you need to provide a value \
968
+ for `auth_query_user`, \
969
+ `auth_query_password`"
970
+ ) ;
971
+
900
972
return Err ( Error :: BadConfig ) ;
901
973
}
902
974
903
975
for ( name, pool) in self . pools . iter ( ) {
904
976
if pool. auth_query . is_some ( )
905
977
&& ( pool. auth_query_user . is_none ( ) || pool. auth_query_password . is_none ( ) )
906
978
{
907
- error ! ( "Error in pool {{ {} }}. If auth_query is specified, you need to provide a value for `auth_query_user`, `auth_query_password`" , name) ;
979
+ error ! (
980
+ "Error in pool {{ {} }}. \
981
+ If auth_query is specified, you need \
982
+ to provide a value for `auth_query_user`, \
983
+ `auth_query_password`",
984
+ name
985
+ ) ;
986
+
908
987
return Err ( Error :: BadConfig ) ;
909
988
}
910
989
@@ -914,7 +993,13 @@ impl Config {
914
993
|| pool. auth_query_user . is_none ( ) )
915
994
&& user_data. password . is_none ( )
916
995
{
917
- error ! ( "Error in pool {{ {} }}. You have to specify a user password for every pool if auth_query is not specified" , name) ;
996
+ error ! (
997
+ "Error in pool {{ {} }}. \
998
+ You have to specify a user password \
999
+ for every pool if auth_query is not specified",
1000
+ name
1001
+ ) ;
1002
+
918
1003
return Err ( Error :: BadConfig ) ;
919
1004
}
920
1005
}
0 commit comments