Skip to content

Commit b113b77

Browse files
committed
Implement try...finally block in _info for robust task cleanup per review feedback
1 parent 47fb8e8 commit b113b77

File tree

1 file changed

+20
-23
lines changed

1 file changed

+20
-23
lines changed

gcsfs/core.py

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1086,29 +1086,26 @@ async def _info(self, path, generation=None, **kwargs):
10861086
dir_task = asyncio.create_task(
10871087
self._get_directory_info(path, bucket, key, generation)
10881088
)
1089-
tasks = {exact_task, dir_task}
1090-
1091-
while tasks:
1092-
done, _ = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)
1093-
1094-
for task in done:
1095-
if task is exact_task:
1096-
try:
1097-
exact_res = task.result()
1098-
if not _is_directory_marker(exact_res):
1099-
# It's a file! Return immediately and cancel dir
1100-
dir_task.cancel()
1101-
return exact_res
1102-
except FileNotFoundError:
1103-
pass
1104-
except Exception as e:
1105-
dir_task.cancel()
1106-
raise e
1107-
tasks.remove(task)
1108-
1109-
# Both tasks finished. exact was either a directory marker or FileNotFoundError.
1110-
# Fallback to dir_task result (success or raise Exception).
1111-
return dir_task.result()
1089+
try:
1090+
tasks = {exact_task, dir_task}
1091+
1092+
while tasks:
1093+
done, _ = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)
1094+
1095+
for task in done:
1096+
if task is exact_task:
1097+
try:
1098+
exact_res = task.result()
1099+
if not _is_directory_marker(exact_res):
1100+
return exact_res
1101+
except FileNotFoundError:
1102+
pass
1103+
tasks.remove(task)
1104+
1105+
return dir_task.result()
1106+
finally:
1107+
dir_task.cancel()
1108+
exact_task.cancel()
11121109

11131110
async def _get_directory_info(self, path, bucket, key, generation):
11141111
"""

0 commit comments

Comments
 (0)