Skip to content

Commit 2f80017

Browse files
authored
Handle exception from iterdir while discovering static files (patroni#3152)
Close patroni#3151
1 parent db82a83 commit 2f80017

File tree

2 files changed

+8
-2
lines changed

2 files changed

+8
-2
lines changed

patroni/postgresql/available_parameters/__init__.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,10 @@ def _traversable_walk(tvbs: Iterator[PathLikeObj]) -> Iterator[PathLikeObj]:
4242
if tvb.is_file():
4343
yield tvb
4444
elif tvb.is_dir():
45-
yield from _traversable_walk(tvb.iterdir())
45+
try:
46+
yield from _traversable_walk(tvb.iterdir())
47+
except Exception as e:
48+
logger.debug("Can't list directory %s: %r", tvb, e)
4649

4750

4851
def _filter_and_sort_files(files: Iterator[PathLikeObj]) -> Iterator[PathLikeObj]:

tests/test_postgresql.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1112,7 +1112,8 @@ def test__load_postgres_gucs_validators(self):
11121112
file1_attrs = {'is_file.return_value': True, 'is_dir.return_value': False}
11131113
file1_mock = MagicMock(**file1_attrs)
11141114
file1_mock.name = '__init__.py'
1115-
file2_attrs = {'is_file.return_value': False, 'is_dir.return_value': True, 'iterdir.return_value': []}
1115+
file2_attrs = {'is_file.return_value': False, 'is_dir.return_value': True,
1116+
'iterdir.side_effect': PermissionError(13, 'Permission denied')}
11161117
file2_mock = MagicMock(**file2_attrs)
11171118
file2_mock.name = '__pycache__'
11181119
file3_attrs = {'is_file.return_value': True, 'is_dir.return_value': False}
@@ -1126,9 +1127,11 @@ def test__load_postgres_gucs_validators(self):
11261127
dir_mock = MagicMock(**dir_attrs)
11271128
dir_mock.iterdir.return_value = [file1_mock, file2_mock, file3_mock, file4_mock]
11281129
with patch('patroni.postgresql.available_parameters.conf_dir', dir_mock), \
1130+
patch('patroni.postgresql.available_parameters.logger.debug') as mock_debug, \
11291131
patch('patroni.postgresql.available_parameters.logger.info') as mock_info, \
11301132
patch('patroni.postgresql.validator.logger.warning') as mock_warning:
11311133
_load_postgres_gucs_validators()
1134+
self.assertEqual(mock_debug.call_args[0][0], "Can't list directory %s: %r")
11321135
mock_info.assert_called_once_with('Ignored a non-YAML file found under `%s` '
11331136
'directory: `%s`.', 'available_parameters', file4_mock)
11341137
mock_warning.assert_called_once()

0 commit comments

Comments
 (0)