9
9
import zlib
10
10
from abc import ABC , abstractmethod
11
11
from collections import OrderedDict
12
- from concurrent .futures import ProcessPoolExecutor
12
+ from concurrent .futures import ProcessPoolExecutor , TimeoutError
13
13
from dataclasses import dataclass
14
14
from pathlib import Path
15
15
from typing import (
83
83
REST_EXTENSIONS = (".rst" , ".rest" )
84
84
85
85
86
- LOAD_LIBRARY_TIME_OUT = 30
87
- FIND_FILE_TIME_OUT = 10
88
- COMPLETE_LIBRARY_IMPORT_TIME_OUT = COMPLETE_RESOURCE_IMPORT_TIME_OUT = COMPLETE_VARIABLES_IMPORT_TIME_OUT = 10
86
+ LOAD_LIBRARY_TIME_OUT = 10
87
+ COMPLETE_LIBRARY_IMPORT_TIME_OUT = COMPLETE_RESOURCE_IMPORT_TIME_OUT = COMPLETE_VARIABLES_IMPORT_TIME_OUT = 5
89
88
90
89
91
90
class _EntryKey :
@@ -1155,6 +1154,7 @@ def _get_library_libdoc(
1155
1154
meta , _source , ignore_arguments = self .get_library_meta (name , base_dir , variables )
1156
1155
1157
1156
if meta is not None and not meta .has_errors :
1157
+
1158
1158
meta_file = Path (self .lib_doc_cache_path , meta .filepath_base + ".meta.json" )
1159
1159
if meta_file .exists ():
1160
1160
try :
@@ -1164,14 +1164,19 @@ def _get_library_libdoc(
1164
1164
if saved_meta .has_errors :
1165
1165
self ._logger .debug (
1166
1166
lambda : "Saved library spec for {name}{args!r} is not used "
1167
- "due to errors in meta data"
1167
+ "due to errors in meta data" ,
1168
+ context_name = "import" ,
1168
1169
)
1169
1170
1170
1171
if not saved_meta .has_errors and saved_meta == meta :
1171
1172
spec_path = Path (
1172
1173
self .lib_doc_cache_path ,
1173
1174
meta .filepath_base + ".spec.json" ,
1174
1175
)
1176
+
1177
+ self ._logger .debug (
1178
+ lambda : f"Use cached library meta data for { name } " , context_name = "import"
1179
+ )
1175
1180
return from_json (spec_path .read_text ("utf-8" ), LibraryDoc )
1176
1181
1177
1182
except (SystemExit , KeyboardInterrupt ):
@@ -1185,17 +1190,22 @@ def _get_library_libdoc(
1185
1190
except BaseException as e :
1186
1191
self ._logger .exception (e )
1187
1192
1193
+ self ._logger .debug (lambda : f"Load library in process { name } { args !r} " , context_name = "import" )
1188
1194
executor = ProcessPoolExecutor (max_workers = 1 , mp_context = mp .get_context ("spawn" ))
1189
1195
try :
1190
- result = executor .submit (
1191
- get_library_doc ,
1192
- name ,
1193
- args if not ignore_arguments else (),
1194
- working_dir ,
1195
- base_dir ,
1196
- self .get_resolvable_command_line_variables (),
1197
- variables ,
1198
- ).result (LOAD_LIBRARY_TIME_OUT )
1196
+ try :
1197
+ result = executor .submit (
1198
+ get_library_doc ,
1199
+ name ,
1200
+ args if not ignore_arguments else (),
1201
+ working_dir ,
1202
+ base_dir ,
1203
+ self .get_resolvable_command_line_variables (),
1204
+ variables ,
1205
+ ).result (LOAD_LIBRARY_TIME_OUT )
1206
+
1207
+ except TimeoutError as e :
1208
+ raise RuntimeError (f"Timeout loading library { name } ({ args !r} )" ) from e
1199
1209
1200
1210
except (SystemExit , KeyboardInterrupt ):
1201
1211
raise
@@ -1369,15 +1379,20 @@ def _get_variables_libdoc(
1369
1379
1370
1380
executor = ProcessPoolExecutor (max_workers = 1 , mp_context = mp .get_context ("spawn" ))
1371
1381
try :
1372
- result = executor .submit (
1373
- get_variables_doc ,
1374
- name ,
1375
- args ,
1376
- working_dir ,
1377
- base_dir ,
1378
- self .get_resolvable_command_line_variables () if resolve_command_line_vars else None ,
1379
- variables ,
1380
- ).result (LOAD_LIBRARY_TIME_OUT )
1382
+ try :
1383
+ result = executor .submit (
1384
+ get_variables_doc ,
1385
+ name ,
1386
+ args ,
1387
+ working_dir ,
1388
+ base_dir ,
1389
+ self .get_resolvable_command_line_variables () if resolve_command_line_vars else None ,
1390
+ variables ,
1391
+ ).result (LOAD_LIBRARY_TIME_OUT )
1392
+
1393
+ except TimeoutError as e :
1394
+ raise RuntimeError (f"Timeout loading library { name } ({ args !r} )" ) from e
1395
+
1381
1396
except (SystemExit , KeyboardInterrupt ):
1382
1397
raise
1383
1398
except BaseException as e :
@@ -1553,7 +1568,7 @@ def complete_library_import(
1553
1568
base_dir ,
1554
1569
self .get_resolvable_command_line_variables (),
1555
1570
variables ,
1556
- ).result (LOAD_LIBRARY_TIME_OUT )
1571
+ ).result (COMPLETE_LIBRARY_IMPORT_TIME_OUT )
1557
1572
1558
1573
def complete_resource_import (
1559
1574
self ,
@@ -1568,7 +1583,7 @@ def complete_resource_import(
1568
1583
base_dir ,
1569
1584
self .get_resolvable_command_line_variables (),
1570
1585
variables ,
1571
- ).result (LOAD_LIBRARY_TIME_OUT )
1586
+ ).result (COMPLETE_RESOURCE_IMPORT_TIME_OUT )
1572
1587
1573
1588
def complete_variables_import (
1574
1589
self ,
@@ -1583,7 +1598,7 @@ def complete_variables_import(
1583
1598
base_dir ,
1584
1599
self .get_resolvable_command_line_variables (),
1585
1600
variables ,
1586
- ).result (LOAD_LIBRARY_TIME_OUT )
1601
+ ).result (COMPLETE_VARIABLES_IMPORT_TIME_OUT )
1587
1602
1588
1603
def resolve_variable (
1589
1604
self ,
0 commit comments