package cluster import ( "github.com/duanhf2012/origin/v2/event" "github.com/duanhf2012/origin/v2/log" "github.com/duanhf2012/origin/v2/rpc" "github.com/duanhf2012/origin/v2/service" "github.com/duanhf2012/origin/v2/util/timer" "go.etcd.io/etcd/api/v3/mvccpb" "go.etcd.io/etcd/client/v3" "google.golang.org/protobuf/proto" "time" "context" "errors" "fmt" "go.uber.org/zap" "path" "runtime" "strings" "sync/atomic" ) const originDir = "/origin" const testKey = originDir+"/_inner/_test_7501f3ed-b716-44c2-0090-fc1ed0166d7a" type etcdClientInfo struct { watchKeys []string leaseID clientv3.LeaseID keepAliveChan <-chan *clientv3.LeaseKeepAliveResponse } type EtcdDiscoveryService struct { service.Service funDelNode FunDelNode funSetNode FunSetNode localNodeId string byteLocalNodeInfo string mapClient map[*clientv3.Client]*etcdClientInfo isClose int32 bRetire bool mapDiscoveryNodeId map[string]map[string]struct{} //map[networkName]map[nodeId] } func getEtcdDiscovery() (IServiceDiscovery) { etcdDiscovery := &EtcdDiscoveryService{} return etcdDiscovery } func (ed *EtcdDiscoveryService) InitDiscovery(localNodeId string,funDelNode FunDelNode,funSetNode FunSetNode) error { ed.localNodeId = localNodeId ed.funDelNode = funDelNode ed.funSetNode = funSetNode return nil } const( eeGets = 0 eePut = 1 eeDelete = 2 ) type etcdDiscoveryEvent struct { typ int watchKey string Kvs []*mvccpb.KeyValue } func (ee *etcdDiscoveryEvent) GetEventType() event.EventType{ return event.Sys_Event_EtcdDiscovery } func (ed *EtcdDiscoveryService) OnInit() error { ed.mapClient = make(map[*clientv3.Client]*etcdClientInfo,1) ed.mapDiscoveryNodeId = make(map[string]map[string]struct{}) ed.GetEventProcessor().RegEventReceiverFunc(event.Sys_Event_EtcdDiscovery, ed.GetEventHandler(), ed.OnEtcdDiscovery) err := ed.marshalNodeInfo() if err != nil { return err } etcdDiscoveryCfg := cluster.GetEtcdDiscovery() if etcdDiscoveryCfg == nil { return errors.New("etcd discovery config is nil.") } for i:=0;i 0 { ctx,_:=context.WithTimeout(context.Background(),time.Second*3) lg, err = client.Grant(ctx, etcdServiceRecord.TTLSecond) if err != nil { log.Error("etcd record fail,cannot grant lease",log.ErrorAttr("err",err)) return errors.New("cannot grant lease") } } if lg != nil { ctx,_:=context.WithTimeout(context.Background(),time.Second*3) _, err = client.Put(ctx, path.Join(originDir,etcdServiceRecord.RecordKey),etcdServiceRecord.RecordInfo, clientv3.WithLease(lg.ID)) if err != nil { log.Error("etcd record fail,cannot put record",log.ErrorAttr("err",err)) } return errors.New("cannot put record") } _,err = client.Put(context.Background(), path.Join(originDir,etcdServiceRecord.RecordKey),etcdServiceRecord.RecordInfo) if err != nil { log.Error("etcd record fail,cannot put record",log.ErrorAttr("err",err)) return errors.New("cannot put record") } return nil }