Skip to content

Commit 7ebe843

Browse files
committed
fix(server): improve shutdown logic, add logs for SIGTERM/SIGKILL
1 parent 89373f5 commit 7ebe843

1 file changed

Lines changed: 19 additions & 34 deletions

File tree

lua/opencode/opencode_server.lua

Lines changed: 19 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,9 @@ local function ensure_vim_leave_autocmd()
2323
group = vim.api.nvim_create_augroup('OpencodeVimLeavePre', { clear = true }),
2424
callback = function()
2525
local state = require('opencode.state')
26+
local log = require('opencode.log')
2627
if state.opencode_server then
27-
pcall(function()
28-
state.opencode_server:shutdown()
29-
end)
28+
state.opencode_server:shutdown()
3029
end
3130
end,
3231
})
@@ -35,6 +34,7 @@ end
3534
--- Create a new ServerJob instance
3635
--- @return OpencodeServer
3736
function OpencodeServer.new()
37+
local log = require('opencode.log')
3838
ensure_vim_leave_autocmd()
3939

4040
return setmetatable({
@@ -51,46 +51,28 @@ function OpencodeServer:is_running()
5151
end
5252

5353
function OpencodeServer:shutdown()
54+
local log = require('opencode.log')
5455
if self.shutdown_promise:is_resolved() then
5556
return self.shutdown_promise
5657
end
5758

58-
if not self.job or not self.job.pid then
59-
self.shutdown_promise:resolve(true)
60-
return self.shutdown_promise
61-
end
62-
63-
local job = self.job
64-
local pid = job.pid
65-
66-
self.job = nil
67-
self.url = nil
68-
self.handle = nil
69-
70-
-- Graceful shutdown (SIGTERM)
71-
pcall(function()
72-
vim.uv.kill(pid, 15)
73-
end)
59+
if self.job and self.job.pid then
60+
local pid = self.job.pid
7461

75-
local exited = vim.wait(500, function()
76-
return self.shutdown_promise:is_resolved()
77-
end, 50)
78-
79-
-- Forceful shutdown (SIGKILL) if not exited after waiting
80-
if not exited then
81-
pcall(function()
82-
vim.uv.kill(pid, 9)
83-
end)
62+
self.job = nil
63+
self.url = nil
64+
self.handle = nil
8465

85-
vim.wait(200, function()
86-
return self.shutdown_promise:is_resolved()
87-
end, 50)
88-
end
66+
local ok_term, err_term = pcall(vim.uv.kill, pid, 15)
67+
log.debug('shutdown: SIGTERM pid=%d ok=%s err=%s', pid, tostring(ok_term), tostring(err_term))
8968

90-
if not self.shutdown_promise:is_resolved() then
91-
self.shutdown_promise:resolve(true)
69+
local ok_kill, err_kill = pcall(vim.uv.kill, pid, 9)
70+
log.debug('shutdown: SIGKILL pid=%d ok=%s err=%s', pid, tostring(ok_kill), tostring(err_kill))
71+
else
72+
log.debug('shutdown: no job running')
9273
end
9374

75+
self.shutdown_promise:resolve(true)
9476
return self.shutdown_promise
9577
end
9678

@@ -105,6 +87,7 @@ end
10587
--- @return Promise<OpencodeServer>
10688
function OpencodeServer:spawn(opts)
10789
opts = opts or {}
90+
local log = require('opencode.log')
10891

10992
self.job = vim.system({
11093
config.opencode_executable,
@@ -122,6 +105,7 @@ function OpencodeServer:spawn(opts)
122105
self.url = url
123106
self.spawn_promise:resolve(self)
124107
safe_call(opts.on_ready, self.job, url)
108+
log.debug('spawn: server ready at url=%s', url)
125109
end
126110
end
127111
end,
@@ -154,6 +138,7 @@ function OpencodeServer:spawn(opts)
154138

155139
self.handle = self.job and self.job.pid
156140

141+
log.debug('spawn: started job with pid=%s', tostring(self.job and self.job.pid))
157142
return self.spawn_promise
158143
end
159144

0 commit comments

Comments
 (0)