12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- package mnode
- import (
- "sync"
- "trial/grpc-odbserver/api"
- "git.wecise.com/wecise/mring/matrix"
- "git.wecise.com/wecise/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
- }
|