1
- from argparse import Namespace
1
+ from argparse import ArgumentParser , Namespace
2
2
import asyncio
3
3
import logging
4
4
import signal
5
- import sys
6
5
import time
7
6
from typing import (
8
7
Any ,
@@ -126,16 +125,30 @@ def main() -> None:
126
125
"networks are supported." .format (args .network_id )
127
126
)
128
127
129
- logger , formatter , handler_stream = setup_trinity_stderr_logging (
130
- args .stderr_log_level
128
+ has_ambigous_logging_config = (
129
+ args .log_levels is not None and
130
+ None in args .log_levels and
131
+ args .stderr_log_level is not None
131
132
)
133
+ if has_ambigous_logging_config :
134
+ parser .error (
135
+ "\n "
136
+ "Ambiguous logging configuration: The logging level for stderr was "
137
+ "configured with both `--stderr-log-level` and `--log-level`. "
138
+ "Please remove one of these flags" ,
139
+ )
140
+
141
+ stderr_logger , formatter , handler_stream = setup_trinity_stderr_logging (
142
+ args .stderr_log_level or (args .log_levels and args .log_levels .get (None ))
143
+ )
144
+
132
145
if args .log_levels :
133
146
setup_log_levels (args .log_levels )
134
147
135
148
try :
136
149
chain_config = ChainConfig .from_parser_args (args )
137
150
except AmbigiousFileSystem :
138
- exit_because_ambigious_filesystem ( logger )
151
+ parser . error ( TRINITY_AMBIGIOUS_FILESYSTEM_INFO )
139
152
140
153
if not is_data_dir_initialized (chain_config ):
141
154
# TODO: this will only work as is for chains with known genesis
@@ -144,20 +157,18 @@ def main() -> None:
144
157
try :
145
158
initialize_data_dir (chain_config )
146
159
except AmbigiousFileSystem :
147
- exit_because_ambigious_filesystem ( logger )
160
+ parser . error ( TRINITY_AMBIGIOUS_FILESYSTEM_INFO )
148
161
except MissingPath as e :
149
- msg = (
162
+ parser . error (
150
163
"\n "
151
- "It appears that {} does not exist.\n "
152
- "Trinity does not attempt to create directories outside of its root path\n "
153
- "Either manually create the path or ensure you are using a data directory\n "
164
+ f "It appears that { e . path } does not exist. "
165
+ "Trinity does not attempt to create directories outside of its root path. "
166
+ "Either manually create the path or ensure you are using a data directory "
154
167
"inside the XDG_TRINITY_ROOT path"
155
- ).format (e .path )
156
- logger .error (msg )
157
- sys .exit (1 )
168
+ )
158
169
159
- logger , log_queue , listener = setup_trinity_file_and_queue_logging (
160
- logger ,
170
+ file_logger , log_queue , listener = setup_trinity_file_and_queue_logging (
171
+ stderr_logger ,
161
172
formatter ,
162
173
handler_stream ,
163
174
chain_config ,
@@ -168,8 +179,8 @@ def main() -> None:
168
179
169
180
# compute the minimum configured log level across all configured loggers.
170
181
min_configured_log_level = min (
171
- args . stderr_log_level ,
172
- args . file_log_level ,
182
+ stderr_logger . level ,
183
+ file_logger . level ,
173
184
* (args .log_levels or {}).values ()
174
185
)
175
186
@@ -192,7 +203,7 @@ def main() -> None:
192
203
listener ,
193
204
event_bus ,
194
205
main_endpoint ,
195
- logger
206
+ stderr_logger ,
196
207
)
197
208
198
209
@@ -237,7 +248,7 @@ def trinity_boot(args: Namespace,
237
248
except TimeoutError as e :
238
249
logger .error ("Timeout waiting for database to start. Exiting..." )
239
250
kill_process_gracefully (database_server_process , logger )
240
- sys . exit ( 1 )
251
+ ArgumentParser (). error ( message = "Timed out waiting for database start" )
241
252
242
253
networking_process .start ()
243
254
logger .info ("Started networking process (pid=%d)" , networking_process .pid )
@@ -276,7 +287,8 @@ def kill_trinity_gracefully(logger: logging.Logger,
276
287
database_server_process : Any ,
277
288
networking_process : Any ,
278
289
plugin_manager : PluginManager ,
279
- event_bus : EventBus ) -> None :
290
+ event_bus : EventBus ,
291
+ message : str = "Trinity shudown complete\n " ) -> None :
280
292
# When a user hits Ctrl+C in the terminal, the SIGINT is sent to all processes in the
281
293
# foreground *process group*, so both our networking and database processes will terminate
282
294
# at the same time and not sequentially as we'd like. That shouldn't be a problem but if
@@ -297,7 +309,10 @@ def kill_trinity_gracefully(logger: logging.Logger,
297
309
time .sleep (0.2 )
298
310
kill_process_gracefully (networking_process , logger )
299
311
logger .info ('Networking process (pid=%d) terminated' , networking_process .pid )
300
- sys .exit ()
312
+
313
+ # This is required to be within the `kill_trinity_gracefully` so that
314
+ # plugins can trigger a shutdown of the trinity process.
315
+ ArgumentParser ().exit (message = message )
301
316
302
317
303
318
@setup_cprofiler ('run_database_process' )
@@ -321,11 +336,6 @@ def _sigint_handler(*args: Any) -> None:
321
336
raise
322
337
323
338
324
- def exit_because_ambigious_filesystem (logger : logging .Logger ) -> None :
325
- logger .error (TRINITY_AMBIGIOUS_FILESYSTEM_INFO )
326
- sys .exit (1 )
327
-
328
-
329
339
async def exit_on_signal (service_to_exit : BaseService ) -> None :
330
340
loop = service_to_exit .get_event_loop ()
331
341
sigint_received = asyncio .Event ()
0 commit comments