package mnode import ( "sync" "test/grpc-odbserver/api" "git.wecise.com/wecise/odbserver/mring/matrix" "git.wecise.com/wecise/odbserver/mring/mnet" ) const UNKOWN = 0 const RUNNING = 1 const SUSPEND = 2 type MNode struct { listener mnet.Listener mutex sync.Mutex status int services map[string]api.Service } var _ = api.Node((*MNode)(nil)) func (mn *MNode) ID() int64 { return int64(matrix.ID) } func (mn *MNode) Name() string { return mnet.MClusterNode(matrix.ID).Name() } func (mn *MNode) Init() { mn.services = make(map[string]api.Service) } func (mn *MNode) Destroy() { mn.Stop() for _, svc := range mn.services { svc.Destroy() } mn.services = nil } func (mn *MNode) RegisterService(svc api.Service) { svc.Init() mn.mutex.Lock() defer mn.mutex.Unlock() if osvc, ok := mn.services[svc.Name()]; ok { osvc.Stop() osvc.Destroy() } mn.services[svc.Name()] = svc if mn.status == RUNNING { svc.Start() } } func (mn *MNode) UnregisterService(svc api.Service) { mn.mutex.Lock() defer mn.mutex.Unlock() if osvc, ok := mn.services[svc.Name()]; ok && osvc == svc { osvc.Stop() osvc.Destroy() } } func (mn *MNode) Start() { mn.mutex.Lock() defer mn.mutex.Unlock() if mn.status == RUNNING { return } cfg := matrix.Config() listener, err := mnet.MListener(cfg.NodeName, cfg.Port, nil).Listen() if err != nil { panic(err) } mn.listener = listener for _, svc := range mn.services { svc.Start() } mn.status = RUNNING } func (mn *MNode) Stop() { mn.mutex.Lock() defer mn.mutex.Unlock() if mn.status == SUSPEND { return } mn.status = SUSPEND for _, svc := range mn.services { svc.Stop() } mn.listener.Close() mn.listener = nil }