Skip to content

Commit df4eb3e

Browse files
ijonblinkov
authored andcommitted
tests/library/harness: get rid of warnings on un-closed files (#15274)
tests/library/harness: get rid of warnings on un-closed files. `KiKiMRNode`-`Daemon` manage process of ydb node (ydbd). `Daemon` opens stderr, stdout. `KiKiMRNode` opens log file. Change `Daemon` to open all those files on (every) `Daemon.start()` and close on (every) `Daemon.{stop,kill}()` instead of opening them once at `KiKiMRNode`-`Daemon` construction and never closing.
1 parent d2fdc67 commit df4eb3e

File tree

2 files changed

+39
-11
lines changed

2 files changed

+39
-11
lines changed

ydb/tests/library/harness/daemon.py

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ def __init__(
6060
timeout,
6161
stdout_file="/dev/null",
6262
stderr_file="/dev/null",
63+
aux_file=None,
6364
stderr_on_error_lines=0,
6465
core_pattern=None,
6566
):
@@ -71,8 +72,27 @@ def __init__(
7172
self.killed = False
7273
self.__core_pattern = core_pattern
7374
self.logger = logger.getChild(self.__class__.__name__)
74-
self.__stdout_file = open(stdout_file, mode='wb')
75-
self.__stderr_file = open(stderr_file, mode='wb')
75+
self.__stdout_file_name = stdout_file
76+
self.__stderr_file_name = stderr_file
77+
self.__aux_file_name = aux_file
78+
self.__stdout_file = None
79+
self.__stderr_file = None
80+
self.__aux_file = None
81+
82+
def __open_output_files(self):
83+
self.__stdout_file = open(self.__stdout_file_name, mode='w+b')
84+
self.__stderr_file = open(self.__stderr_file_name, mode='w+b')
85+
if self.__aux_file_name is not None:
86+
self.__aux_file = open(self.__aux_file_name, mode='w+b')
87+
88+
def __close_output_files(self):
89+
self.__stdout_file.close()
90+
self.__stdout_file = None
91+
self.__stderr_file.close()
92+
self.__stderr_file = None
93+
if self.__aux_file_name is not None:
94+
self.__aux_file.close()
95+
self.__aux_file = None
7696

7797
@property
7898
def daemon(self):
@@ -81,14 +101,14 @@ def daemon(self):
81101
@property
82102
def stdout_file_name(self):
83103
if self.__stdout_file is not sys.stdout:
84-
return os.path.abspath(self.__stdout_file.name)
104+
return os.path.abspath(self.__stdout_file_name)
85105
else:
86106
return None
87107

88108
@property
89109
def stderr_file_name(self):
90110
if self.__stderr_file is not sys.stderr:
91-
return os.path.abspath(self.__stderr_file.name)
111+
return os.path.abspath(self.__stderr_file_name)
92112
else:
93113
return None
94114

@@ -98,20 +118,21 @@ def is_alive(self):
98118
def start(self):
99119
if self.is_alive():
100120
return
101-
stderr_stream = self.__stderr_file
121+
self.__open_output_files()
102122
self.__daemon = process.execute(
103123
self.__command,
104124
check_exit_code=False,
105125
cwd=self.__cwd,
106126
stdout=self.__stdout_file,
107-
stderr=stderr_stream,
127+
stderr=self.__stderr_file,
108128
wait=False,
109129
core_pattern=self.__core_pattern,
110130
)
111131
wait_for(self.is_alive, self.__timeout)
112132

113133
if not self.is_alive():
114134
self.__check_before_fail()
135+
self.__close_output_files()
115136
raise DaemonError(
116137
"Unexpectedly finished on start",
117138
exit_code=self.__daemon.exit_code,
@@ -141,6 +162,7 @@ def __check_can_launch_stop(self, stop_type):
141162

142163
if not self.is_alive():
143164
self.__check_before_fail()
165+
self.__close_output_files()
144166
raise DaemonError(
145167
"Unexpectedly finished before %s" % stop_type,
146168
exit_code=self.__daemon.exit_code,
@@ -176,6 +198,7 @@ def stop(self):
176198
wait_for(lambda: not self.is_alive(), self.__timeout)
177199
is_killed = True
178200
self.__check_before_end_stop("stop")
201+
self.__close_output_files()
179202

180203
if not is_killed:
181204
exit_code = self.__daemon.exit_code
@@ -201,6 +224,7 @@ def kill(self):
201224
self.killed = True
202225

203226
self.__check_before_end_stop("kill")
227+
self.__close_output_files()
204228

205229

206230
@six.add_metaclass(abc.ABCMeta)

ydb/tests/library/harness/kikimr_runner.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,17 @@ def __init__(self, node_id, config_path, port_allocator, cluster_name, configura
8989
)
9090

9191
if configurator.use_log_files:
92-
self.__log_file = tempfile.NamedTemporaryFile(dir=self.__working_dir, prefix="logfile_", suffix=".log", delete=False)
92+
# use NamedTemporaryFile only as a unique name generator
93+
log_file = tempfile.NamedTemporaryFile(dir=self.__working_dir, prefix="logfile_", suffix=".log", delete=False)
94+
self.__log_file_name = log_file.name
95+
log_file.close()
9396
kwargs = {
9497
"stdout_file": os.path.join(self.__working_dir, "stdout"),
95-
"stderr_file": os.path.join(self.__working_dir, "stderr")
98+
"stderr_file": os.path.join(self.__working_dir, "stderr"),
99+
"aux_file": self.__log_file_name,
96100
}
97101
else:
98-
self.__log_file = None
102+
self.__log_file_name = None
99103
kwargs = {
100104
"stdout_file": "/dev/stdout",
101105
"stderr_file": "/dev/stderr"
@@ -168,9 +172,9 @@ def __make_run_command(self):
168172
"--node-kind=%s" % self.__configurator.node_kind
169173
)
170174

171-
if self.__log_file is not None:
175+
if self.__log_file_name is not None:
172176
command.append(
173-
"--log-file-name=%s" % self.__log_file.name,
177+
"--log-file-name=%s" % self.__log_file_name,
174178
)
175179

176180
command.extend(

0 commit comments

Comments
 (0)