execute: transparent per-session mount recovery on stale FUSE
This commit is contained in:
parent
d00a15093d
commit
4188d5946b
|
|
@ -107,6 +107,7 @@ var languagePatterns = map[string][]*regexp.Regexp{
|
|||
|
||||
// Dispatch routes a named execute tool call.
|
||||
func (e *Server) Dispatch(ctx context.Context, name string, args json.RawMessage) (string, error) {
|
||||
e.remountIfStale()
|
||||
if len(e.allowExecutors) > 0 && !e.allowExecutors[name] {
|
||||
return "", fmt.Errorf("executor %q not permitted in this agent context", name)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -403,6 +403,31 @@ func (e *Server) startMount(sessionID string) {
|
|||
e.envExtra["OLLIE"] = mnt
|
||||
}
|
||||
|
||||
// remountIfStale checks the per-session FUSE mount health and re-establishes it if broken.
|
||||
// Must be called without envMu held.
|
||||
func (e *Server) remountIfStale() {
|
||||
e.envMu.RLock()
|
||||
mnt := e.mountPath
|
||||
proc := e.mountProc
|
||||
e.envMu.RUnlock()
|
||||
if mnt == "" || proc == nil {
|
||||
return
|
||||
}
|
||||
if _, err := os.Stat(filepath.Join(mnt, "s")); err == nil {
|
||||
return
|
||||
}
|
||||
// Mount is stale — tear down and restart.
|
||||
e.envMu.Lock()
|
||||
defer e.envMu.Unlock()
|
||||
exec.Command("fusermount", "-u", e.mountPath).Run() //nolint:errcheck
|
||||
syscall.Kill(e.mountProc.Pid, syscall.SIGKILL) //nolint:errcheck
|
||||
e.mountProc = nil
|
||||
e.mountPath = ""
|
||||
if uname := e.envExtra["OLLIE_UNAME"]; uname != "" {
|
||||
e.startMount(uname)
|
||||
}
|
||||
}
|
||||
|
||||
// Close tears down the per-session FUSE mount.
|
||||
func (e *Server) Close() {
|
||||
e.envMu.Lock()
|
||||
|
|
|
|||
Reference in New Issue