| @@ -147,9 +147,9 @@ func (svc *Service) WaitCacheMovePackage(msg *agtmq.WaitCacheMovePackage) (*agtm | |||||
| errMsg = tsk.Error().Error() | errMsg = tsk.Error().Error() | ||||
| } | } | ||||
| return mq.ReplyOK(agtmq.NewWaitCacheMovePackageResp(true, errMsg, nil)) | |||||
| return mq.ReplyOK(agtmq.NewWaitCacheMovePackageResp(true, errMsg, mvPkgTask.ResultCacheInfos)) | |||||
| } | } | ||||
| return mq.ReplyOK(agtmq.NewWaitCacheMovePackageResp(false, "", mvPkgTask.ResultCacheInfos)) | |||||
| return mq.ReplyOK(agtmq.NewWaitCacheMovePackageResp(false, "", nil)) | |||||
| } | } | ||||
| } | } | ||||
| @@ -71,6 +71,7 @@ func (t *CacheMovePackage) do(ctx TaskContext) error { | |||||
| if pkgResp.Redundancy.IsRepInfo() { | if pkgResp.Redundancy.IsRepInfo() { | ||||
| return t.moveRep(ctx, coorCli, pkgResp.Package) | return t.moveRep(ctx, coorCli, pkgResp.Package) | ||||
| } else { | } else { | ||||
| return fmt.Errorf("not implement yet!") | |||||
| // TODO EC的CacheMove逻辑 | // TODO EC的CacheMove逻辑 | ||||
| } | } | ||||
| @@ -69,9 +69,10 @@ func main() { | |||||
| if err != nil { | if err != nil { | ||||
| log.Fatalf("new agent server failed, err: %s", err.Error()) | log.Fatalf("new agent server failed, err: %s", err.Error()) | ||||
| } | } | ||||
| agtSvr.OnError = func(err error) { | |||||
| agtSvr.OnError(func(err error) { | |||||
| log.Warnf("agent server err: %s", err.Error()) | log.Warnf("agent server err: %s", err.Error()) | ||||
| } | |||||
| }) | |||||
| go serveAgentServer(agtSvr, &wg) | go serveAgentServer(agtSvr, &wg) | ||||
| go reportStatus(&wg) //网络延迟感知 | go reportStatus(&wg) //网络延迟感知 | ||||
| @@ -18,8 +18,6 @@ type Service interface { | |||||
| type Server struct { | type Server struct { | ||||
| service Service | service Service | ||||
| rabbitSvr mq.RabbitMQServer | rabbitSvr mq.RabbitMQServer | ||||
| OnError func(err error) | |||||
| } | } | ||||
| func NewServer(svc Service, id int64, cfg *mymq.Config) (*Server, error) { | func NewServer(svc Service, id int64, cfg *mymq.Config) (*Server, error) { | ||||
| @@ -51,6 +49,10 @@ func (s *Server) Serve() error { | |||||
| return s.rabbitSvr.Serve() | return s.rabbitSvr.Serve() | ||||
| } | } | ||||
| func (s *Server) OnError(callback func(error)) { | |||||
| s.rabbitSvr.OnError = callback | |||||
| } | |||||
| var msgDispatcher mq.MessageDispatcher = mq.NewMessageDispatcher() | var msgDispatcher mq.MessageDispatcher = mq.NewMessageDispatcher() | ||||
| // Register 将Service中的一个接口函数作为指定类型消息的处理函数,同时会注册请求和响应的消息类型 | // Register 将Service中的一个接口函数作为指定类型消息的处理函数,同时会注册请求和响应的消息类型 | ||||
| @@ -27,8 +27,6 @@ type Service interface { | |||||
| type Server struct { | type Server struct { | ||||
| service Service | service Service | ||||
| rabbitSvr mq.RabbitMQServer | rabbitSvr mq.RabbitMQServer | ||||
| OnError func(err error) | |||||
| } | } | ||||
| func NewServer(svc Service, cfg *mymq.Config) (*Server, error) { | func NewServer(svc Service, cfg *mymq.Config) (*Server, error) { | ||||
| @@ -59,6 +57,10 @@ func (s *Server) Serve() error { | |||||
| return s.rabbitSvr.Serve() | return s.rabbitSvr.Serve() | ||||
| } | } | ||||
| func (s *Server) OnError(callback func(error)) { | |||||
| s.rabbitSvr.OnError = callback | |||||
| } | |||||
| var msgDispatcher mq.MessageDispatcher = mq.NewMessageDispatcher() | var msgDispatcher mq.MessageDispatcher = mq.NewMessageDispatcher() | ||||
| // Register 将Service中的一个接口函数作为指定类型消息的处理函数,同时会注册请求和响应的消息类型 | // Register 将Service中的一个接口函数作为指定类型消息的处理函数,同时会注册请求和响应的消息类型 | ||||
| @@ -29,7 +29,3 @@ func NewPostEvent(event scevt.Event, isEmergency bool, dontMerge bool) *PostEven | |||||
| func (client *Client) PostEvent(msg *PostEvent) error { | func (client *Client) PostEvent(msg *PostEvent) error { | ||||
| return mq.Send(Service.PostEvent, client.rabbitCli, msg) | return mq.Send(Service.PostEvent, client.rabbitCli, msg) | ||||
| } | } | ||||
| func init() { | |||||
| mq.RegisterUnionType(scevt.EventTypeUnino) | |||||
| } | |||||
| @@ -1,5 +1,7 @@ | |||||
| package event | package event | ||||
| var _ = Register[*AgentCheckCache]() | |||||
| type AgentCheckCache struct { | type AgentCheckCache struct { | ||||
| EventBase | EventBase | ||||
| NodeID int64 `json:"nodeID"` | NodeID int64 `json:"nodeID"` | ||||
| @@ -12,7 +14,3 @@ func NewAgentCheckCache(nodeID int64, fileHashes []string) *AgentCheckCache { | |||||
| FileHashes: fileHashes, | FileHashes: fileHashes, | ||||
| } | } | ||||
| } | } | ||||
| func init() { | |||||
| Register[AgentCheckCache]() | |||||
| } | |||||
| @@ -1,5 +1,7 @@ | |||||
| package event | package event | ||||
| var _ = Register[*AgentCheckState]() | |||||
| type AgentCheckState struct { | type AgentCheckState struct { | ||||
| EventBase | EventBase | ||||
| NodeID int64 `json:"nodeID"` | NodeID int64 `json:"nodeID"` | ||||
| @@ -10,7 +12,3 @@ func NewAgentCheckState(nodeID int64) *AgentCheckState { | |||||
| NodeID: nodeID, | NodeID: nodeID, | ||||
| } | } | ||||
| } | } | ||||
| func init() { | |||||
| Register[AgentCheckState]() | |||||
| } | |||||
| @@ -1,5 +1,7 @@ | |||||
| package event | package event | ||||
| var _ = Register[*AgentCheckStorage]() | |||||
| type AgentCheckStorage struct { | type AgentCheckStorage struct { | ||||
| EventBase | EventBase | ||||
| StorageID int64 `json:"storageID"` | StorageID int64 `json:"storageID"` | ||||
| @@ -12,7 +14,3 @@ func NewAgentCheckStorage(storageID int64, packageIDs []int64) *AgentCheckStorag | |||||
| PackageIDs: packageIDs, | PackageIDs: packageIDs, | ||||
| } | } | ||||
| } | } | ||||
| func init() { | |||||
| Register[AgentCheckStorage]() | |||||
| } | |||||
| @@ -1,5 +1,7 @@ | |||||
| package event | package event | ||||
| var _ = Register[*CheckCache]() | |||||
| type CheckCache struct { | type CheckCache struct { | ||||
| EventBase | EventBase | ||||
| NodeID int64 `json:"nodeID"` | NodeID int64 `json:"nodeID"` | ||||
| @@ -10,7 +12,3 @@ func NewCheckCache(nodeID int64) *CheckCache { | |||||
| NodeID: nodeID, | NodeID: nodeID, | ||||
| } | } | ||||
| } | } | ||||
| func init() { | |||||
| Register[CheckCache]() | |||||
| } | |||||
| @@ -1,5 +1,7 @@ | |||||
| package event | package event | ||||
| var _ = Register[*CheckPackage]() | |||||
| type CheckPackage struct { | type CheckPackage struct { | ||||
| EventBase | EventBase | ||||
| PackageIDs []int64 `json:"packageIDs"` | PackageIDs []int64 `json:"packageIDs"` | ||||
| @@ -10,7 +12,3 @@ func NewCheckPackage(packageIDs []int64) *CheckPackage { | |||||
| PackageIDs: packageIDs, | PackageIDs: packageIDs, | ||||
| } | } | ||||
| } | } | ||||
| func init() { | |||||
| Register[CheckPackage]() | |||||
| } | |||||
| @@ -1,5 +1,7 @@ | |||||
| package event | package event | ||||
| var _ = Register[*CheckRepCount]() | |||||
| type CheckRepCount struct { | type CheckRepCount struct { | ||||
| EventBase | EventBase | ||||
| FileHashes []string `json:"fileHashes"` | FileHashes []string `json:"fileHashes"` | ||||
| @@ -10,7 +12,3 @@ func NewCheckRepCount(fileHashes []string) *CheckRepCount { | |||||
| FileHashes: fileHashes, | FileHashes: fileHashes, | ||||
| } | } | ||||
| } | } | ||||
| func init() { | |||||
| Register[CheckRepCount]() | |||||
| } | |||||
| @@ -1,6 +1,7 @@ | |||||
| package event | package event | ||||
| import ( | import ( | ||||
| "gitlink.org.cn/cloudream/common/pkgs/mq" | |||||
| "gitlink.org.cn/cloudream/common/pkgs/types" | "gitlink.org.cn/cloudream/common/pkgs/types" | ||||
| myreflect "gitlink.org.cn/cloudream/common/utils/reflect" | myreflect "gitlink.org.cn/cloudream/common/utils/reflect" | ||||
| ) | ) | ||||
| @@ -15,6 +16,13 @@ type EventBase struct{} | |||||
| func (e *EventBase) Noop() {} | func (e *EventBase) Noop() {} | ||||
| func Register[T any]() { | |||||
| // 注:此函数必须以var _ = Register[xxx]()的形式被调用,这样才能保证init中RegisterUnionType时 | |||||
| // TypeUnion不是空的。(因为包级变量初始化比init函数调用先进行) | |||||
| func Register[T Event]() any { | |||||
| EventTypeUnino.Add(myreflect.TypeOf[T]()) | EventTypeUnino.Add(myreflect.TypeOf[T]()) | ||||
| return nil | |||||
| } | |||||
| func init() { | |||||
| mq.RegisterUnionType(EventTypeUnino) | |||||
| } | } | ||||
| @@ -12,8 +12,6 @@ type Service interface { | |||||
| type Server struct { | type Server struct { | ||||
| service Service | service Service | ||||
| rabbitSvr mq.RabbitMQServer | rabbitSvr mq.RabbitMQServer | ||||
| OnError func(err error) | |||||
| } | } | ||||
| func NewServer(svc Service, cfg *mymq.Config) (*Server, error) { | func NewServer(svc Service, cfg *mymq.Config) (*Server, error) { | ||||
| @@ -45,6 +43,10 @@ func (s *Server) Serve() error { | |||||
| return s.rabbitSvr.Serve() | return s.rabbitSvr.Serve() | ||||
| } | } | ||||
| func (s *Server) OnError(callback func(error)) { | |||||
| s.rabbitSvr.OnError = callback | |||||
| } | |||||
| var msgDispatcher mq.MessageDispatcher = mq.NewMessageDispatcher() | var msgDispatcher mq.MessageDispatcher = mq.NewMessageDispatcher() | ||||
| // Register 将Service中的一个接口函数作为指定类型消息的处理函数,同时会注册请求和响应的消息类型 | // Register 将Service中的一个接口函数作为指定类型消息的处理函数,同时会注册请求和响应的消息类型 | ||||
| @@ -40,9 +40,9 @@ func main() { | |||||
| logger.Fatalf("new coordinator server failed, err: %s", err.Error()) | logger.Fatalf("new coordinator server failed, err: %s", err.Error()) | ||||
| } | } | ||||
| coorSvr.OnError = func(err error) { | |||||
| coorSvr.OnError(func(err error) { | |||||
| logger.Warnf("coordinator server err: %s", err.Error()) | logger.Warnf("coordinator server err: %s", err.Error()) | ||||
| } | |||||
| }) | |||||
| // 启动服务 | // 启动服务 | ||||
| go serveCoorServer(coorSvr) | go serveCoorServer(coorSvr) | ||||
| @@ -69,8 +69,13 @@ func Scripts() error { | |||||
| scriptsDir := "./common/assets/scripts" | scriptsDir := "./common/assets/scripts" | ||||
| info, err := os.Stat(scriptsDir) | info, err := os.Stat(scriptsDir) | ||||
| if errors.Is(err, os.ErrNotExist) || !info.IsDir() { | |||||
| return fmt.Errorf("script directory not exists or is not a directory") | |||||
| if errors.Is(err, os.ErrNotExist) { | |||||
| fmt.Printf("no scripts.\n") | |||||
| return nil | |||||
| } | |||||
| if !info.IsDir() { | |||||
| return fmt.Errorf("scripts is not a directory") | |||||
| } | } | ||||
| fullDirPath, err := filepath.Abs(filepath.Join(BuildDir, "scripts")) | fullDirPath, err := filepath.Abs(filepath.Join(BuildDir, "scripts")) | ||||
| @@ -87,8 +92,13 @@ func Confs() error { | |||||
| confDir := "./common/assets/confs" | confDir := "./common/assets/confs" | ||||
| info, err := os.Stat(confDir) | info, err := os.Stat(confDir) | ||||
| if errors.Is(err, os.ErrNotExist) || !info.IsDir() { | |||||
| return fmt.Errorf("conf directory not exists or is not a directory") | |||||
| if errors.Is(err, os.ErrNotExist) { | |||||
| fmt.Printf("no confs.\n") | |||||
| return nil | |||||
| } | |||||
| if !info.IsDir() { | |||||
| return fmt.Errorf("confs is not a directory") | |||||
| } | } | ||||
| fullDirPath, err := filepath.Abs(filepath.Join(BuildDir, "confs")) | fullDirPath, err := filepath.Abs(filepath.Join(BuildDir, "confs")) | ||||
| @@ -106,7 +116,7 @@ func Agent() error { | |||||
| OutputName: "agent", | OutputName: "agent", | ||||
| OutputDir: "agent", | OutputDir: "agent", | ||||
| AssetsDir: "assets", | AssetsDir: "assets", | ||||
| EntryFile:"agent/main.go", | |||||
| EntryFile: "agent/main.go", | |||||
| }) | }) | ||||
| } | } | ||||
| @@ -115,7 +125,7 @@ func Client() error { | |||||
| OutputName: "client", | OutputName: "client", | ||||
| OutputDir: "client", | OutputDir: "client", | ||||
| AssetsDir: "assets", | AssetsDir: "assets", | ||||
| EntryFile:"client/main.go", | |||||
| EntryFile: "client/main.go", | |||||
| }) | }) | ||||
| } | } | ||||
| @@ -124,7 +134,7 @@ func Coordinator() error { | |||||
| OutputName: "coordinator", | OutputName: "coordinator", | ||||
| OutputDir: "coordinator", | OutputDir: "coordinator", | ||||
| AssetsDir: "assets", | AssetsDir: "assets", | ||||
| EntryFile:"coordinator/main.go", | |||||
| EntryFile: "coordinator/main.go", | |||||
| }) | }) | ||||
| } | } | ||||
| @@ -133,6 +143,6 @@ func Scanner() error { | |||||
| OutputName: "scanner", | OutputName: "scanner", | ||||
| OutputDir: "scanner", | OutputDir: "scanner", | ||||
| AssetsDir: "assets", | AssetsDir: "assets", | ||||
| EntryFile:"scanner/main.go", | |||||
| EntryFile: "scanner/main.go", | |||||
| }) | }) | ||||
| } | } | ||||
| @@ -170,5 +170,5 @@ func (t *AgentCheckCache) startCheck(execCtx ExecuteContext, isComplete bool, ca | |||||
| } | } | ||||
| func init() { | func init() { | ||||
| RegisterMessageConvertor(func(msg scevt.AgentCheckCache) Event { return NewAgentCheckCache(msg.NodeID, msg.FileHashes) }) | |||||
| RegisterMessageConvertor(func(msg *scevt.AgentCheckCache) Event { return NewAgentCheckCache(msg.NodeID, msg.FileHashes) }) | |||||
| } | } | ||||
| @@ -113,5 +113,5 @@ func (t *AgentCheckState) Execute(execCtx ExecuteContext) { | |||||
| } | } | ||||
| func init() { | func init() { | ||||
| RegisterMessageConvertor(func(msg scevt.AgentCheckState) Event { return NewAgentCheckState(msg.NodeID) }) | |||||
| RegisterMessageConvertor(func(msg *scevt.AgentCheckState) Event { return NewAgentCheckState(msg.NodeID) }) | |||||
| } | } | ||||
| @@ -195,5 +195,5 @@ func (t *AgentCheckStorage) startCheck(execCtx ExecuteContext, stg model.Storage | |||||
| } | } | ||||
| func init() { | func init() { | ||||
| RegisterMessageConvertor(func(msg scevt.AgentCheckStorage) Event { return NewAgentCheckStorage(msg.StorageID, msg.PackageIDs) }) | |||||
| RegisterMessageConvertor(func(msg *scevt.AgentCheckStorage) Event { return NewAgentCheckStorage(msg.StorageID, msg.PackageIDs) }) | |||||
| } | } | ||||
| @@ -80,5 +80,5 @@ func (t *CheckCache) Execute(execCtx ExecuteContext) { | |||||
| } | } | ||||
| func init() { | func init() { | ||||
| RegisterMessageConvertor(func(msg scevt.CheckCache) Event { return NewCheckCache(msg.NodeID) }) | |||||
| RegisterMessageConvertor(func(msg *scevt.CheckCache) Event { return NewCheckCache(msg.NodeID) }) | |||||
| } | } | ||||
| @@ -53,5 +53,5 @@ func (t *CheckPackage) Execute(execCtx ExecuteContext) { | |||||
| } | } | ||||
| func init() { | func init() { | ||||
| RegisterMessageConvertor(func(msg scevt.CheckPackage) Event { return NewCheckPackage(msg.PackageIDs) }) | |||||
| RegisterMessageConvertor(func(msg *scevt.CheckPackage) Event { return NewCheckPackage(msg.PackageIDs) }) | |||||
| } | } | ||||
| @@ -211,5 +211,5 @@ func chooseDeleteAvaiRepNodes(allNodes []model.Node, curAvaiRepNodes []model.Nod | |||||
| } | } | ||||
| func init() { | func init() { | ||||
| RegisterMessageConvertor(func(msg scevt.CheckRepCount) Event { return NewCheckRepCount(msg.FileHashes) }) | |||||
| RegisterMessageConvertor(func(msg *scevt.CheckRepCount) Event { return NewCheckRepCount(msg.FileHashes) }) | |||||
| } | } | ||||
| @@ -36,7 +36,7 @@ var msgDispatcher = typedispatcher.NewTypeDispatcher[Event]() | |||||
| func FromMessage(msg scevt.Event) (Event, error) { | func FromMessage(msg scevt.Event) (Event, error) { | ||||
| event, ok := msgDispatcher.Dispatch(msg) | event, ok := msgDispatcher.Dispatch(msg) | ||||
| if !ok { | if !ok { | ||||
| return nil, fmt.Errorf("unknow event message type: %s", reflect.TypeOf(msg).Name()) | |||||
| return nil, fmt.Errorf("unknow event message type: %s", reflect.TypeOf(msg).String()) | |||||
| } | } | ||||
| return event, nil | return event, nil | ||||
| @@ -53,9 +53,10 @@ func main() { | |||||
| if err != nil { | if err != nil { | ||||
| logger.Fatalf("new agent server failed, err: %s", err.Error()) | logger.Fatalf("new agent server failed, err: %s", err.Error()) | ||||
| } | } | ||||
| agtSvr.OnError = func(err error) { | |||||
| agtSvr.OnError(func(err error) { | |||||
| logger.Warnf("agent server err: %s", err.Error()) | logger.Warnf("agent server err: %s", err.Error()) | ||||
| } | |||||
| }) | |||||
| go serveScannerServer(agtSvr, &wg) | go serveScannerServer(agtSvr, &wg) | ||||
| tickExecutor := tickevent.NewExecutor(tickevent.ExecuteArgs{ | tickExecutor := tickevent.NewExecutor(tickevent.ExecuteArgs{ | ||||