@@ -70,71 +70,92 @@ impl Settings {
7070 // `SYNC_FOO__BAR_VALUE="gorp"` as `foo.bar_value = "gorp"`
7171 s. merge ( Environment :: with_prefix ( & PREFIX . to_uppercase ( ) ) . separator ( "__" ) ) ?;
7272
73- match s. try_into :: < Self > ( ) {
74- Ok ( mut s) => {
75- s. syncstorage . normalize ( ) ;
76- if s. worker_max_blocking_threads == 0 {
77- // Db backends w/ blocking calls block via
78- // actix-threadpool: grow its size to accommodate the
79- // full number of connections
80- let total_db_pool_size = {
81- let syncstorage_pool_max_size =
82- if s. syncstorage . uses_spanner ( ) || !s. syncstorage . enabled {
83- 0
84- } else {
85- s. syncstorage . database_pool_max_size
86- } ;
87-
88- let tokenserver_pool_max_size = if s. tokenserver . enabled {
89- s. tokenserver . database_pool_max_size
90- } else {
91- 0
92- } ;
93-
94- syncstorage_pool_max_size + tokenserver_pool_max_size
95- } ;
96-
97- let fxa_threads = if s. tokenserver . enabled
98- && s. tokenserver . fxa_oauth_primary_jwk . is_none ( )
99- && s. tokenserver . fxa_oauth_secondary_jwk . is_none ( )
100- {
101- s. tokenserver
102- . additional_blocking_threads_for_fxa_requests
103- . ok_or_else ( || {
104- println ! (
105- "If the Tokenserver OAuth JWK is not cached, additional blocking \
106- threads must be used to handle the requests to FxA."
107- ) ;
108-
109- let setting_name =
110- "tokenserver.additional_blocking_threads_for_fxa_requests" ;
111- ConfigError :: NotFound ( String :: from ( setting_name) )
112- } ) ?
113- } else {
114- 0
115- } ;
116- s. worker_max_blocking_threads =
117- ( total_db_pool_size + fxa_threads) . max ( num_cpus:: get ( ) as u32 * 5 ) as usize ;
118- }
119- Ok ( s)
120- }
121- // Configuration errors are not very sysop friendly, Try to make them
122- // a bit more 3AM useful.
123- Err ( ConfigError :: Message ( v) ) => {
73+ let mut s = s. try_into :: < Self > ( ) . map_err ( |e| match e {
74+ ConfigError :: Message ( v) => {
12475 println ! ( "Bad configuration: {:?}" , & v) ;
12576 println ! ( "Please set in config file or use environment variable." ) ;
12677 println ! (
12778 "For example to set `database_url` use env var `{}_DATABASE_URL`\n " ,
12879 PREFIX . to_uppercase( )
12980 ) ;
13081 error ! ( "Configuration error: Value undefined {:?}" , & v) ;
131- Err ( ConfigError :: NotFound ( v) )
82+ ConfigError :: NotFound ( v)
13283 }
133- Err ( e ) => {
84+ e => {
13485 error ! ( "Configuration error: Other: {:?}" , & e) ;
135- Err ( e)
86+ e
87+ }
88+ } ) ?;
89+ s. normalize ( ) ?;
90+ s. validate ( ) ?;
91+ Ok ( s)
92+ }
93+
94+ /// Adjust values if required
95+ pub fn normalize ( & mut self ) -> Result < ( ) , ConfigError > {
96+ self . syncstorage . normalize ( ) ;
97+
98+ if self . worker_max_blocking_threads != 0 {
99+ return Ok ( ( ) ) ;
100+ }
101+
102+ // Db backends w/ blocking calls block via actix-threadpool: grow its
103+ // size to accommodate the full number of connections
104+ let total_db_pool_size = {
105+ let syncstorage_pool_max_size =
106+ if self . syncstorage . uses_spanner ( ) || !self . syncstorage . enabled {
107+ 0
108+ } else {
109+ self . syncstorage . database_pool_max_size
110+ } ;
111+
112+ let tokenserver_pool_max_size = if self . tokenserver . enabled {
113+ self . tokenserver . database_pool_max_size
114+ } else {
115+ 0
116+ } ;
117+
118+ syncstorage_pool_max_size + tokenserver_pool_max_size
119+ } ;
120+
121+ let fxa_threads = if self . tokenserver . enabled
122+ && self . tokenserver . fxa_oauth_primary_jwk . is_none ( )
123+ && self . tokenserver . fxa_oauth_secondary_jwk . is_none ( )
124+ {
125+ self . tokenserver
126+ . additional_blocking_threads_for_fxa_requests
127+ . ok_or_else ( || {
128+ println ! (
129+ "If the Tokenserver OAuth JWK is not cached, additional blocking \
130+ threads must be used to handle the requests to FxA."
131+ ) ;
132+
133+ let setting_name = "tokenserver.additional_blocking_threads_for_fxa_requests" ;
134+ ConfigError :: NotFound ( String :: from ( setting_name) )
135+ } ) ?
136+ } else {
137+ 0
138+ } ;
139+ self . worker_max_blocking_threads =
140+ ( total_db_pool_size + fxa_threads) . max ( num_cpus:: get ( ) as u32 * 5 ) as usize ;
141+
142+ Ok ( ( ) )
143+ }
144+
145+ pub fn validate ( & self ) -> Result < ( ) , ConfigError > {
146+ if let Some ( init_node_url) = & self . tokenserver . init_node_url {
147+ let url = Url :: parse ( init_node_url) . map_err ( |e| {
148+ ConfigError :: Message ( format ! ( "Invalid SYNC_TOKENSERVER__INIT_NODE_URL: {e}" ) )
149+ } ) ?;
150+ if ![ "http" , "https" ] . contains ( & url. scheme ( ) ) {
151+ return Err ( ConfigError :: Message (
152+ "Invalid SYNC_TOKENSERVER__INIT_NODE_URL: \
153+ requires an \" https\" /\" http\" scheme"
154+ . to_owned ( ) ,
155+ ) ) ;
136156 }
137157 }
158+ Ok ( ( ) )
138159 }
139160
140161 #[ cfg( debug_assertions) ]
0 commit comments