Skip to content

Commit a43affd

Browse files
Merge pull request ClickHouse#91895 from ClickHouse/backport/25.8/91750
Backport ClickHouse#91750 to 25.8: Fix `too many open files` errors in integration tests
2 parents 4227fc5 + 6299d7e commit a43affd

File tree

1 file changed

+23
-22
lines changed

1 file changed

+23
-22
lines changed

tests/integration/helpers/client.py

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,9 @@ def __init__(
181181
self, command, stdin=None, timeout=None, ignore_error=False, parse=False, stdout_file_path=None, stderr_file_path=None, env = {}
182182
):
183183
# Write data to tmp file to avoid PIPEs and execution blocking
184-
stdin_file = tempfile.TemporaryFile(mode="w+")
185-
stdin_file.write(stdin)
186-
stdin_file.seek(0)
184+
self.stdin_file = tempfile.TemporaryFile(mode="w+")
185+
self.stdin_file.write(stdin)
186+
self.stdin_file.seek(0)
187187
self.stdout_file = tempfile.TemporaryFile() if stdout_file_path is None else stdout_file_path
188188
self.stderr_file = tempfile.TemporaryFile() if stderr_file_path is None else stderr_file_path
189189
self.ignore_error = ignore_error
@@ -196,7 +196,7 @@ def __init__(
196196
env["TSAN_OPTIONS"] = "use_sigaltstack=0 verbosity=0"
197197
self.process = sp.Popen(
198198
command,
199-
stdin=stdin_file,
199+
stdin=self.stdin_file,
200200
stdout=self.stdout_file,
201201
stderr=self.stderr_file,
202202
env=env,
@@ -225,13 +225,24 @@ def remove_trash_from_stderr(self, stderr):
225225
]
226226
return "\n".join(lines)
227227

228-
def get_answer(self):
229-
self.process.wait(timeout=DEFAULT_QUERY_TIMEOUT)
230-
self.stdout_file.seek(0)
231-
self.stderr_file.seek(0)
228+
def wait_and_read_output(self):
229+
try:
230+
self.process.wait(timeout=DEFAULT_QUERY_TIMEOUT)
231+
self.stdout_file.seek(0)
232+
self.stderr_file.seek(0)
233+
234+
stdout = self.stdout_file.read().decode("utf-8", errors="replace")
235+
stderr = self.stderr_file.read().decode("utf-8", errors="replace")
232236

233-
stdout = self.stdout_file.read().decode("utf-8", errors="replace")
234-
stderr = self.stderr_file.read().decode("utf-8", errors="replace")
237+
return stdout, stderr
238+
239+
finally:
240+
self.stdin_file.close()
241+
self.stdout_file.close()
242+
self.stderr_file.close()
243+
244+
def get_answer(self):
245+
stdout, stderr = self.wait_and_read_output()
235246

236247
if (
237248
self.timer is not None
@@ -264,12 +275,7 @@ def get_answer(self):
264275
return stdout
265276

266277
def get_error(self):
267-
self.process.wait(timeout=DEFAULT_QUERY_TIMEOUT)
268-
self.stdout_file.seek(0)
269-
self.stderr_file.seek(0)
270-
271-
stdout = self.stdout_file.read().decode("utf-8", errors="replace")
272-
stderr = self.stderr_file.read().decode("utf-8", errors="replace")
278+
stdout, stderr = self.wait_and_read_output()
273279

274280
if (
275281
self.timer is not None
@@ -288,12 +294,7 @@ def get_error(self):
288294
return stderr
289295

290296
def get_answer_and_error(self):
291-
self.process.wait(timeout=DEFAULT_QUERY_TIMEOUT)
292-
self.stdout_file.seek(0)
293-
self.stderr_file.seek(0)
294-
295-
stdout = self.stdout_file.read().decode("utf-8", errors="replace")
296-
stderr = self.stderr_file.read().decode("utf-8", errors="replace")
297+
stdout, stderr = self.wait_and_read_output()
297298

298299
if (
299300
self.timer is not None

0 commit comments

Comments
 (0)