Skip to content

Commit ccf4dbc

Browse files
authored
ensure dead processes in server file are removed; improve log messages (#1004)
1 parent 862ed51 commit ccf4dbc

2 files changed

Lines changed: 29 additions & 21 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ Instructions: Add a subsection under `[Unreleased]` for additions, fixes, change
1717
### Fixed
1818

1919
- Fill-in-the-blank questions do not need dynamic-subs assets for HTML-format builds; now they will no longer be generated.
20+
- Sometimes the `pretext view` command did not work in Codespaces. Now inactive server instances are removed immediately which should fix this issue.
2021

2122
### Added
2223

pretext/server.py

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -45,39 +45,44 @@ def is_active_server(self) -> bool:
4545
try:
4646
p = psutil.Process(self.pid)
4747
except psutil.NoSuchProcess:
48-
log.info(f"Found entry no longer exists {self.pid}")
48+
log.debug(f"Found entry no longer exists {self.pid}; removing entry.")
49+
remove_server_entry(self.path_hash)
4950
return False
5051
if not p.is_running():
51-
log.info(f"Found entry no longer running {p.pid}")
52+
log.debug(f"Found entry no longer running {p.pid}; removing entry.")
53+
remove_server_entry(self.path_hash)
5254
return False
5355
if p.status == psutil.STATUS_ZOMBIE:
54-
log.info(f"Found zombie process {p.pid}")
56+
log.debug(f"Found zombie process {p.pid}; removing entry.")
57+
remove_server_entry(self.path_hash)
5558
return False
5659
for _, _, _, laddr, _, _ in p.net_connections("all"):
5760
if isinstance(laddr, str):
5861
log.error(
59-
f"View encountered an error. Please report this: process {self.pid} with laddr {laddr}"
62+
f"BUG: the `pretext view` command encountered an error. Please report this: process {self.pid} with laddr {laddr}"
6063
)
6164
continue
6265
elif isinstance(laddr.port, int) and laddr.port == self.port:
63-
log.info(f"Found server at {self.url()}")
66+
log.info(f"Found PreTeXt web server at {self.url()}")
6467
return True
6568
else:
6669
log.debug(f"Found process {self.pid} with laddr {laddr}")
67-
log.info(
70+
log.debug(
6871
f"Found process {self.pid} no longer listening on specified port {self.port}"
6972
)
7073
return False
7174

7275
def terminate(self) -> None:
7376
"""Attempt to terminate the process described by this info."""
7477
try:
75-
log.info(f"Terminating {self.pid}")
76-
psutil.Process(self.pid).terminate()
78+
log.debug(f"Terminating {self.pid}")
7779
remove_server_entry(self.path_hash)
80+
psutil.Process(self.pid).terminate()
7881
except Exception as e:
79-
log.info(f"Terminate failed for {self.pid}.")
80-
log.exception(e, exc_info=True)
82+
log.error(
83+
f"Attempt to terminate PreTeXt web server failed for process {self.pid} on port {self.port}."
84+
)
85+
log.debug(e, exc_info=True)
8186

8287
def url(self) -> str:
8388
return f"{self.binding}:{self.port}"
@@ -104,8 +109,10 @@ def get_running_servers() -> t.List[RunningServerInfo]:
104109
with open(running_servers_file, "r") as f:
105110
return [RunningServerInfo.from_file_line(line) for line in f.readlines()]
106111
except IOError as e:
107-
log.info("Unable to open running servers file.")
108-
log.exception(e, exc_info=True)
112+
log.error(
113+
f"Unable to open list of running PreTeXt web servers expected at ({running_servers_file})."
114+
)
115+
log.debug(e, exc_info=True)
109116
return []
110117

111118

@@ -122,8 +129,8 @@ def save_running_servers(running_servers: t.List[RunningServerInfo]) -> None:
122129
# Write each server info to a new line
123130
f.writelines([info.to_file_line() for info in running_servers])
124131
except IOError as e:
125-
log.info("Unable to write running servers file.")
126-
log.exception(e, exc_info=True)
132+
log.error("Unable to write running servers file.")
133+
log.debug(e, exc_info=True)
127134

128135

129136
def add_server_entry(path_hash: str, pid: int, port: int, binding: str) -> None:
@@ -140,7 +147,7 @@ def add_server_entry(path_hash: str, pid: int, port: int, binding: str) -> None:
140147
log.info(f"There are {PURGE_LIMIT} or more servers on file. Cleaning up ...")
141148
running_servers = list(stop_inactive_servers(running_servers))
142149
save_running_servers(running_servers)
143-
log.info(f"Added server entry {new_entry.to_file_line()}")
150+
log.info(f"Added pretext web server entry {new_entry.to_file_line()}")
144151

145152

146153
def remove_server_entry(path_hash: str) -> None:
@@ -182,11 +189,11 @@ def start_server(
182189
port: int = 8128,
183190
callback: t.Callable[[int], None] | None = None,
184191
) -> None:
185-
log.info("setting up ...")
192+
log.info("setting up PreTeXt web server ...")
186193
path_hash = hash_path(base_dir)
187194
pid = os.getpid()
188195
binding = binding_for_access(access)
189-
log.info("values set...")
196+
log.debug("values set: %s, %s, %s", path_hash, binding, port)
190197

191198
# Previously we defined a custom handler to prevent caching, but we don't need to do that anymore. It was causing issues with the _static js/css files inside codespaces for an unknown reason. Might bring this back in the future.
192199
# 2024-04-05: try using this again to let Firefox work
@@ -211,9 +218,9 @@ class TCPServer(socketserver.TCPServer):
211218
while True:
212219
try:
213220
with TCPServer((binding, port), RequestHandler) as httpd:
214-
log.info("adding server entry")
221+
log.debug("adding PreTeXt web server entry")
215222
add_server_entry(path_hash, pid, port, binding)
216-
log.info("Starting the server")
223+
log.debug("Starting the PreTeXt web server")
217224
if callback is not None:
218225
callback(port)
219226
httpd.serve_forever()
@@ -222,7 +229,7 @@ class TCPServer(socketserver.TCPServer):
222229
port += 1
223230
log.warning(f"Trying port {port} instead.\n")
224231
except KeyboardInterrupt:
225-
log.info("Stopping server.")
232+
log.info("Stopping PreTeXt web server.")
226233
remove_server_entry(path_hash)
227234
return
228235

@@ -241,7 +248,7 @@ def start_codespace_server(
241248
binding = binding_for_access(access)
242249
log.debug(f"values set: {path_hash}, {binding}, {port}")
243250

244-
log.info("Starting the server")
251+
log.info("Starting PreTeXt web server")
245252
server_process = subprocess.Popen(
246253
[sys.executable, "-m", "http.server", str(port)], cwd=base_dir
247254
)

0 commit comments

Comments
 (0)