diff --git a/metadata/report/nacos/report.go b/metadata/report/nacos/report.go index 6b838187b7b5518296255814c48aaf665540b827..a119e0651fa1e0248b11b2252e36677f90cf1832 100644 --- a/metadata/report/nacos/report.go +++ b/metadata/report/nacos/report.go @@ -51,6 +51,7 @@ type nacosMetadataReport struct { } // StoreProviderMetadata will store the metadata +// metadata including the basic info of the server, provider info, and other user custom info func (n *nacosMetadataReport) StoreProviderMetadata(providerIdentifier *identifier.MetadataIdentifier, serviceDefinitions string) error { return n.storeMetadata(vo.ConfigParam{ DataId: providerIdentifier.GetIdentifierKey(), @@ -60,6 +61,7 @@ func (n *nacosMetadataReport) StoreProviderMetadata(providerIdentifier *identifi } // StoreConsumerMetadata will store the metadata +// metadata including the basic info of the server, consumer info, and other user custom info func (n *nacosMetadataReport) StoreConsumerMetadata(consumerMetadataIdentifier *identifier.MetadataIdentifier, serviceParameterString string) error { return n.storeMetadata(vo.ConfigParam{ DataId: consumerMetadataIdentifier.GetIdentifierKey(), @@ -69,6 +71,7 @@ func (n *nacosMetadataReport) StoreConsumerMetadata(consumerMetadataIdentifier * } // SaveServiceMetadata will store the metadata +// metadata including the basic info of the server, service info, and other user custom info func (n *nacosMetadataReport) SaveServiceMetadata(metadataIdentifier *identifier.ServiceMetadataIdentifier, url common.URL) error { return n.storeMetadata(vo.ConfigParam{ DataId: metadataIdentifier.GetIdentifierKey(), diff --git a/metadata/report/nacos/report_test.go b/metadata/report/nacos/report_test.go index 88aec72a0b3fcefc70bb919345fc93bbf137777e..153242f8e019c04ea3f5ef8e5ed090c1f23e9d41 100644 --- a/metadata/report/nacos/report_test.go +++ b/metadata/report/nacos/report_test.go @@ -20,9 +20,13 @@ package nacos import ( "strconv" "testing" +) +import ( "github.com/stretchr/testify/assert" +) +import ( "github.com/apache/dubbo-go/common" "github.com/apache/dubbo-go/common/constant" "github.com/apache/dubbo-go/common/extension" diff --git a/remoting/nacos/builder.go b/remoting/nacos/builder.go index 16325f88cc7af959f5a129d158c54cf9db5b81f6..545a1e268cabe5cef829ff1cf44ef40b1161d590 100644 --- a/remoting/nacos/builder.go +++ b/remoting/nacos/builder.go @@ -72,7 +72,10 @@ func getNacosConfig(url *common.URL) (map[string]interface{}, error) { if err != nil { return nil, perrors.WithMessagef(err, "split [%s] ", addr) } - port, _ := strconv.Atoi(portStr) + port, err := strconv.Atoi(portStr) + if err != nil { + return configMap, perrors.WithMessage(err, "the port string is invalid. "+portStr) + } serverConfigs = append(serverConfigs, nacosConstant.ServerConfig{ IpAddr: ip, Port: uint64(port), @@ -80,18 +83,21 @@ func getNacosConfig(url *common.URL) (map[string]interface{}, error) { } configMap["serverConfigs"] = serverConfigs - var clientConfig nacosConstant.ClientConfig timeout, err := time.ParseDuration(url.GetParam(constant.REGISTRY_TIMEOUT_KEY, constant.DEFAULT_REG_TIMEOUT)) if err != nil { return nil, err } - clientConfig.TimeoutMs = uint64(timeout.Seconds() * 1000) - clientConfig.ListenInterval = 2 * clientConfig.TimeoutMs - clientConfig.CacheDir = url.GetParam(constant.NACOS_CACHE_DIR_KEY, "") - clientConfig.LogDir = url.GetParam(constant.NACOS_LOG_DIR_KEY, "") - clientConfig.Endpoint = url.GetParam(constant.NACOS_ENDPOINT, "") - clientConfig.NotLoadCacheAtStart = true - configMap["clientConfig"] = clientConfig + + timeoutMs := uint64(timeout.Nanoseconds() / constant.MsToNanoRate) + + configMap["clientConfig"] = nacosConstant.ClientConfig{ + TimeoutMs: timeoutMs, + ListenInterval: 2 * timeoutMs, + CacheDir: url.GetParam(constant.NACOS_CACHE_DIR_KEY, ""), + LogDir: url.GetParam(constant.NACOS_LOG_DIR_KEY, ""), + Endpoint: url.GetParam(constant.NACOS_ENDPOINT, ""), + NotLoadCacheAtStart: true, + } return configMap, nil } diff --git a/remoting/zookeeper/client.go b/remoting/zookeeper/client.go index 92ea76046f002cbdf6dbe754453ef8ebb4a14de2..f4aea5903d534a008e3c94bb04f127a67988132b 100644 --- a/remoting/zookeeper/client.go +++ b/remoting/zookeeper/client.go @@ -51,7 +51,7 @@ var ( type ZookeeperClient struct { name string ZkAddrs []string - sync.Mutex // for conn + sync.RWMutex // for conn Conn *zk.Conn Timeout time.Duration exit chan struct{} @@ -275,7 +275,7 @@ LOOP: break LOOP case (int)(zk.EventNodeDataChanged), (int)(zk.EventNodeChildrenChanged): logger.Infof("zkClient{%s} get zk node changed event{path:%s}", z.name, event.Path) - z.Lock() + z.RLock() for p, a := range z.eventRegistry { if strings.HasPrefix(p, event.Path) { logger.Infof("send event{state:zk.EventNodeDataChange, Path:%s} notify event to path{%s} related listener", @@ -285,7 +285,7 @@ LOOP: } } } - z.Unlock() + z.RUnlock() case (int)(zk.StateConnecting), (int)(zk.StateConnected), (int)(zk.StateHasSession): if state == (int)(zk.StateHasSession) { continue @@ -368,11 +368,11 @@ func (z *ZookeeperClient) ZkConnValid() bool { } valid := true - z.Lock() + z.RLock() if z.Conn == nil { valid = false } - z.Unlock() + z.RUnlock() return valid } @@ -413,15 +413,15 @@ func (z *ZookeeperClient) CreateWithValue(basePath string, value []byte) error { ) logger.Debugf("zookeeperClient.Create(basePath{%s})", basePath) + conn := z.getConn() + err = errNilZkClientConn + if conn == nil { + return perrors.WithMessagef(err, "zk.Create(path:%s)", basePath) + } + for _, str := range strings.Split(basePath, "/")[1:] { tmpPath = path.Join(tmpPath, "/", str) - err = errNilZkClientConn - z.Lock() - conn := z.Conn - z.Unlock() - if conn != nil { - _, err = conn.Create(tmpPath, value, 0, zk.WorldACL(zk.PermAll)) - } + _, err = conn.Create(tmpPath, value, 0, zk.WorldACL(zk.PermAll)) if err != nil { if err == zk.ErrNodeExists { @@ -443,9 +443,7 @@ func (z *ZookeeperClient) Delete(basePath string) error { ) err = errNilZkClientConn - z.Lock() - conn := z.Conn - z.Unlock() + conn := z.getConn() if conn != nil { err = conn.Delete(basePath, -1) } @@ -465,9 +463,7 @@ func (z *ZookeeperClient) RegisterTemp(basePath string, node string) (string, er err = errNilZkClientConn data = []byte("") zkPath = path.Join(basePath) + "/" + node - z.Lock() - conn := z.Conn - z.Unlock() + conn := z.getConn() if conn != nil { tmpPath, err = conn.Create(zkPath, data, zk.FlagEphemeral, zk.WorldACL(zk.PermAll)) } @@ -490,9 +486,7 @@ func (z *ZookeeperClient) RegisterTempSeq(basePath string, data []byte) (string, ) err = errNilZkClientConn - z.Lock() - conn := z.Conn - z.Unlock() + conn := z.getConn() if conn != nil { tmpPath, err = conn.Create( path.Join(basePath)+"/", @@ -523,9 +517,7 @@ func (z *ZookeeperClient) GetChildrenW(path string) ([]string, <-chan zk.Event, ) err = errNilZkClientConn - z.Lock() - conn := z.Conn - z.Unlock() + conn := z.getConn() if conn != nil { children, stat, watcher, err = conn.ChildrenW(path) } @@ -559,9 +551,7 @@ func (z *ZookeeperClient) GetChildren(path string) ([]string, error) { ) err = errNilZkClientConn - z.Lock() - conn := z.Conn - z.Unlock() + conn := z.getConn() if conn != nil { children, stat, err = conn.Children(path) } @@ -592,9 +582,7 @@ func (z *ZookeeperClient) ExistW(zkPath string) (<-chan zk.Event, error) { ) err = errNilZkClientConn - z.Lock() - conn := z.Conn - z.Unlock() + conn := z.getConn() if conn != nil { exist, _, watcher, err = conn.ExistsW(zkPath) } @@ -615,3 +603,10 @@ func (z *ZookeeperClient) ExistW(zkPath string) (<-chan zk.Event, error) { func (z *ZookeeperClient) GetContent(zkPath string) ([]byte, *zk.Stat, error) { return z.Conn.Get(zkPath) } + +// getConn gets zookeeper connection safely +func (z *ZookeeperClient) getConn() *zk.Conn { + z.RLock() + defer z.RUnlock() + return z.Conn +}