mirror of
https://gitee.com/milvus-io/milvus.git
synced 2026-01-03 01:12:25 +08:00
74 lines
2.0 KiB
Go
74 lines
2.0 KiB
Go
package kvfactory
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
|
|
clientv3 "go.etcd.io/etcd/client/v3"
|
|
|
|
"github.com/milvus-io/milvus/pkg/util/etcd"
|
|
"github.com/milvus-io/milvus/pkg/util/paramtable"
|
|
)
|
|
|
|
var clientCreator = &etcdClientCreator{}
|
|
|
|
var getEtcdAndPathFunction = getEtcdAndPath
|
|
|
|
type etcdClientCreator struct {
|
|
mu sync.Mutex
|
|
client *clientv3.Client
|
|
rootpath *string
|
|
}
|
|
|
|
// Returns an Etcd client and the metaRootPath, if an error is hit, will panic.
|
|
// This client is reused by all calls in the current runtime.
|
|
func GetEtcdAndPath() (*clientv3.Client, string) {
|
|
client, path := getEtcdAndPathFunction()
|
|
return client, path
|
|
}
|
|
|
|
// Reset the stored client, mainly used during testing when paramtable params have changed
|
|
// during runtime.
|
|
func CloseEtcdClient() {
|
|
clientCreator.mu.Lock()
|
|
defer clientCreator.mu.Unlock()
|
|
if clientCreator.client != nil {
|
|
err := clientCreator.client.Close()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
clientCreator.client = nil
|
|
clientCreator.rootpath = nil
|
|
}
|
|
|
|
// Returns an Etcd client and the metaRootPath, if an error is hit, will panic
|
|
func getEtcdAndPath() (*clientv3.Client, string) {
|
|
clientCreator.mu.Lock()
|
|
defer clientCreator.mu.Unlock()
|
|
// If client/path doesnt exist, create a new one
|
|
if clientCreator.client == nil {
|
|
var err error
|
|
clientCreator.client, err = createEtcdClient()
|
|
if err != nil {
|
|
panic(fmt.Errorf("failed to create etcd client: %w", err))
|
|
}
|
|
path := paramtable.Get().ServiceParam.EtcdCfg.MetaRootPath.GetValue()
|
|
clientCreator.rootpath = &path
|
|
}
|
|
return clientCreator.client, *clientCreator.rootpath
|
|
}
|
|
|
|
// Function that calls the Etcd constructor
|
|
func createEtcdClient() (*clientv3.Client, error) {
|
|
cfg := ¶mtable.Get().ServiceParam
|
|
return etcd.GetEtcdClient(
|
|
cfg.EtcdCfg.UseEmbedEtcd.GetAsBool(),
|
|
cfg.EtcdCfg.EtcdUseSSL.GetAsBool(),
|
|
cfg.EtcdCfg.Endpoints.GetAsStrings(),
|
|
cfg.EtcdCfg.EtcdTLSCert.GetValue(),
|
|
cfg.EtcdCfg.EtcdTLSKey.GetValue(),
|
|
cfg.EtcdCfg.EtcdTLSCACert.GetValue(),
|
|
cfg.EtcdCfg.EtcdTLSMinVersion.GetValue())
|
|
}
|