diff --git a/docs/evidence/saas-dispatcher-implementation.md b/docs/evidence/saas-dispatcher-implementation.md index 717b3ed..a5881d2 100644 --- a/docs/evidence/saas-dispatcher-implementation.md +++ b/docs/evidence/saas-dispatcher-implementation.md @@ -112,6 +112,7 @@ - Dispatcher 名称收敛:现行 `Current*` 调度、控制、发现、线路选择及执行类型/错误改为 `Runtime`、`Bootstrap`、`DiscoveryFollower` 等唯一代码入口;18 份 Go 源码/测试文件移除代次路径,相关 Agent 控制及调用方同步更新。任务归属、固定 SIP 快照、白名单/时段、额度和结果防重规则不变,现行隔离执行测试继续通过。 - Agent 根命令不可达分支:删除旧执行模型的本地录音上传、手工重试、后台通知恢复和旧 Mock originate 代码及专属测试;根命令仍只注册获批的 Mock Agent/Dispatcher。当前录音 RPC、单次 PUT、失败保留和结果恢复另由现行隔离测试覆盖,删除旧命令不改变现有业务数据。 - Agent RPC 客户端入口:删除没有现行调用者的旧 `Client`/`DialFromFiles` 包装及仅针对该包装的测试;当前命令仍通过部署提供的双向 TLS 配置建立 gRPC 连接,原证书信任、SAN 和握手回归测试保持不变。旧服务端业务 RPC 与 Proto 仍待后续清理。 +- Agent 会话持久边界:将会话代际使用的私有原子落盘函数从旧执行日志模块移入独立会话日志文件;原有目录同步、写失败报错和重启代际栅栏测试继续通过。旧执行日志及业务 RPC 尚未删除;此次只移动源码,不修改现存 Agent 恢复文件。 ## 验收台账 diff --git a/internal/rpc/execution_journal.go b/internal/rpc/execution_journal.go index fe554ac..55ad9d4 100644 --- a/internal/rpc/execution_journal.go +++ b/internal/rpc/execution_journal.go @@ -4,10 +4,8 @@ import ( "bytes" "encoding/json" "errors" - "fmt" "io" "os" - "path/filepath" agentpb "git.ipao.vip/rogee/go-sip/gen/agent" "google.golang.org/grpc/codes" @@ -136,44 +134,3 @@ func (s *Server) executionJournalReady() error { } return nil } - -func writeRPCJournal(path string, value any) error { - directory := filepath.Dir(path) - if err := os.MkdirAll(directory, 0700); err != nil { - return err - } - file, err := os.CreateTemp(directory, ".rpc-journal-*") - if err != nil { - return err - } - name := file.Name() - defer os.Remove(name) - if err := file.Chmod(0600); err != nil { - _ = file.Close() - return err - } - if err := json.NewEncoder(file).Encode(value); err != nil { - _ = file.Close() - return err - } - if err := file.Sync(); err != nil { - _ = file.Close() - return err - } - if err := file.Close(); err != nil { - return err - } - if err := os.Rename(name, path); err != nil { - return err - } - dir, err := os.Open(directory) - if err != nil { - return err - } - syncErr := dir.Sync() - closeErr := dir.Close() - if err := errors.Join(syncErr, closeErr); err != nil { - return fmt.Errorf("sync journal directory: %w", err) - } - return nil -} diff --git a/internal/rpc/session_journal.go b/internal/rpc/session_journal.go new file mode 100644 index 0000000..8d6bd90 --- /dev/null +++ b/internal/rpc/session_journal.go @@ -0,0 +1,50 @@ +package rpc + +import ( + "encoding/json" + "errors" + "fmt" + "os" + "path/filepath" +) + +func writeRPCJournal(path string, value any) error { + directory := filepath.Dir(path) + if err := os.MkdirAll(directory, 0700); err != nil { + return err + } + file, err := os.CreateTemp(directory, ".rpc-journal-*") + if err != nil { + return err + } + name := file.Name() + defer os.Remove(name) + if err := file.Chmod(0600); err != nil { + _ = file.Close() + return err + } + if err := json.NewEncoder(file).Encode(value); err != nil { + _ = file.Close() + return err + } + if err := file.Sync(); err != nil { + _ = file.Close() + return err + } + if err := file.Close(); err != nil { + return err + } + if err := os.Rename(name, path); err != nil { + return err + } + dir, err := os.Open(directory) + if err != nil { + return err + } + syncErr := dir.Sync() + closeErr := dir.Close() + if err := errors.Join(syncErr, closeErr); err != nil { + return fmt.Errorf("sync journal directory: %w", err) + } + return nil +}